[gazebo] 01/05: Imported Upstream version 3.0.0

Jose Luis Rivero jrivero-guest at moszumanska.debian.org
Tue Jun 17 16:03:54 UTC 2014


This is an automated email from the git hooks/post-receive script.

jrivero-guest pushed a commit to branch master
in repository gazebo.

commit bdb6be86ec04c519bd567c2005ad996faaf3c281
Author: Jose Luis Rivero <jrivero at osrfoundation.org>
Date:   Mon Jun 16 17:28:23 2014 +0000

    Imported Upstream version 3.0.0
---
 .hg_archival.txt                                   |     6 +-
 .hgignore                                          |     1 +
 CMakeLists.txt                                     |   243 +-
 ChangeLog                                          |     5 -
 Changelog.md                                       |   581 +
 LICENSE                                            |     2 +-
 Migration.md                                       |   579 +
 README                                             |    15 +-
 cmake/CheckDRIDisplay.cmake                        |    23 +-
 cmake/DefaultCFlags.cmake                          |    35 +
 cmake/FindFreeimage.cmake                          |    49 +-
 cmake/FindOS.cmake                                 |    10 +
 cmake/GazeboTestUtils.cmake                        |   119 +
 cmake/GazeboUtils.cmake                            |   169 +-
 cmake/HostCFlags.cmake                             |    28 +
 cmake/Man.cmake                                    |    34 +
 cmake/Ronn2Man.cmake                               |    52 +
 cmake/SearchForStuff.cmake                         |   347 +-
 cmake/cmake_uninstall.cmake.in                     |    10 +-
 cmake/gazebo-config.cmake.in                       |    45 +
 cmake/gazebo_config.h.in                           |     8 +-
 cmake/pkgconfig/gazebo.in                          |     8 +-
 cmake/pkgconfig/gazebo_ode.in                      |     8 +-
 cmake/pkgconfig/gazebo_transport.in                |     8 +-
 cmake/setup-unversioned.sh.in                      |    18 -
 cmake/setup.sh.in                                  |    12 +-
 deps/CMakeLists.txt                                |     5 +-
 deps/opende/CMakeLists.txt                         |    10 +-
 deps/opende/OPCODE/Opcode.h                        |   130 +-
 deps/opende/include/ode/common.h                   |     5 +-
 deps/opende/include/ode/misc.h                     |    67 +
 deps/opende/include/ode/objects.h                  |   345 +-
 deps/opende/include/ode/odeconfig.h                |    17 +-
 deps/opende/include/ode/odecpp.h                   |    38 +-
 deps/opende/include/ode/odemath.h                  |     7 +
 deps/opende/include/ode/rotation.h                 |     6 +-
 deps/opende/ou/include/ou/atomic.h                 |    84 +-
 deps/opende/ou/include/ou/atomicflags.h            |     3 +-
 deps/opende/ou/include/ou/customization.h          |     5 +-
 deps/opende/ou/include/ou/enumarrays.h             |     5 +-
 deps/opende/ou/include/ou/simpleflags.h            |     3 +-
 deps/opende/ou/include/ou/threadlocalstorage.h     |     5 +-
 deps/opende/src/collision_kernel.cpp               |    37 +-
 deps/opende/src/fastldlt.c                         |     5 +-
 deps/opende/src/joints/ball.cpp                    |    19 +-
 deps/opende/src/joints/ball.h                      |     5 +-
 deps/opende/src/joints/contact.cpp                 |     6 +-
 deps/opende/src/joints/dball.cpp                   |   382 +
 deps/opende/src/joints/dball.h                     |    56 +
 deps/opende/src/joints/dhinge.cpp                  |   233 +
 deps/opende/src/joints/dhinge.h                    |    43 +
 deps/opende/src/joints/fixed.cpp                   |    24 +-
 deps/opende/src/joints/fixed.h                     |     5 +-
 deps/opende/src/joints/gearbox.cpp                 |   283 +
 deps/opende/src/joints/gearbox.h                   |    50 +
 deps/opende/src/joints/hinge.cpp                   |   127 +-
 deps/opende/src/joints/hinge2.cpp                  |    54 +-
 deps/opende/src/joints/joint.cpp                   |    17 +-
 deps/opende/src/joints/joint.h                     |     4 +
 deps/opende/src/joints/joint_internal.h            |     2 +-
 deps/opende/src/joints/joints.h                    |     3 +
 deps/opende/src/joints/piston.cpp                  |    40 +-
 deps/opende/src/joints/screw.cpp                   |   302 +-
 deps/opende/src/joints/slider.cpp                  |    40 +-
 deps/opende/src/joints/universal.cpp               |   123 +-
 deps/opende/src/joints/universal.h                 |     2 +
 deps/opende/src/mat.h                              |    22 +-
 deps/opende/src/objects.h                          |    22 +-
 deps/opende/src/ode.cpp                            |   150 +-
 deps/opende/src/odeou.cpp                          |     2 +
 deps/opende/src/quickstep.cpp                      |  1493 +-
 deps/opende/src/rotation.cpp                       |    14 +-
 deps/opende/src/util.h                             |     2 +
 doc/gazebo.in                                      |     2 +-
 examples/plugins/animate_joints/animate_joints.cc  |     2 +-
 examples/plugins/animate_pose/animate_pose.cc      |    12 +-
 examples/plugins/camera/camera_dump.cc             |     4 +-
 examples/plugins/camera/camera_move.cc             |     2 +-
 .../plugins/custom_messages/custom_messages.cc     |     4 +-
 examples/plugins/factory/CMakeLists.txt            |    15 +-
 examples/plugins/factory/factory.cc                |    89 +-
 examples/plugins/factory/factory.world             |    50 +-
 examples/plugins/factory/models/box/model.config   |    16 +
 examples/plugins/factory/models/box/model.sdf      |    19 +
 .../plugins/factory/models/cylinder/model.config   |    16 +
 examples/plugins/factory/models/cylinder/model.sdf |    19 +
 examples/plugins/hello_world/CMakeLists.txt        |     6 +-
 examples/plugins/hello_world/hello.world           |     7 +-
 examples/plugins/hello_world/hello_world.cc        |     4 +-
 examples/plugins/model_push/CMakeLists.txt         |     6 +-
 examples/plugins/model_push/model_push.cc          |    15 +-
 examples/plugins/model_push/model_push.world       |    21 +-
 examples/plugins/model_visuals/model_visuals.cc    |     2 +-
 examples/plugins/parameters/parameters.cc          |     4 +-
 examples/plugins/pr2_pose_test.cc                  |     4 +-
 examples/plugins/presentation.cc                   |    22 +-
 examples/plugins/projector/projector.cc            |     4 +-
 examples/plugins/ray_test.cc                       |     4 +-
 examples/plugins/system_gui_plugin/CMakeLists.txt  |    14 +-
 examples/plugins/system_gui_plugin/system_gui.cc   |    51 +-
 examples/plugins/world_edit/CMakeLists.txt         |     6 +-
 examples/plugins/world_edit/world_edit.cc          |    17 +-
 examples/plugins/world_edit/world_edit.world       |    59 +-
 examples/stand_alone/custom_main/CMakeLists.txt    |    17 +
 examples/stand_alone/custom_main/custom_main.cc    |    41 +
 examples/stand_alone/listener/CMakeLists.txt       |     2 +-
 examples/stand_alone/listener/listener.cc          |     8 +-
 examples/stand_alone/publisher/CMakeLists.txt      |     2 +-
 examples/stand_alone/publisher/publisher.cc        |    12 +-
 gazebo/CMakeLists.txt                              |   101 +-
 gazebo/Master.cc                                   |   106 +-
 gazebo/Master.hh                                   |    22 +-
 gazebo/Server.cc                                   |   289 +-
 gazebo/Server.hh                                   |    90 +-
 gazebo/common/Animation.cc                         |    12 +-
 gazebo/common/Animation.hh                         |     9 +-
 gazebo/common/Animation_TEST.cc                    |     9 +-
 gazebo/common/Assert.cc                            |     4 +-
 gazebo/common/Assert.hh                            |     2 +-
 gazebo/common/AudioDecoder.cc                      |   264 +
 gazebo/common/AudioDecoder.hh                      |    91 +
 gazebo/common/AudioDecoder_TEST.cc                 |   169 +
 gazebo/common/BVHLoader.cc                         |    18 +-
 gazebo/common/BVHLoader.hh                         |     7 +-
 gazebo/common/Base64.cc                            |   151 +
 gazebo/common/Base64.hh                            |    37 +
 gazebo/common/CMakeLists.txt                       |   109 +-
 gazebo/common/ColladaLoader.cc                     |    37 +-
 gazebo/common/ColladaLoader.hh                     |     7 +-
 gazebo/common/ColladaLoader_TEST.cc                |     7 +-
 gazebo/common/Color.cc                             |    32 +-
 gazebo/common/Color.hh                             |     9 +-
 gazebo/common/Color_TEST.cc                        |     7 +-
 gazebo/common/Common.cc                            |    51 -
 gazebo/common/Common.hh                            |    48 -
 gazebo/common/CommonIface.cc                       |    76 +
 gazebo/common/CommonIface.hh                       |   109 +
 gazebo/common/CommonIface_TEST.cc                  |    78 +
 gazebo/common/CommonTypes.hh                       |    11 +-
 gazebo/common/Console.cc                           |   215 +-
 gazebo/common/Console.hh                           |   243 +-
 gazebo/common/Console_TEST.cc                      |   260 +-
 gazebo/common/Dem.cc                               |   359 +
 gazebo/common/Dem.hh                               |   140 +
 gazebo/common/DemPrivate.hh                        |    67 +
 gazebo/common/Dem_TEST.cc                          |   173 +
 gazebo/common/Event.cc                             |    76 +-
 gazebo/common/Event.hh                             |   590 +-
 gazebo/common/Event_TEST.cc                        |   190 +
 gazebo/common/Events.cc                            |    12 +-
 gazebo/common/Events.hh                            |    44 +-
 gazebo/common/Exception.cc                         |     9 +-
 gazebo/common/Exception.hh                         |     9 +-
 gazebo/common/Exception_TEST.cc                    |    19 +-
 gazebo/common/HeightmapData.hh                     |    69 +
 gazebo/common/Image.cc                             |    25 +-
 gazebo/common/Image.hh                             |    16 +-
 gazebo/common/ImageHeightmap.cc                    |   135 +
 gazebo/common/ImageHeightmap.hh                    |    73 +
 gazebo/common/ImageHeightmap_TEST.cc               |   111 +
 gazebo/common/Image_TEST.cc                        |     7 +-
 gazebo/common/KeyEvent.hh                          |    49 +
 gazebo/common/KeyFrame.cc                          |     2 +-
 gazebo/common/KeyFrame.hh                          |    13 +-
 gazebo/common/LogPlay.cc                           |   268 -
 gazebo/common/LogPlay.hh                           |   141 -
 gazebo/common/LogRecord.cc                         |   607 -
 gazebo/common/LogRecord.hh                         |   307 -
 gazebo/common/LogRecord_TEST.cc                    |   111 -
 gazebo/common/Material.cc                          |     2 +-
 gazebo/common/Material.hh                          |     7 +-
 gazebo/common/Material_TEST.cc                     |     7 +-
 gazebo/common/Mesh.cc                              |    10 +-
 gazebo/common/Mesh.hh                              |    22 +-
 gazebo/common/MeshCSG.cc                           |    13 +-
 gazebo/common/MeshCSG.hh                           |     5 +-
 gazebo/common/MeshLoader.cc                        |     4 +-
 gazebo/common/MeshLoader.hh                        |     5 +-
 gazebo/common/MeshManager.cc                       |    61 +-
 gazebo/common/MeshManager.hh                       |     5 +-
 gazebo/common/Mesh_TEST.cc                         |    36 +-
 gazebo/common/ModelDatabase.cc                     |   167 +-
 gazebo/common/ModelDatabase.hh                     |    66 +-
 gazebo/common/ModelDatabasePrivate.hh              |    76 +
 gazebo/common/MouseEvent.hh                        |    11 +-
 gazebo/common/MovingWindowFilter.hh                |   205 +
 gazebo/common/MovingWindowFilter_TEST.cc           |    76 +
 gazebo/common/PID.cc                               |    49 +-
 gazebo/common/PID.hh                               |    73 +-
 gazebo/common/Plugin.cc                            |     6 +-
 gazebo/common/Plugin.hh                            |   149 +-
 gazebo/common/STLLoader.cc                         |    14 +-
 gazebo/common/STLLoader.hh                         |     7 +-
 gazebo/common/SingletonT.hh                        |     9 +-
 gazebo/common/Skeleton.cc                          |     8 +-
 gazebo/common/Skeleton.hh                          |    11 +-
 gazebo/common/SkeletonAnimation.cc                 |    18 +-
 gazebo/common/SkeletonAnimation.hh                 |    21 +-
 gazebo/common/SphericalCoordinates.cc              |   224 +
 gazebo/common/SphericalCoordinates.hh              |   151 +
 gazebo/common/SphericalCoordinatesPrivate.hh       |    59 +
 gazebo/common/SphericalCoordinates_TEST.cc         |   204 +
 gazebo/common/SystemPaths.cc                       |    85 +-
 gazebo/common/SystemPaths.hh                       |    37 +-
 gazebo/common/SystemPaths_TEST.cc                  |    48 +-
 gazebo/common/Time.cc                              |    33 +-
 gazebo/common/Time.hh                              |    12 +-
 gazebo/common/Time_TEST.cc                         |    18 +-
 gazebo/common/Timer.cc                             |     2 +-
 gazebo/common/Timer.hh                             |     9 +-
 gazebo/common/UpdateInfo.hh                        |     5 +-
 gazebo/common/Video.cc                             |    34 +-
 gazebo/common/Video.hh                             |     5 +-
 gazebo/common/ffmpeg_inc.h                         |    37 +
 gazebo/common/template_TEST.cc                     |     2 +-
 gazebo/gazebo.1.ronn                               |    49 +
 gazebo/gazebo.cc                                   |   229 +-
 gazebo/gazebo.hh                                   |    94 +-
 gazebo/gazebo_core.hh                              |     3 +-
 gazebo/gazebo_main.cc                              |    85 +-
 gazebo/gui/Actions.cc                              |    58 +-
 gazebo/gui/Actions.hh                              |    16 +-
 gazebo/gui/BoxMaker.cc                             |    19 +-
 gazebo/gui/BoxMaker.hh                             |    13 +-
 gazebo/gui/CMakeLists.txt                          |   108 +-
 gazebo/gui/CylinderMaker.cc                        |    19 +-
 gazebo/gui/CylinderMaker.hh                        |     9 +-
 gazebo/gui/DataLogger.cc                           |     2 +-
 gazebo/gui/DataLogger.hh                           |     5 +-
 gazebo/gui/DataLogger_TEST.cc                      |   202 +-
 gazebo/gui/DataLogger_TEST.hh                      |     2 +-
 gazebo/gui/Diagnostics.cc                          |     4 +-
 gazebo/gui/Diagnostics.hh                          |     5 +-
 gazebo/gui/Editor.cc                               |    55 +
 gazebo/gui/Editor.hh                               |    66 +
 gazebo/gui/EntityMaker.cc                          |     8 +-
 gazebo/gui/EntityMaker.hh                          |    18 +-
 gazebo/gui/GLWidget.cc                             |   597 +-
 gazebo/gui/GLWidget.hh                             |    94 +-
 gazebo/gui/Gui.cc                                  |   245 -
 gazebo/gui/Gui.hh                                  |    41 -
 gazebo/gui/GuiEvents.cc                            |     8 +-
 gazebo/gui/GuiEvents.hh                            |    70 +-
 gazebo/gui/GuiIface.cc                             |   335 +
 gazebo/gui/GuiIface.hh                             |   106 +
 gazebo/gui/GuiIface_TEST.cc                        |   162 +
 gazebo/gui/GuiIface_TEST.hh                        |    38 +
 gazebo/gui/GuiTypes.hh                             |     3 +-
 gazebo/gui/IncrementalPlot.cc                      |     6 +-
 gazebo/gui/IncrementalPlot.hh                      |     5 +-
 gazebo/gui/InsertModelWidget.cc                    |   127 +-
 gazebo/gui/InsertModelWidget.hh                    |    27 +-
 gazebo/gui/InsertModelWidgetPrivate.hh             |    58 +
 gazebo/gui/JointControlWidget.cc                   |     9 +-
 gazebo/gui/JointControlWidget.hh                   |    11 +-
 gazebo/gui/KeyEventHandler.cc                      |    99 +
 gazebo/gui/KeyEventHandler.hh                      |   138 +
 gazebo/gui/LightMaker.cc                           |    42 +-
 gazebo/gui/LightMaker.hh                           |    15 +-
 gazebo/gui/MainWindow.cc                           |   499 +-
 gazebo/gui/MainWindow.hh                           |   144 +-
 gazebo/gui/MainWindow_TEST.cc                      |   206 +
 gazebo/gui/MainWindow_TEST.hh                      |    36 +
 gazebo/gui/MeshMaker.cc                            |    19 +-
 gazebo/gui/MeshMaker.hh                            |     7 +-
 gazebo/gui/ModelBuilderWidget.cc                   |    18 +-
 gazebo/gui/ModelBuilderWidget.hh                   |    13 +-
 gazebo/gui/ModelEditWidget.cc                      |     8 +-
 gazebo/gui/ModelEditWidget.hh                      |    13 +-
 gazebo/gui/ModelListWidget.cc                      |   370 +-
 gazebo/gui/ModelListWidget.hh                      |    26 +-
 gazebo/gui/ModelListWidget_TEST.cc                 |   855 +
 gazebo/gui/ModelListWidget_TEST.hh                 |    94 +
 gazebo/gui/ModelMaker.cc                           |   137 +-
 gazebo/gui/ModelMaker.hh                           |    11 +-
 gazebo/gui/ModelManipulator.cc                     |   824 +
 gazebo/gui/ModelManipulator.hh                     |   162 +
 gazebo/gui/ModelManipulatorPrivate.hh              |    90 +
 gazebo/gui/ModelRightMenu.cc                       |    62 +-
 gazebo/gui/ModelRightMenu.hh                       |    26 +-
 gazebo/gui/MouseEventHandler.cc                    |   137 +
 gazebo/gui/MouseEventHandler.hh                    |   173 +
 gazebo/gui/QTestFixture.cc                         |    62 +-
 gazebo/gui/QTestFixture.hh                         |    31 +-
 gazebo/gui/RenderWidget.cc                         |    48 +-
 gazebo/gui/RenderWidget.hh                         |    23 +-
 gazebo/gui/SaveDialog.cc                           |   179 +
 gazebo/gui/SaveDialog.hh                           |   101 +
 gazebo/gui/SphereMaker.cc                          |    19 +-
 gazebo/gui/SphereMaker.hh                          |     9 +-
 gazebo/gui/TimePanel.cc                            |   178 +-
 gazebo/gui/TimePanel.hh                            |    16 +-
 gazebo/gui/TimePanel_TEST.cc                       |    75 +-
 gazebo/gui/TimePanel_TEST.hh                       |     2 +-
 gazebo/gui/ToolsWidget.cc                          |     2 +-
 gazebo/gui/ToolsWidget.hh                          |     7 +-
 gazebo/gui/TopicSelector.cc                        |     2 +-
 gazebo/gui/TopicSelector.hh                        |     5 +-
 gazebo/gui/building/BuildingEditor.cc              |   139 +
 gazebo/gui/building/BuildingEditor.hh              |    83 +
 gazebo/gui/building/BuildingEditorEvents.cc        |    37 +
 gazebo/gui/building/BuildingEditorEvents.hh        |   254 +
 gazebo/gui/building/BuildingEditorPalette.cc       |   164 +-
 gazebo/gui/building/BuildingEditorPalette.hh       |    16 +-
 gazebo/gui/building/BuildingEditorWidget.cc        |     6 +-
 gazebo/gui/building/BuildingEditorWidget.hh        |     5 +-
 gazebo/gui/building/BuildingItem.cc                |     2 +-
 gazebo/gui/building/BuildingItem.hh                |     6 +-
 gazebo/gui/building/BuildingMaker.cc               |    54 +-
 gazebo/gui/building/BuildingMaker.hh               |     9 +-
 gazebo/gui/building/BuildingModelManip.cc          |     2 +-
 gazebo/gui/building/BuildingModelManip.hh          |     5 +-
 gazebo/gui/building/CMakeLists.txt                 |    23 +-
 gazebo/gui/building/DoorItem.cc                    |     2 +-
 gazebo/gui/building/DoorItem.hh                    |     5 +-
 gazebo/gui/building/EditorEvents.cc                |    37 -
 gazebo/gui/building/EditorEvents.hh                |   253 -
 gazebo/gui/building/EditorItem.cc                  |     2 +-
 gazebo/gui/building/EditorItem.hh                  |     5 +-
 gazebo/gui/building/EditorView.cc                  |    13 +-
 gazebo/gui/building/EditorView.hh                  |     7 +-
 gazebo/gui/building/FinishBuildingDialog.cc        |     2 +-
 gazebo/gui/building/FinishBuildingDialog.hh        |     5 +-
 gazebo/gui/building/FloorItem.cc                   |     4 +-
 gazebo/gui/building/FloorItem.hh                   |     5 +-
 gazebo/gui/building/GrabberHandle.cc               |     2 +-
 gazebo/gui/building/GrabberHandle.hh               |     5 +-
 gazebo/gui/building/GridLines.cc                   |     2 +-
 gazebo/gui/building/GridLines.hh                   |     5 +-
 gazebo/gui/building/LevelInspectorDialog.cc        |     2 +-
 gazebo/gui/building/LevelInspectorDialog.hh        |     5 +-
 gazebo/gui/building/LevelWidget.cc                 |     4 +-
 gazebo/gui/building/LevelWidget.hh                 |     5 +-
 gazebo/gui/building/LineSegmentItem.cc             |     2 +-
 gazebo/gui/building/LineSegmentItem.hh             |     6 +-
 gazebo/gui/building/PolylineItem.cc                |     2 +-
 gazebo/gui/building/PolylineItem.hh                |     6 +-
 gazebo/gui/building/RectItem.cc                    |     2 +-
 gazebo/gui/building/RectItem.hh                    |     5 +-
 gazebo/gui/building/RotateHandle.cc                |     2 +-
 gazebo/gui/building/RotateHandle.hh                |     5 +-
 gazebo/gui/building/ScaleWidget.cc                 |     4 +-
 gazebo/gui/building/ScaleWidget.hh                 |     5 +-
 gazebo/gui/building/StairsInspectorDialog.cc       |     2 +-
 gazebo/gui/building/StairsInspectorDialog.hh       |     5 +-
 gazebo/gui/building/StairsItem.cc                  |     2 +-
 gazebo/gui/building/StairsItem.hh                  |     5 +-
 gazebo/gui/building/WallInspectorDialog.cc         |     2 +-
 gazebo/gui/building/WallInspectorDialog.hh         |     5 +-
 gazebo/gui/building/WallItem.cc                    |     2 +-
 gazebo/gui/building/WallItem.hh                    |     5 +-
 gazebo/gui/building/WindowDoorInspectorDialog.cc   |     2 +-
 gazebo/gui/building/WindowDoorInspectorDialog.hh   |     5 +-
 gazebo/gui/building/WindowItem.cc                  |     2 +-
 gazebo/gui/building/WindowItem.hh                  |     5 +-
 gazebo/gui/gui.hh.in                               |     7 +
 gazebo/gui/gzclient.1.ronn                         |    31 +
 gazebo/gui/images/arrow.png                        |   Bin 3449 -> 3439 bytes
 gazebo/gui/images/scale.png                        |   Bin 0 -> 1481 bytes
 gazebo/gui/main.cc                                 |     4 +-
 gazebo/gui/model/CMakeLists.txt                    |    43 +
 gazebo/gui/model/ImportDialog.cc                   |   154 +
 gazebo/gui/model/ImportDialog.hh                   |    94 +
 gazebo/gui/model/JointInspector.cc                 |   331 +
 gazebo/gui/model/JointInspector.hh                 |   154 +
 gazebo/gui/model/JointMaker.cc                     |   622 +
 gazebo/gui/model/JointMaker.hh                     |   244 +
 gazebo/gui/model/ModelCreator.cc                   |   766 +
 gazebo/gui/model/ModelCreator.hh                   |   333 +
 gazebo/gui/model/ModelEditor.cc                    |    73 +
 gazebo/gui/model/ModelEditor.hh                    |    58 +
 gazebo/gui/model/ModelEditorEvents.cc              |    23 +
 gazebo/gui/model/ModelEditorEvents.hh              |    52 +
 gazebo/gui/model/ModelEditorPalette.cc             |   462 +
 gazebo/gui/model/ModelEditorPalette.hh             |   162 +
 gazebo/gui/qt.h                                    |     2 +-
 gazebo/gui/qt_test.h                               |     2 +-
 gazebo/gui/qtpropertybrowser/CMakeLists.txt        |     2 +-
 .../qtpropertybrowser/qtpropertybrowserutils.cpp   |     4 +-
 .../qtpropertybrowser/qttreepropertybrowser.cpp    |     3 +
 gazebo/gui/resources.qrc                           |     1 +
 gazebo/gui/style.qss                               |    65 +-
 gazebo/gui/terrain/CMakeLists.txt                  |    26 +
 gazebo/gui/terrain/TerrainEditor.cc                |    57 +
 gazebo/gui/terrain/TerrainEditor.hh                |    52 +
 gazebo/gui/terrain/TerrainEditorPalette.cc         |   462 +
 gazebo/gui/terrain/TerrainEditorPalette.hh         |   158 +
 gazebo/gui/viewers/CMakeLists.txt                  |    51 +
 gazebo/gui/viewers/ImageFrame.cc                   |    89 +
 gazebo/gui/viewers/ImageFrame.hh                   |    55 +
 gazebo/gui/viewers/ImageFramePrivate.hh            |    38 +
 gazebo/gui/viewers/ImageView.cc                    |    61 +-
 gazebo/gui/viewers/ImageView.hh                    |    20 +-
 gazebo/gui/viewers/ImageViewPrivate.hh             |    37 +
 gazebo/gui/viewers/ImagesView.cc                   |   117 +-
 gazebo/gui/viewers/ImagesView.hh                   |    28 +-
 gazebo/gui/viewers/ImagesViewPrivate.hh            |    52 +
 gazebo/gui/viewers/ImagesView_TEST.cc              |   169 +-
 gazebo/gui/viewers/ImagesView_TEST.hh              |     2 +-
 gazebo/gui/viewers/LaserView.cc                    |    45 +-
 gazebo/gui/viewers/LaserView.hh                    |     8 +-
 gazebo/gui/viewers/TextView.cc                     |     4 +-
 gazebo/gui/viewers/TextView.hh                     |     5 +-
 gazebo/gui/viewers/TopicView.cc                    |    12 +-
 gazebo/gui/viewers/TopicView.hh                    |     7 +-
 gazebo/gui/viewers/ViewFactory.cc                  |     2 +-
 gazebo/gui/viewers/ViewFactory.hh                  |     8 +-
 gazebo/gzserver.1.ronn                             |    49 +
 gazebo/master_main.cc                              |    72 -
 gazebo/math/Angle.cc                               |    13 +-
 gazebo/math/Angle.hh                               |    21 +-
 gazebo/math/Angle_TEST.cc                          |     7 +-
 gazebo/math/Box.cc                                 |     6 +-
 gazebo/math/Box.hh                                 |     9 +-
 gazebo/math/Box_TEST.cc                            |    13 +-
 gazebo/math/CMakeLists.txt                         |     2 +-
 gazebo/math/Helpers.cc                             |     4 +-
 gazebo/math/Helpers.hh                             |    58 +-
 gazebo/math/Helpers_TEST.cc                        |    33 +-
 gazebo/math/MathTypes.hh                           |     2 +-
 gazebo/math/Matrix3.cc                             |    16 +-
 gazebo/math/Matrix3.hh                             |    24 +-
 gazebo/math/Matrix3_TEST.cc                        |    56 +-
 gazebo/math/Matrix4.cc                             |    10 +-
 gazebo/math/Matrix4.hh                             |     9 +-
 gazebo/math/Plane.cc                               |     4 +-
 gazebo/math/Plane.hh                               |     9 +-
 gazebo/math/Plane_TEST.cc                          |     7 +-
 gazebo/math/Pose.cc                                |    19 +-
 gazebo/math/Pose.hh                                |    39 +-
 gazebo/math/Pose_TEST.cc                           |     7 +-
 gazebo/math/Quaternion.cc                          |    12 +-
 gazebo/math/Quaternion.hh                          |    22 +-
 gazebo/math/Quaternion_TEST.cc                     |    41 +-
 gazebo/math/Rand.cc                                |     4 +-
 gazebo/math/Rand.hh                                |     5 +-
 gazebo/math/Rand_TEST.cc                           |    30 +-
 gazebo/math/RotationSpline.cc                      |     2 +-
 gazebo/math/RotationSpline.hh                      |     7 +-
 gazebo/math/RotationSpline_TEST.cc                 |     7 +-
 gazebo/math/Spline.cc                              |     2 +-
 gazebo/math/Spline.hh                              |     9 +-
 gazebo/math/Spline_TEST.cc                         |     7 +-
 gazebo/math/Vector2d.cc                            |    15 +-
 gazebo/math/Vector2d.hh                            |     5 +-
 gazebo/math/Vector2d_TEST.cc                       |     7 +-
 gazebo/math/Vector2i.cc                            |    98 +-
 gazebo/math/Vector2i.hh                            |     5 +-
 gazebo/math/Vector2i_TEST.cc                       |     7 +-
 gazebo/math/Vector3.cc                             |    15 +-
 gazebo/math/Vector3.hh                             |    13 +-
 gazebo/math/Vector3_TEST.cc                        |     7 +-
 gazebo/math/Vector4.cc                             |    10 +-
 gazebo/math/Vector4.hh                             |     7 +-
 gazebo/math/Vector4_TEST.cc                        |     7 +-
 gazebo/msgs/CMakeLists.txt                         |    57 +-
 gazebo/msgs/MsgFactory.cc                          |     2 +-
 gazebo/msgs/MsgFactory.hh                          |     8 +-
 gazebo/msgs/MsgFactory_TEST.cc                     |   100 +
 gazebo/msgs/camera_cmd.proto                       |    12 +
 gazebo/msgs/contacts.proto                         |     1 -
 gazebo/msgs/diagnostics.proto                      |     2 +-
 gazebo/msgs/factory.proto                          |     1 -
 gazebo/msgs/friction.proto                         |     2 +-
 gazebo/msgs/generator/GazeboGenerator.cc           |     4 +-
 gazebo/msgs/generator/GazeboGenerator.hh           |     2 +-
 gazebo/msgs/generator/gazebo_generator.cc          |     2 +-
 gazebo/msgs/gps.proto                              |    20 +
 gazebo/msgs/gz_string_v.proto                      |     2 -
 gazebo/msgs/heightmapgeom.proto                    |    30 +-
 gazebo/msgs/joint.proto                            |    38 +-
 gazebo/msgs/joint_cmd.proto                        |     1 -
 gazebo/msgs/joint_wrench.proto                     |    16 +-
 gazebo/msgs/laserscan.proto                        |    23 +-
 gazebo/msgs/laserscan_stamped.proto                |     2 +-
 gazebo/msgs/link.proto                             |     6 +-
 gazebo/msgs/link_data.proto                        |    16 +
 gazebo/msgs/log_control.proto                      |     1 +
 gazebo/msgs/material.proto                         |    12 +-
 gazebo/msgs/model.proto                            |     5 +-
 gazebo/msgs/model_v.proto                          |     2 +-
 gazebo/msgs/msgs.cc                                |   232 +-
 gazebo/msgs/msgs.hh                                |    50 +-
 gazebo/msgs/msgs_TEST.cc                           |   151 +-
 gazebo/msgs/physics.proto                          |    36 +-
 gazebo/msgs/plugin.proto                           |     1 +
 gazebo/msgs/pointcloud.proto                       |    12 +
 gazebo/msgs/pose.proto                             |     5 +-
 gazebo/msgs/pose_animation.proto                   |     7 +-
 gazebo/msgs/pose_v.proto                           |     2 +-
 gazebo/msgs/poses_stamped.proto                    |    14 +
 gazebo/msgs/propagation_grid.proto                 |    14 +
 gazebo/msgs/propagation_particle.proto             |    13 +
 gazebo/msgs/publishers.proto                       |     2 -
 gazebo/msgs/sensor.proto                           |    23 +-
 gazebo/msgs/server_control.proto                   |     3 +-
 gazebo/msgs/sonar.proto                            |    21 +
 gazebo/msgs/sonar_stamped.proto                    |    15 +
 gazebo/msgs/spherical_coordinates.proto            |    19 +
 gazebo/msgs/surface.proto                          |     5 +-
 gazebo/msgs/tactile.proto                          |    15 +
 gazebo/msgs/test/CMakeLists.txt                    |    13 -
 gazebo/msgs/test/MsgFactory.cc                     |    97 -
 gazebo/msgs/topic_info.proto                       |     2 -
 gazebo/msgs/track_visual.proto                     |    11 +-
 gazebo/msgs/vector3d.proto                         |     2 -
 gazebo/msgs/visual.proto                           |    26 +-
 gazebo/msgs/wireless_node.proto                    |    13 +
 gazebo/msgs/wireless_nodes.proto                   |    14 +
 gazebo/msgs/world_control.proto                    |     5 +-
 gazebo/msgs/wrench.proto                           |    14 +
 gazebo/msgs/wrench_stamped.proto                   |    15 +
 gazebo/physics/Actor.cc                            |   100 +-
 gazebo/physics/Actor.hh                            |    45 +-
 gazebo/physics/BallJoint.hh                        |    48 +-
 gazebo/physics/Base.cc                             |    76 +-
 gazebo/physics/Base.hh                             |    56 +-
 gazebo/physics/BoxShape.cc                         |    25 +-
 gazebo/physics/BoxShape.hh                         |     9 +-
 gazebo/physics/BoxShape_TEST.cc                    |   138 +
 gazebo/physics/CMakeLists.txt                      |    58 +-
 gazebo/physics/Collision.cc                        |   117 +-
 gazebo/physics/Collision.hh                        |    63 +-
 gazebo/physics/CollisionState.cc                   |     6 +-
 gazebo/physics/CollisionState.hh                   |    15 +-
 gazebo/physics/Contact.cc                          |    48 +-
 gazebo/physics/Contact.hh                          |    15 +-
 gazebo/physics/ContactManager.cc                   |   269 +-
 gazebo/physics/ContactManager.hh                   |    80 +-
 gazebo/physics/ContactManager_TEST.cc              |   128 +
 gazebo/physics/CylinderShape.cc                    |    45 +-
 gazebo/physics/CylinderShape.hh                    |    11 +-
 gazebo/physics/CylinderShape_TEST.cc               |   143 +
 gazebo/physics/Entity.cc                           |    72 +-
 gazebo/physics/Entity.hh                           |    11 +-
 gazebo/physics/GearboxJoint.hh                     |   110 +
 gazebo/physics/Gripper.cc                          |   124 +-
 gazebo/physics/Gripper.hh                          |    45 +-
 gazebo/physics/HeightmapShape.cc                   |   340 +-
 gazebo/physics/HeightmapShape.hh                   |    77 +-
 gazebo/physics/Hinge2Joint.hh                      |    13 +-
 gazebo/physics/HingeJoint.hh                       |     7 +-
 gazebo/physics/Inertial.cc                         |    39 +-
 gazebo/physics/Inertial.hh                         |     8 +-
 gazebo/physics/Inertial_TEST.cc                    |     6 +-
 gazebo/physics/Joint.cc                            |   788 +-
 gazebo/physics/Joint.hh                            |   444 +-
 gazebo/physics/JointController.cc                  |   747 +-
 gazebo/physics/JointController.hh                  |   145 +-
 gazebo/physics/JointControllerPrivate.hh           |    69 +
 gazebo/physics/JointController_TEST.cc             |   250 +
 gazebo/physics/JointState.cc                       |    34 +-
 gazebo/physics/JointState.hh                       |    29 +-
 gazebo/physics/JointWrench.hh                      |    11 +-
 gazebo/physics/Joint_TEST.cc                       |   170 -
 gazebo/physics/Link.cc                             |   632 +-
 gazebo/physics/Link.hh                             |   141 +-
 gazebo/physics/LinkState.cc                        |   198 +-
 gazebo/physics/LinkState.hh                        |    95 +-
 gazebo/physics/MapShape.cc                         |    76 +-
 gazebo/physics/MapShape.hh                         |    13 +-
 gazebo/physics/MeshShape.cc                        |   143 +
 gazebo/physics/MeshShape.hh                        |    96 +
 gazebo/physics/Model.cc                            |   404 +-
 gazebo/physics/Model.hh                            |    78 +-
 gazebo/physics/ModelState.cc                       |   302 +-
 gazebo/physics/ModelState.hh                       |   107 +-
 gazebo/physics/MultiRayShape.cc                    |    89 +-
 gazebo/physics/MultiRayShape.hh                    |    21 +-
 gazebo/physics/Physics.cc                          |   159 -
 gazebo/physics/Physics.hh                          |    99 -
 gazebo/physics/PhysicsEngine.cc                    |    45 +-
 gazebo/physics/PhysicsEngine.hh                    |    90 +-
 gazebo/physics/PhysicsEngine_TEST.cc               |    21 +-
 gazebo/physics/PhysicsFactory.cc                   |    34 +-
 gazebo/physics/PhysicsFactory.hh                   |    10 +-
 gazebo/physics/PhysicsIface.cc                     |   181 +
 gazebo/physics/PhysicsIface.hh                     |   129 +
 gazebo/physics/PhysicsTypes.hh                     |    26 +-
 gazebo/physics/PlaneShape.cc                       |    22 +-
 gazebo/physics/PlaneShape.hh                       |     9 +-
 gazebo/physics/RayShape.cc                         |    16 +-
 gazebo/physics/RayShape.hh                         |     8 +-
 gazebo/physics/Road.cc                             |    25 +-
 gazebo/physics/Road.hh                             |     5 +-
 gazebo/physics/ScrewJoint.hh                       |    96 +-
 gazebo/physics/Shape.cc                            |    14 +-
 gazebo/physics/Shape.hh                            |    16 +-
 gazebo/physics/SliderJoint.hh                      |    28 +-
 gazebo/physics/SphereShape.cc                      |    26 +-
 gazebo/physics/SphereShape.hh                      |     9 +-
 gazebo/physics/SphereShape_TEST.cc                 |   118 +
 gazebo/physics/State.cc                            |    20 +-
 gazebo/physics/State.hh                            |    21 +-
 gazebo/physics/SurfaceParams.cc                    |   166 +-
 gazebo/physics/SurfaceParams.hh                    |   156 +-
 gazebo/physics/TrimeshShape.cc                     |   150 -
 gazebo/physics/TrimeshShape.hh                     |   104 -
 gazebo/physics/UniversalJoint.hh                   |    39 +-
 gazebo/physics/World.cc                            |   916 +-
 gazebo/physics/World.hh                            |   170 +-
 gazebo/physics/WorldState.cc                       |   170 +-
 gazebo/physics/WorldState.hh                       |    83 +-
 gazebo/physics/bullet/BulletBallJoint.cc           |   166 +-
 gazebo/physics/bullet/BulletBallJoint.hh           |    79 +-
 gazebo/physics/bullet/BulletBoxShape.hh            |    53 +-
 gazebo/physics/bullet/BulletCollision.cc           |    24 +-
 gazebo/physics/bullet/BulletCollision.hh           |    24 +-
 gazebo/physics/bullet/BulletCylinderShape.hh       |    58 +-
 gazebo/physics/bullet/BulletHeightmapShape.cc      |    51 +-
 gazebo/physics/bullet/BulletHeightmapShape.hh      |    11 +-
 gazebo/physics/bullet/BulletHinge2Joint.cc         |   121 +-
 gazebo/physics/bullet/BulletHinge2Joint.hh         |    90 +-
 gazebo/physics/bullet/BulletHingeJoint.cc          |   120 +-
 gazebo/physics/bullet/BulletHingeJoint.hh          |    55 +-
 gazebo/physics/bullet/BulletJoint.cc               |   492 +-
 gazebo/physics/bullet/BulletJoint.hh               |   155 +-
 gazebo/physics/bullet/BulletLink.cc                |    93 +-
 gazebo/physics/bullet/BulletLink.hh                |    23 +-
 gazebo/physics/bullet/BulletMeshShape.cc           |   112 +
 gazebo/physics/bullet/BulletMeshShape.hh           |    55 +
 gazebo/physics/bullet/BulletMotionState.cc         |    30 +-
 gazebo/physics/bullet/BulletMotionState.hh         |     5 +-
 gazebo/physics/bullet/BulletMultiRayShape.cc       |     2 +-
 gazebo/physics/bullet/BulletMultiRayShape.hh       |     7 +-
 gazebo/physics/bullet/BulletPhysics.cc             |   538 +-
 gazebo/physics/bullet/BulletPhysics.hh             |    28 +-
 gazebo/physics/bullet/BulletPhysics_TEST.cc        |    80 +-
 gazebo/physics/bullet/BulletPlaneShape.hh          |     9 +-
 gazebo/physics/bullet/BulletRaySensor.cc           |     2 +-
 gazebo/physics/bullet/BulletRaySensor.hh           |     5 +-
 gazebo/physics/bullet/BulletRayShape.cc            |    19 +-
 gazebo/physics/bullet/BulletRayShape.hh            |     7 +-
 gazebo/physics/bullet/BulletScrewJoint.cc          |  1150 +-
 gazebo/physics/bullet/BulletScrewJoint.hh          |   108 +-
 gazebo/physics/bullet/BulletSliderJoint.cc         |   103 +-
 gazebo/physics/bullet/BulletSliderJoint.hh         |    74 +-
 gazebo/physics/bullet/BulletSphereShape.hh         |    50 +-
 gazebo/physics/bullet/BulletSurfaceParams.cc       |    89 +
 gazebo/physics/bullet/BulletSurfaceParams.hh       |    63 +
 gazebo/physics/bullet/BulletTrimeshShape.cc        |   101 -
 gazebo/physics/bullet/BulletTrimeshShape.hh        |    54 -
 gazebo/physics/bullet/BulletTypes.hh               |    13 +-
 gazebo/physics/bullet/BulletTypes_TEST.cc          |    11 +-
 gazebo/physics/bullet/BulletUniversalJoint.cc      |   405 +-
 gazebo/physics/bullet/BulletUniversalJoint.hh      |   102 +-
 gazebo/physics/bullet/CMakeLists.txt               |    30 +-
 gazebo/physics/bullet/bullet_inc.h                 |     3 +-
 gazebo/physics/bullet/bullet_math_inc.h            |     2 +-
 gazebo/physics/bullet/gzBtUniversalConstraint.cc   |   241 +
 gazebo/physics/bullet/gzBtUniversalConstraint.hh   |   135 +
 gazebo/physics/dart/CMakeLists.txt                 |    64 +
 gazebo/physics/dart/DARTBallJoint.cc               |   139 +
 gazebo/physics/dart/DARTBallJoint.hh               |    92 +
 gazebo/physics/dart/DARTBoxShape.hh                |   105 +
 gazebo/physics/dart/DARTCollision.cc               |   147 +
 gazebo/physics/dart/DARTCollision.hh               |    99 +
 gazebo/physics/dart/DARTCylinderShape.hh           |   100 +
 gazebo/physics/dart/DARTHeightmapShape.cc          |    41 +
 gazebo/physics/dart/DARTHeightmapShape.hh          |    56 +
 gazebo/physics/dart/DARTHinge2Joint.cc             |   211 +
 gazebo/physics/dart/DARTHinge2Joint.hh             |    81 +
 gazebo/physics/dart/DARTHingeJoint.cc              |   179 +
 gazebo/physics/dart/DARTHingeJoint.hh              |    81 +
 gazebo/physics/dart/DARTJoint.cc                   |   660 +
 gazebo/physics/dart/DARTJoint.hh                   |   180 +
 gazebo/physics/dart/DARTLink.cc                    |   522 +
 gazebo/physics/dart/DARTLink.hh                    |   193 +
 gazebo/physics/dart/DARTMeshShape.cc               |    56 +
 gazebo/physics/dart/DARTMeshShape.hh               |    64 +
 gazebo/physics/dart/DARTModel.cc                   |   206 +
 gazebo/physics/dart/DARTModel.hh                   |    85 +
 gazebo/physics/dart/DARTMultiRayShape.cc           |    66 +
 gazebo/physics/dart/DARTMultiRayShape.hh           |    57 +
 gazebo/physics/dart/DARTPhysics.cc                 |   568 +
 gazebo/physics/dart/DARTPhysics.hh                 |   168 +
 gazebo/physics/dart/DARTPlaneShape.hh              |    66 +
 gazebo/physics/dart/DARTRayShape.cc                |    80 +
 gazebo/physics/dart/DARTRayShape.hh                |    70 +
 gazebo/physics/dart/DARTScrewJoint.cc              |   245 +
 gazebo/physics/dart/DARTScrewJoint.hh              |   101 +
 gazebo/physics/dart/DARTSliderJoint.cc             |   177 +
 gazebo/physics/dart/DARTSliderJoint.hh             |    78 +
 gazebo/physics/dart/DARTSphereShape.hh             |    88 +
 gazebo/physics/dart/DARTTypes.hh                   |   107 +
 gazebo/physics/dart/DARTUniversalJoint.cc          |   213 +
 gazebo/physics/dart/DARTUniversalJoint.hh          |    78 +
 gazebo/physics/dart/dart_inc.h                     |    56 +
 gazebo/physics/ode/CMakeLists.txt                  |    73 +-
 gazebo/physics/ode/ODEBallJoint.cc                 |    84 +-
 gazebo/physics/ode/ODEBallJoint.hh                 |    45 +-
 gazebo/physics/ode/ODEBoxShape.hh                  |    17 +-
 gazebo/physics/ode/ODECollision.cc                 |    28 +-
 gazebo/physics/ode/ODECollision.hh                 |    11 +-
 gazebo/physics/ode/ODECylinderShape.hh             |     5 +-
 gazebo/physics/ode/ODEGearboxJoint.cc              |   198 +
 gazebo/physics/ode/ODEGearboxJoint.hh              |    97 +
 gazebo/physics/ode/ODEHeightmapShape.cc            |    15 +-
 gazebo/physics/ode/ODEHeightmapShape.hh            |     5 +-
 gazebo/physics/ode/ODEHinge2Joint.cc               |    78 +-
 gazebo/physics/ode/ODEHinge2Joint.hh               |    33 +-
 gazebo/physics/ode/ODEHingeJoint.cc                |    72 +-
 gazebo/physics/ode/ODEHingeJoint.hh                |    31 +-
 gazebo/physics/ode/ODEJoint.cc                     |   790 +-
 gazebo/physics/ode/ODEJoint.hh                     |   173 +-
 gazebo/physics/ode/ODEJoint_TEST.cc                |   302 +-
 gazebo/physics/ode/ODELink.cc                      |   158 +-
 gazebo/physics/ode/ODELink.hh                      |    11 +-
 gazebo/physics/ode/ODEMeshShape.cc                 |   155 +
 gazebo/physics/ode/ODEMeshShape.hh                 |    68 +
 gazebo/physics/ode/ODEMultiRayShape.cc             |    39 +-
 gazebo/physics/ode/ODEMultiRayShape.hh             |     5 +-
 gazebo/physics/ode/ODEPhysics.cc                   |   673 +-
 gazebo/physics/ode/ODEPhysics.hh                   |    25 +-
 gazebo/physics/ode/ODEPhysics_TEST.cc              |    36 +-
 gazebo/physics/ode/ODEPlaneShape.hh                |    10 +-
 gazebo/physics/ode/ODERayShape.cc                  |     2 +-
 gazebo/physics/ode/ODERayShape.hh                  |    13 +-
 gazebo/physics/ode/ODEScrewJoint.cc                |   193 +-
 gazebo/physics/ode/ODEScrewJoint.hh                |    62 +-
 gazebo/physics/ode/ODESliderJoint.cc               |    85 +-
 gazebo/physics/ode/ODESliderJoint.hh               |    33 +-
 gazebo/physics/ode/ODESphereShape.hh               |     5 +-
 gazebo/physics/ode/ODESurfaceParams.cc             |   145 +-
 gazebo/physics/ode/ODESurfaceParams.hh             |    99 +-
 gazebo/physics/ode/ODETrimeshShape.cc              |   155 -
 gazebo/physics/ode/ODETrimeshShape.hh              |    67 -
 gazebo/physics/ode/ODETypes.hh                     |     8 +-
 gazebo/physics/ode/ODEUniversalJoint.cc            |   358 +-
 gazebo/physics/ode/ODEUniversalJoint.hh            |    60 +-
 gazebo/physics/ode/ode_inc.h                       |     2 +-
 gazebo/physics/server.cc                           |   150 -
 gazebo/physics/simbody/CMakeLists.txt              |    37 +
 gazebo/physics/simbody/SimbodyBallJoint.cc         |   137 +
 gazebo/physics/simbody/SimbodyBallJoint.hh         |    95 +
 gazebo/physics/simbody/SimbodyBoxShape.hh          |    80 +
 gazebo/physics/simbody/SimbodyCollision.cc         |    83 +
 gazebo/physics/simbody/SimbodyCollision.hh         |    79 +
 gazebo/physics/simbody/SimbodyCylinderShape.hh     |    81 +
 gazebo/physics/simbody/SimbodyHeightmapShape.cc    |    45 +
 gazebo/physics/simbody/SimbodyHeightmapShape.hh    |    51 +
 gazebo/physics/simbody/SimbodyHinge2Joint.cc       |   116 +
 gazebo/physics/simbody/SimbodyHinge2Joint.hh       |    83 +
 gazebo/physics/simbody/SimbodyHingeJoint.cc        |   230 +
 gazebo/physics/simbody/SimbodyHingeJoint.hh        |    89 +
 gazebo/physics/simbody/SimbodyJoint.cc             |   616 +
 gazebo/physics/simbody/SimbodyJoint.hh             |   241 +
 gazebo/physics/simbody/SimbodyLink.cc              |   600 +
 gazebo/physics/simbody/SimbodyLink.hh              |   216 +
 gazebo/physics/simbody/SimbodyMeshShape.cc         |    53 +
 gazebo/physics/simbody/SimbodyMeshShape.hh         |    51 +
 gazebo/physics/simbody/SimbodyModel.cc             |   121 +
 gazebo/physics/simbody/SimbodyModel.hh             |    51 +
 gazebo/physics/simbody/SimbodyMultiRayShape.cc     |    62 +
 gazebo/physics/simbody/SimbodyMultiRayShape.hh     |    54 +
 gazebo/physics/simbody/SimbodyPhysics.cc           |  1410 +
 gazebo/physics/simbody/SimbodyPhysics.hh           |   279 +
 gazebo/physics/simbody/SimbodyPlaneShape.cc        |    53 +
 gazebo/physics/simbody/SimbodyPlaneShape.hh        |    50 +
 gazebo/physics/simbody/SimbodyRayShape.cc          |    74 +
 gazebo/physics/simbody/SimbodyRayShape.hh          |    63 +
 gazebo/physics/simbody/SimbodyScrewJoint.cc        |   523 +
 gazebo/physics/simbody/SimbodyScrewJoint.hh        |   123 +
 gazebo/physics/simbody/SimbodySliderJoint.cc       |   186 +
 gazebo/physics/simbody/SimbodySliderJoint.hh       |    80 +
 gazebo/physics/simbody/SimbodySphereShape.hh       |    70 +
 gazebo/physics/simbody/SimbodyTypes.hh             |    55 +
 gazebo/physics/simbody/SimbodyUniversalJoint.cc    |   232 +
 gazebo/physics/simbody/SimbodyUniversalJoint.hh    |    84 +
 gazebo/physics/simbody/simbody_inc.h               |    28 +
 gazebo/rendering/ArrowVisual.cc                    |    63 +-
 gazebo/rendering/ArrowVisual.hh                    |    19 +-
 gazebo/rendering/ArrowVisualPrivate.hh             |    42 +
 gazebo/rendering/AxisVisual.cc                     |    82 +-
 gazebo/rendering/AxisVisual.hh                     |    15 +-
 gazebo/rendering/AxisVisualPrivate.hh              |    42 +
 gazebo/rendering/CMakeLists.txt                    |    44 +-
 gazebo/rendering/COMVisual.cc                      |    98 +-
 gazebo/rendering/COMVisual.hh                      |    32 +-
 gazebo/rendering/COMVisualPrivate.hh               |    47 +
 gazebo/rendering/Camera.cc                         |   612 +-
 gazebo/rendering/Camera.hh                         |   189 +-
 gazebo/rendering/CameraPrivate.hh                  |    94 +
 gazebo/rendering/CameraVisual.cc                   |    61 +-
 gazebo/rendering/CameraVisual.hh                   |    19 +-
 gazebo/rendering/CameraVisualPrivate.hh            |    42 +
 gazebo/rendering/ContactVisual.cc                  |   114 +-
 gazebo/rendering/ContactVisual.hh                  |    56 +-
 gazebo/rendering/ContactVisualPrivate.hh           |    82 +
 gazebo/rendering/Conversions.cc                    |     4 +-
 gazebo/rendering/Conversions.hh                    |    13 +-
 gazebo/rendering/DepthCamera.cc                    |    29 +-
 gazebo/rendering/DepthCamera.hh                    |    21 +-
 gazebo/rendering/DynamicLines.cc                   |    42 +-
 gazebo/rendering/DynamicLines.hh                   |    39 +-
 gazebo/rendering/DynamicRenderable.cc              |    21 +-
 gazebo/rendering/DynamicRenderable.hh              |    14 +-
 gazebo/rendering/FPSViewController.cc              |    10 +-
 gazebo/rendering/FPSViewController.hh              |     7 +-
 gazebo/rendering/GUIOverlay.cc                     |    81 +-
 gazebo/rendering/GUIOverlay.hh                     |    85 +-
 gazebo/rendering/GUIOverlayPrivate.hh              |    68 +
 gazebo/rendering/GpuLaser.cc                       |   526 +-
 gazebo/rendering/GpuLaser.hh                       |   220 +-
 gazebo/rendering/GpuLaser_TEST.cc                  |    92 +
 gazebo/rendering/Grid.cc                           |    10 +-
 gazebo/rendering/Grid.hh                           |     9 +-
 gazebo/rendering/Heightmap.cc                      |   696 +-
 gazebo/rendering/Heightmap.hh                      |   243 +-
 gazebo/rendering/Heightmap_TEST.cc                 |    96 +
 gazebo/rendering/JointVisual.cc                    |    45 +-
 gazebo/rendering/JointVisual.hh                    |    16 +-
 gazebo/rendering/JointVisualPrivate.hh             |    37 +
 gazebo/rendering/LaserVisual.cc                    |   122 +-
 gazebo/rendering/LaserVisual.hh                    |    27 +-
 gazebo/rendering/LaserVisualPrivate.hh             |    59 +
 gazebo/rendering/Light.cc                          |   189 +-
 gazebo/rendering/Light.hh                          |    32 +-
 gazebo/rendering/Material.cc                       |    10 +-
 gazebo/rendering/Material.hh                       |     5 +-
 gazebo/rendering/MovableText.cc                    |    23 +-
 gazebo/rendering/MovableText.hh                    |    14 +-
 gazebo/rendering/OrbitViewController.cc            |    12 +-
 gazebo/rendering/OrbitViewController.hh            |     9 +-
 gazebo/rendering/Projector.cc                      |    34 +-
 gazebo/rendering/Projector.hh                      |    17 +-
 gazebo/rendering/RFIDTagVisual.cc                  |    24 +-
 gazebo/rendering/RFIDTagVisual.hh                  |    20 +-
 gazebo/rendering/RFIDTagVisualPrivate.hh           |    39 +
 gazebo/rendering/RFIDVisual.cc                     |    26 +-
 gazebo/rendering/RFIDVisual.hh                     |    21 +-
 gazebo/rendering/RFIDVisualPrivate.hh              |    39 +
 gazebo/rendering/RTShaderSystem.cc                 |    57 +-
 gazebo/rendering/RTShaderSystem.hh                 |    16 +-
 gazebo/rendering/RenderEngine.cc                   |   261 +-
 gazebo/rendering/RenderEngine.hh                   |    39 +-
 gazebo/rendering/RenderEvents.cc                   |     4 +-
 gazebo/rendering/RenderEvents.hh                   |     9 +-
 gazebo/rendering/RenderTypes.hh                    |    29 +-
 gazebo/rendering/Rendering.cc                      |    97 -
 gazebo/rendering/Rendering.hh                      |    57 -
 gazebo/rendering/RenderingIface.cc                 |   109 +
 gazebo/rendering/RenderingIface.hh                 |    65 +
 gazebo/rendering/Road2d.cc                         |    14 +-
 gazebo/rendering/Road2d.hh                         |     5 +-
 gazebo/rendering/Scene.cc                          |   891 +-
 gazebo/rendering/Scene.hh                          |   121 +-
 gazebo/rendering/SelectionObj.cc                   |   773 +-
 gazebo/rendering/SelectionObj.hh                   |   133 +-
 gazebo/rendering/SelectionObjPrivate.hh            |   105 +
 gazebo/rendering/SonarVisual.cc                    |   141 +
 gazebo/rendering/SonarVisual.hh                    |    60 +
 gazebo/rendering/SonarVisualPrivate.hh             |    62 +
 gazebo/rendering/TransmitterVisual.cc              |   122 +
 gazebo/rendering/TransmitterVisual.hh              |    60 +
 gazebo/rendering/TransmitterVisualPrivate.hh       |    64 +
 gazebo/rendering/UserCamera.cc                     |   185 +-
 gazebo/rendering/UserCamera.hh                     |    50 +-
 gazebo/rendering/UserCameraPrivate.hh              |    52 +
 gazebo/rendering/VideoVisual.cc                    |    66 +-
 gazebo/rendering/VideoVisual.hh                    |    29 +-
 gazebo/rendering/VideoVisualPrivate.hh             |    57 +
 gazebo/rendering/ViewController.cc                 |     6 +-
 gazebo/rendering/ViewController.hh                 |     9 +-
 gazebo/rendering/Visual.cc                         |  1073 +-
 gazebo/rendering/Visual.hh                         |   174 +-
 gazebo/rendering/VisualPrivate.hh                  |   146 +
 gazebo/rendering/WindowManager.cc                  |    28 +-
 gazebo/rendering/WindowManager.hh                  |    15 +-
 gazebo/rendering/WireBox.cc                        |    80 +-
 gazebo/rendering/WireBox.hh                        |    30 +-
 gazebo/rendering/WireBoxPrivate.hh                 |    38 +
 gazebo/rendering/WrenchVisual.cc                   |   184 +
 gazebo/rendering/WrenchVisual.hh                   |    66 +
 gazebo/rendering/WrenchVisualPrivate.hh            |    74 +
 gazebo/rendering/cegui.h                           |     4 +-
 gazebo/rendering/deferred_shading/AmbientLight.hh  |     6 +-
 gazebo/rendering/deferred_shading/DeferredLight.cc |     4 +-
 gazebo/rendering/deferred_shading/DeferredLight.hh |     5 +-
 .../rendering/deferred_shading/DeferredLightCP.hh  |     9 +-
 .../deferred_shading/GBufferMaterialGenerator.cc   |     2 +-
 .../deferred_shading/GBufferMaterialGenerator.hh   |     5 +-
 .../deferred_shading/GBufferSchemeHandler.cc       |     2 +-
 .../deferred_shading/GBufferSchemeHandler.hh       |     6 +-
 gazebo/rendering/deferred_shading/GeomUtils.cc     |     2 +-
 gazebo/rendering/deferred_shading/GeomUtils.hh     |     5 +-
 .../deferred_shading/LightMaterialGenerator.hh     |    10 +-
 .../deferred_shading/ListenerFactoryLogic.hh       |     5 +-
 .../deferred_shading/MaterialGenerator.cc          |     2 +-
 .../deferred_shading/MaterialGenerator.hh          |     5 +-
 gazebo/rendering/deferred_shading/MergeCP.hh       |     8 +-
 .../deferred_shading/MergeMaterialGenerator.cc     |   140 +-
 .../deferred_shading/MergeMaterialGenerator.hh     |     5 +-
 .../deferred_shading/MergeSchemeHandler.cc         |     2 +-
 .../deferred_shading/MergeSchemeHandler.hh         |     6 +-
 .../deferred_shading/NullSchemeHandler.hh          |     6 +-
 gazebo/rendering/deferred_shading/SSAOLogic.cc     |     2 +-
 gazebo/rendering/deferred_shading/SSAOLogic.hh     |     5 +-
 .../deferred_shading/TechniqueDefinitions.hh       |    11 +-
 gazebo/rendering/ogre_gazebo.h                     |    43 +-
 .../rendering/selection_buffer/MaterialSwitcher.cc |    35 +-
 .../rendering/selection_buffer/MaterialSwitcher.hh |     6 +-
 .../rendering/selection_buffer/SelectionBuffer.cc  |    52 +-
 .../rendering/selection_buffer/SelectionBuffer.hh  |     5 +-
 .../selection_buffer/SelectionRenderListener.cc    |     2 +-
 .../selection_buffer/SelectionRenderListener.hh    |     6 +-
 gazebo/rendering/skyx/include/MoonManager.h        |    15 +
 gazebo/rendering/skyx/include/Prerequisites.h      |     3 +
 gazebo/rendering/skyx/include/SkyX.h               |    55 +-
 gazebo/rendering/skyx/include/VClouds/VClouds.h    |     5 +
 gazebo/rendering/skyx/src/MeshManager.cpp          |     1 -
 gazebo/rendering/skyx/src/MoonManager.cpp          |     1 +
 gazebo/rendering/skyx/src/SkyX.cpp                 |    38 +-
 gazebo/rendering/skyx/src/VClouds/DataManager.cpp  |    26 +-
 gazebo/rendering/skyx/src/VClouds/VClouds.cpp      |    14 +-
 gazebo/sdf/1.0/CMakeLists.txt                      |    30 -
 gazebo/sdf/1.0/actor.sdf                           |    40 -
 gazebo/sdf/1.0/camera.sdf                          |    21 -
 gazebo/sdf/1.0/collision.sdf                       |    16 -
 gazebo/sdf/1.0/contact.sdf                         |     6 -
 gazebo/sdf/1.0/gazebo.sdf                          |     9 -
 gazebo/sdf/1.0/geometry.sdf                        |    43 -
 gazebo/sdf/1.0/gripper.sdf                         |    11 -
 gazebo/sdf/1.0/gui.sdf                             |    21 -
 gazebo/sdf/1.0/inertial.sdf                        |    17 -
 gazebo/sdf/1.0/joint.sdf                           |    63 -
 gazebo/sdf/1.0/light.sdf                           |    37 -
 gazebo/sdf/1.0/link.sdf                            |    23 -
 gazebo/sdf/1.0/model.sdf                           |    15 -
 gazebo/sdf/1.0/physics.sdf                         |    33 -
 gazebo/sdf/1.0/plugin.sdf                          |     6 -
 gazebo/sdf/1.0/projector.sdf                       |    10 -
 gazebo/sdf/1.0/ray.sdf                             |    21 -
 gazebo/sdf/1.0/rfid.sdf                            |     2 -
 gazebo/sdf/1.0/rfidtag.sdf                         |     2 -
 gazebo/sdf/1.0/road.sdf                            |     6 -
 gazebo/sdf/1.0/scene.sdf                           |    29 -
 gazebo/sdf/1.0/sensor.sdf                          |    22 -
 gazebo/sdf/1.0/state.sdf                           |    28 -
 gazebo/sdf/1.0/surface.sdf                         |    27 -
 gazebo/sdf/1.0/visual.sdf                          |    35 -
 gazebo/sdf/1.0/world.sdf                           |    16 -
 gazebo/sdf/1.2/1_0.convert                         |  1462 -
 gazebo/sdf/1.2/CMakeLists.txt                      |    31 -
 gazebo/sdf/1.2/actor.sdf                           |    88 -
 gazebo/sdf/1.2/camera.sdf                          |    50 -
 gazebo/sdf/1.2/collision.sdf                       |    24 -
 gazebo/sdf/1.2/contact.sdf                         |    12 -
 gazebo/sdf/1.2/gazebo.sdf                          |    13 -
 gazebo/sdf/1.2/geometry.sdf                        |   108 -
 gazebo/sdf/1.2/gripper.sdf                         |    30 -
 gazebo/sdf/1.2/gui.sdf                             |    39 -
 gazebo/sdf/1.2/inertial.sdf                        |    34 -
 gazebo/sdf/1.2/joint.sdf                           |   133 -
 gazebo/sdf/1.2/light.sdf                           |    61 -
 gazebo/sdf/1.2/link.sdf                            |    41 -
 gazebo/sdf/1.2/model.sdf                           |    26 -
 gazebo/sdf/1.2/physics.sdf                         |    65 -
 gazebo/sdf/1.2/plugin.sdf                          |    13 -
 gazebo/sdf/1.2/projector.sdf                       |    32 -
 gazebo/sdf/1.2/ray.sdf                             |    60 -
 gazebo/sdf/1.2/rfid.sdf                            |     2 -
 gazebo/sdf/1.2/rfidtag.sdf                         |     2 -
 gazebo/sdf/1.2/road.sdf                            |    15 -
 gazebo/sdf/1.2/scene.sdf                           |    78 -
 gazebo/sdf/1.2/sensor.sdf                          |    40 -
 gazebo/sdf/1.2/state.sdf                           |    88 -
 gazebo/sdf/1.2/surface.sdf                         |    59 -
 gazebo/sdf/1.2/urdf.sdf                            |    19 -
 gazebo/sdf/1.2/visual.sdf                          |    71 -
 gazebo/sdf/1.2/world.sdf                           |    20 -
 gazebo/sdf/1.3/1_2.convert                         |     2 -
 gazebo/sdf/1.3/CMakeLists.txt                      |    32 -
 gazebo/sdf/1.3/actor.sdf                           |    88 -
 gazebo/sdf/1.3/camera.sdf                          |    58 -
 gazebo/sdf/1.3/collision.sdf                       |    24 -
 gazebo/sdf/1.3/contact.sdf                         |    12 -
 gazebo/sdf/1.3/geometry.sdf                        |   116 -
 gazebo/sdf/1.3/gripper.sdf                         |    30 -
 gazebo/sdf/1.3/gui.sdf                             |    39 -
 gazebo/sdf/1.3/imu.sdf                             |     8 -
 gazebo/sdf/1.3/inertial.sdf                        |    34 -
 gazebo/sdf/1.3/joint.sdf                           |   141 -
 gazebo/sdf/1.3/light.sdf                           |    61 -
 gazebo/sdf/1.3/link.sdf                            |    41 -
 gazebo/sdf/1.3/model.sdf                           |    26 -
 gazebo/sdf/1.3/physics.sdf                         |    65 -
 gazebo/sdf/1.3/plugin.sdf                          |    13 -
 gazebo/sdf/1.3/projector.sdf                       |    32 -
 gazebo/sdf/1.3/ray.sdf                             |    60 -
 gazebo/sdf/1.3/rfid.sdf                            |     2 -
 gazebo/sdf/1.3/rfidtag.sdf                         |     2 -
 gazebo/sdf/1.3/road.sdf                            |    15 -
 gazebo/sdf/1.3/root.sdf                            |    13 -
 gazebo/sdf/1.3/scene.sdf                           |    78 -
 gazebo/sdf/1.3/sensor.sdf                          |    41 -
 gazebo/sdf/1.3/state.sdf                           |   101 -
 gazebo/sdf/1.3/surface.sdf                         |    59 -
 gazebo/sdf/1.3/urdf.sdf                            |    19 -
 gazebo/sdf/1.3/visual.sdf                          |    71 -
 gazebo/sdf/1.3/world.sdf                           |    20 -
 gazebo/sdf/1.4/1_3.convert                         |    52 -
 gazebo/sdf/1.4/CMakeLists.txt                      |    32 -
 gazebo/sdf/1.4/actor.sdf                           |    88 -
 gazebo/sdf/1.4/camera.sdf                          |    71 -
 gazebo/sdf/1.4/collision.sdf                       |    24 -
 gazebo/sdf/1.4/collision_engine.sdf                |    17 -
 gazebo/sdf/1.4/contact.sdf                         |    12 -
 gazebo/sdf/1.4/geometry.sdf                        |   116 -
 gazebo/sdf/1.4/gripper.sdf                         |    30 -
 gazebo/sdf/1.4/gui.sdf                             |    39 -
 gazebo/sdf/1.4/imu.sdf                             |    46 -
 gazebo/sdf/1.4/inertial.sdf                        |    34 -
 gazebo/sdf/1.4/joint.sdf                           |   169 -
 gazebo/sdf/1.4/light.sdf                           |    61 -
 gazebo/sdf/1.4/link.sdf                            |    45 -
 gazebo/sdf/1.4/model.sdf                           |    26 -
 gazebo/sdf/1.4/physics.sdf                         |   118 -
 gazebo/sdf/1.4/plugin.sdf                          |    13 -
 gazebo/sdf/1.4/projector.sdf                       |    32 -
 gazebo/sdf/1.4/ray.sdf                             |    73 -
 gazebo/sdf/1.4/rfid.sdf                            |     2 -
 gazebo/sdf/1.4/rfidtag.sdf                         |     2 -
 gazebo/sdf/1.4/road.sdf                            |    15 -
 gazebo/sdf/1.4/root.sdf                            |    13 -
 gazebo/sdf/1.4/scene.sdf                           |    78 -
 gazebo/sdf/1.4/sensor.sdf                          |    41 -
 gazebo/sdf/1.4/state.sdf                           |   101 -
 gazebo/sdf/1.4/surface.sdf                         |    94 -
 gazebo/sdf/1.4/urdf.sdf                            |    19 -
 gazebo/sdf/1.4/visual.sdf                          |    71 -
 gazebo/sdf/1.4/world.sdf                           |    20 -
 gazebo/sdf/CMakeLists.txt                          |     9 -
 gazebo/sdf/interface/CMakeLists.txt                |    41 -
 gazebo/sdf/interface/Converter.cc                  |   410 -
 gazebo/sdf/interface/Converter.hh                  |    73 -
 gazebo/sdf/interface/Converter_TEST.cc             |   290 -
 gazebo/sdf/interface/Param.cc                      |   589 -
 gazebo/sdf/interface/Param.hh                      |   306 -
 gazebo/sdf/interface/Plugin.hh                     |    63 -
 gazebo/sdf/interface/SDF.cc                        |  1642 -
 gazebo/sdf/interface/SDF.hh                        |   248 -
 gazebo/sdf/interface/SDF_TEST.cc                   |   342 -
 gazebo/sdf/interface/parser.cc                     |   874 -
 gazebo/sdf/interface/parser.hh                     |    73 -
 gazebo/sdf/interface/parser_urdf.cc                |  2333 -
 gazebo/sdf/interface/parser_urdf.hh                |   428 -
 gazebo/sdf/sdf.hh                                  |    26 -
 gazebo/sensors/CMakeLists.txt                      |    61 +-
 gazebo/sensors/CameraSensor.cc                     |   112 +-
 gazebo/sensors/CameraSensor.hh                     |    31 +-
 gazebo/sensors/ContactSensor.cc                    |    65 +-
 gazebo/sensors/ContactSensor.hh                    |    10 +-
 gazebo/sensors/DepthCameraSensor.cc                |    82 +-
 gazebo/sensors/DepthCameraSensor.hh                |    31 +-
 gazebo/sensors/ForceTorqueSensor.cc                |   138 +
 gazebo/sensors/ForceTorqueSensor.hh                |   106 +
 gazebo/sensors/ForceTorqueSensor_TEST.cc           |    80 +
 gazebo/sensors/GaussianNoiseModel.cc               |   220 +
 gazebo/sensors/GaussianNoiseModel.hh               |   121 +
 gazebo/sensors/GpsSensor.cc                        |   180 +
 gazebo/sensors/GpsSensor.hh                        |   107 +
 gazebo/sensors/GpsSensor_TEST.cc                   |   121 +
 gazebo/sensors/GpuRaySensor.cc                     |   461 +-
 gazebo/sensors/GpuRaySensor.hh                     |    84 +-
 gazebo/sensors/GpuRaySensor_TEST.cc                |   115 +
 gazebo/sensors/ImuSensor.cc                        |   137 +-
 gazebo/sensors/ImuSensor.hh                        |    37 +-
 gazebo/sensors/ImuSensor_TEST.cc                   |   115 +-
 gazebo/sensors/MultiCameraSensor.cc                |   107 +-
 gazebo/sensors/MultiCameraSensor.hh                |    16 +-
 gazebo/sensors/Noise.cc                            |   142 +
 gazebo/sensors/Noise.hh                            |   122 +
 gazebo/sensors/Noise_TEST.cc                       |   379 +
 gazebo/sensors/RFIDSensor.cc                       |     8 +-
 gazebo/sensors/RFIDSensor.hh                       |     8 +-
 gazebo/sensors/RFIDTag.cc                          |    12 +-
 gazebo/sensors/RFIDTag.hh                          |     9 +-
 gazebo/sensors/RaySensor.cc                        |   285 +-
 gazebo/sensors/RaySensor.hh                        |    47 +-
 gazebo/sensors/RaySensor_TEST.cc                   |    91 +-
 gazebo/sensors/Sensor.cc                           |   171 +-
 gazebo/sensors/Sensor.hh                           |    63 +-
 gazebo/sensors/SensorFactory.cc                    |    16 +-
 gazebo/sensors/SensorFactory.hh                    |    10 +-
 gazebo/sensors/SensorManager.cc                    |   146 +-
 gazebo/sensors/SensorManager.hh                    |    43 +-
 gazebo/sensors/SensorManager_TEST.cc               |    63 +-
 gazebo/sensors/SensorTypes.hh                      |    71 +-
 gazebo/sensors/Sensor_TEST.cc                      |    80 +-
 gazebo/sensors/Sensors.cc                          |   114 -
 gazebo/sensors/Sensors.hh                          |    91 -
 gazebo/sensors/SensorsIface.cc                     |   167 +
 gazebo/sensors/SensorsIface.hh                     |   112 +
 gazebo/sensors/SonarSensor.cc                      |   319 +
 gazebo/sensors/SonarSensor.hh                      |   151 +
 gazebo/sensors/SonarSensor_TEST.cc                 |   172 +
 gazebo/sensors/WirelessReceiver.cc                 |   163 +
 gazebo/sensors/WirelessReceiver.hh                 |    80 +
 gazebo/sensors/WirelessReceiver_TEST.cc            |   297 +
 gazebo/sensors/WirelessTransceiver.cc              |   113 +
 gazebo/sensors/WirelessTransceiver.hh              |    82 +
 gazebo/sensors/WirelessTransmitter.cc              |   188 +
 gazebo/sensors/WirelessTransmitter.hh              |   101 +
 gazebo/sensors/WirelessTransmitter_TEST.cc         |   267 +
 gazebo/sensors/server.cc                           |    72 -
 gazebo/server_main.cc                              |    11 +-
 gazebo/transport/CMakeLists.txt                    |    19 +-
 gazebo/transport/CallbackHelper.cc                 |     8 +-
 gazebo/transport/CallbackHelper.hh                 |    30 +-
 gazebo/transport/Connection.cc                     |   200 +-
 gazebo/transport/Connection.hh                     |    85 +-
 gazebo/transport/ConnectionManager.cc              |   256 +-
 gazebo/transport/ConnectionManager.hh              |    51 +-
 gazebo/transport/Connection_TEST.cc                |    58 +
 gazebo/transport/IOManager.cc                      |     4 +-
 gazebo/transport/IOManager.hh                      |     5 +-
 gazebo/transport/Node.cc                           |    97 +-
 gazebo/transport/Node.hh                           |    24 +-
 gazebo/transport/Publication.cc                    |   103 +-
 gazebo/transport/Publication.hh                    |    41 +-
 gazebo/transport/PublicationTransport.cc           |    17 +-
 gazebo/transport/PublicationTransport.hh           |    15 +-
 gazebo/transport/Publisher.cc                      |   175 +-
 gazebo/transport/Publisher.hh                      |    63 +-
 gazebo/transport/SubscribeOptions.hh               |     5 +-
 gazebo/transport/Subscriber.cc                     |     2 +-
 gazebo/transport/Subscriber.hh                     |     7 +-
 gazebo/transport/SubscriptionTransport.cc          |    19 +-
 gazebo/transport/SubscriptionTransport.hh          |    13 +-
 gazebo/transport/TopicManager.cc                   |   103 +-
 gazebo/transport/TopicManager.hh                   |    36 +-
 gazebo/transport/Transport.cc                      |   333 -
 gazebo/transport/Transport.hh                      |   130 -
 gazebo/transport/TransportIface.cc                 |   426 +
 gazebo/transport/TransportIface.hh                 |   185 +
 gazebo/transport/TransportTypes.hh                 |     3 +-
 gazebo/util/CMakeLists.txt                         |    20 +-
 gazebo/util/Diagnostics.cc                         |    15 +-
 gazebo/util/Diagnostics.hh                         |     8 +-
 gazebo/util/Diagnostics_TEST.cc                    |     7 +-
 gazebo/util/LogPlay.cc                             |   307 +
 gazebo/util/LogPlay.hh                             |   149 +
 gazebo/util/LogRecord.cc                           |   865 +
 gazebo/util/LogRecord.hh                           |   385 +
 gazebo/util/LogRecord_TEST.cc                      |   187 +
 gazebo/util/OpenAL.cc                              |   541 +
 gazebo/util/OpenAL.hh                              |   208 +
 gazebo/util/OpenAL_TEST.cc                         |   320 +
 gazebo/util/UtilTypes.hh                           |    13 +-
 gazebo/util/system.hh                              |    53 +
 interfaces/player/ActarrayInterface.cc             |     2 +-
 interfaces/player/ActarrayInterface.hh             |     9 +-
 interfaces/player/BumperInterface.cc               |     2 +-
 interfaces/player/BumperInterface.hh               |     5 +-
 interfaces/player/CMakeLists.txt                   |     8 +-
 interfaces/player/CameraInterface.cc               |    64 +-
 interfaces/player/CameraInterface.hh               |     8 +-
 interfaces/player/FiducialInterface.cc             |     2 +-
 interfaces/player/FiducialInterface.hh             |     9 +-
 interfaces/player/GazeboClient.cc                  |     2 +-
 interfaces/player/GazeboClient.hh                  |     6 +-
 interfaces/player/GazeboDriver.cc                  |    18 +-
 interfaces/player/GazeboDriver.hh                  |     5 +-
 interfaces/player/GazeboInterface.cc               |     2 +-
 interfaces/player/GazeboInterface.hh               |     7 +-
 interfaces/player/GazeboTime.cc                    |     2 +-
 interfaces/player/GazeboTime.hh                    |     5 +-
 interfaces/player/GpsInterface.cc                  |     2 +-
 interfaces/player/GpsInterface.hh                  |     5 +-
 interfaces/player/Graphics3dInterface.cc           |     2 +-
 interfaces/player/Graphics3dInterface.hh           |     9 +-
 interfaces/player/GripperInterface.cc              |     2 +-
 interfaces/player/GripperInterface.hh              |     9 +-
 interfaces/player/IRInterface.cc                   |     2 +-
 interfaces/player/IRInterface.hh                   |     5 +-
 interfaces/player/LaserInterface.cc                |     2 +-
 interfaces/player/LaserInterface.hh                |     7 +-
 interfaces/player/OpaqueInterface.cc               |     2 +-
 interfaces/player/OpaqueInterface.hh               |     5 +-
 interfaces/player/PTZInterface.cc                  |     2 +-
 interfaces/player/PTZInterface.hh                  |     9 +-
 interfaces/player/Position2dInterface.cc           |     2 +-
 interfaces/player/Position2dInterface.hh           |     6 +-
 interfaces/player/Position3dInterface.cc           |     2 +-
 interfaces/player/Position3dInterface.hh           |     9 +-
 interfaces/player/PowerInterface.cc                |     2 +-
 interfaces/player/PowerInterface.hh                |     5 +-
 interfaces/player/SimulationInterface.cc           |    16 +-
 interfaces/player/SimulationInterface.hh           |     5 +-
 interfaces/player/SonarInterface.cc                |     2 +-
 interfaces/player/SonarInterface.hh                |     6 +-
 interfaces/player/player.h                         |     2 +-
 media/CMakeLists.txt                               |     3 +-
 media/audio/CMakeLists.txt                         |     2 +-
 media/audio/cheer.mp3                              |   Bin 0 -> 472192 bytes
 media/audio/cheer.ogg                              |   Bin 0 -> 689877 bytes
 media/audio/cheer.wav                              |   Bin 0 -> 5428736 bytes
 media/audio/test.mp3                               |   Bin 44721 -> 0 bytes
 media/dem/CMakeLists.txt                           |     2 +
 media/dem/volcano.tif                              |   Bin 0 -> 67006 bytes
 .../programs/deferred_rendering/ssao_fp.glsl       |     2 +-
 media/materials/programs/depth_points_map.vert     |     2 +-
 media/materials/programs/laser_1st_pass.frag       |     2 +-
 media/materials/programs/laser_1st_pass.vert       |     2 +-
 media/materials/programs/laser_2nd_pass.frag       |     6 +-
 media/materials/scripts/gazebo.material            |   612 +-
 media/models/pioneer2at/CMakeLists.txt             |    12 -
 media/models/pioneer2at/Cylinder.012.mesh.xml      |  2828 --
 media/models/pioneer2at/Scene.material             |    14 -
 media/models/pioneer2at/chassis.mesh               |   Bin 17165 -> 0 bytes
 media/models/pioneer2at/chassis_top.mesh           |   Bin 33261 -> 0 bytes
 media/models/pioneer2at/hub.mesh                   |   Bin 3251 -> 0 bytes
 media/models/pioneer2at/pioneer3at.blend           |   Bin 343740 -> 0 bytes
 media/models/pioneer2at/sonar.mesh                 |   Bin 5058 -> 0 bytes
 media/models/pioneer2at/sonarbank.mesh             |   Bin 38994 -> 0 bytes
 media/models/pioneer2at/tire.mesh                  |   Bin 50935 -> 0 bytes
 media/models/pioneer2at/wheel.mesh                 |   Bin 15395 -> 0 bytes
 media/models/quadrotor/CMakeLists.txt              |     5 -
 media/models/quadrotor/quadrotor_base.dae          |   235 -
 media/rtshaderlib/SGXLib_IntegratedPSSM.glsl       |    87 +-
 media/skyx/SkyX_Clouds.fragment                    |     2 +-
 media/skyx/SkyX_Skydome.fragment                   |    10 +-
 plugins/BreakableJointPlugin.cc                    |    71 +
 plugins/BreakableJointPlugin.hh                    |    60 +
 plugins/CMakeLists.txt                             |    56 +-
 plugins/CameraPlugin.cc                            |     4 +-
 plugins/CameraPlugin.hh                            |    13 +-
 plugins/CartDemoPlugin.cc                          |   176 +
 plugins/CartDemoPlugin.hh                          |    58 +
 plugins/CartTestPlugin.cc                          |   185 -
 plugins/CartTestPlugin.hh                          |    51 -
 plugins/ContactPlugin.cc                           |    18 +-
 plugins/ContactPlugin.hh                           |     5 +-
 plugins/DepthCameraPlugin.cc                       |     4 +-
 plugins/DepthCameraPlugin.hh                       |    15 +-
 plugins/DiffDrivePlugin.cc                         |    16 +-
 plugins/DiffDrivePlugin.hh                         |    19 +-
 plugins/ForceTorquePlugin.cc                       |    65 +-
 plugins/ForceTorquePlugin.hh                       |    47 +-
 plugins/GpuRayPlugin.cc                            |     4 +-
 plugins/GpuRayPlugin.hh                            |    17 +-
 plugins/JointTrajectoryPlugin.cc                   |    41 +-
 plugins/JointTrajectoryPlugin.hh                   |    12 +-
 plugins/LiftDragPlugin.cc                          |   326 +
 plugins/LiftDragPlugin.hh                          |   130 +
 plugins/ModelPropShop.cc                           |   274 +
 plugins/ModelPropShop.hh                           |    81 +
 plugins/ModelTrajectoryTestPlugin.cc               |    71 -
 plugins/ModelTrajectoryTestPlugin.hh               |    47 -
 plugins/MudPlugin.cc                               |   346 +
 plugins/MudPlugin.hh                               |   113 +
 plugins/PressurePlugin.cc                          |   174 +
 plugins/PressurePlugin.hh                          |    80 +
 plugins/RayPlugin.cc                               |     8 +-
 plugins/RayPlugin.hh                               |    29 +-
 plugins/RaySensorNoisePlugin.cc                    |    69 +
 plugins/RaySensorNoisePlugin.hh                    |    55 +
 plugins/RubblePlugin.cc                            |    32 +-
 plugins/RubblePlugin.hh                            |     7 +-
 plugins/SkidSteerDrivePlugin.cc                    |    40 +-
 plugins/SkidSteerDrivePlugin.hh                    |    21 +-
 plugins/SonarPlugin.cc                             |    57 +
 plugins/SonarPlugin.hh                             |    54 +
 plugins/SphereAtlasDemoPlugin.cc                   |   199 +
 plugins/SphereAtlasDemoPlugin.hh                   |    52 +
 plugins/SpringTestPlugin.cc                        |    62 -
 plugins/SpringTestPlugin.hh                        |    43 -
 plugins/VehiclePlugin.cc                           |    57 +-
 plugins/VehiclePlugin.hh                           |    17 +-
 sdf/CMakeLists.txt                                 |     2 -
 sdf/models/CMakeLists.txt                          |    15 -
 sdf/models/actor.model                             |     7 -
 sdf/models/actor_circle.model                      |    44 -
 sdf/models/actor_demo.model                        |    43 -
 sdf/models/car.model                               |   213 -
 sdf/models/multi_visuals.model                     |    43 -
 sdf/models/pioneer2at.model                        |   164 -
 sdf/models/pr2_gripper.model                       |   691 -
 sdf/models/quadrotor.model                         |    20 -
 sdf/models/ragdoll.model                           |  1863 -
 sdf/models/weshare2012_apartment.model             |   740 -
 sdf/models/weshare2012_bookshelf.model             |   153 -
 sdf/models/weshare2012_pioneer.model               |   197 -
 sdf/worlds/.cvsignore                              |     3 -
 sdf/worlds/CMakeLists.txt                          |    29 -
 sdf/worlds/actor.world                             |    20 -
 sdf/worlds/actor_circle.world                      |    82 -
 sdf/worlds/actor_demo.world                        |    31 -
 sdf/worlds/camera.world                            |    13 -
 sdf/worlds/car.world                               |    27 -
 sdf/worlds/cart_test.world                         |   649 -
 sdf/worlds/cfm_test.world                          |   234 -
 sdf/worlds/contact.world                           |    42 -
 sdf/worlds/depth_camera.world                      |    80 -
 sdf/worlds/double_pendulums.world                  |   671 -
 sdf/worlds/empty.world                             |    14 -
 sdf/worlds/empty_1_0.world                         |    20 -
 sdf/worlds/empty_bullet.world                      |    22 -
 sdf/worlds/force_torque_demo.world                 |   424 -
 sdf/worlds/force_torque_demo2.world                |   168 -
 sdf/worlds/heightmap.world                         |    58 -
 sdf/worlds/joint_damping_demo.world                |   635 -
 sdf/worlds/joints.world                            |    85 -
 sdf/worlds/lights.world                            |    73 -
 sdf/worlds/max_vel_test.world                      |   132 -
 sdf/worlds/model_nesting.world                     |    15 -
 sdf/worlds/pioneer2dx.world                        |    20 -
 sdf/worlds/plugin.world                            |    50 -
 sdf/worlds/pr2.world                               |    14 -
 sdf/worlds/presentation.world                      |   602 -
 sdf/worlds/projector.world                         |    60 -
 sdf/worlds/ray_test.world                          |    70 -
 sdf/worlds/revolute_joint_test.world               |    56 -
 sdf/worlds/road.world                              |    36 -
 sdf/worlds/rubble.world                            |    72 -
 sdf/worlds/shapes.world                            |    77 -
 sdf/worlds/simple_gripper.world                    |    35 -
 sdf/worlds/spring_test.world                       |   486 -
 sdf/worlds/stacks.world                            |   498 -
 sdf/worlds/trigger.world                           |    82 -
 sdf/worlds/trimesh_test.world                      |   184 -
 sdf/worlds/two_actors.world                        |    43 -
 sdf/worlds/weshare2012.world                       |     9 -
 sdf/worlds/willowgarage.world                      |    16 -
 test/CMakeLists.txt                                |    42 +-
 test/ServerFixture.cc                              |  1286 +
 test/ServerFixture.hh                              |  1260 +-
 test/cmake/CMakeLists.txt                          |     3 +
 test/cmake/config-cmake.cc                         |    34 +
 test/cmake/plugin/CMakeLists.txt                   |    21 +
 test/data/audio_bad_codec.grf                      |   Bin 0 -> 5120 bytes
 test/data/audio_bad_codec.mp4                      |     0
 test/data/dem_landscape.tif                        |   Bin 0 -> 100487 bytes
 test/data/dem_portrait.tif                         |   Bin 0 -> 100487 bytes
 test/data/dem_squared.tif                          |   Bin 0 -> 67701 bytes
 test/data/empty_audio.mp4                          |   Bin 0 -> 12123 bytes
 {tools/test => test}/data/empty_state.log          |     0
 {tools/test => test}/data/pr2_state.log            |     0
 test/data/pr2_state_log_expected.h                 |    51 +
 test/examples/CMakeLists.txt                       |     3 +
 test/examples/example_plugins.cc                   |    92 +
 test/gtest/cmake/internal_utils.cmake              |    13 +-
 test/gtest/gtest-1.7.0.diff                        |    44 +
 test/gtest/include/gtest/gtest-death-test.h        |    17 +-
 test/gtest/include/gtest/gtest-message.h           |    74 +-
 test/gtest/include/gtest/gtest-param-test.h        |     2 +-
 test/gtest/include/gtest/gtest-param-test.h.pump   |     2 +-
 test/gtest/include/gtest/gtest-printers.h          |    92 +-
 test/gtest/include/gtest/gtest-spi.h               |     2 +-
 test/gtest/include/gtest/gtest-test-part.h         |    17 +-
 test/gtest/include/gtest/gtest.h                   |   304 +-
 test/gtest/include/gtest/gtest_pred_impl.h         |    12 +-
 .../gtest/internal/gtest-death-test-internal.h     |    21 +-
 test/gtest/include/gtest/internal/gtest-filepath.h |    14 +-
 test/gtest/include/gtest/internal/gtest-internal.h |   182 +-
 .../include/gtest/internal/gtest-linked_ptr.h      |     8 +-
 .../gtest/internal/gtest-param-util-generated.h    |   593 +-
 .../internal/gtest-param-util-generated.h.pump     |     2 +-
 .../include/gtest/internal/gtest-param-util.h      |     8 +-
 test/gtest/include/gtest/internal/gtest-port.h     |   275 +-
 test/gtest/include/gtest/internal/gtest-string.h   |   217 +-
 test/gtest/include/gtest/internal/gtest-tuple.h    |    92 +-
 .../include/gtest/internal/gtest-tuple.h.pump      |    13 +-
 .../gtest/include/gtest/internal/gtest-type-util.h |    21 +-
 .../include/gtest/internal/gtest-type-util.h.pump  |    21 +-
 test/gtest/src/gtest-death-test.cc                 |   280 +-
 test/gtest/src/gtest-filepath.cc                   |    30 +-
 test/gtest/src/gtest-internal-inl.h                |   242 +-
 test/gtest/src/gtest-port.cc                       |   119 +-
 test/gtest/src/gtest-printers.cc                   |   101 +-
 test/gtest/src/gtest-test-part.cc                  |     6 +-
 test/gtest/src/gtest-typed-test.cc                 |     6 +-
 test/gtest/src/gtest.cc                            |  1242 +-
 test/gtest/src/gtest_main.cc                       |     5 +-
 test/integration/CMakeLists.txt                    |   117 +
 test/integration/SimplePendulumIntegrator.hh       |    73 +
 test/integration/aero_plugin.cc                    |   148 +
 test/integration/bandwidth.cc                      |   106 +
 test/integration/camera.cc                         |   219 +
 test/integration/camera_sensor.cc                  |   446 +
 test/integration/concave_mesh.cc                   |   172 +
 test/integration/contact_sensor.cc                 |   435 +
 test/integration/dem.cc                            |    72 +
 test/integration/factory.cc                        |   194 +
 test/integration/file_handling.cc                  |    79 +
 test/integration/gpu_laser.cc                      |   291 +
 test/integration/gripper.cc                        |   156 +
 test/integration/gz_camera.cc                      |    75 +
 test/integration/gz_joint.cc                       |   138 +
 test/integration/gz_log.cc                         |    74 +
 test/integration/gz_model.cc                       |   156 +
 test/integration/gz_physics.cc                     |   126 +
 test/integration/gz_world.cc                       |    75 +
 test/integration/heightmap.cc                      |   371 +
 test/integration/heights_cmp.h                     |  2411 +
 test/integration/helper_physics_generator.hh       |    47 +
 test/integration/images_cmp.h                      | 46117 +++++++++++++++++++
 test/integration/imu.cc                            |   318 +
 test/integration/joint_controller.cc               |    99 +
 test/integration/joint_force_torque.cc             |   530 +
 test/integration/joint_gearbox.cc                  |   181 +
 test/integration/joint_revolute.cc                 |   753 +
 test/integration/joint_screw.cc                    |   393 +
 test/integration/joint_spawn.cc                    |   477 +
 test/integration/joint_test.cc                     |   400 +
 test/integration/joint_test.hh                     |   246 +
 test/integration/joint_universal.cc                |   404 +
 test/integration/laser.cc                          |   619 +
 test/integration/manpages.cc                       |   209 +
 test/integration/model_database.cc                 |   161 +
 test/integration/multicamera_sensor.cc             |   321 +
 test/integration/noise.cc                          |   129 +
 test/integration/nondefault_world.cc               |    52 +
 test/integration/ogre_log.cc                       |    52 +
 test/integration/physics.cc                        |  1352 +
 test/integration/physics_friction.cc               |   679 +
 test/integration/physics_link.cc                   |   202 +
 test/integration/physics_msgs.cc                   |   569 +
 test/integration/physics_thread_safe.cc            |   118 +
 test/integration/pioneer2dx.cc                     |   104 +
 test/integration/player/CMakeLists.txt             |    37 +
 test/integration/player/player.cc                  |    31 +
 test/integration/pr2.cc                            |   209 +
 test/integration/projector.cc                      |    57 +
 test/integration/rendering_sensor.cc               |   173 +
 test/integration/scans_cmp.h                       |   292 +
 test/integration/sdf.cc                            |    50 +
 test/integration/server_fixture.cc                 |   133 +
 test/integration/set_joint.cc                      |   691 +
 test/integration/set_pose.cc                       |   635 +
 test/integration/set_pose_loop.cc                  |   835 +
 test/integration/speed.cc                          |   112 +
 test/integration/speed_pr2.cc                      |    71 +
 test/integration/state_log.cc                      |   207 +
 test/integration/stress_spawn_models.cc            |    80 +
 test/integration/surface_properties.cc             |   180 +
 test/integration/transceiver.cc                    |   427 +
 test/integration/transport.cc                      |   490 +
 test/integration/transport_stress_nodes.cc         |   152 +
 test/integration/world.cc                          |   122 +
 test/integration/world_entity_below_point.cc       |   131 +
 test/integration/world_reset.cc                    |   100 +
 test/integration/worlds_installed.cc               |    86 +
 .../media/materials/textures/invalid_size.png      |   Bin
 .../media/materials/textures/not_square.png        |   Bin
 .../media/materials/textures/white_alpha.png       |   Bin
 .../media/materials/textures/white_no_alpha.png    |   Bin
 .../media/models/cube_20k/meshes/cube_20k.stl      |   Bin
 test/models/box.sdf                                |    25 +
 test/performance/CMakeLists.txt                    |    31 +
 test/performance/RAMLibrary.hh                     |    87 +
 test/performance/RAMLibrary_TEST.cc                |    58 +
 test/performance/factory_stress.cc                 |    52 +
 test/performance/gz_stress.cc                      |   171 +
 test/performance/sensor_stress.cc                  |   108 +
 test/performance/transport_stress.cc               |   245 +
 test/pkgconfig/CMakeLists.txt                      |     3 +
 test/pkgconfig/config-pkgconfig.cc                 |    34 +
 test/pkgconfig/plugin/CMakeLists.txt               |    15 +
 test/plugins/CMakeLists.txt                        |    25 +
 test/plugins/ForceTorqueModelRemovalTestPlugin.cc  |    88 +
 test/plugins/ForceTorqueModelRemovalTestPlugin.hh  |    49 +
 test/plugins/ModelTrajectoryTestPlugin.cc          |    71 +
 test/plugins/ModelTrajectoryTestPlugin.hh          |    48 +
 test/plugins/SpringTestPlugin.cc                   |    75 +
 test/plugins/SpringTestPlugin.hh                   |    62 +
 test/regression/1082_pid_limits.cc                 |   122 +
 test/regression/1112_force_torque_model_removal.cc |    56 +
 test/regression/1146_collision_bounding_box.cc     |    61 +
 test/regression/494_joint_axis_frame.cc            |   232 +
 test/regression/624_collision_world_pose.cc        |   143 +
 test/regression/846_typo_in_camera.cc              |    49 +
 test/regression/876_random_number_generator.cc     |    64 +
 test/regression/978_joint_anchor.cc                |    94 +
 test/regression/CMakeLists.txt                     |    44 +-
 test/regression/SimplePendulumIntegrator.hh        |    73 -
 test/regression/bandwidth.cc                       |    88 -
 test/regression/camera_sensor.cc                   |   319 -
 test/regression/contact_sensor.cc                  |   401 -
 test/regression/factory.cc                         |   131 -
 test/regression/file_handling.cc                   |    69 -
 test/regression/heightmap.cc                       |   233 -
 test/regression/heights_cmp.h                      |  2411 -
 test/regression/images_cmp.h                       | 46117 -------------------
 test/regression/imu.cc                             |   294 -
 test/regression/laser.cc                           |   328 -
 test/regression/physics.cc                         |  1531 -
 test/regression/pioneer2dx.cc                      |    83 -
 test/regression/player/CMakeLists.txt              |    41 -
 test/regression/player/player.cc                   |    31 -
 test/regression/pr2.cc                             |   113 -
 test/regression/projector.cc                       |    57 -
 test/regression/scans_cmp.h                        |   292 -
 test/regression/sdf.cc                             |    50 -
 test/regression/server_fixture.cc                  |   123 -
 test/regression/set_joint.cc                       |   691 -
 test/regression/set_pose.cc                        |   635 -
 test/regression/set_pose_loop.cc                   |   835 -
 test/regression/speed.cc                           |    96 -
 test/regression/speed_pr2.cc                       |    55 -
 test/regression/transport.cc                       |   249 -
 test/regression/transport_stress.cc                |   226 -
 test/regression/worlds/SDF_1_4.world               |    60 -
 test/regression/worlds/damp_test.world             |   635 -
 test/regression/worlds/empty_test.world            |     5 -
 .../regression/worlds/invalid_size_heightmap.world |    18 -
 test/regression/worlds/not_square_heightmap.world  |    18 -
 test/regression/worlds/simple_pendulums.world      |   252 -
 test/regression/worlds/white_alpha_heightmap.world |    18 -
 .../worlds/white_no_alpha_heightmap.world          |    18 -
 test/sdf/pr2_stripped.world                        |  2832 --
 test/sdf_plugins/camera.world                      |   106 -
 test/sdf_plugins/contact.world                     |    79 -
 test/sdf_plugins/lighting_control.world            |   184 -
 test/sdf_plugins/ray.world                         |   206 -
 test/test_config.h.in                              |     2 +
 test/testfiles/hello_world.cc                      |    38 +
 test/util.hh                                       |    96 +
 test/worlds/SDF_1_4.world                          |    56 +
 test/worlds/ball_joint_test.world                  |   191 +
 test/{sdf_plugins => worlds}/box_no_gravity.world  |     0
 .../box_plane_gravity.world                        |     0
 test/worlds/box_plane_low_friction_test.world      |    75 +
 test/{sdf/box.world => worlds/box_test.world}      |     0
 test/{sdf => worlds}/camera.world                  |     0
 test/worlds/camera_rotation_test.world             |   261 +
 test/worlds/cfm_damping_test.world                 |   160 -
 test/worlds/cfm_test.world                         |   164 +
 test/worlds/collide_without_contact.world          |   103 +
 test/{regression => }/worlds/collision_test.world  |     0
 test/worlds/concave_mesh_test.world                |    44 +
 test/worlds/concave_submesh_collision_test.world   |    70 +
 .../worlds/concave_submesh_no_collision_test.world |    70 +
 test/{sdf => worlds}/contact.world                 |     0
 test/worlds/contact_stability.world                |   240 +
 test/{sdf => worlds}/cylinder.world                |     0
 test/worlds/damp_test.world                        |   635 +
 test/worlds/dem_gps.world                          |   118 +
 test/{regression => }/worlds/drop_test.world       |     0
 test/worlds/empty_dark_plane.world                 |    47 +
 test/worlds/empty_different_name.world             |    14 +
 test/worlds/empty_test.world                       |     5 +
 test/{sdf => worlds}/everything.world              |     0
 test/worlds/force_torque_model_removal_test.world  |   130 +
 test/worlds/force_torque_test.world                |   173 +
 test/worlds/force_torque_test2.world               |   214 +
 test/worlds/gearbox.world                          |   211 +
 test/worlds/gps_test.world                         |   186 +
 test/worlds/gpu_laser.world                        |   625 +
 test/worlds/gpu_laser2.world                       |    73 +
 test/worlds/gpu_laser_heightmap.world              |   125 +
 test/worlds/heightmap_test.world                   |     2 +-
 test/worlds/implicit_damping_test.world            |   164 +
 test/worlds/inertia_ratio.rworld                   |   104 +
 test/worlds/inertia_ratio.world                    |    88 +
 test/{sdf => worlds}/inertial.world                |     0
 .../{Inertial_TEST.world => inertial_test.world}   |     0
 test/worlds/invalid_size_heightmap.world           |    18 +
 test/worlds/joint_test.world                       |    88 +-
 test/worlds/laser_vertical.world                   |   124 +
 test/worlds/lift_drag_plugin.world                 |   272 +
 test/{sdf => worlds}/light.world                   |     0
 test/worlds/max_vel_test.world                     |   136 +
 test/{sdf => worlds}/mesh.world                    |     0
 test/worlds/multicamera_test.world                 |    18 +-
 test/worlds/not_square_heightmap.world             |    18 +
 test/{sdf => worlds}/plane.world                   |     0
 test/{sdf => worlds}/plugin.world                  |     0
 test/{sdf => worlds}/pr2_20111026.world            |     0
 .../pr2_test.world => worlds/pr2_deprecated.world} |     0
 test/{sdf => worlds}/ray.world                     |     0
 test/worlds/ray_test.world                         |    70 +
 test/{sdf => worlds}/revolute_joint.world          |     0
 test/worlds/revolute_joint_test.world              |    51 +
 test/worlds/screw_joint_test.world                 |   193 +
 test/worlds/simple_arm_test.world                  |   548 +
 test/worlds/simple_pendulums.world                 |   262 +
 test/worlds/single_revolute_test.world             |    72 +
 test/{sdf => worlds}/sphere.world                  |     0
 test/worlds/spring_damper_test.world               |   706 +
 test/worlds/transparency.world                     |    85 +
 test/worlds/universal_joint_test.world             |   208 +
 test/worlds/white_alpha_heightmap.world            |    18 +
 test/worlds/white_no_alpha_heightmap.world         |    18 +
 test/worlds/zero_max_contacts.world                |    41 +
 tools/CMakeLists.txt                               |    57 +-
 tools/api_checker.bash                             |   170 +
 tools/bitbucket_pullrequests                       |   223 +
 tools/case_sensitive_filesystem                    |    12 +
 tools/check_test_ran.py                            |    34 +-
 tools/code_check.sh                                |   159 +-
 tools/cppcheck_rules/issue_906.rule                |    12 +
 tools/gazebo.bash-completion                       |    57 +
 tools/gz.1.roff                                    |   505 +
 tools/gz.cc                                        |  1216 +
 tools/gz.hh                                        |   256 +
 tools/gz_TEST.cc                                   |   670 +
 tools/gz_build_test.bash                           |    85 +
 tools/gz_cloc.py                                   |    40 -
 tools/gz_cloc.rb                                   |    56 +
 tools/gz_log.cc                                    |   939 +
 tools/gz_log.hh                                    |   243 +
 tools/gz_log_TEST.cc                               |   323 +
 tools/gz_roff.py                                   |    78 +
 tools/gz_topic.cc                                  |   376 +
 tools/gz_topic.hh                                  |    96 +
 tools/gzfactory.1.ronn                             |    52 +
 tools/gzfactory.cc                                 |    73 +-
 tools/gzlog.1.ronn                                 |    49 +
 tools/gzlog.cc                                     |   939 +-
 tools/gzmodel_create                               |    27 +
 tools/gzmodel_create.sh                            |    27 -
 tools/gzprop                                       |    65 +
 tools/gzprop.1.ronn                                |    27 +
 tools/gzsdf.1.ronn                                 |    37 +
 tools/gzsdf.cc                                     |    67 +-
 tools/gzstats.1.ronn                               |    31 +
 tools/gzstats.cc                                   |    62 +-
 tools/gztopic.1.ronn                               |    46 +
 tools/gztopic.cc                                   |   227 +-
 tools/make_ronn.py                                 |    76 +
 tools/msg_check.py                                 |    43 +
 tools/qtest_to_junit.xslt                          |    95 +
 tools/sdf2pov.cc                                   |    14 +-
 tools/test/CMakeLists.txt                          |    15 -
 tools/test/gz_log.cc                               |  1024 -
 tools/website/backup.rb                            |    85 +
 tools/website/gazebo_install.run                   |    66 +
 worlds/CMakeLists.txt                              |    53 +
 worlds/blank.world                                 |    11 +
 worlds/camera.world                                |    19 +
 worlds/cart_demo.world                             |   661 +
 worlds/contact.world                               |    36 +
 worlds/deprecated_worlds/actor.world               |    25 +
 worlds/deprecated_worlds/actor_circle.world        |    83 +
 worlds/deprecated_worlds/actor_demo.world          |    74 +
 worlds/deprecated_worlds/double_pendulums.world    |   677 +
 worlds/deprecated_worlds/force_torque_demo2.world  |   226 +
 worlds/deprecated_worlds/model_nesting.world       |    19 +
 worlds/deprecated_worlds/ragdoll.world             |  1927 +
 worlds/deprecated_worlds/two_actors.world          |    45 +
 worlds/deprecated_worlds/weshare2012.world         |    13 +
 worlds/depth_camera.world                          |    89 +
 worlds/empty.world                                 |    13 +
 worlds/empty_1_0.world                             |    24 +
 worlds/empty_bullet.world                          |    22 +
 worlds/empty_sky.world                             |    20 +
 worlds/everything.world                            |   113 +
 worlds/force_torque_demo.world                     |   132 +
 worlds/friction_demo.world                         |   499 +
 worlds/gripper.world                               |    36 +
 worlds/heightmap.world                             |   144 +
 worlds/heightmap_dem.world                         |    56 +
 worlds/joint_damping_demo.world                    |   645 +
 worlds/joints.world                                |    84 +
 worlds/lift_drag_demo.world                        |   505 +
 worlds/lights.world                                |    75 +
 worlds/mud.world                                   |   111 +
 worlds/mud_bitmask.world                           |    59 +
 worlds/multilink_shape.world                       |    60 +
 worlds/openal.world                                |    68 +
 worlds/pioneer2dx.world                            |    18 +
 worlds/plane_demo.world                            |   887 +
 worlds/plugin.world                                |    54 +
 worlds/pr2.world                                   |    14 +
 worlds/presentation.world                          |   602 +
 worlds/pressure_sensor.world                       |   160 +
 worlds/projector.world                             |    64 +
 worlds/quad_rotor_demo.world                       |  1038 +
 worlds/quad_rotor_demo_2.world                     |  1038 +
 worlds/ray_cpu.world                               |    63 +
 worlds/ray_noise_plugin.world                      |    60 +
 worlds/road.world                                  |    38 +
 worlds/robocup09_spl_field.world                   |    22 +
 worlds/robocup14_spl_field.world                   |    32 +
 worlds/robocup_3Dsim.world                         |    36 +
 worlds/rubble.world                                |    74 +
 worlds/shapes.world                                |    79 +
 worlds/simple_arm.world                            |    17 +
 worlds/simple_gripper.world                        |    47 +
 worlds/single_rotor_demo.world                     |   291 +
 worlds/sonar_demo.world                            |    52 +
 worlds/sphere_atlas_demo.world                     |  2503 +
 worlds/stacks.world                                |   501 +
 worlds/trigger.world                               |    92 +
 worlds/twin_rotor_demo.world                       |   505 +
 worlds/willowgarage.world                          |    14 +
 worlds/wireless_sensors.world                      |    88 +
 1689 files changed, 174509 insertions(+), 111432 deletions(-)

diff --git a/.hg_archival.txt b/.hg_archival.txt
index a498a83..53c387d 100644
--- a/.hg_archival.txt
+++ b/.hg_archival.txt
@@ -1,5 +1,5 @@
 repo: e803bb5fe03c1370cbb9f434912cd73fd1e7942d
-node: 1a69666680ab8a3b83337d229443b20279ff5e3e
-branch: gazebo_1.6
-latesttag: gazebo_1.6.2
+node: 130a3fef81eb177bdbe5656000a801e347e8ec9e
+branch: gazebo_3.0
+latesttag: gazebo3_3.0.0
 latesttagdistance: 1
diff --git a/.hgignore b/.hgignore
index d7f53de..cdc740f 100644
--- a/.hgignore
+++ b/.hgignore
@@ -4,3 +4,4 @@ build
 build_*
 Ogre.log
 .DS_Store
+*.swp
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b255474..d07e6eb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,14 +7,15 @@ endif(COMMAND CMAKE_POLICY)
 
 project (Gazebo)
 string (TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
+string (TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER)
 
 set (GAZEBO_VERSION_NAME "lithium")
-set (GAZEBO_MAJOR_VERSION 1)
-set (GAZEBO_MINOR_VERSION 6)
+set (GAZEBO_MAJOR_VERSION 3)
+set (GAZEBO_MINOR_VERSION 0)
 # The patch version may have been bumped for prerelease purposes; be sure to
 # check gazebo-release/ubuntu/debian/changelog at default to determine what the
 # next patch version should be for a regular release.
-set (GAZEBO_PATCH_VERSION 2)
+set (GAZEBO_PATCH_VERSION 0)
 
 set (GAZEBO_VERSION ${GAZEBO_MAJOR_VERSION}.${GAZEBO_MINOR_VERSION})
 set (GAZEBO_VERSION_FULL ${GAZEBO_MAJOR_VERSION}.${GAZEBO_MINOR_VERSION}.${GAZEBO_PATCH_VERSION})
@@ -56,6 +57,9 @@ endif()
 
 enable_testing()
 
+# Use GNUInstallDirst to get canonical paths
+include(GNUInstallDirs)
+
 # with -fPIC
 if(UNIX AND NOT WIN32)
   set (CMAKE_INSTALL_PREFIX "/usr" CACHE STRING "Install Prefix")
@@ -83,40 +87,16 @@ if(LD_LIBRARY_PATH)
 endif()
 
 
-set (INCLUDE_INSTALL_DIR "include/gazebo-${GAZEBO_VERSION}/gazebo") 
-set (LIB_INSTALL_DIR "lib" CACHE STRING "Installation directory for libraries (relative to CMAKE_INSTALL_PREFIX)") 
-set (BIN_INSTALL_DIR "bin" CACHE STRING "Installation directory for binaries (relative to CMAKE_INSTALL_PREFIX)") 
-
-
-set (USE_FULL_RPATH OFF CACHE BOOL "Set to true to enable full rpath")
-
-if (USE_FULL_RPATH)
-  # use, i.e. don't skip the full RPATH for the build tree
-  set(CMAKE_SKIP_BUILD_RPATH  FALSE)
-  
-  # when building, don't use the install RPATH already
-  # (but later on when installing)
-  set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
-  
-  set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}")
-  
-  # add the automatically determined parts of the RPATH
-  # which point to directories outside the build tree to the install RPATH
-  set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
-  
-  # the RPATH to be used when installing, but only if its not a system directory
-  list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}" isSystemDir)
-  if("${isSystemDir}" STREQUAL "-1")
-    set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}")
-  endif("${isSystemDir}" STREQUAL "-1")
-endif()
-
+set (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}/gazebo-${GAZEBO_VERSION}/gazebo") 
+set (LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR})
+set (BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR})
+    
 set (BUILD_GAZEBO ON CACHE INTERNAL "Build Gazebo" FORCE)
 set (build_errors "" CACHE INTERNAL "build errors" FORCE)
 set (build_warnings "" CACHE INTERNAL "build warnings" FORCE)
 
 
-set (MIN_OGRE_VERSION 1.7.1 CACHE INTERNAL "Ogre version requirement" FORCE)
+set (MIN_OGRE_VERSION 1.7.4 CACHE INTERNAL "Ogre version requirement" FORCE)
 set (MIN_BOOST_VERSION 1.40.0 CACHE INTERNAL "Boost min version requirement" FORCE)
 
 set (FREEIMAGE_MAJOR_VERSION 3 CACHE INTERNAL "FreeImage major version requirement" FORCE)
@@ -126,81 +106,55 @@ set (MIN_FREEIMAGE_VERSION ${FREEIMAGE_MAJOR_VERSION}.${FREEIMAGE_MINOR_VERSION}
 include (${gazebo_cmake_dir}/DissectVersion.cmake)
 
 #####################################
-# Build type cflags
-set (CMAKE_C_FLAGS_ALL " -Wall -Wextra -Wno-long-long -Wno-unused-value -Wno-unused-value -Wno-unused-value -Wno-unused-value -Wfloat-equal -Wshadow -Winit-self -Wswitch-default -Wmissing-include-dirs -pedantic" CACHE INTERNAL "General C Flags")
-
+# Check for low memory version to use in some tests
+if(NOT DEFINED USE_LOW_MEMORY_TESTS)
+  set (USE_LOW_MEMORY_TESTS FALSE)
+  message (STATUS "High memory tests: enabled")
+else()
+  set (USE_LOW_MEMORY_TEST TRUE)
+  message (STATUS "High memory tests: disabled, low memory versions will be used")
+endif()
 
-#####################################
-# Build type link flags
-set (CMAKE_LINK_FLAGS_RELEASE " " CACHE INTERNAL "Link flags fro release" FORCE)
-set (CMAKE_LINK_FLAGS_RELWITHDEBINFO " " CACHE INTERNAL "Link flags for release with debug support" FORCE)
-set (CMAKE_LINK_FLAGS_DEBUG " " CACHE INTERNAL "Link flags for debug" FORCE)
-set (CMAKE_LINK_FLAGS_PROFILE " -pg" CACHE INTERNAL "Link flags for profile" FORCE)
-set (CMAKE_LINK_FLAGS_CHECK " --coverage" CACHE INTERNAL "Link flags for static code checking" FORCE)
+######################################
+# Enable screen tests by default
+if(NOT DEFINED ENABLE_SCREEN_TESTS)
+  set(ENABLE_SCREEN_TESTS TRUE)
+endif()
 
 message (STATUS "\n\n====== Finding 3rd Party Packages ======")
 include (${gazebo_cmake_dir}/SearchForStuff.cmake)
 message (STATUS "----------------------------------------\n")
 
-if (SSE2_FOUND)
-  set (CMAKE_C_FLAGS_ALL "${CMAKE_C_FLAGS_ALL} -msse -msse2 -mfpmath=sse")
-endif()
-if (SSE3_FOUND)
-  set (CMAKE_C_FLAGS_ALL "${CMAKE_C_FLAGS_ALL} -msse3")
-endif()
-if (SSSE3_FOUND)
-  set (CMAKE_C_FLAGS_ALL "${CMAKE_C_FLAGS_ALL} -mssse3")
-endif()
+#####################################
+# Define some variables that are going to be used in two places:
+# 1. In CMake code to pass preprocessor definitions to certain source files
+# (especially in common/CMakeLists.txt).
+# 2. In the generation of cmake/setup.sh from cmake/setup.sh.in
+set(GAZEBO_DEFAULT_MASTER_HOST localhost)
+set(GAZEBO_DEFAULT_MASTER_PORT 11345)
+set(GAZEBO_PLUGIN_PATH ${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/gazebo-${GAZEBO_VERSION}/plugins)
+set(GAZEBO_RESOURCE_PATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/gazebo-${GAZEBO_VERSION}:${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/gazebo_models)
+set(GAZEBO_MODEL_DATABASE_URI http://gazebosim.org/models)
+set(OGRE_RESOURCE_PATH ${OGRE_PLUGINDIR})
+# Seems that OGRE_PLUGINDIR can end in a newline, which will cause problems when
+# we pass it to the compiler later.
+string(REPLACE "\n" "" OGRE_RESOURCE_PATH ${OGRE_RESOURCE_PATH})
 
-if (ENABLE_SSE4)
-  message(STATUS "\nSSE4 will be enabled if system supports it.\n")
-  if (SSE4_1_FOUND)
-    set (CMAKE_C_FLAGS_ALL "${CMAKE_C_FLAGS_ALL} -msse4.1")
-  endif()
-  if (SSE4_2_FOUND)
-    set (CMAKE_C_FLAGS_ALL "${CMAKE_C_FLAGS_ALL} -msse4.2")
-  endif()
-else()
-  message(STATUS "\nSSE4 disabled.\n")
-endif()
 
 # Check for DRI capable Display
 include (${gazebo_cmake_dir}/CheckDRIDisplay.cmake)
 
-set (CMAKE_C_FLAGS_RELEASE " -s -O3 -DNDEBUG ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for release" FORCE)
-set (CMAKE_CXX_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
-
-set (CMAKE_C_FLAGS_RELWITHDEBINFO " -g -O2 ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for release with debug support" FORCE)
-set (CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
-
-set (CMAKE_C_FLAGS_DEBUG " -ggdb3 ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for debug" FORCE)
-set (CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
-
-set (CMAKE_C_FLAGS_PROFILE " -fno-omit-frame-pointer -g -pg ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for profile" FORCE)
-set (CMAKE_CXX_FLAGS_PROFILE ${CMAKE_C_FLAGS_PROFILE})
-
-set (CMAKE_C_FLAGS_CHECK " -g -O0 -Wformat=2 --coverage -fno-inline ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for static code checking" FORCE)
-set (CMAKE_CXX_FLAGS_CHECK "${CMAKE_C_FLAGS_CHECK} -fno-elide-constructors -fno-default-inline -fno-implicit-inline-templates")
-
 #####################################
 MESSAGE(STATUS "Checking gazebo build type")
 # Set the default build type
 if (NOT CMAKE_BUILD_TYPE)
-    set (CMAKE_BUILD_TYPE "Release" CACHE STRING 
+    set (CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING 
         "Choose the type of build, options are: Debug Release RelWithDebInfo Profile Check" FORCE)
 endif (NOT CMAKE_BUILD_TYPE)
 # TODO: still convert to uppercase to keep backwards compatibility with 
 # uppercase old supported and deprecated modes
 string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPERCASE)
 
-#####################################
-# Set all the global build flags
-set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
-set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
-set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_LINK_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
-set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_LINK_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
-set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_LINK_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
-
 set (BUILD_TYPE_PROFILE FALSE)
 set (BUILD_TYPE_RELEASE FALSE)
 set (BUILD_TYPE_RELWITHDEBINFO FALSE)
@@ -218,15 +172,37 @@ else()
   build_error("CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} unknown. Valid options are: Debug Release RelWithDebInfo Profile Check")
 endif()
 
-# TODO: remove this check when transtition period ends
-# Check if build type was sent in old uppercase format
-if ("${CMAKE_BUILD_TYPE}" STREQUAL "${CMAKE_BUILD_TYPE_UPPERCASE}")
-    build_warning("CMAKE_BUILD_TYPE was specified in uppercase. This will stop to be supported soon. Valid types: Debug Release RelWithDebInfo Profile Check")
-endif ()
+#####################################
+# Handle CFlags
+unset (CMAKE_C_FLAGS_ALL CACHE)
+unset (CMAKE_CXX_FLAGS CACHE)
+
+# USE_HOST_CFLAGS (default TRUE)
+# Will check building host machine for proper cflags 
+if(NOT DEFINED USE_HOST_CFLAGS OR USE_HOST_CFLAGS)
+  message(STATUS "Enable host CFlags")
+  include (${gazebo_cmake_dir}/HostCFlags.cmake)
+endif()
 
-message (STATUS "\n\n====== Configuring 3rd Party Packages ======")
-add_subdirectory(deps)
-message (STATUS "----------------------------------------\n")
+# USE_UPSTREAM_CFLAGS (default TRUE)
+# Will use predefined gazebo developers cflags
+if(NOT DEFINED USE_UPSTREAM_CFLAGS OR USE_UPSTREAM_CFLAGS)
+  message(STATUS "Enable upstream CFlags")
+  include(${gazebo_cmake_dir}/DefaultCFlags.cmake)
+endif()
+
+# Check if warning options are avaliable for the compiler and return WARNING_CXX_FLAGS variable
+filter_valid_compiler_flags(-Wall -Wextra -Wno-long-long -Wno-unused-value -Wno-unused-value 
+                               -Wno-unused-value -Wno-unused-value -Wfloat-equal -Wshadow 
+			       -Winit-self -Wswitch-default -Wmissing-include-dirs -pedantic)
+
+# Check and add visibility hidden by default. Only in UNIX
+# Windows and MacosX does not handled properly the hidden compilation
+if (UNIX AND NOT APPLE)
+  filter_valid_compiler_flags(-fvisibility=hidden -fvisibility-inlines-hidden)
+endif()
+
+set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${VALID_CXX_FLAGS}")
 
 #################################################
 # OS Specific initialization
@@ -234,10 +210,21 @@ if (UNIX)
   gz_setup_unix()
 else (WIN32)
   gz_setup_windows()
-else (APPLE)
+endif()
+
+if(APPLE)
   gz_setup_apple()
 endif()
 
+# Main includes for compilation
+include_directories(${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
+
+#################################################
+# Configure 3rd Party Packages after OS Specific initialization
+message (STATUS "\n\n====== Configuring 3rd Party Packages ======")
+add_subdirectory(deps)
+message (STATUS "----------------------------------------\n")
+
 #################################################
 # Print warnings and errors
 if ( build_warnings )
@@ -271,25 +258,28 @@ else (build_errors)
   gz_install_includes("" ${PROJECT_BINARY_DIR}/gazebo/gazebo_config.h)
 
   configure_file(${CMAKE_SOURCE_DIR}/cmake/setup.sh.in ${PROJECT_BINARY_DIR}/setup.sh @ONLY)
-  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/setup.sh DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/)
-  configure_file(${CMAKE_SOURCE_DIR}/cmake/setup-unversioned.sh.in ${PROJECT_BINARY_DIR}/unversioned/setup.sh @ONLY)
-  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/unversioned/setup.sh DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo/)
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/setup.sh DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/gazebo-${GAZEBO_VERSION}/)
+  # Also install the setup.sh in an unversioned location
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/setup.sh DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/gazebo/)
  
-  include_directories(${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
-  
-  message (STATUS "C Flags:${CMAKE_CXX_FLAGS}")
+
+  if (DEFINED CMAKE_CXX_FLAGS)
+    message (STATUS "Custom CFlags:${CMAKE_CXX_FLAGS}")
+  else()
+    message (STATUS "Use default CFlags")
+  endif()
   message (STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
   message (STATUS "Install path: ${CMAKE_INSTALL_PREFIX}")
  
-
   if (BUILD_GAZEBO)
+    set(TEST_TYPE "UNIT")
     add_subdirectory(gazebo)
-    add_subdirectory(sdf)
     add_subdirectory(media)
     add_subdirectory(test)
     add_subdirectory(tools)
     add_subdirectory(plugins)
     add_subdirectory(interfaces)
+    add_subdirectory(worlds)
   endif (BUILD_GAZEBO)
 
   ########################################
@@ -302,6 +292,53 @@ else (build_errors)
   endforeach()
 
   ########################################
+  # Make the cmake config files
+  set(PKG_NAME ${PROJECT_NAME_UPPER})
+  set(PKG_LIBRARIES
+    gazebo
+    gazebo_common
+    gazebo_gimpact
+    gazebo_gui
+    gazebo_gui_building
+    gazebo_gui_viewers
+    gazebo_math
+    gazebo_msgs
+    gazebo_ode
+    gazebo_opcode
+    gazebo_opende_ou
+    gazebo_physics
+    gazebo_physics_ode
+    gazebo_rendering
+    gazebo_selection_buffer
+    gazebo_sensors
+    gazebo_skyx
+    gazebo_transport
+    gazebo_util)
+    
+  if (NOT HAVE_CCD)
+    set(PKG_LIBRARIES ${PKG_LIBRARIES} gazebo_ccd)
+  endif()
+    
+  if (INCLUDE_PLAYER)
+    set(PKG_LIBRARIES ${PKG_LIBRARIES} gazebo_player)
+  endif()
+
+  if (HAVE_BULLET)
+    set(PKG_LIBRARIES ${PKG_LIBRARIES} gazebo_physics_bullet)
+  endif()
+  
+  if (${OGRE_VERSION} GREATER 1.7.4)
+    set(PKG_LIBRARIES ${PKG_LIBRARIES} gazebo_rendering_deferred)
+  endif()
+    
+  set(PKG_DEPENDS Boost Protobuf SDFormat)
+
+  set(cmake_conf_file "cmake/gazebo-config.cmake")
+  configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${cmake_conf_file}.in" "${CMAKE_CURRENT_BINARY_DIR}/${cmake_conf_file}" @ONLY)
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${cmake_conf_file} DESTINATION 
+      ${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME_LOWER}/ COMPONENT cmake)
+
+  ########################################
   # If present, load platform-specific build hooks.  This system is used,
   # for example, by the Ubuntu overlay (in the gazebo-release repo), to
   # arrange for installation of Ubuntu-specific application-launching
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index 14936f1..0000000
--- a/ChangeLog
+++ /dev/null
@@ -1,5 +0,0 @@
-0.10.0 (13-01-2009)
-  -Small redesgin of GUI
-	-Overhauled the internal model tree structure
-	-Added beginnings of support for other physics engine
-	-Added support for Collada files
diff --git a/Changelog.md b/Changelog.md
new file mode 100644
index 0000000..f7c1b72
--- /dev/null
+++ b/Changelog.md
@@ -0,0 +1,581 @@
+## Gazebo 3.0
+
+### Gazebo 3.0.0 (2014-04-11)
+
+1. Added a plugin to simulate aero dynamics
+    * [Pull request #905](https://bitbucket.org/osrf/gazebo/pull-request/905)
+1. Updated bullet support
+    * [Issue #1069](https://bitbucket.org/osrf/gazebo/issue/1069)
+    * [Pull request #1011](https://bitbucket.org/osrf/gazebo/pull-request/1011)
+    * [Pull request #996](https://bitbucket.org/osrf/gazebo/pull-request/966)
+    * [Pull request #1024](https://bitbucket.org/osrf/gazebo/pull-request/1024)
+1. Updated simbody support
+    * [Pull request #995](https://bitbucket.org/osrf/gazebo/pull-request/995)
+1. Updated worlds to SDF 1.5
+    * [Pull request #1021](https://bitbucket.org/osrf/gazebo/pull-request/1021)
+1. Improvements to ODE
+    * [Pull request #1001](https://bitbucket.org/osrf/gazebo/pull-request/1001)
+    * [Pull request #1014](https://bitbucket.org/osrf/gazebo/pull-request/1014)
+    * [Pull request #1015](https://bitbucket.org/osrf/gazebo/pull-request/1015)
+    * [Pull request #1016](https://bitbucket.org/osrf/gazebo/pull-request/1016)
+1. New command line tool
+    * [Pull request #972](https://bitbucket.org/osrf/gazebo/pull-request/972)
+1. Graphical user interface improvements
+    * [Pull request #971](https://bitbucket.org/osrf/gazebo/pull-request/971)
+    * [Pull request #1013](https://bitbucket.org/osrf/gazebo/pull-request/1013)
+    * [Pull request #989](https://bitbucket.org/osrf/gazebo/pull-request/989)
+1. Created a friction pyramid class
+    * [Pull request #935](https://bitbucket.org/osrf/gazebo/pull-request/935)
+1. Added GetWorldEnergy functions to Model, Joint, and Link
+    * [Pull request #1017](https://bitbucket.org/osrf/gazebo/pull-request/1017)
+1. Preparing Gazebo for admission into Ubuntu
+    * [Pull request #969](https://bitbucket.org/osrf/gazebo/pull-request/969)
+    * [Pull request #998](https://bitbucket.org/osrf/gazebo/pull-request/998)
+    * [Pull request #1002](https://bitbucket.org/osrf/gazebo/pull-request/1002)
+1. Add method for querying if useImplicitStiffnessDamping flag is set for a given joint
+    * [Issue #629](https://bitbucket.org/osrf/gazebo/issue/629)
+    * [Pull request #1006](https://bitbucket.org/osrf/gazebo/pull-request/1006)
+1. Fix joint axis frames
+    * [Issue #494](https://bitbucket.org/osrf/gazebo/issue/494)
+    * [Pull request #963](https://bitbucket.org/osrf/gazebo/pull-request/963)
+1. Compute joint anchor pose relative to parent
+    * [Issue #1029](https://bitbucket.org/osrf/gazebo/issue/1029)
+    * [Pull request #982](https://bitbucket.org/osrf/gazebo/pull-request/982)
+1. Cleanup the installed worlds
+    * [Issue #1036](https://bitbucket.org/osrf/gazebo/issue/1036)
+    * [Pull request #984](https://bitbucket.org/osrf/gazebo/pull-request/984)
+1. Update to the GPS sensor
+    * [Issue #1059](https://bitbucket.org/osrf/gazebo/issue/1059)
+    * [Pull request #984](https://bitbucket.org/osrf/gazebo/pull-request/984)
+1. Removed libtool from plugin loading
+    * [Pull request #981](https://bitbucket.org/osrf/gazebo/pull-request/981)
+1. Added functions to get inertial information for a link in the world frame.
+    * [Pull request #1005](https://bitbucket.org/osrf/gazebo/pull-request/1005)
+
+## Gazebo 2.0
+
+### Gazebo 2.2.0 (2014-01-10)
+1. Fix compilation when using OGRE-1.9 (full support is being worked on)
+    * [Issue #994](https://bitbucket.org/osrf/gazebo/issue/994)
+    * [Issue #995](https://bitbucket.org/osrf/gazebo/issue/995)
+    * [Issue #996](https://bitbucket.org/osrf/gazebo/issue/996)
+    * [Pull request #883](https://bitbucket.org/osrf/gazebo/pull-request/883)
+1. Added unit test for issue 624.
+    * [Issue #624](https://bitbucket.org/osrf/gazebo/issue/624).
+    * [Pull request #889](https://bitbucket.org/osrf/gazebo/pull-request/889)
+1. Use 3x3 PCF shadows for smoother shadows.
+    * [Pull request #887](https://bitbucket.org/osrf/gazebo/pull-request/887)
+1. Update manpage copyright to 2014.
+    * [Pull request #893](https://bitbucket.org/osrf/gazebo/pull-request/893)
+1. Added friction integration test .
+    * [Pull request #885](https://bitbucket.org/osrf/gazebo/pull-request/885)
+1. Fix joint anchor when link pose is not specified.
+    * [Issue #978](https://bitbucket.org/osrf/gazebo/issue/978)
+    * [Pull request #862](https://bitbucket.org/osrf/gazebo/pull-request/862)
+1. Added (ESC) tooltip for GUI Selection Mode icon.
+    * [Issue #993](https://bitbucket.org/osrf/gazebo/issue/993)
+    * [Pull request #888](https://bitbucket.org/osrf/gazebo/pull-request/888)
+1. Removed old comment about resolved issue.
+    * [Issue #837](https://bitbucket.org/osrf/gazebo/issue/837)
+    * [Pull request #880](https://bitbucket.org/osrf/gazebo/pull-request/880)
+1. Made SimbodyLink::Get* function thread-safe
+    * [Issue #918](https://bitbucket.org/osrf/gazebo/issue/918)
+    * [Pull request #872](https://bitbucket.org/osrf/gazebo/pull-request/872)
+1. Suppressed spurious gzlog messages in ODE::Body
+    * [Issue #983](https://bitbucket.org/osrf/gazebo/issue/983)
+    * [Pull request #875](https://bitbucket.org/osrf/gazebo/pull-request/875)
+1. Fixed Force Torque Sensor Test by properly initializing some values.
+    * [Issue #982](https://bitbucket.org/osrf/gazebo/issue/982)
+    * [Pull request #869](https://bitbucket.org/osrf/gazebo/pull-request/869)
+1. Added breakable joint plugin to support breakable walls.
+    * [Pull request #865](https://bitbucket.org/osrf/gazebo/pull-request/865)
+1. Used different tuple syntax to fix compilation on OSX mavericks.
+    * [Issue #947](https://bitbucket.org/osrf/gazebo/issue/947)
+    * [Pull request #858](https://bitbucket.org/osrf/gazebo/pull-request/858)
+1. Fixed sonar test and deprecation warning.
+    * [Pull request #856](https://bitbucket.org/osrf/gazebo/pull-request/856)
+1. Speed up test compilation.
+    * Part of [Issue #955](https://bitbucket.org/osrf/gazebo/issue/955)
+    * [Pull request #846](https://bitbucket.org/osrf/gazebo/pull-request/846)
+1. Added Joint::SetEffortLimit API
+    * [Issue #923](https://bitbucket.org/osrf/gazebo/issue/923)
+    * [Pull request #808](https://bitbucket.org/osrf/gazebo/pull-request/808)
+1. Made bullet output less verbose.
+    * [Pull request #839](https://bitbucket.org/osrf/gazebo/pull-request/839)
+1. Convergence acceleration and stability tweak to make atlas_v3 stable
+    * [Issue #895](https://bitbucket.org/osrf/gazebo/issue/895)
+    * [Pull request #772](https://bitbucket.org/osrf/gazebo/pull-request/772)
+1. Added colors, textures and world files for the SPL RoboCup environment
+    * [Pull request #838](https://bitbucket.org/osrf/gazebo/pull-request/838)
+1. Fixed bitbucket_pullrequests tool to work with latest BitBucket API.
+    * [Issue #933](https://bitbucket.org/osrf/gazebo/issue/933)
+    * [Pull request #841](https://bitbucket.org/osrf/gazebo/pull-request/841)
+1. Fixed cppcheck warnings.
+    * [Pull request #842](https://bitbucket.org/osrf/gazebo/pull-request/842)
+ 
+### Gazebo 2.1.0 (2013-11-08)
+1. Fix mainwindow unit test
+    * [Pull request #752](https://bitbucket.org/osrf/gazebo/pull-request/752)
+1. Visualize moment of inertia
+    * Pull request [#745](https://bitbucket.org/osrf/gazebo/pull-request/745), [#769](https://bitbucket.org/osrf/gazebo/pull-request/769), [#787](https://bitbucket.org/osrf/gazebo/pull-request/787)
+    * [Issue #203](https://bitbucket.org/osrf/gazebo/issue/203)
+1. Update tool to count lines of code
+    * [Pull request #758](https://bitbucket.org/osrf/gazebo/pull-request/758)
+1. Implement World::Clear
+    * Pull request [#785](https://bitbucket.org/osrf/gazebo/pull-request/785), [#804](https://bitbucket.org/osrf/gazebo/pull-request/804)
+1. Improve Bullet support
+    * [Pull request #805](https://bitbucket.org/osrf/gazebo/pull-request/805)
+1. Fix doxygen spacing
+    * [Pull request #740](https://bitbucket.org/osrf/gazebo/pull-request/740)
+1. Add tool to generate model images for thepropshop.org
+    * [Pull request #734](https://bitbucket.org/osrf/gazebo/pull-request/734)
+1. Added paging support for terrains
+    * [Pull request #707](https://bitbucket.org/osrf/gazebo/pull-request/707)
+1. Added plugin path to LID_LIBRARY_PATH in setup.sh
+    * [Pull request #750](https://bitbucket.org/osrf/gazebo/pull-request/750)
+1. Fix for OSX
+    * [Pull request #766](https://bitbucket.org/osrf/gazebo/pull-request/766)
+    * [Pull request #786](https://bitbucket.org/osrf/gazebo/pull-request/786)
+    * [Issue #906](https://bitbucket.org/osrf/gazebo/issue/906)
+1. Update copyright information
+    * [Pull request #771](https://bitbucket.org/osrf/gazebo/pull-request/771)
+1. Enable screen dependent tests
+    * [Pull request #764](https://bitbucket.org/osrf/gazebo/pull-request/764)
+    * [Issue #811](https://bitbucket.org/osrf/gazebo/issue/811)
+1. Fix gazebo command line help message
+    * [Pull request #775](https://bitbucket.org/osrf/gazebo/pull-request/775)
+    * [Issue #898](https://bitbucket.org/osrf/gazebo/issue/898)
+1. Fix man page test
+    * [Pull request #774](https://bitbucket.org/osrf/gazebo/pull-request/774)
+1. Improve load time by reducing calls to RTShader::Update
+    * [Pull request #773](https://bitbucket.org/osrf/gazebo/pull-request/773)
+    * [Issue #877](https://bitbucket.org/osrf/gazebo/issue/877)
+1. Fix joint visualization
+    * [Pull request #776](https://bitbucket.org/osrf/gazebo/pull-request/776)
+    * [Pull request #802](https://bitbucket.org/osrf/gazebo/pull-request/802)
+    * [Issue #464](https://bitbucket.org/osrf/gazebo/issue/464)
+1. Add helpers to fix NaN
+    * [Pull request #742](https://bitbucket.org/osrf/gazebo/pull-request/742)
+1. Fix model resizing via the GUI
+    * [Pull request #763](https://bitbucket.org/osrf/gazebo/pull-request/763)
+    * [Issue #885](https://bitbucket.org/osrf/gazebo/issue/885)
+1. Simplify gzlog test by using sha1
+    * [Pull request #781](https://bitbucket.org/osrf/gazebo/pull-request/781)
+    * [Issue #837](https://bitbucket.org/osrf/gazebo/issue/837)
+1. Enable cppcheck for header files
+    * [Pull request #782](https://bitbucket.org/osrf/gazebo/pull-request/782)
+    * [Issue #907](https://bitbucket.org/osrf/gazebo/issue/907)
+1. Fix broken regression test
+    * [Pull request #784](https://bitbucket.org/osrf/gazebo/pull-request/784)
+    * [Issue #884](https://bitbucket.org/osrf/gazebo/issue/884)
+1. All simbody and dart to pass tests
+    * [Pull request #790](https://bitbucket.org/osrf/gazebo/pull-request/790)
+    * [Issue #873](https://bitbucket.org/osrf/gazebo/issue/873)
+1. Fix camera rotation from SDF
+    * [Pull request #789](https://bitbucket.org/osrf/gazebo/pull-request/789)
+    * [Issue #920](https://bitbucket.org/osrf/gazebo/issue/920)
+1. Fix bitbucket pullrequest command line tool to match new API
+    * [Pull request #803](https://bitbucket.org/osrf/gazebo/pull-request/803)
+1. Fix transceiver spawn errors in tests
+    * [Pull request #811](https://bitbucket.org/osrf/gazebo/pull-request/811)
+    * [Pull request #814](https://bitbucket.org/osrf/gazebo/pull-request/814)
+ 
+### Gazebo 2.0.0 (2013-10-08)
+1. Refactor code check tool.
+    * [Pull Request #669](https://bitbucket.org/osrf/gazebo/pull-request/669)
+1. Added pull request tool for Bitbucket.
+    * [Pull Request #670](https://bitbucket.org/osrf/gazebo/pull-request/670)
+    * [Pull Request #691](https://bitbucket.org/osrf/gazebo/pull-request/671)
+1. New wireless receiver and transmitter sensor models.
+    * [Pull Request #644](https://bitbucket.org/osrf/gazebo/pull-request/644)
+    * [Pull Request #675](https://bitbucket.org/osrf/gazebo/pull-request/675)
+    * [Pull Request #727](https://bitbucket.org/osrf/gazebo/pull-request/727)
+1. Audio support using OpenAL.
+    * [Pull Request #648](https://bitbucket.org/osrf/gazebo/pull-request/648)
+    * [Pull Request #704](https://bitbucket.org/osrf/gazebo/pull-request/704)
+1. Simplify command-line parsing of gztopic echo output.
+    * [Pull Request #674](https://bitbucket.org/osrf/gazebo/pull-request/674)
+    * Resolves: [Issue #795](https://bitbucket.org/osrf/gazebo/issue/795)
+1. Use UNIX directories through the user of GNUInstallDirs cmake module.
+    * [Pull Request #676](https://bitbucket.org/osrf/gazebo/pull-request/676)
+    * [Pull Request #681](https://bitbucket.org/osrf/gazebo/pull-request/681)
+1. New GUI interactions for object manipulation.
+    * [Pull Request #634](https://bitbucket.org/osrf/gazebo/pull-request/634)
+1. Fix for OSX menubar.
+    * [Pull Request #677](https://bitbucket.org/osrf/gazebo/pull-request/677)
+1. Remove internal SDF directories and dependencies.
+    * [Pull Request #680](https://bitbucket.org/osrf/gazebo/pull-request/680)
+1. Add minimum version for sdformat.
+    * [Pull Request #682](https://bitbucket.org/osrf/gazebo/pull-request/682)
+    * Resolves: [Issue #818](https://bitbucket.org/osrf/gazebo/issue/818)
+1. Allow different gtest parameter types with ServerFixture
+    * [Pull Request #686](https://bitbucket.org/osrf/gazebo/pull-request/686)
+    * Resolves: [Issue #820](https://bitbucket.org/osrf/gazebo/issue/820)
+1. GUI model scaling when using Bullet.
+    * [Pull Request #683](https://bitbucket.org/osrf/gazebo/pull-request/683)
+1. Fix typo in cmake config.
+    * [Pull Request #694](https://bitbucket.org/osrf/gazebo/pull-request/694)
+    * Resolves: [Issue #824](https://bitbucket.org/osrf/gazebo/issue/824)
+1. Remove gazebo include subdir from pkgconfig and cmake config.
+    * [Pull Request #691](https://bitbucket.org/osrf/gazebo/pull-request/691)
+1. Torsional spring demo
+    * [Pull Request #693](https://bitbucket.org/osrf/gazebo/pull-request/693)
+1. Remove repeated call to SetAxis in Joint.cc
+    * [Pull Request #695](https://bitbucket.org/osrf/gazebo/pull-request/695)
+    * Resolves: [Issue #823](https://bitbucket.org/osrf/gazebo/issue/823)
+1. Add test for rotational joints.
+    * [Pull Request #697](https://bitbucket.org/osrf/gazebo/pull-request/697)
+    * Resolves: [Issue #820](https://bitbucket.org/osrf/gazebo/issue/820)
+1. Fix compilation of tests using Joint base class
+    * [Pull Request #701](https://bitbucket.org/osrf/gazebo/pull-request/701)
+1. Terrain paging implemented.
+    * [Pull Request #687](https://bitbucket.org/osrf/gazebo/pull-request/687)
+1. Improve timeout error reporting in ServerFixture
+    * [Pull Request #705](https://bitbucket.org/osrf/gazebo/pull-request/705)
+1. Fix mouse picking for cases where visuals overlap with the laser 
+    * [Pull Request #709](https://bitbucket.org/osrf/gazebo/pull-request/709)
+1. Fix string literals for OSX 
+    * [Pull Request #712](https://bitbucket.org/osrf/gazebo/pull-request/712)
+    * Resolves: [Issue #803](https://bitbucket.org/osrf/gazebo/issue/803)
+1. Support for ENABLE_TESTS_COMPILATION cmake parameter 
+    * [Pull Request #708](https://bitbucket.org/osrf/gazebo/pull-request/708)
+1. Updated system gui plugin
+    * [Pull Request #702](https://bitbucket.org/osrf/gazebo/pull-request/702)
+1. Fix force torque unit test issue
+    * [Pull Request #673](https://bitbucket.org/osrf/gazebo/pull-request/673)
+    * Resolves: [Issue #813](https://bitbucket.org/osrf/gazebo/issue/813)
+1. Use variables to control auto generation of CFlags
+    * [Pull Request #699](https://bitbucket.org/osrf/gazebo/pull-request/699)
+1. Remove deprecated functions.
+    * [Pull Request #715](https://bitbucket.org/osrf/gazebo/pull-request/715)
+1. Fix typo in `Camera.cc`
+    * [Pull Request #719](https://bitbucket.org/osrf/gazebo/pull-request/719)
+    * Resolves: [Issue #846](https://bitbucket.org/osrf/gazebo/issue/846)
+1. Performance improvements
+    * [Pull Request #561](https://bitbucket.org/osrf/gazebo/pull-request/561)
+1. Fix gripper model.
+    * [Pull Request #713](https://bitbucket.org/osrf/gazebo/pull-request/713)
+    * Resolves: [Issue #314](https://bitbucket.org/osrf/gazebo/issue/314)
+1. First part of Simbody integration
+    * [Pull Request #716](https://bitbucket.org/osrf/gazebo/pull-request/716)
+
+## Gazebo 1.9
+
+### Gazebo 1.9.3 (2014-01-10)
+
+1. Add thickness to plane to remove shadow flickering.
+    * [Pull request #886](https://bitbucket.org/osrf/gazebo/pull-request/886)
+1. Temporary GUI shadow toggle fix.
+    * [Issue #925](https://bitbucket.org/osrf/gazebo/issue/925)
+    * [Pull request #868](https://bitbucket.org/osrf/gazebo/pull-request/868)
+1. Fix memory access bugs with libc++ on mavericks.
+    * [Issue #965](https://bitbucket.org/osrf/gazebo/issue/965)
+    * [Pull request #857](https://bitbucket.org/osrf/gazebo/pull-request/857)
+    * [Pull request #881](https://bitbucket.org/osrf/gazebo/pull-request/881)
+1. Replaced printf with cout in gztopic hz.
+    * [Issue #969](https://bitbucket.org/osrf/gazebo/issue/969)
+    * [Pull request #854](https://bitbucket.org/osrf/gazebo/pull-request/854)
+1. Add Dark grey material and fix indentation.
+    * [Pull request #851](https://bitbucket.org/osrf/gazebo/pull-request/851)
+1. Fixed sonar sensor unit test.
+    * [Pull request #848](https://bitbucket.org/osrf/gazebo/pull-request/848)
+1. Convergence acceleration and stability tweak to make atlas_v3 stable.
+    * [Pull request #845](https://bitbucket.org/osrf/gazebo/pull-request/845)
+1. Update gtest to 1.7.0 to resolve problems with libc++.
+    * [Issue #947](https://bitbucket.org/osrf/gazebo/issue/947)
+    * [Pull request #827](https://bitbucket.org/osrf/gazebo/pull-request/827)
+1. Fixed LD_LIBRARY_PATH for plugins.
+    * [Issue #957](https://bitbucket.org/osrf/gazebo/issue/957)
+    * [Pull request #844](https://bitbucket.org/osrf/gazebo/pull-request/844)
+1. Fix transceiver sporadic errors.
+    * Backport of [pull request #811](https://bitbucket.org/osrf/gazebo/pull-request/811)
+    * [Pull request #836](https://bitbucket.org/osrf/gazebo/pull-request/836)
+1. Modified the MsgTest to be deterministic with time checks.
+    * [Pull request #843](https://bitbucket.org/osrf/gazebo/pull-request/843)
+1. Fixed seg fault in LaserVisual.
+    * [Issue #950](https://bitbucket.org/osrf/gazebo/issue/950)
+    * [Pull request #832](https://bitbucket.org/osrf/gazebo/pull-request/832)
+1. Implemented the option to disable tests that need a working screen to run properly.
+    * Backport of [Pull request #764](https://bitbucket.org/osrf/gazebo/pull-request/764)
+    * [Pull request #837](https://bitbucket.org/osrf/gazebo/pull-request/837)
+1. Cleaned up gazebo shutdown.
+    * [Pull request #829](https://bitbucket.org/osrf/gazebo/pull-request/829)
+1. Fixed bug associated with loading joint child links.
+    * [Issue #943](https://bitbucket.org/osrf/gazebo/issue/943)
+    * [Pull request #820](https://bitbucket.org/osrf/gazebo/pull-request/820)
+
+### Gazebo 1.9.2 (2013-11-08)
+1. Fix enable/disable sky and clouds from SDF
+    * [Pull request #809](https://bitbucket.org/osrf/gazebo/pull-request/809])
+1. Fix occasional blank GUI screen on startup 
+    * [Pull request #815](https://bitbucket.org/osrf/gazebo/pull-request/815])
+1. Fix GPU laser when interacting with heightmaps
+    * [Pull request #796](https://bitbucket.org/osrf/gazebo/pull-request/796])
+1. Added API/ABI checker command line tool
+    * [Pull request #765](https://bitbucket.org/osrf/gazebo/pull-request/765])
+1. Added gtest version information 
+    * [Pull request #801](https://bitbucket.org/osrf/gazebo/pull-request/801])
+1. Fix GUI world saving
+    * [Pull request #806](https://bitbucket.org/osrf/gazebo/pull-request/806])
+1. Enable anti-aliasing for camera sensor
+    * [Pull request #800](https://bitbucket.org/osrf/gazebo/pull-request/800])
+1. Make sensor noise deterministic
+    * [Pull request #788](https://bitbucket.org/osrf/gazebo/pull-request/788])
+1. Fix build problem
+    * [Issue #901](https://bitbucket.org/osrf/gazebo/issue/901)
+    * [Pull request #778](https://bitbucket.org/osrf/gazebo/pull-request/778])
+1. Fix a typo in Camera.cc
+    * [Pull request #720](https://bitbucket.org/osrf/gazebo/pull-request/720])
+    * [Issue #846](https://bitbucket.org/osrf/gazebo/issue/846)
+1. Fix OSX menu bar
+    * [Pull request #688](https://bitbucket.org/osrf/gazebo/pull-request/688])
+1. Fix gazebo::init by calling sdf::setFindCallback() before loading the sdf in gzfactory.
+    * [Pull request #678](https://bitbucket.org/osrf/gazebo/pull-request/678])
+    * [Issue #817](https://bitbucket.org/osrf/gazebo/issue/817)
+
+### Gazebo 1.9.1 (2013-08-20)
+* Deprecate header files that require case-sensitive filesystem (e.g. Common.hh, Physics.hh) [https://bitbucket.org/osrf/gazebo/pull-request/638/fix-for-775-deprecate-headers-that-require]
+* Initial support for building on Mac OS X [https://bitbucket.org/osrf/gazebo/pull-request/660/osx-support-for-gazebo-19] [https://bitbucket.org/osrf/gazebo/pull-request/657/cmake-fixes-for-osx]
+* Fixes for various issues [https://bitbucket.org/osrf/gazebo/pull-request/635/fix-for-issue-792/diff] [https://bitbucket.org/osrf/gazebo/pull-request/628/allow-scoped-and-non-scoped-joint-names-to/diff] [https://bitbucket.org/osrf/gazebo/pull-request/636/fix-build-dependency-in-message-generation/diff] [https://bitbucket.org/osrf/gazebo/pull-request/639/make-the-unversioned-setupsh-a-copy-of-the/diff] [https://bitbucket.org/osrf/gazebo/pull-request/650/added-missing-lib-to-player-client [...]
+
+### Gazebo 1.9.0 (2013-07-23)
+* Use external package [sdformat](https://bitbucket.org/osrf/sdformat) for sdf parsing, refactor the `Element::GetValue*` function calls, and deprecate Gazebo's internal sdf parser [https://bitbucket.org/osrf/gazebo/pull-request/627]
+* Improved ROS support ([[Tutorials#ROS_Integration |documentation here]]) [https://bitbucket.org/osrf/gazebo/pull-request/559]
+* Added Sonar, Force-Torque, and Tactile Pressure sensors [https://bitbucket.org/osrf/gazebo/pull-request/557], [https://bitbucket.org/osrf/gazebo/pull-request/567]
+* Add compile-time defaults for environment variables so that sourcing setup.sh is unnecessary in most cases [https://bitbucket.org/osrf/gazebo/pull-request/620]
+* Enable user camera to follow objects in client window [https://bitbucket.org/osrf/gazebo/pull-request/603]
+* Install protobuf message files for use in custom messages [https://bitbucket.org/osrf/gazebo/pull-request/614]
+* Change default compilation flags to improve debugging [https://bitbucket.org/osrf/gazebo/pull-request/617]
+* Change to supported relative include paths [https://bitbucket.org/osrf/gazebo/pull-request/594]
+* Fix display of laser scans when sensor is rotated [https://bitbucket.org/osrf/gazebo/pull-request/599]
+
+## Gazebo 1.8
+
+### Gazebo 1.8.7 (2013-07-16)
+* Fix bug in URDF parsing of Vector3 elements [https://bitbucket.org/osrf/gazebo/pull-request/613]
+* Fix compilation errors with newest libraries [https://bitbucket.org/osrf/gazebo/pull-request/615]
+
+### Gazebo 1.8.6 (2013-06-07)
+* Fix inertia lumping in the URDF parser[https://bitbucket.org/osrf/gazebo/pull-request/554]
+* Fix for ODEJoint CFM damping sign error [https://bitbucket.org/osrf/gazebo/pull-request/586]
+* Fix transport memory growth[https://bitbucket.org/osrf/gazebo/pull-request/584]
+* Reduce log file data in order to reduce buffer growth that results in out of memory kernel errors[https://bitbucket.org/osrf/gazebo/pull-request/587]
+
+### Gazebo 1.8.5 (2013-06-04)
+* Fix Gazebo build for machines without a valid display.[https://bitbucket.org/osrf/gazebo/commits/37f00422eea03365b839a632c1850431ee6a1d67]
+
+### Gazebo 1.8.4 (2013-06-03)
+* Fix UDRF to SDF converter so that URDF gazebo extensions are applied to all collisions in a link.[https://bitbucket.org/osrf/gazebo/pull-request/579]
+* Prevent transport layer from locking when a gzclient connects to a gzserver over a connection with high latency.[https://bitbucket.org/osrf/gazebo/pull-request/572]
+* Improve performance and fix uninitialized conditional jumps.[https://bitbucket.org/osrf/gazebo/pull-request/571]
+
+### Gazebo 1.8.3 (2013-06-03)
+* Fix for gzlog hanging when gzserver is not present or not responsive[https://bitbucket.org/osrf/gazebo/pull-request/577]
+* Fix occasional segfault when generating log files[https://bitbucket.org/osrf/gazebo/pull-request/575]
+* Performance improvement to ODE[https://bitbucket.org/osrf/gazebo/pull-request/556]
+* Fix node initialization[https://bitbucket.org/osrf/gazebo/pull-request/570]
+* Fix GPU laser Hz rate reduction when sensor moved away from world origin[https://bitbucket.org/osrf/gazebo/pull-request/566]
+* Fix incorrect lighting in camera sensors when GPU laser is subscribe to[https://bitbucket.org/osrf/gazebo/pull-request/563]
+
+### Gazebo 1.8.2 (2013-05-28)
+* ODE performance improvements[https://bitbucket.org/osrf/gazebo/pull-request/535][https://bitbucket.org/osrf/gazebo/pull-request/537]
+* Fixed tests[https://bitbucket.org/osrf/gazebo/pull-request/538][https://bitbucket.org/osrf/gazebo/pull-request/541][https://bitbucket.org/osrf/gazebo/pull-request/542]
+* Fixed sinking vehicle bug[https://bitbucket.org/osrf/drcsim/issue/300] in pull-request[https://bitbucket.org/osrf/gazebo/pull-request/538]
+* Fix GPU sensor throttling[https://bitbucket.org/osrf/gazebo/pull-request/536]
+* Reduce string comparisons for better performance[https://bitbucket.org/osrf/gazebo/pull-request/546]
+* Contact manager performance improvements[https://bitbucket.org/osrf/gazebo/pull-request/543]
+* Transport performance improvements[https://bitbucket.org/osrf/gazebo/pull-request/548]
+* Reduce friction noise[https://bitbucket.org/osrf/gazebo/pull-request/545]
+
+### Gazebo 1.8.1 (2013-05-22)
+* Please note that 1.8.1 contains a bug[https://bitbucket.org/osrf/drcsim/issue/300] that causes interpenetration between objects in resting contact to grow slowly.  Please update to 1.8.2 for the patch.
+* Added warm starting[https://bitbucket.org/osrf/gazebo/pull-request/529]
+* Reduced console output[https://bitbucket.org/osrf/gazebo/pull-request/533]
+* Improved off screen rendering performance[https://bitbucket.org/osrf/gazebo/pull-request/530]
+* Performance improvements [https://bitbucket.org/osrf/gazebo/pull-request/535] [https://bitbucket.org/osrf/gazebo/pull-request/537]
+
+### Gazebo 1.8.0 (2013-05-17)
+* Fixed slider axis [https://bitbucket.org/osrf/gazebo/pull-request/527]
+* Fixed heightmap shadows [https://bitbucket.org/osrf/gazebo/pull-request/525]
+* Fixed model and canonical link pose [https://bitbucket.org/osrf/gazebo/pull-request/519]
+* Fixed OSX message header[https://bitbucket.org/osrf/gazebo/pull-request/524]
+* Added zlib compression for logging [https://bitbucket.org/osrf/gazebo/pull-request/515]
+* Allow clouds to be disabled in cameras [https://bitbucket.org/osrf/gazebo/pull-request/507]
+* Camera rendering performance [https://bitbucket.org/osrf/gazebo/pull-request/528]
+
+
+## Gazebo 1.7
+
+### Gazebo 1.7.3 (2013-05-08)
+* Fixed log cleanup (again) [https://bitbucket.org/osrf/gazebo/pull-request/511/fix-log-cleanup-logic]
+
+### Gazebo 1.7.2 (2013-05-07)
+* Fixed log cleanup [https://bitbucket.org/osrf/gazebo/pull-request/506/fix-gzlog-stop-command-line]
+* Minor documentation fix [https://bitbucket.org/osrf/gazebo/pull-request/488/minor-documentation-fix]
+
+### Gazebo 1.7.1 (2013-04-19)
+* Fixed tests
+* IMU sensor receives time stamped data from links
+* Fix saving image frames [https://bitbucket.org/osrf/gazebo/pull-request/466/fix-saving-frames/diff]
+* Wireframe rendering in GUI [https://bitbucket.org/osrf/gazebo/pull-request/414/allow-rendering-of-models-in-wireframe]
+* Improved logging performance [https://bitbucket.org/osrf/gazebo/pull-request/457/improvements-to-gzlog-filter-and-logging]
+* Viscous mud model [https://bitbucket.org/osrf/gazebo/pull-request/448/mud-plugin/diff]
+
+## Gazebo 1.6
+
+### Gazebo 1.6.3 (2013-04-15)
+* Fixed a [critical SDF bug](https://bitbucket.org/osrf/gazebo/pull-request/451)
+* Fixed a [laser offset bug](https://bitbucket.org/osrf/gazebo/pull-request/449)
+
+### Gazebo 1.6.2 (2013-04-14)
+* Fix for fdir1 physics property [https://bitbucket.org/osrf/gazebo/pull-request/429/fixes-to-treat-fdir1-better-1-rotate-into/diff]
+* Fix for force torque sensor [https://bitbucket.org/osrf/gazebo/pull-request/447]
+* SDF documentation fix [https://bitbucket.org/osrf/gazebo/issue/494/joint-axis-reference-frame-doesnt-match]
+
+### Gazebo 1.6.1 (2013-04-05)
+* Switch default build type to Release.
+
+### Gazebo 1.6.0 (2013-04-05)
+* Improvements to inertia in rubble pile
+* Various Bullet integration advances.
+* Noise models for ray, camera, and imu sensors.
+* SDF 1.4, which accommodates more physics engine parameters and also some sensor noise models.
+* Initial support for making movies from within Gazebo.
+* Many performance improvements.
+* Many bug fixes.
+* Progress toward to building on OS X.
+
+## Gazebo 1.5
+
+### Gazebo 1.5.0 (2013-03-11)
+* Partial integration of Bullet
+  * Includes: cubes, spheres, cylinders, planes, meshes, revolute joints, ray sensors
+* GUI Interface for log writing.
+* Threaded sensors.
+* Multi-camera sensor.
+
+* Fixed the following issues:
+ * [https://bitbucket.org/osrf/gazebo/issue/236 Issue #236]
+ * [https://bitbucket.org/osrf/gazebo/issue/507 Issue #507]
+ * [https://bitbucket.org/osrf/gazebo/issue/530 Issue #530]
+ * [https://bitbucket.org/osrf/gazebo/issue/279 Issue #279]
+ * [https://bitbucket.org/osrf/gazebo/issue/529 Issue #529]
+ * [https://bitbucket.org/osrf/gazebo/issue/239 Issue #239]
+ * [https://bitbucket.org/osrf/gazebo/issue/5 Issue #5]
+
+## Gazebo 1.4
+
+### Gazebo 1.4.0 (2013-02-01)
+* New Features:
+ * GUI elements to display messages from the server.
+ * Multi-floor building editor and creator.
+ * Improved sensor visualizations.
+ * Improved mouse interactions
+
+* Fixed the following issues:
+ * [https://bitbucket.org/osrf/gazebo/issue/16 Issue #16]
+ * [https://bitbucket.org/osrf/gazebo/issue/142 Issue #142]
+ * [https://bitbucket.org/osrf/gazebo/issue/229 Issue #229]
+ * [https://bitbucket.org/osrf/gazebo/issue/277 Issue #277]
+ * [https://bitbucket.org/osrf/gazebo/issue/291 Issue #291]
+ * [https://bitbucket.org/osrf/gazebo/issue/310 Issue #310]
+ * [https://bitbucket.org/osrf/gazebo/issue/320 Issue #320]
+ * [https://bitbucket.org/osrf/gazebo/issue/329 Issue #329]
+ * [https://bitbucket.org/osrf/gazebo/issue/333 Issue #333]
+ * [https://bitbucket.org/osrf/gazebo/issue/334 Issue #334]
+ * [https://bitbucket.org/osrf/gazebo/issue/335 Issue #335]
+ * [https://bitbucket.org/osrf/gazebo/issue/341 Issue #341]
+ * [https://bitbucket.org/osrf/gazebo/issue/350 Issue #350]
+ * [https://bitbucket.org/osrf/gazebo/issue/384 Issue #384]
+ * [https://bitbucket.org/osrf/gazebo/issue/431 Issue #431]
+ * [https://bitbucket.org/osrf/gazebo/issue/433 Issue #433]
+ * [https://bitbucket.org/osrf/gazebo/issue/453 Issue #453]
+ * [https://bitbucket.org/osrf/gazebo/issue/456 Issue #456]
+ * [https://bitbucket.org/osrf/gazebo/issue/457 Issue #457]
+ * [https://bitbucket.org/osrf/gazebo/issue/459 Issue #459]
+
+## Gazebo 1.3
+
+### Gazebo 1.3.1 (2012-12-14)
+* Fixed the following issues:
+ * [https://bitbucket.org/osrf/gazebo/issue/297 Issue #297]
+* Other bugs fixed:
+ * [https://bitbucket.org/osrf/gazebo/pull-request/164/ Fix light bounding box to disable properly when deselected]
+ * [https://bitbucket.org/osrf/gazebo/pull-request/169/ Determine correct local IP address, to make remote clients work properly] 
+ * Various test fixes
+
+### Gazebo 1.3.0 (2012-12-03)
+* Fixed the following issues:
+ * [https://bitbucket.org/osrf/gazebo/issue/233 Issue #233]
+ * [https://bitbucket.org/osrf/gazebo/issue/238 Issue #238]
+ * [https://bitbucket.org/osrf/gazebo/issue/2 Issue #2]
+ * [https://bitbucket.org/osrf/gazebo/issue/95 Issue #95]
+ * [https://bitbucket.org/osrf/gazebo/issue/97 Issue #97]
+ * [https://bitbucket.org/osrf/gazebo/issue/90 Issue #90]
+ * [https://bitbucket.org/osrf/gazebo/issue/253 Issue #253]
+ * [https://bitbucket.org/osrf/gazebo/issue/163 Issue #163]
+ * [https://bitbucket.org/osrf/gazebo/issue/91 Issue #91]
+ * [https://bitbucket.org/osrf/gazebo/issue/245 Issue #245]
+ * [https://bitbucket.org/osrf/gazebo/issue/242 Issue #242]
+ * [https://bitbucket.org/osrf/gazebo/issue/156 Issue #156]
+ * [https://bitbucket.org/osrf/gazebo/issue/78 Issue #78]
+ * [https://bitbucket.org/osrf/gazebo/issue/36 Issue #36]
+ * [https://bitbucket.org/osrf/gazebo/issue/104 Issue #104]
+ * [https://bitbucket.org/osrf/gazebo/issue/249 Issue #249]
+ * [https://bitbucket.org/osrf/gazebo/issue/244 Issue #244]
+ * [https://bitbucket.org/osrf/gazebo/issue/36 Issue #36]
+
+* New features:
+ * Default camera view changed to look down at the origin from a height of 2 meters at location (5, -5, 2).
+ * Record state data using the '-r' command line option, playback recorded state data using the '-p' command line option
+ * Adjust placement of lights using the mouse.
+ * Reduced the startup time.
+ * Added visual reference for GUI mouse movements.
+ * SDF version 1.3 released (changes from 1.2 listed below):
+     - added `name` to `<camera name="cam_name"/>`
+     - added `pose` to `<camera><pose>...</pose></camera>`
+     - removed `filename` from `<mesh><filename>...</filename><mesh>`, use uri only.
+     - recovered `provide_feedback` under `<joint>`, allowing calling `physics::Joint::GetForceTorque` in plugins.
+     - added `imu` under `<sensor>`.
+
+## Gazebo 1.2
+
+### Gazebo 1.2.6 (2012-11-08)
+* Fixed a transport issue with the GUI. Fixed saving the world via the GUI. Added more documentation. ([https://bitbucket.org/osrf/gazebo/pull-request/43/fixed-a-transport-issue-with-the-gui-fixed/diff pull request #43])
+* Clean up mutex usage. ([https://bitbucket.org/osrf/gazebo/pull-request/54/fix-mutex-in-modellistwidget-using-boost/diff pull request #54])
+* Fix OGRE path determination ([https://bitbucket.org/osrf/gazebo/pull-request/58/fix-ogre-paths-so-this-also-works-with/diff pull request #58], [https://bitbucket.org/osrf/gazebo/pull-request/68/fix-ogre-plugindir-determination/diff pull request #68])
+* Fixed a couple of crashes and model selection/dragging problems ([https://bitbucket.org/osrf/gazebo/pull-request/59/fixed-a-couple-of-crashes-and-model/diff pull request #59])
+
+### Gazebo 1.2.5 (2012-10-22)
+* Step increment update while paused fixed ([https://bitbucket.org/osrf/gazebo/pull-request/45/fix-proper-world-stepinc-count-we-were/diff pull request #45])
+* Actually call plugin destructors on shutdown ([https://bitbucket.org/osrf/gazebo/pull-request/51/fixed-a-bug-which-prevent-a-plugin/diff pull request #51])
+* Don't crash on bad SDF input ([https://bitbucket.org/osrf/gazebo/pull-request/52/fixed-loading-of-bad-sdf-files/diff pull request #52])
+* Fix cleanup of ray sensors on model deletion ([https://bitbucket.org/osrf/gazebo/pull-request/53/deleting-a-model-with-a-ray-sensor-did/diff pull request #53])
+* Fix loading / deletion of improperly specified models ([https://bitbucket.org/osrf/gazebo/pull-request/56/catch-when-loading-bad-models-joint/diff pull request #56])
+
+### Gazebo 1.2.4 (10-19-2012:08:00:52)
+*  Style fixes ([https://bitbucket.org/osrf/gazebo/pull-request/30/style-fixes/diff pull request #30]).
+*  Fix joint position control ([https://bitbucket.org/osrf/gazebo/pull-request/49/fixed-position-joint-control/diff pull request #49])
+
+### Gazebo 1.2.3 (10-16-2012:18:39:54)
+*  Disabled selection highlighting due to bug ([https://bitbucket.org/osrf/gazebo/pull-request/44/disabled-selection-highlighting-fixed/diff pull request #44]).
+*  Fixed saving a world via the GUI.
+
+### Gazebo 1.2.2 (10-16-2012:15:12:22)
+*  Skip search for system install of libccd, use version inside gazebo ([https://bitbucket.org/osrf/gazebo/pull-request/39/skip-search-for-system-install-of-libccd/diff pull request #39]).
+*  Fixed sensor initialization race condition ([https://bitbucket.org/osrf/gazebo/pull-request/42/fix-sensor-initializaiton-race-condition pull request #42]).
+
+### Gazebo 1.2.1 (10-15-2012:21:32:55)
+*  Properly removed projectors attached to deleted models ([https://bitbucket.org/osrf/gazebo/pull-request/37/remove-projectors-that-are-attached-to/diff pull request #37]).
+*  Fix model plugin loading bug ([https://bitbucket.org/osrf/gazebo/pull-request/31/moving-bool-first-in-model-and-world pull request #31]).
+*  Fix light insertion and visualization of models prior to insertion ([https://bitbucket.org/osrf/gazebo/pull-request/35/fixed-light-insertion-and-visualization-of/diff pull request #35]).
+*  Fixed GUI manipulation of static objects ([https://bitbucket.org/osrf/gazebo/issue/63/moving-static-objects-does-not-move-the issue #63] [https://bitbucket.org/osrf/gazebo/pull-request/38/issue-63-bug-patch-moving-static-objects/diff pull request #38]).
+*  Fixed GUI selection bug ([https://bitbucket.org/osrf/gazebo/pull-request/40/fixed-selection-of-multiple-objects-at/diff pull request #40])
+
+### Gazebo 1.2.0 (10-04-2012:20:01:20)
+*  Updated GUI: new style, improved mouse controls, and removal of non-functional items.
+*  Model database: An online repository of models.
+*  Numerous bug fixes
+*  APT repository hosted at [http://osrfoundation.org OSRF]
+*  Improved process control prevents zombie processes
+
diff --git a/LICENSE b/LICENSE
index bd33c43..4e5473b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 Software License Agreement (Apache License)
 
-Copyright 2012 Open Source Robotics Foundation
+Copyright (C) 2012-2014 Open Source Robotics Foundation
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/Migration.md b/Migration.md
new file mode 100644
index 0000000..c0099df
--- /dev/null
+++ b/Migration.md
@@ -0,0 +1,579 @@
+## Gazebo 2.0 to 3.0
+
+### New Deprecations
+
+1. **gazebo/physics/Joint.hh**
+    + ***Deprecation*** virtual void ApplyDamping()
+    + ***Replacement*** virtual void ApplyStiffnessDamping()
+    ---
+    + ***Deprecation*** double GetDampingCoefficient() const
+    + ***Replacement*** double GetDamping(int _index)
+
+1. **gazebo/physics/ode/ODEJoint.hh**
+    + ***Deprecation*** void CFMDamping()
+    + ***Replacement*** void ApplyImplicitStiffnessDamping()
+
+1. **gazebo/physics/ScrewJoint.hh**
+    + ***Deprecation*** virtual void SetThreadPitch(unsigned int _index, double _threadPitch) = 0
+    + ***Replacement*** virtual void SetThreadPitch(double _threadPitch) = 0
+    ---
+    + ***Deprecation*** virtual void GetThreadPitch(unsigned int _index) = 0
+    + ***Replacement*** virtual void GetThreadPitch() = 0
+
+1. **gazebo/physics/bullet/BulletScrewJoint.hh**
+    + ***Deprecation*** protected: virtual void Load(sdf::ElementPtr _sdf)
+    + ***Replacement*** public: virtual void Load(sdf::ElementPtr _sdf)
+
+1. **gazebo/physics/PhysicsEngine.hh**
+    + ***Deprecation*** virtual void SetSORPGSPreconIters(unsigned int _iters)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, const boost::any &_value)
+    ---
+    + ***Deprecation*** virtual void SetSORPGSIters(unsigned int _iters)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, const boost::any &_value)
+    ---
+    + ***Deprecation*** virtual void SetSORPGSW(double _w)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, const boost::any &_value)
+    ---
+    + ***Deprecation*** virtual int GetSORPGSPreconIters()
+    + ***Replacement*** virtual boost::any GetParam(const std::string &_key) const
+    ---
+    + ***Deprecation*** virtual int GetSORPGSIters()
+    + ***Replacement*** virtual boost::any GetParam(const std::string &_key) const
+    ---
+    + ***Deprecation*** virtual double GetSORPGSW()
+    + ***Replacement*** virtual boost::any GetParam(const std::string &_key) const
+
+1. **gazebo/physics/bullet/BulletPhysics.hh**
+    + ***Deprecation*** virtual bool SetParam(BulletParam _param, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, const boost::any &_value)
+    ---
+    + ***Deprecation*** virtual boost::any GetParam(BulletParam _param) const
+    + ***Replacement*** virtual boost::any GetParam(const std::string &_key) const
+
+1. **gazebo/physics/ode/ODEPhysics.hh**
+    + ***Deprecation*** virtual bool SetParam(ODEParam _param, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, const boost::any &_value)
+    ---
+    + ***Deprecation*** virtual boost::any GetParam(ODEParam _param) const
+    + ***Replacement*** virtual boost::any GetParam(const std::string &_key) const
+
+1. **gazebo/physics/dart/DARTPhysics.hh**
+    + ***Deprecation*** virtual boost::any GetParam(DARTParam _param) const
+    + ***Replacement*** virtual boost::any GetParam(const std::string &_key) const
+
+1. **gazebo/physics/Joint.hh**
+    + ***Deprecation*** virtual double GetAttribute(const std::string &_key, unsigned int _index) = 0
+    + ***Replacement*** virtual double GetParam(const std::string &_key, unsigned int _index) = 0;
+
+1. **gazebo/physics/bullet/BulletJoint.hh**
+    + ***Deprecation*** virtual double GetAttribute(const std::string &_key, unsigned int _index)
+    + ***Replacement*** virtual double GetParam(const std::string &_key, unsigned int _index)
+
+1. **gazebo/physics/bullet/BulletScrewJoint.hh**
+    + ***Deprecation*** virtual double GetAttribute(const std::string &_key, unsigned int _index)
+    + ***Replacement*** virtual double GetParam(const std::string &_key, unsigned int _index)
+ 
+1. **gazebo/physics/dart/DARTJoint.hh**
+    + ***Deprecation*** virtual double GetParam(const std::string &_key, unsigned int _index)
+    + ***Replacement*** virtual double GetAttribute(const std::string &_key, unsigned int _index)
+
+1. **gazebo/physics/ode/ODEJoint.hh**
+    + ***Deprecation*** virtual double GetParam(const std::string &_key, unsigned int _index)
+    + ***Replacement*** virtual double GetAttribute(const std::string &_key, unsigned int _index)
+
+1. **gazebo/physics/ode/ODEScrewJoint.hh**
+    + ***Deprecation*** virtual double GetParam(const std::string &_key, unsigned int _index)
+    + ***Replacement*** virtual double GetAttribute(const std::string &_key, unsigned int _index)
+
+1. **gazebo/physics/ode/ODEUniversalJoint.hh**
+    + ***Deprecation*** virtual double GetParam(const std::string &_key, unsigned int _index)
+    + ***Replacement*** virtual double GetAttribute(const std::string &_key, unsigned int _index)
+
+1. **gazebo/physics/simbody/SimbodyJoint.hh**
+    + ***Deprecation*** virtual double GetParam(const std::string &_key, unsigned int _index)
+    + ***Replacement*** virtual double GetAttribute(const std::string &_key, unsigned int _index)
+
+1. **gazebo/physics/simbody/SimbodyScrewJoint.hh**
+    + ***Deprecation*** virtual double GetParam(const std::string &_key, unsigned int _index)
+    + ***Replacement*** virtual double GetAttribute(const std::string &_key, unsigned int _index)
+
+1. **gazebo/physics/Joint.hh**
+    + ***Deprecation*** virtual void SetAttribute(const std::string &_key, unsigned int _index, const boost::any &_value) = 0
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, unsigned int _index, const boost::any &_value) = 0
+
+1. **gazebo/physics/bullet/BulletJoint.hh**
+    + ***Deprecation*** virtual void SetAttribute(const std::string &_key, unsigned int _index, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, unsigned int _index, const boost::any &_value)
+
+1. **gazebo/physics/dart/DARTJoint.hh**
+    + ***Deprecation*** virtual void SetAttribute(const std::string &_key, unsigned int _index, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, unsigned int _index, const boost::any &_value)
+
+1. **gazebo/physics/ode/ODEJoint.hh**
+    + ***Deprecation*** virtual void SetAttribute(const std::string &_key, unsigned int _index, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, unsigned int _index, const boost::any &_value)
+
+1. **gazebo/physics/ode/ODEScrewJoint.hh**
+    + ***Deprecation*** virtual void SetAttribute(const std::string &_key, unsigned int _index, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, unsigned int _index, const boost::any &_value)
+
+1. **gazebo/physics/ode/ODEUniversalJoint.hh**
+    + ***Deprecation*** virtual void SetAttribute(const std::string &_key, unsigned int _index, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, unsigned int _index, const boost::any &_value)
+
+1. **gazebo/physics/simbody/SimbodyJoint.hh**
+    + ***Deprecation*** virtual void SetAttribute(const std::string &_key, unsigned int _index, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, unsigned int _index, const boost::any &_value)
+
+1. **gazebo/physics/simbody/SimbodyScrewJoint.hh**
+    + ***Deprecation*** virtual void SetAttribute(const std::string &_key, unsigned int _index, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, unsigned int _index, const boost::any &_value)
+
+### Modifications
+1. **gazebo/physics/Box.hh**
+    + ***Removed:*** bool operator==(const Box &_b) `ABI Change`
+    + ***Replacement:***  bool operator==(const Box &_b) const
+
+1. **gazebo/gui/GuiIface.hh**
+    + ***Removed:*** void load() `ABI change`
+    + ***Replacement:*** bool load()
+    + ***Note:*** Changed return type from void to bool.
+1. **Functions in joint classes use unsigned int, instead of int**
+    + All functions in Joint classes (gazebo/physics/\*Joint\*) and subclasses (gazebo/physics/[ode,bullet,simbody,dart]/\*Joint\*) now use unsigned integers instead of integers when referring to a specific joint axis.
+    + Add const to Joint::GetInitialAnchorPose(), Joint::GetStopDissipation(), Joint::GetStopStiffness()
+1. **gazebo/sensors/Noise.hh** `ABI change`
+    + ***Removed:*** void Noise::Load(sdf::ElementPtr _sdf)
+    + ***Replacement:*** virtual void Noise::Load(sdf::ElementPtr _sdf)
+    + ***Removed:*** void Noise::~Noise()
+    + ***Replacement:*** virtual void Noise::~Noise()
+    + ***Removed:*** void Noise::Apply() const
+    + ***Replacement:*** void Noise::Apply()
+    + ***Note:*** Make Noise a base class and refactored out GaussianNoiseModel to its own class.
+1. **gazebo/transport/ConnectionManager.hh**
+    + ***Removed:*** bool ConnectionManager::Init(const std::string &_masterHost, unsigned int _masterPort) `ABI change`
+    + ***Replacement:*** bool ConnectionManager::Init(const std::string &_masterHost, unsigned int _masterPort, uint32_t _timeoutIterations = 30)
+    + ***Note:*** No changes to downstream code required. A third parameter has been added that specifies the number of timeout iterations. This parameter has a default value of 30.
+1. **gazebo/transport/TransportIface.hh**
+    + ***Removed:*** bool init(const std::string &_masterHost = "", unsigned int _masterPort = 0) `ABI change`
+    + ***Replacement:*** bool init(const std::string &_masterHost = "", unsigned int _masterPort = 0, uint32_t _timeoutIterations = 30)
+    + ***Note:*** No changes to downstream code required. A third parameter has been added that specifies the number of timeout iterations. This parameter has a default value of 30.
+1. **gazebo/transport/Publication.hh**
+    + ***Removed:*** void Publish(MessagePtr _msg, boost::function<void(uint32_t)> _cb, uint32_t _id) `ABI change`
+    + ***Replacement:*** int Publish(MessagePtr _msg, boost::function<void(uint32_t)> _cb, uint32_t _id)
+    + ***Note:*** Only the return type changed.
+
+1. **gazebo/common/ModelDatabase.hh** `API change`
+    + ***Removed:*** void ModelDatabase::GetModels(boost::function<void (const std::map<std::string, std::string> &)> _func)
+    + ***Replacement:*** event::ConnectionPtr ModelDatabase::GetModels(boost::function<void (const std::map<std::string, std::string> &)> _func)
+    + ***Note:*** The replacement function requires that the returned connection shared pointer remain valid in order to receive the GetModels callback. Reset the shared pointer to stop receiving GetModels callback.
+
+1. **gazebo/physics/Collision.hh** `API change`
+    + ***Modified:*** SurfaceParamsPtr Collision::surface
+    + ***Note:*** Changed from `private` to `protected`
+
+1. **gazebo/physics/MultiRayShape.hh** `API change`
+    + ***Removed:*** double MultiRayShape::GetRange(int _index)
+    + ***Replacement:*** double MultiRayShape::GetRange(unsigned int _index)
+    + ***Removed:*** double MultiRayShape::GetRetro(int _index)
+    + ***Replacement:*** double MultiRayShape::GetRetro(unsigned int _index)
+    + ***Removed:*** double MultiRayShape::GetFiducial(int _index)
+    + ***Replacement:*** double MultiRayShape::GetFiducial(unsigned int _index)
+    + ***Note:*** Changed argument type from int to unsigned int.
+
+1. **gazebo/physics/SurfaceParams.hh**
+    + ***Removed:*** void FillMsg(msgs::Surface &_msg)
+    + ***Replacement:*** virtual void FillMsg(msgs::Surface &_msg)
+
+1. **gazebo/sensors/RaySensor.hh** `API change`
+    + ***Removed:*** double RaySensor::GetRange(int _index)
+    + ***Replacement:*** double RaySensor::GetRange(unsigned int _index)
+    + ***Removed:*** double RaySensor::GetRetro(int _index)
+    + ***Replacement:*** double RaySensor::GetRetro(unsigned int _index)
+    + ***Removed:*** double RaySensor::GetFiducial(int _index)
+    + ***Replacement:*** double RaySensor::GetFiducial(unsigned int _index)
+    + ***Note:*** Changed argument type from int to unsigned int.
+
+1. **gazebo/physics/PhysicsEngine.hh**
+    + ***Removed*** virtual void SetParam(const std::string &_key, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, const boost::any &_value)
+
+1. **gazebo/physics/ode/ODEPhysics.hh**
+    + ***Removed*** virtual void SetParam(const std::string &_key, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, const boost::any &_value)
+
+1. **gazebo/physics/bullet/BulletPhysics.hh**
+    + ***Removed*** virtual void SetParam(const std::string &_key, const boost::any &_value)
+    + ***Replacement*** virtual bool SetParam(const std::string &_key, const boost::any &_value)
+
+1. **gazebo/physics/BallJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int /*_index*/, const math::Angle &/*_angle*/)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int /*_index*/, const math::Angle &/*_angle*/)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int /*_index*/, const math::Angle &/*_angle*/)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int /*_index*/, const math::Angle &/*_angle*/)
+ 
+1. **gazebo/physics/Joint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/bullet/BulletBallJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+ 
+1. **gazebo/physics/bullet/BulletHinge2Joint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/bullet/BulletHingeJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/bullet/BulletScrewJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/bullet/BulletSliderJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/bullet/BulletUniversalJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/dart/DARTJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/ode/ODEJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/ode/ODEUniversalJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/simbody/SimbodyJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+1. **gazebo/physics/simbody/SimbodyScrewJoint.hh**
+    + ***Removed*** virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetHighStop(unsigned int _index, const math::Angle &_angle)
+    ---
+    + ***Removed*** virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + ***Replacement*** virtual bool SetLowStop(unsigned int _index, const math::Angle &_angle)
+
+### Additions
+
+1. **gazebo/physics/JointController.hh**
+      + common::Time GetLastUpdateTime() const
+      + std::map<std::string, JointPtr> GetJoints() const
+      + bool SetPositionTarget(const std::string &_jointName, double _target)
+      + bool SetVelocityTarget(const std::string &_jointName, double _target)
+      + std::map<std::string, common::PID> GetPositionPIDs() const
+      + std::map<std::string, common::PID> GetVelocityPIDs() const
+      + std::map<std::string, double> GetForces() const
+      + std::map<std::string, double> GetPositions() const
+      + std::map<std::string, double> GetVelocities() const
+
+
+1. **gazebo/common/PID.hh**
+      + double GetPGain() const
+      + double GetIGain() const
+      + double GetDGain() const
+      + double GetIMax() const
+      + double GetIMin() const
+      + double GetCmdMax() const
+      + double GetCmdMin() const
+
+
+1. **gazebo/transport/TransportIface.hh**
+    +  transport::ConnectionPtr connectToMaster()
+
+1. **gazebo/physics/World.hh**
+    +  msgs::Scene GetSceneMsg() const
+1. **gazebo/physics/ContactManager.hh**
+    + unsigned int GetFilterCount()
+    + bool HasFilter(const std::string &_name)
+    + void RemoveFilter(const std::string &_name)
+
+1. **gazebo/physics/Joint.hh**
+    + virtual void Fini()
+    + math::Pose GetAnchorErrorPose() const
+    + math::Quaternion GetAxisFrame(unsigned int _index) const
+    + double GetWorldEnergyPotentialSpring(unsigned int _index) const
+    + math::Pose GetParentWorldPose() const
+    + double GetSpringReferencePosition(unsigned int) const
+    + math::Pose GetWorldPose() const
+    + virtual void SetEffortLimit(unsigned _index, double _stiffness)
+    + virtual void SetStiffness(unsigned int _index, double _stiffness) = 0
+    + virtual void SetStiffnessDamping(unsigned int _index, double _stiffness, double _damping, double _reference = 0) = 0
+    + bool axisParentModelFrame[MAX_JOINT_AXIS]
+    + protected: math::Pose parentAnchorPose
+    + public: double GetInertiaRatio(const math::Vector3 &_axis) const
+
+1. **gazebo/physics/Link.hh**
+    + double GetWorldEnergy() const
+    + double GetWorldEnergyKinetic() const
+    + double GetWorldEnergyPotential() const
+    + bool initialized
+
+1. **gazebo/physics/Model.hh**
+    + double GetWorldEnergy() const
+    + double GetWorldEnergyKinetic() const
+    + double GetWorldEnergyPotential() const
+
+1. **gazebo/physics/SurfaceParams.hh**
+    + FrictionPyramid()
+    + ~FrictionPyramid()
+    + double GetMuPrimary()
+    + double GetMuSecondary()
+    + void SetMuPrimary(double _mu)
+    + void SetMuSecondary(double _mu)
+    + math::Vector3 direction1
+    + ***Note:*** Replaces mu, m2, fdir1 variables
+
+1. **gazebo/physics/bullet/BulletSurfaceParams.hh**
+    + BulletSurfaceParams()
+    + virtual ~BulletSurfaceParams()
+    + virtual void Load(sdf::ElementPtr _sdf)
+    + virtual void FillMsg(msgs::Surface &_msg)
+    + virtual void ProcessMsg(msgs::Surface &_msg)
+    + FrictionPyramid frictionPyramid
+
+1. **gazebo/physics/ode/ODESurfaceParams.hh**
+    + virtual void FillMsg(msgs::Surface &_msg)
+    + virtual void ProcessMsg(msgs::Surface &_msg)
+    + double bounce
+    + double bounce
+    + double bounceThreshold
+    + double kp
+    + double kd
+    + double cfm
+    + double erp
+    + double maxVel
+    + double minDepth
+    + FrictionPyramid frictionPyramid
+    + double slip1
+    + double slip2
+
+1. **gazebo/rendering/Light.hh**
+    + bool GetVisible() const
+    + virtual void LoadFromMsg(const msgs::Light &_msg)
+
+1. **gazebo/sensors/ForceTorqueSensor.hh**
+    + physics::JointPtr GetJoint() const
+
+1. **gazebo/sensors/Noise.hh**
+    + virtual double ApplyImpl(double _in)
+    + virtual void Fini()
+    + virtual void SetCustomNoiseCallback(boost::function<double (double)> _cb)
+
+1. **gazebo/sensors/Sensor.hh**
+    + NoisePtr GetNoise(unsigned int _index = 0) const
+
+1. **gazebo/sensors/GaussianNoiseModel.hh**
+
+1. **gazebo/physics/ode/ODEUniversalJoint.hh**
+    + virtual void SetHighStop(unsigned int _index, const math::Angle &_angle)
+    + virtual void SetLowStop(unsigned int _index, const math::Angle &_angle)
+    + virtual void SetAttribute(const std::string &_key, unsigned int _index, const boost::any &_value)
+    + virtual double GetAttribute(const std::string &_key, unsigned int _index)
+
+1. **gazebo/physics/simbody/SimbodyScrewJoint.hh**
+    + virtual void SetThreadPitch(double _threadPitch)
+    + virtual void GetThreadPitch() 
+
+1. **gazebo/physics/ode/ODEScrewJoint.hh**
+    + virtual void SetThreadPitch(double _threadPitch)
+    + virtual void GetThreadPitch() 
+
+1. **gazebo/physics/ScrewJoint.hh**
+    + virtual math::Vector3 GetAnchor(unsigned int _index) const
+    + virtual void SetAnchor(unsigned int _index, const math::Vector3 &_anchor)
+
+1. **gazebo/physics/bullet/BulletJoint.hh**
+    + virtual math::Angle GetHighStop(unsigned int _index)
+    + virtual math::Angle GetLowStop(unsigned int _index)
+
+1. **gazebo/physics/simbody/SimbodyPhysics.hh**
+    + virtual boost::any GetParam(const std::string &_key) const
+    + virtual bool SetParam(const std::string &_key, const boost::any &_value)
+
+1. **gazebo/physics/dart/DARTPhysics.hh**
+    + virtual boost::any GetParam(const std::string &_key) const
+    + virtual bool SetParam(const std::string &_key, const boost::any &_value)
+
+### Deletions
+
+1. **Removed libtool**
+    + Libtool used to be an option for loading plugins. Now, only libdl is supported.
+
+1. **gazebo/physics/Base.hh**
+    + Base_V::iterator childrenEnd
+
+1. **gazebo/sensors/Noise.hh**
+    + double Noise::GetMean() const
+    + double Noise::GetStdDev() const
+    + double Noise::GetBias() const
+    + ***Note:*** Moved gaussian noise functions to a new GaussianNoiseModel class
+
+1. **gazebo/physics/SurfaceParams.hh**
+    + double bounce
+    + double bounce
+    + double bounceThreshold
+    + double kp
+    + double kd
+    + double cfm
+    + double erp
+    + double maxVel
+    + double minDepth
+    + double mu1
+    + double mu2
+    + double slip1
+    + double slip2
+    + math::Vector3 fdir1
+    + ***Note:*** These parameters were moved to FrictionPyramid,
+      ODESurfaceParams, and BulletSurfaceParams.
+
+
+## Gazebo 1.9 to 2.0
+
+### New Deprecations
+
+1. **gazebo/gazebo.hh**
+    + ***Deprecation*** void fini()
+    + ***Deprecation*** void stop()
+    + ***Replacement*** bool shutdown()
+    + ***Note*** Replace fini and stop with shutdown
+    ---
+    + ***Deprecation*** bool load()
+    + ***Deprecation*** bool init()
+    + ***Deprecation*** bool run()
+    + ***Replacement*** bool setupClient()
+        + Use this function to setup gazebo for use as a client
+    + ***Replacement*** bool setupServer()
+        + Use this function to setup gazebo for use as a server
+    + ***Note*** Replace load+init+run with setupClient/setupServer
+    ---
+    + ***Deprecation*** std::string find_file(const std::string &_file)
+    + ***Replacement*** std::string common::find_file(const std::string &_file)
+    ---
+    + ***Deprecation*** void add_plugin(const std::string &_filename)
+    + ***Replacement*** void addPlugin(const std::string &_filename)
+    ---
+    + ***Deprecation*** void print_version()
+    + ***Replacement*** void printVersion()
+1. **gazebo/physics/World.hh**
+    + ***Deprecation*** void World::StepWorld(int _steps)
+    + ***Replacement*** void World::Step(unsigned int _steps)
+1. **gazebo/sensors/SensorsIface.hh**
+    + ***Deprecation*** std::string sensors::create_sensor(sdf::ElementPtr _elem, const std::string &_worldName,const std::string &_parentName)
+    + ***Replacement*** std::string sensors::create_sensor(sdf::ElementPtr _elem, const std::string &_worldName, const std::string &_parentName, uint32_t _parentId)
+1. **gazebo/sensors/Sensor.hh**
+    + ***Deprecation*** void Sensor::SetParent(const std::string &_name)
+    + ***Replacement*** void Sensor::SetParent(const std::string &_name, uint32_t _id)
+1. **gazebo/sensors/SensorManager.hh**
+    + ***Deprecation*** std::string CreateSensor(sdf::ElementPtr _elem, const std::string &_worldName,  const std::string &_parentName)
+    + ***Replacement*** std::string CreateSensor(sdf::ElementPtr _elem, const std::string &_worldName, const std::string &_parentName, uint32_t _parentId)
+1. **gazebo/sensors/Collision.hh**
+    + ***Deprecation*** void Collision::SetContactsEnabled(bool _enable)
+    + ***Replacement*** Use [ContactManager](http://gazebosim.org/api/2.0.0/classgazebo_1_1physics_1_1ContactManager.html).
+    ---
+    + ***Deprecation*** bool Colliion::GetContactsEnabled() const
+    + ***Replacement*** Use [ContactManager](http://gazebosim.org/api/2.0.0/classgazebo_1_1physics_1_1ContactManager.html).
+    ---
+    + ***Deprecation*** void AddContact(const Contact &_contact)
+    + ***Replacement*** Use [ContactManager](http://gazebosim.org/api/2.0.0/classgazebo_1_1physics_1_1ContactManager.html).
+
+### Modifications
+
+1. File rename: `gazebo/common/Common.hh` to `gazebo/common/CommonIface.hh`
+1. File rename: `gazebo/physics/Physics.hh` to `gazebo/physics/PhysicsIface.hh`
+1. File rename: `gazebo/rendering/Rendering.hh` to `gazebo/rendering/RenderingIface.hh`
+1. File rename: `gazebo/sensors/Sensors.hh` to `gazebo/sensors/SensorsIface.hh`
+1. File rename: `gazebo/transport/Transport.hh` to `gazebo/transport/TransportIface.hh`
+1. File rename: `gazebo/gui/Gui.hh` to `gazebo/gui/GuiIface.hh`
+1. File rename: `<model>/manifest.xml` to `<model>/model.config`
+1. File rename: `<model_database>/manifest.xml` to `<model_database>/database.config`
+1. **gazebo/msgs/physics.proto**
+    + ***Removed*** optional double dt
+    + ***Replacement*** optional double min_step_size
+    ---
+    + ***Removed*** optional double update_rate
+    + ***Replacement*** optional double real_time_update_rate
+1. **gazebo/physics/ModelState.hh**
+    + ***Removed*** LinkState ModelState::GetLinkState(int _index) `API change`
+    + ***Replacement*** LinkState ModelState::GetLinkState(const std::string &_linkName) const
+1. **gazebo/physics/PhyscisEngine.hh**
+    + ***Removed*** void PhysicsEngine::SetUpdateRate(double _value) `API change`
+    + ***Replacement*** void PhyscisEngine::SetRealTimeUpdateRate(double _rate)
+    ---
+    + ***Removed*** double PhysicsEngine::GetUpdateRate() `API change`
+    + ***Replacement*** double PhysicsEngine::GetRealTimeUpdateRate() const
+    ---
+    + ***Removed*** void PhysicsEngine::SetStepTime(double _value) `API change`
+    + ***Replacement*** void PhysicsEngine::SetMaxStepSize(double _stepSize)
+    ---
+    + ***Removed*** double PhysicsEngine::GetStepTime() `API change`
+    + ***Replacement*** double PhysicsEngine::GetMaxStepSize() const
+1. **gazebo/physics/Joint.hh**
+    + ***Removed:*** Joint::Load(LinkPtr _parent, LinkPtr _child, const math::Vector3 &_pos) `API chance`
+    + ***Replacement:*** Joint::Load(LinkPtr _parent, LinkPtr _child, const math::Pose &_pose)
+    ---
+    + ***Removed:*** public: double GetInertiaRatio(unsigned int _index) const
+    + ***Replacement:*** public: double GetInertiaRatio(const unsigned int _index) const
+1. **gazebo/common/Events.hh**
+    + ***Removed:*** Events::ConnectWorldUpdateStart(T _subscriber) `API change`
+    + ***Replacement*** ConnectionPtr Events::ConnectWorldUpdateBegin(T _subscriber)
+    ---
+    + ***Removed:*** Events::DisconnectWorldUpdateStart(T _subscriber) `API change`
+    + ***Replacement*** ConnectionPtr Events::DiconnectWorldUpdateBegin(T _subscriber)
+1. **gazebo/physics/Link.hh**
+    + ***Removed*** void Link::RemoveChildJoint(JointPtr _joint) `API change`
+    + ***Replacement*** void Link::RemoveChildJoint(const std::string &_jointName)
+    ---
+    + ***Removed*** void Link::RemoveParentJoint(const std::string &_jointName) `API change`
+    + ***Replacement*** void Link::RemoveParentJoint(const std::string &_jointName)
+1. **gazebo/physics/MeshShape.hh**
+    + ***Removed*** std::string MeshShape::GetFilename() const `API change`
+    + ***Replacement*** std::string MeshShape::GetURI() const
+    ---
+    + ***Removed*** void MeshShape::SetFilename() const `API change`
+    + ***Replacement*** std::string MeshShape::SetMesh(const std::string &_uri, const std::string &_submesh = "", bool _center = false) const
+1. **gazebo/common/Time.hh**
+    + ***Removed*** static Time::NSleep(Time _time) `API change`
+    + ***Replacement*** static Time NSleep(unsigned int _ns)
diff --git a/README b/README
index 6eb243d..3839a7c 100644
--- a/README
+++ b/README
@@ -6,13 +6,26 @@ This is the Gazebo simulator.  Gazebo simulates multiple robots in a
 
   http://gazebosim.org
 
-
 Installation
 ------------
 Instructions are located at
 
   http://gazebosim.org/documentation.html
 
+Gazebo cmake parameters available at configuring time:
+ - USE_LOW_MEMORY_TEST (bool) [default False]
+   Use reduced version of tests which need less quantity of RAM memory
+   available.
+ - FORCE_GRAPHIC_TESTS_COMPILATION (bool) [default False]
+   Ignore system checks to look for graphic and acceleration support and
+   compile all the test suite.
+ - ENABLE_TESTS_COMPILATION (bool) [default True]
+   Enabled or disable the test suite compilation. 
+ - ENABLE_SCREEN_TESTS (bool) [default True]
+   Enable or disable tests that need screen rendering to run properly.
+   Headless machines or machines with the screen turned off should set this to
+   False 
+
 Uninstallation
 --------------
 Read the installation instructions (http://gazebosim.org/documentation.html) in the online manual for generic instructions.  For most people, the following sequence will suffice:
diff --git a/cmake/CheckDRIDisplay.cmake b/cmake/CheckDRIDisplay.cmake
index 0155c82..298c677 100644
--- a/cmake/CheckDRIDisplay.cmake
+++ b/cmake/CheckDRIDisplay.cmake
@@ -2,8 +2,17 @@
 # Check for existance of glxinfo application
 # Check for existance of support for pyopengl
 MESSAGE(STATUS "Looking for display capabilities")
+
+IF ((DEFINED FORCE_GRAPHIC_TESTS_COMPILATION) AND (${FORCE_GRAPHIC_TESTS_COMPILATION}))
+  SET (VALID_DISPLAY TRUE)
+  SET (VALID_DRI_DISPLAY TRUE)
+  MESSAGE(STATUS " + Force requested. All capabilities on without checking")
+  RETURN()
+ENDIF()
+
 SET (VALID_DISPLAY FALSE)
 SET (VALID_DRI_DISPLAY FALSE)
+SET (CHECKER_ERROR "(no glxinfo or pyopengl)")
 
 IF((DEFINED ENV{DISPLAY}) AND NOT ("$ENV{DISPLAY}" STREQUAL ""))
   MESSAGE(STATUS " + found a display available ($DISPLAY is set)")
@@ -25,6 +34,8 @@ IF((DEFINED ENV{DISPLAY}) AND NOT ("$ENV{DISPLAY}" STREQUAL ""))
     IF (GLX)
       MESSAGE(STATUS " + found a valid dri display (glxinfo)")
       SET (VALID_DRI_DISPLAY TRUE)
+    ELSE()
+      SET (CHECKER_ERROR "using glxinfo")
     ENDIF ()
   ELSE ()
     EXECUTE_PROCESS(
@@ -32,12 +43,20 @@ IF((DEFINED ENV{DISPLAY}) AND NOT ("$ENV{DISPLAY}" STREQUAL ""))
       # returns 0 if ok and 1 if error (inverse than cmake IF)
       COMMAND ${PROJECT_SOURCE_DIR}/tools/gl-test.py
       RESULT_VARIABLE GL_FAIL_RESULT
-      ERROR_QUIET
+      ERROR_VARIABLE GL_ERROR
       OUTPUT_QUIET)
 
     IF (NOT GL_FAIL_RESULT)
       MESSAGE(STATUS " + found a valid dri display (pyopengl)")
       SET (VALID_DRI_DISPLAY TRUE)
+   ELSE()
+      # Check error string: no python module means no pyopengl
+      STRING(FIND ${GL_ERROR} 
+              "ImportError: No module named OpenGL.GLUT" ERROR_POS)
+      # -1 will imply pyopengl is present but real DRI test fails
+      IF ("${ERROR_POS}" STREQUAL "-1")
+        SET (CHECKER_ERROR "using pyopengl")
+      ENDIF ()
     ENDIF ()
   ENDIF ()
 ENDIF ()
@@ -47,5 +66,5 @@ IF (NOT VALID_DISPLAY)
 ENDIF ()
 
 IF (NOT VALID_DRI_DISPLAY)
-  MESSAGE(STATUS " ! valid dri display not found")
+    MESSAGE(STATUS " ! valid dri display not found ${CHECKER_ERROR}")
 ENDIF ()
diff --git a/cmake/DefaultCFlags.cmake b/cmake/DefaultCFlags.cmake
new file mode 100644
index 0000000..9597067
--- /dev/null
+++ b/cmake/DefaultCFlags.cmake
@@ -0,0 +1,35 @@
+# Build type link flags
+set (CMAKE_LINK_FLAGS_RELEASE " " CACHE INTERNAL "Link flags for release" FORCE)
+set (CMAKE_LINK_FLAGS_RELWITHDEBINFO " " CACHE INTERNAL "Link flags for release with debug support" FORCE)
+set (CMAKE_LINK_FLAGS_DEBUG " " CACHE INTERNAL "Link flags for debug" FORCE)
+set (CMAKE_LINK_FLAGS_PROFILE " -pg" CACHE INTERNAL "Link flags for profile" FORCE)
+set (CMAKE_LINK_FLAGS_CHECK " --coverage" CACHE INTERNAL "Link flags for static code checking" FORCE)
+
+set (CMAKE_C_FLAGS_RELEASE "")
+if (NOT APPLE)
+  # -s doesn't work with default osx compiler clang, alternative:
+  # http://stackoverflow.com/questions/6085491/gcc-vs-clang-symbol-strippingu
+  set (CMAKE_C_FLAGS_RELEASE "-s")
+endif()
+set (CMAKE_C_FLAGS_RELEASE " ${CMAKE_C_FLAGS_RELEASE} -O3 -DNDEBUG ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for release" FORCE)
+set (CMAKE_CXX_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
+
+set (CMAKE_C_FLAGS_RELWITHDEBINFO " -g -O2 ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for release with debug support" FORCE)
+set (CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
+
+set (CMAKE_C_FLAGS_DEBUG " -ggdb3 ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for debug" FORCE)
+set (CMAKE_CXX_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
+
+set (CMAKE_C_FLAGS_PROFILE " -fno-omit-frame-pointer -g -pg ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for profile" FORCE)
+set (CMAKE_CXX_FLAGS_PROFILE ${CMAKE_C_FLAGS_PROFILE})
+
+set (CMAKE_C_FLAGS_CHECK " -g -O0 -Wformat=2 --coverage -fno-inline ${CMAKE_C_FLAGS_ALL}" CACHE INTERNAL "C Flags for static code checking" FORCE)
+set (CMAKE_CXX_FLAGS_CHECK "${CMAKE_C_FLAGS_CHECK} -fno-elide-constructors -fno-default-inline -fno-implicit-inline-templates")
+
+#####################################
+# Set all the global build flags
+set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
+set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
+set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_LINK_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
+set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_LINK_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
+set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_LINK_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
diff --git a/cmake/FindFreeimage.cmake b/cmake/FindFreeimage.cmake
index d942493..5550af7 100644
--- a/cmake/FindFreeimage.cmake
+++ b/cmake/FindFreeimage.cmake
@@ -1,25 +1,21 @@
 include (FindPkgConfig)
 include (${gazebo_cmake_dir}/GazeboUtils.cmake)
 
-set (freeimage_include_dir "/usr/include/" CACHE STRING "FreeImage include paths")
-set (freeimage_library_dir "/usr/lib" CACHE STRING "FreeImage library paths")
-set (freeimage_library "freeimage" CACHE STRING "FreeImage library")
-
 ########################################
 # Find packages
 if (PKG_CONFIG_FOUND)
-  pkg_check_modules(FI freeimage>=${FREEIMAGE_VERSION})
-  if (NOT FI_FOUND)
+  pkg_check_modules(freeimage freeimage>=${FREEIMAGE_VERSION})
+  if (NOT freeimage_FOUND)
     message (STATUS "  freeimage.pc not found, trying freeimage_include_dir and freeimage_library_dir flags.")
-  endif (NOT FI_FOUND)
+  endif (NOT freeimage_FOUND)
 endif (PKG_CONFIG_FOUND)
 
-if (NOT FI_FOUND)
-  find_path(freeimage_include_dir FreeImage.h ${freeimage_include_dir})
-  if (NOT freeimage_include_dir)
+if (NOT freeimage_FOUND)
+  find_path(freeimage_INCLUDE_DIRS FreeImage.h)
+  if (NOT freeimage_INCLUDE_DIRS)
     message (STATUS "  Looking for FreeImage.h - not found")
     BUILD_ERROR("Missing: Unable to find FreeImage.h")
-  else (NOT freeimage_include_dir)
+  else (NOT freeimage_INCLUDE_DIRS)
     # Check the FreeImage header for the right version
     set (testFreeImageSource ${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp/test_freeimage.cc)
     file (WRITE ${testFreeImageSource} 
@@ -31,31 +27,14 @@ if (NOT FI_FOUND)
     else (NOT FREEIMAGE_RUNS)
        message (STATUS "  Looking for FreeImage.h - found")
     endif (NOT FREEIMAGE_RUNS)
+  endif (NOT freeimage_INCLUDE_DIRS)
 
-  endif (NOT freeimage_include_dir)
-
-  find_library(freeimage_library freeimage ${freeimage_library_dir})
-  if (NOT freeimage_library)
+  find_library(freeimage_LIBRARIES freeimage)
+  if (NOT freeimage_LIBRARIES)
     message (STATUS "  Looking for libfreeimage - not found")
     BUILD_ERROR("Missing: Unable to find libfreeimage")
-  else (NOT freeimage_library)
+  else (NOT freeimage_LIBRARIES)
     message (STATUS "  Looking for libfreeimage - found")
-  endif (NOT freeimage_library)
-
-else (NOT FI_FOUND)
-  APPEND_TO_CACHED_LIST(gazeboserver_include_dirs 
-                        ${gazeboserver_include_dirs_desc} 
-                        ${FI_INCLUDE_DIRS})
-  APPEND_TO_CACHED_LIST(gazeboserver_link_dirs 
-                        ${gazeboserver_link_dirs_desc} 
-                        ${FI_LIBRARY_DIRS})
-  APPEND_TO_CACHED_LIST(gazeboserver_link_libs 
-                        ${gazeboserver_link_libs_desc} 
-                        ${FI_LINK_LIBS})
-  APPEND_TO_CACHED_LIST(gazeboserver_link_libs 
-                        ${gazeboserver_link_libs_desc} 
-                        ${FI_LIBRARIES})
-  APPEND_TO_CACHED_LIST(gazeboserver_link_libs 
-                        ${gazeboserver_link_libs_desc} 
-                        ${FI_LDFLAGS})
-endif (NOT FI_FOUND)
+    include_directories(${freeimage_INCLUDE_DIRS})
+  endif (NOT freeimage_LIBRARIES)
+endif (NOT freeimage_FOUND)
diff --git a/cmake/FindOS.cmake b/cmake/FindOS.cmake
index efc6d11..7a12f95 100644
--- a/cmake/FindOS.cmake
+++ b/cmake/FindOS.cmake
@@ -43,3 +43,13 @@ ELSEIF (PLAYER_OS_SOLARIS)
 ELSE (PLAYER_OS_LINUX)
     MESSAGE (STATUS "Operating system is generic Unix")
 ENDIF (PLAYER_OS_LINUX)
+
+#################################################
+# Check for non-case-sensitive filesystems
+execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/case_sensitive_filesystem
+                RESULT_VARIABLE FILESYSTEM_CASE_SENSITIVE_RETURN)
+if (${FILESYSTEM_CASE_SENSITIVE_RETURN} EQUAL 0)
+  set(FILESYSTEM_CASE_SENSITIVE TRUE)
+else()
+  set(FILESYSTEM_CASE_SENSITIVE FALSE)
+endif()
diff --git a/cmake/GazeboTestUtils.cmake b/cmake/GazeboTestUtils.cmake
new file mode 100644
index 0000000..b5d91ca
--- /dev/null
+++ b/cmake/GazeboTestUtils.cmake
@@ -0,0 +1,119 @@
+#################################################
+# Hack: extra sources to build binaries can be supplied to gz_build_tests in
+# the variable GZ_BUILD_TESTS_EXTRA_EXE_SRCS. This variable will be clean up
+# at the end of the function
+macro (gz_build_tests)
+  # Build all the tests
+  foreach(GTEST_SOURCE_file ${ARGN})
+    string(REGEX REPLACE ".cc" "" BINARY_NAME ${GTEST_SOURCE_file})
+    set(BINARY_NAME ${TEST_TYPE}_${BINARY_NAME})
+    if(USE_LOW_MEMORY_TESTS)
+      add_definitions(-DUSE_LOW_MEMORY_TESTS=1)
+    endif(USE_LOW_MEMORY_TESTS)
+    add_executable(${BINARY_NAME} ${GTEST_SOURCE_file} ${GZ_BUILD_TESTS_EXTRA_EXE_SRCS})
+
+    add_dependencies(${BINARY_NAME}
+      gtest gtest_main
+      gazebo_common
+      gazebo_math
+      gazebo_physics
+      gazebo_sensors
+      gazebo_rendering
+      gazebo_msgs
+      gazebo_transport
+      server_fixture
+      )
+
+
+    target_link_libraries(${BINARY_NAME}
+      libgtest.a
+      libgtest_main.a
+      ${CMAKE_BINARY_DIR}/test/libserver_fixture.a
+      gazebo_common
+      gazebo_math
+      gazebo_physics
+      gazebo_sensors
+      gazebo_rendering
+      gazebo_msgs
+      gazebo_transport
+      libgazebo
+      pthread
+      )
+
+    add_test(${BINARY_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
+	--gtest_output=xml:${CMAKE_BINARY_DIR}/test_results/${BINARY_NAME}.xml)
+
+    set_tests_properties(${BINARY_NAME} PROPERTIES TIMEOUT 240)
+
+    # Check that the test produced a result and create a failure if it didn't.
+    # Guards against crashed and timed out tests.
+    add_test(check_${BINARY_NAME} ${PROJECT_SOURCE_DIR}/tools/check_test_ran.py
+	${CMAKE_BINARY_DIR}/test_results/${BINARY_NAME}.xml)
+  endforeach()
+
+  set(GZ_BUILD_TESTS_EXTRA_EXE_SRCS "")
+endmacro()
+
+if (VALID_DISPLAY)
+  # Redefine build display tests
+  macro (gz_build_display_tests)
+    gz_build_tests(${ARGV})
+  endmacro()
+
+  # Redefine build qt tests
+  macro (gz_build_qt_tests)
+   # Build all the tests
+   foreach(QTEST_SOURCE_file ${ARGN})
+     string(REGEX REPLACE ".cc" "" BINARY_NAME ${QTEST_SOURCE_file})
+     string(REGEX REPLACE ".cc" ".hh" QTEST_HEADER_file ${QTEST_SOURCE_file})
+     set(BINARY_NAME ${TEST_TYPE}_${BINARY_NAME})
+     QT4_WRAP_CPP(${BINARY_NAME}_MOC ${QTEST_HEADER_file} ${CMAKE_SOURCE_DIR}/gazebo/gui/QTestFixture.hh)
+
+     add_executable(${BINARY_NAME}
+      ${${BINARY_NAME}_MOC} ${QTEST_SOURCE_file} ${CMAKE_SOURCE_DIR}/gazebo/gui/QTestFixture.cc)
+
+    add_dependencies(${BINARY_NAME}
+      gazebo_gui
+      gazebo_common
+      gazebo_math
+      gazebo_physics
+      gazebo_sensors
+      gazebo_rendering
+      gazebo_msgs
+      gazebo_transport
+      )
+
+    target_link_libraries(${BINARY_NAME}
+      gazebo_gui
+      gazebo_common
+      gazebo_math
+      gazebo_physics
+      gazebo_sensors
+      gazebo_rendering
+      gazebo_msgs
+      gazebo_transport
+      libgazebo
+      pthread
+      ${QT_QTTEST_LIBRARY}
+      ${QT_LIBRARIES}
+      )
+
+    # QTest need and extra -o parameter to write logging information to a file
+    add_test(${BINARY_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
+	-xml -o ${CMAKE_BINARY_DIR}/test_results/${BINARY_NAME}.xml)
+
+    set_tests_properties(${BINARY_NAME} PROPERTIES TIMEOUT 240)
+
+    # Check that the test produced a result and create a failure if it didn't.
+    # Guards against crashed and timed out tests.
+    add_test(check_${BINARY_NAME} ${PROJECT_SOURCE_DIR}/tools/check_test_ran.py
+	${CMAKE_BINARY_DIR}/test_results/${BINARY_NAME}.xml)
+    endforeach()
+  endmacro()
+endif()
+
+if (VALID_DRI_DISPLAY)
+  macro (gz_build_dri_tests)
+    gz_build_tests(${ARGV})
+  endmacro()
+endif()
diff --git a/cmake/GazeboUtils.cmake b/cmake/GazeboUtils.cmake
index 72e1b47..e5e0603 100644
--- a/cmake/GazeboUtils.cmake
+++ b/cmake/GazeboUtils.cmake
@@ -1,4 +1,3 @@
-
 ################################################################################
 #APPEND_TO_CACHED_STRING(_string _cacheDesc [items...])
 # Appends items to a cached list.
@@ -8,7 +7,7 @@ MACRO (APPEND_TO_CACHED_STRING _string _cacheDesc)
   ENDFOREACH (newItem ${ARGN})
   #STRING(STRIP ${${_string}} ${_string})
 ENDMACRO (APPEND_TO_CACHED_STRING)
-                 
+
 ################################################################################
 # APPEND_TO_CACHED_LIST (_list _cacheDesc [items...]
 # Appends items to a cached list.
@@ -24,8 +23,8 @@ ENDMACRO(APPEND_TO_CACHED_LIST)
 # Append sources to the server sources list
 MACRO (APPEND_TO_SERVER_SOURCES)
   FOREACH (src ${ARGN})
-    APPEND_TO_CACHED_LIST(gazeboserver_sources 
-                          ${gazeboserver_sources_desc}                   
+    APPEND_TO_CACHED_LIST(gazeboserver_sources
+                          ${gazeboserver_sources_desc}
                           ${CMAKE_CURRENT_SOURCE_DIR}/${src})
   ENDFOREACH (src ${ARGN})
 ENDMACRO (APPEND_TO_SERVER_SOURCES)
@@ -35,10 +34,10 @@ ENDMACRO (APPEND_TO_SERVER_SOURCES)
 MACRO (APPEND_TO_SERVER_HEADERS)
   FOREACH (src ${ARGN})
     APPEND_TO_CACHED_LIST(gazeboserver_headers
-                          ${gazeboserver_headers_desc}                   
+                          ${gazeboserver_headers_desc}
                           ${CMAKE_CURRENT_SOURCE_DIR}/${src})
     APPEND_TO_CACHED_LIST(gazeboserver_headers_nopath
-                          "gazeboserver_headers_nopath"                   
+                          "gazeboserver_headers_nopath"
                           ${src})
   ENDFOREACH (src ${ARGN})
 ENDMACRO (APPEND_TO_SERVER_HEADERS)
@@ -47,8 +46,8 @@ ENDMACRO (APPEND_TO_SERVER_HEADERS)
 # Append sources to the sensor sources list
 MACRO (APPEND_TO_SENSOR_SOURCES)
   FOREACH (src ${ARGN})
-    APPEND_TO_CACHED_LIST(gazebosensor_sources 
-                          ${gazebosensor_sources_desc}                   
+    APPEND_TO_CACHED_LIST(gazebosensor_sources
+                          ${gazebosensor_sources_desc}
                           ${CMAKE_CURRENT_SOURCE_DIR}/${src})
   ENDFOREACH (src ${ARGN})
 ENDMACRO (APPEND_TO_SENSOR_SOURCES)
@@ -57,8 +56,8 @@ ENDMACRO (APPEND_TO_SENSOR_SOURCES)
 # Append sources to the controller sources list
 MACRO (APPEND_TO_CONTROLLER_SOURCES)
   FOREACH (src ${ARGN})
-    APPEND_TO_CACHED_LIST(gazebocontroller_sources 
-                          ${gazebocontroller_sources_desc}                   
+    APPEND_TO_CACHED_LIST(gazebocontroller_sources
+                          ${gazebocontroller_sources_desc}
                           ${CMAKE_CURRENT_SOURCE_DIR}/${src})
   ENDFOREACH (src ${ARGN})
 ENDMACRO (APPEND_TO_CONTROLLER_SOURCES)
@@ -134,66 +133,42 @@ endmacro()
 
 #################################################
 macro (gz_setup_apple)
+  # NOTE MacOSX provides different system versions than CMake is parsing.
+  #      The following table lists the most recent OSX versions
+  #     9.x.x = Mac OSX Leopard (10.5)
+  #    10.x.x = Mac OSX Snow Leopard (10.6)
+  #    11.x.x = Mac OSX Lion (10.7)
+  #    12.x.x = Mac OSX Mountain Lion (10.8)
+  if (${CMAKE_SYSTEM_VERSION} LESS 10)
+    add_definitions(-DMAC_OS_X_VERSION=1050)
+  elseif (${CMAKE_SYSTEM_VERSION} GREATER 10 AND ${CMAKE_SYSTEM_VERSION} LESS 11)
+    add_definitions(-DMAC_OS_X_VERSION=1060)
+  elseif (${CMAKE_SYSTEM_VERSION} GREATER 11 AND ${CMAKE_SYSTEM_VERSION} LESS 12)
+    add_definitions(-DMAC_OS_X_VERSION=1070)
+  elseif (${CMAKE_SYSTEM_VERSION} GREATER 12 OR ${CMAKE_SYSTEM_VERSION} EQUAL 12)
+    add_definitions(-DMAC_OS_X_VERSION=1080)
+  else ()
+    add_definitions(-DMAC_OS_X_VERSION=0)
+  endif ()
+
   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined -Wl,dynamic_lookup")
 endmacro()
 
 # This should be migrated to more fine control solution based on set_property APPEND
-# directories. It's present on cmake 2.8.8 while precise version is 2.8.7  
+# directories. It's present on cmake 2.8.8 while precise version is 2.8.7
 link_directories(${PROJECT_BINARY_DIR}/test)
 include_directories("${PROJECT_SOURCE_DIR}/test/gtest/include")
 
 #################################################
-# Hack: extra sources to build binaries can be supplied to gz_build_tests in the variable
-#       GZ_BUILD_TESTS_EXTRA_EXE_SRCS. This variable will be clean up at the end of the function
-macro (gz_build_tests)
-  # Build all the tests
-  foreach(GTEST_SOURCE_file ${ARGN})
-    string(REGEX REPLACE ".cc" "" BINARY_NAME ${GTEST_SOURCE_file})
-    add_executable(${BINARY_NAME} ${GTEST_SOURCE_file} ${GZ_BUILD_TESTS_EXTRA_EXE_SRCS})
-
-    add_dependencies(${BINARY_NAME}
-      gtest gtest_main
-      gazebo_sdf_interface
-      gazebo_common
-      gazebo_math
-      gazebo_physics
-      gazebo_sensors
-      gazebo_rendering
-      gazebo_msgs
-      gazebo_transport)
-  
-    target_link_libraries(${BINARY_NAME}
-      libgtest.a
-      libgtest_main.a
-      gazebo_sdf_interface
-      gazebo_common
-      gazebo_math
-      gazebo_physics
-      gazebo_sensors
-      gazebo_rendering
-      gazebo_msgs
-      gazebo_transport
-      libgazebo
-      pthread
-      )
-  
-    add_test(${BINARY_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}
-      --gtest_output=xml:${CMAKE_BINARY_DIR}/test_results/${BINARY_NAME}.xml)
-  
-    set_tests_properties(${BINARY_NAME} PROPERTIES TIMEOUT 240)
-  
-    # Check that the test produced a result and create a failure if it didn't.
-    # Guards against crashed and timed out tests.
-    add_test(check_${BINARY_NAME} ${PROJECT_SOURCE_DIR}/tools/check_test_ran.py
-             ${CMAKE_BINARY_DIR}/test_results/${BINARY_NAME}.xml)
-  endforeach()
+# Enable tests compilation by default
+if (NOT DEFINED ENABLE_TESTS_COMPILATION)
+  set (ENABLE_TESTS_COMPILATION True)
+endif()
 
-  set(GZ_BUILD_TESTS_EXTRA_EXE_SRCS "")
+# Define testing macros as empty and redefine them if support is found and 
+# ENABLE_TESTS_COMPILATION is set to true
+macro (gz_build_tests)
 endmacro()
-
-#################################################
-
-# Define GUI testing macros as empty and redefine them if support is found
 macro (gz_build_qt_tests)
 endmacro()
 macro (gz_build_display_tests)
@@ -201,64 +176,20 @@ endmacro()
 macro (gz_build_dri_tests)
 endmacro()
 
-if (VALID_DISPLAY)
-  # Redefine build display tests
-  macro (gz_build_display_tests)
-    gz_build_tests(${ARGV})
-  endmacro()
-
-  # Redefine build qt tests
-  macro (gz_build_qt_tests)
-   # Build all the tests
-   foreach(QTEST_SOURCE_file ${ARGN})
-     string(REGEX REPLACE ".cc" "" BINARY_NAME ${QTEST_SOURCE_file})
-     string(REGEX REPLACE ".cc" ".hh" QTEST_HEADER_file ${QTEST_SOURCE_file})
-     QT4_WRAP_CPP(${BINARY_NAME}_MOC ${QTEST_HEADER_file} QTestFixture.hh)
-
-     add_executable(${BINARY_NAME}
-      ${${BINARY_NAME}_MOC} ${QTEST_SOURCE_file} QTestFixture.cc)
-
-    add_dependencies(${BINARY_NAME}
-      gazebo_gui
-      gazebo_sdf_interface
-      gazebo_common
-      gazebo_math
-      gazebo_physics
-      gazebo_sensors
-      gazebo_rendering
-      gazebo_msgs
-      gazebo_transport)
-
-    target_link_libraries(${BINARY_NAME}
-      gazebo_gui
-      gazebo_sdf_interface
-      gazebo_common
-      gazebo_math
-      gazebo_physics
-      gazebo_sensors
-      gazebo_rendering
-      gazebo_msgs
-      gazebo_transport
-      libgazebo
-      pthread
-      ${QT_QTTEST_LIBRARY}
-      ${QT_LIBRARIES}
-      )
-
-    add_test(${BINARY_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME} -xml)
-
-    set_tests_properties(${BINARY_NAME} PROPERTIES TIMEOUT 240)
-
-    # Check that the test produced a result and create a failure if it didn't.
-    # Guards against crashed and timed out tests.
-    add_test(check_${BINARY_NAME} ${PROJECT_SOURCE_DIR}/tools/check_test_ran.py
-             ${CMAKE_BINARY_DIR}/test_results/${BINARY_NAME}.xml)
-    endforeach()
-  endmacro()
+if (ENABLE_TESTS_COMPILATION)
+  include (${gazebo_cmake_dir}/GazeboTestUtils.cmake)
 endif()
 
-if (VALID_DRI_DISPLAY)
-  macro (gz_build_dri_tests)
-    gz_build_tests(${ARGV})
-  endmacro()
-endif()
+#################################################
+# Macro to setup supported compiler flags
+# Based on work of Florent Lamiraux, Thomas Moulard, JRL, CNRS/AIST. 
+include(CheckCXXCompilerFlag)
+
+macro(filter_valid_compiler_flags) 
+  foreach(flag ${ARGN})
+    CHECK_CXX_COMPILER_FLAG(${flag} R${flag})
+    if(${R${flag}})
+      set(VALID_CXX_FLAGS "${VALID_CXX_FLAGS} ${flag}")
+    endif()
+  endforeach()
+endmacro()
diff --git a/cmake/HostCFlags.cmake b/cmake/HostCFlags.cmake
new file mode 100644
index 0000000..c40e166
--- /dev/null
+++ b/cmake/HostCFlags.cmake
@@ -0,0 +1,28 @@
+include (${gazebo_cmake_dir}/FindSSE.cmake)
+
+if (SSE2_FOUND)
+  set (CMAKE_C_FLAGS_ALL "-msse -msse2 ${CMAKE_C_FLAGS_ALL}")
+  if (NOT APPLE)
+    set (CMAKE_C_FLAGS_ALL "-mfpmath=sse ${CMAKE_C_FLAGS_ALL}")
+  endif()
+endif()
+
+if (SSE3_FOUND)
+  set (CMAKE_C_FLAGS_ALL "-msse3 ${CMAKE_C_FLAGS_ALL}")
+endif()
+if (SSSE3_FOUND)
+  set (CMAKE_C_FLAGS_ALL "-mssse3 ${CMAKE_C_FLAGS_ALL}")
+endif()
+
+if (ENABLE_SSE4)
+  message(STATUS "\nSSE4 will be enabled if system supports it.\n")
+  if (SSE4_1_FOUND)
+    set (CMAKE_C_FLAGS_ALL "-msse4.1 ${CMAKE_C_FLAGS_ALL}")
+  endif()
+  if (SSE4_2_FOUND)
+    set (CMAKE_C_FLAGS_ALL "-msse4.2 ${CMAKE_C_FLAGS_ALL}")
+  endif()
+else()
+  message(STATUS "\nSSE4 disabled.\n")
+endif()
+
diff --git a/cmake/Man.cmake b/cmake/Man.cmake
new file mode 100644
index 0000000..899a4f6
--- /dev/null
+++ b/cmake/Man.cmake
@@ -0,0 +1,34 @@
+macro(ADD_MANPAGE_TARGET)
+  # It is not possible add a dependency to target 'install'
+  # Run hard-coded 'make man' when 'make install' is invoked
+  install(CODE "EXECUTE_PROCESS(COMMAND make man)")
+  add_custom_target(man)
+endmacro(ADD_MANPAGE_TARGET)
+
+find_program(GZIP gzip)
+
+if (NOT GZIP)
+  BUILD_WARNING ("gzip not found, manpages won't be generated")
+  macro(roffman MANFILE)
+  endmacro(roffman)
+else (NOT GZIP)
+  message (STATUS "Looking for gzip to generate manpages - found")
+
+  macro(roffman _source _section)
+    add_custom_command(
+      OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_source}.${_section}.gz
+      COMMAND ${GZIP} -c ${CMAKE_CURRENT_SOURCE_DIR}/${_source}.${_section}.roff
+        > ${CMAKE_CURRENT_BINARY_DIR}/${_source}.${_section}.gz
+    )
+
+    set(MANPAGE_TARGET "man-${_source}")
+
+    add_custom_target(${MANPAGE_TARGET}
+      DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_source}.${_section}.gz)
+    add_dependencies(man ${MANPAGE_TARGET})
+
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_source}.${_section}.gz
+      DESTINATION share/man/man${_section}
+    )
+  endmacro(roffman _source _section)
+endif(NOT GZIP)
diff --git a/cmake/Ronn2Man.cmake b/cmake/Ronn2Man.cmake
new file mode 100644
index 0000000..d474d05
--- /dev/null
+++ b/cmake/Ronn2Man.cmake
@@ -0,0 +1,52 @@
+#
+# Based on work of Emmanuel Roullit <emmanuel at netsniff-ng.org>
+# Copyright 2009, 2012 Emmanuel Roullit.
+# Subject to the GPL, version 2.
+#
+FIND_PROGRAM(RONN ronn)
+FIND_PROGRAM(GZIP gzip)
+
+IF (NOT RONN OR NOT GZIP)
+  IF (NOT RONN)
+    BUILD_WARNING ("ronn not found, manpages won't be generated")
+  ENDIF(NOT RONN)
+  IF (NOT GZIP)
+    BUILD_WARNING ("gzip not found, manpages won't be generated")
+  ENDIF(NOT GZIP)
+  # empty macro
+  MACRO(manpage MANFILE)
+  ENDMACRO(manpage)
+  SET (MANPAGES_SUPPORT FALSE)
+ELSE (NOT RONN OR NOT GZIP)
+  MESSAGE (STATUS "Looking for ronn to generate manpages - found")
+  SET (MANPAGES_SUPPORT TRUE)
+
+  MACRO(manpage RONNFILE SECTION)
+    SET(RONNFILE_FULL_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${RONNFILE})
+
+    ADD_CUSTOM_COMMAND(
+      OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${RONNFILE}.${SECTION}
+      DEPENDS ${RONNFILE}
+      COMMAND ${RONN}
+         ARGS -r --pipe ${RONNFILE_FULL_PATH}.${SECTION}.ronn
+         > ${CMAKE_CURRENT_BINARY_DIR}/${RONNFILE}.${SECTION}
+    )
+
+    ADD_CUSTOM_COMMAND(
+      OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${RONNFILE}.${SECTION}.gz
+      DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${RONNFILE}.${SECTION}
+      COMMAND ${GZIP} -c ${CMAKE_CURRENT_BINARY_DIR}/${RONNFILE}.${SECTION}
+        > ${CMAKE_CURRENT_BINARY_DIR}/${RONNFILE}.${SECTION}.gz
+    )
+
+    SET(MANPAGE_TARGET "man-${RONNFILE}")
+
+    ADD_CUSTOM_TARGET(${MANPAGE_TARGET} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${RONNFILE}.${SECTION}.gz)
+    ADD_DEPENDENCIES(man ${MANPAGE_TARGET})
+
+    INSTALL(
+      FILES ${CMAKE_CURRENT_BINARY_DIR}/${RONNFILE}.${SECTION}.gz
+      DESTINATION share/man/man${SECTION}
+    )
+  ENDMACRO(manpage RONNFILE SECTION)
+ENDIF(NOT RONN OR NOT GZIP)
diff --git a/cmake/SearchForStuff.cmake b/cmake/SearchForStuff.cmake
index 36bf3be..71d75cc 100644
--- a/cmake/SearchForStuff.cmake
+++ b/cmake/SearchForStuff.cmake
@@ -1,5 +1,4 @@
 include (${gazebo_cmake_dir}/GazeboUtils.cmake)
-include (${gazebo_cmake_dir}/FindSSE.cmake)
 include (CheckCXXSourceCompiles)
 
 include (${gazebo_cmake_dir}/FindOS.cmake)
@@ -57,9 +56,23 @@ else ()
 endif ()
 
 ########################################
+include (FindOpenAL)
+if (NOT OPENAL_FOUND)
+  BUILD_WARNING ("OpenAL not found, audio support will be disabled.")
+  set (HAVE_OPENAL OFF CACHE BOOL "HAVE OpenAL" FORCE)
+else ()
+  set (HAVE_OPENAL ON CACHE BOOL "HAVE OpenAL" FORCE)
+endif ()
+
+########################################
 # Find packages
 if (PKG_CONFIG_FOUND)
 
+  pkg_check_modules(SDF sdformat>=2.0.0)
+  if (NOT SDF_FOUND)
+    BUILD_ERROR ("Missing: SDF. Required for reading and writing SDF files.")
+  endif()
+
   pkg_check_modules(CURL libcurl)
   if (NOT CURL_FOUND)
     BUILD_ERROR ("Missing: libcurl. Required for connection to model database.")
@@ -104,50 +117,81 @@ if (PKG_CONFIG_FOUND)
       BUILD_WARNING ("CEGUI-OGRE not found, opengl GUI will be disabled.")
       set (HAVE_CEGUI OFF CACHE BOOL "HAVE CEGUI" FORCE)
     else()
-      set (HAVE_CEGUI ON CACHE BOOL "HAVE CEGUI" FORCE)
+      set (HAVE_CEGUI ON CACHE BOOL "HAVE CEGUI")
       set (CEGUI_LIBRARIES "CEGUIBase;CEGUIOgreRenderer")
       message (STATUS "Looking for CEGUI-OGRE, found")
     endif()
   endif()
 
   #################################################
-  # Find bullet
-  pkg_check_modules(BULLET bullet>=2.81)
-  if (BULLET_FOUND)
-    set (HAVE_BULLET TRUE)
+  # Find Simbody
+  set(SimTK_INSTALL_DIR ${SimTK_INSTALL_PREFIX})
+  #list(APPEND CMAKE_MODULE_PATH ${SimTK_INSTALL_PREFIX}/share/cmake) 
+  find_package(Simbody)
+  if (SIMBODY_FOUND)
+    set (HAVE_SIMBODY TRUE)
   else()
-    set (HAVE_BULLET FALSE)
+    BUILD_WARNING ("Simbody not found, for simbody physics engine option, please install libsimbody-dev.")
+    set (HAVE_SIMBODY FALSE)
+  endif()
+
+  #################################################
+  # Find DART
+  find_package(DARTCore)
+  if (DARTCore_FOUND)
+    message (STATUS "Looking for DARTCore - found")
+    set (HAVE_DART TRUE)
+  else()
+    BUILD_WARNING ("DART not found, for dart physics engine option, please install libdart-core3.")
+    set (HAVE_DART FALSE)
   endif()
 
   #################################################
   # Find tinyxml. Only debian distributions package tinyxml with a pkg-config
-  find_path (tinyxml_include_dir tinyxml.h ${tinyxml_include_dirs} ENV CPATH)
-  if (NOT tinyxml_include_dir)
+  # Use pkg_check_modules and fallback to manual detection (needed, at least, for MacOS)
+  pkg_check_modules(tinyxml tinyxml)
+  if (NOT tinyxml_FOUND)
+      find_path (tinyxml_INCLUDE_DIRS tinyxml.h ${tinyxml_INCLUDE_DIRS} ENV CPATH)
+      find_library(tinyxml_LIBRARIES NAMES tinyxml)
+      set (tinyxml_FAIL False) 
+      if (NOT tinyxml_INCLUDE_DIRS)
+        message (STATUS "Looking for tinyxml headers - not found")
+        set (tinyxml_FAIL True) 
+      endif()
+      if (NOT tinyxml_LIBRARIES)
+        message (STATUS "Looking for tinyxml library - not found")
+        set (tinyxml_FAIL True) 
+      endif()
+  endif()
+        
+  if (tinyxml_FAIL)
     message (STATUS "Looking for tinyxml.h - not found")
     BUILD_ERROR("Missing: tinyxml")
-  else ()
-    message (STATUS "Looking for tinyxml.h - found")
-    set (tinyxml_include_dirs ${tinyxml_include_dir} CACHE STRING
-      "tinyxml include paths. Use this to override automatic detection.")
-    set (tinyxml_libraries "tinyxml" CACHE INTERNAL "tinyxml libraries")
-  endif ()
+  endif()
 
   #################################################
   # Find libtar.
-  find_path (libtar_include_dir libtar.h /usr/include /usr/local/include ENV CPATH)
-  if (NOT libtar_include_dir)
+  find_path (libtar_INCLUDE_DIRS libtar.h)
+  find_library(libtar_LIBRARIES tar)
+  set (LIBTAR_FOUND True)
+
+  if (NOT libtar_INCLUDE_DIRS)
     message (STATUS "Looking for libtar.h - not found")
-    BUILD_ERROR("Missing: libtar")
+    set (LIBTAR_FOUND False)
   else ()
     message (STATUS "Looking for libtar.h - found")
-    set (libtar_libraries "tar" CACHE INTERNAL "tinyxml libraries")
+    include_directories(${libtar_INCLUDE_DIRS})
+  endif ()
+  if (NOT libtar_LIBRARIES)
+    message (STATUS "Looking for libtar.so - not found")
+    set (LIBTAR_FOUND False)
+  else ()
+    message (STATUS "Looking for libtar.so - found")
   endif ()
 
-  #################################################
-  # Use internal CCD (built as libgazebo_ccd.so)
-  #
-  set(CCD_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/deps/libccd/include")
-  set(CCD_LIBRARIES gazebo_ccd)
+  if (NOT LIBTAR_FOUND)
+     BUILD_ERROR("Missing: libtar")
+  endif()
 
   #################################################
   # Find TBB
@@ -186,9 +230,14 @@ if (PKG_CONFIG_FOUND)
   endif ()
 
   pkg_check_modules(OGRE OGRE>=${MIN_OGRE_VERSION})
+  # There are some runtime problems to solve with ogre-1.9. 
+  # Please read gazebo issues: 994, 995, 996
+  pkg_check_modules(MAX_VALID_OGRE OGRE<=1.8.9)
   if (NOT OGRE_FOUND)
     BUILD_ERROR("Missing: Ogre3d version >=${MIN_OGRE_VERSION}(http://www.orge3d.org)")
-  else (NOT OGRE_FOUND)
+  elseif (NOT MAX_VALID_OGRE_FOUND)
+    BUILD_ERROR("Bad Ogre3d version: gazebo using ${OGRE_VERSION} ogre version has known bugs in runtime (issue #996). Please use 1.7 or 1.8 series")
+  else ()
     set(ogre_ldflags ${ogre_ldflags} ${OGRE_LDFLAGS})
     set(ogre_include_dirs ${ogre_include_dirs} ${OGRE_INCLUDE_DIRS})
     set(ogre_libraries ${ogre_libraries};${OGRE_LIBRARIES})
@@ -196,9 +245,6 @@ if (PKG_CONFIG_FOUND)
     set(ogre_cflags ${ogre_cflags} ${OGRE_CFLAGS})
   endif ()
 
-  set (OGRE_INCLUDE_DIRS ${ogre_include_dirs}
-       CACHE INTERNAL "Ogre include path")
-
   pkg_check_modules(OGRE-Terrain OGRE-Terrain)
   if (OGRE-Terrain_FOUND)
     set(ogre_ldflags ${ogre_ldflags} ${OGRE-Terrain_LDFLAGS})
@@ -208,6 +254,19 @@ if (PKG_CONFIG_FOUND)
     set(ogre_cflags ${ogre_cflags} ${OGRE-Terrain_CFLAGS})
   endif()
 
+  pkg_check_modules(OGRE-Overlay OGRE-Overlay)
+  if (OGRE-Overlay_FOUND)
+    set(ogre_ldflags ${ogre_ldflags} ${OGRE-Overlay_LDFLAGS})
+    set(ogre_include_dirs ${ogre_include_dirs} ${OGRE-Overlay_INCLUDE_DIRS})
+    set(ogre_libraries ${ogre_libraries};${OGRE-Overlay_LIBRARIES})
+    set(ogre_library_dirs ${ogre_library_dirs} ${OGRE-Overlay_LIBRARY_DIRS})
+    set(ogre_cflags ${ogre_cflags} ${OGRE-Overlay_CFLAGS})
+  endif()
+
+
+  set (OGRE_INCLUDE_DIRS ${ogre_include_dirs}
+       CACHE INTERNAL "Ogre include path")
+
   # Also find OGRE's plugin directory, which is provided in its .pc file as the
   # `plugindir` variable.  We have to call pkg-config manually to get it.
   execute_process(COMMAND pkg-config --variable=plugindir OGRE
@@ -220,6 +279,14 @@ if (PKG_CONFIG_FOUND)
     set (OGRE_PLUGINDIR ${_pkgconfig_invoke_result})
   endif()
 
+  ########################################
+  # Check and find libccd (if needed)
+  pkg_check_modules(CCD ccd>=1.4)
+  if (NOT CCD_FOUND)
+    message(STATUS "Using internal copy of libccd")
+    set(CCD_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/deps/libccd/include")
+    set(CCD_LIBRARIES gazebo_ccd)
+  endif()
 
   ########################################
   # Find OpenAL
@@ -236,6 +303,9 @@ if (PKG_CONFIG_FOUND)
   pkg_check_modules(libswscale libswscale)
   if (NOT libswscale_FOUND)
     BUILD_WARNING ("libswscale not found. Audio-video capabilities will be disabled.")
+  else()
+    include_directories(${libswscale_INCLUDE_DIRS})
+    link_directories(${libswscale_LIBRARY_DIRS})
   endif ()
 
   ########################################
@@ -243,6 +313,9 @@ if (PKG_CONFIG_FOUND)
   pkg_check_modules(libavformat libavformat)
   if (NOT libavformat_FOUND)
     BUILD_WARNING ("libavformat not found. Audio-video capabilities will be disabled.")
+  else()
+    include_directories(${libavformat_INCLUDE_DIRS})
+    link_directories(${libavformat_LIBRARY_DIRS})
   endif ()
 
   ########################################
@@ -250,56 +323,33 @@ if (PKG_CONFIG_FOUND)
   pkg_check_modules(libavcodec libavcodec)
   if (NOT libavcodec_FOUND)
     BUILD_WARNING ("libavcodec not found. Audio-video capabilities will be disabled.")
-  endif ()
-
-  if (libavformat_FOUND AND libavcodec_FOUND AND libswscale)
-    set (HAVE_FFMPEG TRUE)
+  else()
+    include_directories(${libavcodec_INCLUDE_DIRS})
+    link_directories(${libavcodec_LIBRARY_DIRS})
   endif ()
 
   ########################################
-  # Find urdfdom and urdfdom_headers
-  # look for the cmake modules first, and .pc pkg_config second
-  find_package(urdfdom_headers QUIET)
-  if (NOT urdfdom_headers_FOUND)
-    pkg_check_modules(urdfdom_headers urdfdom_headers)
-    if (NOT urdfdom_headers_FOUND)
-      BUILD_WARNING ("urdfdom_headers not found, urdf parser will not be built.")
-    endif ()
-  endif ()
-  if (urdfdom_headers_FOUND)
-    set (HAVE_URDFDOM_HEADERS TRUE)
+  # Find avutil
+  pkg_check_modules(libavutil libavutil)
+  if (NOT libavutil_FOUND)
+    BUILD_WARNING ("libavutil not found. Audio-video capabilities will be disabled.")
   endif ()
 
-  find_package(urdfdom QUIET)
-  if (NOT urdfdom_FOUND)
-    pkg_check_modules(urdfdom urdfdom)
-    if (NOT urdfdom_FOUND)
-      BUILD_WARNING ("urdfdom not found, urdf parser will not be built.")
-    endif ()
-  endif ()
-  if (urdfdom_FOUND)
-    set (HAVE_URDFDOM TRUE)
-  endif ()
 
-  find_package(console_bridge QUIET)
-  if (NOT console_bridge_FOUND)
-    pkg_check_modules(console_bridge console_bridge)
-    if (NOT console_bridge_FOUND)
-      BUILD_WARNING ("console_bridge not found, urdf parser will not be built.")
-    endif ()
-  endif ()
-  if (console_bridge_FOUND)
-    set (HAVE_CONSOLE_BRIDGE TRUE)
+  if (libavutil_FOUND AND libavformat_FOUND AND libavcodec_FOUND AND libswscale_FOUND)
+    set (HAVE_FFMPEG TRUE)
+  else ()
+    set (HAVE_FFMPEG FALSE)
   endif ()
 
   ########################################
   # Find Player
-  pkg_check_modules(PLAYER playercore>=3.0 playerc++)
+  pkg_check_modules(PLAYER playercore>=3.0 playerc++ playerwkb)
   if (NOT PLAYER_FOUND)
-    set (INCLUDE_PLAYER OFF CACHE BOOL "Build gazebo plugin for player" FORCE)
+    set (INCLUDE_PLAYER OFF CACHE BOOL "Build gazebo plugin for player")
     BUILD_WARNING ("Player not found, gazebo plugin for player will not be built.")
   else (NOT PLAYER_FOUND)
-    set (INCLUDE_PLAYER ON CACHE BOOL "Build gazebo plugin for player" FORCE)
+    set (INCLUDE_PLAYER ON CACHE BOOL "Build gazebo plugin for player")
     set (PLAYER_INCLUDE_DIRS ${PLAYER_INCLUDE_DIRS} CACHE INTERNAL
          "Player include directory")
     set (PLAYER_LINK_DIRS ${PLAYER_LINK_DIRS} CACHE INTERNAL
@@ -321,11 +371,21 @@ if (PKG_CONFIG_FOUND)
 
   #################################################
   # Find bullet
-  pkg_check_modules(BULLET bullet)
+  # First and preferred option is to look for bullet standard pkgconfig, 
+  # so check it first. if it is not present, check for the OSRF 
+  # custom bullet2.82.pc file
+  pkg_check_modules(BULLET bullet>=2.82)
+  if (NOT BULLET_FOUND)
+     pkg_check_modules(BULLET bullet2.82>=2.82)
+  endif()
+
   if (BULLET_FOUND)
     set (HAVE_BULLET TRUE)
+    add_definitions( -DLIBBULLET_VERSION=${BULLET_VERSION} )
   else()
     set (HAVE_BULLET FALSE)
+    add_definitions( -DLIBBULLET_VERSION=0.0 )
+    BUILD_WARNING ("Bullet > 2.82 not found, for bullet physics engine option, please install libbullet2.82-dev.")
   endif()
 
 else (PKG_CONFIG_FOUND)
@@ -348,137 +408,6 @@ if (NOT Boost_FOUND)
   BUILD_ERROR ("Boost not found. Please install thread signals system filesystem program_options regex date_time boost version ${MIN_BOOST_VERSION} or higher.")
 endif()
 
-########################################
-# Find urdfdom_headers
-IF (NOT HAVE_URDFDOM_HEADERS)
-  SET (urdfdom_search_path /usr/include)
-  FIND_PATH(URDFDOM_HEADERS_PATH urdf_model/model.h ${urdfdom_search_path})
-  IF (NOT URDFDOM_HEADERS_PATH)
-    MESSAGE (STATUS "Looking for urdf_model/model.h - not found")
-    BUILD_WARNING ("model.h not found. urdf parser will not be built")
-  ELSE (NOT URDFDOM_HEADERS_PATH)
-    MESSAGE (STATUS "Looking for model.h - found")
-    SET (HAVE_URDFDOM_HEADERS TRUE)
-    SET (URDFDOM_HEADERS_PATH /usr/include)
-  ENDIF (NOT URDFDOM_HEADERS_PATH)
-
-ELSE (NOT HAVE_URDFDOM_HEADERS)
-
-  SET (URDFDOM_HEADERS_PATH /usr/include)
-  MESSAGE (STATUS "found urdf_model/model.h - found")
-
-ENDIF (NOT HAVE_URDFDOM_HEADERS)
-
-########################################
-# Find urdfdom
-IF (NOT HAVE_URDFDOM)
-  SET (urdfdom_search_path
-    /usr/include /usr/local/include
-    /usr/include/urdf_parser
-  )
-
-  FIND_PATH(URDFDOM_PATH urdf_parser.h ${urdfdom_search_path})
-  IF (NOT URDFDOM_PATH)
-    MESSAGE (STATUS "Looking for urdf_parser/urdf_parser.h - not found")
-    BUILD_WARNING ("urdf_parser.h not found. urdf parser will not be built")
-    SET (URDFDOM_PATH /usr/include)
-  ELSE (NOT URDFDOM_PATH)
-    MESSAGE (STATUS "Looking for urdf_parser.h - found")
-    SET (HAVE_URDFDOM TRUE)
-    SET (URDFDOM_PATH /usr/include)
-  ENDIF (NOT URDFDOM_PATH)
-
-ELSE (NOT HAVE_URDFDOM)
-
-  MESSAGE (STATUS "found urdf_parser/urdf_parser.h - found")
-
-ENDIF (NOT HAVE_URDFDOM)
-
-########################################
-# Find console_bridge
-IF (NOT HAVE_CONSOLE_BRIDGE)
-  SET (console_bridge_search_path
-    /usr/include /usr/local/include
-  )
-
-  FIND_PATH(CONSOLE_BRIDGE_PATH console_bridge/console.h ${console_bridge_search_path})
-  IF (NOT CONSOLE_BRIDGE_PATH)
-    MESSAGE (STATUS "Looking for console_bridge/console.h - not found")
-    BUILD_WARNING ("console.h not found. urdf parser (depends on console_bridge) will not be built")
-    SET (CONSOLE_BRIDGE_PATH /usr/include)
-  ELSE (NOT CONSOLE_BRIDGE_PATH)
-    MESSAGE (STATUS "Looking for console.h - found")
-    SET (HAVE_CONSOLE_BRIDGE TRUE)
-    SET (CONSOLE_BRIDGE_PATH /usr/include)
-  ENDIF (NOT CONSOLE_BRIDGE_PATH)
-
-ELSE (NOT HAVE_CONSOLE_BRIDGE)
-
-  MESSAGE (STATUS "found console_bridge/console.h - found")
-
-ENDIF (NOT HAVE_CONSOLE_BRIDGE)
-
-
-########################################
-# Find avformat and avcodec
-IF (HAVE_FFMPEG)
-  SET (libavformat_search_path
-    /usr/include /usr/include/libavformat /usr/local/include
-    /usr/local/include/libavformat /usr/include/ffmpeg
-  )
-
-  SET (libavcodec_search_path
-    /usr/include /usr/include/libavcodec /usr/local/include
-    /usr/local/include/libavcodec /usr/include/ffmpeg
-  )
-
-  FIND_PATH(LIBAVFORMAT_PATH avformat.h ${libavformat_search_path})
-  IF (NOT LIBAVFORMAT_PATH)
-    MESSAGE (STATUS "Looking for avformat.h - not found")
-    BUILD_WARNING ("avformat.h not found. audio/video will not be built")
-    SET (LIBAVFORMAT_PATH /usr/include)
-  ELSE (NOT LIBAVFORMAT_PATH)
-    MESSAGE (STATUS "Looking for avformat.h - found")
-  ENDIF (NOT LIBAVFORMAT_PATH)
-
-  FIND_PATH(LIBAVCODEC_PATH avcodec.h ${libavcodec_search_path})
-  IF (NOT LIBAVCODEC_PATH)
-    MESSAGE (STATUS "Looking for avcodec.h - not found")
-    BUILD_WARNING ("avcodec.h not found. audio/video will not be built")
-    SET (LIBAVCODEC_PATH /usr/include)
-  ELSE (NOT LIBAVCODEC_PATH)
-    MESSAGE (STATUS "Looking for avcodec.h - found")
-  ENDIF (NOT LIBAVCODEC_PATH)
-
-ELSE (HAVE_FFMPEG)
-  SET (LIBAVFORMAT_PATH /usr/include)
-  SET (LIBAVCODEC_PATH /usr/include)
-ENDIF (HAVE_FFMPEG)
-
-########################################
-# Find libtool
-find_path(libtool_include_dir ltdl.h /usr/include /usr/local/include)
-if (NOT libtool_include_dir)
-  message (STATUS "Looking for ltdl.h - not found")
-  BUILD_WARNING ("ltdl.h not found")
-  set (libtool_include_dir /usr/include)
-else (NOT libtool_include_dir)
-  message (STATUS "Looking for ltdl.h - found")
-endif (NOT libtool_include_dir)
-
-find_library(libtool_library ltdl /usr/lib /usr/local/lib)
-if (NOT libtool_library)
-  message (STATUS "Looking for libltdl - not found")
-else (NOT libtool_library)
-  message (STATUS "Looking for libltdl - found")
-endif (NOT libtool_library)
-
-if (libtool_library AND libtool_include_dir)
-  set (HAVE_LTDL TRUE)
-else ()
-  set (HAVE_LTDL FALSE)
-  set (libtool_library "" CACHE STRING "" FORCE)
-endif ()
 
 
 ########################################
@@ -486,7 +415,7 @@ endif ()
 find_path(libdl_include_dir dlfcn.h /usr/include /usr/local/include)
 if (NOT libdl_include_dir)
   message (STATUS "Looking for dlfcn.h - not found")
-  BUILD_WARNING ("dlfcn.h not found, plugins will not be supported.")
+  BUILD_ERROR ("Missing libdl: Required for plugins.")
   set (libdl_include_dir /usr/include)
 else (NOT libdl_include_dir)
   message (STATUS "Looking for dlfcn.h - found")
@@ -495,18 +424,30 @@ endif ()
 find_library(libdl_library dl /usr/lib /usr/local/lib)
 if (NOT libdl_library)
   message (STATUS "Looking for libdl - not found")
-  BUILD_WARNING ("libdl not found, plugins will not be supported.")
+  BUILD_ERROR ("Missing libdl: Required for plugins.")
 else (NOT libdl_library)
   message (STATUS "Looking for libdl - found")
 endif ()
 
-if (libdl_library AND libdl_include_dir)
-  SET (HAVE_DL TRUE)
-else (libdl_library AND libdl_include_dir)
-  SET (HAVE_DL FALSE)
+########################################
+# Find gdal
+include (FindGDAL)
+if (NOT GDAL_FOUND)
+  message (STATUS "Looking for libgdal - not found")
+  BUILD_WARNING ("GDAL not found, Digital elevation terrains support will be disabled.")
+  set (HAVE_GDAL OFF CACHE BOOL "HAVE GDAL" FORCE)
+else ()
+  message (STATUS "Looking for libgdal - found")
+  set (HAVE_GDAL ON CACHE BOOL "HAVE GDAL" FORCE)
 endif ()
 
 ########################################
+# Include man pages stuff
+include (${gazebo_cmake_dir}/Ronn2Man.cmake)
+include (${gazebo_cmake_dir}/Man.cmake)
+add_manpage_target()
+
+########################################
 # Find QWT (QT graphing library)
 #find_path(QWT_INCLUDE_DIR NAMES qwt.h PATHS
 #  /usr/include
diff --git a/cmake/cmake_uninstall.cmake.in b/cmake/cmake_uninstall.cmake.in
index efcb24a..2037e36 100644
--- a/cmake/cmake_uninstall.cmake.in
+++ b/cmake/cmake_uninstall.cmake.in
@@ -1,21 +1,21 @@
 if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
-  message(FATAL_ERROR "Cannot find install manifest: "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt"")
+  message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
 endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
 
 file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
 string(REGEX REPLACE "\n" ";" files "${files}")
 foreach(file ${files})
-  message(STATUS "Uninstalling "$ENV{DESTDIR}${file}"")
+  message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
   if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
     exec_program(
-      "@CMAKE_COMMAND@" ARGS "-E remove "$ENV{DESTDIR}${file}""
+      "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
       OUTPUT_VARIABLE rm_out
       RETURN_VALUE rm_retval
       )
     if(NOT "${rm_retval}" STREQUAL 0)
-      message(FATAL_ERROR "Problem when removing "$ENV{DESTDIR}${file}"")
+      message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
     endif(NOT "${rm_retval}" STREQUAL 0)
   else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
-    message(STATUS "File "$ENV{DESTDIR}${file}" does not exist.")
+    message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
   endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
 endforeach(file)
diff --git a/cmake/gazebo-config.cmake.in b/cmake/gazebo-config.cmake.in
new file mode 100644
index 0000000..0ecf468
--- /dev/null
+++ b/cmake/gazebo-config.cmake.in
@@ -0,0 +1,45 @@
+if (@PKG_NAME at _CONFIG_INCLUDED)
+  return()
+endif()
+set(@PKG_NAME at _CONFIG_INCLUDED TRUE)
+
+list(APPEND @PKG_NAME at _INCLUDE_DIRS @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@)
+list(APPEND @PKG_NAME at _INCLUDE_DIRS @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/gazebo- at GAZEBO_VERSION@)
+
+list(APPEND @PKG_NAME at _LIBRARY_DIRS @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@)
+list(APPEND @PKG_NAME at _LIBRARY_DIRS @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/gazebo- at GAZEBO_VERSION@/plugins)
+
+list(APPEND @PKG_NAME at _CFLAGS -I at CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@)
+list(APPEND @PKG_NAME at _CFLAGS -I at CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/gazebo- at GAZEBO_VERSION@)
+
+foreach(lib @PKG_LIBRARIES@)
+  set(onelib "${lib}-NOTFOUND")
+  find_library(onelib ${lib}
+    PATHS @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@
+    NO_DEFAULT_PATH
+    )
+  if(NOT onelib)
+    message(FATAL_ERROR "Library '${lib}' in package @PKG_NAME@ is not installed properly")
+  endif()
+  list(APPEND @PKG_NAME at _LIBRARIES ${onelib})
+endforeach()
+
+foreach(dep @PKG_DEPENDS@)
+  if(NOT ${dep}_FOUND)
+    find_package(${dep} REQUIRED)
+  endif()
+  list(APPEND @PKG_NAME at _INCLUDE_DIRS ${${dep}_INCLUDE_DIRS})
+
+  # Protobuf needs to be capitalized to match PROTOBUF_LIBRARIES
+  if (${dep} STREQUAL "Protobuf")
+    string (TOUPPER ${dep} dep_lib)
+  else()
+    set (dep_lib ${dep})
+  endif()
+    
+  list(APPEND @PKG_NAME at _LIBRARIES ${${dep_lib}_LIBRARIES})
+endforeach()
+
+list(APPEND @PKG_NAME at _LDFLAGS -Wl,-rpath, at CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/gazebo- at GAZEBO_VERSION@/plugins)
+list(APPEND @PKG_NAME at _LDFLAGS -L at CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@)
+list(APPEND @PKG_NAME at _LDFLAGS -L at CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/gazebo- at GAZEBO_VERSION@/plugins)
diff --git a/cmake/gazebo_config.h.in b/cmake/gazebo_config.h.in
index 7b3d9ab..b8675c5 100644
--- a/cmake/gazebo_config.h.in
+++ b/cmake/gazebo_config.h.in
@@ -9,7 +9,7 @@
 #define GAZEBO_VERSION_FULL "${GAZEBO_VERSION_FULL}"
 #define GAZEBO_VERSION_NAME ${GAZEBO_VERSION_NAME}
 
-#define GAZEBO_VERSION_HEADER "Gazebo multi-robot simulator, version ${GAZEBO_VERSION_FULL}\nCopyright (C) 2013 Open Source Robotics Foundation.\nReleased under the Apache 2 License.\nhttp://gazebosim.org\n\n"
+#define GAZEBO_VERSION_HEADER "Gazebo multi-robot simulator, version ${GAZEBO_VERSION_FULL}\nCopyright (C) 2012-2014 Open Source Robotics Foundation.\nReleased under the Apache 2 License.\nhttp://gazebosim.org\n\n"
 
 #cmakedefine BUILD_TYPE_PROFILE 1
 #cmakedefine BUILD_TYPE_DEBUG 1
@@ -17,15 +17,15 @@
 #cmakedefine HAVE_CEGUI 1
 #cmakedefine HAVE_OPENAL 1
 #cmakedefine HAVE_FFMPEG 1
-#cmakedefine HAVE_LTDL 1
-#cmakedefine HAVE_DL 1
 #cmakedefine ENABLE_SHADOWS 1
 #cmakedefine HAVE_BULLET 1
+#cmakedefine HAVE_SIMBODY 1
+#cmakedefine HAVE_DART 1
 #cmakedefine INCLUDE_RTSHADER 1
-#cmakedefine HAVE_URDFDOM 1
 #cmakedefine HAVE_GTS 1
 #cmakedefine HAVE_QWT 1
 #cmakedefine ENABLE_DIAGNOSTICS 1
+#cmakedefine HAVE_GDAL 1
 
 #ifdef BUILD_TYPE_PROFILE
 #include <google/heap-checker.h>
diff --git a/cmake/pkgconfig/gazebo.in b/cmake/pkgconfig/gazebo.in
index 2a79cdd..eb67f28 100644
--- a/cmake/pkgconfig/gazebo.in
+++ b/cmake/pkgconfig/gazebo.in
@@ -1,10 +1,10 @@
 prefix=@CMAKE_INSTALL_PREFIX@
-libdir=${prefix}/lib
-includedir=${prefix}/include
+libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
+includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
 
 Name: gazebo
 Description: Gazebo Libraries
 Version: @GAZEBO_VERSION_FULL@
 Requires:
-Libs: -Wl,-rpath,${libdir},-rpath,${prefix}/lib/gazebo- at GAZEBO_VERSION@/plugins -L${libdir} -L${prefix}/lib/gazebo- at GAZEBO_VERSION@/plugins -lgazebo_transport -lgazebo_physics -lgazebo_sensors -lgazebo_rendering -lgazebo_sdf_interface -lgazebo_msgs -lgazebo_math -lgazebo_common -lgazebo
-CFlags: -I${includedir}/gazebo- at GAZEBO_VERSION@ -I${includedir}/gazebo- at GAZEBO_VERSION@/gazebo
+Libs: -Wl,-rpath,${prefix}/@CMAKE_INSTALL_LIBDIR@/gazebo- at GAZEBO_VERSION@/plugins -L${libdir} -L${prefix}/@CMAKE_INSTALL_LIBDIR@/gazebo- at GAZEBO_VERSION@/plugins -L at SDF_LIBRARY_DIRS@ -lgazebo_transport -lgazebo_physics -lgazebo_sensors -lgazebo_rendering -lgazebo_gui -l at SDF_LIBRARIES@ -lgazebo_msgs -lgazebo_math -lgazebo_common -lgazebo
+CFlags: -I${includedir}/gazebo- at GAZEBO_VERSION@ -I at SDF_INCLUDE_DIRS@
diff --git a/cmake/pkgconfig/gazebo_ode.in b/cmake/pkgconfig/gazebo_ode.in
index 2bd83ae..4b4ae7f 100644
--- a/cmake/pkgconfig/gazebo_ode.in
+++ b/cmake/pkgconfig/gazebo_ode.in
@@ -1,10 +1,10 @@
 prefix=@CMAKE_INSTALL_PREFIX@
-libdir=${prefix}/lib
-includedir=${prefix}/include
+libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
+includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
 
 Name: gazebo
 Description: Gazebo Exported ODE Libraries
 Version: @GAZEBO_VERSION_FULL@
 Requires:
-Libs: -Wl,-rpath,${libdir},-rpath,${prefix}/lib -L${prefix}/lib -lgazebo_ode
-CFlags: -I${includedir}/gazebo- at GAZEBO_VERSION@/gazebo
+Libs: -Wl,-rpath,${prefix}/@CMAKE_INSTALL_LIBDIR@ -L${prefix}/@CMAKE_INSTALL_LIBDIR@ -lgazebo_ode
+CFlags: -I${includedir}/gazebo- at GAZEBO_VERSION@
diff --git a/cmake/pkgconfig/gazebo_transport.in b/cmake/pkgconfig/gazebo_transport.in
index 1f8ccc5..c063c3c 100644
--- a/cmake/pkgconfig/gazebo_transport.in
+++ b/cmake/pkgconfig/gazebo_transport.in
@@ -1,10 +1,10 @@
 prefix=@CMAKE_INSTALL_PREFIX@
-libdir=${prefix}/lib
-includedir=${prefix}/include
+libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
+includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
 
 Name: gazebo_transport
 Description: Gazebo Transport Library
 Version: @GAZEBO_VERSION_FULL@
 Requires:
-Libs: -Wl,-rpath,${libdir} -L${libdir} -lgazebo_transport  -lgazebo_msgs 
-CFlags: -I${includedir}/gazebo- at GAZEBO_VERSION@/gazebo
+Libs: -L${libdir} -lgazebo_transport -lgazebo_msgs 
+CFlags: -I${includedir}/gazebo- at GAZEBO_VERSION@
diff --git a/cmake/setup-unversioned.sh.in b/cmake/setup-unversioned.sh.in
deleted file mode 100644
index 438d1ce..0000000
--- a/cmake/setup-unversioned.sh.in
+++ /dev/null
@@ -1,18 +0,0 @@
-# This file is intended to be used when you want the latest installed version of
-# Gazebo.
-
-# Find all Gazebo installations with setup.sh files, sort them, and take the
-# last one (which should be the latest, assuming lexicographic sorting and
-# strictly increasing version numbers).
-setup=`find @CMAKE_INSTALL_PREFIX@/share -path @CMAKE_INSTALL_PREFIX@/share/gazebo-'*'/setup.sh | sort | tail -n 1`
-
-if [ -z $setup ]; then
-  echo "ERROR: Couldn't find a Gazebo setup.sh in @CMAKE_INSTALL_PREFIX@/share"
-  false
-elif [ ! -f $setup ]; then
-  echo "ERROR: Setup file $setup doesn't exist"
-  false
-else
-  # Otherwise, looks good.  Source it.
-  . $setup
-fi
diff --git a/cmake/setup.sh.in b/cmake/setup.sh.in
index 415394f..1291526 100644
--- a/cmake/setup.sh.in
+++ b/cmake/setup.sh.in
@@ -1,6 +1,6 @@
-export GAZEBO_MASTER_URI=http://localhost:11345
-export GAZEBO_MODEL_DATABASE_URI=http://gazebosim.org/models
-export GAZEBO_RESOURCE_PATH=@CMAKE_INSTALL_PREFIX@/share/gazebo- at GAZEBO_VERSION@:@CMAKE_INSTALL_PREFIX@/share/gazebo_models
-export GAZEBO_PLUGIN_PATH=@CMAKE_INSTALL_PREFIX@/@LIB_INSTALL_DIR@/gazebo- at GAZEBO_VERSION@/plugins
-export LD_LIBRARY_PATH=@CMAKE_INSTALL_PREFIX@/@LIB_INSTALL_DIR@/gazebo- at GAZEBO_VERSION@/plugins:${LD_LIBRARY_PATH}
-export OGRE_RESOURCE_PATH=@OGRE_PLUGINDIR@
+export GAZEBO_MASTER_URI=http://@GAZEBO_DEFAULT_MASTER_HOST@:@GAZEBO_DEFAULT_MASTER_PORT@
+export GAZEBO_MODEL_DATABASE_URI=@GAZEBO_MODEL_DATABASE_URI@
+export GAZEBO_RESOURCE_PATH=@GAZEBO_RESOURCE_PATH@
+export GAZEBO_PLUGIN_PATH=@GAZEBO_PLUGIN_PATH@
+export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:@GAZEBO_PLUGIN_PATH@
+export OGRE_RESOURCE_PATH=@OGRE_RESOURCE_PATH@
diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt
index f51c592..0a78a71 100644
--- a/deps/CMakeLists.txt
+++ b/deps/CMakeLists.txt
@@ -1,4 +1,7 @@
-add_subdirectory(libccd)
 add_subdirectory(opende)
+
+if (NOT HAVE_CCD)
+  add_subdirectory(libccd)
+endif()
 # add_subdirectory(ann)
 # add_subdirectory(fcl)
diff --git a/deps/opende/CMakeLists.txt b/deps/opende/CMakeLists.txt
index dadc33d..e67da0b 100644
--- a/deps/opende/CMakeLists.txt
+++ b/deps/opende/CMakeLists.txt
@@ -205,6 +205,9 @@ src/joints/plane2d.cpp
 src/joints/pr.cpp
 src/joints/pu.cpp
 src/joints/screw.cpp
+src/joints/dhinge.cpp
+src/joints/dball.cpp
+src/joints/gearbox.cpp
 src/joints/slider.cpp
 src/joints/universal.cpp
 )
@@ -243,7 +246,12 @@ endif()
 set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_LINK_FLAGS_${CMAKE_BUILD_TYPE}} -MF -MT -fno-strict-aliasing -DPIC ")
 
 gz_add_library(gazebo_ode ${sources})
-target_link_libraries(gazebo_ode gazebo_opcode gazebo_gimpact gazebo_opende_ou ${CCD_LIBRARIES})
+target_link_libraries(gazebo_ode
+  gazebo_opcode
+  gazebo_gimpact
+  gazebo_opende_ou
+  ${CCD_LIBRARIES}
+  ${Boost_LIBRARIES})
 
 add_dependencies(gazebo_ode gazebo_opcode gazebo_gimpact)
 add_dependencies(gazebo_ode gazebo_opende_ou)
diff --git a/deps/opende/OPCODE/Opcode.h b/deps/opende/OPCODE/Opcode.h
index 4b68389..288156a 100644
--- a/deps/opende/OPCODE/Opcode.h
+++ b/deps/opende/OPCODE/Opcode.h
@@ -1,17 +1,17 @@
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 /*
- *	OPCODE - Optimized Collision Detection
- *	Copyright (C) 2001 Pierre Terdiman
- *	Homepage: http://www.codercorner.com/Opcode.htm
+ *  OPCODE - Optimized Collision Detection
+ *  Copyright (C) 2001 Pierre Terdiman
+ *  Homepage: http://www.codercorner.com/Opcode.htm
  */
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 /**
- *	Main file for Opcode.dll.
- *	\file		Opcode.h
- *	\author		Pierre Terdiman
- *	\date		March, 20, 2001
+ *  Main file for Opcode.dll.
+ *  \file  	Opcode.h
+ *  \author  	Pierre Terdiman
+ *  \date  	March, 20, 2001
  */
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -19,11 +19,14 @@
 // Include Guard
 #ifndef __OPCODE_H__
 #define __OPCODE_H__
+#pragma GCC system_header
 
 // stdarg.h must be included before Opcode headers as it later
 // may not compile being not able to find std::va_list
 #include <stdarg.h>
 
+#include <gazebo/util/system.hh>
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // Things to help us compile on non-windows platforms
 
@@ -49,67 +52,70 @@
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // Compilation messages
 #ifdef _MSC_VER
-	#if defined(OPCODE_EXPORTS)
-		// #pragma message("Compiling OPCODE")
-	#elif !defined(OPCODE_EXPORTS)
-		// #pragma message("Using OPCODE")
-		///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-		// Automatic linking
-		#ifndef BAN_OPCODE_AUTOLINK
-			#ifdef _DEBUG
-				//#pragma comment(lib, "Opcode_D.lib")
-			#else
-				//#pragma comment(lib, "Opcode.lib")
-			#endif
-		#endif
-	#endif
+  #if defined(OPCODE_EXPORTS)
+    // #pragma message("Compiling OPCODE")
+  #elif !defined(OPCODE_EXPORTS)
+    // #pragma message("Using OPCODE")
+    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Automatic linking
+    #ifndef BAN_OPCODE_AUTOLINK
+    	#ifdef _DEBUG
+    		//#pragma comment(lib, "Opcode_D.lib")
+    	#else
+    		//#pragma comment(lib, "Opcode.lib")
+    	#endif
+    #endif
+  #endif
 #endif
 
-///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////
 // Preprocessor
-#ifndef ICE_NO_DLL
-	#ifdef OPCODE_EXPORTS
-		#define OPCODE_API// __declspec(dllexport)
-	#else
-		#define OPCODE_API// __declspec(dllimport)
-	#endif
-#else
-		#define OPCODE_API
-#endif
+// #ifndef ICE_NO_DLL
+//   #ifdef OPCODE_EXPORTS
+//     #define OPCODE_API// __declspec(dllexport)
+//   #else
+//     #define OPCODE_API// __declspec(dllimport)
+//   #endif
+// #else
+//   #define OPCODE_API
+// #endif
+
+// Preprocessor__
+#define OPCODE_API GAZEBO_VISIBLE
 
-	#include "OPC_Settings.h"
-	#include "OPC_IceHook.h"
+  #include "OPC_Settings.h"
+  #include "OPC_IceHook.h"
 
-	namespace Opcode
-	{
-		// Bulk-of-the-work
-		#include "OPC_Common.h"
-		#include "OPC_MeshInterface.h"
-		// Builders
-		#include "OPC_TreeBuilders.h"
-		// Trees
-		#include "OPC_AABBTree.h"
-		#include "OPC_OptimizedTree.h"
-		// Models
-		#include "OPC_BaseModel.h"
-		#include "OPC_Model.h"
-		#include "OPC_HybridModel.h"
-		// Colliders
-		#include "OPC_Collider.h"
-		#include "OPC_VolumeCollider.h"
-		#include "OPC_TreeCollider.h"
-		#include "OPC_RayCollider.h"
-		#include "OPC_SphereCollider.h"
-		#include "OPC_OBBCollider.h"
-		#include "OPC_AABBCollider.h"
-		#include "OPC_LSSCollider.h"
-		#include "OPC_PlanesCollider.h"
-		// Usages
-		#include "OPC_Picking.h"
+  namespace Opcode
+  {
+    // Bulk-of-the-work
+    #include "OPC_Common.h"
+    #include "OPC_MeshInterface.h"
+    // Builders
+    #include "OPC_TreeBuilders.h"
+    // Trees
+    #include "OPC_AABBTree.h"
+    #include "OPC_OptimizedTree.h"
+    // Models
+    #include "OPC_BaseModel.h"
+    #include "OPC_Model.h"
+    #include "OPC_HybridModel.h"
+    // Colliders
+    #include "OPC_Collider.h"
+    #include "OPC_VolumeCollider.h"
+    #include "OPC_TreeCollider.h"
+    #include "OPC_RayCollider.h"
+    #include "OPC_SphereCollider.h"
+    #include "OPC_OBBCollider.h"
+    #include "OPC_AABBCollider.h"
+    #include "OPC_LSSCollider.h"
+    #include "OPC_PlanesCollider.h"
+    // Usages
+    #include "OPC_Picking.h"
 
 
-		FUNCTION OPCODE_API bool InitOpcode();
-		FUNCTION OPCODE_API bool CloseOpcode();
-	}
+    FUNCTION OPCODE_API bool InitOpcode();
+    FUNCTION OPCODE_API bool CloseOpcode();
+  }
 
 #endif // __OPCODE_H__
diff --git a/deps/opende/include/ode/common.h b/deps/opende/include/ode/common.h
index 02da8df..c0602fe 100644
--- a/deps/opende/include/ode/common.h
+++ b/deps/opende/include/ode/common.h
@@ -261,7 +261,10 @@ typedef enum {
   dJointTypePlane2D,
   dJointTypePR,
   dJointTypePU,
-  dJointTypePiston
+  dJointTypePiston,
+  dJointTypeDBall,
+  dJointTypeDHinge,
+  dJointTypeGearbox
 } dJointType;
 
 
diff --git a/deps/opende/include/ode/misc.h b/deps/opende/include/ode/misc.h
index fb106a0..fb89369 100644
--- a/deps/opende/include/ode/misc.h
+++ b/deps/opende/include/ode/misc.h
@@ -80,6 +80,73 @@ ODE_API dReal dMaxDifference (const dReal *A, const dReal *B, int n, int m);
  * n*n matrices */
 ODE_API dReal dMaxDifferenceLowerTriangle (const dReal *A, const dReal *B, int n);
 
+/*!
+ * \brief dNormalizeAnglePositive
+ *
+ *        Normalizes the angle to be 0 to 2*M_PI
+ *        It takes and returns radians.
+ */
+ODE_API static inline dReal dNormalizeAnglePositive(dReal angle)
+{
+  return fmod(fmod(angle, 2.0*M_PI) + 2.0*M_PI, 2.0*M_PI);
+}
+
+
+/*!
+ * \brief normalize
+ *
+ * Normalizes the angle from [0, 2*M_PI] to [-M_PI, +M_PI] circle
+ * It takes and returns radians.
+ *
+ */    
+ODE_API static inline dReal dNormalizeAngle(dReal angle)
+{
+  dReal a = dNormalizeAnglePositive(angle);
+  if (a > M_PI)
+    a -= 2.0 *M_PI;
+  return a;
+}
+
+  
+/*!
+ * \function
+ * \brief dShortestAngularDistance
+ *
+ * Given 2 angles, this returns the shortest angular
+ * difference.  The inputs and ouputs are of course radians.
+ *
+ * The result
+ * would always be -pi <= result <= pi.  Adding the result
+ * to "from" will always get you an equivelent angle to "to".
+ */
+ODE_API static inline dReal dShortestAngularDistance(dReal from, dReal to)
+{
+  dReal result = dNormalizeAngle(dNormalizeAnglePositive(dNormalizeAnglePositive(to) -
+    dNormalizeAnglePositive(from)));
+
+  return result;
+}
+
+/*!
+ * \function
+ * \brief dShortestAngularDistanceUpdate
+ *
+ * Given 2 angles, this returns the shortest angular
+ * difference.  The inputs and ouputs are radians.
+ *
+ * This function returns (from + delta) where delta is in the range of [-pi, pi].
+ * However, if |delta| > tol, then this function simply returns incoming parameter "to".
+ *
+ */
+ODE_API static inline dReal dShortestAngularDistanceUpdate(dReal from, dReal to, dReal tol = 0.3)
+{
+  dReal result = dShortestAngularDistance(from, to);
+
+  if (dFabs(result) > tol)
+    return to;
+  else
+    return from + result;
+}
 
 #ifdef __cplusplus
 }
diff --git a/deps/opende/include/ode/objects.h b/deps/opende/include/ode/objects.h
index 77ba5bb..721bece 100644
--- a/deps/opende/include/ode/objects.h
+++ b/deps/opende/include/ode/objects.h
@@ -1,5 +1,4 @@
 
-
 /*************************************************************************
  *                                                                       *
  * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
@@ -411,22 +410,34 @@ ODE_API void dWorldSetRobustStepMaxIterations (dWorldID, int num);
 
 
 /**
- * @brief Set the tolerance of when sor lcp stops
- * @param num The default is 1 chunk
+ * @brief Get the tolerance of when sor lcp stops
+ * @param dWorldID world id
+ */
+ODE_API dReal dWorldGetQuickStepTolerance (dWorldID);
+
+/**
+ * @brief Set a tolerance to stop quickstep iterations.
+ * PGS iteration stops when the RMS of total constraint residual in the
+ * quickstep inner iteration (see dWorldGetQuickStepRMSConstraintResidual)
+ * is less than the tolerance specified here.
+ * The units of tolerance is the same as units of \lambda,
+ * which is in units of force.
+ * @param dWorldID world id
+ * @param dReal tolerance
  */
-void dWorldSetQuickStepTolerance (dWorldID, dReal tol);
+ODE_API void dWorldSetQuickStepTolerance (dWorldID, dReal tol);
 
 /**
  * @brief Set the number of chunks quickstep divide up constraint rows
  * @param num The default is 1 chunk
  */
-void dWorldSetQuickStepNumChunks (dWorldID, int num);
+ODE_API void dWorldSetQuickStepNumChunks (dWorldID, int num);
 
 /**
  * @brief Set the number of overlap when quickstep divide up constraint rows
  * @param num The default is 0 overlap
  */
-void dWorldSetQuickStepNumOverlap (dWorldID, int num);
+ODE_API void dWorldSetQuickStepNumOverlap (dWorldID, int num);
 
 /**
  * @brief Get the maximum number of iterations that the RobustStep method 
@@ -492,11 +503,119 @@ ODE_API void dWorldSetQuickStepW (dWorldID, dReal over_relaxation);
 ODE_API dReal dWorldGetQuickStepW (dWorldID);
 
 /**
- * @brief Get the RMS error of the quickstep step
+ * @brief Get the RMS of \Delta \lambda of the quickstep step
+ * Given dLambda is measures by (b_i - a_{ij} lambda_j)/a_{ii}
+ * it's a reasonable convergence measure for the linear system
+ * being solved via PGS.  Note the dLambda used are post-projection.
+ * The unit of errors are the same as the units of forces.
+ * RMS of \Delta \Lambda array is defined as:
+ * rms_dlambda[0]: bilateral constraints (findex = -1)
+ * rms_dlambda[1]: contact normal constraints (findex = -2)
+ * rms_dlambda[2]: friction constraints (findex >= 0)
+ * rms_dlambda[3]: total (sum of previous 3)
+ * @ingroup world
+ * @returns the RMS of delta lambda
+ */
+ODE_API dReal *dWorldGetQuickStepRMSDeltaLambda (dWorldID);
+
+/**
+ * @brief Get the RMS of constraint residuals for the quickstep step.
+ * The unit of constraint residuals are same as the units of velocities.
+ * RMS of constraint residuals array is defined as:
+ * rms_constraint_residual[0]: bilateral constraints (findex = -1)
+ * rms_constraint_residual[1]: contact normal constraints (findex = -2)
+ * rms_constraint_residual[2]: friction constraints (findex >= 0)
+ * rms_constraint_residual[3]: total (sum of previous 3)
+ * @ingroup world
+ * @returns the RMS of constraint residuals
+ */
+ODE_API dReal *dWorldGetQuickStepRMSConstraintResidual (dWorldID);
+
+/**
+ * @brief Get current count of contact constraints.
+ * @ingroup world
+ * @returns the number of contact constraints in quickstep.
+ */
+ODE_API int dWorldGetQuickStepNumContacts (dWorldID);
+
+/* PGS experimental parameters */
+
+/**
+ * @brief Get option to turn on inertia ratio reduction.
+ * @ingroup world
+ */
+ODE_API bool dWorldGetQuickStepInertiaRatioReduction (dWorldID);
+
+/**
+ * @brief Get friction residual exponential smoothing coefficient.
+ * @ingroup world
+ */
+ODE_API dReal dWorldGetQuickStepContactResidualSmoothing (dWorldID);
+
+/**
+ * @brief Get option to turn on experimental row reordering.
+ * see dWorldGetQuickStepExperimentalRowReordering for details.
+ * @ingroup world
+ */
+ODE_API bool dWorldGetQuickStepExperimentalRowReordering (dWorldID);
+
+/**
+ * @brief Get warm start scaling coefficient
+ * @ingroup world
+ */
+ODE_API dReal dWorldGetQuickStepWarmStartFactor (dWorldID);
+
+/**
+ * @brief Get extra friction constraint iterations within each time step.
+ * @ingroup world
+ */
+ODE_API int dWorldGetQuickStepExtraFrictionIterations (dWorldID);
+
+/**
+ * @brief Option to turn on inertia ratio reduction.
+ * @ingroup world
+ * @param irr set to true to turn on inertia ratio reduction.
+ */
+ODE_API void dWorldSetQuickStepInertiaRatioReduction (dWorldID, bool irr);
+
+/**
+ * @brief Set friction residual exponential smoothing coefficient
+ * @ingroup world
+ * @param smooth smoothing coefficent (0: no smothing ~ 1: full smoothing)
+ */
+ODE_API void dWorldSetQuickStepContactResidualSmoothing (dWorldID, dReal smoo);
+
+/**
+ * @brief Turn on experimental row reordering, so within one sweep,
+ * following ordering of constraints are used:
+ *   1. bilateral constraints
+ *   2. all contact normal constraints
+ *   3. all friction force constraints
+ * otherwise, use standard reordering
+ *   1. bilateral constraints
+ *   2. sweep each contact sequentially.  For each contact,
+ *      solve normal constraint followed by 2 friction constraints.
  * @ingroup world
- * @returns the rms error
+ * @param reorder set to true to turn on experimental row reordering
  */
-ODE_API dReal dWorldGetQuickStepRMSError (dWorldID);
+ODE_API void dWorldSetQuickStepExperimentalRowReordering (dWorldID, bool order);
+
+/**
+ * @brief Set warm start scaling coefficient
+ * @ingroup world
+ * @param warm 0: turn off warm starting, anything else is a scaling factor
+ * for lambda from previous time step.
+ */
+ODE_API void dWorldSetQuickStepWarmStartFactor (dWorldID, dReal warm);
+
+/**
+ * @brief Set extra friction constraint iterations within each time step,
+ * to be done after initial sweeps.
+ * @ingroup world
+ * @param iterations extra constraint iterations for friction rows after
+ * default sweep.
+ */
+ODE_API void dWorldSetQuickStepExtraFrictionIterations (dWorldID, int iters);
 
 /* World contact parameter functions */
 
@@ -1660,6 +1779,14 @@ ODE_API dJointID dJointCreateBall (dWorldID, dJointGroupID);
 ODE_API dJointID dJointCreateHinge (dWorldID, dJointGroupID);
 
 /**
+ * @brief Create a new joint of the gearbox type.
+ * @ingroup joints
+ * @param dJointGroupID set to 0 to allocate the joint normally.
+ * If it is nonzero the joint is allocated in the given joint group.
+ */
+ODE_API dJointID dJointCreateGearbox (dWorldID, dJointGroupID);
+ 
+/**
  * @brief Create a new joint of the slider type.
  * @ingroup joints
  * @param dJointGroupID set to 0 to allocate the joint normally.
@@ -1759,6 +1886,14 @@ ODE_API dJointID dJointCreateLMotor (dWorldID, dJointGroupID);
 ODE_API dJointID dJointCreatePlane2D (dWorldID, dJointGroupID);
 
 /**
+ * @brief Create a new joint of the double ball type.
+ * @ingroup joints
+ * @param dJointGroupID set to 0 to allocate the joint normally.
+ * If it is nonzero the joint is allocated in the given joint group.
+ */
+ODE_API dJointID dJointCreateDBall (dWorldID, dJointGroupID);
+
+/**
  * @brief Destroy a joint.
  * @ingroup joints
  *
@@ -2047,6 +2182,28 @@ ODE_API void dJointAddScrewForce(dJointID joint, dReal force);
 ODE_API void dJointAddScrewTorque(dJointID joint, dReal torque);
 
 /**
+ * @brief set first axis for the gearbox joint
+ * @remarks This is the axis around which the first body is allowed to
+ * revolve and is attached to it.  It is given in global coordinates.
+ * @ingroup joints
+ */
+ODE_API void dJointSetGearboxAxis1(dJointID, dReal x, dReal y, dReal z);
+
+/**
+ * @brief get first axis for the gearbox joint
+ * @ingroup joints
+ */
+ODE_API void dJointGetGearboxAxis1(dJointID, dVector3 result);
+
+/**
+ * @brief set second axis for the gearbox joint
+ * @remarks This is the axis around which the second body is allowed to
+ * revolve and is attached to it.  It is given in global coordinates.
+ * @ingroup joints
+ */
+ODE_API void dJointSetGearboxAxis2(dJointID, dReal x, dReal y, dReal z);
+
+/**
  * @brief set anchor
  * @ingroup joints
  */
@@ -2628,6 +2785,16 @@ ODE_API dReal dJointGetScrewPosition (dJointID);
 ODE_API dReal dJointGetScrewAngle (dJointID);
 
 /**
+ * @brief Set the screw anchor
+ */
+ODE_API void dJointSetScrewAnchor( dJointID j, dReal x, dReal y, dReal z );
+
+/**
+ * @brief Get the screw anchor
+ */
+ODE_API void dJointGetScrewAnchor( dJointID j, dVector3 result );
+
+/**
  * @brief Get the screw linear position's time derivative.
  * @ingroup joints
  */
@@ -2647,6 +2814,69 @@ ODE_API void dJointGetScrewAxis (dJointID, dVector3 result);
 ODE_API dReal dJointGetScrewParam (dJointID, int parameter);
 
 /**
+ * @brief get second axis for the gearbox joint
+ * @ingroup joints
+ */
+ODE_API void dJointGetGearboxAxis2(dJointID, dVector3 result);
+
+/**
+ * @brief set gearbox joint parameter
+ * @ingroup joints
+ */
+ODE_API void dJointSetGearboxParam(dJointID, int parameter, dReal value);
+
+/**
+ * @brief get gearbox joint parameter
+ * @ingroup joints
+ */
+ODE_API dReal dJointGetGearboxParam(dJointID, int parameter);
+
+/**
+ * @brief set gearbox ratio
+ * @remarks
+ * This is the ratio of the angular velocity of the first body to that
+ * of the second body along the joint axis.  If the ratio is N then
+ * the first body is constrained to rotate N times faster than the
+ * second body.  Set it to 1 / N or reverse the bodies for the reverse
+ * effect.
+ * @ingroup joints
+ */
+ODE_API void dJointSetGearboxRatio( dJointID j, dReal value );
+
+/**
+ * @brief set gearbox reference body
+ * @remarks
+ * This is used to get the joint angle of the two bodies, so
+ * one can enforce error correction on gear angles.
+ * @ingroup joints
+ */
+ODE_API void dJointSetGearboxReferenceBody( dJointID j, dBodyID b );
+
+/**
+ * @brief set gearbox reference body
+ * @remarks
+ * This is used to get the joint angle of the first body, so
+ * one can enforce error correction on gear angles.
+ * @ingroup joints
+ */
+ODE_API void dJointSetGearboxReferenceBody1( dJointID j, dBodyID b );
+
+/**
+ * @brief set gearbox reference body
+ * @remarks
+ * This is used to get the joint angle of the second body, so
+ * one can enforce error correction on gear angles.
+ * @ingroup joints
+ */
+ODE_API void dJointSetGearboxReferenceBody2( dJointID j, dBodyID b );
+
+/**
+ * @brief get gearbox ratio
+ * @ingroup joints
+ */
+ODE_API dReal dJointGetGearboxRatio( dJointID j );
+
+/**
  * @brief Get the joint anchor point, in world coordinates.
  * @return the point on body 1.  If the joint is perfectly satisfied,
  * this will be the same as the point on body 2.
@@ -3129,6 +3359,103 @@ ODE_API dReal dJointGetLMotorParam (dJointID, int parameter);
  */
 ODE_API dReal dJointGetFixedParam (dJointID, int parameter);
 
+/**
+ * @brief set anchor1 for double ball joint
+ * @ingroup joints
+ */
+ODE_API void dJointSetDBallAnchor1(dJointID, dReal x, dReal y, dReal z);
+
+/**
+ * @brief set anchor2 for double ball joint
+ * @ingroup joints
+ */
+ODE_API void dJointSetDBallAnchor2(dJointID, dReal x, dReal y, dReal z);
+
+/**
+ * @brief get anchor1 from double ball joint
+ * @ingroup joints
+ */
+ODE_API void dJointGetDBallAnchor1(dJointID, dVector3 result);
+
+/**
+ * @brief get anchor2 from double ball joint
+ * @ingroup joints
+ */
+ODE_API void dJointGetDBallAnchor2(dJointID, dVector3 result);
+
+/**
+ * @brief get the set distance from double ball joint
+ * @ingroup joints
+ */
+ODE_API dReal dJointGetDBallDistance(dJointID);
+
+/**
+ * @brief set double ball joint parameter
+ * @ingroup joints
+ */
+ODE_API void dJointSetDBallParam(dJointID, int parameter, dReal value);
+
+/**
+ * @brief get double ball joint parameter
+ * @ingroup joints
+ */
+ODE_API dReal dJointGetDBallParam(dJointID, int parameter);
+
+
+/**
+ * @brief set axis for double hinge joint
+ * @ingroup joints
+ */
+ODE_API void dJointSetDHingeAxis(dJointID, dReal x, dReal y, dReal z);
+
+/**
+ * @brief get axis for double hinge joint
+ * @ingroup joints
+ */
+ODE_API void dJointGetDHingeAxis(dJointID, dVector3 result);
+
+/**
+ * @brief set anchor1 for double hinge joint
+ * @ingroup joints
+ */
+ODE_API void dJointSetDHingeAnchor1(dJointID, dReal x, dReal y, dReal z);
+
+/**
+ * @brief set anchor2 for double hinge joint
+ * @ingroup joints
+ */
+ODE_API void dJointSetDHingeAnchor2(dJointID, dReal x, dReal y, dReal z);
+
+/**
+ * @brief get anchor1 from double hinge joint
+ * @ingroup joints
+ */
+ODE_API void dJointGetDHingeAnchor1(dJointID, dVector3 result);
+
+/**
+ * @brief get anchor2 from double hinge joint
+ * @ingroup joints
+ */
+ODE_API void dJointGetDHingeAnchor2(dJointID, dVector3 result);
+
+/**
+ * @brief get the set distance from double hinge joint
+ * @ingroup joints
+ */
+ODE_API dReal dJointGetDHingeDistance(dJointID);
+
+/**
+ * @brief set double hinge joint parameter
+ * @ingroup joints
+ */
+ODE_API void dJointSetDHingeParam(dJointID, int parameter, dReal value);
+
+/**
+ * @brief get double hinge joint parameter
+ * @ingroup joints
+ */
+ODE_API dReal dJointGetDHingeParam(dJointID, int parameter);
+
 
 /**
  * @ingroup joints
diff --git a/deps/opende/include/ode/odeconfig.h b/deps/opende/include/ode/odeconfig.h
index b28813e..aa3f767 100644
--- a/deps/opende/include/ode/odeconfig.h
+++ b/deps/opende/include/ode/odeconfig.h
@@ -16,11 +16,18 @@
 #endif
 
 /* Define a DLL export symbol for those platforms that need it */
-#if defined(_MSC_VER)
-  #if defined(ODE_DLL)
-    #define ODE_API __declspec(dllexport)
-  #elif !defined(ODE_LIB)
-    #define ODE_DLL_API __declspec(dllimport)
+/* OSRF mofication: add visibility definitions and platform checks */
+#if defined _WIN32 || defined __CYGWIN__
+  #if defined(_MSC_VER)
+    #if defined(ODE_DLL)
+      #define ODE_API __declspec(dllexport)
+    #elif !defined(ODE_LIB)
+      #define ODE_DLL_API __declspec(dllimport)
+    #endif
+  #endif
+#else
+  #if __GNUC__ >= 4
+    #define ODE_API __attribute__ ((visibility ("default")))
   #endif
 #endif
 
diff --git a/deps/opende/include/ode/odecpp.h b/deps/opende/include/ode/odecpp.h
index eea6839..8c229eb 100644
--- a/deps/opende/include/ode/odecpp.h
+++ b/deps/opende/include/ode/odecpp.h
@@ -102,12 +102,46 @@ public:
     { return dWorldGetQuickStepPreconIterations (get_id()); }
   int getQuickStepNumIterations() const
     { return dWorldGetQuickStepNumIterations (get_id()); }
+  dReal getQuickStepTolerance()
+    { return dWorldGetQuickStepTolerance (get_id()); }
+  void setQuickStepTolerance(dReal tol)
+    { dWorldSetQuickStepTolerance (get_id(), tol); }
+  void setQuickStepNumChunks (int num)
+    { dWorldSetQuickStepNumChunks (get_id(), num); }
+  void setQuickStepNumOverlap (dWorldID, int num)
+    { dWorldSetQuickStepNumOverlap (get_id(), num); }
   void setQuickStepW(dReal over_relaxation)
     { dWorldSetQuickStepW (get_id(), over_relaxation); }
   dReal getQuickStepW() const
     { return dWorldGetQuickStepW (get_id()); }
-  dReal getQuickStepRMSError() const
-    { return dWorldGetQuickStepRMSError (get_id()); }
+  dReal *getQuickStepRMSError() const
+    { return dWorldGetQuickStepRMSDeltaLambda (get_id()); }
+  dReal *getQuickStepRMSConstraintResidual() const
+    { return dWorldGetQuickStepRMSConstraintResidual (get_id()); }
+  dReal getQuickStepNumContacts() const
+    { return dWorldGetQuickStepNumContacts (get_id()); }
+
+  /* experimental PGS */
+  bool getQuickStepInertiaRatioReduction() const
+    { return dWorldGetQuickStepInertiaRatioReduction (get_id()); }
+  dReal getQuickStepContactResidualSmoothing() const
+    { return dWorldGetQuickStepContactResidualSmoothing (get_id()); }
+  bool getQuickStepExperimentalRowReordering() const
+    { return dWorldGetQuickStepExperimentalRowReordering (get_id()); }
+  dReal getQuickStepWarmStartFactor() const
+    { return dWorldGetQuickStepWarmStartFactor (get_id()); }
+  int getQuickStepExtraFrictionIterations() const
+    { return dWorldGetQuickStepExtraFrictionIterations (get_id()); }
+  void setQuickStepInertiaRatioReduction(bool irr)
+    { dWorldSetQuickStepInertiaRatioReduction (get_id(), irr); }
+  void setQuickStepContactResidualSmoothing(dReal smoo)
+    { dWorldSetQuickStepContactResidualSmoothing (get_id(), smoo); }
+  void setQuickStepExperimentalRowReordering(bool order)
+    { dWorldSetQuickStepExperimentalRowReordering (get_id(), order); }
+  void setQuickStepWarmStartFactor(dReal warm)
+    { dWorldSetQuickStepWarmStartFactor (get_id(), warm); }
+  void setQuickStepExtraFrictionIterations(int iters)
+    { dWorldSetQuickStepExtraFrictionIterations (get_id(), iters); }
 
   void  setAutoDisableLinearThreshold (dReal threshold) 
     { dWorldSetAutoDisableLinearThreshold (get_id(), threshold); }
diff --git a/deps/opende/include/ode/odemath.h b/deps/opende/include/ode/odemath.h
index d5d61b7..f4ddb1a 100644
--- a/deps/opende/include/ode/odemath.h
+++ b/deps/opende/include/ode/odemath.h
@@ -278,6 +278,7 @@ PURE_INLINE dReal dCalcPointsDistance3(const dReal *a, const dReal *b)
  * special case matrix multiplication, with operator selection
  */
 
+/// res(3X1) = a(3X3) * b(3X1)
 PURE_INLINE void dMultiplyHelper0_331(dReal *res, const dReal *a, const dReal *b)
 {
   dReal res_0, res_1, res_2;
@@ -288,6 +289,7 @@ PURE_INLINE void dMultiplyHelper0_331(dReal *res, const dReal *a, const dReal *b
   res[0] = res_0; res[1] = res_1; res[2] = res_2;
 }
 
+/// res(3X1) = a'(3X3) * b(3X1)
 PURE_INLINE void dMultiplyHelper1_331(dReal *res, const dReal *a, const dReal *b)
 {
   dReal res_0, res_1, res_2;
@@ -298,11 +300,13 @@ PURE_INLINE void dMultiplyHelper1_331(dReal *res, const dReal *a, const dReal *b
   res[0] = res_0; res[1] = res_1; res[2] = res_2;
 }
 
+/// res(1X3) = a(1X3) * b(3X3)
 PURE_INLINE void dMultiplyHelper0_133(dReal *res, const dReal *a, const dReal *b)
 {
   dMultiplyHelper1_331(res, b, a);
 }
 
+/// res(1X3) = a'(3X3) * b(first column from a 3X3 matrix)
 PURE_INLINE void dMultiplyHelper1_133(dReal *res, const dReal *a, const dReal *b)
 {
   dReal res_0, res_1, res_2;
@@ -333,6 +337,7 @@ PURE_INLINE void dMultiply0_133(dReal *res, const dReal *a, const dReal *b)
   dMultiplyHelper0_133(res, a, b);
 }
 
+/// res(3X3) = a(3X3) * b(3X3)
 PURE_INLINE void dMultiply0_333(dReal *res, const dReal *a, const dReal *b)
 {
   dMultiplyHelper0_133(res + 0, a + 0, b);
@@ -340,6 +345,7 @@ PURE_INLINE void dMultiply0_333(dReal *res, const dReal *a, const dReal *b)
   dMultiplyHelper0_133(res + 8, a + 8, b);
 }
 
+/// res(3X3) = a'(3X3) * b(3X3)
 PURE_INLINE void dMultiply1_333(dReal *res, const dReal *a, const dReal *b)
 {
   dMultiplyHelper1_133(res + 0, b, a + 0);
@@ -347,6 +353,7 @@ PURE_INLINE void dMultiply1_333(dReal *res, const dReal *a, const dReal *b)
   dMultiplyHelper1_133(res + 8, b, a + 2);
 }
 
+/// res(3X3) = a(3X3) * b'(3X3)
 PURE_INLINE void dMultiply2_333(dReal *res, const dReal *a, const dReal *b)
 {
   dMultiplyHelper0_331(res + 0, b, a + 0);
diff --git a/deps/opende/include/ode/rotation.h b/deps/opende/include/ode/rotation.h
index a72be27..a9b2243 100644
--- a/deps/opende/include/ode/rotation.h
+++ b/deps/opende/include/ode/rotation.h
@@ -34,19 +34,19 @@ extern "C" {
 ODE_API void dRSetIdentity (dMatrix3 R);
 
 ODE_API void dRFromAxisAndAngle (dMatrix3 R, dReal ax, dReal ay, dReal az,
-			 dReal angle);
+       dReal angle);
 
 ODE_API void dRFromEulerAngles (dMatrix3 R, dReal phi, dReal theta, dReal psi);
 
 ODE_API void dRFrom2Axes (dMatrix3 R, dReal ax, dReal ay, dReal az,
-		  dReal bx, dReal by, dReal bz);
+      dReal bx, dReal by, dReal bz);
 
 ODE_API void dRFromZAxis (dMatrix3 R, dReal ax, dReal ay, dReal az);
 
 ODE_API void dQSetIdentity (dQuaternion q);
 
 ODE_API void dQFromAxisAndAngle (dQuaternion q, dReal ax, dReal ay, dReal az,
-			 dReal angle);
+       dReal angle);
 
 /* Quaternion multiplication, analogous to the matrix multiplication routines. */
 /* qa = rotate by qc, then qb */
diff --git a/deps/opende/ou/include/ou/atomic.h b/deps/opende/ou/include/ou/atomic.h
index 670f263..ef36e29 100644
--- a/deps/opende/ou/include/ou/atomic.h
+++ b/deps/opende/ou/include/ou/atomic.h
@@ -98,6 +98,8 @@
 #include <ou/namespace.h>
 #include <ou/platform.h>
 
+#include <gazebo/util/system.hh>
+
 
 /**
  *	\typedef atomicord32
@@ -410,32 +412,32 @@ typedef PVOID atomicptr;
 
 #define __OU_ATOMIC_ORD32_FUNCTIONS_DEFINED
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicIncrement(volatile atomicord32 *paoDestination)
 {
 	return ::InterlockedIncrement((__ou_intlck_target_t)paoDestination);
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicDecrement(volatile atomicord32 *paoDestination)
 {
 	return ::InterlockedDecrement((__ou_intlck_target_t)paoDestination);
 }
 
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicExchange(volatile atomicord32 *paoDestination, atomicord32 aoExchange)
 {
 	return ::InterlockedExchange((__ou_intlck_target_t)paoDestination, aoExchange);
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicExchangeAdd(volatile atomicord32 *paoDestination, atomicord32 aoAddend)
 {
 	return ::InterlockedExchangeAdd((__ou_xchgadd_target_t)paoDestination, aoAddend);
 }
 
-static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*bool */AtomicCompareExchange(volatile atomicord32 *paoDestination, atomicord32 aoComparand, atomicord32 aoExchange)
 {
 	return (aoComparand == (atomicord32)::InterlockedCompareExchange((__ou_cmpxchg_target_t)paoDestination, (__ou_cmpxchg_value_t)aoExchange, (__ou_cmpxchg_value_t)aoComparand));
@@ -444,7 +446,7 @@ static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
 
 #define __OU_ATOMIC_BIT_FUNCTIONS_DEFINED
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE
 /*atomicord32 */AtomicAnd(volatile atomicord32 *paoDestination, atomicord32 aoBitMask)
 {
 	atomicord32 aoOldValue = *paoDestination;
@@ -464,7 +466,7 @@ static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
     return aoOldValue;
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE
 /*atomicord32 */AtomicOr(volatile atomicord32 *paoDestination, atomicord32 aoBitMask)
 {
 	atomicord32 aoOldValue = *paoDestination;
@@ -484,7 +486,7 @@ static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
     return aoOldValue;
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE
 /*atomicord32 */AtomicXor(volatile atomicord32 *paoDestination, atomicord32 aoBitMask)
 {
 	atomicord32 aoOldValue = *paoDestination;
@@ -507,7 +509,7 @@ static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
 
 #define __OU_ATOMIC_PTR_FUNCTIONS_DEFINED
 
-static _OU_ALWAYSINLINE_PRE atomicptr _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicptr _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE
 /*atomicptr */AtomicExchangePointer(volatile atomicptr *papDestination, atomicptr apExchange)
 {
 #if _OU_TARGET_BITS == _OU_TARGET_BITS_32
@@ -523,7 +525,7 @@ static _OU_ALWAYSINLINE_PRE atomicptr _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
 #endif // #if _OU_TARGET_BITS == ...
 }
 
-static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE
 /*bool */AtomicCompareExchangePointer(volatile atomicptr *papDestination, atomicptr apComparand, atomicptr apExchange)
 {
 #if _OU_TARGET_BITS == _OU_TARGET_BITS_32
@@ -570,32 +572,32 @@ typedef void *atomicptr;
 
 #define __OU_ATOMIC_ORD32_FUNCTIONS_DEFINED
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicIncrement(volatile atomicord32 *paoDestination)
 {
 	return (atomic_add_value(paoDestination, 1U) + 1U);
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicDecrement(volatile atomicord32 *paoDestination)
 {
 	return (atomic_sub_value(paoDestination, 1U) - 1U);
 }
 
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicExchange(volatile atomicord32 *paoDestination, atomicord32 aoExchange)
 {
 	return _smp_xchg(paoDestination, aoExchange);
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicExchangeAdd(volatile atomicord32 *paoDestination, atomicord32 aoAddend)
 {
 	return atomic_add_value(paoDestination, aoAddend);
 }
 
-static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*bool */AtomicCompareExchange(volatile atomicord32 *paoDestination, atomicord32 aoComparand, atomicord32 aoExchange)
 {
 	return (aoComparand == (atomicord32)_smp_cmpxchg(paoDestination, aoComparand, aoExchange));
@@ -604,19 +606,19 @@ static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
 
 #define __OU_ATOMIC_BIT_FUNCTIONS_DEFINED
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicAnd(volatile atomicord32 *paoDestination, atomicord32 aoBitMask)
 {
 	return atomic_clr_value(paoDestination, ~aoBitMask);
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicOr(volatile atomicord32 *paoDestination, atomicord32 aoBitMask)
 {
 	return atomic_set_value(paoDestination, aoBitMask);
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicXor(volatile atomicord32 *paoDestination, atomicord32 aoBitMask)
 {
 	return atomic_toggle_value(paoDestination, aoBitMask);
@@ -625,37 +627,37 @@ static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
 
 #define __OU_ATOMIC_ORD32_NORESULT_FUNCTIONS_DEFINED
 
-static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*void */AtomicIncrementNoResult(volatile atomicord32 *paoDestination)
 {
 	atomic_add(paoDestination, 1U);
 }
 
-static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*void */AtomicDecrementNoResult(volatile atomicord32 *paoDestination)
 {
 	atomic_sub(paoDestination, 1U);
 }
 
-static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*void */AtomicExchangeAddNoResult(volatile atomicord32 *paoDestination, atomicord32 aoAddend)
 {
 	atomic_add(paoDestination, aoAddend);
 }
 
-static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*void */AtomicAndNoResult(volatile atomicord32 *paoDestination, atomicord32 aoBitMask)
 {
 	atomic_clr(paoDestination, ~aoBitMask);
 }
 
-static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*void */AtomicOrNoResult(volatile atomicord32 *paoDestination, atomicord32 aoBitMask)
 {
 	atomic_set(paoDestination, aoBitMask);
 }
 
-static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*void */AtomicXorNoResult(volatile atomicord32 *paoDestination, atomicord32 aoBitMask)
 {
 	atomic_toggle(paoDestination, aoBitMask);
@@ -691,20 +693,20 @@ typedef void *atomicptr;
 
 #define __OU_ATOMIC_ORD32_FUNCTIONS_DEFINED
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicIncrement(volatile atomicord32 *paoDestination)
 {
 	return OSAtomicIncrement32Barrier(paoDestination);
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicDecrement(volatile atomicord32 *paoDestination)
 {
 	return OSAtomicDecrement32Barrier(paoDestination);
 }
 
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicExchange(volatile atomicord32 *paoDestination, atomicord32 aoExchange)
 {
 	atomicord32 aoOldValue = *paoDestination;
@@ -726,13 +728,13 @@ static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
 	return aoOldValue;
 }
 
-static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE atomicord32 _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*atomicord32 */AtomicExchangeAdd(volatile atomicord32 *paoDestination, atomicord32 aoAddend)
 {
 	return (OSAtomicAdd32Barrier(aoAddend, paoDestination) - aoAddend);
 }
 
-static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API 
+static _OU_ALWAYSINLINE_PRE bool _OU_ALWAYSINLINE_IN _OU_CONVENTION_API GAZEBO_VISIBLE 
 /*bool */AtomicCompareExchange(volatile atomicord32 *paoDestination, atomicord32 aoComparand, atomicord32 aoExchange)
 {
 	return OSAtomicCompareAndSwap32Barrier(aoComparand, aoExchange, paoDestination);
@@ -1500,19 +1502,19 @@ atomicord32 _OU_CONVENTION_API AtomicXor(volatile atomicord32 *paoDestination, a
 
 #if !defined(__OU_ATOMIC_PTR_FUNCTIONS_DEFINED)
 
-atomicptr _OU_CONVENTION_API AtomicExchangePointer(volatile atomicptr *papDestination, atomicptr apExchange);
-bool _OU_CONVENTION_API AtomicCompareExchangePointer(volatile atomicptr *papDestination, atomicptr apComparand, atomicptr apExchange);
+atomicptr _OU_CONVENTION_API GAZEBO_VISIBLE AtomicExchangePointer(volatile atomicptr *papDestination, atomicptr apExchange);
+bool _OU_CONVENTION_API GAZEBO_VISIBLE AtomicCompareExchangePointer(volatile atomicptr *papDestination, atomicptr apComparand, atomicptr apExchange);
 
 
 #if defined(__OU_DOXYGEN__) 
 
 // Doxygen fooling declarations (used for documentation generation only)
-void _OU_CONVENTION_API AtomicIncrementNoResult(volatile atomicord32 *paoDestination);
-void _OU_CONVENTION_API AtomicDecrementNoResult(volatile atomicord32 *paoDestination);
-void _OU_CONVENTION_API AtomicExchangeAddNoResult(volatile atomicord32 *paoDestination, atomicord32 aoAddend);
-void _OU_CONVENTION_API AtomicAndNoResult(volatile atomicord32 *paoDestination, atomicord32 aoBitMask);
-void _OU_CONVENTION_API AtomicOrNoResult(volatile atomicord32 *paoDestination, atomicord32 aoBitMask);
-void _OU_CONVENTION_API AtomicXorNoResult(volatile atomicord32 *paoDestination, atomicord32 aoBitMask);
+void _OU_CONVENTION_API GAZEBO_VISIBLE AtomicIncrementNoResult(volatile atomicord32 *paoDestination);
+void _OU_CONVENTION_API GAZEBO_VISIBLE AtomicDecrementNoResult(volatile atomicord32 *paoDestination);
+void _OU_CONVENTION_API GAZEBO_VISIBLE AtomicExchangeAddNoResult(volatile atomicord32 *paoDestination, atomicord32 aoAddend);
+void _OU_CONVENTION_API GAZEBO_VISIBLE AtomicAndNoResult(volatile atomicord32 *paoDestination, atomicord32 aoBitMask);
+void _OU_CONVENTION_API GAZEBO_VISIBLE AtomicOrNoResult(volatile atomicord32 *paoDestination, atomicord32 aoBitMask);
+void _OU_CONVENTION_API GAZEBO_VISIBLE AtomicXorNoResult(volatile atomicord32 *paoDestination, atomicord32 aoBitMask);
 
 
 #endif // #if defined(__OU_DOXYGEN__)
@@ -1522,8 +1524,8 @@ void _OU_CONVENTION_API AtomicXorNoResult(volatile atomicord32 *paoDestination,
 #define __OU_ATOMIC_INITIALIZATION_FUNCTIONS_REQUIRED
 
 // Initialization must be performed from main thread
-bool _OU_CONVENTION_API InitializeAtomicAPI();
-void _OU_CONVENTION_API FinalizeAtomicAPI();
+bool _OU_CONVENTION_API GAZEBO_VISIBLE InitializeAtomicAPI();
+void _OU_CONVENTION_API GAZEBO_VISIBLE FinalizeAtomicAPI();
 
 
 #endif // #if !defined(__OU_ATOMIC_PTR_FUNCTIONS_DEFINED)
@@ -1580,14 +1582,14 @@ static _OU_ALWAYSINLINE_PRE void _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
 #if !defined(__OU_ATOMIC_INITIALIZATION_FUNCTIONS_REQUIRED)
 
 // Initialization must be performed from main thread
-static _OU_INLINE bool _OU_CONVENTION_API InitializeAtomicAPI()
+static _OU_INLINE bool _OU_CONVENTION_API GAZEBO_VISIBLE InitializeAtomicAPI()
 {
 	// Do nothing
 	
 	return true;
 }
 
-static _OU_INLINE void _OU_CONVENTION_API FinalizeAtomicAPI()
+static _OU_INLINE void _OU_CONVENTION_API GAZEBO_VISIBLE FinalizeAtomicAPI()
 {
 	// Do nothing
 }
diff --git a/deps/opende/ou/include/ou/atomicflags.h b/deps/opende/ou/include/ou/atomicflags.h
index 9d9a3f7..5c6fd6e 100644
--- a/deps/opende/ou/include/ou/atomicflags.h
+++ b/deps/opende/ou/include/ou/atomicflags.h
@@ -32,6 +32,7 @@
 #include <ou/atomic.h>
 #include <ou/assert.h>
 #include <ou/namespace.h>
+#include <gazebo/util/system.hh>
 
 
 BEGIN_NAMESPACE_OU()
@@ -46,7 +47,7 @@ BEGIN_NAMESPACE_OU()
  *	knowledge in field, of course).
  */
 
-class CAtomicFlags
+class GAZEBO_VISIBLE CAtomicFlags
 {
 public:
 	_OU_INLINE _OU_CONVENTION_METHOD CAtomicFlags():
diff --git a/deps/opende/ou/include/ou/customization.h b/deps/opende/ou/include/ou/customization.h
index 40754e4..c1906e1 100644
--- a/deps/opende/ou/include/ou/customization.h
+++ b/deps/opende/ou/include/ou/customization.h
@@ -33,6 +33,7 @@
 #include <ou/platform.h>
 
 #include <stddef.h>
+#include <gazebo/util/system.hh>
 
 
 BEGIN_NAMESPACE_OU()
@@ -77,7 +78,7 @@ typedef void (_OU_CONVENTION_CALLBACK *CAssertionFailedProcedure)(EASSERTIONFAIL
 	const char *szAssertionExpression, const char *szAssertionFileName, unsigned int uiAssertionSourceLine);
 
 
-class CAssertionCheckCustomization
+class GAZEBO_VISIBLE CAssertionCheckCustomization
 {
 public:
 	static _OU_ALWAYSINLINE_PRE CAssertionFailedProcedure _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
@@ -107,7 +108,7 @@ typedef void *(_OU_CONVENTION_CALLBACK *CMemoryReallocationProcedure)(void *pv_E
 typedef void (_OU_CONVENTION_CALLBACK *CMemoryDeallocationProcedure)(void *pv_ExistingBlock);
 
 
-class CMemoryManagerCustomization
+class GAZEBO_VISIBLE CMemoryManagerCustomization
 {
 public:
 	static _OU_ALWAYSINLINE_PRE CMemoryAllocationProcedure _OU_ALWAYSINLINE_IN _OU_CONVENTION_API
diff --git a/deps/opende/ou/include/ou/enumarrays.h b/deps/opende/ou/include/ou/enumarrays.h
index c5e6633..8e3b4b6 100644
--- a/deps/opende/ou/include/ou/enumarrays.h
+++ b/deps/opende/ou/include/ou/enumarrays.h
@@ -32,6 +32,7 @@
 #include <ou/macros.h>
 #include <ou/platform.h>
 #include <ou/namespace.h>
+#include <gazebo/util/system.hh>
 
 
 BEGIN_NAMESPACE_OU()
@@ -70,7 +71,7 @@ struct CTypeStandardLess
  */
 
 template<typename EnumType, const EnumType EnumMax, typename ElementType, const int Instance=0, class CElementEqualType=CTypeStandardEqual<ElementType> >
-class CEnumUnsortedElementArray
+class GAZEBO_VISIBLE CEnumUnsortedElementArray
 {
 public:
 	_OU_CONVENTION_METHOD CEnumUnsortedElementArray()
@@ -154,7 +155,7 @@ private:
  */
 
 template<typename EnumType, const EnumType EnumMax, typename ElementType, const int Instance=0, class CElementLessType=CTypeStandardLess<ElementType> >
-class CEnumSortedElementArray
+class GAZEBO_VISIBLE CEnumSortedElementArray
 {
 public:
 	_OU_INLINE _OU_CONVENTION_METHOD CEnumSortedElementArray()
diff --git a/deps/opende/ou/include/ou/simpleflags.h b/deps/opende/ou/include/ou/simpleflags.h
index 6b668b2..5f782a2 100644
--- a/deps/opende/ou/include/ou/simpleflags.h
+++ b/deps/opende/ou/include/ou/simpleflags.h
@@ -34,13 +34,14 @@
 #include <ou/namespace.h>
 
 #include <stddef.h>
+#include <gazebo/util/system.hh>
 
 
 BEGIN_NAMESPACE_OU()
 
 
 template<typename ContainerType>
-class CSimpleFlagsTemplate
+class GAZEBO_VISIBLE CSimpleFlagsTemplate
 {
 public:
 	_OU_INLINE _OU_CONVENTION_METHOD CSimpleFlagsTemplate():
diff --git a/deps/opende/ou/include/ou/threadlocalstorage.h b/deps/opende/ou/include/ou/threadlocalstorage.h
index 674c593..e162a68 100644
--- a/deps/opende/ou/include/ou/threadlocalstorage.h
+++ b/deps/opende/ou/include/ou/threadlocalstorage.h
@@ -42,6 +42,7 @@
 #else // #if _OU_TARGET_OS != _OU_TARGET_OS_WINDOWS
 
 #include <pthread.h>
+#include <gazebo/util/system.hh>
 
 
 #endif // #if _OU_TARGET_OS == ...
@@ -155,7 +156,7 @@ private:
 //////////////////////////////////////////////////////////////////////////
 // API declaration
 
-class CThreadLocalStorage
+class GAZEBO_VISIBLE CThreadLocalStorage
 {
 public: // Safe methods
 	/*
@@ -260,7 +261,7 @@ private:
 //////////////////////////////////////////////////////////////////////////
 // Initialization/finalization
 
-class CTLSInitialization
+class GAZEBO_VISIBLE CTLSInitialization
 {
 public:
 	enum EINITIALIZATIONFLAGS
diff --git a/deps/opende/src/collision_kernel.cpp b/deps/opende/src/collision_kernel.cpp
index e2473d9..c369552 100644
--- a/deps/opende/src/collision_kernel.cpp
+++ b/deps/opende/src/collision_kernel.cpp
@@ -27,6 +27,7 @@ for geometry objects
 
 */
 
+#include <iostream>
 #include <ode/common.h>
 #include <ode/matrix.h>
 #include <ode/rotation.h>
@@ -350,14 +351,18 @@ dxGeom::dxGeom (dSpaceID _space, int is_placeable)
   data = 0;
   body = 0;
   body_next = 0;
-  if (is_placeable) {
-	final_posr = dAllocPosr();
-    dSetZero (final_posr->pos,4);
+
+  if (is_placeable)
+  {
+    final_posr = dAllocPosr();
+    dSetZero (final_posr->pos, 4);
     dRSetIdentity (final_posr->R);
   }
-  else {
+  else
+  {
     final_posr = 0;
   }
+
   offset_posr = 0;
 
   // setup space vars
@@ -375,9 +380,12 @@ dxGeom::dxGeom (dSpaceID _space, int is_placeable)
 
 dxGeom::~dxGeom()
 {
-   if (parent_space) dSpaceRemove (parent_space,this);
+   if (parent_space)
+     dSpaceRemove (parent_space,this);
+
    if ((gflags & GEOM_PLACEABLE) && (!body || (body && offset_posr)))
      dFreePosr(final_posr);
+
    if (offset_posr) dFreePosr(offset_posr);
    bodyRemove();
 }
@@ -456,7 +464,8 @@ void dxGeom::computePosr()
   // should only be recalced if we need to - ie offset from a body
   dIASSERT(offset_posr);  
   dIASSERT(body);
-  
+  dIASSERT(final_posr);
+
   dMultiply0_331 (final_posr->pos,body->posr.R,offset_posr->pos);
   final_posr->pos[0] += body->posr.pos[0];
   final_posr->pos[1] += body->posr.pos[1];
@@ -510,13 +519,19 @@ void dGeomSetBody (dxGeom *g, dxBody *b)
   dUASSERT (b == NULL || (g->gflags & GEOM_PLACEABLE),"geom must be placeable");
   CHECK_NOT_LOCKED (g->parent_space);
 
-  if (b) {
-    if (!g->body) dFreePosr(g->final_posr);
-    if (g->body != b) {
-      if (g->offset_posr) {
+  if (b)
+  {
+    if (!g->body)
+      dFreePosr(g->final_posr);
+
+    if (g->body != b)
+    {
+      if (g->offset_posr)
+      {
         dFreePosr(g->offset_posr);
         g->offset_posr = 0;
       }
+
       g->final_posr = &b->posr;
       g->bodyRemove();
       g->bodyAdd (b);
@@ -1043,7 +1058,7 @@ void dGeomSetOffsetPosition (dxGeom *g, dReal x, dReal y, dReal z)
   CHECK_NOT_LOCKED (g->parent_space);
   if (!g->offset_posr) 
   {
-	dGeomCreateOffset(g);
+    dGeomCreateOffset(g);
   }
   g->offset_posr->pos[0] = x;
   g->offset_posr->pos[1] = y;
diff --git a/deps/opende/src/fastldlt.c b/deps/opende/src/fastldlt.c
index 0d9894f..86728c5 100644
--- a/deps/opende/src/fastldlt.c
+++ b/deps/opende/src/fastldlt.c
@@ -1,5 +1,6 @@
 /* generated code, do not edit. */
 
+#include <assert.h>
 #include "ode/matrix.h"
 
 /* solve L*X=B, with B containing 1 right hand sides.
@@ -376,7 +377,9 @@ void _dFactorLDLT (dReal *A, dReal *d, int n, int nskip1)
     /* done factorizing 1 x 1 block */
     break;
     
-    default: *((char*)0)=0;  /* this should never happen! */
+    /* this should never happen! */
+    default:
+      assert(1);
   }
 }
 
diff --git a/deps/opende/src/joints/ball.cpp b/deps/opende/src/joints/ball.cpp
index 7ac20ea..ff6830e 100644
--- a/deps/opende/src/joints/ball.cpp
+++ b/deps/opende/src/joints/ball.cpp
@@ -33,8 +33,9 @@ dxJointBall::dxJointBall( dxWorld *w ) :
 {
     dSetZero( anchor1, 4 );
     dSetZero( anchor2, 4 );
-    erp = world->global_erp;
-    cfm = world->global_cfm;
+    // These are now set in dxJoint constructor
+    // erp = world->global_erp;
+    // cfm = world->global_cfm;
 }
 
 
@@ -56,10 +57,16 @@ dxJointBall::getInfo1( dxJoint::Info1 *info )
 void
 dxJointBall::getInfo2( dxJoint::Info2 *info )
 {
-    info->erp = erp;
-    info->cfm[0] = cfm;
-    info->cfm[1] = cfm;
-    info->cfm[2] = cfm;
+    // If joint values of erp and cfm are negative, then ignore them.
+    // info->erp, info->cfm already have the global values from quickstep
+    if (this->erp >= 0)
+      info->erp = this->erp;
+    if (this->cfm >= 0)
+    {
+      info->cfm[0] = cfm;
+      info->cfm[1] = cfm;
+      info->cfm[2] = cfm;
+    }
     setBall( this, info, anchor1, anchor2 );
 }
 
diff --git a/deps/opende/src/joints/ball.h b/deps/opende/src/joints/ball.h
index 501e121..6c473e5 100644
--- a/deps/opende/src/joints/ball.h
+++ b/deps/opende/src/joints/ball.h
@@ -31,8 +31,9 @@ struct dxJointBall : public dxJoint
 {
     dVector3 anchor1;   // anchor w.r.t first body
     dVector3 anchor2;   // anchor w.r.t second body
-    dReal erp;          // error reduction
-    dReal cfm;          // constraint force mix in
+    // erp and cfm moved to joint.h by OSRF
+    // dReal erp;          // error reduction
+    // dReal cfm;          // constraint force mix in
     void set( int num, dReal value );
     dReal get( int num );
 
diff --git a/deps/opende/src/joints/contact.cpp b/deps/opende/src/joints/contact.cpp
index c7370f0..e0136b1 100644
--- a/deps/opende/src/joints/contact.cpp
+++ b/deps/opende/src/joints/contact.cpp
@@ -116,10 +116,10 @@ dxJointContact::getInfo2( dxJoint::Info2 *info )
     }
 
     // set right hand side and cfm value for normal
-    dReal erp = info->erp;
+    dReal local_erp = info->erp;
     if ( contact.surface.mode & dContactSoftERP )
-        erp = contact.surface.soft_erp;
-    dReal k = info->fps * erp;
+        local_erp = contact.surface.soft_erp;
+    dReal k = info->fps * local_erp;
 
     // experimental - check relative acceleration at the contact
 
diff --git a/deps/opende/src/joints/dball.cpp b/deps/opende/src/joints/dball.cpp
new file mode 100644
index 0000000..5186cbf
--- /dev/null
+++ b/deps/opende/src/joints/dball.cpp
@@ -0,0 +1,382 @@
+/*************************************************************************
+ *                                                                       *
+ * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
+ * All rights reserved.  Email: russ at q12.org   Web: www.q12.org          *
+ *                                                                       *
+ * This library is free software; you can redistribute it and/or         *
+ * modify it under the terms of EITHER:                                  *
+ *   (1) The GNU Lesser General Public License as published by the Free  *
+ *       Software Foundation; either version 2.1 of the License, or (at  *
+ *       your option) any later version. The text of the GNU Lesser      *
+ *       General Public License is included with this library in the     *
+ *       file LICENSE.TXT.                                               *
+ *   (2) The BSD-style license that is included with this library in     *
+ *       the file LICENSE-BSD.TXT.                                       *
+ *                                                                       *
+ * This library 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 files    *
+ * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
+ *                                                                       *
+ *************************************************************************/
+
+
+#include <ode/odeconfig.h>
+#include "config.h"
+#include "dball.h"
+#include "joint_internal.h"
+
+/*
+ * Double Ball joint: tries to maintain a fixed distance between two anchor
+ * points.
+ */
+
+dxJointDBall::dxJointDBall(dxWorld *w) :
+    dxJoint(w)
+{
+    dSetZero(anchor1, 3);
+    dSetZero(anchor2, 3);
+    targetDistance = 0;
+    erp = world->global_erp;
+    cfm = world->global_cfm;
+}
+
+void
+dxJointDBall::getSureMaxInfo( SureMaxInfo* info )
+{
+    info->max_m = 1;
+}
+void
+dxJointDBall::getInfo1( dxJoint::Info1 *info )
+{
+    info->m = 1;
+    info->nub = 1;
+}
+
+void
+dxJointDBall::getInfo2( dReal worldFPS, dReal /*worldERP*/, const Info2 *info )
+{
+    info->cfm[0] = this->cfm;
+
+    dVector3 globalA1, globalA2;
+    dBodyGetRelPointPos(node[0].body, anchor1[0], anchor1[1], anchor1[2], globalA1);
+    if (node[1].body)
+        dBodyGetRelPointPos(node[1].body, anchor2[0], anchor2[1], anchor2[2], globalA2);
+    else
+        dCopyVector3(globalA2, anchor2);
+
+    dVector3 q;
+    dSubtractVectors3(q, globalA1, globalA2);
+
+#ifdef dSINGLE
+    const dReal MIN_LENGTH = REAL(1e-7);
+#else
+    const dReal MIN_LENGTH = REAL(1e-12);
+#endif
+
+    if (dCalcVectorLength3(q) < MIN_LENGTH) {
+        // too small, let's choose an arbitrary direction
+        // heuristic: difference in velocities at anchors
+        dVector3 v1, v2;
+        dBodyGetPointVel(node[0].body, globalA1[0], globalA1[1], globalA1[2], v1);
+        if (node[1].body)
+            dBodyGetPointVel(node[1].body, globalA2[0], globalA2[1], globalA2[2], v2);
+        else
+            dSetZero(v2, 3);
+        dSubtractVectors3(q, v1, v2);
+
+        if (dCalcVectorLength3(q) < MIN_LENGTH) {
+            // this direction is as good as any
+            q[0] = 1;
+            q[1] = 0;
+            q[2] = 0;
+        }
+    }
+    dNormalize3(q);
+
+    info->J1l[0] = q[0];
+    info->J1l[1] = q[1];
+    info->J1l[2] = q[2];
+
+    dVector3 relA1;
+    dBodyVectorToWorld(node[0].body,
+                       anchor1[0], anchor1[1], anchor1[2],
+                       relA1);
+
+    dMatrix3 a1m;
+    dSetZero(a1m, 12);
+    dSetCrossMatrixMinus(a1m, relA1, 4);
+
+    dMultiply1_331(info->J1a, a1m, q);
+
+    if (node[1].body) {
+        info->J2l[0] = -q[0];
+        info->J2l[1] = -q[1];
+        info->J2l[2] = -q[2];
+
+        dVector3 relA2;
+        dBodyVectorToWorld(node[1].body,
+                           anchor2[0], anchor2[1], anchor2[2],
+                           relA2);
+        dMatrix3 a2m;
+        dSetZero(a2m, 12);
+        dSetCrossMatrixPlus(a2m, relA2, 4);
+        dMultiply1_331(info->J2a, a2m, q);
+    }
+    
+    const dReal k = worldFPS * this->erp;
+    info->c[0] = k * (targetDistance - dCalcPointsDistance3(globalA1, globalA2));
+}
+
+void
+dxJointDBall::getInfo2( Info2 *info )
+{
+    info->cfm[0] = this->cfm;
+
+    dVector3 globalA1, globalA2;
+    dBodyGetRelPointPos(node[0].body, anchor1[0], anchor1[1], anchor1[2], globalA1);
+    if (node[1].body)
+        dBodyGetRelPointPos(node[1].body, anchor2[0], anchor2[1], anchor2[2], globalA2);
+    else
+        dCopyVector3(globalA2, anchor2);
+
+    dVector3 q;
+    dSubtractVectors3(q, globalA1, globalA2);
+
+#ifdef dSINGLE
+    const dReal MIN_LENGTH = REAL(1e-7);
+#else
+    const dReal MIN_LENGTH = REAL(1e-12);
+#endif
+
+    if (dCalcVectorLength3(q) < MIN_LENGTH) {
+        // too small, let's choose an arbitrary direction
+        // heuristic: difference in velocities at anchors
+        dVector3 v1, v2;
+        dBodyGetPointVel(node[0].body, globalA1[0], globalA1[1], globalA1[2], v1);
+        if (node[1].body)
+            dBodyGetPointVel(node[1].body, globalA2[0], globalA2[1], globalA2[2], v2);
+        else
+            dSetZero(v2, 3);
+        dSubtractVectors3(q, v1, v2);
+
+        if (dCalcVectorLength3(q) < MIN_LENGTH) {
+            // this direction is as good as any
+            q[0] = 1;
+            q[1] = 0;
+            q[2] = 0;
+        }
+    }
+    dNormalize3(q);
+
+    info->J1l[0] = q[0];
+    info->J1l[1] = q[1];
+    info->J1l[2] = q[2];
+
+    dVector3 relA1;
+    dBodyVectorToWorld(node[0].body,
+                       anchor1[0], anchor1[1], anchor1[2],
+                       relA1);
+
+    dMatrix3 a1m;
+    dSetZero(a1m, 12);
+    dSetCrossMatrixMinus(a1m, relA1, 4);
+
+    dMultiply1_331(info->J1a, a1m, q);
+
+    if (node[1].body) {
+        info->J2l[0] = -q[0];
+        info->J2l[1] = -q[1];
+        info->J2l[2] = -q[2];
+
+        dVector3 relA2;
+        dBodyVectorToWorld(node[1].body,
+                           anchor2[0], anchor2[1], anchor2[2],
+                           relA2);
+        dMatrix3 a2m;
+        dSetZero(a2m, 12);
+        dSetCrossMatrixPlus(a2m, relA2, 4);
+        dMultiply1_331(info->J2a, a2m, q);
+    }
+    
+    const dReal k = 0.2;  // info->fps * this->erp;
+    info->c[0] = k * (targetDistance - dCalcPointsDistance3(globalA1, globalA2));
+}
+
+
+void
+dxJointDBall::updateTargetDistance()
+{
+    dVector3 p1, p2;
+
+    if (node[0].body)
+        dBodyGetRelPointPos(node[0].body, anchor1[0], anchor1[1], anchor1[2], p1);
+    else
+        dCopyVector3(p1, anchor1);
+    if (node[1].body)
+        dBodyGetRelPointPos(node[1].body, anchor2[0], anchor2[1], anchor2[2], p2);
+    else
+        dCopyVector3(p2, anchor2);
+
+    targetDistance = dCalcPointsDistance3(p1, p2);
+}
+
+
+void dJointSetDBallAnchor1( dJointID j, dReal x, dReal y, dReal z )
+{
+    dxJointDBall* joint = static_cast<dxJointDBall*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    if ( joint->flags & dJOINT_REVERSE ) {
+        if (joint->node[1].body)
+            dBodyGetPosRelPoint(joint->node[1].body, x, y, z, joint->anchor2);
+        else {
+            joint->anchor2[0] = x;
+            joint->anchor2[1] = y;
+            joint->anchor2[2] = z;
+        }
+    } else {
+        if (joint->node[0].body)
+            dBodyGetPosRelPoint(joint->node[0].body, x, y, z, joint->anchor1);
+        else {
+            joint->anchor1[0] = x;
+            joint->anchor1[1] = y;
+            joint->anchor1[2] = z;
+        }
+    }
+
+    joint->updateTargetDistance();
+}
+
+
+void dJointSetDBallAnchor2( dJointID j, dReal x, dReal y, dReal z )
+{
+    dxJointDBall* joint = static_cast<dxJointDBall*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+
+    if ( joint->flags & dJOINT_REVERSE ) {
+        if (joint->node[0].body)
+            dBodyGetPosRelPoint(joint->node[0].body, x, y, z, joint->anchor1);
+        else {
+            joint->anchor1[0] = x;
+            joint->anchor1[1] = y;
+            joint->anchor1[2] = z;
+        }
+    } else {
+        if (joint->node[1].body)
+            dBodyGetPosRelPoint(joint->node[1].body, x, y, z, joint->anchor2);
+        else {
+            joint->anchor2[0] = x;
+            joint->anchor2[1] = y;
+            joint->anchor2[2] = z;
+        }
+    }
+
+    joint->updateTargetDistance();
+}
+
+dReal dJointGetDBallDistance(dJointID j)
+{
+    dxJointDBall* joint = static_cast<dxJointDBall*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    return joint->targetDistance;
+}
+
+
+void dJointGetDBallAnchor1( dJointID j, dVector3 result )
+{
+    dxJointDBall* joint = static_cast<dxJointDBall*>(j);
+    dUASSERT( joint, "bad joint argument" );
+    dUASSERT( result, "bad result argument" );
+
+    if ( joint->flags & dJOINT_REVERSE ) {
+        if (joint->node[1].body)
+            dBodyGetRelPointPos(joint->node[1].body, joint->anchor2[0], joint->anchor2[1], joint->anchor2[2], result);
+        else
+            dCopyVector3(result, joint->anchor2);
+    } else {
+        if (joint->node[0].body)
+            dBodyGetRelPointPos(joint->node[0].body, joint->anchor1[0], joint->anchor1[1], joint->anchor1[2], result);
+        else
+            dCopyVector3(result, joint->anchor1);
+    }
+}
+
+
+void dJointGetDBallAnchor2( dJointID j, dVector3 result )
+{
+    dxJointDBall* joint = static_cast<dxJointDBall*>(j);
+    dUASSERT( joint, "bad joint argument" );
+    dUASSERT( result, "bad result argument" );
+
+    if ( joint->flags & dJOINT_REVERSE ) {
+        if (joint->node[0].body)
+            dBodyGetRelPointPos(joint->node[0].body, joint->anchor1[0], joint->anchor1[1], joint->anchor1[2], result);
+        else
+            dCopyVector3(result, joint->anchor1);
+    } else {
+        if (joint->node[1].body)
+            dBodyGetRelPointPos(joint->node[1].body, joint->anchor2[0], joint->anchor2[1], joint->anchor2[2], result);
+        else
+            dCopyVector3(result, joint->anchor2);
+    }
+}
+
+
+void dJointSetDBallParam( dJointID j, int parameter, dReal value )
+{
+    dxJointDBall* joint = static_cast<dxJointDBall*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    switch ( parameter ) {
+        case dParamCFM:
+            joint->cfm = value;
+            break;
+        case dParamERP:
+            joint->erp = value;
+            break;
+        default:
+            dUASSERT( false, "unknown joint parameter" );
+            break;
+    }
+}
+
+
+dReal dJointGetDBallParam( dJointID j, int parameter )
+{
+    dxJointDBall* joint = static_cast<dxJointDBall*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    switch ( parameter ) {
+        case dParamCFM:
+            return joint->cfm;
+        case dParamERP:
+            return joint->erp;
+        default:
+            return 0;
+    }
+}
+
+
+dJointType
+dxJointDBall::type() const
+{
+    return dJointTypeDBall;
+}
+
+size_t
+dxJointDBall::size() const
+{
+    return sizeof( *this );
+}
+
+void
+dxJointDBall::setRelativeValues()
+{
+    updateTargetDistance();
+}
+
+
+
diff --git a/deps/opende/src/joints/dball.h b/deps/opende/src/joints/dball.h
new file mode 100644
index 0000000..35ff96c
--- /dev/null
+++ b/deps/opende/src/joints/dball.h
@@ -0,0 +1,56 @@
+/*************************************************************************
+ *                                                                       *
+ * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
+ * All rights reserved.  Email: russ at q12.org   Web: www.q12.org          *
+ *                                                                       *
+ * This library is free software; you can redistribute it and/or         *
+ * modify it under the terms of EITHER:                                  *
+ *   (1) The GNU Lesser General Public License as published by the Free  *
+ *       Software Foundation; either version 2.1 of the License, or (at  *
+ *       your option) any later version. The text of the GNU Lesser      *
+ *       General Public License is included with this library in the     *
+ *       file LICENSE.TXT.                                               *
+ *   (2) The BSD-style license that is included with this library in     *
+ *       the file LICENSE-BSD.TXT.                                       *
+ *                                                                       *
+ * This library 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 files    *
+ * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
+ *                                                                       *
+ *************************************************************************/
+
+#ifndef _ODE_JOINT_DBALL_H_
+#define _ODE_JOINT_DBALL_H_
+
+#include "joint.h"
+
+// ball and socket
+
+struct dxJointDBall : public dxJoint
+{
+    dVector3 anchor1;   // anchor w.r.t first body
+    dVector3 anchor2;   // anchor w.r.t second body
+    dReal erp;          // error reduction
+    dReal cfm;          // constraint force mix in
+    dReal targetDistance;
+
+    void set( int num, dReal value );
+    dReal get( int num );
+
+    void updateTargetDistance();
+
+    dxJointDBall( dxWorld *w );
+    virtual void getSureMaxInfo( SureMaxInfo* info );
+    virtual void getInfo1( Info1* info );
+    virtual void getInfo2( dReal worldFPS, dReal worldERP, const Info2* info );
+    virtual void getInfo2( Info2* info );
+    virtual dJointType type() const;
+    virtual size_t size() const;
+
+    virtual void setRelativeValues();
+};
+
+
+#endif
+
diff --git a/deps/opende/src/joints/dhinge.cpp b/deps/opende/src/joints/dhinge.cpp
new file mode 100644
index 0000000..8619954
--- /dev/null
+++ b/deps/opende/src/joints/dhinge.cpp
@@ -0,0 +1,233 @@
+/*************************************************************************
+ *                                                                       *
+ * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
+ * All rights reserved.  Email: russ at q12.org   Web: www.q12.org          *
+ *                                                                       *
+ * This library is free software; you can redistribute it and/or         *
+ * modify it under the terms of EITHER:                                  *
+ *   (1) The GNU Lesser General Public License as published by the Free  *
+ *       Software Foundation; either version 2.1 of the License, or (at  *
+ *       your option) any later version. The text of the GNU Lesser      *
+ *       General Public License is included with this library in the     *
+ *       file LICENSE.TXT.                                               *
+ *   (2) The BSD-style license that is included with this library in     *
+ *       the file LICENSE-BSD.TXT.                                       *
+ *                                                                       *
+ * This library 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 files    *
+ * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
+ *                                                                       *
+ *************************************************************************/
+
+
+#include <ode/odeconfig.h>
+#include "config.h"
+#include "dhinge.h"
+#include "joint_internal.h"
+
+/*
+ * Double Hinge joint
+ */
+
+dxJointDHinge::dxJointDHinge(dxWorld* w) :
+    dxJointDBall(w)
+{
+    dSetZero(axis1, 3);
+    dSetZero(axis2, 3);
+}
+
+
+void
+dxJointDHinge::getSureMaxInfo( SureMaxInfo* info )
+{
+    info->max_m = 4;
+}
+
+
+void
+dxJointDHinge::getInfo1( dxJoint::Info1* info )
+{
+    info->m = 4;
+    info->nub = 4;
+}
+
+
+void
+dxJointDHinge::getInfo2( dReal worldFPS, dReal worldERP, const Info2* info )
+{
+    dxJointDBall::getInfo2( worldFPS, worldERP, info ); // sets row0
+    
+    const int skip = info->rowskip;
+    const int row1 = skip;
+    const int row2 = 2*skip;
+    const int row3 = 3*skip;
+    
+    dVector3 globalAxis1;
+    dBodyVectorToWorld(node[0].body, axis1[0], axis1[1], axis1[2], globalAxis1);
+
+    // angular constraints, perpendicular to axis
+    dVector3 p, q;
+    dPlaneSpace(globalAxis1, p, q);
+    info->J1a[row1+0] = p[0];
+    info->J1a[row1+1] = p[1];
+    info->J1a[row1+2] = p[2];
+    info->J1a[row2+0] = q[0];
+    info->J1a[row2+1] = q[1];
+    info->J1a[row2+2] = q[2];
+
+    if ( node[1].body ) {
+        info->J2a[row1+0] = -p[0];
+        info->J2a[row1+1] = -p[1];
+        info->J2a[row1+2] = -p[2];
+        info->J2a[row2+0] = -q[0];
+        info->J2a[row2+1] = -q[1];
+        info->J2a[row2+2] = -q[2];
+    }
+
+    dVector3 globalAxis2;
+    if ( node[1].body )
+        dBodyVectorToWorld(node[1].body, axis2[0], axis2[1], axis2[2], globalAxis2);
+    else
+        dCopyVector3(globalAxis2, axis2);
+    
+    // similar to the hinge joint
+    dVector3 u;
+    dCalcVectorCross3(u, globalAxis1, globalAxis2);
+    const dReal k = worldFPS * this->erp;
+
+    info->c[1] = k * dCalcVectorDot3( u, p );
+    info->c[2] = k * dCalcVectorDot3( u, q );
+
+
+
+
+    /*
+     * Constraint along the axis: translation along it should couple angular movement.
+     * This is just the ball-and-socket derivation, projected onto the hinge axis,
+     * producing a single constraint at the end.
+     *
+     * The choice of "ball" position can be arbitrary; we could place it at the center
+     * of one of the bodies, canceling out its rotational jacobian; or we could make
+     * everything symmetrical by just placing at the midpoint between the centers.
+     *
+     * I like symmetry, so I'll use the second approach here. I'll call the midpoint h.
+     *
+     * Of course, if the second body is NULL, the first body is pretty much locked
+     * along this axis, and the linear constraint is enough.
+     */
+
+    info->J1l[row3+0] = globalAxis1[0];
+    info->J1l[row3+1] = globalAxis1[1];
+    info->J1l[row3+2] = globalAxis1[2];
+
+    if ( node[1].body ) {
+
+        dVector3 h;
+        dAddScaledVectors3(h, node[0].body->posr.pos, node[1].body->posr.pos, -0.5, 0.5);
+
+        dVector3 omega;
+        dCalcVectorCross3(omega, h, globalAxis1);
+        info->J1a[row3+0] = omega[0];
+        info->J1a[row3+1] = omega[1];
+        info->J1a[row3+2] = omega[2];
+
+        info->J2l[row3+0] = -globalAxis1[0];
+        info->J2l[row3+1] = -globalAxis1[1];
+        info->J2l[row3+2] = -globalAxis1[2];
+
+        info->J2a[row3+0] = omega[0];
+        info->J2a[row3+1] = omega[1];
+        info->J2a[row3+2] = omega[2];
+    }
+
+    // error correction: both anchors should lie on the same plane perpendicular to the axis
+    dVector3 globalA1, globalA2;
+    dBodyGetRelPointPos(node[0].body, anchor1[0], anchor1[1], anchor1[2], globalA1);
+    if ( node[1].body )
+        dBodyGetRelPointPos(node[1].body, anchor2[0], anchor2[1], anchor2[2], globalA2);
+    else
+        dCopyVector3(globalA2, anchor2);
+
+    dVector3 d;
+    dSubtractVectors3(d, globalA1, globalA2); // displacement error
+    info->c[3] = -k * dCalcVectorDot3(globalAxis1, d);
+}
+
+void dJointSetDHingeAxis( dJointID j, dReal x, dReal y, dReal z )
+{
+    dxJointDHinge* joint = static_cast<dxJointDHinge*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    dBodyVectorFromWorld(joint->node[0].body, x, y, z, joint->axis1);
+    if (joint->node[1].body)
+        dBodyVectorFromWorld(joint->node[1].body, x, y, z, joint->axis2);
+    else {
+        joint->axis2[0] = x;
+        joint->axis2[1] = y;
+        joint->axis2[2] = z;
+    }
+    dNormalize3(joint->axis1);
+    dNormalize3(joint->axis2);
+}
+
+void dJointGetDHingeAxis( dJointID j, dVector3 result )
+{
+    dxJointDHinge* joint = static_cast<dxJointDHinge*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    dBodyVectorToWorld(joint->node[0].body, joint->axis1[0], joint->axis1[1], joint->axis1[2], result);
+}
+
+
+void dJointSetDHingeAnchor1( dJointID j, dReal x, dReal y, dReal z )
+{
+    dJointSetDBallAnchor1(j, x, y, z);
+}
+
+
+void dJointSetDHingeAnchor2( dJointID j, dReal x, dReal y, dReal z )
+{
+    dJointSetDBallAnchor2(j, x, y, z);
+}
+
+dReal dJointGetDHingeDistance(dJointID j)
+{
+    return dJointGetDBallDistance(j);
+}
+
+
+void dJointGetDHingeAnchor1( dJointID j, dVector3 result )
+{
+    dJointGetDBallAnchor1(j, result);
+}
+
+
+void dJointGetDHingeAnchor2( dJointID j, dVector3 result )
+{
+    dJointGetDBallAnchor2(j, result);
+}
+
+
+void dJointSetDHingeParam( dJointID j, int parameter, dReal value )
+{
+    dJointSetDBallParam(j, parameter, value);
+}
+
+
+dReal dJointGetDHingeParam( dJointID j, int parameter )
+{
+    return dJointGetDBallParam(j, parameter);
+}
+
+dJointType
+dxJointDHinge::type() const
+{
+    return dJointTypeDHinge;
+}
+
+size_t
+dxJointDHinge::size() const
+{
+    return sizeof( *this );
+}
diff --git a/deps/opende/src/joints/dhinge.h b/deps/opende/src/joints/dhinge.h
new file mode 100644
index 0000000..2e9fce9
--- /dev/null
+++ b/deps/opende/src/joints/dhinge.h
@@ -0,0 +1,43 @@
+/*************************************************************************
+ *                                                                       *
+ * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
+ * All rights reserved.  Email: russ at q12.org   Web: www.q12.org          *
+ *                                                                       *
+ * This library is free software; you can redistribute it and/or         *
+ * modify it under the terms of EITHER:                                  *
+ *   (1) The GNU Lesser General Public License as published by the Free  *
+ *       Software Foundation; either version 2.1 of the License, or (at  *
+ *       your option) any later version. The text of the GNU Lesser      *
+ *       General Public License is included with this library in the     *
+ *       file LICENSE.TXT.                                               *
+ *   (2) The BSD-style license that is included with this library in     *
+ *       the file LICENSE-BSD.TXT.                                       *
+ *                                                                       *
+ * This library 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 files    *
+ * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
+ *                                                                       *
+ *************************************************************************/
+
+#ifndef _ODE_JOINT_DHINGE_
+#define _ODE_JOINT_DHINGE_
+
+#include "dball.h"
+
+struct dxJointDHinge : public dxJointDBall 
+{
+    dVector3 axis1, axis2;
+    
+    dxJointDHinge(dxWorld *w);
+
+    virtual void getSureMaxInfo( SureMaxInfo* info );
+    virtual void getInfo1( Info1* info );
+    virtual void getInfo2( dReal worldFPS, dReal worldERP, const Info2* info );
+    virtual dJointType type() const;
+    virtual size_t size() const;
+
+};
+
+
+#endif
diff --git a/deps/opende/src/joints/fixed.cpp b/deps/opende/src/joints/fixed.cpp
index 07c5921..7edae7b 100644
--- a/deps/opende/src/joints/fixed.cpp
+++ b/deps/opende/src/joints/fixed.cpp
@@ -35,8 +35,9 @@ dxJointFixed::dxJointFixed ( dxWorld *w ) :
 {
     dSetZero ( offset, 4 );
     dSetZero ( qrel, 4 );
-    erp = world->global_erp;
-    cfm = world->global_cfm;
+    // These are now set in dxJoint constructor
+    // erp = world->global_erp;
+    // cfm = world->global_cfm;
 }
 
 
@@ -58,6 +59,20 @@ dxJointFixed::getInfo1 ( dxJoint::Info1 *info )
 void
 dxJointFixed::getInfo2 ( dxJoint::Info2 *info )
 {
+    // If joint values of erp and cfm are negative, then ignore them.
+    // info->erp, info->cfm already have the global values from quickstep
+    if (this->erp >= 0)
+      info->erp = erp;
+    if (this->cfm >= 0)
+    {
+      info->cfm[0] = cfm;
+      info->cfm[1] = cfm;
+      info->cfm[2] = cfm;
+      info->cfm[3] = cfm;
+      info->cfm[4] = cfm;
+      info->cfm[5] = cfm;
+    }
+
     int s = info->rowskip;
 
     // Three rows for orientation
@@ -69,11 +84,6 @@ dxJointFixed::getInfo2 ( dxJoint::Info2 *info )
     info->J1l[s+1] = 1;
     info->J1l[2*s+2] = 1;
 
-    info->erp = erp;
-    info->cfm[0] = cfm;
-    info->cfm[1] = cfm;
-    info->cfm[2] = cfm;
-
     dVector3 ofs;
     dMultiply0_331 ( ofs, node[0].body->posr.R, offset );
     if ( node[1].body )
diff --git a/deps/opende/src/joints/fixed.h b/deps/opende/src/joints/fixed.h
index 3c16da8..0f2b162 100644
--- a/deps/opende/src/joints/fixed.h
+++ b/deps/opende/src/joints/fixed.h
@@ -32,8 +32,9 @@ struct dxJointFixed : public dxJoint
 {
     dQuaternion qrel;   // initial relative rotation body1 -> body2
     dVector3 offset;    // relative offset between the bodies
-    dReal erp;          // error reduction parameter
-    dReal cfm;          // constraint force mix-in
+    // erp and cfm moved to joint.h by OSRF
+    // dReal erp;          // error reduction parameter
+    // dReal cfm;          // constraint force mix-in
     void  set ( int num, dReal value );
     dReal get ( int num );
 
diff --git a/deps/opende/src/joints/gearbox.cpp b/deps/opende/src/joints/gearbox.cpp
new file mode 100644
index 0000000..d96a39a
--- /dev/null
+++ b/deps/opende/src/joints/gearbox.cpp
@@ -0,0 +1,283 @@
+/*************************************************************************
+ *                                                                       *
+ * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
+ * All rights reserved.  Email: russ at q12.org   Web: www.q12.org          *
+ *                                                                       *
+ * This library is free software; you can redistribute it and/or         *
+ * modify it under the terms of EITHER:                                  *
+ *   (1) The GNU Lesser General Public License as published by the Free  *
+ *       Software Foundation; either version 2.1 of the License, or (at  *
+ *       your option) any later version. The text of the GNU Lesser      *
+ *       General Public License is included with this library in the     *
+ *       file LICENSE.TXT.                                               *
+ *   (2) The BSD-style license that is included with this library in     *
+ *       the file LICENSE-BSD.TXT.                                       *
+ *                                                                       *
+ * This library 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 files    *
+ * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
+ *                                                                       *
+ *************************************************************************/
+
+
+#include <ode/misc.h>
+#include <ode/odeconfig.h>
+#include "config.h"
+#include "gearbox.h"
+#include "joint_internal.h"
+
+/*
+ * Double Hinge joint
+ */
+
+dxJointGearbox::dxJointGearbox(dxWorld* w) :
+    dxJoint(w)
+{
+    ratio = 1.0;
+    flags |= dJOINT_TWOBODIES;
+    dSetZero( qrel1, 4 );
+    dSetZero( qrel2, 4 );
+    cumulative_angle1 = 0.0;
+    cumulative_angle2 = 0.0;
+}
+
+
+void
+dxJointGearbox::getSureMaxInfo( SureMaxInfo* info )
+{
+    info->max_m = 1;
+}
+
+
+void
+dxJointGearbox::getInfo1( dxJoint::Info1* info )
+{
+    info->m = 1;
+    info->nub = 1;
+}
+
+
+void
+dxJointGearbox::getInfo2( dxJoint::Info2* info )
+{
+    dVector3 globalAxis1, globalAxis2;
+
+    dBodyVectorToWorld(node[0].body, axis1[0], axis1[1], axis1[2], globalAxis1);
+    dBodyVectorToWorld(node[1].body, axis2[0], axis2[1], axis2[2], globalAxis2);
+
+    double ang1 = getHingeAngle(refBody1,node[0].body,globalAxis1,qrel1);
+    double ang2 = getHingeAngle(refBody2,node[1].body,globalAxis2,qrel2);
+    // printf("a1(%f) a10(%f) a2(%f) a20(%f)\n",
+    //   ang1, cumulative_angle1, ang2, cumulative_angle2);
+
+    cumulative_angle1 = dShortestAngularDistanceUpdate(cumulative_angle1,ang1);
+    cumulative_angle2 = dShortestAngularDistanceUpdate(cumulative_angle2,ang2);
+
+    double err = dShortestAngularDistance(
+     cumulative_angle1, -ratio * cumulative_angle2);
+
+    // FIXME: error calculation is not amenable to reset of poses,
+    // cumulative angles might snap to wrong angular value.
+    // printf("a1(%f) a1f(%f) a2(%f) a2f(%f) e(%f)\n",
+    //   ang1, cumulative_angle1, ang2, cumulative_angle2, err);
+
+    info->J1a[0] = globalAxis1[0];
+    info->J1a[1] = globalAxis1[1];
+    info->J1a[2] = globalAxis1[2];
+    
+    info->J2a[0] = ratio * globalAxis2[0];
+    info->J2a[1] = ratio * globalAxis2[1];
+    info->J2a[2] = ratio * globalAxis2[2];
+    
+    dReal k = info->fps * info->erp;
+    info->c[0] = -k * err;
+
+    // dVector3 d;
+    // dAddScaledVectors3(d, node[0].body->avel, node[1].body->avel,
+    // 		       1.0, ratio);
+
+    // printf("d: %f\n", dCalcVectorDot3(globalAxis1, d));
+}
+
+void dJointSetGearboxAxis1( dJointID j, dReal x, dReal y, dReal z )
+{
+    dxJointGearbox* joint = static_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    dBodyVectorFromWorld(joint->node[0].body, x, y, z, joint->axis1);
+    dNormalize3(joint->axis1);
+}
+
+void dJointSetGearboxAxis2( dJointID j, dReal x, dReal y, dReal z )
+{
+    dxJointGearbox* joint = static_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    dBodyVectorFromWorld(joint->node[1].body, x, y, z, joint->axis2);
+    dNormalize3(joint->axis2);
+}
+
+void dJointGetGearboxAxis1( dJointID j, dVector3 result )
+{
+    dxJointGearbox* joint = static_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    dBodyVectorToWorld(joint->node[0].body,
+                       joint->axis1[0], joint->axis1[1], joint->axis1[2],
+                       result);
+}
+
+void dJointGetGearboxAxis2( dJointID j, dVector3 result )
+{
+    dxJointGearbox* joint = static_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    dBodyVectorToWorld(joint->node[0].body,
+                       joint->axis2[0], joint->axis2[1], joint->axis2[2],
+                       result);
+}
+
+void dJointSetGearboxReferenceBody( dJointID j, dBodyID b )
+{
+    dJointSetGearboxReferenceBody1(j, b);
+    dJointSetGearboxReferenceBody2(j, b);
+}
+
+void dJointSetGearboxReferenceBody1( dJointID j, dBodyID b )
+{
+    dxJointGearbox* joint = dynamic_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+    dUASSERT( b, "bad body argument" );
+
+    joint->refBody1 = b;
+
+    if ( joint->node[0].body )
+    {
+      if ( b )
+        dQMultiply1( joint->qrel1, joint->refBody1->q, joint->node[0].body->q );
+      else
+      {
+        // set qrel1 to the transpose of the first body q
+        joint->qrel1[0] = joint->node[0].body->q[0];
+        joint->qrel1[1] = joint->node[0].body->q[1];
+        joint->qrel1[2] = joint->node[0].body->q[2];
+        joint->qrel1[3] = joint->node[0].body->q[3];
+      }
+    }
+    else
+    {
+      if ( b )
+      {
+        // set qrel1 to the transpose of the first body q
+        joint->qrel1[0] =   joint->refBody1->q[0];
+        joint->qrel1[1] = - joint->refBody1->q[1];
+        joint->qrel1[2] = - joint->refBody1->q[2];
+        joint->qrel1[3] = - joint->refBody1->q[3];
+      }
+      else
+      {
+        // both refBody1 and node[0].body are null, nothing happens
+      }
+    }
+}
+
+void dJointSetGearboxReferenceBody2( dJointID j, dBodyID b )
+{
+    dxJointGearbox* joint = dynamic_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+    dUASSERT( b, "bad body argument" );
+
+    joint->refBody2 = b;
+
+    if ( joint->node[1].body )
+    {
+      if ( b )
+        dQMultiply1( joint->qrel2, joint->refBody2->q, joint->node[1].body->q );
+      else
+      {
+        // set qrel1 to the transpose of the first body q
+        joint->qrel2[0] = joint->node[1].body->q[0];
+        joint->qrel2[1] = joint->node[1].body->q[1];
+        joint->qrel2[2] = joint->node[1].body->q[2];
+        joint->qrel2[3] = joint->node[1].body->q[3];
+      }
+    }
+    else
+    {
+      if ( b )
+      {
+        // set qrel2 to the transpose of the second body q
+        joint->qrel2[0] =   joint->refBody2->q[0];
+        joint->qrel2[1] = - joint->refBody2->q[1];
+        joint->qrel2[2] = - joint->refBody2->q[2];
+        joint->qrel2[3] = - joint->refBody2->q[3];
+      }
+      else
+      {
+        // both refBody2 and node[1].body are null, nothing happens
+      }
+    }
+}
+
+void dJointSetGearboxRatio( dJointID j, dReal value )
+{
+    dxJointGearbox* joint = dynamic_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    joint->ratio = value;
+}
+
+dReal dJointGetGearboxRatio( dJointID j )
+{
+    dxJointGearbox* joint = dynamic_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    return joint->ratio;
+}
+
+void dJointSetGearboxParam( dJointID j, int parameter, dReal value )
+{
+    dxJointGearbox* joint = static_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    switch ( parameter ) {
+        case dParamCFM:
+            joint->cfm = value;
+            break;
+        case dParamERP:
+            joint->erp = value;
+            break;
+        default:
+            dUASSERT( false, "unknown joint parameter" );
+            break;
+    }
+}
+
+
+dReal dJointGetGearboxParam( dJointID j, int parameter )
+{
+    dxJointGearbox* joint = static_cast<dxJointGearbox*>(j);
+    dUASSERT( joint, "bad joint argument" );
+
+    switch ( parameter ) {
+        case dParamCFM:
+            return joint->cfm;
+        case dParamERP:
+            return joint->erp;
+        default:
+            return 0;
+    }
+}
+
+dJointType
+dxJointGearbox::type() const
+{
+    return dJointTypeGearbox;
+}
+
+size_t
+dxJointGearbox::size() const
+{
+    return sizeof( *this );
+}
diff --git a/deps/opende/src/joints/gearbox.h b/deps/opende/src/joints/gearbox.h
new file mode 100644
index 0000000..326dfb4
--- /dev/null
+++ b/deps/opende/src/joints/gearbox.h
@@ -0,0 +1,50 @@
+/*************************************************************************
+ *                                                                       *
+ * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
+ * All rights reserved.  Email: russ at q12.org   Web: www.q12.org          *
+ *                                                                       *
+ * This library is free software; you can redistribute it and/or         *
+ * modify it under the terms of EITHER:                                  *
+ *   (1) The GNU Lesser General Public License as published by the Free  *
+ *       Software Foundation; either version 2.1 of the License, or (at  *
+ *       your option) any later version. The text of the GNU Lesser      *
+ *       General Public License is included with this library in the     *
+ *       file LICENSE.TXT.                                               *
+ *   (2) The BSD-style license that is included with this library in     *
+ *       the file LICENSE-BSD.TXT.                                       *
+ *                                                                       *
+ * This library 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 files    *
+ * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
+ *                                                                       *
+ *************************************************************************/
+
+#ifndef _ODE_JOINT_GEARBOX_
+#define _ODE_JOINT_GEARBOX_
+
+#include "joint.h"
+
+struct dxJointGearbox : public dxJoint
+{
+    dVector3 axis1, axis2;
+    dReal ratio;        // gearbox ratio
+    dReal erp;          // error reduction
+    dReal cfm;          // constraint force mix in
+    dxBody *refBody1;    // reference body for calculating gear angle 1
+    dxBody *refBody2;    // reference body for calculating gear angle 2
+    dReal cumulative_angle1;
+    dReal cumulative_angle2;
+    dQuaternion qrel1;   // initial relative rotation refBody1 -> body1
+    dQuaternion qrel2;   // initial relative rotation refBody2 -> body2
+    
+    dxJointGearbox(dxWorld *w);
+
+    virtual void getSureMaxInfo( SureMaxInfo* info );
+    virtual void getInfo1( Info1* info );
+    virtual void getInfo2( Info2* info );
+    virtual dJointType type() const;
+    virtual size_t size() const;
+};
+
+#endif
diff --git a/deps/opende/src/joints/hinge.cpp b/deps/opende/src/joints/hinge.cpp
index 203ccf3..768b336 100644
--- a/deps/opende/src/joints/hinge.cpp
+++ b/deps/opende/src/joints/hinge.cpp
@@ -21,68 +21,11 @@
  *************************************************************************/
 
 
+#include <ode/misc.h>
 #include "config.h"
 #include "hinge.h"
 #include "joint_internal.h"
 
-//****************************************************************************
-// helper function: shortest_angular_distance implementation
-    
-  /*!
-   * \brief normalize_angle_positive
-   *
-   *        Normalizes the angle to be 0 to 2*M_PI
-   *        It takes and returns radians.
-   */
-  static inline double normalize_angle_positive(double angle)
-  {
-    return fmod(fmod(angle, 2.0*M_PI) + 2.0*M_PI, 2.0*M_PI);
-  }
-
-
-  /*!
-   * \brief normalize
-   *
-   * Normalizes the angle to be -M_PI circle to +M_PI circle
-   * It takes and returns radians.
-   *
-   */    
-  static inline double normalize_angle(double angle)
-  {
-    double a = normalize_angle_positive(angle);
-    if (a > M_PI)
-      a -= 2.0 *M_PI;
-    return a;
-  }
-
-    
-  /*!
-   * \function
-   * \brief shortest_angular_distance
-   *
-   * Given 2 angles, this returns the shortest angular
-   * difference.  The inputs and ouputs are of course radians.
-   *
-   * The result
-   * would always be -pi <= result <= pi.  Adding the result
-   * to "from" will always get you an equivelent angle to "to".
-   */
-    
-  static inline double shortest_angular_distance(double from, double to)
-  {
-    double result = normalize_angle_positive(normalize_angle_positive(to) - normalize_angle_positive(from));
-	
-    if (result > M_PI)
-      // If the result > 180,
-      // It's shorter the other way.
-      result = -(2.0*M_PI - result);
-	
-    return normalize_angle(result);
-  }
-
-
-
-//****************************************************************************
 // hinge
 
 dxJointHinge::dxJointHinge( dxWorld *w ) :
@@ -124,8 +67,10 @@ dxJointHinge::getInfo1( dxJoint::Info1 *info )
         dReal angle = getHingeAngle( node[0].body,
                                      node[1].body,
                                      axis1, qrel );
-        // from angle, update cumulative_angle, which does not wrap
-        cumulative_angle = cumulative_angle + shortest_angular_distance(cumulative_angle,angle);
+        // From angle, update cumulative_angle, which does not wrap.
+        // Assume this is called only once per time step.
+        cumulative_angle = 
+          dShortestAngularDistanceUpdate(cumulative_angle,angle);
 
         if ( limot.testRotationalLimit( cumulative_angle ) )
             info->m = 6;
@@ -139,6 +84,21 @@ dxJointHinge::getInfo1( dxJoint::Info1 *info )
 void
 dxJointHinge::getInfo2( dxJoint::Info2 *info )
 {
+    // Added by OSRF
+    // If joint values of erp and cfm are negative, then ignore them.
+    // info->erp, info->cfm already have the global values from quickstep
+    if (this->erp >= 0)
+      info->erp = erp;
+    if (this->cfm >= 0)
+    {
+      info->cfm[0] = cfm;
+      info->cfm[1] = cfm;
+      info->cfm[2] = cfm;
+      info->cfm[3] = cfm;
+      info->cfm[4] = cfm;
+      info->cfm[5] = cfm;
+    }
+
     // set the three ball-and-socket rows
     setBall( this, info, anchor1, anchor2 );
 
@@ -155,6 +115,18 @@ dxJointHinge::getInfo2( dxJoint::Info2 *info )
     dMultiply0_331( ax1, node[0].body->posr.R, axis1 );
     dPlaneSpace( ax1, p, q );
 
+    // strange the rotation matrix is not really a rotation matrix (non-orthogonal vectors)
+    // normals of columns and rows are not exactly 1 when velocity is large.
+    // printf("posr.R\n[%f %f %f %f]\n[%f %f %f %f]\n[%f %f %f %f]\n",
+    //   node[0].body->posr.R[0*4+0],node[0].body->posr.R[0*4+1],node[0].body->posr.R[0*4+2],node[0].body->posr.R[0*4+3],
+    //   node[0].body->posr.R[1*4+0],node[0].body->posr.R[1*4+1],node[0].body->posr.R[1*4+2],node[0].body->posr.R[1*4+3],
+    //   node[0].body->posr.R[2*4+0],node[0].body->posr.R[2*4+1],node[0].body->posr.R[2*4+2],node[0].body->posr.R[2*4+3]);
+
+    // printf("axis1 [%f %f %f] ax1 [%f %f %f]\n",
+    //         axis1[0], axis1[1], axis1[2],
+    //         ax1[0], ax1[1], ax1[2]);
+
+
     int s3 = 3 * info->rowskip;
     int s4 = 4 * info->rowskip;
 
@@ -351,7 +323,20 @@ void dJointSetHingeParam( dJointID j, int parameter, dReal value )
     dxJointHinge* joint = ( dxJointHinge* )j;
     dUASSERT( joint, "bad joint argument" );
     checktype( joint, Hinge );
-    joint->limot.set( parameter, value );
+    switch (parameter)
+    {
+      case dParamERP:
+        joint->erp = value;
+        break;
+      case dParamCFM:
+        joint->cfm = value;
+        // dParamCFM label is also used for normal_cfm
+        joint->limot.set( parameter, value );
+        break;
+      default:
+        joint->limot.set( parameter, value );
+        break;
+    }
 }
 
 
@@ -360,7 +345,15 @@ dReal dJointGetHingeParam( dJointID j, int parameter )
     dxJointHinge* joint = ( dxJointHinge* )j;
     dUASSERT( joint, "bad joint argument" );
     checktype( joint, Hinge );
-    return joint->limot.get( parameter );
+    switch (parameter)
+    {
+      case dParamERP:
+        return joint->erp;
+      case dParamCFM:
+        return joint->cfm;
+      default:
+        return joint->limot.get( parameter );
+    }
 }
 
 
@@ -376,11 +369,15 @@ dReal dJointGetHingeAngle( dJointID j )
                                    joint->axis1,
                                    joint->qrel );
         // from angle, update cumulative_angle, which does not wrap
-        joint->cumulative_angle = joint->cumulative_angle + shortest_angular_distance(joint->cumulative_angle,ang);
+        // dJointGetHingeAngle is static, so do not overwrite
+        // joint->cumulative_angle by updated joint angle.
+        // Simply calculate the current angle and return it.
+        dReal joint_angle =
+          dShortestAngularDistanceUpdate(joint->cumulative_angle,ang);
         if ( joint->flags & dJOINT_REVERSE )
-            return -joint->cumulative_angle;
+            return -joint_angle;
         else
-            return joint->cumulative_angle;
+            return joint_angle;
     }
     else return 0;
 }
diff --git a/deps/opende/src/joints/hinge2.cpp b/deps/opende/src/joints/hinge2.cpp
index c5e9919..e3ac1bb 100644
--- a/deps/opende/src/joints/hinge2.cpp
+++ b/deps/opende/src/joints/hinge2.cpp
@@ -127,6 +127,21 @@ dxJointHinge2::getAxisInfo(dVector3 ax1, dVector3 ax2, dVector3 axCross,
 void
 dxJointHinge2::getInfo2( dxJoint::Info2 *info )
 {
+    // Added by OSRF
+    // If joint values of erp and cfm are negative, then ignore them.
+    // info->erp, info->cfm already have the global values from quickstep
+    if (this->erp >= 0)
+      info->erp = erp;
+    if (this->cfm >= 0)
+    {
+      info->cfm[0] = cfm;
+      info->cfm[1] = cfm;
+      info->cfm[2] = cfm;
+      info->cfm[3] = cfm;
+      info->cfm[4] = cfm;
+      info->cfm[5] = cfm;
+    }
+
     // get information we need to set the hinge row
     dReal s, c;
     dVector3 q;
@@ -268,9 +283,26 @@ void dJointSetHinge2Param( dJointID j, int parameter, dReal value )
     }
     else
     {
-        if ( parameter == dParamSuspensionERP ) joint->susp_erp = value;
-        else if ( parameter == dParamSuspensionCFM ) joint->susp_cfm = value;
-        else joint->limot1.set( parameter, value );
+        switch (parameter)
+        {
+          case dParamERP:
+            joint->erp = value;
+            break;
+          case dParamCFM:
+            joint->cfm = value;
+            // dParamCFM label is also used for normal_cfm
+            joint->limot1.set( parameter, value );
+            break;
+          case dParamSuspensionERP:
+            joint->susp_erp = value;
+            break;
+          case dParamSuspensionCFM:
+            joint->susp_cfm = value;
+            break;
+          default:
+            joint->limot1.set( parameter, value );
+            break;
+        }
     }
 }
 
@@ -338,9 +370,19 @@ dReal dJointGetHinge2Param( dJointID j, int parameter )
     }
     else
     {
-        if ( parameter == dParamSuspensionERP ) return joint->susp_erp;
-        else if ( parameter == dParamSuspensionCFM ) return joint->susp_cfm;
-        else return joint->limot1.get( parameter );
+        switch (parameter)
+        {
+          case dParamERP:
+            return joint->erp;
+          case dParamCFM:
+            return joint->cfm;
+          case dParamSuspensionERP:
+            return joint->susp_erp;
+          case dParamSuspensionCFM:
+            return joint->susp_cfm;
+          default:
+            return joint->limot1.get( parameter );
+        }
     }
 }
 
diff --git a/deps/opende/src/joints/joint.cpp b/deps/opende/src/joints/joint.cpp
index 410d54f..6f97454 100644
--- a/deps/opende/src/joints/joint.cpp
+++ b/deps/opende/src/joints/joint.cpp
@@ -52,6 +52,7 @@ dxJoint::dxJoint( dxWorld *w ) :
     node[1].body = 0;
     node[1].next = 0;
     dSetZero( lambda, 6 );
+    dSetZero( lambda_erp, 6 );
 
     addObjectToList( this, ( dObject ** ) &w->firstjoint );
 
@@ -61,6 +62,13 @@ dxJoint::dxJoint( dxWorld *w ) :
     // joint damping
     use_damping = false;
     damping_coefficient = 0.0;
+
+    // Moved here by OSRF
+    // Default to negative value, which means the current global value
+    // will be used. If set non-negative, then this joint-specific 
+    // value will be used.
+    erp = -1;  // world->global_erp;
+    cfm = -1;  // world->global_cfm;
 }
 
 dxJoint::~dxJoint()
@@ -440,17 +448,22 @@ dReal getHingeAngle( dxBody *body1, dxBody *body2, dVector3 axis,
 {
     // get qrel = relative rotation between the two bodies
     dQuaternion qrel;
-    if ( body2 )
+    if ( body1 && body2 )
     {
         dQuaternion qq;
         dQMultiply1( qq, body1->q, body2->q );
         dQMultiply2( qrel, qq, q_initial );
     }
-    else
+    else if (body1)
     {
         // pretend body2->q is the identity
         dQMultiply3( qrel, body1->q, q_initial );
     }
+    else if (body2)
+    {
+        // pretend body1->q is the identity
+        dQMultiply3( qrel, body2->q, q_initial );
+    }
 
     return getHingeAngleFromRelativeQuat( qrel, axis );
 }
diff --git a/deps/opende/src/joints/joint.h b/deps/opende/src/joints/joint.h
index 1f44436..d1bfacc 100644
--- a/deps/opende/src/joints/joint.h
+++ b/deps/opende/src/joints/joint.h
@@ -140,6 +140,7 @@ struct dxJoint : public dObject
     dxJointNode node[2];        // connections to bodies. node[1].body can be 0
     dJointFeedback *feedback;   // optional feedback structure
     dReal lambda[6];            // lambda generated by last step
+    dReal lambda_erp[6];            // lambda generated by last step
 
 
     dxJoint( dxWorld *w );
@@ -166,6 +167,9 @@ struct dxJoint : public dObject
     bool use_damping;
     dReal damping_coefficient;
 
+    // Moved from ball.h and fixed.h by OSRF
+    dReal erp;          // error reduction
+    dReal cfm;          // constraint force mix in
 };
 
 
diff --git a/deps/opende/src/joints/joint_internal.h b/deps/opende/src/joints/joint_internal.h
index 164c0e0..8be54b9 100644
--- a/deps/opende/src/joints/joint_internal.h
+++ b/deps/opende/src/joints/joint_internal.h
@@ -21,7 +21,7 @@
  *************************************************************************/
 
 
-#ifndef _ODE_JOINT_NTERNAL_H_
+#ifndef _ODE_JOINT_INTERNAL_H_
 #define _ODE_JOINT_INTERNAL_H_
 
 
diff --git a/deps/opende/src/joints/joints.h b/deps/opende/src/joints/joints.h
index f0fa41d..f669b3e 100644
--- a/deps/opende/src/joints/joints.h
+++ b/deps/opende/src/joints/joints.h
@@ -31,6 +31,9 @@
 #include "hinge.h"
 #include "slider.h"
 #include "screw.h"
+#include "dball.h"
+#include "dhinge.h"
+#include "gearbox.h"
 #include "contact.h"
 #include "universal.h"
 #include "hinge2.h"
diff --git a/deps/opende/src/joints/piston.cpp b/deps/opende/src/joints/piston.cpp
index b87966b..0e5eb5e 100644
--- a/deps/opende/src/joints/piston.cpp
+++ b/deps/opende/src/joints/piston.cpp
@@ -220,6 +220,21 @@ dxJointPiston::getInfo1 ( dxJoint::Info1 *info )
 void
 dxJointPiston::getInfo2 ( dxJoint::Info2 *info )
 {
+    // Added by OSRF
+    // If joint values of erp and cfm are negative, then ignore them.
+    // info->erp, info->cfm already have the global values from quickstep
+    if (this->erp >= 0)
+      info->erp = erp;
+    if (this->cfm >= 0)
+    {
+      info->cfm[0] = cfm;
+      info->cfm[1] = cfm;
+      info->cfm[2] = cfm;
+      info->cfm[3] = cfm;
+      info->cfm[4] = cfm;
+      info->cfm[5] = cfm;
+    }
+
     const int s0 = 0;
     const int s1 = info->rowskip;
     const int s2 = 2 * s1, s3 = 3 * s1 /*, s4=4*s1*/;
@@ -561,7 +576,20 @@ void dJointSetPistonParam ( dJointID j, int parameter, dReal value )
     }
     else
     {
-        joint->limotP.set ( parameter, value );
+      switch (parameter)
+      {
+        case dParamERP:
+          joint->erp = value;
+          break;
+        case dParamCFM:
+          joint->cfm = value;
+          // dParamCFM label is also used for normal_cfm
+          joint->limotP.set( parameter, value );
+          break;
+        default:
+          joint->limotP.set( parameter, value );
+          break;
+      }
     }
 }
 
@@ -578,7 +606,15 @@ dReal dJointGetPistonParam ( dJointID j, int parameter )
     }
     else
     {
-        return joint->limotP.get ( parameter );
+      switch (parameter)
+      {
+        case dParamERP:
+          return joint->erp;
+        case dParamCFM:
+          return joint->cfm;
+        default:
+          return joint->limotP.get( parameter );
+      }
     }
 }
 
diff --git a/deps/opende/src/joints/screw.cpp b/deps/opende/src/joints/screw.cpp
index 0c21c6e..1884d96 100644
--- a/deps/opende/src/joints/screw.cpp
+++ b/deps/opende/src/joints/screw.cpp
@@ -124,12 +124,19 @@ dxJointScrew::getInfo1( dxJoint::Info1 *info )
                                      node[1].body,
                                      axis1, qrel );
         // from angle, update cumulative_angle, which does not wrap
-        cumulative_angle = cumulative_angle + shortest_angular_distance(cumulative_angle,angle);
+        cumulative_angle = cumulative_angle +
+          shortest_angular_distance(cumulative_angle, angle);
 
-        // printf("angle: %f lo[%f] hi[%f]\n", cumulative_angle, limot.lostop, limot.histop);
+        // printf("angle: %f lo[%f] hi[%f]\n", cumulative_angle,
+        //   limot.lostop, limot.histop);
 
         if ( limot.testRotationalLimit( cumulative_angle ) )
             info->m = 6;
+
+        // FIXME: reset does not reset joint angle if more than 2pi
+        // printf("cumulative angle: %f  lo: %f  hi:  %f test: %f\n",
+        //   cumulative_angle, limot.lostop, limot.histop,
+        //   limot.testRotationalLimit( cumulative_angle ));
     }
 
     /* uncommnet to enforce slider joint limit
@@ -163,24 +170,50 @@ dxJointScrew::getInfo1( dxJoint::Info1 *info )
 void
 dxJointScrew::getInfo2( dxJoint::Info2 *info )
 {
-    // constrain the slider like DOFs
+    // Added by OSRF
+    //
+    // Screw Constraint Overview 
+    //
+    // make 5 constraint rows.
+    // given screw axis, first create two orthogonal axis p and q.
+    // row 1: linear constraint along p
+    // row 2: linear constraint along q
+    // row 3: screw constraint about user specified axis
+    // row 4: rotational constraint about p
+    // row 5: rotational constraint about q
+
+    // Added by OSRF
+    // If joint values of erp and cfm are negative, then ignore them.
+    // info->erp, info->cfm already have the global values from quickstep
+    if (this->erp >= 0)
+      info->erp = erp;
+    if (this->cfm >= 0)
+    {
+      info->cfm[0] = cfm;
+      info->cfm[1] = cfm;
+      info->cfm[2] = cfm;
+      info->cfm[3] = cfm;
+      info->cfm[4] = cfm;
+      info->cfm[5] = cfm;
+    }
+
+    // constraint rows 1 to 3
     {
       // pull out pos and R for both bodies. also get the `connection'
       // vector pos2-pos1.
-
-      int i;
       dReal *pos1, *pos2, *R1, *R2;
-      dVector3 c;
-      c[0] = c[1] = c[2] = 0;
+      dVector3 cgdiff;
+      cgdiff[0] = cgdiff[1] = cgdiff[2] = 0;
       pos1 = node[0].body->posr.pos;
       R1 = node[0].body->posr.R;
       if ( node[1].body )
       {
           pos2 = node[1].body->posr.pos;
           R2 = node[1].body->posr.R;
-          for ( i = 0; i < 3; i++ )
+          for (int i = 0; i < 3; ++i )
           {
-              c[i] = pos2[i] - pos1[i];
+              // store distance between cg's in cgdiff
+              cgdiff[i] = pos2[i] - pos1[i];
           }
       }
       else
@@ -208,11 +241,15 @@ dxJointScrew::getInfo2( dxJoint::Info2 *info )
         {
             // get body2 + offset point in global coordinates
             dMultiply0_331 ( q, node[1].body->posr.R, offset );
-            //printf("debug offset q[%f %f %f] p0[%f %f %f] p1[%f %f %f] \t",q[0],q[1],q[2],
-            //    node[0].body->posr.pos[0], node[0].body->posr.pos[1], node[0].body->posr.pos[2],
-            //    node[1].body->posr.pos[0], node[1].body->posr.pos[1], node[1].body->posr.pos[2]);
+            //printf("debug offset q[%f %f %f] p0[%f %f %f] p1[%f %f %f] \t",
+            //  q[0],q[1],q[2],
+            //  node[0].body->posr.pos[0], node[0].body->posr.pos[1],
+            //  node[0].body->posr.pos[2],
+            //  node[1].body->posr.pos[0], node[1].body->posr.pos[1],
+            //  node[1].body->posr.pos[2]);
             for ( int ii = 0; ii < 3; ++ii )
-              q[ii] = node[0].body->posr.pos[ii] - q[ii] - node[1].body->posr.pos[ii];
+              q[ii] = node[0].body->posr.pos[ii] - q[ii] -
+                node[1].body->posr.pos[ii];
         }
         else
         {
@@ -221,7 +258,8 @@ dxJointScrew::getInfo2( dxJoint::Info2 *info )
             q[2] = node[0].body->posr.pos[2] - offset[2];
         }
         lin_disp = dCalcVectorDot3 ( ax1, q );
-        lin_err = -(lin_disp+cumulative_angle/thread_pitch);
+        lin_err = -(lin_disp*thread_pitch-cumulative_angle);
+        // printf("lin disp: %f lin err: %f\n", lin_disp, lin_err);
       }
 
 
@@ -229,73 +267,148 @@ dxJointScrew::getInfo2( dxJoint::Info2 *info )
       int s0 = 0 * info->rowskip;
       int s1 = 1 * info->rowskip;
       int s2 = 2 * info->rowskip;
-      // remaining two rows. we want: vel2 = vel1 + w1 x c ... but this would
+
+      // remaining two rows. we want: vel2 = vel1 + w1 x cgdiff ... but this would
       // result in three equations, so we project along the planespace vectors
       // so that sliding along the slider axis is disregarded. for symmetry we
       // also substitute (w1+w2)/2 for w1, as w1 is supposed to equal w2.
 
-      dVector3 ax1; // joint axis in global coordinates (unit length)
-      dVector3 p, q; // plane space of ax1
+      // ax1 is axis1 converted to body1 frame
+      dVector3 ax1;
       dMultiply0_331 ( ax1, R1, axis1 );
+
+      // p and q are vectors perpendicular to ax1 in body1 frame
+      dVector3 p, q;
       dPlaneSpace ( ax1, p, q );
+
+      // linear constraints for the hinge joint
+      // perpendicular to the sliding axis direction.
+      for (int i = 0; i < 3; ++i ) info->J1l[s0+i] = p[i];
+      for (int i = 0; i < 3; ++i ) info->J1l[s1+i] = q[i];
+
+      // if p and q do not pass through body CG's,
+      // we need to add angular constraints to balance out the forces
+      // from these linear constraints.  See below:
+
+      // a1 and a2 are axis vectors in the body frame
+      // (whereas anchor1 and anchor2 are in world frame).
+      // anchor1 is the vector from CG to joint anchor in world frame.
+      dVector3 a1, a2;
+      dMultiply0_331( a1, R1, anchor1 );
+
+      // tmpp is a vector perpendicular to a1 and p in body frame,
+      // it is the direction of the angular constraint that will
+      // cancel out moment generated by linear constraint p
+      // if p does not pass through CG.
+      {
+        dVector3 tmpp;
+        dCalcVectorCross3(tmpp, p, a1);
+        for (int i = 0; i < 3; ++i ) info->J1a[s0+i] = -tmpp[i];
+      }
+
+      // tmpq is similar to tmpp, but for q.
+      {
+        dVector3 tmpq;
+        dCalcVectorCross3(tmpq, q, a1);
+        for (int i = 0; i < 3; ++i ) info->J1a[s1+i] = -tmpq[i];
+      }
+
+      // screw constraint:
+      // now constrain the sliding axis by rotation of the other body
+      for (int i = 0; i < 3; ++i ) info->J1l[s2+i] = ax1[i]*thread_pitch;
+      for (int i = 0; i < 3; ++i ) info->J1a[s2+i] = -ax1[i];
+
+      // repeat above for child body if one exists
       if ( node[1].body )
       {
-          // angular constraints if axis are not aligned with cg's
-          dVector3 tmp;
-          dCalcVectorCross3( tmp, c, p );
-          dScaleVector3( tmp, REAL( 0.5 ));
-          for ( i = 0; i < 3; i++ ) info->J1a[s0+i] = tmp[i];
-          for ( i = 0; i < 3; i++ ) info->J2a[s0+i] = tmp[i];
-          dCalcVectorCross3( tmp, c, q );
-          dScaleVector3( tmp, REAL( 0.5 ));
-          for ( i = 0; i < 3; i++ ) info->J1a[s1+i] = tmp[i];
-          for ( i = 0; i < 3; i++ ) info->J2a[s1+i] = tmp[i];
-          // linear constraints
-          for ( i = 0; i < 3; i++ ) info->J2l[s0+i] = -p[i];
-          for ( i = 0; i < 3; i++ ) info->J2l[s1+i] = -q[i];
-
-          // screw constraint: compensate for linear axial force induced torque
-          //   not sure how to mix this with screw constraint
-          //   for now, MAKE SURE THE AXIS IS ALIGNED WITH c!!!
-          // dCalcVectorCross3( tmp, c, ax1 );
-          // dScaleVector3( tmp, REAL( 0.5 ));
-          // for ( i = 0; i < 3; i++ ) info->J1a[s2+i] = tmp[i];
-          // for ( i = 0; i < 3; i++ ) info->J2a[s2+i] = tmp[i];
-          // screw constraint: now constrain the sliding axis by rotation of the other body
-          for ( i = 0; i < 3; i++ ) info->J2a[s2+i] = -ax1[i]/thread_pitch;
-          for ( i = 0; i < 3; i++ ) info->J2l[s2+i] = -ax1[i];
+        // linear constraints for s0 and s1
+        for (int i = 0; i < 3; ++i ) info->J2l[s0+i] = -p[i];
+        for (int i = 0; i < 3; ++i ) info->J2l[s1+i] = -q[i];
+
+        // angular compensation if p and q do not pass through CG
+        dMultiply0_331( a2, R2, anchor2 );
+        dVector3 tmpp;
+        dCalcVectorCross3(tmpp, p, a2);
+        for (int i = 0; i < 3; ++i ) info->J2a[s0+i] = tmpp[i];
+        dVector3 tmpq;
+        dCalcVectorCross3(tmpq, q, a2);
+        for (int i = 0; i < 3; ++i ) info->J2a[s1+i] = tmpq[i];
+
+        // screw constraint:
+        // constrain the sliding axis by rotation of the other body
+        for (int i = 0; i < 3; ++i ) info->J2a[s2+i] =  ax1[i];
+        for (int i = 0; i < 3; ++i ) info->J2l[s2+i] = -ax1[i]*thread_pitch;
       }
-      for ( i = 0; i < 3; i++ ) info->J1l[s0+i] = p[i];
-      for ( i = 0; i < 3; i++ ) info->J1l[s1+i] = q[i];
-      // screw constraint: now constrain the sliding axis by rotation of the other body
-      for ( i = 0; i < 3; i++ ) info->J1l[s2+i] = ax1[i];
-      for ( i = 0; i < 3; i++ ) info->J1a[s2+i] = ax1[i]/thread_pitch;
-      //printf("screw err lin[%f], ang[%f], diff[%f] [%d] tp[%f]\n",thread_pitch*lin_disp, cumulative_angle, lin_err, (int)this->use_damping, thread_pitch);
+
+      // debug
+      // printf ("anchor1 %f %f %f\n", anchor1[0], anchor1[1], anchor1[2]);
+      // printf ("a1 %f %f %f\n", a1[0], a1[1], a1[2]);
+      // printf ("ax1 %f %f %f\n", ax1[0], ax1[1], ax1[2]);
+      // printf ("tmpp %f %f %f\n", tmpp[0], tmpp[1], tmpp[2]);
+      // printf ("p %f %f %f\n", p[0], p[1], p[2]);
+      // printf ("q %f %f %f\n", q[0], q[1], q[2]);
+      // printf ("J1a[s0] %f %f %f\n", info->J1a[s0+0], info->J1a[s0+1],
+      //   info->J1a[s0+2]);
+      // printf ("J1a[s1] %f %f %f\n", info->J1a[s1+0], info->J1a[s1+1],
+      //   info->J1a[s1+2]);
+      // info->J1a[s0+0] = 1;
+      // info->J1a[s0+1] = 0;
+      // info->J1a[s0+2] = 0;
+      // info->J1a[s1+0] = -1;
+      // info->J1a[s1+1] = 0;
+      // info->J1a[s1+2] = 0;
+      // printf("screw err lin[%f], ang[%f], diff[%f] [%d] tp[%f]\n",
+      //   thread_pitch*lin_disp, cumulative_angle, lin_err,
+      //   (int)this->use_damping, thread_pitch);
 
       // compute last two elements of right hand side. we want to align the offset
       // point (in body 2's frame) with the center of body 1.
       dReal k = info->fps * info->erp;
       if ( node[1].body )
       {
-          dVector3 ofs;  // offset point in global coordinates
-          dMultiply0_331 ( ofs, R2, offset );
-          for ( i = 0; i < 3; i++ ) c[i] += ofs[i];
-          info->c[0] = k * dCalcVectorDot3 ( p, c );
-          info->c[1] = k * dCalcVectorDot3 ( q, c );
+          // dVector3 ofs;  // offset point in global coordinates
+          // dMultiply0_331 ( ofs, R2, offset );
+          // for (int i = 0; i < 3; ++i ) cgdiff[i] += ofs[i];
+
+          // error between body anchors
+          dVector3 error12;
+          for (int i = 0; i < 3; ++i)
+            error12[i] = a2[i] + node[1].body->posr.pos[i] - a1[i] -
+              node[0].body->posr.pos[i];
+
+          // error in the p direction is error12 dot p
+          info->c[0] = k * (dCalcVectorDot3(error12, p));
+          // error in the q direction is error12 dot p
+          info->c[1] = k * (dCalcVectorDot3(error12, q));
           // interpenetration error for screw constraint
           info->c[2] = k * lin_err;
       }
       else
       {
-          dVector3 ofs;  // offset point in global coordinates
-          for ( i = 0; i < 3; i++ ) ofs[i] = offset[i] - pos1[i];
-          info->c[0] = k * dCalcVectorDot3 ( p, ofs );
-          info->c[1] = k * dCalcVectorDot3 ( q, ofs );
+          // debug
+          // printf ("anchor1 %f %f %f\n", anchor1[0], anchor1[1], anchor1[2]);
+          // printf ("anchor2 %f %f %f\n", anchor2[0], anchor2[1], anchor2[2]);
+          // printf ("a1 %f %f %f\n", a1[0], a1[1], a1[2]);
+          // printf ("p1 %f %f %f\n",
+          //   node[0].body->posr.pos[0],
+          //   node[0].body->posr.pos[1],
+          //   node[0].body->posr.pos[2]);
+
+          // error of body's anchor
+          dVector3 error1;
+          for (int i = 0; i < 3; ++i) error1[i] = anchor2[i] - a1[i] -
+            node[0].body->posr.pos[i];
+          // printf ("error1 %f %f %f\n", error1[0], error1[1], error1[2]);
+
+          // error in the p direction is error1 dot p
+          info->c[0] = k * (dCalcVectorDot3(error1, p));
+          // error in the q direction
+          info->c[1] = k * (dCalcVectorDot3(error1, q));
           // interpenetration error for screw constraint
           info->c[2] = k * lin_err;
 
           if ( flags & dJOINT_REVERSE )
-              for ( i = 0; i < 3; ++i ) ax1[i] = -ax1[i];
+              for (int i = 0; i < 3; ++i ) ax1[i] = -ax1[i];
       }
 
       // uncommnet to enforce slider joint limit
@@ -315,14 +428,15 @@ dxJointScrew::getInfo2( dxJoint::Info2 *info )
           info->J2ld[1] = -ax1[1];
           info->J2ld[2] = -ax1[2];
         }
-        // there's no rhs for damping setup, all we want to use is the jacobian information above
+        // there's no rhs for damping setup, all we want to use is the
+        // jacobian information above
       }
       */
     }
 
-    // constrain the hinge like DOFs
+    // constraint rows 4 and 5
     {
-      // set the two hinge rows. the hinge axis should be the only unconstrained
+      // set the two hinge rows. the screw axis should be the only unconstrained
       // rotational axis, the angular velocity of the two bodies perpendicular to
       // the hinge axis should be equal. thus the constraint equations are
       //    p*w1 - p*w2 = 0
@@ -403,7 +517,8 @@ dxJointScrew::getInfo2( dxJoint::Info2 *info )
           info->J2ad[1] = -ax1[1];
           info->J2ad[2] = -ax1[2];
         }
-        // there's no rhs for damping setup, all we want to use is the jacobian information above
+        // there's no rhs for damping setup, all we want to use is
+        // the jacobian information above
       }
     }
 }
@@ -420,7 +535,8 @@ void dJointSetScrewAnchor( dJointID j, dReal x, dReal y, dReal z )
 }
 
 
-void dJointSetScrewAnchorDelta( dJointID j, dReal x, dReal y, dReal z, dReal dx, dReal dy, dReal dz )
+void dJointSetScrewAnchorDelta( dJointID j, dReal x, dReal y, dReal z,
+  dReal dx, dReal dy, dReal dz )
 {
     dxJointScrew* joint = ( dxJointScrew* )j;
     dUASSERT( joint, "bad joint argument" );
@@ -532,7 +648,20 @@ void dJointSetScrewParam( dJointID j, int parameter, dReal value )
     dxJointScrew* joint = ( dxJointScrew* )j;
     dUASSERT( joint, "bad joint argument" );
     checktype( joint, Screw );
-    joint->limot.set( parameter, value );
+    switch (parameter)
+    {
+      case dParamERP:
+        joint->erp = value;
+        break;
+      case dParamCFM:
+        joint->cfm = value;
+        // dParamCFM label is also used for normal_cfm
+        joint->limot.set( parameter, value );
+        break;
+      default:
+        joint->limot.set( parameter, value );
+        break;
+    }
 }
 
 
@@ -541,7 +670,15 @@ dReal dJointGetScrewParam( dJointID j, int parameter )
     dxJointScrew* joint = ( dxJointScrew* )j;
     dUASSERT( joint, "bad joint argument" );
     checktype( joint, Screw );
-    return joint->limot.get( parameter );
+    switch (parameter)
+    {
+      case dParamERP:
+        return joint->erp;
+      case dParamCFM:
+        return joint->cfm;
+      default:
+        return joint->limot.get( parameter );
+    }
 }
 
 
@@ -577,8 +714,10 @@ dReal dJointGetScrewAngleRate( dJointID j )
         dVector3 axis;
         dMultiply0_331( axis, joint->node[0].body->posr.R, joint->axis1 );
         dReal rate = dCalcVectorDot3( axis, joint->node[0].body->avel );
-        if ( joint->node[1].body ) rate -= dCalcVectorDot3( axis, joint->node[1].body->avel );
-        if ( joint->flags & dJOINT_REVERSE ) rate = - rate;
+        if (joint->node[1].body)
+          rate -= dCalcVectorDot3( axis, joint->node[1].body->avel );
+        if (joint->flags & dJOINT_REVERSE)
+          rate = - rate;
         return rate;
     }
     else return 0;
@@ -598,11 +737,11 @@ dReal dJointGetScrewPosition ( dJointID j )
 
     dMultiply0_331 ( ax1, joint->node[0].body->posr.R, joint->axis1 );
 
-    if ( joint->node[1].body )
+    if (joint->node[1].body)
     {
         // get body2 + offset point in global coordinates
         dMultiply0_331 ( q, joint->node[1].body->posr.R, joint->offset );
-        for ( int i = 0; i < 3; i++ )
+        for (int i = 0; i < 3; ++i )
             q[i] = joint->node[0].body->posr.pos[i]
                    - q[i]
                    - joint->node[1].body->posr.pos[i];
@@ -616,8 +755,8 @@ dReal dJointGetScrewPosition ( dJointID j )
         if ( joint->flags & dJOINT_REVERSE )
         {
             // N.B. it could have been simplier to only inverse the sign of
-            //      the dCalcVectorDot3 result but this case is exceptional and doing
-            //      the check for all case can decrease the performance.
+            //      the dCalcVectorDot3 result but this case is exceptional and
+            //      doing the check for all case can decrease the performance.
             ax1[0] = -ax1[0];
             ax1[1] = -ax1[1];
             ax1[2] = -ax1[2];
@@ -700,11 +839,14 @@ void dJointAddScrewForce ( dJointID j, dReal force )
 
         dVector3 ltd; // Linear Torque Decoupling vector (a torque)
 
-        dVector3 c;
-        c[0] = REAL ( 0.5 ) * ( joint->node[1].body->posr.pos[0] - joint->node[0].body->posr.pos[0] );
-        c[1] = REAL ( 0.5 ) * ( joint->node[1].body->posr.pos[1] - joint->node[0].body->posr.pos[1] );
-        c[2] = REAL ( 0.5 ) * ( joint->node[1].body->posr.pos[2] - joint->node[0].body->posr.pos[2] );
-        dCalcVectorCross3( ltd, c, axis );
+        dVector3 cgdiff;
+        cgdiff[0] = REAL ( 0.5 ) * ( joint->node[1].body->posr.pos[0] -
+          joint->node[0].body->posr.pos[0] );
+        cgdiff[1] = REAL ( 0.5 ) * ( joint->node[1].body->posr.pos[1] -
+          joint->node[0].body->posr.pos[1] );
+        cgdiff[2] = REAL ( 0.5 ) * ( joint->node[1].body->posr.pos[2] -
+          joint->node[0].body->posr.pos[2] );
+        dCalcVectorCross3( ltd, cgdiff, axis );
 
         dBodyAddTorque ( joint->node[0].body, ltd[0], ltd[1], ltd[2] );
         dBodyAddTorque ( joint->node[1].body, ltd[0], ltd[1], ltd[2] );
@@ -768,12 +910,12 @@ dxJointScrew::computeOffset()
 {
     if ( node[1].body )
     {
-        dVector3 c;
-        c[0] = node[0].body->posr.pos[0] - node[1].body->posr.pos[0];
-        c[1] = node[0].body->posr.pos[1] - node[1].body->posr.pos[1];
-        c[2] = node[0].body->posr.pos[2] - node[1].body->posr.pos[2];
+        dVector3 cgdiff;
+        cgdiff[0] = node[0].body->posr.pos[0] - node[1].body->posr.pos[0];
+        cgdiff[1] = node[0].body->posr.pos[1] - node[1].body->posr.pos[1];
+        cgdiff[2] = node[0].body->posr.pos[2] - node[1].body->posr.pos[2];
 
-        dMultiply1_331 ( offset, node[1].body->posr.R, c );
+        dMultiply1_331 ( offset, node[1].body->posr.R, cgdiff );
     }
     else if ( node[0].body )
     {
diff --git a/deps/opende/src/joints/slider.cpp b/deps/opende/src/joints/slider.cpp
index cf58223..c602a0f 100644
--- a/deps/opende/src/joints/slider.cpp
+++ b/deps/opende/src/joints/slider.cpp
@@ -155,6 +155,21 @@ dxJointSlider::getInfo1 ( dxJoint::Info1 *info )
 void
 dxJointSlider::getInfo2 ( dxJoint::Info2 *info )
 {
+    // Added by OSRF
+    // If joint values of erp and cfm are negative, then ignore them.
+    // info->erp, info->cfm already have the global values from quickstep
+    if (this->erp >= 0)
+      info->erp = erp;
+    if (this->cfm >= 0)
+    {
+      info->cfm[0] = cfm;
+      info->cfm[1] = cfm;
+      info->cfm[2] = cfm;
+      info->cfm[3] = cfm;
+      info->cfm[4] = cfm;
+      info->cfm[5] = cfm;
+    }
+
     int i, s = info->rowskip;
     int s3 = 3 * s, s4 = 4 * s;
 
@@ -302,7 +317,20 @@ void dJointSetSliderParam ( dJointID j, int parameter, dReal value )
     dxJointSlider* joint = ( dxJointSlider* ) j;
     dUASSERT ( joint, "bad joint argument" );
     checktype ( joint, Slider );
-    joint->limot.set ( parameter, value );
+    switch (parameter)
+    {
+      case dParamERP:
+        joint->erp = value;
+        break;
+      case dParamCFM:
+        joint->cfm = value;
+        // dParamCFM label is also used for normal_cfm
+        joint->limot.set( parameter, value );
+        break;
+      default:
+        joint->limot.set( parameter, value );
+        break;
+    }
 }
 
 
@@ -311,7 +339,15 @@ dReal dJointGetSliderParam ( dJointID j, int parameter )
     dxJointSlider* joint = ( dxJointSlider* ) j;
     dUASSERT ( joint, "bad joint argument" );
     checktype ( joint, Slider );
-    return joint->limot.get ( parameter );
+    switch (parameter)
+    {
+      case dParamERP:
+        return joint->erp;
+      case dParamCFM:
+        return joint->cfm;
+      default:
+        return joint->limot.get( parameter );
+    }
 }
 
 
diff --git a/deps/opende/src/joints/universal.cpp b/deps/opende/src/joints/universal.cpp
index e676006..7fc65e2 100644
--- a/deps/opende/src/joints/universal.cpp
+++ b/deps/opende/src/joints/universal.cpp
@@ -21,6 +21,7 @@
  *************************************************************************/
 
 
+#include <ode/misc.h>
 #include "config.h"
 #include "universal.h"
 #include "joint_internal.h"
@@ -48,6 +49,8 @@ dxJointUniversal::dxJointUniversal( dxWorld *w ) :
     dSetZero( qrel2, 4 );
     limot1.init( world );
     limot2.init( world );
+    cumulative_angle1 = 0.0;
+    cumulative_angle2 = 0.0;
 }
 
 
@@ -267,10 +270,14 @@ dxJointUniversal::getInfo1( dxJoint::Info1 *info )
     info->nub = 4;
     info->m = 4;
 
-    bool limiting1 = ( limot1.lostop >= -M_PI || limot1.histop <= M_PI ) &&
-                     limot1.lostop <= limot1.histop;
-    bool limiting2 = ( limot2.lostop >= -M_PI || limot2.histop <= M_PI ) &&
-                     limot2.lostop <= limot2.histop;
+    // flags to skip joint limits if limtis are out side of [-M_PI, +M_PI]
+    // bool limiting1 = ( limot1.lostop >= -M_PI || limot1.histop <= M_PI ) &&
+    //                  limot1.lostop <= limot1.histop;
+    // bool limiting2 = ( limot2.lostop >= -M_PI || limot2.histop <= M_PI ) &&
+    //                  limot2.lostop <= limot2.histop;
+    // we don't need them if using cumulative_angle
+    bool limiting1 = limot1.lostop <= limot1.histop;
+    bool limiting2 = limot2.lostop <= limot2.histop;
 
     // We need to call testRotationLimit() even if we're motored, since it
     // records the result.
@@ -281,10 +288,18 @@ dxJointUniversal::getInfo1( dxJoint::Info1 *info )
     {
         dReal angle1, angle2;
         getAngles( &angle1, &angle2 );
+
+        // From angle, update cumulative_angle, which does not wrap.
+        // Assume this is called only once per time step.
+        cumulative_angle1 =
+          dShortestAngularDistanceUpdate(cumulative_angle1, angle1);
+        cumulative_angle2 =
+          dShortestAngularDistanceUpdate(cumulative_angle2, angle2);
+
         if ( limiting1 )
-            limot1.testRotationalLimit( angle1 );
+            limot1.testRotationalLimit( cumulative_angle1 );
         if ( limiting2 )
-            limot2.testRotationalLimit( angle2 );
+            limot2.testRotationalLimit( cumulative_angle2 );
     }
 
     if ( limot1.limit || limot1.fmax > 0 ) info->m++;
@@ -295,6 +310,21 @@ dxJointUniversal::getInfo1( dxJoint::Info1 *info )
 void
 dxJointUniversal::getInfo2( dxJoint::Info2 *info )
 {
+    // Added by OSRF
+    // If joint values of erp and cfm are negative, then ignore them.
+    // info->erp, info->cfm already have the global values from quickstep
+    if (this->erp >= 0)
+      info->erp = erp;
+    if (this->cfm >= 0)
+    {
+      info->cfm[0] = cfm;
+      info->cfm[1] = cfm;
+      info->cfm[2] = cfm;
+      info->cfm[3] = cfm;
+      info->cfm[4] = cfm;
+      info->cfm[5] = cfm;
+    }
+
     // set the three ball-and-socket rows
     setBall( this, info, anchor1, anchor2 );
 
@@ -619,7 +649,20 @@ void dJointSetUniversalParam( dJointID j, int parameter, dReal value )
     }
     else
     {
-        joint->limot1.set( parameter, value );
+      switch (parameter)
+      {
+        case dParamERP:
+          joint->erp = value;
+          break;
+        case dParamCFM:
+          joint->cfm = value;
+          // dParamCFM label is also used for normal_cfm
+          joint->limot1.set( parameter, value );
+          break;
+        default:
+          joint->limot1.set( parameter, value );
+          break;
+      }
     }
 }
 
@@ -635,7 +678,15 @@ dReal dJointGetUniversalParam( dJointID j, int parameter )
     }
     else
     {
-        return joint->limot1.get( parameter );
+      switch (parameter)
+      {
+        case dParamERP:
+          return joint->erp;
+        case dParamCFM:
+          return joint->cfm;
+        default:
+          return joint->limot1.get( parameter );
+      }
     }
 }
 
@@ -644,14 +695,22 @@ void dJointGetUniversalAngles( dJointID j, dReal *angle1, dReal *angle2 )
     dxJointUniversal* joint = ( dxJointUniversal* )j;
     dUASSERT( joint, "bad joint argument" );
     checktype( joint, Universal );
+
+    dReal tmp_angle1, tmp_angle2;
+    joint->getAngles( &tmp_angle2, &tmp_angle1 );
+
     if ( joint->flags & dJOINT_REVERSE )
     {
-        joint->getAngles( angle2, angle1 );
-        *angle2 = -(*angle2);
-        return;
+      tmp_angle2 = -(tmp_angle2);
     }
-    else
-        return joint->getAngles( angle1, angle2 );
+
+    // Do not overwrite cumulative_angle1 and
+    // cumulative_angle2 by updated joint angle.
+    // Simply calculate the current angles and return them.
+    *angle1 = 
+      dShortestAngularDistanceUpdate(joint->cumulative_angle1, tmp_angle1);
+    *angle2 = 
+      dShortestAngularDistanceUpdate(joint->cumulative_angle2, tmp_angle2);
 }
 
 
@@ -660,10 +719,25 @@ dReal dJointGetUniversalAngle1( dJointID j )
     dxJointUniversal* joint = ( dxJointUniversal* )j;
     dUASSERT( joint, "bad joint argument" );
     checktype( joint, Universal );
+
+    // Do not overwrite cumulative_angle1 and
+    // cumulative_angle2 by updated joint angle.
+    // Simply calculate the current angles and return them.
+    dReal tmp_angle;
+    dReal tmp_cumulative_angle;
+
     if ( joint->flags & dJOINT_REVERSE )
-        return joint->getAngle2();
+    {
+        tmp_angle = joint->getAngle2();
+        tmp_cumulative_angle = joint->cumulative_angle2;
+    }
     else
-        return joint->getAngle1();
+    {
+        tmp_angle = joint->getAngle1();
+        tmp_cumulative_angle = joint->cumulative_angle1;
+    }
+
+    return dShortestAngularDistanceUpdate(tmp_cumulative_angle, tmp_angle);
 }
 
 
@@ -672,10 +746,25 @@ dReal dJointGetUniversalAngle2( dJointID j )
     dxJointUniversal* joint = ( dxJointUniversal* )j;
     dUASSERT( joint, "bad joint argument" );
     checktype( joint, Universal );
+
+    // Do not overwrite cumulative_angle1 and
+    // cumulative_angle2 by updated joint angle.
+    // Simply calculate the current angles and return them.
+    dReal tmp_angle;
+    dReal tmp_cumulative_angle;
+
     if ( joint->flags & dJOINT_REVERSE )
-        return -joint->getAngle1();
+    {
+        tmp_angle = -joint->getAngle1();
+        tmp_cumulative_angle = -joint->cumulative_angle1;
+    }
     else
-        return joint->getAngle2();
+    {
+        tmp_angle = joint->getAngle2();
+        tmp_cumulative_angle = joint->cumulative_angle2;
+    }
+
+    return dShortestAngularDistanceUpdate(tmp_cumulative_angle, tmp_angle);
 }
 
 
diff --git a/deps/opende/src/joints/universal.h b/deps/opende/src/joints/universal.h
index 5798257..9f29025 100644
--- a/deps/opende/src/joints/universal.h
+++ b/deps/opende/src/joints/universal.h
@@ -38,6 +38,8 @@ struct dxJointUniversal : public dxJoint
     dxJointLimitMotor limot1; // limit and motor information for axis1
     dxJointLimitMotor limot2; // limit and motor information for axis2
 
+    dReal cumulative_angle1; // save a cumulative angle for beyond +/-pi limits
+    dReal cumulative_angle2; // save a cumulative angle for beyond +/-pi limits
 
     void getAxes( dVector3 ax1, dVector3 ax2 );
     void getAngles( dReal *angle1, dReal *angle2 );
diff --git a/deps/opende/src/mat.h b/deps/opende/src/mat.h
index 2814a01..bd957c2 100644
--- a/deps/opende/src/mat.h
+++ b/deps/opende/src/mat.h
@@ -30,23 +30,23 @@
 
 
 class dMatrix {
-  int n,m;		// matrix dimension, n,m >= 0
-  dReal *data;		// if nonzero, n*m elements allocated on the heap
+  int n,m;    // matrix dimension, n,m >= 0
+  dReal *data;    // if nonzero, n*m elements allocated on the heap
 
 public:
   // constructors, destructors
-  dMatrix();				// make default 0x0 matrix
-  dMatrix (int rows, int cols);		// construct zero matrix of given size
-  dMatrix (const dMatrix &);		// construct copy of given matrix
+  dMatrix();        // make default 0x0 matrix
+  dMatrix (int rows, int cols);    // construct zero matrix of given size
+  dMatrix (const dMatrix &);    // construct copy of given matrix
   // create copy of given data - element (i,j) is data[i*rowskip+j*colskip]
   dMatrix (int rows, int cols, dReal *_data, int rowskip, int colskip);
-  ~dMatrix();				// destructor
+  ~dMatrix();        // destructor
 
   // data movement
-  dReal & operator () (int i, int j);	// reference an element
-  void operator= (const dMatrix &);	// matrix = matrix
-  void operator= (dReal);		// matrix = scalar
-  dMatrix transpose();			// return transposed matrix
+  dReal & operator () (int i, int j);  // reference an element
+  void operator= (const dMatrix &);  // matrix = matrix
+  void operator= (dReal);    // matrix = scalar
+  dMatrix transpose();      // return transposed matrix
   // return a permuted submatrix of this matrix, made up of the rows in p
   // and the columns in q. p has np elements, q has nq elements.
   dMatrix select (int np, int *p, int nq, int *q);
@@ -63,7 +63,7 @@ public:
   void clearUpperTriangle();
   void clearLowerTriangle();
   void makeRandom (dReal range);
-  void print (char *fmt = "%10.4f ", FILE *f=stdout);
+  void print (char *fmt = const_cast<char*>("%10.4f "), FILE *f=stdout);
   dReal maxDifference (const dMatrix &);
 };
 
diff --git a/deps/opende/src/objects.h b/deps/opende/src/objects.h
index 7337cad..674114c 100644
--- a/deps/opende/src/objects.h
+++ b/deps/opende/src/objects.h
@@ -101,8 +101,26 @@ struct dxQuickStepParameters {
   dReal w;			// the SOR over-relaxation parameter
   int num_chunks;		// divide rows to these many chunks
   int num_overlap;		// divide rows but over lap this many rows
-  dReal sor_lcp_tolerance;	// the stop if rms_error falls below this
-  dReal rms_error;      	// rms_error for this time step
+	// stop iteration if total rms_constraint_residual falls below this value
+  dReal sor_lcp_tolerance;
+  // rms_dlambda for this time step
+  // rms_dlambda[0]: bilateral constraints (findex = -1)
+  // rms_dlambda[1]: contact normal constraints (findex = -2)
+  // rms_dlambda[2]: friction constraints (findex >= 0)
+  // rms_dlambda[3]: total (sum of previous 3)
+  dReal rms_dlambda[4];
+  // rms of constraint residuals for this time step
+  // rms_constraint_residual[0]: bilateral constraints (findex = -1)
+  // rms_constraint_residual[1]: contact normal constraints (findex = -2)
+  // rms_constraint_residual[2]: friction constraints (findex >= 0)
+  // rms_constraint_residual[3]: total (sum of previous 3)
+  dReal rms_constraint_residual[4];     // all constraint errors
+  int num_contacts;           // for monitoring number of contacts
+  bool dynamic_inertia_reduction;  // turn on/off quickstep inertia reduction.
+  dReal smooth_contacts;  // control quickstep smoothing for contact solution.
+  bool row_reorder1;  // control quickstep row reordering
+  dReal warm_start;  // warm start factor, 0: no warm start, 1: full warm start
+  int friction_iterations;  // extra quickstep iterations friction.
 };
 
 // robust-step parameters
diff --git a/deps/opende/src/ode.cpp b/deps/opende/src/ode.cpp
index f8ce80f..877617f 100644
--- a/deps/opende/src/ode.cpp
+++ b/deps/opende/src/ode.cpp
@@ -246,7 +246,7 @@ void dWorldCheck (dxWorld *w)
 dxBody::dxBody(dxWorld *w) :
     dObject(w)
 {
-    
+
 }
 
 
@@ -807,7 +807,7 @@ void dBodySetFiniteRotationMode (dBodyID b, int mode)
     if (!_dequal(b->finite_rot_axis[0], 0.0) ||
         !_dequal(b->finite_rot_axis[1], 0.0) ||
         !_dequal(b->finite_rot_axis[2], 0.0))
-    { 
+    {
       b->flags |= dxBodyFlagFiniteRotationAxis;
     }
   }
@@ -869,7 +869,7 @@ dJointID dBodyGetJoint (dBodyID b, int index)
 void dBodySetDynamic (dBodyID b)
 {
   dAASSERT (b);
-  
+
   dBodySetMass(b,&b->mass);
 }
 
@@ -877,7 +877,7 @@ void dBodySetKinematic (dBodyID b)
 {
   dAASSERT (b);
   dSetZero (b->invI,4*3);
-  b->invMass = 0; 
+  b->invMass = 0;
 }
 
 int dBodyIsKinematic (dBodyID b)
@@ -1208,11 +1208,11 @@ dxJoint* createJoint(dWorldID w, dJointGroupID group)
         group->num++;
     } else
         j = (dxJoint*) dAlloc(sizeof(T));
-    
+
     new(j) T(w);
     if (group)
         j->flags |= dJOINT_INGROUP;
-    
+
     return j;
 }
 
@@ -1323,6 +1323,24 @@ dxJoint * dJointCreatePlane2D (dWorldID w, dJointGroupID group)
     return createJoint<dxJointPlane2D> (w,group);
 }
 
+dxJoint * dJointCreateDBall (dWorldID w, dJointGroupID group)
+{
+    dAASSERT (w);
+    return createJoint<dxJointDBall> (w,group);
+}
+
+dxJoint * dJointCreateDHinge (dWorldID w, dJointGroupID group)
+{
+    dAASSERT (w);
+    return createJoint<dxJointDHinge> (w,group);
+}
+
+dxJoint * dJointCreateGearbox (dWorldID w, dJointGroupID group)
+{
+    dAASSERT (w);
+    return createJoint<dxJointGearbox> (w,group);
+}
+
 void dJointDestroy (dxJoint *j)
 {
     dAASSERT (j);
@@ -1361,7 +1379,7 @@ void dJointGroupEmpty (dJointGroupID group)
     // be at the start of those lists.
     // if any group joints have their world pointer set to 0, their world was
     // previously destroyed. no special handling is required for these joints.
-    
+
     dAASSERT (group);
     int i;
     dxJoint **jlist = (dxJoint**) ALLOCA (group->num * sizeof(dxJoint*));
@@ -1522,7 +1540,7 @@ void dJointSetDamping (dxJoint *joint, dReal damping)
 {
   dAASSERT (joint);
 
-  if (joint->type() == dJointTypeHinge || joint->type() == dJointTypeSlider || 
+  if (joint->type() == dJointTypeHinge || joint->type() == dJointTypeSlider ||
       joint->type() == dJointTypeScrew)
   {
     if (!_dequal(damping, 0.0))
@@ -1657,7 +1675,21 @@ dxWorld * dWorldCreate()
   w->qs.w = REAL(1.3);
   w->qs.num_chunks = 1;
   w->qs.num_overlap = 0;
-  w->qs.sor_lcp_tolerance = 0;
+  w->qs.sor_lcp_tolerance = -1;
+  w->qs.rms_dlambda[0] = 0;
+  w->qs.rms_dlambda[1] = 0;
+  w->qs.rms_dlambda[2] = 0;
+  w->qs.rms_dlambda[3] = 0;
+  w->qs.rms_constraint_residual[0] = 0;
+  w->qs.rms_constraint_residual[1] = 0;
+  w->qs.rms_constraint_residual[2] = 0;
+  w->qs.rms_constraint_residual[3] = 0;
+  w->qs.num_contacts = 0;
+  w->qs.dynamic_inertia_reduction = true;
+  w->qs.smooth_contacts = 0.01;
+  w->qs.row_reorder1 = true;
+  w->qs.warm_start = 0.5;
+  w->qs.friction_iterations = 10;
 
   w->contactp.max_vel = dInfinity;
   w->contactp.min_depth = 0;
@@ -1665,7 +1697,7 @@ dxWorld * dWorldCreate()
   w->dampingp.linear_scale = 0;
   w->dampingp.angular_scale = 0;
   w->dampingp.linear_threshold = REAL(0.01) * REAL(0.01);
-  w->dampingp.angular_threshold = REAL(0.01) * REAL(0.01);  
+  w->dampingp.angular_threshold = REAL(0.01) * REAL(0.01);
   w->max_angular_speed = dInfinity;
 
   w->threadpool = NULL; // new boost::threadpool::pool(0);
@@ -1870,7 +1902,7 @@ void dWorldCleanupWorkingMemory(dWorldID w)
   dUASSERT (w,"bad world argument");
 
   dxStepWorkingMemory *wmem = w->wmem;
-  
+
   if (wmem)
   {
     wmem->CleanupMemory();
@@ -1948,7 +1980,7 @@ int dWorldStep (dWorldID w, dReal stepsize)
   if (dxReallocateWorldProcessContext (w, stepsize, &dxEstimateStepMemoryRequirements))
   {
     dxProcessIslands (w, stepsize, &dInternalStepIsland);
-    
+
     result = true;
   }
 
@@ -1965,7 +1997,7 @@ int dWorldQuickStep (dWorldID w, dReal stepsize)
   if (dxReallocateWorldProcessContext (w, stepsize, &dxEstimateQuickStepMemoryRequirements))
   {
     dxProcessIslands (w, stepsize, &dxQuickStepper);
-    
+
     result = true;
   }
 
@@ -2169,6 +2201,12 @@ void dWorldSetMaxAngularSpeed(dWorldID w, dReal max_speed)
         w->max_angular_speed = max_speed;
 }
 
+double dWorldGetQuickStepTolerance (dWorldID w)
+{
+	dAASSERT(w);
+	return w->qs.sor_lcp_tolerance;
+}
+
 void dWorldSetQuickStepTolerance (dWorldID w, dReal tol)
 {
 	dAASSERT(w);
@@ -2236,12 +2274,88 @@ dReal dWorldGetQuickStepW (dWorldID w)
 	return w->qs.w;
 }
 
-dReal dWorldGetQuickStepRMSError (dWorldID w)
+dReal *dWorldGetQuickStepRMSDeltaLambda (dWorldID w)
+{
+	dAASSERT(w);
+	return w->qs.rms_dlambda;
+}
+
+dReal* dWorldGetQuickStepRMSConstraintResidual (dWorldID w)
+{
+	dAASSERT(w);
+	return w->qs.rms_constraint_residual;
+}
+
+int dWorldGetQuickStepNumContacts (dWorldID w)
+{
+	dAASSERT(w);
+	return w->qs.num_contacts;
+}
+
+/* experimental PGS */
+bool dWorldGetQuickStepInertiaRatioReduction (dWorldID w)
+{
+	dAASSERT(w);
+  return w->qs.dynamic_inertia_reduction;
+}
+
+dReal  dWorldGetQuickStepContactResidualSmoothing (dWorldID w)
+{
+	dAASSERT(w);
+  return w->qs.smooth_contacts;
+}
+
+bool  dWorldGetQuickStepExperimentalRowReordering (dWorldID w)
+{
+	dAASSERT(w);
+  return w->qs.row_reorder1;
+}
+
+dReal  dWorldGetQuickStepWarmStartFactor (dWorldID w)
 {
 	dAASSERT(w);
-	return w->qs.rms_error;
+  return w->qs.warm_start;
 }
 
+int  dWorldGetQuickStepExtraFrictionIterations (dWorldID w)
+{
+	dAASSERT(w);
+  return w->qs.friction_iterations;
+}
+
+void dWorldSetQuickStepInertiaRatioReduction (dWorldID w, bool irr)
+{
+	dAASSERT(w);
+  w->qs.dynamic_inertia_reduction = irr;
+}
+
+void dWorldSetQuickStepContactResidualSmoothing (dWorldID w, dReal smoo)
+{
+	dAASSERT(w);
+  w->qs.smooth_contacts = smoo;
+}
+
+void dWorldSetQuickStepExperimentalRowReordering (dWorldID w, bool order)
+{
+	dAASSERT(w);
+  w->qs.row_reorder1 = order;
+}
+
+void dWorldSetQuickStepWarmStartFactor (dWorldID w, dReal warm)
+{
+	dAASSERT(w);
+  w->qs.warm_start = warm;
+}
+
+void dWorldSetQuickStepExtraFrictionIterations (dWorldID w, int iters)
+{
+	dAASSERT(w);
+  w->qs.friction_iterations = iters;
+}
+
+
+
+
 
 void dWorldSetContactMaxCorrectingVel (dWorldID w, dReal vel)
 {
@@ -2467,13 +2581,13 @@ int dCheckConfiguration( const char* extension )
 			break;
 
 		terminator = where + ext_length;
-	
-		if ( (where == start || *(where - 1) == ' ') && 
+
+		if ( (where == start || *(where - 1) == ' ') &&
 			 (*terminator == ' ' || *terminator == '\0') )
 		{
 			return 1;
 		}
-		
+
 		start = terminator;
 	}
 
diff --git a/deps/opende/src/odeou.cpp b/deps/opende/src/odeou.cpp
index 42a710d..dd10d5f 100644
--- a/deps/opende/src/odeou.cpp
+++ b/deps/opende/src/odeou.cpp
@@ -41,6 +41,7 @@ ODE interface to OU library implementation.
 
 #if dOU_ENABLED
 
+BEGIN_NAMESPACE_OU()
 template<>
 const char *const CEnumUnsortedElementArray<EASSERTIONFAILURESEVERITY, AFS__MAX, const char *>::m_aetElementArray[] =
 {
@@ -48,6 +49,7 @@ const char *const CEnumUnsortedElementArray<EASSERTIONFAILURESEVERITY, AFS__MAX,
 	"check", // AFS_CHECK,
 };
 static const CEnumUnsortedElementArray<EASSERTIONFAILURESEVERITY, AFS__MAX, const char *> g_aszAssertionFailureSeverityNames;
+END_NAMESPACE_OU()
 
 
 static void _OU_CONVENTION_CALLBACK ForwardOUAssertionFailure(EASSERTIONFAILURESEVERITY fsFailureSeverity, 
diff --git a/deps/opende/src/quickstep.cpp b/deps/opende/src/quickstep.cpp
index fcdc812..91348cd 100644
--- a/deps/opende/src/quickstep.cpp
+++ b/deps/opende/src/quickstep.cpp
@@ -44,14 +44,15 @@
 #undef REPORT_THREAD_TIMING
 #define USE_TPROW
 #undef TIMING
-#undef REPORT_MONITOR
+#undef DEBUG_CONVERGENCE_TOLERANCE
 #undef SHOW_CONVERGENCE
-#undef RECOMPUTE_RMS
+#define SMOOTH_LAMBDA
 #undef USE_1NORM
 //#define LOCAL_STEPPING  // not yet implemented
 //#define PENETRATION_JVERROR_CORRECTION
 //#define POST_UPDATE_CONSTRAINT_VIOLATION_CORRECTION
 
+#undef CHECK_VELOCITY_OBEYS_CONSTRAINT
 
 
 #ifdef USE_TPROW
@@ -68,12 +69,10 @@ typedef dReal *dRealMutablePtr;
 // configuration
 
 // for the SOR and CG methods:
-// uncomment the following line to use warm starting. this definitely
-// help for motor-driven joints. unfortunately it appears to hurt
-// with high-friction contacts using the SOR method. use with care
-
-//#define WARM_STARTING 1
-
+// warm starting:
+// this definitely help for motor-driven joints.
+// unfortunately it appears to hurt with high-friction contacts
+// using the SOR method. use with care
 
 // for the SOR method:
 // uncomment the following line to determine a new constraint-solving
@@ -81,17 +80,19 @@ typedef dReal *dRealMutablePtr;
 // and the optimal order is somewhat problem dependent.
 // @@@ try the leaf->root ordering.
 
-//#define REORDER_CONSTRAINTS 1
-
+// #define REORDER_CONSTRAINTS 1
 
 // for the SOR method:
 // uncomment the following line to randomly reorder constraint rows
 // during the solution. depending on the situation, this can help a lot
 // or hardly at all, but it doesn't seem to hurt.
 
-#define RANDOMLY_REORDER_CONSTRAINTS 1
+// #define RANDOMLY_REORDER_CONSTRAINTS 1
 #undef LOCK_WHILE_RANDOMLY_REORDER_CONSTRAINTS
 
+/// scale SOR for contact to reduce overshoot in solution for contacts
+/// \TODO: make this a parameter
+#define CONTACT_SOR_SCALE 0.25
 
 // structure for passing variable pointers in SOR_LCP
 struct dxSORLCPParameters {
@@ -105,8 +106,9 @@ struct dxSORLCPParameters {
     const int* findex;
     dRealPtr hi;
     dRealPtr lo;
-    dRealPtr invI;
-    dRealPtr I;
+    dRealPtr invMOI;
+    dRealPtr MOI;
+    dRealPtr Ad;
     dRealPtr Adcfm;
     dRealPtr Adcfm_precon;
     dRealMutablePtr rhs;
@@ -117,7 +119,6 @@ struct dxSORLCPParameters {
     dRealMutablePtr lambda;
     dRealMutablePtr lambda_erp;
     dRealMutablePtr iMJ;
-    dRealMutablePtr delta_error ;
     dRealMutablePtr rhs_precon ;
     dRealMutablePtr J_precon ;
     dRealMutablePtr J_orig ;
@@ -182,7 +183,7 @@ static void Multiply1_12q1 (dReal *A, const dReal *B, const dReal *C, int q)
 // compute iMJ = inv(M)*J'
 
 static void compute_invM_JT (int m, dRealPtr J, dRealMutablePtr iMJ, int *jb,
-  dxBody * const *body, dRealPtr invI)
+  dxBody * const *body, dRealPtr invMOI)
 {
   dRealMutablePtr iMJ_ptr = iMJ;
   dRealPtr J_ptr = J;
@@ -191,20 +192,20 @@ static void compute_invM_JT (int m, dRealPtr J, dRealMutablePtr iMJ, int *jb,
     int b2 = jb[i*2+1];
     dReal k1 = body[b1]->invMass;
     for (int j=0; j<3; j++) iMJ_ptr[j] = k1*J_ptr[j];
-    const dReal *invIrow1 = invI + 12*b1;
-    dMultiply0_331 (iMJ_ptr + 3, invIrow1, J_ptr + 3);
+    const dReal *invMOIrow1 = invMOI + 12*b1;
+    dMultiply0_331 (iMJ_ptr + 3, invMOIrow1, J_ptr + 3);
     if (b2 >= 0) {
       dReal k2 = body[b2]->invMass;
       for (int j=0; j<3; j++) iMJ_ptr[j+6] = k2*J_ptr[j+6];
-      const dReal *invIrow2 = invI + 12*b2;
-      dMultiply0_331 (iMJ_ptr + 9, invIrow2, J_ptr + 9);
+      const dReal *invMOIrow2 = invMOI + 12*b2;
+      dMultiply0_331 (iMJ_ptr + 9, invMOIrow2, J_ptr + 9);
     }
   }
 }
 
+// warm starting
 // compute out = inv(M)*J'*in.
-//#ifdef WARM_STARTING
-/*static void multiply_invM_JT (int m, int nb, dRealMutablePtr iMJ, int *jb,
+static void multiply_invM_JT (int m, int nb, dRealMutablePtr iMJ, int *jb,
   dRealPtr in, dRealMutablePtr out)
 {
   dSetZero (out,6*nb);
@@ -222,8 +223,7 @@ static void compute_invM_JT (int m, dRealPtr J, dRealMutablePtr iMJ, int *jb,
     }
     iMJ_ptr += 6;
   }
-}*/
-//#endif
+}
 
 // compute out = J*in.
 
@@ -250,7 +250,8 @@ static void multiply_J (int m, dRealPtr J, int *jb,
 
 // compute out = (J*inv(M)*J' + cfm)*in.
 // use z as an nb*6 temporary.
-#ifdef WARM_STARTING
+/* not used
+// warm starting
 static void multiply_J_invM_JT (int m, int nb, dRealMutablePtr J, dRealMutablePtr iMJ, int *jb,
   dRealPtr cfm, dRealMutablePtr z, dRealMutablePtr in, dRealMutablePtr out)
 {
@@ -260,7 +261,7 @@ static void multiply_J_invM_JT (int m, int nb, dRealMutablePtr J, dRealMutablePt
   // add cfm
   for (int i=0; i<m; i++) out[i] += cfm[i] * in[i];
 }
-#endif
+*/
 
 //***************************************************************************
 // conjugate gradient method with jacobi preconditioner
@@ -287,7 +288,7 @@ static inline void add (int n, dRealMutablePtr x, dRealPtr y, dRealPtr z, dReal
 
 static void CG_LCP (dxWorldProcessContext *context,
   int m, int nb, dRealMutablePtr J, int *jb, dxBody * const *body,
-  dRealPtr invI, dRealMutablePtr lambda, dRealMutablePtr cforce, dRealMutablePtr rhs,
+  dRealPtr invMOI, dRealMutablePtr lambda, dRealMutablePtr cforce, dRealMutablePtr rhs,
   dRealMutablePtr lo, dRealMutablePtr hi, dRealPtr cfm, int *findex,
   dxQuickStepParameters *qs)
 {
@@ -295,7 +296,7 @@ static void CG_LCP (dxWorldProcessContext *context,
 
   // precompute iMJ = inv(M)*J'
   dReal *iMJ = context->AllocateArray<dReal> (m*12);
-  compute_invM_JT (m,J,iMJ,jb,body,invI);
+  compute_invM_JT (m,J,iMJ,jb,body,invMOI);
 
   dReal last_rho = 0;
   dReal *r = context->AllocateArray<dReal> (m);
@@ -318,14 +319,18 @@ static void CG_LCP (dxWorldProcessContext *context,
     Ad[i] = REAL(1.0) / (sum + cfm[i]);
   }
 
-#ifdef WARM_STARTING
-  // compute residual r = rhs - A*lambda
-  multiply_J_invM_JT (m,nb,J,iMJ,jb,cfm,cforce,lambda,r);
-  for (int k=0; k<m; k++) r[k] = rhs[k] - r[k];
-#else
-  dSetZero (lambda,m);
-  memcpy (r,rhs,m*sizeof(dReal));    // residual r = rhs - A*lambda
-#endif
+  if (qs->warm_start > 0)
+  {
+    // warm start
+    // compute residual r = rhs - A*lambda
+    multiply_J_invM_JT (m,nb,J,iMJ,jb,cfm,cforce,lambda,r);
+    for (int k=0; k<m; k++) r[k] = rhs[k] - r[k];
+  }
+  else
+  {
+    dSetZero (lambda,m);
+    memcpy (r,rhs,m*sizeof(dReal));    // residual r = rhs - A*lambda
+  }
 
   for (int iteration=0; iteration < num_iterations; iteration++) {
     for (int i=0; i<m; i++) z[i] = r[i]*Ad[i];  // z = inv(M)*r
@@ -395,7 +400,7 @@ static int compare_index_error (const void *a, const void *b)
 #endif
 
 void computeRHSPrecon(dxWorldProcessContext *context, const int m, const int nb,
-                      dRealPtr I, dxBody * const *body,
+                      dRealPtr MOI, dxBody * const *body,
                       const dReal /*stepsize1*/, dRealMutablePtr /*c*/, dRealMutablePtr J,
                       int *jb, dRealMutablePtr rhs_precon)
 {
@@ -417,16 +422,16 @@ void computeRHSPrecon(dxWorldProcessContext *context, const int m, const int nb,
       // tmp1 = M*v/h + fe
       //
       dReal *tmp1curr = tmp1;
-      const dReal *Irow = I;
+      const dReal *MOIrow = MOI;
       dxBody *const *const bodyend = body + nb;
-      for (dxBody *const *bodycurr = body; bodycurr != bodyend; tmp1curr+=6, Irow+=12, bodycurr++) {
+      for (dxBody *const *bodycurr = body; bodycurr != bodyend; tmp1curr+=6, MOIrow+=12, bodycurr++) {
         dxBody *b_ptr = *bodycurr;
         // dReal body_mass = b_ptr->mass.mass;
         for (int j=0; j<3; j++)
           tmp1curr[j] = b_ptr->facc[j]; // +  body_mass * b_ptr->lvel[j] * stepsize1;
         dReal tmpa[3];
         for (int j=0; j<3; j++) tmpa[j] = 0; //b_ptr->avel[j] * stepsize1;
-        dMultiply0_331 (tmp1curr + 3,Irow,tmpa);
+        dMultiply0_331 (tmp1curr + 3,MOIrow,tmpa);
         for (int k=0; k<3; k++) tmp1curr[3+k] += b_ptr->tacc[k];
       }
       //
@@ -483,7 +488,11 @@ static inline void sum6(dRealMutablePtr a, dReal delta, dRealPtr b)
 }
 
 static void ComputeRows(
+#ifdef SHOW_CONVERGENCE
+                int thread_id,
+#else
                 int /*thread_id*/,
+#endif
                 IndexError* order,
                 dxBody* const * /*body*/,
                 dxSORLCPParameters params,
@@ -514,6 +523,7 @@ static void ComputeRows(
   const int* findex            = params.findex;
   dRealPtr        hi           = params.hi;
   dRealPtr        lo           = params.lo;
+  dRealPtr        Ad           = params.Ad;
   dRealPtr        Adcfm        = params.Adcfm;
   dRealPtr        Adcfm_precon = params.Adcfm_precon;
   dRealMutablePtr rhs          = params.rhs;
@@ -524,9 +534,6 @@ static void ComputeRows(
   dRealMutablePtr lambda       = params.lambda;
   dRealMutablePtr lambda_erp   = params.lambda_erp;
   dRealMutablePtr iMJ          = params.iMJ;
-#ifdef RECOMPUTE_RMS
-  dRealMutablePtr delta_error  = params.delta_error;
-#endif
   dRealMutablePtr rhs_precon   = params.rhs_precon;
   dRealMutablePtr J_precon     = params.J_precon;
   dRealMutablePtr J_orig       = params.J_orig;
@@ -583,25 +590,66 @@ static void ComputeRows(
   printf("\n");
   */
 
-  double rms_error = 0;
+  // m_rms_dlambda[3] keeps track of number of constraint
+  // rows per type of constraint.
+  // m_rms_dlambda[0]: bilateral constraints (findex = -1)
+  // m_rms_dlambda[1]: contact normal constraints (findex = -2)
+  // rm_ms_dlambda[2]: friction constraints (findex >= 0)
+  int m_rms_dlambda[3];
+  m_rms_dlambda[0] = 0;
+  m_rms_dlambda[1] = 0;
+  m_rms_dlambda[2] = 0;
+
+  // rms of dlambda
+  dReal rms_dlambda[4];
+  dSetZero(rms_dlambda, 4);
+  // rms of b_i - A_ij \lambda_j as we sweep through rows
+  dReal rms_error[4];
+  dSetZero(rms_error, 4);
+
   int num_iterations = qs->num_iterations;
   int precon_iterations = qs->precon_iterations;
-  double sor_lcp_tolerance = qs->sor_lcp_tolerance;
-
+  dReal sor_lcp_tolerance = qs->sor_lcp_tolerance;
+  int friction_iterations = qs->friction_iterations;
+  dReal smooth_contacts = qs->smooth_contacts;
 
-  // FIME: preconditioning can be defined insdie iterations loop now, becareful to match last iteration with
-  //       velocity update
-  bool preconditioning;
+#ifdef SHOW_CONVERGENCE
+    // show starting lambda
+    printf("lambda start: [");
+    for (int i=startRow; i<startRow+nRows; i++)
+      printf("%f, ", lambda[i]);
+    printf("]\n");
+#endif
 
 #ifdef PENETRATION_JVERROR_CORRECTION
   dReal Jvnew_final = 0;
 #endif
-  for (int iteration=0; iteration < num_iterations + precon_iterations; iteration++) {
-
-    rms_error = 0;
-
-    if (iteration < precon_iterations) preconditioning = true;
-    else                               preconditioning = false;
+  dRealMutablePtr caccel_ptr1;
+  dRealMutablePtr caccel_ptr2;
+  dRealMutablePtr caccel_erp_ptr1;
+  dRealMutablePtr caccel_erp_ptr2;
+  dRealMutablePtr cforce_ptr1;
+  dRealMutablePtr cforce_ptr2;
+  int total_iterations = precon_iterations + num_iterations + 
+    friction_iterations;
+  for (int iteration = 0; iteration < total_iterations; ++iteration)
+  {
+    // reset rms_dlambda at beginning of iteration
+    rms_dlambda[2] = 0;
+    // reset rms_error at beginning of iteration
+    rms_error[2] = 0;
+    m_rms_dlambda[2] = 0;
+    if (iteration < num_iterations + precon_iterations)
+    {
+      // skip resetting rms_dlambda and rms_error for bilateral constraints
+      // and contact normals during extra friction iterations.
+      rms_dlambda[0] = 0;
+      rms_dlambda[1] = 0;
+      rms_error[0] = 0;
+      rms_error[1] = 0;
+      m_rms_dlambda[0] = 0;
+      m_rms_dlambda[1] = 0;
+    }
 
 #ifdef REORDER_CONSTRAINTS //FIXME: do it for lambda_erp and last_lambda_erp
     // constraints with findex < 0 always come first.
@@ -674,19 +722,12 @@ static void ComputeRows(
     }
 #endif
 
-    dRealMutablePtr caccel_ptr1;
-    dRealMutablePtr caccel_ptr2;
-    dRealMutablePtr caccel_erp_ptr1;
-    dRealMutablePtr caccel_erp_ptr2;
-
 #ifdef PENETRATION_JVERROR_CORRECTION
     dRealMutablePtr vnew_ptr1;
     dRealMutablePtr vnew_ptr2;
     const dReal stepsize1 = dRecip(stepsize);
     dReal Jvnew = 0;
 #endif
-    dRealMutablePtr cforce_ptr1;
-    dRealMutablePtr cforce_ptr2;
     for (int i=startRow; i<startRow+nRows; i++) {
       //boost::recursive_mutex::scoped_lock lock(*mutex); // lock for every row
 
@@ -696,6 +737,14 @@ static void ComputeRows(
       //     access pattern.
 
       int index = order[i].index;
+      int constraint_index = findex[index];  // cache for efficiency
+
+      // check if we are doing extra friction_iterations, if so, only solve
+      // friction force constraints and nothing else.
+      // i.e. skip bilateral and contact normal constraints.
+      if (iteration >= (num_iterations + precon_iterations) &&
+          constraint_index < 0)
+        continue;
 
       dReal delta,delta_erp;
       dReal delta_precon;
@@ -704,15 +753,24 @@ static void ComputeRows(
         int b1 = jb[index*2];
         int b2 = jb[index*2+1];
         caccel_ptr1 = caccel + 6*b1;
-        caccel_ptr2 = (b2 >= 0) ? caccel + 6*b2 : NULL;
         caccel_erp_ptr1 = caccel_erp + 6*b1;
-        caccel_erp_ptr2 = (b2 >= 0) ? caccel_erp + 6*b2 : NULL;
+        cforce_ptr1 = cforce + 6*b1;
+        if (b2 >= 0)
+        {
+          caccel_ptr2     = caccel + 6*b2;
+          caccel_erp_ptr2 = caccel_erp + 6*b2;
+          cforce_ptr2     = cforce + 6*b2;
+        }
+        else
+        {
+          caccel_ptr2     = NULL;
+          caccel_erp_ptr2 = NULL;
+          cforce_ptr2     = NULL;
+        }
 #ifdef PENETRATION_JVERROR_CORRECTION
         vnew_ptr1 = vnew + 6*b1;
         vnew_ptr2 = (b2 >= 0) ? vnew + 6*b2 : NULL;
 #endif
-        cforce_ptr1 = cforce + 6*b1;
-        cforce_ptr2 = (b2 >= 0) ? cforce + 6*b2 : NULL;
       }
 
       dReal old_lambda        = lambda[index];
@@ -726,8 +784,10 @@ static void ComputeRows(
       //  Ad_precon is derived from diagonal of J J'
       //
       // caccel_erp is from the non-precon case with erp turned on
-      //
-      if (preconditioning) {
+      if (iteration < precon_iterations)
+      {
+        // preconditioning
+
         // update delta_precon
         delta_precon = rhs_precon[index] - old_lambda*Adcfm_precon[index];
 
@@ -747,8 +807,8 @@ static void ComputeRows(
         // the constraints are ordered so that all lambda[] values needed have
         // already been computed.
         dReal hi_act, lo_act;
-        if (findex[index] >= 0) {
-          hi_act = dFabs (hi[index] * lambda[findex[index]]);
+        if (constraint_index >= 0) {
+          hi_act = dFabs (hi[index] * lambda[constraint_index]);
           lo_act = -hi_act;
         } else {
           hi_act = hi[index];
@@ -758,21 +818,19 @@ static void ComputeRows(
         // compute lambda and clamp it to [lo,hi].
         // @@@ SSE not a win here
 #if 1
-        dReal new_lambda = old_lambda+ delta_precon;
-        if (new_lambda < lo_act) {
+        lambda[index] = old_lambda+ delta_precon;
+        if (lambda[index] < lo_act) {
           delta_precon = lo_act-old_lambda;
           lambda[index] = lo_act;
         }
-        else if (new_lambda > hi_act) {
+        else if (lambda[index] > hi_act) {
           delta_precon = hi_act-old_lambda;
           lambda[index] = hi_act;
         }
-        else {
-          lambda[index] = new_lambda;
-        }
 #else
         dReal nl = old_lambda+ delta_precon;
-        _mm_store_sd(&nl, _mm_max_sd(_mm_min_sd(_mm_load_sd(&nl), _mm_load_sd(&hi_act)), _mm_load_sd(&lo_act)));
+        _mm_store_sd(&nl, _mm_max_sd(_mm_min_sd(_mm_load_sd(&nl),
+          _mm_load_sd(&hi_act)), _mm_load_sd(&lo_act)));
         lambda[index] = nl;
         delta_precon = nl - old_lambda;
 #endif
@@ -780,7 +838,8 @@ static void ComputeRows(
         // update cforce (this is strictly for the precon case)
         {
           // for preconditioning case, compute cforce
-          J_ptr = J_orig + index*12; // FIXME: need un-altered unscaled J, not J_precon!!
+          // FIXME: need un-altered unscaled J, not J_precon!!
+          J_ptr = J_orig + index*12;
 
           // update cforce.
           sum6(cforce_ptr1, delta_precon, J_ptr);
@@ -788,190 +847,275 @@ static void ComputeRows(
             sum6(cforce_ptr2, delta_precon, J_ptr + 6);
         }
 
-        // record error (for the non-erp version)
-        rms_error += delta_precon*delta_precon;
-#ifdef RECOMPUTE_RMS
-        delta_error[index] = dFabs(delta_precon);
-#endif
-        old_lambda_erp = old_lambda;
-        lambda_erp[index] = lambda[index];
-      }
-      else {
+        // record residual (error) (for the non-erp version)
+        // given
+        //   dlambda = sor * (b_i - A_ij * lambda_j)/(A_ii + cfm)
+        // define scalar Ad:
+        //   Ad = sor / (A_ii + cfm)
+        // then
+        //   dlambda = Ad  * (b_i - A_ij * lambda_j)
+        // thus, to get residual from dlambda,
+        //   residual = dlambda / Ad
+        // or
+        //   residual = sqrt(sum( Ad2 * dlambda_i * dlambda_i))
+        //   where Ad2 = 1/(Ad * Ad)
+        dReal Ad2 = 0.0;
+        if (!_dequal(Ad[index], 0.0))
+        {
+          // Ad[i] = sor_w / (sum + cfm[i]);
+          Ad2 = 1.0 / (Ad[index] * Ad[index]);
+        }
+        else
         {
-          // FOR erp = 0
+          // TODO: Usually, this means qs->w (SOR param) is zero.
+          // Residual calculation is wrong when SOR (w) is zero
+          // Given SOR is rarely 0, we'll set residual as 0 for now.
+          // To do this properly, we should compute dlambda without sor
+          // then use the Ad without SOR to back out residual.
+        }
 
-          // NOTE:
-          // for this update, we need not throw away J*v(n+1)/h term from rhs
-          //   ...so adding it back, but remember rhs has already been
-          //      scaled by Ad_i, so we need to do the same to J*v(n+1)/h
-          //      but given that J is already scaled by Ad_i, we don't have
-          //      to do it explicitly here
+        dReal delta_precon2 = delta_precon*delta_precon;
+        if (constraint_index == -1)  // bilateral
+        {
+          rms_dlambda[0] += delta_precon2;
+          rms_error[0] += delta_precon2*Ad2;
+          m_rms_dlambda[0]++;
+        }
+        else if (constraint_index == -2)  // contact normal
+        {
+          rms_dlambda[1] += delta_precon2;
+          rms_error[1] += delta_precon2*Ad2;
+          m_rms_dlambda[1]++;
+        }
+        else  // friction forces
+        {
+          rms_dlambda[2] += delta_precon2;
+          rms_error[2] += delta_precon2*Ad2;
+          m_rms_dlambda[2]++;
+        }
 
-          delta =
+        old_lambda_erp = old_lambda;
+        lambda_erp[index] = lambda[index];
+      }
+      else
+      {
+        // NOTE:
+        // for this update, we need not throw away J*v(n+1)/h term from rhs
+        //   ...so adding it back, but remember rhs has already been
+        //      scaled by Ad_i, so we need to do the same to J*v(n+1)/h
+        //      but given that J is already scaled by Ad_i, we don't have
+        //      to do it explicitly here
+
+        // delta: erp throttled by info.c_v_max or info.c
+        delta =
 #ifdef PENETRATION_JVERROR_CORRECTION
-                 Jvnew_final +
+               Jvnew_final +
 #endif
-                rhs[index] - old_lambda*Adcfm[index];
-
-          dRealPtr J_ptr = J + index*12;
-          delta -= dot6(caccel_ptr1, J_ptr);
-          if (caccel_ptr2)
-            delta -= dot6(caccel_ptr2, J_ptr + 6);
-
-          // set the limits for this constraint.
-          // this is the place where the QuickStep method differs from the
-          // direct LCP solving method, since that method only performs this
-          // limit adjustment once per time step, whereas this method performs
-          // once per iteration per constraint row.
-          // the constraints are ordered so that all lambda[] values needed have
-          // already been computed.
-          dReal hi_act, lo_act;
-          if (findex[index] >= 0) {
-            hi_act = dFabs (hi[index] * lambda[findex[index]]);
-            lo_act = -hi_act;
-          } else {
-            hi_act = hi[index];
-            lo_act = lo[index];
-          }
-
-          // compute lambda and clamp it to [lo,hi].
-          // @@@ SSE not a win here
-  #if 1
-          dReal new_lambda = old_lambda + delta;
-          if (new_lambda < lo_act) {
-            delta = lo_act-old_lambda;
-            lambda[index] = lo_act;
-          }
-          else if (new_lambda > hi_act) {
-            delta = hi_act-old_lambda;
-            lambda[index] = hi_act;
-          }
-          else {
-            lambda[index] = new_lambda;
-          }
-  #else
-          dReal nl = old_lambda + delta;
-          _mm_store_sd(&nl, _mm_max_sd(_mm_min_sd(_mm_load_sd(&nl), _mm_load_sd(&hi_act)), _mm_load_sd(&lo_act)));
-          lambda[index] = nl;
-          delta = nl - old_lambda;
-  #endif
+              rhs[index] - old_lambda*Adcfm[index];
+        dRealPtr J_ptr = J + index*12;
+        delta -= dot6(caccel_ptr1, J_ptr);
+        if (caccel_ptr2)
+          delta -= dot6(caccel_ptr2, J_ptr + 6);
+
+        // delta_erp: unthrottled version compute for rhs with custom erp
+        // for rhs_erp  note: Adcfm does not have erp because it is on the lhs
+        delta_erp = rhs_erp[index] - old_lambda_erp*Adcfm[index];
+        delta_erp -= dot6(caccel_erp_ptr1, J_ptr);
+        if (caccel_erp_ptr2)
+          delta_erp -= dot6(caccel_erp_ptr2, J_ptr + 6);
 
-          // update caccel
-          {
-            // for non-precon case, update caccel
-            dRealPtr iMJ_ptr = iMJ + index*12;
+        // set the limits for this constraint.
+        // this is the place where the QuickStep method differs from the
+        // direct LCP solving method, since that method only performs this
+        // limit adjustment once per time step, whereas this method performs
+        // once per iteration per constraint row.
+        // the constraints are ordered so that all lambda[] values needed have
+        // already been computed.
+        dReal hi_act, lo_act;
+        dReal hi_act_erp, lo_act_erp;
+        if (constraint_index >= 0) {
+          // FOR erp throttled by info.c_v_max or info.c
+          hi_act = dFabs (hi[index] * lambda[constraint_index]);
+          lo_act = -hi_act;
+          // for the unthrottled _erp version
+          hi_act_erp = dFabs (hi[index] * lambda_erp[constraint_index]);
+          lo_act_erp = -hi_act_erp;
+        } else {
+          // FOR erp throttled by info.c_v_max or info.c
+          hi_act = hi[index];
+          lo_act = lo[index];
+          // for the unthrottled _erp version
+          hi_act_erp = hi[index];
+          lo_act_erp = lo[index];
+        }
 
-            // update caccel.
-            sum6(caccel_ptr1, delta, iMJ_ptr);
-            if (caccel_ptr2)
-              sum6(caccel_ptr2, delta, iMJ_ptr + 6);
+        // compute lambda and clamp it to [lo,hi].
+        // @@@ SSE not a win here
+#if 1
+        // FOR erp throttled by info.c_v_max or info.c
+        lambda[index] = old_lambda + delta;
+        if (lambda[index] < lo_act) {
+          delta = lo_act-old_lambda;
+          lambda[index] = lo_act;
+        }
+        else if (lambda[index] > hi_act) {
+          delta = hi_act-old_lambda;
+          lambda[index] = hi_act;
+        }
 
+        // for the unthrottled _erp version
+        lambda_erp[index] = old_lambda_erp + delta_erp;
+        if (lambda_erp[index] < lo_act_erp) {
+          delta_erp = lo_act_erp-old_lambda_erp;
+          lambda_erp[index] = lo_act_erp;
+        }
+        else if (lambda_erp[index] > hi_act_erp) {
+          delta_erp = hi_act_erp-old_lambda_erp;
+          lambda_erp[index] = hi_act_erp;
+        }
+#else
+        // FOR erp throttled by info.c_v_max or info.c
+        dReal nl = old_lambda + delta;
+        _mm_store_sd(&nl, _mm_max_sd(_mm_min_sd(_mm_load_sd(&nl), _mm_load_sd(&hi_act)), _mm_load_sd(&lo_act)));
+        lambda[index] = nl;
+        delta = nl - old_lambda;
 
-#ifdef PENETRATION_JVERROR_CORRECTION
-            // update vnew incrementally
-            //   add stepsize * delta_caccel to the body velocity
-            //   vnew = vnew + dt * delta_caccel
-            sum6(vnew_ptr1, stepsize*delta, iMJ_ptr);;
-            if (caccel_ptr2)
-              sum6(vnew_ptr2, stepsize*delta, iMJ_ptr + 6);
-
-            // COMPUTE Jvnew = J*vnew/h*Ad
-            //   but J is already scaled by Ad, and we multiply by h later
-            //   so it's just Jvnew = J*vnew here
-            if (iteration >= num_iterations-7) {
-              // check for non-contact bilateral constraints only
-              // I've set findex to -2 for contact normal constraint
-              if (findex[index] == -1) {
-                dRealPtr J_ptr = J + index*12;
-                Jvnew = dot6(vnew_ptr1,J_ptr);
-                if (caccel_ptr2)
-                  Jvnew += dot6(vnew_ptr2,J_ptr+6);
-                //printf("iter [%d] findex [%d] Jvnew [%f] lo [%f] hi [%f]\n",
-                //       iteration, findex[index], Jvnew, lo[index], hi[index]);
-              }
-            }
-            //printf("iter [%d] vnew [%f,%f,%f,%f,%f,%f] Jvnew [%f]\n",
-            //       iteration,
-            //       vnew_ptr1[0], vnew_ptr1[1], vnew_ptr1[2],
-            //       vnew_ptr1[3], vnew_ptr1[4], vnew_ptr1[5],Jvnew);
+        // for the unthrottled _erp version
+        dReal nl = old_lambda_erp + delta_erp;
+        _mm_store_sd(&nl, _mm_max_sd(_mm_min_sd(_mm_load_sd(&nl), _mm_load_sd(&hi_act)), _mm_load_sd(&lo_act)));
+        lambda_erp[index] = nl;
+        delta_erp = nl - old_lambda_erp;
 #endif
 
+        // option to smooth lambda
+#ifdef SMOOTH_LAMBDA
+        {
+          // smooth delta lambda
+          // equivalent to first order artificial dissipation on lambda update.
+
+          // debug smoothing
+          // if (i == 0)
+          //   printf("rhs[%f] adcfm[%f]: ",rhs[index], Adcfm[index]);
+          // if (i == 0)
+          //   printf("dlambda iter[%d]: ",iteration);
+          // printf(" %f ", lambda[index]-old_lambda);
+          // if (i == startRow + nRows - 1)
+          //   printf("\n");
+
+          // extra residual smoothing for contact constraints
+          // was smoothing both contact normal and friction constraints for VRC
+          // if (constraint_index != -1)
+          // smooth only lambda for friction directions fails friction_demo.world
+          if (constraint_index != -1)
+          {
+            lambda[index] = (1.0 - smooth_contacts)*lambda[index]
+              + smooth_contacts*old_lambda;
+            // is filtering lambda_erp necessary?
+            // lambda_erp[index] = (1.0 - smooth_contacts)*lambda_erp[index]
+            //   + smooth_contacts*old_lambda_erp;
           }
         }
-        // record error (for the non-erp version)
-        rms_error += delta*delta;
-#ifdef RECOMPUTE_RMS
-        delta_error[index] = dFabs(delta);
 #endif
+
+        // update caccel
         {
-          // FOR erp != 0
-          // for rhs_erp  note: Adcfm does not have erp because it is on the lhs
-          delta_erp = rhs_erp[index] - old_lambda_erp*Adcfm[index];
-          dRealPtr J_ptr = J + index*12;
-          delta_erp -= dot6(caccel_erp_ptr1, J_ptr);
-          if (caccel_erp_ptr2)
-            delta_erp -= dot6(caccel_erp_ptr2, J_ptr + 6);
-
-          // for the _erp version
-          // set the limits for this constraint.
-          // this is the place where the QuickStep method differs from the
-          // direct LCP solving method, since that method only performs this
-          // limit adjustment once per time step, whereas this method performs
-          // once per iteration per constraint row.
-          // the constraints are ordered so that all lambda_erp[] values needed have
-          // already been computed.
-          dReal hi_act, lo_act;
-          if (findex[index] >= 0) {
-            hi_act = dFabs (hi[index] * lambda_erp[findex[index]]);
-            lo_act = -hi_act;
-          } else {
-            hi_act = hi[index];
-            lo_act = lo[index];
-          }
+          // FOR erp throttled by info.c_v_max or info.c
+          dRealPtr iMJ_ptr = iMJ + index*12;
 
-          // compute lambda and clamp it to [lo,hi].
-          // @@@ SSE not a win here
-  #if 1
-          dReal new_lambda_erp = old_lambda_erp + delta_erp;
-          if (new_lambda_erp < lo_act) {
-            delta_erp = lo_act-old_lambda_erp;
-            lambda_erp[index] = lo_act;
-          }
-          else if (new_lambda_erp > hi_act) {
-            delta_erp = hi_act-old_lambda_erp;
-            lambda_erp[index] = hi_act;
-          }
-          else {
-            lambda_erp[index] = new_lambda_erp;
-          }
-  #else
-          dReal nl = old_lambda_erp + delta_erp;
-          _mm_store_sd(&nl, _mm_max_sd(_mm_min_sd(_mm_load_sd(&nl), _mm_load_sd(&hi_act)), _mm_load_sd(&lo_act)));
-          lambda_erp[index] = nl;
-          delta_erp = nl - old_lambda_erp;
-  #endif
-          // update caccel_erp
-          if (!preconditioning)
-          {
-            // for non-precon case, update caccel_erp
-            dRealPtr iMJ_ptr = iMJ + index*12;
+          // update caccel.
+          sum6(caccel_ptr1, delta, iMJ_ptr);
+          if (caccel_ptr2)
+            sum6(caccel_ptr2, delta, iMJ_ptr + 6);
 
-            // update caccel_erp.
-            sum6(caccel_erp_ptr1, delta_erp, iMJ_ptr);
-            if (caccel_erp_ptr2)
-              sum6(caccel_erp_ptr2, delta_erp, iMJ_ptr + 6);
+          // update caccel_erp.
+          sum6(caccel_erp_ptr1, delta_erp, iMJ_ptr);
+          if (caccel_erp_ptr2)
+            sum6(caccel_erp_ptr2, delta_erp, iMJ_ptr + 6);
 
+#ifdef PENETRATION_JVERROR_CORRECTION
+          // update vnew incrementally
+          //   add stepsize * delta_caccel to the body velocity
+          //   vnew = vnew + dt * delta_caccel
+          sum6(vnew_ptr1, stepsize*delta, iMJ_ptr);;
+          if (caccel_ptr2)
+            sum6(vnew_ptr2, stepsize*delta, iMJ_ptr + 6);
+
+          // COMPUTE Jvnew = J*vnew/h*Ad
+          //   but J is already scaled by Ad, and we multiply by h later
+          //   so it's just Jvnew = J*vnew here
+          if (iteration >= num_iterations-7) {
+            // check for non-contact bilateral constraints only
+            // I've set findex to -2 for contact normal constraint
+            if (constraint_index == -1) {
+              dRealPtr J_ptr = J + index*12;
+              Jvnew = dot6(vnew_ptr1,J_ptr);
+              if (caccel_ptr2)
+                Jvnew += dot6(vnew_ptr2,J_ptr+6);
+              // printf("iter [%d] findex [%d] Jvnew [%f] lo [%f] hi [%f]\n",
+              //   iteration, constraint_index, Jvnew, lo[index], hi[index]);
+            }
           }
+          //printf("iter [%d] vnew [%f,%f,%f,%f,%f,%f] Jvnew [%f]\n",
+          //       iteration,
+          //       vnew_ptr1[0], vnew_ptr1[1], vnew_ptr1[2],
+          //       vnew_ptr1[3], vnew_ptr1[4], vnew_ptr1[5],Jvnew);
+#endif
         }
-      }
 
+        // record residual (error) (for the non-erp version)
+        // given
+        //   dlambda = sor * (b_i - A_ij * lambda_j)/(A_ii + cfm)
+        // define scalar Ad:
+        //   Ad = sor / (A_ii + cfm)
+        // then
+        //   dlambda = Ad  * (b_i - A_ij * lambda_j)
+        // thus, to get residual from dlambda,
+        //   residual = dlambda / Ad
+        // or
+        //   residual = sqrt(sum( Ad2 * dlambda_i * dlambda_i))
+        //   where Ad2 = 1/(Ad * Ad)
+        dReal Ad2 = 0.0;
+        if (!_dequal(Ad[index], 0.0))
+        {
+          // Ad[i] = sor_w / (sum + cfm[i]);
+          Ad2 = 1.0 / (Ad[index] * Ad[index]);
+        }
+        else
+        {
+          // TODO: Usually, this means qs->w (SOR param) is zero.
+          // Residual calculation is wrong when SOR (w) is zero
+          // Given SOR is rarely 0, we'll set residual as 0 for now.
+          // To do this properly, we should compute dlambda without sor
+          // then use the Ad without SOR to back out residual.
+        }
 
+        dReal delta2 = delta*delta;
+        if (constraint_index == -1)  // bilateral
+        {
+          rms_dlambda[0] += delta2;
+          rms_error[0] += delta2*Ad2;
+          m_rms_dlambda[0]++;
+        }
+        else if (constraint_index == -2)  // contact normal
+        {
+          rms_dlambda[1] += delta2;
+          rms_error[1] += delta2*Ad2;
+          m_rms_dlambda[1]++;
+        }
+        else  // friction forces
+        {
+          rms_dlambda[2] += delta2;
+          rms_error[2] += delta2*Ad2;
+          m_rms_dlambda[2]++;
+        }
+      }
 
       //@@@ a trick that may or may not help
       //dReal ramp = (1-((dReal)(iteration+1)/(dReal)iterations));
       //delta *= ramp;
 
     } // end of for loop on m
+
 #ifdef PENETRATION_JVERROR_CORRECTION
     Jvnew_final = Jvnew*stepsize1;
     Jvnew_final = Jvnew_final > 1.0 ? 1.0 : ( Jvnew_final < -1.0 ? -1.0 : Jvnew_final );
@@ -979,30 +1123,30 @@ static void ComputeRows(
 
     // DO WE NEED TO COMPUTE NORM ACROSS ENTIRE SOLUTION SPACE (0,m)?
     // since local convergence might produce errors in other nodes?
-#ifdef RECOMPUTE_RMS
-    // recompute rms_error to be sure swap is not corrupting arrays
-    rms_error = 0;
-    #ifdef USE_1NORM
-        //for (int i=startRow; i<startRow+nRows; i++)
-        for (int i=0; i<m; i++)
-        {
-          rms_error = dFabs(delta_error[order[i].index]) > rms_error ? dFabs(delta_error[order[i].index]) : rms_error; // 1norm test
-        }
-    #else // use 2 norm
-        //for (int i=startRow; i<startRow+nRows; i++)
-        for (int i=0; i<m; i++)  // use entire solution vector errors
-          rms_error += delta_error[order[i].index]*delta_error[order[i].index]; ///(dReal)nRows;
-        rms_error = sqrt(rms_error/(dReal)nRows);
-    #endif
-#else
-    rms_error = sqrt(rms_error/(dReal)nRows);
-#endif
-
-    //printf("------ %d %d %20.18f\n",thread_id,iteration,rms_error);
-
-    //for (int i=startRow; i<startRow+nRows; i++) printf("debug: %d %f\n",i,delta_error[i]);
-
-
+    dReal dlambda_bilateral_mean        = rms_dlambda[0]/(dReal)m_rms_dlambda[0];
+    dReal dlambda_contact_normal_mean   = rms_dlambda[1]/(dReal)m_rms_dlambda[1];
+    dReal dlambda_contact_friction_mean = rms_dlambda[2]/(dReal)m_rms_dlambda[2];
+    dReal dlambda_total_mean = (rms_dlambda[0] + rms_dlambda[1] + rms_dlambda[2])/
+      ((dReal)(m_rms_dlambda[0] + m_rms_dlambda[1] + m_rms_dlambda[2]));
+
+    qs->rms_dlambda[0] = sqrt(dlambda_bilateral_mean);
+    qs->rms_dlambda[1] = sqrt(dlambda_contact_normal_mean);
+    qs->rms_dlambda[2] = sqrt(dlambda_contact_friction_mean);
+    qs->rms_dlambda[3] = sqrt(dlambda_total_mean);
+
+    dReal residual_bilateral_mean        = rms_error[0]/(dReal)m_rms_dlambda[0];
+    dReal residual_contact_normal_mean   = rms_error[1]/(dReal)m_rms_dlambda[1];
+    dReal residual_contact_friction_mean = rms_error[2]/(dReal)m_rms_dlambda[2];
+    dReal residual_total_mean = (rms_error[0] + rms_error[1] + rms_error[2])/
+      ((dReal)(m_rms_dlambda[0] + m_rms_dlambda[1] + m_rms_dlambda[2]));
+
+    qs->rms_constraint_residual[0] = sqrt(residual_bilateral_mean);
+    qs->rms_constraint_residual[1] = sqrt(residual_contact_normal_mean);
+    qs->rms_constraint_residual[2] = sqrt(residual_contact_friction_mean);
+    qs->rms_constraint_residual[3] = sqrt(residual_total_mean);
+    qs->num_contacts = m_rms_dlambda[1];
+
+    // debugging mutex locking
     //{
     //  // verify
     //  boost::recursive_mutex::scoped_lock lock(*mutex); // lock for every row
@@ -1012,41 +1156,70 @@ static void ComputeRows(
     //  printf("\n");
     //  for (int i=startRow+1; i<startRow+nRows; i++)
     //    printf(" %10d;",order[i].index);
-    //  printf("\n");
-    //  for (int i=startRow+1; i<startRow+nRows; i++)
-    //    printf(" %10.8f,",delta_error[i]);
-    //  printf("\n%f\n",rms_error);
+    //  printf("\n%f %f %f\n",
+    //    qs->rms_dlambda[0],qs->rms_dlambda[1],qs->rms_dlambda[2]);
     //}
 
 #ifdef SHOW_CONVERGENCE
-    printf("MONITOR: id: %d iteration: %d error: %20.16f\n",thread_id,iteration,rms_error);
+    /* uncomment for convergence information per row sweep (LOTS OF DATA!)
+    printf("MONITOR: thread(%d) iter(%d) rms(%20.18f %20.18f %20.18)f\n",
+      thread_id, iteration,
+      qs->rms_dlambda[0], qs->rms_dlambda[1], qs->rms_dlambda[2]);
+
+    // print lambda
+    for (int i=startRow; i<startRow+nRows; i++)
+      printf("%f, ", lambda[i]);
+    printf("\n");
+    */
 #endif
 
-    if (rms_error < sor_lcp_tolerance)
+    // option to stop when tolerance has been met
+    if (iteration >= precon_iterations &&
+        qs->rms_constraint_residual[3] < sor_lcp_tolerance)
     {
-      #ifdef REPORT_MONITOR
-        printf("CONVERGED: id: %d steps: %d rms(%20.18f < %20.18f)\n",thread_id,iteration,rms_error,sor_lcp_tolerance);
+      #ifdef DEBUG_CONVERGENCE_TOLERANCE
+        printf("CONVERGED: id: %d steps: %d,"
+               " rms(%20.18f + %20.18f + %20.18f) < tol(%20.18f)\n",
+          thread_id, iteration,
+          qs->rms_constraint_residual[0], qs->rms_constraint_residual[1],
+          qs->rms_constraint_residual[2],
+          sor_lcp_tolerance);
       #endif
-      if (iteration < precon_iterations) iteration = precon_iterations; // goto non-precon step
-      else                               break;                         // finished
+      // tolerance satisfied, stop iterating
+      break;
     }
-    else if (iteration == num_iterations + precon_iterations -1)
+    else if (iteration >= total_iterations - 1)
     {
-      #ifdef REPORT_MONITOR
-        printf("WARNING: id: %d did not converge in %d steps, rms(%20.18f > %20.18f)\n",thread_id,num_iterations,rms_error,sor_lcp_tolerance);
+      #ifdef DEBUG_CONVERGENCE_TOLERANCE
+        printf("WARNING: id: %d did not converge in %d steps,"
+               " rms(%20.18f + %20.18f + %20.18f) > tol(%20.18f)\n",
+          thread_id, num_iterations,
+          qs->rms_constraint_residual[0], qs->rms_constraint_residual[1],
+          qs->rms_constraint_residual[2],
+          sor_lcp_tolerance);
       #endif
     }
-
   } // end of for loop on iterations
 
+#ifdef SHOW_CONVERGENCE
+  // show starting lambda
+  printf("final lambdas: [");
+  for (int i=startRow; i<startRow+nRows; i++)
+    printf("%f, ", lambda[i]);
+  printf("]\n");
+  printf("MONITOR: id: %d steps: %d,"
+         " dlambda(%20.18f + %20.18f + %20.18f),"
+         " rms(%20.18f + %20.18f + %20.18f) < tol(%20.18f)\n",
+    thread_id, total_iterations,
+    qs->rms_dlambda[0], qs->rms_dlambda[1], qs->rms_dlambda[2],
+    qs->rms_constraint_residual[0], qs->rms_constraint_residual[1],
+    qs->rms_constraint_residual[2],
+    sor_lcp_tolerance);
+#endif
   //printf("vnew: ");
   //for (int i=0; i<6*nb; i++) printf(" %f ",vnew[i]);
   //printf("\n");
 
-
-
-  qs->rms_error          = rms_error;
-
   #ifdef REPORT_THREAD_TIMING
   gettimeofday(&tv,NULL);
   double end_time = (double)tv.tv_sec + (double)tv.tv_usec / 1.e6;
@@ -1060,7 +1233,7 @@ static void ComputeRows(
 // nb is the number of bodies in the body array.
 // J is an m*12 matrix of constraint rows
 // jb is an array of first and second body numbers for each constraint row
-// invI is the global frame inverse inertia for each body (stacked 3x3 matrices)
+// invMOI is the global frame inverse inertia for each body (stacked 3x3 matrices)
 //
 // this returns lambda and cforce (the constraint force).
 // note: cforce is returned as inv(M)*J'*lambda,
@@ -1070,7 +1243,7 @@ static void ComputeRows(
 //
 static void SOR_LCP (dxWorldProcessContext *context,
   const int m, const int nb, dRealMutablePtr J, dRealMutablePtr J_precon, dRealMutablePtr J_orig, dRealMutablePtr vnew, int *jb, dxBody * const *body,
-  dRealPtr invI, dRealPtr I, dRealMutablePtr lambda, dRealMutablePtr lambda_erp,
+  dRealPtr invMOI, dRealPtr MOI, dRealMutablePtr lambda, dRealMutablePtr lambda_erp,
   dRealMutablePtr caccel, dRealMutablePtr caccel_erp, dRealMutablePtr cforce,
   dRealMutablePtr rhs, dRealMutablePtr rhs_erp, dRealMutablePtr rhs_precon,
   dRealPtr lo, dRealPtr hi, dRealPtr cfm, const int *findex,
@@ -1080,34 +1253,31 @@ static void SOR_LCP (dxWorldProcessContext *context,
 #endif
   const dReal stepsize)
 {
-#ifdef WARM_STARTING
-  {
-    // for warm starting, this seems to be necessary to prevent
-    // jerkiness in motor-driven joints. i have no idea why this works.
-    for (int i=0; i<m; i++) {
-      lambda[i] *= 0.9;
-      lambda_erp[i] *= 0.9;
-    }
-  }
-#else
-  dSetZero (lambda,m);
-  dSetZero (lambda_erp,m);
-#endif
 
   // precompute iMJ = inv(M)*J'
   dReal *iMJ = context->AllocateArray<dReal> (m*12);
-  compute_invM_JT (m,J,iMJ,jb,body,invI);
+  compute_invM_JT (m,J,iMJ,jb,body,invMOI);
 
-  // compute cforce=(inv(M)*J')*lambda. we will incrementally maintain cforce
-  // as we change lambda.
-#ifdef WARM_STARTING
-  multiply_invM_JT (m,nb,J,jb,lambda,cforce);
-  multiply_invM_JT (m,nb,iMJ,jb,lambda,caccel);
-#else
-  dSetZero (caccel,nb*6);
-  dSetZero (caccel_erp,nb*6);
-  dSetZero (cforce,nb*6);
-#endif
+  if (qs->warm_start > 0)
+  {
+    // warm starting
+    // compute cforce=(inv(M)*J')*lambda
+    if (qs->precon_iterations > 0)
+      multiply_invM_JT (m,nb,J,jb,lambda,cforce);
+
+    // re-compute caccel=(inv(M)*J')*lambda with new iMJ
+    // seems much better than using stored caccel's
+    multiply_invM_JT (m,nb,iMJ,jb,lambda,caccel);
+    multiply_invM_JT (m,nb,iMJ,jb,lambda_erp,caccel_erp);
+  }
+  else
+  {
+    // no warm starting
+    if (qs->precon_iterations > 0)
+      dSetZero (cforce,nb*6);
+    dSetZero (caccel,nb*6);
+    dSetZero (caccel_erp,nb*6);
+  }
 
   dReal *Ad = context->AllocateArray<dReal> (m);
 
@@ -1118,63 +1288,72 @@ static void SOR_LCP (dxWorldProcessContext *context,
     dRealPtr J_ptr = J;
     for (int i=0; i<m; J_ptr += 12, iMJ_ptr += 12, i++) {
       dReal sum = 0;
-      for (int j=0; j<6; j++) sum += iMJ_ptr[j] * J_ptr[j];
+      sum += dot6(iMJ_ptr, J_ptr);
       if (jb[i*2+1] >= 0) {
-        for (int k=6; k<12; k++) sum += iMJ_ptr[k] * J_ptr[k];
+        sum += dot6(iMJ_ptr+6, J_ptr+6);
       }
-      Ad[i] = sor_w / (sum + cfm[i]);
+      if (findex[i] < 0)
+        Ad[i] = sor_w / (sum + cfm[i]);
+      else
+        Ad[i] = CONTACT_SOR_SCALE * sor_w / (sum + cfm[i]);
     }
   }
 
   // recompute Ad for preconditioned case, Ad_precon is similar to Ad but
   //   whereas Ad is 1 over diagonals of J inv(M) J'
   //    Ad_precon is 1 over diagonals of J J'
-  dReal *Ad_precon = context->AllocateArray<dReal> (m);
-
+  dReal *Adcfm_precon = NULL;
+  if (qs->precon_iterations > 0)
   {
-    const dReal sor_w = qs->w;    // SOR over-relaxation parameter
-    // precompute 1 / diagonals of A
-    // preconditioned version uses J instead of iMJ
-    dRealPtr J_ptr = J;
-    for (int i=0; i<m; J_ptr += 12, i++) {
-      dReal sum = 0;
-      for (int j=0; j<6; j++) sum += J_ptr[j] * J_ptr[j];
-      if (jb[i*2+1] >= 0) {
-        for (int k=6; k<12; k++) sum += J_ptr[k] * J_ptr[k];
+    dReal *Ad_precon = context->AllocateArray<dReal> (m);
+
+    {
+      const dReal sor_w = qs->w;    // SOR over-relaxation parameter
+      // precompute 1 / diagonals of A
+      // preconditioned version uses J instead of iMJ
+      dRealPtr J_ptr = J;
+      for (int i=0; i<m; J_ptr += 12, i++) {
+        dReal sum = 0;
+        sum += dot6(J_ptr, J_ptr);
+        if (jb[i*2+1] >= 0) {
+          sum += dot6(J_ptr+6, J_ptr+6);
+        }
+        if (findex[i] < 0)
+          Ad_precon[i] = sor_w / (sum + cfm[i]);
+        else
+          Ad_precon[i] = CONTACT_SOR_SCALE * sor_w / (sum + cfm[i]);
       }
-      Ad_precon[i] = sor_w / (sum + cfm[i]);
     }
-  }
-
-  /********************************/
-  /* allocate for Adcfm           */
-  /* which is a mX1 column vector */
-  /********************************/
-  // compute Adcfm_precon for the preconditioned case
-  //   do this first before J gets altered (J's diagonals gets premultiplied by Ad)
-  //   and save a copy of J into J_orig
-  //   as J becomes J * Ad, J_precon becomes J * Ad_precon
-  dReal *Adcfm_precon = context->AllocateArray<dReal> (m);
-
 
-  {
-    // NOTE: This may seem unnecessary but it's indeed an optimization
-    // to move multiplication by Ad[i] and cfm[i] out of iteration loop.
+    /********************************/
+    /* allocate for Adcfm           */
+    /* which is a mX1 column vector */
+    /********************************/
+    // compute Adcfm_precon for the preconditioned case
+    //   do this first before J gets altered (J's diagonals gets premultiplied by Ad)
+    //   and save a copy of J into J_orig
+    //   as J becomes J * Ad, J_precon becomes J * Ad_precon
+    Adcfm_precon = context->AllocateArray<dReal> (m);
+    {
 
-    // scale J_precon and rhs_precon by Ad
-    // copy J_orig
-    dRealMutablePtr J_ptr = J;
-    dRealMutablePtr J_precon_ptr = J_precon;
-    dRealMutablePtr J_orig_ptr = J_orig;
-    for (int i=0; i<m; J_ptr += 12, J_precon_ptr += 12, J_orig_ptr += 12, i++) {
-      dReal Ad_precon_i = Ad_precon[i];
-      for (int j=0; j<12; j++) {
-        J_precon_ptr[j] = J_ptr[j] * Ad_precon_i;
-        J_orig_ptr[j] = J_ptr[j]; //copy J
+      // NOTE: This may seem unnecessary but it's indeed an optimization
+      // to move multiplication by Ad[i] and cfm[i] out of iteration loop.
+
+      // scale J_precon and rhs_precon by Ad
+      // copy J_orig
+      dRealMutablePtr J_ptr = J;
+      dRealMutablePtr J_orig_ptr = J_orig;
+      dRealMutablePtr J_precon_ptr = J_precon;
+      for (int i=0; i<m; J_ptr += 12, J_precon_ptr += 12, J_orig_ptr += 12, i++) {
+        dReal Ad_precon_i = Ad_precon[i];
+        for (int j=0; j<12; j++) {
+          J_precon_ptr[j] = J_ptr[j] * Ad_precon_i;
+          J_orig_ptr[j] = J_ptr[j]; //copy J
+        }
+        rhs_precon[i] *= Ad_precon_i;
+        // scale Ad by CFM. N.B. this should be done last since it is used above
+        Adcfm_precon[i] = Ad_precon_i * cfm[i];
       }
-      rhs_precon[i] *= Ad_precon_i;
-      // scale Ad by CFM. N.B. this should be done last since it is used above
-      Adcfm_precon[i] = Ad_precon_i * cfm[i];
     }
   }
 
@@ -1202,10 +1381,46 @@ static void SOR_LCP (dxWorldProcessContext *context,
 
   // order to solve constraint rows in
   IndexError *order = context->AllocateArray<IndexError> (m);
-
-  dReal *delta_error = context->AllocateArray<dReal> (m);
+  int *tmpOrder = context->AllocateArray<int> (m);
 
 #ifndef REORDER_CONSTRAINTS
+  if (qs->row_reorder1)
+  {
+    // -1 in front, followed by -2, lastly all the >0
+    // Fill the array from both ends
+    // where -1 is bilateral, and -2 is friction normal,
+    // might be followed by 2 positive tangential indices
+    // if friction is not zero.
+    // first pass puts -1 in the back
+    int front = 0;
+    int back = m-1;
+    for (int i=0; i<m; ++i) {
+      if (findex[i] == -1) {
+        tmpOrder[front] = i; // Place them at the front
+        ++front;
+      } else {
+        tmpOrder[back] = i; // Place them at the end
+        --back;
+      }
+    }
+    dIASSERT (back - front==1);
+    // second pass, put all negatives in the front,
+    // should preserver -1 goes before -2,
+    // and group all >0 at the end
+    front = 0;
+    back = m-1;
+    for (int i=0; i<m; ++i) {
+      if (findex[tmpOrder[i]] < 0) {
+        order[front].index = tmpOrder[i]; // Place them at the front
+        ++front;
+      } else {
+        order[back].index = tmpOrder[i]; // Place them at the end
+        --back;
+      }
+    }
+    dIASSERT (back - front==1);
+  }
+  else
   {
     // make sure constraints with findex < 0 come first.
     IndexError *orderhead = order, *ordertail = order + (m - 1);
@@ -1224,6 +1439,29 @@ static void SOR_LCP (dxWorldProcessContext *context,
   }
 #endif
 
+#ifdef SHOW_CONVERGENCE
+    if (0)
+    {
+      printf("-------------- saved labmdas -------------\n");
+      // print current lambdas
+      for (int i = 0; i < m; ++i)
+      {
+        printf("%f, ", lambda[order[i].index]);
+      }
+      printf("\n");
+      for (int i = 0; i < m; ++i)
+      {
+        printf("%d, ", findex[order[i].index]);
+      }
+      printf("\n");
+      for (int i = 0; i < m; ++i)
+      {
+        printf("%d, ", order[i].index);
+      }
+      printf("\n-------------- end of saved labmdas -------------\n");
+    }
+#endif
+
 #ifdef REORDER_CONSTRAINTS
   // the lambda computed at the previous iteration.
   // this is used to measure error for when we are reordering the indexes.
@@ -1276,8 +1514,9 @@ static void SOR_LCP (dxWorldProcessContext *context,
     params[thread_id].findex = findex;
     params[thread_id].hi = hi;
     params[thread_id].lo = lo;
-    params[thread_id].invI = invI;
-    params[thread_id].I= I;
+    params[thread_id].invMOI = invMOI;
+    params[thread_id].MOI= MOI;
+    params[thread_id].Ad = Ad;
     params[thread_id].Adcfm = Adcfm;
     params[thread_id].Adcfm_precon = Adcfm_precon;
     params[thread_id].rhs = rhs;
@@ -1288,7 +1527,6 @@ static void SOR_LCP (dxWorldProcessContext *context,
     params[thread_id].lambda = lambda;
     params[thread_id].lambda_erp = lambda_erp;
     params[thread_id].iMJ = iMJ;
-    params[thread_id].delta_error  = delta_error ;
     params[thread_id].rhs_precon  = rhs_precon ;
     params[thread_id].J_precon  = J_precon ;
     params[thread_id].J_orig  = J_orig ;
@@ -1299,8 +1537,9 @@ static void SOR_LCP (dxWorldProcessContext *context,
     params[thread_id].last_lambda_erp  = last_lambda_erp ;
 #endif
 
-#ifdef REPORT_MONITOR
-    printf("thread summary: id %d i %d m %d chunk %d start %d end %d \n",thread_id,i,m,chunk,nStart,nEnd);
+#ifdef DEBUG_CONVERGENCE_TOLERANCE
+    printf("thread summary: id %d i %d m %d chunk %d start %d end %d \n",
+      thread_id,i,m,chunk,nStart,nEnd);
 #endif
 #ifdef USE_TPROW
     if (row_threadpool && row_threadpool->size() > 0)
@@ -1343,6 +1582,314 @@ struct dJointWithInfo1
   dxJoint::Info1 info;
 };
 
+//***************************************************************************
+// Modifying inertia without modifying dynamics,
+// Unless moment of inertia modification makes the system unstable,
+// in which case, diagonal terms are increased to make moi diagonally dominant.
+static void DYNAMIC_INERTIA(const int infom, const dxJoint::Info2 &Jinfo, const int b1, const int b2,
+                            const dJointWithInfo1 *jicurr,
+                            dRealMutablePtr invMOI, dRealMutablePtr MOI)
+{
+  /// INERTIA PROPAGATION ACROSS CONSTRAINED JOINTS
+  for (int j=0; j<infom; j++) {
+
+#undef DEBUG_INERTIA_PROPAGATION
+#ifdef DEBUG_INERTIA_PROPAGATION
+    printf("--------JAC---------------\n");
+    printf("jacobian [%d] J1l [%f %f %f] J2l [%f %f %f] J1a [%f %f %f] J2a [%f %f %f]\n", j,
+           Jinfo.J1l[0+j*Jinfo.rowskip],Jinfo.J1l[1+j*Jinfo.rowskip],Jinfo.J1l[2+j*Jinfo.rowskip],
+           Jinfo.J2l[0+j*Jinfo.rowskip],Jinfo.J2l[1+j*Jinfo.rowskip],Jinfo.J2l[2+j*Jinfo.rowskip],
+           Jinfo.J1a[0+j*Jinfo.rowskip],Jinfo.J1a[1+j*Jinfo.rowskip],Jinfo.J1a[2+j*Jinfo.rowskip],
+           Jinfo.J2a[0+j*Jinfo.rowskip],Jinfo.J2a[1+j*Jinfo.rowskip],Jinfo.J2a[2+j*Jinfo.rowskip]);
+#endif
+    /// \FIXME: For now, implement only for the two non-free axial rotation constraints for hinge joints.
+    /// this only makes sense if joint connects two dynamic bodies (b2 >= 0)
+    /// Skip this entire block if we don't want to modify inertia for stability.
+    if (b2 >= 0 && jicurr->joint->type() == dJointTypeHinge && (j == 3 || j == 4))
+    {
+      /// In hinge joint, pure rotational constraint,
+      /// J1l and J2l should be zeros, and J1a and J2a should be equal and opposite
+      /// to each other.  J1a or J2a indicates the constrained axis direction.
+      /// For this implementation, determine constrained axis(s) direction from J1a for hinge joints.
+
+
+      /// get the MOI for parent and child bodies constrained by J1a and J2a.
+      /// MOI and invMOI are already in inertial frame (previously rotated by body.posr.R)
+      /// get pointers to our invMOI/MOI matrices
+      dReal *invMOI_ptr1 = invMOI + b1 * 12;
+      dReal *MOI_ptr1 = MOI + b1 * 12;
+
+#ifdef DEBUG_INERTIA_PROPAGATION
+      printf("--------old MOI-----------\n");
+      printf("MOI1[%d]\n[%f %f %f %f]\n[%f %f %f %f]\n[%f %f %f %f]\n", b1,
+        MOI_ptr1[0*4+0],MOI_ptr1[0*4+1],MOI_ptr1[0*4+2],MOI_ptr1[0*4+3],
+        MOI_ptr1[1*4+0],MOI_ptr1[1*4+1],MOI_ptr1[1*4+2],MOI_ptr1[1*4+3],
+        MOI_ptr1[2*4+0],MOI_ptr1[2*4+1],MOI_ptr1[2*4+2],MOI_ptr1[2*4+3]);
+#endif
+
+      // compute scalar MOI in line with S, where S is a unit vector in the constraint direction:
+      //   moi_S = S' * I * S
+      dVector3 S = // line about which we want to compute MOI along
+           { Jinfo.J1a[0+j*Jinfo.rowskip],Jinfo.J1a[1+j*Jinfo.rowskip],Jinfo.J1a[2+j*Jinfo.rowskip] };
+      dNormalize3(S);
+      dVector3 tmp31;
+      dMultiply0_133(tmp31, S, MOI_ptr1);
+      dReal moi_S1 = dCalcVectorDot3(tmp31, S); // scalar MOI component along vector S
+
+      // get MOI from body 2
+      dReal *invMOI_ptr2 = invMOI + b2 * 12;
+      dReal *MOI_ptr2 = MOI + b2 * 12;
+
+#ifdef DEBUG_INERTIA_PROPAGATION
+      printf("MOI2[%d]\n[%f %f %f %f]\n[%f %f %f %f]\n[%f %f %f %f]\n", b2,
+        MOI_ptr2[0*4+0],MOI_ptr2[0*4+1],MOI_ptr2[0*4+2],MOI_ptr2[0*4+3],
+        MOI_ptr2[1*4+0],MOI_ptr2[1*4+1],MOI_ptr2[1*4+2],MOI_ptr2[1*4+3],
+        MOI_ptr2[2*4+0],MOI_ptr2[2*4+1],MOI_ptr2[2*4+2],MOI_ptr2[2*4+3]);
+#endif
+
+      // FIXME:  check that directions of J1a == J2a
+      // compute scalar MOI in line with S:
+      dMultiply0_133(tmp31, S, MOI_ptr2);
+      dReal moi_S2 = dCalcVectorDot3(tmp31, S); // scalar MOI component along vector S
+#ifdef DEBUG_INERTIA_PROPAGATION
+      printf("--------S VECTORS-----------\n");
+      printf("MOI1 b1[%d] S[%f %f %f] = %g\n",b1, S[0], S[1], S[2], moi_S1);
+
+      // printf("R1[%d]\n[%f %f %f %f]\n[%f %f %f %f]\n[%f %f %f %f]\n", b1,
+      //   RJ1a[0*4+0],RJ1a[0*4+1],RJ1a[0*4+2],RJ1a[0*4+3],
+      //   RJ1a[1*4+0],RJ1a[1*4+1],RJ1a[1*4+2],RJ1a[1*4+3],
+      //   RJ1a[2*4+0],RJ1a[2*4+1],RJ1a[2*4+2],RJ1a[2*4+3]);
+      printf("MOI2 b2[%d] S[%f %f %f] = %g\n",b2, S[0], S[1], S[2], moi_S2);
+#endif
+
+      /// get full axis MOI tensor representing the scalar axis MOI.
+      // full MOI tensor for S needs matrix outer product of S:
+      //   SS = [ S * S' ]
+#if 1
+      // or update off-diagonal terms
+      dMatrix3 SS = {
+           S[0]*S[0], S[0]*S[1], S[0]*S[2], 0,
+           S[1]*S[0], S[1]*S[1], S[1]*S[2], 0,
+           S[2]*S[0], S[2]*S[1], S[2]*S[2], 0};
+#else
+      // option to perserve off-diagonal terms
+      dMatrix3 SS = {
+             S[0]*S[0], 0*S[0]*S[1], 0*S[0]*S[2], 0,
+           0*S[1]*S[0],   S[1]*S[1], 0*S[1]*S[2], 0,
+           0*S[2]*S[0], 0*S[2]*S[1],   S[2]*S[2], 0};
+#endif
+
+#ifdef DEBUG_INERTIA_PROPAGATION
+      printf("--------SS----------------\n");
+      printf("SS [%d]\n[%f %f %f %f]\n[%f %f %f %f]\n[%f %f %f %f]\n", b1,
+        SS[0*4+0],SS[0*4+1],SS[0*4+2],SS[0*4+3],
+        SS[1*4+0],SS[1*4+1],SS[1*4+2],SS[1*4+3],
+        SS[2*4+0],SS[2*4+1],SS[2*4+2],SS[2*4+3]);
+#endif
+
+      // limit MOI1 and MOI2 such that MOI_max / MOI_min < 10.0
+      dReal moi_sum = (moi_S1 + moi_S2);
+      const dReal max_moi_ratio = 10.0;
+      bool modify_inertia = true;
+      dReal moi_S1_new, moi_S2_new;
+      if (moi_S1 > max_moi_ratio * moi_S2)
+      {
+        moi_S2_new = (moi_sum)/(max_moi_ratio + 1.0);
+        moi_S1_new = max_moi_ratio*moi_S2_new;
+      }
+      else if (moi_S2 > max_moi_ratio * moi_S1)
+      {
+        moi_S1_new = (moi_sum)/(max_moi_ratio + 1.0);
+        moi_S2_new = max_moi_ratio*moi_S1_new;
+      }
+      else
+        modify_inertia = false;
+
+      if (modify_inertia)
+      {
+#ifdef DEBUG_INERTIA_PROPAGATION
+        printf("---------S Scalars--------\n");
+        printf(" original    S1 [%g] S2 [%g]\n", moi_S1, moi_S2);
+        printf(" distributed S1 [%g] S2 [%g]\n", moi_S1_new, moi_S2_new);
+#endif
+        // sum off-diagonals terms (to check diagonal dominance)
+        dReal sumAbsOffDiags1[4];
+        dReal sumAbsOffDiags2[4];
+        dSetZero(sumAbsOffDiags1,4);
+        dSetZero(sumAbsOffDiags2,4);
+
+        /// Keep parent/child MOI/invMOI in inertial frame.
+
+        // Stability is presumed maintained by the following condition:
+        //
+        // On a per row basis, sum of absolute values of off-diagonal elements
+        // is less than absolute value of the diagonal element itself.
+        //
+        // @article{Garcia2003,
+        // author = {Garcia, M.V.P. and {Humes Jr.}, C. and Stern, J.M.},
+        // doi = {10.1590/S0101-82052003000100006},
+        // issn = {0101-8205},
+        // journal = {Computational \& Applied Mathematics},
+        // keywords = {gauss-seidel method,line criterion,manufacturing sys-,stability and control of},
+        // number = {1},
+        // pages = {91--97},
+        // title = {{Generalized line criterion for Gauss-Seidel method}},
+        // url = {http://www.scielo.br/scielo.php?pid=S1807-03022003000100006&script=sci_arttext},
+        // volume = {22},
+        // year = {2003}
+        // }
+        //
+        // To do this, first compute abs sum of off diagonals and store in sumAbsOffDiags.
+        for (int si = 0; si < 12; ++si)
+        {
+          int col = si%4;
+          int row = si/4;
+          if (col == 3) //  unused term
+          {
+            MOI_ptr1[si] = 0;
+            MOI_ptr2[si] = 0;
+          }
+          if (!(row == col))  // off-diagonal terms
+          {
+            // either we preserve off-diagonal terms
+            // tmpDiag1[row] += MOI_ptr1[si] + (moi_S1_new - moi_S1) * SS[si];
+            // tmpDiag2[row] += MOI_ptr2[si] + (moi_S2_new - moi_S2) * SS[si];
+
+            // or update off-diagonal terms
+            MOI_ptr1[si] += (moi_S1_new - moi_S1) * SS[si];
+            MOI_ptr2[si] += (moi_S2_new - moi_S2) * SS[si];
+            sumAbsOffDiags1[row] += dFabs(MOI_ptr1[si]);
+            sumAbsOffDiags2[row] += dFabs(MOI_ptr2[si]);
+          }
+        }
+        //
+        // Then modify MOI by adding delta scalar MOI in tensor form, but
+        // check and maintain diagonal dominance using the precomputed off-diagonal-sums.
+        for (int si = 0; si < 12; ++si)
+        {
+          int col = si%4;
+          int row = si/4;
+          if (row == col)  // diagonal term
+          {
+
+            // check per row, that sum of absolute values of off-diagonal elements
+            // is less than absolute value of the diagonal element itself.
+            dReal newMOI1 = MOI_ptr1[si] + (moi_S1_new - moi_S1) * SS[si];
+            if (newMOI1 > sumAbsOffDiags1[row])
+            {
+              // modify inertia in the constrained direction,
+              // doing so should not alter dynamics of the system.
+              MOI_ptr1[si] = newMOI1;
+            }
+            else
+            {
+              /// Increase diagonal dominance to preserve stability,
+              /// Even though this changes the dynamics of the system,
+              /// it's either this or unstable simulation.
+              MOI_ptr1[si] = sumAbsOffDiags1[row];
+            }
+
+            dReal newMOI2 = MOI_ptr2[si] + (moi_S2_new - moi_S2) * SS[si];
+            if (newMOI2 > sumAbsOffDiags2[row])
+            {
+              // modify inertia in the constrained direction,
+              // doing so should not alter dynamics of the system.
+              MOI_ptr2[si] = newMOI2;
+            }
+            else
+            {
+              /// Increase diagonal dominance to preserve stability,
+              /// Even though this changes the dynamics of the system,
+              /// it's either this or unstable simulation.
+              MOI_ptr2[si] = sumAbsOffDiags2[row];
+            }
+          }
+        }
+
+        // Update invMOI by inverting analytically (may not be efficient).
+        // try 1981 Ken Miller (http://www.jstor.org/stable/2690437) or
+        //   (http://math.stackexchange.com/questions/17776/inverse-of-the-sum-of-matrices)
+        // try taking advantage of symmetry of MOI
+        dReal det1 = MOI_ptr1[0*4+0]*(MOI_ptr1[2*4+2]*MOI_ptr1[1*4+1]-MOI_ptr1[2*4+1]*MOI_ptr1[1*4+2])
+                    -MOI_ptr1[1*4+0]*(MOI_ptr1[2*4+2]*MOI_ptr1[0*4+1]-MOI_ptr1[2*4+1]*MOI_ptr1[0*4+2])
+                    +MOI_ptr1[2*4+0]*(MOI_ptr1[1*4+2]*MOI_ptr1[0*4+1]-MOI_ptr1[1*4+1]*MOI_ptr1[0*4+2]);
+        invMOI_ptr1[0*4+0] =  (MOI_ptr1[2*4+2]*MOI_ptr1[1*4+1]-MOI_ptr1[2*4+1]*MOI_ptr1[1*4+2])/det1;
+        invMOI_ptr1[0*4+1] = -(MOI_ptr1[2*4+2]*MOI_ptr1[0*4+1]-MOI_ptr1[2*4+1]*MOI_ptr1[0*4+2])/det1;
+        invMOI_ptr1[0*4+2] =  (MOI_ptr1[1*4+2]*MOI_ptr1[0*4+1]-MOI_ptr1[1*4+1]*MOI_ptr1[0*4+2])/det1;
+        // invMOI_ptr1[0*4+3] = 0.0;
+        invMOI_ptr1[1*4+0] = invMOI_ptr1[0*4+1];
+        invMOI_ptr1[1*4+1] =  (MOI_ptr1[2*4+2]*MOI_ptr1[0*4+0]-MOI_ptr1[2*4+0]*MOI_ptr1[0*4+2])/det1;
+        invMOI_ptr1[1*4+2] = -(MOI_ptr1[1*4+2]*MOI_ptr1[0*4+0]-MOI_ptr1[1*4+0]*MOI_ptr1[0*4+2])/det1;
+        // invMOI_ptr1[1*4+3] = 0.0;
+        invMOI_ptr1[2*4+0] = invMOI_ptr1[0*4+2];
+        invMOI_ptr1[2*4+1] = invMOI_ptr1[1*4+2];
+        invMOI_ptr1[2*4+2] =  (MOI_ptr1[1*4+1]*MOI_ptr1[0*4+0]-MOI_ptr1[1*4+0]*MOI_ptr1[0*4+1])/det1;
+        // invMOI_ptr1[2*4+3] = 0.0;
+
+        dReal det2 = MOI_ptr2[0*4+0]*(MOI_ptr2[2*4+2]*MOI_ptr2[1*4+1]-MOI_ptr2[2*4+1]*MOI_ptr2[1*4+2])
+                    -MOI_ptr2[1*4+0]*(MOI_ptr2[2*4+2]*MOI_ptr2[0*4+1]-MOI_ptr2[2*4+1]*MOI_ptr2[0*4+2])
+                    +MOI_ptr2[2*4+0]*(MOI_ptr2[1*4+2]*MOI_ptr2[0*4+1]-MOI_ptr2[1*4+1]*MOI_ptr2[0*4+2]);
+        invMOI_ptr2[0*4+0] =  (MOI_ptr2[2*4+2]*MOI_ptr2[1*4+1]-MOI_ptr2[2*4+1]*MOI_ptr2[1*4+2])/det2;
+        invMOI_ptr2[0*4+1] = -(MOI_ptr2[2*4+2]*MOI_ptr2[0*4+1]-MOI_ptr2[2*4+1]*MOI_ptr2[0*4+2])/det2;
+        invMOI_ptr2[0*4+2] =  (MOI_ptr2[1*4+2]*MOI_ptr2[0*4+1]-MOI_ptr2[1*4+1]*MOI_ptr2[0*4+2])/det2;
+        // invMOI_ptr2[0*4+3] = 0.0;
+        invMOI_ptr2[1*4+0] = invMOI_ptr2[0*4+1];
+        invMOI_ptr2[1*4+1] =  (MOI_ptr2[2*4+2]*MOI_ptr2[0*4+0]-MOI_ptr2[2*4+0]*MOI_ptr2[0*4+2])/det2;
+        invMOI_ptr2[1*4+2] = -(MOI_ptr2[1*4+2]*MOI_ptr2[0*4+0]-MOI_ptr2[1*4+0]*MOI_ptr2[0*4+2])/det2;
+        // invMOI_ptr2[1*4+3] = 0.0;
+        invMOI_ptr2[2*4+0] = invMOI_ptr2[0*4+2];
+        invMOI_ptr2[2*4+1] = invMOI_ptr2[1*4+2];
+        invMOI_ptr2[2*4+2] =  (MOI_ptr2[1*4+1]*MOI_ptr2[0*4+0]-MOI_ptr2[1*4+0]*MOI_ptr2[0*4+1])/det2;
+        // invMOI_ptr2[2*4+3] = 0.0;
+
+#ifdef DEBUG_INERTIA_PROPAGATION
+        printf("----------new MOI---------\n");
+
+        printf("new MOI1[%d]\n[%f %f %f %f]\n[%f %f %f %f]\n[%f %f %f %f]\n", b1,
+          MOI_ptr1[0*4+0],MOI_ptr1[0*4+1],MOI_ptr1[0*4+2],MOI_ptr1[0*4+3],
+          MOI_ptr1[1*4+0],MOI_ptr1[1*4+1],MOI_ptr1[1*4+2],MOI_ptr1[1*4+3],
+          MOI_ptr1[2*4+0],MOI_ptr1[2*4+1],MOI_ptr1[2*4+2],MOI_ptr1[2*4+3]);
+
+        // Modify MOI_ptr2
+        printf("new MOI2[%d]\n[%f %f %f %f]\n[%f %f %f %f]\n[%f %f %f %f]\n", b2,
+          MOI_ptr2[0*4+0],MOI_ptr2[0*4+1],MOI_ptr2[0*4+2],MOI_ptr2[0*4+3],
+          MOI_ptr2[1*4+0],MOI_ptr2[1*4+1],MOI_ptr2[1*4+2],MOI_ptr2[1*4+3],
+          MOI_ptr2[2*4+0],MOI_ptr2[2*4+1],MOI_ptr2[2*4+2],MOI_ptr2[2*4+3]);
+
+        printf("----------new inv---------\n");
+        printf("new invMOI1[%d]\n[%f %f %f %f]\n[%f %f %f %f]\n[%f %f %f %f]\n", b1,
+          invMOI_ptr1[0*4+0],invMOI_ptr1[0*4+1],invMOI_ptr1[0*4+2],invMOI_ptr1[0*4+3],
+          invMOI_ptr1[1*4+0],invMOI_ptr1[1*4+1],invMOI_ptr1[1*4+2],invMOI_ptr1[1*4+3],
+          invMOI_ptr1[2*4+0],invMOI_ptr1[2*4+1],invMOI_ptr1[2*4+2],invMOI_ptr1[2*4+3]);
+
+        // Modify invMOI_ptr2
+        printf("new invMOI2[%d]\n[%f %f %f %f]\n[%f %f %f %f]\n[%f %f %f %f]\n", b2,
+          invMOI_ptr2[0*4+0],invMOI_ptr2[0*4+1],invMOI_ptr2[0*4+2],invMOI_ptr2[0*4+3],
+          invMOI_ptr2[1*4+0],invMOI_ptr2[1*4+1],invMOI_ptr2[1*4+2],invMOI_ptr2[1*4+3],
+          invMOI_ptr2[2*4+0],invMOI_ptr2[2*4+1],invMOI_ptr2[2*4+2],invMOI_ptr2[2*4+3]);
+#endif
+
+#ifdef DEBUG_INERTIA_PROPAGATION
+        // check if diagonally-dominant
+        if (MOI_ptr1[0*4+0] < dFabs(MOI_ptr1[0*4+1])+dFabs(MOI_ptr1[0*4+2]))
+          printf(" * new MOI1 row 1 d[%f] < o[%f, %f]\n", MOI_ptr1[0*4+0],MOI_ptr1[0*4+1], MOI_ptr1[0*4+2]);
+        if (MOI_ptr1[1*4+1] < dFabs(MOI_ptr1[1*4+0])+dFabs(MOI_ptr1[1*4+2]))
+          printf(" * new MOI1 row 2 d[%f] < o[%f, %f]\n", MOI_ptr1[1*4+1],MOI_ptr1[1*4+0], MOI_ptr1[1*4+2]);
+        if (MOI_ptr1[2*4+2] < dFabs(MOI_ptr1[2*4+0])+dFabs(MOI_ptr1[2*4+1]))
+          printf(" * new MOI1 row 3 d[%f] < o[%f, %f]\n", MOI_ptr1[2*4+2],MOI_ptr1[2*4+0], MOI_ptr1[2*4+1]);
+
+        if (MOI_ptr2[0*4+0] < dFabs(MOI_ptr2[0*4+1])+dFabs(MOI_ptr2[0*4+2]))
+          printf(" * new MOI2 row 1 d[%f] < o[%f, %f]\n", MOI_ptr2[0*4+0],MOI_ptr2[0*4+1], MOI_ptr2[0*4+2]);
+        if (MOI_ptr2[1*4+1] < dFabs(MOI_ptr2[1*4+0])+dFabs(MOI_ptr2[1*4+2]))
+          printf(" * new MOI2 row 2 d[%f] < o[%f, %f]\n", MOI_ptr2[1*4+1],MOI_ptr2[1*4+0], MOI_ptr2[1*4+2]);
+        if (MOI_ptr2[2*4+2] < dFabs(MOI_ptr2[2*4+0])+dFabs(MOI_ptr2[2*4+1]))
+          printf(" * new MOI2 row 3 d[%f] < o[%f, %f]\n", MOI_ptr2[2*4+2],MOI_ptr2[2*4+0], MOI_ptr2[2*4+1]);
+#endif
+      }
+    }
+  }
+}
+
 void dxQuickStepper (dxWorldProcessContext *context,
   dxWorld *world, dxBody * const *body, int nb,
   dxJoint * const *_joint, int _nj, dReal stepsize)
@@ -1358,29 +1905,32 @@ void dxQuickStepper (dxWorldProcessContext *context,
 
   // for all bodies, compute the inertia tensor and its inverse in the global
   // frame, and compute the rotational force and add it to the torque
-  // accumulator. I and invI are a vertical stack of 3x4 matrices, one per body.
-  dReal *invI = context->AllocateArray<dReal> (3*4*nb);
-  dReal *I = context->AllocateArray<dReal> (3*4*nb);
+  // accumulator. MOI and invMOI are a vertical stack of 3x4 matrices, one per body.
+  dReal *invMOI = context->AllocateArray<dReal> (3*4*nb);
+  dReal *MOI = context->AllocateArray<dReal> (3*4*nb);
 
+  // TODO: possible optimization: move this to inside joint getInfo2, for inertia tweaking
+  // update tacc from external force and inertia tensor in inerial frame
+  // for now, modify MOI and invMOI after getInfo2 is called
   {
-    dReal *invIrow = invI;
-    dReal *Irow = I;
+    dReal *invMOIrow = invMOI;
+    dReal *MOIrow = MOI;
     dxBody *const *const bodyend = body + nb;
-    for (dxBody *const *bodycurr = body; bodycurr != bodyend; invIrow += 12, Irow += 12, bodycurr++) {
+    for (dxBody *const *bodycurr = body; bodycurr != bodyend; invMOIrow += 12, MOIrow += 12, bodycurr++) {
       dMatrix3 tmp;
       dxBody *b_ptr = *bodycurr;
 
       // compute inverse inertia tensor in global frame
       dMultiply2_333 (tmp,b_ptr->invI,b_ptr->posr.R);
-      dMultiply0_333 (invIrow,b_ptr->posr.R,tmp);
+      dMultiply0_333 (invMOIrow,b_ptr->posr.R,tmp);
 
-      // also store I for later use by preconditioner
+      // also store MOI for later use by preconditioner
       dMultiply2_333 (tmp,b_ptr->mass.I,b_ptr->posr.R);
-      dMultiply0_333 (Irow,b_ptr->posr.R,tmp);
+      dMultiply0_333 (MOIrow,b_ptr->posr.R,tmp);
 
       if (b_ptr->flags & dxBodyGyroscopic) {
         // compute rotational force
-        dMultiply0_331 (tmp,Irow,b_ptr->avel);
+        dMultiply0_331 (tmp,MOIrow,b_ptr->avel);
         dSubtractVectorCross3(b_ptr->tacc,b_ptr->avel,tmp);
       }
     }
@@ -1480,32 +2030,9 @@ void dxQuickStepper (dxWorldProcessContext *context,
   dReal *J_precon = NULL;
   dReal *J_orig = NULL;
   int *jb = NULL;
+  int *findex;
 
-  dReal *vnew = NULL;
-#ifdef PENETRATION_JVERROR_CORRECTION
-  // allocate and populate vnew with v(n+1) due to non-constraint forces as the starting value
-  vnew = context->AllocateArray<dReal> (nb*6);
-  {
-    dRealMutablePtr vnewcurr = vnew;
-    dxBody* const* bodyend = body + nb;
-    const dReal *invIrow = invI;
-    dReal tmp_tacc[3];
-    for (dxBody* const* bodycurr = body; bodycurr != bodyend;
-         invIrow += 12, vnewcurr += 6, bodycurr++) {
-      dxBody *b_ptr = *bodycurr;
-
-      // add stepsize * invM * fe to the body velocity
-      dReal body_invMass_mul_stepsize = stepsize * b_ptr->invMass;
-      for (int j=0; j<3; j++) {
-        vnewcurr[j]   = b_ptr->lvel[j] + body_invMass_mul_stepsize * b_ptr->facc[j];
-        vnewcurr[j+3] = b_ptr->avel[j];
-        tmp_tacc[j]   = b_ptr->tacc[j]*stepsize;
-      }
-      dMultiplyAdd0_331 (vnewcurr+3, invIrow, tmp_tacc);
-
-    }
-  }
-#endif
+  dReal *vnew = NULL; // used by PENETRATION_JVERROR_CORRECTION
 
   dReal *cforce = context->AllocateArray<dReal> (nb*6);
   dReal *caccel = context->AllocateArray<dReal> (nb*6);
@@ -1514,10 +2041,10 @@ void dxQuickStepper (dxWorldProcessContext *context,
   dReal *caccel_corr = context->AllocateArray<dReal> (nb*6);
 #endif
 
+  // Get Joint Information, setup Jacobians by calling getInfo2.
   if (m > 0) {
     dReal *cfm, *lo, *hi, *rhs, *rhs_erp, *rhs_precon, *Jcopy;
     dReal *c_v_max;
-    int *findex;
 
     {
       int mlocal = m;
@@ -1578,13 +2105,15 @@ void dxQuickStepper (dxWorldProcessContext *context,
         dxJoint::Info2 Jinfo;
         Jinfo.rowskip = 12;
         Jinfo.fps = stepsize1;
-        Jinfo.erp = world->global_erp;
+
+        int *jb_ptr = jb;
 
         dReal *Jcopyrow = Jcopy;
         unsigned ofsi = 0;
         const dJointWithInfo1 *jicurr = jointiinfos;
         const dJointWithInfo1 *const jiend = jicurr + nj;
         for (; jicurr != jiend; jicurr++) {
+          Jinfo.erp = world->global_erp;
           dReal *const Jrow = J + ofsi * 12;
           Jinfo.J1l = Jrow;
           Jinfo.J1a = Jrow + 3;
@@ -1621,19 +2150,7 @@ void dxQuickStepper (dxWorldProcessContext *context,
               findex_ofsi[j] = fival + ofsi;
           }
 
-          ofsi += infom;
-        }
-      }
-
-      {
-        // create an array of body numbers for each joint row
-        int *jb_ptr = jb;
-        const dJointWithInfo1 *jicurr = jointiinfos;
-        const dJointWithInfo1 *const jiend = jicurr + nj;
-        for (; jicurr != jiend; jicurr++) {
-          dxJoint *joint = jicurr->joint;
-          const int infom = jicurr->info.m;
-
+          // create an array of body numbers for each joint row
           int b1 = (joint->node[0].body) ? (joint->node[0].body->tag) : -1;
           int b2 = (joint->node[1].body) ? (joint->node[1].body->tag) : -1;
           for (int j=0; j<infom; j++) {
@@ -1641,14 +2158,18 @@ void dxQuickStepper (dxWorldProcessContext *context,
             jb_ptr[1] = b2;
             jb_ptr += 2;
           }
-        }
-        dIASSERT (jb_ptr == jb+2*m);
-        //printf("jjjjjjjjj %d %d\n",jb[0],jb[1]);
-      }
-
 
+          // Modify inertia to keep simulation stable
+          if (world->qs.dynamic_inertia_reduction)
+            DYNAMIC_INERTIA(infom, Jinfo, b1, b2, jicurr, invMOI, MOI);
 
+          // update index for next joint
+          ofsi += infom;
 
+          // double check jb_ptr length
+          dIASSERT (jb_ptr == jb+2*m);
+        }
+      }
 
       BEGIN_STATE_SAVE(context, tmp1state) {
         IFTIMING (dTimerNow ("compute rhs"));
@@ -1657,16 +2178,16 @@ void dxQuickStepper (dxWorldProcessContext *context,
         dSetZero(tmp1,nb*6);
         // put v/h + invM*fe into tmp1
         dReal *tmp1curr = tmp1;
-        const dReal *invIrow = invI;
+        const dReal *invMOIrow = invMOI;
         dxBody *const *const bodyend = body + nb;
         for (dxBody *const *bodycurr = body;
              bodycurr != bodyend;
-             tmp1curr+=6, invIrow+=12, bodycurr++) {
+             tmp1curr+=6, invMOIrow+=12, bodycurr++) {
           dxBody *b_ptr = *bodycurr;
           dReal body_invMass = b_ptr->invMass;
           for (int j=0; j<3; j++)
             tmp1curr[j] = b_ptr->facc[j]*body_invMass + b_ptr->lvel[j]*stepsize1;
-          dMultiply0_331 (tmp1curr + 3,invIrow,b_ptr->tacc);
+          dMultiply0_331 (tmp1curr + 3,invMOIrow,b_ptr->tacc);
           for (int k=0; k<3; k++) tmp1curr[3+k] += b_ptr->avel[k] * stepsize1;
         }
 
@@ -1692,7 +2213,8 @@ void dxQuickStepper (dxWorldProcessContext *context,
 
 
       // compute rhs_precon
-      computeRHSPrecon(context,m,nb,I,body,stepsize1,c,J,jb,rhs_precon);
+      if (world->qs.precon_iterations > 0)
+        computeRHSPrecon(context,m,nb,MOI,body,stepsize1,c,J,jb,rhs_precon);
 
 
 
@@ -1710,28 +2232,70 @@ void dxQuickStepper (dxWorldProcessContext *context,
 
     } END_STATE_SAVE(context, cstate);
 
+#ifdef PENETRATION_JVERROR_CORRECTION
+    // allocate and populate vnew with v(n+1) due to non-constraint forces as the starting value
+    vnew = context->AllocateArray<dReal> (nb*6);
+    {
+      dRealMutablePtr vnewcurr = vnew;
+      dxBody* const* bodyend = body + nb;
+      const dReal *invMOIrow = invMOI;
+      dReal tmp_tacc[3];
+      for (dxBody* const* bodycurr = body; bodycurr != bodyend;
+           invMOIrow += 12, vnewcurr += 6, bodycurr++) {
+        dxBody *b_ptr = *bodycurr;
+
+        // add stepsize * invM * fe to the body velocity
+        dReal body_invMass_mul_stepsize = stepsize * b_ptr->invMass;
+        for (int j=0; j<3; j++) {
+          vnewcurr[j]   = b_ptr->lvel[j] + body_invMass_mul_stepsize * b_ptr->facc[j];
+          vnewcurr[j+3] = b_ptr->avel[j];
+          tmp_tacc[j]   = b_ptr->tacc[j]*stepsize;
+        }
+        dMultiplyAdd0_331 (vnewcurr+3, invMOIrow, tmp_tacc);
+
+      }
+    }
+#endif
+
     // load lambda from the value saved on the previous iteration
     dReal *lambda = context->AllocateArray<dReal> (m);
     dReal *lambda_erp = context->AllocateArray<dReal> (m);
 
-#ifdef WARM_STARTING //FIXME: add for lambda_erp
+    // initialize lambda and lambda_erp
+    if (world->qs.warm_start > 0)
     {
-      dReal *lambdscurr = lambda;
+      // warm starting
+      dReal *lambdacurr = lambda;
+      dReal *lambda_erpcurr = lambda_erp;
       const dJointWithInfo1 *jicurr = jointiinfos;
       const dJointWithInfo1 *const jiend = jicurr + nj;
       for (; jicurr != jiend; jicurr++) {
         int infom = jicurr->info.m;
-        memcpy (lambdscurr, jicurr->joint->lambda, infom * sizeof(dReal));
-        lambdscurr += infom;
+        memcpy (lambdacurr, jicurr->joint->lambda, infom * sizeof(dReal));
+        lambdacurr += infom;
+        memcpy (lambda_erpcurr, jicurr->joint->lambda_erp, infom * sizeof(dReal));
+        lambda_erpcurr += infom;
+      }
+
+      // for warm starting, this seems to be necessary to prevent
+      // jerkiness in motor-driven joints. i have no idea why this works.
+      // also necessary if J condition numbers are high (maybe the same thing).
+      for (int i=0; i<m; i++) {
+        lambda[i] *= world->qs.warm_start;
+        lambda_erp[i] *= world->qs.warm_start;
       }
     }
-#endif
+    else
+    {
+      dSetZero (lambda,m);
+      dSetZero (lambda_erp,m);
+    }
 
     BEGIN_STATE_SAVE(context, lcpstate) {
       IFTIMING (dTimerNow ("solving LCP problem"));
       // solve the LCP problem and get lambda and invM*constraint_force
       SOR_LCP (context,m,nb,J,J_precon,J_orig,vnew,jb,body,
-               invI,I,lambda,lambda_erp,
+               invMOI,MOI,lambda,lambda_erp,
                caccel,caccel_erp,cforce,
                rhs,rhs_erp,rhs_precon,
                lo,hi,cfm,findex,
@@ -1743,25 +2307,28 @@ void dxQuickStepper (dxWorldProcessContext *context,
 
     } END_STATE_SAVE(context, lcpstate);
 
-#ifdef WARM_STARTING //FIXME: add for lambda_erp
+    if (world->qs.warm_start > 0)
     {
+      // warm starting
       // save lambda for the next iteration
       //@@@ note that this doesn't work for contact joints yet, as they are
       // recreated every iteration
       const dReal *lambdacurr = lambda;
+      const dReal *lambda_erpcurr = lambda_erp;
       const dJointWithInfo1 *jicurr = jointiinfos;
       const dJointWithInfo1 *const jiend = jicurr + nj;
       for (; jicurr != jiend; jicurr++) {
         int infom = jicurr->info.m;
         memcpy (jicurr->joint->lambda, lambdacurr, infom * sizeof(dReal));
         lambdacurr += infom;
+        memcpy (jicurr->joint->lambda_erp, lambda_erpcurr,
+          infom * sizeof(dReal));
+        lambda_erpcurr += infom;
       }
     }
-#endif
 
     // note that the SOR method overwrites rhs and J at this point, so
     // they should not be used again.
-
     {
       IFTIMING (dTimerNow ("velocity update due to constraint forces"));
       //
@@ -1832,16 +2399,16 @@ void dxQuickStepper (dxWorldProcessContext *context,
     IFTIMING (dTimerNow ("compute velocity update"));
     // compute the velocity update:
     // add stepsize * invM * fe to the body velocity
-    const dReal *invIrow = invI;
+    const dReal *invMOIrow = invMOI;
     dxBody *const *const bodyend = body + nb;
-    for (dxBody *const *bodycurr = body; bodycurr != bodyend; invIrow += 12, bodycurr++) {
+    for (dxBody *const *bodycurr = body; bodycurr != bodyend; invMOIrow += 12, bodycurr++) {
       dxBody *b_ptr = *bodycurr;
       dReal body_invMass_mul_stepsize = stepsize * b_ptr->invMass;
       for (int j=0; j<3; j++) {
         b_ptr->lvel[j] += body_invMass_mul_stepsize * b_ptr->facc[j];
         b_ptr->tacc[j] *= stepsize;
       }
-      dMultiplyAdd0_331 (b_ptr->avel, invIrow, b_ptr->tacc);
+      dMultiplyAdd0_331 (b_ptr->avel, invMOIrow, b_ptr->tacc);
       // printf("fe [%f %f %f] [%f %f %f]\n"
       //   ,b_ptr->facc[0] ,b_ptr->facc[1] ,b_ptr->facc[2]
       //   ,b_ptr->tacc[0] ,b_ptr->tacc[1] ,b_ptr->tacc[2]);
@@ -1855,14 +2422,14 @@ void dxQuickStepper (dxWorldProcessContext *context,
 
 #ifdef CHECK_VELOCITY_OBEYS_CONSTRAINT
   if (m > 0) {
-    BEGIN_STATE_SAVE(context, velstate) {
+    BEGIN_STATE_SAVE(context, rmsstate) {
       dReal *vel = context->AllocateArray<dReal>(nb*6);
 
       // CHECK THAT THE UPDATED VELOCITY OBEYS THE CONSTRAINT
       //  (this check needs unmodified J)
       //  put residual into tmp
       dRealMutablePtr velcurr = vel;
-      //dxBody* const* bodyend = body + nb;
+      dxBody* const* bodyend = body + nb;
       for (dxBody* const* bodycurr = body; bodycurr != bodyend; velcurr += 6, bodycurr++) {
         dxBody *b_ptr = *bodycurr;
         for (int j=0; j<3; j++) {
@@ -1873,13 +2440,53 @@ void dxQuickStepper (dxWorldProcessContext *context,
       dReal *tmp = context->AllocateArray<dReal> (m);
       multiply_J (m,J,jb,vel,tmp);
 
-      dReal error = 0;
-      for (int i=0; i<m; i++) error += dFabs(tmp[i]);
-      printf ("velocity error = %10.6e\n",error);
-    }
+      int m_Jv_bilateral = 0;
+      int m_Jv_contact = 0;
+      int m_Jv_friction = 0;
+      dReal Jv_bilateral = 0;
+      dReal Jv_contact = 0;
+      dReal Jv_friction = 0;
+      for (int i=0; i<m; i++)
+      {
+        if (findex[i] == -1)
+        {
+          m_Jv_bilateral++;
+          Jv_bilateral += dFabs(tmp[i])*dFabs(tmp[i]);
+        }
+        else if (findex[i] == -2)
+        {
+          // contact error includes joint limits
+          Jv_contact += dFabs(tmp[i])*dFabs(tmp[i]);
+          m_Jv_contact++;
+        }
+        else if (findex[i] >= 0)
+        {
+          m_Jv_friction++;
+          Jv_friction += dFabs(tmp[i])*dFabs(tmp[i]);
+        }
+
+        // Note: This is not a good measure of constraint error
+        // for soft contact, as Jv is not necessarily zero here.
+        // Better measure is compute the residual.  \\\ TODO
+      }
+      // printf ("error = %10.6e %10.6e %10.6e\n",
+      //   error, Jv_bilateral, Jv_contact);
+      // world->qs.rms_constraint_residual[0] = sqrt(error/(dReal)m);
+
+      dReal residual_bilateral_mean        = Jv_bilateral/(dReal)m_Jv_bilateral;
+      dReal residual_contact_normal_mean   = Jv_contact/(dReal)m_Jv_contact;
+      dReal residual_contact_friction_mean = Jv_friction/(dReal)m_Jv_friction;
+      dReal residual_total_mean            = (Jv_bilateral + Jv_contact + Jv_friction)/
+        ((dReal)(m_Jv_bilateral + m_Jv_contact + m_Jv_friction));
+
+      world->qs.rms_constraint_residual[0] = sqrt(residual_bilateral_mean);
+      world->qs.rms_constraint_residual[1] = sqrt(residual_contact_normal_mean);
+      world->qs.rms_constraint_residual[2] = sqrt(residual_contact_friction_mean);
+      world->qs.rms_constraint_residual[3] = sqrt(residual_total_mean);
+      world->qs.num_contacts = m_Jv_contact;
+    } END_STATE_SAVE(context, rmsstate);
   }
 #endif
-
   {
     // update the position and orientation from the new linear/angular velocity
     // (over the given timestep)
@@ -1906,8 +2513,10 @@ void dxQuickStepper (dxWorldProcessContext *context,
       for (int j=0; j<3; j++) {
         // dReal v0 = b_ptr->lvel[j];
         // dReal a0 = b_ptr->avel[j];
-        dReal dv = erp_removal * stepsize * (caccel_curr[j]   - caccel_erp_curr[j]);
-        dReal da = erp_removal * stepsize * (caccel_curr[3+j] - caccel_erp_curr[3+j]);
+        dReal dv = erp_removal * stepsize *
+          (caccel_curr[j]   - caccel_erp_curr[j]);
+        dReal da = erp_removal * stepsize *
+          (caccel_curr[3+j] - caccel_erp_curr[3+j]);
 
         /* default v removal
         */
@@ -1969,7 +2578,7 @@ void dxQuickStepper (dxWorldProcessContext *context,
       // add correction term dlambda = J*v(n+1)/dt
       // and caccel += dt*invM*JT*dlambda (dt's cancel out)
       dReal *iMJ = context->AllocateArray<dReal> (m*12);
-      compute_invM_JT (m,J,iMJ,jb,body,invI);
+      compute_invM_JT (m,J,iMJ,jb,body,invMOI);
       // compute caccel_corr=(inv(M)*J')*dlambda, correction term
       // as we change lambda.
       multiply_invM_JT (m,nb,iMJ,jb,tmp,caccel_corr);
@@ -2022,8 +2631,8 @@ static size_t EstimateSOR_LCPMemoryRequirements(int m,int /*nb*/)
   res += dEFFICIENT_SIZE(sizeof(dReal) * m); // for Adcfm
   res += dEFFICIENT_SIZE(sizeof(dReal) * m); // for Ad_precon
   res += dEFFICIENT_SIZE(sizeof(dReal) * m); // for Adcfm_precon
-  res += dEFFICIENT_SIZE(sizeof(dReal) * m); // for delta_error
   res += dEFFICIENT_SIZE(sizeof(IndexError) * m); // for order
+  res += dEFFICIENT_SIZE(sizeof(int) * m); // for tmpOrder
 #ifdef REORDER_CONSTRAINTS
   res += dEFFICIENT_SIZE(sizeof(dReal) * m); // for last_lambda
   res += dEFFICIENT_SIZE(sizeof(dReal) * m); // for last_lambda_erp
@@ -2058,14 +2667,18 @@ size_t dxEstimateQuickStepMemoryRequirements (
 
   size_t res = 0;
 
-  res += dEFFICIENT_SIZE(sizeof(dReal) * 3 * 4 * nb); // for invI
-  res += dEFFICIENT_SIZE(sizeof(dReal) * 3 * 4 * nb); // for I (inertia) needed by preconditioner
+  // for invMOI
+  res += dEFFICIENT_SIZE(sizeof(dReal) * 3 * 4 * nb);
+  // for MOI (inertia) needed by preconditioner
+  res += dEFFICIENT_SIZE(sizeof(dReal) * 3 * 4 * nb);
   res += dEFFICIENT_SIZE(sizeof(dReal) * nb); // for invM
 
   {
-    size_t sub1_res1 = dEFFICIENT_SIZE(sizeof(dJointWithInfo1) * _nj); // for initial jointiinfos
+    // for initial jointiinfos
+    size_t sub1_res1 = dEFFICIENT_SIZE(sizeof(dJointWithInfo1) * _nj);
 
-    size_t sub1_res2 = dEFFICIENT_SIZE(sizeof(dJointWithInfo1) * nj); // for shrunk jointiinfos
+    // for shrunk jointiinfos
+    size_t sub1_res2 = dEFFICIENT_SIZE(sizeof(dJointWithInfo1) * nj);
     if (m > 0) {
       sub1_res2 += dEFFICIENT_SIZE(sizeof(dReal) * 12 * m); // for J
       sub1_res2 += dEFFICIENT_SIZE(sizeof(dReal) * 12 * m); // for J_precon
@@ -2100,12 +2713,14 @@ size_t dxEstimateQuickStepMemoryRequirements (
         sub2_res2 += dEFFICIENT_SIZE(sizeof(dReal) * 12 * m); // for iMJ
 #endif
         {
-          size_t sub3_res1 = EstimateSOR_LCPMemoryRequirements(m,nb); // for SOR_LCP
+          // for SOR_LCP
+          size_t sub3_res1 = EstimateSOR_LCPMemoryRequirements(m,nb);
 
           size_t sub3_res2 = 0;
 #ifdef CHECK_VELOCITY_OBEYS_CONSTRAINT
           {
-            size_t sub4_res1 = dEFFICIENT_SIZE(sizeof(dReal) * 6 * nb); // for vel
+            // for vel
+            size_t sub4_res1 = dEFFICIENT_SIZE(sizeof(dReal) * 6 * nb);
             sub4_res1 += dEFFICIENT_SIZE(sizeof(dReal) * m); // for tmp
             sub4_res1 += dEFFICIENT_SIZE(sizeof(dReal) * 12 * m); // for iMJ
 
diff --git a/deps/opende/src/rotation.cpp b/deps/opende/src/rotation.cpp
index e786c13..2be76d8 100644
--- a/deps/opende/src/rotation.cpp
+++ b/deps/opende/src/rotation.cpp
@@ -27,6 +27,7 @@ quaternions have the format: (s,vx,vy,vz) where (vx,vy,vz) is the
 
 */
 
+#include <iostream>
 #include <ode/rotation.h>
 #include <ode/odemath.h>
 #include "config.h"
@@ -57,7 +58,7 @@ void dRSetIdentity (dMatrix3 R)
 
 
 void dRFromAxisAndAngle (dMatrix3 R, dReal ax, dReal ay, dReal az,
-			 dReal angle)
+       dReal angle)
 {
   dAASSERT (R);
   dQuaternion q;
@@ -92,13 +93,14 @@ void dRFromEulerAngles (dMatrix3 R, dReal phi, dReal theta, dReal psi)
 
 
 void dRFrom2Axes (dMatrix3 R, dReal ax, dReal ay, dReal az,
-		  dReal bx, dReal by, dReal bz)
+      dReal bx, dReal by, dReal bz)
 {
   dReal l,k;
   dAASSERT (R);
   l = dSqrt (ax*ax + ay*ay + az*az);
   if (l <= REAL(0.0)) {
     dDEBUGMSG ("zero length vector");
+    memset(R, 0, sizeof(dReal)*12);
     return;
   }
   l = dRecip(l);
@@ -111,6 +113,7 @@ void dRFrom2Axes (dMatrix3 R, dReal ax, dReal ay, dReal az,
   bz -= k*az;
   l = dSqrt (bx*bx + by*by + bz*bz);
   if (l <= REAL(0.0)) {
+    memset(R, 0, sizeof(dReal)*12);
     dDEBUGMSG ("zero length vector");
     return;
   }
@@ -167,7 +170,7 @@ void dQSetIdentity (dQuaternion q)
 
 
 void dQFromAxisAndAngle (dQuaternion q, dReal ax, dReal ay, dReal az,
-			 dReal angle)
+       dReal angle)
 {
   dAASSERT (q);
   dReal l = ax*ax + ay*ay + az*az;
@@ -258,9 +261,10 @@ void dRfromQ (dMatrix3 R, const dQuaternion q)
 void dQfromR (dQuaternion q, const dMatrix3 R)
 {
   dAASSERT (q && R);
-  dReal tr,s;
+  dReal tr(0), s(0);
   tr = _R(0,0) + _R(1,1) + _R(2,2);
-  if (tr >= 0) {
+  if (tr >= 0)
+  {
     s = dSqrt (tr + 1);
     q[0] = REAL(0.5) * s;
     s = REAL(0.5) * dRecip(s);
diff --git a/deps/opende/src/util.h b/deps/opende/src/util.h
index 23dc0c1..737ff63 100644
--- a/deps/opende/src/util.h
+++ b/deps/opende/src/util.h
@@ -23,7 +23,9 @@
 #ifndef _ODE_UTIL_H_
 #define _ODE_UTIL_H_
 
+#ifndef SIZE_MAX
 #define SIZE_MAX ((size_t)(-1))
+#endif
 #include "objects.h"
 
 
diff --git a/doc/gazebo.in b/doc/gazebo.in
index f1cd153..57bfc08 100644
--- a/doc/gazebo.in
+++ b/doc/gazebo.in
@@ -761,7 +761,7 @@ IMAGE_PATH             =
 # If FILTER_PATTERNS is specified, this tag will be
 # ignored.
 
-INPUT_FILTER           = "sed 's/boost::shared_ptr<\(.*\)>/\1*/'"
+INPUT_FILTER           = ""
 
 # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
 # basis.
diff --git a/examples/plugins/animate_joints/animate_joints.cc b/examples/plugins/animate_joints/animate_joints.cc
index f3189f5..bbb4352 100644
--- a/examples/plugins/animate_joints/animate_joints.cc
+++ b/examples/plugins/animate_joints/animate_joints.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/examples/plugins/animate_pose/animate_pose.cc b/examples/plugins/animate_pose/animate_pose.cc
index ea59955..b6959d6 100644
--- a/examples/plugins/animate_pose/animate_pose.cc
+++ b/examples/plugins/animate_pose/animate_pose.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,11 @@
  * limitations under the License.
  *
 */
-#include "common/CommonTypes.hh"
-#include "common/Animation.hh"
-#include "common/KeyFrame.hh"
-#include "physics/Model.hh"
-#include "gazebo.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/common/Animation.hh"
+#include "gazebo/common/KeyFrame.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/gazebo.hh"
 
 namespace gazebo
 {
diff --git a/examples/plugins/camera/camera_dump.cc b/examples/plugins/camera/camera_dump.cc
index 069e0af..c8f7823 100644
--- a/examples/plugins/camera/camera_dump.cc
+++ b/examples/plugins/camera/camera_dump.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
 */
-#include "gazebo.hh"
+#include "gazebo/gazebo.hh"
 #include "plugins/CameraPlugin.hh"
 
 namespace gazebo
diff --git a/examples/plugins/camera/camera_move.cc b/examples/plugins/camera/camera_move.cc
index 05bb957..58ff840 100644
--- a/examples/plugins/camera/camera_move.cc
+++ b/examples/plugins/camera/camera_move.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/examples/plugins/custom_messages/custom_messages.cc b/examples/plugins/custom_messages/custom_messages.cc
index 676a602..11aa1b7 100644
--- a/examples/plugins/custom_messages/custom_messages.cc
+++ b/examples/plugins/custom_messages/custom_messages.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
 #include <boost/bind.hpp>
 #include "gazebo/transport/transport.hh"
 #include "gazebo/physics/physics.hh"
-#include "gazebo.hh"
+#include "gazebo/gazebo.hh"
 
 #include "msgs/custom.pb.h"
 
diff --git a/examples/plugins/factory/CMakeLists.txt b/examples/plugins/factory/CMakeLists.txt
index 2576fa5..c7e4e82 100644
--- a/examples/plugins/factory/CMakeLists.txt
+++ b/examples/plugins/factory/CMakeLists.txt
@@ -1,11 +1,24 @@
 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
+find_package(Boost REQUIRED COMPONENTS system)
+include_directories(${Boost_INCLUDE_DIRS})
+link_directories(${Boost_LIBRARY_DIRS})
+
+find_package(Protobuf REQUIRED)
+include_directories(${PROTOBUF_INCLUDE_DIRS})
+link_directories(${PROTUBUF_LIBRARY_DIRS})
+
 include (FindPkgConfig)
 if (PKG_CONFIG_FOUND)
   pkg_check_modules(GAZEBO gazebo)
 endif()
+find_package(GAZEBO)
 include_directories(${GAZEBO_INCLUDE_DIRS})
 link_directories(${GAZEBO_LIBRARY_DIRS})
 
 add_library(factory SHARED factory.cc)
-target_link_libraries(factory ${GAZEBO_libraries})
+target_link_libraries(factory
+  ${GAZEBO_LIBRARIES}
+  ${Boost_LIBRARIES}
+  ${PROTUBUF_LIBRARIES}
+)
diff --git a/examples/plugins/factory/factory.cc b/examples/plugins/factory/factory.cc
index 4ae846e..87602ae 100644
--- a/examples/plugins/factory/factory.cc
+++ b/examples/plugins/factory/factory.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,75 +15,74 @@
  *
 */
 #include "gazebo/physics/physics.hh"
+#include "gazebo/common/common.hh"
 #include "gazebo/gazebo.hh"
 
 namespace gazebo
 {
-  class Factory : public WorldPlugin
+class Factory : public WorldPlugin
+{
+  public: void Load(physics::WorldPtr _parent, sdf::ElementPtr /*_sdf*/)
   {
-    public: void Load(physics::WorldPtr _parent, sdf::ElementPtr /*_sdf*/)
-    {
-      // Option 1: Insert model from file via function call.
-      // The filename must be in the GAZEBO_RESOURCE_PATH environment variable.
-      _parent->InsertModel("models/box.model");
+    // Option 1: Insert model from file via function call.
+    // The filename must be in the GAZEBO_MODEL_PATH environment variable.
+    _parent->InsertModelFile("model://box");
 
-      // Option 2: Insert model from string via function call.
-      // Insert a sphere model from string
-      sdf::SDF sphereSDF;
-      sphereSDF.SetFromString(
-         "<gazebo version ='1.0'>\
+    // Option 2: Insert model from string via function call.
+    // Insert a sphere model from string
+    sdf::SDF sphereSDF;
+    sphereSDF.SetFromString(
+       "<sdf version ='1.4'>\
           <model name ='sphere'>\
-            <origin pose ='1 2 0 0 0 0'/>\
+            <pose>1 0 0 0 0 0</pose>\
             <link name ='link'>\
-              <origin pose ='0 0 .5 0 0 0'/>\
-              <inertial mass ='1.0'>\
-                  <inertia ixx ='1' ixy ='0' ixz ='0'\
-                           iyy ='1' iyz ='0' izz ='1'/>\
-              </inertial>\
+              <pose>0 0 .5 0 0 0</pose>\
               <collision name ='collision'>\
                 <geometry>\
-                  <sphere radius ='0.5'/>\
+                  <sphere><radius>0.5</radius></sphere>\
                 </geometry>\
               </collision>\
               <visual name ='visual'>\
                 <geometry>\
-                  <sphere radius ='0.5'/>\
+                  <sphere><radius>0.5</radius></sphere>\
                 </geometry>\
-                <material script ='Gazebo/Grey'/>\
               </visual>\
             </link>\
           </model>\
-        </gazebo>");
-      _parent->InsertModel(sphereSDF);
+        </sdf>");
+    // Demonstrate using a custom model name.
+    sdf::ElementPtr model = sphereSDF.root->GetElement("model");
+    model->GetAttribute("name")->SetFromString("unique_sphere");
+    _parent->InsertModelSDF(sphereSDF);
 
-      // Option 3: Insert model from file via message passing.
-      {
-        // Create a new transport node
-        transport::NodePtr node(new transport::Node());
+    // Option 3: Insert model from file via message passing.
+    {
+      // Create a new transport node
+      transport::NodePtr node(new transport::Node());
 
-        // Initialize the node with the world name
-        node->Init(_parent->GetName());
+      // Initialize the node with the world name
+      node->Init(_parent->GetName());
 
-        // Create a publisher on the ~/factory topic
-        transport::PublisherPtr factoryPub =
-          node->Advertise<msgs::Factory>("~/factory");
+      // Create a publisher on the ~/factory topic
+      transport::PublisherPtr factoryPub =
+      node->Advertise<msgs::Factory>("~/factory");
 
-        // Create the message
-        msgs::Factory msg;
+      // Create the message
+      msgs::Factory msg;
 
-        // Model file to load
-        msg.set_sdf_filename("models/cylinder.model");
+      // Model file to load
+      msg.set_sdf_filename("model://cylinder");
 
-        // Pose to initialize the model to
-        msgs::Set(msg.mutable_pose(),
-            math::Pose(math::Vector3(1, -2, 0), math::Quaternion(0, 0, 0)));
+      // Pose to initialize the model to
+      msgs::Set(msg.mutable_pose(),
+      math::Pose(math::Vector3(1, -2, 0), math::Quaternion(0, 0, 0)));
 
-        // Send the message
-        factoryPub->Publish(msg);
-      }
+      // Send the message
+      factoryPub->Publish(msg);
     }
-  };
+  }
+};
 
-  // Register this plugin with the simulator
-  GZ_REGISTER_WORLD_PLUGIN(Factory)
+// Register this plugin with the simulator
+GZ_REGISTER_WORLD_PLUGIN(Factory)
 }
diff --git a/examples/plugins/factory/factory.world b/examples/plugins/factory/factory.world
index ecf0312..c128add 100644
--- a/examples/plugins/factory/factory.world
+++ b/examples/plugins/factory/factory.world
@@ -1,46 +1,14 @@
-<?xml version="1.0"?> 
-<gazebo version="1.0">
+<?xml version="1.0"?>
+<sdf version="1.4">
   <world name="default">
-    <scene>
-      <ambient rgba="0.1 0.1 0.1 1"/>
-      <background rgba="0 0 0 1"/>
-      <shadows enabled="true"/>
-    </scene>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
 
-    <physics type="ode">
-      <gravity xyz="0 0 -9.8"/>
-      <ode>
-        <solver type="quick" dt="0.001" iters="100" sor="1.3"/>
-        <constraints cfm="0.0" erp="0.2" contact_max_correcting_vel="100.0" contact_surface_layer="0.001"/>
-      </ode>
-    </physics>
-
-    <!-- Ground Plane -->
-    <model name="plane1_model" static="true">
-      <link name="body">
-        <collision name="geom_1">
-          <geometry>
-            <plane normal="0 0 1"/>
-          </geometry>
-        </collision>
-
-        <visual name="visual_1" cast_shadows="false">
-          <geometry>
-            <plane normal="0 0 1"/>
-          </geometry>
-          <material script="Gazebo/Grey"/>
-        </visual>
-      </link>
-    </model>
-
-    <light type="directional" name="sun" cast_shadows="true">
-      <origin pose="0 0 10 0 0 0"/>
-      <diffuse rgba="0.8 0.8 0.8 1"/>
-      <specular rgba="0 0 0 1"/>
-      <attenuation range="20" constant="0.8" linear="0.01" quadratic="0.0"/>
-      <direction xyz="1.0 1.0 -1.0"/>
-    </light>
+    <include>
+      <uri>model://sun</uri>
+    </include>
 
     <plugin name="factory" filename="libfactory.so"/>
   </world>
-</gazebo>
+</sdf>
diff --git a/examples/plugins/factory/models/box/model.config b/examples/plugins/factory/models/box/model.config
new file mode 100644
index 0000000..f045e29
--- /dev/null
+++ b/examples/plugins/factory/models/box/model.config
@@ -0,0 +1,16 @@
+<?xml version='1.0'?>
+
+<model>
+  <name>box</name>
+  <version>1.0</version>
+  <sdf>model.sdf</sdf>
+
+  <author>
+    <name>me</name>
+    <email>somebody at somewhere.com</email>
+  </author>
+
+  <description>
+    A simple box.
+  </description>
+</model>
diff --git a/examples/plugins/factory/models/box/model.sdf b/examples/plugins/factory/models/box/model.sdf
new file mode 100644
index 0000000..85b126d
--- /dev/null
+++ b/examples/plugins/factory/models/box/model.sdf
@@ -0,0 +1,19 @@
+<?xml version='1.0'?>
+<sdf version ='1.4'>
+  <model name ='box'>
+    <pose>1 2 0 0 0 0</pose>
+    <link name ='link'>
+      <pose>0 0 .5 0 0 0</pose>
+      <collision name ='collision'>
+        <geometry>
+          <box><size>1 1 1</size></box>
+        </geometry>
+      </collision>
+      <visual name ='visual'>
+        <geometry>
+          <box><size>1 1 1</size></box>
+        </geometry>
+      </visual>
+    </link>
+  </model>
+</sdf>
diff --git a/examples/plugins/factory/models/cylinder/model.config b/examples/plugins/factory/models/cylinder/model.config
new file mode 100644
index 0000000..2b8e9b0
--- /dev/null
+++ b/examples/plugins/factory/models/cylinder/model.config
@@ -0,0 +1,16 @@
+<?xml version='1.0'?>
+
+<model>
+  <name>cylinder</name>
+  <version>1.0</version>
+  <sdf>model.sdf</sdf>
+
+  <author>
+    <name>me</name>
+    <email>somebody at somewhere.com</email>
+  </author>
+
+  <description>
+    A simple cylinder.
+  </description>
+</model>
diff --git a/examples/plugins/factory/models/cylinder/model.sdf b/examples/plugins/factory/models/cylinder/model.sdf
new file mode 100644
index 0000000..040bf7e
--- /dev/null
+++ b/examples/plugins/factory/models/cylinder/model.sdf
@@ -0,0 +1,19 @@
+<?xml version='1.0'?>
+<sdf version ='1.4'>
+  <model name ='cylinder'>
+    <pose>1 2 0 0 0 0</pose>
+    <link name ='link'>
+      <pose>0 0 .5 0 0 0</pose>
+      <collision name ='collision'>
+        <geometry>
+          <cylinder><radius>0.5</radius><length>1</length></cylinder>
+        </geometry>
+      </collision>
+      <visual name='visual'>
+        <geometry>
+          <cylinder><radius>0.5</radius><length>1</length></cylinder>
+        </geometry>
+      </visual>
+    </link>
+  </model>
+</sdf>
diff --git a/examples/plugins/hello_world/CMakeLists.txt b/examples/plugins/hello_world/CMakeLists.txt
index bff8e92..2b9d96a 100644
--- a/examples/plugins/hello_world/CMakeLists.txt
+++ b/examples/plugins/hello_world/CMakeLists.txt
@@ -1,5 +1,9 @@
 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
+find_package(Boost REQUIRED COMPONENTS system)
+include_directories(${Boost_INCLUDE_DIRS})
+link_directories(${Boost_LIBRARY_DIRS})
+
 include (FindPkgConfig)
 if (PKG_CONFIG_FOUND)
   pkg_check_modules(GAZEBO gazebo)
@@ -8,4 +12,4 @@ include_directories(${GAZEBO_INCLUDE_DIRS})
 link_directories(${GAZEBO_LIBRARY_DIRS})
 
 add_library(hello_world SHARED hello_world.cc)
-target_link_libraries(hello_world ${GAZEBO_libraries})
+target_link_libraries(hello_world ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})
diff --git a/examples/plugins/hello_world/hello.world b/examples/plugins/hello_world/hello.world
index 5abd212..d116a0b 100644
--- a/examples/plugins/hello_world/hello.world
+++ b/examples/plugins/hello_world/hello.world
@@ -1,5 +1,6 @@
-<?xml version="1.0"?> 
-<gazebo version="1.2">
+<?xml version="1.0"?>
+<sdf version="1.4">
   <world name="default">
     <plugin name="hello_world" filename="libhello_world.so"/>
-</gazebo>
+  </world>
+</sdf>
diff --git a/examples/plugins/hello_world/hello_world.cc b/examples/plugins/hello_world/hello_world.cc
index f7c01aa..5392b28 100644
--- a/examples/plugins/hello_world/hello_world.cc
+++ b/examples/plugins/hello_world/hello_world.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@ namespace gazebo
 
     public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
             {
-            };
+            }
   };
   GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial)
 }
diff --git a/examples/plugins/model_push/CMakeLists.txt b/examples/plugins/model_push/CMakeLists.txt
index 3401e9b..c91db28 100644
--- a/examples/plugins/model_push/CMakeLists.txt
+++ b/examples/plugins/model_push/CMakeLists.txt
@@ -1,5 +1,9 @@
 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
+find_package(Boost REQUIRED COMPONENTS system)
+include_directories(${Boost_INCLUDE_DIRS})
+link_directories(${Boost_LIBRARY_DIRS})
+
 include (FindPkgConfig)
 if (PKG_CONFIG_FOUND)
   pkg_check_modules(GAZEBO gazebo)
@@ -8,4 +12,4 @@ include_directories(${GAZEBO_INCLUDE_DIRS})
 link_directories(${GAZEBO_LIBRARY_DIRS})
 
 add_library(model_push SHARED model_push.cc)
-target_link_libraries(model_push ${GAZEBO_libraries})
+target_link_libraries(model_push ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})
diff --git a/examples/plugins/model_push/model_push.cc b/examples/plugins/model_push/model_push.cc
index 2aba6f0..3b359b1 100644
--- a/examples/plugins/model_push/model_push.cc
+++ b/examples/plugins/model_push/model_push.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,12 +15,11 @@
  *
 */
 #include <boost/bind.hpp>
-#include "gazebo/physics/physics.hh"
-#include "gazebo/gazebo.hh"
+#include <gazebo/gazebo.hh>
+#include <gazebo/physics/physics.hh>
+#include <gazebo/common/common.hh>
+#include <stdio.h>
 
-/// \example examples/plugins/model_push.cc
-/// This example creates a ModelPlugin, and applies a force to a box to move
-/// it alone the ground plane.
 namespace gazebo
 {
   class ModelPush : public ModelPlugin
@@ -33,11 +32,11 @@ namespace gazebo
       // Listen to the update event. This event is broadcast every
       // simulation iteration.
       this->updateConnection = event::Events::ConnectWorldUpdateBegin(
-          boost::bind(&ModelPush::OnUpdate, this));
+          boost::bind(&ModelPush::OnUpdate, this, _1));
     }
 
     // Called by the world update start event
-    public: void OnUpdate()
+    public: void OnUpdate(const common::UpdateInfo & /*_info*/)
     {
       // Apply a small linear velocity to the model.
       this->model->SetLinearVel(math::Vector3(.03, 0, 0));
diff --git a/examples/plugins/model_push/model_push.world b/examples/plugins/model_push/model_push.world
index 8863a13..598bdee 100644
--- a/examples/plugins/model_push/model_push.world
+++ b/examples/plugins/model_push/model_push.world
@@ -1,7 +1,8 @@
 <?xml version="1.0"?> 
-<gazebo version="1.2">
+<sdf version="1.4">
   <world name="default">
 
+    <!-- Ground Plane -->
     <include>
       <uri>model://ground_plane</uri>
     </include>
@@ -9,8 +10,8 @@
     <include>
       <uri>model://sun</uri>
     </include>
-   
-    <model name="box_model">
+
+    <model name="box">
       <pose>0 0 0.5 0 0 0</pose>
       <link name="link">
         <collision name="collision">
@@ -19,13 +20,6 @@
               <size>1 1 1</size>
             </box>
           </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>0</mu><mu2>0</mu2>
-              </ode>
-            </friction>
-          </surface>
         </collision>
 
         <visual name="visual">
@@ -37,8 +31,7 @@
         </visual>
       </link>
 
-      <plugin name="model_push" filename="libmodel_push.so"/>
-    </model>
-
+      <plugin name="model_push" filename="build/libmodel_push.so"/>
+    </model>        
   </world>
-</gazebo>
+</sdf>
diff --git a/examples/plugins/model_visuals/model_visuals.cc b/examples/plugins/model_visuals/model_visuals.cc
index a1c4875..21c6588 100644
--- a/examples/plugins/model_visuals/model_visuals.cc
+++ b/examples/plugins/model_visuals/model_visuals.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/examples/plugins/parameters/parameters.cc b/examples/plugins/parameters/parameters.cc
index 9c784ad..c4220d8 100644
--- a/examples/plugins/parameters/parameters.cc
+++ b/examples/plugins/parameters/parameters.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
 */
-#include "gazebo.hh"
+#include "gazebo/gazebo.hh"
 
 namespace gazebo
 {
diff --git a/examples/plugins/pr2_pose_test.cc b/examples/plugins/pr2_pose_test.cc
index 7fa6e7a..a29739a 100644
--- a/examples/plugins/pr2_pose_test.cc
+++ b/examples/plugins/pr2_pose_test.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,7 +29,7 @@ namespace gazebo
     public: void Load(physics::ModelPtr &/*_parent*/, sdf::ElementPtr &_sdf)
     {
       // Get then name of the parent model
-      std::string modelName = _sdf->GetParent()->GetValueString("name");
+      std::string modelName = _sdf->GetParent()->Get<std::string>("name");
 
       // Get the world name.
       std::string worldName = _sdf->GetWorldName();
diff --git a/examples/plugins/presentation.cc b/examples/plugins/presentation.cc
index 1f0d544..f59e7fe 100644
--- a/examples/plugins/presentation.cc
+++ b/examples/plugins/presentation.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,16 +16,16 @@
 */
 #include <boost/bind.hpp>
 
-#include "gui/Gui.hh"
-#include "gui/GuiEvents.hh"
-#include "rendering/Scene.hh"
-#include "rendering/Camera.hh"
-#include "rendering/DepthCamera.hh"
-#include "rendering/RenderEngine.hh"
-#include "rendering/UserCamera.hh"
-#include "rendering/GUIOverlay.hh"
-#include "rendering/Visual.hh"
-#include "gazebo.hh"
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/rendering/DepthCamera.hh"
+#include "gazebo/rendering/RenderEngine.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/GUIOverlay.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/gazebo.hh"
 
 namespace gazebo
 {
diff --git a/examples/plugins/projector/projector.cc b/examples/plugins/projector/projector.cc
index 9ed722a..e73acbb 100644
--- a/examples/plugins/projector/projector.cc
+++ b/examples/plugins/projector/projector.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -34,7 +34,7 @@ namespace gazebo
       this->node->Init(_parent->GetWorld()->GetName());
 
       std::string name = std::string("~/") + _parent->GetName() + "/" +
-                          _sdf->GetValueString("projector");
+                          _sdf->Get<std::string>("projector");
 
       // Create a publisher on the ~/physics topic
       this->projectorPub = node->Advertise<msgs::Projector>(name);
diff --git a/examples/plugins/ray_test.cc b/examples/plugins/ray_test.cc
index ec8b933..f1ee7ad 100644
--- a/examples/plugins/ray_test.cc
+++ b/examples/plugins/ray_test.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,7 +29,7 @@ namespace gazebo
     public: void Load(sensors::SensorPtr &/*_parent*/, sdf::ElementPtr &_sdf)
     {
       // Get then name of the parent model
-      std::string modelName = _sdf->GetParent()->GetValueString("name");
+      std::string modelName = _sdf->GetParent()->Get<std::string>("name");
 
       // Get the world name.
       std::string worldName = _sdf->GetWorldName();
diff --git a/examples/plugins/system_gui_plugin/CMakeLists.txt b/examples/plugins/system_gui_plugin/CMakeLists.txt
index a8a2f89..928a0a8 100644
--- a/examples/plugins/system_gui_plugin/CMakeLists.txt
+++ b/examples/plugins/system_gui_plugin/CMakeLists.txt
@@ -4,9 +4,17 @@ include (FindPkgConfig)
 if (PKG_CONFIG_FOUND)
   pkg_check_modules(GAZEBO gazebo)
   pkg_check_modules(OGRE OGRE)
+  pkg_check_modules(OGRE-Terrain OGRE-Terrain)
+  pkg_check_modules(CEGUI CEGUI)
+  pkg_check_modules(CEGUI-OGRE CEGUI-OGRE)
 endif()
-include_directories(${GAZEBO_INCLUDE_DIRS} ${OGRE_INCLUDE_DIRS})
-link_directories(${GAZEBO_LIBRARY_DIRS} ${OGRE_LIBRARY_DIRS})
+
+include_directories(SYSTEM ${GAZEBO_INCLUDE_DIRS} ${OGRE_INCLUDE_DIRS}
+  ${OGRE-Terrain_INCLUDE_DIRS} ${CEGUI_INCLUDE_DIRS} ${CEGUI-OGRE_INCLUDE_DIRS})
+
+link_directories(${GAZEBO_LIBRARY_DIRS} ${OGRE_LIBRARY_DIRS}
+  ${OGRE-Terrain_LIBRARY_DIRS} ${CEGUI_LIBRARY_DIRS} ${CEGUI-OGRE_LIBRARY_DIRS})
 
 add_library(system_gui SHARED system_gui.cc)
-target_link_libraries(system_gui ${GAZEBO_libraries} ${OGRE_LIBRARIES})
+target_link_libraries(system_gui ${GAZEBO_LIBRARIES} ${OGRE_LIBRARIES}
+  ${OGRE-Terrain_LIBRARIES} ${CEGUI_LIBRARIES} ${CEGUI-OGRE_LIBRARIES})
diff --git a/examples/plugins/system_gui_plugin/system_gui.cc b/examples/plugins/system_gui_plugin/system_gui.cc
index 18c5d7e..fd80cb4 100644
--- a/examples/plugins/system_gui_plugin/system_gui.cc
+++ b/examples/plugins/system_gui_plugin/system_gui.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,18 +14,39 @@
  * limitations under the License.
  *
 */
-#include "gui/Gui.hh"
-#include "rendering/rendering.hh"
-#include "gazebo.hh"
+
+// Include Rand.hh first due to compilation error on osx (boost #5010)
+// https://svn.boost.org/trac/boost/ticket/5010
+#include <gazebo/math/Rand.hh>
+#include <gazebo/gui/GuiIface.hh>
+#include <gazebo/rendering/rendering.hh>
+#include <gazebo/gazebo.hh>
 
 namespace gazebo
 {
   class SystemGUI : public SystemPlugin
   {
+    /////////////////////////////////////////////
+    /// \brief Destructor
+    public: virtual ~SystemGUI()
+    {
+      this->connections.clear();
+      if (this->userCam)
+        this->userCam->EnableSaveFrame(false);
+      this->userCam.reset();
+    }
+
+    /////////////////////////////////////////////
+    /// \brief Called after the plugin has been constructed.
     public: void Load(int /*_argc*/, char ** /*_argv*/)
     {
+      this->connections.push_back(
+          event::Events::ConnectPreRender(
+            boost::bind(&SystemGUI::Update, this)));
     }
 
+    /////////////////////////////////////////////
+    // \brief Called once after Load
     private: void Init()
     {
       // Get a pointer to the active user camera
@@ -38,7 +59,29 @@ namespace gazebo
       this->userCam->SetSaveFramePathname("/tmp/gazebo_frames");
     }
 
+    /////////////////////////////////////////////
+    /// \brief Called every PreRender event. See the Load function.
+    private: void Update()
+    {
+      // Get scene pointer
+      rendering::ScenePtr scene = rendering::get_scene();
+
+      // Wait until the scene is initialized.
+      if (!scene || !scene->GetInitialized())
+        return;
+
+      // Print out the total number of visuals in the scene
+      std::cout << "Visual Count:" << scene->GetVisualCount() << std::endl;
+
+      // Look for a specific visual by name.
+      if (scene->GetVisual("ground_plane"))
+        std::cout << "Has ground plane visual\n";
+    }
+
+    /// Pointer the user camera.
     private: rendering::UserCameraPtr userCam;
+
+    /// All the event connections.
     private: std::vector<event::ConnectionPtr> connections;
   };
 
diff --git a/examples/plugins/world_edit/CMakeLists.txt b/examples/plugins/world_edit/CMakeLists.txt
index 0109638..07af087 100644
--- a/examples/plugins/world_edit/CMakeLists.txt
+++ b/examples/plugins/world_edit/CMakeLists.txt
@@ -1,5 +1,9 @@
 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
+find_package(Boost REQUIRED COMPONENTS system)
+include_directories(${Boost_INCLUDE_DIRS})
+link_directories(${Boost_LIBRARY_DIRS})
+
 include (FindPkgConfig)
 if (PKG_CONFIG_FOUND)
   pkg_check_modules(GAZEBO gazebo)
@@ -8,4 +12,4 @@ include_directories(${GAZEBO_INCLUDE_DIRS})
 link_directories(${GAZEBO_LIBRARY_DIRS})
 
 add_library(world_edit SHARED world_edit.cc)
-target_link_libraries(world_edit ${GAZEBO_libraries})
+target_link_libraries(world_edit ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})
diff --git a/examples/plugins/world_edit/world_edit.cc b/examples/plugins/world_edit/world_edit.cc
index 5af6629..54aa51e 100644
--- a/examples/plugins/world_edit/world_edit.cc
+++ b/examples/plugins/world_edit/world_edit.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,12 @@
  * limitations under the License.
  *
 */
-#include "gazebo.hh"
+#include <sdf/sdf.hh>
+#include "gazebo/gazebo.hh"
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/transport.hh"
 
 /// \example examples/plugins/world_edit.cc
 /// This example creates a WorldPlugin, initializes the Transport system by
@@ -23,13 +28,13 @@ namespace gazebo
 {
   class WorldEdit : public WorldPlugin
   {
-    public: void Load(physics::WorldPtr /*_parent*/, sdf::ElementPtr _sdf)
+    public: void Load(physics::WorldPtr _parent, sdf::ElementPtr _sdf)
     {
       // Create a new transport node
       transport::NodePtr node(new transport::Node());
 
       // Initialize the node with the world name
-      node->Init(_sdf->GetWorldName());
+      node->Init(_parent->GetName());
 
       // Create a publisher on the ~/physics topic
       transport::PublisherPtr physicsPub =
@@ -39,10 +44,10 @@ namespace gazebo
       physicsMsg.set_type(msgs::Physics::ODE);
 
       // Set the step time
-      physicsMsg.set_dt(0.01);
+      physicsMsg.set_max_step_size(0.01);
 
       // Change gravity
-      msgs::Set(physicsMsg.mutable_gravity(), math::Vector3(0.01, 0, 0.01));
+      msgs::Set(physicsMsg.mutable_gravity(), math::Vector3(0.01, 0, 0.1));
       physicsPub->Publish(physicsMsg);
     }
   };
diff --git a/examples/plugins/world_edit/world_edit.world b/examples/plugins/world_edit/world_edit.world
index 3506f61..2c05351 100644
--- a/examples/plugins/world_edit/world_edit.world
+++ b/examples/plugins/world_edit/world_edit.world
@@ -1,45 +1,14 @@
-<?xml version="1.0"?> 
-<gazebo version="1.0">
-  <world name="default">
-    <scene>
-      <ambient rgba="0.1 0.1 0.1 1"/>
-      <background rgba="0 0 0 1"/>
-      <shadows enabled="true"/>
-    </scene>
-
-    <physics type="ode">
-      <gravity xyz="0 0 -9.8"/>
-      <ode>
-        <solver type="quick" dt="0.001" iters="100" sor="1.3"/>
-        <constraints cfm="0.0" erp="0.2" contact_max_correcting_vel="100.0" contact_surface_layer="0.001"/>
-      </ode>
-    </physics>
-
-    <!-- Ground Plane -->
-    <model name="plane1_model" static="true">
-      <link name="body">
-        <collision name="geom_1">
-          <geometry>
-            <plane normal="0 0 1"/>
-          </geometry>
-        </collision>
-
-        <visual name="visual_1" cast_shadows="false">
-          <geometry>
-            <plane normal="0 0 1"/>
-          </geometry>
-          <material script="Gazebo/Grey"/>
-        </visual>
-      </link>
-    </model>
-
-    <light type="directional" name="sun" cast_shadows="true">
-      <origin pose="0 0 10 0 0 0"/>
-      <diffuse rgba="0.8 0.8 0.8 1"/>
-      <specular rgba="0 0 0 1"/>
-      <attenuation range="20" constant="0.8" linear="0.01" quadratic="0.0"/>
-      <direction xyz="1.0 1.0 -1.0"/>
-    </light>
-
-    <plugin name="world_edit" filename="libworld_edit.so"/>
-</gazebo>
+<?xml version ='1.0'?>
+<sdf version ='1.4'>
+  <world name='default'>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <plugin filename="libworld_edit.so" name="world_edit"/>
+  </world>
+</sdf>
diff --git a/examples/stand_alone/custom_main/CMakeLists.txt b/examples/stand_alone/custom_main/CMakeLists.txt
new file mode 100644
index 0000000..2aad7c1
--- /dev/null
+++ b/examples/stand_alone/custom_main/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+
+include (FindPkgConfig)
+if (PKG_CONFIG_FOUND)
+  pkg_check_modules(GAZEBO gazebo)
+endif()
+
+include(FindBoost)
+find_package(Boost ${MIN_BOOST_VERSION} REQUIRED system filesystem regex)
+
+find_package(Protobuf REQUIRED)
+
+include_directories(${GAZEBO_INCLUDE_DIRS})
+link_directories(${GAZEBO_LIBRARY_DIRS})
+
+add_executable(custom_main custom_main.cc)
+target_link_libraries(custom_main ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES} ${PROTOBUF_LIBRARIES} pthread)
diff --git a/examples/stand_alone/custom_main/custom_main.cc b/examples/stand_alone/custom_main/custom_main.cc
new file mode 100644
index 0000000..cccd9c7
--- /dev/null
+++ b/examples/stand_alone/custom_main/custom_main.cc
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gazebo/gazebo.hh>
+#include <gazebo/common/common.hh>
+#include <gazebo/physics/physics.hh>
+
+/////////////////////////////////////////////////
+int main(int _argc, char **_argv)
+{
+  // Initialize gazebo.
+  gazebo::setupServer(_argc, _argv);
+
+  // Load a world
+  gazebo::physics::WorldPtr world = gazebo::loadWorld("worlds/empty.world");
+
+  // This is your custom main loop. In this example the main loop is just a
+  // for loop with 2 iterations.
+  for (unsigned int i = 0; i < 2; ++i)
+  {
+    // Run simulation for 100 steps.
+    gazebo::runWorld(world, 100);
+  }
+
+  // Close everything.
+  gazebo::shutdown();
+}
diff --git a/examples/stand_alone/listener/CMakeLists.txt b/examples/stand_alone/listener/CMakeLists.txt
index 352c90e..0732849 100644
--- a/examples/stand_alone/listener/CMakeLists.txt
+++ b/examples/stand_alone/listener/CMakeLists.txt
@@ -14,4 +14,4 @@ include_directories(${GAZEBO_INCLUDE_DIRS})
 link_directories(${GAZEBO_LIBRARY_DIRS})
 
 add_executable(listener listener.cc)
-target_link_libraries(listener ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES} ${PROTOBUF_LIBRARIES})
+target_link_libraries(listener ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES} ${PROTOBUF_LIBRARIES} pthread)
diff --git a/examples/stand_alone/listener/listener.cc b/examples/stand_alone/listener/listener.cc
index 227283a..e9ee29e 100644
--- a/examples/stand_alone/listener/listener.cc
+++ b/examples/stand_alone/listener/listener.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,9 +33,7 @@ void cb(ConstWorldStatisticsPtr &_msg)
 int main(int _argc, char **_argv)
 {
   // Load gazebo
-  gazebo::load(_argc, _argv);
-
-  gazebo::run();
+  gazebo::setupClient(_argc, _argv);
 
   // Create our node for communication
   gazebo::transport::NodePtr node(new gazebo::transport::Node());
@@ -49,5 +47,5 @@ int main(int _argc, char **_argv)
     gazebo::common::Time::MSleep(10);
 
   // Make sure to shut everything down.
-  gazebo::transport::fini();
+  gazebo::shutdown();
 }
diff --git a/examples/stand_alone/publisher/CMakeLists.txt b/examples/stand_alone/publisher/CMakeLists.txt
index 3d05ddf..7d926f0 100644
--- a/examples/stand_alone/publisher/CMakeLists.txt
+++ b/examples/stand_alone/publisher/CMakeLists.txt
@@ -14,4 +14,4 @@ include_directories(${GAZEBO_INCLUDE_DIRS})
 link_directories(${GAZEBO_LIBRARY_DIRS})
 
 add_executable(publisher  publisher.cc)
-target_link_libraries(publisher  ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES} ${PROTOBUF_LIBRARIES})
+target_link_libraries(publisher  ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES} ${PROTOBUF_LIBRARIES} pthread)
diff --git a/examples/stand_alone/publisher/publisher.cc b/examples/stand_alone/publisher/publisher.cc
index f5cab04..f6d9d98 100644
--- a/examples/stand_alone/publisher/publisher.cc
+++ b/examples/stand_alone/publisher/publisher.cc
@@ -1,6 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
- * Copyright 2013 Dereck Wonnacott
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +18,7 @@
 #include <gazebo/gazebo.hh>
 #include <gazebo/transport/transport.hh>
 #include <gazebo/msgs/msgs.hh>
-#include <math/gzmath.hh>
+#include <gazebo/math/gzmath.hh>
 
 #include <iostream>
 
@@ -28,15 +27,12 @@
 int main(int _argc, char **_argv)
 {
   // Load gazebo
-  gazebo::load(_argc, _argv);
+  gazebo::setupClient(_argc, _argv);
 
   // Create our node for communication
   gazebo::transport::NodePtr node(new gazebo::transport::Node());
   node->Init();
 
-  // Start transport
-  gazebo::transport::run();
-
   // Publish to a Gazebo topic
   gazebo::transport::PublisherPtr pub =
     node->Advertise<gazebo::msgs::Pose>("~/pose_example");
@@ -61,5 +57,5 @@ int main(int _argc, char **_argv)
   }
 
   // Make sure to shut everything down.
-  gazebo::transport::fini();
+  gazebo::shutdown();
 }
diff --git a/gazebo/CMakeLists.txt b/gazebo/CMakeLists.txt
index accd36b..5cf4131 100644
--- a/gazebo/CMakeLists.txt
+++ b/gazebo/CMakeLists.txt
@@ -3,33 +3,22 @@ include_directories(SYSTEM
   ${OGRE_INCLUDE_DIRS}
   ${Boost_INCLUDE_DIRS}
   ${PROTOBUF_INCLUDE_DIR}
-)
-
-include_directories(
-  ${PROJECT_SOURCE_DIR}/gazebo
-  ${PROJECT_BINARY_DIR}/gazebo
+  ${SDF_INCLUDE_DIRS}
 )
 
 link_directories(
   ${ogre_library_dirs}
   ${Boost_LIBRARY_DIRS}
+  ${SDF_LIBRARY_DIRS}
   ${PROJECT_BINARY_DIR}/test
 )
 
-if(HAVE_URDFDOM_HEADERS)
-  link_directories(
-    ${urdfdom_LIBRARY_DIRS}
-    ${urdfdom_headers_LIBRARY_DIRS})
-endif(HAVE_URDFDOM_HEADERS)
-
-if(HAVE_CONSOLE_BRIDGE)
-  link_directories(
-    ${console_bridge_LIBRARY_DIRS})
-endif(HAVE_CONSOLE_BRIDGE)
+if (HAVE_BULLET)
+  link_directories(${BULLET_LIBRARY_DIRS})
+endif()
 
 add_subdirectory(msgs)
 add_subdirectory(math)
-add_subdirectory(sdf)
 add_subdirectory(transport)
 add_subdirectory(common)
 add_subdirectory(rendering)
@@ -43,71 +32,67 @@ add_dependencies(gazebo_physics_ode gazebo_msgs)
 add_dependencies(gazebo_gui gazebo_msgs)
 add_dependencies(gazebo_rendering gazebo_msgs)
 add_dependencies(gazebo_sensors gazebo_rendering)
+
 if(HAVE_BULLET)
   add_dependencies(gazebo_physics_bullet gazebo_msgs)
 endif()
-if (HAVE_Simbody)
+if (HAVE_SIMBODY)
   add_dependencies(gazebo_physics_simbody gazebo_msgs)
 endif()
+if(HAVE_DART)
+  add_dependencies(gazebo_physics_dart gazebo_msgs)
+endif()
+
 
-gz_add_executable(gzmaster master_main.cc Master.cc gazebo.cc)
 gz_add_executable(gzserver server_main.cc Server.cc Master.cc gazebo.cc)
 gz_add_executable(gazebo gazebo_main.cc Server.cc Master.cc gazebo.cc)
 
-
-target_link_libraries(gzmaster gazebo_common
-                               gazebo_transport
-                               gazebo_sdf_interface
-                               gazebo_msgs
-                               pthread
-)
-
-
-target_link_libraries(gzserver gazebo_common
-                               gazebo_util
-                               gazebo_sdf_interface
-                               gazebo_transport
-                               gazebo_physics
-                               gazebo_sensors
-                               gazebo_rendering
-                               gazebo_msgs
-                               pthread
+target_link_libraries(gzserver
+  gazebo_common
+  gazebo_util
+  gazebo_transport
+  gazebo_physics
+  gazebo_sensors
+  gazebo_rendering
+  gazebo_msgs
+  pthread
 )
 
-target_link_libraries(gazebo gazebo_common
-                             gazebo_util
-                             gazebo_sdf_interface
-                             gazebo_transport
-                             gazebo_physics
-                             gazebo_sensors
-                             gazebo_rendering
-                             gazebo_msgs
-                             gazebo_gui
-                             pthread
+target_link_libraries(gazebo
+  gazebo_common
+  gazebo_util
+  gazebo_transport
+  gazebo_physics
+  gazebo_sensors
+  gazebo_rendering
+  gazebo_msgs
+  gazebo_gui
+  pthread
 )
 
 if ("${CMAKE_BUILD_TYPE}" STREQUAL "CHECK")
   target_link_libraries(gzserver gcov)
 endif()
 
-
-gz_install_executable(gzmaster)
 gz_install_executable(gzserver)
 gz_install_executable(gazebo)
+manpage(gzserver 1)
+manpage(gazebo 1)
 
 gz_add_library(libgazebo Server.cc Master.cc gazebo.cc)
 set_target_properties(libgazebo PROPERTIES OUTPUT_NAME "gazebo")
 
-target_link_libraries(libgazebo gazebo_common
-                                gazebo_util
-                                gazebo_transport
-                                gazebo_physics
-                                gazebo_sensors
-                                gazebo_rendering
-                                gazebo_sdf_interface
-                                gazebo_msgs
-                                gazebo_math
-                                pthread)
+target_link_libraries(libgazebo
+  gazebo_common
+  gazebo_util
+  gazebo_transport
+  gazebo_physics
+  gazebo_sensors
+  gazebo_rendering
+  gazebo_msgs
+  gazebo_math
+  pthread
+)
 
 add_dependencies(libgazebo gazebo_msgs)
 gz_install_library(libgazebo)
diff --git a/gazebo/Master.cc b/gazebo/Master.cc
index 63f7585..b31f9d2 100644
--- a/gazebo/Master.cc
+++ b/gazebo/Master.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,11 +15,12 @@
  *
 */
 #include <google/protobuf/descriptor.h>
-#include "transport/IOManager.hh"
+#include <set>
+#include "gazebo/transport/IOManager.hh"
 
 #include "Master.hh"
 
-#include "gazebo_config.h"
+#include "gazebo/gazebo_config.h"
 
 using namespace gazebo;
 
@@ -29,32 +30,12 @@ Master::Master()
 {
   this->stop = false;
   this->runThread = NULL;
-
-  this->connectionMutex = new boost::recursive_mutex();
-  this->msgsMutex = new boost::recursive_mutex();
 }
 
 /////////////////////////////////////////////////
 Master::~Master()
 {
   this->Fini();
-
-  delete this->connectionMutex;
-  this->connectionMutex = NULL;
-
-  delete this->msgsMutex;
-  this->msgsMutex = NULL;
-
-  delete this->runThread;
-  this->runThread = NULL;
-
-  this->publishers.clear();
-  this->subscribers.clear();
-  this->connections.clear();
-
-  this->connection->Shutdown();
-  delete this->connection;
-  this->connection = NULL;
 }
 
 /////////////////////////////////////////////////
@@ -72,7 +53,7 @@ void Master::Init(uint16_t _port)
 }
 
 //////////////////////////////////////////////////
-void Master::OnAccept(const transport::ConnectionPtr &_newConnection)
+void Master::OnAccept(transport::ConnectionPtr _newConnection)
 {
   // Send the gazebo version string
   msgs::GzString versionMsg;
@@ -102,10 +83,9 @@ void Master::OnAccept(const transport::ConnectionPtr &_newConnection)
   _newConnection->EnqueueMsg(
       msgs::Package("publishers_init", publishersMsg), true);
 
-
   // Add the connection to our list
   {
-    boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+    boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
     int index = this->connections.size();
 
     this->connections[index] = _newConnection;
@@ -137,13 +117,14 @@ void Master::OnRead(const unsigned int _connectionIndex,
   // Store the message if it's not empty
   if (!_data.empty())
   {
-    boost::recursive_mutex::scoped_lock lock(*this->msgsMutex);
+    boost::recursive_mutex::scoped_lock lock(this->msgsMutex);
     this->msgs.push_back(std::make_pair(_connectionIndex, _data));
   }
   else
   {
-    gzerr << "Master got empty data message from["
-          << conn->GetRemotePort() << "]\n";
+    gzlog << "Master got empty data message from["
+          << conn->GetRemotePort() << "]. This is most likely fine, since"
+          << "the remote side probably terminated.\n";
   }
 }
 
@@ -170,7 +151,7 @@ void Master::ProcessMessage(const unsigned int _connectionIndex,
         worldNameMsg.data());
     if (iter == this->worldNames.end())
     {
-      boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+      boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
       this->worldNames.push_back(worldNameMsg.data());
 
       Connection_M::iterator iter2;
@@ -184,7 +165,7 @@ void Master::ProcessMessage(const unsigned int _connectionIndex,
   }
   else if (packet.type() == "advertise")
   {
-    boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+    boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
     msgs::Publish pub;
     pub.ParseFromString(packet.serialized_data());
 
@@ -205,7 +186,7 @@ void Master::ProcessMessage(const unsigned int _connectionIndex,
     {
       if (iter->first.topic() == pub.topic())
       {
-        iter->second->EnqueueMsg(msgs::Package("publisher_update", pub));
+        iter->second->EnqueueMsg(msgs::Package("publisher_advertise", pub));
       }
     }
   }
@@ -236,7 +217,7 @@ void Master::ProcessMessage(const unsigned int _connectionIndex,
     {
       if (iter->first.topic() == sub.topic())
       {
-        conn->EnqueueMsg(msgs::Package("publisher_update", iter->first));
+        conn->EnqueueMsg(msgs::Package("publisher_subscribe", iter->first));
       }
     }
   }
@@ -257,6 +238,35 @@ void Master::ProcessMessage(const unsigned int _connectionIndex,
       }
       conn->EnqueueMsg(msgs::Package("publisher_list", msg), true);
     }
+    else if (req.request() == "get_topics")
+    {
+      std::set<std::string> topics;
+      msgs::GzString_V msg;
+
+      // Add all topics that are published
+      for (PubList::iterator iter = this->publishers.begin();
+          iter != this->publishers.end(); ++iter)
+      {
+        topics.insert(iter->first.topic());
+      }
+
+      // Add all topics that are subscribed
+      for (SubList::iterator iter = this->subscribers.begin();
+           iter != this->subscribers.end(); ++iter)
+      {
+        topics.insert(iter->first.topic());
+      }
+
+      // Construct the message of only unique names
+      for (std::set<std::string>::iterator iter =
+          topics.begin(); iter != topics.end(); ++iter)
+      {
+        msg.add_data(*iter);
+      }
+
+      // Send the topic list message
+      conn->EnqueueMsg(msgs::Package("topic_list", msg), true);
+    }
     else if (req.request() == "topic_info")
     {
       msgs::Publish pub = this->GetPublisher(req.data());
@@ -283,6 +293,11 @@ void Master::ProcessMessage(const unsigned int _connectionIndex,
       {
         if (siter->first.topic() == req.data())
         {
+          // If the topic info message type has not been set or the
+          // topic info message type is an empty string, then set the topic
+          // info message type based on a subscriber's message type.
+          if (!ti.has_msg_type() || ti.msg_type().empty())
+            ti.set_msg_type(siter->first.msg_type());
           msgs::Subscribe *sub = ti.add_subscriber();
           sub->CopyFrom(siter->first);
         }
@@ -334,8 +349,8 @@ void Master::RunOnce()
 
   // Process the incoming message queue
   {
-    boost::recursive_mutex::scoped_lock lock(*this->msgsMutex);
-    while (this->msgs.size() > 0)
+    boost::recursive_mutex::scoped_lock lock(this->msgsMutex);
+    while (!this->msgs.empty())
     {
       this->ProcessMessage(this->msgs.front().first,
                            this->msgs.front().second);
@@ -345,7 +360,7 @@ void Master::RunOnce()
 
   // Process all the connections
   {
-    boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+    boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
     for (iter = this->connections.begin();
         iter != this->connections.end();)
     {
@@ -372,7 +387,7 @@ void Master::RemoveConnection(Connection_M::iterator _connIter)
 
   // Remove all messages for this connection
   {
-    boost::recursive_mutex::scoped_lock lock(*this->msgsMutex);
+    boost::recursive_mutex::scoped_lock lock(this->msgsMutex);
     msgIter = this->msgs.begin();
     while (msgIter != this->msgs.end())
     {
@@ -430,7 +445,7 @@ void Master::RemoveConnection(Connection_M::iterator _connIter)
 void Master::RemovePublisher(const msgs::Publish _pub)
 {
   {
-    boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+    boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
     Connection_M::iterator iter2;
     for (iter2 = this->connections.begin();
         iter2 != this->connections.end(); ++iter2)
@@ -509,6 +524,19 @@ void Master::Stop()
 void Master::Fini()
 {
   this->Stop();
+
+  if (this->connection)
+    this->connection->Shutdown();
+  this->connection.reset();
+
+  delete this->runThread;
+  this->runThread = NULL;
+
+  this->msgs.clear();
+  this->worldNames.clear();
+  this->connections.clear();
+  this->subscribers.clear();
+  this->publishers.clear();
 }
 
 //////////////////////////////////////////////////
@@ -540,7 +568,7 @@ transport::ConnectionPtr Master::FindConnection(const std::string &_host,
   Connection_M::iterator iter;
 
   {
-    boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+    boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
     for (iter = this->connections.begin();
         iter != this->connections.end(); ++iter)
     {
diff --git a/gazebo/Master.hh b/gazebo/Master.hh
index 01e9556..32546db 100644
--- a/gazebo/Master.hh
+++ b/gazebo/Master.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,16 +24,16 @@
 #include <map>
 #include <boost/shared_ptr.hpp>
 
-#include "msgs/msgs.hh"
-#include "transport/Connection.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/Connection.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   /// \class Master Master.hh gazebo_core.hh
-  /// \brief A ROS Master-like manager that directs gztopic connections, enables
-  ///        each gazebo network client to locate one another for peer-to-peer
-  ///        communication.
-  class Master
+  /// \brief A manager that directs topic connections, enables each gazebo
+  /// network client to locate one another for peer-to-peer communication.
+  class GAZEBO_VISIBLE Master
   {
     /// \def Map of unique id's to connections.
     typedef std::map<unsigned int, transport::ConnectionPtr> Connection_M;
@@ -80,7 +80,7 @@ namespace gazebo
 
     /// \brief Accept a new connection
     /// \param[in] _newConnection The new connection
-    private: void OnAccept(const transport::ConnectionPtr &_newConnection);
+    private: void OnAccept(transport::ConnectionPtr _newConnection);
 
     /// \brief Get a publisher for the given topic
     /// \param[in] _topic Name of the topic
@@ -134,7 +134,7 @@ namespace gazebo
     private: std::list<std::pair<unsigned int, std::string> > msgs;
 
     /// \brief Our server connection.
-    private: transport::Connection *connection;
+    private: transport::ConnectionPtr connection;
 
     /// \brief Thread to run the main loop.
     private: boost::thread *runThread;
@@ -143,10 +143,10 @@ namespace gazebo
     private: bool stop;
 
     /// \brief Mutex to protect connections.
-    private: boost::recursive_mutex *connectionMutex;
+    private: boost::recursive_mutex connectionMutex;
 
     /// \brief Mutex to protect msg bufferes.
-    private: boost::recursive_mutex *msgsMutex;
+    private: boost::recursive_mutex msgsMutex;
   };
 }
 #endif
diff --git a/gazebo/Server.cc b/gazebo/Server.cc
index 0de0d8f..34cfed6 100644
--- a/gazebo/Server.cc
+++ b/gazebo/Server.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,28 +19,31 @@
 #include <boost/lexical_cast.hpp>
 #include <boost/algorithm/string.hpp>
 
+#include <sdf/sdf.hh>
+
 #include "gazebo/gazebo.hh"
 #include "gazebo/transport/transport.hh"
 
-#include "gazebo/common/LogRecord.hh"
-#include "gazebo/common/LogPlay.hh"
-#include "gazebo/common/Timer.hh"
+#include "gazebo/util/LogRecord.hh"
+#include "gazebo/util/LogPlay.hh"
+#include "gazebo/common/ModelDatabase.hh"
 #include "gazebo/common/Exception.hh"
 #include "gazebo/common/Plugin.hh"
-#include "gazebo/common/Common.hh"
-
-#include "gazebo/sdf/sdf.hh"
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Events.hh"
 
-#include "gazebo/sensors/Sensors.hh"
+#include "gazebo/sensors/SensorsIface.hh"
 
 #include "gazebo/physics/PhysicsFactory.hh"
-#include "gazebo/physics/Physics.hh"
+#include "gazebo/physics/PhysicsIface.hh"
 #include "gazebo/physics/World.hh"
 #include "gazebo/physics/Base.hh"
 
 #include "gazebo/Master.hh"
 #include "gazebo/Server.hh"
 
+namespace po = boost::program_options;
 using namespace gazebo;
 
 bool Server::stop = true;
@@ -48,74 +51,76 @@ bool Server::stop = true;
 /////////////////////////////////////////////////
 Server::Server()
 {
-  this->receiveMutex = new boost::mutex();
-  gazebo::print_version();
-
-  if (signal(SIGINT, Server::SigInt) == SIG_ERR)
-    std::cerr << "signal(2) failed while setting up for SIGINT" << std::endl;
+  this->initialized = false;
 }
 
 /////////////////////////////////////////////////
 Server::~Server()
 {
   fflush(stdout);
-  delete this->receiveMutex;
-  delete this->master;
 }
 
 /////////////////////////////////////////////////
 void Server::PrintUsage()
 {
-  std::cerr << "Run the Gazebo server.\n\n"
-    << "Usage: gzserver [options] <world_file>\n\n";
+  std::cerr << "gzserver -- Run the Gazebo server.\n\n";
+  std::cerr << "`gzserver` [options] <world_file>\n\n";
+  std::cerr << "Gazebo server runs simulation and handles commandline "
+    << "options, starts a Master, runs World update and sensor generation "
+    << "loops.\n\n";
 }
 
 /////////////////////////////////////////////////
-bool Server::ParseArgs(int argc, char **argv)
+bool Server::ParseArgs(int _argc, char **_argv)
 {
-  // save a copy of argc and argv for consumption by system plugins
-  this->systemPluginsArgc = argc;
-  this->systemPluginsArgv = new char*[argc];
-  for (int i = 0; i < argc; ++i)
+  // Save a copy of argc and argv for consumption by system plugins
+  this->systemPluginsArgc = _argc;
+  this->systemPluginsArgv = new char*[_argc];
+  for (int i = 0; i < _argc; ++i)
   {
-    int argv_len = strlen(argv[i]);
-    this->systemPluginsArgv[i] = new char[argv_len];
-    for (int j = 0; j < argv_len; ++j)
-      this->systemPluginsArgv[i][j] = argv[i][j];
+    int argvLen = strlen(_argv[i]) + 1;
+    this->systemPluginsArgv[i] = new char[argvLen];
+    snprintf(this->systemPluginsArgv[i], argvLen, "%s", _argv[i]);
   }
 
-
-  po::options_description v_desc("Allowed options");
-  v_desc.add_options()
+  po::options_description visibleDesc("Options");
+  visibleDesc.add_options()
+    ("version,v", "Output version information.")
+    ("verbose", "Increase the messages written to the terminal.")
     ("help,h", "Produce this help message.")
     ("pause,u", "Start the server in a paused state.")
     ("physics,e", po::value<std::string>(),
-     "Specify a physics engine (ode|bullet).")
+     "Specify a physics engine (ode|bullet|dart|simbody).")
     ("play,p", po::value<std::string>(), "Play a log file.")
-    ("record,r", "Record state data to disk.")
+    ("record,r", "Record state data.")
+    ("record_encoding", po::value<std::string>()->default_value("zlib"),
+     "Compression encoding format for log data (zlib|bz2|txt).")
+    ("record_path", po::value<std::string>()->default_value(""),
+     "Absolute path in which to store state data")
     ("seed",  po::value<double>(),
      "Start with a given random number seed.")
+    ("iters",  po::value<unsigned int>(),
+     "Number of iterations to simulate.")
+    ("minimal_comms", "Reduce the TCP/IP traffic output by gzserver")
     ("server-plugin,s", po::value<std::vector<std::string> >(),
      "Load a plugin.");
 
-  po::options_description h_desc("Hidden options");
-  h_desc.add_options()
-    ("world_file", po::value<std::string>(), "SDF world to load.");
-
-  h_desc.add_options()
+  po::options_description hiddenDesc("Hidden options");
+  hiddenDesc.add_options()
+    ("world_file", po::value<std::string>(), "SDF world to load.")
     ("pass_through", po::value<std::vector<std::string> >(),
      "not used, passed through to system plugins.");
 
-  po::options_description desc("Allowed options");
-  desc.add(v_desc).add(h_desc);
+  po::options_description desc("Options");
+  desc.add(visibleDesc).add(hiddenDesc);
 
-  po::positional_options_description p_desc;
-  p_desc.add("world_file", 1).add("pass_through", -1);
+  po::positional_options_description positionalDesc;
+  positionalDesc.add("world_file", 1).add("pass_through", -1);
 
   try
   {
-    po::store(po::command_line_parser(argc, argv).options(desc).positional(
-          p_desc).allow_unregistered().run(), this->vm);
+    po::store(po::command_line_parser(_argc, _argv).options(desc).positional(
+          positionalDesc).allow_unregistered().run(), this->vm);
 
     po::notify(this->vm);
   }
@@ -127,6 +132,30 @@ bool Server::ParseArgs(int argc, char **argv)
     return false;
   }
 
+  if (this->vm.count("version"))
+  {
+    std::cout << GAZEBO_VERSION_HEADER << std::endl;
+    return false;
+  }
+
+  if (this->vm.count("help"))
+  {
+    this->PrintUsage();
+    std::cerr << visibleDesc << "\n";
+    return false;
+  }
+
+  if (this->vm.count("verbose"))
+  {
+    gazebo::printVersion();
+    gazebo::common::Console::SetQuiet(false);
+  }
+
+  if (this->vm.count("minimal_comms"))
+    gazebo::transport::setMinimalComms(true);
+  else
+    gazebo::transport::setMinimalComms(false);
+
   // Set the random number seed if present on the command line.
   if (this->vm.count("seed"))
   {
@@ -140,13 +169,6 @@ bool Server::ParseArgs(int argc, char **argv)
     }
   }
 
-  if (this->vm.count("help"))
-  {
-    this->PrintUsage();
-    std::cerr << v_desc << "\n";
-    return false;
-  }
-
   /// Load all the plugins specified on the command line
   if (this->vm.count("server-plugin"))
   {
@@ -156,19 +178,44 @@ bool Server::ParseArgs(int argc, char **argv)
     for (std::vector<std::string>::iterator iter = pp.begin();
          iter != pp.end(); ++iter)
     {
-      gazebo::add_plugin(*iter);
+      gazebo::addPlugin(*iter);
     }
   }
 
   // Set the parameter to record a log file
   if (this->vm.count("record"))
-    this->params["record"] = "bz2";
+  {
+    this->params["record"] = this->vm["record_path"].as<std::string>();
+    this->params["record_encoding"] =
+        this->vm["record_encoding"].as<std::string>();
+  }
+
+  if (this->vm.count("iters"))
+  {
+    try
+    {
+      this->params["iterations"] = boost::lexical_cast<std::string>(
+          this->vm["iters"].as<unsigned int>());
+    }
+    catch(...)
+    {
+      this->params["iterations"] = "0";
+      gzerr << "Unable to set iterations of [" <<
+        this->vm["iters"].as<unsigned int>() << "]\n";
+    }
+  }
 
   if (this->vm.count("pause"))
     this->params["pause"] = "true";
   else
     this->params["pause"] = "false";
 
+  if (!this->PreLoad())
+  {
+    gzerr << "Unable to load gazebo\n";
+    return false;
+  }
+
   // The following "if" block must be processed directly before
   // this->ProcessPrarams.
   //
@@ -178,19 +225,19 @@ bool Server::ParseArgs(int argc, char **argv)
   if (this->vm.count("play"))
   {
     // Load the log file
-    common::LogPlay::Instance()->Open(this->vm["play"].as<std::string>());
+    util::LogPlay::Instance()->Open(this->vm["play"].as<std::string>());
 
     gzmsg << "\nLog playback:\n"
       << "  Log Version: "
-      << common::LogPlay::Instance()->GetLogVersion() << "\n"
+      << util::LogPlay::Instance()->GetLogVersion() << "\n"
       << "  Gazebo Version: "
-      << common::LogPlay::Instance()->GetGazeboVersion() << "\n"
+      << util::LogPlay::Instance()->GetGazeboVersion() << "\n"
       << "  Random Seed: "
-      << common::LogPlay::Instance()->GetRandSeed() << "\n";
+      << util::LogPlay::Instance()->GetRandSeed() << "\n";
 
     // Get the SDF world description from the log file
     std::string sdfString;
-    common::LogPlay::Instance()->Step(sdfString);
+    util::LogPlay::Instance()->Step(sdfString);
 
     // Load the server
     if (!this->LoadString(sdfString))
@@ -216,7 +263,6 @@ bool Server::ParseArgs(int argc, char **argv)
   }
 
   this->ProcessParams();
-  this->Init();
 
   return true;
 }
@@ -224,7 +270,7 @@ bool Server::ParseArgs(int argc, char **argv)
 /////////////////////////////////////////////////
 bool Server::GetInitialized() const
 {
-  return !this->stop && !transport::is_stopped();
+  return !this->stop && this->initialized;
 }
 
 /////////////////////////////////////////////////
@@ -248,7 +294,7 @@ bool Server::LoadFile(const std::string &_filename,
     return false;
   }
 
-  if (!sdf::readFile(_filename, sdf))
+  if (!sdf::readFile(common::find_file(_filename), sdf))
   {
     gzerr << "Unable to read sdf file[" << _filename << "]\n";
     return false;
@@ -278,28 +324,16 @@ bool Server::LoadString(const std::string &_sdfString)
 }
 
 /////////////////////////////////////////////////
+bool Server::PreLoad()
+{
+  // setup gazebo
+  return gazebo::setupServer(this->systemPluginsArgc, this->systemPluginsArgv);
+}
+
+/////////////////////////////////////////////////
 bool Server::LoadImpl(sdf::ElementPtr _elem,
                       const std::string &_physics)
 {
-  std::string host = "";
-  unsigned int port = 0;
-
-  gazebo::transport::get_master_uri(host, port);
-
-  this->master = new gazebo::Master();
-  this->master->Init(port);
-  this->master->RunThread();
-
-
-  // Load gazebo
-  gazebo::load(this->systemPluginsArgc, this->systemPluginsArgv);
-
-  /// Load the sensors library
-  sensors::load();
-
-  /// Load the physics library
-  physics::load();
-
   // If a physics engine is specified,
   if (_physics.length())
   {
@@ -347,27 +381,36 @@ bool Server::LoadImpl(sdf::ElementPtr _elem,
   this->worldModPub =
     this->node->Advertise<msgs::WorldModify>("/gazebo/world/modify");
 
-  // Run the gazebo, starts a new thread
-  gazebo::run();
+  common::Time waitTime(1, 0);
+  int waitCount = 0;
+  int maxWaitCount = 10;
 
-  return true;
-}
-
-/////////////////////////////////////////////////
-void Server::Init()
-{
-  gazebo::init();
+  // Wait for namespaces.
+  while (!gazebo::transport::waitForNamespaces(waitTime) &&
+      (waitCount++) < maxWaitCount)
+  {
+    gzwarn << "Waited " << waitTime.Double() << "seconds for namespaces.\n";
+  }
 
-  sensors::init();
+  if (waitCount >= maxWaitCount)
+  {
+    gzerr << "Waited " << (waitTime * waitCount).Double()
+      << " seconds for namespaces. Giving up.\n";
+  }
 
   physics::init_worlds();
   this->stop = false;
+
+  return true;
 }
 
 /////////////////////////////////////////////////
 void Server::SigInt(int)
 {
   stop = true;
+
+  // Signal to plugins/etc that a shutdown event has occured
+  event::Events::sigInt();
 }
 
 /////////////////////////////////////////////////
@@ -380,22 +423,19 @@ void Server::Stop()
 void Server::Fini()
 {
   this->Stop();
-
-  gazebo::fini();
-
-  physics::fini();
-
-  sensors::fini();
-
-  if (this->master)
-    this->master->Fini();
-  delete this->master;
-  this->master = NULL;
+  gazebo::shutdown();
 }
 
 /////////////////////////////////////////////////
 void Server::Run()
 {
+  // Now that we're about to run, install a signal handler to allow for
+  // graceful shutdown on Ctrl-C.
+  struct sigaction sigact;
+  sigact.sa_handler = Server::SigInt;
+  if (sigaction(SIGINT, &sigact, NULL))
+    std::cerr << "sigaction(2) failed while setting up for SIGINT" << std::endl;
+
   if (this->stop)
     return;
 
@@ -406,27 +446,37 @@ void Server::Run()
   // Run the sensor threads
   sensors::run_threads();
 
+  unsigned int iterations = 0;
+  common::StrStr_M::iterator piter = this->params.find("iterations");
+  if (piter != this->params.end())
+  {
+    try
+    {
+      iterations = boost::lexical_cast<unsigned int>(piter->second);
+    }
+    catch(...)
+    {
+      iterations = 0;
+      gzerr << "Unable to cast iterations[" << piter->second << "] "
+        << "to unsigned integer\n";
+    }
+  }
+
   // Run each world. Each world starts a new thread
-  physics::run_worlds();
+  physics::run_worlds(iterations);
+
+  this->initialized = true;
 
   // Update the sensors.
-  while (!this->stop)
+  while (!this->stop && physics::worlds_running())
   {
     this->ProcessControlMsgs();
     sensors::run_once();
     common::Time::MSleep(1);
   }
 
-  // Stop all the worlds
-  physics::stop_worlds();
-
-  sensors::stop();
-
-  // Stop gazebo
-  gazebo::stop();
-
-  // Stop the master
-  this->master->Stop();
+  // Shutdown gazebo
+  gazebo::shutdown();
 }
 
 /////////////////////////////////////////////////
@@ -461,7 +511,8 @@ void Server::ProcessParams()
     }
     else if (iter->first == "record")
     {
-      common::LogRecord::Instance()->Start(iter->second);
+      util::LogRecord::Instance()->Start(this->params["record_encoding"],
+                                         iter->second);
     }
   }
 }
@@ -477,7 +528,7 @@ void Server::SetParams(const common::StrStr_M &_params)
 /////////////////////////////////////////////////
 void Server::OnControl(ConstServerControlPtr &_msg)
 {
-  boost::mutex::scoped_lock lock(*this->receiveMutex);
+  boost::mutex::scoped_lock lock(this->receiveMutex);
   this->controlMsgs.push_back(*_msg);
 }
 
@@ -504,13 +555,20 @@ void Server::ProcessControlMsgs()
     {
       this->OpenWorld((*iter).open_filename());
     }
+    else if ((*iter).has_stop() && (*iter).stop())
+    {
+      this->Stop();
+    }
   }
   this->controlMsgs.clear();
 }
 
 /////////////////////////////////////////////////
-bool Server::OpenWorld(const std::string &_filename)
+bool Server::OpenWorld(const std::string & /*_filename*/)
 {
+  gzerr << "Open World is not implemented\n";
+  return false;
+/*
   sdf::SDFPtr sdf(new sdf::SDF);
   if (!sdf::init(sdf))
   {
@@ -552,4 +610,5 @@ bool Server::OpenWorld(const std::string &_filename)
   worldMsg.set_create(true);
   this->worldModPub->Publish(worldMsg);
   return true;
+  */
 }
diff --git a/gazebo/Server.hh b/gazebo/Server.hh
index 84058df..2d6301b 100644
--- a/gazebo/Server.hh
+++ b/gazebo/Server.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,19 +18,17 @@
 #define _SERVER_HH_
 
 #include <string>
-#include <vector>
 #include <list>
-#include <map>
 
 #include <boost/program_options.hpp>
 #include <boost/thread.hpp>
 
-#include "transport/TransportTypes.hh"
-#include "common/CommonTypes.hh"
-#include "physics/PhysicsTypes.hh"
-#include "physics/World.hh"
+#include <sdf/sdf.hh>
 
-namespace po = boost::program_options;
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
@@ -44,63 +42,113 @@ namespace gazebo
   /// \class Master Master.hh gazebo_core.hh
   /// \brief Base class for simulation server that handles commandline options,
   /// starts a Master, runs World update and sensor generation loops.
-  class Server
+  class GAZEBO_VISIBLE Server
   {
+    /// \brief Constructor.
     public: Server();
+
+    /// \brief Destructor.
     public: virtual ~Server();
 
+    /// \brief Output help about gzserver.
     public: void PrintUsage();
-    public: bool ParseArgs(int argc, char **argv);
+
+    /// \brief Parse command line arguments.
+    /// \param[in] _argc Number of arguments.
+    /// \param[in] _argv Array of argument values.
+    /// \return True on success.
+    public: bool ParseArgs(int _argc, char **_argv);
+
+    /// \brief Preload the server.
+    /// \return True if load was successful.
+    public: bool PreLoad();
 
     /// \brief Load a world file and optionally override physics engine type.
     /// \param[in] _filename Name of the world file to load.
-    /// \param[in] _physics Type of physics engine to use (ode|bullet).
+    /// \param[in] _physics Physics engine type (ode|bullet|dart|simbody).
+    /// \return True on success.
     public: bool LoadFile(const std::string &_filename="worlds/empty.world",
                           const std::string &_physics="");
 
+    /// \brief Load the Server from an SDF string.
+    /// \param[in] _sdfString SDF string from which to load a World.
+    /// \return True on success.
     public: bool LoadString(const std::string &_sdfString);
-    public: void Init();
+
+    /// \brief Run the Server.
     public: void Run();
+
+    /// \brief Stop the Server.
     public: void Stop();
+
+    /// \brief Finalize the Server.
     public: void Fini();
 
-    public: void SetParams(const common::StrStr_M &params);
+    /// \brief Set the parameters.
+    /// \param[in] _params Map of string parameters
+    public: void SetParams(const common::StrStr_M &_params);
 
+    /// \brief Get whether the Server has been initialized.
+    /// \return True if initialized.
     public: bool GetInitialized() const;
 
     /// \brief Load implementation.
     /// \param[in] _elem Description of the world to load.
-    /// \param[in] _physics Type of physics engine to use (ode|bullet).
+    /// \param[in] _physics Physics engine type (ode|bullet|dart|simbody).
     private: bool LoadImpl(sdf::ElementPtr _elem,
                            const std::string &_physics="");
 
+    /// \brief SIGINT handler
+    /// \param[in] _v Unused.
     private: static void SigInt(int _v);
 
+    /// \brief Process all command line parameters.
     private: void ProcessParams();
 
+    /// \brief Receive a control message, and push it onto a queue.
+    /// \param[in] _msg Message that is received.
     private: void OnControl(ConstServerControlPtr &_msg);
 
+    /// \brief Open a new world.
+    /// \param[in] _filename Name and path of the world to open.
+    /// \return True on success.
     private: bool OpenWorld(const std::string &_filename);
 
+    /// \brief Handle all control messages.
     private: void ProcessControlMsgs();
 
+    /// \brief Boolean used to stop the server.
     private: static bool stop;
 
-    private: Master *master;
-    private: boost::thread *masterThread;
+    /// \brief Communication node.
     private: transport::NodePtr node;
+
+    /// \brief Subscribe to server control messages.
     private: transport::SubscriberPtr serverSub;
+
+    /// \brief Publisher for world modifications.
     private: transport::PublisherPtr worldModPub;
 
-    private: boost::mutex *receiveMutex;
+    /// \brief Mutex to protect controlMsgs.
+    private: boost::mutex receiveMutex;
+
+    /// \brief List of received control messages.
     private: std::list<msgs::ServerControl> controlMsgs;
 
+    /// \brief Command line params that are passed to various Gazebo objects.
     private: gazebo::common::StrStr_M params;
-    private: po::variables_map vm;
 
-    // save argc and argv for access by system plugins
-    public: int systemPluginsArgc;
-    public: char** systemPluginsArgv;
+    /// \brief Boost program options variable map.
+    private: boost::program_options::variables_map vm;
+
+    /// \brief True when initialized.
+    private: bool initialized;
+
+    /// \brief Save argc for access by system plugins.
+    private: int systemPluginsArgc;
+
+    /// \brief Save argv for access by system plugins.
+    private: char **systemPluginsArgv;
   };
 }
 
diff --git a/gazebo/common/Animation.cc b/gazebo/common/Animation.cc
index 6f0652f..f4a505d 100644
--- a/gazebo/common/Animation.cc
+++ b/gazebo/common/Animation.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,11 +16,11 @@
 */
 #include <algorithm>
 
-#include "math/Spline.hh"
-#include "math/RotationSpline.hh"
-#include "common/Console.hh"
-#include "common/KeyFrame.hh"
-#include "common/Animation.hh"
+#include "gazebo/math/Spline.hh"
+#include "gazebo/math/RotationSpline.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/KeyFrame.hh"
+#include "gazebo/common/Animation.hh"
 
 using namespace gazebo;
 using namespace common;
diff --git a/gazebo/common/Animation.hh b/gazebo/common/Animation.hh
index 1589e25..4c7c1af 100644
--- a/gazebo/common/Animation.hh
+++ b/gazebo/common/Animation.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 
 #include <string>
 #include <vector>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -43,7 +44,7 @@ namespace gazebo
     /// \class Animation Animation.hh common/common.hh
     /// \brief Manages an animation, which is a collection of keyframes and
     /// the ability to interpolate between the keyframes
-    class Animation
+    class GAZEBO_VISIBLE Animation
     {
       /// \brief Constructor
       /// \param[in] _name Name of the animation, should be unique
@@ -121,7 +122,7 @@ namespace gazebo
     /// \{
 
     /// \brief A pose animation.
-    class PoseAnimation : public Animation
+    class GAZEBO_VISIBLE PoseAnimation : public Animation
     {
       /// \brief Constructor
       /// \param[in] _name String name of the animation. This should be unique.
@@ -163,7 +164,7 @@ namespace gazebo
     /// \{
 
     /// \brief A numeric animation.
-    class NumericAnimation : public Animation
+    class GAZEBO_VISIBLE NumericAnimation : public Animation
     {
       /// \brief Constructor
       /// \param[in] _name String name of the animation. This should be unique.
diff --git a/gazebo/common/Animation_TEST.cc b/gazebo/common/Animation_TEST.cc
index 0963337..785b977 100644
--- a/gazebo/common/Animation_TEST.cc
+++ b/gazebo/common/Animation_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,10 +21,13 @@
 #include "gazebo/math/Quaternion.hh"
 #include "gazebo/common/KeyFrame.hh"
 #include "gazebo/common/Animation.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(AnimationTest, PoseAnimation)
+class AnimationTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(AnimationTest, PoseAnimation)
 {
   {
     common::PoseAnimation anim("test", 1.0, true);
@@ -76,7 +79,7 @@ TEST(AnimationTest, PoseAnimation)
       math::Quaternion(0.0302776, 0.0785971, 0.109824));
 }
 
-TEST(AnimationTest, NumericAnimation)
+TEST_F(AnimationTest, NumericAnimation)
 {
   common::NumericAnimation anim("numeric_test", 10, false);
   common::NumericKeyFrame *key = anim.CreateKeyFrame(0.0);
diff --git a/gazebo/common/Assert.cc b/gazebo/common/Assert.cc
index 597dd99..36f63b3 100644
--- a/gazebo/common/Assert.cc
+++ b/gazebo/common/Assert.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
 */
 #include <inttypes.h>
 #include "Assert.hh"
-#include "common/Exception.hh"
+#include "gazebo/common/Exception.hh"
 
 /*
  * When using the flag BOOST_ENABLE_ASSERT_HANDLER, the boost functions
diff --git a/gazebo/common/Assert.hh b/gazebo/common/Assert.hh
index 71a24db..eefccca 100644
--- a/gazebo/common/Assert.hh
+++ b/gazebo/common/Assert.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/common/AudioDecoder.cc b/gazebo/common/AudioDecoder.cc
new file mode 100644
index 0000000..a7eaa65
--- /dev/null
+++ b/gazebo/common/AudioDecoder.cc
@@ -0,0 +1,264 @@
+/*
+* Copyright (C) 2012-2014 Open Source Robotics Foundation
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+#include <gazebo/gazebo_config.h>
+#include <gazebo/common/AudioDecoder.hh>
+#include <gazebo/common/Console.hh>
+#include <gazebo/common/ffmpeg_inc.h>
+
+#define AUDIO_INBUF_SIZE (20480 * 2)
+#define AUDIO_REFILL_THRESH 4096
+
+using namespace gazebo;
+using namespace common;
+
+/////////////////////////////////////////////////
+AudioDecoder::AudioDecoder()
+{
+  this->formatCtx = NULL;
+  this->codecCtx = NULL;
+  this->codec = NULL;
+  this->audioStream = 0;
+}
+
+/////////////////////////////////////////////////
+AudioDecoder::~AudioDecoder()
+{
+  this->Cleanup();
+}
+
+/////////////////////////////////////////////////
+void AudioDecoder::Cleanup()
+{
+#ifdef HAVE_FFMPEG
+  // Close the codec
+  if (this->codecCtx)
+    avcodec_close(this->codecCtx);
+
+  // Close the audio file
+  if (this->formatCtx)
+    avformat_close_input(&this->formatCtx);
+#endif
+}
+
+/////////////////////////////////////////////////
+#ifdef HAVE_FFMPEG
+bool AudioDecoder::Decode(uint8_t **_outBuffer, unsigned int *_outBufferSize)
+{
+  AVPacket packet, packet1;
+  int bytesDecoded = 0;
+  unsigned int maxBufferSize = 0;
+  AVFrame *decodedFrame = NULL;
+
+  if (this->codec == NULL)
+  {
+    gzerr << "Set an audio file before decoding.\n";
+    return false;
+  }
+
+  if (_outBufferSize == NULL)
+  {
+    gzerr << "outBufferSize is NULL!!\n";
+    return false;
+  }
+
+  *_outBufferSize = 0;
+
+  if (*_outBuffer)
+  {
+    delete [] *_outBuffer;
+    *_outBuffer = NULL;
+  }
+
+  bool result = true;
+
+  if (!decodedFrame)
+  {
+    if (!(decodedFrame = avcodec_alloc_frame()))
+    {
+      gzerr << "Audio decoder out of memory\n";
+      result = false;
+    }
+  }
+  else
+    avcodec_get_frame_defaults(decodedFrame);
+
+  av_init_packet(&packet);
+  while (av_read_frame(this->formatCtx, &packet) == 0)
+  {
+    if (packet.stream_index == this->audioStream)
+    {
+      int gotFrame = 0;
+
+      packet1 = packet;
+      while (packet1.size)
+      {
+        // Some frames rely on multiple packets, so we have to make sure
+        // the frame is finished before we can use it
+        bytesDecoded = avcodec_decode_audio4(this->codecCtx, decodedFrame,
+            &gotFrame, &packet1);
+
+        if (gotFrame)
+        {
+          // Total size of the data. Some padding can be added to
+          // decodedFrame->data[0], which is why we can't use
+          // decodedFrame->linesize[0].
+          int size = decodedFrame->nb_samples *
+            av_get_bytes_per_sample(this->codecCtx->sample_fmt) *
+            this->codecCtx->channels;
+
+          // Resize the audio buffer as necessary
+          if (*_outBufferSize + size > maxBufferSize)
+          {
+            maxBufferSize += size * 5;
+            *_outBuffer = reinterpret_cast<uint8_t*>(realloc(*_outBuffer,
+                  maxBufferSize * sizeof(*_outBuffer[0])));
+          }
+
+          memcpy(*_outBuffer + *_outBufferSize, decodedFrame->data[0],
+              size);
+          *_outBufferSize += size;
+        }
+
+        packet1.data += bytesDecoded;
+        packet1.size -= bytesDecoded;
+      }
+    }
+    av_free_packet(&packet);
+  }
+
+  av_free_packet(&packet);
+
+  // Seek to the beginning so that it can be decoded again, if necessary.
+  av_seek_frame(this->formatCtx, this->audioStream, 0, 0);
+
+  return result;
+}
+#else
+bool AudioDecoder::Decode(uint8_t ** /*_outBuffer*/,
+    unsigned int * /*_outBufferSize*/)
+{
+  return true;
+}
+#endif
+
+/////////////////////////////////////////////////
+int AudioDecoder::GetSampleRate()
+{
+#ifdef HAVE_FFMPEG
+  return this->codecCtx->sample_rate;
+#else
+  return 0;
+#endif
+}
+
+/////////////////////////////////////////////////
+#ifdef HAVE_FFMPEG
+bool AudioDecoder::SetFile(const std::string &_filename)
+{
+  unsigned int i;
+
+  this->formatCtx = avformat_alloc_context();
+
+  // Open file
+  if (avformat_open_input(&this->formatCtx, _filename.c_str(), NULL, NULL) < 0)
+  {
+    gzerr << "Unable to open audio file[" << _filename << "]\n";
+    this->formatCtx = NULL;
+    return false;
+  }
+
+  // Hide av logging
+  av_log_set_level(0);
+
+  // Retrieve some information
+  if (avformat_find_stream_info(this->formatCtx, NULL) < 0)
+  {
+    gzerr << "Unable to find stream info.\n";
+    avformat_close_input(&this->formatCtx);
+    this->formatCtx = NULL;
+
+    return false;
+  }
+
+  // Dump information about file onto standard error.
+  // dump_format(this->formatCtx, 0, "dump.txt", false);
+
+  // Find audio stream;
+  this->audioStream = -1;
+  for (i = 0; i < this->formatCtx->nb_streams; ++i)
+  {
+    if (this->formatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
+    {
+      this->audioStream = i;
+      break;
+    }
+  }
+
+  if (this->audioStream == -1)
+  {
+    gzerr << "Couldn't find audio stream.\n";
+    avformat_close_input(&this->formatCtx);
+    this->formatCtx = NULL;
+
+    return false;
+  }
+
+  // Get the audio stream codec
+  this->codecCtx = this->formatCtx->streams[audioStream]->codec;
+
+  // Find a decoder
+  this->codec = avcodec_find_decoder(codecCtx->codec_id);
+
+  if (this->codec == NULL)
+  {
+    gzerr << "Couldn't find codec for audio stream.\n";
+    avformat_close_input(&this->formatCtx);
+    this->formatCtx = NULL;
+
+    return false;
+  }
+
+  if (this->codec->capabilities & CODEC_CAP_TRUNCATED)
+    this->codecCtx->flags |= CODEC_FLAG_TRUNCATED;
+
+  // Open codec
+  if (avcodec_open2(this->codecCtx, this->codec, NULL) < 0)
+  {
+    gzerr << "Couldn't open audio codec.\n";
+    avformat_close_input(&this->formatCtx);
+    this->formatCtx = NULL;
+
+    return false;
+  }
+
+  this->filename = _filename;
+
+  return true;
+}
+#else
+bool AudioDecoder::SetFile(const std::string & /*_filename*/)
+{
+  return false;
+}
+#endif
+
+/////////////////////////////////////////////////
+std::string AudioDecoder::GetFile() const
+{
+  return this->filename;
+}
diff --git a/gazebo/common/AudioDecoder.hh b/gazebo/common/AudioDecoder.hh
new file mode 100644
index 0000000..5886368
--- /dev/null
+++ b/gazebo/common/AudioDecoder.hh
@@ -0,0 +1,91 @@
+/*
+* Copyright (C) 2012-2014 Open Source Robotics Foundation
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*/
+
+#ifndef _GAZEBO_AUDIO_DECODER_HH_
+#define _GAZEBO_AUDIO_DECODER_HH_
+
+#include <stdint.h>
+#include <string>
+#include "gazebo/util/system.hh"
+
+struct AVFormatContext;
+struct AVCodecContext;
+struct AVCodec;
+
+namespace gazebo
+{
+  namespace common
+  {
+    /// \addtogroup gazebo_common Common
+    /// \{
+
+    /// \class AudioDecoder AudioDecoder.hh common/common.hh
+    /// \brief An audio decoder based on FFMPEG.
+    class GAZEBO_VISIBLE AudioDecoder
+    {
+      /// \brief Constructor.
+      public: AudioDecoder();
+
+      /// \brief Destructor.
+      public: virtual ~AudioDecoder();
+
+      /// \brief Set the file to decode.
+      /// \param[in] _filename Path to an audio file.
+      /// \return True if the file was successfull opened.
+      public: bool SetFile(const std::string &_filename);
+
+      /// \brief Get the audio filename that was set.
+      /// \return The name of the set audio file.
+      /// \sa AudioDecoder::SetFile
+      public: std::string GetFile() const;
+
+      /// \brief Decode the loaded audio file.
+      /// \sa AudioDecoder::SetFile
+      /// \param[out] _outBuffer Buffer that holds the decoded audio data.
+      /// \param[out] _outBufferSize Size of the _outBuffer.
+      /// \return True if decoding was succesful.
+      public: bool Decode(uint8_t **_outBuffer, unsigned int *_outBufferSize);
+
+      /// \brief Get the sample rate from the latest decoded file.
+      /// \return Integer sample rate, such as 44100.
+      public: int GetSampleRate();
+
+      /// \brief Free audio object, close files, streams.
+      private: void Cleanup();
+
+      /// \brief libav Format I/O context.
+      private: AVFormatContext *formatCtx;
+
+      /// \brief libav main external API structure.
+      private: AVCodecContext *codecCtx;
+
+      /// \brief libavcodec audio codec.
+      private: AVCodec *codec;
+
+      /// \brief Index of the audio stream.
+      private: int audioStream;
+
+      /// \brief True when initialized. We just want to initialize once..
+      private: static bool initialized;
+
+      /// \brief Audio file to decode.
+      private: std::string filename;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/common/AudioDecoder_TEST.cc b/gazebo/common/AudioDecoder_TEST.cc
new file mode 100644
index 0000000..83d2d38
--- /dev/null
+++ b/gazebo/common/AudioDecoder_TEST.cc
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gazebo/gazebo_config.h>
+
+#include <boost/filesystem.hpp>
+#include <gtest/gtest.h>
+#include <gazebo/common/ffmpeg_inc.h>
+
+#include "test_config.h"
+#include "gazebo/common/AudioDecoder.hh"
+#include "gazebo/common/CommonIface.hh"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class AudioDecoder : public gazebo::testing::AutoLogFixture { };
+
+/////////////////////////////////////////////////
+TEST_F(AudioDecoder, FileNotSet)
+{
+  common::AudioDecoder audio;
+  unsigned int dataBufferSize;
+  uint8_t *dataBuffer = NULL;
+  EXPECT_FALSE(audio.Decode(&dataBuffer, &dataBufferSize));
+}
+
+/////////////////////////////////////////////////
+TEST_F(AudioDecoder, MissingFile)
+{
+  common::AudioDecoder audio;
+  unsigned int dataBufferSize;
+  uint8_t *dataBuffer = NULL;
+  EXPECT_FALSE(audio.Decode(&dataBuffer, &dataBufferSize));
+}
+
+/////////////////////////////////////////////////
+TEST_F(AudioDecoder, BufferSizeInvalid)
+{
+  common::AudioDecoder audio;
+  boost::filesystem::path path;
+
+  common::load();
+
+  path = PROJECT_SOURCE_PATH;
+  path /= "media/audio/cheer.wav";
+  EXPECT_TRUE(audio.SetFile(path.string()));
+
+  unsigned int *dataBufferSize = NULL;
+  uint8_t *dataBuffer = NULL;
+  EXPECT_FALSE(audio.Decode(&dataBuffer, dataBufferSize));
+}
+
+/////////////////////////////////////////////////
+TEST_F(AudioDecoder, DataBuffer)
+{
+  boost::filesystem::path path;
+  common::AudioDecoder audio;
+
+  common::load();
+
+  path = PROJECT_SOURCE_PATH;
+  path /= "media/audio/cheer.wav";
+  EXPECT_TRUE(audio.SetFile(path.string()));
+
+  unsigned int dataBufferSize;
+  uint8_t *dataBuffer = NULL;
+  EXPECT_TRUE(audio.Decode(&dataBuffer, &dataBufferSize));
+
+  unsigned int dataBufferSize2;
+  uint8_t *dataBuffer2 = new uint8_t[5];
+  EXPECT_TRUE(audio.Decode(&dataBuffer2, &dataBufferSize2));
+
+  EXPECT_EQ(dataBufferSize2, dataBufferSize);
+  EXPECT_EQ(sizeof(dataBuffer), sizeof(dataBuffer2));
+}
+
+/////////////////////////////////////////////////
+TEST_F(AudioDecoder, NoCodec)
+{
+  common::load();
+  common::AudioDecoder audio;
+  boost::filesystem::path path;
+
+  path = TEST_PATH;
+  path /= "/data/audio_bad_codec.mp4";
+  EXPECT_FALSE(audio.SetFile(path.string()));
+}
+
+/////////////////////////////////////////////////
+TEST_F(AudioDecoder, CheerFile)
+{
+  common::load();
+  common::AudioDecoder audio;
+  boost::filesystem::path path;
+
+  // Test a bad filename
+  EXPECT_FALSE(audio.SetFile("_bad_audio_filename_.wav"));
+
+  // Test no stream info
+  path = TEST_PATH;
+  path /= "data/audio_bad_codec.grf";
+  EXPECT_FALSE(audio.SetFile(path.string()));
+
+  // Test a valid file without an audio stream
+  path = TEST_PATH;
+  path /= "data/empty_audio.mp4";
+  EXPECT_FALSE(audio.SetFile(path.string()));
+
+  unsigned int dataBufferSize;
+  uint8_t *dataBuffer = NULL;
+
+  // WAV
+  {
+    path = PROJECT_SOURCE_PATH;
+    path /= "media/audio/cheer.wav";
+    EXPECT_TRUE(audio.SetFile(path.string()));
+    EXPECT_EQ(audio.GetFile(), path.string());
+    EXPECT_EQ(audio.GetSampleRate(), 48000);
+
+    audio.Decode(&dataBuffer, &dataBufferSize);
+    EXPECT_EQ(dataBufferSize, 5428692u);
+  }
+
+  // OGG
+  {
+    path = PROJECT_SOURCE_PATH;
+    path /= "media/audio/cheer.ogg";
+    EXPECT_TRUE(audio.SetFile(path.string()));
+    EXPECT_EQ(audio.GetFile(), path.string());
+    EXPECT_EQ(audio.GetSampleRate(), 44100);
+
+    audio.Decode(&dataBuffer, &dataBufferSize);
+    EXPECT_EQ(dataBufferSize, 4989184u);
+  }
+
+  // MP3
+  {
+    path = PROJECT_SOURCE_PATH;
+    path /= "media/audio/cheer.mp3";
+    EXPECT_TRUE(audio.SetFile(path.string()));
+    EXPECT_EQ(audio.GetFile(), path.string());
+    EXPECT_EQ(audio.GetSampleRate(), 44100);
+
+    audio.Decode(&dataBuffer, &dataBufferSize);
+    EXPECT_EQ(dataBufferSize, 4995072u);
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/common/BVHLoader.cc b/gazebo/common/BVHLoader.cc
index 41cb888..6a913fd 100644
--- a/gazebo/common/BVHLoader.cc
+++ b/gazebo/common/BVHLoader.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,14 +20,14 @@
 
 #include <boost/algorithm/string.hpp>
 
-#include "common/Common.hh"
-#include "common/BVHLoader.hh"
-#include "common/SystemPaths.hh"
-#include "common/Skeleton.hh"
-#include "common/SkeletonAnimation.hh"
-#include "common/Console.hh"
-#include "math/Matrix3.hh"
-#include "math/Angle.hh"
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/BVHLoader.hh"
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/common/Skeleton.hh"
+#include "gazebo/common/SkeletonAnimation.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/math/Matrix3.hh"
+#include "gazebo/math/Angle.hh"
 
 using namespace gazebo;
 using namespace common;
diff --git a/gazebo/common/BVHLoader.hh b/gazebo/common/BVHLoader.hh
index 947cc72..979026a 100644
--- a/gazebo/common/BVHLoader.hh
+++ b/gazebo/common/BVHLoader.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +21,8 @@
 #include <map>
 #include <string>
 
-#include "math/Pose.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/util/system.hh"
 
 #define X_POSITION 0
 #define Y_POSITION 1
@@ -41,7 +42,7 @@ namespace gazebo
 
     /// \class BVHLoader BVHLoader.hh common/common.hh
     /// \brief Handles loading BVH animation files
-    class BVHLoader
+    class GAZEBO_VISIBLE BVHLoader
     {
       /// \brief Constructor
       public: BVHLoader();
diff --git a/gazebo/common/Base64.cc b/gazebo/common/Base64.cc
new file mode 100644
index 0000000..4f31335
--- /dev/null
+++ b/gazebo/common/Base64.cc
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/*
+   base64.cpp and base64.h
+
+   Copyright (C) 2004-2008 René Nyffenegger
+
+   This source code is provided 'as-is', without any express or implied
+   warranty. In no event will the author be held liable for any damages
+   arising from the use of this software.
+
+   Permission is granted to anyone to use this software for any purpose,
+   including commercial applications, and to alter it and redistribute it
+   freely, subject to the following restrictions:
+
+   1. The origin of this source code must not be misrepresented; you must not
+   claim that you wrote the original source code. If you use this source code
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+
+   2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original source code.
+
+   3. This notice may not be removed or altered from any source distribution.
+
+   René Nyffenegger rene.nyffenegger at adp-gmbh.ch
+*/
+#include "gazebo/common/Base64.hh"
+
+static const std::string base64Chars =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+"abcdefghijklmnopqrstuvwxyz"
+"0123456789+/";
+
+/////////////////////////////////////////////////
+static inline bool IsBase64(unsigned char _c)
+{
+  return (isalnum(_c) || (_c == '+') || (_c == '/'));
+}
+
+/////////////////////////////////////////////////
+void Base64Encode(const char *_bytesToEncode, unsigned int _inLen,
+    std::string &_result)
+{
+  int i = 0;
+  unsigned char charArray3[3];
+  unsigned char charArray4[4];
+
+  while (_inLen--)
+  {
+    charArray3[i++] = *(_bytesToEncode++);
+    if (i == 3)
+    {
+      charArray4[0] = (charArray3[0] & 0xfc) >> 2;
+      charArray4[1] = ((charArray3[0] & 0x03) << 4) +
+        ((charArray3[1] & 0xf0) >> 4);
+      charArray4[2] = ((charArray3[1] & 0x0f) << 2) +
+        ((charArray3[2] & 0xc0) >> 6);
+      charArray4[3] = charArray3[2] & 0x3f;
+
+      for (i = 0; i < 4; ++i)
+        _result += base64Chars[charArray4[i]];
+      i = 0;
+    }
+  }
+
+  if (i)
+  {
+    for (int j = i; j < 3; ++j)
+      charArray3[j] = '\0';
+
+    charArray4[0] = (charArray3[0] & 0xfc) >> 2;
+    charArray4[1] = ((charArray3[0] & 0x03) << 4) +
+      ((charArray3[1] & 0xf0) >> 4);
+    charArray4[2] = ((charArray3[1] & 0x0f) << 2) +
+      ((charArray3[2] & 0xc0) >> 6);
+    charArray4[3] = charArray3[2] & 0x3f;
+
+    for (int j = 0; (j < i + 1); ++j)
+      _result += base64Chars[charArray4[j]];
+
+    while ((i++ < 3))
+      _result += '=';
+  }
+}
+
+/////////////////////////////////////////////////
+std::string Base64Decode(const std::string &_encodedString)
+{
+  int inLen = _encodedString.size();
+  int i = 0;
+  int in = 0;
+  unsigned char charArray4[4], charArray3[3];
+  std::string ret;
+
+  while (inLen-- && (_encodedString[in] != '=') &&
+      IsBase64(_encodedString[in]))
+  {
+    charArray4[i++] = _encodedString[in];
+    in++;
+
+    if (i == 4)
+    {
+      for (i = 0; i < 4; ++i)
+        charArray4[i] = base64Chars.find(charArray4[i]);
+
+      charArray3[0] = (charArray4[0] << 2) +
+        ((charArray4[1] & 0x30) >> 4);
+      charArray3[1] = ((charArray4[1] & 0xf) << 4) +
+        ((charArray4[2] & 0x3c) >> 2);
+      charArray3[2] = ((charArray4[2] & 0x3) << 6) + charArray4[3];
+
+      for (i = 0; (i < 3); ++i)
+        ret += charArray3[i];
+      i = 0;
+    }
+  }
+
+  if (i)
+  {
+    for (int j = i; j <4; ++j)
+      charArray4[j] = 0;
+
+    for (int j = 0; j <4; ++j)
+      charArray4[j] = base64Chars.find(charArray4[j]);
+
+    charArray3[0] = (charArray4[0] << 2) + ((charArray4[1] & 0x30) >> 4);
+    charArray3[1] = ((charArray4[1] & 0xf) << 4) +
+      ((charArray4[2] & 0x3c) >> 2);
+    charArray3[2] = ((charArray4[2] & 0x3) << 6) + charArray4[3];
+
+    for (int j = 0; (j < i - 1); ++j)
+      ret += charArray3[j];
+  }
+
+  return ret;
+}
diff --git a/gazebo/common/Base64.hh b/gazebo/common/Base64.hh
new file mode 100644
index 0000000..6013003
--- /dev/null
+++ b/gazebo/common/Base64.hh
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _BASE_64_HH_
+#define _BASE_64_HH_
+
+#include <string>
+#include "gazebo/util/system.hh"
+
+/// \brief Encode a binary string into base 64.
+/// \param[in] _bytesToEncode String of bytes to encode.
+/// \param[in] _len Length of _bytesToEncode.
+/// \param[out] _result Based64 string is appended to this string.
+GAZEBO_VISIBLE
+void Base64Encode(const char *_bytesToEncode, unsigned int _len,
+    std::string &_result);
+
+
+/// \brief Decode a base64 string.
+/// \param[in] _encodedString A base 64 encoded string.
+/// \return The decoded string.
+GAZEBO_VISIBLE
+std::string Base64Decode(const std::string &_encodedString);
+#endif
diff --git a/gazebo/common/CMakeLists.txt b/gazebo/common/CMakeLists.txt
index b0c6620..3c63cdc 100644
--- a/gazebo/common/CMakeLists.txt
+++ b/gazebo/common/CMakeLists.txt
@@ -1,26 +1,36 @@
 include (${gazebo_cmake_dir}/GazeboUtils.cmake)
 
+if (HAVE_OPENAL)
+  include_directories(${OPENAL_INCLUDE_DIR})
+endif()
+
 if (HAVE_GTS)
   include_directories(${gts_INCLUDE_DIRS})
   link_directories(${gts_LIBRARY_DIRS})
   add_definitions(${gts_CFLAGS})
 endif()
 
-set (sources 
+if (HAVE_GDAL)
+  include_directories(${GDAL_INCLUDE_DIR})
+endif()
+
+set (sources
   Animation.cc
   Assert.cc
+  AudioDecoder.cc
+  Base64.cc
   BVHLoader.cc
   ColladaLoader.cc
   Color.cc
-  Common.cc
+  CommonIface.cc
   Console.cc
+  Dem.cc
   Event.cc
   Events.cc
   Exception.cc
   Image.cc
+  ImageHeightmap.cc
   KeyFrame.cc
-  LogPlay.cc
-  LogRecord.cc
   Material.cc
   Mesh.cc
   MeshLoader.cc
@@ -29,6 +39,7 @@ set (sources
   PID.cc
   SkeletonAnimation.cc
   Skeleton.cc
+  SphericalCoordinates.cc
   STLLoader.cc
   SystemPaths.cc
   Time.cc
@@ -36,38 +47,48 @@ set (sources
   Video.cc
 )
 
-set (headers 
+set (headers
   Animation.hh
   Assert.hh
+  AudioDecoder.hh
+  Base64.hh
   BVHLoader.hh
   ColladaLoader.hh
-  Common.hh
+  CommonIface.hh
   CommonTypes.hh
   Color.hh
   Console.hh
+  Dem.hh
+  DemPrivate.hh
   Event.hh
   Events.hh
   Exception.hh
+  MovingWindowFilter.hh
+  HeightmapData.hh
   Image.hh
+  ImageHeightmap.hh
+  KeyEvent.hh
   KeyFrame.hh
-  LogPlay.hh
-  LogRecord.hh
   Material.hh
   Mesh.hh
   MeshLoader.hh
   MeshManager.hh
+  ModelDatabase.hh
   MouseEvent.hh
   PID.hh
   Plugin.hh
   SkeletonAnimation.hh
   Skeleton.hh
   SingletonT.hh
+  SphericalCoordinates.hh
+  SphericalCoordinatesPrivate.hh
   STLLoader.hh
   SystemPaths.hh
   Time.hh
   Timer.hh
   UpdateInfo.hh
   Video.hh
+  ffmpeg_inc.h
  )
 
 if (HAVE_GTS)
@@ -85,42 +106,84 @@ set (gtest_sources
   Animation_TEST.cc
   ColladaLoader_TEST.cc
   Color_TEST.cc
+  CommonIface_TEST.cc
   Console_TEST.cc
+  Dem_TEST.cc
   Exception_TEST.cc
-  LogRecord_TEST.cc
+  Event_TEST.cc
+  Image_TEST.cc
+  ImageHeightmap_TEST.cc
   Material_TEST.cc
   Mesh_TEST.cc
-  Image_TEST.cc
+  MovingWindowFilter_TEST.cc
+  SphericalCoordinates_TEST.cc
   SystemPaths_TEST.cc
   Time_TEST.cc
 )
+
+if (HAVE_FFMPEG)
+  set (gtest_sources ${gtest_sources}
+                     AudioDecoder_TEST.cc)
+endif()
+
 gz_build_tests(${gtest_sources})
 
 set (common_headers "" CACHE INTERNAL "common headers" FORCE)
 foreach (hdr ${headers})
   APPEND_TO_CACHED_STRING(common_headers
-    "Common Headers" "#include \"common/${hdr}\"\n")
+    "Common Headers" "#include \"gazebo/common/${hdr}\"\n")
 endforeach()
 configure_file (${CMAKE_CURRENT_SOURCE_DIR}/common.hh.in ${CMAKE_CURRENT_BINARY_DIR}/common.hh )
 
 gz_add_library(gazebo_common ${sources})
 
-target_link_libraries(gazebo_common gazebo_math
-                                    ${libdl_library}
-                                    ${Boost_LIBRARIES}
-                                    ${freeimage_library}
-                                    ${tinyxml_libraries}
-                                    ${libavcodec_LIBRARIES}
-                                    ${libavformat_LIBRARIES}
-                                    ${CURL_LIBRARIES}
-                                    ${libswscale_LIBRARIES}
-                                    ${libtar_libraries}
-                                    rt
-                                    )
+set_property(
+  SOURCE SystemPaths.cc SystemPaths_TEST.cc ModelDatabase.cc
+  PROPERTY COMPILE_DEFINITIONS
+  GAZEBO_PLUGIN_PATH="${GAZEBO_PLUGIN_PATH}"
+  GAZEBO_RESOURCE_PATH="${GAZEBO_RESOURCE_PATH}"
+  GAZEBO_MODEL_DATABASE_URI="${GAZEBO_MODEL_DATABASE_URI}"
+  OGRE_RESOURCE_PATH="${OGRE_RESOURCE_PATH}"
+)
+
+link_directories( 
+  ${tinyxml_LIBRARY_DIRS}
+)
+
+target_link_libraries(gazebo_common
+  gazebo_math
+  ${libdl_library}
+  ${libtool_library}
+  ${Boost_LIBRARIES}
+  ${freeimage_LIBRARIES}
+  ${tinyxml_LIBRARIES}
+  ${libavcodec_LIBRARIES}
+  ${libavformat_LIBRARIES}
+  ${libavutil_LIBRARIES}
+  ${CURL_LIBRARIES}
+  ${libswscale_LIBRARIES}
+  ${libtar_LIBRARIES}
+  ${TBB_LIBRARIES}
+  ${SDF_LIBRARIES}
+  pthread
+)
+
+if (NOT APPLE)
+  # rt is used for clock_gettime, which is not available on apple
+  target_link_libraries(gazebo_common rt)
+endif()
 
 if (HAVE_GTS)
   target_link_libraries(gazebo_common ${gts_LIBRARIES})
 endif()
 
+if (HAVE_OPENAL)
+  target_link_libraries(gazebo_common ${OPENAL_LIBRARY})
+endif()
+
+if (HAVE_GDAL)
+  target_link_libraries(gazebo_common ${GDAL_LIBRARY})
+endif()
+
 gz_install_library(gazebo_common)
 gz_install_includes("common" ${headers} ${CMAKE_CURRENT_BINARY_DIR}/common.hh)
diff --git a/gazebo/common/ColladaLoader.cc b/gazebo/common/ColladaLoader.cc
index a66374c..b4a43b4 100644
--- a/gazebo/common/ColladaLoader.cc
+++ b/gazebo/common/ColladaLoader.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,20 +21,20 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/lexical_cast.hpp>
 
-#include "math/Helpers.hh"
-#include "math/Angle.hh"
-#include "math/Vector2d.hh"
-#include "math/Vector3.hh"
-#include "math/Matrix4.hh"
-#include "math/Quaternion.hh"
-#include "common/Console.hh"
-#include "common/Material.hh"
-#include "common/Mesh.hh"
-#include "common/Skeleton.hh"
-#include "common/SkeletonAnimation.hh"
-#include "common/ColladaLoader.hh"
-#include "common/SystemPaths.hh"
-#include "common/Exception.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector2d.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Matrix4.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Material.hh"
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/Skeleton.hh"
+#include "gazebo/common/SkeletonAnimation.hh"
+#include "gazebo/common/ColladaLoader.hh"
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/common/Exception.hh"
 
 using namespace gazebo;
 using namespace common;
@@ -284,7 +284,7 @@ math::Matrix4 ColladaLoader::LoadNodeTransform(TiXmlElement *_elem)
 
 /////////////////////////////////////////////////
 void ColladaLoader::LoadController(TiXmlElement *_contrXml,
-      TiXmlElement *_skelXml, const math::Matrix4 _transform, Mesh *_mesh)
+      TiXmlElement *_skelXml, const math::Matrix4 &_transform, Mesh *_mesh)
 {
   Skeleton *skeleton = new Skeleton(this->LoadSkeletonNodes(_skelXml, NULL));
   _mesh->SetSkeleton(skeleton);
@@ -860,6 +860,9 @@ void ColladaLoader::LoadNormals(const std::string &_id,
     const math::Matrix4 &_transform,
     std::vector<math::Vector3> &_values)
 {
+  math::Matrix4 rotMat = _transform;
+  rotMat.SetTranslate(math::Vector3::Zero);
+
   TiXmlElement *normalsXml = this->GetElementId("source", _id);
   if (!normalsXml)
   {
@@ -882,7 +885,7 @@ void ColladaLoader::LoadNormals(const std::string &_id,
     iss >> vec.x >> vec.y >> vec.z;
     if (iss)
     {
-      vec = _transform * vec;
+      vec = rotMat * vec;
       vec.Normalize();
       _values.push_back(vec);
     }
diff --git a/gazebo/common/ColladaLoader.hh b/gazebo/common/ColladaLoader.hh
index 07de4ce..d8791b3 100644
--- a/gazebo/common/ColladaLoader.hh
+++ b/gazebo/common/ColladaLoader.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
 
 #include "gazebo/common/MeshLoader.hh"
 #include "gazebo/math/MathTypes.hh"
+#include "gazebo/util/system.hh"
 
 class TiXmlElement;
 
@@ -38,7 +39,7 @@ namespace gazebo
 
     /// \class ColladaLoader ColladaLoader.hh common/common.hh
     /// \brief Class used to load Collada mesh files
-    class ColladaLoader : public MeshLoader
+    class GAZEBO_VISIBLE ColladaLoader : public MeshLoader
     {
       /// \brief Constructor
       public: ColladaLoader();
@@ -57,7 +58,7 @@ namespace gazebo
       /// \param[in] _transform A tranform to apply
       /// \param[in,out] _mesh The mesh being loaded
       private: void LoadController(TiXmlElement *_contrXml,
-          TiXmlElement *_skelXml, const math::Matrix4 _transform, Mesh *_mesh);
+          TiXmlElement *_skelXml, const math::Matrix4 &_transform, Mesh *_mesh);
 
       /// \brief Load animations for a skeleton
       /// \param[in] _xml Animation XML instance
diff --git a/gazebo/common/ColladaLoader_TEST.cc b/gazebo/common/ColladaLoader_TEST.cc
index 16eef80..b3ba2fe 100644
--- a/gazebo/common/ColladaLoader_TEST.cc
+++ b/gazebo/common/ColladaLoader_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,11 +19,14 @@
 #include "test_config.h"
 #include "gazebo/common/Mesh.hh"
 #include "gazebo/common/ColladaLoader.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
+class ColladaLoader : public gazebo::testing::AutoLogFixture { };
+
 /////////////////////////////////////////////////
-TEST(ColladaLoader, LoadBox)
+TEST_F(ColladaLoader, LoadBox)
 {
   common::ColladaLoader loader;
   common::Mesh *mesh = loader.Load(
diff --git a/gazebo/common/Color.cc b/gazebo/common/Color.cc
index 8a80e66..c7b5cc6 100644
--- a/gazebo/common/Color.cc
+++ b/gazebo/common/Color.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,9 +22,9 @@
 #include <math.h>
 #include <algorithm>
 
-#include "math/Helpers.hh"
-#include "common/Console.hh"
-#include "common/Color.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Color.hh"
 
 using namespace gazebo;
 using namespace common;
@@ -396,12 +396,12 @@ void Color::SetFromABGR(const Color::ABGR _v)
 }
 
 //////////////////////////////////////////////////
-Color &Color::operator =(const Color &_pt)
+Color &Color::operator =(const Color &_clr)
 {
-  this->r = _pt.r;
-  this->g = _pt.g;
-  this->b = _pt.b;
-  this->a = _pt.a;
+  this->r = _clr.r;
+  this->g = _clr.g;
+  this->b = _clr.b;
+  this->a = _clr.a;
 
   return *this;
 }
@@ -510,18 +510,18 @@ const Color &Color::operator*=(const Color &pt)
 
 
 //////////////////////////////////////////////////
-bool Color::operator ==(const Color &pt) const
+bool Color::operator ==(const Color &_pt) const
 {
-  return math::equal(this->r, pt.r) &&
-         math::equal(this->g, pt.g) &&
-         math::equal(this->b, pt.b) &&
-         math::equal(this->a, pt.a);
+  return math::equal(this->r, _pt.r) &&
+         math::equal(this->g, _pt.g) &&
+         math::equal(this->b, _pt.b) &&
+         math::equal(this->a, _pt.a);
 }
 
 //////////////////////////////////////////////////
-bool Color::operator!=(const Color &pt) const
+bool Color::operator!=(const Color &_pt) const
 {
-  return !(*this == pt);
+  return !(*this == _pt);
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/common/Color.hh b/gazebo/common/Color.hh
index 3a112fd..b124450 100644
--- a/gazebo/common/Color.hh
+++ b/gazebo/common/Color.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,12 +19,13 @@
  * Date: 08 May 2009
  */
 
-#ifndef GAZEBO_COLOR_HH
-#define GAZEBO_COLOR_HH
+#ifndef _GAZEBO_COLOR_HH_
+#define _GAZEBO_COLOR_HH_
 
 #include <iostream>
 #include "gazebo/common/CommonTypes.hh"
 #include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class Color Color.hh common/common.hh
     /// \brief Defines a color
-    class Color
+    class GAZEBO_VISIBLE Color
     {
       /// \brief (1, 1, 1)
       public: static const Color White;
diff --git a/gazebo/common/Color_TEST.cc b/gazebo/common/Color_TEST.cc
index 7a0ebb2..764d737 100644
--- a/gazebo/common/Color_TEST.cc
+++ b/gazebo/common/Color_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,10 +18,13 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/common/Color.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(Color, Color)
+class Color : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(Color, Color)
 {
   common::Color clr(.1, .2, .3, 1.0);
   EXPECT_FLOAT_EQ(0.1f, clr.r);
diff --git a/gazebo/common/Common.cc b/gazebo/common/Common.cc
deleted file mode 100644
index ce5dc59..0000000
--- a/gazebo/common/Common.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
-#include "gazebo/common/SystemPaths.hh"
-#include "gazebo/common/Common.hh"
-
-using namespace gazebo;
-
-/////////////////////////////////////////////////
-void common::add_search_path_suffix(const std::string &_suffix)
-{
-  common::SystemPaths::Instance()->AddSearchPathSuffix(_suffix);
-}
-
-/////////////////////////////////////////////////
-std::string common::find_file(const std::string &_file, bool _searchLocalPath)
-{
-  return common::SystemPaths::Instance()->FindFile(_file, _searchLocalPath);
-}
-
-/////////////////////////////////////////////////
-std::string common::find_file_path(const std::string &_file)
-{
-  std::string filepath = common::find_file(_file);
-
-  boost::filesystem::path path(filepath);
-  if (boost::filesystem::is_directory(path))
-  {
-    return filepath;
-  }
-  else
-  {
-    int index = filepath.find_last_of("/");
-    return filepath.substr(0, index);
-  }
-}
diff --git a/gazebo/common/Common.hh b/gazebo/common/Common.hh
deleted file mode 100644
index c6c1a2e..0000000
--- a/gazebo/common/Common.hh
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#ifndef _COMMON_HH_
-#define _COMMON_HH_
-
-#include <string>
-
-namespace gazebo
-{
-  namespace common
-  {
-    /// \addtogroup gazebo_common
-    /// \{
-
-    /// \brief add path prefix to common::SystemPaths
-    void add_search_path_suffix(const std::string &_suffix);
-
-    /// \brief search for file in common::SystemPaths
-    /// \param[in] _file Name of the file to find.
-    /// \param[in] _searchLocalPath True to search in the current working
-    /// directory.
-    std::string find_file(const std::string &_file,
-                          bool _searchLocalPath = true);
-
-    /// \brief search for a file in common::SystemPaths
-    /// \param[in] _file the file name to look for
-    /// \return The path containing the file
-    std::string find_file_path(const std::string &_file);
-
-    /// \}
-  }
-}
-#endif
diff --git a/gazebo/common/CommonIface.cc b/gazebo/common/CommonIface.cc
new file mode 100644
index 0000000..875d559
--- /dev/null
+++ b/gazebo/common/CommonIface.cc
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include <gazebo/gazebo_config.h>
+#include <gazebo/common/ffmpeg_inc.h>
+
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/SystemPaths.hh"
+
+using namespace gazebo;
+
+/////////////////////////////////////////////////
+void common::load()
+{
+#ifdef HAVE_FFMPEG
+  static bool first = true;
+  if (first)
+  {
+    first = false;
+    avcodec_register_all();
+    av_register_all();
+  }
+#endif
+}
+
+/////////////////////////////////////////////////
+void common::add_search_path_suffix(const std::string &_suffix)
+{
+  common::SystemPaths::Instance()->AddSearchPathSuffix(_suffix);
+}
+
+/////////////////////////////////////////////////
+std::string common::find_file(const std::string &_file)
+{
+  return common::SystemPaths::Instance()->FindFile(_file, true);
+}
+
+/////////////////////////////////////////////////
+std::string common::find_file(const std::string &_file, bool _searchLocalPath)
+{
+  return common::SystemPaths::Instance()->FindFile(_file, _searchLocalPath);
+}
+
+/////////////////////////////////////////////////
+std::string common::find_file_path(const std::string &_file)
+{
+  std::string filepath = common::find_file(_file);
+
+  boost::filesystem::path path(filepath);
+  if (boost::filesystem::is_directory(path))
+  {
+    return filepath;
+  }
+  else
+  {
+    int index = filepath.find_last_of("/");
+    return filepath.substr(0, index);
+  }
+}
diff --git a/gazebo/common/CommonIface.hh b/gazebo/common/CommonIface.hh
new file mode 100644
index 0000000..4370ee2
--- /dev/null
+++ b/gazebo/common/CommonIface.hh
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _COMMONIFACE_HH_
+#define _COMMONIFACE_HH_
+
+#include <string>
+#include <vector>
+#include <boost/uuid/sha1.hpp>
+#include <iomanip>
+#include <sstream>
+
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace common
+  {
+    /// \addtogroup gazebo_common
+    /// \{
+
+    /// \brief Load the common library.
+    GAZEBO_VISIBLE
+    void load();
+
+    /// \brief add path sufix to common::SystemPaths
+    /// \param[in] _suffix The suffix to add.
+    GAZEBO_VISIBLE
+    void add_search_path_suffix(const std::string &_suffix);
+
+    /// \brief search for file in common::SystemPaths
+    /// \param[in] _file Name of the file to find.
+    /// \return The path containing the file.
+    GAZEBO_VISIBLE
+    std::string find_file(const std::string &_file);
+
+    /// \brief search for file in common::SystemPaths
+    /// \param[in] _file Name of the file to find.
+    /// \param[in] _searchLocalPath True to search in the current working
+    /// directory.
+    /// \return The path containing the file.
+    GAZEBO_VISIBLE
+    std::string find_file(const std::string &_file,
+                          bool _searchLocalPath);
+
+    /// \brief search for a file in common::SystemPaths
+    /// \param[in] _file the file name to look for.
+    /// \return The path containing the file.
+    GAZEBO_VISIBLE
+    std::string find_file_path(const std::string &_file);
+
+    /// \brief Compute the SHA1 hash of an array of bytes.
+    /// \param[in] _buffer Input sequence. The permitted data types for this
+    /// function are std::string and any STL container.
+    /// \return The string representation (40 character) of the SHA1 hash.
+    template<typename T>
+    GAZEBO_VISIBLE
+    std::string get_sha1(const T &_buffer);
+
+    /// \}
+  }
+
+  ///////////////////////////////////////////////
+  // Implementation of get_sha1
+  template<typename T>
+  GAZEBO_VISIBLE
+  std::string common::get_sha1(const T &_buffer)
+  {
+    boost::uuids::detail::sha1 sha1;
+    unsigned int hash[5];
+    std::stringstream stream;
+
+    if (_buffer.size() == 0)
+    {
+      sha1.process_bytes(NULL, 0);
+    }
+    else
+    {
+      sha1.process_bytes(&(_buffer[0]), _buffer.size() * sizeof(_buffer[0]));
+    }
+
+    sha1.get_digest(hash);
+
+    for (std::size_t i = 0; i < sizeof(hash) / sizeof(hash[0]); ++i)
+    {
+      stream << std::setfill('0')
+             << std::setw(sizeof(hash[0]) * 2)
+             << std::hex
+             << hash[i];
+    }
+
+    return stream.str();
+  }
+}
+#endif
diff --git a/gazebo/common/CommonIface_TEST.cc b/gazebo/common/CommonIface_TEST.cc
new file mode 100644
index 0000000..aea9f90
--- /dev/null
+++ b/gazebo/common/CommonIface_TEST.cc
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <stdlib.h>
+#include <gtest/gtest.h>
+#include <string>
+#include <sstream>
+
+#include "gazebo/common/CommonIface.hh"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class CommonIface_TEST : public gazebo::testing::AutoLogFixture { };
+
+/////////////////////////////////////////////////
+/// \brief Test CommonIface::GetSHA1
+TEST_F(CommonIface_TEST, GetSHA1)
+{
+  // Do not forget to update 'precomputedSHA1' if you modify the SHA1 input.
+  std::string precomputedSHA1;
+  std::string computedSHA1;
+  std::string s;
+
+  // Compute the SHA1 of the vector
+  std::vector<float> v;
+  for (int i = 0; i < 100; ++i)
+    v.push_back(i);
+
+  computedSHA1 = common::get_sha1<std::vector<float> >(v);
+  precomputedSHA1 = "913283ec8502ba1423d38a7ea62cb8e492e87b23";
+  EXPECT_EQ(precomputedSHA1, computedSHA1);
+
+  // Compute the SHA1 of a string
+  s = "Marty McFly: Wait a minute, Doc. Ah... Are you telling me that you"
+      " built a time machine... out of a DeLorean?\n"
+      "Dr. Emmett Brown: The way I see it, if you're gonna build a time"
+      " machine into a car, why not do it with some style?";
+  computedSHA1 = common::get_sha1<std::string>(s);
+  precomputedSHA1 = "a370ddc4d61d936b2bb40f98bae061dc15fd8923";
+  EXPECT_EQ(precomputedSHA1, computedSHA1);
+
+  // Compute the SHA1 of an empty string
+  s = "";
+  computedSHA1 = common::get_sha1<std::string>(s);
+  precomputedSHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709";
+  EXPECT_EQ(precomputedSHA1, computedSHA1);
+
+  // Compute a bunch of SHA1's to verify consistent length
+  for (unsigned i = 0; i < 100; ++i)
+  {
+    std::stringstream stream;
+    stream << i << '\n';
+    std::string sha = common::get_sha1<std::string>(stream.str());
+    EXPECT_EQ(sha.length(), 40u);
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/common/CommonTypes.hh b/gazebo/common/CommonTypes.hh
index 1653932..ea94f7c 100644
--- a/gazebo/common/CommonTypes.hh
+++ b/gazebo/common/CommonTypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 #include <map>
 #include <string>
 #include <boost/shared_ptr.hpp>
+#include "gazebo/util/system.hh"
 
 /////////////////////////////////////////////////////////////////////////////
 // Defines
@@ -96,11 +97,15 @@ namespace gazebo
     class Param;
     class PoseAnimation;
     class SkeletonAnimation;
+    class SphericalCoordinates;
     class Time;
 
     template <typename T>
     class ParamT;
 
+    /// \brief Speed of light.
+    static const double SpeedOfLight = 299792458;
+
     /// \def Param_V
     /// \brief std::vector of Param*
     typedef std::vector<common::Param*> Param_V;
@@ -124,6 +129,10 @@ namespace gazebo
     /// \def DiagnosticTimerPtr
     /// \brief boost::shared_ptr to a DiagnosticTimer class
     typedef boost::shared_ptr<DiagnosticTimer> DiagnosticTimerPtr;
+
+    /// \def  SphericalCoordinatesPtr
+    /// \brief Boost shared pointer to a SphericalCoordinates object
+    typedef boost::shared_ptr<SphericalCoordinates> SphericalCoordinatesPtr;
   }
 
   namespace event
diff --git a/gazebo/common/Console.cc b/gazebo/common/Console.cc
index 780224f..ccf1da5 100644
--- a/gazebo/common/Console.cc
+++ b/gazebo/common/Console.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,93 +14,214 @@
  * limitations under the License.
  *
  */
-#include <string.h>
+#include <string>
 #include <boost/filesystem.hpp>
+#include <boost/algorithm/string/regex.hpp>
 #include <sstream>
 
 #include "gazebo/common/Exception.hh"
 #include "gazebo/common/Time.hh"
 #include "gazebo/common/Console.hh"
 
+#include "gazebo/gazebo_config.h"
+
 using namespace gazebo;
 using namespace common;
 
+FileLogger gazebo::common::Console::log("");
+Logger Console::msg("[Msg] ", 32, Logger::STDOUT);
+Logger Console::err("[Err] ", 31, Logger::STDERR);
+Logger Console::dbg("[Dbg] ", 36, Logger::STDOUT);
+Logger Console::warn("[Wrn] ", 33, Logger::STDERR);
+
+bool Console::quiet = true;
+
 //////////////////////////////////////////////////
-Console::Console()
+void Console::SetQuiet(bool _quiet)
 {
-  this->msgStream = &std::cerr;
-  this->errStream = &std::cerr;
-  this->logStream = NULL;
+  quiet = _quiet;
 }
 
 //////////////////////////////////////////////////
-Console::~Console()
+bool Console::GetQuiet()
 {
-  if (this->logStream)
-    this->logStream->close();
+  return quiet;
 }
 
-//////////////////////////////////////////////////
-void Console::Init(const std::string &_logFilename)
+/////////////////////////////////////////////////
+Logger::Logger(const std::string &_prefix, int _color, LogType _type)
+  : std::ostream(new Buffer(_type, _color)), color(_color), prefix(_prefix)
+{
+  this->setf(std::ios_base::unitbuf);
+}
+
+/////////////////////////////////////////////////
+Logger::~Logger()
+{
+  delete this->rdbuf();
+}
+
+/////////////////////////////////////////////////
+Logger &Logger::operator()()
+{
+  Console::log << "(" << Time::GetWallTime() << ") ";
+  (*this) << this->prefix;
+
+  return (*this);
+}
+
+/////////////////////////////////////////////////
+Logger &Logger::operator()(const std::string &_file, int _line)
+{
+  int index = _file.find_last_of("/") + 1;
+
+  Console::log << "(" << Time::GetWallTime() << ") ";
+  (*this) << this->prefix
+    << "[" << _file.substr(index , _file.size() - index) << ":"
+    << _line << "] ";
+
+  return (*this);
+}
+
+/////////////////////////////////////////////////
+Logger::Buffer::Buffer(LogType _type, int _color)
+  :  type(_type), color(_color)
+{
+}
+
+/////////////////////////////////////////////////
+Logger::Buffer::~Buffer()
+{
+  this->pubsync();
+}
+
+/////////////////////////////////////////////////
+int Logger::Buffer::sync()
+{
+  // Log messages to disk
+  Console::log << this->str();
+  Console::log.flush();
+
+  // Output to terminal
+  if (!Console::GetQuiet())
+  {
+    if (this->type == Logger::STDOUT)
+    {
+     std::cout << "\033[1;" << this->color << "m" << this->str() << "\033[0m";
+    }
+    else
+    {
+     std::cerr << "\033[1;" << this->color << "m" << this->str() << "\033[0m";
+    }
+  }
+
+  this->str("");
+  return 0;
+}
+
+/////////////////////////////////////////////////
+FileLogger::FileLogger(const std::string &_filename)
+  : std::ostream(new Buffer(_filename))
+{
+  this->setf(std::ios_base::unitbuf);
+}
+
+/////////////////////////////////////////////////
+FileLogger::~FileLogger()
+{
+  delete this->rdbuf();
+}
+
+/////////////////////////////////////////////////
+void FileLogger::Init(const std::string &_filename)
 {
   if (!getenv("HOME"))
-    gzthrow("Missing HOME environment variable");
+  {
+    gzerr << "Missing HOME environment variable."
+          << "No log file will be generated.";
+    return;
+  }
+
+  FileLogger::Buffer *buf = static_cast<FileLogger::Buffer*>(
+      this->rdbuf());
 
   boost::filesystem::path logPath(getenv("HOME"));
-  logPath = logPath / ".gazebo/" / _logFilename;
+  logPath = logPath / ".gazebo/" / _filename;
+
+  // Check if the Init method has been already called, and if so
+  // remove current buffer.
+  if (buf->stream)
+    delete buf->stream;
 
-  if (this->logStream)
+  // If the logPath is a directory, just rename it.
+  if (boost::filesystem::is_directory(logPath))
   {
-    this->logStream->close();
-    delete this->logStream;
+    std::string newPath = logPath.string() + ".old";
+    boost::system::error_code ec;
+    boost::filesystem::rename(logPath, newPath, ec);
+    if (ec == 0)
+      std::cerr << "Deprecated log directory [" << logPath
+                << "] renamed to [" << newPath << "]" << std::endl;
+    else
+    {
+      std::cerr << "Unable to rename deprecated log directory [" << logPath
+                << "] to [" << newPath << "]. Reason: " << ec.message();
+      return;
+    }
   }
 
-  this->logStream = new std::ofstream(logPath.string().c_str(), std::ios::out);
+  buf->stream = new std::ofstream(logPath.string().c_str(), std::ios::out);
+  if (!buf->stream->is_open())
+    std::cerr << "Error opening log file: " << logPath << std::endl;
+
+  // Output the version of gazebo.
+  (*buf->stream) << GAZEBO_VERSION_HEADER << std::endl;
 }
 
-//////////////////////////////////////////////////
-bool Console::IsInitialized() const
+/////////////////////////////////////////////////
+FileLogger &FileLogger::operator()()
 {
-  return this->logStream != NULL;
+  (*this) << "(" << Time::GetWallTime() << ") ";
+  return (*this);
 }
 
-//////////////////////////////////////////////////
-void Console::SetQuiet(bool)
+/////////////////////////////////////////////////
+FileLogger &FileLogger::operator()(const std::string &_file, int _line)
 {
+  int index = _file.find_last_of("/") + 1;
+  (*this) << "(" << Time::GetWallTime() << ") ["
+    << _file.substr(index , _file.size() - index) << ":" << _line << "]";
+
+  return (*this);
 }
 
-//////////////////////////////////////////////////
-std::ostream &Console::ColorMsg(const std::string &_lbl, int _color)
+/////////////////////////////////////////////////
+FileLogger::Buffer::Buffer(const std::string &_filename)
+  : stream(NULL)
 {
-  // if (**this->quietP)
-  // return this->nullStream;
-  // else
-  // {
-  *this->msgStream << "\033[1;" << _color << "m" << _lbl << "\033[0m ";
-  return *this->msgStream;
-  // }
+  if (!_filename.empty())
+  {
+    this->stream = new std::ofstream(_filename.c_str(), std::ios::out);
+  }
 }
 
-//////////////////////////////////////////////////
-std::ofstream &Console::Log()
+/////////////////////////////////////////////////
+FileLogger::Buffer::~Buffer()
 {
-  if (!this->logStream)
-    this->logStream = new std::ofstream("/dev/null", std::ios::out);
-
-  *this->logStream << "[" << common::Time::GetWallTime() << "] ";
-  this->logStream->flush();
-  return *this->logStream;
+  if (this->stream)
+    static_cast<std::ofstream*>(this->stream)->close();
 }
 
-//////////////////////////////////////////////////
-std::ostream &Console::ColorErr(const std::string &lbl,
-                                const std::string &file,
-                                unsigned int line, int color)
+/////////////////////////////////////////////////
+int FileLogger::Buffer::sync()
 {
-  int index = file.find_last_of("/") + 1;
+  if (!this->stream)
+    return -1;
+
+  *this->stream << this->str();
 
-  *this->errStream << "\033[1;" << color << "m" << lbl << " [" <<
-    file.substr(index , file.size() - index)<< ":" << line << "]\033[0m ";
+  this->stream->flush();
 
-  return *this->errStream;
+  this->str("");
+  return !(*this->stream);
 }
diff --git a/gazebo/common/Console.hh b/gazebo/common/Console.hh
index a2c07e5..34e24da 100644
--- a/gazebo/common/Console.hh
+++ b/gazebo/common/Console.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,21 +14,19 @@
  * limitations under the License.
  *
 */
-/*
- * Desc: Gazebo Message
- * Author: Nathan Koenig
- * Date: 09 June 2007
- */
 
 #ifndef _GAZEBO_CONSOLE_HH_
 #define _GAZEBO_CONSOLE_HH_
 
 #include <iostream>
 #include <fstream>
+#include <sstream>
 #include <string>
 
+#include <boost/thread.hpp>
 #include "gazebo/common/SingletonT.hh"
 #include "gazebo/common/CommonTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,98 +34,175 @@ namespace gazebo
   {
     /// \addtogroup gazebo_common Common
     /// \{
-
     /// \brief Output a message
-    #define gzmsg (gazebo::common::Console::Instance()->ColorMsg("Msg", 32))
+    #define gzmsg (gazebo::common::Console::msg())
 
     /// \brief Output a debug message
-    #define gzdbg (gazebo::common::Console::Instance()->ColorMsg("Dbg", 36))
+    #define gzdbg (gazebo::common::Console::dbg(__FILE__, __LINE__))
 
     /// \brief Output a warning message
-    #define gzwarn (gazebo::common::Console::Instance()->ColorErr("Warning", \
-          __FILE__, __LINE__, 33))
+    #define gzwarn (gazebo::common::Console::warn(__FILE__, __LINE__))
 
     /// \brief Output an error message
-    #define gzerr (gazebo::common::Console::Instance()->ColorErr("Error", \
-          __FILE__, __LINE__, 31))
+    #define gzerr (gazebo::common::Console::err(__FILE__, __LINE__))
 
     /// \brief Output a message to a log file
-    #define gzlog (gazebo::common::Console::Instance()->Log())
+    #define gzlog (gazebo::common::Console::log())
 
-    /// Start marker
-    #define gzclr_start(clr) "\033[1;33m"
+    /// \brief Initialize log file with filename given by _str.
+    /// If called twice, it will close currently in use and open a new
+    /// log file.
+    /// \param[in] _str Name of log file for gzlog messages.
+    #define gzLogInit(_str) (gazebo::common::Console::log.Init(_str))
 
-    /// End marker
-    #define gzclr_end "\033[0m"
-
-    /// \addtogroup gazebo_common Common
-    /// \{
+    /// \class FileLogger FileLogger.hh common/common.hh
+    /// \brief A logger that outputs messages to a file.
+    class GAZEBO_VISIBLE FileLogger : public std::ostream
+    {
+      /// \brief Constructor.
+      /// \param[in] _filename Filename to write into. If empty,
+      /// FileLogger::Init must be called separately.
+      public: FileLogger(const std::string &_filename = "");
+
+      /// \brief Destructor.
+      public: virtual ~FileLogger();
+
+      /// \brief Initialize the file logger.
+      /// \param[in] _filename Name and path of the log file to write output
+      /// into.
+      public: void Init(const std::string &_filename);
+
+      /// \brief Output a filename and line number, then return a reference
+      /// to the logger.
+      /// \return Reference to this logger.
+      public: virtual FileLogger &operator()();
+
+      /// \brief Output a filename and line number, then return a reference
+      /// to the logger.
+      /// \param[in] _file Filename to output.
+      /// \param[in] _line Line number in the _file.
+      /// \return Reference to this logger.
+      public: virtual FileLogger &operator()(
+                  const std::string &_file, int _line);
+
+      /// \brief String buffer for the file logger.
+      protected: class Buffer : public std::stringbuf
+                 {
+                   /// \brief Constructor.
+                   /// \param[in] _filename Filename to write into.
+                   public: Buffer(const std::string &_filename);
+
+                   /// \brief Destructor.
+                   public: virtual ~Buffer();
+
+                   /// \brief Sync the stream (output the string buffer
+                   /// contents).
+                   /// \return Return 0 on success.
+                   public: virtual int sync();
+
+                   /// \brief Stream to output information into.
+                   public: std::ofstream *stream;
+                 };
+    };
 
-    /// \class Console Console.hh common/commom.hh
-    /// \brief Message, error, warning functionality
+    /// \class Logger Logger.hh common/common.hh
+    /// \brief Terminal logger.
+    class GAZEBO_VISIBLE Logger : public std::ostream
+    {
+      /// \enum LogType.
+      /// \brief Output destination type.
+      public: enum LogType
+              {
+                /// \brief Output to stdout.
+                STDOUT,
+                /// \brief Output to stderr.
+                STDERR
+              };
+
+      /// \brief Constructor.
+      /// \param[in] _prefix String to use as prefix when logging to file.
+      /// \param[in] _color Color of the output stream.
+      /// \param[in] _type Output destination type (STDOUT, or STDERR)
+      public: Logger(const std::string &_prefix, int _color, LogType _type);
+
+      /// \brief Destructor.
+      public: virtual ~Logger();
+
+      /// \brief Access operator.
+      /// \return Reference to this logger.
+      public: virtual Logger &operator()();
+
+      /// \brief Output a filename and line number, then return a reference
+      /// to the logger.
+      /// \param[in] _file Filename to output.
+      /// \param[in] _line Line number in the _file.
+      /// \return Reference to this logger.
+      public: virtual Logger &operator()(
+                  const std::string &_file, int _line);
+
+      /// \brief String buffer for the base logger.
+      protected: class Buffer : public std::stringbuf
+                 {
+                   /// \brief Constructor.
+                   /// \param[in] _type Output destination type
+                   /// (STDOUT, or STDERR)
+                   /// \param[in] _color Color of the output stream.
+                   public: Buffer(LogType _type, int _color);
+
+                   /// \brief Destructor.
+                   public: virtual ~Buffer();
+
+                   /// \brief Sync the stream (output the string buffer
+                   /// contents).
+                   /// \return Return 0 on success.
+                   public: virtual int sync();
+
+                   /// \brief Destination type for the messages.
+                   public: LogType type;
+
+                   /// \brief ANSI color code using Select Graphic Rendition
+                   /// parameters (SGR). See
+                   /// http://en.wikipedia.org/wiki/ANSI_escape_code#Colors
+                   public: int color;
+                 };
+
+      /// \brief Color for the output.
+      public: int color;
+
+      /// \brief Prefix to use when logging to file.
+      private: std::string prefix;
+    };
 
-    class Console : public SingletonT<Console>
+    /// \class Console Console.hh common/common.hh
+    /// \brief Container for loggers, and global logging options
+    /// (such as verbose vs. quiet output).
+    class GAZEBO_VISIBLE Console
     {
-      /// \brief Default constructor
-      private: Console();
-
-      /// \brief Destructor
-      private: virtual ~Console();
-
-      /// \brief Load the message parameters
-      public: void Init(const std::string &_logFilename);
-
-      /// \brief Return true if Init has been called.
-      /// \return True is initialized.
-      public: bool IsInitialized() const;
-
-      /// \brief Set quiet output
-      /// \param[in] q True to prevent warning
-      public: void SetQuiet(bool _q);
-
-      /// \brief Use this to output a colored message to the terminal
-      /// \param[in] _lbl Text label
-      /// \param[in] _color Color to make the label
-      /// \return Reference to an output stream
-      public: std::ostream &ColorMsg(const std::string &_lbl, int _color);
-
-      /// \brief Use this to output a colored message to the terminal
-      /// \param[in] _lbl Text label
-      /// \return Reference to an output stream
-      public: std::ofstream &Log();
-
-      /// \brief Use this to output an error to the terminal
-      /// \param[in] _lbl Text label
-      /// \param[in] _file File containing the error
-      /// \param[in] _line Line containing the error
-      /// \param[in] _color Color to make the label
-      /// \return Reference to an output stream
-      public: std::ostream &ColorErr(const std::string &_lbl,
-                  const std::string &_file, unsigned int _line, int _color);
-
-
-      /// \class NullStream Animation.hh common/common.hh
-      /// \brief A stream that does not output anywhere
-      private: class NullStream : public std::ostream
-               {
-                 /// \brief constructor
-                 public: NullStream() : std::ios(0), std::ostream(0) {}
-               };
-
-      /// \brief Null stream
-      private: NullStream nullStream;
-
-      /// \brief Message stream
-      private: std::ostream *msgStream;
-
-      /// \brief Error stream
-      private: std::ostream *errStream;
-
-      /// \brief Stream for a log file.
-      private: std::ofstream *logStream;
-
-      /// \brief This is a singleton
-      private: friend class SingletonT<Console>;
+      /// \brief Set quiet output.
+      /// \param[in] q True to prevent warning.
+      public: static void SetQuiet(bool _q);
+
+      /// \brief Get whether quiet output is set.
+      /// \return True to if quiet output is set.
+      public: static bool GetQuiet();
+
+      /// \brief Global instance of the message logger.
+      public: static Logger msg;
+
+      /// \brief Global instance of the error logger.
+      public: static Logger err;
+
+      /// \brief Global instance of the debug logger.
+      public: static Logger dbg;
+
+      /// \brief Global instance of the warning logger.
+      public: static Logger warn;
+
+      /// \brief Global instance of the file logger.
+      public: static FileLogger log;
+
+      /// \brief Indicates if console messages should be quiet.
+      private: static bool quiet;
     };
     /// \}
   }
diff --git a/gazebo/common/Console_TEST.cc b/gazebo/common/Console_TEST.cc
index 80c6279..23104fa 100644
--- a/gazebo/common/Console_TEST.cc
+++ b/gazebo/common/Console_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,59 +19,259 @@
 #include <boost/filesystem.hpp>
 #include <stdlib.h>
 
+#include "gazebo/common/Time.hh"
 #include "gazebo/common/Console.hh"
+#include "test/util.hh"
+
+const int g_messageRepeat = 4;
+
+class Console_TEST : public gazebo::testing::AutoLogFixture { };
 
 /////////////////////////////////////////////////
 /// \brief Test Console::Init and Console::Log
-TEST(Console_TEST, InitAndLog)
+TEST_F(Console_TEST, InitAndLog)
+{
+  // Log the string
+  std::string logString = "this is a test";
+
+  gzlog << logString << std::endl;
+  EXPECT_TRUE(this->GetLogContent().find(logString) != std::string::npos);
+}
+
+//////////////////////////////////////////////////
+/// \brief Test Console::Log with \n characters
+TEST_F(Console_TEST, LogSlashN)
+{
+  std::string logString = "this is a log test";
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzlog << logString << " _n__ " << i << '\n';
+  }
+
+  std::string logContent = this->GetLogContent();
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    std::ostringstream stream;
+    stream << logString << " _n__ " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
+  }
+}
+
+//////////////////////////////////////////////////
+/// \brief Test Console::Log with std::endl
+TEST_F(Console_TEST, LogStdEndl)
+{
+  std::string logString = "this is a log test";
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzlog << logString << " endl " << i << std::endl;
+  }
+
+  std::string logContent = this->GetLogContent();
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    std::ostringstream stream;
+    stream << logString << " endl " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
+  }
+}
+
+//////////////////////////////////////////////////
+/// \brief Test Console::ColorWarn with \n characters
+TEST_F(Console_TEST, ColorWarnSlashN)
+{
+  std::string logString = "this is a warning test";
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzwarn << logString << " _n__ " << i << '\n';
+  }
+
+  std::string logContent = this->GetLogContent();
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    std::ostringstream stream;
+    stream << logString << " _n__ " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
+  }
+}
+
+//////////////////////////////////////////////////
+/// \brief Test Console::ColorWarn with std::endl
+TEST_F(Console_TEST, ColorWarnStdEndl)
+{
+  std::string logString = "this is a warning test";
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzwarn << logString << " endl " << i << std::endl;
+  }
+
+  std::string logContent = this->GetLogContent();
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    std::ostringstream stream;
+    stream << logString << " endl " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
+  }
+}
+
+//////////////////////////////////////////////////
+/// \brief Test Console::ColorDbg with \n characters
+TEST_F(Console_TEST, ColorDbgSlashN)
+{
+  std::string logString = "this is a dbg test";
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzdbg << logString << " _n__ " << i << '\n';
+  }
+
+  std::string logContent = this->GetLogContent();
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    std::ostringstream stream;
+    stream << logString << " _n__ " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
+  }
+}
+
+//////////////////////////////////////////////////
+/// \brief Test Console::ColorDbg with std::endl
+TEST_F(Console_TEST, ColorDbgStdEndl)
+{
+  std::string logString = "this is a dbg test";
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzdbg << logString << " endl " << i << std::endl;
+  }
+
+  std::string logContent = this->GetLogContent();
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    std::ostringstream stream;
+    stream << logString << " endl " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
+  }
+}
+
+//////////////////////////////////////////////////
+/// \brief Test Console::ColorMsg with \n characters
+TEST_F(Console_TEST, ColorMsgSlashN)
+{
+  std::string logString = "this is a msg test";
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzmsg << logString << " _n__ " << i << '\n';
+  }
+
+  std::string logContent = this->GetLogContent();
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    std::ostringstream stream;
+    stream << logString << " _n__ " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
+  }
+}
+
+//////////////////////////////////////////////////
+/// \brief Test Console::ColorMsg with std::endl
+TEST_F(Console_TEST, ColorMsgStdEndl)
 {
-  // Initialize Conosol
-  gazebo::common::Console::Instance()->Init("test.log");
+  std::string logString = "this is a msg test";
 
-  EXPECT_TRUE(getenv("HOME") != NULL);
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzmsg << logString << " endl " << i << std::endl;
+  }
 
-  // Make sure that the log file has been created
-  std::string logPath = getenv("HOME");
-  boost::filesystem::path testLog(logPath);
-  testLog = testLog / ".gazebo/test.log";
-  EXPECT_TRUE(boost::filesystem::exists(testLog));
+  std::string logContent = this->GetLogContent();
 
-  // Test Console::Log
+  for (int i = 0; i < g_messageRepeat; ++i)
   {
-    std::string logString = "this is a test";
-    std::string loggedString;
+    std::ostringstream stream;
+    stream << logString << " endl " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
+  }
+}
 
-    // Log the string
-    gzlog << logString << std::endl;
+//////////////////////////////////////////////////
+/// \brief Test Console::ColorErr with \n characters
+TEST_F(Console_TEST, ColorErrSlashN)
+{
+  std::string logString = "this is an error test";
 
-    // Open the log file, and read back the string
-    std::ifstream ifs(testLog.string().c_str(), std::ios::in);
-    std::getline(ifs, loggedString);
-    EXPECT_TRUE(loggedString.find(logString) != std::string::npos);
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzerr << logString << " _n__ " << i << '\n';
+  }
+
+  std::string logContent = this->GetLogContent();
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    std::ostringstream stream;
+    stream << logString << " _n__ " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
+  }
+}
+
+//////////////////////////////////////////////////
+/// \brief Test Console::ColorErr with std::endl
+TEST_F(Console_TEST, ColorErrStdEndl)
+{
+  std::string logString = "this is an error test";
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    gzerr << logString << " endl " << i << std::endl;
+  }
+
+  std::string logContent = this->GetLogContent();
+
+  for (int i = 0; i < g_messageRepeat; ++i)
+  {
+    std::ostringstream stream;
+    stream << logString << " endl " << i;
+    EXPECT_TRUE(logContent.find(stream.str()) != std::string::npos);
   }
 }
 
 /////////////////////////////////////////////////
 /// \brief Test Console::ColorMsg
-TEST(Console_TEST, ColorMsg)
+TEST_F(Console_TEST, ColorMsg)
 {
-  std::ostream *stream;
-  stream = &(gazebo::common::Console::Instance()->ColorMsg("label", 20));
+  std::string logString = "this is a msg test";
+
+  gzmsg << logString << std::endl;
 
-  EXPECT_TRUE(stream != NULL);
-  EXPECT_TRUE(stream->good());
+  std::string logContent = this->GetLogContent();
+
+  EXPECT_TRUE(logContent.find(logString) != std::string::npos);
 }
 
 /////////////////////////////////////////////////
 /// \brief Test Console::ColorErr
-TEST(Console_TEST, ColorErr)
+TEST_F(Console_TEST, ColorErr)
 {
-  std::ostream *stream;
-  stream = &(gazebo::common::Console::Instance()->ColorErr("label",
-        "myfile", 10, 20));
+  std::string logString = "this is an error test";
+
+  gzerr << logString << std::endl;
+
+  std::string logContent = this->GetLogContent();
 
-  EXPECT_TRUE(stream != NULL);
-  EXPECT_TRUE(stream->good());
+  EXPECT_TRUE(logContent.find(logString) != std::string::npos);
 }
 
 /////////////////////////////////////////////////
diff --git a/gazebo/common/Dem.cc b/gazebo/common/Dem.cc
new file mode 100644
index 0000000..ea82231
--- /dev/null
+++ b/gazebo/common/Dem.cc
@@ -0,0 +1,359 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <algorithm>
+#include <boost/filesystem.hpp>
+#include <gazebo/gazebo_config.h>
+
+#ifdef HAVE_GDAL
+# include <gdal/ogr_spatialref.h>
+#endif
+
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Dem.hh"
+#include "gazebo/common/DemPrivate.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/SphericalCoordinates.hh"
+#include "gazebo/math/Angle.hh"
+
+using namespace gazebo;
+using namespace common;
+
+#ifdef HAVE_GDAL
+
+//////////////////////////////////////////////////
+Dem::Dem()
+  : dataPtr(new DemPrivate)
+{
+  this->dataPtr->dataSet = NULL;
+  GDALAllRegister();
+}
+
+//////////////////////////////////////////////////
+Dem::~Dem()
+{
+  this->dataPtr->demData.clear();
+
+  if (this->dataPtr->dataSet)
+    GDALClose(reinterpret_cast<GDALDataset *>(this->dataPtr->dataSet));
+
+  delete this->dataPtr;
+  this->dataPtr = NULL;
+}
+
+//////////////////////////////////////////////////
+int Dem::Load(const std::string &_filename)
+{
+  unsigned int width;
+  unsigned int height;
+  int xSize, ySize;
+  double upLeftX, upLeftY, upRightX, upRightY, lowLeftX, lowLeftY;
+  math::Angle upLeftLat, upLeftLong, upRightLat, upRightLong;
+  math::Angle lowLeftLat, lowLeftLong;
+
+  // Sanity check
+  std::string fullName = _filename;
+  if (!boost::filesystem::exists(boost::filesystem::path(fullName)))
+    fullName = common::find_file(_filename);
+
+  if (!boost::filesystem::exists(boost::filesystem::path(fullName)))
+  {
+    gzerr << "Unable to open DEM file[" << _filename
+          << "], check your GAZEBO_RESOURCE_PATH settings." << std::endl;
+    return -1;
+  }
+
+  this->dataPtr->dataSet = reinterpret_cast<GDALDataset *>(GDALOpen(
+    fullName.c_str(), GA_ReadOnly));
+
+  if (this->dataPtr->dataSet == NULL)
+  {
+    gzerr << "Unable to open DEM file[" << fullName
+          << "]. Format not recognised as a supported dataset." << std::endl;
+    return -1;
+  }
+
+  int nBands = this->dataPtr->dataSet->GetRasterCount();
+  if (nBands != 1)
+  {
+    gzerr << "Unsupported number of bands in file [" << fullName + "]. Found "
+          << nBands << " but only 1 is a valid value." << std::endl;
+    return -1;
+  }
+
+  // Set the pointer to the band
+  this->dataPtr->band = this->dataPtr->dataSet->GetRasterBand(1);
+
+  // Raster width and height
+  xSize = this->dataPtr->dataSet->GetRasterXSize();
+  ySize = this->dataPtr->dataSet->GetRasterYSize();
+
+  // Corner coordinates
+  upLeftX = 0.0;
+  upLeftY = 0.0;
+  upRightX = xSize;
+  upRightY = 0.0;
+  lowLeftX = 0.0;
+  lowLeftY = ySize;
+
+  // Calculate the georeferenced coordinates of the terrain corners
+  this->GetGeoReference(upLeftX, upLeftY, upLeftLat, upLeftLong);
+  this->GetGeoReference(upRightX, upRightY, upRightLat, upRightLong);
+  this->GetGeoReference(lowLeftX, lowLeftY, lowLeftLat, lowLeftLong);
+
+  // Set the world width and height
+  this->dataPtr->worldWidth =
+     common::SphericalCoordinates::Distance(upLeftLat, upLeftLong,
+                                            upRightLat, upRightLong);
+  this->dataPtr->worldHeight =
+     common::SphericalCoordinates::Distance(upLeftLat, upLeftLong,
+                                            lowLeftLat, lowLeftLong);
+
+  // Set the terrain's side (the terrain will be squared after the padding)
+  if (math::isPowerOfTwo(ySize - 1))
+    height = ySize;
+  else
+    height = math::roundUpPowerOfTwo(ySize) + 1;
+
+  if (math::isPowerOfTwo(xSize - 1))
+    width = xSize;
+  else
+    width = math::roundUpPowerOfTwo(xSize) + 1;
+
+  this->dataPtr->side = std::max(width, height);
+
+  // Preload the DEM's data
+  if (this->LoadData() != 0)
+    return -1;
+
+  // Set the min/max heights
+  this->dataPtr->minElevation = *std::min_element(&this->dataPtr->demData[0],
+      &this->dataPtr->demData[0] + this->dataPtr->side * this->dataPtr->side);
+  this->dataPtr->maxElevation = *std::max_element(&this->dataPtr->demData[0],
+      &this->dataPtr->demData[0] + this->dataPtr->side * this->dataPtr->side);
+
+  return 0;
+}
+
+//////////////////////////////////////////////////
+double Dem::GetElevation(double _x, double _y)
+{
+  if (_x >= this->GetWidth() || _y >= this->GetHeight())
+  {
+    gzthrow("Illegal coordinates. You are asking for the elevation in (" <<
+          _x << "," << _y << ") but the terrain is [" << this->GetWidth() <<
+           " x " << this->GetHeight() << "]\n");
+  }
+
+  return this->dataPtr->demData.at(_y * this->GetWidth() + _x);
+}
+
+//////////////////////////////////////////////////
+float Dem::GetMinElevation() const
+{
+  return this->dataPtr->minElevation;
+}
+
+//////////////////////////////////////////////////
+float Dem::GetMaxElevation() const
+{
+  return this->dataPtr->maxElevation;
+}
+
+//////////////////////////////////////////////////
+void Dem::GetGeoReference(double _x, double _y,
+                          math::Angle &_latitude, math::Angle &_longitude)
+{
+  double geoTransf[6];
+  if (this->dataPtr->dataSet->GetGeoTransform(geoTransf) == CE_None)
+  {
+    OGRSpatialReference sourceCs;
+    OGRSpatialReference targetCs;
+    OGRCoordinateTransformation *cT;
+    double xGeoDeg, yGeoDeg;
+
+    // Transform the terrain's coordinate system to WGS84
+    char *importString = strdup(this->dataPtr->dataSet->GetProjectionRef());
+    sourceCs.importFromWkt(&importString);
+    targetCs.SetWellKnownGeogCS("WGS84");
+    cT = OGRCreateCoordinateTransformation(&sourceCs, &targetCs);
+
+    xGeoDeg = geoTransf[0] + _x * geoTransf[1] + _y * geoTransf[2];
+    yGeoDeg = geoTransf[3] + _x * geoTransf[4] + _y * geoTransf[5];
+
+    cT->Transform(1, &xGeoDeg, &yGeoDeg);
+
+    _latitude.SetFromDegree(yGeoDeg);
+    _longitude.SetFromDegree(xGeoDeg);
+  }
+  else
+    gzthrow("Unable to obtain the georeferenced values for coordinates ("
+            << _x << "," << _y << ")\n");
+}
+
+//////////////////////////////////////////////////
+void Dem::GetGeoReferenceOrigin(math::Angle &_latitude, math::Angle &_longitude)
+{
+  return this->GetGeoReference(0, 0, _latitude, _longitude);
+}
+
+//////////////////////////////////////////////////
+unsigned int Dem::GetHeight() const
+{
+  return this->dataPtr->side;
+}
+
+//////////////////////////////////////////////////
+unsigned int Dem::GetWidth() const
+{
+  return this->dataPtr->side;
+}
+
+//////////////////////////////////////////////////
+double Dem::GetWorldWidth() const
+{
+  return this->dataPtr->worldWidth;
+}
+
+//////////////////////////////////////////////////
+double Dem::GetWorldHeight() const
+{
+  return this->dataPtr->worldHeight;
+}
+
+//////////////////////////////////////////////////
+void Dem::FillHeightMap(int _subSampling, unsigned int _vertSize,
+                        const math::Vector3 &_size, const math::Vector3 &_scale,
+                        bool _flipY, std::vector<float> &_heights)
+{
+  if (_subSampling <= 0)
+  {
+    gzerr << "Illegal subsampling value (" << _subSampling << ")\n";
+    return;
+  }
+
+  // Resize the vector to match the size of the vertices.
+  _heights.resize(_vertSize * _vertSize);
+
+  // Iterate over all the vertices
+  for (unsigned int y = 0; y < _vertSize; ++y)
+  {
+    double yf = y / static_cast<double>(_subSampling);
+    unsigned int y1 = floor(yf);
+    unsigned int y2 = ceil(yf);
+    if (y2 >= this->dataPtr->side)
+      y2 = this->dataPtr->side - 1;
+    double dy = yf - y1;
+
+    for (unsigned int x = 0; x < _vertSize; ++x)
+    {
+      double xf = x / static_cast<double>(_subSampling);
+      unsigned int x1 = floor(xf);
+      unsigned int x2 = ceil(xf);
+      if (x2 >= this->dataPtr->side)
+        x2 = this->dataPtr->side - 1;
+      double dx = xf - x1;
+
+      double px1 = this->dataPtr->demData[y1 * this->dataPtr->side + x1];
+      double px2 = this->dataPtr->demData[y1 * this->dataPtr->side + x2];
+      float h1 = (px1 - ((px1 - px2) * dx));
+
+      double px3 = this->dataPtr->demData[y2 * this->dataPtr->side + x1];
+      double px4 = this->dataPtr->demData[y2 * this->dataPtr->side + x2];
+      float h2 = (px3 - ((px3 - px4) * dx));
+
+      float h = (h1 - ((h1 - h2) * dy) - std::max(0.0f,
+          this->GetMinElevation())) * _scale.z;
+
+      // Invert pixel definition so 1=ground, 0=full height,
+      // if the terrain size has a negative z component
+      // this is mainly for backward compatibility
+      if (_size.z < 0)
+        h *= -1;
+
+      // Convert to 0 if a NODATA value is found
+      if (_size.z >= 0 && h < 0)
+        h = 0;
+
+      // Store the height for future use
+      if (!_flipY)
+        _heights[y * _vertSize + x] = h;
+      else
+        _heights[(_vertSize - y - 1) * _vertSize + x] = h;
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+int Dem::LoadData()
+{
+    unsigned int destWidth;
+    unsigned int destHeight;
+    unsigned int nXSize = this->dataPtr->dataSet->GetRasterXSize();
+    unsigned int nYSize = this->dataPtr->dataSet->GetRasterYSize();
+    float ratio;
+    std::vector<float> buffer;
+
+    if (nXSize == 0 || nYSize == 0)
+    {
+      gzerr << "Illegal size loading a DEM file (" << nXSize << ","
+            << nYSize << ")\n";
+      return -1;
+    }
+
+    // Scale the terrain keeping the same ratio between width and height
+    if (nXSize > nYSize)
+    {
+      ratio = static_cast<float>(nXSize) / static_cast<float>(nYSize);
+      destWidth = this->dataPtr->side;
+      // The decimal part is discarted for interpret the result as pixels
+      destHeight = static_cast<float>(destWidth) / static_cast<float>(ratio);
+    }
+    else
+    {
+      ratio = static_cast<float>(nYSize) / static_cast<float>(nXSize);
+      destHeight = this->dataPtr->side;
+      // The decimal part is discarted for interpret the result as pixels
+      destWidth = static_cast<float>(destHeight) / static_cast<float>(ratio);
+    }
+
+    // Read the whole raster data and convert it to a GDT_Float32 array.
+    // In this step the DEM is scaled to destWidth x destHeight
+    buffer.resize(destWidth * destHeight);
+    if (this->dataPtr->band->RasterIO(GF_Read, 0, 0, nXSize, nYSize, &buffer[0],
+                         destWidth, destHeight, GDT_Float32, 0, 0) != CE_None)
+    {
+      gzerr << "Failure calling RasterIO while loading a DEM file\n";
+      return -1;
+    }
+
+    // Copy and align 'buffer' into the target vector. The destination vector is
+    // initialized to 0, so all the points not contained in 'buffer' will be
+    // extra padding
+    this->dataPtr->demData.resize(this->GetWidth() * this->GetHeight());
+    for (unsigned int y = 0; y < destHeight; ++y)
+    {
+        std::copy(&buffer[destWidth * y], &buffer[destWidth * y] + destWidth,
+                  this->dataPtr->demData.begin() + this->GetWidth() * y);
+    }
+    buffer.clear();
+
+    return 0;
+}
+
+#endif
diff --git a/gazebo/common/Dem.hh b/gazebo/common/Dem.hh
new file mode 100644
index 0000000..a85d66c
--- /dev/null
+++ b/gazebo/common/Dem.hh
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DEM_HH_
+#define _GAZEBO_DEM_HH_
+
+#include <gazebo/gazebo_config.h>
+#include <gazebo/util/system.hh>
+
+#ifdef HAVE_GDAL
+# include <gdal/gdal_priv.h>
+# include <string>
+# include <vector>
+
+# include "gazebo/common/DemPrivate.hh"
+# include "gazebo/common/HeightmapData.hh"
+# include "gazebo/math/Angle.hh"
+
+namespace gazebo
+{
+  namespace common
+  {
+    /// \addtogroup gazebo_common Common
+    /// \{
+
+    /// \class DEM DEM.hh common/common.hh
+    /// \brief Encapsulates a DEM (Digital Elevation Model) file.
+    class GAZEBO_VISIBLE Dem : public HeightmapData
+    {
+      /// \brief Constructor.
+      public: Dem();
+
+      /// \brief Destructor.
+      public: virtual ~Dem();
+
+      /// \brief Load a DEM file.
+      /// \param[in] _filename the path to the terrain file.
+      /// \return 0 when the operation succeeds to open a file.
+      public: int Load(const std::string &_filename="");
+
+      /// \brief Get the elevation of a terrain's point in meters.
+      /// \param[in] _x X coordinate of the terrain.
+      /// \param[in] _y Y coordinate of the terrain.
+      /// \return Terrain's elevation at (x,y) in meters.
+      public: double GetElevation(double _x, double _y);
+
+      /// \brief Get the terrain's minimum elevation in meters.
+      /// \return The minimum elevation (meters).
+      public: float GetMinElevation() const;
+
+      /// \brief Get the terrain's maximum elevation in meters.
+      /// \return The maximum elevation (meters).
+      public: float GetMaxElevation() const;
+
+      /// \brief Get the georeferenced coordinates (lat, long) of the terrain's
+      /// origin in WGS84.
+      /// \param[out] _latitude Georeferenced latitude.
+      /// \param[out] _longitude Georeferenced longitude.
+      public: void GetGeoReferenceOrigin(math::Angle &_latitude,
+                                         math::Angle &_longitude);
+
+      /// \brief Get the terrain's height. Due to the Ogre constrains, this
+      /// value will be a power of two plus one. The value returned might be
+      /// different that the original DEM height because GetData() adds the
+      /// padding if necessary.
+      /// \return The terrain's height (points) satisfying the ogre constrains
+      /// (squared terrain with a height value that must be a power of two plus
+      /// one).
+      public: unsigned int GetHeight() const;
+
+      /// \brief Get the terrain's width. Due to the Ogre constrains, this
+      /// value will be a power of two plus one. The value returned might be
+      /// different that the original DEM width because GetData() adds the
+      /// padding if necessary.
+      /// \return The terrain's width (points) satisfying the ogre constrains
+      /// (squared terrain with a width value that must be a power of two plus
+      /// one).
+      public: unsigned int GetWidth() const;
+
+      /// \brief Get the real world width in meters.
+      /// \return Terrain's real world width in meters.
+      public: double GetWorldWidth() const;
+
+      /// \brief Get the real world height in meters.
+      /// \return Terrain's real world height in meters.
+      public: double GetWorldHeight() const;
+
+      /// \brief Create a lookup table of the terrain's height.
+      /// \param[in] _subsampling Multiplier used to increase the resolution.
+      /// Ex: A subsampling of 2 in a terrain of 129x129 means that the height
+      /// vector will be 257 * 257.
+      /// \param[in] _vertSize Number of points per row.
+      /// \param[in] _size Real dimmensions of the terrain in meters.
+      /// \param[in] _scale Vector3 used to scale the height.
+      /// \param[in] _flipY If true, it inverts the order in which the vector
+      /// is filled.
+      /// \param[out] _heights Vector containing the terrain heights.
+      public: void FillHeightMap(int _subSampling, unsigned int _vertSize,
+          const math::Vector3 &_size, const math::Vector3 &_scale, bool _flipY,
+          std::vector<float> &_heights);
+
+      /// \brief Get the georeferenced coordinates (lat, long) of a terrain's
+      /// pixel in WGS84.
+      /// \param[in] _x X coordinate of the terrain.
+      /// \param[in] _y Y coordinate of the terrain.
+      /// \param[out] _latitude Georeferenced latitude.
+      /// \param[out] _longitude Georeferenced longitude.
+      private: void GetGeoReference(double _x, double _y,
+                                    math::Angle &_latitude,
+                                    math::Angle &_longitude);
+
+      /// \brief Get the terrain file as a data array. Due to the Ogre
+      /// constrains, the data might be stored in a bigger vector representing
+      /// a squared terrain with padding.
+      /// \return 0 when the operation succeeds to open a file.
+      private: int LoadData();
+
+      /// internal
+      /// \brief Pointer to the private data.
+      private: DemPrivate *dataPtr;
+    };
+    /// \}
+  }
+}
+#endif
+#endif
diff --git a/gazebo/common/DemPrivate.hh b/gazebo/common/DemPrivate.hh
new file mode 100644
index 0000000..8cfd67d
--- /dev/null
+++ b/gazebo/common/DemPrivate.hh
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DEM_PRIVATE_HH_
+#define _GAZEBO_DEM_PRIVATE_HH_
+
+#include <gazebo/gazebo_config.h>
+#include <gazebo/util/system.hh>
+
+#ifdef HAVE_GDAL
+# include <gdal/gdal_priv.h>
+# include <vector>
+
+namespace gazebo
+{
+  namespace common
+  {
+    /// \addtogroup gazebo_common Common
+    /// \{
+
+    /// \class DemPrivate DemPrivate.hh common/common.hh
+    /// \brief Private data for the Dem class.
+    class GAZEBO_VISIBLE DemPrivate
+    {
+      /// \brief A set of associated raster bands.
+      public: GDALDataset *dataSet;
+
+      /// \brief A pointer to the band.
+      public: GDALRasterBand *band;
+
+      /// \brief Real width of the world in meters.
+      public: double worldWidth;
+
+      /// \brief Real height of the world in meters.
+      public: double worldHeight;
+
+      /// \brief Terrain's side (after the padding).
+      public: unsigned int side;
+
+      /// \brief Minimum elevation in meters.
+      public: double minElevation;
+
+      /// \brief Maximum elevation in meters.
+      public: double maxElevation;
+
+      /// \brief DEM data converted to be OGRE-compatible.
+      public: std::vector<float> demData;
+    };
+    /// \}
+  }
+}
+#endif
+#endif
diff --git a/gazebo/common/Dem_TEST.cc b/gazebo/common/Dem_TEST.cc
new file mode 100644
index 0000000..1d66100
--- /dev/null
+++ b/gazebo/common/Dem_TEST.cc
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/filesystem.hpp>
+#include <gtest/gtest.h>
+
+#include "gazebo/common/Dem.hh"
+#include "gazebo/math/Angle.hh"
+#include "test_config.h"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class DemTest : public gazebo::testing::AutoLogFixture { };
+
+#ifdef HAVE_GDAL
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, MisingFile)
+{
+  common::Dem dem;
+  EXPECT_NE(dem.Load("/file/shouldn/never/exist.png"), 0);
+}
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, NotDem)
+{
+  common::Dem dem;
+  boost::filesystem::path path;
+
+  path = "file://media/materials/scripts/CMakeLists.txt";
+  EXPECT_NE(dem.Load(path.string()), 0);
+}
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, UnsupportedDem)
+{
+  common::Dem dem;
+  boost::filesystem::path path;
+
+  path = "file://media/materials/textures/wood.jpg";
+  EXPECT_NE(dem.Load(path.string()), 0);
+}
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, NonSquaredDemPortrait)
+{
+  common::Dem dem;
+  boost::filesystem::path path = TEST_PATH;
+
+  path /= "data/dem_portrait.tif";
+  EXPECT_EQ(dem.Load(path.string()), 0);
+}
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, NonSquaredDemLandscape)
+{
+  common::Dem dem;
+  boost::filesystem::path path = TEST_PATH;
+
+  path /= "data/dem_landscape.tif";
+  EXPECT_EQ(dem.Load(path.string()), 0);
+}
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, SquaredDem)
+{
+  common::Dem dem;
+  boost::filesystem::path path = TEST_PATH;
+
+  path /= "data/dem_squared.tif";
+  EXPECT_EQ(dem.Load(path.string()), 0);
+}
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, BasicAPI)
+{
+  common::Dem dem;
+  boost::filesystem::path path = TEST_PATH;
+
+  path /= "data/dem_squared.tif";
+  EXPECT_EQ(dem.Load(path.string()), 0);
+
+  // Check the heights and widths
+  EXPECT_EQ(129, static_cast<int>(dem.GetHeight()));
+  EXPECT_EQ(129, static_cast<int>(dem.GetWidth()));
+  EXPECT_FLOAT_EQ(3984.4849, dem.GetWorldHeight());
+  EXPECT_FLOAT_EQ(3139.7456, dem.GetWorldWidth());
+  EXPECT_FLOAT_EQ(65.3583, dem.GetMinElevation());
+  EXPECT_FLOAT_EQ(318.441, dem.GetMaxElevation());
+
+  // Check GetElevation()
+  unsigned int width = dem.GetWidth();
+  unsigned int height = dem.GetHeight();
+  EXPECT_FLOAT_EQ(215.82324, dem.GetElevation(0, 0));
+  EXPECT_FLOAT_EQ(216.04961, dem.GetElevation(width - 1, 0));
+  EXPECT_FLOAT_EQ(142.2274, dem.GetElevation(0, height - 1));
+  EXPECT_FLOAT_EQ(209.14784, dem.GetElevation(width - 1, height - 1));
+
+  // Illegal coordinates
+  ASSERT_ANY_THROW(dem.GetElevation(0, height));
+  ASSERT_ANY_THROW(dem.GetElevation(width, 0));
+  ASSERT_ANY_THROW(dem.GetElevation(width, height));
+
+  // Check GetGeoReferenceOrigin()
+  math::Angle latitude, longitude;
+  dem.GetGeoReferenceOrigin(latitude, longitude);
+  EXPECT_FLOAT_EQ(38.001667, latitude.Degree());
+  EXPECT_FLOAT_EQ(-122.22278, longitude.Degree());
+}
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, FillHeightmap)
+{
+  common::Dem dem;
+  boost::filesystem::path path = TEST_PATH;
+
+  path /= "data/dem_squared.tif";
+  EXPECT_EQ(dem.Load(path.string()), 0);
+
+  // Use FillHeightMap() to retrieve a vector<float> after some transformations
+  int subsampling;
+  unsigned vertSize;
+  math::Vector3 size;
+  math::Vector3 scale;
+  bool flipY;
+  std::vector<float> elevations;
+
+  subsampling = 2;
+  vertSize = (dem.GetWidth() * subsampling) - 1;
+  size.x = dem.GetWorldWidth();
+  size.y = dem.GetWorldHeight();
+  size.z = dem.GetMaxElevation() - dem.GetMinElevation();
+  scale.x = size.x / vertSize;
+  scale.y = size.y / vertSize;
+  if (math::equal(dem.GetMaxElevation(), 0.0f))
+    scale.z = fabs(size.z);
+  else
+    scale.z = fabs(size.z) / dem.GetMaxElevation();
+  flipY = false;
+
+  dem.FillHeightMap(subsampling, vertSize, size, scale, flipY, elevations);
+
+  // Check the size of the returned vector
+  EXPECT_EQ(vertSize * vertSize, elevations.size());
+
+  // Check the elevation of some control points
+  EXPECT_FLOAT_EQ(119.58285, elevations.at(0));
+  EXPECT_FLOAT_EQ(114.27753, elevations.at(elevations.size() - 1));
+  EXPECT_FLOAT_EQ(148.07137, elevations.at(elevations.size() / 2));
+}
+#endif
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/common/Event.cc b/gazebo/common/Event.cc
index 28c8fee..6631a8e 100644
--- a/gazebo/common/Event.cc
+++ b/gazebo/common/Event.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,38 +15,88 @@
  *
  */
 
-#include "common/Console.hh"
-#include "common/Event.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Event.hh"
 
 using namespace gazebo;
 using namespace event;
 
-int Connection::counter = 0;
+//////////////////////////////////////////////////
+EventPrivate::EventPrivate()
+  : signaled(false)
+{
+}
 
 //////////////////////////////////////////////////
-Connection::Connection(Event *_e, int _i)
+Event::Event()
+  : dataPtr(new EventPrivate())
+{
+}
+
+//////////////////////////////////////////////////
+Event::Event(EventPrivate &_d)
+  : dataPtr(&_d)
+{
+}
+
+//////////////////////////////////////////////////
+Event::~Event()
+{
+  delete this->dataPtr;
+  this->dataPtr = NULL;
+}
+
+//////////////////////////////////////////////////
+bool Event::GetSignaled() const
+{
+  return this->dataPtr->signaled;
+}
+
+//////////////////////////////////////////////////
+ConnectionPrivate::ConnectionPrivate()
+  : event(NULL), id(-1)
+{
+}
+
+//////////////////////////////////////////////////
+ConnectionPrivate::ConnectionPrivate(Event *_e, int _i)
   : event(_e), id(_i)
 {
-  this->creationTime = common::Time::GetWallTime();
+}
+
+//////////////////////////////////////////////////
+Connection::Connection()
+  : dataPtr(new ConnectionPrivate())
+{
+}
+
+//////////////////////////////////////////////////
+Connection::Connection(Event *_e, int _i)
+  : dataPtr(new ConnectionPrivate(_e, _i))
+{
+  this->dataPtr->creationTime = common::Time::GetWallTime();
 }
 
 //////////////////////////////////////////////////
 Connection::~Connection()
 {
-  if (common::Time::GetWallTime() - this->creationTime < common::Time(0, 10000))
-    gzerr << "Warning: Deleteing a connection right after creation. "
+  common::Time diffTime = common::Time::GetWallTime() -
+    this->dataPtr->creationTime;
+  if ((this->dataPtr->event && !this->dataPtr->event->GetSignaled()) &&
+      diffTime < common::Time(0, 10000))
+    gzwarn << "Warning: Deleteing a connection right after creation. "
           << "Make sure to save the ConnectionPtr from a Connect call\n";
 
-  if (this->event && this->id >= 0)
+  if (this->dataPtr->event && this->dataPtr->id >= 0)
   {
-    this->event->Disconnect(this->id);
-    this->id = -1;
-    this->event = NULL;
+    this->dataPtr->event->Disconnect(this->dataPtr->id);
+    this->dataPtr->id = -1;
+    this->dataPtr->event = NULL;
   }
 }
 
 //////////////////////////////////////////////////
 int Connection::GetId() const
 {
-  return this->id;
+  return this->dataPtr->id;
 }
diff --git a/gazebo/common/Event.hh b/gazebo/common/Event.hh
index 1b39262..90d7619 100644
--- a/gazebo/common/Event.hh
+++ b/gazebo/common/Event.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,17 +18,20 @@
 #ifndef _EVENT_HH_
 #define _EVENT_HH_
 
-#include <gazebo/gazebo_config.h>
-#include <gazebo/common/Time.hh>
-#include <gazebo/common/CommonTypes.hh>
+#include <iostream>
+#include <vector>
+#include <map>
 
 #include <boost/function.hpp>
 #include <boost/bind.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/thread/mutex.hpp>
 
-#include <iostream>
-#include <vector>
+#include <gazebo/gazebo_config.h>
+#include <gazebo/common/Time.hh>
+#include <gazebo/common/CommonTypes.hh>
+#include <gazebo/math/Helpers.hh>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -39,12 +42,27 @@ namespace gazebo
     /// \addtogroup gazebo_event Events
     /// \{
 
+    /// \internal
+    // Private data members for Event class.
+    // This must be in the header due to templatization.
+    class GAZEBO_VISIBLE EventPrivate
+    {
+      // \brief Constructor
+      public: EventPrivate();
+
+      /// \brief True if the event has been signaled.
+      public: bool signaled;
+    };
+
     /// \class Event Event.hh common/common.hh
     /// \brief Base class for all events
-    class Event
+    class GAZEBO_VISIBLE Event
     {
       /// \brief Constructor
-      public: virtual ~Event() {}
+      public: Event();
+
+      /// \brief Destructor
+      public: virtual ~Event();
 
       /// \brief Disconnect
       /// \param[in] _c A pointer to a connection
@@ -53,144 +71,199 @@ namespace gazebo
       /// \brief Disconnect
       /// \param[in] _id Integer ID of a connection
       public: virtual void Disconnect(int _id) = 0;
+
+      /// \brief Get whether this event has been signaled.
+      /// \return True if the event has been signaled.
+      public: bool GetSignaled() const;
+
+      /// \brief Allow subclasses to initialize their own data pointer.
+      /// \param[in] _d Reference to data pointer.
+      protected: Event(EventPrivate &_d);
+
+      /// \brief Data pointer.
+      protected: EventPrivate *dataPtr;
     };
 
-    /// \brief A class that encapsulates a connection
-    class Connection
+    /// \internal
+    // Private data members for Connection class.
+    class GAZEBO_VISIBLE ConnectionPrivate
     {
-      /// \brief Constructor
-      public: Connection() :event(NULL), id(-1) {}
+      /// \brief Constructor.
+      public: ConnectionPrivate();
 
-      /// \brief Constructor
+      /// \brief Constructor.
       /// \param[in] _e Event pointer to connect with
       /// \param[in] _i Unique id
+      public: ConnectionPrivate(Event *_e, int _i);
+
+      /// \brief the event for this connection
+      public: Event *event;
+
+      /// \brief the id set in the constructor
+      public: int id;
+
+      /// \brief set during the constructor
+      public: common::Time creationTime;
+    };
+
+    /// \brief A class that encapsulates a connection.
+    class GAZEBO_VISIBLE Connection
+    {
+      /// \brief Constructor.
+      public: Connection();
+
+      /// \brief Constructor.
+      /// \param[in] _e Event pointer to connect with.
+      /// \param[in] _i Unique id.
       public: Connection(Event *_e, int _i);
 
-      /// \brief Destructor
+      /// \brief Destructor.
       public: ~Connection();
 
-      /// \brief Get the id of this connection
-      /// \return The id of this connection
+      /// \brief Get the id of this connection.
+      /// \return The id of this connection.
       public: int GetId() const;
 
-      /// \brief the event for this connection
-      private: Event *event;
+      /// \brief Private data pointer.
+      private: ConnectionPrivate *dataPtr;
 
-      /// \brief the id set in the constructor
-      private: int id;
+      /// \brief Friend class.
+      public: template<typename T> friend class EventT;
+    };
+
+    /// \internal
+    // Private data members for EventT<T> class.
+    template< typename T>
+    class GAZEBO_VISIBLE EventTPrivate : public EventPrivate
+    {
+      /// \def EvtConnectionMap
+      /// \brief Event Connection map typedef.
+      typedef std::map<int, boost::function<T>*> EvtConnectionMap;
 
-      /// \brief not used. set to 0
-      private: static int counter;
+      /// \brief Array of connection callbacks.
+      public: EvtConnectionMap connections;
 
-      /// \brief set during the constructor
-      private: common::Time creationTime;
+      /// \brief Set of connections to erased.
+      public: std::vector<int> connectionsToErase;
 
-      public: template<typename T> friend class EventT;
+      /// \brief A thread lock.
+      public: boost::mutex connectionsEraseMutex;
     };
 
     /// \class EventT Event.hh common/common.hh
-    /// \brief A class for event processing
+    /// \brief A class for event processing.
     template< typename T>
-    class EventT : public Event
+    class GAZEBO_VISIBLE EventT : public Event
     {
-      /// \brief Destructor
+      /// \def EvtConnectionMap.
+      /// \brief Event Connection map typedef.
+      typedef std::map<int, boost::function<T>*> EvtConnectionMap;
+
+      /// \brief Constructor.
+      public: EventT();
+
+      /// \brief Destructor.
       public: virtual ~EventT();
 
-      /// \brief Connect a callback to this event
-      /// \param[in] _subscriber Pointer to a callback function
+      /// \brief Connect a callback to this event.
+      /// \param[in] _subscriber Pointer to a callback function.
       /// \return A Connection object, which will automatically call
-      ///         Disconnect when it goes out of scope
+      /// Disconnect when it goes out of scope.
       public: ConnectionPtr Connect(const boost::function<T> &_subscriber);
 
-      /// \brief Disconnect a callback to this event
-      /// \param[in] _c The connection to disconnect
+      /// \brief Disconnect a callback to this event.
+      /// \param[in] _c The connection to disconnect.
       public: virtual void Disconnect(ConnectionPtr _c);
 
-      /// \brief Disconnect a callback to this event
-      /// \param[in] _id The id of the connection to disconnect
+      /// \brief Disconnect a callback to this event.
+      /// \param[in] _id The id of the connection to disconnect.
       public: virtual void Disconnect(int _id);
 
       /// \brief Get the number of connections.
       /// \return Number of connection to this Event.
       public: unsigned int ConnectionCount() const;
 
-      /// \brief Access the signal
+      /// \brief Access the signal.
       public: void operator()()
               {this->Signal();}
 
-      /// \brief Signal the event for all subscribers
+      /// \brief Signal the event for all subscribers.
       public: void Signal()
               {
-                for (unsigned int i = 0; i < connections.size(); i++)
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                    iter != this->myDataPtr->connections.end(); ++iter)
                 {
-                  (*this->connections[i])();
+                  (*iter->second)();
                 }
               }
 
-      /// \brief Signal the event with one parameter
-      /// \param[in] _p the parameter
+      /// \brief Signal the event with one parameter.
+      /// \param[in] _p the parameter.
       public: template< typename P >
               void operator()(const P &_p)
               { this->Signal(_p); }
 
-      /// \brief Signal the event with two parameters
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
+      /// \brief Signal the event with two parameters.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
       public: template< typename P1, typename P2 >
               void operator()(const P1 &_p1, const P2 &_p2)
               { this->Signal(_p1, _p2); }
 
-      /// \brief Signal the event with three parameters
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
+      /// \brief Signal the event with three parameters.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
       public: template< typename P1, typename P2, typename P3 >
               void operator()(const P1 &_p1, const P2 &_p2, const P3 &_p3)
               { this->Signal(_p1, _p2, _p3); }
 
-      /// \brief Signal the event with four parameters
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
+      /// \brief Signal the event with four parameters.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
       public: template< typename P1, typename P2, typename P3, typename P4 >
               void operator()(const P1 &_p1, const P2 &_p2, const P3 &_p3,
                               const P4 &_p4)
               { this->Signal(_p1, _p2, _p3, _p4); }
 
-      /// \brief Signal the event with five parameters
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fift parameter
+      /// \brief Signal the event with five parameters.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fift parameter.
       public: template< typename P1, typename P2, typename P3, typename P4,
                         typename P5 >
               void operator()(const P1 &_p1, const P2 &_p2, const P3 &_p3,
                               const P4 &_p4, const P5 &_p5)
               { this->Signal(_p1, _p2, _p3, _p4, _p5); }
 
-      /// \brief Signal the event with six parameters
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fift parameter
-      /// \param[in] _p6 the sixt parameter
+      /// \brief Signal the event with six parameters.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fift parameter.
+      /// \param[in] _p6 the sixt parameter.
       public: template< typename P1, typename P2, typename P3, typename P4,
                         typename P5, typename P6 >
               void operator()(const P1 &_p1, const P2 &_p2, const P3 &_p3,
                               const P4 &_p4, const P5 &_p5, const P6 &_p6)
               { this->Signal(_p1, _p2, _p3, _p4, _p5, _p6); }
 
-      /// \brief Signal the event with seven parameters
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
-      /// \param[in] _p6 the sixth parameter
-      /// \param[in] _p7 the seventh parameter
+      /// \brief Signal the event with seven parameters.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
+      /// \param[in] _p6 the sixth parameter.
+      /// \param[in] _p7 the seventh parameter.
       public: template< typename P1, typename P2, typename P3, typename P4,
                         typename P5, typename P6, typename P7 >
               void operator()(const P1 &_p1, const P2 &_p2, const P3 &_p3,
@@ -198,15 +271,15 @@ namespace gazebo
                               const P7 &_p7)
               { this->Signal(_p1, _p2, _p3, _p4, _p5, _p6, _p7); }
 
-      /// \brief Signal the event with eight parameters
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
-      /// \param[in] _p6 the sixth parameter
-      /// \param[in] _p7 the seventh parameter
-      /// \param[in] _p8 the eighth parameter
+      /// \brief Signal the event with eight parameters.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
+      /// \param[in] _p6 the sixth parameter.
+      /// \param[in] _p7 the seventh parameter.
+      /// \param[in] _p8 the eighth parameter.
       public: template< typename P1, typename P2, typename P3, typename P4,
                         typename P5, typename P6, typename P7, typename P8 >
               void operator()(const P1 &_p1, const P2 &_p2, const P3 &_p3,
@@ -214,16 +287,16 @@ namespace gazebo
                               const P7 &_p7, const P8 &_p8)
               { this->Signal(_p1, _p2, _p3, _p4, _p5, _p6, _p7, _p8); }
 
-      /// \brief Signal the event with nine parameters
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
-      /// \param[in] _p6 the sixth parameter
-      /// \param[in] _p7 the seventh parameter
-      /// \param[in] _p8 the eighth parameter
-      /// \param[in] _p9 the ninth parameter
+      /// \brief Signal the event with nine parameters.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
+      /// \param[in] _p6 the sixth parameter.
+      /// \param[in] _p7 the seventh parameter.
+      /// \param[in] _p8 the eighth parameter.
+      /// \param[in] _p9 the ninth parameter.
       public: template< typename P1, typename P2, typename P3, typename P4,
                         typename P5, typename P6, typename P7, typename P8,
                         typename P9 >
@@ -232,17 +305,17 @@ namespace gazebo
                               const P7 &_p7, const P8 &_p8, const P9 &_p9)
               { this->Signal(_p1, _p2, _p3, _p4, _p5, _p6, _p7, _p8, _p9); }
 
-      /// \brief Signal the event with ten parameters
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
-      /// \param[in] _p6 the sixth parameter
-      /// \param[in] _p7 the seventh parameter
-      /// \param[in] _p8 the eighth parameter
-      /// \param[in] _p9 the ninth parameter
-      /// \param[in] _p10 the tenth parameter
+      /// \brief Signal the event with ten parameters.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
+      /// \param[in] _p6 the sixth parameter.
+      /// \param[in] _p7 the seventh parameter.
+      /// \param[in] _p8 the eighth parameter.
+      /// \param[in] _p9 the ninth parameter.
+      /// \param[in] _p10 the tenth parameter.
       public: template< typename P1, typename P2, typename P3, typename P4,
                         typename P5, typename P6, typename P7, typename P8,
                         typename P9, typename P10 >
@@ -254,143 +327,175 @@ namespace gazebo
                 this->Signal(_p1, _p2, _p3, _p4, _p5, _p6, _p7, _p8, _p9, _p10);
               }
 
-      /// \brief Signal the event with one parameter
-      /// \param[in] _p parameter
+      /// \brief Signal the event with one parameter.
+      /// \param[in] _p parameter.
       public: template< typename P >
               void Signal(const P &_p)
               {
-                for (unsigned int i = 0; i < connections.size(); i++)
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                    iter != this->myDataPtr->connections.end(); ++iter)
                 {
-                  (*this->connections[i])(_p);
+                  (*iter->second)(_p);
                 }
               }
 
-      /// \brief Signal the event with two parameter
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
+      /// \brief Signal the event with two parameter.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
       public: template< typename P1, typename P2 >
               void Signal(const P1 &_p1, const P2 &_p2)
               {
-                for (unsigned int i = 0; i < connections.size(); i++)
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                    iter != this->myDataPtr->connections.end(); ++iter)
                 {
-                  (*this->connections[i])(_p1, _p2);
+                  (*iter->second)(_p1, _p2);
                 }
               }
 
-      /// \brief Signal the event with three parameter
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
+      /// \brief Signal the event with three parameter.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
       public: template< typename P1, typename P2, typename P3 >
               void Signal(const P1 &_p1, const P2 &_p2, const P3 &_p3)
               {
-                for (unsigned int i = 0; i < connections.size(); i++)
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                      iter != this->myDataPtr->connections.end(); ++iter)
                 {
-                  (*this->connections[i])(_p1, _p2, _p3);
+                  (*iter->second)(_p1, _p2, _p3);
                 }
               }
 
-      /// \brief Signal the event with four parameter
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
+      /// \brief Signal the event with four parameter.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
       public: template<typename P1, typename P2, typename P3, typename P4>
               void Signal(const P1 &_p1, const P2 &_p2, const P3 &_p3,
                           const P4 &_p4)
               {
-                for (unsigned int i = 0; i < connections.size(); i++)
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                        iter != this->myDataPtr->connections.end(); ++iter)
                 {
-                  (*this->connections[i])(_p1, _p2, _p3, _p4);
+                  (*iter->second)(_p1, _p2, _p3, _p4);
                 }
               }
 
-      /// \brief Signal the event with five parameter
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
+      /// \brief Signal the event with five parameter.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
       public: template<typename P1, typename P2, typename P3, typename P4,
                        typename P5>
               void Signal(const P1 &_p1, const P2 &_p2, const P3 &_p3,
                           const P4 &_p4, const P5 &_p5)
               {
-                for (unsigned int i = 0; i < connections.size(); i++)
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                          iter != this->myDataPtr->connections.end(); ++iter)
                 {
-                  (*this->connections[i])(_p1, _p2, _p3, _p4, _p5);
+                  (*iter->second)(_p1, _p2, _p3, _p4, _p5);
                 }
               }
 
 
-      /// \brief Signal the event with six parameter
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
-      /// \param[in] _p6 the sixth parameter
+      /// \brief Signal the event with six parameter.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
+      /// \param[in] _p6 the sixth parameter.
       public: template<typename P1, typename P2, typename P3, typename P4,
                        typename P5, typename P6>
               void Signal(const P1 &_p1, const P2 &_p2, const P3 &_p3,
                   const P4 &_p4, const P5 &_p5, const P6 &_p6)
               {
-                for (unsigned int i = 0; i < connections.size(); i++)
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                    iter != this->myDataPtr->connections.end(); ++iter)
                 {
-                  (*this->connections[i])(_p1, _p2, _p3, _p4, _p5, _p6);
+                  (*iter->second)(_p1, _p2, _p3, _p4, _p5, _p6);
                 }
               }
 
-      /// \brief Signal the event with seven parameter
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
-      /// \param[in] _p6 the sixth parameter
-      /// \param[in] _p7 the seventh parameter
+      /// \brief Signal the event with seven parameter.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
+      /// \param[in] _p6 the sixth parameter.
+      /// \param[in] _p7 the seventh parameter.
       public: template<typename P1, typename P2, typename P3, typename P4,
                        typename P5, typename P6, typename P7>
               void Signal(const P1 &_p1, const P2 &_p2, const P3 &_p3,
                   const P4 &_p4, const P5 &_p5, const P6 &_p6, const P7 &_p7)
               {
-                for (unsigned int i = 0; i < connections.size(); i++)
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                    iter != this->myDataPtr->connections.end(); ++iter)
                 {
-                  (*this->connections[i])(_p1, _p2, _p3, _p4, _p5, _p6, _p7);
+                  (*iter->second)(_p1, _p2, _p3, _p4, _p5, _p6, _p7);
                 }
               }
 
-      /// \brief Signal the event with eight parameter
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
-      /// \param[in] _p6 the sixth parameter
-      /// \param[in] _p7 the seventh parameter
-      /// \param[in] _p8 the eighth parameter
+      /// \brief Signal the event with eight parameter.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
+      /// \param[in] _p6 the sixth parameter.
+      /// \param[in] _p7 the seventh parameter.
+      /// \param[in] _p8 the eighth parameter.
       public: template<typename P1, typename P2, typename P3, typename P4,
                        typename P5, typename P6, typename P7, typename P8>
               void Signal(const P1 &_p1, const P2 &_p2, const P3 &_p3,
                   const P4 &_p4, const P5 &_p5, const P6 &_p6, const P7 &_p7,
                   const P8 &_p8)
-           {
-             for (unsigned int i = 0; i < connections.size(); i++)
-             {
-               (*this->connections[i])(_p1, _p2, _p3, _p4, _p5, _p6, _p7, _p8);
-             }
-           }
-
-      /// \brief Signal the event with nine parameter
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
-      /// \param[in] _p6 the sixth parameter
-      /// \param[in] _p7 the seventh parameter
-      /// \param[in] _p8 the eighth parameter
-      /// \param[in] _p9 the ninth parameter
+              {
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                    iter != this->myDataPtr->connections.end(); ++iter)
+                {
+                  (*iter->second)(_p1, _p2, _p3, _p4, _p5, _p6, _p7, _p8);
+                }
+              }
+
+      /// \brief Signal the event with nine parameter.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
+      /// \param[in] _p6 the sixth parameter.
+      /// \param[in] _p7 the seventh parameter.
+      /// \param[in] _p8 the eighth parameter.
+      /// \param[in] _p9 the ninth parameter.
       public: template< typename P1, typename P2, typename P3, typename P4,
                         typename P5, typename P6, typename P7, typename P8,
                         typename P9 >
@@ -398,23 +503,27 @@ namespace gazebo
                   const P4 &_p4, const P5 &_p5, const P6 &_p6, const P7 &_p7,
                   const P8 &_p8, const P9 &_p9)
           {
-            for (unsigned int i = 0; i < connections.size(); i++)
+            this->myDataPtr->signaled = true;
+            this->Cleanup();
+            for (typename EvtConnectionMap::iterator iter =
+                this->myDataPtr->connections.begin();
+                iter != this->myDataPtr->connections.end(); ++iter)
             {
-          (*this->connections[i])(_p1, _p2, _p3, _p4, _p5, _p6, _p7, _p8, _p9);
+              (*iter->second)(_p1, _p2, _p3, _p4, _p5, _p6, _p7, _p8, _p9);
             }
           }
 
-      /// \brief Signal the event with ten parameter
-      /// \param[in] _p1 the first parameter
-      /// \param[in] _p2 the second parameter
-      /// \param[in] _p3 the second parameter
-      /// \param[in] _p4 the first parameter
-      /// \param[in] _p5 the fifth parameter
-      /// \param[in] _p6 the sixth parameter
-      /// \param[in] _p7 the seventh parameter
-      /// \param[in] _p8 the eighth parameter
-      /// \param[in] _p9 the ninth parameter
-      /// \param[in] _p10 the tenth parameter
+      /// \brief Signal the event with ten parameter.
+      /// \param[in] _p1 the first parameter.
+      /// \param[in] _p2 the second parameter.
+      /// \param[in] _p3 the second parameter.
+      /// \param[in] _p4 the first parameter.
+      /// \param[in] _p5 the fifth parameter.
+      /// \param[in] _p6 the sixth parameter.
+      /// \param[in] _p7 the seventh parameter.
+      /// \param[in] _p8 the eighth parameter.
+      /// \param[in] _p9 the ninth parameter.
+      /// \param[in] _p10 the tenth parameter.
       public: template< typename P1, typename P2, typename P3, typename P4,
                         typename P5, typename P6, typename P7, typename P8,
                         typename P9, typename P10 >
@@ -422,46 +531,64 @@ namespace gazebo
                   const P4 &_p4, const P5 &_p5, const P6 &_p6, const P7 &_p7,
                   const P8 &_p8, const P9 &_p9, const P10 &_p10)
               {
-                for (unsigned int i = 0; i < connections.size(); i++)
+                this->myDataPtr->signaled = true;
+                this->Cleanup();
+                for (typename EvtConnectionMap::iterator iter =
+                    this->myDataPtr->connections.begin();
+                    iter != this->myDataPtr->connections.end(); ++iter)
                 {
-                  (*this->connections[i])(_p1, _p2, _p3, _p4, _p5,
+                  (*iter->second)(_p1, _p2, _p3, _p4, _p5,
                       _p6, _p7, _p8, _p9, _p10);
                 }
               }
 
-      /// \brief array of connection callbacks
-      private: std::vector<boost::function<T> *> connections;
+      /// \brief Cleanup disconnected connections.
+      private: void Cleanup();
 
-      /// \brief array of connection indexes
-      private: std::vector<int> connectionIds;
-
-      /// \brief a thread lock
-      private: boost::mutex lock;
+      /// \brief Private data pointer.
+      private: EventTPrivate<T> *myDataPtr;
     };
 
+    /// \brief Constructor.
+    template<typename T>
+    EventT<T>::EventT()
+    : Event(*(new EventTPrivate<T>()))
+    {
+      this->myDataPtr = static_cast<EventTPrivate<T>*>(this->dataPtr);
+    }
+
     /// \brief Destructor. Deletes all the associated connections.
     template<typename T>
     EventT<T>::~EventT()
     {
-      for (unsigned int i = 0; i < this->connections.size(); i++)
-        delete this->connections[i];
-      this->connections.clear();
-      this->connectionIds.clear();
+      for (typename EvtConnectionMap::iterator iter =
+          this->myDataPtr->connections.begin();
+          iter != this->myDataPtr->connections.end(); ++iter)
+      {
+        delete iter->second;
+      }
+
+      this->myDataPtr->connections.clear();
     }
 
-    /// \brief Adds a connection
-    /// \param[in] _subscriber the subscriber to connect
+    /// \brief Adds a connection.
+    /// \param[in] _subscriber the subscriber to connect.
     template<typename T>
     ConnectionPtr EventT<T>::Connect(const boost::function<T> &_subscriber)
     {
-      int index = this->connections.size();
-      this->connections.push_back(new boost::function<T>(_subscriber));
-      this->connectionIds.push_back(index);
+      int index = 0;
+      if (!this->myDataPtr->connections.empty())
+      {
+        typename EvtConnectionMap::reverse_iterator iter =
+          this->myDataPtr->connections.rbegin();
+        index = iter->first + 1;
+      }
+      this->myDataPtr->connections[index] = new boost::function<T>(_subscriber);
       return ConnectionPtr(new Connection(this, index));
     }
 
-    /// \brief Removes a connection
-    /// \param[in] _c the connection
+    /// \brief Removes a connection.
+    /// \param[in] _c the connection.
     template<typename T>
     void EventT<T>::Disconnect(ConnectionPtr _c)
     {
@@ -469,31 +596,48 @@ namespace gazebo
         return;
 
       this->Disconnect(_c->GetId());
-      _c->event = NULL;
-      _c->id = -1;
+      _c->dataPtr->event = NULL;
+      _c->dataPtr->id = -1;
     }
 
+    /// \brief Get the number of connections.
+    /// \return Number of connections.
     template<typename T>
     unsigned int EventT<T>::ConnectionCount() const
     {
-      return this->connections.size();
+      return this->myDataPtr->connections.size();
     }
 
-    /// \brief Removes a connection
-    /// \param[in] _id the connection index
+    /// \brief Removes a connection.
+    /// \param[in] _id the connection index.
     template<typename T>
     void EventT<T>::Disconnect(int _id)
     {
-      // search for index of the connection based on id
-      for (unsigned int i = 0; i < this->connectionIds.size(); i++)
+      boost::mutex::scoped_lock lock(this->myDataPtr->connectionsEraseMutex);
+      this->myDataPtr->connectionsToErase.push_back(_id);
+    }
+
+    /// \brief Cleanup disconnected connections.
+    template<typename T>
+    void EventT<T>::Cleanup()
+    {
+      if (this->myDataPtr->connectionsToErase.empty())
+        return;
+      boost::mutex::scoped_lock lock(this->myDataPtr->connectionsEraseMutex);
+
+      for (std::vector<int>::iterator iter =
+          this->myDataPtr->connectionsToErase.begin();
+          iter != this->myDataPtr->connectionsToErase.end(); ++iter)
       {
-        if (_id == this->connectionIds[i])
+        typename EvtConnectionMap::iterator iter2 =
+          this->myDataPtr->connections.find(*iter);
+        if (iter2 != this->myDataPtr->connections.end())
         {
-          this->connectionIds.erase(this->connectionIds.begin()+i);
-          this->connections.erase(this->connections.begin()+i);
-          break;
+          delete iter2->second;
+          this->myDataPtr->connections.erase(iter2);
         }
       }
+      this->myDataPtr->connectionsToErase.clear();
     }
     /// \}
   }
diff --git a/gazebo/common/Event_TEST.cc b/gazebo/common/Event_TEST.cc
new file mode 100644
index 0000000..63ee299
--- /dev/null
+++ b/gazebo/common/Event_TEST.cc
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2012-2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <gazebo/common/Time.hh>
+#include <gazebo/common/Event.hh>
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class EventTest : public gazebo::testing::AutoLogFixture { };
+
+int g_callback = 0;
+int g_callback1 = 0;
+
+/////////////////////////////////////////////////
+void callback()
+{
+  g_callback++;
+}
+
+/////////////////////////////////////////////////
+void callback1()
+{
+  g_callback1++;
+}
+
+/////////////////////////////////////////////////
+TEST_F(EventTest, SignalOnce)
+{
+  g_callback = 0;
+
+  event::EventT<void ()> evt;
+  event::ConnectionPtr conn = evt.Connect(boost::bind(&callback));
+  evt();
+
+  EXPECT_EQ(g_callback, 1);
+}
+
+/////////////////////////////////////////////////
+TEST_F(EventTest, SignalTwice)
+{
+  g_callback = 0;
+
+  event::EventT<void ()> evt;
+  event::ConnectionPtr conn = evt.Connect(boost::bind(&callback));
+  evt();
+  evt();
+
+  EXPECT_EQ(g_callback, 2);
+}
+
+/////////////////////////////////////////////////
+TEST_F(EventTest, SignalN)
+{
+  g_callback = 0;
+
+  event::EventT<void ()> evt;
+  event::ConnectionPtr conn = evt.Connect(boost::bind(&callback));
+
+  for (unsigned int i = 0; i < 100; ++i)
+    evt();
+
+  EXPECT_EQ(g_callback, 100);
+}
+
+/////////////////////////////////////////////////
+TEST_F(EventTest, Disconnect)
+{
+  g_callback = 0;
+
+  event::EventT<void ()> evt;
+  event::ConnectionPtr conn = evt.Connect(boost::bind(&callback));
+
+  conn.reset();
+
+  evt();
+
+  EXPECT_EQ(g_callback, 0);
+}
+
+/////////////////////////////////////////////////
+TEST_F(EventTest, MultiCallback)
+{
+  g_callback = 0;
+  g_callback1 = 0;
+
+  event::EventT<void ()> evt;
+  event::ConnectionPtr conn = evt.Connect(boost::bind(&callback));
+  event::ConnectionPtr conn1 = evt.Connect(boost::bind(&callback1));
+
+  evt();
+
+  EXPECT_EQ(g_callback, 1);
+  EXPECT_EQ(g_callback1, 1);
+}
+
+/////////////////////////////////////////////////
+TEST_F(EventTest, MultiCallbackDisconnect)
+{
+  g_callback = 0;
+  g_callback1 = 0;
+
+  event::EventT<void ()> evt;
+  event::ConnectionPtr conn = evt.Connect(boost::bind(&callback));
+  event::ConnectionPtr conn1 = evt.Connect(boost::bind(&callback1));
+  conn.reset();
+
+  evt();
+
+  EXPECT_EQ(g_callback, 0);
+  EXPECT_EQ(g_callback1, 1);
+}
+
+/////////////////////////////////////////////////
+TEST_F(EventTest, MultiCallbackReconnect)
+{
+  g_callback = 0;
+  g_callback1 = 0;
+
+  event::EventT<void ()> evt;
+  event::ConnectionPtr conn = evt.Connect(boost::bind(&callback));
+  event::ConnectionPtr conn1 = evt.Connect(boost::bind(&callback1));
+  conn.reset();
+  conn = evt.Connect(boost::bind(&callback));
+
+  evt();
+
+  EXPECT_EQ(g_callback, 1);
+  EXPECT_EQ(g_callback1, 1);
+}
+
+/////////////////////////////////////////////////
+TEST_F(EventTest, ManyChanges)
+{
+  g_callback = 0;
+  g_callback1 = 0;
+
+  event::EventT<void ()> evt;
+  event::ConnectionPtr conn = evt.Connect(boost::bind(&callback));
+  event::ConnectionPtr conn1 = evt.Connect(boost::bind(&callback1));
+  conn.reset();
+  conn1.reset();
+
+  evt();
+
+  EXPECT_EQ(g_callback, 0);
+  EXPECT_EQ(g_callback1, 0);
+
+  conn = evt.Connect(boost::bind(&callback));
+  conn1 = evt.Connect(boost::bind(&callback1));
+
+  evt();
+
+  EXPECT_EQ(g_callback, 1);
+  EXPECT_EQ(g_callback1, 1);
+
+  evt();
+
+  EXPECT_EQ(g_callback, 2);
+  EXPECT_EQ(g_callback1, 2);
+
+  conn1.reset();
+
+  evt();
+
+  EXPECT_EQ(g_callback, 3);
+  EXPECT_EQ(g_callback1, 2);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/common/Events.cc b/gazebo/common/Events.cc
index b7829cf..1ab23f2 100644
--- a/gazebo/common/Events.cc
+++ b/gazebo/common/Events.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
 */
-#include "common/Events.hh"
+#include "gazebo/common/Events.hh"
 
 using namespace gazebo;
 using namespace event;
@@ -22,6 +22,7 @@ using namespace event;
 EventT<void (bool)> Events::pause;
 EventT<void ()> Events::step;
 EventT<void ()> Events::stop;
+EventT<void ()> Events::sigInt;
 
 EventT<void (std::string)> Events::worldCreated;
 EventT<void (std::string)> Events::entityCreated;
@@ -29,7 +30,6 @@ EventT<void (std::string, std::string)> Events::setSelectedEntity;
 EventT<void (std::string)> Events::addEntity;
 EventT<void (std::string)> Events::deleteEntity;
 
-EventT<void ()> Events::worldUpdateStart;
 EventT<void (const common::UpdateInfo &)> Events::worldUpdateBegin;
 
 EventT<void ()> Events::worldUpdateEnd;
@@ -42,12 +42,6 @@ EventT<void (std::string)> Events::diagTimerStart;
 EventT<void (std::string)> Events::diagTimerStop;
 
 /////////////////////////////////////////////////
-void Events::DisconnectWorldUpdateStart(ConnectionPtr _subscriber)
-{
-  worldUpdateStart.Disconnect(_subscriber);
-}
-
-/////////////////////////////////////////////////
 void Events::DisconnectWorldUpdateBegin(ConnectionPtr _subscriber)
 {
   worldUpdateBegin.Disconnect(_subscriber);
diff --git a/gazebo/common/Events.hh b/gazebo/common/Events.hh
index 5928221..6a01f87 100644
--- a/gazebo/common/Events.hh
+++ b/gazebo/common/Events.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/UpdateInfo.hh"
 #include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,7 +33,7 @@ namespace gazebo
 
     /// \class Events Events.hh common/common.hh
     /// \brief An Event class to get notifications for simulator events
-    class Events
+    class GAZEBO_VISIBLE Events
     {
       //////////////////////////////////////////////////////////////////////////
       /// \brief Connect a boost::slot the the pause signal
@@ -128,27 +129,6 @@ namespace gazebo
       public: static void DisconnectAddEntity(ConnectionPtr _subscriber)
               { addEntity.Disconnect(_subscriber); }
 
-
-      //////////////////////////////////////////////////////////////////////////
-      /// \brief Connect a boost::slot the the world update start signal
-      /// \param[in] _subscriber the subscriber to this event
-      /// \return a connection
-      public: template<typename T>
-              static ConnectionPtr ConnectWorldUpdateStart(T _subscriber)
-              {
-                // Putting in this comment so the deprecation message
-                // will be found easier: GAZEBO_DEPRECATED.
-                gzerr << "Events::ConnectWorldUpdateStart is deprecated "
-                      << "in v 1.5.0. Please use "
-                      << "Events::ConnectWorldUpdateBegin\n";
-                 return worldUpdateStart.Connect(_subscriber);
-              }
-
-      /// \brief Disconnect a boost::slot the the world update start signal
-      /// \param[in] _subscriber the subscriber to this event
-      public: static void DisconnectWorldUpdateStart(ConnectionPtr _subscriber)
-              GAZEBO_DEPRECATED(1.5);
-
       //////////////////////////////////////////////////////////////////////////
       /// \brief Connect a boost::slot the the world update start signal
       /// \param[in] _subscriber the subscriber to this event
@@ -230,6 +210,18 @@ namespace gazebo
       public: static void DisconnectDiagTimerStop(ConnectionPtr _subscriber)
               { diagTimerStop.Disconnect(_subscriber); }
 
+      //////////////////////////////////////////////////////////////////////////
+      /// \brief Connect a boost::slot to the sigint event
+      /// \param[in] _subscriber the subscriber to this event
+      /// \return a connection
+      public: template<typename T>
+              static ConnectionPtr ConnectSigInt(T _subscriber)
+              { return sigInt.Connect(_subscriber); }
+      /// \brief Disconnect a boost::slot to the sigint event
+      /// \param[in] _subscriber the subscriber to this event
+      public: static void DisconnectSigInt(ConnectionPtr _subscriber)
+              { sigInt.Disconnect(_subscriber); }
+
       /// \brief Pause signal
       public: static EventT<void (bool)> pause;
 
@@ -239,6 +231,9 @@ namespace gazebo
       /// \brief Simulation stop signal
       public: static EventT<void ()> stop;
 
+      /// \brief Simulation stop signal
+      public: static EventT<void ()> sigInt;
+
       /// \brief A world has been created
       public: static EventT<void (std::string)> worldCreated;
 
@@ -255,9 +250,6 @@ namespace gazebo
       public: static EventT<void (std::string)> deleteEntity;
 
       /// \brief World update has started
-      public: static EventT<void ()> worldUpdateStart;
-
-      /// \brief World update has started
       public: static EventT<void (const common::UpdateInfo &)> worldUpdateBegin;
 
       /// \brief World update has ended
diff --git a/gazebo/common/Exception.cc b/gazebo/common/Exception.cc
index 9f421b0..40befba 100644
--- a/gazebo/common/Exception.cc
+++ b/gazebo/common/Exception.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,8 +20,8 @@
  * Date: 07 May 2007
  */
 
-#include "common/Console.hh"
-#include "common/Exception.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
 
 using namespace gazebo;
 using namespace common;
@@ -49,8 +49,7 @@ Exception::~Exception()
 //////////////////////////////////////////////////
 void Exception::Print() const
 {
-  gazebo::common::Console::Instance()->ColorErr("Exception",
-      this->file, this->line, 31) << *this << "\n";
+  gzerr << "EXCEPTION: " << *this << std::endl;
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/common/Exception.hh b/gazebo/common/Exception.hh
index a1555e2..199e4a9 100644
--- a/gazebo/common/Exception.hh
+++ b/gazebo/common/Exception.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
 #include <iostream>
 #include <sstream>
 #include <string>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -41,7 +42,7 @@ namespace gazebo
 
     /// \class Exception Exception.hh common/common.hh
     /// \brief Class for generating exceptions
-    class Exception
+    class GAZEBO_VISIBLE Exception
     {
       /// \brief Constructor
       public: Exception();
@@ -91,7 +92,7 @@ namespace gazebo
     /// \brief Class for generating Internal Gazebo Errors:
     ///        those errors which should never happend and
     ///        represent programming bugs.
-    class InternalError : public Exception
+    class GAZEBO_VISIBLE InternalError : public Exception
     {
       /// \brief Constructor
       public: InternalError();
@@ -112,7 +113,7 @@ namespace gazebo
     ///        gazebo assertions. They include information about the
     ///        assertion expression violated, function where problem
     ///        appeared and assertion debug message.
-    class AssertionInternalError : public InternalError
+    class GAZEBO_VISIBLE AssertionInternalError : public InternalError
     {
       /// \brief Constructor for assertions
       /// \param[in] _file File name
diff --git a/gazebo/common/Exception_TEST.cc b/gazebo/common/Exception_TEST.cc
index 47781d4..09b4597 100644
--- a/gazebo/common/Exception_TEST.cc
+++ b/gazebo/common/Exception_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,13 @@
 
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Exception.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(Exception, Exception)
+class Exception : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(Exception, Exception)
 {
   try
   {
@@ -35,21 +38,21 @@ TEST(Exception, Exception)
   }
 }
 
-TEST(Exception, InternalError_DefaultConstructor_Throw)
+TEST_F(Exception, InternalError_DefaultConstructor_Throw)
 {
   ASSERT_THROW(
     throw common::InternalError(),
     common::InternalError);
 }
 
-TEST(Exception, InternalError_FileLineMsgConstructor_Throw)
+TEST_F(Exception, InternalError_FileLineMsgConstructor_Throw)
 {
   ASSERT_THROW(
       throw common::InternalError(__FILE__, __LINE__, "test"),
       common::InternalError);
 }
 
-TEST(Exception, InternalAssertionError_AssertionConstructor_Throw)
+TEST_F(Exception, InternalAssertionError_AssertionConstructor_Throw)
 {
   ASSERT_THROW(
       throw common::AssertionInternalError(__FILE__, __LINE__, "expression",
@@ -58,20 +61,20 @@ TEST(Exception, InternalAssertionError_AssertionConstructor_Throw)
 }
 
 #if defined(BOOST_DISABLE_ASSERTS) || defined(NDEBUG)
-TEST(Exception, GZASSERT_Disabled_NoThrow)
+TEST_F(Exception, GZASSERT_Disabled_NoThrow)
 {
   ASSERT_NO_THROW(
      GZ_ASSERT(true == false, "Assert thrown"));
 }
 #elif defined(BOOST_ENABLE_ASSERT_HANDLER)
-TEST(Exception, GZASSERT_WithHandler_ThrowException)
+TEST_F(Exception, GZASSERT_WithHandler_ThrowException)
 {
   ASSERT_THROW(
     GZ_ASSERT(true == false, "Assert thrown"),
                common::AssertionInternalError);
 }
 #else
-TEST(Exception, GZASSERT_Enabled_ThrowAssertion)
+TEST_F(Exception, GZASSERT_Enabled_ThrowAssertion)
 {
     ASSERT_DEATH(
       GZ_ASSERT(true == false, "Assert thrown"),
diff --git a/gazebo/common/HeightmapData.hh b/gazebo/common/HeightmapData.hh
new file mode 100644
index 0000000..f6fab49
--- /dev/null
+++ b/gazebo/common/HeightmapData.hh
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_HEIGHTMAPDATA_HH_
+#define _GAZEBO_HEIGHTMAPDATA_HH_
+
+#include <vector>
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace common
+  {
+    /// \addtogroup gazebo_common Common
+    /// \{
+
+    /// \class HeightmapData HeightmapData.hh common/common.hh
+    /// \brief Encapsulates a generic heightmap data file.
+    class GAZEBO_VISIBLE HeightmapData
+    {
+      /// \brief Destructor.
+      public: virtual ~HeightmapData() {}
+
+      /// \brief Create a lookup table of the terrain's height.
+      /// \param[in] _subsampling Multiplier used to increase the resolution.
+      /// Ex: A subsampling of 2 in a terrain of 129x129 means that the height
+      /// vector will be 257 * 257.
+      /// \param[in] _vertSize Number of points per row.
+      /// \param[in] _size Real dimmensions of the terrain.
+      /// \param[in] _scale Vector3 used to scale the height.
+      /// \param[in] _flipY If true, it inverts the order in which the vector
+      /// is filled.
+      /// \param[out] _heights Vector containing the terrain heights.
+      public: virtual void FillHeightMap(int _subSampling,
+          unsigned int _vertSize, const math::Vector3 &_size,
+          const math::Vector3 &_scale, bool _flipY,
+          std::vector<float> &_heights) = 0;
+
+      /// \brief Get the terrain's height.
+      /// \return The terrain's height.
+      public: virtual unsigned int GetHeight() const = 0;
+
+      /// \brief Get the terrain's width.
+      /// \return The terrain's width.
+      public: virtual unsigned int GetWidth() const = 0;
+
+      /// \brief Get the maximum terrain's elevation.
+      /// \return The maximum terrain's elevation.
+      public: virtual float GetMaxElevation() const = 0;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/common/Image.cc b/gazebo/common/Image.cc
index 639602e..6206577 100644
--- a/gazebo/common/Image.cc
+++ b/gazebo/common/Image.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,18 +19,14 @@
  * Date: 14 July 2008
  */
 
-#include <unistd.h>
-#include <dirent.h>
-#include <string.h>
-
-#include <iostream>
 #include <boost/filesystem.hpp>
+#include <string>
 
-#include "math/Vector3.hh"
-#include "common/Common.hh"
-#include "common/Console.hh"
-#include "common/Image.hh"
-#include "common/SystemPaths.hh"
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Image.hh"
+#include "gazebo/math/Vector3.hh"
 
 using namespace gazebo;
 using namespace common;
@@ -270,7 +266,7 @@ unsigned int Image::GetBPP() const
 }
 
 //////////////////////////////////////////////////
-Color Image::GetPixel(unsigned int _x, unsigned int _y)
+Color Image::GetPixel(unsigned int _x, unsigned int _y) const
 {
   Color clr;
 
@@ -346,7 +342,7 @@ Color Image::GetAvgColor()
 }
 
 //////////////////////////////////////////////////
-Color Image::GetMaxColor()
+Color Image::GetMaxColor() const
 {
   unsigned int x, y;
   Color clr;
@@ -374,7 +370,7 @@ Color Image::GetMaxColor()
 void Image::Rescale(int _width, int _height)
 {
   this->bitmap = FreeImage_Rescale(this->bitmap, _width, _height,
-      FILTER_BICUBIC);
+      FILTER_LANCZOS3);
 }
 
 //////////////////////////////////////////////////
@@ -437,4 +433,3 @@ Image::PixelFormat Image::ConvertPixelFormat(const std::string &_format)
 
   return UNKNOWN_PIXEL_FORMAT;
 }
-
diff --git a/gazebo/common/Image.hh b/gazebo/common/Image.hh
index 76df256..00a7349 100644
--- a/gazebo/common/Image.hh
+++ b/gazebo/common/Image.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,8 +28,8 @@
 #include <FreeImage.h>
 #include <string>
 
-#include "common/CommonTypes.hh"
-#include "common/Color.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -65,7 +65,7 @@ namespace gazebo
 
     /// \class Image Image.hh common/common.hh
     /// \brief Encapsulates an image
-    class Image
+    class GAZEBO_VISIBLE Image
     {
       /// \brief Pixel formats enumeration
       public: enum PixelFormat
@@ -108,6 +108,7 @@ namespace gazebo
 
       /// \brief Load an image. Return 0 on success
       /// \param[in] _filename the path to the image file
+      /// \return 0 when the operation succeeds to open a file or -1 when fails.
       public: int Load(const std::string &_filename);
 
       /// \brief Save the image in PNG format
@@ -164,7 +165,8 @@ namespace gazebo
       /// \brief Get a pixel color value
       /// \param[in] _x Column location in the image
       /// \param[in] _y Row location in the image
-      public: Color GetPixel(unsigned int _x, unsigned int _y);
+      /// \return The color of the given pixel
+      public: Color GetPixel(unsigned int _x, unsigned int _y) const;
 
       /// \brief Get the average color
       /// \return The average color
@@ -172,7 +174,7 @@ namespace gazebo
 
       /// \brief Get the max color
       /// \return The max color
-      public: Color GetMaxColor();
+      public: Color GetMaxColor() const;
 
       /// \brief Rescale the image
       /// \param[in] _width New image width
@@ -185,7 +187,7 @@ namespace gazebo
 
       /// \brief Implementation of GetData
       private: void GetDataImpl(unsigned char **_data, unsigned int &_count,
-                        FIBITMAP *_img) const;
+          FIBITMAP *_img) const;
 
       /// \brief Count the number of images created. Used for initialising
       /// free image
diff --git a/gazebo/common/ImageHeightmap.cc b/gazebo/common/ImageHeightmap.cc
new file mode 100644
index 0000000..a2c9061
--- /dev/null
+++ b/gazebo/common/ImageHeightmap.cc
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/ImageHeightmap.hh"
+
+using namespace gazebo;
+using namespace common;
+
+//////////////////////////////////////////////////
+ImageHeightmap::ImageHeightmap()
+{
+}
+
+//////////////////////////////////////////////////
+int ImageHeightmap::Load(const std::string &_filename)
+{
+  if (this->img.Load(_filename) != 0)
+  {
+    gzerr << "Unable to load image file as a terrain [" << _filename << "]\n";
+    return -1;
+  }
+
+  return 0;
+}
+
+//////////////////////////////////////////////////
+void ImageHeightmap::FillHeightMap(int _subSampling,
+    unsigned int _vertSize, const math::Vector3 &_size,
+    const math::Vector3 &_scale, bool _flipY,
+    std::vector<float> &_heights)
+{
+  // Resize the vector to match the size of the vertices.
+  _heights.resize(_vertSize * _vertSize);
+
+  int imgHeight = this->GetHeight();
+  int imgWidth = this->GetWidth();
+
+  GZ_ASSERT(imgWidth == imgHeight, "Heightmap image must be square");
+
+  // Bytes per row
+  unsigned int pitch = this->img.GetPitch();
+
+  // Bytes per pixel
+  unsigned int bpp = pitch / imgWidth;
+
+  unsigned char *data = NULL;
+  unsigned int count;
+  this->img.GetData(&data, count);
+
+  // Iterate over all the vertices
+  for (unsigned int y = 0; y < _vertSize; ++y)
+  {
+    // yf ranges between 0 and 4
+    double yf = y / static_cast<double>(_subSampling);
+    int y1 = floor(yf);
+    int y2 = ceil(yf);
+    if (y2 >= imgHeight)
+      y2 = imgHeight-1;
+    double dy = yf - y1;
+
+    for (unsigned int x = 0; x < _vertSize; ++x)
+    {
+      double xf = x / static_cast<double>(_subSampling);
+      int x1 = floor(xf);
+      int x2 = ceil(xf);
+      if (x2 >= imgWidth)
+        x2 = imgWidth-1;
+      double dx = xf - x1;
+
+      double px1 = static_cast<int>(data[y1 * pitch + x1 * bpp]) / 255.0;
+      double px2 = static_cast<int>(data[y1 * pitch + x2 * bpp]) / 255.0;
+      float h1 = (px1 - ((px1 - px2) * dx));
+
+      double px3 = static_cast<int>(data[y2 * pitch + x1 * bpp]) / 255.0;
+      double px4 = static_cast<int>(data[y2 * pitch + x2 * bpp]) / 255.0;
+      float h2 = (px3 - ((px3 - px4) * dx));
+
+      float h = (h1 - ((h1 - h2) * dy)) * _scale.z;
+
+      // invert pixel definition so 1=ground, 0=full height,
+      //   if the terrain size has a negative z component
+      //   this is mainly for backward compatibility
+      if (_size.z < 0)
+        h = 1.0 - h;
+
+      // Store the height for future use
+      if (!_flipY)
+        _heights[y * _vertSize + x] = h;
+      else
+        _heights[(_vertSize - y - 1) * _vertSize + x] = h;
+    }
+  }
+
+  delete [] data;
+}
+
+//////////////////////////////////////////////////
+std::string ImageHeightmap::GetFilename() const
+{
+  return this->img.GetFilename();
+}
+
+//////////////////////////////////////////////////
+unsigned int ImageHeightmap::GetHeight() const
+{
+  return this->img.GetHeight();
+}
+
+//////////////////////////////////////////////////
+unsigned int ImageHeightmap::GetWidth() const
+{
+  return this->img.GetWidth();
+}
+
+//////////////////////////////////////////////////
+float ImageHeightmap::GetMaxElevation() const
+{
+  return this->img.GetMaxColor().r;
+}
diff --git a/gazebo/common/ImageHeightmap.hh b/gazebo/common/ImageHeightmap.hh
new file mode 100644
index 0000000..51cbc9c
--- /dev/null
+++ b/gazebo/common/ImageHeightmap.hh
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _IMAGE_HEIGHTMAP_DATA_HH_
+#define _IMAGE_HEIGHTMAP_DATA_HH_
+
+#include <string>
+#include <vector>
+#include "gazebo/common/HeightmapData.hh"
+#include "gazebo/common/Image.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace common
+  {
+    /// \addtogroup gazebo_common Common
+    /// \{
+
+    /// \class ImageHeightmap ImageHeightmap.hh common/common.hh
+    /// \brief Encapsulates an image that will be interpreted as a heightmap.
+    class GAZEBO_VISIBLE ImageHeightmap
+      : public gazebo::common::HeightmapData
+    {
+      /// \brief Constructor
+      /// \param[in] _filename the path to the image
+      public: ImageHeightmap();
+
+      /// \brief Load an image file as a heightmap.
+      /// \param[in] _filename the path to the image file.
+      /// \return True when the operation succeeds to open a file.
+      public: int Load(const std::string &_filename="");
+
+      // Documentation inherited.
+      public: void FillHeightMap(int _subSampling, unsigned int _vertSize,
+          const math::Vector3 &_size, const math::Vector3 &_scale, bool _flipY,
+          std::vector<float> &_heights);
+
+      /// \brief Get the full filename of the image
+      /// \return The filename used to load the image
+      public: std::string GetFilename() const;
+
+      // Documentation inherited.
+      public: unsigned int GetHeight() const;
+
+      // Documentation inherited.
+      public: unsigned int GetWidth() const;
+
+      // Documentation inherited.
+      public: float GetMaxElevation() const;
+
+      /// \brief Image containing the heightmap data.
+      private: gazebo::common::Image img;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/common/ImageHeightmap_TEST.cc b/gazebo/common/ImageHeightmap_TEST.cc
new file mode 100644
index 0000000..dd76958
--- /dev/null
+++ b/gazebo/common/ImageHeightmap_TEST.cc
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/filesystem.hpp>
+#include <gtest/gtest.h>
+
+#include "gazebo/common/ImageHeightmap.hh"
+#include "test_config.h"
+#include "test/util.hh"
+
+#define ELEVATION_TOL 1e-8
+
+using namespace gazebo;
+
+class ImageHeightmapTest : public gazebo::testing::AutoLogFixture { };
+
+class DemTest : public gazebo::testing::AutoLogFixture { };
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, MisingFile)
+{
+  common::ImageHeightmap img;
+  EXPECT_EQ(-1, img.Load("/file/shouldn/never/exist.png"));
+}
+
+/////////////////////////////////////////////////
+TEST_F(DemTest, NotImage)
+{
+  common::ImageHeightmap img;
+  boost::filesystem::path path = TEST_PATH;
+
+  path /= "data/dem_portrait.tif";
+  EXPECT_EQ(-1, img.Load(path.string()));
+}
+
+/////////////////////////////////////////////////
+TEST_F(ImageHeightmapTest, BasicAPI)
+{
+  common::ImageHeightmap img;
+  std::string path;
+
+  path = "file://media/materials/textures/heightmap_bowl.png";
+  EXPECT_EQ(0, img.Load(path));
+
+  // Check the heights and widths
+  EXPECT_EQ(129, static_cast<int>(img.GetHeight()));
+  EXPECT_EQ(129, static_cast<int>(img.GetWidth()));
+  EXPECT_NEAR(0.99607843, img.GetMaxElevation(), ELEVATION_TOL);
+}
+
+/////////////////////////////////////////////////
+TEST_F(ImageHeightmapTest, FillHeightmap)
+{
+  common::ImageHeightmap img;
+  std::string path;
+
+  path = "file://media/materials/textures/heightmap_bowl.png";
+  EXPECT_EQ(0, img.Load(path));
+
+  // Use FillHeightMap() to retrieve a vector<float> after some transformations
+  int subsampling;
+  unsigned vertSize;
+  math::Vector3 size;
+  math::Vector3 scale;
+  bool flipY;
+  std::vector<float> elevations;
+
+  subsampling = 2;
+  vertSize = (img.GetWidth() * subsampling) - 1;
+  size.x = 129;
+  size.y = 129;
+  size.z = 10;
+  scale.x = size.x / vertSize;
+  scale.y = size.y / vertSize;
+  if (math::equal(img.GetMaxElevation(), 0.0f))
+    scale.z = fabs(size.z);
+  else
+    scale.z = fabs(size.z) / img.GetMaxElevation();
+  flipY = false;
+
+  img.FillHeightMap(subsampling, vertSize, size, scale, flipY, elevations);
+
+  // Check the size of the returned vector
+  EXPECT_EQ(vertSize * vertSize, elevations.size());
+
+  // Check the elevation of some control points
+  EXPECT_NEAR(0.0, elevations.at(0), ELEVATION_TOL);
+  EXPECT_NEAR(10.0, elevations.at(elevations.size() - 1), ELEVATION_TOL);
+  EXPECT_NEAR(5.0, elevations.at(elevations.size() / 2), ELEVATION_TOL);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/common/Image_TEST.cc b/gazebo/common/Image_TEST.cc
index 5b2a230..7fe63b9 100644
--- a/gazebo/common/Image_TEST.cc
+++ b/gazebo/common/Image_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,10 +18,13 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/common/Image.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(ImageTest, Image)
+class ImageTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(ImageTest, Image)
 {
   common::Image img;
   EXPECT_EQ(-1, img.Load("/file/shouldn/never/exist.png"));
diff --git a/gazebo/common/KeyEvent.hh b/gazebo/common/KeyEvent.hh
new file mode 100644
index 0000000..9bba693
--- /dev/null
+++ b/gazebo/common/KeyEvent.hh
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _KEYEVENT_HH_
+#define _KEYEVENT_HH_
+
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace common
+  {
+    /// \addtogroup gazebo_common
+    /// \{
+
+    /// \class KeyEvent KeyEvent.hh common/common.hh
+    /// \brief Generic description of a keyboard event.
+    class GAZEBO_VISIBLE KeyEvent
+    {
+      /// \brief Key event types enumeration.
+      public: enum EventType {NO_EVENT, PRESS, RELEASE};
+
+      /// \brief Constructor.
+      public: KeyEvent()
+              : type(NO_EVENT), key(0)
+              {}
+
+      /// \brief Event type.
+      public: EventType type;
+
+      public: int key;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/common/KeyFrame.cc b/gazebo/common/KeyFrame.cc
index ddf5a2a..647c508 100644
--- a/gazebo/common/KeyFrame.cc
+++ b/gazebo/common/KeyFrame.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/common/KeyFrame.hh b/gazebo/common/KeyFrame.hh
index 23f0255..b3cd87f 100644
--- a/gazebo/common/KeyFrame.hh
+++ b/gazebo/common/KeyFrame.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,8 +17,9 @@
 #ifndef _KEYFRAME_HH_
 #define _KEYFRAME_HH_
 
-#include "math/Vector3.hh"
-#include "math/Quaternion.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,7 @@ namespace gazebo
 
     /// \class KeyFrame KeyFrame.hh common/common.hh
     /// \brief A key frame in an animation
-    class KeyFrame
+    class GAZEBO_VISIBLE KeyFrame
     {
       /// \brief Constructor
       /// \param[in] _time Time of the keyframe in seconds
@@ -47,7 +48,7 @@ namespace gazebo
     };
 
     /// \brief A keyframe for a PoseAnimation
-    class PoseKeyFrame : public KeyFrame
+    class GAZEBO_VISIBLE PoseKeyFrame : public KeyFrame
     {
       /// \brief Constructor
       /// \param[in] _time of the keyframe
@@ -80,7 +81,7 @@ namespace gazebo
     };
 
     /// \brief A keyframe for a NumericAnimation
-    class NumericKeyFrame : public KeyFrame
+    class GAZEBO_VISIBLE NumericKeyFrame : public KeyFrame
     {
       /// \brief Constructor
       /// \param[in] _time Time of the keyframe
diff --git a/gazebo/common/LogPlay.cc b/gazebo/common/LogPlay.cc
deleted file mode 100644
index 9179190..0000000
--- a/gazebo/common/LogPlay.cc
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <boost/filesystem.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/iostreams/filter/bzip2.hpp>
-#include <boost/iostreams/filtering_stream.hpp>
-#include <boost/iostreams/copy.hpp>
-#include <boost/archive/iterators/base64_from_binary.hpp>
-#include <boost/archive/iterators/binary_from_base64.hpp>
-#include <boost/archive/iterators/remove_whitespace.hpp>
-#include <boost/archive/iterators/istream_iterator.hpp>
-#include <boost/archive/iterators/transform_width.hpp>
-
-#include "gazebo/math/Rand.hh"
-
-#include "gazebo/common/Exception.hh"
-#include "gazebo/common/Console.hh"
-#include "gazebo/common/LogRecord.hh"
-#include "gazebo/common/LogPlay.hh"
-
-using namespace gazebo;
-using namespace common;
-
-/////////////////////////////////////////////////
-// Convert a Base64 string.
-// We have to use our own function, instead of just using the
-// boost::archive iterators, because the boost::archive iterators throw an
-// error when the end of the Base64 string is reached. The expection then
-// causes nothing to happen.
-// TLDR; Boost is broken.
-void base64_decode(std::string &_dest, const std::string &_src)
-{
-  typedef boost::archive::iterators::transform_width<
-    boost::archive::iterators::binary_from_base64<const char*>, 8, 6>
-    base64_dec;
-
-  try
-  {
-    base64_dec srcIter(_src.c_str());
-    for (unsigned int i = 0; i < _src.size(); ++i)
-    {
-      _dest += *srcIter;
-      ++srcIter;
-    }
-  }
-  catch(boost::archive::iterators::dataflow_exception &)
-  {
-  }
-}
-
-/////////////////////////////////////////////////
-LogPlay::LogPlay()
-{
-  this->logStartXml = NULL;
-}
-
-/////////////////////////////////////////////////
-LogPlay::~LogPlay()
-{
-}
-
-/////////////////////////////////////////////////
-void LogPlay::Open(const std::string &_logFile)
-{
-  boost::filesystem::path path(_logFile);
-  if (!boost::filesystem::exists(path))
-    gzthrow("Invalid logfile[" + _logFile + "]. Does not exist.");
-
-  // Parse the log file
-  if (!this->xmlDoc.LoadFile(_logFile))
-    gzthrow("Unable to parser log file[" << _logFile << "]");
-
-  // Get the gazebo_log element
-  this->logStartXml = this->xmlDoc.FirstChildElement("gazebo_log");
-
-  if (!this->logStartXml)
-    gzthrow("Log file is missing the <gazebo_log> element");
-
-  // Store the filename for future use.
-  this->filename = _logFile;
-
-  // Read in the header.
-  this->ReadHeader();
-
-  this->logCurrXml = this->logStartXml;
-  this->encoding.clear();
-}
-
-/////////////////////////////////////////////////
-void LogPlay::ReadHeader()
-{
-  this->randSeed = math::Rand::GetSeed();
-  TiXmlElement *headerXml, *childXml;
-
-  this->logVersion.clear();
-  this->gazeboVersion.clear();
-
-  // Get the header element
-  headerXml = this->logStartXml->FirstChildElement("header");
-  if (!headerXml)
-    gzthrow("Log file has no header");
-
-  // Get the log format version
-  childXml = headerXml->FirstChildElement("log_version");
-  if (!childXml)
-    gzerr << "Log file header is missing the log version.\n";
-  else
-    this->logVersion = childXml->GetText();
-
-  // Get the gazebo version
-  childXml = headerXml->FirstChildElement("gazebo_version");
-  if (!childXml)
-    gzerr << "Log file header is missing the gazebo version.\n";
-  else
-    this->gazeboVersion = childXml->GetText();
-
-  // Get the random number seed.
-  childXml = headerXml->FirstChildElement("rand_seed");
-  if (!childXml)
-    gzerr << "Log file header is missing the random number seed.\n";
-  else
-    this->randSeed = boost::lexical_cast<uint32_t>(childXml->GetText());
-
-  if (this->logVersion != GZ_LOG_VERSION)
-    gzwarn << "Log version[" << this->logVersion << "] in file["
-           << this->filename
-           << "] does not match Gazebo's log version["
-           << GZ_LOG_VERSION << "]\n";
-
-  /// Set the random number seed for simulation
-  math::Rand::SetSeed(this->randSeed);
-}
-
-/////////////////////////////////////////////////
-bool LogPlay::IsOpen() const
-{
-  return this->logStartXml != NULL;
-}
-
-/////////////////////////////////////////////////
-std::string LogPlay::GetLogVersion() const
-{
-  return this->logVersion;
-}
-
-/////////////////////////////////////////////////
-std::string LogPlay::GetGazeboVersion() const
-{
-  return this->gazeboVersion;
-}
-
-/////////////////////////////////////////////////
-uint32_t LogPlay::GetRandSeed() const
-{
-  return this->randSeed;
-}
-
-/////////////////////////////////////////////////
-bool LogPlay::Step(std::string &_data)
-{
-  if (this->logCurrXml == this->logStartXml)
-    this->logCurrXml = this->logStartXml->FirstChildElement("chunk");
-  else if (this->logCurrXml)
-    this->logCurrXml = this->logCurrXml->NextSiblingElement("chunk");
-  else
-    return false;
-
-  return this->GetChunkData(this->logCurrXml, _data);
-}
-
-/////////////////////////////////////////////////
-bool LogPlay::GetChunk(unsigned int _index, std::string &_data)
-{
-  unsigned int count = 0;
-  TiXmlElement *xml = this->logStartXml->FirstChildElement("chunk");
-
-  while (xml && count < _index)
-  {
-    count++;
-    xml = xml->NextSiblingElement("chunk");
-  }
-
-  if (xml && count == _index)
-    return this->GetChunkData(xml, _data);
-  else
-    return false;
-}
-
-/////////////////////////////////////////////////
-bool LogPlay::GetChunkData(TiXmlElement *_xml, std::string &_data)
-{
-  // Make sure we have valid xml pointer
-  if (!_xml)
-    return false;
-
-  /// Get the chunk's encoding
-  this->encoding = _xml->Attribute("encoding");
-
-  // Make sure there is an encoding value.
-  if (this->encoding.empty())
-    gzthrow("Enconding missing for a chunk in log file[" +
-        this->filename + "]");
-
-  if (this->encoding == "txt")
-    _data = _xml->GetText();
-  else if (this->encoding == "bz2")
-  {
-    std::string data = _xml->GetText();
-    std::string buffer;
-
-    // Decode the base64 string
-    base64_decode(buffer, data);
-
-    // Decompress the bz2 data
-    {
-      boost::iostreams::filtering_istream in;
-      in.push(boost::iostreams::bzip2_decompressor());
-      in.push(boost::make_iterator_range(buffer));
-
-      // Get the data
-      std::getline(in, _data, '\0');
-    }
-  }
-  else
-  {
-    gzerr << "Inavlid encoding[" << this->encoding << "] in log file["
-      << this->filename << "]\n";
-    return false;
-  }
-
-  return true;
-}
-
-/////////////////////////////////////////////////
-std::string LogPlay::GetEncoding() const
-{
-  return this->encoding;
-}
-
-/////////////////////////////////////////////////
-unsigned int LogPlay::GetChunkCount() const
-{
-  unsigned int count = 0;
-  TiXmlElement *xml = this->logStartXml->FirstChildElement("chunk");
-
-  while (xml)
-  {
-    count++;
-    xml = xml->NextSiblingElement("chunk");
-  }
-
-  return count;
-}
diff --git a/gazebo/common/LogPlay.hh b/gazebo/common/LogPlay.hh
deleted file mode 100644
index f61f351..0000000
--- a/gazebo/common/LogPlay.hh
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#ifndef _LOGPLAY_HH_
-#define _LOGPLAY_HH_
-
-#include <tinyxml.h>
-
-#include <list>
-#include <string>
-#include <fstream>
-
-#include "common/SingletonT.hh"
-
-namespace gazebo
-{
-  namespace common
-  {
-    /// \addtogroup gazebo_physics
-    /// \{
-
-    /// \class Logplay Logplay.hh common/common.hh
-    /// \brief Open and playback log files that were recorded using LogRecord.
-    ///
-    /// Use Logplay to open a log file (Logplay::Open), and access the
-    /// recorded state information. Iterators are available to step through
-    /// the state information. It is also possible to replay the data in a
-    /// World using the Play functions. Replay involves reading and applying
-    /// state information to a World.
-    ///
-    /// \sa LogRecord, State
-    class LogPlay : public SingletonT<LogPlay>
-    {
-      /// \brief Constructor
-      private: LogPlay();
-
-      /// \brief Destructor
-      private: virtual ~LogPlay();
-
-      /// \brief Open a log file for reading
-      ///
-      /// Open a log file that was previously recorded.
-      /// \param[in] _logFile The file to load
-      /// \throws Exception
-      public: void Open(const std::string &_logFile);
-
-      /// \brief Return true if a file is open.
-      /// \return True if a log file is open.
-      public: bool IsOpen() const;
-
-      /// \brief Get the log version number of the open log file.
-      /// \return The log version of the open log file. Empty string if
-      /// a log file is not open.
-      public: std::string GetLogVersion() const;
-
-      /// \brief Get the Gazebo version number of the open log file.
-      /// \return The Gazebo version of the open log file. Empty string if
-      /// a log file is not open.
-      public: std::string GetGazeboVersion() const;
-
-      /// \brief Get the random number seed of the open log file.
-      /// \return The random number seed the open log file. The current
-      /// random number seed, as defined in math::Rand::GetSeed.
-      public: uint32_t GetRandSeed() const;
-
-      /// \brief Step through the open log file.
-      /// \param[out] _data Data from next entry in the log file.
-      public: bool Step(std::string &_data);
-
-      /// \brief Get the number of chunks (steps) in the open log file.
-      /// \return The number of recorded states in the log file.
-      public: unsigned int GetChunkCount() const;
-
-      /// \brief Get data for a particular chunk index.
-      /// \param[in] _index Index of the chunk.
-      /// \param[out] _data Storage for the chunk's data.
-      /// \return True if the _index was valid.
-      public: bool GetChunk(unsigned int _index, std::string &_data);
-
-      /// \brief Get the type of encoding used for current chunck in the
-      /// open log file.
-      /// \return The type of encoding. An empty string will be returned if
-      /// LogPlay::Step has not been called at least once.
-      public: std::string GetEncoding() const;
-
-      /// \brief Helper function to get chunk data from XML.
-      /// \param[in] _xml Pointer to an xml block that has state data.
-      /// \param[out] _data Storage for the chunk's data.
-      /// \return True if the chunk was successfully parsed.
-      private: bool GetChunkData(TiXmlElement *_xml, std::string &_data);
-
-      /// \brief Read the header from the log file.
-      private: void ReadHeader();
-
-      /// \brief The XML document of the log file.
-      private: TiXmlDocument xmlDoc;
-
-      /// \brief Start of the log.
-      private: TiXmlElement *logStartXml;
-
-      /// \brief Current position in the log file.
-      private: TiXmlElement *logCurrXml;
-
-      /// \brief Name of the log file.
-      private: std::string filename;
-
-      /// \brief The version of the Gazebo logger used to create the open
-      /// log file.
-      private: std::string logVersion;
-
-      /// \brief The version of Gazebo used to create the open log file.
-      private: std::string gazeboVersion;
-
-      /// \brief The random number seed recorded in the open log file.
-      private: uint32_t randSeed;
-
-      /// \brief The encoding for the current chunk in the log file.
-      private: std::string encoding;
-
-      /// \brief This is a singleton
-      private: friend class SingletonT<LogPlay>;
-    };
-    /// \}
-  }
-}
-
-#endif
diff --git a/gazebo/common/LogRecord.cc b/gazebo/common/LogRecord.cc
deleted file mode 100644
index d2bb404..0000000
--- a/gazebo/common/LogRecord.cc
+++ /dev/null
@@ -1,607 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-#include <iomanip>
-#include <boost/filesystem.hpp>
-#include <boost/iostreams/filter/bzip2.hpp>
-#include <boost/iostreams/filtering_stream.hpp>
-#include <boost/iostreams/copy.hpp>
-#include <boost/date_time.hpp>
-
-#include "gazebo/math/Rand.hh"
-
-#include "gazebo/common/Assert.hh"
-#include "gazebo/common/Events.hh"
-#include "gazebo/common/Time.hh"
-#include "gazebo/common/Console.hh"
-#include "gazebo/common/Exception.hh"
-#include "gazebo/common/LogRecord.hh"
-
-#include "gazebo/gazebo_config.h"
-
-using namespace gazebo;
-using namespace common;
-
-/// Convert binary values to base64 characters
-typedef boost::archive::iterators::base64_from_binary<
-        // retrieve 6 bit integers from a sequence of 8 bit bytes
-        boost::archive::iterators::transform_width<const char *, 6, 8> >
-        Base64Text;
-
-//////////////////////////////////////////////////
-LogRecord::LogRecord()
-{
-  this->running = false;
-  this->paused = false;
-  this->initialized = false;
-  this->stopThread = false;
-  this->firstUpdate = true;
-
-  // Get the user's home directory
-  // \todo getenv is not portable, and there is no generic cross-platform
-  // method. Must check OS and choose a method
-  char *homePath = getenv("HOME");
-  GZ_ASSERT(homePath, "HOME environment variable is missing");
-
-  if (!homePath)
-    this->logBasePath = boost::filesystem::path("/tmp/gazebo");
-  else
-    this->logBasePath = boost::filesystem::path(homePath);
-
-  this->logBasePath /= "/.gazebo/log/";
-
-  this->logsEnd = this->logs.end();
-}
-
-//////////////////////////////////////////////////
-LogRecord::~LogRecord()
-{
-  // Stop the write thread.
-  this->Fini();
-}
-
-//////////////////////////////////////////////////
-bool LogRecord::Init(const std::string &_subdir)
-{
-  if (_subdir.empty())
-  {
-    gzerr << "LogRecord initialization directory is empty." << std::endl;
-    return false;
-  }
-
-  this->logSubDir = _subdir;
-
-  this->ClearLogs();
-
-  this->initialized = true;
-  this->running = false;
-  this->paused = false;
-  this->stopThread = false;
-  this->firstUpdate = true;
-
-  return true;
-}
-
-//////////////////////////////////////////////////
-bool LogRecord::Start(const std::string &_encoding)
-{
-  boost::mutex::scoped_lock lock(this->controlMutex);
-
-  // Make sure ::Init has been called.
-  if (!this->initialized)
-  {
-    gzerr << "LogRecord has not been initialized." << std::endl;
-    return false;
-  }
-
-  // Check to see if the logger is already started.
-  if (this->running)
-  {
-    /// \TODO replace this with gzlog
-    gzerr << "LogRecord has already been started" << std::endl;
-    return false;
-  }
-
-  // Get the current time as an ISO string.
-  std::string logTimeDir = common::Time::GetWallTimeAsISOString();
-
-  this->logCompletePath = this->logBasePath / logTimeDir / this->logSubDir;
-
-  // Create the log directory if necessary
-  if (!boost::filesystem::exists(this->logCompletePath))
-    boost::filesystem::create_directories(logCompletePath);
-
-  if (_encoding != "bz2" && _encoding != "txt")
-    gzthrow("Invalid log encoding[" + _encoding +
-            "]. Must be one of [bz2, txt]");
-
-  this->encoding = _encoding;
-
-  {
-    boost::mutex::scoped_lock logLock(this->writeMutex);
-    this->logsEnd = this->logs.end();
-
-    // Start all the logs
-    for (Log_M::iterator iter = this->logs.begin();
-         iter != this->logsEnd; ++iter)
-      iter->second->Start(logCompletePath);
-  }
-
-  // Listen to the world update event
-  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
-        boost::bind(&LogRecord::Update, this, _1));
-
-  // Start the writing thread if it has not already been started
-  if (!this->writeThread)
-    this->writeThread = new boost::thread(boost::bind(&LogRecord::Run, this));
-
-  this->running = true;
-  this->paused = false;
-  this->firstUpdate = true;
-
-  this->startTime = this->currTime = common::Time();
-
-  return true;
-}
-
-//////////////////////////////////////////////////
-const std::string &LogRecord::GetEncoding() const
-{
-  return this->encoding;
-}
-
-//////////////////////////////////////////////////
-void LogRecord::Fini()
-{
-  this->stopThread = true;
-
-  this->Stop();
-
-  // Wait for the write thread, if it exists
-  if (this->writeThread)
-    this->writeThread->join();
-  delete this->writeThread;
-  this->writeThread = NULL;
-}
-
-//////////////////////////////////////////////////
-void LogRecord::Stop()
-{
-  boost::mutex::scoped_lock lock(this->controlMutex);
-
-  // Disconnect from the world update signale
-  if (this->updateConnection)
-    event::Events::DisconnectWorldUpdateBegin(this->updateConnection);
-  this->updateConnection.reset();
-
-  // Kick the write thread
-  this->dataAvailableCondition.notify_one();
-
-  // Remove all the logs.
-  this->ClearLogs();
-
-  // Reset the times
-  this->startTime = this->currTime = common::Time();
-
-  // Reset the flags
-  this->running = false;
-  this->paused = false;
-}
-
-//////////////////////////////////////////////////
-void LogRecord::ClearLogs()
-{
-  boost::mutex::scoped_lock logLock(this->writeMutex);
-
-  // Delete all the log objects
-  for (Log_M::iterator iter = this->logs.begin();
-      iter != this->logs.end(); ++iter)
-  {
-    delete iter->second;
-  }
-
-  this->logs.clear();
-  this->logsEnd = this->logs.end();
-}
-
-//////////////////////////////////////////////////
-void LogRecord::SetPaused(bool _paused)
-{
-  this->paused = _paused;
-}
-
-//////////////////////////////////////////////////
-bool LogRecord::GetPaused() const
-{
-  return this->paused;
-}
-
-//////////////////////////////////////////////////
-bool LogRecord::GetRunning() const
-{
-  return this->running;
-}
-
-//////////////////////////////////////////////////
-void LogRecord::Add(const std::string &_name, const std::string &_filename,
-                    boost::function<bool (std::ostringstream &)> _logCallback)
-{
-  boost::mutex::scoped_lock logLock(this->writeMutex);
-
-  // Check to see if the log has already been added.
-  if (this->logs.find(_name) != this->logs.end())
-  {
-    /// \todo Good place to use GZ_ASSERT
-    /// GZ_ASSERT(this->logs.find(_name)->second != NULL);
-
-    if (this->logs.find(_name)->second->GetRelativeFilename() != _filename)
-    {
-      gzthrow(std::string("Attempting to add a duplicate log object named[")
-          + _name + "] with a filename of [" + _filename + "]\n");
-    }
-    else
-    {
-      return;
-    }
-  }
-
-  LogRecord::Log *newLog;
-
-  // Create a new log object
-  try
-  {
-    newLog = new LogRecord::Log(this, _filename, _logCallback);
-  }
-  catch(...)
-  {
-    gzthrow("Unable to create log. File permissions are probably bad.");
-  }
-
-  if (this->running)
-    newLog->Start(this->logCompletePath);
-
-  // Add the log to our map
-  this->logs[_name] = newLog;
-
-  // Update the pointer to the end of the log objects list.
-  this->logsEnd = this->logs.end();
-}
-
-//////////////////////////////////////////////////
-bool LogRecord::Remove(const std::string &_name)
-{
-  boost::mutex::scoped_lock logLock(this->writeMutex);
-
-  bool result = false;
-
-  Log_M::iterator iter = this->logs.find(_name);
-  if (iter != this->logs.end())
-  {
-    delete iter->second;
-    this->logs.erase(iter);
-
-    // Update the pointer to the end of the log objects list.
-    this->logsEnd = this->logs.end();
-
-    result = true;
-  }
-
-  return result;
-}
-
-//////////////////////////////////////////////////
-std::string LogRecord::GetFilename(const std::string &_name) const
-{
-  boost::mutex::scoped_lock logLock(this->writeMutex);
-
-  std::string result;
-
-  Log_M::const_iterator iter = this->logs.find(_name);
-  if (iter != this->logs.end())
-  {
-    /// \TODO GZ_ASSERT(iter->second);
-    result = iter->second->GetCompleteFilename();
-  }
-
-  return result;
-}
-
-//////////////////////////////////////////////////
-unsigned int LogRecord::GetFileSize(const std::string &_name) const
-{
-  unsigned int result = 0;
-
-  // Get the filename of the specified log object;
-  std::string filename = this->GetFilename(_name);
-
-  // Get the size of the log file on disk.
-  if (!filename.empty())
-  {
-    // Get the size of the file
-    if (!filename.empty() && boost::filesystem::exists(filename))
-      result = boost::filesystem::file_size(filename);
-  }
-
-  // Add in the contents of the write buffer. This is the data that will be
-  // written to disk soon.
-  {
-    boost::mutex::scoped_lock lock(this->writeMutex);
-    Log_M::const_iterator iter = this->logs.find(_name);
-
-    if (iter != this->logs.end())
-    {
-      GZ_ASSERT(iter->second, "Log object is NULL");
-      result += iter->second->GetBufferSize();
-    }
-  }
-
-  return result;
-}
-
-//////////////////////////////////////////////////
-void LogRecord::SetBasePath(const std::string &_path)
-{
-  // Make sure the  directory exists
-  if (!boost::filesystem::exists(_path))
-    boost::filesystem::create_directories(_path);
-
-  // Make sure we have a directory
-  if (!boost::filesystem::is_directory(_path))
-  {
-    gzerr << "Path " << _path << " is not a directory. Please only specify a "
-           << "directory for data logging.\n";
-    return;
-  }
-
-  // Make sure the path is writable.
-  // Note: This is not cross-platform compatible.
-  if (access(_path.c_str(), W_OK) != 0)
-  {
-    gzerr << "You do no have permission to write into " << _path << "\n";
-    return;
-  }
-
-  this->logBasePath = _path;
-}
-
-//////////////////////////////////////////////////
-std::string LogRecord::GetBasePath() const
-{
-  return this->logBasePath.string();
-}
-
-//////////////////////////////////////////////////
-bool LogRecord::GetFirstUpdate() const
-{
-  return this->firstUpdate;
-}
-
-//////////////////////////////////////////////////
-void LogRecord::Update(const common::UpdateInfo &_info)
-{
-  if (!this->paused)
-  {
-    unsigned int size = 0;
-
-    {
-      boost::mutex::scoped_lock lock(this->writeMutex);
-
-      // Collect all the new log data. This will not write data to disk.
-      for (this->updateIter = this->logs.begin();
-          this->updateIter != this->logsEnd; ++this->updateIter)
-      {
-        size += this->updateIter->second->Update();
-      }
-    }
-
-    if (this->firstUpdate)
-    {
-      this->firstUpdate = false;
-      this->startTime = _info.simTime;
-    }
-
-
-    // Signal that new data is available.
-    if (size > 0)
-      this->dataAvailableCondition.notify_one();
-
-    this->currTime = _info.simTime;
-  }
-}
-
-//////////////////////////////////////////////////
-void LogRecord::Run()
-{
-  if (!this->running)
-    gzerr << "Running LogRecord before it has been started." << std::endl;
-
-  this->stopThread = false;
-
-  // This loop will write data to disk.
-  while (!this->stopThread)
-  {
-    {
-      // Wait for new data.
-      boost::mutex::scoped_lock lock(this->writeMutex);
-      this->dataAvailableCondition.wait(lock);
-
-      // Collect all the new log data.
-      for (this->updateIter = this->logs.begin();
-           this->updateIter != this->logsEnd; ++this->updateIter)
-      {
-        this->updateIter->second->Write();
-      }
-    }
-
-    // Throttle the write loop.
-    common::Time::MSleep(1000);
-  }
-}
-
-//////////////////////////////////////////////////
-common::Time LogRecord::GetRunTime() const
-{
-  return this->currTime - this->startTime;
-}
-
-//////////////////////////////////////////////////
-LogRecord::Log::Log(LogRecord *_parent, const std::string &_relativeFilename,
-                 boost::function<bool (std::ostringstream &)> _logCB)
-{
-  this->parent = _parent;
-  this->logCB = _logCB;
-
-  this->relativeFilename = _relativeFilename;
-  std::ostringstream stream;
-  stream << "<?xml version='1.0'?>\n"
-         << "<gazebo_log>\n"
-         << "<header>\n"
-         << "<log_version>" << GZ_LOG_VERSION << "</log_version>\n"
-         << "<gazebo_version>" << GAZEBO_VERSION_FULL << "</gazebo_version>\n"
-         << "<rand_seed>" << math::Rand::GetSeed() << "</rand_seed>\n"
-         << "</header>\n";
-
-  this->buffer.append(stream.str());
-}
-
-//////////////////////////////////////////////////
-LogRecord::Log::~Log()
-{
-  std::string xmlEnd = "</gazebo_log>";
-  this->logFile.write(xmlEnd.c_str(), xmlEnd.size());
-
-  this->logFile.close();
-}
-
-//////////////////////////////////////////////////
-unsigned int LogRecord::Log::Update()
-{
-  std::ostringstream stream;
-
-  // Get log data via the callback.
-  if (this->logCB(stream) && !stream.str().empty())
-  {
-    const std::string encoding = this->parent->GetEncoding();
-
-    this->buffer.append("<chunk encoding='");
-    this->buffer.append(encoding);
-    this->buffer.append("'>\n");
-
-    this->buffer.append("<![CDATA[");
-    {
-      // Compress the data.
-      if (encoding == "bz2")
-      {
-        std::string str;
-
-        // Compress to bzip2
-        {
-          boost::iostreams::filtering_ostream out;
-          out.push(boost::iostreams::bzip2_compressor());
-          out.push(std::back_inserter(str));
-          out << stream.str();
-          out.flush();
-        }
-
-        // Encode in base64.
-        std::copy(Base64Text(str.c_str()),
-                  Base64Text(str.c_str() + str.size()),
-                  std::back_inserter(this->buffer));
-      }
-      else if (encoding == "txt")
-        this->buffer.append(stream.str());
-      else
-        gzerr << "Unknown log file encoding[" << encoding << "]\n";
-    }
-    this->buffer.append("]]>\n");
-
-    this->buffer.append("</chunk>\n");
-  }
-
-  return this->buffer.size();
-}
-
-//////////////////////////////////////////////////
-void LogRecord::Log::ClearBuffer()
-{
-  this->buffer.clear();
-}
-
-//////////////////////////////////////////////////
-unsigned int LogRecord::Log::GetBufferSize()
-{
-  return this->buffer.size();
-}
-
-//////////////////////////////////////////////////
-std::string LogRecord::Log::GetRelativeFilename() const
-{
-  return this->relativeFilename;
-}
-
-//////////////////////////////////////////////////
-std::string LogRecord::Log::GetCompleteFilename() const
-{
-  return this->completePath.string();
-}
-
-//////////////////////////////////////////////////
-void LogRecord::Log::Start(const boost::filesystem::path &_path)
-{
-  // Make the full path for the log file
-  this->completePath = _path / this->relativeFilename;
-
-  // Make sure the file does not exist
-  if (boost::filesystem::exists(this->completePath))
-    gzthrow("Filename[" + this->completePath.string() + "], already exists\n");
-}
-
-//////////////////////////////////////////////////
-void LogRecord::Log::Write()
-{
-  // Make sure the file is open for writing
-  if (!this->logFile.is_open())
-  {
-    // Try to open it...
-    this->logFile.open(this->completePath.string().c_str(),
-                       std::fstream::out | std::ios::binary);
-
-    // Throw an error if we couldn't open the file for writing.
-    if (!this->logFile.is_open())
-      gzthrow("Unable to open file for logging:" +
-              this->completePath.string() + "]");
-  }
-
-  // Check to see if the log file still exists on disk. This will catch the
-  // case when someone deletes a log file while recording.
-  if (!boost::filesystem::exists(this->completePath.string().c_str()))
-  {
-    gzerr << "Log file[" << this->completePath << "] no longer exists. "
-          << "Unable to write log data.\n";
-
-    // We have to clear the buffer, or else it may grow indefinitely.
-    this->buffer.clear();
-    return;
-  }
-
-
-  // Write out the contents of the buffer.
-  this->logFile.write(this->buffer.c_str(), this->buffer.size());
-  this->logFile.flush();
-
-  // Clear the buffer.
-  this->buffer.clear();
-}
diff --git a/gazebo/common/LogRecord.hh b/gazebo/common/LogRecord.hh
deleted file mode 100644
index c5eeaa7..0000000
--- a/gazebo/common/LogRecord.hh
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: A class to log data
- * Author: Nate Koenig
- * Date: 1 Jun 2010
- */
-
-#ifndef _LOGRECORD_HH_
-#define _LOGRECORD_HH_
-
-#include <fstream>
-#include <string>
-#include <map>
-#include <boost/thread.hpp>
-#include <boost/archive/iterators/base64_from_binary.hpp>
-#include <boost/archive/iterators/insert_linebreaks.hpp>
-#include <boost/archive/iterators/transform_width.hpp>
-#include <boost/archive/iterators/ostream_iterator.hpp>
-#include <boost/filesystem.hpp>
-
-#include "gazebo/common/UpdateInfo.hh"
-#include "gazebo/common/Event.hh"
-#include "gazebo/common/SingletonT.hh"
-
-#define GZ_LOG_VERSION "1.0"
-
-namespace gazebo
-{
-  namespace common
-  {
-    /// addtogroup gazebo_common
-    /// \{
-
-    /// \class LogRecord LogRecord.hh common/common.hh
-    /// \brief Handles logging of data to disk
-    ///
-    /// The LogRecord class is a Singleton that manages data logging of any
-    /// entity within a running simulation. An entity may be a World, Model,
-    /// or any of their child entities. This class only writes log files,
-    /// see LogPlay for playback functionality.
-    ///
-    /// State information for an entity may be logged through the LogRecord::Add
-    /// function, and stopped through the LogRecord::Remove function. Data may
-    /// be logged into a single file, or split into many separate files by
-    /// specifying different filenames for the LogRecord::Add function.
-    ///
-    /// The LogRecord is updated at the start of each simulation step. This
-    /// guarantees that all data is stored.
-    ///
-    /// \sa Logplay, State
-    class LogRecord : public SingletonT<LogRecord>
-    {
-      /// \brief Constructor
-      private: LogRecord();
-
-      /// \brief Destructor
-      private: virtual ~LogRecord();
-
-      /// \brief Initialize logging into a subdirectory.
-      ///
-      /// Init may only be called once, False will be returned if called
-      /// multiple times.
-      /// \param[in] _subdir Directory to record to
-      /// \return True if successful.
-      public: bool Init(const std::string &_subdir);
-
-      /// \brief Add an object to a log file.
-      ///
-      /// Add a new object to a log. An object can be any valid named object
-      /// in simulation, including the world itself. Duplicate additions are
-      /// ignored. Objects can be added to the same file by
-      /// specifying the same _filename.
-      /// \param[in] _name Name of the object to log.
-      /// \param[in] _filename Filename of the log file.
-      /// \param[in] _logCallback Function used to log data for the object.
-      /// Typically an object will have a log function that outputs data to
-      /// the provided ofstream.
-      /// \throws Exception
-      public: void Add(const std::string &_name, const std::string &_filename,
-                    boost::function<bool (std::ostringstream &)> _logCallback);
-
-      /// \brief Remove an entity from a log
-      ///
-      /// Removes an entity from the logger. The stops data recording for
-      /// the entity and all its children. For example, specifying a world
-      /// will stop all data logging.
-      /// \param[in] _name Name of the log
-      /// \return True if the entity existed and was removed. False if the
-      /// entity was not registered with the logger.
-      public: bool Remove(const std::string &_name);
-
-      /// \brief Stop the logger.
-      public: void Stop();
-
-      /// \brief Set whether logging should pause. A paused state means the
-      /// log file is still open, but data is not written to it.
-      /// \param[in] _paused True to pause data logging.
-      /// \sa LogRecord::GetPaused
-      public: void SetPaused(bool _paused);
-
-      /// \brief Get whether logging is paused.
-      /// \return True if logging is paused.
-      /// \sa LogRecord::SetPaused
-      public: bool GetPaused() const;
-
-      /// \brief Get whether logging is running.
-      /// \return True if logging has been started.
-      public: bool GetRunning() const;
-
-      /// \brief Start the logger.
-      /// \param[in] _encoding The type of encoding (txt, or bz2).
-      public: bool Start(const std::string &_encoding="bz2");
-
-      /// \brief Get the encoding used.
-      /// \return Either [txt, or bz2], where txt is plain txt and bz2 is
-      /// bzip2 compressed data with Base64 encoding.
-      public: const std::string &GetEncoding() const;
-
-      /// \brief Get the filename for a log object.
-      /// \param[in] _name Name of the log object.
-      /// \return Filename, empty string if not found.
-      public: std::string GetFilename(const std::string &_name) const;
-
-      /// \brief Get the file size for a log object.
-      /// \param[in] _name Name of the log object.
-      /// \return Size in bytes.
-      public: unsigned int GetFileSize(const std::string &_name) const;
-
-      /// \brief Set the base path.
-      /// \param[in] _path Path to the new logging location.
-      public: void SetBasePath(const std::string &_path);
-
-      /// \brief Get the base path for a log recording.
-      /// \return Path for log recording.
-      public: std::string GetBasePath() const;
-
-      /// \brief Get the run time in sim time.
-      /// \return Run sim time.
-      public: common::Time GetRunTime() const;
-
-      /// \brief Finialize, and shutdown.
-      public: void Fini();
-
-      /// \brief Return true if an Update has not yet been completed.
-      /// \return True if an Update has not yet been completed.
-      public: bool GetFirstUpdate() const;
-
-      /// \brief Update the log files
-      ///
-      /// Captures the current state of all registered entities, and outputs
-      /// the data to their respective log files.
-      private: void Update(const common::UpdateInfo &_info);
-
-      /// \brief Run the Write loop.
-      private: void Run();
-
-      /// \brief Clear and delete the log buffers.
-      private: void ClearLogs();
-
-      /// \brief Write the header to file.
-      // private: void WriteHeader();
-
-      /// \cond
-      private: class Log
-      {
-        /// \brief Constructor
-        /// \param[in] _parent Pointer to the LogRecord parent.
-        /// \param[in] _relativeFilename The name of the log file to
-        /// generate, sans the complete path.
-        /// \param[in] _logCB Callback function, which is used to get log
-        /// data.
-        public: Log(LogRecord *_parent, const std::string &_relativeFilename,
-                    boost::function<bool (std::ostringstream &)> _logCB);
-
-        /// \brief Destructor
-        public: virtual ~Log();
-
-        /// \brief Start the log.
-        /// \param[in] _path The complete path in which to put the log file.
-        public: void Start(const boost::filesystem::path &_path);
-
-        /// \brief Write data to disk.
-        public: void Write();
-
-        /// \brief Update the data buffer.
-        /// \return The size of the data buffer.
-        public: unsigned int Update();
-
-        /// \brief Clear the data buffer.
-        public: void ClearBuffer();
-
-        /// \brief Get the byte size of the buffer.
-        /// \return Buffer byte size.
-        public: unsigned int GetBufferSize();
-
-        /// \brief Get the relative filename. This is the filename passed
-        /// to the constructor.
-        /// \return The relative filename.
-        public: std::string GetRelativeFilename() const;
-
-        /// \brief Get the complete filename.
-        /// \return The complete filename.
-        public: std::string GetCompleteFilename() const;
-
-        /// \brief Pointer to the log record parent.
-        public: LogRecord *parent;
-
-        /// \brief Callback from which to get data.
-        public: boost::function<bool (std::ostringstream &)> logCB;
-
-        /// \brief Data buffer.
-        public: std::string buffer;
-
-        /// \brief The log file.
-        public: std::ofstream logFile;
-
-        /// \brief Relative log filename.
-        public: std::string relativeFilename;
-
-        private: boost::filesystem::path completePath;
-      };
-      /// \endcond
-
-      /// \def Log_M
-      /// \brief Map of names to logs.
-      private: typedef std::map<std::string, Log*> Log_M;
-
-      /// \brief All the log objects.
-      private: Log_M logs;
-
-      /// \brief Iterator used to update the log objects.
-      private: Log_M::iterator updateIter;
-
-      /// \brief Convenience iterator to the end of the log objects map.
-      private: Log_M::iterator logsEnd;
-
-      /// \brief Event connected to the World update.
-      private: event::ConnectionPtr updateConnection;
-
-      /// \brief True if logging is running.
-      private: bool running;
-
-      /// \brief Thread used to write data to disk.
-      private: boost::thread *writeThread;
-
-      /// \brief Mutext to protect writing.
-      private: mutable boost::mutex writeMutex;
-
-      /// \brief Mutex to protect logging control.
-      private: boost::mutex controlMutex;
-
-      /// \brief Used by the write thread to know when data needs to be
-      /// written to disk
-      private: boost::condition_variable dataAvailableCondition;
-
-      /// \brief The base pathname for all the logs.
-      private: boost::filesystem::path logBasePath;
-
-      /// \brief The complete pathname for all the logs.
-      private: boost::filesystem::path logCompletePath;
-
-      /// \brief Subdirectory for log files. This is appended to
-      /// logBasePath.
-      private: std::string logSubDir;
-
-      /// \brief Encoding format for each chunk.
-      private: std::string encoding;
-
-      /// \brief True if initialized.
-      private: bool initialized;
-
-      /// \brief True to pause recording.
-      private: bool paused;
-
-      /// \brief Used to indicate the first update callback.
-      private: bool firstUpdate;
-
-      /// \brief Flag used to stop the write thread.
-      private: bool stopThread;
-
-      /// \brief Start simulation time.
-      private: common::Time startTime;
-
-      /// \brief Current simulation time.
-      private: common::Time currTime;
-
-      /// \brief This is a singleton
-      private: friend class SingletonT<LogRecord>;
-    };
-    /// \}
-  }
-}
-#endif
diff --git a/gazebo/common/LogRecord_TEST.cc b/gazebo/common/LogRecord_TEST.cc
deleted file mode 100644
index 4a75f0a..0000000
--- a/gazebo/common/LogRecord_TEST.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2013 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <gtest/gtest.h>
-#include <boost/filesystem.hpp>
-
-#include "gazebo/common/Exception.hh"
-#include "gazebo/common/LogRecord.hh"
-
-/////////////////////////////////////////////////
-/// \brief Test LogRecord constructor and a few accessors
-TEST(LogRecord_TEST, Constructor)
-{
-  gazebo::common::LogRecord *recorder = gazebo::common::LogRecord::Instance();
-
-  char *homePath = getenv("HOME");
-  EXPECT_TRUE(homePath != NULL);
-
-  boost::filesystem::path logPath = "/tmp/gazebo";
-  if (homePath)
-    logPath = boost::filesystem::path(homePath);
-  logPath /= "/.gazebo/log/";
-
-  // Make sure the log path is correct
-  EXPECT_EQ(recorder->GetBasePath(), logPath.string());
-
-  EXPECT_FALSE(recorder->GetPaused());
-  EXPECT_FALSE(recorder->GetRunning());
-  EXPECT_TRUE(recorder->GetFirstUpdate());
-
-  // Init without a subdirectory
-  EXPECT_FALSE(recorder->Init(""));
-}
-
-/////////////////////////////////////////////////
-/// \brief Test LogRecord Start errors
-TEST(LogRecord_TEST, StartErrors)
-{
-  gazebo::common::LogRecord *recorder = gazebo::common::LogRecord::Instance();
-
-  // Start without an init
-  {
-    EXPECT_FALSE(recorder->Start("bz2"));
-  }
-
-  // Invalid encoding
-  {
-    EXPECT_TRUE(recorder->Init("test"));
-    EXPECT_THROW(recorder->Start("garbage"), gazebo::common::Exception);
-  }
-
-  // Double start
-  {
-    EXPECT_TRUE(recorder->Start("bz2"));
-    EXPECT_TRUE(recorder->GetRunning());
-    EXPECT_FALSE(recorder->Start("bz2"));
-  }
-}
-
-/////////////////////////////////////////////////
-/// \brief Test LogRecord Init and Start
-TEST(LogRecord_TEST, Start)
-{
-  gazebo::common::LogRecord *recorder = gazebo::common::LogRecord::Instance();
-  recorder->Init("test");
-  recorder->Start("bz2");
-
-  // Make sure the right flags have been set
-  EXPECT_FALSE(recorder->GetPaused());
-  EXPECT_TRUE(recorder->GetRunning());
-  EXPECT_TRUE(recorder->GetFirstUpdate());
-
-  // Make sure the right encoding is set
-  EXPECT_EQ(recorder->GetEncoding(), std::string("bz2"));
-
-  // Make sure the log directories exist
-  EXPECT_TRUE(boost::filesystem::exists(recorder->GetBasePath()));
-  EXPECT_TRUE(boost::filesystem::is_directory(recorder->GetBasePath()));
-
-  // Run time should be zero since no update has been triggered.
-  EXPECT_EQ(recorder->GetRunTime(), gazebo::common::Time());
-
-  // Stop recording.
-  recorder->Stop();
-
-  // Make sure everything has reset.
-  EXPECT_FALSE(recorder->GetRunning());
-  EXPECT_FALSE(recorder->GetPaused());
-  EXPECT_EQ(recorder->GetRunTime(), gazebo::common::Time());
-}
-
-/////////////////////////////////////////////////
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/gazebo/common/Material.cc b/gazebo/common/Material.cc
index b656276..72c9837 100644
--- a/gazebo/common/Material.cc
+++ b/gazebo/common/Material.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/common/Material.hh b/gazebo/common/Material.hh
index c3a51c0..bd7babd 100644
--- a/gazebo/common/Material.hh
+++ b/gazebo/common/Material.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,8 @@
 
 #include <string>
 #include <iostream>
-#include "common/Color.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class Material Material.hh common/common.hh
     /// \brief Encapsulates description of a material
-    class Material
+    class GAZEBO_VISIBLE Material
     {
       public: enum ShadeMode {FLAT, GOURAUD, PHONG, BLINN, SHADE_COUNT};
       public: static std::string ShadeModeStr[SHADE_COUNT];
diff --git a/gazebo/common/Material_TEST.cc b/gazebo/common/Material_TEST.cc
index 3e36b8c..3bf4913 100644
--- a/gazebo/common/Material_TEST.cc
+++ b/gazebo/common/Material_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -17,10 +17,13 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/common/Material.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(MaterialTest, Material)
+class MaterialTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(MaterialTest, Material)
 {
   common::Material mat(common::Color(1.0, 0.5, 0.2, 1.0));
   EXPECT_TRUE(mat.GetAmbient() == common::Color(1.0, 0.5, 0.2, 1.0));
diff --git a/gazebo/common/Mesh.cc b/gazebo/common/Mesh.cc
index 45f9851..ad18c5f 100644
--- a/gazebo/common/Mesh.cc
+++ b/gazebo/common/Mesh.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -730,7 +730,7 @@ unsigned int SubMesh::GetVertexIndex(const math::Vector3 &_v) const
 //////////////////////////////////////////////////
 void SubMesh::FillArrays(float **_vertArr, int **_indArr) const
 {
-  if (this->vertices.size() == 0 || this->indices.size() == 0)
+  if (this->vertices.empty() || this->indices.empty())
     gzerr << "No vertices or indices\n";
 
   std::vector< math::Vector3 >::const_iterator viter;
@@ -907,3 +907,9 @@ std::string SubMesh::GetName() const
 {
   return this->name;
 }
+
+//////////////////////////////////////////////////
+NodeAssignment::NodeAssignment()
+  : vertexIndex(0), nodeIndex(0), weight(0.0)
+{
+}
diff --git a/gazebo/common/Mesh.hh b/gazebo/common/Mesh.hh
index 601e58c..fab06a2 100644
--- a/gazebo/common/Mesh.hh
+++ b/gazebo/common/Mesh.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,8 +20,9 @@
 #include <vector>
 #include <string>
 
-#include "math/Vector3.hh"
-#include "math/Vector2d.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Vector2d.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,7 +37,7 @@ namespace gazebo
 
     /// \class Mesh Mesh.hh common/common.hh
     /// \brief A 3D mesh
-    class Mesh
+    class GAZEBO_VISIBLE Mesh
     {
       /// \brief Constructor
       public: Mesh();
@@ -184,20 +185,23 @@ namespace gazebo
 
     /// \brief Vertex to node weighted assignement for skeleton animation
     /// visualization
-    struct NodeAssignment
+    class GAZEBO_VISIBLE NodeAssignment
     {
+      /// \brief Constructor.
+      public: NodeAssignment();
+
       /// \brief index of the vertex
-      unsigned int vertexIndex;
+      public: unsigned int vertexIndex;
 
       /// \brief node (or bone) index
-      unsigned int nodeIndex;
+      public: unsigned int nodeIndex;
 
       /// \brief the weight (between 0 and 1)
-      float weight;
+      public: float weight;
     };
 
     /// \brief A child mesh
-    class SubMesh
+    class GAZEBO_VISIBLE SubMesh
     {
       /// \brief An enumeration of the geometric mesh primitives
       public: enum PrimitiveType {POINTS, LINES, LINESTRIPS, TRIANGLES,
diff --git a/gazebo/common/MeshCSG.cc b/gazebo/common/MeshCSG.cc
index 4e3e887..659c583 100644
--- a/gazebo/common/MeshCSG.cc
+++ b/gazebo/common/MeshCSG.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,9 +18,10 @@
 #include <string>
 #include <gts.h>
 
-#include "gazebo/common/Common.hh"
-#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/CommonIface.hh"
 #include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
 #include "gazebo/common/Mesh.hh"
 #include "gazebo/common/MeshCSG.hh"
 #include "gazebo/common/MeshManager.hh"
@@ -193,7 +194,8 @@ Mesh *MeshCSG::CreateBoolean(const Mesh *_m1, const Mesh *_m2, int _operation,
 
   si = gts_surface_inter_new(gts_surface_inter_class(), s1, s2, tree1, tree2,
       isOpen1, isOpen2);
-  assert(gts_surface_inter_check(si, &closed));
+  GZ_ASSERT(gts_surface_inter_check(si, &closed),
+            "si is not an orientable manifold");
   if (!closed)
   {
     gzerr << "the intersection of " << _m1->GetName() << " and "
@@ -237,14 +239,13 @@ Mesh *MeshCSG::CreateBoolean(const Mesh *_m1, const Mesh *_m2, int _operation,
   mesh->AddSubMesh(subMesh);
 
   // fill the submesh with data generated by GTS
-  unsigned int n;
+  unsigned int n = 0;
   gpointer data[3];
   GHashTable *vIndex = g_hash_table_new(NULL, NULL);
 
   data[0] = subMesh;
   data[1] = &n;
   data[2] = vIndex;
-  n = 0;
   gts_surface_foreach_vertex(s3, (GtsFunc)FillVertex, data);
   n = 0;
   gts_surface_foreach_face(s3, (GtsFunc)FillFace, data);
diff --git a/gazebo/common/MeshCSG.hh b/gazebo/common/MeshCSG.hh
index d32093a..2f02922 100644
--- a/gazebo/common/MeshCSG.hh
+++ b/gazebo/common/MeshCSG.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _MESHCSG_HH_
 
 #include "gazebo/math/Pose.hh"
+#include "gazebo/util/system.hh"
 
 struct _GtsSurface;
 typedef _GtsSurface GtsSurface;
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class MeshCSG MeshCSG.hh common/common.hh
     /// \brief Creates CSG meshes
-    class MeshCSG
+    class GAZEBO_VISIBLE MeshCSG
     {
       /// \brief An enumeration of the boolean operations
       public: enum BooleanOperation {UNION, INTERSECTION, DIFFERENCE};
diff --git a/gazebo/common/MeshLoader.cc b/gazebo/common/MeshLoader.cc
index acf6957..45f62f9 100644
--- a/gazebo/common/MeshLoader.cc
+++ b/gazebo/common/MeshLoader.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
 */
-#include "common/MeshLoader.hh"
+#include "gazebo/common/MeshLoader.hh"
 
 using namespace gazebo;
 using namespace common;
diff --git a/gazebo/common/MeshLoader.hh b/gazebo/common/MeshLoader.hh
index abf891c..6567276 100644
--- a/gazebo/common/MeshLoader.hh
+++ b/gazebo/common/MeshLoader.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define MESHLOADER_HH
 
 #include <string>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,7 +33,7 @@ namespace gazebo
 
     /// \class MeshLoader MeshLoader.hh common/common.hh
     /// \brief Base class for loading meshes
-    class MeshLoader
+    class GAZEBO_VISIBLE MeshLoader
     {
       /// \brief Constructor
       public: MeshLoader();
diff --git a/gazebo/common/MeshManager.cc b/gazebo/common/MeshManager.cc
index a889125..683b819 100644
--- a/gazebo/common/MeshManager.cc
+++ b/gazebo/common/MeshManager.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,13 +21,13 @@
 #include "gazebo/math/Matrix3.hh"
 #include "gazebo/math/Matrix4.hh"
 
-#include "gazebo/common/Common.hh"
+#include "gazebo/common/CommonIface.hh"
 #include "gazebo/common/Exception.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Mesh.hh"
 #include "gazebo/common/ColladaLoader.hh"
 #include "gazebo/common/STLLoader.hh"
-#include "gazebo_config.h"
+#include "gazebo/gazebo_config.h"
 
 #ifdef HAVE_GTS
   #include "gazebo/common/MeshCSG.hh"
@@ -206,7 +206,6 @@ const Mesh *MeshManager::GetMesh(const std::string &_name) const
   if (iter != this->meshes.end())
     return iter->second;
 
-  gzerr << "Unable to find mesh with name[" << _name << "]\n";
   return NULL;
 }
 
@@ -232,7 +231,6 @@ void MeshManager::CreateSphere(const std::string &name, float radius,
   }
 
   int ring, seg;
-  float r0;
   float deltaSegAngle = (2.0 * M_PI / segments);
   float deltaRingAngle = (M_PI / rings);
   math::Vector3 vert, norm;
@@ -248,7 +246,7 @@ void MeshManager::CreateSphere(const std::string &name, float radius,
   // Generate the group of rings for the sphere
   for (ring = 0; ring <= rings; ring++)
   {
-    r0 = radius * sinf(ring * deltaRingAngle);
+    float r0 = radius * sinf(ring * deltaRingAngle);
     vert.y = radius * cosf(ring * deltaRingAngle);
 
     // Generate the group of segments for the current ring
@@ -337,23 +335,30 @@ void MeshManager::CreatePlane(const std::string &name,
   double xTex = uvTile.x / segments.x;
   double yTex = uvTile.y / segments.y;
 
-  for (int y = 0; y <= segments.y; y++)
+  // Give it some thickness to reduce shadow artifacts.
+  double thickness = 0.01;
+
+  for (int i = 0; i <= 1; ++i)
   {
-    for (int x = 0; x <= segments.x; x++)
+    double z = i*thickness;
+    for (int y = 0; y <= segments.y; ++y)
     {
-      // Compute the position of the vertex
-      vec.x = (x * xSpace) - halfWidth;
-      vec.y = (y * ySpace) - halfHeight;
-      vec.z = 0.0;
-      vec = xform.TransformAffine(vec);
-      subMesh->AddVertex(vec);
-
-      // Compute the normal
-      vec = xform.TransformAffine(norm);
-      subMesh->AddNormal(vec);
-
-      // Compute the texture coordinate
-      subMesh->AddTexCoord(x * xTex, 1 - (y * yTex));
+      for (int x = 0; x <= segments.x; ++x)
+      {
+        // Compute the position of the vertex
+        vec.x = (x * xSpace) - halfWidth;
+        vec.y = (y * ySpace) - halfHeight;
+        vec.z = -z;
+        vec = xform.TransformAffine(vec);
+        subMesh->AddVertex(vec);
+
+        // Compute the normal
+        vec = xform.TransformAffine(norm);
+        subMesh->AddNormal(vec);
+
+        // Compute the texture coordinate
+        subMesh->AddTexCoord(x * xTex, 1 - (y * yTex));
+      }
     }
   }
 
@@ -686,14 +691,12 @@ void MeshManager::CreateCone(const std::string &name, float radius,
 
   float deltaSegAngle = (2.0 * M_PI / segments);
 
-  double ringRadius;
-
   // Generate the group of rings for the cone
   for (ring = 0; ring < rings; ring++)
   {
     vert.z = ring * height/rings - height/2.0;
 
-    ringRadius = ((height - (vert.z+height/2.0)) / height) * radius;
+    double ringRadius = ((height - (vert.z+height/2.0)) / height) * radius;
 
     // Generate the group of segments for the current ring
     for (seg = 0; seg <= segments; seg++)
@@ -902,8 +905,8 @@ void MeshManager::CreateTube(const std::string &name, float innerRadius,
 void MeshManager::Tesselate2DMesh(SubMesh *sm, int meshWidth, int meshHeight,
     bool doubleSided)
 {
-  int vInc, uInc, v, u, iterations;
-  int vCount, uCount;
+  int vInc, v, iterations;
+  int uCount;
 
   if (doubleSided)
   {
@@ -923,10 +926,10 @@ void MeshManager::Tesselate2DMesh(SubMesh *sm, int meshWidth, int meshHeight,
   while (iterations--)
   {
     // Make tris in a zigzag pattern (compatible with strips)
-    u = 0;
-    uInc = 1;
+    int u = 0;
+    int uInc = 1;
 
-    vCount = meshHeight - 1;
+    int vCount = meshHeight - 1;
     while (vCount--)
     {
       uCount = meshWidth - 1;
diff --git a/gazebo/common/MeshManager.hh b/gazebo/common/MeshManager.hh
index 6cdf9ed..0dca800 100644
--- a/gazebo/common/MeshManager.hh
+++ b/gazebo/common/MeshManager.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
 #include "gazebo/math/Pose.hh"
 #include "gazebo/math/Plane.hh"
 #include "gazebo/common/SingletonT.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -43,7 +44,7 @@ namespace gazebo
 
     /// \class MeshManager MeshManager.hh common/common.hh
     /// \brief Maintains and manages all meshes
-    class MeshManager : public SingletonT<MeshManager>
+    class GAZEBO_VISIBLE MeshManager : public SingletonT<MeshManager>
     {
       /// \brief Constructor
       private: MeshManager();
diff --git a/gazebo/common/Mesh_TEST.cc b/gazebo/common/Mesh_TEST.cc
index 648c3c3..a263596 100644
--- a/gazebo/common/Mesh_TEST.cc
+++ b/gazebo/common/Mesh_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,16 +16,21 @@
 */
 
 #include <gtest/gtest.h>
+#include <boost/filesystem.hpp>
 
 #include "test_config.h"
-#include "gazebo/math/Vector3.hh"
+#include "gazebo/common/ColladaLoader.hh"
 #include "gazebo/common/Exception.hh"
-#include "gazebo/common/MeshManager.hh"
 #include "gazebo/common/Mesh.hh"
-#include "gazebo/common/ColladaLoader.hh"
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/math/Vector3.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
+class MeshTest : public gazebo::testing::AutoLogFixture { };
+
 std::string asciiSTLBox =
 "solid MYSOLID\n\
   facet normal  0.0   0.0  -1.0\n\
@@ -116,8 +121,13 @@ endsolid MYSOLID";
 
 
 /////////////////////////////////////////////////
-TEST(MeshTest, Mesh)
+TEST_F(MeshTest, Mesh)
 {
+  // Cleanup test directory.
+  common::SystemPaths *paths = common::SystemPaths::Instance();
+  boost::filesystem::remove_all(paths->GetDefaultTestPath());
+  boost::filesystem::create_directories(paths->GetDefaultTestPath());
+
   EXPECT_EQ(NULL, common::MeshManager::Instance()->Load("break.mesh"));
   EXPECT_EQ(NULL, common::MeshManager::Instance()->Load("break.3ds"));
   EXPECT_EQ(NULL, common::MeshManager::Instance()->Load("break.xml"));
@@ -219,23 +229,29 @@ TEST(MeshTest, Mesh)
   newMesh->GenSphericalTexCoord(math::Vector3(0, 0, 0));
   delete newMesh;
 
-  std::ofstream stlFile("/tmp/gazebo_stl_test.stl", std::ios::out);
+  std::ofstream stlFile((paths->GetDefaultTestPath() +
+      "/gazebo_stl_test.stl").c_str(), std::ios::out);
   stlFile << asciiSTLBox;
   stlFile.close();
 
-  mesh = common::MeshManager::Instance()->Load("/tmp/gazebo_stl_test-bad.stl");
+  mesh = common::MeshManager::Instance()->Load(
+      paths->GetDefaultTestPath() + "/gazebo_stl_test-bad.stl");
   EXPECT_EQ(NULL, mesh);
 
-  mesh = common::MeshManager::Instance()->Load("/tmp/gazebo_stl_test.stl");
+  mesh = common::MeshManager::Instance()->Load(
+      paths->GetDefaultTestPath() + "/gazebo_stl_test.stl");
   mesh->GetAABB(center, min, max);
   EXPECT_TRUE(center == math::Vector3(0.5, 0.5, 0.5));
   EXPECT_TRUE(min == math::Vector3(0, 0, 0));
   EXPECT_TRUE(max == math::Vector3(1, 1, 1));
+
+  // Cleanup test directory.
+  boost::filesystem::remove_all(paths->GetDefaultTestPath());
 }
 
 /////////////////////////////////////////////////
 // Test centering a submesh.
-TEST(MeshTest, MeshMove)
+TEST_F(MeshTest, MeshMove)
 {
   common::ColladaLoader loader;
   common::Mesh *mesh = loader.Load(
@@ -257,7 +273,7 @@ TEST(MeshTest, MeshMove)
 
 /////////////////////////////////////////////////
 // Test centering a submesh.
-TEST(MeshTest, SubMeshCenter)
+TEST_F(MeshTest, SubMeshCenter)
 {
   common::ColladaLoader loader;
   common::Mesh *mesh = loader.Load(
diff --git a/gazebo/common/ModelDatabase.cc b/gazebo/common/ModelDatabase.cc
index 1a58ac0..b50f83c 100644
--- a/gazebo/common/ModelDatabase.cc
+++ b/gazebo/common/ModelDatabase.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,18 +20,20 @@
 #include <curl/curl.h>
 #include <fcntl.h>
 #include <sys/stat.h>
-
 #include <iostream>
+
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/filesystem.hpp>
 #include <boost/iostreams/filtering_streambuf.hpp>
 #include <boost/iostreams/copy.hpp>
 #include <boost/iostreams/filter/gzip.hpp>
 
-#include "gazebo/sdf/sdf.hh"
+#include <sdf/sdf.hh>
+
 #include "gazebo/common/Time.hh"
 #include "gazebo/common/SystemPaths.hh"
 #include "gazebo/common/Console.hh"
+#include "gazebo/common/ModelDatabasePrivate.hh"
 #include "gazebo/common/ModelDatabase.hh"
 
 using namespace gazebo;
@@ -60,24 +62,53 @@ size_t get_models_cb(void *_buffer, size_t _size, size_t _nmemb, void *_userp)
 
 /////////////////////////////////////////////////
 ModelDatabase::ModelDatabase()
+  : dataPtr(new ModelDatabasePrivate)
 {
-  this->stop = false;
-
-  // Create the thread that is used to update the model cache. This
-  // retreives online data in the background to improve startup times.
-  this->updateCacheThread = new boost::thread(
-      boost::bind(&ModelDatabase::UpdateModelCache, this));
+  this->dataPtr->updateCacheThread = NULL;
+  this->Start();
 }
 
 /////////////////////////////////////////////////
 ModelDatabase::~ModelDatabase()
 {
+  this->Fini();
+  delete this->dataPtr;
+  this->dataPtr = NULL;
+}
+
+/////////////////////////////////////////////////
+void ModelDatabase::Start(bool _fetchImmediately)
+{
+  boost::recursive_mutex::scoped_lock lock(this->dataPtr->startCacheMutex);
+
+  if (!this->dataPtr->updateCacheThread)
+  {
+    this->dataPtr->stop = false;
+
+    // Create the thread that is used to update the model cache. This
+    // retreives online data in the background to improve startup times.
+    this->dataPtr->updateCacheThread = new boost::thread(
+        boost::bind(&ModelDatabase::UpdateModelCache, this, _fetchImmediately));
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelDatabase::Fini()
+{
+  this->dataPtr->deprecatedCallbacks.clear();
+
   // Stop the update thread.
-  this->stop = true;
-  this->updateCacheCondition.notify_one();
-  this->updateCacheThread->join();
+  this->dataPtr->stop = true;
+  this->dataPtr->updateCacheCompleteCondition.notify_all();
+  this->dataPtr->updateCacheCondition.notify_all();
 
-  delete this->updateCacheThread;
+  {
+    boost::recursive_mutex::scoped_lock lock(this->dataPtr->startCacheMutex);
+    if (this->dataPtr->updateCacheThread)
+      this->dataPtr->updateCacheThread->join();
+    delete this->dataPtr->updateCacheThread;
+    this->dataPtr->updateCacheThread = NULL;
+  }
 }
 
 /////////////////////////////////////////////////
@@ -88,7 +119,10 @@ std::string ModelDatabase::GetURI()
   if (uriStr)
     result = uriStr;
   else
-    gzwarn << "GAZEBO_MODEL_DATABASE_URI not set\n";
+  {
+    // No env var.  Take compile-time default.
+    result = GAZEBO_MODEL_DATABASE_URI;
+  }
 
   if (result[result.size()-1] != '/')
     result += '/';
@@ -106,11 +140,12 @@ bool ModelDatabase::HasModel(const std::string &_modelURI)
   // Make sure there is a URI separator
   if (uriSeparator == std::string::npos)
   {
-    gzerr << "URI[" << _modelURI << "] missing ://\n";
+    gzerr << "No URI separator \"://\" in [" << _modelURI << "]\n";
     return false;
   }
 
   boost::replace_first(uri, "model://", ModelDatabase::GetURI());
+  uri = uri.substr(0, uri.find("/", ModelDatabase::GetURI().size()));
 
   std::map<std::string, std::string> models = ModelDatabase::GetModels();
 
@@ -120,6 +155,7 @@ bool ModelDatabase::HasModel(const std::string &_modelURI)
     if (iter->first == uri)
       return true;
   }
+
   return false;
 }
 
@@ -156,12 +192,6 @@ std::string ModelDatabase::GetModelConfig(const std::string &_uri)
 }
 
 /////////////////////////////////////////////////
-std::string ModelDatabase::GetManifest(const std::string &_uri)
-{
-  return this->GetModelConfig(_uri);
-}
-
-/////////////////////////////////////////////////
 std::string ModelDatabase::GetManifestImpl(const std::string &_uri)
 {
   std::string xmlString;
@@ -216,7 +246,7 @@ bool ModelDatabase::UpdateModelCacheImpl()
 
     TiXmlElement *uriElem;
     for (uriElem = modelsElem->FirstChildElement("uri");
-         uriElem != NULL && !this->stop;
+         uriElem != NULL && !this->dataPtr->stop;
          uriElem = uriElem->NextSiblingElement("uri"))
     {
       std::string uri = uriElem->GetText();
@@ -231,7 +261,7 @@ bool ModelDatabase::UpdateModelCacheImpl()
       std::string fullURI = ModelDatabase::GetURI() + suffix;
       std::string modelName = ModelDatabase::GetModelName(fullURI);
 
-      this->modelCache[fullURI] = modelName;
+      this->dataPtr->modelCache[fullURI] = modelName;
     }
   }
 
@@ -239,17 +269,21 @@ bool ModelDatabase::UpdateModelCacheImpl()
 }
 
 /////////////////////////////////////////////////
-void ModelDatabase::UpdateModelCache()
+void ModelDatabase::UpdateModelCache(bool _fetchImmediately)
 {
+  boost::mutex::scoped_lock lock(this->dataPtr->updateMutex);
+
   // Continually update the model cache when requested.
-  while (!this->stop)
+  while (!this->dataPtr->stop)
   {
     // Wait for an update request.
-    boost::mutex::scoped_lock lock(this->updateMutex);
-    this->updateCacheCondition.wait(lock);
+    if (!_fetchImmediately)
+      this->dataPtr->updateCacheCondition.wait(lock);
+    else
+      _fetchImmediately = false;
 
     // Exit if notified and stopped.
-    if (this->stop)
+    if (this->dataPtr->stop)
       break;
 
     // Update the model cache.
@@ -257,14 +291,23 @@ void ModelDatabase::UpdateModelCache()
       gzerr << "Unable to download model manifests\n";
     else
     {
-      for (std::list<CallbackFunc>::iterator iter = this->callbacks.begin();
-           iter != this->callbacks.end(); ++iter)
+      boost::mutex::scoped_lock lock2(this->dataPtr->callbacksMutex);
+
+      for (std::list<ModelDatabasePrivate::CallbackFunc>::iterator iter =
+          this->dataPtr->deprecatedCallbacks.begin();
+          iter != this->dataPtr->deprecatedCallbacks.end(); ++iter)
       {
-        (*iter)(this->modelCache);
+        (*iter)(this->dataPtr->modelCache);
       }
-      this->callbacks.clear();
+      this->dataPtr->deprecatedCallbacks.clear();
+
+      this->dataPtr->modelDBUpdated(this->dataPtr->modelCache);
     }
+    this->dataPtr->updateCacheCompleteCondition.notify_all();
   }
+
+  // Make sure no one is waiting on us.
+  this->dataPtr->updateCacheCompleteCondition.notify_all();
 }
 
 /////////////////////////////////////////////////
@@ -273,42 +316,53 @@ std::map<std::string, std::string> ModelDatabase::GetModels()
   size_t size = 0;
 
   {
+    boost::recursive_mutex::scoped_lock startLock(
+        this->dataPtr->startCacheMutex);
+    if (!this->dataPtr->updateCacheThread)
     {
-      boost::mutex::scoped_try_lock tryLock(this->updateMutex);
-      if (!tryLock)
+      boost::mutex::scoped_lock lock(this->dataPtr->updateMutex);
+      this->Start(true);
+      this->dataPtr->updateCacheCompleteCondition.wait(lock);
+    }
+    else
+    {
+      boost::mutex::scoped_try_lock lock(this->dataPtr->updateMutex);
+      if (!lock)
+      {
         gzmsg << "Waiting for model database update to complete...\n";
+        boost::mutex::scoped_lock lock2(this->dataPtr->updateMutex);
+      }
     }
-    boost::mutex::scoped_lock lock(this->updateMutex);
 
-    size = this->modelCache.size();
+    size = this->dataPtr->modelCache.size();
   }
 
   if (size != 0)
-    return this->modelCache;
+    return this->dataPtr->modelCache;
   else
   {
     gzwarn << "Getting models from[" << GetURI()
            << "]. This may take a few seconds.\n";
 
-    // Tell the background thread to grab the models from online.
-    this->updateCacheCondition.notify_one();
+    boost::mutex::scoped_lock lock(this->dataPtr->updateMutex);
 
-    // Let the other thread start downloading.
-    common::Time::MSleep(100);
+    // Tell the background thread to grab the models from online.
+    this->dataPtr->updateCacheCondition.notify_all();
 
     // Wait for the thread to finish.
-    boost::mutex::scoped_lock lock(this->updateMutex);
+    this->dataPtr->updateCacheCompleteCondition.wait(lock);
   }
 
-  return this->modelCache;
+  return this->dataPtr->modelCache;
 }
 
 /////////////////////////////////////////////////
-void ModelDatabase::GetModels(
+event::ConnectionPtr ModelDatabase::GetModels(
     boost::function<void (const std::map<std::string, std::string> &)> _func)
 {
-  this->callbacks.push_back(_func);
-  this->updateCacheCondition.notify_one();
+  boost::mutex::scoped_lock lock2(this->dataPtr->callbacksMutex);
+  this->dataPtr->updateCacheCondition.notify_one();
+  return this->dataPtr->modelDBUpdated.Connect(_func);
 }
 
 /////////////////////////////////////////////////
@@ -385,9 +439,10 @@ std::string ModelDatabase::GetModelPath(const std::string &_uri,
     size_t modelNameLen = endIndex == std::string::npos ? std::string::npos :
       endIndex - startIndex;
 
-    modelName = modelName.substr(startIndex, modelNameLen);
     if (endIndex != std::string::npos)
-      suffix = _uri.substr(endIndex, std::string::npos);
+      suffix = modelName.substr(endIndex, std::string::npos);
+
+    modelName = modelName.substr(startIndex, modelNameLen);
 
     // Store downloaded .tar.gz and intermediate .tar files in temp location
     boost::filesystem::path tmppath = boost::filesystem::temp_directory_path();
@@ -497,17 +552,13 @@ void ModelDatabase::DownloadDependencies(const std::string &_path)
 {
   boost::filesystem::path manifestPath = _path;
 
-  // First try to get the GZ_MODEL_MANIFEST_FILENAME. If that file doesn't
-  // exist, try to get the deprecated version.
+  // Get the GZ_MODEL_MANIFEST_FILENAME.
   if (boost::filesystem::exists(manifestPath / GZ_MODEL_MANIFEST_FILENAME))
     manifestPath /= GZ_MODEL_MANIFEST_FILENAME;
   else
   {
-    gzwarn << "The manifest.xml for a Gazebo model is deprecated. "
-      << "Please rename manifest.xml to " << GZ_MODEL_MANIFEST_FILENAME
+    gzerr << "Missing " << GZ_MODEL_MANIFEST_FILENAME
       << " for model " << _path << "\n";
-
-    manifestPath /= "manifest.xml";
   }
 
   TiXmlDocument xmlDoc;
@@ -554,17 +605,13 @@ std::string ModelDatabase::GetModelFile(const std::string &_uri)
 
   boost::filesystem::path manifestPath = path;
 
-  // First try to get the GZ_MODEL_MANIFEST_FILENAME. If that file doesn't
-  // exist, try to get the deprecated version.
+  // Get the GZ_MODEL_MANIFEST_FILENAME.
   if (boost::filesystem::exists(manifestPath / GZ_MODEL_MANIFEST_FILENAME))
     manifestPath /= GZ_MODEL_MANIFEST_FILENAME;
   else
   {
-    gzwarn << "The manifest.xml for a Gazebo model is deprecated. "
-      << "Please rename manifest.xml to " << GZ_MODEL_MANIFEST_FILENAME
+    gzerr << "Missing " << GZ_MODEL_MANIFEST_FILENAME
       << " for model " << manifestPath << "\n";
-
-    manifestPath /= "manifest.xml";
   }
 
   TiXmlDocument xmlDoc;
diff --git a/gazebo/common/ModelDatabase.hh b/gazebo/common/ModelDatabase.hh
index 4af10d5..6b48f38 100644
--- a/gazebo/common/ModelDatabase.hh
+++ b/gazebo/common/ModelDatabase.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,12 @@
 
 #include <string>
 #include <map>
-#include <list>
-#include <boost/thread.hpp>
-#include <boost/thread/mutex.hpp>
+#include <utility>
+
+#include "gazebo/common/Event.hh"
 #include "gazebo/common/SingletonT.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/util/system.hh"
 
 /// \brief The file name of model XML configuration.
 #define GZ_MODEL_MANIFEST_FILENAME "model.config"
@@ -34,13 +36,16 @@ namespace gazebo
 {
   namespace common
   {
+    /// \brief Forward declare private data class.
+    class ModelDatabasePrivate;
+
     /// \addtogroup gazebo_common Common
     /// \{
 
     /// \class ModelDatabase ModelDatabase.hh common/common.hh
     /// \brief Connects to model database, and has utility functions to find
     /// models.
-    class ModelDatabase : public SingletonT<ModelDatabase>
+    class GAZEBO_VISIBLE ModelDatabase : public SingletonT<ModelDatabase>
     {
       /// \brief Constructor. This will update the model cache
       private: ModelDatabase();
@@ -48,6 +53,14 @@ namespace gazebo
       /// \brief Destructor
       private: virtual ~ModelDatabase();
 
+      /// \brief Start the model database.
+      /// \param[in] _fetchImmediately True to fetch the models without
+      /// waiting.
+      public: void Start(bool _fetchImmediately = false);
+
+      /// \brief Finalize the model database.
+      public: void Fini();
+
       /// \brief Returns the the global model database URI.
       /// \return the URI.
       public: std::string GetURI();
@@ -64,7 +77,9 @@ namespace gazebo
       /// This is the non-blocking version of ModelDatabase::GetModels
       /// \param[in] _func Callback function that receives the list of
       /// models.
-      public: void GetModels(boost::function<
+      /// \return A boost shared pointer. This pointer must remain valid in
+      /// order to receive the callback.
+      public: event::ConnectionPtr  GetModels(boost::function<
                   void (const std::map<std::string, std::string> &)> _func);
 
       /// \brief Get the name of a model based on a URI.
@@ -84,12 +99,6 @@ namespace gazebo
       /// \return The database config file from the model database.
       public: std::string GetDBConfig(const std::string &_uri);
 
-      /// \brief Deprecated.
-      /// \sa ModelDatabase::GetModelConfig
-      /// \sa ModelDatabase::GetDBConfig
-      public: std::string GetManifest(const std::string &_uri)
-              GAZEBO_DEPRECATED(1.5);
-
       /// \brief Get the local path to a model.
       ///
       /// Get the path to a model based on a URI. If the model is on
@@ -129,42 +138,23 @@ namespace gazebo
       private: std::string GetManifestImpl(const std::string &_uri);
 
       /// \brief Used by a thread to update the model cache.
-      private: void UpdateModelCache();
+      /// \param[in] _fetchImmediately True to fetch the models without
+      /// waiting.
+      private: void UpdateModelCache(bool _fetchImmediately);
 
       /// \brief Used by ModelDatabase::UpdateModelCache,
       /// no one else should use this function.
       private: bool UpdateModelCacheImpl();
 
-      /// \brief A dictionary of all model names indexed by their uri.
-      private: std::map<std::string, std::string> modelCache;
-
-      /// \brief True to stop the background thread
-      private: bool stop;
-
-      /// \brief Cache update mutex
-      private: boost::mutex updateMutex;
-
-      /// \brief Thread to update the model cache.
-      private: boost::thread *updateCacheThread;
+      /// \brief Private data.
+      private: ModelDatabasePrivate *dataPtr;
 
-      /// \brief Condition variable for the updateCacheThread.
-      private: boost::condition_variable updateCacheCondition;
-
-      /// \def CallbackFunc
-      /// \brief Boost function that is used to passback the model cache.
-      private: typedef boost::function<
-               void (const std::map<std::string, std::string> &)> CallbackFunc;
-
-      /// \brief List of all callbacks set from the
-      /// ModelDatabase::GetModels function.
-      private: std::list<CallbackFunc> callbacks;
+      /// \brief Singleton implementation
+      private: friend class SingletonT<ModelDatabase>;
 
       /// \brief Handy trick to automatically call a singleton's
       /// constructor.
       private: static ModelDatabase *myself;
-
-      /// \brief Singleton implementation
-      private: friend class SingletonT<ModelDatabase>;
     };
   }
 }
diff --git a/gazebo/common/ModelDatabasePrivate.hh b/gazebo/common/ModelDatabasePrivate.hh
new file mode 100644
index 0000000..3420dee
--- /dev/null
+++ b/gazebo/common/ModelDatabasePrivate.hh
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2012-2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_MODELDATABSE_PRIVATE_HH_
+#define _GAZEBO_MODELDATABSE_PRIVATE_HH_
+
+#include <list>
+#include <map>
+#include <string>
+
+#include <boost/thread.hpp>
+#include <boost/thread/mutex.hpp>
+
+#include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace common
+  {
+    /// \brief Private class attributes for ModelDatabase.
+    class GAZEBO_VISIBLE ModelDatabasePrivate
+    {
+      /// \brief Thread to update the model cache.
+      public: boost::thread *updateCacheThread;
+
+      /// \brief A dictionary of all model names indexed by their uri.
+      public: std::map<std::string, std::string> modelCache;
+
+      /// \brief True to stop the background thread
+      public: bool stop;
+
+      /// \brief Cache update mutex.
+      public: boost::mutex updateMutex;
+
+      /// \brief Protects callback list.
+      public: boost::mutex callbacksMutex;
+
+      /// \brief Mutex to protect cache thread status checks.
+      public: boost::recursive_mutex startCacheMutex;
+
+      /// \brief Condition variable for the updateCacheThread.
+      public: boost::condition_variable updateCacheCondition;
+
+      /// \brief Condition variable for completion of one cache update.
+      public: boost::condition_variable updateCacheCompleteCondition;
+
+      /// \def CallbackFunc
+      /// \brief Boost function that is used to passback the model cache.
+      public: typedef boost::function<
+               void (const std::map<std::string, std::string> &)> CallbackFunc;
+
+      // \todo Remove this along with the deprecated version of GetModels.
+      public: std::list<CallbackFunc> deprecatedCallbacks;
+
+      /// \brief Triggered when the model data has been updated after
+      /// calling ModelDatabase::GetModels()
+      public: event::EventT<
+               void (std::map<std::string, std::string>)> modelDBUpdated;
+    };
+  }
+}
+#endif
diff --git a/gazebo/common/MouseEvent.hh b/gazebo/common/MouseEvent.hh
index 9dc2784..bb1681c 100644
--- a/gazebo/common/MouseEvent.hh
+++ b/gazebo/common/MouseEvent.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,11 @@
  * limitations under the License.
  *
 */
-#ifndef MOUSEEVENT_HH
-#define MOUSEEVENT_HH
+#ifndef _MOUSEEVENT_HH_
+#define _MOUSEEVENT_HH_
 
-#include "math/Vector2i.hh"
+#include "gazebo/math/Vector2i.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -28,7 +29,7 @@ namespace gazebo
 
     /// \class MouseEvent MouseEvent.hh common/common.hh
     /// \brief Generic description of a mouse event.
-    class MouseEvent
+    class GAZEBO_VISIBLE MouseEvent
     {
       /// \brief Standard mouse buttons enumeration.
       public: enum Buttons {NO_BUTTON = 0x0, LEFT = 0x1, MIDDLE = 0x2,
diff --git a/gazebo/common/MovingWindowFilter.hh b/gazebo/common/MovingWindowFilter.hh
new file mode 100644
index 0000000..29e09ae
--- /dev/null
+++ b/gazebo/common/MovingWindowFilter.hh
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_MOVING_WINDOW_FILTER_HH_
+#define _GAZEBO_MOVING_WINDOW_FILTER_HH_
+
+#include <iostream>
+#include <vector>
+#include <map>
+
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/thread/mutex.hpp>
+
+#include <gazebo/gazebo_config.h>
+#include <gazebo/common/Time.hh>
+#include <gazebo/common/CommonTypes.hh>
+#include <gazebo/math/Helpers.hh>
+
+namespace gazebo
+{
+  namespace common
+  {
+    /// \addtogroup gazebo_common Common
+    /// \{
+
+    /// \internal
+    /// \brief Private data members for MovingWindowFilter class.
+    /// This must be in the header due to templatization.
+    template< typename T>
+    class MovingWindowFilterPrivate
+    {
+      // \brief Constructor
+      public: MovingWindowFilterPrivate();
+
+      /// \brief For moving window smoothed value
+      public: unsigned int valWindowSize;
+
+      /// \brief buffer history of raw values
+      public: std::vector<T> valHistory;
+
+      /// \brief iterator pointing to current value in buffer
+      public: typename std::vector<T>::iterator valIter;
+
+      /// \brief keep track of running sum
+      public: T sum;
+
+      /// \brief keep track of number of elements
+      public: unsigned int samples;
+    };
+
+    //////////////////////////////////////////////////
+    template<typename T>
+    MovingWindowFilterPrivate<T>::MovingWindowFilterPrivate()
+    {
+      /// \TODO FIXME hardcoded initial value for now
+      this->valWindowSize = 4;
+      this->valHistory.resize(this->valWindowSize);
+      this->valIter = this->valHistory.begin();
+      this->sum = T();
+      this->samples = 0;
+    }
+
+    /// \class MovingWindowFilter MovingWindowFilter.hh common/common.hh
+    /// \brief Base class for MovingWindowFilter
+    template< typename T>
+    class MovingWindowFilter
+    {
+      /// \brief Constructor
+      public: MovingWindowFilter();
+
+      /// \brief Destructor
+      public: virtual ~MovingWindowFilter();
+
+      /// \brief Update value of filter
+      /// \param[in] _val new raw value
+      public: void Update(T _val);
+
+      /// \brief Set window size
+      /// \param[in] _n new desired window size
+      public: void SetWindowSize(unsigned int _n);
+
+      /// \brief Get the window size.
+      /// \return The size of the moving window.
+      public: unsigned int GetWindowSize() const;
+
+      /// \brief Get whether the window has been filled.
+      /// \return True if the window has been filled.
+      public: bool GetWindowFilled() const;
+
+      /// \brief Get filtered result
+      /// \return latest filtered value
+      public: T Get();
+
+      /// \brief Allow subclasses to initialize their own data pointer.
+      /// \param[in] _d Reference to data pointer.
+      protected: MovingWindowFilter<T>(MovingWindowFilterPrivate<T> &_d);
+
+      /// \brief Data pointer.
+      protected: MovingWindowFilterPrivate<T> *dataPtr;
+    };
+
+    //////////////////////////////////////////////////
+    template<typename T>
+    MovingWindowFilter<T>::MovingWindowFilter()
+      : dataPtr(new MovingWindowFilterPrivate<T>())
+    {
+    }
+
+    //////////////////////////////////////////////////
+    template<typename T>
+    MovingWindowFilter<T>::~MovingWindowFilter()
+    {
+      this->dataPtr->valHistory.clear();
+      delete this->dataPtr;
+      this->dataPtr = NULL;
+    }
+
+    //////////////////////////////////////////////////
+    template<typename T>
+    void MovingWindowFilter<T>::Update(T _val)
+    {
+      // update sum and sample size with incoming _val
+
+      // keep running sum
+      this->dataPtr->sum += _val;
+
+      // shift pointer, wrap around if end has been reached.
+      ++this->dataPtr->valIter;
+      if (this->dataPtr->valIter == this->dataPtr->valHistory.end())
+      {
+        // reset iterator to beginning of queue
+        this->dataPtr->valIter = this->dataPtr->valHistory.begin();
+      }
+
+      // increment sample size
+      ++this->dataPtr->samples;
+
+      if (this->dataPtr->samples > this->dataPtr->valWindowSize)
+      {
+        // subtract old value if buffer already filled
+        this->dataPtr->sum -= (*this->dataPtr->valIter);
+        // put new value into queue
+        (*this->dataPtr->valIter) = _val;
+        // reduce sample size
+        --this->dataPtr->samples;
+      }
+      else
+      {
+        // put new value into queue
+        (*this->dataPtr->valIter) = _val;
+      }
+    }
+
+    //////////////////////////////////////////////////
+    template<typename T>
+    void MovingWindowFilter<T>::SetWindowSize(unsigned int _n)
+    {
+      this->dataPtr->valWindowSize = _n;
+      this->dataPtr->valHistory.clear();
+      this->dataPtr->valHistory.resize(this->dataPtr->valWindowSize);
+      this->dataPtr->valIter = this->dataPtr->valHistory.begin();
+      this->dataPtr->sum = T();
+      this->dataPtr->samples = 0;
+    }
+
+    //////////////////////////////////////////////////
+    template<typename T>
+    unsigned int MovingWindowFilter<T>::GetWindowSize() const
+    {
+      return this->dataPtr->valWindowSize;
+    }
+
+    //////////////////////////////////////////////////
+    template<typename T>
+    bool MovingWindowFilter<T>::GetWindowFilled() const
+    {
+      return this->dataPtr->samples == this->dataPtr->valWindowSize;
+    }
+
+    //////////////////////////////////////////////////
+    template<typename T>
+    T MovingWindowFilter<T>::Get()
+    {
+      return this->dataPtr->sum / static_cast<double>(this->dataPtr->samples);
+    }
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/common/MovingWindowFilter_TEST.cc b/gazebo/common/MovingWindowFilter_TEST.cc
new file mode 100644
index 0000000..f43feda
--- /dev/null
+++ b/gazebo/common/MovingWindowFilter_TEST.cc
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/common/MovingWindowFilter.hh"
+#include "gazebo/math/Vector3.hh"
+
+using namespace gazebo;
+
+/////////////////////////////////////////////////
+TEST(MovingWindowFilterTest, SetWindowSize)
+{
+  common::MovingWindowFilter<int> filterInt;
+
+  EXPECT_EQ(filterInt.GetWindowSize(), 4u);
+  EXPECT_FALSE(filterInt.GetWindowFilled());
+
+  filterInt.SetWindowSize(10);
+  EXPECT_EQ(filterInt.GetWindowSize(), 10u);
+  EXPECT_FALSE(filterInt.GetWindowFilled());
+}
+
+/////////////////////////////////////////////////
+TEST(MovingWindowFilterTest, FilterSomething)
+{
+  common::MovingWindowFilter<double> doubleMWF;
+  common::MovingWindowFilter<double> doubleMWF2;
+  common::MovingWindowFilter<math::Vector3> vectorMWF;
+
+  doubleMWF.SetWindowSize(10);
+  doubleMWF2.SetWindowSize(2);
+  vectorMWF.SetWindowSize(40);
+
+  for (unsigned int i = 0; i < 20; ++i)
+  {
+    doubleMWF.Update(static_cast<double>(i));
+    doubleMWF2.Update(static_cast<double>(i));
+    math::Vector3 v(1.0*static_cast<double>(i),
+                    2.0*static_cast<double>(i),
+                    3.0*static_cast<double>(i));
+    vectorMWF.Update(v);
+  }
+
+  double sum = 0;
+  for (unsigned int i = 20-10; i < 20; ++i)
+    sum += static_cast<double>(i);
+  EXPECT_DOUBLE_EQ(doubleMWF.Get(), sum/10.0);
+  EXPECT_DOUBLE_EQ(doubleMWF2.Get(), (18.0+19.0)/2.0);
+
+  math::Vector3 vsum;
+  for (unsigned int i = 0; i < 20; ++i)
+    vsum += math::Vector3(1.0*static_cast<double>(i),
+                          2.0*static_cast<double>(i),
+                          3.0*static_cast<double>(i));
+  EXPECT_EQ(vectorMWF.Get(), vsum / 20.0);
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/common/PID.cc b/gazebo/common/PID.cc
index 481d857..9ba2798 100644
--- a/gazebo/common/PID.cc
+++ b/gazebo/common/PID.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,9 +16,10 @@
 */
 
 #include <math.h>
+#include <cmath>
 #include <stdio.h>
 
-#include "math/Helpers.hh"
+#include "gazebo/math/Helpers.hh"
 #include "PID.hh"
 
 using namespace gazebo;
@@ -111,7 +112,7 @@ double PID::Update(double _error, common::Time _dt)
   double pTerm, dTerm, iTerm;
   this->pErr = _error;
 
-  if (_dt == common::Time(0, 0) || math::isnan(_error) || isinf(_error))
+  if (_dt == common::Time(0, 0) || math::isnan(_error) || std::isinf(_error))
     return 0.0;
 
   // Calculate proportional contribution to command
@@ -174,3 +175,45 @@ void PID::GetErrors(double &_pe, double &_ie, double &_de)
   _ie = this->iErr;
   _de = this->dErr;
 }
+
+/////////////////////////////////////////////////
+double PID::GetPGain() const
+{
+  return this->pGain;
+}
+
+/////////////////////////////////////////////////
+double PID::GetIGain() const
+{
+  return this->iGain;
+}
+
+/////////////////////////////////////////////////
+double PID::GetDGain() const
+{
+  return this->dGain;
+}
+
+/////////////////////////////////////////////////
+double PID::GetIMax() const
+{
+  return this->iMax;
+}
+
+/////////////////////////////////////////////////
+double PID::GetIMin() const
+{
+  return this->iMin;
+}
+
+/////////////////////////////////////////////////
+double PID::GetCmdMax() const
+{
+  return this->cmdMax;
+}
+
+/////////////////////////////////////////////////
+double PID::GetCmdMin() const
+{
+  return this->cmdMin;
+}
diff --git a/gazebo/common/PID.hh b/gazebo/common/PID.hh
index 54c3c0d..d95da58 100644
--- a/gazebo/common/PID.hh
+++ b/gazebo/common/PID.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,8 @@
 #ifndef _GAZEBO_PID_HH_
 #define _GAZEBO_PID_HH_
 
-#include "common/Time.hh"
+#include "gazebo/common/Time.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,15 +33,17 @@ namespace gazebo
     /// Generic proportiolnal-integral-derivative controller class that
     /// keeps track of PID-error states and control inputs given
     /// the state of a system and a user specified target state.
-    class PID
+    class GAZEBO_VISIBLE PID
     {
-      ///  \brief Constructor, zeros out Pid values when created and
-      ///  initialize Pid-gains and integral term limits:[iMax:iMin]-[I1:I2].
-      ///  \param[in] _p  The proportional gain.
-      ///  \param[in] _i  The integral gain.
-      ///  \param[in] _d  The derivative gain.
-      ///  \param[in] _imax The integral upper limit.
-      ///  \param[in] _imin The integral lower limit.
+      /// \brief Constructor, zeros out Pid values when created and
+      /// initialize Pid-gains and integral term limits:[iMax:iMin]-[I1:I2].
+      /// \param[in] _p  The proportional gain.
+      /// \param[in] _i  The integral gain.
+      /// \param[in] _d  The derivative gain.
+      /// \param[in] _imax The integral upper limit.
+      /// \param[in] _imin The integral lower limit.
+      /// \param[in] _cmdMax Output max value.
+      /// \param[in] _cmdMin Output min value.
       public: PID(double _p = 0.0, double _i = 0.0, double _d = 0.0,
                   double _imax = 0.0, double _imin = 0.0,
                   double _cmdMax = 0.0, double _cmdMin = 0.0);
@@ -48,13 +51,15 @@ namespace gazebo
       /// \brief Destructor
       public: virtual ~PID();
 
-      ///  \brief Initialize PID-gains and integral term
-      ///         limits:[iMax:iMin]-[I1:I2]
-      ///  \param[in] _p  The proportional gain.
-      ///  \param[in] _i  The integral gain.
-      ///  \param[in] _d  The derivative gain.
-      ///  \param[in] _imax The integral upper limit.
-      ///  \param[in] _imin The integral lower limit.
+      /// \brief Initialize PID-gains and integral term
+      ///        limits:[iMax:iMin]-[I1:I2]
+      /// \param[in] _p  The proportional gain.
+      /// \param[in] _i  The integral gain.
+      /// \param[in] _d  The derivative gain.
+      /// \param[in] _imax The integral upper limit.
+      /// \param[in] _imin The integral lower limit.
+      /// \param[in] _cmdMax Output max value.
+      /// \param[in] _cmdMin Output min value.
       public: void Init(double _p = 0.0, double _i = 0.0, double _d = 0.0,
                         double _imax = 0.0, double _imin = 0.0,
                         double _cmdMax = 0.0, double _cmdMin = 0.0);
@@ -87,6 +92,34 @@ namespace gazebo
       /// \param[in] _c The maximum value
       public: void SetCmdMin(double _c);
 
+      /// \brief Get the proportional Gain.
+      /// \return The proportional gain value
+      public: double GetPGain() const;
+
+      /// \brief Get the integral Gain.
+      /// \return The integral gain value
+      public: double GetIGain() const;
+
+      /// \brief Get the derivative Gain.
+      /// \return The derivative gain value
+      public: double GetDGain() const;
+
+      /// \brief Get the integral upper limit.
+      /// \return The integral upper limit value
+      public: double GetIMax() const;
+
+      /// \brief Get the integral lower limit.
+      /// \return The integral lower limit value
+      public: double GetIMin() const;
+
+      /// \brief Get the maximum value for the command.
+      /// \return The maximum value
+      public: double GetCmdMax() const;
+
+      /// \brief Get the maximum value for the command.
+      /// \return The maximum value
+      public: double GetCmdMin() const;
+
       /// \brief Update the Pid loop with nonuniform time step size.
       /// \param[_in] _error  Error since last call (p_state - p_target).
       /// \param[_in] _dt Change in time since last update call.
@@ -124,6 +157,12 @@ namespace gazebo
                 this->iMax = _p.iMax;
                 this->iMin = _p.iMin;
                 this->cmdMax = _p.cmdMax;
+                this->cmdMin = _p.cmdMin;
+                this->pErrLast = _p.pErrLast;
+                this->pErr = _p.pErr;
+                this->iErr = _p.iErr;
+                this->dErr = _p.dErr;
+                this->cmd = _p.cmd;
 
                 this->Reset();
                 return *this;
diff --git a/gazebo/common/Plugin.cc b/gazebo/common/Plugin.cc
index a81a56a..3242584 100644
--- a/gazebo/common/Plugin.cc
+++ b/gazebo/common/Plugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,9 +16,7 @@
 */
 
 
-#include "common/Plugin.hh"
+#include "gazebo/common/Plugin.hh"
 
 
 using namespace gazebo;
-
-
diff --git a/gazebo/common/Plugin.hh b/gazebo/common/Plugin.hh
index 57eae52..5c91ebd 100644
--- a/gazebo/common/Plugin.hh
+++ b/gazebo/common/Plugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,24 +22,22 @@
 #include <sys/stat.h>
 
 #include <gazebo/gazebo_config.h>
-#ifdef HAVE_DL
 #include <dlfcn.h>
-#elif HAVE_LTDL
-#include <ltdl.h>
-#endif
 
 #include <list>
 #include <string>
 
-#include "common/CommonTypes.hh"
-#include "common/SystemPaths.hh"
-#include "common/Console.hh"
-#include "common/Exception.hh"
+#include <sdf/sdf.hh>
+
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
 
-#include "physics/PhysicsTypes.hh"
-#include "sensors/SensorTypes.hh"
-#include "sdf/sdf.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/sensors/SensorTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -68,18 +66,35 @@ namespace gazebo
   /// \class PluginT Plugin.hh common/common.hh
   /// \brief A class which all plugins must inherit from
   template<class T>
-  class PluginT
+  class GAZEBO_VISIBLE PluginT
   {
     /// \brief plugin pointer type definition
     public: typedef boost::shared_ptr<T> TPtr;
 
-            /// \brief Get the name of the handler
+    /// \brief Constructor
+    public: PluginT()
+            {
+              this->dlHandle = NULL;
+            }
+
+    /// \brief Destructor
+    public: virtual ~PluginT()
+            {
+              // dlclose has been disabled due to segfaults in the test suite
+              // This workaround is detailed in #1026 and #1066. After the test
+              // or gazebo execution the plugin is not loaded in memory anymore
+              // \todo Figure out the right thing to do.
+
+              // dlclose(this->dlHandle);
+            }
+
+    /// \brief Get the name of the handler
     public: std::string GetFilename() const
             {
               return this->filename;
             }
 
-            /// \brief Get the short name of the handler
+    /// \brief Get the short name of the handler
     public: std::string GetHandle() const
             {
               return this->handle;
@@ -97,15 +112,26 @@ namespace gazebo
               // PluginPtr result;
               struct stat st;
               bool found = false;
-              std::string fullname;
+              std::string fullname, filename(_filename);
               std::list<std::string>::iterator iter;
               std::list<std::string> pluginPaths =
                 common::SystemPaths::Instance()->GetPluginPaths();
 
+#ifdef __APPLE__
+              // This is a hack to work around issue #800,
+              // error loading plugin libraries with different extensions
+              {
+                size_t soSuffix = filename.rfind(".so");
+                const std::string macSuffix(".dylib");
+                if (soSuffix != std::string::npos)
+                  filename.replace(soSuffix, macSuffix.length(), macSuffix);
+              }
+#endif  // ifdef __APPLE__
+
               for (iter = pluginPaths.begin();
                    iter!= pluginPaths.end(); ++iter)
               {
-                fullname = (*iter)+std::string("/")+_filename;
+                fullname = (*iter)+std::string("/")+filename;
                 if (stat(fullname.c_str(), &st) == 0)
                 {
                   found = true;
@@ -114,21 +140,20 @@ namespace gazebo
               }
 
               if (!found)
-                fullname = _filename;
+                fullname = filename;
 
-#ifdef HAVE_DL
               fptr_union_t registerFunc;
               std::string registerName = "RegisterPlugin";
 
-              void* handle = dlopen(fullname.c_str(), RTLD_LAZY|RTLD_GLOBAL);
-              if (!handle)
+              void *dlHandle = dlopen(fullname.c_str(), RTLD_LAZY|RTLD_GLOBAL);
+              if (!dlHandle)
               {
                 gzerr << "Failed to load plugin " << fullname << ": "
                   << dlerror() << "\n";
                 return result;
               }
 
-              registerFunc.ptr = dlsym(handle, registerName.c_str());
+              registerFunc.ptr = dlsym(dlHandle, registerName.c_str());
 
               if (!registerFunc.ptr)
               {
@@ -139,56 +164,10 @@ namespace gazebo
 
               // Register the new controller.
               result.reset(registerFunc.func());
-
-#elif HAVE_LTDL
-              fptr_union_t registerFunc;
-              std::string registerName = "RegisterPlugin";
-
-              static bool init_done = false;
-
-              if (!init_done)
-              {
-                int errors = lt_dlinit();
-                if (errors)
-                {
-                  gzerr << "Error(s) initializing dynamic loader ("
-                    << errors << ", " << lt_dlerror() << ")";
-                  return NULL;
-                }
-                else
-                  init_done = true;
-              }
-
-              lt_dlhandle handle = lt_dlopenext(fullname.c_str());
-
-              if (!handle)
-              {
-                gzerr << "Failed to load " << fullname
-                      << ": " << lt_dlerror();
-                return NULL;
-              }
-
-              T *(*registerFunc)() =
-                (T *(*)())lt_dlsym(handle, registerName.c_str());
-              resigsterFunc.ptr = lt_dlsym(handle, registerName.c_str());
-              if (!registerFunc.ptr)
-              {
-                gzerr << "Failed to resolve " << registerName << ": "
-                      << lt_dlerror();
-                return NULL;
-              }
-
-              // Register the new controller.
-              result.result(registerFunc.func());
-
-#else  // HAVE_LTDL
-
-              gzthrow("Cannot load plugins as libtool is not installed.");
-
-#endif  // HAVE_LTDL
+              result->dlHandle = dlHandle;
 
               result->handle = _handle;
-              result->filename = _filename;
+              result->filename = filename;
 
               return result;
             }
@@ -215,13 +194,16 @@ namespace gazebo
                T *(*func)();
                void *ptr;
              } fptr_union_t;
+
+    /// \brief Handle used for closing the dynamic library.
+    private: void *dlHandle;
   };
 
   /// \class WorldPlugin Plugin.hh common/common.hh
   /// \brief A plugin with access to physics::World.  See
   ///        <a href="http://gazebosim.org/wiki/tutorials/plugins">
   ///        reference</a>.
-  class WorldPlugin : public PluginT<WorldPlugin>
+  class GAZEBO_VISIBLE WorldPlugin : public PluginT<WorldPlugin>
   {
     /// \brief Constructor
     public: WorldPlugin()
@@ -246,7 +228,7 @@ namespace gazebo
   /// \brief A plugin with access to physics::Model.  See
   ///        <a href="http://gazebosim.org/wiki/tutorials/plugins">
   ///        reference</a>.
-  class ModelPlugin : public PluginT<ModelPlugin>
+  class GAZEBO_VISIBLE ModelPlugin : public PluginT<ModelPlugin>
   {
     /// \brief Constructor
     public: ModelPlugin()
@@ -275,7 +257,7 @@ namespace gazebo
   /// \brief A plugin with access to physics::Sensor.  See
   ///        <a href="http://gazebosim.org/wiki/tutorials/plugins">
   ///        reference</a>.
-  class SensorPlugin : public PluginT<SensorPlugin>
+  class GAZEBO_VISIBLE SensorPlugin : public PluginT<SensorPlugin>
   {
     /// \brief Constructor
     public: SensorPlugin()
@@ -304,7 +286,7 @@ namespace gazebo
   ///        <a href="http://gazebosim.org/wiki/tutorials/plugins">
   ///        reference</a>.
   /// @todo how to make doxygen reference to the file gazebo.cc#g_plugins?
-  class SystemPlugin : public PluginT<SystemPlugin>
+  class GAZEBO_VISIBLE SystemPlugin : public PluginT<SystemPlugin>
   {
     /// \brief Constructor
     public: SystemPlugin()
@@ -332,7 +314,7 @@ namespace gazebo
   /// \brief A plugin loaded within the gzserver on startup.  See
   ///        <a href="http://gazebosim.org/wiki/tutorials/plugins">
   ///        reference</a>.
-  class VisualPlugin : public PluginT<VisualPlugin>
+  class GAZEBO_VISIBLE VisualPlugin : public PluginT<VisualPlugin>
   {
     public: VisualPlugin()
              {this->type = VISUAL_PLUGIN;}
@@ -362,7 +344,8 @@ namespace gazebo
 /// to add the plugin to the registered list.
 /// \return the name of the registered plugin
 #define GZ_REGISTER_MODEL_PLUGIN(classname) \
-  extern "C" gazebo::ModelPlugin *RegisterPlugin(); \
+  extern "C" GAZEBO_VISIBLE gazebo::ModelPlugin *RegisterPlugin(); \
+  GAZEBO_VISIBLE \
   gazebo::ModelPlugin *RegisterPlugin() \
   {\
     return new classname();\
@@ -373,7 +356,8 @@ namespace gazebo
 /// to add the plugin to the registered list.
 /// \return the name of the registered plugin
 #define GZ_REGISTER_WORLD_PLUGIN(classname) \
-  extern "C" gazebo::WorldPlugin *RegisterPlugin(); \
+  extern "C" GAZEBO_VISIBLE gazebo::WorldPlugin *RegisterPlugin(); \
+  GAZEBO_VISIBLE \
   gazebo::WorldPlugin *RegisterPlugin() \
   {\
     return new classname();\
@@ -384,7 +368,8 @@ namespace gazebo
 /// the plugin to the registered list.
 /// \return the name of the registered plugin
 #define GZ_REGISTER_SENSOR_PLUGIN(classname) \
-  extern "C" gazebo::SensorPlugin *RegisterPlugin(); \
+  extern "C" GAZEBO_VISIBLE gazebo::SensorPlugin *RegisterPlugin(); \
+  GAZEBO_VISIBLE \
   gazebo::SensorPlugin *RegisterPlugin() \
   {\
     return new classname();\
@@ -395,7 +380,8 @@ namespace gazebo
 /// library to add the plugin to the registered list.
 /// \return the name of the registered plugin
 #define GZ_REGISTER_SYSTEM_PLUGIN(classname) \
-  extern "C" gazebo::SystemPlugin *RegisterPlugin(); \
+  extern "C" GAZEBO_VISIBLE gazebo::SystemPlugin *RegisterPlugin(); \
+  GAZEBO_VISIBLE \
   gazebo::SystemPlugin *RegisterPlugin() \
   {\
     return new classname();\
@@ -406,7 +392,8 @@ namespace gazebo
 /// library to add the plugin to the registered list.
 /// \return the name of the registered plugin
 #define GZ_REGISTER_VISUAL_PLUGIN(classname) \
-  extern "C" gazebo::VisualPlugin *RegisterPlugin(); \
+  extern "C" GAZEBO_VISIBLE gazebo::VisualPlugin *RegisterPlugin(); \
+  GAZEBO_VISIBLE \
   gazebo::VisualPlugin *RegisterPlugin() \
   {\
     return new classname();\
diff --git a/gazebo/common/STLLoader.cc b/gazebo/common/STLLoader.cc
index b42efe9..f888942 100644
--- a/gazebo/common/STLLoader.cc
+++ b/gazebo/common/STLLoader.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,10 +18,10 @@
 #include <ctype.h>
 #include <stdio.h>
 
-#include "math/Helpers.hh"
-#include "common/Console.hh"
-#include "common/Mesh.hh"
-#include "common/STLLoader.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/STLLoader.hh"
 
 using namespace gazebo;
 using namespace common;
@@ -168,8 +168,12 @@ bool STLLoader::ReadAscii(FILE *_filein, Mesh *_mesh)
     }
   }
 
+  result = subMesh->GetVertexCount() > 0;
+
   if (result)
     _mesh->AddSubMesh(subMesh);
+  else
+    delete subMesh;
 
   return result;
 }
diff --git a/gazebo/common/STLLoader.hh b/gazebo/common/STLLoader.hh
index 99fbb61..9a30193 100644
--- a/gazebo/common/STLLoader.hh
+++ b/gazebo/common/STLLoader.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,8 @@
 #include <stdint.h>
 #include <string>
 
-#include "common/MeshLoader.hh"
+#include "gazebo/common/MeshLoader.hh"
+#include "gazebo/util/system.hh"
 
 #define LINE_MAX_LEN 256
 #define COR3_MAX 200000
@@ -36,7 +37,7 @@ namespace gazebo
 
     /// \class STLLoader STLLoader.hh common/common.hh
     /// \brief Class used to load STL mesh files
-    class STLLoader : public MeshLoader
+    class GAZEBO_VISIBLE STLLoader : public MeshLoader
     {
       /// \brief Constructor
       public: STLLoader();
diff --git a/gazebo/common/SingletonT.hh b/gazebo/common/SingletonT.hh
index 3fffbf7..841f29c 100644
--- a/gazebo/common/SingletonT.hh
+++ b/gazebo/common/SingletonT.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,13 +22,15 @@
 #ifndef _SINGLETONT_HH_
 #define _SINGLETONT_HH_
 
+#include "gazebo/util/system.hh"
+
 /// \addtogroup gazebo_common Common
 /// \{
 
 /// \class SingletonT SingletonT.hh common/common.hh
 /// \brief Singleton template class
 template <class T>
-class SingletonT
+class GAZEBO_VISIBLE SingletonT
 {
   /// \brief Get an instance of the singleton
   public: static T *Instance()
@@ -55,9 +57,8 @@ class SingletonT
 
 /// \brief Initialization of the singleton instance.
 template <class T>
+GAZEBO_VISIBLE
 T &SingletonT<T>::myself = SingletonT<T>::GetInstance();
 /// \}
 
 #endif
-
-
diff --git a/gazebo/common/Skeleton.cc b/gazebo/common/Skeleton.cc
index 95836b7..69072e2 100644
--- a/gazebo/common/Skeleton.cc
+++ b/gazebo/common/Skeleton.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,9 +16,9 @@
  */
 #include <list>
 
-#include "common/Skeleton.hh"
-#include "common/SkeletonAnimation.hh"
-#include "math/Angle.hh"
+#include "gazebo/common/Skeleton.hh"
+#include "gazebo/common/SkeletonAnimation.hh"
+#include "gazebo/math/Angle.hh"
 
 using namespace gazebo;
 using namespace common;
diff --git a/gazebo/common/Skeleton.hh b/gazebo/common/Skeleton.hh
index 49c6155..4df5d65 100644
--- a/gazebo/common/Skeleton.hh
+++ b/gazebo/common/Skeleton.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,7 +22,8 @@
 #include <map>
 #include <utility>
 
-#include "math/Matrix4.hh"
+#include "gazebo/math/Matrix4.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -46,7 +47,7 @@ namespace gazebo
 
     /// \class Skeleton Skeleton.hh common/common.hh
     /// \brief A skeleton
-    class Skeleton
+    class GAZEBO_VISIBLE Skeleton
     {
       /// \brief Constructor
       public: Skeleton();
@@ -166,7 +167,7 @@ namespace gazebo
 
     /// \class SkeletonNode Skeleton.hh common/common.hh
     /// \brief A skeleton node
-    class SkeletonNode
+    class GAZEBO_VISIBLE SkeletonNode
     {
       /// \brief enumeration of node types
       public: enum SkeletonNodeType {NODE, JOINT};
@@ -351,7 +352,7 @@ namespace gazebo
 
     /// \clas NodeTransform Skeleton.hh common/common.hh
     /// \brief A transformation node
-    class NodeTransform
+    class GAZEBO_VISIBLE NodeTransform
     {
       /// \brief Enumeration of the transform types
       public: enum TransformType {TRANSLATE, ROTATE, SCALE, MATRIX};
diff --git a/gazebo/common/SkeletonAnimation.cc b/gazebo/common/SkeletonAnimation.cc
index 7f0ccdd..3451827 100644
--- a/gazebo/common/SkeletonAnimation.cc
+++ b/gazebo/common/SkeletonAnimation.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,10 @@
  * limitations under the License.
  *
 */
-#include <common/SkeletonAnimation.hh>
-#include <common/Console.hh>
+
+#include "gazebo/common/SkeletonAnimation.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Assert.hh"
 
 using namespace gazebo;
 using namespace common;
@@ -46,7 +48,7 @@ std::string NodeAnimation::GetName() const
 }
 
 //////////////////////////////////////////////////
-void NodeAnimation::AddKeyFrame(const double _time, const math::Matrix4 _trans)
+void NodeAnimation::AddKeyFrame(const double _time, const math::Matrix4 &_trans)
 {
   if (_time > this->length)
     this->length = _time;
@@ -55,7 +57,7 @@ void NodeAnimation::AddKeyFrame(const double _time, const math::Matrix4 _trans)
 }
 
 //////////////////////////////////////////////////
-void NodeAnimation::AddKeyFrame(const double _time, const math::Pose _pose)
+void NodeAnimation::AddKeyFrame(const double _time, const math::Pose &_pose)
 {
   math::Matrix4 mat(_pose.rot.GetAsMatrix4());
   mat.SetTranslate(_pose.pos);
@@ -140,7 +142,7 @@ math::Matrix4 NodeAnimation::GetFrameAt(double _time, bool _loop) const
   math::Matrix4 prevTrans = it2->second;
 
   double t = (time - prevKey) / (nextKey - prevKey);
-  assert(t >= 0.0 && t <= 1.0);
+  GZ_ASSERT(t >= 0.0 && t <= 1.0, "t is not in the range 0.0..1.0");
 
   math::Vector3 nextPos = nextTrans.GetTranslation();
   math::Vector3 prevPos = prevTrans.GetTranslation();
@@ -228,7 +230,7 @@ bool SkeletonAnimation::HasNode(const std::string& _node) const
 
 //////////////////////////////////////////////////
 void SkeletonAnimation::AddKeyFrame(const std::string& _node,
-    const double _time, const math::Matrix4 _mat)
+    const double _time, const math::Matrix4 &_mat)
 {
   if (this->animations.find(_node) == this->animations.end())
     this->animations[_node] = new NodeAnimation(_node);
@@ -241,7 +243,7 @@ void SkeletonAnimation::AddKeyFrame(const std::string& _node,
 
 //////////////////////////////////////////////////
 void SkeletonAnimation::AddKeyFrame(const std::string& _node,
-      const double _time, const math::Pose _pose)
+      const double _time, const math::Pose &_pose)
 {
   if (this->animations.find(_node) == this->animations.end())
     this->animations[_node] = new NodeAnimation(_node);
diff --git a/gazebo/common/SkeletonAnimation.hh b/gazebo/common/SkeletonAnimation.hh
index 6d15d2c..00dd38f 100644
--- a/gazebo/common/SkeletonAnimation.hh
+++ b/gazebo/common/SkeletonAnimation.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,13 +17,14 @@
 #ifndef _SKELETONANIMATION_HH_
 #define _SKELETONANIMATION_HH_
 
-#include <math/Matrix4.hh>
-#include <math/Pose.hh>
-
 #include <map>
 #include <utility>
 #include <string>
 
+#include "gazebo/math/Matrix4.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/util/system.hh"
+
 namespace gazebo
 {
   namespace common
@@ -33,7 +34,7 @@ namespace gazebo
 
     /// \class NodeAnimation SkeletonAnimation.hh common/common.hh
     /// \brief Node animation
-    class NodeAnimation
+    class GAZEBO_VISIBLE NodeAnimation
     {
       /// \brief constructor
       /// \param[in] _name the name of the node
@@ -53,12 +54,12 @@ namespace gazebo
       /// \brief Adds a key frame at a specific time
       /// \param[in] _time the time of the key frame
       /// \param[in] _trans the transformation
-      public: void AddKeyFrame(const double _time, const math::Matrix4 _trans);
+      public: void AddKeyFrame(const double _time, const math::Matrix4 &_trans);
 
       /// \brief Adds a key fram at a specific time
       /// \param[in] _time the tiem of the key frame
       /// \param[in] _pose the pose
-      public: void AddKeyFrame(const double _time, const math::Pose _pose);
+      public: void AddKeyFrame(const double _time, const math::Pose &_pose);
 
       /// \brief Returns the number of key frames.
       /// \return the count
@@ -117,7 +118,7 @@ namespace gazebo
     };
 
     /// \brief Skeleton animation
-    class SkeletonAnimation
+    class GAZEBO_VISIBLE SkeletonAnimation
     {
       /// \brief The Constructor
       /// \param[in] _name the name of the animation
@@ -149,14 +150,14 @@ namespace gazebo
       /// \param[in] _time the time
       /// \param[in] _mat the key frame transformation
       public: void AddKeyFrame(const std::string& _node, const double _time,
-                      const math::Matrix4 _mat);
+                      const math::Matrix4 &_mat);
 
       /// \brief Adds or replaces a named key frame at a specific time
       /// \param[in] _node the name of the new or existing node
       /// \param[in] _time the time
       /// \param[in] _pose the key frame transformation as a math::Pose
       public: void AddKeyFrame(const std::string& _node, const double _time,
-                      const math::Pose _pose);
+                      const math::Pose &_pose);
 
       /// \brief Returns the key frame transformation for a named animation at
       /// a specific time
diff --git a/gazebo/common/SphericalCoordinates.cc b/gazebo/common/SphericalCoordinates.cc
new file mode 100644
index 0000000..919b705
--- /dev/null
+++ b/gazebo/common/SphericalCoordinates.cc
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <string>
+#include <math.h>
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/SphericalCoordinates.hh"
+#include "gazebo/common/SphericalCoordinatesPrivate.hh"
+
+
+using namespace gazebo;
+using namespace common;
+
+// Parameters for EARTH_WGS84 model
+// a: Semi-major equatorial axis (meters)
+// b: Semi-minor polar axis (meters)
+// if: inverse flattening (no units)
+// wikipedia: World_Geodetic_System#A_new_World_Geodetic_System:_WGS_84
+const double g_EarthWGS84AxisEquatorial = 6378137.0;
+const double g_EarthWGS84AxisPolar = 6356752.314245;
+
+const double g_EarthSphere = 6371000.0;
+// const double g_EarthWGS84Flattening = 1/298.257223563;
+
+//////////////////////////////////////////////////
+SphericalCoordinates::SurfaceType SphericalCoordinates::Convert(
+  const std::string &_str)
+{
+  if ("EARTH_WGS84" == _str)
+    return EARTH_WGS84;
+
+  gzerr << "SurfaceType string not recognized, "
+        << "EARTH_WGS84 returned by default" << std::endl;
+  return EARTH_WGS84;
+}
+
+//////////////////////////////////////////////////
+SphericalCoordinates::SphericalCoordinates()
+  : dataPtr(new SphericalCoordinatesPrivate)
+{
+  this->SetSurfaceType(EARTH_WGS84);
+  this->SetElevationReference(0.0);
+}
+
+//////////////////////////////////////////////////
+SphericalCoordinates::SphericalCoordinates(const SurfaceType _type)
+  : dataPtr(new SphericalCoordinatesPrivate)
+{
+  this->SetSurfaceType(_type);
+  this->SetElevationReference(0.0);
+}
+
+//////////////////////////////////////////////////
+SphericalCoordinates::SphericalCoordinates(const SurfaceType _type,
+                                           const math::Angle &_latitude,
+                                           const math::Angle &_longitude,
+                                           double _elevation,
+                                           const math::Angle &_heading)
+  : dataPtr(new SphericalCoordinatesPrivate)
+{
+  this->SetSurfaceType(_type);
+  this->SetLatitudeReference(_latitude);
+  this->SetLongitudeReference(_longitude);
+  this->SetElevationReference(_elevation);
+  this->SetHeadingOffset(_heading);
+}
+
+//////////////////////////////////////////////////
+SphericalCoordinates::~SphericalCoordinates()
+{
+  delete this->dataPtr;
+  this->dataPtr = NULL;
+}
+
+//////////////////////////////////////////////////
+SphericalCoordinates::SurfaceType SphericalCoordinates::GetSurfaceType() const
+{
+  return this->dataPtr->surfaceType;
+}
+
+//////////////////////////////////////////////////
+math::Angle SphericalCoordinates::GetLatitudeReference() const
+{
+  return this->dataPtr->latitudeReference;
+}
+
+//////////////////////////////////////////////////
+math::Angle SphericalCoordinates::GetLongitudeReference() const
+{
+  return this->dataPtr->longitudeReference;
+}
+
+//////////////////////////////////////////////////
+double SphericalCoordinates::GetElevationReference() const
+{
+  return this->dataPtr->elevationReference;
+}
+
+//////////////////////////////////////////////////
+math::Angle SphericalCoordinates::GetHeadingOffset() const
+{
+  return this->dataPtr->headingOffset;
+}
+
+//////////////////////////////////////////////////
+void SphericalCoordinates::SetSurfaceType(const SurfaceType &_type)
+{
+  this->dataPtr->surfaceType = _type;
+}
+
+//////////////////////////////////////////////////
+void SphericalCoordinates::SetLatitudeReference(const math::Angle &_angle)
+{
+  this->dataPtr->latitudeReference.SetFromRadian(_angle.Radian());
+}
+
+//////////////////////////////////////////////////
+void SphericalCoordinates::SetLongitudeReference(const math::Angle &_angle)
+{
+  this->dataPtr->longitudeReference.SetFromRadian(_angle.Radian());
+}
+
+//////////////////////////////////////////////////
+void SphericalCoordinates::SetElevationReference(double _elevation)
+{
+  this->dataPtr->elevationReference = _elevation;
+}
+
+//////////////////////////////////////////////////
+void SphericalCoordinates::SetHeadingOffset(const math::Angle &_angle)
+{
+  this->dataPtr->headingOffset.SetFromRadian(_angle.Radian());
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SphericalCoordinates::SphericalFromLocal(
+    const math::Vector3 &_xyz) const
+{
+  double radiusMeridional = 1.0;
+  double radiusNormal = 1.0;
+  double headingSine = sin(this->dataPtr->headingOffset.Radian());
+  double headingCosine = cos(this->dataPtr->headingOffset.Radian());
+
+  switch (this->dataPtr->surfaceType)
+  {
+    case EARTH_WGS84:
+      // Currently uses radius of curvature equations from wikipedia
+      // http://en.wikipedia.org/wiki/Earth_radius#Radius_of_curvature
+      {
+        double a = g_EarthWGS84AxisEquatorial;
+        double b = g_EarthWGS84AxisPolar;
+        double ab = a*b;
+        double cosLat = cos(this->dataPtr->latitudeReference.Radian());
+        double sinLat = sin(this->dataPtr->latitudeReference.Radian());
+        double denom = (a*cosLat)*(a*cosLat) + (b*sinLat)*(b*sinLat);
+        radiusMeridional = ab*ab / denom / sqrt(denom);
+        radiusNormal = a*a / sqrt(denom);
+      }
+      break;
+
+    default:
+      break;
+  }
+
+  math::Vector3 spherical;
+  double east  = _xyz.x * headingCosine - _xyz.y * headingSine;
+  double north = _xyz.x * headingSine   + _xyz.y * headingCosine;
+  // Assumes small changes in latitude / longitude.
+  // May not work well near the north / south poles.
+  math::Angle deltaLatitude(north / radiusMeridional);
+  math::Angle deltaLongitude(east / radiusNormal);
+  // geodetic latitude in degrees
+  spherical.x = this->dataPtr->latitudeReference.Degree() +
+                deltaLatitude.Degree();
+  // geodetic longitude in degrees
+  spherical.y = this->dataPtr->longitudeReference.Degree() +
+                deltaLongitude.Degree();
+  // altitude relative to sea level
+  spherical.z = this->dataPtr->elevationReference + _xyz.z;
+  return spherical;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SphericalCoordinates::GlobalFromLocal(const math::Vector3 &_xyz)
+    const
+{
+  double headingSine = sin(this->dataPtr->headingOffset.Radian());
+  double headingCosine = cos(this->dataPtr->headingOffset.Radian());
+  double east  = _xyz.x * headingCosine - _xyz.y * headingSine;
+  double north = _xyz.x * headingSine   + _xyz.y * headingCosine;
+  return math::Vector3(east, north, _xyz.z);
+}
+
+//////////////////////////////////////////////////
+/// Based on Haversine formula (http://en.wikipedia.org/wiki/Haversine_formula).
+double SphericalCoordinates::Distance(const math::Angle &_latA,
+                                      const math::Angle &_lonA,
+                                      const math::Angle &_latB,
+                                      const math::Angle &_lonB)
+{
+  math::Angle dLat = _latB - _latA;
+  math::Angle dLon = _lonB - _lonA;
+  double a = sin(dLat.Radian() / 2) * sin(dLat.Radian() / 2) +
+             sin(dLon.Radian() / 2) * sin(dLon.Radian() / 2) *
+             cos(_latA.Radian()) * cos(_latB.Radian());
+  double c = 2 * atan2(sqrt(a), sqrt(1 - a));
+  double d = g_EarthSphere * c;
+  return d;
+}
diff --git a/gazebo/common/SphericalCoordinates.hh b/gazebo/common/SphericalCoordinates.hh
new file mode 100644
index 0000000..e45a718
--- /dev/null
+++ b/gazebo/common/SphericalCoordinates.hh
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SPHERICALCOORDINATES_HH_
+#define _SPHERICALCOORDINATES_HH_
+
+#include <string>
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace common
+  {
+    class SphericalCoordinatesPrivate;
+
+    /// \addtogroup gazebo_common
+    /// \{
+
+    /// \class SphericalCoordinates SphericalCoordinates.hh commmon/common.hh
+    /// \brief Convert spherical coordinates for planetary surfaces.
+    class GAZEBO_VISIBLE SphericalCoordinates
+    {
+      /// \enum SurfaceType
+      /// \brief Unique identifiers for planetary surface models.
+      public: enum SurfaceType
+              {
+                /// \brief Model of reference ellipsoid for earth, based on
+                /// WGS 84 standard. see wikipedia: World_Geodetic_System
+                EARTH_WGS84 = 1
+              };
+
+      /// \brief Constructor.
+      public: SphericalCoordinates();
+
+      /// \brief Constructor with surface type input.
+      /// \param[in] _type SurfaceType specification.
+      public: SphericalCoordinates(const SurfaceType _type);
+
+      /// \brief Constructor with surface type, angle, and elevation inputs.
+      /// \param[in] _type SurfaceType specification.
+      /// \param[in] _latitude Reference latitude.
+      /// \param[in] _longitude Reference longitude.
+      /// \param[in] _elevation Reference elevation.
+      /// \param[in] _heading Heading offset.
+      public: SphericalCoordinates(const SurfaceType _type,
+                                   const math::Angle &_latitude,
+                                   const math::Angle &_longitude,
+                                   double _elevation,
+                                   const math::Angle &_heading);
+
+      /// \brief Destructor.
+      public: ~SphericalCoordinates();
+
+      /// \brief Convert a Cartesian position vector to geodetic coordinates.
+      /// \param[in] _xyz Cartesian position vector in gazebo's world frame.
+      /// \return Cooordinates: geodetic latitude (deg), longitude (deg),
+      ///         altitude above sea level (m).
+      public: math::Vector3 SphericalFromLocal(const math::Vector3 &_xyz) const;
+
+      /// \brief Convert a Cartesian velocity vector in the local gazebo frame
+      ///        to a global Cartesian frame with components East, North, Up.
+      /// \param[in] _xyz Cartesian vector in gazebo's world frame.
+      /// \return Rotated vector with components (x,y,z): (East, North, Up).
+      public: math::Vector3 GlobalFromLocal(const math::Vector3 &_xyz) const;
+
+      /// \brief Convert a string to a SurfaceType.
+      /// \param[in] _str String to convert.
+      /// \return Conversion to SurfaceType.
+      public: static SurfaceType Convert(const std::string &_str);
+
+      /// \brief Get the distance between two points expressed in geographic
+      /// latitude and longitude. It assumes that both points are at sea level.
+      /// Example: _latA = 38.0016667 and _lonA = -123.0016667) represents
+      /// the point with latitude 38d 0'6.00"N and longitude 123d 0'6.00"W.
+      /// \param[in] _latA Latitude of point A.
+      /// \param[in] _longA Longitude of point A.
+      /// \param[in] _latB Latitude of point B.
+      /// \param[in] _longB Longitude of point B.
+      /// \return Distance in meters.
+      public: static double Distance(const math::Angle &_latA,
+                                     const math::Angle &_lonA,
+                                     const math::Angle &_latB,
+                                     const math::Angle &_lonB);
+
+      /// \brief Get SurfaceType currently in use.
+      /// \return Current SurfaceType value.
+      public: SurfaceType GetSurfaceType() const;
+
+      /// \brief Get reference geodetic latitude.
+      /// \return Reference geodetic latitude.
+      public: math::Angle GetLatitudeReference() const;
+
+      /// \brief Get reference longitude.
+      /// \return Reference longitude.
+      public: math::Angle GetLongitudeReference() const;
+
+      /// \brief Get reference elevation in meters.
+      /// \return Reference elevation.
+      public: double GetElevationReference() const;
+
+      /// \brief Get heading offset for gazebo reference frame, expressed as
+      ///        angle from East to gazebo x-axis, or equivalently
+      ///        from North to gazebo y-axis.
+      /// \return Heading offset of gazebo reference frame.
+      public: math::Angle GetHeadingOffset() const;
+
+      /// \brief Set SurfaceType for planetary surface model.
+      /// \param[in] _type SurfaceType value.
+      public: void SetSurfaceType(const SurfaceType &_type);
+
+      /// \brief Set reference geodetic latitude.
+      /// \param[in] _angle Reference geodetic latitude.
+      public: void SetLatitudeReference(const math::Angle &_angle);
+
+      /// \brief Set reference longitude.
+      /// \param[in] _angle Reference longitude.
+      public: void SetLongitudeReference(const math::Angle &_angle);
+
+      /// \brief Set reference elevation above sea level in meters.
+      /// \param[in] _elevation Reference elevation.
+      public: void SetElevationReference(double _elevation);
+
+      /// \brief Set heading angle offset for gazebo frame.
+      /// \param[in] _angle Heading offset for gazebo frame.
+      public: void SetHeadingOffset(const math::Angle &_angle);
+
+      /// internal
+      /// \brief Pointer to the private data
+      private: SphericalCoordinatesPrivate *dataPtr;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/common/SphericalCoordinatesPrivate.hh b/gazebo/common/SphericalCoordinatesPrivate.hh
new file mode 100644
index 0000000..b709871
--- /dev/null
+++ b/gazebo/common/SphericalCoordinatesPrivate.hh
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SPHERICALCOORDINATES_PRIVATE_HH_
+#define _SPHERICALCOORDINATES_PRIVATE_HH_
+
+#include "gazebo/common/SphericalCoordinates.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/util/system.hh"
+
+
+namespace gazebo
+{
+  namespace common
+  {
+    class SphericalCoordinates;
+
+    /// \addtogroup gazebo_common
+    /// \{
+
+    /// \class SphericalCoordinatesPrivate SphericalCoordinatesPrivate.hh
+    ///        commmon/common.hh
+    /// \brief Private data for the SphericalCoordinates class.
+    class GAZEBO_VISIBLE SphericalCoordinatesPrivate
+    {
+      /// \brief Type of surface being used.
+      public: SphericalCoordinates::SurfaceType surfaceType;
+
+      /// \brief Latitude of reference point.
+      public: math::Angle latitudeReference;
+
+      /// \brief Longitude of reference point.
+      public: math::Angle longitudeReference;
+
+      /// \brief Elevation of reference point relative to sea level in meters.
+      public: double elevationReference;
+
+      /// \brief Heading offset, expressed as angle from East to
+      ///        gazebo x-axis, or equivalently from North to gazebo y-axis.
+      public: math::Angle headingOffset;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/common/SphericalCoordinates_TEST.cc b/gazebo/common/SphericalCoordinates_TEST.cc
new file mode 100644
index 0000000..10e8d2f
--- /dev/null
+++ b/gazebo/common/SphericalCoordinates_TEST.cc
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/SphericalCoordinates.hh"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class SphericalCoordinatesTest : public gazebo::testing::AutoLogFixture { };
+
+//////////////////////////////////////////////////
+// Test different constructors, default parameters
+TEST_F(SphericalCoordinatesTest, Constructor)
+{
+  // Default surface type
+  common::SphericalCoordinates::SurfaceType st =
+    common::SphericalCoordinates::EARTH_WGS84;
+
+  // No arguments, default parameters
+  {
+    common::SphericalCoordinates sc;
+    EXPECT_EQ(sc.GetSurfaceType(), st);
+    EXPECT_EQ(sc.GetLatitudeReference(), math::Angle());
+    EXPECT_EQ(sc.GetLongitudeReference(), math::Angle());
+    EXPECT_EQ(sc.GetHeadingOffset(), math::Angle());
+    EXPECT_NEAR(sc.GetElevationReference(), 0.0, 1e-6);
+  }
+
+  // SurfaceType argument, default parameters
+  {
+    common::SphericalCoordinates sc(st);
+    EXPECT_EQ(sc.GetSurfaceType(), st);
+    EXPECT_EQ(sc.GetLatitudeReference(), math::Angle());
+    EXPECT_EQ(sc.GetLongitudeReference(), math::Angle());
+    EXPECT_EQ(sc.GetHeadingOffset(), math::Angle());
+    EXPECT_NEAR(sc.GetElevationReference(), 0.0, 1e-6);
+  }
+
+  // All arguments
+  {
+    math::Angle lat(0.3), lon(-1.2), heading(0.5);
+    double elev = 354.1;
+    common::SphericalCoordinates sc(st, lat, lon, elev, heading);
+    EXPECT_EQ(sc.GetSurfaceType(), st);
+    EXPECT_EQ(sc.GetLatitudeReference(), lat);
+    EXPECT_EQ(sc.GetLongitudeReference(), lon);
+    EXPECT_EQ(sc.GetHeadingOffset(), heading);
+    EXPECT_NEAR(sc.GetElevationReference(), elev, 1e-6);
+  }
+}
+
+//////////////////////////////////////////////////
+// SurfaceType Convert function
+TEST_F(SphericalCoordinatesTest, Convert)
+{
+  // Default surface type
+  common::SphericalCoordinates::SurfaceType st =
+    common::SphericalCoordinates::EARTH_WGS84;
+
+  EXPECT_EQ(common::SphericalCoordinates::Convert("EARTH_WGS84"), st);
+}
+
+//////////////////////////////////////////////////
+// Test Set functions
+TEST_F(SphericalCoordinatesTest, SetFunctions)
+{
+  // Default surface type
+  common::SphericalCoordinates::SurfaceType st =
+    common::SphericalCoordinates::EARTH_WGS84;
+
+  // Default parameters
+  common::SphericalCoordinates sc;
+  EXPECT_EQ(sc.GetSurfaceType(), st);
+  EXPECT_EQ(sc.GetLatitudeReference(), math::Angle());
+  EXPECT_EQ(sc.GetLongitudeReference(), math::Angle());
+  EXPECT_EQ(sc.GetHeadingOffset(), math::Angle());
+  EXPECT_NEAR(sc.GetElevationReference(), 0.0, 1e-6);
+
+  {
+    math::Angle lat(0.3), lon(-1.2), heading(0.5);
+    double elev = 354.1;
+    sc.SetSurfaceType(st);
+    sc.SetLatitudeReference(lat);
+    sc.SetLongitudeReference(lon);
+    sc.SetHeadingOffset(heading);
+    sc.SetElevationReference(elev);
+
+    EXPECT_EQ(sc.GetSurfaceType(), st);
+    EXPECT_EQ(sc.GetLatitudeReference(), lat);
+    EXPECT_EQ(sc.GetLongitudeReference(), lon);
+    EXPECT_EQ(sc.GetHeadingOffset(), heading);
+    EXPECT_NEAR(sc.GetElevationReference(), elev, 1e-6);
+  }
+}
+
+//////////////////////////////////////////////////
+// Test coordinate transformations
+TEST_F(SphericalCoordinatesTest, CoordinateTransforms)
+{
+  // Default surface type
+  common::SphericalCoordinates::SurfaceType st =
+    common::SphericalCoordinates::EARTH_WGS84;
+
+  {
+    // Parameters
+    math::Angle lat(0.3), lon(-1.2), heading(math::Angle::HalfPi);
+    double elev = 354.1;
+    common::SphericalCoordinates sc(st, lat, lon, elev, heading);
+
+    // Check GlobalFromLocal with heading offset of 90 degrees
+    {
+      // local frame
+      math::Vector3 xyz;
+      // east, north, up
+      math::Vector3 enu;
+
+      xyz.Set(1, 0, 0);
+      enu = sc.GlobalFromLocal(xyz);
+      EXPECT_NEAR(enu.y, xyz.x, 1e-6);
+      EXPECT_NEAR(enu.x, -xyz.y, 1e-6);
+
+      xyz.Set(0, 1, 0);
+      enu = sc.GlobalFromLocal(xyz);
+      EXPECT_NEAR(enu.y, xyz.x, 1e-6);
+      EXPECT_NEAR(enu.x, -xyz.y, 1e-6);
+
+      xyz.Set(1, -1, 0);
+      enu = sc.GlobalFromLocal(xyz);
+      EXPECT_NEAR(enu.y, xyz.x, 1e-6);
+      EXPECT_NEAR(enu.x, -xyz.y, 1e-6);
+
+      xyz.Set(2243.52334, 556.35, 435.6553);
+      enu = sc.GlobalFromLocal(xyz);
+      EXPECT_NEAR(enu.y, xyz.x, 1e-6);
+      EXPECT_NEAR(enu.x, -xyz.y, 1e-6);
+    }
+
+    // Check SphericalFromLocal
+    {
+      // local frame
+      math::Vector3 xyz;
+      // spherical coordinates
+      math::Vector3 sph;
+
+      // No offset
+      xyz.Set(0, 0, 0);
+      sph = sc.SphericalFromLocal(xyz);
+      // latitude
+      EXPECT_NEAR(sph.x, lat.Degree(), 1e-6);
+      // longitude
+      EXPECT_NEAR(sph.y, lon.Degree(), 1e-6);
+      // elevation
+      EXPECT_NEAR(sph.z, elev, 1e-6);
+
+      // 200 km offset in x (pi/2 heading offset means North)
+      xyz.Set(2e5, 0, 0);
+      sph = sc.SphericalFromLocal(xyz);
+      // increase in latitude about 1.8 degrees
+      EXPECT_NEAR(sph.x, lat.Degree() + 1.8, 0.008);
+      // no change in longitude
+      EXPECT_NEAR(sph.y, lon.Degree(), 1e-6);
+      // no change in elevation
+      EXPECT_NEAR(sph.z, elev, 1e-6);
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+// Test distance
+TEST_F(SphericalCoordinatesTest, Distance)
+{
+  math::Angle latA, longA, latB, longB;
+  latA.SetFromDegree(46.250944);
+  longA.SetFromDegree(-122.249972);
+  latB.SetFromDegree(46.124953);
+  longB.SetFromDegree(-122.251683);
+  double d = common::SphericalCoordinates::Distance(latA, longA, latB, longB);
+
+  EXPECT_NEAR(14002, d, 20);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/common/SystemPaths.cc b/gazebo/common/SystemPaths.cc
index 9e74fa7..2c2ca06 100644
--- a/gazebo/common/SystemPaths.cc
+++ b/gazebo/common/SystemPaths.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,12 +14,7 @@
  * limitations under the License.
  *
  */
-/* Desc: Local Gazebo configuration
- * Author: Nate Koenig, Jordi Polo
- * Date: 3 May 2008
- */
 
-#include <assert.h>
 #include <dirent.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -29,11 +24,12 @@
 #include <fstream>
 #include <sstream>
 
-#include "gazebo/sdf/sdf.hh"
+#include <sdf/sdf.hh>
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
 #include "gazebo/common/ModelDatabase.hh"
 #include "gazebo/common/SystemPaths.hh"
-#include "gazebo/common/Exception.hh"
-#include "gazebo/common/Console.hh"
 
 using namespace gazebo;
 using namespace common;
@@ -47,20 +43,39 @@ SystemPaths::SystemPaths()
   this->pluginPaths.clear();
   this->modelPaths.clear();
 
+  try
+  {
+    // Get a path suitable for temporary files
+    this->tmpPath = boost::filesystem::temp_directory_path();
+
+    // Get a unique path suitable for temporary files. If there are multiple
+    // gazebo instances on the same machine, each one will have its own
+    // temporary directory
+    this->tmpInstancePath = boost::filesystem::unique_path("gazebo-%%%%%%");
+  }
+  catch(const boost::system::error_code &_ex)
+  {
+    gzerr << "Failed creating temp directory. Reason: "
+          << _ex.message() << "\n";
+    return;
+  }
+
   char *homePath = getenv("HOME");
   std::string home;
   if (!homePath)
-    home = "/tmp/gazebo";
+    home = this->GetTmpPath() + "/gazebo";
   else
     home = homePath;
 
+  sdf::addURIPath("model://", home + "/.gazebo/models");
+
   this->modelPaths.push_back(home + "/.gazebo/models");
 
   char *path = getenv("GAZEBO_LOG_PATH");
   std::string fullPath;
   if (!path)
   {
-    if (home != "/tmp/gazebo")
+    if (home != this->GetTmpPath() + "/gazebo")
       fullPath = home + "/.gazebo";
     else
       fullPath = home;
@@ -134,6 +149,24 @@ const std::list<std::string> &SystemPaths::GetOgrePaths()
 }
 
 /////////////////////////////////////////////////
+std::string SystemPaths::GetTmpPath()
+{
+  return this->tmpPath.string();
+}
+
+/////////////////////////////////////////////////
+std::string SystemPaths::GetTmpInstancePath()
+{
+  return this->tmpInstancePath.string();
+}
+
+/////////////////////////////////////////////////
+std::string SystemPaths::GetDefaultTestPath()
+{
+  return this->GetTmpInstancePath() + "/gazebo_test";
+}
+
+/////////////////////////////////////////////////
 void SystemPaths::UpdateModelPaths()
 {
   std::string delim(":");
@@ -154,6 +187,7 @@ void SystemPaths::UpdateModelPaths()
   size_t pos2 = path.find(delim);
   while (pos2 != std::string::npos)
   {
+    sdf::addURIPath("model://", path.substr(pos1, pos2-pos1));
     this->InsertUnique(path.substr(pos1, pos2-pos1), this->modelPaths);
     pos1 = pos2+1;
     pos2 = path.find(delim, pos2+1);
@@ -170,12 +204,11 @@ void SystemPaths::UpdateGazeboPaths()
   char *pathCStr = getenv("GAZEBO_RESOURCE_PATH");
   if (!pathCStr || *pathCStr == '\0')
   {
-    // gzdbg << "gazeboPaths is empty and GAZEBO_RESOURCE_PATH doesn't exist. "
-    //  << "Set GAZEBO_RESOURCE_PATH to gazebo's installation path. "
-    //  << "...or are you using SystemPlugins?\n";
-    return;
+    // No env var; take the compile-time default.
+    path = GAZEBO_RESOURCE_PATH;
   }
-  path = pathCStr;
+  else
+    path = pathCStr;
 
   size_t pos1 = 0;
   size_t pos2 = path.find(delim);
@@ -197,12 +230,11 @@ void SystemPaths::UpdatePluginPaths()
   char *pathCStr = getenv("GAZEBO_PLUGIN_PATH");
   if (!pathCStr || *pathCStr == '\0')
   {
-    // gzdbg << "pluginPaths and GAZEBO_PLUGIN_PATH doesn't exist."
-    //  << "Set GAZEBO_PLUGIN_PATH to Ogre's installation path."
-    //  << " ...or are you loading via SystemPlugins?\n";
-    return;
+    // No env var; take the compile-time default.
+    path = GAZEBO_PLUGIN_PATH;
   }
-  path = pathCStr;
+  else
+    path = pathCStr;
 
   size_t pos1 = 0;
   size_t pos2 = path.find(delim);
@@ -224,12 +256,11 @@ void SystemPaths::UpdateOgrePaths()
   char *pathCStr = getenv("OGRE_RESOURCE_PATH");
   if (!pathCStr || *pathCStr == '\0')
   {
-    // gzdbg << "ogrePaths is empty and OGRE_RESOURCE_PATH doesn't exist. "
-    //  << "Set OGRE_RESOURCE_PATH to Ogre's installation path. "
-    //  << "...or are you using SystemPlugins?\n";
-    return;
+    // No env var; take the compile-time default.
+    path = OGRE_RESOURCE_PATH;
   }
-  path = pathCStr;
+  else
+    path = pathCStr;
 
   size_t pos1 = 0;
   size_t pos2 = path.find(delim);
@@ -314,7 +345,7 @@ std::string SystemPaths::FindFile(const std::string &_filename,
       path = boost::filesystem::operator/(boost::filesystem::current_path(),
           _filename);
     }
-    catch(boost::filesystem3::filesystem_error &_e)
+    catch(boost::filesystem::filesystem_error &_e)
     {
       gzerr << "Filesystem error[" << _e.what() << "]\n";
       return std::string();
diff --git a/gazebo/common/SystemPaths.hh b/gazebo/common/SystemPaths.hh
index b92ce44..055461b 100644
--- a/gazebo/common/SystemPaths.hh
+++ b/gazebo/common/SystemPaths.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,6 @@
  * limitations under the License.
  *
 */
-/* Desc: Gazebo configuration on this computer
- * Date: 3 May 2008
- */
-
 #ifndef _GAZEBO_SYSTEMPATHS_HH_
 #define _GAZEBO_SYSTEMPATHS_HH_
 
@@ -32,11 +28,13 @@
   #define GetCurrentDir getcwd
 #endif
 
-#include <string>
+#include <boost/filesystem.hpp>
 #include <list>
+#include <string>
 
-#include "common/CommonTypes.hh"
-#include "common/SingletonT.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/common/SingletonT.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -54,7 +52,7 @@ namespace gazebo
     ///            Should point to Ogre RenderSystem_GL.so et. al.
     ///        \li SystemPaths#pluginPaths - plugin library paths
     ///            for common::WorldPlugin
-    class SystemPaths : public SingletonT<SystemPaths>
+    class GAZEBO_VISIBLE SystemPaths : public SingletonT<SystemPaths>
     {
       /// Constructor for SystemPaths
       private: SystemPaths();
@@ -83,6 +81,21 @@ namespace gazebo
       /// \return Right now, it just returns "/worlds"
       public: std::string GetWorldPathExtension();
 
+      /// Returns the default path suitable for temporary files.
+      /// \return a full path name to directory.
+      /// E.g.: /tmp (Linux).
+      public: std::string GetTmpPath();
+
+      /// Returns a unique temporary file for this instance of SystemPath.
+      /// \return a full path name to directory.
+      /// E.g.: /tmp/gazebo_234123 (Linux).
+      public: std::string GetTmpInstancePath();
+
+      /// Returns the default temporary test path.
+      /// \return a full path name to directory.
+      /// E.g.: /tmp/gazebo_test (Linux).
+      public: std::string GetDefaultTestPath();
+
       /// \brief Find a file or path using a URI
       /// \param[in] _uri the uniform resource identifier
       /// \return Returns full path name to file
@@ -168,6 +181,12 @@ namespace gazebo
       public: bool ogrePathsFromEnv;
 
       private: friend class SingletonT<SystemPaths>;
+
+      /// \brief Path to the default temporary directory
+      private: boost::filesystem::path tmpPath;
+
+      /// \brief Path to the instance temporary directory
+      private: boost::filesystem::path tmpInstancePath;
     };
     /// \}
   }
diff --git a/gazebo/common/SystemPaths_TEST.cc b/gazebo/common/SystemPaths_TEST.cc
index 8e75234..e70144a 100644
--- a/gazebo/common/SystemPaths_TEST.cc
+++ b/gazebo/common/SystemPaths_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,12 +16,21 @@
 */
 #include <gtest/gtest.h>
 
+#include <string>
+#include <vector>
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/classification.hpp>
+
 #include "gazebo/common/SystemPaths.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(SystemPathsTest, SystemPaths)
+class SystemPathsTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(SystemPathsTest, SystemPaths)
 {
+  std::vector<std::string> tmpstrings;
   std::string gazeboResourcePathBackup = "GAZEBO_RESOURCE_PATH=";
   std::string ogreResourcePathBackup = "OGRE_RESOURCE_PATH=";
   std::string pluginPathBackup = "GAZEBO_PLUGIN_PATH=";
@@ -42,22 +51,31 @@ TEST(SystemPathsTest, SystemPaths)
   paths->ClearOgrePaths();
   paths->ClearPluginPaths();
 
-  putenv(const_cast<char*>("GAZEBO_RESOURCE_PATH=/tmp/resource:/test/me/now"));
+  std::string gzResourcePath = "GAZEBO_RESOURCE_PATH=" + paths->GetTmpPath() +
+      "/resource:/test/me/now";
+  putenv(const_cast<char*>(gzResourcePath.c_str()));
   const std::list<std::string> pathList1 = paths->GetGazeboPaths();
   EXPECT_EQ(static_cast<unsigned int>(2), pathList1.size());
-  EXPECT_STREQ("/tmp/resource", pathList1.front().c_str());
+  EXPECT_STREQ((paths->GetTmpPath() + "/resource").c_str(),
+      pathList1.front().c_str());
   EXPECT_STREQ("/test/me/now", pathList1.back().c_str());
 
-  putenv(const_cast<char*>("OGRE_RESOURCE_PATH=/tmp/ogre:/test/ogre/now"));
+  std::string ogreResourcePath = "OGRE_RESOURCE_PATH=" + paths->GetTmpPath() +
+      "/ogre:/test/ogre/now";
+  putenv(const_cast<char*>(ogreResourcePath.c_str()));
   const std::list<std::string> pathList2 = paths->GetOgrePaths();
   EXPECT_EQ(static_cast<unsigned int>(2), pathList2.size());
-  EXPECT_STREQ("/tmp/ogre", pathList2.front().c_str());
+  EXPECT_STREQ((paths->GetTmpPath() + "/ogre").c_str(),
+      pathList2.front().c_str());
   EXPECT_STREQ("/test/ogre/now", pathList2.back().c_str());
 
-  putenv(const_cast<char*>("GAZEBO_PLUGIN_PATH=/tmp/plugin:/test/plugin/now"));
+  std::string gzPluginPath = "GAZEBO_PLUGIN_PATH=" + paths->GetTmpPath() +
+      "/plugin:/test/plugin/now";
+  putenv(const_cast<char*>(gzPluginPath.c_str()));
   const std::list<std::string> pathList3 = paths->GetPluginPaths();
   EXPECT_EQ(static_cast<unsigned int>(2), pathList3.size());
-  EXPECT_STREQ("/tmp/plugin", pathList3.front().c_str());
+  EXPECT_STREQ((paths->GetTmpPath() + "/plugin").c_str(),
+      pathList3.front().c_str());
   EXPECT_STREQ("/test/plugin/now", pathList3.back().c_str());
 
   EXPECT_STREQ("/worlds", paths->GetWorldPathExtension().c_str());
@@ -67,7 +85,7 @@ TEST(SystemPathsTest, SystemPaths)
   EXPECT_STREQ("/other/gazebo", paths->GetGazeboPaths().back().c_str());
 
   paths->AddPluginPaths("/plugin/path:/other/plugin");
-  EXPECT_EQ(static_cast<unsigned int>(4), paths->GetGazeboPaths().size());
+  EXPECT_EQ(static_cast<unsigned int>(4), paths->GetPluginPaths().size());
   EXPECT_STREQ("/other/plugin", paths->GetPluginPaths().back().c_str());
 
   paths->AddOgrePaths("/ogre/path:/other/ogre");
@@ -84,15 +102,21 @@ TEST(SystemPathsTest, SystemPaths)
 
   putenv(const_cast<char*>("GAZEBO_RESOURCE_PATH="));
   paths->ClearGazeboPaths();
-  EXPECT_EQ(static_cast<unsigned int>(0), paths->GetGazeboPaths().size());
+  // In this case, we expect to get the compiled-in default
+  boost::split(tmpstrings, GAZEBO_RESOURCE_PATH, boost::is_any_of(":"));
+  EXPECT_EQ(tmpstrings.size(), paths->GetGazeboPaths().size());
 
   putenv(const_cast<char*>("OGRE_RESOURCE_PATH="));
   paths->ClearOgrePaths();
-  EXPECT_EQ(static_cast<unsigned int>(0), paths->GetOgrePaths().size());
+  // In this case, we expect to get the compiled-in default
+  boost::split(tmpstrings, OGRE_RESOURCE_PATH, boost::is_any_of(":"));
+  EXPECT_EQ(tmpstrings.size(), paths->GetOgrePaths().size());
 
   putenv(const_cast<char*>("GAZEBO_PLUGIN_PATH="));
   paths->ClearPluginPaths();
-  EXPECT_EQ(static_cast<unsigned int>(0), paths->GetPluginPaths().size());
+  // In this case, we expect to get the compiled-in default
+  boost::split(tmpstrings, GAZEBO_PLUGIN_PATH, boost::is_any_of(":"));
+  EXPECT_EQ(tmpstrings.size(), paths->GetPluginPaths().size());
 
   std::cout << "GAZEBO_RESOURCE_BACKUP[" << gazeboResourcePathBackup << "]\n";
   std::cout << "OGRE_RESOURCE_BACKUP[" << ogreResourcePathBackup << "]\n";
diff --git a/gazebo/common/Time.cc b/gazebo/common/Time.cc
index 4140df5..8aabcfa 100644
--- a/gazebo/common/Time.cc
+++ b/gazebo/common/Time.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,8 +22,14 @@
 #include <sys/time.h>
 #include <time.h>
 #include <math.h>
+#include <unistd.h>
 #include <boost/date_time.hpp>
 
+#ifdef __MACH__
+#include <mach/clock.h>
+#include <mach/mach.h>
+#endif
+
 #include "gazebo/math/Helpers.hh"
 #include "gazebo/common/Time.hh"
 #include "gazebo/common/Console.hh"
@@ -44,9 +50,13 @@ Time::Time()
   this->sec = 0;
   this->nsec = 0;
 
+#ifdef __MACH__
+  clockResolution.tv_sec = 1 / sysconf(_SC_CLK_TCK);
+#else
   // get clock resolution, skip sleep if resolution is larger then
   // requested sleep time
   clock_getres(CLOCK_REALTIME, &clockResolution);
+#endif
 }
 
 /////////////////////////////////////////////////
@@ -91,7 +101,18 @@ Time::~Time()
 const Time &Time::GetWallTime()
 {
   struct timespec tv;
+  // OS X does not have clock_gettime, use clock_get_time
+#ifdef __MACH__
+  clock_serv_t cclock;
+  mach_timespec_t mts;
+  host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
+  clock_get_time(cclock, &mts);
+  mach_port_deallocate(mach_task_self(), cclock);
+  tv.tv_sec = mts.tv_sec;
+  tv.tv_nsec = mts.tv_nsec;
+#else
   clock_gettime(0, &tv);
+#endif
   wallTime = tv;
   return wallTime;
 }
@@ -168,7 +189,11 @@ Time Time::Sleep(const common::Time &_time)
       return result;
     }
 
+#ifdef __MACH__
     if (nanosleep(&interval, &remainder) == -1)
+#else
+    if (clock_nanosleep(CLOCK_REALTIME, 0, &interval, &remainder) == -1)
+#endif
     {
       result.sec = remainder.tv_sec;
       result.nsec = remainder.tv_nsec;
@@ -196,12 +221,6 @@ Time Time::NSleep(unsigned int _ns)
 }
 
 /////////////////////////////////////////////////
-Time Time::NSleep(Time _time)
-{
-  return Time::Sleep(_time);
-}
-
-/////////////////////////////////////////////////
 Time &Time::operator =(const struct timeval &_tv)
 {
   this->sec = _tv.tv_sec;
diff --git a/gazebo/common/Time.hh b/gazebo/common/Time.hh
index 6447199..45010a7 100644
--- a/gazebo/common/Time.hh
+++ b/gazebo/common/Time.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@
 #include <iostream>
 
 #include "gazebo/common/CommonTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -39,7 +40,7 @@ namespace gazebo
     /// \class Time Time.hh common/common.hh
     /// \brief A Time class, can be used to hold wall- or sim-time.
     ///        stored as sec and nano-sec.
-    class Time
+    class GAZEBO_VISIBLE Time
     {
       /// \brief A static zero time variable set to common::Time(0, 0).
       public: static const Time Zero;
@@ -114,11 +115,6 @@ namespace gazebo
       /// \return Time actually slept
       public: static Time NSleep(unsigned int _ns);
 
-      /// \brief Nano sleep
-      /// \param[in] _time is a Time
-      /// \return Time actually slept
-      public: static Time NSleep(Time _time) GAZEBO_DEPRECATED(1.5);
-
       /// \brief Assignment operator
       /// \param[in] _tv the new time
       /// \return a reference to this instance
@@ -419,7 +415,7 @@ namespace gazebo
       /// \brief Seconds
       public: int32_t sec;
 
-      /// \brief Microseconds
+      /// \brief Nanoseconds
       public: int32_t nsec;
 
       /// \brief a singleton value of the last GetWallTime() value
diff --git a/gazebo/common/Time_TEST.cc b/gazebo/common/Time_TEST.cc
index 66e23b2..5175622 100644
--- a/gazebo/common/Time_TEST.cc
+++ b/gazebo/common/Time_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,10 +20,13 @@
 
 #include "gazebo/common/Timer.hh"
 #include "gazebo/common/Time.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(TimeTest, Time)
+class TimeTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(TimeTest, Time)
 {
   common::Timer timer;
   timer.Start();
@@ -39,12 +42,15 @@ TEST(TimeTest, Time)
   time.SetToWallTime();
   EXPECT_TRUE(common::Time::GetWallTime() - time < common::Time(0, 1000000));
 
-  time = common::Time(1, 1000) + common::Time(1.5, 1000000000);
-  EXPECT_TRUE(time == common::Time(3.5, 1000));
+  time = common::Time(1, 1000)
+       + common::Time(1.5)
+       + common::Time(0, 1e9);
+  EXPECT_EQ(time, common::Time(3, 5e8 + 1000));
 
   time.Set(1, 1000);
-  time += common::Time(1.5, 1000000000);
-  EXPECT_TRUE(time == common::Time(3.5, 1000));
+  time += common::Time(1.5);
+  time += common::Time(0, 1e9);
+  EXPECT_EQ(time, common::Time(3, 5e8 + 1000));
 
   time.Set(1, 1000);
   time -= common::Time(1, 1000);
diff --git a/gazebo/common/Timer.cc b/gazebo/common/Timer.cc
index f4b1859..4d1553a 100644
--- a/gazebo/common/Timer.cc
+++ b/gazebo/common/Timer.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/common/Timer.hh b/gazebo/common/Timer.hh
index e1249e3..ee81ab4 100644
--- a/gazebo/common/Timer.hh
+++ b/gazebo/common/Timer.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,8 +22,9 @@
 #ifndef _TIMER_HH_
 #define _TIMER_HH_
 
-#include "common/Console.hh"
-#include "common/Time.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Time.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,7 @@ namespace gazebo
 
     /// \class Timer Timer.hh common/common.hh
     /// \brief A timer class, used to time things in real world walltime
-    class Timer
+    class GAZEBO_VISIBLE Timer
     {
       /// \brief Constructor
       public: Timer();
diff --git a/gazebo/common/UpdateInfo.hh b/gazebo/common/UpdateInfo.hh
index ba9a123..e1b92d2 100644
--- a/gazebo/common/UpdateInfo.hh
+++ b/gazebo/common/UpdateInfo.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 
 #include <string>
 #include "gazebo/common/Time.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -26,7 +27,7 @@ namespace gazebo
   {
     /// \class UpdateInfo UpdateInfo.hh common/common.hh
     /// \brief Information for use in an update event.
-    class UpdateInfo
+    class GAZEBO_VISIBLE UpdateInfo
     {
       /// \brief Name of the world.
       public: std::string worldName;
diff --git a/gazebo/common/Video.cc b/gazebo/common/Video.cc
index 2d82baf..93af842 100644
--- a/gazebo/common/Video.cc
+++ b/gazebo/common/Video.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,23 +15,10 @@
  *
 */
 
-#include <gazebo/common/Video.hh>
 #include <gazebo/common/Console.hh>
+#include <gazebo/common/Video.hh>
 #include <gazebo/gazebo_config.h>
-
-#ifdef HAVE_FFMPEG
-#ifndef INT64_C
-#define INT64_C(c) (c ## LL)
-#define UINT64_C(c) (c ## ULL)
-#endif
-
-extern "C"
-{
-#include <libavcodec/avcodec.h>
-#include <libavformat/avformat.h>
-#include <libswscale/swscale.h>
-}
-#endif
+#include <gazebo/common/ffmpeg_inc.h>
 
 using namespace gazebo;
 using namespace common;
@@ -61,15 +48,9 @@ Video::Video()
   this->swsCtx = NULL;
   this->avFrame = NULL;
   this->pic = NULL;
+  this->videoStream = -1;
 
 #ifdef HAVE_FFMPEG
-  static bool first = true;
-  if (first)
-  {
-    first = false;
-    av_register_all();
-  }
-
   this->pic = new AVPicture;
 #endif
 }
@@ -92,7 +73,7 @@ void Video::Cleanup()
   av_free(this->avFrame);
 
   // Close the video file
-  av_close_input_file(this->formatCtx);
+  avformat_close_input(&this->formatCtx);
 
   // Close the codec
   avcodec_close(this->codecCtx);
@@ -121,7 +102,7 @@ bool Video::Load(const std::string &_filename)
   }
 
   // Retrieve stream information
-  if (av_find_stream_info(this->formatCtx) < 0)
+  if (avformat_find_stream_info(this->formatCtx, NULL) < 0)
   {
     gzerr << "Couldn't find stream information\n";
     return false;
@@ -223,7 +204,6 @@ bool Video::GetNextFrame(unsigned char **_buffer)
 
   if (packet.stream_index == this->videoStream)
   {
-    int processedLength = 0;
     tmpPacket.data = packet.data;
     tmpPacket.size = packet.size;
 
@@ -231,7 +211,7 @@ bool Video::GetNextFrame(unsigned char **_buffer)
     while (tmpPacket.size > 0)
     {
       // sending data to libavcodec
-      processedLength = avcodec_decode_video2(this->codecCtx, this->avFrame,
+      int processedLength = avcodec_decode_video2(this->codecCtx, this->avFrame,
           &frameAvailable, &tmpPacket);
       if (processedLength < 0)
       {
diff --git a/gazebo/common/Video.hh b/gazebo/common/Video.hh
index ac4eed6..dad4568 100644
--- a/gazebo/common/Video.hh
+++ b/gazebo/common/Video.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _VIDEO_HH_
 
 #include <string>
+#include "gazebo/util/system.hh"
 
 struct AVFormatContext;
 struct AVCodecContext;
@@ -34,7 +35,7 @@ namespace gazebo
 
     /// \class Video Video.hh common/common.hh
     /// \brief Handle video encoding and decoding using libavcodec
-    class Video
+    class GAZEBO_VISIBLE Video
     {
       /// \brief Constructor
       public: Video();
diff --git a/gazebo/common/ffmpeg_inc.h b/gazebo/common/ffmpeg_inc.h
new file mode 100644
index 0000000..5bfed1c
--- /dev/null
+++ b/gazebo/common/ffmpeg_inc.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_FFMPEG_INC_HH_
+#define _GAZEBO_FFMPEG_INC_HH_
+
+#pragma GCC system_header
+
+#ifdef HAVE_FFMPEG
+#ifndef INT64_C
+#define INT64_C(c) (c ## LL)
+#define UINT64_C(c) (c ## ULL)
+#endif
+
+extern "C" {
+#include <libavcodec/avcodec.h>
+#include <libavformat/avformat.h>
+#include <libavutil/opt.h>
+#include <libswscale/swscale.h>
+}
+#endif  // ifdef HAVE_FFMPEG
+
+#endif  // ifndef _GAZEBO_FFMPEG_INC_HH
diff --git a/gazebo/common/template_TEST.cc b/gazebo/common/template_TEST.cc
index 1a5a0f9..b837add 100644
--- a/gazebo/common/template_TEST.cc
+++ b/gazebo/common/template_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gazebo.1.ronn b/gazebo/gazebo.1.ronn
new file mode 100644
index 0000000..cb19beb
--- /dev/null
+++ b/gazebo/gazebo.1.ronn
@@ -0,0 +1,49 @@
+gazebo -- Run the Gazebo server and GUI.
+=============================================
+
+## SYNOPSIS
+
+`gazebo` [options] <world_file>
+
+## DESCRIPTION
+
+Gazebo server runs simulation and handles commandline options, starts a Master, runs World update and sensor generation loops. This also starts the Gazebo GUI client in a separate process.
+
+## OPTIONS
+
+* -v, --version :
+ Output version information.
+* --verbose :
+ Increase the messages written to the terminal.
+* -h, --help :
+ Produce this help message.
+* -u, --pause :
+ Start the server in a paused state.
+* -e, --physics arg :
+ Specify a physics engine (ode|bullet|dart|simbody).
+* -p, --play arg :
+ Play a log file.
+* -r, --record :
+ Record state data.
+* --record_encoding arg (=zlib) :
+ Compression encoding format for log data (zlib|bz2|txt).
+* --record_path arg :
+ Absolute path in which to store state data
+* --seed arg :
+ Start with a given random number seed.
+* --iters arg :
+ Number of iterations to simulate.
+* --minimal_comms :
+ Reduce the TCP/IP traffic output by gazebo
+* -s, --server-plugin arg :
+ Load a plugin.
+
+
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-2014 Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
diff --git a/gazebo/gazebo.cc b/gazebo/gazebo.cc
index 1bca35e..37d669d 100644
--- a/gazebo/gazebo.cc
+++ b/gazebo/gazebo.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,10 +16,14 @@
  */
 #include <vector>
 #include <boost/thread/mutex.hpp>
+#include <sdf/sdf.hh>
 
+#include "gazebo/Master.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/sensors.hh"
 #include "gazebo/transport/transport.hh"
 #include "gazebo/common/common.hh"
-#include "gazebo/common/LogRecord.hh"
+#include "gazebo/util/LogRecord.hh"
 #include "gazebo/math/gzmath.hh"
 #include "gazebo/gazebo_config.h"
 #include "gazebo/gazebo.hh"
@@ -27,6 +31,50 @@
 boost::mutex fini_mutex;
 std::vector<gazebo::SystemPluginPtr> g_plugins;
 
+gazebo::Master *g_master = NULL;
+
+/////////////////////////////////////////////////
+// This function is used by both setupClient and setupServer
+bool setup(int _argc, char **_argv)
+{
+  gazebo::common::load();
+
+  // The SDF find file callback.
+  sdf::setFindCallback(boost::bind(&gazebo::common::find_file, _1));
+
+  // Initialize the informational logger. This will log warnings, and
+  // errors.
+  gzLogInit("default.log");
+
+  // Load all the system plugins
+  for (std::vector<gazebo::SystemPluginPtr>::iterator iter =
+       g_plugins.begin(); iter != g_plugins.end(); ++iter)
+  {
+    (*iter)->Load(_argc, _argv);
+  }
+
+  if (!gazebo::transport::init())
+  {
+    gzerr << "Unable to initialize transport.\n";
+    return false;
+  }
+
+  // Make sure the model database has started.
+  gazebo::common::ModelDatabase::Instance()->Start();
+
+  // Run transport loop. Starts a thread
+  gazebo::transport::run();
+
+  // Init all system plugins
+  for (std::vector<gazebo::SystemPluginPtr>::iterator iter = g_plugins.begin();
+       iter != g_plugins.end(); ++iter)
+  {
+    (*iter)->Init();
+  }
+
+  return true;
+}
+
 /////////////////////////////////////////////////
 void gazebo::print_version()
 {
@@ -34,8 +82,20 @@ void gazebo::print_version()
 }
 
 /////////////////////////////////////////////////
+void gazebo::printVersion()
+{
+  fprintf(stderr, "%s", GAZEBO_VERSION_HEADER);
+}
+
+/////////////////////////////////////////////////
 void gazebo::add_plugin(const std::string &_filename)
 {
+  gazebo::addPlugin(_filename);
+}
+
+/////////////////////////////////////////////////
+void gazebo::addPlugin(const std::string &_filename)
+{
   if (_filename.empty())
     return;
   gazebo::SystemPluginPtr plugin =
@@ -57,20 +117,7 @@ void gazebo::add_plugin(const std::string &_filename)
 /////////////////////////////////////////////////
 bool gazebo::load(int _argc, char **_argv)
 {
-  // Initialize the informational logger. This will log warnings, and
-  // errors.
-  if (!gazebo::common::Console::Instance()->IsInitialized())
-    gazebo::common::Console::Instance()->Init("default.log");
-
-  // Load all the plugins
-  for (std::vector<gazebo::SystemPluginPtr>::iterator iter =
-       g_plugins.begin(); iter != g_plugins.end(); ++iter)
-  {
-    (*iter)->Load(_argc, _argv);
-  }
-
-  // Start the transport system by connecting to the master.
-  return gazebo::transport::init();
+  return gazebo::setupClient(_argc, _argv);
 }
 
 /////////////////////////////////////////////////
@@ -95,7 +142,7 @@ void gazebo::run()
 /////////////////////////////////////////////////
 void gazebo::stop()
 {
-  common::LogRecord::Instance()->Stop();
+  util::LogRecord::Instance()->Stop();
   gazebo::transport::stop();
 }
 
@@ -103,7 +150,153 @@ void gazebo::stop()
 void gazebo::fini()
 {
   boost::mutex::scoped_lock lock(fini_mutex);
-  common::LogRecord::Instance()->Stop();
+  util::LogRecord::Instance()->Fini();
   g_plugins.clear();
   gazebo::transport::fini();
 }
+
+/////////////////////////////////////////////////
+bool gazebo::setupServer(int _argc, char **_argv)
+{
+  std::string host = "";
+  unsigned int port = 0;
+
+  gazebo::transport::get_master_uri(host, port);
+
+  g_master = new gazebo::Master();
+  g_master->Init(port);
+  g_master->RunThread();
+
+  if (!setup(_argc, _argv))
+  {
+    gzerr << "Unable to setup Gazebo\n";
+    return false;
+  }
+
+  if (!sensors::load())
+  {
+    gzerr << "Unable to load sensors\n";
+    return false;
+  }
+
+  if (!gazebo::physics::load())
+  {
+    gzerr << "Unable to initialize physics.\n";
+    return false;
+  }
+
+  if (!sensors::init())
+  {
+    gzerr << "Unable to initialize sensors\n";
+    return false;
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool gazebo::setupClient(int _argc, char **_argv)
+{
+  if (!setup(_argc, _argv))
+  {
+    gzerr << "Unable to setup Gazebo\n";
+    return false;
+  }
+
+  common::Time waitTime(1, 0);
+  int waitCount = 0;
+  int maxWaitCount = 10;
+
+  // Wait for namespaces.
+  while (!gazebo::transport::waitForNamespaces(waitTime) &&
+      (waitCount++) < maxWaitCount)
+  {
+    gzwarn << "Waited " << waitTime.Double() << "seconds for namespaces.\n";
+  }
+
+  if (waitCount >= maxWaitCount)
+  {
+    gzerr << "Waited " << (waitTime * waitCount).Double()
+      << " seconds for namespaces. Giving up.\n";
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool gazebo::shutdown()
+{
+  gazebo::physics::stop_worlds();
+
+  gazebo::sensors::stop();
+
+  // Stop log recording
+  util::LogRecord::Instance()->Stop();
+
+  // Stop transport
+  gazebo::transport::stop();
+
+  // Make sure to shut everything down.
+  boost::mutex::scoped_lock lock(fini_mutex);
+  util::LogRecord::Instance()->Fini();
+  g_plugins.clear();
+  gazebo::transport::fini();
+
+  gazebo::physics::fini();
+
+  gazebo::sensors::fini();
+
+  delete g_master;
+  g_master = NULL;
+
+  // Cleanup model database.
+  common::ModelDatabase::Instance()->Fini();
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+gazebo::physics::WorldPtr gazebo::loadWorld(const std::string &_worldFile)
+{
+  gazebo::physics::WorldPtr world;
+
+  // Load the world file
+  sdf::SDFPtr sdf(new sdf::SDF);
+  if (!sdf::init(sdf))
+  {
+    gzerr << "Unable to initialize sdf\n";
+    return world;
+  }
+
+  // Find the file.
+  std::string fullFile = gazebo::common::find_file(_worldFile);
+
+  if (fullFile.empty())
+  {
+    gzerr << "Unable to find file[" << _worldFile << "]\n";
+    return world;
+  }
+
+  if (!sdf::readFile(fullFile, sdf))
+  {
+    gzerr << "Unable to read sdf file[" << "empty.world" << "]\n";
+    return world;
+  }
+
+  world = gazebo::physics::create_world();
+  gazebo::physics::load_world(world, sdf->root->GetElement("world"));
+
+  gazebo::physics::init_world(world);
+
+  return world;
+}
+
+/////////////////////////////////////////////////
+void gazebo::runWorld(gazebo::physics::WorldPtr _world,
+                      unsigned int _iterations)
+{
+  if (!_world)
+    gzerr << "World pointer is NULL\n";
+  else
+    _world->RunBlocking(_iterations);
+}
diff --git a/gazebo/gazebo.hh b/gazebo/gazebo.hh
index f71a0c1..22dd506 100644
--- a/gazebo/gazebo.hh
+++ b/gazebo/gazebo.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,20 +19,94 @@
 
 #include <gazebo/gazebo_core.hh>
 #include <string>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  void print_version();
-  void add_plugin(const std::string &_filename);
+  /// \brief Deprecated.
+  /// \sa gazebo::printVersion.
+  GAZEBO_VISIBLE
+  void print_version() GAZEBO_DEPRECATED(2.3);
 
-  bool load(int _argc = 0, char **_argv = 0);
-  bool init();
-  void run();
-  void stop();
-  void fini();
+  /// \brief Deprecated.
+  /// \sa gazebo::addPlugin.
+  GAZEBO_VISIBLE
+  void add_plugin(const std::string &_filename) GAZEBO_DEPRECATED(2.3);
 
-  /// \brief Find a file in the gazebo search paths
-  std::string find_file(const std::string &_file);
+  /// \brief Not implemented.
+  /// \sa gazebo::common::findFile.
+  GAZEBO_VISIBLE
+  std::string find_file(const std::string &_file) GAZEBO_DEPRECATED(2.3);
+
+  /// \brief Deprecated.
+  /// \sa gazebo::setupClient.
+  /// \sa gazebo::setupServer.
+  GAZEBO_VISIBLE
+  bool load(int _argc = 0, char **_argv = 0) GAZEBO_DEPRECATED(2.3);
+
+  /// \brief Deprecated.
+  /// \sa gazebo::setupClient.
+  /// \sa gazebo::setupServer.
+  GAZEBO_VISIBLE
+  bool init() GAZEBO_DEPRECATED(2.3);
+
+  /// \brief Deprecated.
+  /// \sa gazebo::setupClient.
+  /// \sa gazebo::setupServer.
+  GAZEBO_VISIBLE
+  void run() GAZEBO_DEPRECATED(2.3);
+
+  /// \brief Deprecated.
+  /// \sa gazebo::shutdown.
+  GAZEBO_VISIBLE
+  void stop() GAZEBO_DEPRECATED(2.3);
+
+  /// \brief Deprecated.
+  /// \sa gazebo::shutdown.
+  GAZEBO_VISIBLE
+  void fini() GAZEBO_DEPRECATED(2.3);
+
+  /// \brief Output version information to the terminal.
+  GAZEBO_VISIBLE
+  void printVersion();
+
+  /// \brief Add a system plugin.
+  /// \param[in] _filename Path to the plugin.
+  GAZEBO_VISIBLE
+  void addPlugin(const std::string &_filename);
+
+  /// \brief Start a gazebo server. This starts transportation, and makes it
+  /// possible to create worlds.
+  /// \param[in] _argc Number of commandline arguments.
+  /// \param[in] _argv The commandline arguments.
+  /// \return True on success
+  GAZEBO_VISIBLE
+  bool setupServer(int _argc = 0, char **_argv = 0);
+
+  /// \brief Start a gazebo client. This starts transportation, and makes it
+  /// possible to connect to a running simulation
+  /// \param[in] _argc Number of commandline arguments.
+  /// \param[in] _argv The commandline arguments.
+  /// \return True on success
+  GAZEBO_VISIBLE
+  bool setupClient(int _argc = 0, char **_argv = 0);
+
+  /// \brief Create and load a new world from an SDF world file.
+  /// \param[in] _worldFile The world file to load from.
+  /// \return Pointer to the created world. NULL on error.
+  GAZEBO_VISIBLE
+  gazebo::physics::WorldPtr loadWorld(const std::string &_worldFile);
+
+  /// \brief Run a world for a specific number of iterations.
+  /// \param[in] _world Pointer to a world.
+  /// \param[in] _iterations Number of iterations to execute.
+  GAZEBO_VISIBLE
+  void runWorld(gazebo::physics::WorldPtr _world, unsigned int _iterations);
+
+  /// \brief Stop and cleanup simulation.
+  /// \return True if the simulation is shutdown; false otherwise.
+  GAZEBO_VISIBLE
+  bool shutdown();
 }
 
 #endif
diff --git a/gazebo/gazebo_core.hh b/gazebo/gazebo_core.hh
index ecd81fd..444f2ff 100644
--- a/gazebo/gazebo_core.hh
+++ b/gazebo/gazebo_core.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,6 @@
 #include <gazebo/common/common.hh>
 #include <gazebo/math/gzmath.hh>
 #include <gazebo/msgs/msgs.hh>
-#include <gazebo/sdf/sdf.hh>
 #include <gazebo/transport/transport.hh>
 #include <gazebo/Server.hh>
 #include <gazebo/Master.hh>
diff --git a/gazebo/gazebo_main.cc b/gazebo/gazebo_main.cc
index ac7dfc5..1be9aff 100644
--- a/gazebo/gazebo_main.cc
+++ b/gazebo/gazebo_main.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,8 +18,10 @@
 #include <unistd.h>
 #include <signal.h>
 #include <sys/types.h>
-#include "Server.hh"
-#include "gui/Gui.hh"
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/Server.hh"
+#include "gazebo/gui/GuiIface.hh"
 
 bool sig_killed = false;
 int status1, status2;
@@ -27,13 +29,48 @@ pid_t  pid1, pid2;
 bool killed1 = false;
 bool killed2 = false;
 
+/////////////////////////////////////////////////
+void help()
+{
+  std::cerr << "gazebo -- Run the Gazebo server and GUI.\n\n";
+  std::cerr << "`gazebo` [options] <world_file>\n\n";
+  std::cerr << "Gazebo server runs simulation and handles commandline "
+    << "options, starts a Master, runs World update and sensor generation "
+    << "loops. This also starts the Gazebo GUI client in a separate "
+    << "process.\n\n";
+
+  std::cerr << "Options:\n"
+  << "  -v [ --version ]              Output version information.\n"
+  << "  --verbose                     Increase the messages written to the "
+  <<                                  "terminal.\n"
+  << "  -h [ --help ]                 Produce this help message.\n"
+  << "  -u [ --pause ]                Start the server in a paused state.\n"
+  << "  -e [ --physics ] arg          Specify a physics engine "
+  << "(ode|bullet|dart|simbody).\n"
+  << "  -p [ --play ] arg             Play a log file.\n"
+  << "  -r [ --record ]               Record state data.\n"
+  << "  --record_encoding arg (=zlib) Compression encoding format for log "
+  << "data \n"
+  << "                                (zlib|bz2|txt).\n"
+  << "  --record_path arg             Absolute path in which to store "
+  << "state data\n"
+  << "  --seed arg                    Start with a given random number seed.\n"
+  << "  --iters arg                   Number of iterations to simulate.\n"
+  << "  --minimal_comms               Reduce the TCP/IP traffic output by "
+  <<                                  "gazebo\n"
+  << "  -s [ --server-plugin ] arg    Load a plugin.\n\n";
+}
+
+/////////////////////////////////////////////////
 void sig_handler(int /*signo*/)
 {
   sig_killed = true;
   kill(pid1, SIGINT);
   kill(pid2, SIGINT);
-  // wait some time and if not dead, escalate to SIGKILL
-  for (unsigned int i = 0; i < 5; ++i)
+  double sleepSecs = 0.001;
+  double totalWaitSecs = 5.0;
+  // Wait some time and if not dead, escalate to SIGKILL
+  for (unsigned int i = 0; i < (unsigned int)(totalWaitSecs*1/sleepSecs); ++i)
   {
     if (!killed1)
     {
@@ -49,8 +86,8 @@ void sig_handler(int /*signo*/)
     }
     if (killed1 && killed2)
       break;
-    /// @todo: fix hardcoded timeout
-    sleep(1);
+    // Sleep briefly
+    gazebo::common::Time::Sleep(gazebo::common::Time(sleepSecs));
   }
   if (!killed1)
   {
@@ -64,9 +101,19 @@ void sig_handler(int /*signo*/)
   }
 }
 
+/////////////////////////////////////////////////
 int main(int _argc, char **_argv)
 {
-  if (signal(SIGINT, sig_handler) == SIG_ERR)
+  if (_argc >= 2 &&
+      (strcmp(_argv[1], "-h") == 0 || strcmp(_argv[1], "--help") == 0))
+  {
+    help();
+    return 0;
+  }
+
+  struct sigaction sigact;
+  sigact.sa_handler = sig_handler;
+  if (sigaction(SIGINT, &sigact, NULL))
   {
     gzerr << "Stopping. Unable to catch SIGINT.\n"
           << " Please visit http://gazebosim.org/support.html for help.\n";
@@ -75,10 +122,17 @@ int main(int _argc, char **_argv)
 
   pid1 = fork();
 
-  char** myargv = new char*[_argc+1];
-  for (int i = 0; i < _argc; ++i)
-    myargv[i] = _argv[i];
-  myargv[_argc] = static_cast<char*>(NULL);
+  char **argvServer = new char*[_argc+1];
+  char **argvClient = new char*[_argc+1];
+  argvServer[0] = const_cast<char*>("gzserver");
+  argvClient[0] = const_cast<char*>("gzclient");
+  for (int i = 1; i < _argc; ++i)
+  {
+    argvServer[i] = _argv[i];
+    argvClient[i] = _argv[i];
+  }
+  argvServer[_argc] = static_cast<char*>(NULL);
+  argvClient[_argc] = static_cast<char*>(NULL);
 
   if (pid1)
   {
@@ -98,7 +152,7 @@ int main(int _argc, char **_argv)
     {
       // gazebo::gui::run(_argc, _argv);
       // gzclient argv
-      execvp("gzclient", myargv);
+      execvp(argvClient[0], argvClient);
     }
   }
   else
@@ -110,10 +164,11 @@ int main(int _argc, char **_argv)
     // server->Fini();
     // delete server;
     // server = NULL;
-    execvp("gzserver", myargv);
+    execvp(argvServer[0], argvServer);
   }
 
-  delete[] myargv;
+  delete[] argvServer;
+  delete[] argvClient;
 
   return 0;
 }
diff --git a/gazebo/gui/Actions.cc b/gazebo/gui/Actions.cc
index aeba84a..20184c6 100644
--- a/gazebo/gui/Actions.cc
+++ b/gazebo/gui/Actions.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,60 +15,104 @@
  *
  */
 
-#include "gui/Actions.hh"
+#include "gazebo/gui/Actions.hh"
+#include "gazebo/util/system.hh"
 
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_arrowAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_translateAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_rotateAct = 0;
+GAZEBO_VISIBLE
+QAction *gazebo::gui::g_scaleAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_newAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_openAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_importAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_saveAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_saveAsAct = 0;
+GAZEBO_VISIBLE
+QAction *gazebo::gui::g_saveCfgAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_aboutAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_quitAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_dataLoggerAct = 0;
 
 
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_newModelAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_resetModelsAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_resetWorldAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_editBuildingAct = 0;
+GAZEBO_VISIBLE
+QAction *gazebo::gui::g_editTerrainAct = 0;
+GAZEBO_VISIBLE
+QAction *gazebo::gui::g_editModelAct = 0;
 
-QAction *gazebo::gui::g_buildingEditorSaveAct = 0;
-QAction *gazebo::gui::g_buildingEditorDiscardAct = 0;
-QAction *gazebo::gui::g_buildingEditorDoneAct = 0;
-QAction *gazebo::gui::g_buildingEditorExitAct = 0;
-
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_playAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_pauseAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_stepAct = 0;
 
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_boxCreateAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_sphereCreateAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_cylinderCreateAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_meshCreateAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_pointLghtCreateAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_spotLghtCreateAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_dirLghtCreateAct = 0;
 
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_screenshotAct = 0;
 
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_showCollisionsAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_showGridAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_showContactsAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_showJointsAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_showCOMAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_transparentAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_viewWireframeAct = 0;
 
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_resetAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_fullScreenAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_fpsAct = 0;
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_orbitAct = 0;
 
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_topicVisAct = 0;
 
+GAZEBO_VISIBLE
 QAction *gazebo::gui::g_diagnosticsAct = 0;
 
+GAZEBO_VISIBLE
 gazebo::gui::DeleteAction *gazebo::gui::g_deleteAct = 0;
diff --git a/gazebo/gui/Actions.hh b/gazebo/gui/Actions.hh
index ddbf0f2..45a1889 100644
--- a/gazebo/gui/Actions.hh
+++ b/gazebo/gui/Actions.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,8 @@
 
 #include <string>
 
-#include "gui/qt.h"
+#include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -31,6 +32,7 @@ namespace gazebo
     extern QAction *g_importAct;
     extern QAction *g_saveAct;
     extern QAction *g_saveAsAct;
+    extern QAction *g_saveCfgAct;
     extern QAction *g_aboutAct;
     extern QAction *g_quitAct;
 
@@ -40,6 +42,8 @@ namespace gazebo
     extern QAction *g_resetModelsAct;
     extern QAction *g_resetWorldAct;
     extern QAction *g_editBuildingAct;
+    extern QAction *g_editTerrainAct;
+    extern QAction *g_editModelAct;
 
     extern QAction *g_playAct;
     extern QAction *g_pauseAct;
@@ -70,6 +74,7 @@ namespace gazebo
     extern QAction *g_arrowAct;
     extern QAction *g_translateAct;
     extern QAction *g_rotateAct;
+    extern QAction *g_scaleAct;
 
     extern QAction *g_topicVisAct;
 
@@ -77,14 +82,9 @@ namespace gazebo
 
     extern QAction *g_viewWireframeAct;
 
-    extern QAction *g_buildingEditorSaveAct;
-    extern QAction *g_buildingEditorDiscardAct;
-    extern QAction *g_buildingEditorDoneAct;
-    extern QAction *g_buildingEditorExitAct;
-
     /// \class DeleteAction Actions.hh gui/gui.hh
     /// \brief Custom delete action.
-    class DeleteAction : public QAction
+    class GAZEBO_VISIBLE DeleteAction : public QAction
     {
       Q_OBJECT
       /// \brief Constructor
diff --git a/gazebo/gui/BoxMaker.cc b/gazebo/gui/BoxMaker.cc
index bd107e8..f486ed5 100644
--- a/gazebo/gui/BoxMaker.cc
+++ b/gazebo/gui/BoxMaker.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,18 +16,18 @@
 */
 #include <sstream>
 
-#include "msgs/msgs.hh"
+#include "gazebo/msgs/msgs.hh"
 
-#include "common/Console.hh"
-#include "gui/GuiEvents.hh"
-#include "math/Quaternion.hh"
-#include "common/MouseEvent.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/common/MouseEvent.hh"
 
-#include "rendering/UserCamera.hh"
+#include "gazebo/rendering/UserCamera.hh"
 
-#include "transport/Publisher.hh"
+#include "gazebo/transport/Publisher.hh"
 
-#include "gui/BoxMaker.hh"
+#include "gazebo/gui/BoxMaker.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -38,6 +38,7 @@ BoxMaker::BoxMaker()
 : EntityMaker()
 {
   this->state = 0;
+  this->leftMousePressed = false;
   this->visualMsg = new msgs::Visual();
   this->visualMsg->mutable_geometry()->set_type(msgs::Geometry::BOX);
   this->visualMsg->mutable_material()->mutable_script()->add_uri(
diff --git a/gazebo/gui/BoxMaker.hh b/gazebo/gui/BoxMaker.hh
index c17f18b..acd3ce9 100644
--- a/gazebo/gui/BoxMaker.hh
+++ b/gazebo/gui/BoxMaker.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,8 +18,9 @@
 #define _BOXMAKER_HH_
 
 #include <string>
-#include "math/Vector2i.hh"
-#include "gui/EntityMaker.hh"
+#include "gazebo/math/Vector2i.hh"
+#include "gazebo/gui/EntityMaker.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +38,7 @@ namespace gazebo
 
     /// \class BoxMaker BoxMaker.hh gui/gui.hh
     /// \brief to make a box
-    class BoxMaker : public EntityMaker
+    class GAZEBO_VISIBLE BoxMaker : public EntityMaker
     {
       /// \brief Constructor
       public: BoxMaker();
@@ -53,12 +54,16 @@ namespace gazebo
 
       /// Documentation inherited
       public: virtual bool IsActive() const;
+
       /// Documentation inherited
       public: virtual void OnMousePush(const common::MouseEvent &_event);
+
       /// Documentation inherited
       public: virtual void OnMouseRelease(const common::MouseEvent &_event);
+
       /// Documentation inherited
       public: virtual void OnMouseDrag(const common::MouseEvent &_event);
+
       /// Documentation inherited
       public: virtual void OnMouseMove(const common::MouseEvent &_event);
 
diff --git a/gazebo/gui/CMakeLists.txt b/gazebo/gui/CMakeLists.txt
index c930b4c..b31b53f 100644
--- a/gazebo/gui/CMakeLists.txt
+++ b/gazebo/gui/CMakeLists.txt
@@ -1,4 +1,5 @@
 include (${gazebo_cmake_dir}/GazeboUtils.cmake)
+
 include ( ${QT_USE_FILE} )
 
 link_directories(
@@ -13,42 +14,44 @@ add_definitions(${QT_DEFINITIONS})
 
 add_subdirectory(qtpropertybrowser)
 add_subdirectory(building)
+add_subdirectory(model)
+add_subdirectory(terrain)
+add_subdirectory(viewers)
 
 set (sources
-  ../gazebo.cc
   Actions.cc
   BoxMaker.cc
   CylinderMaker.cc
   DataLogger.cc
+  Editor.cc
   EntityMaker.cc
   RenderWidget.cc
   GLWidget.cc
-  Gui.cc
+  GuiIface.cc
   GuiEvents.cc
   InsertModelWidget.cc
   JointControlWidget.cc
+  KeyEventHandler.cc
   LightMaker.cc
   MainWindow.cc
+  ModelManipulator.cc
   MeshMaker.cc
   ModelEditWidget.cc
   ModelListWidget.cc
   ModelMaker.cc
   ModelRightMenu.cc
+  MouseEventHandler.cc
+  SaveDialog.cc
   SphereMaker.cc
   TimePanel.cc
   ToolsWidget.cc
   TopicSelector.cc
-  viewers/ImageView.cc
-  viewers/ImagesView.cc
-  viewers/LaserView.cc
-  viewers/TopicView.cc
-  viewers/TextView.cc
-  viewers/ViewFactory.cc
 )
 
 set (qt_headers
   Actions.hh
   DataLogger.hh
+  Editor.hh
   GLWidget.hh
   InsertModelWidget.hh
   JointControlWidget.hh
@@ -57,14 +60,10 @@ set (qt_headers
   ModelEditWidget.hh
   ModelRightMenu.hh
   RenderWidget.hh
+  SaveDialog.hh
   TimePanel.hh
   ToolsWidget.hh
   TopicSelector.hh
-  viewers/ImageView.hh
-  viewers/ImagesView.hh
-  viewers/LaserView.hh
-  viewers/TextView.hh
-  viewers/TopicView.hh
 )
 
 set (headers
@@ -73,13 +72,15 @@ set (headers
   BoxMaker.hh
   CylinderMaker.hh
   EntityMaker.hh
-  Gui.hh
+  GuiIface.hh
   GuiEvents.hh
+  KeyEventHandler.hh
   LightMaker.hh
+  ModelManipulator.hh
   MeshMaker.hh
+  MouseEventHandler.hh
   ModelMaker.hh
   SphereMaker.hh
-  viewers/ViewFactory.hh
 )
 
 #if (HAVE_QWT)
@@ -95,10 +96,15 @@ set (headers
 
 set (qt_tests
   DataLogger_TEST.cc
+  GuiIface_TEST.cc
   TimePanel_TEST.cc
-  viewers/ImagesView_TEST.cc
 )
 
+# MainWindow is using screen rendering
+if (ENABLE_SCREEN_TESTS)
+  set (qt_tests   ${qt_tests} MainWindow_TEST.cc ModelListWidget_TEST.cc)
+endif()
+
 # Generate executables for each of the QT unit tests
 gz_build_qt_tests(${qt_tests})
 
@@ -113,34 +119,52 @@ gz_add_library(gazebo_gui ${sources} ${headers_MOC} ${headers} ${resources_RCC})
 add_dependencies(gazebo_gui gazebo_msgs)
 add_dependencies(gzclient gazebo_msgs)
 
-target_link_libraries(gazebo_gui gazebo_common
-                                 gazebo_transport
-                                 gazebo_sdf_interface
-                                 gazebo_rendering
-                                 gazebo_sensors
-                                 gazebo_msgs
-                                 gazebo_building
-                                 gzqtpropertybrowser
-                                 ${QT_LIBRARIES}
-                                 ${ogre_libraries}
-                                 ${Boost_LIBRARIES}
-                                 pthread)
-
-target_link_libraries(gzclient  gazebo_common
-                                gazebo_transport
-                                gazebo_sdf_interface
-                                gazebo_rendering
-                                gazebo_sensors
-                                gazebo_msgs
-                                gazebo_building
-                                gzqtpropertybrowser
-                                ${QT_LIBRARIES}
-                                ${ogre_libraries}
-                                ${Boost_LIBRARIES}
-                                pthread)
+target_link_libraries(gazebo_gui
+  gazebo_common
+  gazebo_transport
+  gazebo_rendering
+  gazebo_sensors
+  gazebo_msgs
+  gazebo_gui_building
+  gazebo_gui_model
+  gazebo_gui_terrain
+  gazebo_gui_viewers
+  gzqtpropertybrowser
+  libgazebo
+  ${QT_LIBRARIES}
+  ${ogre_libraries}
+  ${Boost_LIBRARIES}
+  pthread
+)
+
+target_link_libraries(gzclient
+  gazebo_common
+  gazebo_transport
+  gazebo_rendering
+  gazebo_sensors
+  gazebo_msgs
+  gazebo_gui_building
+  gazebo_gui_model
+  gazebo_gui_terrain
+  gazebo_gui_viewers
+  gzqtpropertybrowser
+  libgazebo
+  ${QT_LIBRARIES}
+  ${ogre_libraries}
+  ${Boost_LIBRARIES}
+  pthread
+)
 
 add_definitions(${QT_DEFINITIONS})
 
+set (gui_headers "" CACHE INTERNAL "gui headers" FORCE)
+foreach (hdr ${headers})
+  APPEND_TO_CACHED_STRING(gui_headers
+    "GUI Headers" "#include \"gazebo/gui/${hdr}\"\n")
+endforeach()
+configure_file (${CMAKE_CURRENT_SOURCE_DIR}/gui.hh.in ${CMAKE_CURRENT_BINARY_DIR}/gui.hh )
+
 gz_install_library(gazebo_gui)
-gz_install_includes("gui" ${headers})
+gz_install_includes("gui" ${headers} ${CMAKE_CURRENT_BINARY_DIR}/gui.hh)
 gz_install_executable(gzclient)
+manpage(gzclient 1)
diff --git a/gazebo/gui/CylinderMaker.cc b/gazebo/gui/CylinderMaker.cc
index aa759e2..b887552 100644
--- a/gazebo/gui/CylinderMaker.cc
+++ b/gazebo/gui/CylinderMaker.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,16 +16,18 @@
 */
 #include <sstream>
 
-#include "msgs/msgs.hh"
-#include "gui/GuiEvents.hh"
-#include "common/MouseEvent.hh"
-#include "math/Quaternion.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/gui/GuiEvents.hh"
 
-#include "rendering/UserCamera.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/math/Quaternion.hh"
 
-#include "transport/Publisher.hh"
+#include "gazebo/rendering/UserCamera.hh"
 
-#include "gui/CylinderMaker.hh"
+#include "gazebo/transport/Publisher.hh"
+
+#include "gazebo/gui/CylinderMaker.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -36,6 +38,7 @@ CylinderMaker::CylinderMaker()
   : EntityMaker()
 {
   this->state = 0;
+  this->leftMousePressed = false;
   this->visualMsg = new msgs::Visual();
   this->visualMsg->mutable_geometry()->set_type(msgs::Geometry::CYLINDER);
   this->visualMsg->mutable_material()->mutable_script()->add_uri(
diff --git a/gazebo/gui/CylinderMaker.hh b/gazebo/gui/CylinderMaker.hh
index b35a8d8..6b64354 100644
--- a/gazebo/gui/CylinderMaker.hh
+++ b/gazebo/gui/CylinderMaker.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,9 @@
 
 #include <string>
 
-#include "math/Vector2i.hh"
-#include "gui/EntityMaker.hh"
+#include "gazebo/math/Vector2i.hh"
+#include "gazebo/gui/EntityMaker.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class CylinderMaker CylinderMaker.hh
     /// \brief to make a cylinder
-    class CylinderMaker : public EntityMaker
+    class GAZEBO_VISIBLE CylinderMaker : public EntityMaker
     {
       /// \brief Constructor
       public: CylinderMaker();
diff --git a/gazebo/gui/DataLogger.cc b/gazebo/gui/DataLogger.cc
index 7148110..1045917 100644
--- a/gazebo/gui/DataLogger.cc
+++ b/gazebo/gui/DataLogger.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/DataLogger.hh b/gazebo/gui/DataLogger.hh
index 6aec6c8..8a85ee6 100644
--- a/gazebo/gui/DataLogger.hh
+++ b/gazebo/gui/DataLogger.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 #include "gazebo/transport/TransportTypes.hh"
 #include "gazebo/msgs/msgs.hh"
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class DataLogger DataLogger.hh gui/DataLogger.hh
     /// \brief A widget that provides data logging functionality.
-    class DataLogger : public QDialog
+    class GAZEBO_VISIBLE DataLogger : public QDialog
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/DataLogger_TEST.cc b/gazebo/gui/DataLogger_TEST.cc
index 99bc6dd..5e85e95 100644
--- a/gazebo/gui/DataLogger_TEST.cc
+++ b/gazebo/gui/DataLogger_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,140 +16,158 @@
 */
 
 #include <boost/filesystem.hpp>
-#include "gazebo/math/Rand.hh"
+#include "gazebo/common/SystemPaths.hh"
 #include "gazebo/gui/DataLogger.hh"
 #include "gazebo/gui/DataLogger_TEST.hh"
+#include "gazebo/math/Rand.hh"
 
 /////////////////////////////////////////////////
 void DataLogger_TEST::RecordButton()
 {
-  this->Load("worlds/empty.world");
+  QBENCHMARK
+  {
+    this->Load("worlds/empty.world");
 
-  // Create a new data logger widget
-  gazebo::gui::DataLogger *dataLogger = new gazebo::gui::DataLogger;
-  dataLogger->show();
-  QCoreApplication::processEvents();
+    // Create a new data logger widget
+    gazebo::gui::DataLogger *dataLogger = new gazebo::gui::DataLogger;
+    dataLogger->show();
+    QCoreApplication::processEvents();
 
-  // Get the record button
-  QToolButton *recordButton = dataLogger->findChild<QToolButton*>(
-      "dataLoggerRecordButton");
+    // Get the record button
+    QToolButton *recordButton = dataLogger->findChild<QToolButton*>(
+        "dataLoggerRecordButton");
 
-  // Get the destination label
-  QLineEdit *destPathLabel = dataLogger->findChild<QLineEdit*>(
-      "dataLoggerDestnationPathLabel");
+    // Get the destination label
+    QLineEdit *destPathLabel = dataLogger->findChild<QLineEdit*>(
+        "dataLoggerDestnationPathLabel");
 
-  // Get the time label
-  QLabel *timeLabel = dataLogger->findChild<QLabel*>("dataLoggerTimeLabel");
+    // Get the time label
+    QLabel *timeLabel = dataLogger->findChild<QLabel*>("dataLoggerTimeLabel");
 
-  // Get the status label
-  QLabel *statusLabel = dataLogger->findChild<QLabel*>("dataLoggerStatusLabel");
+    // Get the status label
+    QLabel *statusLabel =
+      dataLogger->findChild<QLabel*>("dataLoggerStatusLabel");
 
-  // Get the size label
-  QLabel *sizeLabel = dataLogger->findChild<QLabel*>("dataLoggerSizeLabel");
+    // Get the size label
+    QLabel *sizeLabel = dataLogger->findChild<QLabel*>("dataLoggerSizeLabel");
 
-  QVERIFY(recordButton != NULL);
-  QVERIFY(destPathLabel != NULL);
-  QVERIFY(sizeLabel != NULL);
-  QVERIFY(timeLabel != NULL);
-  QVERIFY(statusLabel != NULL);
+    QVERIFY(recordButton != NULL);
+    QVERIFY(destPathLabel != NULL);
+    QVERIFY(sizeLabel != NULL);
+    QVERIFY(timeLabel != NULL);
+    QVERIFY(statusLabel != NULL);
 
-  // Toggle the record button, which starts logging.
-  recordButton->toggle();
+    // Toggle the record button, which starts logging.
+    recordButton->toggle();
 
-  // Wait for a log status return message
-  while (destPathLabel->text().toStdString().empty())
-  {
-    // The following line tell QT to process its events. This is vital for
-    // all tests, but it must be run in the main thread.
-    QCoreApplication::processEvents();
-    gazebo::common::Time::MSleep(100);
-  }
+    // Wait for a log status return message
+    while (destPathLabel->text().toStdString().empty())
+    {
+      // The following line tell QT to process its events. This is vital for
+      // all tests, but it must be run in the main thread.
+      QCoreApplication::processEvents();
+      gazebo::common::Time::MSleep(100);
+    }
 
-  std::string txt;
+    std::string txt;
 
-  // Make sure the destination log file is correct.
-  txt = destPathLabel->text().toStdString();
-  QVERIFY(txt.find("test/state.log") != std::string::npos);
+    // Make sure the destination log file is correct.
+    txt = destPathLabel->text().toStdString();
+    QVERIFY(txt.find("test/state.log") != std::string::npos);
 
-  // Make sure the initial size is zero
-  txt = sizeLabel->text().toStdString();
-  QVERIFY(txt == "0.00 B");
+    // Make sure the initial size is zero
+    txt = sizeLabel->text().toStdString();
+    QVERIFY(txt == "0.00 B");
 
-  // Make sure the initial time is zero
-  txt = timeLabel->text().toStdString();
-  QVERIFY(txt == "00:00:00.000");
+    // Make sure the initial time is zero
+    txt = timeLabel->text().toStdString();
+    QVERIFY(txt == "00:00:00.000");
 
-  // Make sure the status label says "Recording"
-  txt = statusLabel->text().toStdString();
-  QVERIFY(txt == "Recording");
+    // Make sure the status label says "Recording"
+    txt = statusLabel->text().toStdString();
+    QVERIFY(txt == "Recording");
 
 
-  // Toggle the record button, which stops logging.
-  recordButton->toggle();
+    // Toggle the record button, which stops logging.
+    recordButton->toggle();
 
-  // Make sure the initial size is zero
-  txt = sizeLabel->text().toStdString();
-  QVERIFY(txt == "0.00 B");
+    // Make sure the initial size is zero
+    txt = sizeLabel->text().toStdString();
+    QVERIFY(txt == "0.00 B");
 
-  // Make sure the initial time is zero
-  txt = timeLabel->text().toStdString();
-  QVERIFY(txt == "00:00:00.000");
+    // Make sure the initial time is zero
+    txt = timeLabel->text().toStdString();
+    QVERIFY(txt == "00:00:00.000");
 
 
-  // Make sure the status label says "Ready"
-  txt = statusLabel->text().toStdString();
-  QVERIFY(txt == "Ready");
+    // Make sure the status label says "Ready"
+    txt = statusLabel->text().toStdString();
+    QVERIFY(txt == "Ready");
 
-  dataLogger->hide();
+    dataLogger->hide();
+  }
 }
 
 /////////////////////////////////////////////////
 void DataLogger_TEST::StressTest()
 {
-  this->Load("worlds/empty.world");
+  QBENCHMARK
+  {
+    gazebo::common::SystemPaths *paths =
+        gazebo::common::SystemPaths::Instance();
 
-  gazebo::transport::NodePtr node;
-  gazebo::transport::PublisherPtr pub;
+    // Cleanup test directory.
+    boost::filesystem::remove_all(paths->GetDefaultTestPath());
 
-  // Create a node from communication.
-  node = gazebo::transport::NodePtr(new gazebo::transport::Node());
-  node->Init();
-  pub = node->Advertise<gazebo::msgs::LogControl>("~/log/control");
+    this->Load("worlds/empty.world");
 
-  gazebo::msgs::LogControl msg;
-  msg.set_base_path("/tmp/gazebo_test");
-  pub->Publish(msg);
+    // Cleanup test directory.
+    boost::filesystem::remove_all(paths->GetDefaultTestPath());
 
-  // Create a new data logger widget
-  gazebo::gui::DataLogger *dataLogger = new gazebo::gui::DataLogger;
+    gazebo::transport::NodePtr node;
+    gazebo::transport::PublisherPtr pub;
 
-  // Get the record button
-  QToolButton *recordButton = dataLogger->findChild<QToolButton*>(
-      "dataLoggerRecordButton");
+    // Create a node from communication.
+    node = gazebo::transport::NodePtr(new gazebo::transport::Node());
+    node->Init();
+    pub = node->Advertise<gazebo::msgs::LogControl>("~/log/control");
 
-  unsigned int count = 100;
+    gazebo::msgs::LogControl msg;
+    msg.set_base_path(paths->GetDefaultTestPath());
+    pub->Publish(msg);
 
-  // Toggle the record button many times with sleeps
-  for (unsigned int i = 0; i < count; ++i)
-  {
-    recordButton->toggle();
+    // Create a new data logger widget
+    gazebo::gui::DataLogger *dataLogger = new gazebo::gui::DataLogger;
 
-    // Sleep for random times
-    gazebo::common::Time::MSleep(gazebo::math::Rand::GetIntUniform(10, 500));
-  }
+    // Get the record button
+    QToolButton *recordButton = dataLogger->findChild<QToolButton*>(
+        "dataLoggerRecordButton");
 
-  // There should be (count * 0.5) log directories in /tmp/gazebo_test
-  // due to the record button being toggled.
-  unsigned int dirCount = 0;
-  for (boost::filesystem::directory_iterator iter("/tmp/gazebo_test");
-       iter != boost::filesystem::directory_iterator(); ++iter, ++dirCount)
-  {
-  }
+    unsigned int count = 100;
+
+    // Toggle the record button many times with sleeps
+    for (unsigned int i = 0; i < count; ++i)
+    {
+      recordButton->toggle();
+
+      // Sleep for random times
+      gazebo::common::Time::MSleep(gazebo::math::Rand::GetIntUniform(10, 500));
+    }
 
-  QVERIFY(dirCount == count / 2);
+    // There should be (count * 0.5) log directories in $TMP/gazebo_test
+    // due to the record button being toggled.
+    unsigned int dirCount = 0;
+    for (boost::filesystem::directory_iterator
+          iter(paths->GetDefaultTestPath());
+          iter != boost::filesystem::directory_iterator(); ++iter, ++dirCount)
+    {
+    }
 
-  // Cleanup after ourselves.
-  boost::filesystem::remove_all("/tmp/gazebo_test");
+    // Cleanup after ourselves.
+    boost::filesystem::remove_all(paths->GetDefaultTestPath());
+
+    QVERIFY(dirCount == count / 2);
+  }
 }
 
 // Generate a main function for the test
diff --git a/gazebo/gui/DataLogger_TEST.hh b/gazebo/gui/DataLogger_TEST.hh
index 90f9231..95dd783 100644
--- a/gazebo/gui/DataLogger_TEST.hh
+++ b/gazebo/gui/DataLogger_TEST.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/Diagnostics.cc b/gazebo/gui/Diagnostics.cc
index 295d9bb..0c0176a 100644
--- a/gazebo/gui/Diagnostics.cc
+++ b/gazebo/gui/Diagnostics.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  *
 */
 
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Node.hh"
 #include "gazebo/transport/Publisher.hh"
 
diff --git a/gazebo/gui/Diagnostics.hh b/gazebo/gui/Diagnostics.hh
index 0f6ffa7..60e4914 100644
--- a/gazebo/gui/Diagnostics.hh
+++ b/gazebo/gui/Diagnostics.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
 #include "gazebo/common/Time.hh"
 #include "gazebo/transport/TransportTypes.hh"
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
     class IncrementalPlot;
 
     /// \brief Plot diagnostic information
-    class Diagnostics : public QDialog
+    class GAZEBO_VISIBLE Diagnostics : public QDialog
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/Editor.cc b/gazebo/gui/Editor.cc
new file mode 100644
index 0000000..0abfcca
--- /dev/null
+++ b/gazebo/gui/Editor.cc
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gui/MainWindow.hh"
+#include "gazebo/gui/Editor.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+Editor::Editor(MainWindow *_mainWindow)
+  : mainWindow(_mainWindow)
+{
+  this->tabWidget = NULL;
+}
+
+/////////////////////////////////////////////////
+Editor::~Editor()
+{
+  this->tabWidget->hide();
+  delete this->tabWidget;
+}
+
+/////////////////////////////////////////////////
+void Editor::Init(const std::string &_objName,
+                  const std::string &_tabLabel, QWidget *_widget)
+{
+  if (this->tabWidget)
+    delete this->tabWidget;
+
+  this->tabWidget = new QTabWidget;
+  this->tabWidget->setObjectName(QString::fromStdString(_objName));
+  this->tabWidget->addTab(_widget, QString::fromStdString(_tabLabel));
+  this->tabWidget->setSizePolicy(QSizePolicy::Expanding,
+      QSizePolicy::Expanding);
+  this->tabWidget->setMinimumWidth(250);
+  this->tabWidget->hide();
+
+  this->mainWindow->AddToLeftColumn(_objName, this->tabWidget);
+}
+
diff --git a/gazebo/gui/Editor.hh b/gazebo/gui/Editor.hh
new file mode 100644
index 0000000..cec7a62
--- /dev/null
+++ b/gazebo/gui/Editor.hh
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _EDITOR_HH_
+#define _EDITOR_HH_
+
+#include <string>
+#include <vector>
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class MainWindow;
+
+    /// \brief Base class for editors, such as BuildingEditor and
+    /// TerrainEditor.
+    class GAZEBO_VISIBLE Editor : public QObject
+    {
+      Q_OBJECT
+
+      /// \brief Constuctor.
+      /// \param[in] _mainWindow Pointer to the main window.
+      public: Editor(MainWindow *_mainWindow);
+
+      /// \brief Destuctor
+      public: virtual ~Editor();
+
+      /// \brief Initialize the editor. Each child class should call this
+      /// function on construction.
+      /// \param[in] _objName Name of the object, which can be used in the
+      /// style sheet.
+      /// \param[in] _tabLabel String used for the tab label.
+      /// \param[in] _widget Widget that is put inside the tab.
+      protected: void Init(const std::string &_objName,
+                     const std::string &_tabLabel, QWidget *_widget);
+
+      /// \brief The tab widget that holds the editor's set of buttons.
+      protected: QTabWidget *tabWidget;
+
+      /// \brief Pointer to the main window.
+      protected: MainWindow *mainWindow;
+
+      /// \brief List of Event based connections.
+      protected: std::vector<event::ConnectionPtr> connections;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/EntityMaker.cc b/gazebo/gui/EntityMaker.cc
index c4e22f2..8b3820a 100644
--- a/gazebo/gui/EntityMaker.cc
+++ b/gazebo/gui/EntityMaker.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,9 +14,9 @@
  * limitations under the License.
  *
 */
-#include "transport/Transport.hh"
-#include "transport/Node.hh"
-#include "gui/EntityMaker.hh"
+#include "gazebo/transport/TransportIface.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/gui/EntityMaker.hh"
 
 using namespace gazebo;
 using namespace gui;
diff --git a/gazebo/gui/EntityMaker.hh b/gazebo/gui/EntityMaker.hh
index d9a0b6b..7f9aec2 100644
--- a/gazebo/gui/EntityMaker.hh
+++ b/gazebo/gui/EntityMaker.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,12 +14,13 @@
  * limitations under the License.
  *
 */
-#ifndef ENTITYMAKER_HH
-#define ENTITYMAKER_HH
+#ifndef _ENTITYMAKER_HH_
+#define _ENTITYMAKER_HH_
 
-#include "rendering/RenderTypes.hh"
-#include "transport/TransportTypes.hh"
-#include "math/Vector3.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +38,7 @@ namespace gazebo
 
     /// \class EntityMaker EntityMaker.hh gui/gui.hh
     /// \brief to make an entity base class
-    class EntityMaker
+    class GAZEBO_VISIBLE EntityMaker
     {
       /// \def CreateCallback
       /// \brief boost::function with vector3 pos and vector3 scale
@@ -65,12 +66,15 @@ namespace gazebo
       /// \brief Callback for pushing entity with mouse
       /// \param[in] _event MouseEvent object
       public: virtual void OnMousePush(const common::MouseEvent &_event);
+
       /// \brief Callback for releasing mouse button
       /// \param[in] _event MouseEvent object
       public: virtual void OnMouseRelease(const common::MouseEvent &_event);
+
       /// \brief Callback for dragging with mouse
       /// \param[in] _event MouseEvent object
       public: virtual void OnMouseDrag(const common::MouseEvent &_event);
+
       /// \brief Callback when moving mouse
       /// \param[in] _event MouseEvent object
       public: virtual void OnMouseMove(const common::MouseEvent &_event);
diff --git a/gazebo/gui/GLWidget.cc b/gazebo/gui/GLWidget.cc
index ecc977e..2453972 100644
--- a/gazebo/gui/GLWidget.cc
+++ b/gazebo/gui/GLWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,25 +16,33 @@
 */
 #include <math.h>
 
-#include "common/Exception.hh"
-#include "math/gzmath.hh"
-
-#include "transport/transport.hh"
-
-#include "rendering/RenderEvents.hh"
-#include "rendering/Rendering.hh"
-#include "rendering/Visual.hh"
-#include "rendering/WindowManager.hh"
-#include "rendering/Scene.hh"
-#include "rendering/UserCamera.hh"
-#include "rendering/OrbitViewController.hh"
-#include "rendering/FPSViewController.hh"
-
-#include "gui/Actions.hh"
-#include "gui/Gui.hh"
-#include "gui/ModelRightMenu.hh"
-#include "gui/GuiEvents.hh"
-#include "gui/GLWidget.hh"
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/math/gzmath.hh"
+
+#include "gazebo/transport/transport.hh"
+
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Heightmap.hh"
+#include "gazebo/rendering/RenderEvents.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/WindowManager.hh"
+#include "gazebo/rendering/RenderEngine.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/OrbitViewController.hh"
+#include "gazebo/rendering/FPSViewController.hh"
+#include "gazebo/rendering/SelectionObj.hh"
+
+#include "gazebo/gui/ModelManipulator.hh"
+#include "gazebo/gui/MouseEventHandler.hh"
+#include "gazebo/gui/KeyEventHandler.hh"
+#include "gazebo/gui/Actions.hh"
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/ModelRightMenu.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/gui/GLWidget.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -48,6 +56,7 @@ GLWidget::GLWidget(QWidget *_parent)
 {
   this->setObjectName("GLWidget");
   this->state = "select";
+  this->sceneCreated = false;
 
   this->setFocusPolicy(Qt::StrongFocus);
 
@@ -55,7 +64,6 @@ GLWidget::GLWidget(QWidget *_parent)
 
   setAttribute(Qt::WA_OpaquePaintEvent, true);
   setAttribute(Qt::WA_PaintOnScreen, true);
-//  setMinimumSize(320, 240);
 
   this->renderFrame = new QFrame;
   this->renderFrame->setFrameShape(QFrame::NoFrame);
@@ -107,7 +115,6 @@ GLWidget::GLWidget(QWidget *_parent)
   this->node = transport::NodePtr(new transport::Node());
   this->node->Init();
   this->modelPub = this->node->Advertise<msgs::Model>("~/model/modify");
-  this->lightPub = this->node->Advertise<msgs::Light>("~/light");
 
   this->factoryPub = this->node->Advertise<msgs::Factory>("~/factory");
   this->selectionSub = this->node->Subscribe("~/selection",
@@ -119,7 +126,18 @@ GLWidget::GLWidget(QWidget *_parent)
   this->keyModifiers = 0;
 
   this->selectedVis.reset();
-  this->mouseMoveVis.reset();
+
+  MouseEventHandler::Instance()->AddPressFilter("glwidget",
+      boost::bind(&GLWidget::OnMousePress, this, _1));
+
+  MouseEventHandler::Instance()->AddReleaseFilter("glwidget",
+      boost::bind(&GLWidget::OnMouseRelease, this, _1));
+
+  MouseEventHandler::Instance()->AddMoveFilter("glwidget",
+      boost::bind(&GLWidget::OnMouseMove, this, _1));
+
+  MouseEventHandler::Instance()->AddDoubleClickFilter("glwidget",
+      boost::bind(&GLWidget::OnMouseDoubleClick, this, _1));
 }
 
 /////////////////////////////////////////////////
@@ -128,7 +146,6 @@ GLWidget::~GLWidget()
   this->connections.clear();
   this->node.reset();
   this->modelPub.reset();
-  this->lightPub.reset();
   this->selectionSub.reset();
 
   this->userCamera.reset();
@@ -150,14 +167,14 @@ bool GLWidget::eventFilter(QObject * /*_obj*/, QEvent *_event)
 void GLWidget::showEvent(QShowEvent *_event)
 {
   QApplication::flush();
-  this->windowId = rendering::WindowManager::Instance()->CreateWindow(
-      this->GetOgreHandle(), this->width(), this->height());
+  this->windowId = rendering::RenderEngine::Instance()->GetWindowManager()->
+    CreateWindow(this->GetOgreHandle(), this->width(), this->height());
 
   QWidget::showEvent(_event);
 
   if (this->userCamera)
-    rendering::WindowManager::Instance()->SetCamera(this->windowId,
-                                                    this->userCamera);
+    rendering::RenderEngine::Instance()->GetWindowManager()->SetCamera(
+        this->windowId, this->userCamera);
   this->setFocus();
 }
 
@@ -173,13 +190,19 @@ void GLWidget::moveEvent(QMoveEvent *_e)
 
   if (_e->isAccepted() && this->windowId >= 0)
   {
-    rendering::WindowManager::Instance()->Moved(this->windowId);
+    rendering::RenderEngine::Instance()->GetWindowManager()->Moved(
+        this->windowId);
   }
 }
 
 /////////////////////////////////////////////////
 void GLWidget::paintEvent(QPaintEvent *_e)
 {
+  // Timing may cause GLWidget to miss the OnCreateScene event. So, we check
+  // here to make sure it's handled.
+  if (!this->sceneCreated && rendering::get_scene())
+    this->OnCreateScene(rendering::get_scene()->GetName());
+
   rendering::UserCameraPtr cam = gui::get_active_camera();
   if (cam && cam->GetInitialized())
   {
@@ -190,6 +213,7 @@ void GLWidget::paintEvent(QPaintEvent *_e)
 
     event::Events::postRender();
   }
+
   _e->accept();
 }
 
@@ -201,8 +225,8 @@ void GLWidget::resizeEvent(QResizeEvent *_e)
 
   if (this->windowId >= 0)
   {
-    rendering::WindowManager::Instance()->Resize(this->windowId,
-        _e->size().width(), _e->size().height());
+    rendering::RenderEngine::Instance()->GetWindowManager()->Resize(
+        this->windowId, _e->size().width(), _e->size().height());
     this->userCamera->Resize(_e->size().width(), _e->size().height());
   }
 }
@@ -219,6 +243,8 @@ void GLWidget::keyPressEvent(QKeyEvent *_event)
   this->keyText = _event->text().toStdString();
   this->keyModifiers = _event->modifiers();
 
+  this->keyEvent.key = _event->key();
+
   // Toggle full screen
   if (_event->key() == Qt::Key_F11)
   {
@@ -232,7 +258,14 @@ void GLWidget::keyPressEvent(QKeyEvent *_event)
     g_deleteAct->Signal(this->selectedVis->GetName());
 
   if (_event->key() == Qt::Key_Escape)
+  {
     event::Events::setSelectedEntity("", "normal");
+    if (this->state == "make_entity")
+    {
+      if (this->entityMaker)
+        this->entityMaker->Stop();
+    }
+  }
 
   this->mouseEvent.control =
     this->keyModifiers & Qt::ControlModifier ? true : false;
@@ -241,7 +274,12 @@ void GLWidget::keyPressEvent(QKeyEvent *_event)
   this->mouseEvent.alt =
     this->keyModifiers & Qt::AltModifier ? true : false;
 
+  ModelManipulator::Instance()->OnKeyPressEvent(this->keyEvent);
+
   this->userCamera->HandleKeyPressEvent(this->keyText);
+
+  // Process Key Events
+  KeyEventHandler::Instance()->HandlePress(this->keyEvent);
 }
 
 /////////////////////////////////////////////////
@@ -253,8 +291,6 @@ void GLWidget::keyReleaseEvent(QKeyEvent *_event)
   if (_event->isAutoRepeat())
     return;
 
-  this->keyText = "";
-
   this->keyModifiers = _event->modifiers();
 
   if (this->keyModifiers & Qt::ControlModifier &&
@@ -263,6 +299,19 @@ void GLWidget::keyReleaseEvent(QKeyEvent *_event)
     this->PopHistory();
   }
 
+  /// Switch between RTS modes
+  if (this->keyModifiers == Qt::NoModifier && this->state != "make_entity")
+  {
+    if (_event->key() == Qt::Key_R)
+      g_rotateAct->trigger();
+    else if (_event->key() == Qt::Key_T)
+      g_translateAct->trigger();
+    else if (_event->key() == Qt::Key_S)
+      g_scaleAct->trigger();
+    else if (_event->key() == Qt::Key_Escape)
+      g_arrowAct->trigger();
+  }
+
   this->mouseEvent.control =
     this->keyModifiers & Qt::ControlModifier ? true : false;
   this->mouseEvent.shift =
@@ -270,47 +319,47 @@ void GLWidget::keyReleaseEvent(QKeyEvent *_event)
   this->mouseEvent.alt =
     this->keyModifiers & Qt::AltModifier ? true : false;
 
-  // Reset the mouse move info when the user hits keys.
-  if (this->state == "translate" || this->state == "rotate")
-  {
-    if (this->keyText == "x" || this->keyText == "y" || this->keyText == "z")
-    {
-      this->mouseEvent.pressPos = this->mouseEvent.pos;
-      if (this->mouseMoveVis)
-        this->mouseMoveVisStartPose = this->mouseMoveVis->GetWorldPose();
-    }
-  }
+
+  ModelManipulator::Instance()->OnKeyReleaseEvent(this->keyEvent);
+  this->keyText = "";
 
   this->userCamera->HandleKeyReleaseEvent(_event->text().toStdString());
+
+  // Process Key Events
+  KeyEventHandler::Instance()->HandleRelease(this->keyEvent);
 }
 
 /////////////////////////////////////////////////
-void GLWidget::mouseDoubleClickEvent(QMouseEvent * /*_event*/)
+void GLWidget::mouseDoubleClickEvent(QMouseEvent *_event)
 {
-  rendering::VisualPtr vis = this->userCamera->GetVisual(this->mouseEvent.pos);
-  if (vis)
-  {
-    if (vis->IsPlane())
-    {
-      math::Pose pose, camPose;
-      camPose = this->userCamera->GetWorldPose();
-      if (this->scene->GetFirstContact(this->userCamera,
-                                   this->mouseEvent.pos, pose.pos))
-      {
-        this->userCamera->SetFocalPoint(pose.pos);
+  if (!this->scene)
+    return;
 
-        math::Vector3 dir = pose.pos - camPose.pos;
-        pose.pos = camPose.pos + (dir * 0.8);
+  this->mouseEvent.pressPos.Set(_event->pos().x(), _event->pos().y());
+  this->mouseEvent.prevPos = this->mouseEvent.pressPos;
 
-        pose.rot = this->userCamera->GetWorldRotation();
-        this->userCamera->MoveToPosition(pose, 0.5);
-      }
-    }
-    else
-    {
-      this->userCamera->MoveToVisual(vis);
-    }
-  }
+  /// Set the button which cause the press event
+  if (_event->button() == Qt::LeftButton)
+    this->mouseEvent.button = common::MouseEvent::LEFT;
+  else if (_event->button() == Qt::RightButton)
+    this->mouseEvent.button = common::MouseEvent::RIGHT;
+  else if (_event->button() == Qt::MidButton)
+    this->mouseEvent.button = common::MouseEvent::MIDDLE;
+
+  this->mouseEvent.buttons = common::MouseEvent::NO_BUTTON;
+  this->mouseEvent.type = common::MouseEvent::PRESS;
+
+  this->mouseEvent.buttons |= _event->buttons() & Qt::LeftButton ?
+    common::MouseEvent::LEFT : 0x0;
+  this->mouseEvent.buttons |= _event->buttons() & Qt::RightButton ?
+    common::MouseEvent::RIGHT : 0x0;
+  this->mouseEvent.buttons |= _event->buttons() & Qt::MidButton ?
+    common::MouseEvent::MIDDLE : 0x0;
+
+  this->mouseEvent.dragging = false;
+
+  // Process Mouse Events
+  MouseEventHandler::Instance()->HandleDoubleClick(this->mouseEvent);
 }
 
 /////////////////////////////////////////////////
@@ -341,34 +390,83 @@ void GLWidget::mousePressEvent(QMouseEvent *_event)
     common::MouseEvent::MIDDLE : 0x0;
 
   this->mouseEvent.dragging = false;
-  gui::Events::mousePress(this->mouseEvent);
 
+  // Process Mouse Events
+  MouseEventHandler::Instance()->HandlePress(this->mouseEvent);
+}
+
+/////////////////////////////////////////////////
+bool GLWidget::OnMousePress(const common::MouseEvent & /*_event*/)
+{
   if (this->state == "make_entity")
     this->OnMousePressMakeEntity();
   else if (this->state == "select")
     this->OnMousePressNormal();
-  else if (this->state == "translate" || this->state == "rotate")
-    this->OnMousePressTranslate();
+  else if (this->state == "translate" || this->state == "rotate"
+      || this->state == "scale")
+    ModelManipulator::Instance()->OnMousePressEvent(this->mouseEvent);
+
+  return true;
 }
 
 /////////////////////////////////////////////////
-void GLWidget::OnMousePressTranslate()
+bool GLWidget::OnMouseRelease(const common::MouseEvent & /*_event*/)
 {
-  rendering::VisualPtr vis = this->userCamera->GetVisual(this->mouseEvent.pos);
+  if (this->state == "make_entity")
+    this->OnMouseReleaseMakeEntity();
+  else if (this->state == "select")
+    this->OnMouseReleaseNormal();
+  else if (this->state == "translate" || this->state == "rotate"
+      || this->state == "scale")
+    ModelManipulator::Instance()->OnMouseReleaseEvent(this->mouseEvent);
 
-  if (vis && !vis->IsPlane() &&
-      this->mouseEvent.button == common::MouseEvent::LEFT)
-  {
-    vis = vis->GetRootVisual();
-    this->mouseMoveVisStartPose = vis->GetWorldPose();
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool GLWidget::OnMouseMove(const common::MouseEvent & /*_event*/)
+{
+  // Update the view depending on the current GUI state
+  if (this->state == "make_entity")
+    this->OnMouseMoveMakeEntity();
+  else if (this->state == "select")
+    this->OnMouseMoveNormal();
+  else if (this->state == "translate" || this->state == "rotate"
+      || this->state == "scale")
+    ModelManipulator::Instance()->OnMouseMoveEvent(this->mouseEvent);
 
-    this->SetMouseMoveVisual(vis);
+  return true;
+}
 
-    event::Events::setSelectedEntity(this->mouseMoveVis->GetName(), "move");
-    QApplication::setOverrideCursor(Qt::ClosedHandCursor);
+/////////////////////////////////////////////////
+bool GLWidget::OnMouseDoubleClick(const common::MouseEvent & /*_event*/)
+{
+  rendering::VisualPtr vis = this->userCamera->GetVisual(this->mouseEvent.pos);
+  if (vis && gui::get_entity_id(vis->GetRootVisual()->GetName()))
+  {
+    if (vis->IsPlane())
+    {
+      math::Pose pose, camPose;
+      camPose = this->userCamera->GetWorldPose();
+      if (this->scene->GetFirstContact(this->userCamera,
+                                   this->mouseEvent.pos, pose.pos))
+      {
+        this->userCamera->SetFocalPoint(pose.pos);
+        math::Vector3 dir = pose.pos - camPose.pos;
+        pose.pos = camPose.pos + (dir * 0.8);
+        pose.rot = this->userCamera->GetWorldRotation();
+        this->userCamera->MoveToPosition(pose, 0.5);
+      }
+    }
+    else
+    {
+      this->userCamera->MoveToVisual(vis);
+    }
   }
   else
-    this->userCamera->HandleMouseEvent(this->mouseEvent);
+    return false;
+
+  return true;
 }
 
 /////////////////////////////////////////////////
@@ -379,8 +477,6 @@ void GLWidget::OnMousePressNormal()
 
   rendering::VisualPtr vis = this->userCamera->GetVisual(this->mouseEvent.pos);
 
-  this->SetMouseMoveVisual(rendering::VisualPtr());
-
   this->userCamera->HandleMouseEvent(this->mouseEvent);
 }
 
@@ -431,13 +527,8 @@ void GLWidget::mouseMoveEvent(QMouseEvent *_event)
   else
     this->mouseEvent.dragging = false;
 
-  // Update the view depending on the current GUI state
-  if (this->state == "make_entity")
-    this->OnMouseMoveMakeEntity();
-  else if (this->state == "select")
-    this->OnMouseMoveNormal();
-  else if (this->state == "translate" || this->state == "rotate")
-    this->OnMouseMoveTranslate();
+  // Process Mouse Events
+  MouseEventHandler::Instance()->HandleMove(this->mouseEvent);
 
   this->mouseEvent.prevPos = this->mouseEvent.pos;
 }
@@ -455,97 +546,6 @@ void GLWidget::OnMouseMoveMakeEntity()
 }
 
 /////////////////////////////////////////////////
-void GLWidget::SmartMoveVisual(rendering::VisualPtr _vis)
-{
-  if (!this->mouseEvent.dragging)
-    return;
-
-  // Get the point on the plane which correspoinds to the mouse
-  math::Vector3 pp;
-
-  // Rotate the visual using the middle mouse button
-  if (this->mouseEvent.buttons == common::MouseEvent::MIDDLE)
-  {
-    math::Vector3 rpy = this->mouseMoveVisStartPose.rot.GetAsEuler();
-    math::Vector2i delta = this->mouseEvent.pos - this->mouseEvent.pressPos;
-    double yaw = (delta.x * 0.01) + rpy.z;
-    if (!this->mouseEvent.shift)
-    {
-      double snap = rint(yaw / (M_PI * .25)) * (M_PI * 0.25);
-
-      if (fabs(yaw - snap) < GZ_DTOR(10))
-        yaw = snap;
-    }
-
-    _vis->SetWorldRotation(math::Quaternion(rpy.x, rpy.y, yaw));
-  }
-  else if (this->mouseEvent.buttons == common::MouseEvent::RIGHT)
-  {
-    math::Vector3 rpy = this->mouseMoveVisStartPose.rot.GetAsEuler();
-    math::Vector2i delta = this->mouseEvent.pos - this->mouseEvent.pressPos;
-    double pitch = (delta.y * 0.01) + rpy.y;
-    if (!this->mouseEvent.shift)
-    {
-      double snap = rint(pitch / (M_PI * .25)) * (M_PI * 0.25);
-
-      if (fabs(pitch - snap) < GZ_DTOR(10))
-        pitch = snap;
-    }
-
-    _vis->SetWorldRotation(math::Quaternion(rpy.x, pitch, rpy.z));
-  }
-  else if (this->mouseEvent.buttons & common::MouseEvent::LEFT &&
-           this->mouseEvent.buttons & common::MouseEvent::RIGHT)
-  {
-    math::Vector3 rpy = this->mouseMoveVisStartPose.rot.GetAsEuler();
-    math::Vector2i delta = this->mouseEvent.pos - this->mouseEvent.pressPos;
-    double roll = (delta.x * 0.01) + rpy.x;
-    if (!this->mouseEvent.shift)
-    {
-      double snap = rint(roll / (M_PI * .25)) * (M_PI * 0.25);
-
-      if (fabs(roll - snap) < GZ_DTOR(10))
-        roll = snap;
-    }
-
-    _vis->SetWorldRotation(math::Quaternion(roll, rpy.y, rpy.z));
-  }
-  else
-  {
-    this->TranslateEntity(_vis);
-  }
-}
-
-/////////////////////////////////////////////////
-void GLWidget::OnMouseMoveTranslate()
-{
-  if (this->mouseEvent.dragging)
-  {
-    if (this->mouseMoveVis &&
-        this->mouseEvent.button == common::MouseEvent::LEFT)
-    {
-      if (this->state == "translate")
-        this->TranslateEntity(this->mouseMoveVis);
-      else if (this->state == "rotate")
-        this->RotateEntity(this->mouseMoveVis);
-    }
-    else
-      this->userCamera->HandleMouseEvent(this->mouseEvent);
-  }
-  else
-  {
-    rendering::VisualPtr vis = this->userCamera->GetVisual(
-        this->mouseEvent.pos);
-
-    if (vis && !vis->IsPlane())
-      QApplication::setOverrideCursor(Qt::OpenHandCursor);
-    else
-      QApplication::setOverrideCursor(Qt::ArrowCursor);
-    this->userCamera->HandleMouseEvent(this->mouseEvent);
-  }
-}
-
-/////////////////////////////////////////////////
 void GLWidget::OnMouseMoveNormal()
 {
   if (!this->userCamera)
@@ -589,15 +589,10 @@ void GLWidget::mouseReleaseEvent(QMouseEvent *_event)
   this->mouseEvent.buttons |= _event->buttons() & Qt::MidButton ?
     common::MouseEvent::MIDDLE : 0x0;
 
-  gui::Events::mouseRelease(this->mouseEvent);
-  emit clicked();
+  // Process Mouse Events
+  MouseEventHandler::Instance()->HandleRelease(this->mouseEvent);
 
-  if (this->state == "make_entity")
-    this->OnMouseReleaseMakeEntity();
-  else if (this->state == "select")
-    this->OnMouseReleaseNormal();
-  else if (this->state == "translate" || this->state == "rotate")
-    this->OnMouseReleaseTranslate();
+  emit clicked();
 }
 
 //////////////////////////////////////////////////
@@ -608,26 +603,6 @@ void GLWidget::OnMouseReleaseMakeEntity()
 }
 
 //////////////////////////////////////////////////
-void GLWidget::OnMouseReleaseTranslate()
-{
-  if (this->mouseEvent.dragging)
-  {
-    // If we were dragging a visual around, then publish its new pose to the
-    // server
-    if (this->mouseMoveVis)
-    {
-      this->PublishVisualPose(this->mouseMoveVis);
-      this->SetMouseMoveVisual(rendering::VisualPtr());
-      QApplication::setOverrideCursor(Qt::OpenHandCursor);
-    }
-    this->SetSelectedVisual(rendering::VisualPtr());
-    event::Events::setSelectedEntity("", "normal");
-  }
-
-  this->userCamera->HandleMouseEvent(this->mouseEvent);
-}
-
-//////////////////////////////////////////////////
 void GLWidget::OnMouseReleaseNormal()
 {
   if (!this->userCamera)
@@ -660,8 +635,41 @@ void GLWidget::OnMouseReleaseNormal()
 //////////////////////////////////////////////////
 void GLWidget::ViewScene(rendering::ScenePtr _scene)
 {
+  // The user camera name.
+  std::string cameraBaseName = "gzclient_camera";
+  std::string cameraName = cameraBaseName;
+
+  transport::ConnectionPtr connection = transport::connectToMaster();
+  if (connection)
+  {
+    std::string topicData;
+    msgs::Packet packet;
+    msgs::Request request;
+    msgs::GzString_V topics;
+
+    request.set_id(0);
+    request.set_request("get_topics");
+    connection->EnqueueMsg(msgs::Package("request", request), true);
+    connection->Read(topicData);
+
+    packet.ParseFromString(topicData);
+    topics.ParseFromString(packet.serialized_data());
+
+    std::string searchable;
+    for (int i = 0; i < topics.data_size(); ++i)
+      searchable += topics.data(i);
+
+    int i = 0;
+    while (searchable.find(cameraName) != std::string::npos)
+    {
+      cameraName = cameraBaseName + boost::lexical_cast<std::string>(++i);
+    }
+  }
+  else
+    gzerr << "Unable to connect to a running Gazebo master.\n";
+
   if (_scene->GetUserCameraCount() == 0)
-    this->userCamera = _scene->CreateUserCamera("rc_camera");
+    this->userCamera = _scene->CreateUserCamera(cameraName);
   else
     this->userCamera = _scene->GetUserCamera(0);
 
@@ -680,8 +688,8 @@ void GLWidget::ViewScene(rendering::ScenePtr _scene)
 
   if (this->windowId >= 0)
   {
-    rendering::WindowManager::Instance()->SetCamera(this->windowId,
-                                                    this->userCamera);
+    rendering::RenderEngine::Instance()->GetWindowManager()->SetCamera(
+        this->windowId, this->userCamera);
   }
 }
 
@@ -698,7 +706,6 @@ void GLWidget::Clear()
   this->userCamera.reset();
   this->scene.reset();
   this->SetSelectedVisual(rendering::VisualPtr());
-  this->SetMouseMoveVisual(rendering::VisualPtr());
   this->hoverVis.reset();
   this->keyModifiers = 0;
 }
@@ -715,7 +722,7 @@ std::string GLWidget::GetOgreHandle() const
 {
   std::string ogreHandle;
 
-#ifdef WIN32
+#if defined(WIN32) || defined(__APPLE__)
   ogreHandle = boost::lexical_cast<std::string>(this->winId());
 #else
   QX11Info info = x11Info();
@@ -726,7 +733,7 @@ std::string GLWidget::GetOgreHandle() const
   ogreHandle += boost::lexical_cast<std::string>(
       static_cast<uint32_t>(info.screen()));
   ogreHandle += ":";
-  assert(q_parent);
+  GZ_ASSERT(q_parent, "q_parent is null");
   ogreHandle += boost::lexical_cast<std::string>(
       static_cast<uint64_t>(q_parent->winId()));
 #endif
@@ -748,9 +755,12 @@ void GLWidget::OnCreateScene(const std::string &_name)
 {
   this->hoverVis.reset();
   this->SetSelectedVisual(rendering::VisualPtr());
-  this->SetMouseMoveVisual(rendering::VisualPtr());
 
   this->ViewScene(rendering::get_scene(_name));
+
+  ModelManipulator::Instance()->Init();
+
+  this->sceneCreated = true;
 }
 
 /////////////////////////////////////////////////
@@ -828,7 +838,6 @@ void GLWidget::OnFPS()
   this->userCamera->SetViewController(
       rendering::FPSViewController::GetTypeString());
 }
-
 /////////////////////////////////////////////////
 void GLWidget::OnOrbit()
 {
@@ -837,113 +846,6 @@ void GLWidget::OnOrbit()
 }
 
 /////////////////////////////////////////////////
-void GLWidget::RotateEntity(rendering::VisualPtr &_vis)
-{
-  math::Vector3 planeNorm, planeNorm2;
-  math::Vector3 p1, p2;
-  math::Vector3 a, b;
-  math::Vector3 ray(0, 0, 0);
-
-  math::Pose pose = _vis->GetPose();
-
-  math::Vector2i diff = this->mouseEvent.pos - this->mouseEvent.pressPos;
-  math::Vector3 rpy = this->mouseMoveVisStartPose.rot.GetAsEuler();
-
-  math::Vector3 rpyAmt;
-
-  if (this->keyText == "x" || this->keyText == "X")
-    rpyAmt.x = 1.0;
-  else if (this->keyText == "y" || this->keyText == "Y")
-    rpyAmt.y = 1.0;
-  else
-    rpyAmt.z = 1.0;
-
-  double amt = diff.y * 0.04;
-
-  if (this->mouseEvent.shift)
-    amt = rint(amt / (M_PI * 0.25)) * (M_PI * 0.25);
-
-  rpy += rpyAmt * amt;
-
-  _vis->SetRotation(math::Quaternion(rpy));
-}
-
-/////////////////////////////////////////////////
-void GLWidget::TranslateEntity(rendering::VisualPtr &_vis)
-{
-  math::Pose pose = _vis->GetPose();
-
-  math::Vector3 origin1, dir1, p1;
-  math::Vector3 origin2, dir2, p2;
-
-  // Cast two rays from the camera into the world
-  this->userCamera->GetCameraToViewportRay(this->mouseEvent.pos.x,
-      this->mouseEvent.pos.y, origin1, dir1);
-  this->userCamera->GetCameraToViewportRay(this->mouseEvent.pressPos.x,
-      this->mouseEvent.pressPos.y, origin2, dir2);
-
-  math::Vector3 moveVector(0, 0, 0);
-  math::Vector3 planeNorm(0, 0, 1);
-
-  if (this->keyText == "z")
-  {
-    math::Vector2i diff = this->mouseEvent.pos - this->mouseEvent.pressPos;
-    pose.pos.z = this->mouseMoveVisStartPose.pos.z + diff.y * -0.01;
-    _vis->SetPose(pose);
-    return;
-  }
-  else if (this->keyText == "x")
-  {
-    moveVector.x = 1;
-  }
-  else if (this->keyText == "y")
-  {
-    moveVector.y = 1;
-  }
-  else
-    moveVector.Set(1, 1, 0);
-
-  // Compute the distance from the camera to plane of translation
-  double d = pose.pos.Dot(planeNorm);
-  math::Plane plane(planeNorm, d);
-  double dist1 = plane.Distance(origin1, dir1);
-  double dist2 = plane.Distance(origin2, dir2);
-
-  // Compute two points on the plane. The first point is the current
-  // mouse position, the second is the previous mouse position
-  p1 = origin1 + dir1 * dist1;
-  p2 = origin2 + dir2 * dist2;
-
-  moveVector *= p1 - p2;
-  pose.pos = this->mouseMoveVisStartPose.pos + moveVector;
-
-  if (this->mouseEvent.shift)
-  {
-    if (ceil(pose.pos.x) - pose.pos.x <= .4)
-        pose.pos.x = ceil(pose.pos.x);
-    else if (pose.pos.x - floor(pose.pos.x) <= .4)
-      pose.pos.x = floor(pose.pos.x);
-
-    if (ceil(pose.pos.y) - pose.pos.y <= .4)
-        pose.pos.y = ceil(pose.pos.y);
-    else if (pose.pos.y - floor(pose.pos.y) <= .4)
-      pose.pos.y = floor(pose.pos.y);
-
-    if (moveVector.z > 0.0)
-    {
-      if (ceil(pose.pos.z) - pose.pos.z <= .4)
-        pose.pos.z = ceil(pose.pos.z);
-      else if (pose.pos.z - floor(pose.pos.z) <= .4)
-        pose.pos.z = floor(pose.pos.z);
-    }
-  }
-
-  pose.pos.z = _vis->GetPose().pos.z;
-
-  _vis->SetPose(pose);
-}
-
-/////////////////////////////////////////////////
 void GLWidget::OnSelectionMsg(ConstSelectionPtr &_msg)
 {
   if (_msg->has_selected())
@@ -955,7 +857,6 @@ void GLWidget::OnSelectionMsg(ConstSelectionPtr &_msg)
     else
     {
       this->SetSelectedVisual(rendering::VisualPtr());
-      this->SetMouseMoveVisual(rendering::VisualPtr());
     }
   }
 }
@@ -977,15 +878,14 @@ void GLWidget::SetSelectedVisual(rendering::VisualPtr _vis)
 }
 
 /////////////////////////////////////////////////
-void GLWidget::SetMouseMoveVisual(rendering::VisualPtr _vis)
-{
-  this->mouseMoveVis = _vis;
-}
-
-/////////////////////////////////////////////////
 void GLWidget::OnManipMode(const std::string &_mode)
 {
   this->state = _mode;
+
+  if (this->selectedVis)
+    ModelManipulator::Instance()->SetAttachedVisual(this->selectedVis);
+
+  ModelManipulator::Instance()->SetManipulationMode(_mode);
 }
 
 /////////////////////////////////////////////////
@@ -997,7 +897,8 @@ void GLWidget::Paste(const std::string &_object)
     if (this->entityMaker)
       this->entityMaker->Stop();
 
-    this->modelMaker.InitFromModel(_object);
+    // \todo Put this back in when pasting is enabled again
+    // this->modelMaker.InitFromModel(_object);
     this->entityMaker = &this->modelMaker;
     this->entityMaker->Start(this->userCamera);
     gui::Events::manipMode("make_entity");
@@ -1005,32 +906,6 @@ void GLWidget::Paste(const std::string &_object)
 }
 
 /////////////////////////////////////////////////
-void GLWidget::PublishVisualPose(rendering::VisualPtr _vis)
-{
-  if (_vis)
-  {
-    // Check to see if the visual is a model.
-    if (gui::get_entity_id(_vis->GetName()))
-    {
-      msgs::Model msg;
-      msg.set_id(gui::get_entity_id(_vis->GetName()));
-      msg.set_name(_vis->GetName());
-
-      msgs::Set(msg.mutable_pose(), _vis->GetWorldPose());
-      this->modelPub->Publish(msg);
-    }
-    // Otherwise, check to see if the visual is a light
-    else if (this->scene->GetLight(_vis->GetName()))
-    {
-      msgs::Light msg;
-      msg.set_name(_vis->GetName());
-      msgs::Set(msg.mutable_pose(), _vis->GetWorldPose());
-      this->lightPub->Publish(msg);
-    }
-  }
-}
-
-/////////////////////////////////////////////////
 void GLWidget::ClearSelection()
 {
   if (this->hoverVis)
@@ -1049,7 +924,6 @@ void GLWidget::OnSetSelectedEntity(const std::string &_name,
                                    const std::string &_mode)
 
 {
-  std::map<std::string, unsigned int>::iterator iter;
   if (!_name.empty())
   {
     std::string name = _name;
@@ -1070,7 +944,7 @@ void GLWidget::OnSetSelectedEntity(const std::string &_name,
 /////////////////////////////////////////////////
 void GLWidget::PushHistory(const std::string &_visName, const math::Pose &_pose)
 {
-  if (this->moveHistory.size() == 0 ||
+  if (this->moveHistory.empty() ||
       this->moveHistory.back().first != _visName ||
       this->moveHistory.back().second != _pose)
   {
@@ -1081,7 +955,7 @@ void GLWidget::PushHistory(const std::string &_visName, const math::Pose &_pose)
 /////////////////////////////////////////////////
 void GLWidget::PopHistory()
 {
-  if (this->moveHistory.size() > 0)
+  if (!this->moveHistory.empty())
   {
     msgs::Model msg;
     msg.set_id(gui::get_entity_id(this->moveHistory.back().first));
@@ -1104,9 +978,8 @@ void GLWidget::OnRequest(ConstRequestPtr &_msg)
   {
     if (this->selectedVis && this->selectedVis->GetName() == _msg->data())
     {
+      this->selectedVis.reset();
       this->SetSelectedVisual(rendering::VisualPtr());
     }
-    if (this->mouseMoveVis && this->mouseMoveVis->GetName() == _msg->data())
-      this->SetMouseMoveVisual(rendering::VisualPtr());
   }
 }
diff --git a/gazebo/gui/GLWidget.hh b/gazebo/gui/GLWidget.hh
index 259b0c5..606b57d 100644
--- a/gazebo/gui/GLWidget.hh
+++ b/gazebo/gui/GLWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,36 +22,43 @@
 #include <utility>
 #include <list>
 
-#include "gui/qt.h"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/rendering/RenderTypes.hh"
 
-#include "transport/TransportTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
 
-#include "common/MouseEvent.hh"
-#include "common/Event.hh"
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/common/KeyEvent.hh"
+#include "gazebo/common/Event.hh"
 
-#include "math/Pose.hh"
+#include "gazebo/math/Pose.hh"
 
-#include "msgs/msgs.hh"
+#include "gazebo/msgs/msgs.hh"
 
-#include "gui/BoxMaker.hh"
-#include "gui/SphereMaker.hh"
-#include "gui/CylinderMaker.hh"
-#include "gui/MeshMaker.hh"
-#include "gui/ModelMaker.hh"
-#include "gui/LightMaker.hh"
+#include "gazebo/gui/BoxMaker.hh"
+#include "gazebo/gui/SphereMaker.hh"
+#include "gazebo/gui/CylinderMaker.hh"
+#include "gazebo/gui/MeshMaker.hh"
+#include "gazebo/gui/ModelMaker.hh"
+#include "gazebo/gui/LightMaker.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace gui
   {
-    class GLWidget : public QWidget
+    class GAZEBO_VISIBLE GLWidget : public QWidget
     {
       Q_OBJECT
 
       public: GLWidget(QWidget *_parent = 0);
       public: virtual ~GLWidget();
 
+      /// \brief View a scene in this widget.
+      /// This will use the scene's UserCamera to visualize the scene.
+      /// If a UserCamera does not exist, one is created with the
+      /// name "gzclient_camera".
+      /// \param[in] _scene Pointer to the scene to visualize.
       public: void ViewScene(rendering::ScenePtr _scene);
       public: rendering::UserCameraPtr GetCamera() const;
       public: rendering::ScenePtr GetScene() const;
@@ -78,27 +85,51 @@ namespace gazebo
 
       private: std::string GetOgreHandle() const;
 
+      /// \brief Callback for a mouse move event.
+      /// \param[in] _event The mouse move event
+      /// \return True if handled by this function.
+      private: bool OnMouseMove(const common::MouseEvent &_event);
+
+      /// \brief Process a normal mouse move event.
       private: void OnMouseMoveNormal();
-      private: void OnMouseMoveTranslate();
+
+      /// \brief Process a make object mouse move event.
       private: void OnMouseMoveMakeEntity();
 
+      /// \brief Callback for a mouse release event.
+      /// \param[in] _event The mouse release event
+      /// \return True if handled by this function.
+      private: bool OnMouseRelease(const common::MouseEvent &_event);
+
+      /// \brief Process a normal mouse release event.
       private: void OnMouseReleaseNormal();
-      private: void OnMouseReleaseTranslate();
+
+      /// \brief Process a make object mouse release event.
       private: void OnMouseReleaseMakeEntity();
 
+      /// \brief Callback for a mouse press event.
+      /// \param[in] _event The mouse press event
+      /// \return True if handled by this function.
+      private: bool OnMousePress(const common::MouseEvent &_event);
+
+      /// \brief Process a normal mouse press event.
       private: void OnMousePressNormal();
-      private: void OnMousePressTranslate();
-      private: void OnMousePressMakeEntity();
 
-      private: void OnRequest(ConstRequestPtr &_msg);
+      /// \brief Process a make object mouse presse event.
+      private: void OnMousePressMakeEntity();
 
-      private: void SmartMoveVisual(rendering::VisualPtr _vis);
+      /// \brief Callback for a mouse double click event.
+      /// \param[in] _event The mouse double click event
+      /// \return True if handled by this function.
+      private: bool OnMouseDoubleClick(const common::MouseEvent &_event);
 
+      private: void OnRequest(ConstRequestPtr &_msg);
       private: void OnCreateScene(const std::string &_name);
       private: void OnRemoveScene(const std::string &_name);
       private: void OnMoveMode(bool _mode);
       private: void OnCreateEntity(const std::string &_type,
                                    const std::string &_data);
+
       private: void OnFPS();
       private: void OnOrbit();
       private: void OnManipMode(const std::string &_mode);
@@ -106,14 +137,10 @@ namespace gazebo
       private: void OnSetSelectedEntity(const std::string &_name,
                                         const std::string &_mode);
 
-      private: void RotateEntity(rendering::VisualPtr &_vis);
-      private: void TranslateEntity(rendering::VisualPtr &_vis);
-
-      private: void OnMouseMoveVisual(const std::string &_visualName);
       private: void OnSelectionMsg(ConstSelectionPtr &_msg);
 
       private: bool eventFilter(QObject *_obj, QEvent *_event);
-      private: void PublishVisualPose(rendering::VisualPtr _vis);
+
       private: void ClearSelection();
 
       /// \brief Copy an object by name
@@ -127,10 +154,6 @@ namespace gazebo
       /// visual
       private: void SetSelectedVisual(rendering::VisualPtr _vis);
 
-      /// \brief Set the visual being moved, which will highlight the
-      /// visual
-      private: void SetMouseMoveVisual(rendering::VisualPtr _vis);
-
       private: int windowId;
 
       private: rendering::UserCameraPtr userCamera;
@@ -138,6 +161,9 @@ namespace gazebo
       private: QFrame *renderFrame;
       private: common::MouseEvent mouseEvent;
 
+      /// \brief The most recent keyboard event.
+      private: common::KeyEvent keyEvent;
+
       private: std::vector<event::ConnectionPtr> connections;
 
       private: EntityMaker *entityMaker;
@@ -150,23 +176,25 @@ namespace gazebo
       private: SpotLightMaker spotLightMaker;
       private: DirectionalLightMaker directionalLightMaker;
 
-      private: rendering::VisualPtr hoverVis, selectedVis, mouseMoveVis;
+      private: rendering::VisualPtr hoverVis, selectedVis;
 
       private: transport::NodePtr node;
       private: transport::PublisherPtr modelPub, factoryPub;
-      private: transport::PublisherPtr lightPub;
       private: transport::SubscriberPtr selectionSub, requestSub;
 
       private: std::string keyText;
       private: Qt::KeyboardModifiers keyModifiers;
       private: QPoint onShiftMousePos;
-      private: math::Pose mouseMoveVisStartPose;
 
       private: std::string copiedObject;
 
       private: std::string state;
 
       private: std::list<std::pair<std::string, math::Pose> > moveHistory;
+
+      /// \brief Flag that is set to true when GLWidget has responded to
+      ///  OnCreateScene
+      private: bool sceneCreated;
     };
   }
 }
diff --git a/gazebo/gui/Gui.cc b/gazebo/gui/Gui.cc
deleted file mode 100644
index 0462120..0000000
--- a/gazebo/gui/Gui.cc
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <signal.h>
-#include <boost/program_options.hpp>
-#include "gazebo/gui/qt.h"
-#include "gazebo/gazebo.hh"
-
-#include "gazebo/common/Console.hh"
-#include "gazebo/common/Plugin.hh"
-#include "gazebo/common/CommonTypes.hh"
-#include "gazebo/gui/MainWindow.hh"
-#include "gazebo/gui/ModelRightMenu.hh"
-#include "gazebo/gui/Gui.hh"
-
-// These are needed by QT. They need to stay valid during the entire
-// lifetime of the application, and argc > 0 and argv must contain one valid
-// character string
-int g_argc = 1;
-char **g_argv;
-
-namespace po = boost::program_options;
-po::variables_map vm;
-
-using namespace gazebo;
-
-gui::ModelRightMenu *g_modelRightMenu = NULL;
-
-std::string g_worldname = "default";
-
-QApplication *g_app;
-gui::MainWindow *g_main_win;
-rendering::UserCameraPtr g_active_camera;
-bool g_fullscreen = false;
-
-//////////////////////////////////////////////////
-void print_usage()
-{
-  fprintf(stderr, "Usage: gzclient [-h]\n");
-  fprintf(stderr, "  -h            : Print this message.\n");
-}
-
-//////////////////////////////////////////////////
-void signal_handler(int)
-{
-  gazebo::stop();
-  gazebo::gui::stop();
-}
-
-//////////////////////////////////////////////////
-bool parse_args(int _argc, char **_argv)
-{
-  if (signal(SIGINT, signal_handler) == SIG_ERR)
-  {
-    std::cerr << "signal(2) failed while setting up for SIGINT" << std::endl;
-    return false;
-  }
-
-  gazebo::print_version();
-
-  po::options_description v_desc("Allowed options");
-  v_desc.add_options()
-    ("help,h", "Produce this help message.")
-    ("gui-plugin,g", po::value<std::vector<std::string> >(), "Load a plugin.");
-
-  po::options_description desc("Allowed options");
-  desc.add(v_desc);
-
-  try
-  {
-    po::store(po::command_line_parser(_argc,
-          _argv).options(desc).allow_unregistered().run(), vm);
-    po::notify(vm);
-  } catch(boost::exception &_e)
-  {
-    std::cerr << "Error. Gui Invalid arguments\n";
-    return false;
-  }
-
-  if (vm.count("help"))
-  {
-    print_usage();
-    std::cerr << v_desc << "\n";
-    return false;
-  }
-
-  /// Load all the plugins specified on the command line
-  if (vm.count("gui-plugin"))
-  {
-    std::vector<std::string> pp =
-      vm["gui-plugin"].as<std::vector<std::string> >();
-
-    for (std::vector<std::string>::iterator iter = pp.begin();
-         iter != pp.end(); ++iter)
-    {
-      gazebo::add_plugin(*iter);
-    }
-  }
-
-  return true;
-}
-
-namespace gazebo
-{
-  namespace gui
-  {
-    void set_style()
-    {
-      QFile file(":/style.qss");
-      file.open(QFile::ReadOnly);
-      QString styleSheet = QLatin1String(file.readAll());
-      g_app->setStyleSheet(styleSheet);
-    }
-
-    /////////////////////////////////////////////////
-    void load()
-    {
-      g_modelRightMenu = new gui::ModelRightMenu();
-
-      rendering::load();
-      rendering::init();
-
-      g_argv = new char*[g_argc];
-      for (int i = 0; i < g_argc; i++)
-      {
-        g_argv[i] = new char[strlen("gazebo")];
-        snprintf(g_argv[i], strlen("gazebo"), "gazebo");
-      }
-
-      g_app = new QApplication(g_argc, g_argv);
-      set_style();
-
-      g_main_win = new gui::MainWindow();
-
-      g_main_win->Load();
-      g_main_win->resize(1024, 768);
-    }
-
-    /////////////////////////////////////////////////
-    void init()
-    {
-      g_main_win->show();
-      g_main_win->Init();
-    }
-
-    /////////////////////////////////////////////////
-    void fini()
-    {
-      gui::clear_active_camera();
-      rendering::fini();
-      fflush(stdout);
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-unsigned int gui::get_entity_id(const std::string &_name)
-{
-  return g_main_win->GetEntityId(_name);
-}
-
-/////////////////////////////////////////////////
-bool gui::run(int _argc, char **_argv)
-{
-  // Initialize the informational logger. This will log warnings, and errors.
-  gazebo::common::Console::Instance()->Init("gzclient.log");
-
-  if (!parse_args(_argc, _argv))
-    return false;
-
-  if (!gazebo::load())
-    return false;
-
-  gazebo::run();
-
-  gazebo::gui::load();
-  gazebo::gui::init();
-
-  if (!gazebo::init())
-    return false;
-
-  g_app->exec();
-
-  gazebo::fini();
-  gazebo::gui::fini();
-  return true;
-}
-
-/////////////////////////////////////////////////
-void gui::stop()
-{
-  gazebo::stop();
-  g_active_camera.reset();
-  g_app->quit();
-}
-
-/////////////////////////////////////////////////
-void gui::set_world(const std::string &_name)
-{
-  g_worldname = _name;
-}
-
-/////////////////////////////////////////////////
-std::string gui::get_world()
-{
-  return g_worldname;
-}
-
-/////////////////////////////////////////////////
-void gui::set_active_camera(rendering::UserCameraPtr _cam)
-{
-  g_active_camera = _cam;
-}
-
-/////////////////////////////////////////////////
-void gui::clear_active_camera()
-{
-  g_active_camera.reset();
-}
-
-/////////////////////////////////////////////////
-rendering::UserCameraPtr gui::get_active_camera()
-{
-  return g_active_camera;
-}
-
-/////////////////////////////////////////////////
-bool gui::has_entity_name(const std::string &_name)
-{
-  return g_main_win->HasEntityName(_name);
-}
diff --git a/gazebo/gui/Gui.hh b/gazebo/gui/Gui.hh
deleted file mode 100644
index f6bda03..0000000
--- a/gazebo/gui/Gui.hh
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef _GAZEBO_GUI_HH_
-#define _GAZEBO_GUI_HH_
-
-#include <string>
-#include "rendering/Rendering.hh"
-
-namespace gazebo
-{
-  namespace gui
-  {
-    bool run(int _argc, char **_argv);
-    void stop();
-
-    void set_world(const std::string& _name);
-    std::string get_world();
-
-    void set_active_camera(rendering::UserCameraPtr _cam);
-    rendering::UserCameraPtr get_active_camera();
-    void clear_active_camera();
-
-    unsigned int get_entity_id(const std::string &_name);
-    bool has_entity_name(const std::string &_name);
-  }
-}
-#endif
diff --git a/gazebo/gui/GuiEvents.cc b/gazebo/gui/GuiEvents.cc
index 07e5263..ec789af 100644
--- a/gazebo/gui/GuiEvents.cc
+++ b/gazebo/gui/GuiEvents.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  *
 */
 
-#include "gui/GuiEvents.hh"
+#include "gazebo/gui/GuiEvents.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -28,5 +28,5 @@ event::EventT<void ()> Events::fps;
 event::EventT<void ()> Events::orbit;
 event::EventT<void (std::string)> Events::keyPress;
 event::EventT<void (const msgs::Model &)> Events::modelUpdate;
-event::EventT<void (const common::MouseEvent &)> Events::mousePress;
-event::EventT<void (const common::MouseEvent &)> Events::mouseRelease;
+event::EventT<void (int)> Events::inputStepSize;
+event::EventT<void (const std::string &)> Events::follow;
diff --git a/gazebo/gui/GuiEvents.hh b/gazebo/gui/GuiEvents.hh
index 6c1d4d4..29e0ea4 100644
--- a/gazebo/gui/GuiEvents.hh
+++ b/gazebo/gui/GuiEvents.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,17 +18,18 @@
 #define _GUI_EVENTS_HH_
 
 #include <string>
-#include "common/Event.hh"
-#include "msgs/msgs.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace gui
   {
-    class Events
+    class GAZEBO_VISIBLE Events
     {
       /////////////////////////////////////////////////
-      /// \brief Connect a boost::slot the the add entity signal
+      /// \brief Connect a boost::slot the add entity signal
       public: template<typename T>
               static event::ConnectionPtr ConnectCreateEntity(T _subscriber)
               { return createEntity.Connect(_subscriber); }
@@ -36,26 +37,8 @@ namespace gazebo
                   event::ConnectionPtr _subscriber)
               { createEntity.Disconnect(_subscriber); }
 
-      /////////////////////////////////////////////////
-      public: template<typename T>
-              static event::ConnectionPtr ConnectMousePress(T _subscriber)
-              { return mousePress.Connect(_subscriber); }
-      public: static void DisconnectMousePress(
-                  event::ConnectionPtr _subscriber)
-              { mousePress.Disconnect(_subscriber); }
-
-      /////////////////////////////////////////////////
-      public: template<typename T>
-              static event::ConnectionPtr ConnectMouseRelease(T _subscriber)
-              { return mouseRelease.Connect(_subscriber); }
-      public: static void DisconnectMouseRelease(
-                  event::ConnectionPtr _subscriber)
-              { mouseRelease.Disconnect(_subscriber); }
-
-
-
       //////////////////////////////////////////////////////////////////////////
-      /// \brief Connect a boost::slot the the move mode signal
+      /// \brief Connect a boost::slot to the move mode signal
       public: template<typename T>
               static event::ConnectionPtr ConnectMoveMode(T _subscriber)
               { return moveMode.Connect(_subscriber); }
@@ -63,7 +46,7 @@ namespace gazebo
               { moveMode.Disconnect(_subscriber); }
 
       //////////////////////////////////////////////////////////////////////////
-      /// \brief Connect a boost::slot the the manip mode signal
+      /// \brief Connect a boost::slot to the manip mode signal
       public: template<typename T>
               static event::ConnectionPtr ConnectManipMode(T _subscriber)
               {return manipMode.Connect(_subscriber);}
@@ -71,28 +54,28 @@ namespace gazebo
               {manipMode.Disconnect(_subscriber);}
 
       //////////////////////////////////////////////////////////////////////////
-      /// \brief Connect a boost::slot the the fullscreen signal
+      /// \brief Connect a boost::slot to the fullscreen signal
       public: template<typename T>
               static event::ConnectionPtr ConnectFullScreen(T _subscriber)
               { return fullScreen.Connect(_subscriber); }
       public: static void DisconnectFullScreen(event::ConnectionPtr _subscriber)
               { fullScreen.Disconnect(_subscriber); }
       //////////////////////////////////////////////////////////////////////////
-      /// \brief Connect a boost::slot the the view FPS signal
+      /// \brief Connect a boost::slot to the view FPS signal
       public: template<typename T>
               static event::ConnectionPtr ConnectFPS(T _subscriber)
               { return fps.Connect(_subscriber); }
       public: static void DisconnectFPS(event::ConnectionPtr _subscriber)
               { fps.Disconnect(_subscriber); }
       //////////////////////////////////////////////////////////////////////////
-      /// \brief Connect a boost::slot the the view Orbit signal
+      /// \brief Connect a boost::slot to the view Orbit signal
       public: template<typename T>
               static event::ConnectionPtr ConnectOrbit(T _subscriber)
               { return orbit.Connect(_subscriber); }
       public: static void DisconnectOrbit(event::ConnectionPtr _subscriber)
               { orbit.Disconnect(_subscriber); }
       //////////////////////////////////////////////////////////////////////////
-      /// \brief Connect a boost::slot the the view KeyPress signal
+      /// \brief Connect a boost::slot to the view KeyPress signal
       public: template<typename T>
               static event::ConnectionPtr ConnectKeyPress(T _subscriber)
               { return keyPress.Connect(_subscriber); }
@@ -107,6 +90,24 @@ namespace gazebo
                   event::ConnectionPtr _subscriber)
               { modelUpdate.Disconnect(_subscriber); }
 
+      //////////////////////////////////////////////////////////////////////////
+      /// \brief Connect a boost::slot to the input step size signal
+      public: template<typename T>
+              static event::ConnectionPtr ConnectInputStepSize(T _subscriber)
+              { return inputStepSize.Connect(_subscriber); }
+      public: static void DisconnectInputStepSize(
+              event::ConnectionPtr _subscriber)
+              { inputStepSize.Disconnect(_subscriber); }
+
+      //////////////////////////////////////////////////////////////////////////
+      /// \brief Connect a boost::slot to the follow signal
+      public: template<typename T>
+              static event::ConnectionPtr ConnectFollow(T _subscriber)
+              { return follow.Connect(_subscriber); }
+      public: static void DisconnectFollow(
+              event::ConnectionPtr _subscriber)
+              { follow.Disconnect(_subscriber); }
+
       ///  that indicates the user is moving the camera
       public: static event::EventT<void (bool)>  moveMode;
 
@@ -121,11 +122,14 @@ namespace gazebo
       public: static event::EventT<void ()> fps;
       public: static event::EventT<void ()> orbit;
 
+      /// \brief Event triggered when the user follows a model. The model
+      /// name is given as the function parameter.
+      public: static event::EventT<void (const std::string &)> follow;
+
       public: static event::EventT<void (std::string)> keyPress;
-      public: static event::EventT<void (const common::MouseEvent &)>
-              mousePress;
-      public: static event::EventT<void (const common::MouseEvent &)>
-              mouseRelease;
+
+      /// \brief Step size changed event
+      public: static event::EventT<void (int)> inputStepSize;
     };
   }
 }
diff --git a/gazebo/gui/GuiIface.cc b/gazebo/gui/GuiIface.cc
new file mode 100644
index 0000000..aaeae50
--- /dev/null
+++ b/gazebo/gui/GuiIface.cc
@@ -0,0 +1,335 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <signal.h>
+#include <boost/program_options.hpp>
+#include <boost/property_tree/ini_parser.hpp>
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/gazebo.hh"
+
+#include "gazebo/common/ModelDatabase.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/gui/MainWindow.hh"
+#include "gazebo/gui/ModelRightMenu.hh"
+#include "gazebo/gui/GuiIface.hh"
+
+// These are needed by QT. They need to stay valid during the entire
+// lifetime of the application, and argc > 0 and argv must contain one valid
+// character string
+int g_argc = 1;
+char **g_argv;
+
+namespace po = boost::program_options;
+po::variables_map vm;
+
+boost::property_tree::ptree g_propTree;
+
+using namespace gazebo;
+
+gui::ModelRightMenu *g_modelRightMenu = NULL;
+
+std::string g_worldname = "default";
+
+QApplication *g_app;
+gui::MainWindow *g_main_win;
+rendering::UserCameraPtr g_active_camera;
+bool g_fullscreen = false;
+
+//////////////////////////////////////////////////
+void print_usage()
+{
+  std::cerr << "gzclient -- Gazebo GUI Client\n\n";
+  std::cerr << "`gzclient` [options]\n\n";
+  std::cerr << "Gazebo GUI client which allows visualization and user "
+    << "interaction.\n\n";
+}
+
+//////////////////////////////////////////////////
+void signal_handler(int)
+{
+  gazebo::gui::stop();
+  gazebo::shutdown();
+}
+
+//////////////////////////////////////////////////
+bool parse_args(int _argc, char **_argv)
+{
+  po::options_description v_desc("Options");
+  v_desc.add_options()
+    ("version,v", "Output version information.")
+    ("verbose", "Increase the messages written to the terminal.")
+    ("help,h", "Produce this help message.")
+    ("gui-plugin,g", po::value<std::vector<std::string> >(), "Load a plugin.");
+
+  po::options_description desc("Options");
+  desc.add(v_desc);
+
+  try
+  {
+    po::store(po::command_line_parser(_argc,
+          _argv).options(desc).allow_unregistered().run(), vm);
+    po::notify(vm);
+  } catch(boost::exception &_e)
+  {
+    std::cerr << "Error. Gui Invalid arguments\n";
+    return false;
+  }
+
+  if (vm.count("version"))
+  {
+    std::cout << GAZEBO_VERSION_HEADER << std::endl;
+    return false;
+  }
+
+  if (vm.count("help"))
+  {
+    print_usage();
+    std::cerr << v_desc << "\n";
+    return false;
+  }
+
+  if (vm.count("verbose"))
+  {
+    gazebo::printVersion();
+    gazebo::common::Console::SetQuiet(false);
+  }
+
+  /// Load all the plugins specified on the command line
+  if (vm.count("gui-plugin"))
+  {
+    std::vector<std::string> pp =
+      vm["gui-plugin"].as<std::vector<std::string> >();
+
+    for (std::vector<std::string>::iterator iter = pp.begin();
+         iter != pp.end(); ++iter)
+    {
+      gazebo::addPlugin(*iter);
+    }
+  }
+
+  return true;
+}
+
+namespace gazebo
+{
+  namespace gui
+  {
+    void set_style()
+    {
+      QFile file(":/style.qss");
+      file.open(QFile::ReadOnly);
+      QString styleSheet = QLatin1String(file.readAll());
+      g_app->setStyleSheet(styleSheet);
+    }
+
+    /////////////////////////////////////////////////
+    void fini()
+    {
+      // Cleanup model database.
+      common::ModelDatabase::Instance()->Fini();
+
+      gui::clear_active_camera();
+      rendering::fini();
+      fflush(stdout);
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void gui::init()
+{
+  g_modelRightMenu->Init();
+  g_main_win->show();
+  g_main_win->Init();
+}
+
+/////////////////////////////////////////////////
+bool gui::loadINI(const boost::filesystem::path &_file)
+{
+  bool result = true;
+
+  // Create the gui.ini file if it doesn't exist.
+  if (!boost::filesystem::exists(_file))
+  {
+    gui::setINIProperty("geometry.x", 0);
+    gui::setINIProperty("geometry.y", 0);
+    gui::saveINI(_file);
+  }
+
+  try
+  {
+    // Read all configuration properties
+    boost::property_tree::ini_parser::read_ini(_file.string(), g_propTree);
+  }
+  catch(...)
+  {
+    gzerr << "Unable to read configuration file " << _file << "\n";
+    result = false;
+  }
+
+  return result;
+}
+
+/////////////////////////////////////////////////
+bool gui::load()
+{
+  bool result = true;
+
+  // Get the HOME path
+  char *home = getenv("HOME");
+  if (home)
+  {
+    // Construct the path to gui.ini
+    boost::filesystem::path path = home;
+    path = path / ".gazebo" / "gui.ini";
+    result = gui::loadINI(path);
+  }
+  else
+  {
+    gzerr << "HOME environment variable not found. "
+      "Unable to read ~/.gazebo/gui.ini file.\n";
+    result = false;
+  }
+
+  g_modelRightMenu = new gui::ModelRightMenu();
+
+  rendering::load();
+  rendering::init();
+
+  g_argv = new char*[g_argc];
+  for (int i = 0; i < g_argc; i++)
+  {
+    g_argv[i] = new char[strlen("gazebo")];
+    snprintf(g_argv[i], strlen("gazebo"), "gazebo");
+  }
+
+  g_app = new QApplication(g_argc, g_argv);
+  set_style();
+
+  g_main_win = new gui::MainWindow();
+
+  g_main_win->Load();
+  g_main_win->resize(1024, 768);
+
+  return result;
+}
+
+/////////////////////////////////////////////////
+unsigned int gui::get_entity_id(const std::string &_name)
+{
+  return g_main_win->GetEntityId(_name);
+}
+
+/////////////////////////////////////////////////
+bool gui::run(int _argc, char **_argv)
+{
+  // Initialize the informational logger. This will log warnings, and errors.
+  gzLogInit("gzclient.log");
+
+  // Make sure the model database has started
+  gazebo::common::ModelDatabase::Instance()->Start();
+
+  if (!parse_args(_argc, _argv))
+    return false;
+
+  if (!gazebo::setupClient())
+    return false;
+
+  if (!gazebo::gui::load())
+    return false;
+
+  gazebo::gui::init();
+
+  // Now that we're about to run, install a signal handler to allow for
+  // graceful shutdown on Ctrl-C.
+  struct sigaction sigact;
+  sigact.sa_handler = signal_handler;
+  if (sigaction(SIGINT, &sigact, NULL))
+  {
+    std::cerr << "signal(2) failed while setting up for SIGINT" << std::endl;
+    return false;
+  }
+
+  g_app->exec();
+
+  gazebo::gui::fini();
+  gazebo::shutdown();
+  return true;
+}
+
+/////////////////////////////////////////////////
+void gui::stop()
+{
+  gazebo::shutdown();
+  g_active_camera.reset();
+  g_app->quit();
+}
+
+/////////////////////////////////////////////////
+void gui::set_world(const std::string &_name)
+{
+  g_worldname = _name;
+}
+
+/////////////////////////////////////////////////
+std::string gui::get_world()
+{
+  return g_worldname;
+}
+
+/////////////////////////////////////////////////
+void gui::set_active_camera(rendering::UserCameraPtr _cam)
+{
+  g_active_camera = _cam;
+}
+
+/////////////////////////////////////////////////
+void gui::clear_active_camera()
+{
+  g_active_camera.reset();
+}
+
+/////////////////////////////////////////////////
+rendering::UserCameraPtr gui::get_active_camera()
+{
+  return g_active_camera;
+}
+
+/////////////////////////////////////////////////
+bool gui::has_entity_name(const std::string &_name)
+{
+  return g_main_win->HasEntityName(_name);
+}
+
+/////////////////////////////////////////////////
+bool gui::saveINI(const boost::filesystem::path &_file)
+{
+  bool result = true;
+  try
+  {
+    boost::property_tree::ini_parser::write_ini(_file.string(), g_propTree);
+  }
+  catch(...)
+  {
+    gzerr << "Unable to save INI file[" << _file << "]\n";
+    result = false;
+  }
+  return result;
+}
diff --git a/gazebo/gui/GuiIface.hh b/gazebo/gui/GuiIface.hh
new file mode 100644
index 0000000..7cd9183
--- /dev/null
+++ b/gazebo/gui/GuiIface.hh
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_GUIIFACE_HH_
+#define _GAZEBO_GUIIFACE_HH_
+
+#include <string>
+#include <boost/property_tree/ptree.hpp>
+#include <boost/filesystem.hpp>
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/util/system.hh"
+
+extern GAZEBO_VISIBLE boost::property_tree::ptree g_propTree;
+namespace gazebo
+{
+  namespace gui
+  {
+    /// \brief Load the graphical interface.
+    /// \return True on success.
+    GAZEBO_VISIBLE
+    bool load();
+
+    GAZEBO_VISIBLE
+    void init();
+
+    GAZEBO_VISIBLE
+    bool run(int _argc, char **_argv);
+    GAZEBO_VISIBLE
+    void stop();
+
+    GAZEBO_VISIBLE
+    void set_world(const std::string& _name);
+    GAZEBO_VISIBLE
+    std::string get_world();
+
+    GAZEBO_VISIBLE
+    void set_active_camera(rendering::UserCameraPtr _cam);
+    GAZEBO_VISIBLE
+    rendering::UserCameraPtr get_active_camera();
+    GAZEBO_VISIBLE
+    void clear_active_camera();
+
+    GAZEBO_VISIBLE
+    unsigned int get_entity_id(const std::string &_name);
+    GAZEBO_VISIBLE
+    bool has_entity_name(const std::string &_name);
+
+    /// \brief Load an INI configuration file.
+    /// \param[in] _file Full path to the INI file.
+    /// \return True on success.
+    GAZEBO_VISIBLE
+    bool loadINI(const boost::filesystem::path &_file);
+
+    /// \brief Get a property from the GUI INI file.
+    /// \param[in] _key String based key[ SECTION.VALUE ]
+    /// \param[in] _default Default value to use if property is not found.
+    /// \return Property value for the key.
+    template<typename T>
+    GAZEBO_VISIBLE
+    T getINIProperty(const std::string &_key, const T &_default)
+    {
+      try
+      {
+        return g_propTree.get<T>(_key);
+      }
+      catch(...)
+      {
+      }
+
+      return _default;
+    }
+
+    /// \brief Set a value in the INI property tree. Note, this doesn't save
+    /// properties to disk.
+    /// \param[in] _key Key for the value, such as "geometry.x"
+    /// \param[in] _value Value for the key
+    /// \sa gui::saveINI
+    template<typename T>
+    GAZEBO_VISIBLE
+    bool setINIProperty(const std::string &_key, const T &_value)
+    {
+      g_propTree.put(_key, _value);
+      return true;
+    }
+
+    /// \brief Save the configuration parameters to file.
+    /// \param[in] _file Filename in which to write the values.
+    /// \return True on success.
+    GAZEBO_VISIBLE
+    bool saveINI(const boost::filesystem::path &_file);
+  }
+}
+#endif
diff --git a/gazebo/gui/GuiIface_TEST.cc b/gazebo/gui/GuiIface_TEST.cc
new file mode 100644
index 0000000..76317f6
--- /dev/null
+++ b/gazebo/gui/GuiIface_TEST.cc
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gui/GuiIface_TEST.hh"
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/common/ModelDatabase.hh"
+#include "test_config.h"
+
+/////////////////////////////////////////////////
+void GuiIface_TEST::noINIFile()
+{
+  // Get a temp directory
+  boost::filesystem::path path =
+    boost::filesystem::temp_directory_path() / "gazebo";
+  boost::filesystem::create_directories(path);
+
+  // Set the gui.ini filename
+  path /= "gui.ini";
+
+  // Make sure the INI file doesn't exist.
+  if (boost::filesystem::exists(path))
+    boost::filesystem::remove(path);
+
+  // This should create the INI file.
+  QVERIFY(gazebo::gui::loadINI(path));
+
+  int xPos = gazebo::gui::getINIProperty<int>("geometry.x", -10);
+  int yPos = gazebo::gui::getINIProperty<int>("geometry.y", -20);
+
+  int width = gazebo::gui::getINIProperty<int>("geometry.width", 100);
+  int height = gazebo::gui::getINIProperty<int>("geometry.height", 200);
+
+  // X and Y pos should return zeros.
+  QVERIFY(xPos == 0);
+  QVERIFY(yPos == 0);
+
+  // Width and height should return the default values.
+  QVERIFY(width == 100);
+  QVERIFY(height == 200);
+
+  gazebo::gui::stop();
+}
+
+/////////////////////////////////////////////////
+void GuiIface_TEST::setINIProperties()
+{
+  // Get a temp directory
+  boost::filesystem::path path =
+    boost::filesystem::temp_directory_path() / "gazebo";
+  boost::filesystem::create_directories(path);
+
+  // Set the gui.ini filename
+  path /= "gui.ini";
+
+  // This will create the INI file if it doesn't exist.
+  QVERIFY(gazebo::gui::loadINI(path));
+
+  // Get the original values.
+  int xPosOrig = gazebo::gui::getINIProperty<int>("geometry.x", 0);
+  int yPosOrig = gazebo::gui::getINIProperty<int>("geometry.y", 0);
+  int widthOrig = gazebo::gui::getINIProperty<int>("geometry.width", 0);
+  int heightOrig = gazebo::gui::getINIProperty<int>("geometry.height", 0);
+
+  // Set new values
+  gazebo::gui::setINIProperty("geometry.x", 100);
+  gazebo::gui::setINIProperty("geometry.y", 50);
+  gazebo::gui::setINIProperty("geometry.width", 800);
+  gazebo::gui::setINIProperty("geometry.height", 600);
+
+  // Get the new values
+  int xPos = gazebo::gui::getINIProperty<int>("geometry.x", 0);
+  int yPos = gazebo::gui::getINIProperty<int>("geometry.y", 0);
+  int width = gazebo::gui::getINIProperty<int>("geometry.width", 0);
+  int height = gazebo::gui::getINIProperty<int>("geometry.height", 0);
+
+  // Verify the new values are correct
+  QVERIFY(xPos == 100);
+  QVERIFY(yPos == 50);
+  QVERIFY(width == 800);
+  QVERIFY(height == 600);
+
+  // Reload the INI file, and read back the values.
+  QVERIFY(gazebo::gui::loadINI(path));
+  xPos = gazebo::gui::getINIProperty<int>("geometry.x", 0);
+  yPos = gazebo::gui::getINIProperty<int>("geometry.y", 0);
+  width = gazebo::gui::getINIProperty<int>("geometry.width", 0);
+  height = gazebo::gui::getINIProperty<int>("geometry.height", 0);
+
+  QVERIFY(xPos == xPosOrig);
+  QVERIFY(yPos == yPosOrig);
+  QVERIFY(width == widthOrig);
+  QVERIFY(height == heightOrig);
+
+  gazebo::gui::stop();
+}
+
+/////////////////////////////////////////////////
+void GuiIface_TEST::saveINIProperties()
+{
+  // Get a temp directory
+  boost::filesystem::path path =
+    boost::filesystem::temp_directory_path() / "gazebo";
+  boost::filesystem::create_directories(path);
+
+  // Set the gui.ini filename
+  path /= "gui.ini";
+
+  // This will create the INI file if it doesn't exist.
+  QVERIFY(gazebo::gui::loadINI(path));
+
+  // Set new values
+  gazebo::gui::setINIProperty("geometry.x", 100);
+  gazebo::gui::setINIProperty("geometry.y", 50);
+  gazebo::gui::setINIProperty("geometry.width", 800);
+  gazebo::gui::setINIProperty("geometry.height", 600);
+
+  // Get the new values
+  int xPos = gazebo::gui::getINIProperty<int>("geometry.x", 0);
+  int yPos = gazebo::gui::getINIProperty<int>("geometry.y", 0);
+  int width = gazebo::gui::getINIProperty<int>("geometry.width", 0);
+  int height = gazebo::gui::getINIProperty<int>("geometry.height", 0);
+
+  // Verify the new values are correct
+  QVERIFY(xPos == 100);
+  QVERIFY(yPos == 50);
+  QVERIFY(width == 800);
+  QVERIFY(height == 600);
+
+  // Save the values to disk
+  QVERIFY(gazebo::gui::saveINI(path));
+
+  // Reload the INI file, and read back the values.
+  QVERIFY(gazebo::gui::loadINI(path));
+  int xPosNew = gazebo::gui::getINIProperty<int>("geometry.x", 0);
+  int yPosNew = gazebo::gui::getINIProperty<int>("geometry.y", 0);
+  int widthNew = gazebo::gui::getINIProperty<int>("geometry.width", 0);
+  int heightNew = gazebo::gui::getINIProperty<int>("geometry.height", 0);
+
+  QVERIFY(xPos == xPosNew);
+  QVERIFY(yPos == yPosNew);
+  QVERIFY(width == widthNew);
+  QVERIFY(height == heightNew);
+
+  gazebo::gui::stop();
+}
+
+// Generate a main function for the test
+QTEST_MAIN(GuiIface_TEST)
diff --git a/gazebo/gui/GuiIface_TEST.hh b/gazebo/gui/GuiIface_TEST.hh
new file mode 100644
index 0000000..4157e27
--- /dev/null
+++ b/gazebo/gui/GuiIface_TEST.hh
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GUIIFACE_TEST_HH_
+#define _GUIIFACE_TEST_HH_
+
+#include "gazebo/gui/QTestFixture.hh"
+
+/// \brief A test class for the DataLogger widget.
+class GuiIface_TEST : public QTestFixture
+{
+  Q_OBJECT
+
+  /// \brief Test reading an INI file that doesn't exist.
+  private slots: void noINIFile();
+
+  /// \brief Test setting configuration properties.
+  private slots: void setINIProperties();
+
+  /// \brief Test savign configuration properties.
+  private slots: void saveINIProperties();
+};
+
+#endif
diff --git a/gazebo/gui/GuiTypes.hh b/gazebo/gui/GuiTypes.hh
index 53b5504..37a8fd5 100644
--- a/gazebo/gui/GuiTypes.hh
+++ b/gazebo/gui/GuiTypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _GUITYPES_HH_
 
 #include <boost/shared_ptr.hpp>
+#include "gazebo/util/system.hh"
 
 /// \file
 /// \ingroup gazebo_gui
diff --git a/gazebo/gui/IncrementalPlot.cc b/gazebo/gui/IncrementalPlot.cc
index aa5c32a..dafd10b 100644
--- a/gazebo/gui/IncrementalPlot.cc
+++ b/gazebo/gui/IncrementalPlot.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -301,12 +301,10 @@ void IncrementalPlot::Clear(const QString &_label)
 /////////////////////////////////////////////////
 void IncrementalPlot::Clear()
 {
-  CurveData *curveData = NULL;
-
   for (CurveMap::iterator iter = this->curves.begin();
        iter != this->curves.end(); ++iter)
   {
-    curveData = static_cast<CurveData *>(iter->second->data());
+    CurveData *curveData = static_cast<CurveData *>(iter->second->data());
     curveData->Clear();
     delete iter->second;
   }
diff --git a/gazebo/gui/IncrementalPlot.hh b/gazebo/gui/IncrementalPlot.hh
index 475b347..19c554e 100644
--- a/gazebo/gui/IncrementalPlot.hh
+++ b/gazebo/gui/IncrementalPlot.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
 #include "gazebo/math/Vector2d.hh"
 
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 class QwtPlotCurve;
 class QwtPlotDirectPainter;
@@ -36,7 +37,7 @@ namespace gazebo
   namespace gui
   {
     /// \brief A plotting widget that handles incremental addition of data.
-    class IncrementalPlot : public QwtPlot
+    class GAZEBO_VISIBLE IncrementalPlot : public QwtPlot
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/InsertModelWidget.cc b/gazebo/gui/InsertModelWidget.cc
index 8b2232f..f4827d2 100644
--- a/gazebo/gui/InsertModelWidget.cc
+++ b/gazebo/gui/InsertModelWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,45 +17,47 @@
 
 #include <boost/filesystem.hpp>
 #include <boost/lexical_cast.hpp>
+#include <sdf/sdf.hh>
 
-#include "sdf/sdf.hh"
-#include "common/SystemPaths.hh"
-#include "common/Console.hh"
-#include "common/ModelDatabase.hh"
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/ModelDatabase.hh"
 
-#include "rendering/Rendering.hh"
-#include "rendering/Scene.hh"
-#include "rendering/UserCamera.hh"
-#include "rendering/Visual.hh"
-#include "gui/Gui.hh"
-#include "gui/GuiEvents.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/GuiEvents.hh"
 
-#include "transport/Node.hh"
-#include "transport/Publisher.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
 
-#include "gui/InsertModelWidget.hh"
+#include "gazebo/gui/InsertModelWidgetPrivate.hh"
+#include "gazebo/gui/InsertModelWidget.hh"
 
 using namespace gazebo;
 using namespace gui;
 
 /////////////////////////////////////////////////
 InsertModelWidget::InsertModelWidget(QWidget *_parent)
-: QWidget(_parent)
+: QWidget(_parent), dataPtr(new InsertModelWidgetPrivate)
 {
   this->setObjectName("insertModel");
-  this->modelDatabaseItem = NULL;
+  this->dataPtr->modelDatabaseItem = NULL;
 
   QVBoxLayout *mainLayout = new QVBoxLayout;
-  this->fileTreeWidget = new QTreeWidget();
-  this->fileTreeWidget->setColumnCount(1);
-  this->fileTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
-  this->fileTreeWidget->header()->hide();
-  connect(this->fileTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)),
+  this->dataPtr->fileTreeWidget = new QTreeWidget();
+  this->dataPtr->fileTreeWidget->setColumnCount(1);
+  this->dataPtr->fileTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
+  this->dataPtr->fileTreeWidget->header()->hide();
+  connect(this->dataPtr->fileTreeWidget,
+      SIGNAL(itemClicked(QTreeWidgetItem *, int)),
       this, SLOT(OnModelSelection(QTreeWidgetItem *, int)));
 
   QFrame *frame = new QFrame;
   QVBoxLayout *frameLayout = new QVBoxLayout;
-  frameLayout->addWidget(this->fileTreeWidget, 0);
+  frameLayout->addWidget(this->dataPtr->fileTreeWidget, 0);
   frameLayout->setContentsMargins(0, 0, 0, 0);
   frame->setLayout(frameLayout);
 
@@ -64,24 +66,26 @@ InsertModelWidget::InsertModelWidget(QWidget *_parent)
   this->layout()->setContentsMargins(0, 0, 0, 0);
 
   // Create a system path watcher
-  this->watcher = new QFileSystemWatcher();
+  this->dataPtr->watcher = new QFileSystemWatcher();
 
   // Connect a callback that is triggered whenever a directory is changed.
-  connect(this->watcher, SIGNAL(directoryChanged(const QString &)),
+  connect(this->dataPtr->watcher, SIGNAL(directoryChanged(const QString &)),
           this, SLOT(OnDirectoryChanged(const QString &)));
 
   // Update the list of models on the local system.
   this->UpdateAllLocalPaths();
 
   // Create a top-level tree item for the path
-  this->modelDatabaseItem =
+  this->dataPtr->modelDatabaseItem =
     new QTreeWidgetItem(static_cast<QTreeWidgetItem*>(0),
         QStringList(QString("Connecting to model database...")));
-    this->fileTreeWidget->addTopLevelItem(this->modelDatabaseItem);
+  this->dataPtr->fileTreeWidget->addTopLevelItem(
+      this->dataPtr->modelDatabaseItem);
 
   /// Non-blocking call to get all the models in the database.
-  common::ModelDatabase::Instance()->GetModels(
-      boost::bind(&InsertModelWidget::OnModels, this, _1));
+  this->dataPtr->getModelsConnection =
+    common::ModelDatabase::Instance()->GetModels(
+        boost::bind(&InsertModelWidget::OnModels, this, _1));
 
   // Start a timer to check for the results from the ModelDatabase. We need
   // to do this so that the QT elements get added in the main thread.
@@ -91,38 +95,41 @@ InsertModelWidget::InsertModelWidget(QWidget *_parent)
 /////////////////////////////////////////////////
 InsertModelWidget::~InsertModelWidget()
 {
-  delete this->watcher;
+  delete this->dataPtr->watcher;
+  delete this->dataPtr;
+  this->dataPtr = NULL;
 }
 
 /////////////////////////////////////////////////
 void InsertModelWidget::Update()
 {
-  boost::mutex::scoped_lock lock(this->mutex);
+  boost::mutex::scoped_lock lock(this->dataPtr->mutex);
 
   // If the model database has call the OnModels callback function, then
   // add all the models from the database.
-  if (this->modelBuffer.size() > 0)
+  if (!this->dataPtr->modelBuffer.empty())
   {
     std::string uri = common::ModelDatabase::Instance()->GetURI();
-    this->modelDatabaseItem->setText(0,
+    this->dataPtr->modelDatabaseItem->setText(0,
         QString("%1").arg(QString::fromStdString(uri)));
 
-    if (!this->modelBuffer.empty())
+    if (!this->dataPtr->modelBuffer.empty())
     {
       for (std::map<std::string, std::string>::const_iterator iter =
-          this->modelBuffer.begin(); iter != this->modelBuffer.end(); ++iter)
+          this->dataPtr->modelBuffer.begin();
+          iter != this->dataPtr->modelBuffer.end(); ++iter)
       {
         // Add a child item for the model
         QTreeWidgetItem *childItem = new QTreeWidgetItem(
-            this->modelDatabaseItem,
+            this->dataPtr->modelDatabaseItem,
             QStringList(QString("%1").arg(
                 QString::fromStdString(iter->second))));
         childItem->setData(0, Qt::UserRole, QVariant(iter->first.c_str()));
-        this->fileTreeWidget->addTopLevelItem(childItem);
+        this->dataPtr->fileTreeWidget->addTopLevelItem(childItem);
       }
     }
 
-    this->modelBuffer.clear();
+    this->dataPtr->modelBuffer.clear();
   }
   else
     QTimer::singleShot(1000, this, SLOT(Update()));
@@ -134,8 +141,9 @@ void InsertModelWidget::Update()
 void InsertModelWidget::OnModels(
     const std::map<std::string, std::string> &_models)
 {
-  boost::mutex::scoped_lock lock(this->mutex);
-  this->modelBuffer = _models;
+  boost::mutex::scoped_lock lock(this->dataPtr->mutex);
+  this->dataPtr->modelBuffer = _models;
+  this->dataPtr->getModelsConnection.reset();
 }
 
 /////////////////////////////////////////////////
@@ -157,7 +165,7 @@ void InsertModelWidget::OnModelSelection(QTreeWidgetItem *_item,
       filename = common::ModelDatabase::Instance()->GetModelFile(path);
       gui::Events::createEntity("model", filename);
 
-      this->fileTreeWidget->clearSelection();
+      this->dataPtr->fileTreeWidget->clearSelection();
       QApplication::setOverrideCursor(Qt::ArrowCursor);
     }
   }
@@ -172,21 +180,21 @@ void InsertModelWidget::UpdateLocalPath(const std::string &_path)
   QString qpath = QString::fromStdString(_path);
   QTreeWidgetItem *topItem = NULL;
 
-  QList<QTreeWidgetItem *> matchList = this->fileTreeWidget->findItems(qpath,
-      Qt::MatchExactly);
+  QList<QTreeWidgetItem *> matchList =
+    this->dataPtr->fileTreeWidget->findItems(qpath, Qt::MatchExactly);
 
   boost::filesystem::path dir(_path);
 
   // Create a top-level tree item for the path
-  if (matchList.size() == 0)
+  if (matchList.empty())
   {
     topItem = new QTreeWidgetItem(
         static_cast<QTreeWidgetItem*>(0), QStringList(qpath));
-    this->fileTreeWidget->addTopLevelItem(topItem);
+    this->dataPtr->fileTreeWidget->addTopLevelItem(topItem);
 
     // Add the new path to the directory watcher
     if (boost::filesystem::exists(dir))
-      this->watcher->addPath(qpath);
+      this->dataPtr->watcher->addPath(qpath);
   }
   else
     topItem = matchList.first();
@@ -194,8 +202,6 @@ void InsertModelWidget::UpdateLocalPath(const std::string &_path)
   // Remove current items.
   topItem->takeChildren();
 
-  std::list<boost::filesystem::path> resultSet;
-
   if (boost::filesystem::exists(dir) &&
       boost::filesystem::is_directory(dir))
   {
@@ -217,17 +223,9 @@ void InsertModelWidget::UpdateLocalPath(const std::string &_path)
 
       if (!boost::filesystem::is_directory(fullPath))
       {
-        if (dIter->filename() == "manifest.xml")
-        {
-          boost::filesystem::path tmpPath = boost::filesystem::path(_path) /
-            "database.config";
-          gzwarn << "manifest.xml for a model database is deprecated. "
-                 << "Please rename " << fullPath <<  " to "
-                 << tmpPath << "\n";
-        }
-        else if (dIter->filename() != "database.config")
+        if (dIter->filename() != "database.config")
         {
-          gzwarn << "Invalid filename or directory[" << fullPath
+          gzlog << "Invalid filename or directory[" << fullPath
             << "] in GAZEBO_MODEL_PATH. It's not a good idea to put extra "
             << "files in a GAZEBO_MODEL_PATH because the file structure may"
             << " be modified by Gazebo.\n";
@@ -235,23 +233,18 @@ void InsertModelWidget::UpdateLocalPath(const std::string &_path)
         continue;
       }
 
-      // First try to get the GZ_MODEL_MANIFEST_FILENAME. If that file doesn't
-      // exist, try to get the deprecated version.
+      // Get the GZ_MODEL_MANIFEST_FILENAME.
       if (boost::filesystem::exists(manifest / GZ_MODEL_MANIFEST_FILENAME))
         manifest /= GZ_MODEL_MANIFEST_FILENAME;
       else if (boost::filesystem::exists(manifest / "manifest.xml"))
       {
-        gzwarn << "The manifest.xml for a Gazebo model is deprecated. "
-          << "Please rename manifest.xml to "
-          << GZ_MODEL_MANIFEST_FILENAME << " for model "
+        gzerr << "Missing " << GZ_MODEL_MANIFEST_FILENAME << " for model "
           << (*dIter) << "\n";
-
-        manifest /= "manifest.xml";
       }
 
       if (!boost::filesystem::exists(manifest) || manifest == fullPath)
       {
-        gzerr << "model.config file is missing in directory["
+        gzlog << "model.config file is missing in directory["
               << fullPath << "]\n";
         continue;
       }
@@ -272,13 +265,13 @@ void InsertModelWidget::UpdateLocalPath(const std::string &_path)
         childItem->setData(0, Qt::UserRole,
             QVariant((std::string("file://") + fullPath.string()).c_str()));
 
-        this->fileTreeWidget->addTopLevelItem(childItem);
+        this->dataPtr->fileTreeWidget->addTopLevelItem(childItem);
       }
     }
   }
 
   // Make all top-level items expanded. Trying to reduce mouse clicks.
-  this->fileTreeWidget->expandItem(topItem);
+  this->dataPtr->fileTreeWidget->expandItem(topItem);
 }
 
 /////////////////////////////////////////////////
diff --git a/gazebo/gui/InsertModelWidget.hh b/gazebo/gui/InsertModelWidget.hh
index d404185..3c8115d 100644
--- a/gazebo/gui/InsertModelWidget.hh
+++ b/gazebo/gui/InsertModelWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,9 +19,9 @@
 
 #include <string>
 #include <map>
-#include <boost/thread/mutex.hpp>
 
-#include "gui/qt.h"
+#include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 class QTreeWidget;
 class QTreeWidgetItem;
@@ -31,7 +31,10 @@ namespace gazebo
 {
   namespace gui
   {
-    class InsertModelWidget : public QWidget
+    /// \brief Private
+    class InsertModelWidgetPrivate;
+
+    class GAZEBO_VISIBLE InsertModelWidget : public QWidget
     {
       Q_OBJECT
 
@@ -65,20 +68,8 @@ namespace gazebo
       /// \param[in] _path The path to update.
       private: void UpdateLocalPath(const std::string &_path);
 
-      /// \brief Widget that display all the models that can be inserted.
-      private: QTreeWidget *fileTreeWidget;
-
-      /// \brief Tree item that is populated with models from the ModelDatabase.
-      private: QTreeWidgetItem *modelDatabaseItem;
-
-      /// \brief Mutex to protect the modelBuffer.
-      private: boost::mutex mutex;
-
-      /// \brief Buffer to hold the results from ModelDatabase::GetModels.
-      private: std::map<std::string, std::string> modelBuffer;
-
-      /// \brief A file/directory watcher.
-      private: QFileSystemWatcher *watcher;
+      /// \brief Private data pointer.
+      private: InsertModelWidgetPrivate *dataPtr;
     };
   }
 }
diff --git a/gazebo/gui/InsertModelWidgetPrivate.hh b/gazebo/gui/InsertModelWidgetPrivate.hh
new file mode 100644
index 0000000..89fb6a8
--- /dev/null
+++ b/gazebo/gui/InsertModelWidgetPrivate.hh
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2012-2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _INSERT_MODEL_WIDGET_PRIVATE_HH_
+#define _INSERT_MODEL_WIDGET_PRIVATE_HH_
+
+#include <string>
+#include <map>
+#include <boost/thread/mutex.hpp>
+
+#include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
+
+class QTreeWidget;
+class QTreeWidgetItem;
+class QFileSystemWatcher;
+
+namespace gazebo
+{
+  namespace gui
+  {
+    /// \brief Private class attributes for InsertModelWidget.
+    class GAZEBO_VISIBLE InsertModelWidgetPrivate
+    {
+      /// \brief Widget that display all the models that can be inserted.
+      public: QTreeWidget *fileTreeWidget;
+
+      /// \brief Tree item that is populated with models from the ModelDatabase.
+      public: QTreeWidgetItem *modelDatabaseItem;
+
+      /// \brief Mutex to protect the modelBuffer.
+      public: boost::mutex mutex;
+
+      /// \brief Buffer to hold the results from ModelDatabase::GetModels.
+      public: std::map<std::string, std::string> modelBuffer;
+
+      /// \brief A file/directory watcher.
+      public: QFileSystemWatcher *watcher;
+
+      /// \brief Callback reference count for retrieving models.
+      public: event::ConnectionPtr getModelsConnection;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/JointControlWidget.cc b/gazebo/gui/JointControlWidget.cc
index 58c9a52..d58fc0d 100644
--- a/gazebo/gui/JointControlWidget.cc
+++ b/gazebo/gui/JointControlWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,8 @@
  *
  */
 #include "gazebo/transport/Node.hh"
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
+#include "gazebo/gui/GuiIface.hh"
 #include "gazebo/gui/JointControlWidget.hh"
 
 using namespace gazebo;
@@ -251,8 +252,8 @@ void JointControlWidget::SetModelName(const std::string &_modelName)
     this->jointPub = this->node->Advertise<msgs::JointCmd>(
         std::string("~/") + _modelName + "/joint_cmd");
 
-    boost::shared_ptr<msgs::Response> response = transport::request("default",
-        "entity_info", _modelName);
+    boost::shared_ptr<msgs::Response> response = transport::request(
+        gui::get_world(), "entity_info", _modelName);
 
     if (response->response() != "error" &&
         response->type() == modelMsg.GetTypeName())
diff --git a/gazebo/gui/JointControlWidget.hh b/gazebo/gui/JointControlWidget.hh
index d876492..271f9a0 100644
--- a/gazebo/gui/JointControlWidget.hh
+++ b/gazebo/gui/JointControlWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include "gazebo/msgs/msgs.hh"
 #include "gazebo/gui/qt.h"
 #include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
     /// gui/JointControlWidget.hh
     /// \brief Widget to control joints via application of force, position
     /// PID controller, or velocity PID controller.
-    class JointControlWidget : public QWidget
+    class GAZEBO_VISIBLE JointControlWidget : public QWidget
     {
       Q_OBJECT
 
@@ -164,7 +165,7 @@ namespace gazebo
 
     /// \class JointForceControl JointForceControl gui/JointForceControl.hh
     /// \brief Widget to control joints via application of force
-    class JointForceControl : public QWidget
+    class GAZEBO_VISIBLE JointForceControl : public QWidget
     {
       Q_OBJECT
 
@@ -202,7 +203,7 @@ namespace gazebo
     /// \class JointPIDPosControl JointPIDPosControlgui/JointPIDPosControl.hh
     /// \brief Widget to control joints via application of position
     /// PID controller.
-    class JointPIDPosControl : public QWidget
+    class GAZEBO_VISIBLE JointPIDPosControl : public QWidget
     {
       Q_OBJECT
 
@@ -276,7 +277,7 @@ namespace gazebo
     /// \class JointPIDVelControl JointPIDVelControl gui/JointPIDVelControl.hh
     /// \brief Widget to control joints via application of a
     /// velocity PID controller.
-    class JointPIDVelControl : public QWidget
+    class GAZEBO_VISIBLE JointPIDVelControl : public QWidget
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/KeyEventHandler.cc b/gazebo/gui/KeyEventHandler.cc
new file mode 100644
index 0000000..73e0592
--- /dev/null
+++ b/gazebo/gui/KeyEventHandler.cc
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gui/KeyEventHandler.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+KeyEventHandler::KeyEventHandler()
+{
+}
+
+/////////////////////////////////////////////////
+KeyEventHandler::~KeyEventHandler()
+{
+}
+
+/////////////////////////////////////////////////
+void KeyEventHandler::AddPressFilter(const std::string &_name,
+    KeyEventFilter _filter)
+{
+  this->Add(_name, _filter, this->pressFilters);
+}
+
+/////////////////////////////////////////////////
+void KeyEventHandler::AddReleaseFilter(const std::string &_name,
+    KeyEventFilter _filter)
+{
+  this->Add(_name, _filter, this->releaseFilters);
+}
+
+/////////////////////////////////////////////////
+void KeyEventHandler::RemovePressFilter(const std::string &_name)
+{
+  this->Remove(_name, this->pressFilters);
+}
+
+/////////////////////////////////////////////////
+void KeyEventHandler::RemoveReleaseFilter(const std::string &_name)
+{
+  this->Remove(_name, this->releaseFilters);
+}
+
+/////////////////////////////////////////////////
+void KeyEventHandler::HandlePress(const common::KeyEvent &_event)
+{
+  this->Handle(_event, this->pressFilters);
+}
+
+/////////////////////////////////////////////////
+void KeyEventHandler::HandleRelease(const common::KeyEvent &_event)
+{
+  this->Handle(_event, this->releaseFilters);
+}
+
+/////////////////////////////////////////////////
+void KeyEventHandler::Add(const std::string &_name,
+    KeyEventFilter _filter, std::list<Filter> &_list)
+{
+  std::list<Filter>::iterator iter =
+    std::find(_list.begin(), _list.end(), _name);
+
+  if (iter == _list.end())
+    _list.push_front(Filter(_name, _filter));
+}
+
+/////////////////////////////////////////////////
+void KeyEventHandler::Remove(const std::string &_name,
+    std::list<Filter> &_list)
+{
+  _list.remove(Filter(_name, NULL));
+}
+
+/////////////////////////////////////////////////
+void KeyEventHandler::Handle(const common::KeyEvent &_event,
+    std::list<Filter> &_list)
+{
+  for (std::list<Filter>::iterator iter = _list.begin();
+       iter != _list.end(); ++iter)
+  {
+    if ((*iter).func(_event))
+      break;
+  }
+}
diff --git a/gazebo/gui/KeyEventHandler.hh b/gazebo/gui/KeyEventHandler.hh
new file mode 100644
index 0000000..865040a
--- /dev/null
+++ b/gazebo/gui/KeyEventHandler.hh
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _KEY_EVENT_HANDLER_HH_
+#define _KEY_EVENT_HANDLER_HH_
+
+#include <boost/function.hpp>
+#include <string>
+#include <list>
+
+#include "gazebo/common/SingletonT.hh"
+#include "gazebo/common/KeyEvent.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    /// \class KeyEventHandler KeyEventHandler.hh gui/Gui.hh
+    /// \brief Processes and filters keyboard events.
+    class GAZEBO_VISIBLE KeyEventHandler : public SingletonT<KeyEventHandler>
+    {
+      /// \def KeyEventFilter
+      /// \brief Key event function pointer.
+      public: typedef boost::function<bool (const common::KeyEvent &_event)>
+              KeyEventFilter;
+
+      /// \cond
+      /// \brief a class used to store key filters.
+      private: class Filter
+               {
+                 /// \brief Constructor
+                 /// \param[in] _name Name associated with the key filter
+                 /// \param[in] _func Key callback function.
+                 public: Filter(const std::string &_name,
+                                KeyEventFilter _func)
+                         : name(_name), func(_func) {}
+
+                 /// \brief Equality operator
+                 /// \param[in] _f Filter for compare
+                 /// \return True if _f.name == this->name
+                 public: bool operator==(const Filter &_f) const
+                         {
+                           return this->name == _f.name;
+                         }
+
+                 /// \brief Equality operator
+                 /// \param[in] _f Name of a filter for comparison
+                 /// \return True if _f == this->name
+                 public: bool operator==(const std::string &_f) const
+                         {
+                           return this->name == _f;
+                         }
+
+                 /// \brief Name of the key filter.
+                 public: std::string name;
+
+                 /// \brief Event callback function.
+                 public: KeyEventFilter func;
+               };
+
+      /// \brief Constructor
+      private: KeyEventHandler();
+
+      /// \brief Destructor
+      private: virtual ~KeyEventHandler();
+
+      /// \brief Add a filter to a key press event.
+      /// \param[in] _name Name associated with the filter.
+      /// \param[in] _filter Function to call when press event occurs.
+      public: void AddPressFilter(const std::string &_name,
+                  KeyEventFilter _filter);
+
+      /// \brief Add a filter to a key release event.
+      /// \param[in] _name Name associated with the filter.
+      /// \param[in] _filter Function to call when release event occurs.
+      public: void AddReleaseFilter(const std::string &_name,
+                  KeyEventFilter _filter);
+
+      /// \brief Remove a filter from a key press.
+      /// \param[in] _name Name associated with the filter to remove.
+      public: void RemovePressFilter(const std::string &_name);
+
+      /// \brief Remove a filter from a key release.
+      /// \param[in] _name Name associated with the filter to remove.
+      public: void RemoveReleaseFilter(const std::string &_name);
+
+      /// \brief Process a key press event.
+      /// \param[in] _event The key event.
+      public: void HandlePress(const common::KeyEvent &_event);
+
+      /// \brief Process a key release event.
+      /// \param[in] _event The key event.
+      public: void HandleRelease(const common::KeyEvent &_event);
+
+      /// \brief Helper function to add a named filter to an event list.
+      /// \param[in] _name Name associated with the _filter.
+      /// \param[in] _filter Filter function callback.
+      /// \param[in] _list List which receives the filter.
+      private: void Add(const std::string &_name, KeyEventFilter _filter,
+                   std::list<Filter> &_list);
+
+      /// \brief Helper function to remove a named filter from an event list.
+      /// \param[in] _name Name associated with the filter to remove.
+      /// \param[in] _list List which contains the filter to remove.
+      private: void Remove(const std::string &_name, std::list<Filter> &_list);
+
+      /// \brief Helper function to process a filters in an event list.
+      /// \param[in] _event Key event to process.
+      /// \param[in] _list List which contains the filters to process.
+      private: void Handle(const common::KeyEvent &_event,
+                   std::list<Filter> &_list);
+
+      /// \brief List of key press filters.
+      private: std::list<Filter> pressFilters;
+
+      /// \brief List of key release filters.
+      private: std::list<Filter> releaseFilters;
+
+      /// \brief This is a singleton class.
+      private: friend class SingletonT<KeyEventHandler>;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/LightMaker.cc b/gazebo/gui/LightMaker.cc
index d913189..cf2ee71 100644
--- a/gazebo/gui/LightMaker.cc
+++ b/gazebo/gui/LightMaker.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,14 +18,14 @@
 #include <iostream>
 #include <sstream>
 
-#include "transport/Node.hh"
-#include "gui/GuiEvents.hh"
-#include "common/MouseEvent.hh"
-#include "rendering/UserCamera.hh"
-#include "rendering/Light.hh"
-#include "rendering/Scene.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/Light.hh"
+#include "gazebo/rendering/Scene.hh"
 
-#include "gui/LightMaker.hh"
+#include "gazebo/gui/LightMaker.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -114,10 +114,7 @@ void LightMaker::OnMouseRelease(const common::MouseEvent &_event)
 // prevent code duplication.
 void LightMaker::OnMouseMove(const common::MouseEvent &_event)
 {
-  math::Vector3 pos = this->light->GetPosition();
-
   math::Vector3 origin1, dir1, p1;
-  math::Vector3 origin2, dir2, p2;
 
   // Cast two rays from the camera into the world
   this->camera->GetCameraToViewportRay(_event.pos.x, _event.pos.y,
@@ -131,21 +128,20 @@ void LightMaker::OnMouseMove(const common::MouseEvent &_event)
   // Compute two points on the plane. The first point is the current
   // mouse position, the second is the previous mouse position
   p1 = origin1 + dir1 * dist1;
-  pos = p1;
 
   if (!_event.shift)
   {
-    if (ceil(pos.x) - pos.x <= .4)
-      pos.x = ceil(pos.x);
-    else if (pos.x - floor(pos.x) <= .4)
-      pos.x = floor(pos.x);
-
-    if (ceil(pos.y) - pos.y <= .4)
-      pos.y = ceil(pos.y);
-    else if (pos.y - floor(pos.y) <= .4)
-      pos.y = floor(pos.y);
+    if (ceil(p1.x) - p1.x <= .4)
+      p1.x = ceil(p1.x);
+    else if (p1.x - floor(p1.x) <= .4)
+      p1.x = floor(p1.x);
+
+    if (ceil(p1.y) - p1.y <= .4)
+      p1.y = ceil(p1.y);
+    else if (p1.y - floor(p1.y) <= .4)
+      p1.y = floor(p1.y);
   }
-  pos.z = this->light->GetPosition().z;
+  p1.z = this->light->GetPosition().z;
 
-  this->light->SetPosition(pos);
+  this->light->SetPosition(p1);
 }
diff --git a/gazebo/gui/LightMaker.hh b/gazebo/gui/LightMaker.hh
index 94c21a6..da5162f 100644
--- a/gazebo/gui/LightMaker.hh
+++ b/gazebo/gui/LightMaker.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,9 @@
 
 #include <string>
 
-#include "msgs/msgs.hh"
-#include "gui/EntityMaker.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/gui/EntityMaker.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -31,7 +32,7 @@ namespace gazebo
 
   namespace gui
   {
-    class LightMaker : public EntityMaker
+    class GAZEBO_VISIBLE LightMaker : public EntityMaker
     {
       public: LightMaker();
 
@@ -54,7 +55,7 @@ namespace gazebo
       private: rendering::Light *light;
     };
 
-    class PointLightMaker : public LightMaker
+    class GAZEBO_VISIBLE PointLightMaker : public LightMaker
     {
       public: PointLightMaker() : LightMaker()
               {
@@ -64,7 +65,7 @@ namespace gazebo
               }
     };
 
-    class SpotLightMaker : public LightMaker
+    class GAZEBO_VISIBLE SpotLightMaker : public LightMaker
     {
       public: SpotLightMaker() : LightMaker()
               {
@@ -80,7 +81,7 @@ namespace gazebo
               }
     };
 
-    class DirectionalLightMaker : public LightMaker
+    class GAZEBO_VISIBLE DirectionalLightMaker : public LightMaker
     {
       public: DirectionalLightMaker() : LightMaker()
               {
diff --git a/gazebo/gui/MainWindow.cc b/gazebo/gui/MainWindow.cc
index 380db4f..740107c 100644
--- a/gazebo/gui/MainWindow.cc
+++ b/gazebo/gui/MainWindow.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,9 @@
  * limitations under the License.
  *
  */
-#include "gazebo_config.h"
+#include <sdf/sdf.hh>
+
+#include "gazebo/gazebo_config.h"
 
 #include "gazebo/gui/TopicSelector.hh"
 #include "gazebo/gui/DataLogger.hh"
@@ -28,13 +30,13 @@
 #include "gazebo/common/Events.hh"
 
 #include "gazebo/transport/Node.hh"
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 
 #include "gazebo/rendering/UserCamera.hh"
 #include "gazebo/rendering/RenderEvents.hh"
 
 #include "gazebo/gui/Actions.hh"
-#include "gazebo/gui/Gui.hh"
+#include "gazebo/gui/GuiIface.hh"
 #include "gazebo/gui/InsertModelWidget.hh"
 #include "gazebo/gui/ModelListWidget.hh"
 #include "gazebo/gui/RenderWidget.hh"
@@ -42,10 +44,10 @@
 #include "gazebo/gui/GLWidget.hh"
 #include "gazebo/gui/MainWindow.hh"
 #include "gazebo/gui/GuiEvents.hh"
-#include "gazebo/gui/building/BuildingEditorPalette.hh"
-#include "gazebo/gui/building/EditorEvents.hh"
+#include "gazebo/gui/building/BuildingEditor.hh"
+#include "gazebo/gui/terrain/TerrainEditor.hh"
+#include "gazebo/gui/model/ModelEditor.hh"
 
-#include "sdf/sdf.hh"
 
 #ifdef HAVE_QWT
 #include "gazebo/gui/Diagnostics.hh"
@@ -55,24 +57,30 @@
 using namespace gazebo;
 using namespace gui;
 
+#define MINIMUM_TAB_WIDTH 250
+
 extern bool g_fullscreen;
 
 /////////////////////////////////////////////////
 MainWindow::MainWindow()
   : renderWidget(0)
 {
+  this->menuLayout = NULL;
   this->menuBar = NULL;
   this->setObjectName("mainWindow");
 
+  // Do these things first.
+  {
+    this->CreateActions();
+  }
+
+  this->inputStepSize = 1;
   this->requestMsg = NULL;
+
   this->node = transport::NodePtr(new transport::Node());
   this->node->Init();
   gui::set_world(this->node->GetTopicNamespace());
 
-  (void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));
-  this->CreateActions();
-  this->CreateMenus();
-
   QWidget *mainWidget = new QWidget;
   QVBoxLayout *mainLayout = new QVBoxLayout;
   mainWidget->show();
@@ -80,27 +88,21 @@ MainWindow::MainWindow()
 
   this->setDockOptions(QMainWindow::AnimatedDocks);
 
+  this->leftColumn = new QStackedWidget(this);
+
   this->modelListWidget = new ModelListWidget(this);
   InsertModelWidget *insertModel = new InsertModelWidget(this);
 
-  int minimumTabWidth = 250;
   this->tabWidget = new QTabWidget();
   this->tabWidget->setObjectName("mainTab");
   this->tabWidget->addTab(this->modelListWidget, "World");
   this->tabWidget->addTab(insertModel, "Insert");
   this->tabWidget->setSizePolicy(QSizePolicy::Expanding,
                                  QSizePolicy::Expanding);
-  this->tabWidget->setMinimumWidth(minimumTabWidth);
-
-  this->buildingEditorPalette = new BuildingEditorPalette(this);
-  this->buildingEditorTabWidget = new QTabWidget();
-  this->buildingEditorTabWidget->setObjectName("buildingEditorTab");
-  this->buildingEditorTabWidget->addTab(
-      this->buildingEditorPalette, "Building Editor");
-  this->buildingEditorTabWidget->setSizePolicy(QSizePolicy::Expanding,
-                                        QSizePolicy::Expanding);
-  this->buildingEditorTabWidget->setMinimumWidth(minimumTabWidth);
-  this->buildingEditorTabWidget->hide();
+  this->tabWidget->setMinimumWidth(MINIMUM_TAB_WIDTH);
+  this->AddToLeftColumn("default", this->tabWidget);
+
+  this->CreateEditors();
 
   this->toolsWidget = new ToolsWidget();
 
@@ -109,23 +111,19 @@ MainWindow::MainWindow()
   QHBoxLayout *centerLayout = new QHBoxLayout;
 
   QSplitter *splitter = new QSplitter(this);
-  splitter->addWidget(this->tabWidget);
-  splitter->addWidget(this->buildingEditorTabWidget);
+  splitter->addWidget(this->leftColumn);
   splitter->addWidget(this->renderWidget);
   splitter->addWidget(this->toolsWidget);
 
   QList<int> sizes;
-
-  sizes.push_back(250);
-  sizes.push_back(250);
-  sizes.push_back(this->width() - 250);
+  sizes.push_back(MINIMUM_TAB_WIDTH);
+  sizes.push_back(this->width() - MINIMUM_TAB_WIDTH);
   sizes.push_back(0);
   splitter->setSizes(sizes);
 
   splitter->setStretchFactor(0, 0);
-  splitter->setStretchFactor(1, 0);
-  splitter->setStretchFactor(2, 2);
-  splitter->setStretchFactor(3, 0);
+  splitter->setStretchFactor(1, 2);
+  splitter->setStretchFactor(2, 0);
   splitter->setCollapsible(2, false);
   splitter->setHandleWidth(10);
 
@@ -142,8 +140,7 @@ MainWindow::MainWindow()
 
   this->setWindowIcon(QIcon(":/images/gazebo.svg"));
 
-  std::string title = "Gazebo : ";
-  title += gui::get_world();
+  std::string title = "Gazebo";
   this->setWindowIconText(tr(title.c_str()));
   this->setWindowTitle(tr(title.c_str()));
 
@@ -164,10 +161,20 @@ MainWindow::MainWindow()
        boost::bind(&MainWindow::OnSetSelectedEntity, this, _1, _2)));
 
   this->connections.push_back(
-      gui::editor::Events::ConnectFinishBuildingModel(
-      boost::bind(&MainWindow::OnFinishBuilding, this)));
+      gui::Events::ConnectInputStepSize(
+      boost::bind(&MainWindow::OnInputStepSizeChanged, this, _1)));
+
+  this->connections.push_back(
+      gui::Events::ConnectFollow(
+        boost::bind(&MainWindow::OnFollow, this, _1)));
 
   gui::ViewFactory::RegisterAll();
+
+  // Do these things last
+  {
+    (void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));
+    this->CreateMenus();
+  }
 }
 
 /////////////////////////////////////////////////
@@ -186,13 +193,21 @@ void MainWindow::Init()
 {
   this->renderWidget->show();
 
-  // Set the initial size of the window to 0.75 the desktop size,
-  // with a minimum value of 1024x768.
-  QSize winSize = QApplication::desktop()->size() * 0.75;
-  winSize.setWidth(std::max(1024, winSize.width()));
-  winSize.setHeight(std::max(768, winSize.height()));
+  // Default window size is entire desktop.
+  QSize winSize = QApplication::desktop()->size();
+
+  // Get the size properties from the INI file.
+  int winWidth = getINIProperty<int>("geometry.width", winSize.width());
+  int winHeight = getINIProperty<int>("geometry.height", winSize.height());
+
+  winWidth = winWidth < 0 ? winSize.width() : winWidth;
+  winHeight = winHeight < 0 ? winSize.height() : winHeight;
+
+  // Get the position properties from the INI file.
+  int winXPos = getINIProperty<int>("geometry.x", 0);
+  int winYPos = getINIProperty<int>("geometry.y", 0);
 
-  this->resize(winSize);
+  this->setGeometry(winXPos, winYPos, winWidth, winHeight);
 
   this->worldControlPub =
     this->node->Advertise<msgs::WorldControl>("~/world_control");
@@ -223,7 +238,6 @@ void MainWindow::Init()
 /////////////////////////////////////////////////
 void MainWindow::closeEvent(QCloseEvent * /*_event*/)
 {
-  gazebo::stop();
   this->renderWidget->hide();
   this->tabWidget->hide();
   this->toolsWidget->hide();
@@ -231,6 +245,8 @@ void MainWindow::closeEvent(QCloseEvent * /*_event*/)
   this->connections.clear();
 
   delete this->renderWidget;
+
+  gazebo::shutdown();
 }
 
 /////////////////////////////////////////////////
@@ -303,6 +319,31 @@ void MainWindow::Import()
 }
 
 /////////////////////////////////////////////////
+void MainWindow::SaveINI()
+{
+  char *home = getenv("HOME");
+  if (!home)
+  {
+    gzerr << "HOME environment variable not found. "
+      "Unable to save configuration file\n";
+    return;
+  }
+
+  boost::filesystem::path path = home;
+  path = path / ".gazebo" / "gui.ini";
+
+  // When/if the configuration gets more complex, create a
+  // configuration manager class so that all key-value pairs are kept
+  // in a centralized place with error checking.
+  setINIProperty("geometry.width", this->width());
+  setINIProperty("geometry.height", this->height());
+  setINIProperty("geometry.x", this->x());
+  setINIProperty("geometry.y", this->y());
+
+  gui::saveINI(path);
+}
+
+/////////////////////////////////////////////////
 void MainWindow::SaveAs()
 {
   std::string filename = QFileDialog::getSaveFileName(this,
@@ -448,7 +489,8 @@ void MainWindow::Play()
   msgs::WorldControl msg;
   msg.set_pause(false);
 
-  g_pauseAct->setChecked(false);
+  g_pauseAct->setVisible(true);
+  g_playAct->setVisible(false);
   this->worldControlPub->Publish(msg);
 }
 
@@ -458,7 +500,8 @@ void MainWindow::Pause()
   msgs::WorldControl msg;
   msg.set_pause(true);
 
-  g_playAct->setChecked(false);
+  g_pauseAct->setVisible(false);
+  g_playAct->setVisible(true);
   this->worldControlPub->Publish(msg);
 }
 
@@ -466,12 +509,34 @@ void MainWindow::Pause()
 void MainWindow::Step()
 {
   msgs::WorldControl msg;
-  msg.set_step(true);
+  msg.set_multi_step(this->inputStepSize);
 
   this->worldControlPub->Publish(msg);
 }
 
 /////////////////////////////////////////////////
+void MainWindow::OnInputStepSizeChanged(int _value)
+{
+  this->inputStepSize = _value;
+}
+
+/////////////////////////////////////////////////
+void MainWindow::OnFollow(const std::string &_modelName)
+{
+  if (_modelName.empty())
+  {
+    this->renderWidget->DisplayOverlayMsg("", 0);
+    this->editMenu->setEnabled(true);
+  }
+  else
+  {
+    this->renderWidget->DisplayOverlayMsg(
+        "Press Escape to exit Follow mode", 0);
+    this->editMenu->setEnabled(false);
+  }
+}
+
+/////////////////////////////////////////////////
 void MainWindow::NewModel()
 {
   /*ModelBuilderWidget *modelBuilder = new ModelBuilderWidget();
@@ -500,28 +565,6 @@ void MainWindow::OnResetWorld()
 }
 
 /////////////////////////////////////////////////
-void MainWindow::OnEditBuilding()
-{
-  bool isChecked = g_editBuildingAct->isChecked();
-  if (isChecked)
-  {
-    this->Pause();
-    this->renderWidget->ShowEditor(true);
-    this->tabWidget->hide();
-    this->buildingEditorTabWidget->show();
-    this->AttachEditorMenuBar();
-  }
-  else
-  {
-    this->renderWidget->ShowEditor(false);
-    this->tabWidget->show();
-    this->buildingEditorTabWidget->hide();
-    this->AttachMainMenuBar();
-    this->Play();
-  }
-}
-
-/////////////////////////////////////////////////
 void MainWindow::Arrow()
 {
   gui::Events::manipMode("select");
@@ -540,6 +583,12 @@ void MainWindow::Rotate()
 }
 
 /////////////////////////////////////////////////
+void MainWindow::Scale()
+{
+  gui::Events::manipMode("scale");
+}
+
+/////////////////////////////////////////////////
 void MainWindow::CreateBox()
 {
   g_arrowAct->setChecked(true);
@@ -609,7 +658,7 @@ void MainWindow::OnFullScreen(bool _value)
   {
     this->showFullScreen();
     this->renderWidget->showFullScreen();
-    this->tabWidget->hide();
+    this->leftColumn->hide();
     this->toolsWidget->hide();
     this->menuBar->hide();
   }
@@ -617,8 +666,7 @@ void MainWindow::OnFullScreen(bool _value)
   {
     this->showNormal();
     this->renderWidget->showNormal();
-    if (!g_editBuildingAct->isChecked())
-      this->tabWidget->show();
+    this->leftColumn->show();
     this->toolsWidget->show();
     this->menuBar->show();
   }
@@ -653,7 +701,7 @@ void MainWindow::ShowCollisions()
 void MainWindow::ShowGrid()
 {
   msgs::Scene msg;
-  msg.set_name("default");
+  msg.set_name(gui::get_world());
   msg.set_grid(g_showGridAct->isChecked());
   this->scenePub->Publish(msg);
 }
@@ -739,30 +787,6 @@ void MainWindow::DataLogger()
   dataLogger->show();
 }
 
-////////////////////////////////////////////////
-void MainWindow::BuildingEditorSave()
-{
-  gui::editor::Events::saveBuildingEditor();
-}
-
-/////////////////////////////////////////////////
-void MainWindow::BuildingEditorDiscard()
-{
-  gui::editor::Events::discardBuildingEditor();
-}
-
-/////////////////////////////////////////////////
-void MainWindow::BuildingEditorDone()
-{
-  gui::editor::Events::doneBuildingEditor();
-}
-
-/////////////////////////////////////////////////
-void MainWindow::BuildingEditorExit()
-{
-  gui::editor::Events::exitBuildingEditor();
-}
-
 /////////////////////////////////////////////////
 void MainWindow::CreateActions()
 {
@@ -807,6 +831,10 @@ void MainWindow::CreateActions()
   g_saveAsAct->setStatusTip(tr("Save world to new file"));
   connect(g_saveAsAct, SIGNAL(triggered()), this, SLOT(SaveAs()));
 
+  g_saveCfgAct = new QAction(tr("Save &Configuration"), this);
+  g_saveCfgAct->setStatusTip(tr("Save GUI configuration"));
+  connect(g_saveCfgAct, SIGNAL(triggered()), this, SLOT(SaveINI()));
+
   g_aboutAct = new QAction(tr("&About"), this);
   g_aboutAct->setStatusTip(tr("Show the about info"));
   connect(g_aboutAct, SIGNAL(triggered()), this, SLOT(About()));
@@ -831,55 +859,82 @@ void MainWindow::CreateActions()
   g_resetWorldAct->setStatusTip(tr("Reset the world"));
   connect(g_resetWorldAct, SIGNAL(triggered()), this, SLOT(OnResetWorld()));
 
-  g_editBuildingAct = new QAction(tr("&Building Editor"), this);
+  QActionGroup *editorGroup = new QActionGroup(this);
+
+  g_editBuildingAct = new QAction(tr("&Building Editor"), editorGroup);
   g_editBuildingAct->setShortcut(tr("Ctrl+B"));
   g_editBuildingAct->setStatusTip(tr("Enter Building Editor Mode"));
   g_editBuildingAct->setCheckable(true);
   g_editBuildingAct->setChecked(false);
-  connect(g_editBuildingAct, SIGNAL(triggered()), this, SLOT(OnEditBuilding()));
+
+  g_editTerrainAct = new QAction(tr("&Terrain Editor"), editorGroup);
+  g_editTerrainAct->setShortcut(tr("Ctrl+E"));
+  g_editTerrainAct->setStatusTip(tr("Enter Terrain Editor Mode"));
+  g_editTerrainAct->setCheckable(true);
+  g_editTerrainAct->setChecked(false);
+
+  g_editModelAct = new QAction(tr("&Model Editor"), editorGroup);
+  g_editModelAct->setShortcut(tr("Ctrl+M"));
+  g_editModelAct->setStatusTip(tr("Enter Model Editor Mode"));
+  g_editModelAct->setCheckable(true);
+  g_editModelAct->setChecked(false);
+
+  g_stepAct = new QAction(QIcon(":/images/end.png"), tr("Step"), this);
+  g_stepAct->setStatusTip(tr("Step the world"));
+  connect(g_stepAct, SIGNAL(triggered()), this, SLOT(Step()));
+  this->CreateDisabledIcon(":/images/end.png", g_stepAct);
 
   g_playAct = new QAction(QIcon(":/images/play.png"), tr("Play"), this);
   g_playAct->setStatusTip(tr("Run the world"));
-  g_playAct->setCheckable(true);
-  g_playAct->setChecked(true);
+  g_playAct->setVisible(false);
   connect(g_playAct, SIGNAL(triggered()), this, SLOT(Play()));
+  connect(g_playAct, SIGNAL(changed()), this, SLOT(OnPlayActionChanged()));
+  this->OnPlayActionChanged();
 
   g_pauseAct = new QAction(QIcon(":/images/pause.png"), tr("Pause"), this);
   g_pauseAct->setStatusTip(tr("Pause the world"));
-  g_pauseAct->setCheckable(true);
-  g_pauseAct->setChecked(false);
+  g_pauseAct->setVisible(true);
   connect(g_pauseAct, SIGNAL(triggered()), this, SLOT(Pause()));
 
-  g_stepAct = new QAction(QIcon(":/images/end.png"), tr("Step"), this);
-  g_stepAct->setStatusTip(tr("Step the world"));
-  connect(g_stepAct, SIGNAL(triggered()), this, SLOT(Step()));
-
-
   g_arrowAct = new QAction(QIcon(":/images/arrow.png"),
       tr("Selection Mode"), this);
   g_arrowAct->setStatusTip(tr("Move camera"));
   g_arrowAct->setCheckable(true);
   g_arrowAct->setChecked(true);
+  g_arrowAct->setToolTip(tr("Selection Mode (Esc)"));
   connect(g_arrowAct, SIGNAL(triggered()), this, SLOT(Arrow()));
 
   g_translateAct = new QAction(QIcon(":/images/translate.png"),
-      tr("Translation Mode"), this);
+      tr("&Translation Mode"), this);
   g_translateAct->setStatusTip(tr("Translate an object"));
   g_translateAct->setCheckable(true);
   g_translateAct->setChecked(false);
+  g_translateAct->setToolTip(tr("Translation Mode (T)"));
   connect(g_translateAct, SIGNAL(triggered()), this, SLOT(Translate()));
+  this->CreateDisabledIcon(":/images/translate.png", g_translateAct);
 
   g_rotateAct = new QAction(QIcon(":/images/rotate.png"),
       tr("Rotation Mode"), this);
   g_rotateAct->setStatusTip(tr("Rotate an object"));
   g_rotateAct->setCheckable(true);
   g_rotateAct->setChecked(false);
+  g_rotateAct->setToolTip(tr("Rotation Mode (R)"));
   connect(g_rotateAct, SIGNAL(triggered()), this, SLOT(Rotate()));
+  this->CreateDisabledIcon(":/images/rotate.png", g_rotateAct);
+
+  g_scaleAct = new QAction(QIcon(":/images/scale.png"),
+      tr("Scale Mode"), this);
+  g_scaleAct->setStatusTip(tr("Scale an object"));
+  g_scaleAct->setCheckable(true);
+  g_scaleAct->setChecked(false);
+  g_scaleAct->setToolTip(tr("Scale Mode (S)"));
+  connect(g_scaleAct, SIGNAL(triggered()), this, SLOT(Scale()));
 
   g_boxCreateAct = new QAction(QIcon(":/images/box.png"), tr("Box"), this);
   g_boxCreateAct->setStatusTip(tr("Create a box"));
   g_boxCreateAct->setCheckable(true);
   connect(g_boxCreateAct, SIGNAL(triggered()), this, SLOT(CreateBox()));
+  this->CreateDisabledIcon(":/images/box.png", g_boxCreateAct);
 
   g_sphereCreateAct = new QAction(QIcon(":/images/sphere.png"),
       tr("Sphere"), this);
@@ -887,6 +942,7 @@ void MainWindow::CreateActions()
   g_sphereCreateAct->setCheckable(true);
   connect(g_sphereCreateAct, SIGNAL(triggered()), this,
       SLOT(CreateSphere()));
+  this->CreateDisabledIcon(":/images/sphere.png", g_sphereCreateAct);
 
   g_cylinderCreateAct = new QAction(QIcon(":/images/cylinder.png"),
       tr("Cylinder"), this);
@@ -894,6 +950,7 @@ void MainWindow::CreateActions()
   g_cylinderCreateAct->setCheckable(true);
   connect(g_cylinderCreateAct, SIGNAL(triggered()), this,
       SLOT(CreateCylinder()));
+  this->CreateDisabledIcon(":/images/cylinder.png", g_cylinderCreateAct);
 
   g_meshCreateAct = new QAction(QIcon(":/images/cylinder.png"),
       tr("Mesh"), this);
@@ -901,6 +958,7 @@ void MainWindow::CreateActions()
   g_meshCreateAct->setCheckable(true);
   connect(g_meshCreateAct, SIGNAL(triggered()), this,
       SLOT(CreateMesh()));
+  this->CreateDisabledIcon(":/images/cylinder.png", g_meshCreateAct);
 
 
   g_pointLghtCreateAct = new QAction(QIcon(":/images/pointlight.png"),
@@ -909,6 +967,7 @@ void MainWindow::CreateActions()
   g_pointLghtCreateAct->setCheckable(true);
   connect(g_pointLghtCreateAct, SIGNAL(triggered()), this,
       SLOT(CreatePointLight()));
+  this->CreateDisabledIcon(":/images/pointlight.png", g_pointLghtCreateAct);
 
   g_spotLghtCreateAct = new QAction(QIcon(":/images/spotlight.png"),
       tr("Spot Light"), this);
@@ -916,6 +975,7 @@ void MainWindow::CreateActions()
   g_spotLghtCreateAct->setCheckable(true);
   connect(g_spotLghtCreateAct, SIGNAL(triggered()), this,
       SLOT(CreateSpotLight()));
+  this->CreateDisabledIcon(":/images/spotlight.png", g_spotLghtCreateAct);
 
   g_dirLghtCreateAct = new QAction(QIcon(":/images/directionallight.png"),
       tr("Directional Light"), this);
@@ -923,6 +983,7 @@ void MainWindow::CreateActions()
   g_dirLghtCreateAct->setCheckable(true);
   connect(g_dirLghtCreateAct, SIGNAL(triggered()), this,
       SLOT(CreateDirectionalLight()));
+  this->CreateDisabledIcon(":/images/directionallight.png", g_dirLghtCreateAct);
 
   g_resetAct = new QAction(tr("Reset Camera"), this);
   g_resetAct->setStatusTip(tr("Move camera to pose"));
@@ -957,8 +1018,8 @@ void MainWindow::CreateActions()
   connect(g_viewWireframeAct, SIGNAL(triggered()), this,
           SLOT(SetWireframe()));
 
-  g_showCOMAct = new QAction(tr("Center of Mass"), this);
-  g_showCOMAct->setStatusTip(tr("Show COM"));
+  g_showCOMAct = new QAction(tr("Center of Mass / Inertia"), this);
+  g_showCOMAct->setStatusTip(tr("Show COM/MOI"));
   g_showCOMAct->setCheckable(true);
   g_showCOMAct->setChecked(false);
   connect(g_showCOMAct, SIGNAL(triggered()), this,
@@ -997,34 +1058,6 @@ void MainWindow::CreateActions()
   g_dataLoggerAct->setStatusTip(tr("Data Logging Utility"));
   connect(g_dataLoggerAct, SIGNAL(triggered()), this, SLOT(DataLogger()));
 
-  g_buildingEditorSaveAct = new QAction(tr("&Save (As)"), this);
-  g_buildingEditorSaveAct->setStatusTip(tr("Save (As)"));
-  g_buildingEditorSaveAct->setShortcut(tr("Ctrl+S"));
-  g_buildingEditorSaveAct->setCheckable(false);
-  connect(g_buildingEditorSaveAct, SIGNAL(triggered()), this,
-          SLOT(BuildingEditorSave()));
-
-  g_buildingEditorDiscardAct = new QAction(tr("&Discard"), this);
-  g_buildingEditorDiscardAct->setStatusTip(tr("Discard"));
-  g_buildingEditorDiscardAct->setShortcut(tr("Ctrl+D"));
-  g_buildingEditorDiscardAct->setCheckable(false);
-  connect(g_buildingEditorDiscardAct, SIGNAL(triggered()), this,
-          SLOT(BuildingEditorDiscard()));
-
-  g_buildingEditorDoneAct = new QAction(tr("Don&e"), this);
-  g_buildingEditorDoneAct->setShortcut(tr("Ctrl+E"));
-  g_buildingEditorDoneAct->setStatusTip(tr("Done"));
-  g_buildingEditorDoneAct->setCheckable(false);
-  connect(g_buildingEditorDoneAct, SIGNAL(triggered()), this,
-          SLOT(BuildingEditorDone()));
-
-  g_buildingEditorExitAct = new QAction(tr("E&xit Building Editor"), this);
-  g_buildingEditorExitAct->setStatusTip(tr("Exit Building Editor"));
-  g_buildingEditorExitAct->setShortcut(tr("Ctrl+X"));
-  g_buildingEditorExitAct->setCheckable(false);
-  connect(g_buildingEditorExitAct, SIGNAL(triggered()), this,
-          SLOT(BuildingEditorExit()));
-
   g_screenshotAct = new QAction(QIcon(":/images/screenshot.png"),
       tr("Screenshot"), this);
   g_screenshotAct->setStatusTip(tr("Take a screenshot"));
@@ -1033,37 +1066,42 @@ void MainWindow::CreateActions()
 }
 
 /////////////////////////////////////////////////
-void MainWindow::AttachEditorMenuBar()
+void MainWindow::ShowMenuBar(QMenuBar *_bar)
 {
-  if (this->menuBar)
+  if (!this->menuLayout)
+    this->menuLayout = new QHBoxLayout;
+
+  // Remove all widgets from the menubar
+  QLayoutItem *child = NULL;
+  while ((child = this->menuLayout->takeAt(0)) != 0)
   {
-    this->menuLayout->removeWidget(this->menuBar);
-    delete this->menuBar;
+    delete child;
   }
 
-  this->menuBar = new QMenuBar;
-  this->menuBar->setSizePolicy(QSizePolicy::Fixed,
-      QSizePolicy::Fixed);
-  QMenu *buildingEditorFileMenu = this->menuBar->addMenu(
-      tr("&File"));
-  buildingEditorFileMenu->addAction(g_buildingEditorSaveAct);
-  buildingEditorFileMenu->addAction(g_buildingEditorDiscardAct);
-  buildingEditorFileMenu->addAction(g_buildingEditorDoneAct);
-  buildingEditorFileMenu->addAction(g_buildingEditorExitAct);
+  if (!_bar)
+  {
+    this->CreateMenuBar();
+    this->menuLayout->addWidget(this->menuBar);
+    this->setMenuBar(this->menuBar);
+  }
+  else
+  {
+    if (this->menuBar)
+      this->menuBar->hide();
+    this->menuLayout->addWidget(_bar);
+  }
 
-  this->menuLayout->setMenuBar(this->menuBar);
+  this->menuLayout->addStretch(5);
+  this->menuLayout->setContentsMargins(0, 0, 0, 0);
 }
 
 /////////////////////////////////////////////////
-void MainWindow::AttachMainMenuBar()
+void MainWindow::CreateMenuBar()
 {
   if (this->menuBar)
-  {
-    this->menuLayout->removeWidget(this->menuBar);
     delete this->menuBar;
-  }
 
-  this->menuBar =  new QMenuBar;
+  this->menuBar = new QMenuBar;
   this->menuBar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
 
   QMenu *fileMenu = this->menuBar->addMenu(tr("&File"));
@@ -1073,13 +1111,21 @@ void MainWindow::AttachMainMenuBar()
   fileMenu->addAction(g_saveAct);
   fileMenu->addAction(g_saveAsAct);
   fileMenu->addSeparator();
+  fileMenu->addAction(g_saveCfgAct);
+  fileMenu->addSeparator();
   fileMenu->addAction(g_quitAct);
 
-  QMenu *editMenu = this->menuBar->addMenu(tr("&Edit"));
+  this->editMenu = this->menuBar->addMenu(tr("&Edit"));
   editMenu->addAction(g_resetModelsAct);
   editMenu->addAction(g_resetWorldAct);
   editMenu->addAction(g_editBuildingAct);
 
+  // \TODO: Add this back in when implementing the full Terrain Editor spec.
+  // editMenu->addAction(g_editTerrainAct);
+
+  // \TODO: Add this back in when implementing the full Model Editor spec.
+  editMenu->addAction(g_editModelAct);
+
   QMenu *viewMenu = this->menuBar->addMenu(tr("&View"));
   viewMenu->addAction(g_showGridAct);
   viewMenu->addSeparator();
@@ -1112,22 +1158,14 @@ void MainWindow::AttachMainMenuBar()
 
   QMenu *helpMenu = this->menuBar->addMenu(tr("&Help"));
   helpMenu->addAction(g_aboutAct);
-
-  this->menuLayout->setMenuBar(this->menuBar);
 }
 
 /////////////////////////////////////////////////
 void MainWindow::CreateMenus()
 {
-  this->menuLayout = new QHBoxLayout;
+  this->ShowMenuBar();
 
   QFrame *frame = new QFrame;
-
-  this->AttachMainMenuBar();
-
-  this->menuLayout->addStretch(5);
-  this->menuLayout->setContentsMargins(0, 0, 0, 0);
-
   frame->setLayout(this->menuLayout);
   frame->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
 
@@ -1188,6 +1226,7 @@ void MainWindow::OnGUI(ConstGUIPtr &_msg)
       math::Pose cam_pose(cam_pose_pos, cam_pose_rot);
 
       cam->SetWorldPose(cam_pose);
+      cam->SetUseSDFPose(true);
     }
 
     if (_msg->camera().has_view_controller())
@@ -1331,23 +1370,31 @@ void MainWindow::OnSetSelectedEntity(const std::string &_name,
 /////////////////////////////////////////////////
 void MainWindow::OnStats(ConstWorldStatisticsPtr &_msg)
 {
-  if (_msg->paused() && g_playAct->isChecked())
+  if (_msg->paused() && g_pauseAct->isVisible())
   {
-    g_playAct->setChecked(false);
-    g_pauseAct->setChecked(true);
+    g_pauseAct->setVisible(false);
+    g_playAct->setVisible(true);
   }
-  else if (!_msg->paused() && !g_playAct->isChecked())
+  else if (!_msg->paused() && !g_playAct->isVisible())
   {
-    g_playAct->setChecked(true);
-    g_pauseAct->setChecked(false);
+    g_pauseAct->setVisible(true);
+    g_playAct->setVisible(false);
   }
 }
 
 /////////////////////////////////////////////////
-void MainWindow::OnFinishBuilding()
+void MainWindow::OnPlayActionChanged()
 {
-  g_editBuildingAct->setChecked(!g_editBuildingAct->isChecked());
-  this->OnEditBuilding();
+  if (g_playAct->isVisible())
+  {
+    g_stepAct->setToolTip("Step the world");
+    g_stepAct->setEnabled(true);
+  }
+  else
+  {
+    g_stepAct->setToolTip("Pause the world before stepping");
+    g_stepAct->setEnabled(false);
+  }
 }
 
 /////////////////////////////////////////////////
@@ -1357,83 +1404,53 @@ void MainWindow::ItemSelected(QTreeWidgetItem *_item, int)
 }
 
 /////////////////////////////////////////////////
-TreeViewDelegate::TreeViewDelegate(QTreeView *_view, QWidget *_parent)
-  : QItemDelegate(_parent), view(_view)
+void MainWindow::AddToLeftColumn(const std::string &_name, QWidget *_widget)
 {
+  this->leftColumn->addWidget(_widget);
+  this->leftColumnStack[_name] = this->leftColumn->count()-1;
 }
 
 /////////////////////////////////////////////////
-void TreeViewDelegate::paint(QPainter *painter,
-                          const QStyleOptionViewItem &option,
-                          const QModelIndex &index) const
+void MainWindow::ShowLeftColumnWidget(const std::string &_name)
 {
-  const QAbstractItemModel *model = index.model();
-  Q_ASSERT(model);
-
-  if (!model->parent(index).isValid())
-  {
-    QRect r = option.rect;
-
-    QColor orange(245, 129, 19);
-    QColor blue(71, 99, 183);
-    QColor grey(100, 100, 100);
-
-    if (option.state & QStyle::State_Open ||
-        option.state & QStyle::State_MouseOver)
-    {
-      painter->setPen(blue);
-      painter->setBrush(QBrush(blue));
-    }
-    else
-    {
-      painter->setPen(grey);
-      painter->setBrush(QBrush(grey));
-    }
-
-    if (option.state & QStyle::State_Open)
-      painter->drawLine(r.left()+8, r.top() + (r.height()*0.5 - 5),
-                        r.left()+8, r.top() + r.height()-1);
-
-    painter->save();
-    painter->setRenderHints(QPainter::Antialiasing |
-                            QPainter::TextAntialiasing);
-
-    painter->drawRoundedRect(r.left()+4, r.top() + (r.height()*0.5 - 5),
-                             10, 10, 20.0, 10.0, Qt::RelativeSize);
-
+  std::map<std::string, int>::iterator iter = this->leftColumnStack.find(_name);
 
-    // draw text
-    QRect textrect = QRect(r.left() + 20, r.top(),
-                           r.width() - 40,
-                           r.height());
+  if (iter != this->leftColumnStack.end())
+    this->leftColumn->setCurrentIndex(iter->second);
+  else
+    gzerr << "Widget with name[" << _name << "] has not been added to the left"
+      << " column stack.\n";
+}
 
-    QString text = elidedText(
-        option.fontMetrics,
-        textrect.width(),
-        Qt::ElideMiddle,
-        model->data(index, Qt::DisplayRole).toString());
+/////////////////////////////////////////////////
+RenderWidget *MainWindow::GetRenderWidget() const
+{
+  return this->renderWidget;
+}
 
-    if (option.state & QStyle::State_MouseOver)
-      painter->setPen(QPen(orange, 1));
-    else
-      painter->setPen(QPen(grey, 1));
+/////////////////////////////////////////////////
+void MainWindow::CreateEditors()
+{
+  // Create a Terrain Editor
+  this->editors.push_back(new TerrainEditor(this));
 
-    this->view->style()->drawItemText(painter, textrect, Qt::AlignLeft,
-        option.palette, this->view->isEnabled(), text);
+  // Create a Building Editor
+  this->editors.push_back(new BuildingEditor(this));
 
-    painter->restore();
-  }
-  else
-  {
-      QItemDelegate::paint(painter, option, index);
-  }
+  // Create a Model Editor
+  this->editors.push_back(new ModelEditor(this));
 }
 
 /////////////////////////////////////////////////
-QSize TreeViewDelegate::sizeHint(const QStyleOptionViewItem &_opt,
-    const QModelIndex &_index) const
+void MainWindow::CreateDisabledIcon(const std::string &_pixmap, QAction *_act)
 {
-  QStyleOptionViewItem option = _opt;
-  QSize sz = QItemDelegate::sizeHint(_opt, _index) + QSize(2, 2);
-  return sz;
+  QIcon icon = _act->icon();
+  QPixmap pixmap(_pixmap.c_str());
+  QPixmap disabledPixmap(pixmap.size());
+  disabledPixmap.fill(Qt::transparent);
+  QPainter p(&disabledPixmap);
+  p.setOpacity(0.4);
+  p.drawPixmap(0, 0, pixmap);
+  icon.addPixmap(disabledPixmap, QIcon::Disabled);
+  _act->setIcon(icon);
 }
diff --git a/gazebo/gui/MainWindow.hh b/gazebo/gui/MainWindow.hh
index 7cd341e..c02da3c 100644
--- a/gazebo/gui/MainWindow.hh
+++ b/gazebo/gui/MainWindow.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,11 +20,13 @@
 #include <map>
 #include <string>
 #include <vector>
+#include <list>
 
-#include "gui/qt.h"
-#include "common/Event.hh"
-#include "msgs/MessageTypes.hh"
-#include "transport/TransportTypes.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/common/Event.hh"
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,9 +35,9 @@ namespace gazebo
     class RenderWidget;
     class ToolsWidget;
     class ModelListWidget;
-    class BuildingEditorPalette;
+    class Editor;
 
-    class MainWindow : public QMainWindow
+    class GAZEBO_VISIBLE MainWindow : public QMainWindow
     {
       Q_OBJECT
 
@@ -48,27 +50,56 @@ namespace gazebo
       public: unsigned int GetEntityId(const std::string &_name);
       public: bool HasEntityName(const std::string &_name);
 
+      /// \brief Add a widget to the left column stack of widgets.
+      /// \param[in] _name Name of the widget
+      /// \param[in] _widget Pointer to the widget to add.
+      public: void AddToLeftColumn(const std::string &_name, QWidget *_widget);
+
+      /// \brief Show a widget in the left column.
+      /// \sa AddToLeftColumn
+      /// \param[in] _name Name of the widge to show. The widget must have
+      /// been added using AddToLeftColumn. The string "default" will show
+      /// the main tab.
+      public: void ShowLeftColumnWidget(const std::string &_name = "default");
+
+      /// \brief Get a pointer to the render widget.
+      /// \return A pointer to the render widget.
+      public: RenderWidget *GetRenderWidget() const;
+
+      /// \brief Play simulation.
+      public slots: void Play();
+
+      /// \brief Pause simulation.
+      public slots: void Pause();
+
       protected: void closeEvent(QCloseEvent *_event);
 
       private: void OnGUI(ConstGUIPtr &_msg);
 
-
       private slots: void ItemSelected(QTreeWidgetItem *, int);
       private slots: void New();
       private slots: void Open();
       private slots: void Import();
       private slots: void Save();
       private slots: void SaveAs();
+
+      /// \brief Save GUI configuration to INI file.
+      private slots: void SaveINI();
+
       private slots: void About();
-      private slots: void Play();
-      private slots: void Pause();
       private slots: void Step();
-
       private slots: void NewModel();
       private slots: void Arrow();
+
+      /// \brief Qt callback when the translate mode is triggered.
       private slots: void Translate();
+
+      /// \brief Qt callback when the rotate mode is triggered.
       private slots: void Rotate();
 
+      /// \brief Qt callback when the scale mode is triggered.
+      private slots: void Scale();
+
       private slots: void CreateBox();
       private slots: void CreateSphere();
       private slots: void CreateCylinder();
@@ -93,24 +124,10 @@ namespace gazebo
       private slots: void OnResetModelOnly();
       private slots: void OnResetWorld();
       private slots: void SetTransparent();
-      private slots: void OnEditBuilding();
       private slots: void SetWireframe();
 
-      /// \brief Qt callback when the building editor's save action is
-      /// triggered.
-      private slots: void BuildingEditorSave();
-
-      /// \brief Qt callback when the building editor's discard action is
-      /// triggered.
-      private slots: void BuildingEditorDiscard();
-
-      /// \brief Qt callback when the building editor's done action is
-      /// triggered.
-      private slots: void BuildingEditorDone();
-
-      /// \brief Qt callback when the building editor's exit action is
-      /// triggered.
-      private slots: void BuildingEditorExit();
+      /// \brief Qt call back when the play action state changes
+      private slots: void OnPlayActionChanged();
 
       /// \brief QT slot to open the data logger utility
       private slots: void DataLogger();
@@ -124,15 +141,26 @@ namespace gazebo
       private: void OnFullScreen(bool _value);
       private: void OnMoveMode(bool _mode);
 
+      /// \brief Create most of the actions.
       private: void CreateActions();
+
+      /// \brief Create menus.
       private: void CreateMenus();
+
+      /// \brief Create the toolbars.
       private: void CreateToolbars();
 
-      /// \brief Attach Gazebo's main menu bar
-      private: void AttachMainMenuBar();
+      /// \brief Create the main menu bar.
+      private: void CreateMenuBar();
+
+      /// \brief Create all the editors.
+      private: void CreateEditors();
 
-      /// \brief Attach building editor's menu bar
-      private: void AttachEditorMenuBar();
+      /// \brief Show a custom menubar. If NULL is used, the default menubar
+      /// is shown.
+      /// \param[in] _bar The menubar to show. NULL will show the default
+      /// menubar.
+      public: void ShowMenuBar(QMenuBar *_bar = NULL);
 
       private: void OnModel(ConstModelPtr &_msg);
       private: void OnResponse(ConstResponsePtr &_msg);
@@ -142,9 +170,20 @@ namespace gazebo
                                         const std::string &_mode);
       private: void OnStats(ConstWorldStatisticsPtr &_msg);
 
-      /// \brief Callback from the building editor when the building model
-      /// has been completed.
-      private: void OnFinishBuilding();
+      /// \brief Handle event for changing the manual step size.
+      /// \param[in] _value New input step size.
+      private: void OnInputStepSizeChanged(int _value);
+
+      /// \brief Handle follow model user event.
+      /// \param[in] _modelName Name of the model that is being followed.
+      private: void OnFollow(const std::string &_modelName);
+
+      /// \brief Helper function that creates a greyed out icon for an
+      /// action. This lets the action have a visible disabled state.
+      /// \param[in] _pixmap The image to use as an greyed out icon.
+      /// \param[in, out] _act Action that receives the icon.
+      private: void CreateDisabledIcon(const std::string &_pixmap,
+                   QAction *_act);
 
       private: QToolBar *playToolbar;
 
@@ -170,40 +209,37 @@ namespace gazebo
       // A map that associates physics_id's with entity names
       private: std::map<std::string, unsigned int> entities;
 
+      /// \brief Message used to field requests.
       private: msgs::Request *requestMsg;
 
-      // private: QTreeWidget *treeWidget;
-
-      /// \brief Building editor palette that contains different drawing modes
-      private: BuildingEditorPalette *buildingEditorPalette;
-
-      /// \brief Tab widget that holds the building editor palette
-      private: QTabWidget *buildingEditorTabWidget;
-
+      /// \brief The left-hand tab widget
       private: QTabWidget *tabWidget;
+
+      /// \brief Mainwindow's menubar
       private: QMenuBar *menuBar;
 
+      /// \brief The Edit menu.
+      private: QMenu *editMenu;
+
       /// \brief A layout for the menu bar.
       private: QHBoxLayout *menuLayout;
 
+      /// \brief Used to control size of each pane.
+      private: QStackedWidget *leftColumn;
+
+      /// \brief Map of names to widgets in the leftColumn QStackedWidget
+      private: std::map<std::string, int> leftColumnStack;
+
       /// \brief The filename set via "Save As". This filename is used by
       /// the "Save" feature.
       private: std::string saveFilename;
-    };
 
-    class TreeViewDelegate: public QItemDelegate
-    {
-      Q_OBJECT
-      public: TreeViewDelegate(QTreeView *_view, QWidget *_parent);
+      /// \brief User specified step size for manually stepping the world
+      private: int inputStepSize;
 
-      public: void paint(QPainter *painter, const QStyleOptionViewItem &option,
-                         const QModelIndex &index) const;
-
-      public: virtual QSize sizeHint(const QStyleOptionViewItem &_opt,
-                                     const QModelIndex &_index) const;
-      private: QTreeView *view;
+      /// \brief List of all the editors.
+      private: std::list<Editor*> editors;
     };
   }
 }
-
 #endif
diff --git a/gazebo/gui/MainWindow_TEST.cc b/gazebo/gui/MainWindow_TEST.cc
new file mode 100644
index 0000000..0c2cd86
--- /dev/null
+++ b/gazebo/gui/MainWindow_TEST.cc
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <boost/filesystem.hpp>
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/TransportIface.hh"
+#include "gazebo/gui/Actions.hh"
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/MainWindow.hh"
+#include "gazebo/gui/TimePanel.hh"
+#include "gazebo/gui/MainWindow_TEST.hh"
+
+#include "test_config.h"
+
+bool g_gotSetWireframe = false;
+void OnRequest(ConstRequestPtr &_msg)
+{
+  if (_msg->request() == "set_wireframe")
+    g_gotSetWireframe = true;
+}
+
+/////////////////////////////////////////////////
+void MainWindow_TEST::Wireframe()
+{
+  this->resMaxPercentChange = 5.0;
+  this->shareMaxPercentChange = 2.0;
+
+  boost::filesystem::path path = TEST_PATH;
+  path = path / "worlds" / "empty_dark_plane.world";
+  this->Load(path.string(), false, false, true);
+  gazebo::transport::NodePtr node;
+  gazebo::transport::SubscriberPtr sub;
+
+  node = gazebo::transport::NodePtr(new gazebo::transport::Node());
+  node->Init();
+  sub = node->Subscribe("~/request", &OnRequest, this);
+
+  // Create the main window.
+  gazebo::gui::MainWindow *mainWindow = new gazebo::gui::MainWindow();
+  QVERIFY(mainWindow != NULL);
+  mainWindow->Load();
+  mainWindow->Init();
+  mainWindow->show();
+
+  // Process some events, and draw the screen
+  for (unsigned int i = 0; i < 10; ++i)
+  {
+    gazebo::common::Time::MSleep(30);
+    QCoreApplication::processEvents();
+    mainWindow->repaint();
+  }
+
+  // Get the user camera, and tell it to save frames
+  gazebo::rendering::UserCameraPtr cam = gazebo::gui::get_active_camera();
+  if (!cam)
+    return;
+
+  cam->SetCaptureData(true);
+
+  // Process some events, and draw the screen
+  for (unsigned int i = 0; i < 10; ++i)
+  {
+    gazebo::common::Time::MSleep(30);
+    QCoreApplication::processEvents();
+    mainWindow->repaint();
+  }
+
+  // Get the image data
+  const unsigned char *image = cam->GetImageData();
+  unsigned int height = cam->GetImageHeight();
+  unsigned int width = cam->GetImageWidth();
+  unsigned int depth = 3;
+
+  // Calculate the average color.
+  unsigned int sum = 0;
+  for (unsigned int y = 0; y < height; ++y)
+  {
+    for (unsigned int x = 0; x < width*depth; ++x)
+    {
+      unsigned int a = image[(y*width*depth)+x];
+      sum += a;
+    }
+  }
+  double avgPreWireframe = static_cast<double>(sum) / (height*width*depth);
+
+  // Trigger the wireframe request.
+  gazebo::gui::g_viewWireframeAct->trigger();
+
+  double avgPostWireframe = avgPreWireframe;
+
+  // Redraw the screen
+  for (unsigned int i = 0; i < 100 &&
+      gazebo::math::equal(avgPostWireframe, avgPreWireframe, 1e-3); ++i)
+  {
+    gazebo::common::Time::MSleep(30);
+    QCoreApplication::processEvents();
+    mainWindow->repaint();
+
+    // Get the new image data, and calculate the new average color
+    image = cam->GetImageData();
+    sum = 0;
+    for (unsigned int y = 0; y < height; ++y)
+    {
+      for (unsigned int x = 0; x < width*depth; ++x)
+      {
+        unsigned int a = image[(y*width*depth)+x];
+        sum += a;
+      }
+    }
+    avgPostWireframe = static_cast<double>(sum) / (height*width*depth);
+  }
+
+  // Make sure the request was set.
+  QVERIFY(g_gotSetWireframe);
+
+  gzdbg << "AvgPrewireframe [" << avgPreWireframe
+        << "] AvgPostWireframe[" << avgPostWireframe << "]\n";
+
+  // Removing the grey ground plane should change the image.
+  QVERIFY(!gazebo::math::equal(avgPreWireframe, avgPostWireframe));
+
+  cam->Fini();
+  mainWindow->close();
+  delete mainWindow;
+}
+
+/////////////////////////////////////////////////
+void MainWindow_TEST::NonDefaultWorld()
+{
+  this->resMaxPercentChange = 5.0;
+  this->shareMaxPercentChange = 2.0;
+
+  boost::filesystem::path path = TEST_PATH;
+  path = path / "worlds" / "empty_different_name.world";
+  this->Load(path.string(), false, false, true);
+
+  // Create the main window.
+  gazebo::gui::MainWindow *mainWindow = new gazebo::gui::MainWindow();
+  QVERIFY(mainWindow != NULL);
+  mainWindow->Load();
+  mainWindow->Init();
+  mainWindow->show();
+
+  // Process some events, and draw the screen
+  for (unsigned int i = 0; i < 10; ++i)
+  {
+    gazebo::common::Time::MSleep(30);
+    QCoreApplication::processEvents();
+    mainWindow->repaint();
+  }
+
+  // Get the user camera, and tell it to save frames
+  gazebo::rendering::UserCameraPtr cam = gazebo::gui::get_active_camera();
+
+  if (!cam)
+    return;
+
+  cam->SetCaptureData(true);
+
+  // Process some events, and draw the screen
+  for (unsigned int i = 0; i < 10; ++i)
+  {
+    gazebo::common::Time::MSleep(30);
+    QCoreApplication::processEvents();
+    mainWindow->repaint();
+  }
+
+  // Get the image data
+  const unsigned char *image = cam->GetImageData();
+  unsigned int height = cam->GetImageHeight();
+  unsigned int width = cam->GetImageWidth();
+  unsigned int depth = 3;
+
+  unsigned int sum = 0;
+  for (unsigned int y = 0; y < height; ++y)
+  {
+    for (unsigned int x = 0; x < width*depth; ++x)
+    {
+      unsigned int a = image[(y*width*depth)+x];
+      sum += a;
+    }
+  }
+
+  QVERIFY(sum > 0);
+
+  cam->Fini();
+  mainWindow->close();
+  delete mainWindow;
+}
+
+// Generate a main function for the test
+QTEST_MAIN(MainWindow_TEST)
diff --git a/gazebo/gui/MainWindow_TEST.hh b/gazebo/gui/MainWindow_TEST.hh
new file mode 100644
index 0000000..d83c623
--- /dev/null
+++ b/gazebo/gui/MainWindow_TEST.hh
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _MAINWINDOW_TEST_HH_
+#define _MAINWINDOW_TEST_HH_
+
+#include "gazebo/gui/QTestFixture.hh"
+
+/// \brief A test class for the DataLogger widget.
+class MainWindow_TEST : public QTestFixture
+{
+  Q_OBJECT
+
+  /// \brief Test that trigger of the view wireframe action creates an
+  /// appropriate request.
+  private slots: void Wireframe();
+
+  /// \brief Test creating a main window with non-default world
+  private slots: void NonDefaultWorld();
+};
+
+#endif
diff --git a/gazebo/gui/MeshMaker.cc b/gazebo/gui/MeshMaker.cc
index ea3f8ba..7615393 100644
--- a/gazebo/gui/MeshMaker.cc
+++ b/gazebo/gui/MeshMaker.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,18 +16,18 @@
 */
 #include <sstream>
 
-#include "msgs/msgs.hh"
+#include "gazebo/msgs/msgs.hh"
 
-#include "rendering/UserCamera.hh"
-#include "common/Console.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/common/Console.hh"
 
-#include "gui/GuiEvents.hh"
-#include "math/Quaternion.hh"
-#include "common/MouseEvent.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/common/MouseEvent.hh"
 
-#include "transport/Publisher.hh"
+#include "gazebo/transport/Publisher.hh"
 
-#include "gui/MeshMaker.hh"
+#include "gazebo/gui/MeshMaker.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -39,6 +39,7 @@ MeshMaker::MeshMaker()
 : EntityMaker()
 {
   this->state = 0;
+  this->leftMousePressed = false;
   this->visualMsg = new msgs::Visual();
   this->visualMsg->mutable_geometry()->set_type(msgs::Geometry::MESH);
   msgs::Set(this->visualMsg->mutable_pose()->mutable_orientation(),
diff --git a/gazebo/gui/MeshMaker.hh b/gazebo/gui/MeshMaker.hh
index bd353b8..126171b 100644
--- a/gazebo/gui/MeshMaker.hh
+++ b/gazebo/gui/MeshMaker.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,8 @@
 #define _MESHMAKER_HH_
 
 #include <string>
-#include "gui/EntityMaker.hh"
+#include "gazebo/gui/EntityMaker.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,7 @@ namespace gazebo
 
   namespace gui
   {
-    class MeshMaker : public EntityMaker
+    class GAZEBO_VISIBLE MeshMaker : public EntityMaker
     {
       public: MeshMaker();
       public: virtual ~MeshMaker();
diff --git a/gazebo/gui/ModelBuilderWidget.cc b/gazebo/gui/ModelBuilderWidget.cc
index c3b46f4..1614a70 100644
--- a/gazebo/gui/ModelBuilderWidget.cc
+++ b/gazebo/gui/ModelBuilderWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,17 +14,17 @@
  * limitations under the License.
  *
 */
-#include "rendering/Rendering.hh"
-#include "rendering/UserCamera.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/rendering/UserCamera.hh"
 
-#include "physics/World.hh"
-#include "physics/Physics.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/PhysicsIface.hh"
 
-#include "transport/Node.hh"
-#include "transport/Publisher.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
 
-#include "gui/GLWidget.hh"
-#include "gui/ModelBuilderWidget.hh"
+#include "gazebo/gui/GLWidget.hh"
+#include "gazebo/gui/ModelBuilderWidget.hh"
 
 using namespace gazebo;
 using namespace gui;
diff --git a/gazebo/gui/ModelBuilderWidget.hh b/gazebo/gui/ModelBuilderWidget.hh
index 67d5cac..5d4d799 100644
--- a/gazebo/gui/ModelBuilderWidget.hh
+++ b/gazebo/gui/ModelBuilderWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,10 +17,11 @@
 #ifndef _MODEL_BUILDER_WIDGET_HH_
 #define _MODEL_BUILDER_WIDGET_HH_
 
-#include "gui/qt.h"
-#include "physics/PhysicsTypes.hh"
-#include "transport/TransportTypes.hh"
-#include "math/Vector3.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -28,7 +29,7 @@ namespace gazebo
 
   namespace gui
   {
-    class ModelBuilderWidget : public QWidget
+    class GAZEBO_VISIBLE ModelBuilderWidget : public QWidget
     {
       Q_OBJECT
       public: ModelBuilderWidget(QWidget *_parent = 0);
diff --git a/gazebo/gui/ModelEditWidget.cc b/gazebo/gui/ModelEditWidget.cc
index 442a47b..8610c1f 100644
--- a/gazebo/gui/ModelEditWidget.cc
+++ b/gazebo/gui/ModelEditWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,10 +15,10 @@
  *
  */
 
-#include "transport/Node.hh"
-#include "transport/Publisher.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
 
-#include "gui/ModelEditWidget.hh"
+#include "gazebo/gui/ModelEditWidget.hh"
 
 using namespace gazebo;
 using namespace gui;
diff --git a/gazebo/gui/ModelEditWidget.hh b/gazebo/gui/ModelEditWidget.hh
index ade2d7a..443d68f 100644
--- a/gazebo/gui/ModelEditWidget.hh
+++ b/gazebo/gui/ModelEditWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,9 +17,10 @@
 #ifndef _EDIT_MODEL_WIDGET_HH_
 #define _EDIT_MODEL_WIDGET_HH_
 
-#include "gui/qt.h"
-#include "transport/TransportTypes.hh"
-#include "msgs/msgs.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/util/system.hh"
 
 class QTreeWidget;
 
@@ -27,7 +28,7 @@ namespace gazebo
 {
   namespace gui
   {
-    class ModelEditWidget : public QWidget
+    class GAZEBO_VISIBLE ModelEditWidget : public QWidget
     {
       Q_OBJECT
       public: ModelEditWidget(QWidget *_parent = 0);
@@ -38,7 +39,7 @@ namespace gazebo
       private: QTreeWidget *treeWidget;
     };
 
-    class ModelPropertyWidget : public QWidget
+    class GAZEBO_VISIBLE ModelPropertyWidget : public QWidget
     {
       Q_OBJECT
       public: ModelPropertyWidget(QWidget *_parent = 0);
diff --git a/gazebo/gui/ModelListWidget.cc b/gazebo/gui/ModelListWidget.cc
index 8c8f563..b194b37 100644
--- a/gazebo/gui/ModelListWidget.cc
+++ b/gazebo/gui/ModelListWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@
 #include <boost/thread/recursive_mutex.hpp>
 #include <boost/thread/mutex.hpp>
 
-#include "gazebo/sdf/sdf.hh"
+#include <sdf/sdf.hh>
 #include "gazebo/common/Image.hh"
 #include "gazebo/common/SystemPaths.hh"
 #include "gazebo/common/Console.hh"
@@ -30,11 +30,11 @@
 
 #include "gazebo/rendering/Light.hh"
 #include "gazebo/rendering/RenderEvents.hh"
-#include "gazebo/rendering/Rendering.hh"
+#include "gazebo/rendering/RenderingIface.hh"
 #include "gazebo/rendering/Scene.hh"
 #include "gazebo/rendering/UserCamera.hh"
 #include "gazebo/rendering/Visual.hh"
-#include "gazebo/gui/Gui.hh"
+#include "gazebo/gui/GuiIface.hh"
 
 #include "gazebo/physics/World.hh"
 #include "gazebo/physics/PhysicsEngine.hh"
@@ -52,6 +52,11 @@
 #include "gazebo/gui/qtpropertybrowser/qtvariantproperty.h"
 #include "gazebo/gui/ModelListWidget.hh"
 
+// avoid collision from Mac OS X's ConditionalMacros.h
+#ifdef __MACH__
+#undef TYPE_BOOL
+#endif
+
 using namespace gazebo;
 using namespace gui;
 
@@ -69,6 +74,7 @@ ModelListWidget::ModelListWidget(QWidget *_parent)
 
   QVBoxLayout *mainLayout = new QVBoxLayout;
   this->modelTreeWidget = new QTreeWidget();
+  this->modelTreeWidget->setObjectName("modelTreeWidget");
   this->modelTreeWidget->setColumnCount(1);
   this->modelTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
   this->modelTreeWidget->header()->hide();
@@ -86,6 +92,7 @@ ModelListWidget::ModelListWidget(QWidget *_parent)
 
   this->variantManager = new QtVariantPropertyManager();
   this->propTreeBrowser = new QtTreePropertyBrowser();
+  this->propTreeBrowser->setObjectName("propTreeBrowser");
   this->variantFactory = new QtVariantEditorFactory();
   this->propTreeBrowser->setFactoryForManager(this->variantManager,
                                               this->variantFactory);
@@ -140,6 +147,7 @@ ModelListWidget::ModelListWidget(QWidget *_parent)
 /////////////////////////////////////////////////
 ModelListWidget::~ModelListWidget()
 {
+  this->connections.clear();
   delete this->propMutex;
   delete this->receiveMutex;
 }
@@ -171,6 +179,13 @@ void ModelListWidget::OnModelSelection(QTreeWidgetItem *_item, int /*_column*/)
                                              this->selectedEntityName);
       this->requestPub->Publish(*this->requestMsg);
     }
+    else if (name == "Spherical Coordinates")
+    {
+      this->requestMsg = msgs::CreateRequest("spherical_coordinates_info",
+                                             this->selectedEntityName);
+      this->requestPub->Publish(*this->requestMsg);
+    }
+
     else
     {
       this->propTreeBrowser->clear();
@@ -225,7 +240,7 @@ void ModelListWidget::OnSetSelectedEntity(const std::string &_name,
 /////////////////////////////////////////////////
 void ModelListWidget::Update()
 {
-  if (this->fillTypes.size() > 0)
+  if (!this->fillTypes.empty())
   {
     boost::mutex::scoped_lock lock(*this->propMutex);
     this->fillingPropertyTree = true;
@@ -243,6 +258,8 @@ void ModelListWidget::Update()
       this->FillPropertyTree(this->physicsMsg, NULL);
     else if (this->fillTypes[0] == "Light")
       this->FillPropertyTree(this->lightMsg, NULL);
+    else if (this->fillTypes[0] == "Spherical Coordinates")
+      this->FillPropertyTree(this->sphericalCoordMsg, NULL);
 
     this->fillingPropertyTree = false;
     this->fillTypes.pop_front();
@@ -306,6 +323,8 @@ void ModelListWidget::ProcessModelMsgs()
 
           linkItem->setData(0, Qt::UserRole, QVariant(linkName.c_str()));
           linkItem->setData(1, Qt::UserRole, QVariant((*iter).name().c_str()));
+          linkItem->setData(2, Qt::UserRole, QVariant((*iter).id()));
+          linkItem->setData(3, Qt::UserRole, QVariant("Link"));
           this->modelTreeWidget->addTopLevelItem(linkItem);
         }
 
@@ -322,6 +341,7 @@ void ModelListWidget::ProcessModelMsgs()
                   QString::fromStdString(jointNameShort))));
 
           jointItem->setData(0, Qt::UserRole, QVariant(jointName.c_str()));
+          jointItem->setData(3, Qt::UserRole, QVariant("Joint"));
           this->modelTreeWidget->addTopLevelItem(jointItem);
         }
       }
@@ -391,6 +411,14 @@ void ModelListWidget::OnResponse(ConstResponsePtr &_msg)
     this->fillTypes.push_back("Light");
     this->propMutex->unlock();
   }
+  else if (_msg->has_type() &&
+           _msg->type() == this->sphericalCoordMsg.GetTypeName())
+  {
+    this->propMutex->lock();
+    this->sphericalCoordMsg.ParseFromString(_msg->serialized_data());
+    this->fillTypes.push_back("Spherical Coordinates");
+    this->propMutex->unlock();
+  }
   else if (_msg->has_type() && _msg->type() == "error")
   {
     if (_msg->response() == "nonexistant")
@@ -498,19 +526,21 @@ void ModelListWidget::OnPropertyChanged(QtProperty *_item)
     return;
 
   if (this->selectedProperty != _item || this->fillingPropertyTree)
-  {
     return;
-  }
 
-  if (this->modelsItem->indexOfChild(
-        this->modelTreeWidget->currentItem()) != -1)
+  QTreeWidgetItem *currentItem = this->modelTreeWidget->currentItem();
+
+  if (!currentItem)
+    return;
+
+  if (this->modelsItem->indexOfChild(currentItem) != -1 ||
+      this->modelsItem->indexOfChild(currentItem->parent()) != -1)
     this->ModelPropertyChanged(_item);
-  else if (this->lightsItem->indexOfChild(
-        this->modelTreeWidget->currentItem()) != -1)
+  else if (this->lightsItem->indexOfChild(currentItem) != -1)
     this->LightPropertyChanged(_item);
-  else if (this->modelTreeWidget->currentItem() == this->sceneItem)
+  else if (currentItem == this->sceneItem)
     this->ScenePropertyChanged(_item);
-  else if (this->modelTreeWidget->currentItem() == this->physicsItem)
+  else if (currentItem == this->physicsItem)
     this->PhysicsPropertyChanged(_item);
 }
 
@@ -647,11 +677,36 @@ void ModelListWidget::ModelPropertyChanged(QtProperty *_item)
 {
   msgs::Model msg;
 
-  msg.set_id(this->modelMsg.id());
-  msg.set_name(this->modelMsg.name());
+  google::protobuf::Message *fillMsg = &msg;
 
-  const google::protobuf::Descriptor *descriptor = msg.GetDescriptor();
-  const google::protobuf::Reflection *reflection = msg.GetReflection();
+  QTreeWidgetItem *currentItem = this->modelTreeWidget->currentItem();
+
+  // check if it's a link
+  if (currentItem->data(3, Qt::UserRole).toString().toStdString() == "Link")
+  {
+    // this->modelMsg may not have been set
+    // so get the model name from the current item
+    msg.set_name(currentItem->data(1, Qt::UserRole).toString().toStdString());
+    msg.set_id(currentItem->data(2, Qt::UserRole).toInt());
+
+    // set link id and strip link name.
+    msgs::Link *linkMsg = msg.add_link();
+    linkMsg->set_id(this->linkMsg.id());
+    std::string linkName = this->linkMsg.name();
+    size_t index = linkName.find_last_of("::");
+    if (index != std::string::npos)
+      linkName = linkName.substr(index+1);
+    linkMsg->set_name(linkName);
+    fillMsg = linkMsg;
+  }
+  else
+  {
+    msg.set_id(this->modelMsg.id());
+    msg.set_name(this->modelMsg.name());
+  }
+
+  const google::protobuf::Descriptor *descriptor = fillMsg->GetDescriptor();
+  const google::protobuf::Reflection *reflection = fillMsg->GetReflection();
 
   QList<QtProperty*> properties = this->propTreeBrowser->properties();
   for (QList<QtProperty*>::iterator iter = properties.begin();
@@ -670,19 +725,19 @@ void ModelListWidget::ModelPropertyChanged(QtProperty *_item)
     {
       if (field->is_repeated())
       {
-        this->FillMsg((*iter), reflection->AddMessage(&msg, field),
+        this->FillMsg((*iter), reflection->AddMessage(fillMsg, field),
             field->message_type(), _item);
       }
       else
       {
         this->FillMsg((*iter),
-            reflection->MutableMessage(&msg, field),
+            reflection->MutableMessage(fillMsg, field),
             field->message_type(), _item);
       }
     }
     else if (field)
     {
-      this->FillMsgField((*iter), &msg, reflection, field);
+      this->FillMsgField((*iter), fillMsg, reflection, field);
     }
     else
     {
@@ -691,10 +746,7 @@ void ModelListWidget::ModelPropertyChanged(QtProperty *_item)
     }
   }
 
-  // \todo Renable when modifying a model is fixed.
-  // this->modelPub->Publish(msg);
-  gzwarn << "Model modification is currently disabled. "
-         << "Look for this feature in Gazebo 2.0\n";
+  this->modelPub->Publish(msg);
 }
 
 /////////////////////////////////////////////////
@@ -970,16 +1022,18 @@ void ModelListWidget::FillMsg(QtProperty *_item,
   if (_item->propertyName().toStdString() == "link")
   {
     QtProperty *nameItem = this->GetChildItem(_item, "name");
+    QtVariantProperty *idItem =
+        dynamic_cast<QtVariantProperty *>(this->GetChildItem(_item, "id"));
     ((msgs::Link*)(_message))->set_name(nameItem->valueText().toStdString());
-    ((msgs::Link*)(_message))->set_id(
-      gui::get_entity_id(nameItem->valueText().toStdString()));
+    ((msgs::Link*)(_message))->set_id(idItem->value().toInt());
   }
   else if (_item->propertyName().toStdString() == "collision")
   {
     QtProperty *nameItem = this->GetChildItem(_item, "name");
+    QtVariantProperty *idItem =
+        dynamic_cast<QtVariantProperty *>(this->GetChildItem(_item, "id"));
     ((msgs::Collision*)_message)->set_name(nameItem->valueText().toStdString());
-    ((msgs::Collision*)_message)->set_id(
-      gui::get_entity_id(nameItem->valueText().toStdString()));
+    ((msgs::Collision*)(_message))->set_id(idItem->value().toInt());
   }
 
   if (_item->propertyName().toStdString() == "geometry" &&
@@ -1235,6 +1289,73 @@ QtProperty *ModelListWidget::GetChildItem(QtProperty *_item,
 }
 
 /////////////////////////////////////////////////
+void ModelListWidget::FillPropertyTree(const msgs::SphericalCoordinates &_msg,
+    QtProperty *_parent)
+{
+  QtVariantProperty *item = NULL;
+
+  item = this->variantManager->addProperty(
+      QtVariantPropertyManager::enumTypeId(), tr("Surface Model"));
+  QStringList types;
+
+  const google::protobuf::EnumDescriptor *surfaceModelEnum =
+    _msg.GetDescriptor()->FindEnumTypeByName("SurfaceModel");
+
+  if (!surfaceModelEnum)
+  {
+    gzerr << "Unable to get SurfaceModel enum descriptor from "
+      << "SphericalCoordinates message. msgs::SphericalCoordinates "
+      << "has probably changed\n";
+    types << "invalid";
+  }
+  else
+  {
+    for (int i = 0; i < surfaceModelEnum->value_count(); ++i)
+      types << surfaceModelEnum->value(i)->name().c_str();
+  }
+
+  item->setAttribute("enumNames", types);
+  item->setValue(0);
+  if (_parent)
+    _parent->addSubProperty(item);
+  else
+    this->propTreeBrowser->addProperty(item);
+  item->setEnabled(false);
+
+  item = this->variantManager->addProperty(QVariant::Double, tr("Latitude"));
+  item->setValue(_msg.latitude_deg());
+  if (_parent)
+    _parent->addSubProperty(item);
+  else
+    this->propTreeBrowser->addProperty(item);
+  item->setEnabled(false);
+
+  item = this->variantManager->addProperty(QVariant::Double, tr("Longitude"));
+  item->setValue(_msg.longitude_deg());
+  if (_parent)
+    _parent->addSubProperty(item);
+  else
+    this->propTreeBrowser->addProperty(item);
+  item->setEnabled(false);
+
+  item = this->variantManager->addProperty(QVariant::Double, tr("Elevation"));
+  item->setValue(_msg.elevation());
+  if (_parent)
+    _parent->addSubProperty(item);
+  else
+    this->propTreeBrowser->addProperty(item);
+  item->setEnabled(false);
+
+  item = this->variantManager->addProperty(QVariant::Double, tr("Heading"));
+  item->setValue(_msg.heading_deg());
+  if (_parent)
+    _parent->addSubProperty(item);
+  else
+    this->propTreeBrowser->addProperty(item);
+  item->setEnabled(false);
+}
+
+/////////////////////////////////////////////////
 void ModelListWidget::FillPropertyTree(const msgs::Joint &_msg,
                                        QtProperty *_parent)
 {
@@ -1248,6 +1369,7 @@ void ModelListWidget::FillPropertyTree(const msgs::Joint &_msg,
     _parent->addSubProperty(item);
   else
     this->propTreeBrowser->addProperty(item);
+  item->setEnabled(false);
 
   // Pose value
   topItem = this->variantManager->addProperty(
@@ -1256,6 +1378,8 @@ void ModelListWidget::FillPropertyTree(const msgs::Joint &_msg,
     _parent->addSubProperty(topItem);
   else
     this->propTreeBrowser->addProperty(topItem);
+  topItem->setEnabled(false);
+
   this->FillPoseProperty(_msg.pose(), topItem);
 
   // Angle
@@ -1269,53 +1393,82 @@ void ModelListWidget::FillPropertyTree(const msgs::Joint &_msg,
       _parent->addSubProperty(item);
     else
       this->propTreeBrowser->addProperty(item);
+    item->setEnabled(false);
   }
 
-  if (_msg.has_axis1())
+  // Add joint axes if present
+  for (int i = 0; i < 2; ++i)
   {
-    // Axis shape value
-    topItem = this->variantManager->addProperty(
-        QtVariantPropertyManager::groupTypeId(), tr("axis"));
-    if (_parent)
-      _parent->addSubProperty(topItem);
-    else
-      this->propTreeBrowser->addProperty(topItem);
-
-    /// XYZ of the axis
-    QtProperty *xyzItem = this->variantManager->addProperty(
-        QtVariantPropertyManager::groupTypeId(), tr("xyz"));
-    topItem->addSubProperty(xyzItem);
-    this->FillVector3dProperty(_msg.axis1().xyz(), xyzItem);
-
-    // lower limit
-    item = this->variantManager->addProperty(QVariant::Double, tr("lower"));
-    item->setValue(_msg.axis1().limit_lower());
-    topItem->addSubProperty(item);
-
-    // upper limit
-    item = this->variantManager->addProperty(QVariant::Double, tr("upper"));
-    item->setValue(_msg.axis1().limit_upper());
-    topItem->addSubProperty(item);
-
-    // limit effort
-    item = this->variantManager->addProperty(QVariant::Double, tr("effort"));
-    item->setValue(_msg.axis1().limit_effort());
-    topItem->addSubProperty(item);
-
-    // limit velocity
-    item = this->variantManager->addProperty(QVariant::Double, tr("velocity"));
-    item->setValue(_msg.axis1().limit_velocity());
-    topItem->addSubProperty(item);
-
-    // damping
-    item = this->variantManager->addProperty(QVariant::Double, tr("damping"));
-    item->setValue(_msg.axis1().damping());
-    topItem->addSubProperty(item);
-
-    // friction
-    item = this->variantManager->addProperty(QVariant::Double, tr("friction"));
-    item->setValue(_msg.axis1().friction());
-    topItem->addSubProperty(item);
+    const msgs::Axis *axis = NULL;
+    std::string axisName;
+
+    if (i == 0 && _msg.has_axis1())
+    {
+      axis = &(_msg.axis1());
+      axisName = "axis1";
+    }
+    else if (i == 1 && _msg.has_axis2())
+    {
+      axis = &(_msg.axis2());
+      axisName = "axis2";
+    }
+
+    if (axis)
+    {
+      // Axis shape value
+      topItem = this->variantManager->addProperty(
+          QtVariantPropertyManager::groupTypeId(), tr(axisName.c_str()));
+      if (_parent)
+        _parent->addSubProperty(topItem);
+      else
+        this->propTreeBrowser->addProperty(topItem);
+      topItem->setEnabled(false);
+
+      /// XYZ of the axis
+      QtProperty *xyzItem = this->variantManager->addProperty(
+          QtVariantPropertyManager::groupTypeId(), tr("xyz"));
+      topItem->addSubProperty(xyzItem);
+      xyzItem->setEnabled(false);
+      this->FillVector3dProperty(axis->xyz(), xyzItem);
+
+      // lower limit
+      item = this->variantManager->addProperty(QVariant::Double, tr("lower"));
+      item->setValue(axis->limit_lower());
+      topItem->addSubProperty(item);
+      item->setEnabled(false);
+
+      // upper limit
+      item = this->variantManager->addProperty(QVariant::Double, tr("upper"));
+      item->setValue(axis->limit_upper());
+      topItem->addSubProperty(item);
+      item->setEnabled(false);
+
+      // limit effort
+      item = this->variantManager->addProperty(QVariant::Double, tr("effort"));
+      item->setValue(axis->limit_effort());
+      topItem->addSubProperty(item);
+      item->setEnabled(false);
+
+      // limit velocity
+      item = this->variantManager->addProperty(QVariant::Double,
+                                               tr("velocity"));
+      item->setValue(axis->limit_velocity());
+      topItem->addSubProperty(item);
+      item->setEnabled(false);
+
+      // damping
+      item = this->variantManager->addProperty(QVariant::Double, tr("damping"));
+      item->setValue(axis->damping());
+      topItem->addSubProperty(item);
+      item->setEnabled(false);
+
+      // friction
+      item = this->variantManager->addProperty(QVariant::Double,
+                                               tr("friction"));
+      item->setValue(axis->friction());
+      topItem->addSubProperty(item);
+      item->setEnabled(false);
+    }
   }
 }
 
@@ -1327,12 +1480,26 @@ void ModelListWidget::FillPropertyTree(const msgs::Link &_msg,
   QtProperty *inertialItem = NULL;
   QtVariantProperty *item = NULL;
 
+  // id, store it but but make it hidden
+  QtBrowserItem *browserItem = NULL;
+  item = this->variantManager->addProperty(QVariant::String, tr("id"));
+  item->setValue(_msg.id());
+  if (_parent)
+    _parent->addSubProperty(item);
+  else
+    this->propTreeBrowser->addProperty(item);
+  browserItem = this->propTreeBrowser->items(item)[0];
+  this->propTreeBrowser->setItemVisible(browserItem, false);
+
+  // name
   item = this->variantManager->addProperty(QVariant::String, tr("name"));
   item->setValue(_msg.name().c_str());
   if (_parent)
     _parent->addSubProperty(item);
   else
     this->propTreeBrowser->addProperty(item);
+  // TODO: setting link name currently causes problems
+  item->setEnabled(false);
 
   // Self-collide
   item = this->variantManager->addProperty(QVariant::Bool, tr("self_collide"));
@@ -1370,6 +1537,19 @@ void ModelListWidget::FillPropertyTree(const msgs::Link &_msg,
   else
     this->propTreeBrowser->addProperty(item);
 
+  // canonical
+  item = this->variantManager->addProperty(QVariant::Bool, tr("canonical"));
+  if (_msg.has_canonical())
+    item->setValue(_msg.canonical());
+  else
+    item->setValue(false);
+  if (_parent)
+    _parent->addSubProperty(item);
+  else
+    this->propTreeBrowser->addProperty(item);
+  item->setEnabled(false);
+
+  // pose
   topItem = this->variantManager->addProperty(
       QtVariantPropertyManager::groupTypeId(), tr("pose"));
   if (_parent)
@@ -1378,6 +1558,8 @@ void ModelListWidget::FillPropertyTree(const msgs::Link &_msg,
     this->propTreeBrowser->addProperty(topItem);
 
   this->FillPoseProperty(_msg.pose(), topItem);
+  if (_msg.has_canonical() && _msg.canonical())
+    topItem->setEnabled(false);
 
   // Inertial
   inertialItem = this->variantManager->addProperty(
@@ -1387,6 +1569,10 @@ void ModelListWidget::FillPropertyTree(const msgs::Link &_msg,
   else
     this->propTreeBrowser->addProperty(inertialItem);
 
+  // TODO: disable setting inertial properties until there are tests
+  // in place to verify the functionality
+  inertialItem->setEnabled(false);
+
   // Inertial::Mass
   item = this->variantManager->addProperty(QVariant::Double, tr("mass"));
   if (_msg.inertial().has_mass())
@@ -1478,6 +1664,10 @@ void ModelListWidget::FillPropertyTree(const msgs::Link &_msg,
       this->propTreeBrowser->addProperty(prop);
 
     this->FillPropertyTree(_msg.collision(i), prop);
+
+    // TODO: disable setting collision properties until there are tests
+    // in place to verify the functionality
+    prop->setEnabled(false);
   }
 
   for (int i = 0; i < _msg.visual_size(); i++)
@@ -1492,6 +1682,10 @@ void ModelListWidget::FillPropertyTree(const msgs::Link &_msg,
       this->propTreeBrowser->addProperty(prop);
 
     this->FillPropertyTree(_msg.visual(i), prop);
+
+    // TODO: disable setting visual properties until there are tests
+    // in place to verify the functionality
+    prop->setEnabled(false);
   }
 
   for (int i = 0; i < _msg.sensor_size(); i++)
@@ -1516,6 +1710,18 @@ void ModelListWidget::FillPropertyTree(const msgs::Collision &_msg,
   QtProperty *topItem = NULL;
   QtVariantProperty *item = NULL;
 
+  // id, store it but but make it hidden
+  QtBrowserItem *browserItem = NULL;
+  item = this->variantManager->addProperty(QVariant::String, tr("id"));
+  item->setValue(_msg.id());
+  if (_parent)
+    _parent->addSubProperty(item);
+  else
+    this->propTreeBrowser->addProperty(item);
+  browserItem = this->propTreeBrowser->items(item)[0];
+  this->propTreeBrowser->setItemVisible(browserItem, false);
+
+  // name
   item = this->variantManager->addProperty(QVariant::String,
                                            tr("name"));
   item->setValue(_msg.name().c_str());
@@ -1855,6 +2061,8 @@ void ModelListWidget::FillPropertyTree(const msgs::Model &_msg,
                                            tr("name"));
   item->setValue(_msg.name().c_str());
   this->propTreeBrowser->addProperty(item);
+  // TODO: setting model name currently causes problems
+  item->setEnabled(false);
 
   item = this->variantManager->addProperty(QVariant::Bool,
                                            tr("is_static"));
@@ -1862,6 +2070,8 @@ void ModelListWidget::FillPropertyTree(const msgs::Model &_msg,
     item->setValue(_msg.is_static());
   else
     item->setValue(false);
+  /// \todo Dynamically setting a model static doesn't currently work.
+  item->setEnabled(false);
   this->propTreeBrowser->addProperty(item);
 
   topItem = this->variantManager->addProperty(
@@ -1963,7 +2173,7 @@ void ModelListWidget::FillPoseProperty(const msgs::Pose &_msg,
   }
   static_cast<QtVariantPropertyManager*>(this->variantFactory->propertyManager(
     item))->setAttribute(item, "decimals", 6);
-  item->setValue(GZ_RTOD(rpy.x));
+  item->setValue(rpy.x);
 
   // Add Pitch value
   item = static_cast<QtVariantProperty*>(this->GetChildItem(_parent, "pitch"));
@@ -1975,7 +2185,7 @@ void ModelListWidget::FillPoseProperty(const msgs::Pose &_msg,
   }
   static_cast<QtVariantPropertyManager*>(this->variantFactory->propertyManager(
     item))->setAttribute(item, "decimals", 6);
-  item->setValue(GZ_RTOD(rpy.y));
+  item->setValue(rpy.y);
 
   // Add Yaw value
   item = static_cast<QtVariantProperty*>(this->GetChildItem(_parent, "yaw"));
@@ -1987,7 +2197,7 @@ void ModelListWidget::FillPoseProperty(const msgs::Pose &_msg,
   }
   static_cast<QtVariantPropertyManager*>(this->variantFactory->propertyManager(
     item))->setAttribute(item, "decimals", 6);
-  item->setValue(GZ_RTOD(rpy.z));
+  item->setValue(rpy.z);
 }
 
 /////////////////////////////////////////////////
@@ -2024,7 +2234,8 @@ void ModelListWidget::OnRemoveScene(const std::string &/*_name*/)
 {
   this->ResetTree();
   this->propTreeBrowser->clear();
-  this->node->Fini();
+  if (this->node)
+    this->node->Fini();
   this->node.reset();
 
   this->requestPub.reset();
@@ -2093,6 +2304,13 @@ void ModelListWidget::ResetTree()
   {
     this->ResetScene();
 
+    this->sphericalCoordItem = new QTreeWidgetItem(
+        static_cast<QTreeWidgetItem*>(0),
+        QStringList(QString("%1").arg(tr("Spherical Coordinates"))));
+    this->sphericalCoordItem->setData(0,
+        Qt::UserRole, QVariant(tr("Spherical Coordinates")));
+    this->modelTreeWidget->addTopLevelItem(this->sphericalCoordItem);
+
     this->physicsItem = new QTreeWidgetItem(
         static_cast<QTreeWidgetItem*>(0),
         QStringList(QString("%1").arg(tr("Physics"))));
diff --git a/gazebo/gui/ModelListWidget.hh b/gazebo/gui/ModelListWidget.hh
index 3a5d648..de570e9 100644
--- a/gazebo/gui/ModelListWidget.hh
+++ b/gazebo/gui/ModelListWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,12 +21,13 @@
 #include <list>
 #include <vector>
 #include <deque>
+#include <sdf/sdf.hh>
 
-#include "gui/qt.h"
-#include "sdf/sdf.hh"
-#include "msgs/msgs.hh"
-#include "transport/TransportTypes.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 class QTreeWidget;
 class QTreeWidgetItem;
@@ -50,7 +51,7 @@ namespace gazebo
   {
     class ModelEditWidget;
 
-    class ModelListWidget : public QWidget
+    class GAZEBO_VISIBLE ModelListWidget : public QWidget
     {
       Q_OBJECT
       public: ModelListWidget(QWidget *_parent = 0);
@@ -160,6 +161,13 @@ namespace gazebo
       private: void FillPoseProperty(const msgs::Pose &_msg,
                                      QtProperty *_parent);
 
+      /// \brief Fill the property tree with spherical coordinates info.
+      /// \param[in] _msg The spherical coordinates message.
+      /// \param[in] _parent Pointer to the qtproperty which will receive
+      /// the message data.
+      private: void FillPropertyTree(const msgs::SphericalCoordinates &_msg,
+                                     QtProperty *_parent);
+
       private: void ProcessModelMsgs();
       private: void ProcessLightMsgs();
       private: void ProcessRemoveEntity();
@@ -200,6 +208,7 @@ namespace gazebo
       private: QTreeWidgetItem *physicsItem;
       private: QTreeWidgetItem *modelsItem;
       private: QTreeWidgetItem *lightsItem;
+      private: QTreeWidgetItem *sphericalCoordItem;
 
       private: QtVariantPropertyManager *variantManager;
       private: QtVariantEditorFactory *variantFactory;
@@ -228,6 +237,7 @@ namespace gazebo
       private: msgs::Joint jointMsg;
       private: msgs::Physics physicsMsg;
       private: msgs::Light lightMsg;
+      private: msgs::SphericalCoordinates sphericalCoordMsg;
 
       private: bool fillPropertyTree;
       private: std::deque<std::string> fillTypes;
@@ -238,7 +248,7 @@ namespace gazebo
       private: msgs::Physics_Type physicsType;
     };
 
-    class ModelListSheetDelegate: public QItemDelegate
+    class GAZEBO_VISIBLE ModelListSheetDelegate: public QItemDelegate
     {
       Q_OBJECT
       public: ModelListSheetDelegate(QTreeView *view, QWidget *parent);
diff --git a/gazebo/gui/ModelListWidget_TEST.cc b/gazebo/gui/ModelListWidget_TEST.cc
new file mode 100644
index 0000000..42e0bc9
--- /dev/null
+++ b/gazebo/gui/ModelListWidget_TEST.cc
@@ -0,0 +1,855 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <boost/filesystem.hpp>
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/TransportIface.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/qtpropertybrowser/qttreepropertybrowser.h"
+#include "gazebo/gui/qtpropertybrowser/qtvariantproperty.h"
+#include "gazebo/gui/ModelListWidget.hh"
+#include "gazebo/gui/ModelListWidget_TEST.hh"
+
+#include "test_config.h"
+
+/////////////////////////////////////////////////
+void ModelListWidget_TEST::TreeWidget()
+{
+  QBENCHMARK
+  {
+    this->Load("worlds/empty.world");
+
+    gazebo::gui::ModelListWidget *modelListWidget
+        = new gazebo::gui::ModelListWidget;
+    QCoreApplication::processEvents();
+
+    // Get tree widget
+    QTreeWidget *modelTreeWidget = modelListWidget->findChild<QTreeWidget*>(
+        "modelTreeWidget");
+
+    QVERIFY(modelTreeWidget != NULL);
+
+    QList<QTreeWidgetItem *> treeSceneItems =
+        modelTreeWidget->findItems(tr("Scene"), Qt::MatchExactly);
+    QCOMPARE(treeSceneItems.size(), 1);
+
+    QList<QTreeWidgetItem *> treePhysicsItems =
+      modelTreeWidget->findItems(tr("Physics"), Qt::MatchExactly);
+    QCOMPARE(treePhysicsItems.size(), 1);
+
+    QList<QTreeWidgetItem *> treeLightItems =
+        modelTreeWidget->findItems(tr("Lights"), Qt::MatchExactly);
+    QCOMPARE(treeLightItems.size(), 1);
+
+    QList<QTreeWidgetItem *> treeModelItems =
+        modelTreeWidget->findItems(tr("Models"), Qt::MatchExactly);
+    QCOMPARE(treeModelItems.size(), 1);
+
+    QTreeWidgetItem *modelsItem = treeModelItems.front();
+    QVERIFY(modelsItem != NULL);
+
+    delete modelListWidget;
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelListWidget_TEST::OnResponse(ConstResponsePtr &_msg)
+{
+  gazebo::msgs::Model_V modelVMsg;
+  if (_msg->has_type() && _msg->type() == modelVMsg.GetTypeName())
+  {
+    modelVMsg.ParseFromString(_msg->serialized_data());
+    for (int i = 0; i < modelVMsg.models_size(); i++)
+    {
+      gazebo::gui::Events::modelUpdate(modelVMsg.models(i));
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelListWidget_TEST::CheckPoseProperty(QList<QtProperty *> _properties,
+    const gazebo::math::Pose &_pose)
+{
+  QCOMPARE(_properties.size(), 6);
+  QtVariantProperty *property =
+      static_cast<QtVariantProperty *>(_properties[0]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("x"));
+  QCOMPARE(property->value().toDouble(), _pose.pos.x);
+  property = static_cast<QtVariantProperty *>(_properties[1]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("y"));
+  QCOMPARE(property->value().toDouble(), _pose.pos.y);
+  property = static_cast<QtVariantProperty *>(_properties[2]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("z"));
+  QCOMPARE(property->value().toDouble(), _pose.pos.z);
+  property = static_cast<QtVariantProperty *>(_properties[3]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("roll"));
+  QCOMPARE(property->value().toDouble(), _pose.rot.GetAsEuler().x);
+  property = static_cast<QtVariantProperty *>(_properties[4]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("pitch"));
+  QCOMPARE(property->value().toDouble(), _pose.rot.GetAsEuler().y);
+  property = static_cast<QtVariantProperty *>(_properties[5]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("yaw"));
+  QCOMPARE(property->value().toDouble(), _pose.rot.GetAsEuler().z);
+}
+
+/////////////////////////////////////////////////
+void ModelListWidget_TEST::SetPoseProperty(
+    QtTreePropertyBrowser *propTreeBrowser,
+    QList<QtProperty *> _properties,
+    const gazebo::math::Pose &_pose)
+{
+  QCOMPARE(_properties.size(), 6);
+  QtVariantProperty *property =
+      static_cast<QtVariantProperty *>(_properties[0]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("x"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(_pose.pos.x);
+  property = static_cast<QtVariantProperty *>(_properties[1]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("y"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(_pose.pos.y);
+  property = static_cast<QtVariantProperty *>(_properties[2]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("z"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(_pose.pos.z);
+  property = static_cast<QtVariantProperty *>(_properties[3]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("roll"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(_pose.rot.GetAsEuler().x);
+  property = static_cast<QtVariantProperty *>(_properties[4]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("pitch"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(_pose.rot.GetAsEuler().y);
+  property = static_cast<QtVariantProperty *>(_properties[5]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("yaw"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(_pose.rot.GetAsEuler().z);
+  QTest::qWait(1000);
+}
+
+/////////////////////////////////////////////////
+void ModelListWidget_TEST::CheckLinkProperty(QList<QtProperty *> _properties,
+    const std::string &_name, bool _selfCollide, bool _gravity, bool _kinematic,
+    bool _canonical, const gazebo::math::Pose &_pose)
+{
+  // ignore checking link id in _properties[0]
+  QtVariantProperty *property =
+      static_cast<QtVariantProperty *>(_properties[1]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("name"));
+  QCOMPARE(property->valueText(), tr(_name.c_str()));
+  property = static_cast<QtVariantProperty *>(_properties[2]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("self_collide"));
+  QCOMPARE(property->value().toBool(), _selfCollide);
+  property = static_cast<QtVariantProperty *>(_properties[3]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("gravity"));
+  QCOMPARE(property->value().toBool(), _gravity);
+  property = static_cast<QtVariantProperty *>(_properties[4]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("kinematic"));
+  QCOMPARE(property->value().toBool(), _kinematic);
+  property = static_cast<QtVariantProperty *>(_properties[5]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("canonical"));
+  QCOMPARE(property->value().toBool(), _canonical);
+  property = static_cast<QtVariantProperty *>(_properties[6]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("pose"));
+  CheckPoseProperty(property->subProperties(), _pose);
+  // pose settings for canonical links should be disabled
+  QCOMPARE(property->isEnabled(), !_canonical);
+
+  /// TODO check inertial, collision, visual properties
+}
+
+/////////////////////////////////////////////////
+void ModelListWidget_TEST::SetLinkProperty(
+    QtTreePropertyBrowser *propTreeBrowser, QList<QtProperty *> _properties,
+    const std::string &_name, bool _selfCollide, bool _gravity, bool _kinematic,
+    bool _canonical, const gazebo::math::Pose &_pose)
+{
+  QtVariantProperty *property =
+      static_cast<QtVariantProperty *>(_properties[1]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("name"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(tr(_name.c_str()));
+  property = static_cast<QtVariantProperty *>(_properties[2]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("self_collide"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(_selfCollide);
+  property = static_cast<QtVariantProperty *>(_properties[3]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("gravity"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(_gravity);
+  property = static_cast<QtVariantProperty *>(_properties[4]);
+  Q_ASSERT(property);
+  QCOMPARE(property->propertyName(), tr("kinematic"));
+  QVERIFY(propTreeBrowser->items(property).size() == 1);
+  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+  property->setValue(_kinematic);
+  property = static_cast<QtVariantProperty *>(_properties[5]);
+  Q_ASSERT(property);
+  // only set the pose for non-canonical links
+  QCOMPARE(property->propertyName(), tr("canonical"));
+  QCOMPARE(property->value().toBool(), _canonical);
+  if (!property->value().toBool())
+  {
+    property = static_cast<QtVariantProperty *>(_properties[6]);
+    Q_ASSERT(property);
+    QCOMPARE(property->propertyName(), tr("pose"));
+    QVERIFY(propTreeBrowser->items(property).size() == 1);
+    propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+    propTreeBrowser->setExpanded(propTreeBrowser->topLevelItem(property), true);
+    this->SetPoseProperty(propTreeBrowser, property->subProperties(), _pose);
+  }
+  QTest::qWait(1000);
+  /// TODO set inertial, collision, visual properties
+}
+
+
+/////////////////////////////////////////////////
+void ModelListWidget_TEST::ModelsTree()
+{
+  gazebo::gui::ModelListWidget *modelListWidget
+      = new gazebo::gui::ModelListWidget;
+  QCoreApplication::processEvents();
+
+  this->Load("worlds/shapes.world");
+
+  gazebo::transport::NodePtr node;
+  node = gazebo::transport::NodePtr(new gazebo::transport::Node());
+  node->Init();
+  gazebo::transport::PublisherPtr requestPub =
+      node->Advertise<gazebo::msgs::Request>("~/request");
+  gazebo::transport::SubscriberPtr responseSub = node->Subscribe("~/response",
+      &ModelListWidget_TEST::OnResponse, this);
+
+  gazebo::msgs::Request *requestMsg =
+      gazebo::msgs::CreateRequest("entity_list");
+  requestPub->Publish(*requestMsg);
+
+  // Get tree widget
+  QTreeWidget *modelTreeWidget = modelListWidget->findChild<QTreeWidget *>(
+      "modelTreeWidget");
+
+  QList<QTreeWidgetItem *> treeModelItems =
+      modelTreeWidget->findItems(tr("Models"), Qt::MatchExactly);
+  QCOMPARE(treeModelItems.size(), 1);
+
+  QTreeWidgetItem *modelsItem = treeModelItems.front();
+  QVERIFY(modelsItem != NULL);
+
+  // verify that there are 4 models, ground plane, sphere, box, and cylinder
+  int modelCount = 4;
+  int maxSleep = 10;
+  int sleep = 0;
+  while (modelsItem->childCount() < modelCount && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(sleep < maxSleep);
+
+  // process more events and make sure the child count remain the same
+  sleep = 0;
+  maxSleep = 5;
+  while (sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    QCOMPARE(modelsItem->childCount(), modelCount);
+    sleep++;
+  }
+
+  // find all models in the tree
+  QTreeWidgetItem *groundPlaneItem = NULL;
+  QTreeWidgetItem *boxItem = NULL;
+  QTreeWidgetItem *sphereItem = NULL;
+  QTreeWidgetItem *cylinderItem = NULL;
+  for (int i = 0; i < modelsItem->childCount(); ++i)
+  {
+    QTreeWidgetItem *item = modelsItem->child(i);
+    if (item->text(0) == "ground_plane")
+      groundPlaneItem = item;
+    else if (item->text(0) == "box")
+      boxItem = item;
+    else if (item->text(0) == "sphere")
+      sphereItem = item;
+    else if (item->text(0) == "cylinder")
+      cylinderItem = item;
+  }
+
+  // verify all models are present
+  QVERIFY(groundPlaneItem != NULL);
+  QVERIFY(boxItem != NULL);
+  QVERIFY(sphereItem != NULL);
+  QVERIFY(cylinderItem != NULL);
+
+  node.reset();
+  delete requestMsg;
+  delete modelListWidget;
+  modelListWidget = NULL;
+}
+
+/////////////////////////////////////////////////
+void ModelListWidget_TEST::ModelProperties()
+{
+  gazebo::gui::ModelListWidget *modelListWidget
+      = new gazebo::gui::ModelListWidget;
+  modelListWidget->show();
+  QCoreApplication::processEvents();
+
+  this->Load("worlds/multilink_shape.world");
+
+  gazebo::transport::NodePtr node;
+  node = gazebo::transport::NodePtr(new gazebo::transport::Node());
+  node->Init();
+  gazebo::transport::PublisherPtr requestPub =
+      node->Advertise<gazebo::msgs::Request>("~/request");
+  gazebo::transport::SubscriberPtr responseSub = node->Subscribe("~/response",
+      &ModelListWidget_TEST::OnResponse, this);
+
+  gazebo::msgs::Request *requestMsg =
+      gazebo::msgs::CreateRequest("entity_list");
+  requestPub->Publish(*requestMsg);
+
+  // Get tree widget
+  QTreeWidget *modelTreeWidget = modelListWidget->findChild<QTreeWidget *>(
+      "modelTreeWidget");
+
+  QList<QTreeWidgetItem *> treeModelItems =
+      modelTreeWidget->findItems(tr("Models"), Qt::MatchExactly);
+  QCOMPARE(treeModelItems.size(), 1);
+
+  QTreeWidgetItem *modelsItem = treeModelItems.front();
+  QVERIFY(modelsItem != NULL);
+
+  // verify that there is only 1 model
+  int modelCount = 1;
+  int maxSleep = 10;
+  int sleep = 0;
+  while (modelsItem->childCount() < modelCount && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(sleep < maxSleep);
+
+  // Get the model item
+  QTreeWidgetItem *modelItem = modelsItem->child(0);
+  QVERIFY(modelItem != NULL);
+  std::string modelName = "multilink";
+  QCOMPARE(modelItem->text(0), tr(modelName.c_str()));
+
+  // Get propery browser widget
+  QtTreePropertyBrowser *propTreeBrowser =
+    modelListWidget->findChild<QtTreePropertyBrowser *>(
+      "propTreeBrowser");
+
+  QVERIFY(propTreeBrowser != NULL);
+  QCOMPARE(propTreeBrowser->properties().size(), 0);
+
+  // select the models item
+  QRect modelsRect = modelTreeWidget->visualItemRect(modelsItem);
+  QTest::mouseClick(modelTreeWidget->viewport(), Qt::LeftButton, 0,
+      modelsRect.center() );
+  QCoreApplication::processEvents();
+  // wait for the model to be selected
+  sleep = 0;
+  maxSleep = 5;
+  while (!modelsItem->isSelected() && sleep < maxSleep)
+  {
+    QTest::qWait(10);
+    sleep++;
+  }
+  QVERIFY(modelsItem->isSelected());
+
+  // select the multi-link model
+  QRect modelRect = modelTreeWidget->visualItemRect(modelItem);
+  QTest::mouseClick(modelTreeWidget->viewport(), Qt::LeftButton, 0,
+      modelRect.center() );
+  QCoreApplication::processEvents();
+  sleep = 0;
+  maxSleep = 5;
+  while (!modelItem->isSelected() && sleep < maxSleep)
+  {
+    QTest::qWait(10);
+    sleep++;
+  }
+  QVERIFY(modelItem->isSelected());
+
+  // wait for the model properties to appear
+  sleep = 0;
+  maxSleep = 10;
+  while (propTreeBrowser->properties().size() == 0 && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(propTreeBrowser->properties().size() > 0);
+
+  // check the model properties
+  bool hasName = false;
+  bool hasStatic = false;
+  bool hasPose = false;
+  int numLinks = 0;
+  int nameIndex = 1;
+  QList<QtProperty *> modelProperties = propTreeBrowser->properties();
+  for (int i = 0; i < modelProperties.size(); ++i)
+  {
+    QtVariantProperty *property =
+      static_cast<QtVariantProperty *>(modelProperties[i]);
+    if (property->propertyName() == tr("name"))
+    {
+      QCOMPARE(property->valueText(), tr(modelName.c_str()));
+      hasName = true;
+    }
+    else if (property->propertyName() == tr("is_static"))
+    {
+      QCOMPARE(property->value().toBool(), false);
+      hasStatic = true;
+    }
+    else if (property->propertyName() == tr("pose"))
+    {
+      this->CheckPoseProperty(property->subProperties(),
+          gazebo::math::Pose(0, 0, 0.5, 0, 0, 0));
+      hasPose = true;
+    }
+    else if (property->propertyName() == tr("link"))
+    {
+      QVERIFY(property->subProperties().size() > 0);
+      if (property->subProperties()[nameIndex]->valueText().toStdString().
+          find("box_link") != std::string::npos)
+      {
+        this->CheckLinkProperty(property->subProperties(),
+          modelName + "::box_link", false, true, false, true,
+          gazebo::math::Pose(1.0, 0, 0, 0, 0, 0));
+        numLinks++;
+      }
+      else if (property->subProperties()[nameIndex]->valueText().toStdString().
+        find("sphere_link") != std::string::npos)
+      {
+        this->CheckLinkProperty(property->subProperties(),
+            modelName + "::sphere_link", false, true, false, false,
+            gazebo::math::Pose(-1.5, 0, 0, 0, 0, 1.57));
+        numLinks++;
+      }
+    }
+  }
+  QVERIFY(hasName);
+  QVERIFY(hasStatic);
+  QVERIFY(hasPose);
+  // there should be 2 links
+  QCOMPARE(numLinks, 2);
+
+  numLinks = 0;
+  // change model properties
+  for (int i = 0; i < modelProperties.size(); ++i)
+  {
+    QtVariantProperty *property =
+      static_cast<QtVariantProperty *>(modelProperties[i]);
+
+    // TODO changing model name currently fails
+    // if (property->propertyName() == tr("name"))
+    // {
+    //  propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+    //  property->setValue(true);
+    // }
+    if (property->propertyName() == tr("is_static"))
+    {
+      propTreeBrowser->setCurrentItem(propTreeBrowser->items(property)[0]);
+      property->setValue(true);
+    }
+    else if (property->propertyName() == tr("pose"))
+    {
+      this->SetPoseProperty(propTreeBrowser, property->subProperties(),
+          gazebo::math::Pose(0, 0, 1.0, 0, 0, 0));
+    }
+    else if (property->propertyName() == tr("link"))
+    {
+      QVERIFY(property->subProperties().size() > 0);
+      if (property->subProperties()[nameIndex]->valueText().toStdString().
+          find("box_link") != std::string::npos)
+      {
+        this->SetLinkProperty(propTreeBrowser, property->subProperties(),
+            modelName + "::box_link", true, false, true, true,
+            gazebo::math::Pose(1.5, 2.0, 3.2, 0.6, 0.7, 0.8));
+        numLinks++;
+      }
+      else if (property->subProperties()[nameIndex]->valueText().toStdString().
+        find("sphere_link") != std::string::npos)
+      {
+        this->SetLinkProperty(propTreeBrowser, property->subProperties(),
+            modelName + "::sphere_link", true, false, true, false,
+            gazebo::math::Pose(-2.0, 0.5, 1.0, 3.14, 0, 0));
+        numLinks++;
+      }
+    }
+  }
+  QCOMPARE(numLinks, 2);
+
+  // select the multi-link model again to refresh the property browser
+  QTest::mouseClick(modelTreeWidget->viewport(), Qt::LeftButton, 0,
+      modelRect.center() );
+  QCoreApplication::processEvents();
+  QTest::qWait(100);
+  sleep = 0;
+  maxSleep = 5;
+  while (!modelItem->isSelected() && sleep < maxSleep)
+  {
+    QTest::qWait(10);
+    sleep++;
+  }
+  QVERIFY(modelItem->isSelected());
+  // wait for the model properties to appear
+  sleep = 0;
+  maxSleep = 10;
+  while (propTreeBrowser->properties().size() == 0 && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(propTreeBrowser->properties().size() > 0);
+
+  numLinks = 0;
+  // verify the model properties are sucessfully set
+  for (int i = 0; i < modelProperties.size(); ++i)
+  {
+    QtVariantProperty *property =
+      static_cast<QtVariantProperty *>(modelProperties[i]);
+
+    if (property->propertyName() == tr("is_static"))
+    {
+      QCOMPARE(property->value().toBool(), true);
+    }
+    else if (property->propertyName() == tr("pose"))
+    {
+      this->CheckPoseProperty(property->subProperties(),
+          gazebo::math::Pose(0, 0, 1.0, 0, 0, 0));
+    }
+    else if (property->propertyName() == tr("link"))
+    {
+      QVERIFY(property->subProperties().size() > 0);
+      if (property->subProperties()[nameIndex]->valueText().toStdString().
+          find("box_link") != std::string::npos)
+      {
+        // as this is the canonical link, the pose properties should remain
+        // unchanged
+        this->CheckLinkProperty(property->subProperties(),
+            modelName + "::box_link", true, false, true, true,
+            gazebo::math::Pose(1.0, 0, 0, 0, 0, 0));
+        numLinks++;
+      }
+      else if (property->subProperties()[nameIndex]->valueText().toStdString().
+        find("sphere_link") != std::string::npos)
+      {
+        this->CheckLinkProperty(property->subProperties(),
+            modelName + "::sphere_link", true, false, true, false,
+            gazebo::math::Pose(-2.0, 0.5, 1.0, 3.14, 0, 0));
+        numLinks++;
+      }
+    }
+  }
+  QCOMPARE(numLinks, 2);
+
+  modelListWidget->hide();
+  node.reset();
+  delete requestMsg;
+  delete modelListWidget;
+}
+
+/////////////////////////////////////////////////
+void ModelListWidget_TEST::LinkProperties()
+{
+  gazebo::gui::ModelListWidget *modelListWidget
+      = new gazebo::gui::ModelListWidget;
+  modelListWidget->show();
+  QCoreApplication::processEvents();
+
+  this->Load("worlds/multilink_shape.world");
+
+  gazebo::transport::NodePtr node;
+  node = gazebo::transport::NodePtr(new gazebo::transport::Node());
+  node->Init();
+  gazebo::transport::PublisherPtr requestPub =
+      node->Advertise<gazebo::msgs::Request>("~/request");
+  gazebo::transport::SubscriberPtr responseSub = node->Subscribe("~/response",
+      &ModelListWidget_TEST::OnResponse, this);
+
+  gazebo::msgs::Request *requestMsg =
+      gazebo::msgs::CreateRequest("entity_list");
+  requestPub->Publish(*requestMsg);
+
+  // Get tree widget
+  QTreeWidget *modelTreeWidget = modelListWidget->findChild<QTreeWidget *>(
+      "modelTreeWidget");
+
+  QList<QTreeWidgetItem *> treeModelItems =
+      modelTreeWidget->findItems(tr("Models"), Qt::MatchExactly);
+  QCOMPARE(treeModelItems.size(), 1);
+
+  QTreeWidgetItem *modelsItem = treeModelItems.front();
+  QVERIFY(modelsItem != NULL);
+
+  // verify that there is only 1 model
+  int modelCount = 1;
+  int maxSleep = 10;
+  int sleep = 0;
+  while (modelsItem->childCount() < modelCount && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(sleep < maxSleep);
+
+  // Get the model item
+  QTreeWidgetItem *modelItem = modelsItem->child(0);
+  QVERIFY(modelItem != NULL);
+  std::string modelName = "multilink";
+  QCOMPARE(modelItem->text(0), tr(modelName.c_str()));
+
+  // Get propery browser widget
+  QtTreePropertyBrowser *propTreeBrowser =
+    modelListWidget->findChild<QtTreePropertyBrowser *>(
+      "propTreeBrowser");
+
+  QVERIFY(propTreeBrowser != NULL);
+  QCOMPARE(propTreeBrowser->properties().size(), 0);
+
+  // select the models item
+  QRect modelsRect = modelTreeWidget->visualItemRect(modelsItem);
+  QTest::mouseClick(modelTreeWidget->viewport(), Qt::LeftButton, 0,
+      modelsRect.center() );
+  QCoreApplication::processEvents();
+  // wait for the models item to be selected
+  sleep = 0;
+  maxSleep = 5;
+  while (!modelsItem->isSelected() && sleep < maxSleep)
+  {
+    QTest::qWait(10);
+    sleep++;
+  }
+  QVERIFY(modelsItem->isSelected());
+
+  // select the multi-link model
+  QRect modelRect = modelTreeWidget->visualItemRect(modelItem);
+  QTest::mouseClick(modelTreeWidget->viewport(), Qt::LeftButton, 0,
+      modelRect.center());
+  QCoreApplication::processEvents();
+  sleep = 0;
+  maxSleep = 5;
+  while (!modelItem->isSelected() && sleep < maxSleep)
+  {
+    QTest::qWait(10);
+    sleep++;
+  }
+  QVERIFY(modelItem->isSelected());
+
+  // wait for the model properties to appear
+  sleep = 0;
+  maxSleep = 10;
+  while (propTreeBrowser->properties().size() == 0 && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(propTreeBrowser->properties().size() > 0);
+
+  // select the box link
+  QTreeWidgetItem *boxLinkItem = modelItem->child(0);
+  QVERIFY(boxLinkItem != NULL);
+  std::string boxLinkName = "box_link";
+  QCOMPARE(boxLinkItem->text(0), tr(boxLinkName.c_str()));
+
+  QRect boxLinkRect = modelTreeWidget->visualItemRect(boxLinkItem);
+  QTest::mouseClick(modelTreeWidget->viewport(), Qt::LeftButton, 0,
+      boxLinkRect.center() );
+  QCoreApplication::processEvents();
+  sleep = 0;
+  maxSleep = 5;
+  while (!boxLinkItem->isSelected() && sleep < maxSleep)
+  {
+    QTest::qWait(10);
+    sleep++;
+  }
+  QVERIFY(boxLinkItem->isSelected());
+
+  // wait for the box link properties to appear
+  sleep = 0;
+  maxSleep = 10;
+  while (propTreeBrowser->properties().size() == 0 && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(propTreeBrowser->properties().size() > 0);
+
+  // check the box link properties
+  this->CheckLinkProperty(propTreeBrowser->properties(),
+      modelName + "::" + boxLinkName, false, true, false, true,
+      gazebo::math::Pose(1.0, 0, 0, 0, 0, 0));
+
+  // change box link properties
+  // TODO changing link name currently fails.
+  this->SetLinkProperty(propTreeBrowser, propTreeBrowser->properties(),
+      modelName + "::" + boxLinkName, true, false, true, true,
+      gazebo::math::Pose(2.5, 1.0, 4.2, 0.8, 0.5, 0.1));
+
+  // select the box link again to refresh the property browser
+  QTest::mouseClick(modelTreeWidget->viewport(), Qt::LeftButton, 0,
+      boxLinkRect.center() );
+
+  QCoreApplication::processEvents();
+  QTest::qWait(100);
+  sleep = 0;
+  maxSleep = 5;
+  while (!boxLinkItem->isSelected() && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(10);
+    sleep++;
+  }
+  QVERIFY(boxLinkItem->isSelected());
+  // wait for the box link properties to appear
+  sleep = 0;
+  maxSleep = 10;
+  while (propTreeBrowser->properties().size() == 0 && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(propTreeBrowser->properties().size() > 0);
+
+  // verify the link properties are sucessfully set
+  // the link is canonical so the pose should remain the same
+  this->CheckLinkProperty(propTreeBrowser->properties(),
+      modelName + "::" + boxLinkName, true, false, true, true,
+      gazebo::math::Pose(1.0, 0, 0, 0, 0, 0));
+
+  // select the sphere link
+  QTreeWidgetItem *sphereLinkItem = modelItem->child(1);
+  QVERIFY(sphereLinkItem != NULL);
+  std::string sphereLinkName = "sphere_link";
+  QCOMPARE(sphereLinkItem->text(0), tr(sphereLinkName.c_str()));
+
+  QRect sphereLinkRect = modelTreeWidget->visualItemRect(sphereLinkItem);
+  QTest::mouseClick(modelTreeWidget->viewport(), Qt::LeftButton, 0,
+      sphereLinkRect.center() );
+  QCoreApplication::processEvents();
+  sleep = 0;
+  maxSleep = 5;
+  while (!sphereLinkItem->isSelected() && sleep < maxSleep)
+  {
+    QTest::qWait(10);
+    sleep++;
+  }
+  QVERIFY(sphereLinkItem->isSelected());
+
+  // wait for the sphere link properties to appear
+  sleep = 0;
+  maxSleep = 10;
+  while (propTreeBrowser->properties().size() == 0 && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(propTreeBrowser->properties().size() > 0);
+
+  // check the sphere link properties
+  this->CheckLinkProperty(propTreeBrowser->properties(),
+      modelName + "::" + sphereLinkName, false, true, false, false,
+      gazebo::math::Pose(-1.5, 0, 0, 0, 0, 1.57));
+
+  // change sphere link properties
+  // TODO changing link name currently fails.
+  this->SetLinkProperty(propTreeBrowser, propTreeBrowser->properties(),
+      modelName + "::" + sphereLinkName, true, false, true, false,
+      gazebo::math::Pose(-2.0, 0.1, -1.2, 0, 1.57, 0));
+
+  // select the sphere link again to refresh the property browser
+  QTest::mouseClick(modelTreeWidget->viewport(), Qt::LeftButton, 0,
+      sphereLinkRect.center() );
+  QCoreApplication::processEvents();
+  QTest::qWait(100);
+  sleep = 0;
+  maxSleep = 5;
+  while (!sphereLinkItem->isSelected() && sleep < maxSleep)
+  {
+    QTest::qWait(10);
+    sleep++;
+  }
+  QVERIFY(sphereLinkItem->isSelected());
+  // wait for the sphere link properties to appear
+  sleep = 0;
+  maxSleep = 10;
+  while (propTreeBrowser->properties().size() == 0 && sleep < maxSleep)
+  {
+    QCoreApplication::processEvents();
+    QTest::qWait(500);
+    sleep++;
+  }
+  QVERIFY(propTreeBrowser->properties().size() > 0);
+
+  // verify the link properties are sucessfully set
+  this->CheckLinkProperty(propTreeBrowser->properties(),
+      modelName + "::" + sphereLinkName, true, false, true, false,
+      gazebo::math::Pose(-2.0, 0.1, -1.2, 0, 1.57, 0));
+
+  modelListWidget->hide();
+  node.reset();
+  delete requestMsg;
+  delete modelListWidget;
+}
+
+// Generate a main function for the test
+QTEST_MAIN(ModelListWidget_TEST)
diff --git a/gazebo/gui/ModelListWidget_TEST.hh b/gazebo/gui/ModelListWidget_TEST.hh
new file mode 100644
index 0000000..9aa95cb
--- /dev/null
+++ b/gazebo/gui/ModelListWidget_TEST.hh
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _MODELLISTWIDGET_TEST_HH_
+#define _MODELLISTWIDGET_TEST_HH_
+
+#include <string>
+#include "gazebo/gui/QTestFixture.hh"
+
+class QtProperty;
+class QtTreePropertyBrowser;
+
+/// \brief A test class for the ModelListWidget.
+class ModelListWidget_TEST : public QTestFixture
+{
+  Q_OBJECT
+
+  /// \brief Response message received
+  /// \brief _msg Message containing the response data
+  private: void OnResponse(ConstResponsePtr &_msg);
+
+  /// \brief Verify pose attributes and values.
+  /// \param[in] _properties Pose properties.
+  /// \param[in] _pose Expected pose values.
+  private: void CheckPoseProperty(QList<QtProperty *> _properties,
+      const gazebo::math::Pose &_pose);
+
+  /// \brief Set pose values.
+  /// \param[in] _propTreeBrowser Property browser.
+  /// \param[in] _properties Pose properties.
+  /// \param[in] _pose Expected pose values.
+  private: void SetPoseProperty(QtTreePropertyBrowser *propTreeBrowser,
+      QList<QtProperty *> _properties,
+      const gazebo::math::Pose &_pose);
+
+  /// \brief Test link property attributes and values.
+  /// \param[in] _name Name of link.
+  /// \param[in] _selfCollide True if links in model self collide.
+  /// \param[in] _gravity True if gravity is enabled for this link.
+  /// \param[in] _kinematic True if the link is in kinematic mode.
+  /// \param[in] _canonical True if this is a canonical link.
+  /// \param[in] _pose Expected pose values.
+  private: void CheckLinkProperty(QList<QtProperty *> _properties,
+    const std::string &_name, bool _selfCollide, bool _gravity, bool _kinematic,
+    bool _canonical, const gazebo::math::Pose &_pose);
+
+  /// \brief Set link property values.
+  /// \param[in] _propTreeBrowser Property browser.
+  /// \param[in] _properties Link properties.
+  /// \param[in] _name Name of link.
+  /// \param[in] _selfCollide New self collide value.
+  /// \param[in] _gravity New gravity value.
+  /// \param[in] _kinematic New kinematic value.
+  /// \param[in] _canonical True if this is a canonical link and the pose
+  /// should not be set.
+  /// \param[in] _pose New pose values.
+  private: void SetLinkProperty(QtTreePropertyBrowser *propTreeBrowser,
+    QList<QtProperty *> _properties, const std::string &_name,
+    bool _selfCollide, bool _gravity, bool _kinematic, bool _canonical,
+    const gazebo::math::Pose &_pose);
+
+  /// \brief Test to see the tree widget has correct items.
+  private slots: void TreeWidget();
+
+  /// \brief Test that the model widget item contains all models in the world.
+  private slots: void ModelsTree();
+
+  /// \brief Test that the property browser displays correct model properties.
+  /// The test then modifies the properties, refresh the property browser, and
+  /// verify the changes are set.
+  private slots: void ModelProperties();
+
+  /// \brief Test that the property browser displays correct link properties.
+  /// This is similar to the ModelProperties test except the property browser
+  /// now only displays link properties as the result of directly clicking on
+  /// the link item in the models tree widget.
+  private slots: void LinkProperties();
+};
+
+#endif
diff --git a/gazebo/gui/ModelMaker.cc b/gazebo/gui/ModelMaker.cc
index 337bd45..ed35b3e 100644
--- a/gazebo/gui/ModelMaker.cc
+++ b/gazebo/gui/ModelMaker.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,24 +16,25 @@
  */
 #include <sstream>
 
-#include "msgs/msgs.hh"
+#include "gazebo/msgs/msgs.hh"
 
-#include "common/Console.hh"
-#include "common/MouseEvent.hh"
-#include "common/Exception.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/common/Exception.hh"
 
-#include "rendering/UserCamera.hh"
-#include "rendering/Visual.hh"
-#include "rendering/Scene.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/Scene.hh"
 
-#include "math/Quaternion.hh"
+#include "gazebo/math/Quaternion.hh"
 
-#include "transport/Publisher.hh"
-#include "transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
+#include "gazebo/transport/Node.hh"
 
-#include "gui/Gui.hh"
-#include "gui/GuiEvents.hh"
-#include "gui/ModelMaker.hh"
+#include "gazebo/gui/ModelManipulator.hh"
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/gui/ModelMaker.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -43,6 +44,7 @@ using namespace gui;
 : EntityMaker()
 {
   this->state = 0;
+  this->leftMousePressed = false;
   this->clone = false;
 }
 
@@ -53,28 +55,31 @@ ModelMaker::~ModelMaker()
 }
 
 /////////////////////////////////////////////////
-bool ModelMaker::InitFromModel(const std::string &_modelName)
-{
-  rendering::ScenePtr scene = gui::get_active_camera()->GetScene();
-  if (this->modelVisual)
-  {
-    scene->RemoveVisual(this->modelVisual);
-    this->modelVisual.reset();
-    this->visuals.clear();
-  }
-
-  this->modelVisual = scene->CloneVisual(_modelName, _modelName + "_clone_tmp");
-
-  if (!this->modelVisual)
-  {
-    gzerr << "Unable to clone\n";
-    return false;
-  }
-
-  this->clone = true;
-
-  return true;
-}
+// bool ModelMaker::InitFromModel(const std::string & /*_modelName*/)
+// {
+//   rendering::ScenePtr scene = gui::get_active_camera()->GetScene();
+//   if (this->modelVisual)
+//   {
+//     scene->RemoveVisual(this->modelVisual);
+//     this->modelVisual.reset();
+//     this->visuals.clear();
+//   }
+//
+//   // This function is currently not executed. Commenting out the following
+//   // line to prevent a compile warning.
+//   // this->modelVisual =
+//   // scene->CloneVisual(_modelName, _modelName + "_clone_tmp");
+//
+//   if (!this->modelVisual)
+//   {
+//     gzerr << "Unable to clone\n";
+//     return false;
+//   }
+//
+//   this->clone = true;
+//
+//   return true;
+// }
 
 /////////////////////////////////////////////////
 bool ModelMaker::InitFromSDFString(const std::string &_data)
@@ -148,10 +153,10 @@ bool ModelMaker::Init()
   }
 
   if (modelElem->HasElement("pose"))
-    modelPose = modelElem->GetValuePose("pose");
+    modelPose = modelElem->Get<math::Pose>("pose");
 
   modelName = this->node->GetTopicNamespace() + "::" +
-    modelElem->GetValueString("name");
+    modelElem->Get<std::string>("name");
 
   this->modelVisual.reset(new rendering::Visual(modelName,
                           scene->GetWorldVisual()));
@@ -171,9 +176,9 @@ bool ModelMaker::Init()
     {
       while (linkElem)
       {
-        std::string linkName = linkElem->GetValueString("name");
+        std::string linkName = linkElem->Get<std::string>("name");
         if (linkElem->HasElement("pose"))
-          linkPose = linkElem->GetValuePose("pose");
+          linkPose = linkElem->Get<math::Pose>("pose");
         else
           linkPose.Set(0, 0, 0, 0, 0, 0);
 
@@ -192,7 +197,7 @@ bool ModelMaker::Init()
         while (visualElem)
         {
           if (visualElem->HasElement("pose"))
-            visualPose = visualElem->GetValuePose("pose");
+            visualPose = visualElem->Get<math::Pose>("pose");
           else
             visualPose.Set(0, 0, 0, 0, 0, 0);
 
@@ -265,10 +270,16 @@ void ModelMaker::OnMousePush(const common::MouseEvent &/*_event*/)
 /////////////////////////////////////////////////
 void ModelMaker::OnMouseRelease(const common::MouseEvent &_event)
 {
-  if (_event.button == common::MouseEvent::LEFT && !_event.dragging)
+  if (_event.button == common::MouseEvent::LEFT)
   {
-    this->CreateTheEntity();
-    this->Stop();
+    // Place if not dragging, or if dragged for less than 50 pixels.
+    // The 50 pixels is used to account for accidental mouse movement
+    // when placing an object.
+    if (!_event.dragging || _event.pressPos.Distance(_event.pos) < 50)
+    {
+      this->CreateTheEntity();
+      this->Stop();
+    }
   }
 }
 
@@ -276,41 +287,11 @@ void ModelMaker::OnMouseRelease(const common::MouseEvent &_event)
 void ModelMaker::OnMouseMove(const common::MouseEvent &_event)
 {
   math::Pose pose = this->modelVisual->GetWorldPose();
-
-  math::Vector3 origin1, dir1, p1;
-  math::Vector3 origin2, dir2, p2;
-
-  // Cast two rays from the camera into the world
-  this->camera->GetCameraToViewportRay(_event.pos.x, _event.pos.y,
-      origin1, dir1);
-
-  // Compute the distance from the camera to plane of translation
-  math::Plane plane(math::Vector3(0, 0, 1), 0);
-
-  double dist1 = plane.Distance(origin1, dir1);
-
-  // Compute two points on the plane. The first point is the current
-  // mouse position, the second is the previous mouse position
-  p1 = origin1 + dir1 * dist1;
-  pose.pos = p1;
+  pose.pos = ModelManipulator::GetMousePositionOnPlane(this->camera, _event);
 
   if (!_event.shift)
   {
-    if (ceil(pose.pos.x) - pose.pos.x <= .4)
-      pose.pos.x = ceil(pose.pos.x);
-    else if (pose.pos.x - floor(pose.pos.x) <= .4)
-      pose.pos.x = floor(pose.pos.x);
-
-    if (ceil(pose.pos.y) - pose.pos.y <= .4)
-      pose.pos.y = ceil(pose.pos.y);
-    else if (pose.pos.y - floor(pose.pos.y) <= .4)
-      pose.pos.y = floor(pose.pos.y);
-
-    /*  if (ceil(pose.pos.z) - pose.pos.z <= .4)
-        pose.pos.z = ceil(pose.pos.z);
-        else if (pose.pos.z - floor(pose.pos.z) <= .4)
-        pose.pos.z = floor(pose.pos.z);
-        */
+    pose.pos = ModelManipulator::SnapPoint(pose.pos);
   }
   pose.pos.z = this->modelVisual->GetWorldPose().pos.z;
 
@@ -343,14 +324,14 @@ void ModelMaker::CreateTheEntity()
       isLight = true;
     }
 
-    std::string modelName = modelElem->GetValueString("name");
+    std::string modelName = modelElem->Get<std::string>("name");
 
     // Automatically create a new name if the model exists
     int i = 0;
     while ((isModel && has_entity_name(modelName)) ||
         (isLight && scene->GetLight(modelName)))
     {
-      modelName = modelElem->GetValueString("name") + "_" +
+      modelName = modelElem->Get<std::string>("name") + "_" +
         boost::lexical_cast<std::string>(i++);
     }
 
diff --git a/gazebo/gui/ModelMaker.hh b/gazebo/gui/ModelMaker.hh
index 4dd06a2..8412a93 100644
--- a/gazebo/gui/ModelMaker.hh
+++ b/gazebo/gui/ModelMaker.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,9 +19,10 @@
 
 #include <list>
 #include <string>
+#include <sdf/sdf.hh>
 
-#include "sdf/sdf.hh"
-#include "gui/EntityMaker.hh"
+#include "gazebo/gui/EntityMaker.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,12 +33,12 @@ namespace gazebo
 
   namespace gui
   {
-    class ModelMaker : public EntityMaker
+    class GAZEBO_VISIBLE ModelMaker : public EntityMaker
     {
       public: ModelMaker();
       public: virtual ~ModelMaker();
 
-      public: bool InitFromModel(const std::string &_modelName);
+      // public: bool InitFromModel(const std::string &_modelName);
       public: bool InitFromSDFString(const std::string &_data);
       public: bool InitFromFile(const std::string &_filename);
 
diff --git a/gazebo/gui/ModelManipulator.cc b/gazebo/gui/ModelManipulator.cc
new file mode 100644
index 0000000..02e96dc
--- /dev/null
+++ b/gazebo/gui/ModelManipulator.cc
@@ -0,0 +1,824 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/transport/transport.hh"
+
+#include "gazebo/rendering/RenderEvents.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/RenderEngine.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/SelectionObj.hh"
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/gui/MouseEventHandler.hh"
+#include "gazebo/gui/GuiIface.hh"
+
+#include "gazebo/gui/ModelManipulatorPrivate.hh"
+#include "gazebo/gui/ModelManipulator.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+ModelManipulator::ModelManipulator()
+  : dataPtr(new ModelManipulatorPrivate)
+{
+  this->dataPtr->initialized = false;
+  this->dataPtr->selectionObj.reset();
+  this->dataPtr->mouseMoveVis.reset();
+
+  this->dataPtr->manipMode = "";
+  this->dataPtr->globalManip = false;
+}
+
+/////////////////////////////////////////////////
+ModelManipulator::~ModelManipulator()
+{
+  this->dataPtr->modelPub.reset();
+  this->dataPtr->selectionObj.reset();
+  delete this->dataPtr;
+  this->dataPtr = NULL;
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::Init()
+{
+  if (this->dataPtr->initialized)
+    return;
+
+  rendering::UserCameraPtr cam = gui::get_active_camera();
+  if (!cam)
+    return;
+
+  if (!cam->GetScene())
+    return;
+
+  this->dataPtr->userCamera = cam;
+  this->dataPtr->scene =  cam->GetScene();
+
+  this->dataPtr->node = transport::NodePtr(new transport::Node());
+  this->dataPtr->node->Init();
+  this->dataPtr->modelPub =
+      this->dataPtr->node->Advertise<msgs::Model>("~/model/modify");
+  this->dataPtr->lightPub =
+      this->dataPtr->node->Advertise<msgs::Light>("~/light");
+
+  this->dataPtr->selectionObj.reset(new rendering::SelectionObj("__GL_MANIP__",
+      this->dataPtr->scene->GetWorldVisual()));
+  this->dataPtr->selectionObj->Load();
+
+  this->dataPtr->initialized = true;
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::RotateEntity(rendering::VisualPtr &_vis,
+    const math::Vector3 &_axis, bool _local)
+{
+  math::Vector3 normal;
+
+  if (_local)
+  {
+    if (_axis.x > 0)
+      normal = this->dataPtr->mouseMoveVisStartPose.rot.GetXAxis();
+    else if (_axis.y > 0)
+      normal = this->dataPtr->mouseMoveVisStartPose.rot.GetYAxis();
+    else if (_axis.z > 0)
+      normal = this->dataPtr->mouseMoveVisStartPose.rot.GetZAxis();
+  }
+  else
+    normal = _axis;
+
+  double offset = this->dataPtr->mouseMoveVisStartPose.pos.Dot(normal);
+
+  math::Vector3 pressPoint;
+  this->dataPtr->userCamera->GetWorldPointOnPlane(
+      this->dataPtr->mouseEvent.pressPos.x,
+      this->dataPtr->mouseEvent.pressPos.y,
+      math::Plane(normal, offset), pressPoint);
+
+  math::Vector3 newPoint;
+  this->dataPtr->userCamera->GetWorldPointOnPlane(
+      this->dataPtr->mouseEvent.pos.x,
+      this->dataPtr->mouseEvent.pos.y,
+      math::Plane(normal, offset), newPoint);
+
+  math::Vector3 v1 = pressPoint - this->dataPtr->mouseMoveVisStartPose.pos;
+  math::Vector3 v2 = newPoint - this->dataPtr->mouseMoveVisStartPose.pos;
+  v1 = v1.Normalize();
+  v2 = v2.Normalize();
+  double signTest = v1.Cross(v2).Dot(normal);
+  double angle = atan2((v1.Cross(v2)).GetLength(), v1.Dot(v2));
+
+  if (signTest < 0 )
+    angle *= -1;
+
+  if (this->dataPtr->mouseEvent.control)
+    angle = rint(angle / (M_PI * 0.25)) * (M_PI * 0.25);
+
+  math::Quaternion rot(_axis, angle);
+
+  if (_local)
+    rot = this->dataPtr->mouseMoveVisStartPose.rot * rot;
+  else
+    rot = rot * this->dataPtr->mouseMoveVisStartPose.rot;
+
+  _vis->SetWorldRotation(rot);
+}
+
+/////////////////////////////////////////////////
+math::Vector3 ModelManipulator::GetMousePositionOnPlane(
+    rendering::CameraPtr _camera,
+    const common::MouseEvent &_event)
+{
+  math::Vector3 origin1, dir1, p1;
+
+  // Cast ray from the camera into the world
+  _camera->GetCameraToViewportRay(_event.pos.x, _event.pos.y,
+      origin1, dir1);
+
+  // Compute the distance from the camera to plane of translation
+  math::Plane plane(math::Vector3(0, 0, 1), 0);
+  double dist1 = plane.Distance(origin1, dir1);
+
+  p1 = origin1 + dir1 * dist1;
+
+  return p1;
+}
+
+/////////////////////////////////////////////////
+math::Vector3 ModelManipulator::SnapPoint(const math::Vector3 &_point,
+    double _interval, double _sensitivity)
+{
+  if (_interval < 0)
+  {
+    gzerr << "Interval distance must be greater than or equal to 0"
+        << std::endl;
+    return math::Vector3::Zero;
+  }
+
+  if (_sensitivity < 0 || _sensitivity > 1.0)
+  {
+    gzerr << "Sensitivity must be between 0 and 1" << std::endl;
+    return math::Vector3::Zero;
+  }
+
+  math::Vector3 point = _point;
+  double snap = _interval * _sensitivity;
+
+  double remainder = fmod(point.x, _interval);
+  int sign = remainder >= 0 ? 1 : -1;
+  if (fabs(remainder) < snap)
+      point.x -= remainder;
+  else if (fabs(remainder) > (_interval - snap))
+      point.x = point.x - remainder + _interval * sign;
+
+  remainder = fmod(point.y, _interval);
+  sign = remainder >= 0 ? 1 : -1;
+  if (fabs(remainder) < snap)
+      point.y -= remainder;
+  else if (fabs(remainder) > (_interval - snap))
+      point.y = point.y - remainder + _interval * sign;
+
+  remainder = fmod(point.z, _interval);
+  sign = remainder >= 0 ? 1 : -1;
+  if (fabs(remainder) < snap)
+      point.z -= remainder;
+  else if (fabs(remainder) > (_interval - snap))
+      point.z = point.z - remainder + _interval * sign;
+
+  return point;
+}
+
+/////////////////////////////////////////////////
+math::Vector3 ModelManipulator::GetMouseMoveDistance(
+    rendering::CameraPtr _camera,
+    const math::Vector2i &_start, const math::Vector2i &_end,
+    const math::Pose &_pose, const math::Vector3 &_axis, bool _local)
+{
+  math::Pose pose = _pose;
+
+  math::Vector3 origin1, dir1, p1;
+  math::Vector3 origin2, dir2, p2;
+
+  // Cast two rays from the camera into the world
+  _camera->GetCameraToViewportRay(_end.x,
+      _end.y, origin1, dir1);
+  _camera->GetCameraToViewportRay(_start.x,
+      _start.y, origin2, dir2);
+
+  math::Vector3 planeNorm(0, 0, 0);
+  math::Vector3 projNorm(0, 0, 0);
+
+  math::Vector3 planeNormOther(0, 0, 0);
+
+  if (_axis.x > 0 && _axis.y > 0)
+  {
+    planeNorm.z = 1;
+    projNorm.z = 1;
+  }
+  else if (_axis.z > 0)
+  {
+    planeNorm.y = 1;
+    projNorm.x = 1;
+    planeNormOther.x = 1;
+  }
+  else if (_axis.x > 0)
+  {
+    planeNorm.z = 1;
+    projNorm.y = 1;
+    planeNormOther.y = 1;
+  }
+  else if (_axis.y > 0)
+  {
+    planeNorm.z = 1;
+    projNorm.x = 1;
+    planeNormOther.x = 1;
+  }
+
+  if (_local)
+  {
+    planeNorm = pose.rot.RotateVector(planeNorm);
+    projNorm = pose.rot.RotateVector(projNorm);
+  }
+
+  // Fine tune ray casting: cast a second ray and compare the two rays' angle
+  // to plane. Use the one that is less parallel to plane for better results.
+  double angle = dir1.Dot(planeNorm);
+  if (_local)
+    planeNormOther = pose.rot.RotateVector(planeNormOther);
+  double angleOther = dir1.Dot(planeNormOther);
+  if (fabs(angleOther) > fabs(angle))
+  {
+    projNorm = planeNorm;
+    planeNorm = planeNormOther;
+  }
+
+  // Compute the distance from the camera to plane
+  double d = pose.pos.Dot(planeNorm);
+  math::Plane plane(planeNorm, d);
+  double dist1 = plane.Distance(origin1, dir1);
+  double dist2 = plane.Distance(origin2, dir2);
+
+  // Compute two points on the plane. The first point is the current
+  // mouse position, the second is the previous mouse position
+  p1 = origin1 + dir1 * dist1;
+  p2 = origin2 + dir2 * dist2;
+
+  if (_local)
+    p1 = p1 - (p1-p2).Dot(projNorm) * projNorm;
+
+  math::Vector3 distance = p1 - p2;
+
+  if (!_local)
+    distance *= _axis;
+
+  return distance;
+}
+
+/////////////////////////////////////////////////
+math::Vector3 ModelManipulator::GetMouseMoveDistance(const math::Pose &_pose,
+    const math::Vector3 &_axis, bool _local) const
+{
+  return GetMouseMoveDistance(this->dataPtr->userCamera,
+      this->dataPtr->mouseStart, math::Vector2i(this->dataPtr->mouseEvent.pos.x,
+      this->dataPtr->mouseEvent.pos.y), _pose, _axis, _local);
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::ScaleEntity(rendering::VisualPtr &_vis,
+    const math::Vector3 &_axis, bool _local)
+{
+  math::Box bbox = this->dataPtr->mouseVisualBbox;
+  math::Pose pose = _vis->GetWorldPose();
+  math::Vector3 distance =  this->GetMouseMoveDistance(pose, _axis, _local);
+
+  math::Vector3 bboxSize = bbox.GetSize();
+  math::Vector3 scale = (bboxSize + pose.rot.RotateVectorReverse(distance))
+      / bboxSize;
+
+  // a bit hacky to check for unit sphere and cylinder simple shapes in order
+  // to restrict the scaling dimensions.
+  if (this->dataPtr->keyEvent.key == Qt::Key_Shift ||
+      _vis->GetName().find("unit_sphere") != std::string::npos)
+  {
+    if (_axis.x > 0)
+    {
+      scale.y = scale.x;
+      scale.z = scale.x;
+    }
+    else if (_axis.y > 0)
+    {
+      scale.x = scale.y;
+      scale.z = scale.y;
+    }
+    else if (_axis.z > 0)
+    {
+      scale.x = scale.z;
+      scale.y = scale.z;
+    }
+  }
+  else if (_vis->GetName().find("unit_cylinder") != std::string::npos)
+  {
+    if (_axis.x > 0)
+    {
+      scale.y = scale.x;
+    }
+    else if (_axis.y > 0)
+    {
+      scale.x = scale.y;
+    }
+  }
+  else if (_vis->GetName().find("unit_box") != std::string::npos)
+  {
+  }
+  else
+  {
+    // TODO scaling for complex models are not yet functional.
+    // Limit scaling to simple shapes for now.
+    gzwarn << " Scaling is currently limited to simple shapes." << std::endl;
+    return;
+  }
+
+  math::Vector3 newScale = this->dataPtr->mouseVisualScale * scale.GetAbs();
+
+  if (this->dataPtr->mouseEvent.control)
+  {
+    newScale = SnapPoint(newScale);
+  }
+
+  _vis->SetScale(newScale);
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::TranslateEntity(rendering::VisualPtr &_vis,
+    const math::Vector3 &_axis, bool _local)
+{
+  math::Pose pose = _vis->GetWorldPose();
+  math::Vector3 distance =  this->GetMouseMoveDistance(pose, _axis, _local);
+
+  pose.pos = this->dataPtr->mouseMoveVisStartPose.pos + distance;
+
+  if (this->dataPtr->mouseEvent.control)
+  {
+    pose.pos = SnapPoint(pose.pos);
+  }
+
+  if (!(_axis.z > 0) && !_local)
+    pose.pos.z = _vis->GetWorldPose().pos.z;
+
+  _vis->SetWorldPose(pose);
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::PublishVisualPose(rendering::VisualPtr _vis)
+{
+  if (_vis)
+  {
+    // Check to see if the visual is a model.
+    if (gui::get_entity_id(_vis->GetName()))
+    {
+      msgs::Model msg;
+      msg.set_id(gui::get_entity_id(_vis->GetName()));
+      msg.set_name(_vis->GetName());
+
+      msgs::Set(msg.mutable_pose(), _vis->GetWorldPose());
+      this->dataPtr->modelPub->Publish(msg);
+    }
+    // Otherwise, check to see if the visual is a light
+    else if (this->dataPtr->scene->GetLight(_vis->GetName()))
+    {
+      msgs::Light msg;
+      msg.set_name(_vis->GetName());
+      msgs::Set(msg.mutable_pose(), _vis->GetWorldPose());
+      this->dataPtr->lightPub->Publish(msg);
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::PublishVisualScale(rendering::VisualPtr _vis)
+{
+  if (_vis)
+  {
+    // Check to see if the visual is a model.
+    if (gui::get_entity_id(_vis->GetName()))
+    {
+      msgs::Model msg;
+      msg.set_id(gui::get_entity_id(_vis->GetName()));
+      msg.set_name(_vis->GetName());
+
+      msgs::Set(msg.mutable_scale(), _vis->GetScale());
+      this->dataPtr->modelPub->Publish(msg);
+      _vis->SetScale(this->dataPtr->mouseVisualScale);
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::OnMousePressEvent(const common::MouseEvent &_event)
+{
+  this->dataPtr->mouseEvent = _event;
+  this->dataPtr->mouseStart = _event.pressPos;
+  this->SetMouseMoveVisual(rendering::VisualPtr());
+
+  rendering::VisualPtr vis;
+  rendering::VisualPtr mouseVis
+      = this->dataPtr->userCamera->GetVisual(this->dataPtr->mouseEvent.pos);
+  // set the new mouse vis only if there are no modifier keys pressed and the
+  // entity was different from the previously selected one.
+  if (!this->dataPtr->keyEvent.key && (this->dataPtr->selectionObj->GetMode() ==
+       rendering::SelectionObj::SELECTION_NONE
+      || (mouseVis && mouseVis != this->dataPtr->selectionObj->GetParent())))
+  {
+    vis = mouseVis;
+  }
+  else
+  {
+    vis = this->dataPtr->selectionObj->GetParent();
+  }
+
+  if (vis && !vis->IsPlane() &&
+      this->dataPtr->mouseEvent.button == common::MouseEvent::LEFT)
+  {
+    if (gui::get_entity_id(vis->GetRootVisual()->GetName()))
+    {
+      vis = vis->GetRootVisual();
+    }
+
+    this->dataPtr->mouseMoveVisStartPose = vis->GetWorldPose();
+
+    this->SetMouseMoveVisual(vis);
+
+    event::Events::setSelectedEntity(
+        this->dataPtr->mouseMoveVis->GetName(), "move");
+    QApplication::setOverrideCursor(Qt::ClosedHandCursor);
+
+    if (this->dataPtr->mouseMoveVis && !this->dataPtr->mouseMoveVis->IsPlane())
+    {
+      this->dataPtr->selectionObj->Attach(this->dataPtr->mouseMoveVis);
+      this->dataPtr->selectionObj->SetMode(this->dataPtr->manipMode);
+    }
+    else
+    {
+      this->dataPtr->selectionObj->SetMode(
+          rendering::SelectionObj::SELECTION_NONE);
+      this->dataPtr->selectionObj->Detach();
+    }
+  }
+  else
+    this->dataPtr->userCamera->HandleMouseEvent(this->dataPtr->mouseEvent);
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::OnMouseMoveEvent(const common::MouseEvent &_event)
+{
+  this->dataPtr->mouseEvent = _event;
+  if (this->dataPtr->mouseEvent.dragging)
+  {
+    if (this->dataPtr->mouseMoveVis &&
+        this->dataPtr->mouseEvent.button == common::MouseEvent::LEFT)
+    {
+      math::Vector3 axis = math::Vector3::Zero;
+      if (this->dataPtr->keyEvent.key == Qt::Key_X)
+        axis.x = 1;
+      else if (this->dataPtr->keyEvent.key == Qt::Key_Y)
+        axis.y = 1;
+      else if (this->dataPtr->keyEvent.key == Qt::Key_Z)
+        axis.z = 1;
+
+      if (this->dataPtr->selectionObj->GetMode() ==
+          rendering::SelectionObj::TRANS)
+      {
+        if (axis != math::Vector3::Zero)
+        {
+          this->TranslateEntity(this->dataPtr->mouseMoveVis, axis, false);
+        }
+        else if (this->dataPtr->selectionObj->GetState()
+            == rendering::SelectionObj::TRANS_X)
+        {
+          this->TranslateEntity(this->dataPtr->mouseMoveVis,
+              math::Vector3::UnitX, !this->dataPtr->globalManip);
+        }
+        else if (this->dataPtr->selectionObj->GetState()
+            == rendering::SelectionObj::TRANS_Y)
+        {
+          this->TranslateEntity(this->dataPtr->mouseMoveVis,
+              math::Vector3::UnitY, !this->dataPtr->globalManip);
+        }
+        else if (this->dataPtr->selectionObj->GetState()
+            == rendering::SelectionObj::TRANS_Z)
+        {
+          this->TranslateEntity(this->dataPtr->mouseMoveVis,
+            math::Vector3::UnitZ, !this->dataPtr->globalManip);
+        }
+        else
+        {
+          this->TranslateEntity(
+              this->dataPtr->mouseMoveVis, math::Vector3(1, 1, 0));
+        }
+      }
+      else if (this->dataPtr->selectionObj->GetMode()
+          == rendering::SelectionObj::ROT)
+      {
+        if (axis != math::Vector3::Zero)
+        {
+          this->RotateEntity(this->dataPtr->mouseMoveVis, axis, false);
+        }
+        else if (this->dataPtr->selectionObj->GetState()
+            == rendering::SelectionObj::ROT_X
+            || this->dataPtr->keyEvent.key == Qt::Key_X)
+        {
+          this->RotateEntity(this->dataPtr->mouseMoveVis, math::Vector3::UnitX,
+              !this->dataPtr->globalManip);
+        }
+        else if (this->dataPtr->selectionObj->GetState()
+            == rendering::SelectionObj::ROT_Y
+            || this->dataPtr->keyEvent.key == Qt::Key_Y)
+        {
+          this->RotateEntity(this->dataPtr->mouseMoveVis, math::Vector3::UnitY,
+              !this->dataPtr->globalManip);
+        }
+        else if (this->dataPtr->selectionObj->GetState()
+            == rendering::SelectionObj::ROT_Z
+            || this->dataPtr->keyEvent.key == Qt::Key_Z)
+        {
+          this->RotateEntity(this->dataPtr->mouseMoveVis, math::Vector3::UnitZ,
+              !this->dataPtr->globalManip);
+        }
+      }
+      else if (this->dataPtr->selectionObj->GetMode()
+          == rendering::SelectionObj::SCALE)
+      {
+        if (axis != math::Vector3::Zero)
+        {
+          this->ScaleEntity(this->dataPtr->mouseMoveVis, axis, false);
+        }
+        else if (this->dataPtr->selectionObj->GetState()
+            == rendering::SelectionObj::SCALE_X
+            || this->dataPtr->keyEvent.key == Qt::Key_X)
+        {
+          this->ScaleEntity(this->dataPtr->mouseMoveVis,
+              math::Vector3::UnitX, true);
+        }
+        else if (this->dataPtr->selectionObj->GetState()
+            == rendering::SelectionObj::SCALE_Y
+            || this->dataPtr->keyEvent.key == Qt::Key_Y)
+        {
+          this->ScaleEntity(this->dataPtr->mouseMoveVis,
+              math::Vector3::UnitY, true);
+        }
+        else if (this->dataPtr->selectionObj->GetState()
+            == rendering::SelectionObj::SCALE_Z
+            || this->dataPtr->keyEvent.key == Qt::Key_Z)
+        {
+          this->ScaleEntity(this->dataPtr->mouseMoveVis,
+              math::Vector3::UnitZ, true);
+        }
+      }
+    }
+    else
+      this->dataPtr->userCamera->HandleMouseEvent(this->dataPtr->mouseEvent);
+  }
+  else
+  {
+    std::string manipState;
+    this->dataPtr->userCamera->GetVisual(this->dataPtr->mouseEvent.pos,
+        manipState);
+    this->dataPtr->selectionObj->SetState(manipState);
+
+    if (!manipState.empty())
+      QApplication::setOverrideCursor(Qt::OpenHandCursor);
+    else
+    {
+      rendering::VisualPtr vis = this->dataPtr->userCamera->GetVisual(
+          this->dataPtr->mouseEvent.pos);
+
+      if (vis && !vis->IsPlane())
+        QApplication::setOverrideCursor(Qt::OpenHandCursor);
+      else
+        QApplication::setOverrideCursor(Qt::ArrowCursor);
+      this->dataPtr->userCamera->HandleMouseEvent(this->dataPtr->mouseEvent);
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+void ModelManipulator::OnMouseReleaseEvent(const common::MouseEvent &_event)
+{
+  this->dataPtr->mouseEvent = _event;
+  if (this->dataPtr->mouseEvent.dragging)
+  {
+    // If we were dragging a visual around, then publish its new pose to the
+    // server
+    if (this->dataPtr->mouseMoveVis)
+    {
+      if (this->dataPtr->manipMode == "scale")
+      {
+        this->dataPtr->selectionObj->UpdateSize();
+        this->PublishVisualScale(this->dataPtr->mouseMoveVis);
+      }
+      else
+        this->PublishVisualPose(this->dataPtr->mouseMoveVis);
+      this->SetMouseMoveVisual(rendering::VisualPtr());
+      QApplication::setOverrideCursor(Qt::OpenHandCursor);
+    }
+    event::Events::setSelectedEntity("", "normal");
+  }
+  else
+  {
+    if (this->dataPtr->mouseEvent.button == common::MouseEvent::LEFT)
+    {
+      rendering::VisualPtr vis =
+        this->dataPtr->userCamera->GetVisual(this->dataPtr->mouseEvent.pos);
+      if (vis && vis->IsPlane())
+      {
+        this->dataPtr->selectionObj->SetMode(
+            rendering::SelectionObj::SELECTION_NONE);
+        this->dataPtr->selectionObj->Detach();
+      }
+    }
+  }
+  this->dataPtr->userCamera->HandleMouseEvent(this->dataPtr->mouseEvent);
+}
+
+//////////////////////////////////////////////////
+void ModelManipulator::SetManipulationMode(const std::string &_mode)
+{
+  this->dataPtr->manipMode = _mode;
+  if (this->dataPtr->selectionObj->GetMode() !=
+      rendering::SelectionObj::SELECTION_NONE ||  this->dataPtr->mouseMoveVis)
+  {
+    this->dataPtr->selectionObj->SetMode(this->dataPtr->manipMode);
+    if (this->dataPtr->manipMode != "translate"
+        && this->dataPtr->manipMode != "rotate"
+        && this->dataPtr->manipMode != "scale")
+      this->SetMouseMoveVisual(rendering::VisualPtr());
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::SetAttachedVisual(rendering::VisualPtr _vis)
+{
+  rendering::VisualPtr vis = _vis;
+
+  if (gui::get_entity_id(vis->GetRootVisual()->GetName()))
+    vis = vis->GetRootVisual();
+
+  this->dataPtr->mouseMoveVisStartPose = vis->GetWorldPose();
+
+  this->SetMouseMoveVisual(vis);
+
+  if (this->dataPtr->mouseMoveVis && !this->dataPtr->mouseMoveVis->IsPlane())
+    this->dataPtr->selectionObj->Attach(this->dataPtr->mouseMoveVis);
+}
+
+/////////////////////////////////////////////////
+void ModelManipulator::SetMouseMoveVisual(rendering::VisualPtr _vis)
+{
+  this->dataPtr->mouseMoveVis = _vis;
+  if (_vis)
+  {
+    this->dataPtr->mouseVisualScale = _vis->GetScale();
+    this->dataPtr->mouseVisualBbox = _vis->GetBoundingBox();
+  }
+  else
+    this->dataPtr->mouseVisualScale = math::Vector3::One;
+}
+
+//////////////////////////////////////////////////
+void ModelManipulator::OnKeyPressEvent(const common::KeyEvent &_event)
+{
+  this->dataPtr->keyEvent = _event;
+  // reset mouseMoveVisStartPose if in manipulation mode.
+  if (this->dataPtr->manipMode == "translate"
+      || this->dataPtr->manipMode == "rotate"
+      || this->dataPtr->manipMode == "scale")
+  {
+    if (_event.key == Qt::Key_X || _event.key == Qt::Key_Y
+        || _event.key == Qt::Key_Z)
+    {
+      this->dataPtr->mouseStart = this->dataPtr->mouseEvent.pos;
+      if (this->dataPtr->mouseMoveVis)
+      {
+        this->dataPtr->mouseMoveVisStartPose =
+            this->dataPtr->mouseMoveVis->GetWorldPose();
+      }
+    }
+    else  if (this->dataPtr->keyEvent.key == Qt::Key_Shift)
+    {
+      this->dataPtr->globalManip = true;
+      this->dataPtr->selectionObj->SetGlobal(this->dataPtr->globalManip);
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+void ModelManipulator::OnKeyReleaseEvent(const common::KeyEvent &_event)
+{
+  this->dataPtr->keyEvent = _event;
+  // reset mouseMoveVisStartPose if in manipulation mode.
+  if (this->dataPtr->manipMode == "translate"
+      || this->dataPtr->manipMode == "rotate"
+      || this->dataPtr->manipMode == "scale")
+  {
+    if (_event.key == Qt::Key_X || _event.key == Qt::Key_Y
+        || _event.key == Qt::Key_Z)
+    {
+      this->dataPtr->mouseStart = this->dataPtr->mouseEvent.pos;
+      if (this->dataPtr->mouseMoveVis)
+      {
+        this->dataPtr->mouseMoveVisStartPose =
+            this->dataPtr->mouseMoveVis->GetWorldPose();
+      }
+    }
+    else  if (this->dataPtr->keyEvent.key == Qt::Key_Shift)
+    {
+      this->dataPtr->globalManip = false;
+      this->dataPtr->selectionObj->SetGlobal(this->dataPtr->globalManip);
+    }
+  }
+  this->dataPtr->keyEvent.key = 0;
+}
+
+// Function migrated here from GLWidget.cc and commented out since it doesn't
+// seem like it's currently used. Kept here for future references
+/////////////////////////////////////////////////
+/*void GLWidget::SmartMoveVisual(rendering::VisualPtr _vis)
+{
+  if (!this->dataPtr->mouseEvent.dragging)
+    return;
+
+  // Get the point on the plane which correspoinds to the mouse
+  math::Vector3 pp;
+
+  // Rotate the visual using the middle mouse button
+  if (this->dataPtr->mouseEvent.buttons == common::MouseEvent::MIDDLE)
+  {
+    math::Vector3 rpy = this->dataPtr->mouseMoveVisStartPose.rot.GetAsEuler();
+    math::Vector2i delta = this->dataPtr->mouseEvent.pos -
+        this->dataPtr->mouseEvent.pressPos;
+    double yaw = (delta.x * 0.01) + rpy.z;
+    if (!this->dataPtr->mouseEvent.shift)
+    {
+      double snap = rint(yaw / (M_PI * .25)) * (M_PI * 0.25);
+
+      if (fabs(yaw - snap) < GZ_DTOR(10))
+        yaw = snap;
+    }
+
+    _vis->SetWorldRotation(math::Quaternion(rpy.x, rpy.y, yaw));
+  }
+  else if (this->dataPtr->mouseEvent.buttons == common::MouseEvent::RIGHT)
+  {
+    math::Vector3 rpy = this->dataPtr->mouseMoveVisStartPose.rot.GetAsEuler();
+    math::Vector2i delta = this->dataPtr->mouseEvent.pos -
+        this->dataPtr->mouseEvent.pressPos;
+    double pitch = (delta.y * 0.01) + rpy.y;
+    if (!this->dataPtr->mouseEvent.shift)
+    {
+      double snap = rint(pitch / (M_PI * .25)) * (M_PI * 0.25);
+
+      if (fabs(pitch - snap) < GZ_DTOR(10))
+        pitch = snap;
+    }
+
+    _vis->SetWorldRotation(math::Quaternion(rpy.x, pitch, rpy.z));
+  }
+  else if (this->dataPtr->mouseEvent.buttons & common::MouseEvent::LEFT &&
+           this->dataPtr->mouseEvent.buttons & common::MouseEvent::RIGHT)
+  {
+    math::Vector3 rpy = this->dataPtr->mouseMoveVisStartPose.rot.GetAsEuler();
+    math::Vector2i delta = this->dataPtr->mouseEvent.pos -
+        this->dataPtr->mouseEvent.pressPos;
+    double roll = (delta.x * 0.01) + rpy.x;
+    if (!this->dataPtr->mouseEvent.shift)
+    {
+      double snap = rint(roll / (M_PI * .25)) * (M_PI * 0.25);
+
+      if (fabs(roll - snap) < GZ_DTOR(10))
+        roll = snap;
+    }
+
+    _vis->SetWorldRotation(math::Quaternion(roll, rpy.y, rpy.z));
+  }
+  else
+  {
+    this->TranslateEntity(_vis);
+  }
+}*/
diff --git a/gazebo/gui/ModelManipulator.hh b/gazebo/gui/ModelManipulator.hh
new file mode 100644
index 0000000..de194f8
--- /dev/null
+++ b/gazebo/gui/ModelManipulator.hh
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _MODEL_MANIPULATOR_HH_
+#define _MODEL_MANIPULATOR_HH_
+
+#include <string>
+
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/common/KeyEvent.hh"
+
+#include "gazebo/rendering/RenderTypes.hh"
+
+#include "gazebo/common/SingletonT.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class ModelManipulatorPrivate;
+
+    /// \class ModelManipulator ModelManipulator.hh gui/Gui.hh
+    /// \brief Manipulator tool for translating/rotating/scaling models and
+    /// links
+    class GAZEBO_VISIBLE ModelManipulator : public SingletonT<ModelManipulator>
+    {
+      /// \brief Constructor
+      private: ModelManipulator();
+
+      /// \brief Destructor
+      private: virtual ~ModelManipulator();
+
+      /// \brief Initialize the model manipulator.
+      public: void Init();
+
+      /// \brief Set the manipulation mode.
+      /// \param[in] _mode Manipulation mode: translate, rotate, or scale.
+      public: void SetManipulationMode(const std::string &_mode);
+
+      /// \brief Set the visual to be manipulated by the model manipulator.
+      public: void SetAttachedVisual(rendering::VisualPtr _vis);
+
+      /// \brief Process an object translate mouse press event.
+      /// \param[in] _event Mouse event.
+      public: void OnMousePressEvent(const common::MouseEvent &_event);
+
+      /// \brief Process an object translate mouse move event.
+      /// \param[in] _event Mouse event.
+      public: void OnMouseMoveEvent(const common::MouseEvent &_event);
+
+      /// \brief Process an object translate mouse release event.
+      /// \param[in] _event Mouse event.
+      public: void OnMouseReleaseEvent(const common::MouseEvent &_event);
+
+      /// \brief Process a key press event.
+      /// \param[in] _event Key event.
+      public: void OnKeyPressEvent(const common::KeyEvent &_event);
+
+      /// \brief Process a key release event.
+      /// \param[in] _event Key event.
+      public: void OnKeyReleaseEvent(const common::KeyEvent &_event);
+
+      /// \brief Rotate entity.
+      /// \param[in] _vis Visual representing the entity.
+      /// \param[in] _axis Axis of rotation.
+      /// \param[in] _local True to apply rotation in local frame.
+      public: void RotateEntity(rendering::VisualPtr &_vis,
+          const math::Vector3 &_axis,
+          bool _local = false);
+
+      /// \brief Translate entity.
+      /// \param[in] _vis Visual representing the entity.
+      /// \param[in] _axis Axis of translation.
+      /// \param[in] _local True to apply translation in local frame.
+      public: void TranslateEntity(rendering::VisualPtr &_vis,
+          const math::Vector3 &_axis,
+          bool _local = false);
+
+      /// \brief Scale entity.
+      /// \param[in] _vis Visual representing the entity.
+      /// \param[in] _axis Scaling axis.
+      /// \param[in] _local True to apply scaling in local frame.
+      public: void ScaleEntity(rendering::VisualPtr &_vis,
+          const math::Vector3 &_axis,
+          bool _local = false);
+
+      /// \brief Snap a point at intervals of a fixed distance. Currently used
+      /// to give a snapping behavior when moving models with a mouse.
+      /// \param[in] _point Input point.
+      /// \param[in] _interval Fixed distance interval at which the point
+      /// is snapped.
+      /// \param[in] _sensitivity Sensitivity of point snapping, in terms of a
+      /// percentage of the interval.
+      /// \return Snapped 3D point.
+      public: static math::Vector3 SnapPoint(const math::Vector3 &_point,
+          double _interval = 1.0, double _sensitivity = 0.4);
+
+      /// \brief Helper function to get the 3D position of mouse on ground
+      /// plane.
+      /// param[in] _camera Pointer to user camera.
+      /// param[in] _event Mouse event.
+      /// return Point of mouse-plane intersection in world coordinates.
+      public: static math::Vector3 GetMousePositionOnPlane(
+          rendering::CameraPtr _camera,
+          const common::MouseEvent &_event);
+
+      /// \brief Helper function to get the distance moved by the mouse.
+      /// \param[in] _camera Pointer to user camera.
+      /// \param[in] _pose Pose of origin.
+      /// \param[in] _axis Movement axis.
+      /// \param[in] _local True to get distance in local frame.
+      /// \return Mouse distance moved.
+      public: static math::Vector3 GetMouseMoveDistance(
+          rendering::CameraPtr _camera,
+          const math::Vector2i &_start, const math::Vector2i &_end,
+          const math::Pose &_pose, const math::Vector3 &_axis,
+          bool _local);
+
+      /// \brief Helper function to get the distance moved by the mouse.
+      /// \param[in] _pose Pose of origin.
+      /// \param[in] _axis Movement axis.
+      /// \param[in] _local True to get distance in local frame.
+      /// \return Mouse distance moved.
+      private: math::Vector3 GetMouseMoveDistance(const math::Pose &_pose,
+          const math::Vector3 &_axis, bool _local) const;
+
+      /// \brief Set the visual being moved by the mouse.
+      /// \param[in] _vis Pointer to visual moved by mouse.
+      private: void SetMouseMoveVisual(rendering::VisualPtr _vis);
+
+      /// \brief Publish visual's pose to the server
+      /// \param[in] _vis Pointer to the visual whose pose is to be published.
+      private: void PublishVisualPose(rendering::VisualPtr _vis);
+
+      /// \brief Publish visual's scale to the server
+      /// \param[in] _vis Pointer to the visual whose scale is to be published.
+      private: void PublishVisualScale(rendering::VisualPtr _vis);
+
+      /// \brief This is a singleton class.
+      private: friend class SingletonT<ModelManipulator>;
+
+      /// \internal
+      /// \brief Pointer to private data.
+      private: ModelManipulatorPrivate *dataPtr;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/ModelManipulatorPrivate.hh b/gazebo/gui/ModelManipulatorPrivate.hh
new file mode 100644
index 0000000..a83f7d9
--- /dev/null
+++ b/gazebo/gui/ModelManipulatorPrivate.hh
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _MODEL_MANIPULATOR_PRIVATE_HH_
+#define _MODEL_MANIPULATOR_PRIVATE_HH_
+
+#include <string>
+
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/common/KeyEvent.hh"
+
+#include "gazebo/transport/TransportTypes.hh"
+
+#include "gazebo/rendering/RenderTypes.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    /// \brief Private data for the ModelManipulator class
+    class ModelManipulatorPrivate
+    {
+      /// \brief Selection object which users can interact with to manipulate
+      /// the model.
+      public: rendering::SelectionObjPtr selectionObj;
+
+      /// \brief The current manipulation mode.
+      public: std::string manipMode;
+
+      /// \brief Keep track of the mouse start pose before a move action.
+      public: math::Pose mouseMoveVisStartPose;
+
+      /// \brief Keep track of the mouse start screen position.
+      public: math::Vector2i mouseStart;
+
+      /// \brief The current selected visual.
+      public: rendering::VisualPtr selectedVis;
+
+      /// \brief The current visual attached to the mouse.
+      public: rendering::VisualPtr mouseMoveVis;
+
+      /// \brief Transportation node.
+      public: transport::NodePtr node;
+
+      /// \brief Model publisher that publishes model pose to the server.
+      public: transport::PublisherPtr modelPub;
+
+      /// \brief Light publisher that publishes light pose to the server.
+      public: transport::PublisherPtr lightPub;
+
+      /// \brief Pointer to the user camera.
+      public: rendering::UserCameraPtr userCamera;
+
+      /// \brief Pointer to the scene where models are in.
+      public: rendering::ScenePtr scene;
+
+      /// \brief Current mouse event.
+      public: common::MouseEvent mouseEvent;
+
+      /// \brief Current key event.
+      public: common::KeyEvent keyEvent;
+
+      /// \brief True if the model manipulator is initialized.
+      public: bool initialized;
+
+      /// \brief Scale of the visual attached to the mouse.
+      public: math::Vector3 mouseVisualScale;
+
+      /// \brief Bounding box of the visual attached to the mouse (for scaling).
+      public: math::Box mouseVisualBbox;
+
+      /// \brief True to manipulate model in global frame.
+      public: bool globalManip;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/ModelRightMenu.cc b/gazebo/gui/ModelRightMenu.cc
index 939f6d1..7cf421a 100644
--- a/gazebo/gui/ModelRightMenu.cc
+++ b/gazebo/gui/ModelRightMenu.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,8 +20,10 @@
 #include "gazebo/rendering/Scene.hh"
 #include "gazebo/rendering/Visual.hh"
 
+#include "gazebo/gui/KeyEventHandler.hh"
+#include "gazebo/gui/GuiEvents.hh"
 #include "gazebo/gui/Actions.hh"
-#include "gazebo/gui/Gui.hh"
+#include "gazebo/gui/GuiIface.hh"
 #include "gazebo/gui/ModelRightMenu.hh"
 
 using namespace gazebo;
@@ -30,15 +32,18 @@ using namespace gui;
 /////////////////////////////////////////////////
 ModelRightMenu::ModelRightMenu()
 {
-  this->node = transport::NodePtr(new transport::Node());
-  this->node->Init();
-  this->requestSub = this->node->Subscribe("~/request",
-      &ModelRightMenu::OnRequest, this);
+  KeyEventHandler::Instance()->AddReleaseFilter("ModelRightMenu",
+        boost::bind(&ModelRightMenu::OnKeyRelease, this, _1));
 
   this->moveToAct = new QAction(tr("Move To"), this);
   this->moveToAct->setStatusTip(tr("Move camera to the selection"));
   connect(this->moveToAct, SIGNAL(triggered()), this, SLOT(OnMoveTo()));
 
+  this->followAct = new QAction(tr("Follow"), this);
+  this->followAct->setStatusTip(tr("Follow the selection"));
+  connect(this->followAct, SIGNAL(triggered()), this, SLOT(OnFollow()));
+
+
   // \todo Reimplement
   // this->snapBelowAct = new QAction(tr("Snap"), this);
   // this->snapBelowAct->setStatusTip(tr("Snap to object below"));
@@ -89,10 +94,6 @@ ModelRightMenu::ModelRightMenu()
   this->viewStates.push_back(state);
 
   // \todo Reimplement
-  // this->followAction = new QAction(tr("Follow"), this);
-  // this->followAction->setStatusTip(tr("Follow the selection"));
-  // connect(this->followAction, SIGNAL(triggered()), this, SLOT(OnFollow()));
-
   // this->skeletonAction = new QAction(tr("Skeleton"), this);
   // this->skeletonAction->setStatusTip(tr("Show model skeleton"));
   // this->skeletonAction->setCheckable(true);
@@ -100,6 +101,30 @@ ModelRightMenu::ModelRightMenu()
   //         SLOT(OnSkeleton()));
 }
 
+//////////////////////////////////////////////////
+bool ModelRightMenu::Init()
+{
+  this->node = transport::NodePtr(new transport::Node());
+  this->node->Init();
+  this->requestSub = this->node->Subscribe("~/request",
+      &ModelRightMenu::OnRequest, this);
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool ModelRightMenu::OnKeyRelease(const common::KeyEvent &_event)
+{
+  if (_event.key == Qt::Key_Escape)
+  {
+    rendering::UserCameraPtr cam = gui::get_active_camera();
+    cam->TrackVisual("");
+    gui::Events::follow("");
+  }
+
+  return false;
+}
+
 /////////////////////////////////////////////////
 ModelRightMenu::~ModelRightMenu()
 {
@@ -113,6 +138,7 @@ void ModelRightMenu::Run(const std::string &_modelName, const QPoint &_pt)
 
   QMenu menu;
   menu.addAction(this->moveToAct);
+  menu.addAction(this->followAct);
   // menu.addAction(this->snapBelowAct);
 
   // Create the view menu
@@ -135,7 +161,6 @@ void ModelRightMenu::Run(const std::string &_modelName, const QPoint &_pt)
   menu.addAction(g_deleteAct);
 
   // \todo Reimplement these features.
-  // menu.addAction(this->followAction);
   // menu.addAction(this->skeletonAction);
 
   menu.exec(_pt);
@@ -149,6 +174,14 @@ void ModelRightMenu::OnMoveTo()
 }
 
 /////////////////////////////////////////////////
+void ModelRightMenu::OnFollow()
+{
+  rendering::UserCameraPtr cam = gui::get_active_camera();
+  cam->TrackVisual(this->modelName);
+  gui::Events::follow(this->modelName);
+}
+
+/////////////////////////////////////////////////
 // void ModelRightMenu::OnSnapBelow()
 // {
 //   rendering::UserCameraPtr cam = gui::get_active_camera();
@@ -265,10 +298,3 @@ void ViewState::Callback()
 //
 //   this->requestPub->Publish(*this->requestMsg);
 // }
-
-/////////////////////////////////////////////////
-// void ModelRightMenu::OnFollow()
-// {
-//   rendering::UserCameraPtr cam = gui::get_active_camera();
-//   cam->TrackVisual(this->modelName);
-// }
diff --git a/gazebo/gui/ModelRightMenu.hh b/gazebo/gui/ModelRightMenu.hh
index d1a169f..8bafa90 100644
--- a/gazebo/gui/ModelRightMenu.hh
+++ b/gazebo/gui/ModelRightMenu.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,9 +21,11 @@
 #include <vector>
 #include <string>
 
+#include "gazebo/common/KeyEvent.hh"
 #include "gazebo/gui/qt.h"
 #include "gazebo/msgs/msgs.hh"
 #include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,7 +35,7 @@ namespace gazebo
 
     /// \class ModelRightMenu ModelRightMenu.hh gui/gui.hh
     /// \brief Displays a menu when the right mouse button has been pressed.
-    class ModelRightMenu : public QObject
+    class GAZEBO_VISIBLE ModelRightMenu : public QObject
     {
       Q_OBJECT
 
@@ -52,6 +54,9 @@ namespace gazebo
       /// \brief QT callback when move to has been selected.
       private slots: void OnMoveTo();
 
+      /// \brief QT callback when follow has been selected.
+      private slots: void OnFollow();
+
       /// \brief QT callback when delete has been selected.
       /// \param[in] _name Name of the model to delete.
       private slots: void OnDelete(const std::string &_name="");
@@ -59,9 +64,13 @@ namespace gazebo
       /// \brief QT callback when snap below has been selected.
       // private slots: void OnSnapBelow();
 
-      // private slots: void OnFollow();
       // private slots: void OnSkeleton();
 
+      /// \brief Key release callback.
+      /// \param[in] _event The key event.
+      /// \return True if the key press was handled.
+      private: bool OnKeyRelease(const common::KeyEvent &_event);
+
       /// \brief Request callback.
       /// \param[in] _msg Request message to process.
       private: void OnRequest(ConstRequestPtr &_msg);
@@ -78,10 +87,12 @@ namespace gazebo
       /// \brief Action for moving the camera to an object.
       private: QAction *moveToAct;
 
+      /// \brief Action for attaching the camera to a model.
+      private: QAction *followAct;
+
       /// \brief Action for snapping an object to another object below the
       /// first.
       // private: QAction *snapBelowAct;
-      // private: QAction *followAct;
       // private: QAction *skeletonAct;
 
       /// \brief The various view states
@@ -89,12 +100,17 @@ namespace gazebo
 
       // The view state class is a friend for convenience
       private: friend class ViewState;
+
+      /// \todo In gazebo 3.0 move this function to the correct section.
+      /// \brief Initialize the right menu.
+      /// \return True on success.
+      public: bool Init();
     };
 
     /// \class ViewState ViewState.hh gui/gui.hh
     /// \brief A class for managing view visualization states.
     /// Used by ModelRightMenu.
-    class ViewState : public QObject
+    class GAZEBO_VISIBLE ViewState : public QObject
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/MouseEventHandler.cc b/gazebo/gui/MouseEventHandler.cc
new file mode 100644
index 0000000..54ecfb8
--- /dev/null
+++ b/gazebo/gui/MouseEventHandler.cc
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gui/MouseEventHandler.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+MouseEventHandler::MouseEventHandler()
+{
+}
+
+/////////////////////////////////////////////////
+MouseEventHandler::~MouseEventHandler()
+{
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::AddPressFilter(const std::string &_name,
+    MouseEventFilter _filter)
+{
+  this->Add(_name, _filter, this->pressFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::AddReleaseFilter(const std::string &_name,
+    MouseEventFilter _filter)
+{
+  this->Add(_name, _filter, this->releaseFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::AddMoveFilter(const std::string &_name,
+    MouseEventFilter _filter)
+{
+  this->Add(_name, _filter, this->moveFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::AddDoubleClickFilter(const std::string &_name,
+    MouseEventFilter _filter)
+{
+  this->Add(_name, _filter, this->doubleClickFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::RemovePressFilter(const std::string &_name)
+{
+  this->Remove(_name, this->pressFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::RemoveReleaseFilter(const std::string &_name)
+{
+  this->Remove(_name, this->releaseFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::RemoveMoveFilter(const std::string &_name)
+{
+  this->Remove(_name, this->moveFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::RemoveDoubleClickFilter(const std::string &_name)
+{
+  this->Remove(_name, this->moveFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::HandlePress(const common::MouseEvent &_event)
+{
+  this->Handle(_event, this->pressFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::HandleRelease(const common::MouseEvent &_event)
+{
+  this->Handle(_event, this->releaseFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::HandleMove(const common::MouseEvent &_event)
+{
+  this->Handle(_event, this->moveFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::HandleDoubleClick(const common::MouseEvent &_event)
+{
+  this->Handle(_event, this->doubleClickFilters);
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::Add(const std::string &_name,
+    MouseEventFilter _filter, std::list<Filter> &_list)
+{
+  std::list<Filter>::iterator iter =
+    std::find(_list.begin(), _list.end(), _name);
+
+  if (iter == _list.end())
+    _list.push_front(Filter(_name, _filter));
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::Remove(const std::string &_name,
+    std::list<Filter> &_list)
+{
+  _list.remove(Filter(_name, NULL));
+}
+
+/////////////////////////////////////////////////
+void MouseEventHandler::Handle(const common::MouseEvent &_event,
+    std::list<Filter> &_list)
+{
+  for (std::list<Filter>::iterator iter = _list.begin();
+       iter != _list.end(); ++iter)
+  {
+    if ((*iter).func(_event))
+      break;
+  }
+}
diff --git a/gazebo/gui/MouseEventHandler.hh b/gazebo/gui/MouseEventHandler.hh
new file mode 100644
index 0000000..43bd29f
--- /dev/null
+++ b/gazebo/gui/MouseEventHandler.hh
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _MOUSE_EVENT_HANDLER_HH_
+#define _MOUSE_EVENT_HANDLER_HH_
+
+#include <boost/function.hpp>
+#include <string>
+#include <list>
+
+#include "gazebo/common/SingletonT.hh"
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    /// \class MouseEventHandler MouseEventHandler.hh gui/Gui.hh
+    /// \brief Processes and filters mouse events.
+    class GAZEBO_VISIBLE MouseEventHandler
+      : public SingletonT<MouseEventHandler>
+    {
+      /// \def MouseEventFilter
+      /// \brief Mouse event function pointer.
+      public: typedef boost::function<bool (const common::MouseEvent &_event)>
+              MouseEventFilter;
+
+      /// \cond
+      /// \brief a class used to store mouse filters.
+      private: class Filter
+               {
+                 /// \brief Constructor
+                 /// \param[in] _name Name associated with the mouse filter
+                 /// \param[in] _func Mouse callback function.
+                 public: Filter(const std::string &_name,
+                                MouseEventFilter _func)
+                         : name(_name), func(_func) {}
+
+                 /// \brief Equality operator
+                 /// \param[in] _f Filter for compare
+                 /// \return True if _f.name == this->name
+                 public: bool operator==(const Filter &_f) const
+                         {
+                           return this->name == _f.name;
+                         }
+
+                 /// \brief Equality operator
+                 /// \param[in] _f Name of a filter for comparison
+                 /// \return True if _f == this->name
+                 public: bool operator==(const std::string &_f) const
+                         {
+                           return this->name == _f;
+                         }
+
+                 /// \brief Name of the mouse filter.
+                 public: std::string name;
+
+                 /// \brief Event callback function.
+                 public: MouseEventFilter func;
+               };
+
+      /// \brief Constructor
+      private: MouseEventHandler();
+
+      /// \brief Destructor
+      private: virtual ~MouseEventHandler();
+
+      /// \brief Add a filter to a mouse press event.
+      /// \param[in] _name Name associated with the filter.
+      /// \param[in] _filter Function to call when press event occurs.
+      public: void AddPressFilter(const std::string &_name,
+                  MouseEventFilter _filter);
+
+      /// \brief Add a filter to a mouse release event.
+      /// \param[in] _name Name associated with the filter.
+      /// \param[in] _filter Function to call when release event occurs.
+      public: void AddReleaseFilter(const std::string &_name,
+                  MouseEventFilter _filter);
+
+      /// \brief Add a filter to a mouse move.
+      /// \param[in] _name Name associated with the filter.
+      /// \param[in] _filter Function to call when move event occurs.
+      public: void AddMoveFilter(const std::string &_name,
+                  MouseEventFilter _filter);
+
+      /// \brief Add a filter to a mouse double click.
+      /// \param[in] _name Name associated with the filter.
+      /// \param[in] _filter Function to call when move event occurs.
+      public: void AddDoubleClickFilter(const std::string &_name,
+                  MouseEventFilter _filter);
+
+      /// \brief Remove a filter from a mouse press.
+      /// \param[in] _name Name associated with the filter to remove.
+      public: void RemovePressFilter(const std::string &_name);
+
+      /// \brief Remove a filter from a mouse release.
+      /// \param[in] _name Name associated with the filter to remove.
+      public: void RemoveReleaseFilter(const std::string &_name);
+
+      /// \brief Remove a filter from a mouse move.
+      /// \param[in] _name Name associated with the filter to remove.
+      public: void RemoveMoveFilter(const std::string &_name);
+
+      /// \brief Remove a filter from a mouse click.
+      /// \param[in] _name Name associated with the filter to remove.
+      public: void RemoveDoubleClickFilter(const std::string &_name);
+
+      /// \brief Process a mouse press event.
+      /// \param[in] _event The mouse event.
+      public: void HandlePress(const common::MouseEvent &_event);
+
+      /// \brief Process a mouse release event.
+      /// \param[in] _event The mouse event.
+      public: void HandleRelease(const common::MouseEvent &_event);
+
+      /// \brief Process a mouse move event.
+      /// \param[in] _event The mouse event.
+      public: void HandleMove(const common::MouseEvent &_event);
+
+      /// \brief Process a mouse double click event.
+      /// \param[in] _event The mouse event.
+      public: void HandleDoubleClick(const common::MouseEvent &_event);
+
+      /// \brief Helper function to add a named filter to an event list.
+      /// \param[in] _name Name associated with the _filter.
+      /// \param[in] _filter Filter function callback.
+      /// \param[in] _list List which receives the filter.
+      private: void Add(const std::string &_name, MouseEventFilter _filter,
+                   std::list<Filter> &_list);
+
+      /// \brief Helper function to remove a named filter from an event list.
+      /// \param[in] _name Name associated with the filter to remove.
+      /// \param[in] _list List which contains the filter to remove.
+      private: void Remove(const std::string &_name, std::list<Filter> &_list);
+
+      /// \brief Helper function to process a filters in an event list.
+      /// \param[in] _event Mouse event to process.
+      /// \param[in] _list List which contains the filters to process.
+      private: void Handle(const common::MouseEvent &_event,
+                   std::list<Filter> &_list);
+
+      /// \brief List of mouse press filters.
+      private: std::list<Filter> pressFilters;
+
+      /// \brief List of mouse release filters.
+      private: std::list<Filter> releaseFilters;
+
+      /// \brief List of mouse move filters.
+      private: std::list<Filter> moveFilters;
+
+      /// \brief List of mouse double click filters.
+      private: std::list<Filter> doubleClickFilters;
+
+      /// \brief This is a singleton class.
+      private: friend class SingletonT<MouseEventHandler>;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/QTestFixture.cc b/gazebo/gui/QTestFixture.cc
index cf4a4e9..47f7f70 100644
--- a/gazebo/gui/QTestFixture.cc
+++ b/gazebo/gui/QTestFixture.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,16 +20,22 @@
 # include <mach/mach.h>
 #endif  // __MACH__
 
-#include "gazebo/physics/Physics.hh"
+#include <unistd.h>
 
-#include "gazebo/common/Time.hh"
 #include "gazebo/common/Console.hh"
+#include "gazebo/common/Time.hh"
 #include "gazebo/gazebo.hh"
+#include "gazebo/gui/GuiIface.hh"
 #include "gazebo/gui/QTestFixture.hh"
+#include "gazebo/physics/PhysicsIface.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/util/LogRecord.hh"
 
 /////////////////////////////////////////////////
 QTestFixture::QTestFixture()
-  : server(NULL), serverThread(NULL), residentStart(0), shareStart(0)
+  : server(NULL), serverThread(NULL),
+    resMaxPercentChange(0), shareMaxPercentChange(0),
+    residentStart(0), shareStart(0)
 {
 }
 
@@ -38,16 +44,16 @@ void QTestFixture::initTestCase()
 {
   // Initialize the informational logger. This will log warnings, and
   // errors.
-  gazebo::common::Console::Instance()->Init("test.log");
+  gzLogInit("test.log");
 
   // Initialize the data logger. This will log state information.
-  gazebo::common::LogRecord::Instance()->Init("test");
+  gazebo::util::LogRecord::Instance()->Init("test");
 
   // Add local search paths
   gazebo::common::SystemPaths::Instance()->AddGazeboPaths(PROJECT_SOURCE_PATH);
 
   std::string path = PROJECT_SOURCE_PATH;
-  path += "/sdf/worlds";
+  path += "/worlds";
   gazebo::common::SystemPaths::Instance()->AddGazeboPaths(path);
 
   path = TEST_PATH;
@@ -57,16 +63,22 @@ void QTestFixture::initTestCase()
 /////////////////////////////////////////////////
 void QTestFixture::init()
 {
+  this->resMaxPercentChange = 3.0;
+  this->shareMaxPercentChange = 1.0;
+
   this->serverThread = NULL;
   this->GetMemInfo(this->residentStart, this->shareStart);
+  gazebo::rendering::load();
 }
 
 /////////////////////////////////////////////////
-void QTestFixture::Load(const std::string &_worldFilename, bool _paused)
+void QTestFixture::Load(const std::string &_worldFilename, bool _paused,
+    bool _serverScene, bool _clientScene)
 {
   // Create, load, and run the server in its own thread
   this->serverThread = new boost::thread(
-      boost::bind(&QTestFixture::RunServer, this, _worldFilename, _paused));
+      boost::bind(&QTestFixture::RunServer, this,
+        _worldFilename, _paused, _serverScene));
 
   // Wait for the server to come up
   // Use a 30 second timeout.
@@ -74,25 +86,30 @@ void QTestFixture::Load(const std::string &_worldFilename, bool _paused)
   while ((!this->server || !this->server->GetInitialized()) &&
       ++waitCount < maxWaitCount)
     gazebo::common::Time::MSleep(10);
+
+  if (_clientScene)
+    gazebo::rendering::create_scene(
+        gazebo::physics::get_world()->GetName(), false);
 }
 
 /////////////////////////////////////////////////
-void QTestFixture::RunServer(const std::string &_worldFilename, bool _paused)
+void QTestFixture::RunServer(const std::string &_worldFilename,
+    bool _paused, bool _createScene)
 {
   this->server = new gazebo::Server();
+  this->server->PreLoad();
   this->server->LoadFile(_worldFilename);
-  this->server->Init();
-
-  gazebo::rendering::create_scene(
-      gazebo::physics::get_world()->GetName(), false);
 
   this->SetPause(_paused);
 
-  this->server->Run();
+  if (_createScene)
+    gazebo::rendering::create_scene(
+        gazebo::physics::get_world()->GetName(), false);
 
-  gazebo::rendering::remove_scene(gazebo::physics::get_world()->GetName());
+  this->server->Run();
 
   this->server->Fini();
+
   delete this->server;
   this->server = NULL;
 }
@@ -106,6 +123,8 @@ void QTestFixture::SetPause(bool _pause)
 /////////////////////////////////////////////////
 void QTestFixture::cleanup()
 {
+  gazebo::gui::stop();
+
   double residentEnd, shareEnd;
   this->GetMemInfo(residentEnd, shareEnd);
 
@@ -114,11 +133,14 @@ void QTestFixture::cleanup()
   double resPercentChange = (residentEnd - residentStart) / residentStart;
   double sharePercentChange = (shareEnd - shareStart) / shareStart;
 
-  std::cout << "REs[" << resPercentChange << "]\n";
-  std::cout << "Shared[" << sharePercentChange << "]\n";
+  std::cout << "SharePercentChange[" << sharePercentChange << "] "
+    << "ShareMaxPercentChange[" << this->shareMaxPercentChange << "]\n";
+  std::cout << "ResPercentChange[" << resPercentChange << "]"
+    << "ResMaxPercentChange[" << this->resMaxPercentChange << "]\n";
+
   // Make sure the percent change values are reasonable.
-  QVERIFY(resPercentChange < 2.5);
-  QVERIFY(sharePercentChange < 1.0);
+  QVERIFY(resPercentChange < this->resMaxPercentChange);
+  QVERIFY(sharePercentChange < this->shareMaxPercentChange);
 
   if (this->server)
   {
diff --git a/gazebo/gui/QTestFixture.hh b/gazebo/gui/QTestFixture.hh
index 28339e2..d350c65 100644
--- a/gazebo/gui/QTestFixture.hh
+++ b/gazebo/gui/QTestFixture.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,13 +21,16 @@
 #include <string>
 #include <boost/thread.hpp>
 
+#ifndef Q_MOC_RUN  // See: https://bugreports.qt-project.org/browse/QTBUG-22829
+# include "gazebo/Server.hh"
+#endif
+
 #include "gazebo/physics/physics.hh"
 #include "gazebo/rendering/rendering.hh"
-#include "gazebo/Server.hh"
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/qt_test.h"
 
-#include "gazebo_config.h"
+#include "gazebo/gazebo_config.h"
 #include "test_config.h"
 
 /// \brief Base class for all Gazebo GUI unit tests.
@@ -40,7 +43,10 @@ class QTestFixture : public QObject
   /// \brief Load a world.
   /// \param[in] _worldFilename Name of the world to load.
   /// \param[in] _paused True to start the world paused.
-  protected: void Load(const std::string &_worldFilename, bool _paused = false);
+  /// \param[in] _serverScene True to create a scene on the server
+  /// \param[in] _clientScene True to create a scene on the client
+  protected: void Load(const std::string &_worldFilename, bool _paused = false,
+                 bool _serverScene = true, bool _clientScene = false);
 
   /// \brief Pause or unpause the world.
   /// \param[in] _pause True to pause the world
@@ -65,7 +71,11 @@ class QTestFixture : public QObject
   private slots: void cleanupTestCase();
 
   /// \brief Run the Gazebo server in a thread.
-  private: void RunServer(const std::string &_worldFilename, bool _paused);
+  /// \param[in] _worldFilename World file to load.
+  /// \param[in] _paused True to start the world paused.
+  /// \param[in] _createScene True to create a scene.
+  private: void RunServer(const std::string &_worldFilename, bool _paused,
+                bool _createScene);
 
   /// \brief The Gazebo server, which is run in a thread.
   protected: gazebo::Server *server;
@@ -73,11 +83,16 @@ class QTestFixture : public QObject
   /// \brief Thread to run the Gazebo server.
   protected: boost::thread *serverThread;
 
-  /// \brief Resident memory at test start
+  /// \brief Maximum allowed percent change in resident memory usage.
+  protected: double resMaxPercentChange;
+
+  /// \brief Maximum allowed percent change in shared memory usage.
+  protected: double shareMaxPercentChange;
+
+  /// \brief Amount of resident memory at start.
   private: double residentStart;
 
-  /// \brief Shared memory at test start
+  /// \brief Amount of shared memory at start.
   private: double shareStart;
 };
-
 #endif
diff --git a/gazebo/gui/RenderWidget.cc b/gazebo/gui/RenderWidget.cc
index 0345203..be6668f 100644
--- a/gazebo/gui/RenderWidget.cc
+++ b/gazebo/gui/RenderWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,11 +17,11 @@
 #include <iomanip>
 
 #include "gazebo/rendering/UserCamera.hh"
-#include "gazebo/rendering/Rendering.hh"
+#include "gazebo/rendering/RenderingIface.hh"
 #include "gazebo/rendering/Scene.hh"
 
 #include "gazebo/gui/Actions.hh"
-#include "gazebo/gui/Gui.hh"
+#include "gazebo/gui/GuiIface.hh"
 #include "gazebo/gui/GLWidget.hh"
 #include "gazebo/gui/GuiEvents.hh"
 #include "gazebo/gui/TimePanel.hh"
@@ -60,10 +60,12 @@ RenderWidget::RenderWidget(QWidget *_parent)
   actionGroup->addAction(g_arrowAct);
   actionGroup->addAction(g_translateAct);
   actionGroup->addAction(g_rotateAct);
+  actionGroup->addAction(g_scaleAct);
 
   toolbar->addAction(g_arrowAct);
   toolbar->addAction(g_translateAct);
   toolbar->addAction(g_rotateAct);
+  toolbar->addAction(g_scaleAct);
 
   toolbar->addSeparator();
   toolbar->addAction(g_boxCreateAct);
@@ -97,37 +99,16 @@ RenderWidget::RenderWidget(QWidget *_parent)
 
   TimePanel *timePanel = new TimePanel(this);
 
-  QHBoxLayout *playControlLayout = new QHBoxLayout;
-  playControlLayout->setContentsMargins(0, 0, 0, 0);
-
   this->bottomFrame = new QFrame;
   this->bottomFrame->setObjectName("renderBottomFrame");
   this->bottomFrame->setSizePolicy(QSizePolicy::Expanding,
       QSizePolicy::Minimum);
 
-  QFrame *playFrame = new QFrame;
-  QToolBar *playToolbar = new QToolBar;
-  playFrame->setFrameShape(QFrame::NoFrame);
-  playFrame->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-  playFrame->setFixedHeight(25);
-  playToolbar->addAction(g_playAct);
-  playToolbar->addAction(g_pauseAct);
-  playToolbar->addAction(g_stepAct);
-  playControlLayout->addWidget(playToolbar);
-  playControlLayout->setContentsMargins(0, 0, 0, 0);
-  playFrame->setLayout(playControlLayout);
-
-  bottomPanelLayout->addItem(new QSpacerItem(-1, -1, QSizePolicy::Expanding,
-                             QSizePolicy::Minimum));
-  bottomPanelLayout->addWidget(playFrame, 0);
   bottomPanelLayout->addWidget(timePanel, 0);
-  bottomPanelLayout->addItem(new QSpacerItem(-1, -1, QSizePolicy::Expanding,
-                             QSizePolicy::Minimum));
   bottomPanelLayout->setSpacing(0);
   bottomPanelLayout->setContentsMargins(0, 0, 0, 0);
   this->bottomFrame->setLayout(bottomPanelLayout);
 
-
   QFrame *render3DFrame = new QFrame;
   render3DFrame->setObjectName("render3DFrame");
   QVBoxLayout *render3DLayout = new QVBoxLayout;
@@ -164,6 +145,10 @@ RenderWidget::RenderWidget(QWidget *_parent)
   this->timer = new QTimer(this);
   connect(this->timer, SIGNAL(timeout()), this, SLOT(update()));
   this->timer->start(44);
+
+  this->connections.push_back(
+      gui::Events::ConnectFollow(
+        boost::bind(&RenderWidget::OnFollow, this, _1)));
 }
 
 /////////////////////////////////////////////////
@@ -304,3 +289,18 @@ void RenderWidget::OnClearOverlayMsg()
 {
   this->DisplayOverlayMsg("");
 }
+
+/////////////////////////////////////////////////
+void RenderWidget::OnFollow(const std::string &_modelName)
+{
+  if (_modelName.empty())
+  {
+    g_translateAct->setEnabled(true);
+    g_rotateAct->setEnabled(true);
+  }
+  else
+  {
+    g_translateAct->setEnabled(false);
+    g_rotateAct->setEnabled(false);
+  }
+}
diff --git a/gazebo/gui/RenderWidget.hh b/gazebo/gui/RenderWidget.hh
index a86aa79..4c400a5 100644
--- a/gazebo/gui/RenderWidget.hh
+++ b/gazebo/gui/RenderWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,8 +20,9 @@
 #include <string>
 #include <vector>
 
-#include "gui/qt.h"
-#include "common/Event.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
 
 class QLineEdit;
 class QLabel;
@@ -36,7 +37,7 @@ namespace gazebo
   {
     class BuildingEditorWidget;
 
-    class RenderWidget : public QWidget
+    class GAZEBO_VISIBLE RenderWidget : public QWidget
     {
       Q_OBJECT
       public: RenderWidget(QWidget *_parent = 0);
@@ -67,14 +68,22 @@ namespace gazebo
 
       private: void OnFullScreen(bool &_value);
 
-      private: QHBoxLayout *bottomBarLayout;
+      /// \brief Handle follow model user event.
+      /// \param[in] _modelName Name of the model that is being followed.
+      private: void OnFollow(const std::string &_modelName);
+
+      /// \brief Widget used to draw the scene.
       private: GLWidget *glWidget;
 
-      // \brief Building editor widget for creating a building model
+      /// \brief Building editor widget for creating a building model
       private: BuildingEditorWidget *buildingEditorWidget;
 
+      /// \brief Frame that holds the contents of this widget.
       private: QFrame *mainFrame;
 
+      /// \brief All event connections.
+      private: std::vector<event::ConnectionPtr> connections;
+
       /// \brief Bottom frame that holds the play/pause widgets
       private: QFrame *bottomFrame;
       private: QLabel *xyzLabel;
@@ -95,8 +104,6 @@ namespace gazebo
       /// \brief An overlay label on the 3D render widget
       private: QLabel *msgOverlayLabel;
 
-      private: std::vector<event::ConnectionPtr> connections;
-
       private: bool clear;
       private: std::string clearName;
 
diff --git a/gazebo/gui/SaveDialog.cc b/gazebo/gui/SaveDialog.cc
new file mode 100644
index 0000000..d0e6838
--- /dev/null
+++ b/gazebo/gui/SaveDialog.cc
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/filesystem.hpp>
+#include "gazebo/common/Console.hh"
+#include "gazebo/gui/SaveDialog.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+SaveDialog::SaveDialog(QWidget *_parent) : QDialog(_parent)
+{
+  this->setObjectName("saveDialog");
+  this->fileExtension = "";
+
+  this->messageLabel = new QLabel;
+  this->messageLabel->setText(
+      tr("Please enter the name and location to save to"));
+
+  QLabel *nameLabel = new QLabel;
+  nameLabel->setText(tr("Name"));
+  this->nameLineEdit = new QLineEdit;
+  this->nameLineEdit->setText(tr("DefaultName"));
+  QLabel *saveLocation = new QLabel;
+  saveLocation->setText(tr("Location"));
+  this->locationLineEdit = new QLineEdit;
+  this->locationLineEdit->setText(QDir::homePath());
+  QPushButton *browseButton = new QPushButton(tr("Browse"));
+  connect(browseButton, SIGNAL(clicked()), this, SLOT(OnBrowse()));
+
+  QHBoxLayout *buttonsLayout = new QHBoxLayout;
+  QPushButton *cancelButton = new QPushButton(tr("&Cancel"));
+  connect(cancelButton, SIGNAL(clicked()), this, SLOT(OnCancel()));
+
+  QPushButton *saveButton = new QPushButton("&Save");
+  saveButton->setDefault(true);
+  connect(saveButton, SIGNAL(clicked()), this, SLOT(OnSave()));
+  buttonsLayout->addWidget(cancelButton);
+  buttonsLayout->addWidget(saveButton);
+  buttonsLayout->setAlignment(Qt::AlignRight);
+
+  QGridLayout *gridLayout = new QGridLayout;
+  gridLayout->addWidget(nameLabel, 0, 0);
+  gridLayout->addWidget(nameLineEdit, 0, 1);
+  gridLayout->addWidget(saveLocation, 1, 0);
+  gridLayout->addWidget(this->locationLineEdit, 1, 1);
+  gridLayout->addWidget(browseButton, 1, 2);
+
+  QVBoxLayout *mainLayout = new QVBoxLayout;
+  mainLayout->addWidget(this->messageLabel);
+  mainLayout->addLayout(gridLayout);
+  mainLayout->addLayout(buttonsLayout);
+
+  this->setLayout(mainLayout);
+}
+
+/////////////////////////////////////////////////
+SaveDialog::~SaveDialog()
+{
+}
+
+/////////////////////////////////////////////////
+std::string SaveDialog::GetSaveName() const
+{
+  return this->nameLineEdit->text().toStdString();
+}
+
+/////////////////////////////////////////////////
+std::string SaveDialog::GetSaveLocation() const
+{
+  return this->locationLineEdit->text().toStdString();
+}
+
+/////////////////////////////////////////////////
+void SaveDialog::SetSaveName(const std::string &_name)
+{
+  this->nameLineEdit->setText(tr(_name.c_str()));
+}
+
+/////////////////////////////////////////////////
+void SaveDialog::SetSaveLocation(const std::string &_location)
+{
+  this->locationLineEdit->setText(tr(_location.c_str()));
+}
+
+/////////////////////////////////////////////////
+void SaveDialog::SetMessage(const std::string &_msg)
+{
+  this->messageLabel->setText(tr(_msg.c_str()));
+}
+
+/////////////////////////////////////////////////
+void SaveDialog::SetTitle(const std::string &_title)
+{
+  this->setWindowTitle(tr(_title.c_str()));
+}
+
+/////////////////////////////////////////////////
+void SaveDialog::OnBrowse()
+{
+  QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
+    QDir::homePath(), QFileDialog::ShowDirsOnly
+    | QFileDialog::DontResolveSymlinks);
+  if (!dir.isEmpty())
+    this->locationLineEdit->setText(dir);
+}
+
+/////////////////////////////////////////////////
+void SaveDialog::OnCancel()
+{
+  this->close();
+}
+
+/////////////////////////////////////////////////
+void SaveDialog::OnSave()
+{
+  boost::filesystem::path savePath(this->GetSaveLocation());
+  savePath /= this->GetSaveName() + "." + this->fileExtension;
+
+  try
+  {
+    if (boost::filesystem::exists(savePath.string()))
+    {
+      std::string msg = "A file named " + savePath.string() +
+          " already exists.\nDo you wish to overwrite the existing file?";
+      int ret = QMessageBox::warning(0, QString("File Exists"),
+          QString(msg.c_str()), QMessageBox::Save | QMessageBox::Cancel,
+          QMessageBox::Cancel);
+
+      switch (ret)
+      {
+        case QMessageBox::Save:
+          this->accept();
+          break;
+        case QMessageBox::Cancel:
+          // Do nothing
+          break;
+        default:
+          break;
+      }
+    }
+    else
+    {
+      this->accept();
+    }
+  }
+  catch(const boost::filesystem::filesystem_error &ex)
+  {
+    gzerr << ex.what() << std::endl;
+  }
+}
+
+
+/////////////////////////////////////////////////
+void SaveDialog::SetFileExtension(const std::string &_extension)
+{
+  this->fileExtension = _extension;
+}
+
+/////////////////////////////////////////////////
+void SaveDialog::showEvent(QShowEvent */*_event*/)
+{
+  this->nameLineEdit->selectAll();
+}
diff --git a/gazebo/gui/SaveDialog.hh b/gazebo/gui/SaveDialog.hh
new file mode 100644
index 0000000..c5e5d48
--- /dev/null
+++ b/gazebo/gui/SaveDialog.hh
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SAVE_DIALOG_HH_
+#define _SAVE_DIALOG_HH_
+
+#include <string>
+#include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    /// \addtogroup gazebo_gui
+    /// \{
+
+    /// \class SaveDialog SaveDialog.hh gui/gui.hh
+    /// \brief Dialog for saving to file.
+    class GAZEBO_VISIBLE SaveDialog : public QDialog
+    {
+      Q_OBJECT
+
+      /// \brief Constructor.
+      /// \param[in] _parent Parent QWidget.
+      public: SaveDialog(QWidget *_parent = 0);
+
+      /// \brief Destructor.
+      public: ~SaveDialog();
+
+      /// \brief Get name of file.
+      /// \return The name of file.
+      public: std::string GetSaveName() const;
+
+      /// \brief Get the save location.
+      /// \return Path of the save location.
+      public: std::string GetSaveLocation() const;
+
+      /// \brief Set the name to save as.
+      /// \param[in] _name Name of file.
+      public: void SetSaveName(const std::string &_name);
+
+      /// \brief Set the save location.
+      /// \param[in] _location Location to save to.
+      public: void SetSaveLocation(const std::string &_location);
+
+      /// \brief Set the message to be displayed.
+      /// \param[in] _msg Message to be displayed.
+      public: void SetMessage(const std::string &_msg);
+
+      /// \brief Set the tile of the dialog.
+      /// \param[in] _title Title of dialog.
+      public: void SetTitle(const std::string &_title);
+
+      /// \brief Set the file extension.
+      /// \param[in] _extension File extension.
+      public: void SetFileExtension(const std::string &_extension);
+
+      /// \brief Qt event emitted showing the dialog
+      protected: virtual void showEvent(QShowEvent *_event);
+
+      /// \brief Qt callback when the file directory browse button is pressed.
+      private slots: void OnBrowse();
+
+      /// \brief Qt callback when the Cancel button is pressed.
+      private slots: void OnCancel();
+
+      /// \brief Qt callback when the Save button is pressed.
+      private slots: void OnSave();
+
+      /// \brief Editable line that holds the name.
+      private: QLineEdit *nameLineEdit;
+
+      /// \brief Editable line that holds the save location.
+      private: QLineEdit *locationLineEdit;
+
+      /// \brief Message displayed in the dialog.
+      private: QLabel *messageLabel;
+
+      /// \brief File extension.
+      private: std::string fileExtension;
+    };
+    /// \}
+  }
+}
+
+#endif
diff --git a/gazebo/gui/SphereMaker.cc b/gazebo/gui/SphereMaker.cc
index 0611db2..e04e915 100644
--- a/gazebo/gui/SphereMaker.cc
+++ b/gazebo/gui/SphereMaker.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,16 +16,18 @@
 */
 #include <sstream>
 
-#include "msgs/msgs.hh"
-#include "gui/GuiEvents.hh"
-#include "common/MouseEvent.hh"
-#include "math/Quaternion.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/gui/GuiEvents.hh"
 
-#include "rendering/UserCamera.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/math/Quaternion.hh"
 
-#include "transport/Publisher.hh"
+#include "gazebo/rendering/UserCamera.hh"
 
-#include "gui/SphereMaker.hh"
+#include "gazebo/transport/Publisher.hh"
+
+#include "gazebo/gui/SphereMaker.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -37,6 +39,7 @@ SphereMaker::SphereMaker()
   : EntityMaker()
 {
   this->state = 0;
+  this->leftMousePressed = false;
   this->visualMsg = new msgs::Visual();
   this->visualMsg->mutable_geometry()->set_type(msgs::Geometry::SPHERE);
 
diff --git a/gazebo/gui/SphereMaker.hh b/gazebo/gui/SphereMaker.hh
index a28de3e..9a53860 100644
--- a/gazebo/gui/SphereMaker.hh
+++ b/gazebo/gui/SphereMaker.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,9 @@
 
 #include <string>
 
-#include "math/Vector2i.hh"
-#include "gui/EntityMaker.hh"
+#include "gazebo/math/Vector2i.hh"
+#include "gazebo/gui/EntityMaker.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -31,7 +32,7 @@ namespace gazebo
 
   namespace gui
   {
-    class SphereMaker : public EntityMaker
+    class GAZEBO_VISIBLE SphereMaker : public EntityMaker
     {
       public: SphereMaker();
       public: virtual ~SphereMaker();
diff --git a/gazebo/gui/TimePanel.cc b/gazebo/gui/TimePanel.cc
index 9f1d62d..648ecb7 100644
--- a/gazebo/gui/TimePanel.cc
+++ b/gazebo/gui/TimePanel.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,11 +16,11 @@
  */
 #include <sstream>
 
-#include "transport/Node.hh"
+#include "gazebo/transport/Node.hh"
 
-#include "gui/Actions.hh"
-#include "gui/GuiEvents.hh"
-#include "gui/TimePanel.hh"
+#include "gazebo/gui/Actions.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/gui/TimePanel.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -33,8 +33,59 @@ TimePanel::TimePanel(QWidget *_parent)
 
   QHBoxLayout *mainLayout = new QHBoxLayout;
 
-  QFrame *frame = new QFrame;
-  QHBoxLayout *frameLayout = new QHBoxLayout;
+  QScrollArea *scrollArea = new QScrollArea(this);
+  scrollArea->setLineWidth(1);
+  scrollArea->setFrameShape(QFrame::NoFrame);
+  scrollArea->setFrameShadow(QFrame::Plain);
+  scrollArea->setWidgetResizable(true);
+  scrollArea->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
+  scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+  // Play control (Play/Step/Pause)
+  QSpinBox *stepSpinBox = new QSpinBox;
+  stepSpinBox->setRange(1, 9999);
+  connect(stepSpinBox, SIGNAL(valueChanged(int)), this,
+      SLOT(OnStepValueChanged(int)));
+
+  QWidget *stepWidget = new QWidget;
+  QLabel *stepLabel = new QLabel(tr("Steps:"));
+  QVBoxLayout *stepLayout = new QVBoxLayout;
+  stepLayout->addWidget(stepLabel);
+  stepLayout->addWidget(stepSpinBox);
+  stepWidget->setLayout(stepLayout);
+
+  QLabel *stepToolBarLabel = new QLabel(tr("Steps:"));
+
+  QMenu *stepMenu = new QMenu;
+  this->stepButton = new QToolButton;
+  this->stepButton->setMaximumSize(35, stepButton->height());
+  QWidgetAction *stepAction = new QWidgetAction(stepMenu);
+  stepAction->setDefaultWidget(stepWidget);
+  stepMenu->addAction(stepAction);
+  this->stepButton->setMenu(stepMenu);
+  this->stepButton->setPopupMode(QToolButton::InstantPopup);
+  this->stepButton->setToolButtonStyle(Qt::ToolButtonTextOnly);
+  this->stepButton->setContentsMargins(0, 0, 0, 0);
+  this->OnStepValueChanged(1);
+
+  connect(stepSpinBox, SIGNAL(editingFinished()), stepMenu,
+      SLOT(hide()));
+
+  QFrame *frame = new QFrame(scrollArea);
+  frame->setFrameShape(QFrame::NoFrame);
+  scrollArea->setWidget(frame);
+
+  QToolBar *playToolbar = new QToolBar;
+  playToolbar->setObjectName("playToolBar");
+  playToolbar->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+  playToolbar->addAction(g_playAct);
+  playToolbar->addAction(g_pauseAct);
+
+  QLabel *emptyLabel = new QLabel(tr("  "));
+  playToolbar->addWidget(emptyLabel);
+  playToolbar->addAction(g_stepAct);
+  playToolbar->addWidget(stepToolBarLabel);
+  playToolbar->addWidget(this->stepButton);
 
   this->percentRealTimeEdit = new QLineEdit;
   this->percentRealTimeEdit->setObjectName("timePanelPercentRealTime");
@@ -60,6 +111,12 @@ TimePanel::TimePanel(QWidget *_parent)
   connect(timeResetButton, SIGNAL(clicked()),
           this, SLOT(OnTimeReset()));
 
+  QHBoxLayout *frameLayout = new QHBoxLayout;
+  frameLayout->setContentsMargins(0, 0, 0, 0);
+  frameLayout->addItem(new QSpacerItem(5, -1, QSizePolicy::Expanding,
+                             QSizePolicy::Minimum));
+  frameLayout->addWidget(playToolbar);
+
   frameLayout->addWidget(new QLabel(tr("Real Time Factor:")));
   frameLayout->addWidget(this->percentRealTimeEdit);
 
@@ -74,13 +131,16 @@ TimePanel::TimePanel(QWidget *_parent)
 
   frameLayout->addWidget(timeResetButton);
 
+  frameLayout->addItem(new QSpacerItem(15, -1, QSizePolicy::Expanding,
+                       QSizePolicy::Minimum));
+
   frame->setLayout(frameLayout);
   frame->layout()->setContentsMargins(0, 0, 0, 0);
 
-  mainLayout->addWidget(frame);
+  mainLayout->addWidget(scrollArea);
   this->setLayout(mainLayout);
 
-  this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+  this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
   this->layout()->setContentsMargins(0, 0, 0, 0);
 
   this->node = transport::NodePtr(new transport::Node());
@@ -137,7 +197,6 @@ TimePanel::~TimePanel()
 void TimePanel::OnStats(ConstWorldStatisticsPtr &_msg)
 {
   boost::mutex::scoped_lock lock(this->mutex);
-  std::ostringstream stream;
 
   this->simTimes.push_back(msgs::Convert(_msg->sim_time()));
   if (this->simTimes.size() > 20)
@@ -147,76 +206,59 @@ void TimePanel::OnStats(ConstWorldStatisticsPtr &_msg)
   if (this->realTimes.size() > 20)
     this->realTimes.pop_front();
 
-  if (_msg->paused() && (g_pauseAct && !g_pauseAct->isChecked()))
+  if (_msg->paused() && (g_playAct && !g_playAct->isVisible()))
   {
-    g_pauseAct->setChecked(true);
-    g_playAct->setChecked(false);
+    g_playAct->setVisible(true);
+    g_pauseAct->setVisible(false);
   }
-  else if (!_msg->paused() && (g_playAct && !g_playAct->isChecked()))
+  else if (!_msg->paused() && (g_pauseAct && !g_pauseAct->isVisible()))
   {
-    g_pauseAct->setChecked(false);
-    g_playAct->setChecked(true);
+    g_pauseAct->setVisible(true);
+    g_playAct->setVisible(false);
   }
 
-  unsigned int day, hour, min, sec, msec;
-
   // Set simulation time
-  {
-    stream.str("");
-
-    sec = _msg->sim_time().sec();
+  this->SetSimTime(QString::fromStdString(FormatTime(_msg->sim_time())));
 
-    day = sec / 86400;
-    sec -= day * 86400;
-
-    hour = sec / 3600;
-    sec -= hour * 3600;
-
-    min = sec / 60;
-    sec -= min * 60;
-
-    msec = rint(_msg->sim_time().nsec() * 1e-6);
-
-    stream << std::setw(2) << std::setfill('0') << day << " ";
-    stream << std::setw(2) << std::setfill('0') << hour << ":";
-    stream << std::setw(2) << std::setfill('0') << min << ":";
-    stream << std::setw(2) << std::setfill('0') << sec << ".";
-    stream << std::setw(3) << std::setfill('0') << msec;
+  // Set real time
+  this->SetRealTime(QString::fromStdString(FormatTime(_msg->real_time())));
 
-    this->SetSimTime(QString::fromStdString(stream.str()));
-  }
+  // Set the iterations
+  this->SetIterations(QString::fromStdString(
+        boost::lexical_cast<std::string>(_msg->iterations())));
+}
 
-  // Set real time
-  {
-    stream.str("");
+/////////////////////////////////////////////////
+std::string TimePanel::FormatTime(const msgs::Time &_msg)
+{
+  std::ostringstream stream;
+  unsigned int day, hour, min, sec, msec;
 
-    sec = _msg->real_time().sec();
+  stream.str("");
 
-    day = sec / 86400;
-    sec -= day * 86400;
+  sec = _msg.sec();
 
-    hour = sec / 3600;
-    sec -= hour * 3600;
+  day = sec / 86400;
+  sec -= day * 86400;
 
-    min = sec / 60;
-    sec -= min * 60;
+  hour = sec / 3600;
+  sec -= hour * 3600;
 
-    msec = rint(_msg->sim_time().nsec() * 1e-6);
+  min = sec / 60;
+  sec -= min * 60;
 
-    stream << std::setw(2) << std::setfill('0') << day << " ";
-    stream << std::setw(2) << std::setfill('0') << hour << ":";
-    stream << std::setw(2) << std::setfill('0') << min << ":";
-    stream << std::setw(2) << std::setfill('0') << sec << ".";
-    stream << std::setw(3) << std::setfill('0') << msec;
+  msec = rint(_msg.nsec() * 1e-6);
 
-    this->SetRealTime(QString::fromStdString(stream.str()));
-  }
+  stream << std::setw(2) << std::setfill('0') << day << " ";
+  stream << std::setw(2) << std::setfill('0') << hour << ":";
+  stream << std::setw(2) << std::setfill('0') << min << ":";
+  stream << std::setw(2) << std::setfill('0') << sec << ".";
+  stream << std::setw(3) << std::setfill('0') << msec;
 
-  // Set the iterations
-  this->SetIterations(QString::fromStdString(
-        boost::lexical_cast<std::string>(_msg->iterations())));
+  return stream.str();
 }
 
+
 /////////////////////////////////////////////////
 void TimePanel::Update()
 {
@@ -257,3 +299,17 @@ void TimePanel::OnTimeReset()
   msg.mutable_reset()->set_time_only(true);
   this->worldControlPub->Publish(msg);
 }
+
+/////////////////////////////////////////////////
+void TimePanel::OnStepValueChanged(int _value)
+{
+  // text formating and resizing for better presentation
+  std::string numStr = QString::number(_value).toStdString();
+  QFont stepFont = this->stepButton->font();
+  stepFont.setPointSizeF(11 - numStr.size()/2.0);
+  this->stepButton->setFont(stepFont);
+  numStr.insert(numStr.end(), 4 - numStr.size(), ' ');
+  this->stepButton->setText(tr(numStr.c_str()));
+
+  emit gui::Events::inputStepSize(_value);
+}
diff --git a/gazebo/gui/TimePanel.hh b/gazebo/gui/TimePanel.hh
index 0705779..032539d 100644
--- a/gazebo/gui/TimePanel.hh
+++ b/gazebo/gui/TimePanel.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,12 +19,14 @@
 
 #include <vector>
 #include <list>
+#include <string>
 
 #include "gazebo/gui/qt.h"
 #include "gazebo/transport/TransportTypes.hh"
 #include "gazebo/msgs/MessageTypes.hh"
 #include "gazebo/common/Event.hh"
 #include "gazebo/common/Time.hh"
+#include "gazebo/util/system.hh"
 
 class QLineEdit;
 class QLabel;
@@ -33,7 +35,7 @@ namespace gazebo
 {
   namespace gui
   {
-    class TimePanel : public QWidget
+    class GAZEBO_VISIBLE TimePanel : public QWidget
     {
       Q_OBJECT
 
@@ -58,6 +60,9 @@ namespace gazebo
       /// \brief Update the data output.
       private slots: void Update();
 
+      /// \brief Qt call back when the step value in the spinbox changed
+      private slots: void OnStepValueChanged(int _value);
+
       /// \brief Called when the GUI enters/leaves full-screen mode.
       /// \param[in] _value True when entering full screen, false when
       /// leaving.
@@ -67,6 +72,10 @@ namespace gazebo
       /// \param[in] _msg World statistics message.
       private: void OnStats(ConstWorldStatisticsPtr &_msg);
 
+      /// \brief Helper function to format time string.
+      /// \param[in] _msg Time message.
+      private: static std::string FormatTime(const msgs::Time &_msg);
+
       /// \brief QT callback when the reset time button is pressed.
       private slots: void OnTimeReset();
 
@@ -102,6 +111,9 @@ namespace gazebo
 
       /// \brief Mutex to protect the memeber variables.
       private: boost::mutex mutex;
+
+      /// \brief Tool button that holds the step widget
+      private: QToolButton *stepButton;
     };
   }
 }
diff --git a/gazebo/gui/TimePanel_TEST.cc b/gazebo/gui/TimePanel_TEST.cc
index 1c1d847..f9577bc 100644
--- a/gazebo/gui/TimePanel_TEST.cc
+++ b/gazebo/gui/TimePanel_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,51 +21,54 @@
 /////////////////////////////////////////////////
 void TimePanel_TEST::ValidTimes()
 {
-  this->Load("empty.world");
+  QBENCHMARK
+  {
+    this->Load("empty.world");
 
-  // Create a new data logger widget
-  gazebo::gui::TimePanel *timePanel = new gazebo::gui::TimePanel;
+    // Create a new data logger widget
+    gazebo::gui::TimePanel *timePanel = new gazebo::gui::TimePanel;
 
-  // Get the percent real time line
-  QLineEdit *percentEdit = timePanel->findChild<QLineEdit*>(
-      "timePanelPercentRealTime");
+    // Get the percent real time line
+    QLineEdit *percentEdit = timePanel->findChild<QLineEdit*>(
+        "timePanelPercentRealTime");
 
-  // Get the sim time line
-  QLineEdit *simTimeEdit = timePanel->findChild<QLineEdit*>(
-      "timePanelSimTime");
+    // Get the sim time line
+    QLineEdit *simTimeEdit = timePanel->findChild<QLineEdit*>(
+        "timePanelSimTime");
 
-  // Get the real time line
-  QLineEdit *realTimeEdit = timePanel->findChild<QLineEdit*>(
-      "timePanelRealTime");
+    // Get the real time line
+    QLineEdit *realTimeEdit = timePanel->findChild<QLineEdit*>(
+        "timePanelRealTime");
 
-  QVERIFY(percentEdit != NULL);
-  QVERIFY(simTimeEdit != NULL);
-  QVERIFY(realTimeEdit != NULL);
+    QVERIFY(percentEdit != NULL);
+    QVERIFY(simTimeEdit != NULL);
+    QVERIFY(realTimeEdit != NULL);
 
-  // Wait a little bit so that time increases.
-  for (unsigned int i = 0; i < 10; ++i)
-  {
-    gazebo::common::Time::MSleep(100);
-    QCoreApplication::processEvents();
-  }
+    // Wait a little bit so that time increases.
+    for (unsigned int i = 0; i < 10; ++i)
+    {
+      gazebo::common::Time::MSleep(100);
+      QCoreApplication::processEvents();
+    }
 
-  std::string txt;
-  double value;
+    std::string txt;
+    double value;
 
-  // Make sure real time is greater than zero
-  txt = realTimeEdit->text().toStdString();
-  value = boost::lexical_cast<double>(txt.substr(txt.find(".")));
-  QVERIFY(value > 0.0);
+    // Make sure real time is greater than zero
+    txt = realTimeEdit->text().toStdString();
+    value = boost::lexical_cast<double>(txt.substr(txt.find(".")));
+    QVERIFY(value > 0.0);
 
-  // Make sure sim time is greater than zero
-  txt = simTimeEdit->text().toStdString();
-  value = boost::lexical_cast<double>(txt.substr(txt.find(".")));
-  QVERIFY(value > 0.0);
+    // Make sure sim time is greater than zero
+    txt = simTimeEdit->text().toStdString();
+    value = boost::lexical_cast<double>(txt.substr(txt.find(".")));
+    QVERIFY(value > 0.0);
 
-  // Make sure the percent real time is greater than zero
-  txt = percentEdit->text().toStdString();
-  value = boost::lexical_cast<double>(txt.substr(0, txt.find(" ")));
-  QVERIFY(value > 0.0);
+    // Make sure the percent real time is greater than zero
+    txt = percentEdit->text().toStdString();
+    value = boost::lexical_cast<double>(txt.substr(0, txt.find(" ")));
+    QVERIFY(value > 0.0);
+  }
 }
 
 // Generate a main function for the test
diff --git a/gazebo/gui/TimePanel_TEST.hh b/gazebo/gui/TimePanel_TEST.hh
index 4d37280..5048fcf 100644
--- a/gazebo/gui/TimePanel_TEST.hh
+++ b/gazebo/gui/TimePanel_TEST.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/ToolsWidget.cc b/gazebo/gui/ToolsWidget.cc
index be14865..93c0221 100644
--- a/gazebo/gui/ToolsWidget.cc
+++ b/gazebo/gui/ToolsWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/ToolsWidget.hh b/gazebo/gui/ToolsWidget.hh
index ce86c07..e167d09 100644
--- a/gazebo/gui/ToolsWidget.hh
+++ b/gazebo/gui/ToolsWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +21,8 @@
 #include <string>
 
 #include "gazebo/common/Event.hh"
-#include "gui/qt.h"
+#include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
     /// \class ToolsWidget ToolsWidget.hh gui/ToolsWidget.hh
     /// \brief A widget that manages all the tools on the right side of the
     /// render widget.
-    class ToolsWidget : public QWidget
+    class GAZEBO_VISIBLE ToolsWidget : public QWidget
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/TopicSelector.cc b/gazebo/gui/TopicSelector.cc
index 51d8c68..f8b5e80 100644
--- a/gazebo/gui/TopicSelector.cc
+++ b/gazebo/gui/TopicSelector.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/TopicSelector.hh b/gazebo/gui/TopicSelector.hh
index 2b5829e..11bcc9c 100644
--- a/gazebo/gui/TopicSelector.hh
+++ b/gazebo/gui/TopicSelector.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 
 #include "gazebo/common/Time.hh"
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -31,7 +32,7 @@ namespace gazebo
 
     /// \class TopicSelector TopicSelector.hh gui/TopicSelector.hh
     /// \brief A widget that provides a list of topics to select from.
-    class TopicSelector : public QDialog
+    class GAZEBO_VISIBLE TopicSelector : public QDialog
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/BuildingEditor.cc b/gazebo/gui/building/BuildingEditor.cc
new file mode 100644
index 0000000..658c772
--- /dev/null
+++ b/gazebo/gui/building/BuildingEditor.cc
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/gui/Actions.hh"
+#include "gazebo/gui/MainWindow.hh"
+#include "gazebo/gui/RenderWidget.hh"
+#include "gazebo/gui/building/BuildingEditorEvents.hh"
+#include "gazebo/gui/building/BuildingEditorPalette.hh"
+#include "gazebo/gui/building/BuildingEditor.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+BuildingEditor::BuildingEditor(MainWindow *_mainWindow)
+  : Editor(_mainWindow)
+{
+  // Create the building editor tab
+  this->buildingPalette = new BuildingEditorPalette;
+  this->Init("buildingEditorTab", "Building Editor", this->buildingPalette);
+
+  this->saveAct = new QAction(tr("&Save (As)"), this->mainWindow);
+  this->saveAct->setStatusTip(tr("Save (As)"));
+  this->saveAct->setShortcut(tr("Ctrl+S"));
+  this->saveAct->setCheckable(false);
+  connect(this->saveAct, SIGNAL(triggered()), this, SLOT(Save()));
+
+  this->discardAct = new QAction(tr("&Discard"), this->mainWindow);
+  this->discardAct->setStatusTip(tr("Discard"));
+  this->discardAct->setShortcut(tr("Ctrl+D"));
+  this->discardAct->setCheckable(false);
+  connect(this->discardAct, SIGNAL(triggered()), this, SLOT(Discard()));
+
+  this->doneAct = new QAction(tr("Don&e"), this->mainWindow);
+  this->doneAct->setShortcut(tr("Ctrl+E"));
+  this->doneAct->setStatusTip(tr("Done"));
+  this->doneAct->setCheckable(false);
+  connect(this->doneAct, SIGNAL(triggered()), this, SLOT(Done()));
+
+  this->exitAct = new QAction(tr("E&xit Building Editor"), this->mainWindow);
+  this->exitAct->setStatusTip(tr("Exit Building Editor"));
+  this->exitAct->setShortcut(tr("Ctrl+X"));
+  this->exitAct->setCheckable(false);
+  connect(this->exitAct, SIGNAL(triggered()), this, SLOT(Exit()));
+
+  connect(g_editBuildingAct, SIGNAL(toggled(bool)), this, SLOT(OnEdit(bool)));
+
+  this->connections.push_back(
+      gui::editor::Events::ConnectFinishBuildingModel(
+      boost::bind(&BuildingEditor::OnFinish, this)));
+
+  this->menuBar = NULL;
+}
+
+/////////////////////////////////////////////////
+BuildingEditor::~BuildingEditor()
+{
+}
+
+////////////////////////////////////////////////
+void BuildingEditor::Save()
+{
+  gui::editor::Events::saveBuildingEditor();
+}
+
+/////////////////////////////////////////////////
+void BuildingEditor::Discard()
+{
+  gui::editor::Events::discardBuildingEditor();
+}
+
+/////////////////////////////////////////////////
+void BuildingEditor::Done()
+{
+  gui::editor::Events::doneBuildingEditor();
+}
+
+/////////////////////////////////////////////////
+void BuildingEditor::Exit()
+{
+  gui::editor::Events::exitBuildingEditor();
+}
+
+/////////////////////////////////////////////////
+void BuildingEditor::OnFinish()
+{
+  g_editBuildingAct->setChecked(!g_editBuildingAct->isChecked());
+  this->OnEdit(false);
+}
+
+/////////////////////////////////////////////////
+void BuildingEditor::CreateMenus()
+{
+  delete this->menuBar;
+
+  this->menuBar = new QMenuBar;
+  this->menuBar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+
+  QMenu *fileMenu = this->menuBar->addMenu(tr("&File"));
+  fileMenu->addAction(this->saveAct);
+  fileMenu->addAction(this->discardAct);
+  fileMenu->addAction(this->doneAct);
+  fileMenu->addAction(this->exitAct);
+}
+
+/////////////////////////////////////////////////
+void BuildingEditor::OnEdit(bool _checked)
+{
+  if (_checked)
+  {
+    this->CreateMenus();
+    this->mainWindow->Pause();
+    this->mainWindow->ShowLeftColumnWidget("buildingEditorTab");
+    this->mainWindow->ShowMenuBar(this->menuBar);
+    this->mainWindow->GetRenderWidget()->ShowEditor(true);
+  }
+  else
+  {
+    this->mainWindow->ShowLeftColumnWidget();
+    this->mainWindow->GetRenderWidget()->ShowEditor(false);
+    this->mainWindow->ShowMenuBar();
+    this->mainWindow->Play();
+  }
+}
diff --git a/gazebo/gui/building/BuildingEditor.hh b/gazebo/gui/building/BuildingEditor.hh
new file mode 100644
index 0000000..6cbbaf4
--- /dev/null
+++ b/gazebo/gui/building/BuildingEditor.hh
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _BUILDING_EDITOR_HH_
+#define _BUILDING_EDITOR_HH_
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/gui/Editor.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class BuildingEditorPalette;
+
+    /// \class TerrainEditor TerrainEditor.hh gui/gui.hh
+    /// \brief Interface to the terrain editor.
+    class GAZEBO_VISIBLE BuildingEditor : public Editor
+    {
+      Q_OBJECT
+
+      /// \brief Constuctor.
+      /// \param[in] _mainWindow Pointer to the mainwindow.
+      public: BuildingEditor(MainWindow *_mainWindow);
+
+      /// \brief Destuctor.
+      public: virtual ~BuildingEditor();
+
+      /// \brief Qt callback when the building editor's save action is
+      /// triggered.
+      private slots: void Save();
+
+      /// \brief Qt callback when the building editor's discard action is
+      /// triggered.
+      private slots: void Discard();
+
+      /// \brief Qt callback when the building editor's done action is
+      /// triggered.
+      private slots: void Done();
+
+      /// \brief Qt callback when the building editor's exit action is
+      /// triggered.
+      private slots: void Exit();
+
+      /// \brief Callback from the building editor when the building model
+      /// has been completed.
+      private: void OnFinish();
+
+      /// \brief QT callback when entering building edit mode
+      /// \param[in] _checked True if the menu item is checked
+      private slots: void OnEdit(bool _checked);
+
+      /// \brief Contains all the building editor tools.
+      private: BuildingEditorPalette *buildingPalette;
+
+      /// \brief Create menus
+      private: void CreateMenus();
+
+      /// \brief Our custom menubar
+      private: QMenuBar *menuBar;
+
+      private: QAction *saveAct;
+      private: QAction *discardAct;
+      private: QAction *doneAct;
+      private: QAction *exitAct;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/building/BuildingEditorEvents.cc b/gazebo/gui/building/BuildingEditorEvents.cc
new file mode 100644
index 0000000..0455e51
--- /dev/null
+++ b/gazebo/gui/building/BuildingEditorEvents.cc
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gui/building/BuildingEditorEvents.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+event::EventT<void (std::string)> editor::Events::createBuildingEditorItem;
+event::EventT<void (std::string, std::string)>
+    editor::Events::saveBuildingModel;
+event::EventT<void ()> editor::Events::finishBuildingModel;
+event::EventT<void ()> editor::Events::discardBuildingModel;
+event::EventT<void (int)> editor::Events::changeBuildingLevel;
+event::EventT<void ()> editor::Events::addBuildingLevel;
+event::EventT<void (int)> editor::Events::deleteBuildingLevel;
+event::EventT<void (int, std::string)> editor::Events::changeBuildingLevelName;
+event::EventT<void (double)> editor::Events::changeBuildingEditorZoom;
+
+event::EventT<void ()> editor::Events::saveBuildingEditor;
+event::EventT<void ()> editor::Events::discardBuildingEditor;
+event::EventT<void ()> editor::Events::doneBuildingEditor;
+event::EventT<void ()> editor::Events::exitBuildingEditor;
diff --git a/gazebo/gui/building/BuildingEditorEvents.hh b/gazebo/gui/building/BuildingEditorEvents.hh
new file mode 100644
index 0000000..eb058dc
--- /dev/null
+++ b/gazebo/gui/building/BuildingEditorEvents.hh
@@ -0,0 +1,254 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _BUILDING_EDITOR_EVENTS_HH_
+#define _BUILDING_EDITOR_EVENTS_HH_
+
+#include <string>
+#include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    namespace editor
+    {
+      class GAZEBO_VISIBLE Events
+      {
+        /// \brief Connect a boost::slot to the create editor item signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr
+                ConnectCreateBuildingEditorItem(T _subscriber)
+          { return createBuildingEditorItem.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the create editor item signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectCreateBuildingEditorItem(
+            event::ConnectionPtr _subscriber)
+          { createBuildingEditorItem.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the save model signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr ConnectSaveBuildingModel(T _subscriber)
+          { return saveBuildingModel.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the save model signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectSaveBuildingModel(
+            event::ConnectionPtr _subscriber)
+          { saveBuildingModel.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the finish model signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr
+            ConnectFinishBuildingModel(T _subscriber)
+          { return finishBuildingModel.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the finish model signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectFinishBuildingModel(
+            event::ConnectionPtr _subscriber)
+          { finishBuildingModel.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the discard model signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr
+                ConnectDiscardBuildingModel(T _subscriber)
+          { return discardBuildingModel.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the discard model signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectDiscardBuildingModel(
+            event::ConnectionPtr _subscriber)
+          { discardBuildingModel.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the change model signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr
+                ConnectChangeBuildingLevel(T _subscriber)
+          { return changeBuildingLevel.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the change level signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectChangeBuildingLevel(
+            event::ConnectionPtr _subscriber)
+          { changeBuildingLevel.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the add level signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr ConnectAddBuildingLevel(T _subscriber)
+          { return addBuildingLevel.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the add level signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectAddBuildingLevel(
+            event::ConnectionPtr _subscriber)
+          { addBuildingLevel.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the delete level signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr
+            ConnectDeleteBuildingLevel(T _subscriber)
+          { return deleteBuildingLevel.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the delete level signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectDeleteBuildingLevel(
+              event::ConnectionPtr _subscriber)
+          { deleteBuildingLevel.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the change level name signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr
+                ConnectChangeBuildingLevelName(T _subscriber)
+          { return changeBuildingLevelName.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the change level name signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectChangeBuildingLevelName(
+              event::ConnectionPtr _subscriber)
+          { changeBuildingLevelName.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the change zoom signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+          static event::ConnectionPtr
+              ConnectChangeBuildingEditorZoom(T _subscriber)
+        { return changeBuildingEditorZoom.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the change zoom level signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectChangeBuildingEditorZoom(
+            event::ConnectionPtr _subscriber)
+          { changeBuildingEditorZoom.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the save signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr ConnectSaveBuildingEditor(T _subscriber)
+          { return saveBuildingEditor.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the save signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectSaveBuildingEditor(
+            event::ConnectionPtr _subscriber)
+          { saveBuildingEditor.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the done signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr ConnectDoneBuildingEditor(T _subscriber)
+          { return doneBuildingEditor.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the done signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectDoneBuildingEditor(
+                    event::ConnectionPtr _subscriber)
+                { doneBuildingEditor.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the discard signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr
+            ConnectDiscardBuildingEditor(T _subscriber)
+          { return discardBuildingEditor.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the discard signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectDiscardBuildingEditor(
+              event::ConnectionPtr _subscriber)
+          { discardBuildingEditor.Disconnect(_subscriber); }
+
+        /// \brief Connect a boost::slot to the exit signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr ConnectExitBuildingEditor(T _subscriber)
+          { return exitBuildingEditor.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the exit signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectExitBuildingEditor(
+            event::ConnectionPtr _subscriber)
+          { exitBuildingEditor.Disconnect(_subscriber); }
+
+        /// \brief An editor item is to be created
+        public: static event::EventT<void (std::string)>
+            createBuildingEditorItem;
+
+        /// \brief A model has been saved with a name and a location
+        public: static event::EventT<void (std::string, std::string)>
+            saveBuildingModel;
+
+        /// \brief A model has been completed and uploaded onto the server.
+        public: static event::EventT<void ()> finishBuildingModel;
+
+        /// \brief A model has been discarded
+        public: static event::EventT<void ()> discardBuildingModel;
+
+        /// \brief The current level has been changed
+        public: static event::EventT<void (int)> changeBuildingLevel;
+
+        /// \brief A new level has been added
+        public: static event::EventT<void ()> addBuildingLevel;
+
+        /// \brief A new level has been deleted
+        public: static event::EventT<void (int)> deleteBuildingLevel;
+
+        /// \brief The current level name has been changed
+        public: static event::EventT<void (int, std::string)>
+            changeBuildingLevelName;
+
+        /// \brief The current zoom level has been changed
+        public: static event::EventT<void (double)> changeBuildingEditorZoom;
+
+        /// \brief Save the model
+        public: static event::EventT<void ()> saveBuildingEditor;
+
+        /// \brief Discard the model
+        public: static event::EventT<void ()> discardBuildingEditor;
+
+        /// \brief Finish creating the model, save, and exit
+        public: static event::EventT<void ()> doneBuildingEditor;
+
+        /// \brief Exit the editor mode with the option to save
+        public: static event::EventT<void ()> exitBuildingEditor;
+      };
+    }
+  }
+}
+#endif
diff --git a/gazebo/gui/building/BuildingEditorPalette.cc b/gazebo/gui/building/BuildingEditorPalette.cc
index c3a7b58..1a79160 100644
--- a/gazebo/gui/building/BuildingEditorPalette.cc
+++ b/gazebo/gui/building/BuildingEditorPalette.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
 */
 
 #include "gazebo/gui/building/BuildingEditorPalette.hh"
-#include "gazebo/gui/building/EditorEvents.hh"
+#include "gazebo/gui/building/BuildingEditorEvents.hh"
 
 using namespace gazebo;
 using namespace gui;
@@ -44,129 +44,60 @@ BuildingEditorPalette::BuildingEditorPalette(QWidget *_parent)
   underLineFont.setUnderline(true);
   underLineFont.setPointSize(14);
 
-  QGridLayout *floorPlanGridLayout = new QGridLayout;
-
-  QLabel *floorPlanLabel = new QLabel(tr("Floor Plan"));
-  floorPlanLabel->setFont(underLineFont);
-
-  QLabel *drawWallsLabel = new QLabel;
-  drawWallsLabel->setText("Draw Walls");
-  QPushButton *addDrawWallButton = new QPushButton;
-  addDrawWallButton->setIcon(QIcon(":/images/wall.png"));
-  addDrawWallButton->setIconSize(QSize(30, 60));
-  addDrawWallButton->setFlat(true);
-  connect(addDrawWallButton, SIGNAL(clicked()), this, SLOT(OnDrawWall()));
-
-  QVBoxLayout *drawWallLayout = new QVBoxLayout;
-  drawWallLayout->addWidget(addDrawWallButton);
-  drawWallLayout->addWidget(drawWallsLabel);
-  floorPlanGridLayout->addLayout(drawWallLayout, 0, 0);
-  floorPlanGridLayout->setAlignment(Qt::AlignLeft);
-
-/*  QLabel *importImageLabel = new QLabel;
-  importImageLabel->setText("Import Image");
-  QPushButton *importImageButton = new QPushButton;
-  importImageButton->setIcon(QIcon(":/images/box.png"));
-  importImageButton->setIconSize(QSize(30,30));
-  importImageButton->setFlat(true);
-  connect(importImageButton, SIGNAL(clicked()), this, SLOT(OnImportImage()));
-
-  QVBoxLayout *importImageLayout = new QVBoxLayout;
-  importImageLayout->addWidget(importImageButton);
-  importImageLayout->addWidget(importImageLabel);
-  importImageLayout->setAlignment(Qt::AlignLeft);
-  floorPlanGridLayout->addLayout(importImageLayout, 0, 1);*/
-
-  QVBoxLayout *floorPlanLayout = new QVBoxLayout;
-  floorPlanLayout->addWidget(floorPlanLabel);
-  floorPlanLayout->addLayout(floorPlanGridLayout);
-
-  QGridLayout *windowDoorGridLayout = new QGridLayout;
-  QLabel *windowDoorLabel = new QLabel(tr("Windows & Doors"));
-  windowDoorLabel->setFont(underLineFont);
-
-  QLabel *addWindowLabel = new QLabel;
-  addWindowLabel->setText("Add Window");
-  QPushButton *addWindowButton = new QPushButton;
-  addWindowButton->setIcon(QIcon(":/images/window.png"));
-  addWindowButton->setIconSize(QSize(30, 60));
-  addWindowButton->setFlat(true);
+  // Add a wall button
+  QPushButton *addWallButton = new QPushButton(tr("Add Wall"), this);
+  addWallButton->setCheckable(true);
+  addWallButton->setChecked(false);
+  this->brushes.push_back(addWallButton);
+  connect(addWallButton, SIGNAL(clicked()), this, SLOT(OnDrawWall()));
+
+  // Add a window button
+  QPushButton *addWindowButton = new QPushButton(tr("Add Window"), this);
+  addWindowButton->setCheckable(true);
+  addWindowButton->setChecked(false);
+  this->brushes.push_back(addWindowButton);
   connect(addWindowButton, SIGNAL(clicked()), this, SLOT(OnAddWindow()));
 
-  QVBoxLayout *addWindowLayout = new QVBoxLayout;
-  addWindowLayout->addWidget(addWindowButton);
-  addWindowLayout->addWidget(addWindowLabel);
-  addWindowLayout->setAlignment(Qt::AlignLeft);
-  windowDoorGridLayout->addLayout(addWindowLayout, 0, 0);
-
-  windowDoorGridLayout->addItem(new QSpacerItem(20, 10, QSizePolicy::Minimum,
-      QSizePolicy::Minimum), 0, 1);
-
-  QLabel *addDoorLabel = new QLabel;
-  addDoorLabel->setText("Add Doorway");
-  QPushButton *addDoorButton = new QPushButton;
-  addDoorButton->setIcon(QIcon(":/images/door.png"));
-  addDoorButton->setIconSize(QSize(30, 60));
-  addDoorButton->setFlat(true);
+  // Add a door button
+  QPushButton *addDoorButton = new QPushButton(tr("Add Door"), this);
+  addDoorButton->setCheckable(true);
+  addDoorButton->setChecked(false);
+  this->brushes.push_back(addDoorButton);
   connect(addDoorButton, SIGNAL(clicked()), this, SLOT(OnAddDoor()));
 
-  QVBoxLayout *addDoorLayout = new QVBoxLayout;
-  addDoorLayout->addWidget(addDoorButton);
-  addDoorLayout->addWidget(addDoorLabel);
-  addDoorLayout->setAlignment(Qt::AlignLeft);
-  windowDoorGridLayout->addLayout(addDoorLayout, 0, 2);
-  windowDoorGridLayout->setAlignment(Qt::AlignLeft);
+  // Add a stair button
+  QPushButton *addStairButton = new QPushButton(tr("Add Stair"), this);
+  addStairButton->setCheckable(true);
+  addStairButton->setChecked(false);
+  this->brushes.push_back(addStairButton);
+  connect(addStairButton, SIGNAL(clicked()), this, SLOT(OnAddStair()));
 
-  QVBoxLayout *windowDoorLayout = new QVBoxLayout;
-  windowDoorLayout->addWidget(windowDoorLabel);
-  windowDoorLayout->addLayout(windowDoorGridLayout);
-
-  QLabel *otherLabel = new QLabel(tr("Other"));
-  otherLabel->setFont(underLineFont);
-
-  QGridLayout *otherGridLayout = new QGridLayout;
-
-  QLabel *addStairsLabel = new QLabel;
-  addStairsLabel->setText("Add Stairs");
-  QPushButton *addStairsButton = new QPushButton;
-  addStairsButton->setIcon(QIcon(":/images/stairs.png"));
-  addStairsButton->setIconSize(QSize(30, 60));
-  addStairsButton->setFlat(true);
-  connect(addStairsButton, SIGNAL(clicked()), this, SLOT(OnAddStairs()));
-
-  QVBoxLayout *addStairsLayout = new QVBoxLayout;
-  addStairsLayout->addWidget(addStairsButton);
-  addStairsLayout->addWidget(addStairsLabel);
-  otherGridLayout->addLayout(addStairsLayout, 0, 0);
-  otherGridLayout->setAlignment(Qt::AlignLeft);
-
-  QVBoxLayout *otherLayout = new QVBoxLayout;
-  otherLayout->addWidget(otherLabel);
-  otherLayout->addLayout(otherGridLayout);
+  // Layout to hold the drawing buttons
+  QGridLayout *gridLayout = new QGridLayout;
+  gridLayout->addWidget(addWallButton, 0, 0);
+  gridLayout->addWidget(addWindowButton, 0, 1);
+  gridLayout->addWidget(addDoorButton, 1, 0);
+  gridLayout->addWidget(addStairButton, 1, 1);
 
   QPushButton *discardButton = new QPushButton(tr("Discard"));
   connect(discardButton, SIGNAL(clicked()), this, SLOT(OnDiscard()));
-  saveButton = new QPushButton(tr("Save As"));
-  connect(saveButton, SIGNAL(clicked()), this, SLOT(OnSave()));
+
+  this->saveButton = new QPushButton(tr("Save As"));
+  connect(this->saveButton, SIGNAL(clicked()), this, SLOT(OnSave()));
+
   QPushButton *doneButton = new QPushButton(tr("Done"));
   connect(doneButton, SIGNAL(clicked()), this, SLOT(OnDone()));
 
   QHBoxLayout *buttonsLayout = new QHBoxLayout;
   buttonsLayout->addWidget(discardButton);
-  buttonsLayout->addWidget(saveButton);
+  buttonsLayout->addWidget(this->saveButton);
   buttonsLayout->addWidget(doneButton);
   buttonsLayout->setAlignment(Qt::AlignCenter);
 
   mainLayout->addLayout(modelNameLayout);
   mainLayout->addItem(new QSpacerItem(10, 20, QSizePolicy::Expanding,
                       QSizePolicy::Minimum));
-  mainLayout->addLayout(floorPlanLayout);
-  mainLayout->addItem(new QSpacerItem(10, 20, QSizePolicy::Expanding,
-                      QSizePolicy::Minimum));
-  mainLayout->addLayout(windowDoorLayout);
-  mainLayout->addItem(new QSpacerItem(10, 20, QSizePolicy::Expanding,
-                      QSizePolicy::Minimum));
-  mainLayout->addLayout(otherLayout);
+  mainLayout->addLayout(gridLayout);
   mainLayout->addItem(new QSpacerItem(10, 20, QSizePolicy::Expanding,
                       QSizePolicy::Minimum));
   mainLayout->addLayout(buttonsLayout);
@@ -197,7 +128,6 @@ BuildingEditorPalette::BuildingEditorPalette(QWidget *_parent)
 
   this->setLayout(mainLayout);
 
-
   this->connections.push_back(
       gui::editor::Events::ConnectSaveBuildingModel(
       boost::bind(&BuildingEditorPalette::OnSaveModel, this, _1, _2)));
@@ -205,6 +135,10 @@ BuildingEditorPalette::BuildingEditorPalette(QWidget *_parent)
   this->connections.push_back(
       gui::editor::Events::ConnectDiscardBuildingModel(
       boost::bind(&BuildingEditorPalette::OnDiscardModel, this)));
+
+  this->connections.push_back(
+      gui::editor::Events::ConnectCreateBuildingEditorItem(
+    boost::bind(&BuildingEditorPalette::OnCreateEditorItem, this, _1)));
 }
 
 /////////////////////////////////////////////////
@@ -232,7 +166,7 @@ void BuildingEditorPalette::OnAddDoor()
 
 
 /////////////////////////////////////////////////
-void BuildingEditorPalette::OnAddStairs()
+void BuildingEditorPalette::OnAddStair()
 {
   gui::editor::Events::createBuildingEditorItem("stairs");
 }
@@ -269,3 +203,17 @@ void BuildingEditorPalette::OnSaveModel(const std::string &_saveName,
   this->saveButton->setText("Save");
   this->modelNameLabel->setText(tr(_saveName.c_str()));
 }
+
+/////////////////////////////////////////////////
+void BuildingEditorPalette::OnCreateEditorItem(const std::string &_type)
+{
+  if (_type.empty())
+  {
+    // Uncheck all the buttons
+    for (std::list<QPushButton *>::iterator iter = this->brushes.begin();
+        iter != this->brushes.end(); ++iter)
+    {
+      (*iter)->setChecked(false);
+    }
+  }
+}
diff --git a/gazebo/gui/building/BuildingEditorPalette.hh b/gazebo/gui/building/BuildingEditorPalette.hh
index 1b7b302..a8ca325 100644
--- a/gazebo/gui/building/BuildingEditorPalette.hh
+++ b/gazebo/gui/building/BuildingEditorPalette.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,8 +20,11 @@
 
 #include <string>
 #include <vector>
+#include <list>
+
 #include "gazebo/gui/qt.h"
 #include "gazebo/common/Events.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,7 +35,7 @@ namespace gazebo
 
     /// \class BuildingEditorPalette BuildingEditorPalette.hh
     /// \brief A palette of building items which can be added to the editor.
-    class BuildingEditorPalette : public QWidget
+    class GAZEBO_VISIBLE BuildingEditorPalette : public QWidget
     {
       Q_OBJECT
 
@@ -55,7 +58,7 @@ namespace gazebo
       private slots: void OnAddDoor();
 
       /// \brief Qt callback when the draw stairs button is pressed.
-      private slots: void OnAddStairs();
+      private slots: void OnAddStair();
 
       /// \brief Qt callback when the discard button is pressed.
       private slots: void OnDiscard();
@@ -73,6 +76,10 @@ namespace gazebo
       private: void OnSaveModel(const std::string &_saveName,
           const std::string &_saveLocation);
 
+      /// \brief Event received when an editor item is selected.
+      /// \param[in] _type Type of item to add.
+      private: void OnCreateEditorItem(const std::string &_type);
+
       /// \brief Event received when a building model has been discarded.
       private: void OnDiscardModel();
 
@@ -82,6 +89,9 @@ namespace gazebo
       /// \brief Save button.
       private: QPushButton *saveButton;
 
+      /// \brief All the brushes (wall, door, window, stair, etc).
+      private: std::list<QPushButton *> brushes;
+
       /// \brief Name of model.
       private: std::string modelName;
 
diff --git a/gazebo/gui/building/BuildingEditorWidget.cc b/gazebo/gui/building/BuildingEditorWidget.cc
index bcd4a12..67d15e1 100644
--- a/gazebo/gui/building/BuildingEditorWidget.cc
+++ b/gazebo/gui/building/BuildingEditorWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -87,9 +87,9 @@ BuildingEditorWidget::~BuildingEditorWidget()
 /////////////////////////////////////////////////
 void BuildingEditorWidget::resizeEvent(QResizeEvent *_event)
 {
-  double boundingWidth = std::max(this->minimumWidth, _event->size().width());
+  qreal boundingWidth = std::max(this->minimumWidth, _event->size().width());
   boundingWidth = std::max(boundingWidth, this->scene->sceneRect().width());
-  double boundingHeight = std::max(this->minimumHeight,
+  qreal boundingHeight = std::max(this->minimumHeight,
       _event->size().height());
   boundingHeight = std::max(boundingHeight, this->scene->sceneRect().height());
   this->scene->setSceneRect(-boundingWidth/2, -boundingHeight/2,
diff --git a/gazebo/gui/building/BuildingEditorWidget.hh b/gazebo/gui/building/BuildingEditorWidget.hh
index 722104c..a99cb56 100644
--- a/gazebo/gui/building/BuildingEditorWidget.hh
+++ b/gazebo/gui/building/BuildingEditorWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 #define _BUILDING_EDITOR_WIDGET_HH_
 
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,7 +34,7 @@ namespace gazebo
     /// \class BuildingEditorWidget BuildingEditorWidget.hh
     /// \brief The parent widget of the building editor, level widget and scale
     /// widget.
-    class BuildingEditorWidget : public QWidget
+    class GAZEBO_VISIBLE BuildingEditorWidget : public QWidget
     {
       /// \brief Constructor
       /// \param[in] _parent Parent QWidget.
diff --git a/gazebo/gui/building/BuildingItem.cc b/gazebo/gui/building/BuildingItem.cc
index ed7c5dc..808ea3b 100644
--- a/gazebo/gui/building/BuildingItem.cc
+++ b/gazebo/gui/building/BuildingItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/BuildingItem.hh b/gazebo/gui/building/BuildingItem.hh
index aa64335..98fa3aa 100644
--- a/gazebo/gui/building/BuildingItem.hh
+++ b/gazebo/gui/building/BuildingItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,8 @@
 #ifndef _BUILDING_ITEM_HH_
 #define _BUILDING_ITEM_HH_
 
+#include "gazebo/util/system.hh"
+
 namespace gazebo
 {
   namespace gui
@@ -28,7 +30,7 @@ namespace gazebo
     /// \class BuildingItem BuildingItem.hh
     /// \brief Base class of a items that have building level properties such as
     /// the level number and level height.
-    class BuildingItem
+    class GAZEBO_VISIBLE BuildingItem
     {
         /// \brief Constructor
         public: BuildingItem();
diff --git a/gazebo/gui/building/BuildingMaker.cc b/gazebo/gui/building/BuildingMaker.cc
index 975a50c..fbdf9e8 100644
--- a/gazebo/gui/building/BuildingMaker.cc
+++ b/gazebo/gui/building/BuildingMaker.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,7 +30,7 @@
 #include "gazebo/transport/Publisher.hh"
 #include "gazebo/transport/Node.hh"
 
-#include "gazebo/gui/Gui.hh"
+#include "gazebo/gui/GuiIface.hh"
 #include "gazebo/gui/EntityMaker.hh"
 
 #ifdef HAVE_GTS
@@ -41,7 +41,7 @@
 
 #include "gazebo/gazebo_config.h"
 #include "gazebo/gui/building/FinishBuildingDialog.hh"
-#include "gazebo/gui/building/EditorEvents.hh"
+#include "gazebo/gui/building/BuildingEditorEvents.hh"
 #include "gazebo/gui/building/BuildingModelManip.hh"
 #include "gazebo/gui/building/EditorItem.hh"
 #include "gazebo/gui/building/BuildingMaker.hh"
@@ -90,8 +90,6 @@ double BuildingMaker::conversionScale;
       new FinishBuildingDialog(FinishBuildingDialog::MODEL_SAVE, 0);
   this->finishDialog =
       new FinishBuildingDialog(FinishBuildingDialog::MODEL_FINISH, 0);
-
-  this->Reset();
 }
 
 /////////////////////////////////////////////////
@@ -184,6 +182,11 @@ std::string BuildingMaker::AddPart(const std::string &_type,
 std::string BuildingMaker::AddWall(const QVector3D &_size,
     const QVector3D &_pos, double _angle)
 {
+  if (!this->modelVisual)
+  {
+    this->Reset();
+  }
+
   std::ostringstream linkNameStream;
   linkNameStream << "Wall_" << wallCounter++;
   std::string linkName = linkNameStream.str();
@@ -212,7 +215,7 @@ std::string BuildingMaker::AddWall(const QVector3D &_size,
   wallManip->SetPose(_pos.x(), _pos.y(), _pos.z(), 0, 0, _angle);
   this->allItems[linkName] = wallManip;
 
-  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_NOT_SELECTABLE);
+  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_GUI);
   return linkName;
 }
 
@@ -220,6 +223,11 @@ std::string BuildingMaker::AddWall(const QVector3D &_size,
 std::string BuildingMaker::AddWindow(const QVector3D &_size,
     const QVector3D &_pos, double _angle)
 {
+  if (!this->modelVisual)
+  {
+    this->Reset();
+  }
+
   std::ostringstream linkNameStream;
   linkNameStream << "Window_" << this->windowCounter++;
   std::string linkName = linkNameStream.str();
@@ -249,7 +257,7 @@ std::string BuildingMaker::AddWindow(const QVector3D &_size,
   windowManip->SetPose(_pos.x(), _pos.y(), _pos.z(), 0, 0, _angle);
   this->allItems[linkName] = windowManip;
 
-  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_NOT_SELECTABLE);
+  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_GUI);
   return linkName;
 }
 
@@ -257,6 +265,11 @@ std::string BuildingMaker::AddWindow(const QVector3D &_size,
 std::string BuildingMaker::AddDoor(const QVector3D &_size,
     const QVector3D &_pos, double _angle)
 {
+  if (!this->modelVisual)
+  {
+    this->Reset();
+  }
+
   /// TODO a copy of AddWindow function. FIXME later
   std::ostringstream linkNameStream;
   linkNameStream << "Door_" << this->doorCounter++;
@@ -287,7 +300,7 @@ std::string BuildingMaker::AddDoor(const QVector3D &_size,
   doorManip->SetPose(_pos.x(), _pos.y(), _pos.z(), 0, 0, _angle);
   this->allItems[linkName] = doorManip;
 
-  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_NOT_SELECTABLE);
+  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_GUI);
   return linkName;
 }
 
@@ -295,6 +308,11 @@ std::string BuildingMaker::AddDoor(const QVector3D &_size,
 std::string BuildingMaker::AddStairs(const QVector3D &_size,
     const QVector3D &_pos, double _angle, int _steps)
 {
+  if (!this->modelVisual)
+  {
+    this->Reset();
+  }
+
   std::ostringstream linkNameStream;
   linkNameStream << "Stairs_" << this->stairsCounter++;
   std::string linkName = linkNameStream.str();
@@ -352,7 +370,7 @@ std::string BuildingMaker::AddStairs(const QVector3D &_size,
     stepVisual->SetRotation(baseStepVisual->GetRotation());
   }
 
-  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_NOT_SELECTABLE);
+  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_GUI);
   return linkName;
 }
 
@@ -360,6 +378,11 @@ std::string BuildingMaker::AddStairs(const QVector3D &_size,
 std::string BuildingMaker::AddFloor(const QVector3D &_size,
     const QVector3D &_pos, double _angle)
 {
+  if (!this->modelVisual)
+  {
+    this->Reset();
+  }
+
   /// TODO a copy of AddWindow function. FIXME later
   std::ostringstream linkNameStream;
   linkNameStream << "Floor_" << this->floorCounter++;
@@ -390,7 +413,7 @@ std::string BuildingMaker::AddFloor(const QVector3D &_size,
   floorManip->SetPose(_pos.x(), _pos.y(), _pos.z(), 0, 0, _angle);
   this->allItems[linkName] = floorManip;
 
-  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_NOT_SELECTABLE);
+  linkVisual->SetVisibilityFlags(GZ_VISIBILITY_GUI);
   return linkName;
 }
 
@@ -440,18 +463,26 @@ void BuildingMaker::Stop()
 /////////////////////////////////////////////////
 void BuildingMaker::Reset()
 {
+  if (!gui::get_active_camera() ||
+      !gui::get_active_camera()->GetScene())
+    return;
+
   rendering::ScenePtr scene = gui::get_active_camera()->GetScene();
+
   if (this->modelVisual)
     scene->RemoveVisual(this->modelVisual);
+
   this->saved = false;
   this->saveLocation = QDir::homePath().toStdString();
   this->modelName = this->buildingDefaultName;
+
   this->modelVisual.reset(new rendering::Visual(this->modelName,
       scene->GetWorldVisual()));
+
   this->modelVisual->Load();
   this->modelPose = math::Pose::Zero;
   this->modelVisual->SetPose(this->modelPose);
-  this->modelVisual->SetVisibilityFlags(GZ_VISIBILITY_NOT_SELECTABLE);
+  this->modelVisual->SetVisibilityFlags(GZ_VISIBILITY_GUI);
   scene->AddVisual(this->modelVisual);
 
   std::map<std::string, BuildingModelManip *>::iterator it;
@@ -1099,7 +1130,6 @@ void BuildingMaker::SubdivideRectSurface(const QRectF &_surface,
   startings.insert(start);
 
   std::multiset<QPointF>::iterator startIt;
-  std::multiset<QRectF>::iterator filledIt;
 
   // Surface subdivision algorithm:
   // subdivisions are called blocks here
diff --git a/gazebo/gui/building/BuildingMaker.hh b/gazebo/gui/building/BuildingMaker.hh
index 298e8d6..82c4af2 100644
--- a/gazebo/gui/building/BuildingMaker.hh
+++ b/gazebo/gui/building/BuildingMaker.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,10 +21,13 @@
 #include <string>
 #include <vector>
 #include <map>
-#include "gazebo/sdf/sdf.hh"
+#include <sdf/sdf.hh>
+
+#include "gazebo/math/Pose.hh"
 #include "gazebo/common/Events.hh"
 #include "gazebo/gui/EntityMaker.hh"
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -45,7 +48,7 @@ namespace gazebo
 
     /// \class BuildingMaker BuildingMaker.hh
     /// \brief Create and manage 3D visuals of a building.
-    class BuildingMaker : public EntityMaker
+    class GAZEBO_VISIBLE BuildingMaker : public EntityMaker
     {
       /// \brief Constructor
       public: BuildingMaker();
diff --git a/gazebo/gui/building/BuildingModelManip.cc b/gazebo/gui/building/BuildingModelManip.cc
index 212fbf2..e3cae33 100644
--- a/gazebo/gui/building/BuildingModelManip.cc
+++ b/gazebo/gui/building/BuildingModelManip.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/BuildingModelManip.hh b/gazebo/gui/building/BuildingModelManip.hh
index 4ce2443..f2f20da 100644
--- a/gazebo/gui/building/BuildingModelManip.hh
+++ b/gazebo/gui/building/BuildingModelManip.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #include "gazebo/math/Pose.hh"
 #include "gazebo/math/Vector3.hh"
 #include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class BuildingModelManip BuildingModelManip.hh
     /// \brief Manipulate a 3D visual associated to a 2D editor item.
-    class BuildingModelManip : public QObject
+    class GAZEBO_VISIBLE BuildingModelManip : public QObject
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/CMakeLists.txt b/gazebo/gui/building/CMakeLists.txt
index 292aefa..9ae9f79 100644
--- a/gazebo/gui/building/CMakeLists.txt
+++ b/gazebo/gui/building/CMakeLists.txt
@@ -1,14 +1,15 @@
 include (${gazebo_cmake_dir}/GazeboUtils.cmake)
-include ( ${QT_USE_FILE} )
+include (${QT_USE_FILE})
 
 set (sources
+  BuildingEditor.cc
+  BuildingEditorEvents.cc
   BuildingEditorPalette.cc
   BuildingEditorWidget.cc
   BuildingItem.cc
   BuildingMaker.cc
   BuildingModelManip.cc
   DoorItem.cc
-  EditorEvents.cc
   EditorItem.cc
   EditorView.cc
   FinishBuildingDialog.cc
@@ -31,6 +32,7 @@ set (sources
 )
 
 set (qt_headers
+  BuildingEditor.hh
   BuildingEditorPalette.hh
   BuildingModelManip.hh
   DoorItem.hh
@@ -51,10 +53,10 @@ set (qt_headers
 )
 
 set (headers
+  BuildingEditorEvents.hh
   BuildingEditorWidget.hh
   BuildingItem.hh
   BuildingMaker.hh
-  EditorEvents.hh
   GrabberHandle.hh
   GridLines.hh
   LineSegmentItem.hh
@@ -68,12 +70,13 @@ QT4_ADD_RESOURCES(resources_RCC ${resources})
 
 include_directories(${CMAKE_CURRENT_BINARY_DIR})
 
-gz_add_library(gazebo_building ${sources} ${headers_MOC} ${headers} ${resources_RCC})
+gz_add_library(gazebo_gui_building ${sources} ${headers_MOC} ${headers} ${resources_RCC})
 
-target_link_libraries(gazebo_building gazebo_common
-                                      gazebo_transport
-                                      gazebo_sdf_interface
-                                      gazebo_rendering
-                                      gazebo_msgs)
+target_link_libraries(gazebo_gui_building
+  gazebo_common
+  gazebo_transport
+  gazebo_rendering
+  gazebo_msgs
+  ${QT_LIBRARIES})
 
-gz_install_library(gazebo_building)
+gz_install_library(gazebo_gui_building)
diff --git a/gazebo/gui/building/DoorItem.cc b/gazebo/gui/building/DoorItem.cc
index 5e84da8..3dda00b 100644
--- a/gazebo/gui/building/DoorItem.cc
+++ b/gazebo/gui/building/DoorItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/DoorItem.hh b/gazebo/gui/building/DoorItem.hh
index 0114d52..aad8e3c 100644
--- a/gazebo/gui/building/DoorItem.hh
+++ b/gazebo/gui/building/DoorItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/building/RectItem.hh"
 #include "gazebo/gui/building/BuildingItem.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class DoorItem DoorItem.hh
     /// \brief 2D representation of a door
-    class DoorItem : public RectItem, public BuildingItem
+    class GAZEBO_VISIBLE DoorItem : public RectItem, public BuildingItem
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/EditorEvents.cc b/gazebo/gui/building/EditorEvents.cc
deleted file mode 100644
index 0366208..0000000
--- a/gazebo/gui/building/EditorEvents.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "gazebo/gui/building/EditorEvents.hh"
-
-using namespace gazebo;
-using namespace gui;
-
-event::EventT<void (std::string)> editor::Events::createBuildingEditorItem;
-event::EventT<void (std::string, std::string)>
-    editor::Events::saveBuildingModel;
-event::EventT<void ()> editor::Events::finishBuildingModel;
-event::EventT<void ()> editor::Events::discardBuildingModel;
-event::EventT<void (int)> editor::Events::changeBuildingLevel;
-event::EventT<void ()> editor::Events::addBuildingLevel;
-event::EventT<void (int)> editor::Events::deleteBuildingLevel;
-event::EventT<void (int, std::string)> editor::Events::changeBuildingLevelName;
-event::EventT<void (double)> editor::Events::changeBuildingEditorZoom;
-
-event::EventT<void ()> editor::Events::saveBuildingEditor;
-event::EventT<void ()> editor::Events::discardBuildingEditor;
-event::EventT<void ()> editor::Events::doneBuildingEditor;
-event::EventT<void ()> editor::Events::exitBuildingEditor;
diff --git a/gazebo/gui/building/EditorEvents.hh b/gazebo/gui/building/EditorEvents.hh
deleted file mode 100644
index 7d10268..0000000
--- a/gazebo/gui/building/EditorEvents.hh
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef _EDITOR_EVENTS_HH_
-#define _EDITOR_EVENTS_HH_
-
-#include <string>
-#include "gazebo/common/Event.hh"
-
-namespace gazebo
-{
-  namespace gui
-  {
-    namespace editor
-    {
-      class Events
-      {
-        /// \brief Connect a boost::slot to the create editor item signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr
-                ConnectCreateBuildingEditorItem(T _subscriber)
-          { return createBuildingEditorItem.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the create editor item signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectCreateBuildingEditorItem(
-            event::ConnectionPtr _subscriber)
-          { createBuildingEditorItem.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the save model signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr ConnectSaveBuildingModel(T _subscriber)
-          { return saveBuildingModel.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the save model signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectSaveBuildingModel(
-            event::ConnectionPtr _subscriber)
-          { saveBuildingModel.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the finish model signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr
-            ConnectFinishBuildingModel(T _subscriber)
-          { return finishBuildingModel.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the finish model signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectFinishBuildingModel(
-            event::ConnectionPtr _subscriber)
-          { finishBuildingModel.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the discard model signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr
-                ConnectDiscardBuildingModel(T _subscriber)
-          { return discardBuildingModel.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the discard model signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectDiscardBuildingModel(
-            event::ConnectionPtr _subscriber)
-          { discardBuildingModel.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the change model signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr
-                ConnectChangeBuildingLevel(T _subscriber)
-          { return changeBuildingLevel.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the change level signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectChangeBuildingLevel(
-            event::ConnectionPtr _subscriber)
-          { changeBuildingLevel.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the add level signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr ConnectAddBuildingLevel(T _subscriber)
-          { return addBuildingLevel.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the add level signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectAddBuildingLevel(
-            event::ConnectionPtr _subscriber)
-          { addBuildingLevel.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the delete level signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr
-            ConnectDeleteBuildingLevel(T _subscriber)
-          { return deleteBuildingLevel.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the delete level signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectDeleteBuildingLevel(
-              event::ConnectionPtr _subscriber)
-          { deleteBuildingLevel.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the change level name signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr
-                ConnectChangeBuildingLevelName(T _subscriber)
-          { return changeBuildingLevelName.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the change level name signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectChangeBuildingLevelName(
-              event::ConnectionPtr _subscriber)
-          { changeBuildingLevelName.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the change zoom signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-          static event::ConnectionPtr
-              ConnectChangeBuildingEditorZoom(T _subscriber)
-        { return changeBuildingEditorZoom.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the change zoom level signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectChangeBuildingEditorZoom(
-            event::ConnectionPtr _subscriber)
-          { changeBuildingEditorZoom.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the save signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr ConnectSaveBuildingEditor(T _subscriber)
-          { return saveBuildingEditor.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the save signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectSaveBuildingEditor(
-            event::ConnectionPtr _subscriber)
-          { saveBuildingEditor.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the done signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr ConnectDoneBuildingEditor(T _subscriber)
-          { return doneBuildingEditor.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the done signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectDoneBuildingEditor(
-                    event::ConnectionPtr _subscriber)
-                { doneBuildingEditor.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the discard signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr
-            ConnectDiscardBuildingEditor(T _subscriber)
-          { return discardBuildingEditor.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the discard signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectDiscardBuildingEditor(
-              event::ConnectionPtr _subscriber)
-          { discardBuildingEditor.Disconnect(_subscriber); }
-
-        /// \brief Connect a boost::slot to the exit signal
-        /// \param[in] _subscriber the subscriber to this event
-        /// \return a connection
-        public: template<typename T>
-            static event::ConnectionPtr ConnectExitBuildingEditor(T _subscriber)
-          { return exitBuildingEditor.Connect(_subscriber); }
-
-        /// \brief Disconnect a boost::slot to the exit signal
-        /// \param[in] _subscriber the subscriber to this event
-        public: static void DisconnectExitBuildingEditor(
-            event::ConnectionPtr _subscriber)
-          { exitBuildingEditor.Disconnect(_subscriber); }
-
-        /// \brief An editor item is to be created
-        public: static event::EventT<void (std::string)>
-            createBuildingEditorItem;
-
-        /// \brief A model has been saved with a name and a location
-        public: static event::EventT<void (std::string, std::string)>
-            saveBuildingModel;
-
-        /// \brief A model has been completed and uploaded onto the server.
-        public: static event::EventT<void ()> finishBuildingModel;
-
-        /// \brief A model has been discarded
-        public: static event::EventT<void ()> discardBuildingModel;
-
-        /// \brief The current level has been changed
-        public: static event::EventT<void (int)> changeBuildingLevel;
-
-        /// \brief A new level has been added
-        public: static event::EventT<void ()> addBuildingLevel;
-
-        /// \brief A new level has been deleted
-        public: static event::EventT<void (int)> deleteBuildingLevel;
-
-        /// \brief The current level name has been changed
-        public: static event::EventT<void (int, std::string)>
-            changeBuildingLevelName;
-
-        /// \brief The current zoom level has been changed
-        public: static event::EventT<void (double)> changeBuildingEditorZoom;
-
-        /// \brief Save the model
-        public: static event::EventT<void ()> saveBuildingEditor;
-
-        /// \brief Discard the model
-        public: static event::EventT<void ()> discardBuildingEditor;
-
-        /// \brief Finish creating the model, save, and exit
-        public: static event::EventT<void ()> doneBuildingEditor;
-
-        /// \brief Exit the editor mode with the option to save
-        public: static event::EventT<void ()> exitBuildingEditor;
-      };
-    }
-  }
-}
-#endif
diff --git a/gazebo/gui/building/EditorItem.cc b/gazebo/gui/building/EditorItem.cc
index 785d643..9347921 100644
--- a/gazebo/gui/building/EditorItem.cc
+++ b/gazebo/gui/building/EditorItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/EditorItem.hh b/gazebo/gui/building/EditorItem.hh
index 5e46623..1949ab9 100644
--- a/gazebo/gui/building/EditorItem.hh
+++ b/gazebo/gui/building/EditorItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 
 #include <string>
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class EditorItem EditorItem.hh
     /// \brief Base class of an item in the editor.
-    class EditorItem : public QObject
+    class GAZEBO_VISIBLE EditorItem : public QObject
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/EditorView.cc b/gazebo/gui/building/EditorView.cc
index 508e8a2..9b81c1d 100644
--- a/gazebo/gui/building/EditorView.cc
+++ b/gazebo/gui/building/EditorView.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,7 +28,7 @@
 #include "gazebo/gui/building/WallItem.hh"
 #include "gazebo/gui/building/BuildingMaker.hh"
 #include "gazebo/gui/building/LevelInspectorDialog.hh"
-#include "gazebo/gui/building/EditorEvents.hh"
+#include "gazebo/gui/building/BuildingEditorEvents.hh"
 #include "gazebo/gui/building/EditorView.hh"
 
 using namespace gazebo;
@@ -249,6 +249,7 @@ void EditorView::mouseReleaseEvent(QMouseEvent *_event)
             this->currentMouseItem));
         this->drawMode = NONE;
         this->drawInProgress = false;
+        gui::editor::Events::createBuildingEditorItem(std::string());
       }
       break;
     case DOOR:
@@ -258,6 +259,7 @@ void EditorView::mouseReleaseEvent(QMouseEvent *_event)
             this->currentMouseItem));
         this->drawMode = NONE;
         this->drawInProgress = false;
+        gui::editor::Events::createBuildingEditorItem(std::string());
       }
       break;
     case STAIRS:
@@ -273,6 +275,7 @@ void EditorView::mouseReleaseEvent(QMouseEvent *_event)
         }
         this->drawMode = NONE;
         this->drawInProgress = false;
+        gui::editor::Events::createBuildingEditorItem(std::string());
       }
     default:
       break;
@@ -454,6 +457,7 @@ void EditorView::keyPressEvent(QKeyEvent *_event)
     this->currentMouseItem = NULL;
     this->releaseKeyboard();
     QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor));
+    gui::editor::Events::createBuildingEditorItem(std::string());
   }
   else if (_event->key() == Qt::Key_Escape)
   {
@@ -486,6 +490,7 @@ void EditorView::mouseDoubleClickEvent(QMouseEvent *_event)
     this->drawInProgress = false;
     this->releaseKeyboard();
     QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor));
+    gui::editor::Events::createBuildingEditorItem(std::string());
   }
   else
   {
@@ -721,6 +726,8 @@ void EditorView::OnCreateEditorItem(const std::string &_type)
     this->drawMode = DOOR;
   else if (_type == "stairs")
     this->drawMode = STAIRS;
+  else
+    this->drawMode = NONE;
 
   if (this->drawInProgress && this->currentMouseItem)
   {
@@ -769,6 +776,7 @@ void EditorView::OnDiscardModel()
   this->currentMouseItem = NULL;
   this->drawInProgress = false;
   this->drawMode = NONE;
+  gui::editor::Events::createBuildingEditorItem(std::string());
 }
 
 /////////////////////////////////////////////////
@@ -1043,5 +1051,6 @@ void EditorView::CancelDrawMode()
     this->drawInProgress = false;
     this->currentMouseItem = NULL;
     QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor));
+    gui::editor::Events::createBuildingEditorItem(std::string());
   }
 }
diff --git a/gazebo/gui/building/EditorView.hh b/gazebo/gui/building/EditorView.hh
index 84bc6c9..6e26cdd 100644
--- a/gazebo/gui/building/EditorView.hh
+++ b/gazebo/gui/building/EditorView.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #include <vector>
 #include "gazebo/gui/qt.h"
 #include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -40,7 +41,7 @@ namespace gazebo
 
     /// \class Level EditorView.hh
     /// \brief A convenient structure for storing level information
-    class Level
+    class GAZEBO_VISIBLE Level
     {
       /// \brief Level number
       public: int level;
@@ -57,7 +58,7 @@ namespace gazebo
 
     /// \class EditorView EditorView.hh
     /// \brief Control the editor view and manage contents in the editor scene.
-    class EditorView : public QGraphicsView
+    class GAZEBO_VISIBLE EditorView : public QGraphicsView
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/FinishBuildingDialog.cc b/gazebo/gui/building/FinishBuildingDialog.cc
index a78e3ca..566efc6 100644
--- a/gazebo/gui/building/FinishBuildingDialog.cc
+++ b/gazebo/gui/building/FinishBuildingDialog.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/FinishBuildingDialog.hh b/gazebo/gui/building/FinishBuildingDialog.hh
index b690948..912ade1 100644
--- a/gazebo/gui/building/FinishBuildingDialog.hh
+++ b/gazebo/gui/building/FinishBuildingDialog.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 
 #include <string>
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class FinishBuildingDialog FinishBuildingDialog.hh
     /// \brief Dialog for saving the building model.
-    class FinishBuildingDialog : public QDialog
+    class GAZEBO_VISIBLE FinishBuildingDialog : public QDialog
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/FloorItem.cc b/gazebo/gui/building/FloorItem.cc
index 094d6a1..5f531f5 100644
--- a/gazebo/gui/building/FloorItem.cc
+++ b/gazebo/gui/building/FloorItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -125,7 +125,7 @@ void FloorItem:: NotifyChange()
 /////////////////////////////////////////////////
 void FloorItem::RecalculateBoundingBox()
 {
-  if ((this->walls.size() == 0) || !this->dirty)
+  if ((this->walls.empty()) || !this->dirty)
     return;
 
   WallItem *wallItem = this->walls[0];
diff --git a/gazebo/gui/building/FloorItem.hh b/gazebo/gui/building/FloorItem.hh
index c808fab..c2189e8 100644
--- a/gazebo/gui/building/FloorItem.hh
+++ b/gazebo/gui/building/FloorItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/building/RectItem.hh"
 #include "gazebo/gui/building/BuildingItem.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class FloorItem FloorItem.hh
     /// \brief 2D representation of a floor.
-    class FloorItem : public RectItem, public BuildingItem
+    class GAZEBO_VISIBLE FloorItem : public RectItem, public BuildingItem
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/GrabberHandle.cc b/gazebo/gui/building/GrabberHandle.cc
index 7bed81d..3df6092 100644
--- a/gazebo/gui/building/GrabberHandle.cc
+++ b/gazebo/gui/building/GrabberHandle.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/GrabberHandle.hh b/gazebo/gui/building/GrabberHandle.hh
index 659b074..074f80d 100644
--- a/gazebo/gui/building/GrabberHandle.hh
+++ b/gazebo/gui/building/GrabberHandle.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,12 +19,13 @@
 #define _GRABBER_HANDLE_HH_
 
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace gui
   {
-    class GrabberHandle : public QGraphicsItem
+    class GAZEBO_VISIBLE GrabberHandle : public QGraphicsItem
     {
       /// \brief Constructor
       /// \param[in] _parent Parent graphics item
diff --git a/gazebo/gui/building/GridLines.cc b/gazebo/gui/building/GridLines.cc
index b445e8c..f94925c 100644
--- a/gazebo/gui/building/GridLines.cc
+++ b/gazebo/gui/building/GridLines.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/GridLines.hh b/gazebo/gui/building/GridLines.hh
index 48321b8..27ed60b 100644
--- a/gazebo/gui/building/GridLines.hh
+++ b/gazebo/gui/building/GridLines.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 #define _GRID_LINES_HH_
 
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,7 @@ namespace gazebo
 
     /// \class GridLines GridLines.hh
     /// \brief 2D grid lines.
-    class GridLines : public  QGraphicsItem
+    class GAZEBO_VISIBLE GridLines : public  QGraphicsItem
     {
       /// \brief Constructor
       /// \param[in] _width Width of grid lines in pixels.
diff --git a/gazebo/gui/building/LevelInspectorDialog.cc b/gazebo/gui/building/LevelInspectorDialog.cc
index e6ff784..7d5d298 100644
--- a/gazebo/gui/building/LevelInspectorDialog.cc
+++ b/gazebo/gui/building/LevelInspectorDialog.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/LevelInspectorDialog.hh b/gazebo/gui/building/LevelInspectorDialog.hh
index ebaca3e..be68fe2 100644
--- a/gazebo/gui/building/LevelInspectorDialog.hh
+++ b/gazebo/gui/building/LevelInspectorDialog.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 
 #include <string>
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class LevelInspectorDialog LevelInspectorDialog.hh
     /// \brief Dialog for configuring a building level
-    class LevelInspectorDialog : public QDialog
+    class GAZEBO_VISIBLE LevelInspectorDialog : public QDialog
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/LevelWidget.cc b/gazebo/gui/building/LevelWidget.cc
index 5f2db50..da26acf 100644
--- a/gazebo/gui/building/LevelWidget.cc
+++ b/gazebo/gui/building/LevelWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
 
 #include <sstream>
 #include "gazebo/gui/building/LevelWidget.hh"
-#include "gazebo/gui/building/EditorEvents.hh"
+#include "gazebo/gui/building/BuildingEditorEvents.hh"
 
 using namespace gazebo;
 using namespace gui;
diff --git a/gazebo/gui/building/LevelWidget.hh b/gazebo/gui/building/LevelWidget.hh
index b9e4555..abd1d94 100644
--- a/gazebo/gui/building/LevelWidget.hh
+++ b/gazebo/gui/building/LevelWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include <vector>
 #include "gazebo/gui/qt.h"
 #include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,7 +33,7 @@ namespace gazebo
 
     /// \class GridLines GridLines.hh
     /// \brief A widget for adding and changing building levels.
-    class LevelWidget : public QWidget
+    class GAZEBO_VISIBLE LevelWidget : public QWidget
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/LineSegmentItem.cc b/gazebo/gui/building/LineSegmentItem.cc
index f55ea54..c1d7877 100644
--- a/gazebo/gui/building/LineSegmentItem.cc
+++ b/gazebo/gui/building/LineSegmentItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/LineSegmentItem.hh b/gazebo/gui/building/LineSegmentItem.hh
index c2ea473..4c97bb8 100644
--- a/gazebo/gui/building/LineSegmentItem.hh
+++ b/gazebo/gui/building/LineSegmentItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 #define _LINE_SEGMENT_ITEM_HH_
 
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -31,7 +32,8 @@ namespace gazebo
 
     /// \class LineSegmentItem LineSegmentItem.hh
     /// \brief 2D line segment.
-    class LineSegmentItem : public EditorItem, public QGraphicsLineItem
+    class GAZEBO_VISIBLE LineSegmentItem
+      : public EditorItem, public QGraphicsLineItem
     {
       /// \brief Constructor
       /// \param[in] _parent Parent graphics item.
diff --git a/gazebo/gui/building/PolylineItem.cc b/gazebo/gui/building/PolylineItem.cc
index 00d159f..ed113ab 100644
--- a/gazebo/gui/building/PolylineItem.cc
+++ b/gazebo/gui/building/PolylineItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/PolylineItem.hh b/gazebo/gui/building/PolylineItem.hh
index 4ce970a..8e9861c 100644
--- a/gazebo/gui/building/PolylineItem.hh
+++ b/gazebo/gui/building/PolylineItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 #include <vector>
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/building/EditorItem.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,8 @@ namespace gazebo
 
     /// \class PolylineItem PolylineItem.hh
     /// \brief 2D polyline.
-    class PolylineItem : public EditorItem, public QGraphicsPathItem
+    class GAZEBO_VISIBLE PolylineItem
+      : public EditorItem, public QGraphicsPathItem
     {
       /// \brief Constructor
       /// param[in] _start Start position of the polyline item in pixel
diff --git a/gazebo/gui/building/RectItem.cc b/gazebo/gui/building/RectItem.cc
index 273f302..37d12b9 100644
--- a/gazebo/gui/building/RectItem.cc
+++ b/gazebo/gui/building/RectItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/RectItem.hh b/gazebo/gui/building/RectItem.hh
index a373f93..db7f5ed 100644
--- a/gazebo/gui/building/RectItem.hh
+++ b/gazebo/gui/building/RectItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 #include <vector>
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/building/EditorItem.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class RectItem RectItem.hh
     /// \brief 2D rectangle.
-    class RectItem : public EditorItem, public QGraphicsRectItem
+    class GAZEBO_VISIBLE RectItem : public EditorItem, public QGraphicsRectItem
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/RotateHandle.cc b/gazebo/gui/building/RotateHandle.cc
index 84eb5c5..0621aff 100644
--- a/gazebo/gui/building/RotateHandle.cc
+++ b/gazebo/gui/building/RotateHandle.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/RotateHandle.hh b/gazebo/gui/building/RotateHandle.hh
index 7cd050e..8e40e86 100644
--- a/gazebo/gui/building/RotateHandle.hh
+++ b/gazebo/gui/building/RotateHandle.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 #define _ROTATE_HANDLE_HH_
 
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,7 @@ namespace gazebo
 
     /// \class RotateHandle RotateHandle.hh
     /// \brief Handle for rotating an editor item
-    class RotateHandle : public QGraphicsItem
+    class GAZEBO_VISIBLE RotateHandle : public QGraphicsItem
     {
       /// \brief Constructor
       /// param[in] _parent Parent graphics item.
diff --git a/gazebo/gui/building/ScaleWidget.cc b/gazebo/gui/building/ScaleWidget.cc
index 25b564a..5705a94 100644
--- a/gazebo/gui/building/ScaleWidget.cc
+++ b/gazebo/gui/building/ScaleWidget.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
 */
 
 #include <sstream>
-#include "gazebo/gui/building/EditorEvents.hh"
+#include "gazebo/gui/building/BuildingEditorEvents.hh"
 #include "gazebo/gui/building/ScaleWidget.hh"
 
 using namespace gazebo;
diff --git a/gazebo/gui/building/ScaleWidget.hh b/gazebo/gui/building/ScaleWidget.hh
index edd6172..da41997 100644
--- a/gazebo/gui/building/ScaleWidget.hh
+++ b/gazebo/gui/building/ScaleWidget.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include <vector>
 #include "gazebo/gui/qt.h"
 #include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,7 +33,7 @@ namespace gazebo
 
     /// \class ScaleWidget ScaleWidget.hh
     /// \brief Widget that displays the scale (zoom level) of the editor
-    class ScaleWidget : public QWidget
+    class GAZEBO_VISIBLE ScaleWidget : public QWidget
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/StairsInspectorDialog.cc b/gazebo/gui/building/StairsInspectorDialog.cc
index fa5d07d..662dbc2 100644
--- a/gazebo/gui/building/StairsInspectorDialog.cc
+++ b/gazebo/gui/building/StairsInspectorDialog.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/StairsInspectorDialog.hh b/gazebo/gui/building/StairsInspectorDialog.hh
index 5028a99..f3041be 100644
--- a/gazebo/gui/building/StairsInspectorDialog.hh
+++ b/gazebo/gui/building/StairsInspectorDialog.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 
 #include <string>
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class StairsInspectorDialog StairsInspectorDialog.hh
     /// \brief Dialog for configuring a staircase item.
-    class StairsInspectorDialog : public QDialog
+    class GAZEBO_VISIBLE StairsInspectorDialog : public QDialog
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/StairsItem.cc b/gazebo/gui/building/StairsItem.cc
index 00c5c59..86ceded 100644
--- a/gazebo/gui/building/StairsItem.cc
+++ b/gazebo/gui/building/StairsItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/StairsItem.hh b/gazebo/gui/building/StairsItem.hh
index d6f52b7..cba5f1c 100644
--- a/gazebo/gui/building/StairsItem.hh
+++ b/gazebo/gui/building/StairsItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/building/RectItem.hh"
 #include "gazebo/gui/building/BuildingItem.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class StairsItem StairsItem.hh
     /// \brief 2D representation of a staircase.
-    class StairsItem :  public RectItem, public BuildingItem
+    class GAZEBO_VISIBLE StairsItem :  public RectItem, public BuildingItem
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/WallInspectorDialog.cc b/gazebo/gui/building/WallInspectorDialog.cc
index 1988328..e80eba9 100644
--- a/gazebo/gui/building/WallInspectorDialog.cc
+++ b/gazebo/gui/building/WallInspectorDialog.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/WallInspectorDialog.hh b/gazebo/gui/building/WallInspectorDialog.hh
index 3b15d58..9b6029d 100644
--- a/gazebo/gui/building/WallInspectorDialog.hh
+++ b/gazebo/gui/building/WallInspectorDialog.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 
 #include <string>
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class WallInspectorDialog WallInspectorDialog.hh
     /// \brief Dialog for configuring a wall item.
-    class WallInspectorDialog : public QDialog
+    class GAZEBO_VISIBLE WallInspectorDialog : public QDialog
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/WallItem.cc b/gazebo/gui/building/WallItem.cc
index 5feeaee..b3c2e73 100644
--- a/gazebo/gui/building/WallItem.cc
+++ b/gazebo/gui/building/WallItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/WallItem.hh b/gazebo/gui/building/WallItem.hh
index fae9900..675f790 100644
--- a/gazebo/gui/building/WallItem.hh
+++ b/gazebo/gui/building/WallItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/building/PolylineItem.hh"
 #include "gazebo/gui/building/BuildingItem.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +38,7 @@ namespace gazebo
 
     /// \class WallItem WallItem.hh
     /// \brief 2D representation of a wall.
-    class WallItem : public PolylineItem, public BuildingItem
+    class GAZEBO_VISIBLE WallItem : public PolylineItem, public BuildingItem
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/WindowDoorInspectorDialog.cc b/gazebo/gui/building/WindowDoorInspectorDialog.cc
index 6841e2b..731d8a9 100644
--- a/gazebo/gui/building/WindowDoorInspectorDialog.cc
+++ b/gazebo/gui/building/WindowDoorInspectorDialog.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/WindowDoorInspectorDialog.hh b/gazebo/gui/building/WindowDoorInspectorDialog.hh
index e0ae588..fbc8173 100644
--- a/gazebo/gui/building/WindowDoorInspectorDialog.hh
+++ b/gazebo/gui/building/WindowDoorInspectorDialog.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,12 +20,13 @@
 
 #include <string>
 #include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace gui
   {
-    class WindowDoorInspectorDialog : public QDialog
+    class GAZEBO_VISIBLE WindowDoorInspectorDialog : public QDialog
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/building/WindowItem.cc b/gazebo/gui/building/WindowItem.cc
index 5c14eec..839df7a 100644
--- a/gazebo/gui/building/WindowItem.cc
+++ b/gazebo/gui/building/WindowItem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/building/WindowItem.hh b/gazebo/gui/building/WindowItem.hh
index 322a0dc..2775168 100644
--- a/gazebo/gui/building/WindowItem.hh
+++ b/gazebo/gui/building/WindowItem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/building/RectItem.hh"
 #include "gazebo/gui/building/BuildingItem.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class WindowItem WindowItem.hh
     /// \brief 2D representation of a window.
-    class WindowItem : public RectItem, public BuildingItem
+    class GAZEBO_VISIBLE WindowItem : public RectItem, public BuildingItem
     {
         Q_OBJECT
 
diff --git a/gazebo/gui/gui.hh.in b/gazebo/gui/gui.hh.in
new file mode 100644
index 0000000..30fa218
--- /dev/null
+++ b/gazebo/gui/gui.hh.in
@@ -0,0 +1,7 @@
+#ifndef GAZEBO_GUI_HH_
+#define GAZEBO_GUI_HH_
+
+// Automatically generated
+${gui_headers}
+
+#endif
diff --git a/gazebo/gui/gzclient.1.ronn b/gazebo/gui/gzclient.1.ronn
new file mode 100644
index 0000000..c6513ad
--- /dev/null
+++ b/gazebo/gui/gzclient.1.ronn
@@ -0,0 +1,31 @@
+gzclient -- Gazebo GUI Client
+=============================================
+
+## SYNOPSIS
+
+`gzclient` [options]
+
+## DESCRIPTION
+
+Gazebo GUI client which allows visualization and user interaction.
+
+## OPTIONS
+
+* -v, --version :
+ Output version information.
+* --verbose :
+ Increase the messages written to the terminal.
+* -h, --help :
+ Produce this help message.
+* -g, --gui-plugin arg :
+ Load a plugin.
+
+
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-2014 Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/images/arrow.png b/gazebo/gui/images/arrow.png
index 2e2b5f2..37664e2 100644
Binary files a/gazebo/gui/images/arrow.png and b/gazebo/gui/images/arrow.png differ
diff --git a/gazebo/gui/images/scale.png b/gazebo/gui/images/scale.png
new file mode 100644
index 0000000..9916546
Binary files /dev/null and b/gazebo/gui/images/scale.png differ
diff --git a/gazebo/gui/main.cc b/gazebo/gui/main.cc
index b088376..4d76134 100644
--- a/gazebo/gui/main.cc
+++ b/gazebo/gui/main.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
 */
-#include "gui/Gui.hh"
+#include "gazebo/gui/GuiIface.hh"
 
 //////////////////////////////////////////////////
 int main(int _argc, char **_argv)
diff --git a/gazebo/gui/model/CMakeLists.txt b/gazebo/gui/model/CMakeLists.txt
new file mode 100644
index 0000000..ddf6a8b
--- /dev/null
+++ b/gazebo/gui/model/CMakeLists.txt
@@ -0,0 +1,43 @@
+include (${gazebo_cmake_dir}/GazeboUtils.cmake)
+include (${QT_USE_FILE})
+
+
+set (sources
+  ImportDialog.cc
+  JointInspector.cc
+  JointMaker.cc
+  ModelCreator.cc
+  ModelEditor.cc
+  ModelEditorEvents.cc
+  ModelEditorPalette.cc
+)
+
+set (qt_headers
+  ImportDialog.hh
+  JointInspector.hh
+  JointMaker.hh
+  ModelCreator.hh
+  ModelEditor.hh
+  ModelEditorPalette.hh
+)
+
+set (headers
+  ModelEditorEvents.hh
+)
+
+set (resources ../resources.qrc)
+QT4_WRAP_CPP(headers_MOC ${qt_headers})
+QT4_ADD_RESOURCES(resources_RCC ${resources})
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+gz_add_library(gazebo_gui_model ${sources} ${headers_MOC} ${headers} ${resources_RCC})
+
+target_link_libraries(gazebo_gui_model
+  gazebo_common
+#  gazebo_transport
+#  gazebo_sdf_interface
+  gazebo_rendering
+  gazebo_msgs)
+
+gz_install_library(gazebo_gui_model)
diff --git a/gazebo/gui/model/ImportDialog.cc b/gazebo/gui/model/ImportDialog.cc
new file mode 100644
index 0000000..5d23176
--- /dev/null
+++ b/gazebo/gui/model/ImportDialog.cc
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gui/model/ImportDialog.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+ImportDialog::ImportDialog(QWidget *_parent) : QDialog(_parent)
+{
+  this->setObjectName("ImportDialog");
+  this->setWindowTitle("Custom Part");
+
+  this->messageLabel = new QLabel;
+  this->messageLabel->setText(
+      tr("You can import a 3D mesh that you have \n"
+      "made with a modelling tool such as Blender \n"
+      "Maya, or SolidWorks. It will apear as a \n"
+      "part in the 3D View."));
+
+  this->pathLineEdit = new QLineEdit;
+  this->pathLineEdit->setText(QDir::homePath());
+  QPushButton *browseButton = new QPushButton(tr("Browse"));
+  connect(browseButton, SIGNAL(clicked()), this, SLOT(OnBrowse()));
+
+  QLabel *nameLabel = new QLabel;
+  nameLabel->setText(tr("Part Name:"));
+  this->nameLineEdit = new QLineEdit;
+  this->nameLineEdit->setText(tr("DefaultName"));
+
+  QHBoxLayout *buttonsLayout = new QHBoxLayout;
+  QPushButton *cancelButton = new QPushButton(tr("&Cancel"));
+  connect(cancelButton, SIGNAL(clicked()), this, SLOT(OnCancel()));
+
+  QPushButton *importButton = new QPushButton("&Import");
+  importButton->setDefault(true);
+  connect(importButton, SIGNAL(clicked()), this, SLOT(OnImport()));
+  buttonsLayout->addWidget(cancelButton);
+  buttonsLayout->addWidget(importButton);
+  buttonsLayout->setAlignment(Qt::AlignRight);
+
+  QGridLayout *gridLayout = new QGridLayout;
+  gridLayout->addWidget(this->pathLineEdit, 0, 0);
+  gridLayout->addWidget(browseButton, 0, 1);
+  gridLayout->addWidget(nameLabel, 1, 0);
+  gridLayout->addWidget(nameLineEdit, 1, 1);
+
+  QVBoxLayout *mainLayout = new QVBoxLayout;
+  mainLayout->addWidget(this->messageLabel);
+  mainLayout->addLayout(gridLayout);
+  mainLayout->addLayout(buttonsLayout);
+
+  this->setLayout(mainLayout);
+}
+
+/////////////////////////////////////////////////
+ImportDialog::~ImportDialog()
+{
+}
+
+/////////////////////////////////////////////////
+std::string ImportDialog::GetPartName() const
+{
+  return this->nameLineEdit->text().toStdString();
+}
+
+/////////////////////////////////////////////////
+std::string ImportDialog::GetImportPath() const
+{
+  return this->pathLineEdit->text().toStdString();
+}
+
+/////////////////////////////////////////////////
+void ImportDialog::SetPartName(const std::string &_name)
+{
+  this->nameLineEdit->setText(tr(_name.c_str()));
+}
+
+/////////////////////////////////////////////////
+void ImportDialog::SetImportPath(const std::string &_path)
+{
+  this->pathLineEdit->setText(tr(_path.c_str()));
+}
+
+/////////////////////////////////////////////////
+void ImportDialog::SetTitle(const std::string &_title)
+{
+  this->setWindowTitle(tr(_title.c_str()));
+}
+
+/////////////////////////////////////////////////
+void ImportDialog::OnBrowse()
+{
+  QFileDialog fd(this, tr("Import Part"), QDir::homePath(),
+      tr("Mesh files (*.dae *.stl)"));
+  fd.setFilter(QDir::AllDirs | QDir::Hidden);
+  fd.setFileMode(QFileDialog::ExistingFile);
+  if (fd.exec())
+  {
+    if (!fd.selectedFiles().isEmpty())
+    {
+      QString file = fd.selectedFiles().at(0);
+      if (!file.isEmpty())
+      {
+        this->pathLineEdit->setText(file);
+      }
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void ImportDialog::OnCancel()
+{
+  this->close();
+}
+
+/////////////////////////////////////////////////
+void ImportDialog::OnImport()
+{
+  QFileInfo info(this->pathLineEdit->text());
+  if (info.isFile())
+  {
+    this->accept();
+  }
+  else
+  {
+    std::string msg = this->pathLineEdit->text().toStdString() +
+        " is not a valid mesh file.\nPlease select another file.";
+    QMessageBox::warning(0, QString("Invalid Mesh File"),
+        QString(msg.c_str()), QMessageBox::Ok,
+        QMessageBox::Ok);
+  }
+}
+
+/////////////////////////////////////////////////
+void ImportDialog::showEvent(QShowEvent */*_event*/)
+{
+  this->nameLineEdit->selectAll();
+}
diff --git a/gazebo/gui/model/ImportDialog.hh b/gazebo/gui/model/ImportDialog.hh
new file mode 100644
index 0000000..24477dc
--- /dev/null
+++ b/gazebo/gui/model/ImportDialog.hh
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _MODEL_IMPORT_DIALOG_HH_
+#define _MODEL_IMPORT_DIALOG_HH_
+
+#include <string>
+#include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    /// \addtogroup gazebo_gui
+    /// \{
+
+    /// \class ImportDialog gui/ImportDialog.hh
+    /// \brief Dialog for saving to file.
+    class GAZEBO_VISIBLE ImportDialog : public QDialog
+    {
+      Q_OBJECT
+
+      /// \brief Constructor
+      /// \param[in] _parent Parent QWidget.
+      public: ImportDialog(QWidget *_parent = 0);
+
+      /// \brief Destructor
+      public: ~ImportDialog();
+
+      /// \brief Get name of file.
+      /// \return The name of file.
+      public: std::string GetPartName() const;
+
+      /// \brief Get the import path of the custom part.
+      /// \return Path of the custom location.
+      public: std::string GetImportPath() const;
+
+      /// \brief Set the name of the custom part.
+      /// \param[in] _name Name of file.
+      public: void SetPartName(const std::string &_name);
+
+      /// \brief Set the import path of the custom part.
+      /// \param[in] _path Path to import the custom part.
+      public: void SetImportPath(const std::string &_path);
+
+      /// \brief Set the message to be displayed.
+      /// \param[in] _msg Message to be displayed.
+      public: void SetMessage(const std::string &_msg);
+
+      /// \brief Set the tile of the dialog.
+      /// \param[in] _title Title of dialog.
+      public: void SetTitle(const std::string &_title);
+
+      /// \brief Qt event emitted showing the dialog
+      protected: virtual void showEvent(QShowEvent *event);
+
+      /// \brief Qt callback when the file directory browse button is pressed.
+      private slots: void OnBrowse();
+
+      /// \brief Qt callback when the Cancel button is pressed.
+      private slots: void OnCancel();
+
+      /// \brief Qt callback when the import button is pressed.
+      private slots: void OnImport();
+
+      /// \brief Editable line that holds the name.
+      private: QLineEdit *nameLineEdit;
+
+      /// \brief Editable line that holds the import location.
+      private: QLineEdit *pathLineEdit;
+
+      /// \brief Message displayed in the dialog.
+      private: QLabel *messageLabel;
+    };
+    /// \}
+  }
+}
+
+#endif
diff --git a/gazebo/gui/model/JointInspector.cc b/gazebo/gui/model/JointInspector.cc
new file mode 100644
index 0000000..325cdc0
--- /dev/null
+++ b/gazebo/gui/model/JointInspector.cc
@@ -0,0 +1,331 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Assert.hh"
+
+#include "gazebo/gui/model/JointInspector.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+JointInspector::JointInspector(JointMaker::JointType _jointType,
+  QWidget *_parent) : QDialog(_parent)
+{
+  this->setObjectName("JointInspectorDialog");
+  this->setWindowTitle(tr("Joint Inspector"));
+
+  this->jointType = _jointType;
+
+  QLabel *jointLabel = new QLabel(tr("Name:"));
+  this->jointNameLabel = new QLabel(tr(""));
+
+  QHBoxLayout *nameLayout = new QHBoxLayout;
+  nameLayout->addWidget(jointLabel);
+  nameLayout->addWidget(jointNameLabel);
+
+  QLabel *typeLabel = new QLabel(tr("Type: "));
+  this->jointTypeLabel = new QLabel("");
+  QHBoxLayout *typeLayout = new QHBoxLayout;
+  typeLayout->addWidget(typeLabel);
+  typeLayout->addWidget(this->jointTypeLabel);
+
+  QLabel *anchorXLabel = new QLabel(tr("x: "));
+  QLabel *anchorYLabel = new QLabel(tr("y: "));
+  QLabel *anchorZLabel = new QLabel(tr("z: "));
+
+  this->anchorXSpinBox = new QDoubleSpinBox;
+  this->anchorXSpinBox->setRange(-1000, 1000);
+  this->anchorXSpinBox->setSingleStep(0.01);
+  this->anchorXSpinBox->setDecimals(3);
+  this->anchorXSpinBox->setValue(0.000);
+
+  this->anchorYSpinBox = new QDoubleSpinBox;
+  this->anchorYSpinBox->setRange(-1000, 1000);
+  this->anchorYSpinBox->setSingleStep(0.01);
+  this->anchorYSpinBox->setDecimals(3);
+  this->anchorYSpinBox->setValue(0.000);
+
+  this->anchorZSpinBox = new QDoubleSpinBox;
+  this->anchorZSpinBox->setRange(-1000, 1000);
+  this->anchorZSpinBox->setSingleStep(0.01);
+  this->anchorZSpinBox->setDecimals(3);
+  this->anchorZSpinBox->setValue(0.000);
+
+  QGridLayout *anchorLayout = new QGridLayout;
+  anchorLayout->addWidget(anchorXLabel, 0, 0);
+  anchorLayout->addWidget(anchorXSpinBox, 0, 1);
+  anchorLayout->addWidget(anchorYLabel), 1, 0;
+  anchorLayout->addWidget(anchorYSpinBox, 1, 1);
+  anchorLayout->addWidget(anchorZLabel), 2, 0;
+  anchorLayout->addWidget(anchorZSpinBox, 2, 1);
+
+  QGroupBox *anchorGroupBox = new QGroupBox(tr("Anchor"));
+  anchorGroupBox->setLayout(anchorLayout);
+
+  int axisCount = 2;
+  for (int i = 0; i < axisCount; ++i)
+  {
+    QLabel *axisXLabel = new QLabel(tr("x: "));
+    QLabel *axisYLabel = new QLabel(tr("y: "));
+    QLabel *axisZLabel = new QLabel(tr("z: "));
+
+    QDoubleSpinBox *axisXSpinBox = new QDoubleSpinBox;
+    axisXSpinBox->setRange(-1000, 1000);
+    axisXSpinBox->setSingleStep(0.01);
+    axisXSpinBox->setDecimals(3);
+    axisXSpinBox->setValue(0.000);
+    this->axisXSpinBoxes.push_back(axisXSpinBox);
+
+    QDoubleSpinBox *axisYSpinBox = new QDoubleSpinBox;
+    axisYSpinBox->setRange(-1000, 1000);
+    axisYSpinBox->setSingleStep(0.01);
+    axisYSpinBox->setDecimals(3);
+    axisYSpinBox->setValue(0.000);
+    this->axisYSpinBoxes.push_back(axisYSpinBox);
+
+    QDoubleSpinBox *axisZSpinBox = new QDoubleSpinBox;
+    axisZSpinBox->setRange(-1000, 1000);
+    axisZSpinBox->setSingleStep(0.01);
+    axisZSpinBox->setDecimals(3);
+    axisZSpinBox->setValue(0.000);
+    this->axisZSpinBoxes.push_back(axisZSpinBox);
+
+    QGridLayout *axisLayout = new QGridLayout;
+    axisLayout->addWidget(axisXLabel, 0, 0);
+    axisLayout->addWidget(axisXSpinBox, 0, 1);
+    axisLayout->addWidget(axisYLabel), 1, 0;
+    axisLayout->addWidget(axisYSpinBox, 1, 1);
+    axisLayout->addWidget(axisZLabel), 2, 0;
+    axisLayout->addWidget(axisZSpinBox, 2, 1);
+
+    QLabel *lowerLimitLabel = new QLabel(tr("Lower: "));
+    QLabel *upperLimitLabel = new QLabel(tr("Upper: "));
+
+    QDoubleSpinBox *lowerLimitSpinBox = new QDoubleSpinBox;
+    lowerLimitSpinBox->setRange(-1000, 1000);
+    lowerLimitSpinBox->setSingleStep(0.01);
+    lowerLimitSpinBox->setDecimals(3);
+    lowerLimitSpinBox->setValue(-1e16);
+    this->lowerLimitSpinBoxes.push_back(lowerLimitSpinBox);
+
+    QDoubleSpinBox *upperLimitSpinBox = new QDoubleSpinBox;
+    upperLimitSpinBox->setRange(-1000, 1000);
+    upperLimitSpinBox->setSingleStep(0.01);
+    upperLimitSpinBox->setDecimals(3);
+    upperLimitSpinBox->setValue(1e16);
+    this->upperLimitSpinBoxes.push_back(upperLimitSpinBox);
+
+
+    QGridLayout *limitLayout = new QGridLayout;
+    limitLayout->addWidget(lowerLimitLabel, 0, 0);
+    limitLayout->addWidget(lowerLimitSpinBox, 0, 1);
+    limitLayout->addWidget(upperLimitLabel), 1, 0;
+    limitLayout->addWidget(upperLimitSpinBox, 1, 1);
+
+    QGroupBox *limitGroupBox = new QGroupBox(tr("Limit"));
+    limitGroupBox->setLayout(limitLayout);
+
+    QVBoxLayout *axisAllLayout = new QVBoxLayout;
+    axisAllLayout->addLayout(axisLayout);
+    axisAllLayout->addWidget(limitGroupBox);
+
+    std::stringstream ss;
+    ss << "Axis" << (i+1);
+    QGroupBox *axisGroupBox = new QGroupBox(tr(ss.str().c_str()));
+    axisGroupBox->setLayout(axisAllLayout);
+    this->axisGroupBoxes.push_back(axisGroupBox);
+  }
+
+  QHBoxLayout *buttonsLayout = new QHBoxLayout;
+  QPushButton *cancelButton = new QPushButton(tr("&Cancel"));
+  connect(cancelButton, SIGNAL(clicked()), this, SLOT(OnCancel()));
+  QPushButton *applyButton = new QPushButton(tr("&Apply"));
+  connect(applyButton, SIGNAL(clicked()), this, SLOT(OnApply()));
+  QPushButton *OKButton = new QPushButton(tr("&OK"));
+  OKButton->setDefault(true);
+  connect(OKButton, SIGNAL(clicked()), this, SLOT(OnOK()));
+  buttonsLayout->addWidget(cancelButton);
+  buttonsLayout->addWidget(applyButton);
+  buttonsLayout->addWidget(OKButton);
+  buttonsLayout->setAlignment(Qt::AlignRight);
+
+  QVBoxLayout *mainLayout = new QVBoxLayout;
+  mainLayout->addLayout(nameLayout);
+  mainLayout->addLayout(typeLayout);
+  mainLayout->addWidget(anchorGroupBox);
+  for (unsigned int i = 0; i < axisGroupBoxes.size(); ++i)
+  {
+    mainLayout->addWidget(this->axisGroupBoxes[i]);
+    this->axisGroupBoxes[i]->setVisible(false);
+  }
+  mainLayout->addLayout(buttonsLayout);
+  this->setLayout(mainLayout);
+
+  if (this->jointType)
+    this->SetType(this->jointType);
+}
+
+/////////////////////////////////////////////////
+JointInspector::~JointInspector()
+{
+}
+
+/////////////////////////////////////////////////
+math::Vector3 JointInspector::GetAnchor(unsigned int /*_index*/) const
+{
+  return math::Vector3(this->anchorXSpinBox->value(),
+      this->anchorYSpinBox->value(), this->anchorZSpinBox->value());
+}
+
+/////////////////////////////////////////////////
+math::Vector3 JointInspector::GetAxis(unsigned int _index) const
+{
+  if (_index > this->axisXSpinBoxes.size())
+  {
+    gzerr << "Axis index is out of range" << std::endl;
+    return math::Vector3::Zero;
+  }
+
+  return math::Vector3(this->axisXSpinBoxes[_index]->value(),
+      this->axisYSpinBoxes[_index]->value(),
+      this->axisZSpinBoxes[_index]->value());
+}
+
+/////////////////////////////////////////////////
+double JointInspector::GetLowerLimit(unsigned int _index) const
+{
+  if (_index > this->lowerLimitSpinBoxes.size())
+  {
+    gzerr << "Axis index is out of range" << std::endl;
+    return 0;
+  }
+
+  return this->lowerLimitSpinBoxes[_index]->value();
+}
+
+/////////////////////////////////////////////////
+double JointInspector::GetUpperLimit(unsigned int _index) const
+{
+  if (_index > this->upperLimitSpinBoxes.size())
+  {
+    gzerr << "Axis index is out of range" << std::endl;
+    return 0;
+  }
+
+  return this->upperLimitSpinBoxes[_index]->value();
+}
+
+/////////////////////////////////////////////////
+JointMaker::JointType JointInspector::GetType() const
+{
+  return this->jointType;
+}
+
+/////////////////////////////////////////////////
+void JointInspector::SetType(JointMaker::JointType _type)
+{
+  this->jointType =  _type;
+
+  std::string jointTypeStr = JointMaker::GetTypeAsString(_type);
+  int axisCount = JointMaker::GetJointAxisCount(_type);
+  GZ_ASSERT(axisCount >= 0, "Invalid axis count");
+
+  this->jointTypeLabel->setText(tr(jointTypeStr.c_str()));
+
+  for (int i = 0; i < axisCount; ++i)
+    this->axisGroupBoxes[i]->setVisible(true);
+
+  for (int i = axisCount;
+      i < static_cast<int>(this->axisGroupBoxes.size()); ++i)
+  {
+    this->axisGroupBoxes[i]->setVisible(false);
+  }
+}
+
+/////////////////////////////////////////////////
+void JointInspector::SetName(const std::string &_name)
+{
+  this->jointNameLabel->setText(tr(_name.c_str()));
+}
+
+/////////////////////////////////////////////////
+void JointInspector::SetAnchor(unsigned int /*_index*/,
+    const math::Vector3 &_anchor)
+{
+  this->anchorXSpinBox->setValue(_anchor.x);
+  this->anchorYSpinBox->setValue(_anchor.y);
+  this->anchorZSpinBox->setValue(_anchor.z);
+}
+
+/////////////////////////////////////////////////
+void JointInspector::SetAxis(unsigned int _index, const math::Vector3 &_axis)
+{
+  if (_index > this->axisXSpinBoxes.size())
+  {
+    gzerr << "Axis index is out of range" << std::endl;
+    return;
+  }
+
+  this->axisXSpinBoxes[_index]->setValue(_axis.x);
+  this->axisYSpinBoxes[_index]->setValue(_axis.y);
+  this->axisZSpinBoxes[_index]->setValue(_axis.z);
+}
+
+/////////////////////////////////////////////////
+void JointInspector::SetLowerLimit(unsigned int _index, double _lower)
+{
+  if (_index > this->lowerLimitSpinBoxes.size())
+  {
+    gzerr << "Axis index is out of range" << std::endl;
+    return;
+  }
+
+  this->lowerLimitSpinBoxes[_index]->setValue(_lower);
+}
+
+/////////////////////////////////////////////////
+void JointInspector::SetUpperLimit(unsigned int _index, double _upper)
+{
+  if (_index > this->upperLimitSpinBoxes.size())
+  {
+    gzerr << "Axis index is out of range" << std::endl;
+    return;
+  }
+
+  this->upperLimitSpinBoxes[_index]->setValue(_upper);
+}
+
+/////////////////////////////////////////////////
+void JointInspector::OnCancel()
+{
+  this->close();
+}
+
+/////////////////////////////////////////////////
+void JointInspector::OnApply()
+{
+  emit Applied();
+}
+
+/////////////////////////////////////////////////
+void JointInspector::OnOK()
+{
+  emit Applied();
+  this->accept();
+}
diff --git a/gazebo/gui/model/JointInspector.hh b/gazebo/gui/model/JointInspector.hh
new file mode 100644
index 0000000..5fb2c1f
--- /dev/null
+++ b/gazebo/gui/model/JointInspector.hh
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _JOINT_INSPECTOR_HH_
+#define _JOINT_INSPECTOR_HH_
+
+#include <string>
+#include <vector>
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/gui/model/JointMaker.hh"
+#include "gazebo/util/system.hh"
+
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class JointMaker;
+
+    /// \class JointInspector gui/JointInspector.hh
+    /// \brief A class to inspect and modify joints.
+    class GAZEBO_VISIBLE JointInspector : public QDialog
+    {
+      Q_OBJECT
+
+      /// \brief Constructor
+      /// \param[in] _mode Dialog mode
+      /// \param[in] _parent Parent QWidget.
+      public: JointInspector(JointMaker::JointType _jointType,
+          QWidget *_parent = 0);
+
+      /// \brief Destructor
+      public: ~JointInspector();
+
+      /// \brief Get anchor position.
+      /// \param[in] _index Index of anchor
+      /// \return Anchor position.
+      public: math::Vector3 GetAnchor(unsigned int _index) const;
+
+      /// \brief Get axis.
+      /// \param[in] _index Index of axis
+      /// \return Axis direction.
+      public: math::Vector3 GetAxis(unsigned int _index) const;
+
+      /// \brief Get axis lower limit.
+      /// \param[in] _index Index of axis
+      /// \return Lower limit.
+      public: double GetLowerLimit(unsigned int _index) const;
+
+      /// \brief Get axis upper limit.
+      /// \param[in] _index Index of axis
+      /// \return Upper limit.
+      public: double GetUpperLimit(unsigned int _index) const;
+
+      /// \brief Get joint type.
+      /// \return Joint type.
+      public: JointMaker::JointType GetType() const;
+
+      /// \brief Set the item name.
+      /// \param[in] _name Name to set to.
+      public: void SetName(const std::string &_name);
+
+      /// \brief Set anchor position.
+      /// \param[in] _index Index of anchor.
+      /// \param[in] _anchor Anchor position.
+      public: void SetAnchor(unsigned int _index, const math::Vector3 &_anchor);
+
+      /// \brief Set axis.
+      /// \param[in] _index Index of axis.
+      /// \param[in] _axis Axis direction.
+      public: void SetAxis(unsigned int _index, const math::Vector3 &_axis);
+
+      /// \brief Set axis lower limit.
+      /// \param[in] _index Index of axis.
+      /// \param[in] _lower Lower limit.
+      public: void SetLowerLimit(unsigned int _index, double _lower);
+
+      /// \brief Set axis upper limit.
+      /// \param[in] _index Index of axis.
+      /// \param[in] _upper Upper limit.
+      public: void SetUpperLimit(unsigned int _index, double _upper);
+
+      /// \brief Set joint type.
+      /// \param[in] _type joint type.
+      public: void SetType(JointMaker::JointType _type);
+
+      /// \brief Qt signal emitted to indicate that changes should be applied.
+      Q_SIGNALS: void Applied();
+
+      /// \brief Qt callback when the Cancel button is pressed.
+      private slots: void OnCancel();
+
+      /// \brief Qt callback when the Apply button is pressed.
+      private slots: void OnApply();
+
+      /// \brief Qt callback when the Ok button is pressed.
+      private slots: void OnOK();
+
+      /// \brief Label that displays the name of the joint.
+      private: QLabel* jointNameLabel;
+
+      /// \brief Label that displays the type of the joint.
+      private: QLabel *jointTypeLabel;
+
+      /// \brief Spin box for configuring the X position of the anchor.
+      private: QDoubleSpinBox *anchorXSpinBox;
+
+      /// \brief Spin box for configuring the Y position of the anchor.
+      private: QDoubleSpinBox *anchorYSpinBox;
+
+      /// \brief Spin box for configuring the Z position of the anchor.
+      private: QDoubleSpinBox *anchorZSpinBox;
+
+      /// \brief Spin box for configuring the X direction of the axis.
+      private: std::vector<QDoubleSpinBox *> axisXSpinBoxes;
+
+      /// \brief Spin box for configuring the Y direction of the axis.
+      private: std::vector<QDoubleSpinBox *> axisYSpinBoxes;
+
+      /// \brief Spin box for configuring the Z direction of the axis.
+      private: std::vector<QDoubleSpinBox *> axisZSpinBoxes;
+
+      /// \brief Spin box for configuring the lower limit of the axis.
+      private: std::vector<QDoubleSpinBox *> lowerLimitSpinBoxes;
+
+      /// \brief Spin box for configuring the upper limit of the axis.
+      private: std::vector<QDoubleSpinBox *> upperLimitSpinBoxes;
+
+      /// \brief Type of joint.
+      private: JointMaker::JointType jointType;
+
+      /// \brief A list of group boxes for configuring joint axis properties.
+      private: std::vector<QGroupBox *> axisGroupBoxes;
+    };
+    /// \}
+  }
+}
+
+#endif
diff --git a/gazebo/gui/model/JointMaker.cc b/gazebo/gui/model/JointMaker.cc
new file mode 100644
index 0000000..9517223
--- /dev/null
+++ b/gazebo/gui/model/JointMaker.cc
@@ -0,0 +1,622 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/MouseEvent.hh"
+
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/Scene.hh"
+
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/MouseEventHandler.hh"
+#include "gazebo/gui/GuiEvents.hh"
+
+#include "gazebo/gui/model/JointInspector.hh"
+#include "gazebo/gui/model/JointMaker.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+JointMaker::JointMaker()
+{
+  this->newJointCreated = false;
+  this->mouseJoint = NULL;
+  this->modelSDF.reset();
+  this->jointCounter = 0;
+
+  this->jointMaterials[JOINT_FIXED] = "Gazebo/Red";
+  this->jointMaterials[JOINT_HINGE] = "Gazebo/Orange";
+  this->jointMaterials[JOINT_HINGE2] = "Gazebo/Yellow";
+  this->jointMaterials[JOINT_SLIDER] = "Gazebo/Green";
+  this->jointMaterials[JOINT_SCREW] = "Gazebo/Black";
+  this->jointMaterials[JOINT_UNIVERSAL] = "Gazebo/Blue";
+  this->jointMaterials[JOINT_BALL] = "Gazebo/Purple";
+
+  MouseEventHandler::Instance()->AddDoubleClickFilter("model_joint",
+    boost::bind(&JointMaker::OnMouseDoubleClick, this, _1));
+
+  this->connections.push_back(
+      event::Events::ConnectPreRender(
+        boost::bind(&JointMaker::Update, this)));
+
+
+  this->inspectAct = new QAction(tr("Open Joint Inspector"), this);
+  connect(this->inspectAct, SIGNAL(triggered()), this,
+      SLOT(OnOpenInspector()));
+}
+
+/////////////////////////////////////////////////
+JointMaker::~JointMaker()
+{
+  MouseEventHandler::Instance()->RemoveDoubleClickFilter("model_joint");
+  this->Reset();
+}
+
+/////////////////////////////////////////////////
+void JointMaker::Reset()
+{
+  if (!gui::get_active_camera() || !gui::get_active_camera()->GetScene())
+    return;
+
+  this->newJointCreated = false;
+  if (mouseJoint)
+  {
+    delete mouseJoint;
+    mouseJoint = NULL;
+  }
+
+  this->jointType = JointMaker::JOINT_NONE;
+  this->selectedVis.reset();
+  this->hoverVis.reset();
+  this->prevHoverVis.reset();
+  this->inspectVis.reset();
+
+  while (this->joints.size() > 0)
+    this->RemoveJoint(this->joints.begin()->first);
+  this->joints.clear();
+}
+
+/////////////////////////////////////////////////
+void JointMaker::RemoveJoint(const std::string &_jointName)
+{
+  if (this->joints.find(_jointName) != this->joints.end())
+  {
+    JointData *joint = this->joints[_jointName];
+    rendering::ScenePtr scene = joint->hotspot->GetScene();
+    scene->RemoveVisual(joint->hotspot);
+    scene->RemoveVisual(joint->visual);
+    joint->hotspot.reset();
+    joint->visual.reset();
+    joint->parent.reset();
+    joint->child.reset();
+    delete joint->line;
+    delete joint->inspector;
+    this->joints.erase(_jointName);
+  }
+}
+
+/////////////////////////////////////////////////
+void JointMaker::RemoveJointsByPart(const std::string &_partName)
+{
+  std::vector<std::string> toDelete;
+  boost::unordered_map<std::string, JointData *>::iterator it;
+  for (it = this->joints.begin(); it != this->joints.end(); ++it)
+  {
+    JointData *joint = it->second;
+    if (joint->child->GetName() == _partName ||
+        joint->parent->GetName() == _partName)
+    {
+      toDelete.push_back(it->first);
+    }
+  }
+
+  for (unsigned i = 0; i < toDelete.size(); ++i)
+    this->RemoveJoint(toDelete[i]);
+
+  toDelete.clear();
+}
+
+
+/////////////////////////////////////////////////
+bool JointMaker::OnMousePress(const common::MouseEvent &_event)
+{
+  if (_event.button != common::MouseEvent::LEFT)
+    return false;
+
+  if (this->jointType != JointMaker::JOINT_NONE)
+    return false;
+
+  // intercept mouse press events when user clicks on the joint hotspot visual
+  rendering::UserCameraPtr camera = gui::get_active_camera();
+  rendering::ScenePtr scene = camera->GetScene();
+  rendering::VisualPtr vis = camera->GetVisual(_event.pos);
+  if (vis)
+  {
+    if (this->joints.find(vis->GetName()) != this->joints.end())
+    {
+      // stop event propagation as we don't want users to manipulate the
+      // hotspot for now.
+      return true;
+    }
+    return false;
+  }
+
+  return false;
+}
+
+/////////////////////////////////////////////////
+bool JointMaker::OnMouseRelease(const common::MouseEvent &_event)
+{
+  // Get the active camera and scene.
+  rendering::UserCameraPtr camera = gui::get_active_camera();
+  rendering::ScenePtr scene = camera->GetScene();
+  rendering::VisualPtr vis = camera->GetVisual(_event.pos);
+
+  if (_event.button == common::MouseEvent::RIGHT)
+  {
+    if (vis)
+    {
+      if (this->joints.find(vis->GetName()) != this->joints.end())
+      {
+        this->inspectVis = vis;
+        QMenu menu;
+        menu.addAction(this->inspectAct);
+        menu.exec(QCursor::pos());
+        return true;
+      }
+    }
+  }
+
+  if (_event.button != common::MouseEvent::LEFT)
+    return false;
+
+  if (this->hoverVis)
+  {
+    if (this->hoverVis->IsPlane())
+      return false;
+
+    // Pressed parent part
+    if (!this->selectedVis)
+    {
+      if (this->mouseJoint)
+        return false;
+
+      this->hoverVis->SetEmissive(common::Color(0, 0, 0));
+      this->selectedVis = this->hoverVis;
+      this->hoverVis.reset();
+
+      std::stringstream ss;
+      ss << this->selectedVis->GetName() << "_JOINT_" << this->jointCounter++;
+      rendering::VisualPtr jointVis(
+          new rendering::Visual(ss.str(), this->selectedVis));
+      jointVis->Load();
+      rendering::DynamicLines *jointLine =
+          jointVis->CreateDynamicLine(rendering::RENDERING_LINE_LIST);
+      jointLine->AddPoint(math::Vector3(0, 0, 0));
+      jointLine->AddPoint(math::Vector3(0, 0, 0.01));
+      jointVis->GetSceneNode()->setInheritScale(false);
+      jointVis->GetSceneNode()->setInheritOrientation(false);
+
+      JointData *jointData = new JointData;
+      jointData->dirty = false;
+      jointData->visual = jointVis;
+      jointData->parent = this->selectedVis;
+      jointData->line = jointLine;
+      jointData->type = this->jointType;
+      jointData->inspector = new JointInspector(JointMaker::JOINT_NONE);
+      jointData->inspector->setModal(false);
+      connect(jointData->inspector, SIGNAL(Applied()),
+          jointData, SLOT(OnApply()));
+
+      int axisCount = JointMaker::GetJointAxisCount(jointData->type);
+      for (int i = 0; i < axisCount; ++i)
+      {
+        jointData->axis[i] = math::Vector3::UnitX;
+        jointData->lowerLimit[i] = -1e16;
+        jointData->upperLimit[i] = 1e16;
+      }
+      jointData->anchor = math::Vector3::Zero;
+      this->mouseJoint = jointData;
+      jointData->line->setMaterial(this->jointMaterials[jointData->type]);
+    }
+    // Pressed child part
+    else if (this->selectedVis != this->hoverVis)
+    {
+      if (this->hoverVis)
+        this->hoverVis->SetEmissive(common::Color(0, 0, 0));
+      if (this->selectedVis)
+        this->selectedVis->SetEmissive(common::Color(0, 0, 0));
+      this->mouseJoint->child = this->hoverVis;
+
+      // reset variables.
+      this->selectedVis.reset();
+      this->hoverVis.reset();
+      this->CreateJoint(JointMaker::JOINT_NONE);
+
+      this->newJointCreated = true;
+      emit JointAdded();
+    }
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+void JointMaker::CreateJoint(JointMaker::JointType _type)
+{
+  this->jointType = _type;
+  if (_type != JointMaker::JOINT_NONE)
+  {
+    // Add an event filter, which allows the JointMaker to capture mouse events.
+    MouseEventHandler::Instance()->AddReleaseFilter("model_joint",
+        boost::bind(&JointMaker::OnMouseRelease, this, _1));
+    MouseEventHandler::Instance()->AddMoveFilter("model_joint",
+        boost::bind(&JointMaker::OnMouseMove, this, _1));
+  }
+  else
+  {
+    // Remove the event filters.
+    MouseEventHandler::Instance()->RemoveMoveFilter("model_joint");
+
+    // Press event added only after a joint is created. Needs to be added here
+    // instead of in the constructor otherwise GLWidget would get the event
+    // first and JoinMaker would not receive it.
+    MouseEventHandler::Instance()->AddPressFilter("model_joint",
+        boost::bind(&JointMaker::OnMousePress, this, _1));
+
+    MouseEventHandler::Instance()->AddDoubleClickFilter("model_joint",
+      boost::bind(&JointMaker::OnMouseDoubleClick, this, _1));
+  }
+}
+
+/////////////////////////////////////////////////
+void JointMaker::Stop()
+{
+  if (this->jointType != JointMaker::JOINT_NONE)
+  {
+    this->newJointCreated = false;
+    if (this->mouseJoint)
+    {
+      this->mouseJoint->visual->DeleteDynamicLine(this->mouseJoint->line);
+      rendering::ScenePtr scene = this->mouseJoint->visual->GetScene();
+      scene->RemoveVisual(this->mouseJoint->visual);
+      this->mouseJoint->visual.reset();
+      delete this->mouseJoint->inspector;
+      delete this->mouseJoint;
+      this->mouseJoint = NULL;
+    }
+    this->CreateJoint(JointMaker::JOINT_NONE);
+    if (this->hoverVis)
+      this->hoverVis->SetEmissive(common::Color(0, 0, 0));
+    if (this->selectedVis)
+      this->selectedVis->SetEmissive(common::Color(0, 0, 0));
+    this->selectedVis.reset();
+    this->hoverVis.reset();
+  }
+}
+
+/////////////////////////////////////////////////
+bool JointMaker::OnMouseMove(const common::MouseEvent &_event)
+{
+  if (_event.dragging)
+    return false;
+
+  // Get the active camera and scene.
+  rendering::UserCameraPtr camera = gui::get_active_camera();
+  rendering::ScenePtr scene = camera->GetScene();
+
+  rendering::VisualPtr vis = camera->GetVisual(_event.pos);
+
+  // Highlight visual on hover
+  if (vis)
+  {
+    if (this->hoverVis && this->hoverVis != this->selectedVis)
+      this->hoverVis->SetEmissive(common::Color(0.0, 0.0, 0.0));
+
+    // only highlight editor parts
+    rendering::VisualPtr rootVis = vis->GetRootVisual();
+    if (rootVis->IsPlane())
+      this->hoverVis = vis;
+    else if (!gui::get_entity_id(rootVis->GetName()))
+    {
+      this->hoverVis = vis;
+      if (!this->selectedVis ||
+           (this->selectedVis && this->hoverVis != this->selectedVis))
+        this->hoverVis->SetEmissive(common::Color(0.5, 0.5, 0.5));
+    }
+  }
+
+  // Case when a parent part is already selected and currently
+  // extending the joint line to a child part
+  if (this->selectedVis && this->hoverVis
+      && this->mouseJoint && this->mouseJoint->line)
+  {
+    math::Vector3 parentPos;
+    // Set end point to center of child part
+    if (!this->hoverVis->IsPlane())
+    {
+      if (this->mouseJoint->parent)
+        parentPos = this->mouseJoint->parent->GetWorldPose().pos;
+      this->mouseJoint->line->SetPoint(1,
+          this->hoverVis->GetWorldPose().pos - parentPos);
+    }
+    else
+    {
+      // Set end point to mouse plane intersection
+      math::Vector3 pt;
+      camera->GetWorldPointOnPlane(_event.pos.x, _event.pos.y,
+          math::Plane(math::Vector3(0, 0, 1)), pt);
+      if (this->mouseJoint->parent)
+        parentPos = this->mouseJoint->parent->GetWorldPose().pos;
+      this->mouseJoint->line->SetPoint(1,
+          this->hoverVis->GetWorldPose().pos - parentPos + pt);
+    }
+  }
+  return true;
+}
+
+/////////////////////////////////////////////////
+void JointMaker::OnOpenInspector()
+{
+  this->OpenInspector(this->inspectVis->GetName());
+  this->inspectVis.reset();
+}
+
+/////////////////////////////////////////////////
+void JointMaker::OpenInspector(const std::string &_name)
+{
+  JointData *joint = this->joints[_name];
+  joint->inspector->SetType(joint->type);
+  joint->inspector->SetName(joint->visual->GetName());
+  joint->inspector->SetAnchor(0, joint->anchor);
+  int axisCount = JointMaker::GetJointAxisCount(joint->type);
+  for (int i = 0; i < axisCount; ++i)
+  {
+    joint->inspector->SetAxis(i, joint->axis[i]);
+    joint->inspector->SetAxis(i, joint->axis[i]);
+    joint->inspector->SetLowerLimit(i, joint->lowerLimit[i]);
+    joint->inspector->SetUpperLimit(i, joint->upperLimit[i]);
+  }
+  joint->inspector->show();
+}
+
+/////////////////////////////////////////////////
+bool JointMaker::OnMouseDoubleClick(const common::MouseEvent &_event)
+{
+  rendering::UserCameraPtr camera = gui::get_active_camera();
+  rendering::VisualPtr vis = camera->GetVisual(_event.pos);
+
+  if (vis)
+  {
+    if (this->joints.find(vis->GetName()) != this->joints.end())
+    {
+      this->OpenInspector(vis->GetName());
+      return true;
+    }
+  }
+
+  return false;
+}
+
+/////////////////////////////////////////////////
+void JointMaker::CreateHotSpot()
+{
+  if (!this->mouseJoint)
+    return;
+
+  JointData *joint = this->mouseJoint;
+
+  rendering::UserCameraPtr camera = gui::get_active_camera();
+
+  std::string hotSpotName = joint->visual->GetName() + "_HOTSPOT_";
+  rendering::VisualPtr hotspotVisual(
+      new rendering::Visual(hotSpotName, joint->visual, false));
+
+  joint->hotspot = hotspotVisual;
+
+  hotspotVisual->InsertMesh("unit_sphere");
+
+  Ogre::MovableObject *hotspotObj =
+      (Ogre::MovableObject*)(camera->GetScene()->GetManager()->createEntity(
+      "__HOTSPOT__" + joint->visual->GetName(), "unit_sphere"));
+  hotspotObj->setUserAny(Ogre::Any(hotSpotName));
+
+  hotspotVisual->GetSceneNode()->attachObject(hotspotObj);
+  hotspotVisual->SetMaterial("Gazebo/RedTransparent");
+  hotspotVisual->SetScale(math::Vector3(0.1, 0.1, 0.1));
+
+  hotspotVisual->SetVisibilityFlags(GZ_VISIBILITY_GUI |
+      GZ_VISIBILITY_SELECTABLE);
+  hotspotVisual->GetSceneNode()->setInheritScale(false);
+
+  this->joints[hotSpotName] = joint;
+  camera->GetScene()->AddVisual(hotspotVisual);
+  joint->dirty = true;
+}
+
+/////////////////////////////////////////////////
+void JointMaker::Update()
+{
+  if (this->newJointCreated)
+  {
+    this->CreateHotSpot();
+    this->mouseJoint = NULL;
+    this->newJointCreated = false;
+  }
+
+  // update joint line and hotspot position.
+  boost::unordered_map<std::string, JointData *>::iterator it;
+  for (it = this->joints.begin(); it != this->joints.end(); ++it)
+  {
+    JointData *joint = it->second;
+    if (joint->dirty)
+    {
+      if (joint->child && joint->parent)
+      {
+        joint->line->SetPoint(1,
+            joint->child->GetWorldPose().pos -
+            joint->parent->GetWorldPose().pos);
+
+        joint->hotspot->SetWorldPosition(
+          joint->parent->GetWorldPose().pos +
+          (joint->child->GetWorldPose().pos -
+          joint->parent->GetWorldPose().pos)/2.0);
+      }
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void JointMaker::GenerateSDF()
+{
+  this->modelSDF.reset(new sdf::Element);
+  sdf::initFile("model.sdf", this->modelSDF);
+  this->modelSDF->ClearElements();
+
+  boost::unordered_map<std::string, JointData *>::iterator jointsIt;
+  // loop through all parts
+  for (jointsIt = this->joints.begin(); jointsIt != this->joints.end();
+      ++jointsIt)
+  {
+    JointData *joint = jointsIt->second;
+    sdf::ElementPtr jointElem = this->modelSDF->AddElement("joint");
+
+    jointElem->GetAttribute("name")->Set(joint->visual->GetName());
+    jointElem->GetAttribute("type")->Set(GetTypeAsString(joint->type));
+    sdf::ElementPtr parentElem = jointElem->GetElement("parent");
+    parentElem->Set(joint->parent->GetParent()->GetName());
+    sdf::ElementPtr childElem = jointElem->GetElement("child");
+    childElem->Set(joint->child->GetParent()->GetName());
+    sdf::ElementPtr poseElem = jointElem->GetElement("pose");
+    poseElem->Set(math::Pose(joint->anchor, math::Vector3::Zero));
+    int axisCount = GetJointAxisCount(joint->type);
+    for (int i = 0; i < axisCount; ++i)
+    {
+      std::stringstream ss;
+      ss << "axis";
+      if (i > 0)
+        ss << (i+1);
+      sdf::ElementPtr axisElem = jointElem->GetElement(ss.str());
+      axisElem->GetElement("xyz")->Set(joint->axis[i]);
+
+      sdf::ElementPtr limitElem = axisElem->GetElement("limit");
+      limitElem->GetElement("lower")->Set(joint->lowerLimit[i]);
+      limitElem->GetElement("upper")->Set(joint->upperLimit[i]);
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+sdf::ElementPtr JointMaker::GetSDF() const
+{
+  return this->modelSDF;
+}
+
+/////////////////////////////////////////////////
+std::string JointMaker::GetTypeAsString(JointMaker::JointType _type)
+{
+  std::string jointTypeStr = "";
+
+  if (_type == JointMaker::JOINT_FIXED)
+  {
+    jointTypeStr = "fixed";
+  }
+  else if (_type == JointMaker::JOINT_SLIDER)
+  {
+    jointTypeStr = "prismatic";
+  }
+  else if (_type == JointMaker::JOINT_HINGE)
+  {
+    jointTypeStr = "revolute";
+  }
+  else if (_type == JointMaker::JOINT_HINGE2)
+  {
+    jointTypeStr = "revolute2";
+  }
+  else if (_type == JointMaker::JOINT_SCREW)
+  {
+    jointTypeStr = "screw";
+  }
+  else if (_type == JointMaker::JOINT_UNIVERSAL)
+  {
+    jointTypeStr = "universal";
+  }
+  else if (_type == JointMaker::JOINT_BALL)
+  {
+    jointTypeStr = "ball";
+  }
+
+  return jointTypeStr;
+}
+
+/////////////////////////////////////////////////
+int JointMaker::GetJointAxisCount(JointMaker::JointType _type)
+{
+  if (_type == JOINT_FIXED)
+  {
+    return 0;
+  }
+  else if (_type == JOINT_HINGE)
+  {
+    return 1;
+  }
+  else if (_type == JOINT_HINGE2)
+  {
+    return 2;
+  }
+  else if (_type == JOINT_SLIDER)
+  {
+    return 1;
+  }
+  else if (_type == JOINT_SCREW)
+  {
+    return 1;
+  }
+  else if (_type == JOINT_UNIVERSAL)
+  {
+    return 2;
+  }
+  else if (_type == JOINT_BALL)
+  {
+    return 0;
+  }
+
+  return 0;
+}
+
+/////////////////////////////////////////////////
+JointMaker::JointType JointMaker::GetState() const
+{
+  return this->jointType;
+}
+
+/////////////////////////////////////////////////
+void JointData::OnApply()
+{
+  this->anchor = this->inspector->GetAnchor(0);
+  this->type = this->inspector->GetType();
+  int axisCount = JointMaker::GetJointAxisCount(this->type);
+  for (int i = 0; i < axisCount; ++i)
+  {
+    this->axis[i] = this->inspector->GetAxis(i);
+    this->lowerLimit[i] = this->inspector->GetLowerLimit(i);
+    this->upperLimit[i] = this->inspector->GetUpperLimit(i);
+  }
+}
diff --git a/gazebo/gui/model/JointMaker.hh b/gazebo/gui/model/JointMaker.hh
new file mode 100644
index 0000000..c03f770
--- /dev/null
+++ b/gazebo/gui/model/JointMaker.hh
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _JOINTMAKER_HH_
+#define _JOINTMAKER_HH_
+
+#include <string>
+#include <vector>
+#include <boost/unordered/unordered_map.hpp>
+
+#include <sdf/sdf.hh>
+
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class JointData;
+    class JointInspector;
+
+    /// \addtogroup gazebo_gui
+    /// \{
+
+    /// \class JointMaker JointMaker.hh
+    /// \brief Joint visualization
+    class GAZEBO_VISIBLE JointMaker : public QObject
+    {
+      Q_OBJECT
+
+      /// \enum Joint types
+      /// \brief Unique identifiers for joint types that can be created.
+      public: enum JointType
+      {
+        /// \brief none
+        JOINT_NONE,
+        /// \brief Fixed joint
+        JOINT_FIXED,
+        /// \brief Slider joint
+        JOINT_SLIDER,
+        /// \brief Hinge joint
+        JOINT_HINGE,
+        /// \brief Hinge2 joint
+        JOINT_HINGE2,
+        /// \brief Screw joint
+        JOINT_SCREW,
+        /// \brief Universal joint
+        JOINT_UNIVERSAL,
+        /// \brief Revolute joint
+        JOINT_BALL
+      };
+
+      /// \brief Constructor
+      public: JointMaker();
+
+      /// \brief Destructor
+      public: virtual ~JointMaker();
+
+      /// \brief Reset the joint maker;
+      public: void Reset();
+
+      /// \brief Create a joint
+      /// \param[_type] Type of joint to be created
+      public: void CreateJoint(JointType _type);
+
+      /// \brief Update callback on PreRender.
+      public: void Update();
+
+      /// \brief Remove joint by name
+      /// \param[in] _jointName Name of joint to be removed.
+      public: void RemoveJoint(const std::string &_jointName);
+
+      /// \brief Remove all joints connected to part
+      /// \param[in] _partName Name of joint to be removed.
+      public: void RemoveJointsByPart(const std::string &_partName);
+
+      /// \brief Generate SDF for all joints.
+      public: void GenerateSDF();
+
+      /// \brief Generate SDF for all joints.
+      public: sdf::ElementPtr GetSDF() const;
+
+      /// \brief Get the axis count for joint type.
+      /// \param[in] _type Type of joint.
+      public: static int GetJointAxisCount(JointMaker::JointType _type);
+
+      /// \brief Get the joint type in string.
+      /// \param[in] _type Type of joint.
+      /// \return Joint type in string.
+      public: static std::string GetTypeAsString(JointMaker::JointType _type);
+
+      /// \brief Get state
+      /// \return State of JointType if joint creation is in process, otherwise
+      /// JOINT_NONE
+      public: JointMaker::JointType GetState() const;
+
+      /// \brief Stop the process of adding joint to the model.
+      public: void Stop();
+
+      /// \brief Mouse event filter callback when mouse button is pressed.
+      /// \param[in] _event The mouse event.
+      /// \return True if the event was handled
+      private: bool OnMousePress(const common::MouseEvent &_event);
+
+      /// \brief Mouse event filter callback when mouse button is released.
+      /// \param[in] _event The mouse event.
+      /// \return True if the event was handled
+      private: bool OnMouseRelease(const common::MouseEvent &_event);
+
+      /// \brief Mouse event filter callback when mouse is moved.
+      /// \param[in] _event The mouse event.
+      /// \return True if the event was handled
+      private: bool OnMouseMove(const common::MouseEvent &_event);
+
+      /// \brief Mouse event filter callback when mouse is double clicked.
+      /// \param[in] _event The mouse event.
+      /// \return True if the event was handled
+      private: bool OnMouseDoubleClick(const common::MouseEvent &_event);
+
+      /// \brief Helper method to create hotspot visual for mouse interaction.
+      private: void CreateHotSpot();
+
+      /// \brief Open joint inspector.
+      /// \param[in] _name Name of joint.
+      private: void OpenInspector(const std::string &_name);
+
+      /// \brief Qt signal when the joint creation process has ended.
+      Q_SIGNALS: void JointAdded();
+
+      /// \brief Qt Callback to open joint inspector
+      private slots: void OnOpenInspector();
+
+      /// \brief Type of joint to create
+      private: JointMaker::JointType jointType;
+
+      /// \brief Visual that is currently hovered over by the mouse
+      private: rendering::VisualPtr hoverVis;
+
+      /// \brief Visual that is previously hovered over by the mouse
+      private: rendering::VisualPtr prevHoverVis;
+
+      /// \brief Currently selected visual
+      private: rendering::VisualPtr selectedVis;
+
+      /// \brief Visual that is currently being inspected.
+      private: rendering::VisualPtr inspectVis;
+
+      /// \brief All joints created by joint maker.
+      private: boost::unordered_map<std::string, JointData *> joints;
+
+      /// \brief Joint currently being created.
+      private: JointData *mouseJoint;
+
+      /// \brief All the event connections.
+      private: std::vector<event::ConnectionPtr> connections;
+
+      /// \brief Flag set to true when a joint has been connected.
+      private: bool newJointCreated;
+
+      /// \brief A map of joint type to its corresponding material.
+      private: boost::unordered_map<JointMaker::JointType, std::string>
+          jointMaterials;
+
+      /// \brief The SDF element pointer to the model that contains the joints.
+      private: sdf::ElementPtr modelSDF;
+
+      /// \brief Counter for the number of joints in the model.
+      private: int jointCounter;
+
+      /// \brief Qt action for opening the joint inspector.
+      private: QAction *inspectAct;
+    };
+    /// \}
+
+
+    /// \class JointData JointData.hh
+    /// \brief Helper class to store joint data
+    class GAZEBO_VISIBLE JointData : public QObject
+    {
+      Q_OBJECT
+
+      /// \brief Visual of the dynamic line
+      public: rendering::VisualPtr visual;
+
+      /// \brieft Visual of the hotspot
+      public: rendering::VisualPtr hotspot;
+
+      /// \brief Parent visual the joint is connected to.
+      public: rendering::VisualPtr parent;
+
+      /// \brief Child visual the joint is connected to.
+      public: rendering::VisualPtr child;
+
+      /// \brief Visual line used to represent joint connecting parent and child
+      public: rendering::DynamicLines *line;
+
+      /// \brief Type of joint.
+      public: JointMaker::JointType type;
+
+      /// \brief Joint axis direction.
+      public: math::Vector3 axis[2];
+
+      /// \brief Joint lower limit.
+      public: double lowerLimit[2];
+
+      /// \brief Joint upper limit.
+      public: double upperLimit[2];
+
+      /// \brief Joint anchor point.
+      public: math::Vector3 anchor;
+
+      /// \brief True if the joint visual needs update.
+      public: bool dirty;
+
+      /// \brief Inspector for configuring joint properties.
+      public: JointInspector *inspector;
+
+      /// \brief Qt Callback when joint inspector configurations are to be
+      /// applied.
+      private slots: void OnApply();
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/gui/model/ModelCreator.cc b/gazebo/gui/model/ModelCreator.cc
new file mode 100644
index 0000000..5434eb1
--- /dev/null
+++ b/gazebo/gui/model/ModelCreator.cc
@@ -0,0 +1,766 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <sstream>
+#include <boost/filesystem.hpp>
+
+#include "gazebo/common/KeyEvent.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/Scene.hh"
+
+#include "gazebo/math/Quaternion.hh"
+
+#include "gazebo/transport/Publisher.hh"
+#include "gazebo/transport/Node.hh"
+
+#include "gazebo/physics/Inertial.hh"
+
+#include "gazebo/gui/Actions.hh"
+#include "gazebo/gui/KeyEventHandler.hh"
+#include "gazebo/gui/MouseEventHandler.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/ModelManipulator.hh"
+
+#include "gazebo/gui/model/JointMaker.hh"
+#include "gazebo/gui/model/ModelCreator.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+ModelCreator::ModelCreator()
+{
+  this->modelName = "";
+
+  this->modelTemplateSDF.reset(new sdf::SDF);
+  this->modelTemplateSDF->SetFromString(this->GetTemplateSDFString());
+
+  this->boxCounter = 0;
+  this->cylinderCounter = 0;
+  this->sphereCounter = 0;
+  this->modelCounter = 0;
+
+  this->node = transport::NodePtr(new transport::Node());
+  this->node->Init();
+  this->makerPub = this->node->Advertise<msgs::Factory>("~/factory");
+  this->requestPub = this->node->Advertise<msgs::Request>("~/request");
+
+  this->jointMaker = new JointMaker();
+
+  connect(g_deleteAct, SIGNAL(DeleteSignal(const std::string &)), this,
+          SLOT(OnDelete(const std::string &)));
+
+  this->Reset();
+}
+
+/////////////////////////////////////////////////
+ModelCreator::~ModelCreator()
+{
+  this->Reset();
+  this->node->Fini();
+  this->node.reset();
+  this->modelTemplateSDF.reset();
+  this->requestPub.reset();
+  this->makerPub.reset();
+
+  delete jointMaker;
+}
+
+/////////////////////////////////////////////////
+std::string ModelCreator::CreateModel()
+{
+  this->Reset();
+  return this->modelName;
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::AddJoint(JointMaker::JointType _type)
+{
+  this->Stop();
+  if (this->jointMaker)
+    this->jointMaker->CreateJoint(_type);
+}
+
+/////////////////////////////////////////////////
+std::string ModelCreator::AddBox(const math::Vector3 &_size,
+    const math::Pose &_pose)
+{
+  if (!this->modelVisual)
+  {
+    this->Reset();
+  }
+
+  std::ostringstream linkNameStream;
+  linkNameStream << "unit_box_" << this->boxCounter++;
+  std::string linkName = linkNameStream.str();
+
+  rendering::VisualPtr linkVisual(new rendering::Visual(linkName,
+      this->modelVisual));
+  linkVisual->Load();
+
+  std::ostringstream visualName;
+  visualName << linkName << "_visual";
+  rendering::VisualPtr visVisual(new rendering::Visual(visualName.str(),
+      linkVisual));
+  sdf::ElementPtr visualElem =  this->modelTemplateSDF->root
+      ->GetElement("model")->GetElement("link")->GetElement("visual");
+  visualElem->GetElement("material")->GetElement("script")
+      ->GetElement("name")->Set("Gazebo/GreyTransparent");
+
+  sdf::ElementPtr geomElem =  visualElem->GetElement("geometry");
+  geomElem->ClearElements();
+  ((geomElem->AddElement("box"))->AddElement("size"))->Set(_size);
+
+  visVisual->Load(visualElem);
+
+  linkVisual->SetPose(_pose);
+  if (_pose == math::Pose::Zero)
+  {
+    linkVisual->SetPosition(math::Vector3(_pose.pos.x, _pose.pos.y,
+    _pose.pos.z + _size.z/2));
+  }
+
+  this->CreatePart(visVisual);
+
+  this->mouseVisual = linkVisual;
+
+  return linkName;
+}
+
+/////////////////////////////////////////////////
+std::string ModelCreator::AddSphere(double _radius,
+    const math::Pose &_pose)
+{
+  if (!this->modelVisual)
+    this->Reset();
+
+  std::ostringstream linkNameStream;
+  linkNameStream << "unit_sphere_" << this->sphereCounter++;
+  std::string linkName = linkNameStream.str();
+
+  rendering::VisualPtr linkVisual(new rendering::Visual(
+      linkName, this->modelVisual));
+  linkVisual->Load();
+
+  std::ostringstream visualName;
+  visualName << linkName << "_visual";
+  rendering::VisualPtr visVisual(new rendering::Visual(visualName.str(),
+        linkVisual));
+  sdf::ElementPtr visualElem =  this->modelTemplateSDF->root
+      ->GetElement("model")->GetElement("link")->GetElement("visual");
+  visualElem->GetElement("material")->GetElement("script")
+      ->GetElement("name")->Set("Gazebo/GreyTransparent");
+
+  sdf::ElementPtr geomElem =  visualElem->GetElement("geometry");
+  geomElem->ClearElements();
+  ((geomElem->AddElement("sphere"))->GetElement("radius"))->Set(_radius);
+
+  visVisual->Load(visualElem);
+
+  linkVisual->SetPose(_pose);
+  if (_pose == math::Pose::Zero)
+  {
+    linkVisual->SetPosition(math::Vector3(_pose.pos.x, _pose.pos.y,
+    _pose.pos.z + _radius));
+  }
+
+  this->CreatePart(visVisual);
+  this->mouseVisual = linkVisual;
+
+  return linkName;
+}
+
+/////////////////////////////////////////////////
+std::string ModelCreator::AddCylinder(double _radius, double _length,
+    const math::Pose &_pose)
+{
+  if (!this->modelVisual)
+    this->Reset();
+
+  std::ostringstream linkNameStream;
+  linkNameStream << "unit_cylinder_" << this->cylinderCounter++;
+  std::string linkName = linkNameStream.str();
+
+  rendering::VisualPtr linkVisual(new rendering::Visual(
+      linkName, this->modelVisual));
+  linkVisual->Load();
+
+  std::ostringstream visualName;
+  visualName << linkName << "_visual";
+  rendering::VisualPtr visVisual(new rendering::Visual(visualName.str(),
+        linkVisual));
+  sdf::ElementPtr visualElem =  this->modelTemplateSDF->root
+      ->GetElement("model")->GetElement("link")->GetElement("visual");
+  visualElem->GetElement("material")->GetElement("script")
+      ->GetElement("name")->Set("Gazebo/GreyTransparent");
+
+  sdf::ElementPtr geomElem =  visualElem->GetElement("geometry");
+  geomElem->ClearElements();
+  sdf::ElementPtr cylinderElem = geomElem->AddElement("cylinder");
+  (cylinderElem->GetElement("radius"))->Set(_radius);
+  (cylinderElem->GetElement("length"))->Set(_length);
+
+  visVisual->Load(visualElem);
+
+  linkVisual->SetPose(_pose);
+  if (_pose == math::Pose::Zero)
+  {
+    linkVisual->SetPosition(math::Vector3(_pose.pos.x, _pose.pos.y,
+    _pose.pos.z + _length/2));
+  }
+
+  this->CreatePart(visVisual);
+  this->mouseVisual = linkVisual;
+
+  return linkName;
+}
+
+/////////////////////////////////////////////////
+std::string ModelCreator::AddCustom(const std::string &_path,
+    const math::Vector3 &_scale, const math::Pose &_pose)
+{
+  if (!this->modelVisual)
+    this->Reset();
+
+  std::string path = _path;
+
+  std::ostringstream linkNameStream;
+  linkNameStream << "custom_" << this->customCounter++;
+  std::string linkName = linkNameStream.str();
+
+  rendering::VisualPtr linkVisual(new rendering::Visual(this->modelName + "::" +
+        linkName, this->modelVisual));
+  linkVisual->Load();
+
+  std::ostringstream visualName;
+  visualName << linkName << "_visual";
+  rendering::VisualPtr visVisual(new rendering::Visual(visualName.str(),
+        linkVisual));
+  sdf::ElementPtr visualElem =  this->modelTemplateSDF->root
+      ->GetElement("model")->GetElement("link")->GetElement("visual");
+  visualElem->GetElement("material")->GetElement("script")
+      ->GetElement("name")->Set("Gazebo/GreyTransparent");
+
+  sdf::ElementPtr geomElem =  visualElem->GetElement("geometry");
+  geomElem->ClearElements();
+  sdf::ElementPtr meshElem = geomElem->AddElement("mesh");
+  meshElem->GetElement("scale")->Set(_scale);
+  meshElem->GetElement("uri")->Set(path);
+  visVisual->Load(visualElem);
+
+  linkVisual->SetPose(_pose);
+  if (_pose == math::Pose::Zero)
+  {
+    linkVisual->SetPosition(math::Vector3(_pose.pos.x, _pose.pos.y,
+    _pose.pos.z + _scale.z/2));
+  }
+
+  this->CreatePart(visVisual);
+  this->mouseVisual = linkVisual;
+
+  return linkName;
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::CreatePart(const rendering::VisualPtr &_visual)
+{
+  PartData *part = new PartData;
+  part->name = _visual->GetName();
+  part->visuals.push_back(_visual);
+
+  part->gravity = true;
+  part->selfCollide = false;
+  part->kinematic = false;
+
+  part->inertial = new physics::Inertial;
+  part->sensorData = new SensorData;
+
+  this->allParts[part->name] = part;
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::RemovePart(const std::string &_partName)
+{
+  if (!this->modelVisual)
+  {
+    this->Reset();
+    return;
+  }
+
+  if (this->allParts.find(_partName) == this->allParts.end())
+    return;
+
+  PartData *part = this->allParts[_partName];
+  if (!part)
+    return;
+
+  for (unsigned int i = 0; i < part->visuals.size(); ++i)
+  {
+    rendering::VisualPtr vis = part->visuals[i];
+    rendering::VisualPtr visParent = vis->GetParent();
+    rendering::ScenePtr scene = vis->GetScene();
+    scene->RemoveVisual(vis);
+    if (visParent)
+      scene->RemoveVisual(visParent);
+  }
+
+  delete part->inertial;
+  delete part->sensorData;
+
+  this->allParts.erase(_partName);
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::Reset()
+{
+  if (!gui::get_active_camera() ||
+      !gui::get_active_camera()->GetScene())
+    return;
+
+  KeyEventHandler::Instance()->AddPressFilter("model_part",
+      boost::bind(&ModelCreator::OnKeyPressPart, this, _1));
+
+  MouseEventHandler::Instance()->AddReleaseFilter("model_part",
+      boost::bind(&ModelCreator::OnMouseReleasePart, this, _1));
+
+  MouseEventHandler::Instance()->AddMoveFilter("model_part",
+      boost::bind(&ModelCreator::OnMouseMovePart, this, _1));
+
+  MouseEventHandler::Instance()->AddDoubleClickFilter("model_part",
+      boost::bind(&ModelCreator::OnMouseDoubleClickPart, this, _1));
+
+  this->jointMaker->Reset();
+  this->selectedVis.reset();
+
+  std::stringstream ss;
+  ss << "defaultModel_" << this->modelCounter++;
+  this->modelName = ss.str();
+
+  rendering::ScenePtr scene = gui::get_active_camera()->GetScene();
+
+  this->isStatic = false;
+  this->autoDisable = true;
+
+  while (this->allParts.size() > 0)
+    this->RemovePart(this->allParts.begin()->first);
+  this->allParts.clear();
+
+  if (this->modelVisual)
+    scene->RemoveVisual(this->modelVisual);
+
+  this->modelVisual.reset(new rendering::Visual(this->modelName,
+      scene->GetWorldVisual()));
+
+  this->modelVisual->Load();
+  this->modelPose = math::Pose::Zero;
+  this->modelVisual->SetPose(this->modelPose);
+  scene->AddVisual(this->modelVisual);
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::SetModelName(const std::string &_modelName)
+{
+  this->modelName = _modelName;
+}
+
+/////////////////////////////////////////////////
+std::string ModelCreator::GetModelName() const
+{
+  return this->modelName;
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::SetStatic(bool _static)
+{
+  this->isStatic = _static;
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::SetAutoDisable(bool _auto)
+{
+  this->autoDisable = _auto;
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::SaveToSDF(const std::string &_savePath)
+{
+  std::ofstream savefile;
+  boost::filesystem::path path;
+  path = boost::filesystem::operator/(_savePath, this->modelName + ".sdf");
+  savefile.open(path.string().c_str());
+  if (savefile.is_open())
+  {
+    savefile << this->modelSDF->ToString();
+    savefile.close();
+  }
+  else
+  {
+    gzerr << "Unable to open file for writing: '" << path.string().c_str()
+        << "'. Possibly a permission issue." << std::endl;
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::FinishModel()
+{
+  event::Events::setSelectedEntity("", "normal");
+  this->Reset();
+  this->CreateTheEntity();
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::CreateTheEntity()
+{
+  msgs::Factory msg;
+  msg.set_sdf(this->modelSDF->ToString());
+  this->makerPub->Publish(msg);
+}
+
+/////////////////////////////////////////////////
+std::string ModelCreator::GetTemplateSDFString()
+{
+  std::ostringstream newModelStr;
+  newModelStr << "<sdf version ='" << SDF_VERSION << "'>"
+    << "<model name='template_model'>"
+    << "<pose>0 0 0.0 0 0 0</pose>"
+    << "<link name ='link'>"
+    <<   "<visual name ='visual'>"
+    <<     "<pose>0 0 0.0 0 0 0</pose>"
+    <<     "<geometry>"
+    <<       "<box>"
+    <<         "<size>1.0 1.0 1.0</size>"
+    <<       "</box>"
+    <<     "</geometry>"
+    <<     "<material>"
+    <<       "<script>"
+    <<         "<uri>file://media/materials/scripts/gazebo.material</uri>"
+    <<         "<name>Gazebo/Grey</name>"
+    <<       "</script>"
+    <<     "</material>"
+    <<   "</visual>"
+    << "</link>"
+    << "<static>true</static>"
+    << "</model>"
+    << "</sdf>";
+
+  return newModelStr.str();
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::AddPart(PartType _type)
+{
+  this->Stop();
+
+  this->addPartType = _type;
+  if (_type != PART_NONE)
+  {
+    switch (_type)
+    {
+      case PART_BOX:
+      {
+        this->AddBox();
+        break;
+      }
+      case PART_SPHERE:
+      {
+        this->AddSphere();
+        break;
+      }
+      case PART_CYLINDER:
+      {
+        this->AddCylinder();
+        break;
+      }
+      default:
+      {
+        gzwarn << "Unknown part type '" << _type << "'. " <<
+            "Part not added" << std::endl;
+        break;
+      }
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::Stop()
+{
+  if (this->addPartType != PART_NONE && this->mouseVisual)
+  {
+    for (unsigned int i = 0; i < this->mouseVisual->GetChildCount(); ++i)
+        this->RemovePart(this->mouseVisual->GetChild(0)->GetName());
+    this->mouseVisual.reset();
+  }
+  if (this->jointMaker)
+    this->jointMaker->Stop();
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::OnDelete(const std::string &_part)
+{
+  if (_part == this->modelName)
+  {
+    this->Reset();
+    return;
+  }
+
+  if (this->jointMaker)
+    this->jointMaker->RemoveJointsByPart(_part);
+
+  this->RemovePart(_part);
+}
+
+/////////////////////////////////////////////////
+bool ModelCreator::OnKeyPressPart(const common::KeyEvent &_event)
+{
+  if (_event.key == Qt::Key_Escape)
+  {
+    this->Stop();
+  }
+  else if (_event.key == Qt::Key_Delete)
+  {
+    if (this->selectedVis)
+    {
+      this->OnDelete(this->selectedVis->GetName());
+      this->selectedVis.reset();
+    }
+  }
+  return false;
+}
+
+/////////////////////////////////////////////////
+bool ModelCreator::OnMouseReleasePart(const common::MouseEvent &_event)
+{
+  if (_event.button != common::MouseEvent::LEFT)
+    return false;
+
+  if (this->mouseVisual)
+  {
+    emit PartAdded();
+    this->mouseVisual.reset();
+    this->AddPart(PART_NONE);
+    return true;
+  }
+
+  // In mouse normal mode, let users select a part if the parent model
+  // is currently selected.
+  rendering::VisualPtr vis = gui::get_active_camera()->GetVisual(_event.pos);
+  if (vis)
+  {
+    if (this->allParts.find(vis->GetName()) !=
+        this->allParts.end())
+    {
+      if (gui::get_active_camera()->GetScene()->GetSelectedVisual()
+          == this->modelVisual || this->selectedVis)
+      {
+        if (this->selectedVis)
+          this->selectedVis->SetHighlighted(false);
+        else
+          event::Events::setSelectedEntity("", "normal");
+
+        this->selectedVis = vis;
+        this->selectedVis->SetHighlighted(true);
+        return true;
+      }
+    }
+    else if (this->selectedVis)
+    {
+      this->selectedVis->SetHighlighted(false);
+      this->selectedVis.reset();
+    }
+  }
+  return false;
+}
+
+/////////////////////////////////////////////////
+bool ModelCreator::OnMouseMovePart(const common::MouseEvent &_event)
+{
+  if (!this->mouseVisual)
+    return false;
+
+  if (!gui::get_active_camera())
+    return false;
+
+  math::Pose pose = this->mouseVisual->GetWorldPose();
+  pose.pos = ModelManipulator::GetMousePositionOnPlane(
+      gui::get_active_camera(), _event);
+
+  if (!_event.shift)
+  {
+    pose.pos = ModelManipulator::SnapPoint(pose.pos);
+  }
+  pose.pos.z = this->mouseVisual->GetWorldPose().pos.z;
+
+  this->mouseVisual->SetWorldPose(pose);
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool ModelCreator::OnMouseDoubleClickPart(const common::MouseEvent &_event)
+{
+  rendering::VisualPtr vis = gui::get_active_camera()->GetVisual(_event.pos);
+  if (vis)
+  {
+    if (this->allParts.find(vis->GetName()) != this->allParts.end())
+    {
+      // TODO part inspector code goes here
+      return true;
+    }
+  }
+  return false;
+}
+
+/////////////////////////////////////////////////
+JointMaker *ModelCreator::GetJointMaker() const
+{
+  return this->jointMaker;
+}
+
+/////////////////////////////////////////////////
+void ModelCreator::GenerateSDF()
+{
+  sdf::ElementPtr modelElem;
+  sdf::ElementPtr linkElem;
+  sdf::ElementPtr visualElem;
+  sdf::ElementPtr collisionElem;
+
+  this->modelSDF.reset(new sdf::SDF);
+  this->modelSDF->SetFromString(this->GetTemplateSDFString());
+
+  modelElem = this->modelSDF->root->GetElement("model");
+
+  linkElem = modelElem->GetElement("link");
+  sdf::ElementPtr templateLinkElem = linkElem->Clone();
+  sdf::ElementPtr templateVisualElem = templateLinkElem->GetElement(
+      "visual")->Clone();
+  sdf::ElementPtr templateCollisionElem = templateLinkElem->GetElement(
+      "collision")->Clone();
+  modelElem->ClearElements();
+  std::stringstream visualNameStream;
+  std::stringstream collisionNameStream;
+
+  modelElem->GetAttribute("name")->Set(this->modelName);
+
+  boost::unordered_map<std::string, PartData *>::iterator partsIt;
+
+  // set center of all parts to be origin
+  math::Vector3 mid;
+  for (partsIt = this->allParts.begin(); partsIt != this->allParts.end();
+      ++partsIt)
+  {
+    PartData *part = partsIt->second;
+    rendering::VisualPtr visual = part->visuals[0];
+    mid += visual->GetParent()->GetWorldPose().pos;
+  }
+  mid /= this->allParts.size();
+  this->origin.pos = mid;
+  modelElem->GetElement("pose")->Set(this->origin);
+
+  // loop through all parts and generate sdf
+  for (partsIt = this->allParts.begin(); partsIt != this->allParts.end();
+      ++partsIt)
+  {
+    visualNameStream.str("");
+    collisionNameStream.str("");
+
+    PartData *part = partsIt->second;
+    rendering::VisualPtr visual = part->visuals[0];
+    sdf::ElementPtr newLinkElem = templateLinkElem->Clone();
+    visualElem = newLinkElem->GetElement("visual");
+    collisionElem = newLinkElem->GetElement("collision");
+    newLinkElem->GetAttribute("name")->Set(visual->GetParent()->GetName());
+    newLinkElem->GetElement("pose")->Set(visual->GetParent()->GetWorldPose()
+        - this->origin);
+    newLinkElem->GetElement("gravity")->Set(part->gravity);
+    newLinkElem->GetElement("self_collide")->Set(part->selfCollide);
+    newLinkElem->GetElement("kinematic")->Set(part->kinematic);
+    sdf::ElementPtr inertialElem = newLinkElem->GetElement("inertial");
+    inertialElem->GetElement("mass")->Set(part->inertial->GetMass());
+    inertialElem->GetElement("pose")->Set(part->inertial->GetPose());
+    sdf::ElementPtr inertiaElem = inertialElem->GetElement("inertia");
+    inertiaElem->GetElement("ixx")->Set(part->inertial->GetIXX());
+    inertiaElem->GetElement("iyy")->Set(part->inertial->GetIYY());
+    inertiaElem->GetElement("izz")->Set(part->inertial->GetIZZ());
+    inertiaElem->GetElement("ixy")->Set(part->inertial->GetIXY());
+    inertiaElem->GetElement("ixz")->Set(part->inertial->GetIXZ());
+    inertiaElem->GetElement("iyz")->Set(part->inertial->GetIYZ());
+
+    modelElem->InsertElement(newLinkElem);
+
+    visualElem->GetAttribute("name")->Set(visual->GetParent()->GetName()
+        + "_visual");
+    collisionElem->GetAttribute("name")->Set(visual->GetParent()->GetName()
+        + "_collision");
+    visualElem->GetElement("pose")->Set(visual->GetPose());
+    collisionElem->GetElement("pose")->Set(visual->GetPose());
+
+    sdf::ElementPtr geomElem =  visualElem->GetElement("geometry");
+    geomElem->ClearElements();
+
+    math::Vector3 scale = visual->GetScale();
+    if (visual->GetParent()->GetName().find("unit_box") != std::string::npos)
+    {
+      sdf::ElementPtr boxElem = geomElem->AddElement("box");
+      (boxElem->GetElement("size"))->Set(scale);
+    }
+    else if (visual->GetParent()->GetName().find("unit_cylinder")
+       != std::string::npos)
+    {
+      sdf::ElementPtr cylinderElem = geomElem->AddElement("cylinder");
+      (cylinderElem->GetElement("radius"))->Set(scale.x/2.0);
+      (cylinderElem->GetElement("length"))->Set(scale.z);
+    }
+    else if (visual->GetParent()->GetName().find("unit_sphere")
+        != std::string::npos)
+    {
+      sdf::ElementPtr sphereElem = geomElem->AddElement("sphere");
+      (sphereElem->GetElement("radius"))->Set(scale.x/2.0);
+    }
+    else if (visual->GetParent()->GetName().find("custom")
+        != std::string::npos)
+    {
+      sdf::ElementPtr customElem = geomElem->AddElement("mesh");
+      (customElem->GetElement("scale"))->Set(scale);
+      (customElem->GetElement("uri"))->Set(visual->GetMeshName());
+    }
+    sdf::ElementPtr geomElemClone = geomElem->Clone();
+    geomElem =  collisionElem->GetElement("geometry");
+    geomElem->ClearElements();
+    geomElem->InsertElement(geomElemClone->GetFirstElement());
+  }
+
+  // Add joint sdf elements
+  this->jointMaker->GenerateSDF();
+  sdf::ElementPtr jointsElem = this->jointMaker->GetSDF();
+
+  sdf::ElementPtr jointElem;
+  if (jointsElem->HasElement("joint"))
+    jointElem = jointsElem->GetElement("joint");
+  while (jointElem)
+  {
+    modelElem->InsertElement(jointElem->Clone());
+    jointElem = jointElem->GetNextElement("joint");
+  }
+
+  // Model settings
+  modelElem->GetElement("static")->Set(this->isStatic);
+  modelElem->GetElement("allow_auto_disable")->Set(this->autoDisable);
+}
diff --git a/gazebo/gui/model/ModelCreator.hh b/gazebo/gui/model/ModelCreator.hh
new file mode 100644
index 0000000..1217f1f
--- /dev/null
+++ b/gazebo/gui/model/ModelCreator.hh
@@ -0,0 +1,333 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _MODEL_CREATOR_HH_
+#define _MODEL_CREATOR_HH_
+
+#include <list>
+#include <string>
+#include <vector>
+
+#include <boost/unordered/unordered_map.hpp>
+
+#include <sdf/sdf.hh>
+
+#include "gazebo/common/KeyEvent.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/transport/TransportTypes.hh"
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/gui/model/JointMaker.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace msgs
+  {
+    class Visual;
+  }
+
+  namespace gui
+  {
+    class PartData;
+
+    /// \addtogroup gazebo_gui
+    /// \{
+
+    /// \class ModelCreator ModelCreator.hh
+    /// \brief Create and manage 3D visuals of a model with parts and joints.
+    class GAZEBO_VISIBLE ModelCreator : public QObject
+    {
+      Q_OBJECT
+
+      /// \enum Joint types
+      /// \brief Unique identifiers for joint types that can be created.
+      public: enum PartType
+      {
+        /// \brief none
+        PART_NONE,
+        /// \brief Box
+        PART_BOX,
+        /// \brief Sphere
+        PART_SPHERE,
+        /// \brief Cylinder
+        PART_CYLINDER,
+        /// \brief Custom
+        PART_CUSTOM
+      };
+
+      /// \brief Constructor
+      public: ModelCreator();
+
+      /// \brief Destructor
+      public: virtual ~ModelCreator();
+
+      /// \brief Set the name of the model.
+      /// \param[in] _modelName Name of the model to set to.
+      public: void SetModelName(const std::string &_modelName);
+
+      /// \brief Get the name of the model.
+      /// \return Name of model.
+      public: std::string GetModelName() const;
+
+      /// \brief Finish the model and create the entity on the gzserver.
+       public: void FinishModel();
+
+      /// \brief Add a box to the model.
+      /// \param[in] _size Size of the box.
+      /// \param[in] _pose Pose of the box.
+      /// \return Name of the box that has been added.
+      public: std::string AddBox(
+          const math::Vector3 &_size = math::Vector3::One,
+          const math::Pose &_pose = math::Pose::Zero);
+
+      /// \brief Add a sphere to the model.
+      /// \param[in] _radius Radius of the sphere.
+      /// \param[in] _pose Pose of the sphere.
+      /// \return Name of the sphere that has been added.
+      public: std::string AddSphere(double _radius = 0.5,
+          const math::Pose &_pose = math::Pose::Zero);
+
+      /// \brief Add a cylinder to the model.
+      /// \param[in] _radius Radius of the cylinder.
+      /// \param[in] _length Length of the cylinder.
+      /// \param[in] _pose Pose of the cylinder.
+      /// \return Name of the cylinder that has been added.
+      public: std::string AddCylinder(double _radius = 0.5,
+          double _length = 1.0, const math::Pose &_pose = math::Pose::Zero);
+
+      /// \brief Add a custom part to the model
+      /// \param[in] _name Name of the custom part.
+      /// \param[in] _scale Scale of the custom part.
+      /// \param[in] _pose Pose of the custom part.
+      /// \return Name of the custom that has been added.
+      public: std::string AddCustom(const std::string &_name,
+          const math::Vector3 &_scale = math::Vector3::One,
+          const math::Pose &_pose = math::Pose::Zero);
+
+      /// \brief Add a joint to the model.
+      /// \param[in] _type Type of joint to add.
+      /// \return Name of the joint that has been added.
+      public: void AddJoint(JointMaker::JointType _type);
+
+      /// \brief Remove a part from the model.
+      /// \param[in] _partName Name of the part to remove
+      public: void RemovePart(const std::string &_partName);
+
+      /// \brief Set the model to be static
+      /// \param[in] _static True to make the model static.
+      public: void SetStatic(bool _static);
+
+      /// \brief Set the model to allow auto disable at rest.
+      /// \param[in] _auto True to allow the model to auto disable.
+      public: void SetAutoDisable(bool _auto);
+
+      /// \brief Save model to SDF format.
+      /// \param[in] _savePath Path to save the SDF to.
+      public: void SaveToSDF(const std::string &_savePath);
+
+      /// \brief Reset the model creator and the SDF.
+      public: void Reset();
+
+      /// \brief Stop the process of adding a part or joint to the model.
+      public: void Stop();
+
+      /// \brief Get joint maker
+      /// \return Joint maker
+      public: JointMaker *GetJointMaker() const;
+
+      /// \brief Add a part to the model
+      /// \param[in] _type Type of part to be added
+      public: void AddPart(PartType _type);
+
+      /// \brief Generate the SDF from model part and joint visuals.
+      public: void GenerateSDF();
+
+      /// \brief Mouse event filter callback when mouse is moved.
+      /// \param[in] _event The mouse event.
+      /// \return True if the event was handled
+      private: bool OnMouseMovePart(const common::MouseEvent &_event);
+
+      /// \brief Mouse event filter callback when mouse is released.
+      /// \param[in] _event The mouse event.
+      /// \return True if the event was handled
+      private: bool OnMouseReleasePart(const common::MouseEvent &_event);
+
+      /// \brief Mouse event filter callback when mouse is double clicked.
+      /// \param[in] _event The mouse event.
+      /// \return True if the event was handled
+      private: bool OnMouseDoubleClickPart(const common::MouseEvent &_event);
+
+      /// \brief Key event filter callback when key is pressed.
+      /// \param[in] _event The key event.
+      /// \return True if the event was handled
+      private: bool OnKeyPressPart(const common::KeyEvent &_event);
+
+      /// \brief Create part with default properties from a visual
+      /// \param[in] _visual Visual used to create the part.
+      private: void CreatePart(const rendering::VisualPtr &_visual);
+
+      // Documentation inherited
+      private: virtual void CreateTheEntity();
+
+      /// \brief Internal init function.
+      private: bool Init();
+
+      /// \brief Create an empty model.
+      /// \return Name of the model created.
+      private: std::string CreateModel();
+
+      /// \brief Get a template SDF string of a simple model.
+      /// \return Template SDF string of a simple model.
+      private: std::string GetTemplateSDFString();
+
+      /// \brief Qt callback when a delete signal has been emitted.
+      /// \param[in] _name Name of the part or model to delete.
+      private slots: void OnDelete(const std::string &_name="");
+
+      /// \brief Qt signal when the a part has been added.
+      Q_SIGNALS: void PartAdded();
+
+      /// \brief The model in SDF format.
+      private: sdf::SDFPtr modelSDF;
+
+      /// \brief A template SDF of a simple box model.
+      private: sdf::SDFPtr modelTemplateSDF;
+
+      /// \brief Name of the model.
+      private: std::string modelName;
+
+      /// \brief The root visual of the model.
+      private: rendering::VisualPtr modelVisual;
+
+      /// \brief The root visual of the model.
+      private: rendering::VisualPtr mouseVisual;
+
+      /// \brief The pose of the model.
+      private: math::Pose modelPose;
+
+      /// \brief True to create a static model.
+      private: bool isStatic;
+
+      /// \brief True to auto disable model when it is at rest.
+      private: bool autoDisable;
+
+      /// \brief A list of gui editor events connected to the model creator.
+      private: std::vector<event::ConnectionPtr> connections;
+
+      /// \brief Counter for the number of boxes in the model.
+      private: int boxCounter;
+
+      /// \brief Counter for the number of cylinders in the model.
+      private: int cylinderCounter;
+
+      /// \brief Counter for the number of spheres in the model.
+      private: int sphereCounter;
+
+      /// \brief Counter for the number of custom parts in the model.
+      private: int customCounter;
+
+      /// \brief Counter for generating a unique model name.
+      private: int modelCounter;
+
+      /// \brief Type of part being added.
+      private: PartType addPartType;
+
+      /// \brief A map of model part names to and their visuals.
+      private: boost::unordered_map<std::string, PartData *> allParts;
+
+      /// \brief Transport node
+      private: transport::NodePtr node;
+
+      /// \brief Publisher that publishes msg to the server once the model is
+      /// created.
+      private: transport::PublisherPtr makerPub;
+
+      /// \brief Publisher that publishes delete entity msg to remove the
+      /// editor visual.
+      private: transport::PublisherPtr requestPub;
+
+      /// \brief Joint maker.
+      private: JointMaker *jointMaker;
+
+      /// \brief origin of the model.
+      private: math::Pose origin;
+
+      /// \brief Selected partv visual;
+      private: rendering::VisualPtr selectedVis;
+    };
+    /// \}
+
+    /// \class SensorData SensorData.hh
+    /// \brief Helper class to store sensor data
+    class GAZEBO_VISIBLE SensorData
+    {
+      /// \brief Name of sensor.
+      public: std::string name;
+
+      /// \brief Type of sensor.
+      public: std::string type;
+
+      /// \brief Pose of sensor.
+      public: math::Vector3 pose;
+
+      /// \brief True to visualize sensor.
+      public: bool visualize;
+
+      /// \brief True to set sensor to be always on.
+      public: bool alwaysOn;
+
+      /// \brief Sensor topic name.
+      public: std::string topicName;
+    };
+
+    /// \class PartData PartData.hh
+    /// \brief Helper class to store part data
+    class GAZEBO_VISIBLE PartData : public QObject
+    {
+      Q_OBJECT
+
+      /// \brief Name of part.
+      public: std::string name;
+
+      /// \brief Visuals of the part.
+      public: std::vector<rendering::VisualPtr> visuals;
+
+      /// \brief True to enable gravity on part.
+      public: bool gravity;
+
+      /// \brief True to allow self collision.
+      public: bool selfCollide;
+
+      /// \brief True to make part kinematic.
+      public: bool kinematic;
+
+      /// \brief Pose of part.
+      public: math::Pose pose;
+
+      /// \brief Name of part.
+      public: physics::Inertial *inertial;
+
+      /// \brief Name of part.
+      public: std::vector<physics::CollisionPtr> collisions;
+
+      /// \brief Sensor data
+      public: SensorData *sensorData;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/model/ModelEditor.cc b/gazebo/gui/model/ModelEditor.cc
new file mode 100644
index 0000000..b5fd2fa
--- /dev/null
+++ b/gazebo/gui/model/ModelEditor.cc
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/gui/Actions.hh"
+#include "gazebo/gui/MainWindow.hh"
+#include "gazebo/gui/model/ModelEditorPalette.hh"
+#include "gazebo/gui/model/ModelEditorEvents.hh"
+#include "gazebo/gui/model/ModelEditor.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+ModelEditor::ModelEditor(MainWindow *_mainWindow)
+  : Editor(_mainWindow)
+{
+  this->active = false;
+  // Create the model editor tab
+  this->modelPalette = new ModelEditorPalette(_mainWindow);
+  this->Init("modelEditorTab", "Model Editor", this->modelPalette);
+
+  connect(g_editModelAct, SIGNAL(triggered(bool)), this, SLOT(OnEdit(bool)));
+
+  this->connections.push_back(
+      gui::model::Events::ConnectFinishModel(
+      boost::bind(&ModelEditor::OnFinish, this)));
+}
+
+/////////////////////////////////////////////////
+ModelEditor::~ModelEditor()
+{
+}
+
+/////////////////////////////////////////////////
+void ModelEditor::OnEdit(bool /*_checked*/)
+{
+  if (!this->active)
+  {
+    this->mainWindow->Pause();
+    this->mainWindow->ShowLeftColumnWidget("modelEditorTab");
+  }
+  else
+  {
+    this->mainWindow->ShowLeftColumnWidget();
+    this->mainWindow->Play();
+  }
+  event::Events::setSelectedEntity("", "normal");
+  this->active = !this->active;
+  g_editModelAct->setChecked(this->active);
+}
+
+/////////////////////////////////////////////////
+void ModelEditor::OnFinish()
+{
+  this->OnEdit(g_editModelAct->isChecked());
+}
diff --git a/gazebo/gui/model/ModelEditor.hh b/gazebo/gui/model/ModelEditor.hh
new file mode 100644
index 0000000..0e19fb9
--- /dev/null
+++ b/gazebo/gui/model/ModelEditor.hh
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _MODEL_EDITOR_HH_
+#define _MODEL_EDITOR_HH_
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/gui/Editor.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class ModelEditorPalette;
+
+    /// \class ModelEditor ModelEditor.hh gui/gui.hh
+    /// \brief Interface to the terrain editor.
+    class GAZEBO_VISIBLE ModelEditor : public Editor
+    {
+      Q_OBJECT
+
+      /// \brief Constuctor.
+      /// \param[in] _mainWindow Pointer to the mainwindow.
+      public: ModelEditor(MainWindow *_mainWindow);
+
+      /// \brief Destuctor.
+      public: virtual ~ModelEditor();
+
+      /// \brief QT callback when entering building edit mode
+      /// \param[in] _checked True if the menu item is checked
+      private slots: void OnEdit(bool _checked);
+
+      /// \brief Callback when the model has been completed.
+      private: void OnFinish();
+
+      /// \brief Contains all the model editor tools.
+      private: ModelEditorPalette *modelPalette;
+
+      /// \brief True if model editor is active.
+      private: bool active;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/model/ModelEditorEvents.cc b/gazebo/gui/model/ModelEditorEvents.cc
new file mode 100644
index 0000000..4551173
--- /dev/null
+++ b/gazebo/gui/model/ModelEditorEvents.cc
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gui/model/ModelEditorEvents.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+event::EventT<void ()> model::Events::finishModel;
diff --git a/gazebo/gui/model/ModelEditorEvents.hh b/gazebo/gui/model/ModelEditorEvents.hh
new file mode 100644
index 0000000..b1cb4c5
--- /dev/null
+++ b/gazebo/gui/model/ModelEditorEvents.hh
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _MODEL_EDITOR_EVENTS_HH_
+#define _MODEL_EDITOR_EVENTS_HH_
+
+#include <string>
+#include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    namespace model
+    {
+      class GAZEBO_VISIBLE Events
+      {
+        /// \brief Connect a boost::slot to the finish model signal
+        /// \param[in] _subscriber the subscriber to this event
+        /// \return a connection
+        public: template<typename T>
+            static event::ConnectionPtr
+            ConnectFinishModel(T _subscriber)
+          { return finishModel.Connect(_subscriber); }
+
+        /// \brief Disconnect a boost::slot to the finish model signal
+        /// \param[in] _subscriber the subscriber to this event
+        public: static void DisconnectFinishModel(
+            event::ConnectionPtr _subscriber)
+          { finishModel.Disconnect(_subscriber); }
+
+        /// \brief A model has been completed and uploaded onto the server.
+        public: static event::EventT<void ()> finishModel;
+      };
+    }
+  }
+}
+#endif
diff --git a/gazebo/gui/model/ModelEditorPalette.cc b/gazebo/gui/model/ModelEditorPalette.cc
new file mode 100644
index 0000000..059e3a2
--- /dev/null
+++ b/gazebo/gui/model/ModelEditorPalette.cc
@@ -0,0 +1,462 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/UserCamera.hh"
+
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/KeyEventHandler.hh"
+#include "gazebo/gui/MouseEventHandler.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/gui/SaveDialog.hh"
+#include "gazebo/gui/model/ImportDialog.hh"
+#include "gazebo/gui/model/JointMaker.hh"
+#include "gazebo/gui/model/ModelEditorPalette.hh"
+#include "gazebo/gui/model/ModelEditorEvents.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+ModelEditorPalette::ModelEditorPalette(QWidget *_parent)
+    : QWidget(_parent)
+{
+  this->setObjectName("modelEditorPalette");
+
+  QVBoxLayout *mainLayout = new QVBoxLayout;
+
+  this->modelTreeWidget = new QTreeWidget();
+  this->modelTreeWidget->setColumnCount(1);
+  this->modelTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
+  this->modelTreeWidget->header()->hide();
+  this->modelTreeWidget->setFocusPolicy(Qt::NoFocus);
+
+  this->modelTreeWidget->setSelectionMode(QAbstractItemView::NoSelection);
+  connect(this->modelTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)),
+      this, SLOT(OnItemSelection(QTreeWidgetItem *, int)));
+
+  // Create a top-level tree item for the path
+  this->modelSettingsItem =
+    new QTreeWidgetItem(static_cast<QTreeWidgetItem*>(0),
+        QStringList(QString("Model Settings")));
+  this->modelTreeWidget->addTopLevelItem(this->modelSettingsItem);
+
+  QTreeWidgetItem *modelSettingsChildItem =
+    new QTreeWidgetItem(static_cast<QTreeWidgetItem*>(0));
+  this->modelSettingsItem->addChild(modelSettingsChildItem);
+
+  QWidget *modelSettingsWidget = new QWidget;
+  QVBoxLayout *modelSettingsLayout = new QVBoxLayout;
+  QGridLayout *dynamicsLayout = new QGridLayout;
+
+  QLabel *staticLabel = new QLabel(tr("Static:"));
+  this->staticCheck = new QCheckBox;
+  this->staticCheck->setText(tr("False"));
+  this->staticCheck->setChecked(false);
+  connect(this->staticCheck, SIGNAL(clicked()), this, SLOT(OnStatic()));
+
+  QLabel *autoDisableLabel = new QLabel(tr("Auto-disable:"));
+  this->autoDisableCheck = new QCheckBox;
+  this->autoDisableCheck->setText(tr("True"));
+  this->autoDisableCheck->setChecked(true);
+  connect(this->autoDisableCheck, SIGNAL(clicked()), this,
+      SLOT(OnAutoDisable()));
+
+  dynamicsLayout->addWidget(staticLabel, 0, 0);
+  dynamicsLayout->addWidget(this->staticCheck, 0, 1);
+  dynamicsLayout->addWidget(autoDisableLabel, 1, 0);
+  dynamicsLayout->addWidget(this->autoDisableCheck, 1, 1);
+
+  modelSettingsLayout->addLayout(dynamicsLayout);
+  modelSettingsWidget->setLayout(modelSettingsLayout);
+  this->modelTreeWidget->setItemWidget(modelSettingsChildItem, 0,
+    modelSettingsWidget);
+  this->modelSettingsItem->setExpanded(true);
+  modelSettingsChildItem->setExpanded(true);
+
+  this->modelItem =
+    new QTreeWidgetItem(static_cast<QTreeWidgetItem*>(0),
+        QStringList(QString("Parts and Joints")));
+  this->modelTreeWidget->addTopLevelItem(this->modelItem);
+
+  QTreeWidgetItem *modelChildItem =
+    new QTreeWidgetItem(static_cast<QTreeWidgetItem*>(0));
+  this->modelItem->addChild(modelChildItem);
+
+  // Parts and joints buttons
+  QWidget *modelWidget = new QWidget;
+  QVBoxLayout *modelLayout = new QVBoxLayout;
+  QGridLayout *partsLayout = new QGridLayout;
+  QLabel *partsLabel = new QLabel(tr("Parts"));
+
+  // cylinder button
+  QPushButton *cylinderButton = new QPushButton(tr("Cylinder"), this);
+  cylinderButton->setCheckable(true);
+  cylinderButton->setChecked(false);
+  connect(cylinderButton, SIGNAL(clicked()), this, SLOT(OnCylinder()));
+
+  // Sphere button
+  QPushButton *sphereButton = new QPushButton(tr("Sphere"), this);
+  sphereButton->setCheckable(true);
+  sphereButton->setChecked(false);
+  connect(sphereButton, SIGNAL(clicked()), this, SLOT(OnSphere()));
+
+  // Box button
+  QPushButton *boxButton = new QPushButton(tr("Box"), this);
+  boxButton->setCheckable(true);
+  boxButton->setChecked(false);
+  connect(boxButton, SIGNAL(clicked()), this, SLOT(OnBox()));
+
+  // Box button
+  QPushButton *customButton = new QPushButton(tr("Custom"), this);
+  customButton->setCheckable(true);
+  customButton->setChecked(false);
+  connect(customButton, SIGNAL(clicked()), this, SLOT(OnCustom()));
+
+  partsLayout->addWidget(partsLabel, 0, 0);
+  partsLayout->addWidget(cylinderButton, 1, 0);
+  partsLayout->addWidget(sphereButton, 1, 1);
+  partsLayout->addWidget(boxButton, 2, 0);
+  partsLayout->addWidget(customButton, 2, 1);
+
+  QGridLayout *jointsLayout = new QGridLayout;
+  QLabel *jointsLabel = new QLabel(tr("Joints"));
+
+  // Fixed joint button
+  QPushButton *fixedJointButton = new QPushButton(tr("Fixed"), this);
+  fixedJointButton->setCheckable(true);
+  fixedJointButton->setChecked(false);
+  connect(fixedJointButton, SIGNAL(clicked()), this, SLOT(OnFixedJoint()));
+
+  // Hinge joint button
+  QPushButton *hingeJointButton = new QPushButton(tr("Revolute"), this);
+  hingeJointButton->setCheckable(true);
+  hingeJointButton->setChecked(false);
+  connect(hingeJointButton, SIGNAL(clicked()), this, SLOT(OnHingeJoint()));
+
+  // Hinge2 joint button
+  QPushButton *hinge2JointButton = new QPushButton(tr("Revolute2"), this);
+  hinge2JointButton->setCheckable(true);
+  hinge2JointButton->setChecked(false);
+  connect(hinge2JointButton, SIGNAL(clicked()), this, SLOT(OnHinge2Joint()));
+
+  // slider joint button
+  QPushButton *sliderJointButton = new QPushButton(tr("Prismatic"), this);
+  sliderJointButton->setCheckable(true);
+  sliderJointButton->setChecked(false);
+  connect(sliderJointButton, SIGNAL(clicked()), this, SLOT(OnSliderJoint()));
+
+  // Screw joint button
+  QPushButton *screwJointButton = new QPushButton(tr("Screw"), this);
+  screwJointButton->setCheckable(true);
+  screwJointButton->setChecked(false);
+  connect(screwJointButton, SIGNAL(clicked()), this, SLOT(OnScrewJoint()));
+
+  // Universal joint button
+  QPushButton *universalJointButton = new QPushButton(tr("Universal"), this);
+  universalJointButton->setCheckable(true);
+  universalJointButton->setChecked(false);
+  connect(universalJointButton, SIGNAL(clicked()), this,
+      SLOT(OnUniversalJoint()));
+
+  // Ball joint button
+  QPushButton *ballJointButton = new QPushButton(tr("Ball"), this);
+  ballJointButton->setCheckable(true);
+  ballJointButton->setChecked(false);
+  connect(ballJointButton, SIGNAL(clicked()), this, SLOT(OnBallJoint()));
+
+  partJointsButtonGroup = new QButtonGroup;
+  this->partJointsButtonGroup->addButton(cylinderButton);
+  this->partJointsButtonGroup->addButton(sphereButton);
+  this->partJointsButtonGroup->addButton(boxButton);
+  this->partJointsButtonGroup->addButton(customButton);
+  this->partJointsButtonGroup->addButton(fixedJointButton);
+  this->partJointsButtonGroup->addButton(sliderJointButton);
+  this->partJointsButtonGroup->addButton(hingeJointButton);
+  this->partJointsButtonGroup->addButton(hinge2JointButton);
+  this->partJointsButtonGroup->addButton(screwJointButton);
+  this->partJointsButtonGroup->addButton(universalJointButton);
+  this->partJointsButtonGroup->addButton(ballJointButton);
+
+  jointsLayout->addWidget(jointsLabel, 0, 0);
+//  jointsLayout->addWidget(fixedJointButton, 1, 0);
+  jointsLayout->addWidget(sliderJointButton, 1, 0);
+  jointsLayout->addWidget(hingeJointButton, 1, 1);
+  jointsLayout->addWidget(hinge2JointButton, 2, 0);
+  jointsLayout->addWidget(screwJointButton, 2, 1);
+  jointsLayout->addWidget(universalJointButton, 3, 0);
+  jointsLayout->addWidget(ballJointButton, 3, 1);
+
+  modelLayout->addLayout(partsLayout);
+  modelLayout->addLayout(jointsLayout);
+  modelWidget->setLayout(modelLayout);
+  this->modelTreeWidget->setItemWidget(modelChildItem, 0, modelWidget);
+  this->modelItem->setExpanded(true);
+  modelChildItem->setExpanded(true);
+
+  // plugin
+  this->pluginItem =
+    new QTreeWidgetItem(static_cast<QTreeWidgetItem*>(0),
+        QStringList(QString("Plugin")));
+  // this->modelTreeWidget->addTopLevelItem(this->pluginItem);
+
+  // save buttons
+  QPushButton *discardButton = new QPushButton(tr("Discard"));
+  connect(discardButton, SIGNAL(clicked()), this, SLOT(OnDiscard()));
+
+  this->saveButton = new QPushButton(tr("Save As"));
+  connect(this->saveButton, SIGNAL(clicked()), this, SLOT(OnSave()));
+
+  QPushButton *doneButton = new QPushButton(tr("Done"));
+  connect(doneButton, SIGNAL(clicked()), this, SLOT(OnDone()));
+
+  QHBoxLayout *buttonsLayout = new QHBoxLayout;
+  buttonsLayout->addWidget(discardButton);
+  buttonsLayout->addWidget(this->saveButton);
+  buttonsLayout->addWidget(doneButton);
+  buttonsLayout->setAlignment(Qt::AlignCenter);
+
+  this->modelCreator = new ModelCreator();
+
+  connect(modelCreator->GetJointMaker(), SIGNAL(JointAdded()), this,
+      SLOT(OnJointAdded()));
+  connect(modelCreator, SIGNAL(PartAdded()), this, SLOT(OnPartAdded()));
+
+  QFrame *frame = new QFrame;
+  QVBoxLayout *frameLayout = new QVBoxLayout;
+  frameLayout->addWidget(this->modelTreeWidget, 0);
+  frameLayout->addLayout(buttonsLayout);
+  frameLayout->setContentsMargins(0, 0, 0, 0);
+  frame->setLayout(frameLayout);
+
+  mainLayout->addWidget(frame);
+
+  this->setLayout(mainLayout);
+  this->layout()->setContentsMargins(0, 0, 0, 0);
+
+  this->saved = false;
+  this->saveLocation = QDir::homePath().toStdString();
+  this->modelName = "default";
+
+  KeyEventHandler::Instance()->AddPressFilter("model_editor",
+    boost::bind(&ModelEditorPalette::OnKeyPress, this, _1));
+}
+
+/////////////////////////////////////////////////
+ModelEditorPalette::~ModelEditorPalette()
+{
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnItemSelection(QTreeWidgetItem *_item,
+                                         int /*_column*/)
+{
+  if (_item && _item->childCount() > 0)
+    _item->setExpanded(!_item->isExpanded());
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnCylinder()
+{
+  this->modelCreator->AddPart(ModelCreator::PART_CYLINDER);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnSphere()
+{
+  this->modelCreator->AddPart(ModelCreator::PART_SPHERE);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnBox()
+{
+  this->modelCreator->AddPart(ModelCreator::PART_BOX);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnCustom()
+{
+  ImportDialog importDialog;
+  importDialog.deleteLater();
+  if (importDialog.exec() == QDialog::Accepted)
+  {
+    this->modelCreator->AddCustom(importDialog.GetImportPath());
+  }
+  else
+  {
+    // this unchecks the custom button
+    this->OnPartAdded();
+  }
+}
+
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnFixedJoint()
+{
+  this->modelCreator->AddJoint(JointMaker::JOINT_FIXED);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnHingeJoint()
+{
+  this->modelCreator->AddJoint(JointMaker::JOINT_HINGE);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnHinge2Joint()
+{
+  this->modelCreator->AddJoint(JointMaker::JOINT_HINGE2);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnSliderJoint()
+{
+  this->modelCreator->AddJoint(JointMaker::JOINT_SLIDER);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnScrewJoint()
+{
+  this->modelCreator->AddJoint(JointMaker::JOINT_SCREW);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnUniversalJoint()
+{
+  this->modelCreator->AddJoint(JointMaker::JOINT_UNIVERSAL);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnBallJoint()
+{
+  this->modelCreator->AddJoint(JointMaker::JOINT_BALL);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnJointAdded()
+{
+  this->partJointsButtonGroup->setExclusive(false);
+  if (this->partJointsButtonGroup->checkedButton())
+    this->partJointsButtonGroup->checkedButton()->setChecked(false);
+  this->partJointsButtonGroup->setExclusive(true);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnPartAdded()
+{
+  this->partJointsButtonGroup->setExclusive(false);
+  if (this->partJointsButtonGroup->checkedButton())
+    this->partJointsButtonGroup->checkedButton()->setChecked(false);
+  this->partJointsButtonGroup->setExclusive(true);
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnAutoDisable()
+{
+  std::string text = this->autoDisableCheck->isChecked() ? "True" : "False";
+  this->autoDisableCheck->setText(tr(text.c_str()));
+  this->modelCreator->SetAutoDisable(this->autoDisableCheck->isChecked());
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnStatic()
+{
+  std::string text = this->staticCheck->isChecked() ? "True" : "False";
+  this->staticCheck->setText(tr(text.c_str()));
+  this->modelCreator->SetStatic(this->staticCheck->isChecked());
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnSave()
+{
+  SaveDialog saveDialog;
+  saveDialog.deleteLater();
+  saveDialog.SetTitle("Save Model");
+  saveDialog.SetSaveName(this->modelCreator->GetModelName());
+  saveDialog.SetSaveLocation(QDir::homePath().toStdString());
+  saveDialog.SetFileExtension("sdf");
+  if (saveDialog.exec() == QDialog::Accepted)
+  {
+    this->modelName = saveDialog.GetSaveName();
+    this->saveLocation = saveDialog.GetSaveLocation();
+    this->modelCreator->SetModelName(this->modelName);
+    this->modelCreator->GenerateSDF();
+    this->modelCreator->SaveToSDF(this->saveLocation);
+    this->saveButton->setText("&Save");
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnDiscard()
+{
+  int ret = QMessageBox::warning(0, QString("Discard"),
+      QString("Are you sure you want to discard\n"
+      "your model? All of your work will\n"
+      "be lost."),
+      QMessageBox::Discard | QMessageBox::Cancel,
+      QMessageBox::Cancel);
+
+  switch (ret)
+  {
+    case QMessageBox::Discard:
+      this->modelCreator->Reset();
+      this->saveButton->setText("&Save As");
+      this->saveLocation = QDir::homePath().toStdString();
+      break;
+    case QMessageBox::Cancel:
+      // Do nothing
+      break;
+    default:
+      break;
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelEditorPalette::OnDone()
+{
+  SaveDialog saveDialog;
+  saveDialog.SetTitle("Save Model");
+  saveDialog.SetSaveName(this->modelCreator->GetModelName());
+  saveDialog.SetSaveLocation(QDir::homePath().toStdString());
+  saveDialog.SetFileExtension("sdf");
+  if (saveDialog.exec() == QDialog::Accepted)
+  {
+    this->modelName = saveDialog.GetSaveName();
+    this->saveLocation = saveDialog.GetSaveLocation();
+    this->modelCreator->SetModelName(this->modelName);
+    this->modelCreator->GenerateSDF();
+    this->modelCreator->SaveToSDF(this->saveLocation);
+    this->modelCreator->FinishModel();
+    gui::model::Events::finishModel();
+  }
+}
+
+/////////////////////////////////////////////////
+bool ModelEditorPalette::OnKeyPress(const common::KeyEvent &_event)
+{
+  if (_event.key == Qt::Key_Escape)
+  {
+    // this->modelCreator->Stop();
+    // call the slots to uncheck the buttons
+    this->OnPartAdded();
+    this->OnJointAdded();
+    return true;
+  }
+  return false;
+}
diff --git a/gazebo/gui/model/ModelEditorPalette.hh b/gazebo/gui/model/ModelEditorPalette.hh
new file mode 100644
index 0000000..724c47b
--- /dev/null
+++ b/gazebo/gui/model/ModelEditorPalette.hh
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _MODEL_EDITOR_PALETTE_HH_
+#define _MODEL_EDITOR_PALETTE_HH_
+
+#include <string>
+
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/common/KeyEvent.hh"
+
+#include "gazebo/gui/model/JointMaker.hh"
+#include "gazebo/gui/model/ModelCreator.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+  }
+
+  namespace gui
+  {
+    class JointMaker;
+    class ModelCreator;
+
+    /// \addtogroup gazebo_gui
+    /// \{
+
+    /// \class ModelEditorPalette ModelEditorPalette.hh
+    /// \brief A palette of building items which can be added to the editor.
+    class GAZEBO_VISIBLE ModelEditorPalette : public QWidget
+    {
+      Q_OBJECT
+
+      /// \brief Constructor
+      /// \param[in] _parent Parent QWidget.
+      public: ModelEditorPalette(QWidget *_parent = 0);
+
+      /// \brief Destructor
+      public: ~ModelEditorPalette();
+
+      /// \brief Key event filter callback when key is pressed.
+      /// \param[in] _event The key event.
+      /// \return True if the event was handled
+      private: bool OnKeyPress(const common::KeyEvent &_event);
+
+      /// \brief Received item selection user input.
+      /// \param[in] _item Item selected.
+      /// \param[in] _column Column index.
+      private slots: void OnItemSelection(QTreeWidgetItem *_item, int _column);
+
+      /// \brief Qt callback when cylinder button is clicked.
+      private slots: void OnCylinder();
+
+      /// \brief Qt callback when sphere button is clicked.
+      private slots: void OnSphere();
+
+      /// \brief Qt callback when box button is clicked.
+      private slots: void OnBox();
+
+      /// \brief Qt callback when custom button is clicked.
+      private slots: void OnCustom();
+
+      /// \brief Qt callback when fixed joint button is clicked.
+      private slots: void OnFixedJoint();
+
+      /// \brief Qt callback when hinge joint button is clicked.
+      private slots: void OnHingeJoint();
+
+      /// \brief Qt callback when hinge2 joint button is clicked.
+      private slots: void OnHinge2Joint();
+
+      /// \brief Qt callback when slider joint button is clicked.
+      private slots: void OnSliderJoint();
+
+      /// \brief Qt callback when screw joint button is clicked.
+      private slots: void OnScrewJoint();
+
+      /// \brief Qt callback when universal joint button is clicked.
+      private slots: void OnUniversalJoint();
+
+      /// \brief Qt callback when universal joint button is clicked.
+      private slots: void OnBallJoint();
+
+      /// \brief Qt callback when a joint has been added.
+      private slots: void OnJointAdded();
+
+      /// \brief Qt callback when a part has been added.
+      private slots: void OnPartAdded();
+
+      /// \brief Qt callback when the model is to be made static.
+      private slots: void OnStatic();
+
+      /// \brief Qt callback when the model is allowed to auto disable at rest.
+      private slots: void OnAutoDisable();
+
+      /// \brief Qt callback when the model is to be saved.
+      private slots: void OnSave();
+
+      /// \brief Qt callback when the model is to be discarded.
+      private slots: void OnDiscard();
+
+      /// \brief Qt callback when model editing is complete.
+      private slots: void OnDone();
+
+      /// \brief Widget that display model properties.
+      private: QTreeWidget *modelTreeWidget;
+
+      /// \brief Model settings item in the tree widget.
+      private: QTreeWidgetItem *modelSettingsItem;
+
+      /// \brief Model parts item in the tree widget.
+      private: QTreeWidgetItem *modelItem;
+
+      /// \brief Plugin item in the tree widget.
+      private: QTreeWidgetItem *pluginItem;
+
+      /// \brief Parts and Joints button group.
+      private: QButtonGroup *partJointsButtonGroup;
+
+      /// \brief Model creator.
+      private: ModelCreator *modelCreator;
+
+      /// \brief Save button.
+      private: QPushButton *saveButton;
+
+      /// \brief Indicate whether the model has been saved before or not.
+      private: bool saved;
+
+      /// \brief Path to where the model is saved.
+      private: std::string saveLocation;
+
+      /// \brief Name of model being edited.
+      private: std::string modelName;
+
+      /// \brief Static checkbox, true to create a static model.
+      private: QCheckBox *staticCheck;
+
+      /// \brief Auto disable checkbox, true to allow model to auto-disable at
+      /// rest.
+      private: QCheckBox *autoDisableCheck;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/qt.h b/gazebo/gui/qt.h
index 1bb62b8..3589bc4 100644
--- a/gazebo/gui/qt.h
+++ b/gazebo/gui/qt.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/qt_test.h b/gazebo/gui/qt_test.h
index 64f5e16..7848ab4 100644
--- a/gazebo/gui/qt_test.h
+++ b/gazebo/gui/qt_test.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/qtpropertybrowser/CMakeLists.txt b/gazebo/gui/qtpropertybrowser/CMakeLists.txt
index eb048c0..888fff3 100644
--- a/gazebo/gui/qtpropertybrowser/CMakeLists.txt
+++ b/gazebo/gui/qtpropertybrowser/CMakeLists.txt
@@ -26,7 +26,7 @@ QT4_WRAP_CPP(headers_MOC ${qt_headers})
 QT4_ADD_RESOURCES(resources_RCC ${resources})
 
 add_library(gzqtpropertybrowser STATIC ${sources} ${headers_MOC} ${resources_RCC})
-
+set_target_properties(gzqtpropertybrowser PROPERTIES POSITION_INDEPENDENT_CODE ON)
 #set(CMAKE_PACKAGE_QTGUI TRUE)
 #
 #add_definitions( ${QT_DEFINITIONS} )
diff --git a/gazebo/gui/qtpropertybrowser/qtpropertybrowserutils.cpp b/gazebo/gui/qtpropertybrowser/qtpropertybrowserutils.cpp
index a92818b..94b635b 100644
--- a/gazebo/gui/qtpropertybrowser/qtpropertybrowserutils.cpp
+++ b/gazebo/gui/qtpropertybrowser/qtpropertybrowserutils.cpp
@@ -39,7 +39,9 @@
 #pragma GCC diagnostic ignored "-Wswitch-default"
 #pragma GCC diagnostic ignored "-Wfloat-equal"
 #pragma GCC diagnostic ignored "-Wshadow"
-
+#ifdef __clang__
+#pragma clang diagnostic ignored "-Wunused-private-field"
+#endif  // ifdef __clang__
 
 
 #include <QtGui/QApplication>
diff --git a/gazebo/gui/qtpropertybrowser/qttreepropertybrowser.cpp b/gazebo/gui/qtpropertybrowser/qttreepropertybrowser.cpp
index 9ec396a..984dfdd 100644
--- a/gazebo/gui/qtpropertybrowser/qttreepropertybrowser.cpp
+++ b/gazebo/gui/qtpropertybrowser/qttreepropertybrowser.cpp
@@ -39,6 +39,9 @@
 #pragma GCC diagnostic ignored "-Wswitch-default"
 #pragma GCC diagnostic ignored "-Wfloat-equal"
 #pragma GCC diagnostic ignored "-Wshadow"
+#ifdef __clang__
+#pragma clang diagnostic ignored "-Wunused-private-field"
+#endif  // ifdef __clang__
 
 
 
diff --git a/gazebo/gui/resources.qrc b/gazebo/gui/resources.qrc
index 3a194b4..b0d6e55 100644
--- a/gazebo/gui/resources.qrc
+++ b/gazebo/gui/resources.qrc
@@ -16,6 +16,7 @@
   <file>images/insertModel.png</file>
   <file>images/translate.png</file>
   <file>images/rotate.png</file>
+  <file>images/scale.png</file>  
   <file>images/arrow.png</file>
   <file>images/down_arrow.png</file>
   <file>images/box_selection.png</file>
diff --git a/gazebo/gui/style.qss b/gazebo/gui/style.qss
index 57b9b6f..3685290 100644
--- a/gazebo/gui/style.qss
+++ b/gazebo/gui/style.qss
@@ -1,3 +1,15 @@
+QToolButton
+{
+  border: 0;
+  text-align: left;
+  color: #d0d0d0;
+}
+
+QToolButton::disabled
+{
+  color: #303030;
+}
+
 QLabel
 {
   color: #d0d0d0;
@@ -75,6 +87,11 @@ QMenuBar::item:selected
   color: #f58113;
 }
 
+QMenuBar::item:disabled
+{
+  color: #5f5f5f;
+}
+
 QMenu
 {
   color: #d0d0d0;
@@ -101,12 +118,17 @@ QToolBar
   border-radius: 0px;
 }
 
+QToolBar#playToolBar
+{
+  max-height: 25px;
+}
+
 QToolButton
 {
   padding: 2px;
   margin: 2px;
   width: 20px;
-
+  height: 24px;
   border-radius: 8px;
   border: 0px solid #808080;
 }
@@ -240,7 +262,7 @@ QSpinBox
   color: #353535;
   background: #737373;
   border-radius: 4;
-  margin-right: 20px;  
+  margin-right: 20px;
 }
 
 QSpinBox::up-button
@@ -324,12 +346,19 @@ QDoubleSpinBox::down-button:pressed
 
 QPushButton
 {
-  color: #d0d0d0;
-  padding: 2px;
-  margin: 2px;
+  /*
   border: 2px outset #727272;
   border-radius: 4px;
   background: #737373;
+  */
+
+  color: #d0d0d0;
+  border: 2px solid #737373;
+  border-radius: 0px;
+  selection-color: transparent;
+  padding: 2px;
+  margin: 2px;
+  background: #505050;
 }
 
 QPushButton:hover
@@ -337,9 +366,15 @@ QPushButton:hover
   color: #f58113;
 }
 
+QPushButton:checked
+{
+  color: #f58113;
+  border: 2px solid #f58113;
+}
+
 QPushButton:pressed
 {
-  border: 2px inset #727272;
+  border: 2px solid #f58113;
 }
 
 QPushButton:!enabled
@@ -347,9 +382,9 @@ QPushButton:!enabled
   padding: 2px;
   margin: 2px;
   color: #909090;
-  border: 2px solid #707070;
   background: #707070;
-  border-radius: 4px;
+  /* border: 2px solid #707070; */
+  /* border-radius: 4px; */
 }
 
 QScrollBar:vertical
@@ -512,7 +547,10 @@ QTabBar::tab:!selected
 }
 
 QTabWidget#mainTab::pane,
-QTabWidget#buildingEditorTab::pane
+QTabWidget#buildingEditorTab::pane,
+QTabWidget#modelEditorTab::pane,
+QTabWidget#terrainEditorTab::pane,
+QTabWidget#partInspectorTab::pane
 {
   border-left: 1px solid #101010;
   border-bottom: 1px solid #101010;
@@ -539,6 +577,7 @@ QTabWidget::tab
 
 QTabWidget::tab-bar
 {
+  alignment: left;
 }
 
 QWidget#modelList,
@@ -549,10 +588,10 @@ QWidget#toolsWidget
   color: #d0d0d0;
 }
 
-
 QWidget#modelList > QFrame,
 QWidget#insertModel > QFrame,
 QWidget#jointControl > QFrame,
+QWidget#modelEditorPalette > QFrame,
 QWidget#toolsWidget > QFrame
 {
   padding: 4px;
@@ -573,7 +612,9 @@ QWidget#renderWidget > QWidget
   margin-right: 0px;
 }
 
-QWidget#buildingEditorWidget > QWidget
+QWidget#buildingEditorWidget > QWidget,
+QWidget#modelEditorWidget > QWidget
+QWidget#terrainEditorWidget > QWidget
 {
   padding: 2px;
   background-color: #808080;
@@ -601,6 +642,7 @@ QWidget#renderBottomFrame
 
 QWidget#timePanel
 {
+  max-height: 40px;
   background-color: #808080;
   border-bottom-right-radius: 10px;
 }
@@ -702,4 +744,3 @@ QwtScaleWidget
   color: white;
   font-size: 11px;
 }
-
diff --git a/gazebo/gui/terrain/CMakeLists.txt b/gazebo/gui/terrain/CMakeLists.txt
new file mode 100644
index 0000000..3965fa3
--- /dev/null
+++ b/gazebo/gui/terrain/CMakeLists.txt
@@ -0,0 +1,26 @@
+include (${gazebo_cmake_dir}/GazeboUtils.cmake)
+include (${QT_USE_FILE})
+
+set (sources
+  TerrainEditor.cc
+  TerrainEditorPalette.cc
+)
+
+set (qt_headers
+  TerrainEditor.hh
+  TerrainEditorPalette.hh
+)
+
+set (headers
+)
+
+set (resources ../resources.qrc)
+QT4_WRAP_CPP(headers_MOC ${qt_headers})
+QT4_ADD_RESOURCES(resources_RCC ${resources})
+
+add_library(gazebo_gui_terrain STATIC ${sources} ${headers_MOC}
+  ${headers} ${resources_RCC})
+
+set_target_properties(gazebo_gui_terrain PROPERTIES POSITION_INDEPENDENT_CODE ON)
+add_dependencies(gazebo_gui_terrain gazebo_msgs)
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
diff --git a/gazebo/gui/terrain/TerrainEditor.cc b/gazebo/gui/terrain/TerrainEditor.cc
new file mode 100644
index 0000000..2893e2f
--- /dev/null
+++ b/gazebo/gui/terrain/TerrainEditor.cc
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/gui/Actions.hh"
+#include "gazebo/gui/MainWindow.hh"
+
+#include "gazebo/gui/terrain/TerrainEditorPalette.hh"
+#include "gazebo/gui/terrain/TerrainEditor.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+TerrainEditor::TerrainEditor(MainWindow *_mainWindow)
+  : Editor(_mainWindow)
+{
+  // Create the terrain editor tab
+  this->terrainPalette = new TerrainEditorPalette;
+  this->Init("terrainEditorTab", "Terrain Editor", this->terrainPalette);
+
+  connect(g_editTerrainAct, SIGNAL(toggled(bool)), this, SLOT(OnEdit(bool)));
+}
+
+/////////////////////////////////////////////////
+TerrainEditor::~TerrainEditor()
+{
+}
+
+/////////////////////////////////////////////////
+void TerrainEditor::OnEdit(bool _checked)
+{
+  if (_checked)
+  {
+    this->mainWindow->Pause();
+    this->mainWindow->ShowLeftColumnWidget("terrainEditorTab");
+  }
+  else
+  {
+    this->mainWindow->ShowLeftColumnWidget();
+    this->mainWindow->Play();
+  }
+}
diff --git a/gazebo/gui/terrain/TerrainEditor.hh b/gazebo/gui/terrain/TerrainEditor.hh
new file mode 100644
index 0000000..9e16fdb
--- /dev/null
+++ b/gazebo/gui/terrain/TerrainEditor.hh
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _TERRAIN_EDITOR_HH_
+#define _TERRAIN_EDITOR_HH_
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/gui/Editor.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class TerrainEditorPalette;
+
+    /// \class TerrainEditor TerrainEditor.hh gui/gui.hh
+    /// \brief Interface to the terrain editor.
+    class GAZEBO_VISIBLE TerrainEditor : public Editor
+    {
+      Q_OBJECT
+
+      /// \brief Constuctor.
+      /// \param[in] _mainWindow Pointer to the mainwindow.
+      public: TerrainEditor(MainWindow *_mainWindow);
+
+      /// \brief Destuctor.
+      public: virtual ~TerrainEditor();
+
+      /// \brief QT callback when entering building edit mode
+      /// \param[in] _checked True if the menu item is checked
+      private slots: void OnEdit(bool _checked);
+
+      /// \brief Contains all the terrain editor tools.
+      private: TerrainEditorPalette *terrainPalette;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/terrain/TerrainEditorPalette.cc b/gazebo/gui/terrain/TerrainEditorPalette.cc
new file mode 100644
index 0000000..89acc0b
--- /dev/null
+++ b/gazebo/gui/terrain/TerrainEditorPalette.cc
@@ -0,0 +1,462 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/rendering/Heightmap.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/UserCamera.hh"
+
+#include "gazebo/gui/GuiIface.hh"
+#include "gazebo/gui/MouseEventHandler.hh"
+#include "gazebo/gui/GuiEvents.hh"
+#include "gazebo/gui/terrain/TerrainEditorPalette.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+TerrainEditorPalette::TerrainEditorPalette(QWidget *_parent)
+    : QWidget(_parent)
+{
+  QVBoxLayout *mainLayout = new QVBoxLayout;
+
+  // Create the button to raise terrain
+  QPushButton *raiseButton = new QPushButton("Raise", this);
+  raiseButton->setStatusTip(tr("Left-mouse press to raise terrain."));
+  raiseButton->setCheckable(true);
+  raiseButton->setChecked(false);
+  connect(raiseButton, SIGNAL(toggled(bool)), this, SLOT(OnRaise(bool)));
+
+  // Create the button to lower terrain
+  QPushButton *lowerButton = new QPushButton("Lower", this);
+  lowerButton->setStatusTip(tr("Left-mouse press to lower terrain."));
+  lowerButton->setCheckable(true);
+  lowerButton->setChecked(false);
+  connect(lowerButton, SIGNAL(toggled(bool)), this, SLOT(OnLower(bool)));
+
+  // Create the button to flatten terrain
+  QPushButton *flattenButton = new QPushButton("Flatten", this);
+  flattenButton->setStatusTip(tr("Left-mouse press to flatten terrain."));
+  flattenButton->setCheckable(true);
+  flattenButton->setChecked(false);
+  connect(flattenButton, SIGNAL(toggled(bool)), this, SLOT(OnFlatten(bool)));
+
+  // Create the button to roughen terrain
+  QPushButton *heightButton = new QPushButton("Pick Height", this);
+  heightButton->setStatusTip(
+      tr("Left-mouse press to select a terrain height."));
+  heightButton->setCheckable(true);
+  heightButton->setChecked(false);
+  connect(heightButton, SIGNAL(toggled(bool)), this, SLOT(OnPickHeight(bool)));
+
+  QButtonGroup *buttonGroup = new QButtonGroup;
+  buttonGroup->addButton(raiseButton);
+  buttonGroup->addButton(lowerButton);
+  buttonGroup->addButton(flattenButton);
+  buttonGroup->addButton(heightButton);
+
+  // Create the layout to hold all the buttons
+  QGridLayout *buttonLayout = new QGridLayout;
+  buttonLayout->addWidget(raiseButton, 0, 0);
+  buttonLayout->addWidget(lowerButton, 0, 1);
+  buttonLayout->addWidget(flattenButton, 1, 0);
+  buttonLayout->addWidget(heightButton, 1, 1);
+
+  // Add a save button
+  QPushButton *saveButton = new QPushButton("Save Image", this);
+  saveButton->setStatusTip(tr("Save terrain as a PNG."));
+  connect(saveButton, SIGNAL(clicked()), this, SLOT(OnSave()));
+
+  // Create a slider to control the outer size of the brush
+  this->outsideRadiusSlider = new QSlider(this);
+  this->outsideRadiusSlider->setRange(1, 100000);
+  this->outsideRadiusSlider->setTickInterval(1);
+  this->outsideRadiusSlider->setOrientation(Qt::Horizontal);
+  this->outsideRadiusSlider->setValue(10);
+  connect(this->outsideRadiusSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnOutsideRadiusSlider(int)));
+
+  this->outsideRadiusSpin = new QDoubleSpinBox(this);
+  this->outsideRadiusSpin->setRange(0, 1.0);
+  this->outsideRadiusSpin->setSingleStep(0.001);
+  this->outsideRadiusSpin->setDecimals(3);
+  connect(this->outsideRadiusSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnOutsideRadiusSpin(double)));
+
+  // Create a layout to hold the outer brush size slider and its label
+  QHBoxLayout *outsideRadiusSpinLayout = new QHBoxLayout;
+  outsideRadiusSpinLayout->addWidget(new QLabel(tr("Outside radius: ")));
+  outsideRadiusSpinLayout->addStretch(2);
+  outsideRadiusSpinLayout->addWidget(this->outsideRadiusSpin);
+
+  QVBoxLayout *outsideRadiusLayout = new QVBoxLayout;
+  outsideRadiusLayout->addLayout(outsideRadiusSpinLayout);
+  outsideRadiusLayout->addWidget(this->outsideRadiusSlider);
+
+
+  // Create a slider to control the inner size of the brush
+  this->insideRadiusSlider = new QSlider(this);
+  this->insideRadiusSlider->setRange(0, 100000);
+  this->insideRadiusSlider->setTickInterval(1);
+  this->insideRadiusSlider->setOrientation(Qt::Horizontal);
+  this->insideRadiusSlider->setValue(10);
+  connect(this->insideRadiusSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnInsideRadiusSlider(int)));
+
+  this->insideRadiusSpin = new QDoubleSpinBox(this);
+  this->insideRadiusSpin->setRange(0, 1.0);
+  this->insideRadiusSpin->setSingleStep(0.001);
+  this->insideRadiusSpin->setDecimals(3);
+  connect(this->insideRadiusSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnInsideRadiusSpin(double)));
+
+  // Create a layout to hold the inner brush size slider and its label
+  QHBoxLayout *insideRadiusSpinLayout = new QHBoxLayout;
+  insideRadiusSpinLayout->addWidget(new QLabel(tr("Inside radius: ")));
+  insideRadiusSpinLayout->addStretch(2);
+  insideRadiusSpinLayout->addWidget(this->insideRadiusSpin);
+
+  QVBoxLayout *insideRadiusLayout = new QVBoxLayout;
+  insideRadiusLayout->addLayout(insideRadiusSpinLayout);
+  insideRadiusLayout->addWidget(this->insideRadiusSlider);
+
+  // Create a slider to control the weight of the brush
+  this->weightSlider = new QSlider(this);
+  this->weightSlider->setRange(1, 10000);
+  this->weightSlider->setTickInterval(1);
+  this->weightSlider->setOrientation(Qt::Horizontal);
+  this->weightSlider->setValue(10);
+  connect(this->weightSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnWeightSlider(int)));
+
+  this->weightSpin = new QDoubleSpinBox(this);
+  this->weightSpin->setRange(.01, 1.0);
+  this->weightSpin->setSingleStep(.1);
+  connect(this->weightSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnWeightSpin(double)));
+
+
+  // Create a layout to hold the brush weight slider and its label
+  QHBoxLayout *weightSpinLayout = new QHBoxLayout;
+  weightSpinLayout->addWidget(new QLabel(tr("Weight: ")));
+  weightSpinLayout->addStretch(2);
+  weightSpinLayout->addWidget(this->weightSpin);
+
+  QVBoxLayout *weightLayout = new QVBoxLayout;
+  weightLayout->addLayout(weightSpinLayout);
+  weightLayout->addWidget(this->weightSlider);
+
+
+  // Create a slider to control the weight of the brush
+  this->heightSlider = new QSlider(this);
+  this->heightSlider->setRange(1, 100);
+  this->heightSlider->setTickInterval(1);
+  this->heightSlider->setOrientation(Qt::Horizontal);
+  this->heightSlider->setValue(10);
+  connect(this->heightSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnHeightSlider(int)));
+
+  this->heightSpin = new QDoubleSpinBox(this);
+  connect(this->heightSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnHeightSpin(double)));
+
+  // Create a layout to hold the brush height slider and its label
+  QHBoxLayout *heightSpinLayout = new QHBoxLayout;
+  heightSpinLayout->addWidget(new QLabel(tr("Height: ")));
+  heightSpinLayout->addStretch(2);
+  heightSpinLayout->addWidget(this->heightSpin);
+
+  QVBoxLayout *heightLayout = new QVBoxLayout;
+  heightLayout->setContentsMargins(0, 0, 0, 0);
+  heightLayout->addLayout(heightSpinLayout);
+  heightLayout->addWidget(this->heightSlider);
+
+
+  // Add all the layouts and widgets to the main layout
+  mainLayout->addLayout(buttonLayout);
+  mainLayout->addLayout(outsideRadiusLayout);
+  mainLayout->addLayout(insideRadiusLayout);
+  mainLayout->addLayout(weightLayout);
+  mainLayout->addLayout(heightLayout);
+  mainLayout->addStretch(1);
+  mainLayout->addWidget(saveButton);
+
+  mainLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
+
+  this->setObjectName("terrainEditorPalette");
+  this->setLayout(mainLayout);
+}
+
+/////////////////////////////////////////////////
+TerrainEditorPalette::~TerrainEditorPalette()
+{
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnRaise(bool _toggle)
+{
+  this->SetState(_toggle ? "raise" : std::string());
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnLower(bool _toggle)
+{
+  this->SetState(_toggle ? "lower" : std::string());
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnFlatten(bool _toggle)
+{
+  this->SetState(_toggle ? "flatten" : std::string());
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnPickHeight(bool /*_toggle*/)
+{
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::SetState(const std::string &_state)
+{
+  if (!_state.empty())
+  {
+    this->state = _state;
+
+    // Add an event filter, which allows the TerrainEditor to capture
+    // mouse events.
+    MouseEventHandler::Instance()->AddPressFilter("terrain",
+        boost::bind(&TerrainEditorPalette::OnMousePress, this, _1));
+
+    MouseEventHandler::Instance()->AddMoveFilter("terrain",
+        boost::bind(&TerrainEditorPalette::OnMouseMove, this, _1));
+  }
+  else
+  {
+    this->state.clear();
+
+    // Remove the event filters.
+    MouseEventHandler::Instance()->RemovePressFilter("terrain");
+    MouseEventHandler::Instance()->RemoveMoveFilter("terrain");
+  }
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnSave()
+{
+  // Get the active camera and scene.
+  rendering::UserCameraPtr camera = gui::get_active_camera();
+  rendering::ScenePtr scene = camera->GetScene();
+
+  // Get a pointer to the heightmap, if the scen is valid.
+  rendering::Heightmap *heightmap = scene ? scene->GetHeightmap() : NULL;
+  common::Image img = heightmap->GetImage();
+
+  // Get a filename to save to.
+  std::string filename = QFileDialog::getSaveFileName(this,
+      tr("Save Heightmap"), QString(),
+      tr("PNG Files (*.png)")).toStdString();
+
+  // Return if the user has canceled.
+  if (filename.empty())
+    return;
+
+  img.SavePNG(filename);
+}
+
+/////////////////////////////////////////////////
+bool TerrainEditorPalette::OnMousePress(const common::MouseEvent &_event)
+{
+  if (_event.button != common::MouseEvent::LEFT)
+    return false;
+
+  bool handled = false;
+
+  // Get the active camera and scene.
+  rendering::UserCameraPtr camera = gui::get_active_camera();
+  rendering::ScenePtr scene = camera->GetScene();
+
+  // Get a pointer to the heightmap, if the scen is valid.
+  rendering::Heightmap *heightmap = scene ? scene->GetHeightmap() : NULL;
+
+  // Only try to modify if the heightmap exists, and the LEFT mouse button
+  // was used.
+  if (heightmap && !_event.shift)
+  {
+    handled = this->Apply(_event, camera, heightmap);
+    QApplication::setOverrideCursor(QCursor(Qt::CrossCursor));
+  }
+  else
+    QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor));
+
+  return handled;
+}
+
+/////////////////////////////////////////////////
+bool TerrainEditorPalette::OnMouseMove(const common::MouseEvent &_event)
+{
+  if (_event.button != common::MouseEvent::LEFT)
+    return false;
+
+  bool handled = false;
+
+  // Get the active camera and scene.
+  rendering::UserCameraPtr camera = gui::get_active_camera();
+  rendering::ScenePtr scene = camera->GetScene();
+
+  // Get a pointer to the heightmap, if the scen is valid.
+  rendering::Heightmap *heightmap = scene ? scene->GetHeightmap() : NULL;
+
+  if (heightmap && !_event.shift)
+  {
+    if (_event.dragging)
+      handled = this->Apply(_event, camera, heightmap);
+    QApplication::setOverrideCursor(QCursor(Qt::CrossCursor));
+  }
+  else
+    QApplication::setOverrideCursor(QCursor(Qt::ArrowCursor));
+
+  return handled;
+}
+
+/////////////////////////////////////////////////
+bool TerrainEditorPalette::Apply(const common::MouseEvent &_event,
+    rendering::CameraPtr _camera, rendering::Heightmap *_heightmap)
+{
+  bool handled = false;
+
+  // Get the brush weight and size from the sliders.
+  double weight = this->weightSpin->value();
+  double outsideRadius = this->outsideRadiusSpin->value() / 10.0;
+  double insideRadius = this->insideRadiusSpin->value() / 10.0;
+
+  if (this->state == "lower")
+    handled = _heightmap->Lower(_camera, _event.pos, outsideRadius,
+        insideRadius, weight);
+  else if (this->state == "raise")
+    handled = _heightmap->Raise(_camera, _event.pos, outsideRadius,
+        insideRadius, weight);
+  else if (this->state == "flatten")
+    handled = _heightmap->Flatten(_camera, _event.pos, outsideRadius,
+        insideRadius, weight);
+  else if (this->state == "smooth")
+    handled = _heightmap->Smooth(_camera, _event.pos, outsideRadius,
+        insideRadius, weight);
+
+  return handled;
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnOutsideRadiusSpin(double _value)
+{
+  disconnect(this->outsideRadiusSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnOutsideRadiusSlider(int)));
+
+  this->outsideRadiusSlider->setValue(
+      static_cast<int>(rint(_value * this->outsideRadiusSlider->maximum())));
+
+  connect(this->outsideRadiusSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnOutsideRadiusSlider(int)));
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnOutsideRadiusSlider(int _value)
+{
+  disconnect(this->outsideRadiusSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnOutsideRadiusSpin(double)));
+
+  this->outsideRadiusSpin->setValue(_value /
+      static_cast<double>(this->outsideRadiusSlider->maximum()));
+
+  connect(this->outsideRadiusSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnOutsideRadiusSpin(double)));
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnInsideRadiusSpin(double _value)
+{
+  disconnect(this->insideRadiusSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnInsideRadiusSlider(int)));
+
+  this->insideRadiusSlider->setValue(
+      static_cast<int>(rint(_value * this->insideRadiusSlider->maximum())));
+
+  connect(this->insideRadiusSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnInsideRadiusSlider(int)));
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnInsideRadiusSlider(int _value)
+{
+  disconnect(this->insideRadiusSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnInsideRadiusSpin(double)));
+
+
+  this->insideRadiusSpin->setValue(_value /
+      static_cast<double>(this->insideRadiusSlider->maximum()));
+
+  connect(this->insideRadiusSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnInsideRadiusSpin(double)));
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnWeightSpin(double _value)
+{
+  disconnect(this->weightSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnWeightSlider(int)));
+
+  this->weightSlider->setValue(
+      static_cast<int>(rint(_value * this->weightSlider->maximum())));
+
+  connect(this->weightSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnWeightSlider(int)));
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnWeightSlider(int _value)
+{
+  disconnect(this->weightSpin, SIGNAL(valueChanged(double)),
+             this, SLOT(OnWeightSpin(double)));
+
+  this->weightSpin->setValue(_value /
+      static_cast<double>(this->weightSlider->maximum()));
+
+  connect(this->weightSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnWeightSpin(double)));
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnHeightSpin(double _value)
+{
+  disconnect(this->heightSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnHeightSlider(int)));
+
+  this->heightSlider->setValue(static_cast<int>(rint(_value)));
+
+  connect(this->heightSlider, SIGNAL(valueChanged(int)),
+      this, SLOT(OnHeightSlider(int)));
+}
+
+/////////////////////////////////////////////////
+void TerrainEditorPalette::OnHeightSlider(int _value)
+{
+  disconnect(this->heightSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnHeightSpin(double)));
+
+  this->heightSpin->setValue(_value / 10.0);
+
+  connect(this->heightSpin, SIGNAL(valueChanged(double)),
+      this, SLOT(OnHeightSpin(double)));
+}
diff --git a/gazebo/gui/terrain/TerrainEditorPalette.hh b/gazebo/gui/terrain/TerrainEditorPalette.hh
new file mode 100644
index 0000000..b544e97
--- /dev/null
+++ b/gazebo/gui/terrain/TerrainEditorPalette.hh
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _TERRAIN_EDITOR_PALETTE_HH_
+#define _TERRAIN_EDITOR_PALETTE_HH_
+
+#include <string>
+
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/common/MouseEvent.hh"
+#include "gazebo/gui/qt.h"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    class Heightmap;
+  }
+
+  namespace gui
+  {
+    /// \addtogroup gazebo_gui
+    /// \{
+
+    /// \class TerrainEditorPalette TerrainEditorPalette.hh
+    /// \brief A palette of building items which can be added to the editor.
+    class GAZEBO_VISIBLE TerrainEditorPalette : public QWidget
+    {
+      Q_OBJECT
+
+      /// \brief Constructor
+      /// \param[in] _parent Parent QWidget.
+      public: TerrainEditorPalette(QWidget *_parent = 0);
+
+      /// \brief Destructor
+      public: ~TerrainEditorPalette();
+
+      /// \brief Mouse event filter callback when mouse button is pressed.
+      /// \param[in] _event The mouse event.
+      /// \return True if the brush was applied
+      private: bool OnMousePress(const common::MouseEvent &_event);
+
+      /// \brief Mouse event filter callback when mouse is moved.
+      /// \param[in] _event The mouse event.
+      /// \return True if the brush was applied
+      private: bool OnMouseMove(const common::MouseEvent &_event);
+
+      /// \brief Apply a brush
+      /// \param[in] _event The mouse event.
+      /// \param[in] _camera Active camera.
+      /// \param[in] _heightmap Heightmap on which to apply the modification.
+      /// \return True if the brush was applied
+      private: bool Apply(const common::MouseEvent &_event,
+                   rendering::CameraPtr _camera,
+                   rendering::Heightmap *_heightmap);
+
+      /// \brief Set the current state.
+      /// \param[in] _state String state(lower, raise, flatten ...). Empty
+      /// string to disable terrain modification.
+      private: void SetState(const std::string &_state);
+
+      /// \brief QT callback when Raise button is toggled.
+      /// \param[in] _toggle True if the button is enabled.
+      private slots: void OnRaise(bool _toggle);
+
+      /// \brief QT callback when Lower button is toggled.
+      /// \param[in] _toggle True if the button is enabled.
+      private slots: void OnLower(bool _toggle);
+
+      /// \brief QT callback when Flatten button is toggled.
+      /// \param[in] _toggle True if the button is enabled.
+      private slots: void OnFlatten(bool _toggle);
+
+      /// \brief QT callback when pick height button is toggled.
+      /// \param[in] _toggle True if the button is enabled.
+      private slots: void OnPickHeight(bool _toggle);
+
+      /// \brief QT callback when image is saved.
+      private slots: void OnSave();
+
+      /// \brief QT callback, when outside radius spin box is modified.
+      /// \param[in] _value The new value.
+      private slots: void OnOutsideRadiusSpin(double _value);
+
+      /// \brief QT callback, when outside radius slider is modified.
+      /// \param[in] _value The new value.
+      private slots: void OnOutsideRadiusSlider(int _value);
+
+      /// \brief QT callback, when inside radius spin box is modified.
+      /// \param[in] _value The new value.
+      private slots: void OnInsideRadiusSpin(double _value);
+
+      /// \brief QT callback, when inside radius slider is modified.
+      /// \param[in] _value The new value.
+      private slots: void OnInsideRadiusSlider(int _value);
+
+      /// \brief QT callback, when weight spin box is modified.
+      /// \param[in] _value The new value.
+      private slots: void OnWeightSpin(double _value);
+
+      /// \brief QT callback, when weight slider is modified.
+      /// \param[in] _value The new value.
+      private slots: void OnWeightSlider(int _value);
+
+      /// \brief QT callback, when height spin box is modified.
+      /// \param[in] _value The new value.
+      private slots: void OnHeightSpin(double _value);
+
+      /// \brief QT callback, when height slider is modified.
+      /// \param[in] _value The new value.
+      private slots: void OnHeightSlider(int _value);
+
+      /// \brief Spin to control the outside size of the brush.
+      private: QDoubleSpinBox *outsideRadiusSpin;
+
+      /// \brief Slider to control the outside size of the brush.
+      private: QSlider *outsideRadiusSlider;
+
+      /// \brief Spin to control the inside size of the brush.
+      private: QDoubleSpinBox *insideRadiusSpin;
+
+      /// \brief Slider to control the inside size of the brush.
+      private: QSlider *insideRadiusSlider;
+
+      /// \brief Spin to control the weight of the brush.
+      private: QDoubleSpinBox *weightSpin;
+
+      /// \brief Slider to control the weight of the brush.
+      private: QSlider *weightSlider;
+
+      /// \brief Spin to control the weight of the brush.
+      private: QDoubleSpinBox *heightSpin;
+
+      /// \brief Slider to control the weight of the brush.
+      private: QSlider *heightSlider;
+
+      /// \brief The current brush state.
+      private: std::string state;
+    };
+  }
+}
+#endif
diff --git a/gazebo/gui/viewers/CMakeLists.txt b/gazebo/gui/viewers/CMakeLists.txt
new file mode 100644
index 0000000..7c5814c
--- /dev/null
+++ b/gazebo/gui/viewers/CMakeLists.txt
@@ -0,0 +1,51 @@
+include (${gazebo_cmake_dir}/GazeboUtils.cmake)
+include ( ${QT_USE_FILE} )
+
+
+set (sources
+  ImageFrame.cc
+  ImageView.cc
+  ImagesView.cc
+  LaserView.cc
+  TopicView.cc
+  TextView.cc
+  ViewFactory.cc
+)
+
+set (headers
+  ViewFactory.hh
+)
+
+set (qt_headers
+  ImageFrame.hh
+  ImageView.hh
+  ImagesView.hh
+  LaserView.hh
+  TextView.hh
+  TopicView.hh
+)
+
+set (qt_tests
+  ImagesView_TEST.cc
+)
+
+# Generate executables for each of the QT unit tests
+gz_build_qt_tests(${qt_tests})
+
+set (resources ../resources.qrc)
+QT4_WRAP_CPP(headers_MOC ${qt_headers})
+QT4_ADD_RESOURCES(resources_RCC ${resources})
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+gz_add_library(gazebo_gui_viewers ${sources}
+  ${headers_MOC} ${headers} ${resources_RCC})
+
+target_link_libraries(gazebo_gui_viewers
+  gazebo_common
+  gazebo_transport
+  gazebo_rendering
+  gazebo_msgs
+  ${QT_LIBRARIES})
+
+gz_install_library(gazebo_gui_viewers)
diff --git a/gazebo/gui/viewers/ImageFrame.cc b/gazebo/gui/viewers/ImageFrame.cc
new file mode 100644
index 0000000..323a10d
--- /dev/null
+++ b/gazebo/gui/viewers/ImageFrame.cc
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "gazebo/common/Image.hh"
+#include "gazebo/gui/viewers/ImageFramePrivate.hh"
+#include "gazebo/gui/viewers/ImageFrame.hh"
+
+using namespace gazebo;
+using namespace gui;
+
+/////////////////////////////////////////////////
+ImageFrame::ImageFrame(QWidget *_parent)
+  : QFrame(_parent), dataPtr(new ImageFramePrivate())
+{
+}
+
+/////////////////////////////////////////////////
+ImageFrame::~ImageFrame()
+{
+  delete this->dataPtr;
+  this->dataPtr = NULL;
+}
+
+/////////////////////////////////////////////////
+void ImageFrame::paintEvent(QPaintEvent * /*_event*/)
+{
+  QPainter painter(this);
+  boost::mutex::scoped_lock lock(this->dataPtr->mutex);
+
+  if (!this->dataPtr->image.isNull())
+  {
+    painter.drawImage(this->contentsRect(), this->dataPtr->image);
+  }
+  else
+  {
+    // default image with gradient
+    QLinearGradient gradient(0, 0, this->frameRect().width(),
+        this->frameRect().height());
+    gradient.setColorAt(0, Qt::white);
+    gradient.setColorAt(1, Qt::black);
+    painter.setBrush(gradient);
+    painter.drawRect(0, 0, this->frameRect().width()
+        + 1, this->frameRect().height() + 1);
+  }
+}
+
+/////////////////////////////////////////////////
+void ImageFrame::OnImage(const msgs::Image &_msg)
+{
+  unsigned char *rgbData = NULL;
+  unsigned int rgbDataSize = 0;
+
+  // Convert the image data to RGB
+  common::Image img;
+  img.SetFromData(
+      (unsigned char *)(_msg.data().c_str()),
+      _msg.width(), _msg.height(),
+      (common::Image::PixelFormat)(_msg.pixel_format()));
+
+  img.GetRGBData(&rgbData, rgbDataSize);
+
+  if (_msg.width() != static_cast<unsigned int>(this->dataPtr->image.width()) ||
+      _msg.height() != static_cast<unsigned int>(this->dataPtr->image.height()))
+  {
+    QImage qimage(_msg.width(), _msg.height(), QImage::Format_RGB888);
+    this->dataPtr->image = qimage.copy();
+  }
+
+  // Store the image data
+  memcpy(this->dataPtr->image.bits(), rgbData, rgbDataSize);
+  boost::mutex::scoped_lock lock(this->dataPtr->mutex);
+
+  this->update();
+  delete [] rgbData;
+}
diff --git a/gazebo/gui/viewers/ImageFrame.hh b/gazebo/gui/viewers/ImageFrame.hh
new file mode 100644
index 0000000..0907c25
--- /dev/null
+++ b/gazebo/gui/viewers/ImageFrame.hh
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _IMAGEFRAME_HH_
+#define _IMAGEFRAME_HH_
+
+#include "gazebo/gui/qt.h"
+#include "gazebo/msgs/msgs.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class ImageFramePrivate;
+
+    /// \brief Frame that draws an image when a paintevent is received.
+    class ImageFrame : public QFrame
+    {
+      Q_OBJECT
+
+      /// \brief Constructor
+      /// \param[in] _parent Parent Qt widget
+      public: ImageFrame(QWidget *_parent);
+
+      /// \brief Destructor
+      public: virtual ~ImageFrame();
+
+      /// \brief Receives incoming image messages.
+      /// \param[in] _msg New image message.
+      public: void OnImage(const msgs::Image &_msg);
+
+      /// \brief Event used to paint the image.
+      /// \param[in] _event Pointer to the event information.
+      protected: void paintEvent(QPaintEvent *_event);
+
+      /// \brief Pointer to private data
+      private: ImageFramePrivate *dataPtr;
+    };
+  }
+}
+
+#endif
diff --git a/gazebo/gui/viewers/ImageFramePrivate.hh b/gazebo/gui/viewers/ImageFramePrivate.hh
new file mode 100644
index 0000000..a18c0f0
--- /dev/null
+++ b/gazebo/gui/viewers/ImageFramePrivate.hh
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _IMAGEFRAME_PRIVATE_HH_
+#define _IMAGEFRAME_PRIVATE_HH_
+
+#include <boost/thread/mutex.hpp>
+#include "gazebo/gui/qt.h"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class ImageFramePrivate
+    {
+      /// \brief The image to draw.
+      public: QImage image;
+
+      /// \brief Mutex for protecting the image.
+      public: boost::mutex mutex;
+    };
+  }
+}
+
+#endif
diff --git a/gazebo/gui/viewers/ImageView.cc b/gazebo/gui/viewers/ImageView.cc
index fa3a6e5..011f3d5 100644
--- a/gazebo/gui/viewers/ImageView.cc
+++ b/gazebo/gui/viewers/ImageView.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,13 +14,14 @@
  * limitations under the License.
  *
  */
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Node.hh"
 #include "gazebo/transport/Publisher.hh"
 
 #include "gazebo/common/Image.hh"
 
 #include "gazebo/gui/viewers/ViewFactory.hh"
+#include "gazebo/gui/viewers/ImageViewPrivate.hh"
 #include "gazebo/gui/viewers/ImageView.hh"
 
 using namespace gazebo;
@@ -30,40 +31,29 @@ GZ_REGISTER_STATIC_VIEWER("gazebo.msgs.ImageStamped", ImageView)
 
 /////////////////////////////////////////////////
 ImageView::ImageView(QWidget *_parent)
-: TopicView(_parent, "gazebo.msgs.ImageStamped", "image", 33)
+: TopicView(_parent, "gazebo.msgs.ImageStamped", "image", 60),
+  dataPtr(new ImageViewPrivate())
 {
   this->setWindowTitle(tr("Gazebo: Image View"));
 
-  // Create the image display
-  // {
   QVBoxLayout *frameLayout = new QVBoxLayout;
 
-  this->pixmap = QPixmap(":/images/no_image.png");
-  QPixmap image = (this->pixmap.scaled(320, 240, Qt::KeepAspectRatio,
-                                 Qt::SmoothTransformation));
-  this->imageLabel = new QLabel();
-  this->imageLabel->setPixmap(image);
-  this->imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
-  this->imageLabel->setMinimumSize(320, 240);
-  this->imageLabel->setScaledContents(true);
+  this->dataPtr->imageFrame = new ImageFrame(this);
+  this->dataPtr->imageFrame->setMinimumSize(320, 240);
+  this->dataPtr->imageFrame->show();
+  frameLayout->addWidget(this->dataPtr->imageFrame);
 
-  frameLayout->addWidget(this->imageLabel);
   this->frame->setObjectName("blackBorderFrame");
   this->frame->setLayout(frameLayout);
-  // }
 }
 
 /////////////////////////////////////////////////
 ImageView::~ImageView()
 {
-  this->sub.reset();
-}
+  delete this->dataPtr;
+  this->dataPtr = NULL;
 
-/////////////////////////////////////////////////
-void ImageView::UpdateImpl()
-{
-  // Update the image output
-  this->imageLabel->setPixmap(this->pixmap);
+  this->sub.reset();
 }
 
 /////////////////////////////////////////////////
@@ -79,30 +69,7 @@ void ImageView::SetTopic(const std::string &_topicName)
 void ImageView::OnImage(ConstImageStampedPtr &_msg)
 {
   // Update the Hz and Bandwidth info
-  this->OnMsg(msgs::Convert(_msg->time()),
-      _msg->image().data().size());
-
-  unsigned char *rgbData = NULL;
-  unsigned int rgbDataSize = 0;
-
-  // Convert the image data to RGB
-  common::Image img;
-  img.SetFromData(
-      (unsigned char *)(_msg->image().data().c_str()),
-      _msg->image().width(),
-      _msg->image().height(),
-      (common::Image::PixelFormat)(_msg->image().pixel_format()));
-
-  img.GetRGBData(&rgbData, rgbDataSize);
-
-  // Get the image data in a QT friendly format
-  QImage image(_msg->image().width(), _msg->image().height(),
-               QImage::Format_RGB888);
-  // Store the image data
-  memcpy(image.bits(), rgbData, rgbDataSize);
-
-  // Set the pixmap used by the image label.
-  this->pixmap = QPixmap::fromImage(image);
+  this->OnMsg(msgs::Convert(_msg->time()), _msg->image().data().size());
 
-  delete [] rgbData;
+  this->dataPtr->imageFrame->OnImage(_msg->image());
 }
diff --git a/gazebo/gui/viewers/ImageView.hh b/gazebo/gui/viewers/ImageView.hh
index f2c1e37..89198e5 100644
--- a/gazebo/gui/viewers/ImageView.hh
+++ b/gazebo/gui/viewers/ImageView.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,13 +25,17 @@
 #include "gazebo/transport/TransportTypes.hh"
 
 #include "gazebo/gui/qt.h"
+#include "gazebo/gui/viewers/ImageFrame.hh"
 #include "gazebo/gui/viewers/TopicView.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace gui
   {
-    class ImageView : public TopicView
+    class ImageViewPrivate;
+
+    class GAZEBO_VISIBLE ImageView : public TopicView
     {
       Q_OBJECT
 
@@ -45,18 +49,12 @@ namespace gazebo
       // Documentation inherited
       public: virtual void SetTopic(const std::string &_topicName);
 
-      // Documentation inherited
-      private: virtual void UpdateImpl();
-
       /// \brief Receives incoming image messages.
       /// \param[in] _msg New image message.
-      private: void OnImage(ConstImageStampedPtr &_msg);
-
-      /// \brief A label is used to display the image data.
-      private: QLabel *imageLabel;
+      public: void OnImage(ConstImageStampedPtr &_msg);
 
-      /// \brief Storage mechansim for image data.
-      private: QPixmap pixmap;
+      /// \brief Private data.
+      private: ImageViewPrivate *dataPtr;
     };
   }
 }
diff --git a/gazebo/gui/viewers/ImageViewPrivate.hh b/gazebo/gui/viewers/ImageViewPrivate.hh
new file mode 100644
index 0000000..6e272d0
--- /dev/null
+++ b/gazebo/gui/viewers/ImageViewPrivate.hh
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _IMAGEVIEW_PRIVATE_HH_
+#define _IMAGEVIEW_PRIVATE_HH_
+
+#include "gazebo/gui/viewers/ImageFrame.hh"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    class ImageFrame;
+
+    /// \brief Private data for the ImageView class.
+    class ImageViewPrivate
+    {
+      /// \brief The frame which draws the image.
+      public: ImageFrame *imageFrame;
+    };
+  }
+}
+
+#endif
diff --git a/gazebo/gui/viewers/ImagesView.cc b/gazebo/gui/viewers/ImagesView.cc
index af9d426..4daf980 100644
--- a/gazebo/gui/viewers/ImagesView.cc
+++ b/gazebo/gui/viewers/ImagesView.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,13 +15,14 @@
  *
  */
 
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Node.hh"
 #include "gazebo/transport/Publisher.hh"
 
 #include "gazebo/common/Image.hh"
 
 #include "gazebo/gui/viewers/ViewFactory.hh"
+#include "gazebo/gui/viewers/ImagesViewPrivate.hh"
 #include "gazebo/gui/viewers/ImagesView.hh"
 
 using namespace gazebo;
@@ -31,88 +32,81 @@ GZ_REGISTER_STATIC_VIEWER("gazebo.msgs.ImagesStamped", ImagesView)
 
 /////////////////////////////////////////////////
 ImagesView::ImagesView(QWidget *_parent)
-: TopicView(_parent, "gazebo.msgs.ImagesStamped", "images", 33)
+: TopicView(_parent, "gazebo.msgs.ImagesStamped", "images", 60),
+  dataPtr(new ImagesViewPrivate())
 {
   this->setWindowTitle(tr("Gazebo: Images View"));
 
   // Create the layout and frame for images
   // {
-  this->frameLayout = new QGridLayout;
-  this->frameLayout->setSizeConstraint(QLayout::SetMinimumSize);
+  this->dataPtr->frameLayout = new QGridLayout;
+  this->dataPtr->frameLayout->setSizeConstraint(QLayout::SetMinimumSize);
 
   this->frame->setObjectName("blackBorderFrame");
-  this->frame->setLayout(this->frameLayout);
+  this->frame->setLayout(this->dataPtr->frameLayout);
   this->frame->setMinimumHeight(240);
   this->frame->setMinimumWidth(320);
   // }
 
-  this->clearImages = false;
+  this->dataPtr->clearImages = false;
 }
 
 /////////////////////////////////////////////////
 ImagesView::~ImagesView()
 {
+  delete this->dataPtr;
+  this->dataPtr = NULL;
+
   this->sub.reset();
 }
 
 /////////////////////////////////////////////////
 void ImagesView::UpdateImpl()
 {
-  boost::mutex::scoped_lock lock(this->mutex);
-  std::vector<QLabel*>::iterator labelIter = this->imageLabels.begin();
-  std::vector<QImage>::iterator imageIter = this->images.begin();
+  boost::mutex::scoped_lock lock(this->dataPtr->mutex);
+  std::vector<ImageFrame *>::iterator imageIter = this->dataPtr->images.begin();
 
   // Clear out the images if the flag is set.
-  if (this->clearImages)
+  if (this->dataPtr->clearImages)
   {
     // Remove all the images, and delete them
-    for (; labelIter != this->imageLabels.end(); )
+    for (; imageIter != this->dataPtr->images.end(); )
     {
-      (*labelIter)->hide();
-      this->frameLayout->removeWidget(*labelIter);
-      delete *labelIter;
-      labelIter = this->imageLabels.erase(labelIter);
+      (*imageIter)->hide();
+      this->dataPtr->frameLayout->removeWidget(*imageIter);
+      delete *imageIter;
+      imageIter = this->dataPtr->images.erase(imageIter);
     }
 
     // Clear the lists
-    this->imageLabels.clear();
-    this->images.clear();
+    this->dataPtr->images.clear();
 
     // Make sure to adjust the size of the widget
     this->frame->adjustSize();
     this->adjustSize();
 
     // Reset frame
-    this->clearImages = false;
+    this->dataPtr->clearImages = false;
     return;
   }
 
-  // Update the images if there are sizes
-  if (this->images.size() > 0)
-  {
-    // Update the image output
-    for (; labelIter != this->imageLabels.end(); ++labelIter, ++imageIter)
-    {
-      (*labelIter)->setPixmap(QPixmap::fromImage(*imageIter));
-    }
-  }
-
   // Create new images when necessary
   std::vector<std::pair<int, int> >::iterator iter;
-  for (iter = this->addImage.begin(); iter != this->addImage.end(); ++iter)
+  for (iter = this->dataPtr->addImage.begin();
+       iter != this->dataPtr->addImage.end(); ++iter)
   {
     this->AddImage((*iter).first, (*iter).second);
   }
-  this->addImage.clear();
+  this->dataPtr->addImage.clear();
 }
 
 /////////////////////////////////////////////////
 void ImagesView::SetTopic(const std::string &_topicName)
 {
-  boost::mutex::scoped_lock lock(this->mutex);
+  boost::mutex::scoped_lock lock(this->dataPtr->mutex);
 
   // Tell the widget to clear the images
-  this->clearImages = true;
+  this->dataPtr->clearImages = true;
 
   TopicView::SetTopic(_topicName);
 
@@ -123,69 +117,44 @@ void ImagesView::SetTopic(const std::string &_topicName)
 /////////////////////////////////////////////////
 void ImagesView::AddImage(int _width, int _height)
 {
-  QPixmap pixmap(":/images/no_image.png");
-  QPixmap image = (pixmap.scaled(_width, _height, Qt::KeepAspectRatio,
-        Qt::SmoothTransformation));
-
-  QLabel *imageLabel = new QLabel();
-  imageLabel->setPixmap(image);
-  imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
-  imageLabel->setMinimumSize(320, 240);
-  imageLabel->setScaledContents(true);
-  this->imageLabels.push_back(imageLabel);
+  ImageFrame *imageFrame = new ImageFrame(this);
+  imageFrame->setBaseSize(_width, _height);
+  imageFrame->setMinimumSize(320, 240);
+  imageFrame->show();
+  this->dataPtr->images.push_back(imageFrame);
 
   // Add the lable to the correct row and column
-  this->frameLayout->addWidget(imageLabel, (this->imageLabels.size()-1) / 2,
-      (this->imageLabels.size()-1) % 2);
-
-  this->images.push_back(QImage(_width, _height, QImage::Format_RGB888));
+  this->dataPtr->frameLayout->addWidget(imageFrame,
+      (this->dataPtr->images.size()-1) / 2,
+      (this->dataPtr->images.size()-1) % 2);
 }
 
 /////////////////////////////////////////////////
 void ImagesView::OnImages(ConstImagesStampedPtr &_msg)
 {
   // Only use a try lock so that we don't block the node thread.
-  boost::mutex::scoped_try_lock lock(this->mutex);
+  boost::mutex::scoped_try_lock lock(this->dataPtr->mutex);
   if (!lock)
       return;
 
-  unsigned char *rgbData = NULL;
-  unsigned int rgbDataSize = 0;
-
-  if (this->clearImages)
+  if (this->dataPtr->clearImages)
     return;
 
   int dataSize = 0;
-  this->addImage.clear();
+  this->dataPtr->addImage.clear();
 
   for (int i = 0; i < _msg->image_size(); ++i)
   {
-    rgbData = NULL;
-    rgbDataSize = 0;
-
-    dataSize += _msg->image(0).data().size();
+    dataSize += _msg->image(i).data().size();
 
-    if (i >= static_cast<int>(this->images.size()))
+    if (i >= static_cast<int>(this->dataPtr->images.size()))
     {
-      this->addImage.push_back(std::make_pair(_msg->image(0).width(),
-                                              _msg->image(0).height()));
+      this->dataPtr->addImage.push_back(std::make_pair(_msg->image(i).width(),
+                                              _msg->image(i).height()));
       continue;
     }
 
-    // Convert the image data to RGB
-    common::Image img;
-    img.SetFromData(
-        (unsigned char *)(_msg->image(i).data().c_str()),
-        _msg->image(i).width(),
-        _msg->image(i).height(),
-        (common::Image::PixelFormat)(_msg->image(i).pixel_format()));
-
-    img.GetRGBData(&rgbData, rgbDataSize);
-
-    // Store the image data
-    memcpy(this->images[i].bits(), rgbData, rgbDataSize);
-
-    delete [] rgbData;
+    this->dataPtr->images[i]->OnImage(_msg->image(i));
   }
 
   // Update the Hz and Bandwidth info
diff --git a/gazebo/gui/viewers/ImagesView.hh b/gazebo/gui/viewers/ImagesView.hh
index 6902377..4c9dba8 100644
--- a/gazebo/gui/viewers/ImagesView.hh
+++ b/gazebo/gui/viewers/ImagesView.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,13 +29,17 @@
 #include "gazebo/transport/TransportTypes.hh"
 
 #include "gazebo/gui/qt.h"
+#include "gazebo/gui/viewers/ImageFrame.hh"
 #include "gazebo/gui/viewers/TopicView.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace gui
   {
-    class ImagesView : public TopicView
+    class ImagesViewPrivate;
+
+    class GAZEBO_VISIBLE ImagesView : public TopicView
     {
       Q_OBJECT
 
@@ -61,24 +65,8 @@ namespace gazebo
       /// \param[in] _height Height of the image.
       private: void AddImage(int _width, int _height);
 
-      /// \brief A label is used to display the image data.
-      private: std::vector<QLabel *> imageLabels;
-
-      /// \brief Storage mechansim for image data.
-      private: std::vector<QPixmap> pixmaps;
-      private: std::vector<QImage> images;
-
-      /// \brief Pointer to the frame containing the images
-      private: QGridLayout *frameLayout;
-
-      /// \brief Mutex to protect the image vectors
-      private: boost::mutex mutex;
-
-      /// \brief Set to true to clear the images from the widget
-      private: bool clearImages;
-
-      /// \brief Vector of image sizes to add
-      private: std::vector<std::pair<int, int> > addImage;
+      /// \brief Private data.
+      private: ImagesViewPrivate *dataPtr;
     };
   }
 }
diff --git a/gazebo/gui/viewers/ImagesViewPrivate.hh b/gazebo/gui/viewers/ImagesViewPrivate.hh
new file mode 100644
index 0000000..5d01f47
--- /dev/null
+++ b/gazebo/gui/viewers/ImagesViewPrivate.hh
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _IMAGESVIEW_PRIVATE_HH_
+#define _IMAGESVIEW_PRIVATE_HH_
+
+#include <vector>
+#include <utility>
+#include <boost/thread/mutex.hpp>
+
+#include "gazebo/gui/viewers/ImageFrame.hh"
+#include "gazebo/gui/qt.h"
+
+namespace gazebo
+{
+  namespace gui
+  {
+    /// \brief Private data for the ImagesView class.
+    class ImagesViewPrivate
+    {
+      /// \brief Storage mechansim for image data.
+      public: std::vector<ImageFrame *> images;
+
+      /// \brief Pointer to the frame containing the images
+      public: QGridLayout *frameLayout;
+
+      /// \brief Mutex to protect the image vectors
+      public: boost::mutex mutex;
+
+      /// \brief Set to true to clear the images from the widget
+      public: bool clearImages;
+
+      /// \brief Vector of image sizes to add
+      public: std::vector<std::pair<int, int> > addImage;
+    };
+  }
+}
+
+#endif
diff --git a/gazebo/gui/viewers/ImagesView_TEST.cc b/gazebo/gui/viewers/ImagesView_TEST.cc
index 13da8bf..869c328 100644
--- a/gazebo/gui/viewers/ImagesView_TEST.cc
+++ b/gazebo/gui/viewers/ImagesView_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,111 +21,120 @@
 /////////////////////////////////////////////////
 void ImagesView_TEST::Construction()
 {
-  this->Load("worlds/empty.world");
+  QBENCHMARK
+  {
+    this->Load("worlds/empty.world");
 
-  // Create a new data logger widget
-  gazebo::gui::ImagesView *view = new gazebo::gui::ImagesView(NULL);
-  view->show();
+    // Create a new data logger widget
+    gazebo::gui::ImagesView *view = new gazebo::gui::ImagesView(NULL);
+    view->show();
 
-  QCoreApplication::processEvents();
+    QCoreApplication::processEvents();
 
-  // Get the frame that holds the images
-  QFrame *frame = view->findChild<QFrame*>("blackBorderFrame");
+    // Get the frame that holds the images
+    QFrame *frame = view->findChild<QFrame*>("blackBorderFrame");
 
-  // The layout should be the only child of the frame on construction.
-  QVERIFY(frame->children().size() == 1);
+    // The layout should be the only child of the frame on construction.
+    QVERIFY(frame->children().size() == 1);
 
-  view->hide();
-  delete view;
+    view->hide();
+    delete view;
+  }
 }
 
 /////////////////////////////////////////////////
 void ImagesView_TEST::Switch()
 {
-  this->Load("worlds/multicamera_test.world");
-
-  // Create a new data logger widget
-  gazebo::gui::ImagesView *view = new gazebo::gui::ImagesView(NULL);
-  view->show();
-
-  // Get the frame that holds the images
-  QFrame *frame = view->findChild<QFrame*>("blackBorderFrame");
-
-  // The layout should be the only child of the frame on construction.
-  QVERIFY(frame->children().size() == 1);
-
-  this->SetTopic(view, "~/multicamera_1/link/cam1/images", 2);
-  this->SetTopic(view, "~/multicamera_2/link/cam2/images", 3);
-  this->SetTopic(view, "~/multicamera_3/link/cam3/images", 4);
-  this->SetTopic(view, "~/multicamera_4/link/cam4/images", 5);
-  this->SetTopic(view, "~/multicamera_5/link/cam5/images", 6);
-  this->SetTopic(view, "~/multicamera_6/link/cam6/images", 7);
-
-  this->SetTopic(view, "~/multicamera_6/link/cam6/images", 7);
-  this->SetTopic(view, "~/multicamera_5/link/cam5/images", 6);
-  this->SetTopic(view, "~/multicamera_4/link/cam4/images", 5);
-  this->SetTopic(view, "~/multicamera_3/link/cam3/images", 4);
-  this->SetTopic(view, "~/multicamera_2/link/cam2/images", 3);
-  this->SetTopic(view, "~/multicamera_1/link/cam1/images", 2);
-
-  std::map<int, std::string> topicMap;
-  topicMap[2] = "~/multicamera_1/link/cam1/images";
-  topicMap[3] = "~/multicamera_2/link/cam2/images";
-  topicMap[4] = "~/multicamera_3/link/cam3/images";
-  topicMap[5] = "~/multicamera_4/link/cam4/images";
-  topicMap[6] = "~/multicamera_5/link/cam5/images";
-  topicMap[7] = "~/multicamera_6/link/cam6/images";
-
-  // Switch the topic 50 times
-  for (unsigned int i = 0; i < 50; ++i)
+  QBENCHMARK
   {
-    // Get a random topic index.
-    int index = gazebo::math::Rand::GetIntUniform(1, 7);
-
-    // Switch the topic
-    view->SetTopic(topicMap[index]);
-
-    // Sping the QT update loop for a while to process events.
-    for (int j = 0; j < 50; ++j)
+    this->Load("worlds/multicamera_test.world");
+
+    // Create a new data logger widget
+    gazebo::gui::ImagesView *view = new gazebo::gui::ImagesView(NULL);
+    view->show();
+
+    // Get the frame that holds the images
+    QFrame *frame = view->findChild<QFrame*>("blackBorderFrame");
+
+    // The layout should be the only child of the frame on construction.
+    QVERIFY(frame->children().size() == 1);
+
+    this->SetTopic(view, "~/multicamera_1/link/cam1/images", 2);
+    this->SetTopic(view, "~/multicamera_2/link/cam2/images", 3);
+    this->SetTopic(view, "~/multicamera_3/link/cam3/images", 4);
+    this->SetTopic(view, "~/multicamera_4/link/cam4/images", 5);
+    this->SetTopic(view, "~/multicamera_5/link/cam5/images", 6);
+    this->SetTopic(view, "~/multicamera_6/link/cam6/images", 7);
+
+    this->SetTopic(view, "~/multicamera_6/link/cam6/images", 7);
+    this->SetTopic(view, "~/multicamera_5/link/cam5/images", 6);
+    this->SetTopic(view, "~/multicamera_4/link/cam4/images", 5);
+    this->SetTopic(view, "~/multicamera_3/link/cam3/images", 4);
+    this->SetTopic(view, "~/multicamera_2/link/cam2/images", 3);
+    this->SetTopic(view, "~/multicamera_1/link/cam1/images", 2);
+
+    std::map<int, std::string> topicMap;
+    topicMap[2] = "~/multicamera_1/link/cam1/images";
+    topicMap[3] = "~/multicamera_2/link/cam2/images";
+    topicMap[4] = "~/multicamera_3/link/cam3/images";
+    topicMap[5] = "~/multicamera_4/link/cam4/images";
+    topicMap[6] = "~/multicamera_5/link/cam5/images";
+    topicMap[7] = "~/multicamera_6/link/cam6/images";
+
+    // Switch the topic 25 times
+    for (unsigned int i = 0; i < 25; ++i)
     {
-      gazebo::common::Time::MSleep(gazebo::math::Rand::GetIntUniform(10, 50));
-      QCoreApplication::processEvents();
+      // Get a random topic index.
+      int index = gazebo::math::Rand::GetIntUniform(1, 7);
+
+      // Switch the topic
+      view->SetTopic(topicMap[index]);
+
+      // Sping the QT update loop for a while to process events.
+      for (int j = 0; j < 50; ++j)
+      {
+        gazebo::common::Time::MSleep(gazebo::math::Rand::GetIntUniform(10, 50));
+        QCoreApplication::processEvents();
+      }
     }
-  }
 
-  view->hide();
-  delete view;
+    view->hide();
+    delete view;
+  }
 }
 
 /////////////////////////////////////////////////
 void ImagesView_TEST::SetTopic(gazebo::gui::ImagesView *_view,
     const std::string &_topicName, int _count)
 {
-  QFrame *frame = _view->findChild<QFrame*>("blackBorderFrame");
+  QBENCHMARK
+  {
+    QFrame *frame = _view->findChild<QFrame*>("blackBorderFrame");
 
-  _view->SetTopic(_topicName);
+    _view->SetTopic(_topicName);
 
-  int i = 0;
+    int i = 0;
 
-  for (i = 0; frame->children().size() != 1 && i < 1000; ++i)
-  {
-    gazebo::common::Time::MSleep(10);
-    QCoreApplication::processEvents();
-  }
+    for (i = 0; frame->children().size() != 1 && i < 1000; ++i)
+    {
+      gazebo::common::Time::MSleep(10);
+      QCoreApplication::processEvents();
+    }
 
-  // Make sure the loop didn't exceed the maximum number of iterations
-  QVERIFY(i < 1000);
+    // Make sure the loop didn't exceed the maximum number of iterations
+    QVERIFY(i < 1000);
 
-  // Wait a bit for the images to appear
-  // This is done for visual confirmation that the test works.
-  for (i = 0; i < 100; ++i)
-  {
-    gazebo::common::Time::MSleep(10);
-    QCoreApplication::processEvents();
-  }
+    // Wait a bit for the images to appear
+    // This is done for visual confirmation that the test works.
+    for (i = 0; i < 100; ++i)
+    {
+      gazebo::common::Time::MSleep(10);
+      QCoreApplication::processEvents();
+    }
 
-  // Make sure the number of images is correct.
-  QVERIFY(frame->children().size() == _count);
+    // Make sure the number of images is correct.
+    QVERIFY(frame->children().size() == _count);
+  }
 }
 
 // Generate a main function for the test
diff --git a/gazebo/gui/viewers/ImagesView_TEST.hh b/gazebo/gui/viewers/ImagesView_TEST.hh
index 835db2f..b1cddb1 100644
--- a/gazebo/gui/viewers/ImagesView_TEST.hh
+++ b/gazebo/gui/viewers/ImagesView_TEST.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/viewers/LaserView.cc b/gazebo/gui/viewers/LaserView.cc
index fcfaa4b..0d0b4d2 100644
--- a/gazebo/gui/viewers/LaserView.cc
+++ b/gazebo/gui/viewers/LaserView.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  *
  */
 
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Node.hh"
 #include "gazebo/transport/Publisher.hh"
 
@@ -60,6 +60,10 @@ LaserView::LaserView(QWidget *_parent)
   QPushButton *fitButton = new QPushButton("Fit in View");
   connect(fitButton, SIGNAL(clicked()), this, SLOT(OnFitInView()));
 
+  this->vertScanSpin = new QSpinBox(this);
+  this->vertScanSpin->setRange(0, 0);
+  this->vertScanSpin->setToolTip("Select vertical scan");
+
   QRadioButton *degreeToggle = new QRadioButton();
   degreeToggle->setText("Degrees");
   connect(degreeToggle, SIGNAL(toggled(bool)), this, SLOT(OnDegree(bool)));
@@ -74,6 +78,8 @@ LaserView::LaserView(QWidget *_parent)
 
   controlLayout->addWidget(degreeToggle);
   controlLayout->addWidget(fitButton);
+  controlLayout->addWidget(new QLabel("Vertical:"));
+  controlLayout->addWidget(this->vertScanSpin);
   controlLayout->addStretch(1);
   controlLayout->addWidget(new QLabel("Range"));
   controlLayout->addWidget(this->rangeEdit);
@@ -140,11 +146,36 @@ void LaserView::OnScan(ConstLaserScanStampedPtr &_msg)
 
   this->laserItem->Clear();
 
-  double r;
+  // Rayoffset is the start index in _msg->scan()->ranges(). This value is
+  // computed below by multiplying the number of ranges in a scan by the
+  // selected vertical scan.
+  int rayOffset = this->vertScanSpin->value();
+
+  // Make sure the spin box has a valid value.
+  if (_msg->scan().has_vertical_count() && _msg->scan().vertical_count() !=
+      static_cast<uint32_t>(this->vertScanSpin->maximum()+1))
+  {
+    int max = std::max(0u, _msg->scan().vertical_count()-1);
+    rayOffset = std::min(rayOffset, max);
+
+    if (this->vertScanSpin->value() > max)
+      this->vertScanSpin->setValue(max);
+    this->vertScanSpin->setMaximum(max);
+  }
+  else if (!_msg->scan().has_vertical_count())
+  {
+    rayOffset = 0;
+    this->vertScanSpin->setValue(0);
+    this->vertScanSpin->setMaximum(0);
+  }
+
+  // Compute the final ray index
+  rayOffset *= _msg->scan().count();
+
   for (unsigned int i = 0;
-       i < static_cast<unsigned int>(_msg->scan().ranges_size()); i++)
+       i < static_cast<unsigned int>(_msg->scan().count()); i++)
   {
-    r = _msg->scan().ranges(i);
+    double r = _msg->scan().ranges(i+rayOffset);
 
     if (i+1 >= this->laserItem->GetRangeCount())
       this->laserItem->AddRange(r);
@@ -334,7 +365,7 @@ void LaserView::LaserItem::paint(QPainter *_painter,
 /////////////////////////////////////////////////
 QRectF LaserView::LaserItem::GetBoundingRect() const
 {
-  if (this->ranges.size() == 0)
+  if (this->ranges.empty())
     return QRectF(0, 0, 0, 0);
 
   // Compute the maximum size of bound box by scaling up the maximum
@@ -484,7 +515,7 @@ void LaserView::LaserItem::hoverLeaveEvent(
     QGraphicsSceneHoverEvent * /*_event*/)
 {
   this->indexAngle = -999;
-  QApplication::setOverrideCursor(Qt::OpenHandCursor);
+  QApplication::setOverrideCursor(Qt::ArrowCursor);
 }
 
 /////////////////////////////////////////////////
diff --git a/gazebo/gui/viewers/LaserView.hh b/gazebo/gui/viewers/LaserView.hh
index f5dcf8d..c4c5e21 100644
--- a/gazebo/gui/viewers/LaserView.hh
+++ b/gazebo/gui/viewers/LaserView.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,12 +28,13 @@
 
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/viewers/TopicView.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace gui
   {
-    class LaserView : public TopicView
+    class GAZEBO_VISIBLE LaserView : public TopicView
     {
       Q_OBJECT
 
@@ -213,6 +214,9 @@ namespace gazebo
 
       /// \brief Angle output
       private: QLineEdit *angleEdit;
+
+      /// \brief Spin box for choosing vertical ray.
+      private: QSpinBox *vertScanSpin;
     };
   }
 }
diff --git a/gazebo/gui/viewers/TextView.cc b/gazebo/gui/viewers/TextView.cc
index 3967ed7..4a4d9b2 100644
--- a/gazebo/gui/viewers/TextView.cc
+++ b/gazebo/gui/viewers/TextView.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
  */
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Node.hh"
 #include "gazebo/transport/Publisher.hh"
 
diff --git a/gazebo/gui/viewers/TextView.hh b/gazebo/gui/viewers/TextView.hh
index e7c9ef8..5eaf863 100644
--- a/gazebo/gui/viewers/TextView.hh
+++ b/gazebo/gui/viewers/TextView.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,12 +27,13 @@
 
 #include "gazebo/gui/qt.h"
 #include "gazebo/gui/viewers/TopicView.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace gui
   {
-    class TextView : public TopicView
+    class GAZEBO_VISIBLE TextView : public TopicView
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/viewers/TopicView.cc b/gazebo/gui/viewers/TopicView.cc
index d198e93..fccab23 100644
--- a/gazebo/gui/viewers/TopicView.cc
+++ b/gazebo/gui/viewers/TopicView.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,10 +15,10 @@
  *
  */
 #include "gazebo/gui/viewers/ViewFactory.hh"
-#include "gazebo/gui/Gui.hh"
+#include "gazebo/gui/GuiIface.hh"
 #include "gazebo/gui/GuiEvents.hh"
 
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Node.hh"
 #include "gazebo/transport/Publisher.hh"
 
@@ -58,12 +58,12 @@ TopicView::TopicView(QWidget *_parent, const std::string &_msgTypeName,
   // Create the Hz and bandwidth labels
   // {
   QHBoxLayout *infoLayout = new QHBoxLayout;
-  QLabel *hzLabel = new QLabel("Hz: ");
+  QLabel *hzLabel = new QLabel(tr("Hz: "));
   this->hzEdit = new QLineEdit;
   this->hzEdit->setReadOnly(true);
   this->hzEdit->setFixedWidth(80);
 
-  QLabel *bandwidthLabel = new QLabel("Bandwidth: ");
+  QLabel *bandwidthLabel = new QLabel(tr("Bandwidth: "));
   this->bandwidthEdit = new QLineEdit;
   this->bandwidthEdit->setReadOnly(true);
   this->bandwidthEdit->setFixedWidth(110);
@@ -124,7 +124,7 @@ void TopicView::Update()
       }
 
       double avgDbl = 0;
-      if (this->dataTimes.size() != 0)
+      if (!this->dataTimes.empty())
         avgDbl = 1.0 / (avg.Double() / this->dataTimes.size());
 
       std::ostringstream stream;
diff --git a/gazebo/gui/viewers/TopicView.hh b/gazebo/gui/viewers/TopicView.hh
index d0866be..ae3f05a 100644
--- a/gazebo/gui/viewers/TopicView.hh
+++ b/gazebo/gui/viewers/TopicView.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
 
 #include "gazebo/gui/qt.h"
 #include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,7 @@ namespace gazebo
     /// \cond
     /// \brief A custom combobox that pull in a list of topics for user
     /// selection.
-    class TopicCombo : public QComboBox
+    class GAZEBO_VISIBLE TopicCombo : public QComboBox
     {
       /// \brief Constructor
       /// \param[in] _w Parent widget.
@@ -72,7 +73,7 @@ namespace gazebo
     /// \endcond
 
     /// \brief Base class for widgets that display topic data.
-    class TopicView : public QDialog
+    class GAZEBO_VISIBLE TopicView : public QDialog
     {
       Q_OBJECT
 
diff --git a/gazebo/gui/viewers/ViewFactory.cc b/gazebo/gui/viewers/ViewFactory.cc
index 657224d..5e30608 100644
--- a/gazebo/gui/viewers/ViewFactory.cc
+++ b/gazebo/gui/viewers/ViewFactory.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/gui/viewers/ViewFactory.hh b/gazebo/gui/viewers/ViewFactory.hh
index c5bad4a..93c9cf0 100644
--- a/gazebo/gui/viewers/ViewFactory.hh
+++ b/gazebo/gui/viewers/ViewFactory.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #include <vector>
 
 #include "gazebo/gui/GuiTypes.hh"
+#include "gazebo/util/system.hh"
 
 class QWidget;
 
@@ -39,7 +40,7 @@ namespace gazebo
     /// \class ViewFactory ViewFactory.hh gui/viewers/ViewFactory.hh
     /// \brief The view factory creates GUI widgets to visualize data on
     /// a topic.
-    class ViewFactory
+    class GAZEBO_VISIBLE ViewFactory
     {
       /// \brief Register all known views
       public: static void RegisterAll();
@@ -75,10 +76,11 @@ namespace gazebo
     /// \param[in] msgtype Type of message to visualize.
     /// \param[in] classname C++ class name for the view.
     #define GZ_REGISTER_STATIC_VIEWER(msgtype, classname) \
-    TopicView *New##classname(QWidget *_parent) \
+    GAZEBO_VISIBLE TopicView *New##classname(QWidget *_parent) \
     { \
       return new gazebo::gui::classname(_parent); \
     } \
+    GAZEBO_VISIBLE \
     void Register##classname() \
     {\
       ViewFactory::RegisterView(msgtype, New##classname);\
diff --git a/gazebo/gzserver.1.ronn b/gazebo/gzserver.1.ronn
new file mode 100644
index 0000000..f42ab52
--- /dev/null
+++ b/gazebo/gzserver.1.ronn
@@ -0,0 +1,49 @@
+gzserver -- Run the Gazebo server.
+=============================================
+
+## SYNOPSIS
+
+`gzserver` [options] <world_file>
+
+## DESCRIPTION
+
+Gazebo server runs simulation and handles commandline options, starts a Master, runs World update and sensor generation loops.
+
+## OPTIONS
+
+* -v, --version :
+ Output version information.
+* --verbose :
+ Increase the messages written to the terminal.
+* -h, --help :
+ Produce this help message.
+* -u, --pause :
+ Start the server in a paused state.
+* -e, --physics arg :
+ Specify a physics engine (ode|bullet|dart|simbody).
+* -p, --play arg :
+ Play a log file.
+* -r, --record :
+ Record state data.
+* --record_encoding arg (=zlib) :
+ Compression encoding format for log data (zlib|bz2|txt).
+* --record_path arg :
+ Absolute path in which to store state data
+* --seed arg :
+ Start with a given random number seed.
+* --iters arg :
+ Number of iterations to simulate.
+* --minimal_comms :
+ Reduce the TCP/IP traffic output by gzserver
+* -s, --server-plugin arg :
+ Load a plugin.
+
+
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-2014 Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
diff --git a/gazebo/master_main.cc b/gazebo/master_main.cc
deleted file mode 100644
index 704621a..0000000
--- a/gazebo/master_main.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <signal.h>
-#include <boost/lexical_cast.hpp>
-
-#include "gazebo/common/Exception.hh"
-#include "gazebo/transport/Transport.hh"
-#include "gazebo/Master.hh"
-#include "gazebo/gazebo_config.h"
-
-gazebo::Master *master = NULL;
-
-//////////////////////////////////////////////////
-void PrintVersion()
-{
-  fprintf(stderr, "%s", GAZEBO_VERSION_HEADER);
-}
-
-//////////////////////////////////////////////////
-void SignalHandler(int /*dummy*/)
-{
-  master->Stop();
-  return;
-}
-
-int main(int /*argc*/, char ** /*argv*/)
-{
-  try
-  {
-    PrintVersion();
-
-    if (signal(SIGINT, SignalHandler) == SIG_ERR)
-    {
-      std::cerr << "signal(2) failed while setting up for SIGINT" << std::endl;
-      return -1;
-    }
-
-    std::string host = "";
-    unsigned int port = 0;
-
-    if (!gazebo::transport::get_master_uri(host, port))
-
-      master = new gazebo::Master();
-    master->Init(port);
-    master->Run();
-    master->Fini();
-
-    delete master;
-    master = NULL;
-  }
-  catch(gazebo::common::Exception &_e)
-  {
-    _e.Print();
-  }
-
-  return 1;
-}
-
diff --git a/gazebo/math/Angle.cc b/gazebo/math/Angle.cc
index 696f130..39b1ec5 100644
--- a/gazebo/math/Angle.cc
+++ b/gazebo/math/Angle.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,12 +20,17 @@
  */
 
 #include <math.h>
-#include "math/Helpers.hh"
-#include "math/Angle.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/math/Angle.hh"
 
 using namespace gazebo;
 using namespace math;
 
+const Angle Angle::Zero = math::Angle(0);
+const Angle Angle::Pi = math::Angle(M_PI);
+const Angle Angle::HalfPi = math::Angle(M_PI * 0.5);
+const Angle Angle::TwoPi = math::Angle(M_PI * 2.0);
+
 //////////////////////////////////////////////////
 Angle::Angle()
 {
@@ -134,7 +139,7 @@ Angle Angle::operator/=(const Angle &angle)
 //////////////////////////////////////////////////
 bool Angle::operator ==(const Angle &angle) const
 {
-  return equal(this->value, angle.value);
+  return equal(this->value, angle.value, 0.001);
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/math/Angle.hh b/gazebo/math/Angle.hh
index 822a8e8..f6814c8 100644
--- a/gazebo/math/Angle.hh
+++ b/gazebo/math/Angle.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,16 +14,13 @@
  * limitations under the License.
  *
 */
-/* Desc: Angle class
- * Author: Nate Koenig
- * Date: 18 Aug 2008
- */
 
 #ifndef _ANGLE_HH_
 #define _ANGLE_HH_
 
 #include <math.h>
 #include <iostream>
+#include "gazebo/util/system.hh"
 
 /// \brief Macro that converts radians to degrees
 /// \param[in] radians
@@ -52,8 +49,20 @@ namespace gazebo
 
   /// \class Angle Angle.hh math/gzmath.hh
   /// \brief An angle and related functions.
-  class Angle
+  class GAZEBO_VISIBLE Angle
   {
+    /// \brief math::Angle(0)
+    public: static const Angle Zero;
+
+    /// \brief math::Angle(M_PI)
+    public: static const Angle Pi;
+
+    /// \brief math::Angle(M_PI * 0.5)
+    public: static const Angle HalfPi;
+
+    /// \brief math::Angle(M_PI * 2)
+    public: static const Angle TwoPi;
+
     /// \brief Constructor
     public: Angle();
 
diff --git a/gazebo/math/Angle_TEST.cc b/gazebo/math/Angle_TEST.cc
index c8c6129..b9d47b3 100644
--- a/gazebo/math/Angle_TEST.cc
+++ b/gazebo/math/Angle_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,13 @@
 
 #include "gazebo/math/Helpers.hh"
 #include "gazebo/math/Angle.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(AngleTest, Angle)
+class AngleTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(AngleTest, Angle)
 {
   math::Angle angle1;
   EXPECT_TRUE(math::equal(0.0, angle1.Radian()));
diff --git a/gazebo/math/Box.cc b/gazebo/math/Box.cc
index 885716f..7797673 100644
--- a/gazebo/math/Box.cc
+++ b/gazebo/math/Box.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  *
 */
 #include <math.h>
-#include "math/Box.hh"
+#include "gazebo/math/Box.hh"
 
 using namespace gazebo;
 using namespace math;
@@ -147,7 +147,7 @@ const Box &Box::operator+=(const Box &_b)
 }
 
 //////////////////////////////////////////////////
-bool Box::operator==(const Box &_b)
+bool Box::operator==(const Box &_b) const
 {
   return this->min == _b.min && this->max == _b.max;
 }
diff --git a/gazebo/math/Box.hh b/gazebo/math/Box.hh
index 1ca2fd6..d130851 100644
--- a/gazebo/math/Box.hh
+++ b/gazebo/math/Box.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,8 @@
 #define _BOX_HH_
 
 #include <iostream>
-#include "math/Vector3.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,7 @@ namespace gazebo
 
     /// \class Box Box.hh math/gzmath.hh
     /// \brief Mathematical representation of a box and related functions.
-    class Box
+    class GAZEBO_VISIBLE Box
     {
       /// \brief Default constructor
       public: Box();
@@ -88,7 +89,7 @@ namespace gazebo
       /// \brief Equality test operatoer
       /// \param[in] _b Box to test
       /// \return True if equal
-      public: bool operator==(const Box &_b);
+      public: bool operator==(const Box &_b) const;
 
       /// \brief Subtract a vector from the min and max values
       /// \param _v The vector to use during subtraction
diff --git a/gazebo/math/Box_TEST.cc b/gazebo/math/Box_TEST.cc
index b25173d..bd8430d 100644
--- a/gazebo/math/Box_TEST.cc
+++ b/gazebo/math/Box_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,9 +18,12 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/math/Box.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
+class BoxTest : public gazebo::testing::AutoLogFixture { };
+
 class ExampleBox : public ::testing::Test
 {
   protected:
@@ -32,7 +35,7 @@ class ExampleBox : public ::testing::Test
     math::Box box;
 };
 
-TEST(BoxTest, EmptyConstructor)
+TEST_F(BoxTest, EmptyConstructor)
 {
   math::Box box;
   EXPECT_TRUE(box.min == math::Vector3(0, 0, 0));
@@ -76,20 +79,20 @@ TEST_F(ExampleBox, Merge)
                                math::Vector3(2, 2, 3)));
 }
 
-TEST(BoxTest, OperatorEqual)
+TEST_F(BoxTest, OperatorEqual)
 {
   math::Box box = math::Box(math::Vector3(1, 1, 1), math::Vector3(3, 3, 3));
   EXPECT_TRUE(box == math::Box(math::Vector3(1, 1, 1), math::Vector3(3, 3, 3)));
 }
 
-TEST(BoxTest, OperatorPlusEqual)
+TEST_F(BoxTest, OperatorPlusEqual)
 {
   math::Box box = math::Box(math::Vector3(1, 1, 1), math::Vector3(3, 3, 3));
   box += math::Box(math::Vector3(2, 2, 2), math::Vector3(4, 4, 4));
   EXPECT_TRUE(box == math::Box(math::Vector3(1, 1, 1), math::Vector3(4, 4, 4)));
 }
 
-TEST(BoxTest, OperatorPlus)
+TEST_F(BoxTest, OperatorPlus)
 {
   math::Box box = math::Box(math::Vector3(1, 1, 1), math::Vector3(4, 4, 4));
   box = box + math::Box(math::Vector3(-2, -2, -2), math::Vector3(4, 4, 4));
diff --git a/gazebo/math/CMakeLists.txt b/gazebo/math/CMakeLists.txt
index 0b0c9a3..574be88 100644
--- a/gazebo/math/CMakeLists.txt
+++ b/gazebo/math/CMakeLists.txt
@@ -58,7 +58,7 @@ gz_build_tests(${gtest_sources})
 set (math_headers "" CACHE INTERNAL "transport headers" FORCE)
 foreach (hdr ${headers})
   APPEND_TO_CACHED_STRING(math_headers
-    "Math Headers" "#include \"math/${hdr}\"\n")
+    "Math Headers" "#include \"gazebo/math/${hdr}\"\n")
 endforeach()
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gzmath.hh.in
                ${CMAKE_CURRENT_BINARY_DIR}/gzmath.hh )
diff --git a/gazebo/math/Helpers.cc b/gazebo/math/Helpers.cc
index 8b412dc..6d42cae 100644
--- a/gazebo/math/Helpers.cc
+++ b/gazebo/math/Helpers.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
 */
-#include "math/Helpers.hh"
+#include "gazebo/math/Helpers.hh"
 
 namespace gazebo
 {
diff --git a/gazebo/math/Helpers.hh b/gazebo/math/Helpers.hh
index 3954019..3dbbdd0 100644
--- a/gazebo/math/Helpers.hh
+++ b/gazebo/math/Helpers.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,12 +26,31 @@
 #include <iostream>
 #include <vector>
 
+/// \brief Double maximum value
 #define GZ_DBL_MAX std::numeric_limits<double>::max()
+
+/// \brief Double min value
 #define GZ_DBL_MIN std::numeric_limits<double>::min()
 
+/// \brief Float maximum value
 #define GZ_FLT_MAX std::numeric_limits<float>::max()
+
+/// \brief Float minimum value
 #define GZ_FLT_MIN std::numeric_limits<float>::min()
 
+/// \brief 32bit unsigned integer maximum value
+#define GZ_UINT32_MAX std::numeric_limits<uint32_t>::max()
+
+/// \brief 32bit unsigned integer minimum value
+#define GZ_UINT32_MIN std::numeric_limits<uint32_t>::min()
+
+/// \brief 32bit integer maximum value
+#define GZ_INT32_MAX std::numeric_limits<int32_t>::max()
+
+/// \brief 32bit integer minimum value
+#define GZ_INT32_MIN std::numeric_limits<int32_t>::min()
+
+
 namespace gazebo
 {
   namespace math
@@ -73,6 +92,22 @@ namespace gazebo
       return (boost::math::isnan)(_v);
     }
 
+    /// \brief Fix a nan value.
+    /// \param[in] _v Value to correct.
+    /// \return 0 if _v is NaN, _v otherwise.
+    inline float fixnan(float _v)
+    {
+      return isnan(_v) || std::isinf(_v) ? 0.0f : _v;
+    }
+
+    /// \brief Fix a nan value.
+    /// \param[in] _v Value to correct.
+    /// \return 0 if _v is NaN, _v otherwise.
+    inline double fixnan(double _v)
+    {
+      return isnan(_v) || std::isinf(_v) ? 0.0 : _v;
+    }
+
     /// \brief get mean of vector of values
     /// \param[in] _values the vector of values
     /// \return the mean
@@ -154,6 +189,27 @@ namespace gazebo
       return ((_x != 0) && ((_x & (~_x + 1)) == _x));
     }
 
+    /// \brief Get the smallest power of two that is greater or equal to a given
+    /// value
+    /// \param[in] _x the number
+    /// \return the same value if _x is already a power of two. Otherwise,
+    /// it returns the smallest power of two that is greater than _x
+    inline unsigned int roundUpPowerOfTwo(unsigned int _x)
+    {
+      if (_x == 0)
+        return 1;
+
+      if (isPowerOfTwo(_x))
+        return _x;
+
+      while (_x & (_x - 1))
+        _x = _x & (_x - 1);
+
+      _x = _x << 1;
+
+      return _x;
+    }
+
     /// \brief parse string into an integer
     /// \param[in] _input the string
     /// \return an integer, 0 or 0 and a message in the error stream
diff --git a/gazebo/math/Helpers_TEST.cc b/gazebo/math/Helpers_TEST.cc
index 67b1975..063ff8f 100644
--- a/gazebo/math/Helpers_TEST.cc
+++ b/gazebo/math/Helpers_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,10 +18,15 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/math/Helpers.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(HelpersTest, Helpers)
+class HelpersTest : public gazebo::testing::AutoLogFixture { };
+
+/////////////////////////////////////////////////
+// Test a few function in Helpers
+TEST_F(HelpersTest, Helpers)
 {
   EXPECT_EQ(12345, math::parseInt("12345"));
   EXPECT_EQ(-12345, math::parseInt("-12345"));
@@ -29,4 +34,28 @@ TEST(HelpersTest, Helpers)
   EXPECT_FLOAT_EQ(12.345, math::parseFloat("12.345"));
   EXPECT_FLOAT_EQ(-12.345, math::parseFloat("-12.345"));
   EXPECT_TRUE(math::equal(123.45, math::parseFloat("1.2345e2"), 1e-2));
+
+  EXPECT_EQ(1u, math::roundUpPowerOfTwo(0));
+  EXPECT_EQ(1u, math::roundUpPowerOfTwo(1));
+  EXPECT_EQ(2u, math::roundUpPowerOfTwo(2));
+  EXPECT_EQ(2048u, math::roundUpPowerOfTwo(1025));
+}
+
+/////////////////////////////////////////////////
+// Test Helpers::fixnan functions
+TEST_F(HelpersTest, FixNaN)
+{
+  EXPECT_DOUBLE_EQ(math::fixnan(1.0 / 0.0), 0.0);
+  EXPECT_DOUBLE_EQ(math::fixnan(-1.0 / 0.0), 0.0);
+  EXPECT_DOUBLE_EQ(math::fixnan(0.0 / 0.0), 0.0);
+
+  EXPECT_DOUBLE_EQ(math::fixnan(42.0), 42.0);
+  EXPECT_DOUBLE_EQ(math::fixnan(-42.0), -42.0);
+
+  EXPECT_FLOAT_EQ(math::fixnan(1.0f / 0.0f), 0.0f);
+  EXPECT_FLOAT_EQ(math::fixnan(-1.0f / 0.0f), 0.0f);
+  EXPECT_FLOAT_EQ(math::fixnan(0.0f / 0.0f), 0.0f);
+
+  EXPECT_FLOAT_EQ(math::fixnan(42.0f), 42.0f);
+  EXPECT_FLOAT_EQ(math::fixnan(-42.0f), -42.0f);
 }
diff --git a/gazebo/math/MathTypes.hh b/gazebo/math/MathTypes.hh
index c51b33c..18c4834 100644
--- a/gazebo/math/MathTypes.hh
+++ b/gazebo/math/MathTypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/math/Matrix3.cc b/gazebo/math/Matrix3.cc
index 878085e..6073d73 100644
--- a/gazebo/math/Matrix3.cc
+++ b/gazebo/math/Matrix3.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,12 +17,22 @@
 #include <string.h>
 #include <math.h>
 
-#include "math/Helpers.hh"
-#include "math/Matrix3.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/math/Matrix3.hh"
 
 using namespace gazebo;
 using namespace math;
 
+const Matrix3 Matrix3::IDENTITY(
+       1.0, 0.0, 0.0,
+       0.0, 1.0, 0.0,
+       0.0, 0.0, 1.0);
+
+const Matrix3 Matrix3::ZERO(
+       0.0, 0.0, 0.0,
+       0.0, 0.0, 0.0,
+       0.0, 0.0, 0.0);
+
 //////////////////////////////////////////////////
 Matrix3::Matrix3()
 {
diff --git a/gazebo/math/Matrix3.hh b/gazebo/math/Matrix3.hh
index 56feda7..cfa043a 100644
--- a/gazebo/math/Matrix3.hh
+++ b/gazebo/math/Matrix3.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,8 @@
 
 #include <assert.h>
 
-#include "math/Vector3.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class Matrix3 Matrix3hh math/gzmath.hh
     /// \brief A 3x3 matrix class
-    class Matrix3
+    class GAZEBO_VISIBLE Matrix3
     {
       /// \brief Constructor
       public: Matrix3();
@@ -138,6 +139,17 @@ namespace gazebo
       /// \return True if equal (using the default tolerance of 1e-6)
       public: bool operator==(const Matrix3 &_m) const;
 
+      /// \brief Matrix times Vector3 operator
+      /// \param[in] _v a Vector3
+      /// \return this * _v
+      public: inline math::Vector3 operator*(const math::Vector3 &_v) const
+              {
+                return math::Vector3(
+                  this->m[0][0]*_v.x + this->m[0][1]*_v.y + this->m[0][2]*_v.z,
+                  this->m[1][0]*_v.x + this->m[1][1]*_v.y + this->m[1][2]*_v.z,
+                  this->m[2][0]*_v.x + this->m[2][1]*_v.y + this->m[2][2]*_v.z);
+              }
+
       /// \brief Array subscript operator
       /// \param[in] _row row index
       /// \return a pointer to the row
@@ -176,6 +188,12 @@ namespace gazebo
               return _out;
             }
 
+      /// \brief Identity matrix
+      public: static const Matrix3 IDENTITY;
+
+      /// \brief Zero matrix
+      public: static const Matrix3 ZERO;
+
       /// \brief the 3x3 matrix
       protected: double m[3][3];
 
diff --git a/gazebo/math/Matrix3_TEST.cc b/gazebo/math/Matrix3_TEST.cc
index 153609b..0a7689d 100644
--- a/gazebo/math/Matrix3_TEST.cc
+++ b/gazebo/math/Matrix3_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,10 +18,13 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/math/Matrix3.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(Matrix3Test, Matrix3)
+class Matrix3Test : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(Matrix3Test, Matrix3)
 {
   {
     math::Matrix3 matrix;
@@ -50,4 +53,53 @@ TEST(Matrix3Test, Matrix3)
   EXPECT_THROW(matrix.SetCol(3, math::Vector3(1, 1, 1)), std::string);
 }
 
+TEST_F(Matrix3Test, Multiplication)
+{
+  {
+    // Multiply arbitrary matrix by zeros of different sizes
+    math::Matrix3 matrix(1, 2, 3, 4, 5, 6, 7, 8, 9);
+
+    // Scalar 0
+    EXPECT_EQ(math::Matrix3::ZERO, matrix * 0);
+    EXPECT_EQ(math::Matrix3::ZERO, 0 * matrix);
+
+    // Vector3::Zero
+    EXPECT_EQ(math::Vector3::Zero, matrix * math::Vector3::Zero);
+    // left multiply with Vector3 not implemented
+
+    // Matrix3::ZERO
+    EXPECT_EQ(math::Matrix3::ZERO, matrix * math::Matrix3::ZERO);
+    EXPECT_EQ(math::Matrix3::ZERO, math::Matrix3::ZERO * matrix);
+  }
+
+  {
+    // Multiply arbitrary matrix by identity values
+    math::Matrix3 matrix(1, 2, 3, 4, 5, 6, 7, 8, 9);
+
+    // scalar 1.0
+    EXPECT_EQ(matrix, matrix * 1.0);
+    EXPECT_EQ(matrix, 1.0 * matrix);
+
+    // Vector3::Unit[X|Y|Z]
+    EXPECT_EQ(math::Vector3(matrix[0][0], matrix[1][0], matrix[2][0]),
+              matrix * math::Vector3::UnitX);
+    EXPECT_EQ(math::Vector3(matrix[0][1], matrix[1][1], matrix[2][1]),
+              matrix * math::Vector3::UnitY);
+    EXPECT_EQ(math::Vector3(matrix[0][2], matrix[1][2], matrix[2][2]),
+              matrix * math::Vector3::UnitZ);
+
+    // Matrix3::IDENTITY
+    EXPECT_EQ(matrix, matrix * math::Matrix3::IDENTITY);
+    EXPECT_EQ(matrix, math::Matrix3::IDENTITY * matrix);
+  }
+
+  {
+    // Multiply arbitrary matrix by itself
+    math::Matrix3 matrix(1, 2, 3, 4, 5, 6, 7, 8, 9);
+    math::Matrix3 matrix2(30,  36,  42,
+                          66,  81,  96,
+                         102, 126, 150);
 
+    EXPECT_EQ(matrix * matrix, matrix2);
+  }
+}
diff --git a/gazebo/math/Matrix4.cc b/gazebo/math/Matrix4.cc
index ff7184b..63b7092 100644
--- a/gazebo/math/Matrix4.cc
+++ b/gazebo/math/Matrix4.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,10 +16,10 @@
 */
 #include <string.h>
 
-#include "math/Helpers.hh"
-#include "math/Matrix4.hh"
-#include "math/Quaternion.hh"
-#include "math/Pose.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/math/Matrix4.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/math/Pose.hh"
 
 using namespace gazebo;
 using namespace math;
diff --git a/gazebo/math/Matrix4.hh b/gazebo/math/Matrix4.hh
index 5aa1f90..b2e757d 100644
--- a/gazebo/math/Matrix4.hh
+++ b/gazebo/math/Matrix4.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,8 +20,9 @@
 #include <assert.h>
 #include <iostream>
 
-#include "math/Vector3.hh"
-#include "math/Matrix3.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Matrix3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class Matrix4 Matrix4.hh math/gzmath.hh
     /// \brief A 3x3 matrix class
-    class Matrix4
+    class GAZEBO_VISIBLE Matrix4
     {
       /// \brief Constructor
       public: Matrix4();
diff --git a/gazebo/math/Plane.cc b/gazebo/math/Plane.cc
index a241e19..35e2ca3 100644
--- a/gazebo/math/Plane.cc
+++ b/gazebo/math/Plane.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
 */
-#include "math/Plane.hh"
+#include "gazebo/math/Plane.hh"
 
 using namespace gazebo;
 using namespace math;
diff --git a/gazebo/math/Plane.hh b/gazebo/math/Plane.hh
index 5b4111a..0e988ed 100644
--- a/gazebo/math/Plane.hh
+++ b/gazebo/math/Plane.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,8 +17,9 @@
 #ifndef _PLANE_HH_
 #define _PLANE_HH_
 
-#include "math/Vector3.hh"
-#include "math/Vector2d.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Vector2d.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,7 @@ namespace gazebo
 
     /// \class Plane Plane.hh math/gzmath.hh
     /// \brief A plane and related functions.
-    class Plane
+    class GAZEBO_VISIBLE Plane
     {
       /// \brief Constructor
       public: Plane();
diff --git a/gazebo/math/Plane_TEST.cc b/gazebo/math/Plane_TEST.cc
index c2a8a56..a66f9b8 100644
--- a/gazebo/math/Plane_TEST.cc
+++ b/gazebo/math/Plane_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,13 @@
 
 #include "gazebo/math/Helpers.hh"
 #include "gazebo/math/Plane.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(PlaneTest, Plane)
+class PlaneTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(PlaneTest, Plane)
 {
   {
     math::Plane plane;
diff --git a/gazebo/math/Pose.cc b/gazebo/math/Pose.cc
index 41e4818..7761798 100644
--- a/gazebo/math/Pose.cc
+++ b/gazebo/math/Pose.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
  * Date: 03 Apr 2007
  */
 
-#include "math/Pose.hh"
+#include "gazebo/math/Pose.hh"
 
 using namespace gazebo;
 using namespace math;
@@ -64,6 +64,13 @@ void Pose::Set(const Vector3 &_pos, const Quaternion &_rot)
 }
 
 //////////////////////////////////////////////////
+void Pose::Set(const Vector3 &_pos, const Vector3 &_rpy)
+{
+  this->pos = _pos;
+  this->rot.SetFromEuler(_rpy);
+}
+
+//////////////////////////////////////////////////
 void Pose::Set(double _x, double _y, double _z,
                double _roll, double _pitch, double _yaw)
 {
@@ -132,6 +139,14 @@ Pose Pose::operator*(const Pose &pose)
 }
 
 //////////////////////////////////////////////////
+Pose &Pose::operator=(const Pose &_pose)
+{
+  this->pos = _pose.pos;
+  this->rot = _pose.rot;
+  return *this;
+}
+
+//////////////////////////////////////////////////
 Vector3 Pose::CoordPositionAdd(const Vector3 &_pos) const
 {
   Quaternion tmp;
diff --git a/gazebo/math/Pose.hh b/gazebo/math/Pose.hh
index f745d6e..6ea166e 100644
--- a/gazebo/math/Pose.hh
+++ b/gazebo/math/Pose.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,8 +24,9 @@
 
 #include <iostream>
 
-#include "math/Vector3.hh"
-#include "math/Quaternion.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,7 +37,7 @@ namespace gazebo
 
     /// \class Pose Pose.hh math/gzmath.hh
     /// \brief Encapsulates a position and rotation in three space
-    class Pose
+    class GAZEBO_VISIBLE Pose
     {
       /// \brief math::Pose(0, 0, 0, 0, 0, 0)
       public: static const Pose Zero;
@@ -71,6 +72,11 @@ namespace gazebo
       /// \param[in] _rot The rotation.
       public: void Set(const Vector3 &_pos, const Quaternion &_rot);
 
+      /// \brief Set the pose from  pos and rpy vectors
+      /// \param[in] _pos The position.
+      /// \param[in] _rpy The rotation expressed as Euler angles.
+      public: void Set(const Vector3 &_pos, const Vector3 &_rpy);
+
       /// \brief Set the pose from a six tuple.
       /// \param[in] _x x position in meters.
       /// \param[in] _y y position in meters.
@@ -96,6 +102,9 @@ namespace gazebo
       public: Pose GetInverse() const;
 
       /// \brief Addition operator
+      /// A is the transform from O to P specified in frame O
+      /// B is the transform from P to Q specified in frame P
+      /// then, B + A is the transform from O to Q specified in frame O
       /// \param[in] _pose Pose to add to this pose
       /// \return The resulting pose
       public: Pose operator+(const Pose &_pose) const;
@@ -106,6 +115,8 @@ namespace gazebo
       public: const Pose &operator+=(const Pose &_pose);
 
       /// \brief Negation operator
+      /// A is the transform from O to P in frame O
+      /// then -A is transform from P to O specified in frame P
       /// \return The resulting pose
       public: inline Pose operator-() const
               {
@@ -113,6 +124,9 @@ namespace gazebo
               }
 
       /// \brief Subtraction operator
+      /// A is the transform from O to P in frame O
+      /// B is the transform from O to Q in frame O
+      /// B - A is the transform from P to Q in frame P
       /// \param[in] _pose Pose to subtract from this one
       /// \return The resulting pose
       public: inline Pose operator-(const Pose &_pose) const
@@ -141,6 +155,10 @@ namespace gazebo
       /// \return itself
       public: Pose operator*(const Pose &_pose);
 
+      /// \brief Equal operator
+      /// \param[in] _pose Pose to copy
+      public: Pose &operator=(const Pose &_pose);
+
       /// \brief Add one point to a vector: result = this + pos
       /// \param[in] _pos Position to add to this pose
       /// \return the resulting position
@@ -180,7 +198,6 @@ namespace gazebo
                 return result;
               }
 
-
       /// \brief Find the inverse of a pose; i.e., if b = this + a, given b and
       ///        this, find a
       /// \param[in] _b the other pose
@@ -198,12 +215,6 @@ namespace gazebo
       /// \param[in] _precision
       public: void Round(int _precision);
 
-      /// \brief The position
-      public: Vector3 pos;
-
-      /// \brief The rotation
-      public: Quaternion rot;
-
       /// \brief Stream insertion operator
       /// \param[in] _out output stream
       /// \param[in] _pose pose to output
@@ -227,6 +238,12 @@ namespace gazebo
               _in >> _pose.pos >> _pose.rot;
               return _in;
             }
+
+      /// \brief The position
+      public: Vector3 pos;
+
+      /// \brief The rotation
+      public: Quaternion rot;
     };
     /// \}
   }
diff --git a/gazebo/math/Pose_TEST.cc b/gazebo/math/Pose_TEST.cc
index 8d7f2cf..5bdcd7a 100644
--- a/gazebo/math/Pose_TEST.cc
+++ b/gazebo/math/Pose_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,13 @@
 
 #include "gazebo/math/Helpers.hh"
 #include "gazebo/math/Pose.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(PoseTest, Pose)
+class PoseTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(PoseTest, Pose)
 {
   {
     // test hypothesis that if
diff --git a/gazebo/math/Quaternion.cc b/gazebo/math/Quaternion.cc
index dc080ff..997a786 100644
--- a/gazebo/math/Quaternion.cc
+++ b/gazebo/math/Quaternion.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,8 @@
  * Date: 03 Apr 2007
  */
 #include <math.h>
-#include "math/Helpers.hh"
-#include "math/Quaternion.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/math/Quaternion.hh"
 
 using namespace gazebo;
 using namespace math;
@@ -158,7 +158,7 @@ Quaternion Quaternion::GetExp() const
 void Quaternion::Invert()
 {
   this->Normalize();
-  this->w = this->w;
+  // this->w = this->w;
   this->x = -this->x;
   this->y = -this->y;
   this->z = -this->z;
@@ -428,8 +428,8 @@ Vector3 Quaternion::RotateVectorReverse(Vector3 _vec) const
 //////////////////////////////////////////////////
 bool Quaternion::IsFinite() const
 {
-  return finite(this->w) && finite(this->x) && finite(this->y) &&
-         finite(this->z);
+  return std::isfinite(this->w) && std::isfinite(this->x) &&
+         std::isfinite(this->y) && std::isfinite(this->z);
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/math/Quaternion.hh b/gazebo/math/Quaternion.hh
index 1ae86fc..0293cb5 100644
--- a/gazebo/math/Quaternion.hh
+++ b/gazebo/math/Quaternion.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@
 #include "gazebo/math/Vector3.hh"
 #include "gazebo/math/Matrix3.hh"
 #include "gazebo/math/Matrix4.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -41,7 +42,7 @@ namespace gazebo
 
   /// \class Quaternion Quaternion.hh math/gzmath.hh
   /// \brief A quaternion class
-  class Quaternion
+  class GAZEBO_VISIBLE Quaternion
   {
     /// \brief Default Constructor
     public: Quaternion();
@@ -146,7 +147,8 @@ namespace gazebo
     /// \param[in] _z z
     public: void Set(double _u, double _x, double _y, double _z);
 
-    /// \brief Set the quaternion from Euler angles
+    /// \brief Set the quaternion from Euler angles. The order of operations
+    /// are roll, pitch, yaw.
     /// \param[in] vec  Euler angle
     public: void SetFromEuler(const Vector3 &_vec);
 
@@ -275,13 +277,13 @@ namespace gazebo
     /// \brief Correct any nan
     public: inline void Correct()
             {
-              if (!finite(this->x))
+              if (!std::isfinite(this->x))
                 this->x = 0;
-              if (!finite(this->y))
+              if (!std::isfinite(this->y))
                 this->y = 0;
-              if (!finite(this->z))
+              if (!std::isfinite(this->z))
                 this->z = 0;
-              if (!finite(this->w))
+              if (!std::isfinite(this->w))
                 this->w = 1;
 
               if (math::equal(this->w, 0.0) &&
@@ -377,13 +379,13 @@ namespace gazebo
     public: friend std::istream &operator>>(std::istream &_in,
                                              gazebo::math::Quaternion &_q)
     {
-      Angle r, p, y;
+      Angle roll, pitch, yaw;
 
       // Skip white spaces
       _in.setf(std::ios_base::skipws);
-      _in >> r >> p >> y;
+      _in >> roll >> pitch >> yaw;
 
-      _q.SetFromEuler(Vector3(*r, *p, *y));
+      _q.SetFromEuler(Vector3(*roll, *pitch, *yaw));
 
       return _in;
     }
diff --git a/gazebo/math/Quaternion_TEST.cc b/gazebo/math/Quaternion_TEST.cc
index ad8f4ff..1bd1497 100644
--- a/gazebo/math/Quaternion_TEST.cc
+++ b/gazebo/math/Quaternion_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,12 +18,14 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/math/Helpers.hh"
-#include "gazebo/common/Console.hh"
 #include "gazebo/math/Quaternion.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(QuaternionTest, Quaternion)
+class QuaternionTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(QuaternionTest, Quaternion)
 {
   {
     math::Quaternion q;
@@ -131,8 +133,8 @@ TEST(QuaternionTest, Quaternion)
   q = q * 5.0;
   EXPECT_TRUE(q == math::Quaternion(7.67918, -1.184, 2.7592, 4.0149));
 
-  gzerr << "[" << q.w << ", " << q.x << ", " << q.y << ", " << q.z << "]\n";
-  gzerr << q.RotateVectorReverse(math::Vector3(1, 2, 3)) << "\n";
+  std::cerr << "[" << q.w << ", " << q.x << ", " << q.y << ", " << q.z << "]\n";
+  std::cerr << q.RotateVectorReverse(math::Vector3(1, 2, 3)) << "\n";
 
   EXPECT_TRUE(q.RotateVectorReverse(math::Vector3(1, 2, 3)) ==
       math::Vector3(-0.104115, 0.4975, 3.70697));
@@ -173,9 +175,10 @@ TEST(QuaternionTest, Quaternion)
     math::Vector3 v = math::Vector3(1, 2, 3);
     math::Vector3 r1 = q.RotateVector(v);
     math::Vector3 r2 = q.RotateVectorReverse(v);
-    gzdbg << "[" << q.w << ", " << q.x << ", " << q.y << ", " << q.z << "]\n";
-    gzdbg << " forward turns [" << v << "] to [" << r1 << "]\n";
-    gzdbg << " reverse turns [" << v << "] to [" << r2 << "]\n";
+    std::cout << "[" << q.w << ", " << q.x << ", "
+      << q.y << ", " << q.z << "]\n";
+    std::cout << " forward turns [" << v << "] to [" << r1 << "]\n";
+    std::cout << " reverse turns [" << v << "] to [" << r2 << "]\n";
     EXPECT_TRUE(r1 == math::Vector3(-1, -2, 3));
     EXPECT_TRUE(r2 == math::Vector3(-1, -2, 3));
   }
@@ -187,12 +190,13 @@ TEST(QuaternionTest, Quaternion)
     math::Vector3 v = math::Vector3(1, 2, 3);
     math::Vector3 r1 = q.RotateVector(v);
     math::Vector3 r2 = q.RotateVectorReverse(v);
-    gzdbg << "[" << q.w << ", " << q.x << ", " << q.y << ", " << q.z << "]\n";
-    gzdbg << " forward turns [" << v << "] to [" << r1 << "]\n";
-    gzdbg << " reverse turns [" << v << "] to [" << r2 << "]\n";
-    gzdbg << " x axis [" << q.GetXAxis() << "]\n";
-    gzdbg << " y axis [" << q.GetYAxis() << "]\n";
-    gzdbg << " z axis [" << q.GetZAxis() << "]\n";
+    std::cout << "[" << q.w << ", " << q.x << ", "
+      << q.y << ", " << q.z << "]\n";
+    std::cout << " forward turns [" << v << "] to [" << r1 << "]\n";
+    std::cout << " reverse turns [" << v << "] to [" << r2 << "]\n";
+    std::cout << " x axis [" << q.GetXAxis() << "]\n";
+    std::cout << " y axis [" << q.GetYAxis() << "]\n";
+    std::cout << " z axis [" << q.GetZAxis() << "]\n";
     EXPECT_TRUE(r1 == math::Vector3(-2, 1, 3));
     EXPECT_TRUE(r2 == math::Vector3(2, -1, 3));
     EXPECT_TRUE(q.GetInverse().GetXAxis() == math::Vector3(0, -1, 0));
@@ -204,10 +208,11 @@ TEST(QuaternionTest, Quaternion)
     // now try a harder case (axis[1,2,3], rotation[0.3*pi])
     // verified with octave
     q.SetFromAxis(math::Vector3(1, 2, 3), 0.3*M_PI);
-    gzdbg << "[" << q.w << ", " << q.x << ", " << q.y << ", " << q.z << "]\n";
-    gzdbg << " x [" << q.GetInverse().GetXAxis() << "]\n";
-    gzdbg << " y [" << q.GetInverse().GetYAxis() << "]\n";
-    gzdbg << " z [" << q.GetInverse().GetZAxis() << "]\n";
+    std::cout << "[" << q.w << ", " << q.x << ", "
+      << q.y << ", " << q.z << "]\n";
+    std::cout << " x [" << q.GetInverse().GetXAxis() << "]\n";
+    std::cout << " y [" << q.GetInverse().GetYAxis() << "]\n";
+    std::cout << " z [" << q.GetInverse().GetZAxis() << "]\n";
     EXPECT_TRUE(q.GetInverse().GetXAxis() ==
                 math::Vector3(0.617229, -0.589769, 0.520770));
     EXPECT_TRUE(q.GetInverse().GetYAxis() ==
diff --git a/gazebo/math/Rand.cc b/gazebo/math/Rand.cc
index 94f5ee8..fade116 100644
--- a/gazebo/math/Rand.cc
+++ b/gazebo/math/Rand.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@
 #include <unistd.h>
 #include <ctime>
 
-#include "math/Rand.hh"
+#include "gazebo/math/Rand.hh"
 
 using namespace gazebo;
 using namespace math;
diff --git a/gazebo/math/Rand.hh b/gazebo/math/Rand.hh
index 96855e3..3da7f0b 100644
--- a/gazebo/math/Rand.hh
+++ b/gazebo/math/Rand.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #define _RAND_HH_
 
 #include <boost/random.hpp>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -56,7 +57,7 @@ namespace gazebo
 
     /// \class Rand Rand.hh gzmath/gzmath.hh
     /// \brief Random number generator class
-    class Rand
+    class GAZEBO_VISIBLE Rand
     {
       /// \brief Set the seed value.
       /// \param[in] _seed The seed used to initialize the randon number
diff --git a/gazebo/math/Rand_TEST.cc b/gazebo/math/Rand_TEST.cc
index 3bdf254..67f5f26 100644
--- a/gazebo/math/Rand_TEST.cc
+++ b/gazebo/math/Rand_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,14 @@
 
 #include "gazebo/math/Helpers.hh"
 #include "gazebo/math/Rand.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(RandTest, Rand)
+class RandTest : public gazebo::testing::AutoLogFixture { };
+
+//////////////////////////////////////////////////
+TEST_F(RandTest, Rand)
 {
   double d;
   int i;
@@ -47,3 +51,25 @@ TEST(RandTest, Rand)
     EXPECT_TRUE(math::equal(d, 0.985827));
   }
 }
+
+//////////////////////////////////////////////////
+TEST_F(RandTest, SetSeed)
+{
+  int N = 10;
+  std::vector<int> first;
+  std::vector<int> second;
+
+  for (int i = 0; i < N; ++i)
+  {
+    math::Rand::SetSeed(i);
+    first.push_back(math::Rand::GetIntUniform(-10, 10));
+    second.push_back(math::Rand::GetIntUniform(-10, 10));
+  }
+
+  for (int i = 0; i < N; ++i)
+  {
+    math::Rand::SetSeed(i);
+    EXPECT_EQ(first[i], math::Rand::GetIntUniform(-10, 10));
+    EXPECT_EQ(second[i], math::Rand::GetIntUniform(-10, 10));
+  }
+}
diff --git a/gazebo/math/RotationSpline.cc b/gazebo/math/RotationSpline.cc
index e2ac77f..a418913 100644
--- a/gazebo/math/RotationSpline.cc
+++ b/gazebo/math/RotationSpline.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/math/RotationSpline.hh b/gazebo/math/RotationSpline.hh
index 5e15278..56220e5 100644
--- a/gazebo/math/RotationSpline.hh
+++ b/gazebo/math/RotationSpline.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,8 @@
 #define _ROTATIONSPLINE_HH_
 
 #include <vector>
-#include "math/Quaternion.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,7 @@ namespace gazebo
 
     /// \class RotationSpline RotationSpline.hh math/gzmath.hh
     /// \brief Spline for rotations
-    class  RotationSpline
+    class GAZEBO_VISIBLE  RotationSpline
     {
         /// \brief Constructor. Sets the autoCalc to true
         public: RotationSpline();
diff --git a/gazebo/math/RotationSpline_TEST.cc b/gazebo/math/RotationSpline_TEST.cc
index 8e02f86..7592048 100644
--- a/gazebo/math/RotationSpline_TEST.cc
+++ b/gazebo/math/RotationSpline_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,10 +21,13 @@
 #include "gazebo/math/Vector3.hh"
 #include "gazebo/math/Quaternion.hh"
 #include "gazebo/math/RotationSpline.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(RotationSplineTest, RotationSpline)
+class RotationSplineTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(RotationSplineTest, RotationSpline)
 {
   math::RotationSpline s;
 
diff --git a/gazebo/math/Spline.cc b/gazebo/math/Spline.cc
index 861ec6a..d5e29fc 100644
--- a/gazebo/math/Spline.cc
+++ b/gazebo/math/Spline.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/math/Spline.hh b/gazebo/math/Spline.hh
index f3bffd7..91b31bc 100644
--- a/gazebo/math/Spline.hh
+++ b/gazebo/math/Spline.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,8 +21,9 @@
 
 #include <vector>
 
-#include "math/Vector3.hh"
-#include "math/Matrix4.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Matrix4.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,7 +34,7 @@ namespace gazebo
 
     /// \class Spline Spline.hh math/gzmath.hh
     /// \brief Splines
-    class Spline
+    class GAZEBO_VISIBLE Spline
     {
       /// \brief constructor
       public: Spline();
diff --git a/gazebo/math/Spline_TEST.cc b/gazebo/math/Spline_TEST.cc
index d506eac..b2cdeae 100644
--- a/gazebo/math/Spline_TEST.cc
+++ b/gazebo/math/Spline_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,13 @@
 
 #include "gazebo/math/Vector3.hh"
 #include "gazebo/math/Spline.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(SplineTest, Spline)
+class SplineTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(SplineTest, Spline)
 {
   math::Spline s;
 
diff --git a/gazebo/math/Vector2d.cc b/gazebo/math/Vector2d.cc
index 2db7377..84a4054 100644
--- a/gazebo/math/Vector2d.cc
+++ b/gazebo/math/Vector2d.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,8 +20,8 @@
  */
 
 #include <math.h>
-#include "math/Helpers.hh"
-#include "math/Vector2d.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/math/Vector2d.hh"
 
 using namespace gazebo;
 using namespace math;
@@ -72,12 +72,11 @@ void Vector2d::Set(double _x, double _y)
   this->y = _y;
 }
 
-
 //////////////////////////////////////////////////
-Vector2d &Vector2d::operator =(const Vector2d &pt)
+Vector2d &Vector2d::operator =(const Vector2d &_pt)
 {
-  this->x = pt.x;
-  this->y = pt.y;
+  this->x = _pt.x;
+  this->y = _pt.y;
 
   return *this;
 }
@@ -188,7 +187,7 @@ bool Vector2d::operator ==(const Vector2d &pt) const
 //////////////////////////////////////////////////
 bool Vector2d::IsFinite() const
 {
-  return finite(this->x) && finite(this->y);
+  return std::isfinite(this->x) && std::isfinite(this->y);
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/math/Vector2d.hh b/gazebo/math/Vector2d.hh
index ddac8bf..3c3de21 100644
--- a/gazebo/math/Vector2d.hh
+++ b/gazebo/math/Vector2d.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
 #include <math.h>
 #include <iostream>
 #include <fstream>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class Vector2d Vector2D.hh math/gzmath.hh
     /// \brief Generic double x, y vector
-    class Vector2d
+    class GAZEBO_VISIBLE Vector2d
     {
       /// \brief Constructor
       public: Vector2d();
diff --git a/gazebo/math/Vector2d_TEST.cc b/gazebo/math/Vector2d_TEST.cc
index b3558a1..8a70318 100644
--- a/gazebo/math/Vector2d_TEST.cc
+++ b/gazebo/math/Vector2d_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,13 @@
 
 #include "gazebo/math/Helpers.hh"
 #include "gazebo/math/Vector2d.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(Vector2dTest, Vector2d)
+class Vector2dTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(Vector2dTest, Vector2d)
 {
   {
     math::Vector2d v;
diff --git a/gazebo/math/Vector2i.cc b/gazebo/math/Vector2i.cc
index c6dd0fe..d14acab 100644
--- a/gazebo/math/Vector2i.cc
+++ b/gazebo/math/Vector2i.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
  */
 
 #include <math.h>
-#include "math/Vector2i.hh"
+#include "gazebo/math/Vector2i.hh"
 
 using namespace gazebo;
 using namespace math;
@@ -71,123 +71,125 @@ void Vector2i::Set(int _x, int _y)
   this->y = _y;
 }
 
-
 //////////////////////////////////////////////////
-Vector2i &Vector2i::operator =(const Vector2i &pt)
+Vector2i &Vector2i::operator =(const Vector2i &_pt)
 {
-  this->x = pt.x;
-  this->y = pt.y;
+  this->x = _pt.x;
+  this->y = _pt.y;
 
   return *this;
 }
 
 //////////////////////////////////////////////////
-const Vector2i &Vector2i::operator =(int value)
+const Vector2i &Vector2i::operator =(int _value)
 {
-  this->x = value;
-  this->y = value;
+  this->x = _value;
+  this->y = _value;
 
   return *this;
 }
 
-
-
 //////////////////////////////////////////////////
-Vector2i Vector2i::operator+(const Vector2i &pt) const
+Vector2i Vector2i::operator+(const Vector2i &_pt) const
 {
-  return Vector2i(this->x + pt.x, this->y + pt.y);
+  return Vector2i(this->x + _pt.x, this->y + _pt.y);
 }
 
-const Vector2i &Vector2i::operator+=(const Vector2i &pt)
+//////////////////////////////////////////////////
+const Vector2i &Vector2i::operator+=(const Vector2i &_pt)
 {
-  this->x += pt.x;
-  this->y += pt.y;
+  this->x += _pt.x;
+  this->y += _pt.y;
 
   return *this;
 }
 
 //////////////////////////////////////////////////
-Vector2i Vector2i::operator-(const Vector2i &pt) const
+Vector2i Vector2i::operator-(const Vector2i &_pt) const
 {
-  return Vector2i(this->x - pt.x, this->y - pt.y);
+  return Vector2i(this->x - _pt.x, this->y - _pt.y);
 }
 
-const Vector2i &Vector2i::operator-=(const Vector2i &pt)
+//////////////////////////////////////////////////
+const Vector2i &Vector2i::operator-=(const Vector2i &_pt)
 {
-  this->x -= pt.x;
-  this->y -= pt.y;
+  this->x -= _pt.x;
+  this->y -= _pt.y;
 
   return *this;
 }
 
-
 //////////////////////////////////////////////////
-
-const Vector2i Vector2i::operator/(const Vector2i &pt) const
+const Vector2i Vector2i::operator/(const Vector2i &_pt) const
 {
-  return Vector2i(this->x / pt.x, this->y / pt.y);
+  return Vector2i(this->x / _pt.x, this->y / _pt.y);
 }
 
-const Vector2i &Vector2i::operator/=(const Vector2i &pt)
+//////////////////////////////////////////////////
+const Vector2i &Vector2i::operator/=(const Vector2i &_pt)
 {
-  this->x /= pt.x;
-  this->y /= pt.y;
+  this->x /= _pt.x;
+  this->y /= _pt.y;
 
   return *this;
 }
 
-const Vector2i Vector2i::operator/(int v) const
+//////////////////////////////////////////////////
+const Vector2i Vector2i::operator/(int _v) const
 {
-  return Vector2i(this->x / v, this->y / v);
+  return Vector2i(this->x / _v, this->y / _v);
 }
 
-const Vector2i &Vector2i::operator/=(int v)
+//////////////////////////////////////////////////
+const Vector2i &Vector2i::operator/=(int _v)
 {
-  this->x /= v;
-  this->y /= v;
+  this->x /= _v;
+  this->y /= _v;
 
   return *this;
 }
 
-
-
 //////////////////////////////////////////////////
-const Vector2i Vector2i::operator*(const Vector2i &pt) const
+const Vector2i Vector2i::operator*(const Vector2i &_pt) const
 {
-  return Vector2i(this->x * pt.x, this->y * pt.y);
+  return Vector2i(this->x * _pt.x, this->y * _pt.y);
 }
 
-const Vector2i &Vector2i::operator*=(const Vector2i &pt)
+//////////////////////////////////////////////////
+const Vector2i &Vector2i::operator*=(const Vector2i &_pt)
 {
-  this->x *= pt.x;
-  this->y *= pt.y;
+  this->x *= _pt.x;
+  this->y *= _pt.y;
 
   return *this;
 }
 
-const Vector2i Vector2i::operator*(int v) const
+//////////////////////////////////////////////////
+const Vector2i Vector2i::operator*(int _v) const
 {
-  return Vector2i(this->x * v, this->y * v);
+  return Vector2i(this->x * _v, this->y * _v);
 }
 
-const Vector2i &Vector2i::operator*=(int v)
+//////////////////////////////////////////////////
+const Vector2i &Vector2i::operator*=(int _v)
 {
-  this->x *= v;
-  this->y *= v;
+  this->x *= _v;
+  this->y *= _v;
 
   return *this;
 }
 
 //////////////////////////////////////////////////
-bool Vector2i::operator ==(const Vector2i &pt) const
+bool Vector2i::operator ==(const Vector2i &_pt) const
 {
-  return this->x == pt.x && this->y == pt.y;
+  return this->x == _pt.x && this->y == _pt.y;
 }
 
 //////////////////////////////////////////////////
 bool Vector2i::IsFinite() const
 {
-  return finite(this->x) && finite(this->y);
+  // integer types are always finite
+  return true;
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/math/Vector2i.hh b/gazebo/math/Vector2i.hh
index 0435c38..4fd21b0 100644
--- a/gazebo/math/Vector2i.hh
+++ b/gazebo/math/Vector2i.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
 #include <math.h>
 #include <iostream>
 #include <fstream>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class Vector2i Vector2i.hh math/gzmath.hh
     /// \brief Generic integer x, y vector
-    class Vector2i
+    class GAZEBO_VISIBLE Vector2i
     {
       /// \brief Constructor
       public: Vector2i();
diff --git a/gazebo/math/Vector2i_TEST.cc b/gazebo/math/Vector2i_TEST.cc
index f7121f9..969685f 100644
--- a/gazebo/math/Vector2i_TEST.cc
+++ b/gazebo/math/Vector2i_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,10 +18,13 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/math/Vector2i.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(Vector2iTest, Vector2i)
+class Vector2iTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(Vector2iTest, Vector2i)
 {
   {
     math::Vector2i v;
diff --git a/gazebo/math/Vector3.cc b/gazebo/math/Vector3.cc
index c2c0b65..d9f6e54 100644
--- a/gazebo/math/Vector3.cc
+++ b/gazebo/math/Vector3.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,8 @@
  * Date: 4 Apr 2007
  */
 
-#include "math/Helpers.hh"
-#include "math/Vector3.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/math/Vector3.hh"
 
 using namespace gazebo;
 using namespace math;
@@ -323,15 +323,16 @@ bool Vector3::operator ==(const Vector3 &_pt) const
 }
 
 //////////////////////////////////////////////////
-bool Vector3::operator!=(const Vector3 &pt) const
+bool Vector3::operator!=(const Vector3 &_pt) const
 {
-  return !(*this == pt);
+  return !(*this == _pt);
 }
 
 //////////////////////////////////////////////////
 bool Vector3::IsFinite() const
 {
-  return finite(this->x) && finite(this->y) && finite(this->z);
+  return std::isfinite(this->x) && std::isfinite(this->y) &&
+         std::isfinite(this->z);
 }
 
 //////////////////////////////////////////////////
@@ -350,6 +351,7 @@ double Vector3::operator[](unsigned int index) const
   }
 }
 
+//////////////////////////////////////////////////
 /// Round all values to _decimalPlaces
 void Vector3::Round(int _precision)
 {
@@ -358,6 +360,7 @@ void Vector3::Round(int _precision)
   this->z = precision(this->z, _precision);
 }
 
+//////////////////////////////////////////////////
 /// Returns true if the two vectors are exacatly equal
 bool Vector3::Equal(const Vector3 &_v) const
 {
diff --git a/gazebo/math/Vector3.hh b/gazebo/math/Vector3.hh
index c1fb4e4..db3e2ff 100644
--- a/gazebo/math/Vector3.hh
+++ b/gazebo/math/Vector3.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@
 #include <fstream>
 
 #include "gazebo/math/Helpers.hh"
-#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -40,7 +40,7 @@ namespace gazebo
     /// \brief The Vector3 class represents the generic vector containing 3
     ///        elements.  Since it's commonly used to keep coordinate system
     ///        related information, its elements are labeled by x, y, z.
-    class Vector3
+    class GAZEBO_VISIBLE Vector3
     {
       /// \brief math::Vector3(0, 0, 0)
       public: static const Vector3 Zero;
@@ -277,11 +277,11 @@ namespace gazebo
       /// \brief Corrects any nan values
       public: inline void Correct()
               {
-                if (!finite(this->x))
+                if (!std::isfinite(this->x))
                   this->x = 0;
-                if (!finite(this->y))
+                if (!std::isfinite(this->y))
                   this->y = 0;
-                if (!finite(this->z))
+                if (!std::isfinite(this->z))
                   this->z = 0;
               }
 
@@ -336,4 +336,3 @@ namespace gazebo
   }
 }
 #endif
-
diff --git a/gazebo/math/Vector3_TEST.cc b/gazebo/math/Vector3_TEST.cc
index 11b53e5..b3e3b97 100644
--- a/gazebo/math/Vector3_TEST.cc
+++ b/gazebo/math/Vector3_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,10 +18,13 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/math/Vector3.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(Vector3Test, Vector3)
+class Vector3Test : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(Vector3Test, Vector3)
 {
   math::Vector3 v;
 
diff --git a/gazebo/math/Vector4.cc b/gazebo/math/Vector4.cc
index e8cddac..00db0cc 100644
--- a/gazebo/math/Vector4.cc
+++ b/gazebo/math/Vector4.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,8 +21,8 @@
 
 #include <math.h>
 
-#include "math/Helpers.hh"
-#include "math/Vector4.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/math/Vector4.hh"
 
 using namespace gazebo;
 using namespace math;
@@ -244,8 +244,8 @@ bool Vector4::operator!=(const Vector4 &pt) const
 //////////////////////////////////////////////////
 bool Vector4::IsFinite() const
 {
-  return finite(this->x) && finite(this->y) && finite(this->z) &&
-         finite(this->w);
+  return std::isfinite(this->x) && std::isfinite(this->y) &&
+         std::isfinite(this->z) && std::isfinite(this->w);
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/math/Vector4.hh b/gazebo/math/Vector4.hh
index 50f4782..d7aab7e 100644
--- a/gazebo/math/Vector4.hh
+++ b/gazebo/math/Vector4.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,7 +24,8 @@
 
 #include <iostream>
 #include <fstream>
-#include "math/Matrix4.hh"
+#include "gazebo/math/Matrix4.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class Vector4 Vector4.hh math/gzmath.hh
     /// \brief double Generic x, y, z, w vector
-    class Vector4
+    class GAZEBO_VISIBLE Vector4
     {
       /// \brief Constructor
       public: Vector4();
diff --git a/gazebo/math/Vector4_TEST.cc b/gazebo/math/Vector4_TEST.cc
index 26fb933..e19194f 100644
--- a/gazebo/math/Vector4_TEST.cc
+++ b/gazebo/math/Vector4_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,10 +18,13 @@
 #include <gtest/gtest.h>
 
 #include "gazebo/math/Vector4.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(Vector4Test, Vector4)
+class Vector4Test : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(Vector4Test, Vector4)
 {
   {
     math::Vector4 v;
diff --git a/gazebo/msgs/CMakeLists.txt b/gazebo/msgs/CMakeLists.txt
index 3906b3f..a113dca 100644
--- a/gazebo/msgs/CMakeLists.txt
+++ b/gazebo/msgs/CMakeLists.txt
@@ -1,11 +1,10 @@
 include (${gazebo_cmake_dir}/GazeboUtils.cmake)
 
-add_subdirectory(test)
-
 set (msgs
   axis.proto
   boxgeom.proto
   camerasensor.proto
+  camera_cmd.proto
   collision.proto
   color.proto
   contact.proto
@@ -17,6 +16,7 @@ set (msgs
   fog.proto
   friction.proto
   geometry.proto
+  gps.proto
   gui_overlay_config.proto
   gui_camera.proto
   gui.proto
@@ -40,6 +40,7 @@ set (msgs
   laserscan_stamped.proto
   light.proto
   link.proto
+  link_data.proto
   log_control.proto
   log_status.proto
   material.proto
@@ -52,15 +53,21 @@ set (msgs
   planegeom.proto
   pid.proto
   plugin.proto
+  pointcloud.proto
   pose.proto
   pose_animation.proto
   pose_stamped.proto
   pose_trajectory.proto
   pose_v.proto
+  poses_stamped.proto
   projector.proto
+  propagation_particle.proto
+  propagation_grid.proto
   publishers.proto
   publish.proto
   quaternion.proto
+  sonar.proto
+  sonar_stamped.proto
   raysensor.proto
   request.proto
   response.proto
@@ -72,8 +79,10 @@ set (msgs
   shadows.proto
   sky.proto
   spheregeom.proto
+  spherical_coordinates.proto
   subscribe.proto
   surface.proto
+  tactile.proto
   test.proto
   time.proto
   topic_info.proto
@@ -81,25 +90,44 @@ set (msgs
   vector2d.proto
   vector3d.proto
   visual.proto
+  wireless_node.proto
+  wireless_nodes.proto
   world_control.proto
   world_reset.proto
   world_stats.proto
   world_modify.proto
+  wrench.proto
+  wrench_stamped.proto
 )
 
 set (msgs_tests_sources
   msgs_TEST.cc
+  MsgFactory_TEST.cc
 )
 gz_build_tests(${msgs_tests_sources})
 
 include_directories(${CMAKE_CURRENT_BINARY_DIR})
 
-gz_add_executable(gazebomsgs_out generator/GazeboGenerator.cc generator/gazebo_generator.cc)
+add_executable(gazebomsgs_out generator/GazeboGenerator.cc generator/gazebo_generator.cc)
 target_link_libraries(gazebomsgs_out ${PROTOBUF_LIBRARY} ${PROTOBUF_PROTOC_LIBRARY} pthread)
 
 set (sources msgs.cc MsgFactory.cc)
 set (headers msgs.hh MsgFactory.hh)
 
+###########################################################
+# Append str to a string property of a target.
+# target: string: target name.
+# property: name of target’s property. e.g: COMPILE_FLAGS, or LINK_FLAGS
+# str: string: string to be appended to the property
+macro(my_append_target_property target property str)
+  get_target_property(current_property ${target} ${property})
+  if(NOT current_property) # property non-existent or empty
+      set_target_properties(${target} PROPERTIES GENERATED TRUE ${property} ${str})
+  else()
+      set_target_properties(${target} PROPERTIES ${property} "${current_property} ${str}")
+  endif()
+endmacro(my_append_target_property)
+
 set(PROTO_SRCS)
 set(PROTO_HDRS)
 foreach(FIL ${msgs})
@@ -109,18 +137,32 @@ foreach(FIL ${msgs})
   list(APPEND PROTO_SRCS "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
   list(APPEND PROTO_HDRS "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
 
-  add_custom_command(TARGET gazebomsgs_out POST_BUILD
+  add_custom_command(
+    OUTPUT
+      "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc"
+      "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
     COMMAND  ${PROTOBUF_PROTOC_EXECUTABLE}
     ARGS --plugin=protoc-gen-gazebomsgs=${CMAKE_CURRENT_BINARY_DIR}/gazebomsgs_out --cpp_out ${CMAKE_CURRENT_BINARY_DIR} --gazebomsgs_out ${CMAKE_CURRENT_BINARY_DIR} --proto_path ${CMAKE_CURRENT_SOURCE_DIR} ${ABS_FIL}
-    DEPENDS ${ABS_FIL}
+    DEPENDS ${ABS_FIL} gazebomsgs_out
     COMMENT "Running C++ protocol buffer compiler on ${FIL}"
     VERBATIM )
 endforeach()
 
 set_source_files_properties(${PROTO_SRCS} ${PROTO_HDRS} PROPERTIES GENERATED TRUE)
-
 gz_add_library(gazebo_msgs ${PROTO_SRCS} ${sources})
-target_link_libraries( gazebo_msgs ${PROTOBUF_LIBRARY} gazebo_sdf_interface)
+# Need to add default visibility to gazebo_msgs
+get_target_property(current_property gazebo_msgs COMPILE_FLAGS)
+if(NOT current_property) # property non-existent or empty
+  set_target_properties(gazebo_msgs PROPERTIES GENERATED TRUE COMPILE_FLAGS "-fvisibility=default")
+else()
+  set_target_properties(gazebo_msgs PROPERTIES COMPILE_FLAGS "${current_property} -fvisibility=default")
+endif()
+target_link_libraries(gazebo_msgs
+  gazebo_common
+  gazebo_math
+  ${PROTOBUF_LIBRARY}
+)
+
 add_dependencies(gazebo_msgs gazebomsgs_out)
 
 set (message_headers "" CACHE INTERNAL "Include dirs description")
@@ -135,3 +177,4 @@ configure_file (${PROJECT_SOURCE_DIR}/gazebo/msgs/MessageTypes.hh.in
 
 gz_install_library(gazebo_msgs)
 gz_install_includes("msgs" ${PROTO_HDRS} ${headers} ${CMAKE_CURRENT_BINARY_DIR}/MessageTypes.hh)
+gz_install_includes("msgs/proto" ${msgs})
diff --git a/gazebo/msgs/MsgFactory.cc b/gazebo/msgs/MsgFactory.cc
index 33907a2..ab77f96 100644
--- a/gazebo/msgs/MsgFactory.cc
+++ b/gazebo/msgs/MsgFactory.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/msgs/MsgFactory.hh b/gazebo/msgs/MsgFactory.hh
index adf6a40..9a8dfc1 100644
--- a/gazebo/msgs/MsgFactory.hh
+++ b/gazebo/msgs/MsgFactory.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #include <vector>
 #include <google/protobuf/message.h>
 #include <boost/shared_ptr.hpp>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +38,7 @@ namespace gazebo
     /// \class MsgFactory MsgFactory.hh msgs/msgs.hh
     /// \brief A factory that generates protobuf message based on a string
     /// type.
-    class MsgFactory
+    class GAZEBO_VISIBLE MsgFactory
     {
       /// \brief Register a message.
       /// \param[in] _msgType Type of message to register.
@@ -67,12 +68,13 @@ namespace gazebo
     /// \param[in] _msgtype Message type name.
     /// \param[in] _classname Class name for message.
     #define GZ_REGISTER_STATIC_MSG(_msgtype, _classname) \
+    GAZEBO_VISIBLE \
     boost::shared_ptr<google::protobuf::Message> New##_classname() \
     { \
       return boost::shared_ptr<gazebo::msgs::_classname>(\
           new gazebo::msgs::_classname); \
     } \
-    class Msg##_classname \
+    class GAZEBO_VISIBLE Msg##_classname \
     { \
       public: Msg##_classname() \
       { \
diff --git a/gazebo/msgs/MsgFactory_TEST.cc b/gazebo/msgs/MsgFactory_TEST.cc
new file mode 100644
index 0000000..12a8085
--- /dev/null
+++ b/gazebo/msgs/MsgFactory_TEST.cc
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <stdio.h>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string/trim.hpp>
+
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/msgs/MsgFactory.hh"
+#include "test_config.h"
+#include "test/util.hh"
+
+class MsgFactory : public gazebo::testing::AutoLogFixture { };
+
+std::string custom_exec(const std::string &_cmd)
+{
+  FILE* pipe = popen(_cmd.c_str(), "r");
+
+  if (!pipe)
+    return "ERROR";
+
+  char buffer[128];
+  std::string result = "";
+
+  while (!feof(pipe))
+  {
+    if (fgets(buffer, 128, pipe) != NULL)
+      result += buffer;
+  }
+
+  pclose(pipe);
+  return result;
+}
+
+/////////////////////////////////////////////////
+/// Check for null when asked for a bad message type
+TEST_F(MsgFactory, BadMsgType)
+{
+  boost::shared_ptr<google::protobuf::Message> msg =
+    gazebo::msgs::MsgFactory::NewMsg("bad");
+  EXPECT_EQ(NULL, msg.get());
+}
+
+/////////////////////////////////////////////////
+/// Check to make sure that NewMsg works properly
+TEST_F(MsgFactory, NewMsg)
+{
+  gazebo::msgs::Vector3d goodMsg;
+  goodMsg.set_x(1.1);
+  goodMsg.set_y(2.2);
+  goodMsg.set_z(3.3);
+
+  std::string serializedData;
+  goodMsg.SerializeToString(&serializedData);
+
+  gazebo::msgs::Vector3dPtr msg =
+    boost::dynamic_pointer_cast<gazebo::msgs::Vector3d>(
+        gazebo::msgs::MsgFactory::NewMsg("gazebo.msgs.Vector3d"));
+
+  msg->ParseFromString(serializedData);
+  EXPECT_NEAR(msg->x(), 1.1, 1e-6);
+  EXPECT_NEAR(msg->y(), 2.2, 1e-6);
+  EXPECT_NEAR(msg->z(), 3.3, 1e-6);
+}
+
+/////////////////////////////////////////////////
+/// Check to make sure that all the proto files have been registered
+TEST_F(MsgFactory, AllTypes)
+{
+  std::vector<std::string> types;
+  gazebo::msgs::MsgFactory::GetMsgTypes(types);
+  std::string protoCount = custom_exec(std::string("ls ") +
+      PROJECT_SOURCE_PATH + "/gazebo/msgs/*.proto | wc -l");
+  boost::trim(protoCount);
+
+  EXPECT_EQ(boost::lexical_cast<size_t>(protoCount), types.size());
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/msgs/camera_cmd.proto b/gazebo/msgs/camera_cmd.proto
new file mode 100644
index 0000000..30de9bf
--- /dev/null
+++ b/gazebo/msgs/camera_cmd.proto
@@ -0,0 +1,12 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface CameraCmd
+/// \brief Message for camera command
+
+import "pose.proto";
+
+message CameraCmd
+{
+  optional string follow_model   = 1;
+}
diff --git a/gazebo/msgs/contacts.proto b/gazebo/msgs/contacts.proto
index adf44e6..ea48a16 100644
--- a/gazebo/msgs/contacts.proto
+++ b/gazebo/msgs/contacts.proto
@@ -13,4 +13,3 @@ message Contacts
   repeated Contact contact   = 1;
   required Time time         = 2;
 }
-
diff --git a/gazebo/msgs/diagnostics.proto b/gazebo/msgs/diagnostics.proto
index 1096c1c..fd41d9a 100644
--- a/gazebo/msgs/diagnostics.proto
+++ b/gazebo/msgs/diagnostics.proto
@@ -1,7 +1,7 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Diagnostic information 
+/// \interface Diagnostics
 /// \brief Diagnostic information about a running instance of Gazebo.
 /// Gazebo must have been compiled with the ENABLE_DIAGNOSTICS flag.
 
diff --git a/gazebo/msgs/factory.proto b/gazebo/msgs/factory.proto
index aa3cd80..a600234 100644
--- a/gazebo/msgs/factory.proto
+++ b/gazebo/msgs/factory.proto
@@ -16,4 +16,3 @@ message Factory
   optional string edit_name                 = 4;
   optional string clone_model_name          = 5;
 }
-
diff --git a/gazebo/msgs/friction.proto b/gazebo/msgs/friction.proto
index a990afd..4d9ef43 100644
--- a/gazebo/msgs/friction.proto
+++ b/gazebo/msgs/friction.proto
@@ -1,7 +1,7 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Frction 
+/// \interface Friction 
 /// \brief Information about friction
 
 
diff --git a/gazebo/msgs/generator/GazeboGenerator.cc b/gazebo/msgs/generator/GazeboGenerator.cc
index 0bf3e44..1d90c9e 100644
--- a/gazebo/msgs/generator/GazeboGenerator.cc
+++ b/gazebo/msgs/generator/GazeboGenerator.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@
 #include <utility>
 #include <iostream>
 
-#include "msgs/generator/GazeboGenerator.hh"
+#include "gazebo/msgs/generator/GazeboGenerator.hh"
 
 namespace google {
 namespace protobuf {
diff --git a/gazebo/msgs/generator/GazeboGenerator.hh b/gazebo/msgs/generator/GazeboGenerator.hh
index 0cd07e6..ad4e0aa 100644
--- a/gazebo/msgs/generator/GazeboGenerator.hh
+++ b/gazebo/msgs/generator/GazeboGenerator.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/msgs/generator/gazebo_generator.cc b/gazebo/msgs/generator/gazebo_generator.cc
index 11ccd76..eceef1c 100644
--- a/gazebo/msgs/generator/gazebo_generator.cc
+++ b/gazebo/msgs/generator/gazebo_generator.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/msgs/gps.proto b/gazebo/msgs/gps.proto
new file mode 100644
index 0000000..31a4ea2
--- /dev/null
+++ b/gazebo/msgs/gps.proto
@@ -0,0 +1,20 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface GPS
+/// \brief Data from a GPS sensor
+
+
+import "time.proto";
+
+message GPS
+{
+  required Time time                    = 1;
+  required string link_name             = 2;
+  required double latitude_deg          = 3;
+  required double longitude_deg         = 4;
+  required double altitude              = 5;
+  optional double velocity_east         = 6;
+  optional double velocity_north        = 7;
+  optional double velocity_up           = 8;
+}
diff --git a/gazebo/msgs/gz_string_v.proto b/gazebo/msgs/gz_string_v.proto
index 11eb774..07ecc9b 100644
--- a/gazebo/msgs/gz_string_v.proto
+++ b/gazebo/msgs/gz_string_v.proto
@@ -9,5 +9,3 @@ message GzString_V
 {
   repeated string data = 1;
 }
-
-
diff --git a/gazebo/msgs/heightmapgeom.proto b/gazebo/msgs/heightmapgeom.proto
index 55106b5..5ecbd08 100644
--- a/gazebo/msgs/heightmapgeom.proto
+++ b/gazebo/msgs/heightmapgeom.proto
@@ -4,31 +4,35 @@ package gazebo.msgs;
 /// \interface HeightmapGeom 
 /// \brief Message for a heightmap geometry
 
-
 import "image.proto";
 import "vector3d.proto";
 
 message HeightmapGeom
 {
-  required Image  image      = 1; // The height data
-  required Vector3d size     = 2; // Size in meters
-  optional Vector3d origin   = 3; // Origin in world coordinate frame
+  optional Image  image            = 1; // The height data
+  required Vector3d size           = 2; // Size in meters
+  optional Vector3d origin         = 3; // Origin in world coordinate frame
+  repeated float heights           = 4;
+  optional int32 width             = 5;
+  optional int32 height            = 6;
 
   message Texture
   {
-    required string diffuse    = 1;
-    required string normal     = 2;
-    required double size       = 3;
+    required string diffuse        = 1;
+    required string normal         = 2;
+    required double size           = 3;
   }
 
   message Blend
   {
-    required double min_height = 1;
-    required double fade_dist  = 2;
+    required double min_height     = 1;
+    required double fade_dist      = 2;
   }
 
-  repeated Texture texture = 4; // List of textures
-  repeated Blend blend     = 5; // How to blend the textures
-}
-
+  repeated Texture texture         = 7; // List of textures
+  repeated Blend blend             = 8; // How to blend the textures
+  optional bool use_terrain_paging = 9; // Enable terrain paging in rendering
 
+  // The image filename
+  optional string filename         = 10;
+}
diff --git a/gazebo/msgs/joint.proto b/gazebo/msgs/joint.proto
index cb3cf7d..ffb91b3 100644
--- a/gazebo/msgs/joint.proto
+++ b/gazebo/msgs/joint.proto
@@ -8,6 +8,7 @@ package gazebo.msgs;
 import "vector3d.proto";
 import "axis.proto";
 import "pose.proto";
+import "sensor.proto";
 
 message Joint
 {
@@ -19,24 +20,29 @@ message Joint
     UNIVERSAL = 4;
     BALL      = 5;
     SCREW     = 6;
+    GEARBOX   = 7;
   }
 
   required string name           = 1;
-  repeated double angle          = 2;
-  optional Type type             = 3;
-  optional string parent         = 4;
-  optional string child          = 5;
-  optional Pose pose             = 6;
-  optional Axis axis1            = 7;
-  optional Axis axis2            = 8;
+  optional uint32 id             = 2;
+  repeated double angle          = 3;
+  optional Type type             = 4;
+  optional string parent         = 5;
+  optional uint32 parent_id      = 6;
+  optional string child          = 7;
+  optional uint32 child_id       = 8;
+  optional Pose pose             = 9;
+  optional Axis axis1            = 10;
+  optional Axis axis2            = 11;
 
-  optional double cfm            = 9;
-  optional double bounce         = 10;
-  optional double velocity       = 11;
-  optional double fudge_factor   = 12;
-  optional double limit_cfm      = 13;
-  optional double limit_erp      = 14;
-  optional double suspension_cfm = 15;
-  optional double suspension_erp = 16;
-}
+  optional double cfm            = 12;
+  optional double bounce         = 13;
+  optional double velocity       = 14;
+  optional double fudge_factor   = 15;
+  optional double limit_cfm      = 16;
+  optional double limit_erp      = 17;
+  optional double suspension_cfm = 18;
+  optional double suspension_erp = 19;
 
+  repeated Sensor sensor         = 20;
+}
diff --git a/gazebo/msgs/joint_cmd.proto b/gazebo/msgs/joint_cmd.proto
index c3f412e..e6f2b34 100644
--- a/gazebo/msgs/joint_cmd.proto
+++ b/gazebo/msgs/joint_cmd.proto
@@ -20,4 +20,3 @@ message JointCmd
   optional PID velocity    = 5;
   optional bool reset      = 6;
 }
-
diff --git a/gazebo/msgs/joint_wrench.proto b/gazebo/msgs/joint_wrench.proto
index 7548b64..568a0f0 100644
--- a/gazebo/msgs/joint_wrench.proto
+++ b/gazebo/msgs/joint_wrench.proto
@@ -1,20 +1,18 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Joint wrench
+/// \interface JointWrench
 /// \brief Joint wrench message
 
-
-import "vector3d.proto";
+import "wrench.proto";
 
 message JointWrench
 {
   required string body_1_name = 1;
-  required string body_2_name = 2;
-
-  required Vector3d body_1_force = 3;
-  required Vector3d body_2_force = 4;
+  required uint32 body_1_id   = 2;
+  required string body_2_name = 3;
+  required uint32 body_2_id   = 4;
 
-  required Vector3d body_1_torque = 5;
-  required Vector3d body_2_torque = 6;
+  required Wrench body_1_wrench = 5;
+  required Wrench body_2_wrench = 6;
 }
diff --git a/gazebo/msgs/laserscan.proto b/gazebo/msgs/laserscan.proto
index c273408..edb088f 100644
--- a/gazebo/msgs/laserscan.proto
+++ b/gazebo/msgs/laserscan.proto
@@ -9,14 +9,19 @@ import "pose.proto";
 
 message LaserScan
 {
-  required string frame       = 1;
-  required Pose world_pose    = 2;
-  required double angle_min   = 3;
-  required double angle_max   = 4;
-  required double angle_step  = 5;
-  required double range_min   = 6;
-  required double range_max   = 7;
+  required string frame               = 1;
+  required Pose world_pose            = 2;
+  required double angle_min           = 3;
+  required double angle_max           = 4;
+  required double angle_step          = 5;
+  required double range_min           = 6;
+  required double range_max           = 7;
+  required uint32 count               = 8;
+  optional double vertical_angle_min  = 9;
+  optional double vertical_angle_max  = 10;
+  optional double vertical_angle_step = 11;
+  optional uint32 vertical_count      = 12;
 
-  repeated double ranges      = 8;
-  repeated double intensities = 9;
+  repeated double ranges              = 13;
+  repeated double intensities         = 14;
 }
diff --git a/gazebo/msgs/laserscan_stamped.proto b/gazebo/msgs/laserscan_stamped.proto
index 88c907c..da43c5a 100644
--- a/gazebo/msgs/laserscan_stamped.proto
+++ b/gazebo/msgs/laserscan_stamped.proto
@@ -1,7 +1,7 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface LaserStamped
+/// \interface LaserScanStamped
 /// \brief Message for an laser scan with a time
 
 
diff --git a/gazebo/msgs/link.proto b/gazebo/msgs/link.proto
index 46a3200..e4c1ef0 100644
--- a/gazebo/msgs/link.proto
+++ b/gazebo/msgs/link.proto
@@ -1,7 +1,7 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Link 
+/// \interface Link
 /// \brief Information about a link
 
 
@@ -15,7 +15,7 @@ import "pose.proto";
 
 message Link
 {
-  required uint32 id            = 1;
+  optional uint32 id            = 1;
   required string name          = 2;
   optional bool self_collide    = 3;
   optional bool gravity         = 4;
@@ -27,5 +27,5 @@ message Link
   repeated Collision collision  = 10;
   repeated Sensor sensor        = 11;
   repeated Projector projector  = 12;
+  optional bool canonical       = 13;
 }
-
diff --git a/gazebo/msgs/link_data.proto b/gazebo/msgs/link_data.proto
new file mode 100644
index 0000000..36f8539
--- /dev/null
+++ b/gazebo/msgs/link_data.proto
@@ -0,0 +1,16 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface LinkData
+/// \brief Timestamped link data
+
+import "vector3d.proto";
+import "time.proto";
+
+message LinkData
+{
+  required Time time             = 1;
+  required string name           = 2;
+  optional Vector3d linear_velocity  = 3;
+  optional Vector3d angular_velocity = 4;
+}
diff --git a/gazebo/msgs/log_control.proto b/gazebo/msgs/log_control.proto
index d1fc701..2e38694 100644
--- a/gazebo/msgs/log_control.proto
+++ b/gazebo/msgs/log_control.proto
@@ -10,4 +10,5 @@ message LogControl
   optional bool stop            = 2;
   optional bool paused          = 3;
   optional string base_path     = 4;
+  optional string encoding      = 5;
 }
diff --git a/gazebo/msgs/material.proto b/gazebo/msgs/material.proto
index 14fae75..3677930 100644
--- a/gazebo/msgs/material.proto
+++ b/gazebo/msgs/material.proto
@@ -1,7 +1,7 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Material 
+/// \interface Material
 /// \brief Information about a material
 
 
@@ -9,11 +9,11 @@ import "color.proto";
 
 message Material
 {
-  enum ShaderType 
+  enum ShaderType
   {
-    VERTEX                  = 1; 
-    PIXEL                   = 2; 
-    NORMAL_MAP_OBJECT_SPACE = 3; 
+    VERTEX                  = 1;
+    PIXEL                   = 2;
+    NORMAL_MAP_OBJECT_SPACE = 3;
     NORMAL_MAP_TANGENT_SPACE = 4;
   }
 
@@ -30,5 +30,5 @@ message Material
   optional Color diffuse          = 5;
   optional Color specular         = 6;
   optional Color emissive         = 7;
+  optional bool lighting          = 8;
 }
-
diff --git a/gazebo/msgs/model.proto b/gazebo/msgs/model.proto
index 9630792..023eb38 100644
--- a/gazebo/msgs/model.proto
+++ b/gazebo/msgs/model.proto
@@ -1,7 +1,7 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Model 
+/// \interface Model
 /// \brief Information about a model
 
 
@@ -9,6 +9,7 @@ import "joint.proto";
 import "link.proto";
 import "pose.proto";
 import "visual.proto";
+import "vector3d.proto";
 
 message Model
 {
@@ -20,5 +21,5 @@ message Model
   repeated Link link           = 6;
   optional bool deleted        = 7;
   repeated Visual visual       = 8;
+  optional Vector3d scale      = 9;
 }
-
diff --git a/gazebo/msgs/model_v.proto b/gazebo/msgs/model_v.proto
index 4bffabf..a6be730 100644
--- a/gazebo/msgs/model_v.proto
+++ b/gazebo/msgs/model_v.proto
@@ -1,7 +1,7 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Entities 
+/// \interface Model_V 
 /// \brief Information about all entities in a world
 
 
diff --git a/gazebo/msgs/msgs.cc b/gazebo/msgs/msgs.cc
index 6dbb593..0c5e80a 100644
--- a/gazebo/msgs/msgs.cc
+++ b/gazebo/msgs/msgs.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,17 +18,17 @@
 #include <google/protobuf/descriptor.h>
 #include <algorithm>
 
-#include "math/Vector3.hh"
-#include "math/Pose.hh"
-#include "math/Quaternion.hh"
-#include "math/Plane.hh"
-#include "math/Rand.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/math/Plane.hh"
+#include "gazebo/math/Rand.hh"
 
-#include "common/Common.hh"
-#include "common/Image.hh"
-#include "common/Exception.hh"
-#include "common/Console.hh"
-#include "msgs/msgs.hh"
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/Image.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/msgs/msgs.hh"
 
 namespace gazebo
 {
@@ -160,6 +160,27 @@ namespace gazebo
       _t->set_nsec(_v.nsec);
     }
 
+    /////////////////////////////////////////////////
+    void Set(msgs::SphericalCoordinates *_s,
+             const common::SphericalCoordinates &_v)
+    {
+      switch (_v.GetSurfaceType())
+      {
+        case common::SphericalCoordinates::EARTH_WGS84:
+          _s->set_surface_model(msgs::SphericalCoordinates::EARTH_WGS84);
+          break;
+        default:
+          gzerr << "Unable to map surface type[" <<  _v.GetSurfaceType()
+            << "] to a SphericalCoordinates message.\n";
+          _s->set_surface_model(msgs::SphericalCoordinates::EARTH_WGS84);
+          break;
+      };
+
+      _s->set_latitude_deg(_v.GetLatitudeReference().Degree());
+      _s->set_longitude_deg(_v.GetLongitudeReference().Degree());
+      _s->set_heading_deg(_v.GetHeadingOffset().Degree());
+      _s->set_elevation(_v.GetElevationReference());
+    }
 
     /////////////////////////////////////////////////
     void Set(msgs::PlaneGeom *_p, const math::Plane &_v)
@@ -287,7 +308,7 @@ namespace gazebo
     {
       msgs::GUI result;
 
-      result.set_fullscreen(_sdf->GetValueBool("fullscreen"));
+      result.set_fullscreen(_sdf->Get<bool>("fullscreen"));
 
 
       if (_sdf->HasElement("camera"))
@@ -295,17 +316,17 @@ namespace gazebo
         sdf::ElementPtr camSDF = _sdf->GetElement("camera");
         msgs::GUICamera *guiCam = result.mutable_camera();
 
-        guiCam->set_name(camSDF->GetValueString("name"));
+        guiCam->set_name(camSDF->Get<std::string>("name"));
 
         if (camSDF->HasElement("pose"))
         {
-          msgs::Set(guiCam->mutable_pose(), camSDF->GetValuePose("pose"));
+          msgs::Set(guiCam->mutable_pose(), camSDF->Get<math::Pose>("pose"));
         }
 
         if (camSDF->HasElement("view_controller"))
         {
           guiCam->set_view_controller(
-              camSDF->GetValueString("view_controller"));
+              camSDF->Get<std::string>("view_controller"));
         }
 
         if (camSDF->HasElement("track_visual"))
@@ -323,13 +344,13 @@ namespace gazebo
     {
       msgs::TrackVisual result;
 
-      result.set_name(_sdf->GetValueString("name"));
+      result.set_name(_sdf->Get<std::string>("name"));
 
       if (_sdf->HasElement("min_dist"))
-        result.set_min_dist(_sdf->GetElement("min_dist")->GetValueDouble());
+        result.set_min_dist(_sdf->GetElement("min_dist")->Get<double>());
 
       if (_sdf->HasElement("max_dist"))
-        result.set_max_dist(_sdf->GetElement("max_dist")->GetValueDouble());
+        result.set_max_dist(_sdf->GetElement("max_dist")->Get<double>());
 
       return result;
     }
@@ -340,12 +361,12 @@ namespace gazebo
     {
       msgs::Light result;
 
-      std::string type = _sdf->GetValueString("type");
+      std::string type = _sdf->Get<std::string>("type");
       std::transform(type.begin(), type.end(), type.begin(), ::tolower);
 
-      result.set_name(_sdf->GetValueString("name"));
+      result.set_name(_sdf->Get<std::string>("name"));
 
-      result.set_cast_shadows(_sdf->GetValueBool("cast_shadows"));
+      result.set_cast_shadows(_sdf->Get<bool>("cast_shadows"));
 
       if (type == "point")
         result.set_type(msgs::Light::POINT);
@@ -356,42 +377,42 @@ namespace gazebo
 
       if (_sdf->HasElement("pose"))
       {
-        result.mutable_pose()->CopyFrom(Convert(_sdf->GetValuePose("pose")));
+        result.mutable_pose()->CopyFrom(Convert(_sdf->Get<math::Pose>("pose")));
       }
 
       if (_sdf->HasElement("diffuse"))
       {
         result.mutable_diffuse()->CopyFrom(
-            Convert(_sdf->GetValueColor("diffuse")));
+            Convert(_sdf->Get<common::Color>("diffuse")));
       }
 
       if (_sdf->HasElement("specular"))
       {
         result.mutable_specular()->CopyFrom(
-            Convert(_sdf->GetValueColor("specular")));
+            Convert(_sdf->Get<common::Color>("specular")));
       }
 
       if (_sdf->HasElement("attenuation"))
       {
         sdf::ElementPtr elem = _sdf->GetElement("attenuation");
-        result.set_attenuation_constant(elem->GetValueDouble("constant"));
-        result.set_attenuation_linear(elem->GetValueDouble("linear"));
-        result.set_attenuation_quadratic(elem->GetValueDouble("quadratic"));
-        result.set_range(elem->GetValueDouble("range"));
+        result.set_attenuation_constant(elem->Get<double>("constant"));
+        result.set_attenuation_linear(elem->Get<double>("linear"));
+        result.set_attenuation_quadratic(elem->Get<double>("quadratic"));
+        result.set_range(elem->Get<double>("range"));
       }
 
       if (_sdf->HasElement("direction"))
       {
         result.mutable_direction()->CopyFrom(
-            Convert(_sdf->GetValueVector3("direction")));
+            Convert(_sdf->Get<math::Vector3>("direction")));
       }
 
       if (_sdf->HasElement("spot"))
       {
         sdf::ElementPtr elem = _sdf->GetElement("spot");
-        result.set_spot_inner_angle(elem->GetValueDouble("inner_angle"));
-        result.set_spot_outer_angle(elem->GetValueDouble("outer_angle"));
-        result.set_spot_falloff(elem->GetValueDouble("falloff"));
+        result.set_spot_inner_angle(elem->Get<double>("inner_angle"));
+        result.set_spot_outer_angle(elem->Get<double>("outer_angle"));
+        result.set_spot_falloff(elem->Get<double>("falloff"));
       }
 
       return result;
@@ -409,20 +430,20 @@ namespace gazebo
         return result;
       }
 
-        msgs::Set(result.mutable_scale(), _sdf->GetValueVector3("scale"));
+        msgs::Set(result.mutable_scale(), _sdf->Get<math::Vector3>("scale"));
 
-        result.set_filename(_sdf->GetValueString("uri"));
+        result.set_filename(_sdf->Get<std::string>("uri"));
 
         if (_sdf->HasElement("submesh"))
         {
           sdf::ElementPtr submeshElem = _sdf->GetElement("submesh");
           if (submeshElem->HasElement("name") &&
-              submeshElem->GetValueString("name") != "__default__")
+              submeshElem->Get<std::string>("name") != "__default__")
           {
-            result.set_submesh(submeshElem->GetValueString("name"));
+            result.set_submesh(submeshElem->Get<std::string>("name"));
 
             if (submeshElem->HasElement("center"))
-              result.set_center_submesh(submeshElem->GetValueBool("center"));
+              result.set_center_submesh(submeshElem->Get<bool>("center"));
           }
         }
 
@@ -451,72 +472,74 @@ namespace gazebo
       {
         result.set_type(msgs::Geometry::BOX);
         msgs::Set(result.mutable_box()->mutable_size(),
-            geomElem->GetValueVector3("size"));
+            geomElem->Get<math::Vector3>("size"));
       }
       else if (geomElem->GetName() == "cylinder")
       {
         result.set_type(msgs::Geometry::CYLINDER);
         result.mutable_cylinder()->set_radius(
-            geomElem->GetValueDouble("radius"));
+            geomElem->Get<double>("radius"));
         result.mutable_cylinder()->set_length(
-            geomElem->GetValueDouble("length"));
+            geomElem->Get<double>("length"));
       }
       else if (geomElem->GetName() == "sphere")
       {
         result.set_type(msgs::Geometry::SPHERE);
         result.mutable_sphere()->set_radius(
-            geomElem->GetValueDouble("radius"));
+            geomElem->Get<double>("radius"));
       }
       else if (geomElem->GetName() == "plane")
       {
         result.set_type(msgs::Geometry::PLANE);
         msgs::Set(result.mutable_plane()->mutable_normal(),
-            geomElem->GetValueVector3("normal"));
+            geomElem->Get<math::Vector3>("normal"));
         msgs::Set(result.mutable_plane()->mutable_size(),
-            geomElem->GetValueVector2d("size"));
+            geomElem->Get<math::Vector2d>("size"));
       }
       else if (geomElem->GetName() == "image")
       {
         result.set_type(msgs::Geometry::IMAGE);
         result.mutable_image()->set_scale(
-            geomElem->GetValueDouble("scale"));
+            geomElem->Get<double>("scale"));
         result.mutable_image()->set_height(
-            geomElem->GetValueDouble("height"));
+            geomElem->Get<double>("height"));
         result.mutable_image()->set_uri(
-            geomElem->GetValueString("uri"));
+            geomElem->Get<std::string>("uri"));
       }
       else if (geomElem->GetName() == "heightmap")
       {
         result.set_type(msgs::Geometry::HEIGHTMAP);
         msgs::Set(result.mutable_heightmap()->mutable_size(),
-            geomElem->GetValueVector3("size"));
+            geomElem->Get<math::Vector3>("size"));
         msgs::Set(result.mutable_heightmap()->mutable_origin(),
-            geomElem->GetValueVector3("pos"));
-
-        common::Image img(geomElem->GetValueString("uri"));
-        msgs::Set(result.mutable_heightmap()->mutable_image(), img);
+            geomElem->Get<math::Vector3>("pos"));
 
         sdf::ElementPtr textureElem = geomElem->GetElement("texture");
-        msgs::HeightmapGeom::Texture *tex;
         while (textureElem)
         {
-          tex = result.mutable_heightmap()->add_texture();
-          tex->set_diffuse(textureElem->GetValueString("diffuse"));
-          tex->set_normal(textureElem->GetValueString("normal"));
-          tex->set_size(textureElem->GetValueDouble("size"));
+          msgs::HeightmapGeom::Texture *tex =
+            result.mutable_heightmap()->add_texture();
+          tex->set_diffuse(textureElem->Get<std::string>("diffuse"));
+          tex->set_normal(textureElem->Get<std::string>("normal"));
+          tex->set_size(textureElem->Get<double>("size"));
           textureElem = textureElem->GetNextElement("texture");
         }
 
         sdf::ElementPtr blendElem = geomElem->GetElement("blend");
-        msgs::HeightmapGeom::Blend *blend;
         while (blendElem)
         {
-          blend = result.mutable_heightmap()->add_blend();
+          msgs::HeightmapGeom::Blend *blend =
+            result.mutable_heightmap()->add_blend();
 
-          blend->set_min_height(blendElem->GetValueDouble("min_height"));
-          blend->set_fade_dist(blendElem->GetValueDouble("fade_dist"));
+          blend->set_min_height(blendElem->Get<double>("min_height"));
+          blend->set_fade_dist(blendElem->Get<double>("fade_dist"));
           blendElem = blendElem->GetNextElement("blend");
         }
+
+        // Set if the rendering engine uses terrain paging
+        bool useTerrainPaging =
+            geomElem->Get<bool>("use_terrain_paging");
+        result.mutable_heightmap()->set_use_terrain_paging(useTerrainPaging);
       }
       else if (geomElem->GetName() == "mesh")
       {
@@ -538,16 +561,16 @@ namespace gazebo
     {
       msgs::Visual result;
 
-      result.set_name(_sdf->GetValueString("name"));
+      result.set_name(_sdf->Get<std::string>("name"));
 
       if (_sdf->HasElement("cast_shadows"))
-        result.set_cast_shadows(_sdf->GetValueBool("cast_shadows"));
+        result.set_cast_shadows(_sdf->Get<bool>("cast_shadows"));
 
       if (_sdf->HasElement("transparency"))
-        result.set_transparency(_sdf->GetValueDouble("transparency"));
+        result.set_transparency(_sdf->Get<double>("transparency"));
 
       if (_sdf->HasElement("laser_retro"))
-        result.set_laser_retro(_sdf->GetValueDouble("laser_retro"));
+        result.set_laser_retro(_sdf->Get<double>("laser_retro"));
 
       // Load the geometry
       if (_sdf->HasElement("geometry"))
@@ -566,57 +589,62 @@ namespace gazebo
         {
           sdf::ElementPtr scriptElem = elem->GetElement("script");
           matMsg->mutable_script()->set_name(
-              scriptElem->GetValueString("name"));
+              scriptElem->Get<std::string>("name"));
 
           sdf::ElementPtr uriElem = scriptElem->GetElement("uri");
           while (uriElem)
           {
-            matMsg->mutable_script()->add_uri(uriElem->GetValueString());
+            matMsg->mutable_script()->add_uri(uriElem->Get<std::string>());
             uriElem = uriElem->GetNextElement("uri");
           }
         }
 
+        if (elem->HasElement("lighting"))
+        {
+          matMsg->set_lighting(elem->Get<bool>("lighting"));
+        }
+
         if (elem->HasElement("shader"))
         {
           sdf::ElementPtr shaderElem = elem->GetElement("shader");
 
-          if (shaderElem->GetValueString("type") == "pixel")
+          if (shaderElem->Get<std::string>("type") == "pixel")
             matMsg->set_shader_type(msgs::Material::PIXEL);
-          else if (shaderElem->GetValueString("type") == "vertex")
+          else if (shaderElem->Get<std::string>("type") == "vertex")
             matMsg->set_shader_type(msgs::Material::VERTEX);
-          else if (shaderElem->GetValueString("type") ==
+          else if (shaderElem->Get<std::string>("type") ==
               "normal_map_object_space")
             matMsg->set_shader_type(msgs::Material::NORMAL_MAP_OBJECT_SPACE);
-          else if (shaderElem->GetValueString("type") ==
+          else if (shaderElem->Get<std::string>("type") ==
               "normal_map_tangent_space")
             matMsg->set_shader_type(msgs::Material::NORMAL_MAP_TANGENT_SPACE);
           else
             gzthrow(std::string("Unknown shader type[") +
-                shaderElem->GetValueString("type") + "]");
+                shaderElem->Get<std::string>("type") + "]");
 
           if (shaderElem->HasElement("normal_map"))
             matMsg->set_normal_map(
-                shaderElem->GetElement("normal_map")->GetValueString());
+                shaderElem->GetElement("normal_map")->Get<std::string>());
         }
 
         if (elem->HasElement("ambient"))
           msgs::Set(matMsg->mutable_ambient(),
-              elem->GetValueColor("ambient"));
+              elem->Get<common::Color>("ambient"));
         if (elem->HasElement("diffuse"))
           msgs::Set(matMsg->mutable_diffuse(),
-              elem->GetValueColor("diffuse"));
+              elem->Get<common::Color>("diffuse"));
         if (elem->HasElement("specular"))
           msgs::Set(matMsg->mutable_specular(),
-              elem->GetValueColor("specular"));
+              elem->Get<common::Color>("specular"));
         if (elem->HasElement("emissive"))
           msgs::Set(matMsg->mutable_emissive(),
-              elem->GetValueColor("emissive"));
+              elem->Get<common::Color>("emissive"));
       }
 
       // Set the origin of the visual
       if (_sdf->HasElement("pose"))
       {
-        msgs::Set(result.mutable_pose(), _sdf->GetValuePose("pose"));
+        msgs::Set(result.mutable_pose(), _sdf->Get<math::Pose>("pose"));
       }
 
       // Set plugins of the visual
@@ -625,9 +653,18 @@ namespace gazebo
         sdf::ElementPtr elem = _sdf->GetElement("plugin");
         msgs::Plugin *plgnMsg = result.mutable_plugin();
         // if (elem->HasElement("name"))
-          plgnMsg->set_name(elem->GetValueString("name"));
+          plgnMsg->set_name(elem->Get<std::string>("name"));
         // if (elem->HasElement("filename"))
-          plgnMsg->set_filename(elem->GetValueString("filename"));
+          plgnMsg->set_filename(elem->Get<std::string>("filename"));
+
+        std::stringstream ss;
+        for (sdf::ElementPtr innerElem = elem->GetFirstElement();
+            innerElem;
+            innerElem = innerElem->GetNextElement(""))
+        {
+          ss << innerElem->ToString("");
+        }
+        plgnMsg->set_innerxml("<sdf>" + ss.str() + "</sdf>");
       }
 
       return result;
@@ -637,7 +674,7 @@ namespace gazebo
     {
       msgs::Fog result;
 
-      std::string type = _sdf->GetValueString("type");
+      std::string type = _sdf->Get<std::string>("type");
       if (type == "linear")
         result.set_type(msgs::Fog::LINEAR);
       else if (type == "exp")
@@ -649,10 +686,12 @@ namespace gazebo
       else
         gzthrow(std::string("Unknown fog type[") + type + "]");
 
-      result.mutable_color()->CopyFrom(Convert(_sdf->GetValueColor("color")));
-      result.set_density(_sdf->GetValueDouble("density"));
-      result.set_start(_sdf->GetValueDouble("start"));
-      result.set_end(_sdf->GetValueDouble("end"));
+      result.mutable_color()->CopyFrom(
+          Convert(_sdf->Get<common::Color>("color")));
+
+      result.set_density(_sdf->Get<double>("density"));
+      result.set_start(_sdf->Get<double>("start"));
+      result.set_end(_sdf->Get<double>("end"));
       return result;
     }
 
@@ -663,38 +702,37 @@ namespace gazebo
       Init(result, "scene");
 
       if (_sdf->HasElement("grid"))
-        result.set_grid(_sdf->GetValueBool("grid"));
+        result.set_grid(_sdf->Get<bool>("grid"));
       else
         result.set_grid(true);
 
       if (_sdf->HasElement("ambient"))
         result.mutable_ambient()->CopyFrom(
-            Convert(_sdf->GetValueColor("ambient")));
+            Convert(_sdf->Get<common::Color>("ambient")));
 
       if (_sdf->HasElement("background"))
       {
         result.mutable_background()->CopyFrom(
-            Convert(_sdf->GetValueColor("background")));
+            Convert(_sdf->Get<common::Color>("background")));
       }
 
       if (_sdf->HasElement("sky"))
       {
         msgs::Sky *skyMsg = result.mutable_sky();
-        skyMsg->set_time(_sdf->GetElement("sky")->GetValueDouble("time"));
-        skyMsg->set_sunrise(_sdf->GetElement("sky")->GetValueDouble("sunrise"));
-        skyMsg->set_sunset(_sdf->GetElement("sky")->GetValueDouble("sunset"));
-        skyMsg->set_sunset(_sdf->GetElement("sky")->GetValueDouble("sunset"));
+        skyMsg->set_time(_sdf->GetElement("sky")->Get<double>("time"));
+        skyMsg->set_sunrise(_sdf->GetElement("sky")->Get<double>("sunrise"));
+        skyMsg->set_sunset(_sdf->GetElement("sky")->Get<double>("sunset"));
 
         if (_sdf->GetElement("sky")->HasElement("clouds"))
         {
           sdf::ElementPtr cloudsElem =
             _sdf->GetElement("sky")->GetElement("clouds");
-          skyMsg->set_wind_speed(cloudsElem->GetValueDouble("speed"));
-          skyMsg->set_wind_direction(cloudsElem->GetValueDouble("direction"));
-          skyMsg->set_humidity(cloudsElem->GetValueDouble("humidity"));
-          skyMsg->set_mean_cloud_size(cloudsElem->GetValueDouble("mean_size"));
+          skyMsg->set_wind_speed(cloudsElem->Get<double>("speed"));
+          skyMsg->set_wind_direction(cloudsElem->Get<double>("direction"));
+          skyMsg->set_humidity(cloudsElem->Get<double>("humidity"));
+          skyMsg->set_mean_cloud_size(cloudsElem->Get<double>("mean_size"));
           msgs::Set(skyMsg->mutable_cloud_ambient(),
-                    cloudsElem->GetValueColor("ambient"));
+                    cloudsElem->Get<common::Color>("ambient"));
         }
       }
 
@@ -702,7 +740,7 @@ namespace gazebo
         result.mutable_fog()->CopyFrom(FogFromSDF(_sdf->GetElement("fog")));
 
       if (_sdf->HasElement("shadows"))
-        result.set_shadows(_sdf->GetValueBool("shadows"));
+        result.set_shadows(_sdf->Get<bool>("shadows"));
 
       return result;
     }
diff --git a/gazebo/msgs/msgs.hh b/gazebo/msgs/msgs.hh
index 35b33ef..38772ff 100644
--- a/gazebo/msgs/msgs.hh
+++ b/gazebo/msgs/msgs.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,9 @@
 
 #include <string>
 
+#include <sdf/sdf.hh>
+
 #include "gazebo/msgs/MessageTypes.hh"
-#include "gazebo/sdf/sdf.hh"
 
 #include "gazebo/math/MathTypes.hh"
 #include "gazebo/math/Vector3.hh"
@@ -28,8 +29,10 @@
 #include "gazebo/math/Plane.hh"
 #include "gazebo/math/Box.hh"
 
+#include "gazebo/common/SphericalCoordinates.hh"
 #include "gazebo/common/Color.hh"
 #include "gazebo/common/Time.hh"
+#include "gazebo/common/Image.hh"
 
 namespace gazebo
 {
@@ -45,23 +48,28 @@ namespace gazebo
     /// \param[in] _request Request string
     /// \param[in] _data Optional data string
     /// \return A Request message
+    GAZEBO_VISIBLE
     msgs::Request *CreateRequest(const std::string &_request,
                                  const std::string &_data = "");
 
     /// \brief Initialize a message
     /// \param[in] _message Message to initialize
     /// \param[in] _id Optional string id
+    GAZEBO_VISIBLE
     void Init(google::protobuf::Message &_message, const std::string &_id ="");
 
     /// \brief Time stamp a header
     /// \param[in] _header Header to stamp
+    GAZEBO_VISIBLE
     void Stamp(msgs::Header *_header);
 
     /// \brief Set the time in a time message
     /// \param[in] _time A Time message
+    GAZEBO_VISIBLE
     void Stamp(msgs::Time *_time);
 
     /// \cond
+    GAZEBO_VISIBLE
     std::string Package(const std::string &type,
         const google::protobuf::Message &message);
     /// \endcond
@@ -69,149 +77,186 @@ namespace gazebo
     /// \brief Convert a math::Vector3 to a msgs::Vector3d
     /// \param[in] _v The vector to convert
     /// \return A msgs::Vector3d object
+    GAZEBO_VISIBLE
     msgs::Vector3d      Convert(const math::Vector3 &_v);
 
     /// \brief Convert a math::Quaternion to a msgs::Quaternion
     /// \param[in] _q The quaternion to convert
     /// \return A msgs::Quaternion object
+    GAZEBO_VISIBLE
     msgs::Quaternion Convert(const math::Quaternion &_q);
 
     /// \brief Convert a math::Pose to a msgs::Pose
     /// \param[in] _p The pose to convert
     /// \return A msgs::Pose object
+    GAZEBO_VISIBLE
     msgs::Pose       Convert(const math::Pose &_p);
 
     /// \brief Convert a common::Color to a msgs::Color
     /// \param[in] _c The color to convert
     /// \return A msgs::Color object
+    GAZEBO_VISIBLE
     msgs::Color      Convert(const common::Color &_c);
 
     /// \brief Convert a common::Time to a msgs::Time
     /// \param[in] _t The time to convert
     /// \return A msgs::Time object
+    GAZEBO_VISIBLE
     msgs::Time       Convert(const common::Time &_t);
 
     /// \brief Convert a math::Plane to a msgs::PlaneGeom
     /// \param[in] _p The plane to convert
     /// \return A msgs::PlaneGeom object
+    GAZEBO_VISIBLE
     msgs::PlaneGeom Convert(const math::Plane &_p);
 
     /// \brief Convert a msgs::Vector3d to a math::Vector
     /// \param[in] _v The plane to convert
     /// \return A math::Vector3 object
+    GAZEBO_VISIBLE
     math::Vector3    Convert(const msgs::Vector3d &_v);
 
     /// \brief Convert a msgs::Quaternion to a math::Quaternion
     /// \param[in] _q The quaternion to convert
     /// \return A math::Quaternion object
+    GAZEBO_VISIBLE
     math::Quaternion Convert(const msgs::Quaternion &_q);
 
     /// \brief Convert a msgs::Pose to a math::Pose
     /// \param[in] _q The pose to convert
     /// \return A math::Pose object
+    GAZEBO_VISIBLE
     math::Pose       Convert(const msgs::Pose &_p);
 
     /// \brief Convert a msgs::Image to a common::Image
     /// \param[out] _img The common::Image container
     /// \param[in] _msg The Image message to convert
+    GAZEBO_VISIBLE
     void Set(common::Image &_img, const msgs::Image &_msg);
 
     /// \brief Convert a msgs::Color to a common::Color
     /// \param[in] _c The color to convert
     /// \return A common::Color object
+    GAZEBO_VISIBLE
     common::Color    Convert(const msgs::Color &_c);
 
     /// \brief Convert a msgs::Time to a common::Time
     /// \param[in] _t The time to convert
     /// \return A common::Time object
+    GAZEBO_VISIBLE
     common::Time     Convert(const msgs::Time &_t);
 
     /// \brief Convert a msgs::PlaneGeom to a common::Plane
     /// \param[in] _p The plane to convert
     /// \return A common::Plane object
+    GAZEBO_VISIBLE
     math::Plane      Convert(const msgs::PlaneGeom &_p);
 
     /// \brief Set a msgs::Image from a common::Image
     /// \param[out] _msg A msgs::Image pointer
     /// \param[in] _i A common::Image reference
+    GAZEBO_VISIBLE
     void Set(msgs::Image *_msg, const common::Image &_i);
 
     /// \brief Set a msgs::Vector3d from a math::Vector3
     /// \param[out] _pt A msgs::Vector3d pointer
     /// \param[in] _v A math::Vector3 reference
+    GAZEBO_VISIBLE
     void Set(msgs::Vector3d *_pt, const math::Vector3 &_v);
 
     /// \brief Set a msgs::Vector2d from a math::Vector3
     /// \param[out] _pt A msgs::Vector2d pointer
     /// \param[in] _v A math::Vector2d reference
+    GAZEBO_VISIBLE
     void Set(msgs::Vector2d *_pt, const math::Vector2d &_v);
 
     /// \brief Set a msgs::Quaternion from a math::Quaternion
     /// \param[out] _q A msgs::Quaternion pointer
     /// \param[in] _v A math::Quaternion reference
+    GAZEBO_VISIBLE
     void Set(msgs::Quaternion *_q, const math::Quaternion &_v);
 
     /// \brief Set a msgs::Pose from a math::Pose
     /// \param[out] _p A msgs::Pose pointer
     /// \param[in] _v A math::Pose reference
+    GAZEBO_VISIBLE
     void Set(msgs::Pose *_p, const math::Pose &_v);
 
     /// \brief Set a msgs::Color from a common::Color
     /// \param[out] _p A msgs::Color pointer
     /// \param[in] _v A common::Color reference
+    GAZEBO_VISIBLE
     void Set(msgs::Color *_c, const common::Color &_v);
 
     /// \brief Set a msgs::Time from a common::Time
     /// \param[out] _p A msgs::Time pointer
     /// \param[in] _v A common::Time reference
+    GAZEBO_VISIBLE
     void Set(msgs::Time *_t, const common::Time &_v);
 
+    /// \brief Set a msgs::SphericalCoordinates from
+    /// a common::SphericalCoordinates object.
+    /// \param[out] _p A msgs::SphericalCoordinates pointer.
+    /// \param[in] _v A common::SphericalCoordinates reference
+    void Set(msgs::SphericalCoordinates *_s,
+             const common::SphericalCoordinates &_v);
+
     /// \brief Set a msgs::Plane from a math::Plane
     /// \param[out] _p A msgs::Plane pointer
     /// \param[in] _v A math::Plane reference
+    GAZEBO_VISIBLE
     void Set(msgs::PlaneGeom *_p, const math::Plane &_v);
 
     /// \brief Create a msgs::TrackVisual from a track visual SDF element
     /// \param[in] _sdf The sdf element
     /// \return The new msgs::TrackVisual object
+    GAZEBO_VISIBLE
     msgs::TrackVisual TrackVisualFromSDF(sdf::ElementPtr _sdf);
 
     /// \brief Create a msgs::GUI from a GUI SDF element
     /// \param[in] _sdf The sdf element
     /// \return The new msgs::GUI object
+    GAZEBO_VISIBLE
     msgs::GUI GUIFromSDF(sdf::ElementPtr _sdf);
 
     /// \brief Create a msgs::Light from a light SDF element
     /// \param[in] _sdf The sdf element
     /// \return The new msgs::Light object
+    GAZEBO_VISIBLE
     msgs::Light LightFromSDF(sdf::ElementPtr _sdf);
 
     /// \brief Create a msgs::MeshGeom from a mesh SDF element
     /// \param[in] _sdf The sdf element
     /// \return The new msgs::MeshGeom object
+    GAZEBO_VISIBLE
     msgs::MeshGeom MeshFromSDF(sdf::ElementPtr _sdf);
 
     /// \brief Create a msgs::Geometry from a geometry SDF element
     /// \param[in] _sdf The sdf element
     /// \return The new msgs::Geometry object
+    GAZEBO_VISIBLE
     msgs::Geometry GeometryFromSDF(sdf::ElementPtr _sdf);
 
     /// \brief Create a msgs::Visual from a visual SDF element
     /// \param[in] _sdf The sdf element
     /// \return The new msgs::Visual object
+    GAZEBO_VISIBLE
     msgs::Visual VisualFromSDF(sdf::ElementPtr _sdf);
 
     /// \brief Create a msgs::Fog from a fog SDF element
     /// \param[in] _sdf The sdf element
     /// \return The new msgs::Fog object
+    GAZEBO_VISIBLE
     msgs::Fog FogFromSDF(sdf::ElementPtr _sdf);
 
     /// \brief Create a msgs::Scene from a scene SDF element
     /// \param[in] _sdf The sdf element
     /// \return The new msgs::Scene object
+    GAZEBO_VISIBLE
     msgs::Scene SceneFromSDF(sdf::ElementPtr _sdf);
 
     /// \cond
+    GAZEBO_VISIBLE
     const google::protobuf::FieldDescriptor *GetFD(
         google::protobuf::Message &message, const std::string &name);
     /// \endcond
@@ -219,6 +264,7 @@ namespace gazebo
     /// \brief Get the header from a protobuf message
     /// \param[in] _message A google protobuf message
     /// \return A pointer to the message's header
+    GAZEBO_VISIBLE
     msgs::Header *GetHeader(google::protobuf::Message &_message);
 
     /// \}
diff --git a/gazebo/msgs/msgs_TEST.cc b/gazebo/msgs/msgs_TEST.cc
index d7c960a..392499d 100644
--- a/gazebo/msgs/msgs_TEST.cc
+++ b/gazebo/msgs/msgs_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,12 +16,22 @@
 */
 
 #include <gtest/gtest.h>
-#include "msgs/msgs.hh"
-#include "common/Exception.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/common/Exception.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(MsgsTest, Msg)
+class MsgsTest : public gazebo::testing::AutoLogFixture { };
+
+void TimeTest(const common::Time &_t, const msgs::Time &_msg)
+{
+  EXPECT_LE(_t.sec, _msg.sec());
+  if (_t.sec == _msg.sec())
+    EXPECT_LE(_t.nsec, _msg.nsec());
+}
+
+TEST_F(MsgsTest, Msg)
 {
   common::Time t = common::Time::GetWallTime();
 
@@ -29,13 +39,12 @@ TEST(MsgsTest, Msg)
   msgs::Init(msg, "_test_");
   msgs::Init(msg2);
 
-  EXPECT_TRUE(msg.header().has_stamp());
-  EXPECT_TRUE(msg2.header().has_stamp());
-
-  EXPECT_EQ(t.sec, msg.header().stamp().sec());
-  EXPECT_TRUE(t.nsec <= msg.header().stamp().nsec());
+  ASSERT_TRUE(msg.header().has_stamp());
+  TimeTest(t, msg.header().stamp());
   EXPECT_STREQ("_test_", msg.header().str_id().c_str());
 
+  ASSERT_TRUE(msg2.header().has_stamp());
+  TimeTest(t, msg2.header().stamp());
   EXPECT_FALSE(msg2.header().has_str_id());
 
   msgs::Header *header = msgs::GetHeader(msg);
@@ -47,7 +56,7 @@ TEST(MsgsTest, Msg)
   EXPECT_STREQ("_hello_", header->str_id().c_str());
 }
 
-TEST(MsgsTest, Request)
+TEST_F(MsgsTest, Request)
 {
   msgs::Request *request = msgs::CreateRequest("help", "me");
   EXPECT_STREQ("help", request->request().c_str());
@@ -55,27 +64,25 @@ TEST(MsgsTest, Request)
   EXPECT_GT(request->id(), 0);
 }
 
-TEST(MsgsTest, Time)
+TEST_F(MsgsTest, Time)
 {
   common::Time t = common::Time::GetWallTime();
   msgs::Time msg;
   msgs::Stamp(&msg);
-  EXPECT_EQ(t.sec, msg.sec());
-  EXPECT_TRUE(t.nsec <= msg.nsec());
+  TimeTest(t, msg);
 }
 
 
-TEST(MsgsTest, TimeFromHeader)
+TEST_F(MsgsTest, TimeFromHeader)
 {
   common::Time t = common::Time::GetWallTime();
   msgs::Header msg;
   msgs::Stamp(&msg);
-  EXPECT_EQ(t.sec, msg.stamp().sec());
-  EXPECT_TRUE(t.nsec <= msg.stamp().nsec());
+  TimeTest(t, msg.stamp());
 }
 
 
-TEST(MsgsTest, Packet)
+TEST_F(MsgsTest, Packet)
 {
   msgs::GzString msg;
   msg.set_data("test_string");
@@ -89,13 +96,13 @@ TEST(MsgsTest, Packet)
   EXPECT_STREQ("test_string", msg.data().c_str());
 }
 
-TEST(MsgsTest, BadPackage)
+TEST_F(MsgsTest, BadPackage)
 {
   msgs::GzString msg;
   EXPECT_THROW(msgs::Package("test_type", msg), common::Exception);
 }
 
-TEST(MsgsTest, CovertMathVector3ToMsgs)
+TEST_F(MsgsTest, CovertMathVector3ToMsgs)
 {
   msgs::Vector3d msg = msgs::Convert(math::Vector3(1, 2, 3));
   EXPECT_DOUBLE_EQ(1, msg.x());
@@ -103,7 +110,7 @@ TEST(MsgsTest, CovertMathVector3ToMsgs)
   EXPECT_DOUBLE_EQ(3, msg.z());
 }
 
-TEST(MsgsTest, ConvertMsgsVector3dToMath)
+TEST_F(MsgsTest, ConvertMsgsVector3dToMath)
 {
   msgs::Vector3d msg = msgs::Convert(math::Vector3(1, 2, 3));
   math::Vector3 v    = msgs::Convert(msg);
@@ -112,7 +119,7 @@ TEST(MsgsTest, ConvertMsgsVector3dToMath)
   EXPECT_DOUBLE_EQ(3, v.z);
 }
 
-TEST(MsgsTest, ConvertMathQuaterionToMsgs)
+TEST_F(MsgsTest, ConvertMathQuaterionToMsgs)
 {
   msgs::Quaternion msg =
     msgs::Convert(math::Quaternion(M_PI * 0.25, M_PI * 0.5, M_PI));
@@ -123,7 +130,7 @@ TEST(MsgsTest, ConvertMathQuaterionToMsgs)
   EXPECT_TRUE(math::equal(msg.w(), 0.27059805007309851));
 }
 
-TEST(MsgsTest, ConvertMsgsQuaterionToMath)
+TEST_F(MsgsTest, ConvertMsgsQuaterionToMath)
 {
   msgs::Quaternion msg =
     msgs::Convert(math::Quaternion(M_PI * 0.25, M_PI * 0.5, M_PI));
@@ -136,7 +143,7 @@ TEST(MsgsTest, ConvertMsgsQuaterionToMath)
   EXPECT_TRUE(math::equal(v.w, 0.27059805007309851));
 }
 
-TEST(MsgsTest, ConvertPoseMathToMsgs)
+TEST_F(MsgsTest, ConvertPoseMathToMsgs)
 {
   msgs::Pose msg = msgs::Convert(math::Pose(math::Vector3(1, 2, 3),
         math::Quaternion(M_PI * 0.25, M_PI * 0.5, M_PI)));
@@ -151,7 +158,7 @@ TEST(MsgsTest, ConvertPoseMathToMsgs)
   EXPECT_TRUE(math::equal(msg.orientation().w(), 0.27059805007309851));
 }
 
-TEST(MsgsTest, ConvertMsgPoseToMath)
+TEST_F(MsgsTest, ConvertMsgPoseToMath)
 {
   msgs::Pose msg = msgs::Convert(math::Pose(math::Vector3(1, 2, 3),
         math::Quaternion(M_PI * 0.25, M_PI * 0.5, M_PI)));
@@ -166,7 +173,7 @@ TEST(MsgsTest, ConvertMsgPoseToMath)
   EXPECT_TRUE(math::equal(v.rot.w, 0.27059805007309851));
 }
 
-TEST(MsgsTest, ConvertCommonColorToMsgs)
+TEST_F(MsgsTest, ConvertCommonColorToMsgs)
 {
   msgs::Color msg = msgs::Convert(common::Color(.1, .2, .3, 1.0));
 
@@ -176,7 +183,7 @@ TEST(MsgsTest, ConvertCommonColorToMsgs)
   EXPECT_TRUE(math::equal(1.0f, msg.a()));
 }
 
-TEST(MsgsTest, ConvertMsgsColorToCommon)
+TEST_F(MsgsTest, ConvertMsgsColorToCommon)
 {
   msgs::Color msg = msgs::Convert(common::Color(.1, .2, .3, 1.0));
   common::Color v = msgs::Convert(msg);
@@ -187,7 +194,7 @@ TEST(MsgsTest, ConvertMsgsColorToCommon)
   EXPECT_TRUE(math::equal(1.0f, v.a));
 }
 
-TEST(MsgsTest, ConvertCommonTimeToMsgs)
+TEST_F(MsgsTest, ConvertCommonTimeToMsgs)
 {
   msgs::Time msg = msgs::Convert(common::Time(2, 123));
   EXPECT_EQ(2, msg.sec());
@@ -198,7 +205,7 @@ TEST(MsgsTest, ConvertCommonTimeToMsgs)
   EXPECT_EQ(123, v.nsec);
 }
 
-TEST(MsgsTest, ConvertMathPlaneToMsgs)
+TEST_F(MsgsTest, ConvertMathPlaneToMsgs)
 {
   msgs::PlaneGeom msg = msgs::Convert(math::Plane(math::Vector3(0, 0, 1),
         math::Vector2d(123, 456), 1.0));
@@ -211,7 +218,7 @@ TEST(MsgsTest, ConvertMathPlaneToMsgs)
   EXPECT_DOUBLE_EQ(456, msg.size().y());
 }
 
-TEST(MsgsTest, ConvertMsgsPlaneToMath)
+TEST_F(MsgsTest, ConvertMsgsPlaneToMath)
 {
   msgs::PlaneGeom msg = msgs::Convert(math::Plane(math::Vector3(0, 0, 1),
         math::Vector2d(123, 456), 1.0));
@@ -227,7 +234,7 @@ TEST(MsgsTest, ConvertMsgsPlaneToMath)
   EXPECT_TRUE(math::equal(1.0, v.d));
 }
 
-TEST(MsgsTest, SetVector3)
+TEST_F(MsgsTest, SetVector3)
 {
   msgs::Vector3d msg;
   msgs::Set(&msg, math::Vector3(1, 2, 3));
@@ -236,7 +243,7 @@ TEST(MsgsTest, SetVector3)
   EXPECT_DOUBLE_EQ(3, msg.z());
 }
 
-TEST(MsgsTest, SetVector2d)
+TEST_F(MsgsTest, SetVector2d)
 {
   msgs::Vector2d msg;
   msgs::Set(&msg, math::Vector2d(1, 2));
@@ -244,7 +251,7 @@ TEST(MsgsTest, SetVector2d)
   EXPECT_DOUBLE_EQ(2, msg.y());
 }
 
-TEST(MsgsTest, SetQuaternion)
+TEST_F(MsgsTest, SetQuaternion)
 {
   msgs::Quaternion msg;
   msgs::Set(&msg, math::Quaternion(M_PI * 0.25, M_PI * 0.5, M_PI));
@@ -254,7 +261,7 @@ TEST(MsgsTest, SetQuaternion)
   EXPECT_TRUE(math::equal(msg.w(), 0.27059805007309851));
 }
 
-TEST(MsgsTest, SetPose)
+TEST_F(MsgsTest, SetPose)
 {
   msgs::Pose msg;
   msgs::Set(&msg, math::Pose(math::Vector3(1, 2, 3),
@@ -270,7 +277,7 @@ TEST(MsgsTest, SetPose)
   EXPECT_TRUE(math::equal(msg.orientation().w(), 0.27059805007309851));
 }
 
-TEST(MsgsTest, SetColor)
+TEST_F(MsgsTest, SetColor)
 {
   msgs::Color msg;
   msgs::Set(&msg, common::Color(.1, .2, .3, 1.0));
@@ -280,7 +287,7 @@ TEST(MsgsTest, SetColor)
   EXPECT_TRUE(math::equal(1.0f, msg.a()));
 }
 
-TEST(MsgsTest, SetTime)
+TEST_F(MsgsTest, SetTime)
 {
   msgs::Time msg;
   msgs::Set(&msg, common::Time(2, 123));
@@ -288,7 +295,7 @@ TEST(MsgsTest, SetTime)
   EXPECT_EQ(123, msg.nsec());
 }
 
-TEST(MsgsTest, SetPlane)
+TEST_F(MsgsTest, SetPlane)
 {
   msgs::PlaneGeom msg;
   msgs::Set(&msg, math::Plane(math::Vector3(0, 0, 1),
@@ -304,7 +311,27 @@ TEST(MsgsTest, SetPlane)
   EXPECT_TRUE(math::equal(1.0, msg.d()));
 }
 
-TEST(MsgsTest, GUIFromSDF)
+TEST_F(MsgsTest, Initialization)
+{
+  {
+    msgs::Vector3d msg;
+    EXPECT_DOUBLE_EQ(0, msg.x());
+    EXPECT_DOUBLE_EQ(0, msg.y());
+    EXPECT_DOUBLE_EQ(0, msg.z());
+  }
+
+  {
+    msgs::Wrench msg;
+    EXPECT_DOUBLE_EQ(0, msg.force().x());
+    EXPECT_DOUBLE_EQ(0, msg.force().y());
+    EXPECT_DOUBLE_EQ(0, msg.force().z());
+    EXPECT_DOUBLE_EQ(0, msg.torque().x());
+    EXPECT_DOUBLE_EQ(0, msg.torque().y());
+    EXPECT_DOUBLE_EQ(0, msg.torque().z());
+  }
+}
+
+TEST_F(MsgsTest, GUIFromSDF)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("gui.sdf", sdf);
@@ -325,7 +352,7 @@ TEST(MsgsTest, GUIFromSDF)
   msgs::GUI msg = msgs::GUIFromSDF(sdf);
 }
 
-TEST(MsgsTest, GUIFromSDF_EmptyTrackVisual)
+TEST_F(MsgsTest, GUIFromSDF_EmptyTrackVisual)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("gui.sdf", sdf);
@@ -346,7 +373,7 @@ TEST(MsgsTest, GUIFromSDF_EmptyTrackVisual)
   msgs::GUI msg = msgs::GUIFromSDF(sdf);
 }
 
-TEST(MsgsTest, GUIFromSDF_WithEmptyCamera)
+TEST_F(MsgsTest, GUIFromSDF_WithEmptyCamera)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("gui.sdf", sdf);
@@ -360,7 +387,7 @@ TEST(MsgsTest, GUIFromSDF_WithEmptyCamera)
   msgs::GUI msg = msgs::GUIFromSDF(sdf);
 }
 
-TEST(MsgsTest, GUIFromSDF_WithoutCamera)
+TEST_F(MsgsTest, GUIFromSDF_WithoutCamera)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("gui.sdf", sdf);
@@ -372,7 +399,7 @@ TEST(MsgsTest, GUIFromSDF_WithoutCamera)
   msgs::GUI msg = msgs::GUIFromSDF(sdf);
 }
 
-TEST(MsgsTest, LightFromSDF_ListDirectional)
+TEST_F(MsgsTest, LightFromSDF_ListDirectional)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("light.sdf", sdf);
@@ -395,7 +422,7 @@ TEST(MsgsTest, LightFromSDF_ListDirectional)
   msgs::Light msg = msgs::LightFromSDF(sdf);
 }
 
-TEST(MsgsTest, LightFromSDF_LightSpot)
+TEST_F(MsgsTest, LightFromSDF_LightSpot)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("light.sdf", sdf);
@@ -422,7 +449,7 @@ TEST(MsgsTest, LightFromSDF_LightSpot)
   msgs::Light msg = msgs::LightFromSDF(sdf);
 }
 
-TEST(MsgsTest, LightFromSDF_LightPoint)
+TEST_F(MsgsTest, LightFromSDF_LightPoint)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("light.sdf", sdf);
@@ -443,7 +470,7 @@ TEST(MsgsTest, LightFromSDF_LightPoint)
   msgs::Light msg = msgs::LightFromSDF(sdf);
 }
 
-TEST(MsgsTest, LightFromSDF_LighBadType)
+TEST_F(MsgsTest, LightFromSDF_LighBadType)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("light.sdf", sdf);
@@ -456,7 +483,7 @@ TEST(MsgsTest, LightFromSDF_LighBadType)
 }
 
 // Plane visual
-TEST(MsgsTest, VisualFromSDF_PlaneVisual)
+TEST_F(MsgsTest, VisualFromSDF_PlaneVisual)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -473,7 +500,7 @@ TEST(MsgsTest, VisualFromSDF_PlaneVisual)
   msgs::Visual msg = msgs::VisualFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualFromSDF_BoxVisual)
+TEST_F(MsgsTest, VisualFromSDF_BoxVisual)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -490,7 +517,7 @@ TEST(MsgsTest, VisualFromSDF_BoxVisual)
   msgs::Visual msg = msgs::VisualFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualFromSDF_SphereVisual)
+TEST_F(MsgsTest, VisualFromSDF_SphereVisual)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -511,7 +538,7 @@ TEST(MsgsTest, VisualFromSDF_SphereVisual)
   msgs::Visual msg = msgs::VisualFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualFromSDF_CylinderVisual)
+TEST_F(MsgsTest, VisualFromSDF_CylinderVisual)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -530,7 +557,7 @@ TEST(MsgsTest, VisualFromSDF_CylinderVisual)
   msgs::Visual msg = msgs::VisualFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualFromSDF_MeshVisual)
+TEST_F(MsgsTest, VisualFromSDF_MeshVisual)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -549,7 +576,7 @@ TEST(MsgsTest, VisualFromSDF_MeshVisual)
   msgs::Visual msg = msgs::VisualFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualFromSDF_ImageVisual)
+TEST_F(MsgsTest, VisualFromSDF_ImageVisual)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -580,7 +607,7 @@ TEST(MsgsTest, VisualFromSDF_ImageVisual)
   msgs::Visual msg = msgs::VisualFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualFromSDF_HeigthmapVisual)
+TEST_F(MsgsTest, VisualFromSDF_HeigthmapVisual)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -604,7 +631,7 @@ TEST(MsgsTest, VisualFromSDF_HeigthmapVisual)
   msgs::Visual msg = msgs::VisualFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualFromSDF_NoGeometry)
+TEST_F(MsgsTest, VisualFromSDF_NoGeometry)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -617,7 +644,7 @@ TEST(MsgsTest, VisualFromSDF_NoGeometry)
       common::Exception);
 }
 
-TEST(MsgsTest, VisualFromSDF_ShaderTypeThrow)
+TEST_F(MsgsTest, VisualFromSDF_ShaderTypeThrow)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -639,7 +666,7 @@ TEST(MsgsTest, VisualFromSDF_ShaderTypeThrow)
   msgs::Visual msg = msgs::VisualFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualFromSDF_BadGeometryVisual)
+TEST_F(MsgsTest, VisualFromSDF_BadGeometryVisual)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -658,7 +685,7 @@ TEST(MsgsTest, VisualFromSDF_BadGeometryVisual)
                common::Exception);
 }
 
-TEST(MsgsTest, VisualFromSDF_BadGeometryType)
+TEST_F(MsgsTest, VisualFromSDF_BadGeometryType)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("visual.sdf", sdf);
@@ -688,7 +715,7 @@ TEST(MsgsTest, VisualFromSDF_BadGeometryType)
       common::Exception);
 }
 
-TEST(MsgsTest, VisualFromSDF_BadFogType)
+TEST_F(MsgsTest, VisualFromSDF_BadFogType)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("scene.sdf", sdf);
@@ -706,7 +733,7 @@ TEST(MsgsTest, VisualFromSDF_BadFogType)
   EXPECT_THROW(msgs::Scene msg = msgs::SceneFromSDF(sdf), common::Exception);
 }
 
-TEST(MsgsTest, VisualSceneFromSDF_A)
+TEST_F(MsgsTest, VisualSceneFromSDF_A)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("scene.sdf", sdf);
@@ -723,7 +750,7 @@ TEST(MsgsTest, VisualSceneFromSDF_A)
   msgs::Scene msg = msgs::SceneFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualSceneFromSDF_B)
+TEST_F(MsgsTest, VisualSceneFromSDF_B)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("scene.sdf", sdf);
@@ -740,7 +767,7 @@ TEST(MsgsTest, VisualSceneFromSDF_B)
   msgs::Scene msg = msgs::SceneFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualSceneFromSDF_C)
+TEST_F(MsgsTest, VisualSceneFromSDF_C)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("scene.sdf", sdf);
@@ -759,7 +786,7 @@ TEST(MsgsTest, VisualSceneFromSDF_C)
   msgs::Scene msg = msgs::SceneFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualSceneFromSDF_CEmpty)
+TEST_F(MsgsTest, VisualSceneFromSDF_CEmpty)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("scene.sdf", sdf);
@@ -771,7 +798,7 @@ TEST(MsgsTest, VisualSceneFromSDF_CEmpty)
   msgs::Scene msg = msgs::SceneFromSDF(sdf);
 }
 
-TEST(MsgsTest, VisualSceneFromSDF_CEmptyNoSky)
+TEST_F(MsgsTest, VisualSceneFromSDF_CEmptyNoSky)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("scene.sdf", sdf);
@@ -785,7 +812,7 @@ TEST(MsgsTest, VisualSceneFromSDF_CEmptyNoSky)
 }
 
 /////////////////////////////////////////////////
-TEST(MsgsTest, MeshFromSDF)
+TEST_F(MsgsTest, MeshFromSDF)
 {
   sdf::ElementPtr sdf(new sdf::Element());
   sdf::initFile("geometry.sdf", sdf);
diff --git a/gazebo/msgs/physics.proto b/gazebo/msgs/physics.proto
index 51d627d..a9ea7d4 100644
--- a/gazebo/msgs/physics.proto
+++ b/gazebo/msgs/physics.proto
@@ -14,25 +14,23 @@ message Physics
   {
     ODE = 1;
     BULLET = 2;
+    SIMBODY = 3;
+    DART = 4;
   }
-  required Type type = 2[default=ODE];
+  optional Type type                         = 1[default=ODE];
 
-  optional string solver_type = 3;
-  /// dt is deprecated by max_step_size
-  optional double dt = 4;
-  optional double min_step_size = 5;
-  optional int32 precon_iters = 6;
-  optional int32 iters = 7;
-  optional double sor = 8;
-  optional double cfm = 9;
-  optional double erp = 10;
-  optional double contact_max_correcting_vel = 11;
-  optional double contact_surface_layer = 12;
-  optional Vector3d gravity = 13;
-  /// update_rate is deprecated by real_time_update_rate
-  optional double update_rate = 14;
-  optional bool enable_physics = 15;
-  optional double real_time_factor = 16;
-  optional double real_time_update_rate = 17;
-  optional double max_step_size = 18;
+  optional string solver_type                = 2;
+  optional double min_step_size              = 3;
+  optional int32 precon_iters                = 4;
+  optional int32 iters                       = 5;
+  optional double sor                        = 6;
+  optional double cfm                        = 7;
+  optional double erp                        = 8;
+  optional double contact_max_correcting_vel = 9;
+  optional double contact_surface_layer      = 10;
+  optional Vector3d gravity                  = 11;
+  optional bool enable_physics               = 12;
+  optional double real_time_factor           = 13;
+  optional double real_time_update_rate      = 14;
+  optional double max_step_size              = 15;
 }
diff --git a/gazebo/msgs/plugin.proto b/gazebo/msgs/plugin.proto
index b508341..722b8d1 100644
--- a/gazebo/msgs/plugin.proto
+++ b/gazebo/msgs/plugin.proto
@@ -9,6 +9,7 @@ message Plugin
 {
   required string name         = 1;
   required string filename     = 2;
+  optional string innerxml     = 3 [default = ""];
 }
 
 
diff --git a/gazebo/msgs/pointcloud.proto b/gazebo/msgs/pointcloud.proto
new file mode 100644
index 0000000..62eba52
--- /dev/null
+++ b/gazebo/msgs/pointcloud.proto
@@ -0,0 +1,12 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface PointCloud
+/// \brief A point cloud
+
+import "vector3d.proto";
+
+message PointCloud
+{
+  repeated Vector3d points = 1;
+}
diff --git a/gazebo/msgs/pose.proto b/gazebo/msgs/pose.proto
index 891f2e3..3c6c606 100644
--- a/gazebo/msgs/pose.proto
+++ b/gazebo/msgs/pose.proto
@@ -11,6 +11,7 @@ import "quaternion.proto";
 message Pose
 {
   optional string name            = 1;
-  required Vector3d position      = 2;
-  required Quaternion orientation = 3;
+  optional uint32 id              = 2;
+  required Vector3d position      = 3;
+  required Quaternion orientation = 4;
 }
diff --git a/gazebo/msgs/pose_animation.proto b/gazebo/msgs/pose_animation.proto
index 67836fb..cefa8d5 100644
--- a/gazebo/msgs/pose_animation.proto
+++ b/gazebo/msgs/pose_animation.proto
@@ -11,8 +11,7 @@ import "time.proto";
 message PoseAnimation
 {
   required string model_name      = 1;
-  repeated Pose pose              = 2;
-  repeated Time time              = 3;
+  optional uint32 model_id        = 2;
+  repeated Pose pose              = 3;
+  repeated Time time              = 4;
 }
-
-
diff --git a/gazebo/msgs/pose_v.proto b/gazebo/msgs/pose_v.proto
index df00bda..1e1bf18 100644
--- a/gazebo/msgs/pose_v.proto
+++ b/gazebo/msgs/pose_v.proto
@@ -1,7 +1,7 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Pose Vector
+/// \interface Pose_V
 /// \brief Message for a vector of poses
 
 import "pose.proto";
diff --git a/gazebo/msgs/poses_stamped.proto b/gazebo/msgs/poses_stamped.proto
new file mode 100644
index 0000000..4c49624
--- /dev/null
+++ b/gazebo/msgs/poses_stamped.proto
@@ -0,0 +1,14 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface PosesStamped
+/// \brief Message for a vector of poses with a time stamp
+
+import "time.proto";
+import "pose.proto";
+
+message PosesStamped
+{
+  required Time time = 1;
+  repeated Pose pose = 2;
+}
diff --git a/gazebo/msgs/propagation_grid.proto b/gazebo/msgs/propagation_grid.proto
new file mode 100644
index 0000000..884ba8a
--- /dev/null
+++ b/gazebo/msgs/propagation_grid.proto
@@ -0,0 +1,14 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface PropagationGrid
+/// \brief Wireless propagation grid
+
+
+import "propagation_particle.proto";
+
+message PropagationGrid
+{
+  repeated PropagationParticle particle = 1;
+}
+
diff --git a/gazebo/msgs/propagation_particle.proto b/gazebo/msgs/propagation_particle.proto
new file mode 100644
index 0000000..ed75fc4
--- /dev/null
+++ b/gazebo/msgs/propagation_particle.proto
@@ -0,0 +1,13 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface PropagationParticle
+/// \brief Wireless strength signal in a point
+
+
+message PropagationParticle
+{
+  required double x = 1;
+  required double y = 2;
+  required double signal_level = 3;
+}
diff --git a/gazebo/msgs/publishers.proto b/gazebo/msgs/publishers.proto
index e3c0df1..36b5980 100644
--- a/gazebo/msgs/publishers.proto
+++ b/gazebo/msgs/publishers.proto
@@ -11,5 +11,3 @@ message Publishers
 {
   repeated Publish publisher = 1;
 }
-
-
diff --git a/gazebo/msgs/sensor.proto b/gazebo/msgs/sensor.proto
index f503350..e892b21 100644
--- a/gazebo/msgs/sensor.proto
+++ b/gazebo/msgs/sensor.proto
@@ -13,15 +13,16 @@ import "contactsensor.proto";
 message Sensor
 {
   required string name             = 1;
-  required string parent           = 2;
-  required string type             = 3;
-  optional bool always_on          = 4;
-  optional double update_rate      = 5;
-  optional Pose pose               = 6;
-  optional CameraSensor camera     = 7;
-  optional RaySensor ray           = 8;
-  optional ContactSensor contact   = 9;
-  optional bool visualize          = 10;
-  optional string topic            = 11;
+  optional uint32 id               = 2;
+  required string parent           = 3;
+  required uint32 parent_id        = 4;
+  required string type             = 5;
+  optional bool always_on          = 6;
+  optional double update_rate      = 7;
+  optional Pose pose               = 8;
+  optional CameraSensor camera     = 9;
+  optional RaySensor ray           = 10;
+  optional ContactSensor contact   = 11;
+  optional bool visualize          = 12;
+  optional string topic            = 13;
 }
-
diff --git a/gazebo/msgs/server_control.proto b/gazebo/msgs/server_control.proto
index 1ba7e74..02066c4 100644
--- a/gazebo/msgs/server_control.proto
+++ b/gazebo/msgs/server_control.proto
@@ -13,6 +13,5 @@ message ServerControl
   optional string save_filename   = 2;
   optional string open_filename   = 3;
   optional bool new_world         = 4;
+  optional bool stop              = 5;
 }
-
-
diff --git a/gazebo/msgs/sonar.proto b/gazebo/msgs/sonar.proto
new file mode 100644
index 0000000..d59c350
--- /dev/null
+++ b/gazebo/msgs/sonar.proto
@@ -0,0 +1,21 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface Sonar
+/// \brief Message for a sonar value
+
+import "pose.proto";
+import "vector3d.proto";
+
+message Sonar
+{
+  required string frame     = 1;
+  required Pose world_pose  = 2;
+  required double range_min = 3;
+  required double range_max = 4;
+  required double radius    = 5;
+  required double range     = 6;
+
+  /// Location of the contact in the world frame.
+  optional Vector3d contact  = 7;
+}
diff --git a/gazebo/msgs/sonar_stamped.proto b/gazebo/msgs/sonar_stamped.proto
new file mode 100644
index 0000000..711e465
--- /dev/null
+++ b/gazebo/msgs/sonar_stamped.proto
@@ -0,0 +1,15 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface SonarStamped
+/// \brief Message for a time stamped sonar value
+
+import "time.proto";
+import "sonar.proto";
+
+message SonarStamped
+{
+  // Time when the data was captured
+  required Time time       = 1;
+  required Sonar sonar     = 2;
+}
diff --git a/gazebo/msgs/spherical_coordinates.proto b/gazebo/msgs/spherical_coordinates.proto
new file mode 100644
index 0000000..b3c1adb
--- /dev/null
+++ b/gazebo/msgs/spherical_coordinates.proto
@@ -0,0 +1,19 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface SphericalCoordinates
+/// \brief Spherical coordinates information 
+
+message SphericalCoordinates
+{
+  enum SurfaceModel
+  {
+    EARTH_WGS84 = 1;
+  }
+
+  required SurfaceModel surface_model   = 1;
+  required double latitude_deg          = 2;
+  required double longitude_deg         = 3;
+  required double elevation             = 4;
+  required double heading_deg           = 5;
+}
diff --git a/gazebo/msgs/surface.proto b/gazebo/msgs/surface.proto
index f5a3866..d2a1ba5 100644
--- a/gazebo/msgs/surface.proto
+++ b/gazebo/msgs/surface.proto
@@ -1,7 +1,7 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Surface 
+/// \interface Surface
 /// \brief Information about a surface element
 
 
@@ -18,5 +18,6 @@ message Surface
   optional double kd                        = 7;
   optional double max_vel                   = 8;
   optional double min_depth                 = 9;
+  optional bool collide_without_contact     = 10;
+  optional uint32 collide_without_contact_bitmask = 11;
 }
-
diff --git a/gazebo/msgs/tactile.proto b/gazebo/msgs/tactile.proto
new file mode 100644
index 0000000..cacb705
--- /dev/null
+++ b/gazebo/msgs/tactile.proto
@@ -0,0 +1,15 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface Tactile
+/// \brief Message for a tactile data
+
+import "time.proto";
+
+message Tactile
+{
+  repeated string collision_name = 1;
+  repeated uint32 collision_id   = 2;
+  repeated double pressure       = 3;
+  required Time time             = 4;
+}
diff --git a/gazebo/msgs/test/CMakeLists.txt b/gazebo/msgs/test/CMakeLists.txt
deleted file mode 100644
index ca0bea2..0000000
--- a/gazebo/msgs/test/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-include (${gazebo_cmake_dir}/GazeboUtils.cmake)
-
-include_directories (
-  ${PROJECT_SOURCE_DIR}/gazebo 
-  ${PROJECT_BINARY_DIR}/gazebo
-  ${PROTOBUF_INCLUDE_DIR}
-)
-
-set (gtest_sources 
-  MsgFactory.cc 
-)
-
-gz_build_tests(${gtest_sources})
diff --git a/gazebo/msgs/test/MsgFactory.cc b/gazebo/msgs/test/MsgFactory.cc
deleted file mode 100644
index 5775260..0000000
--- a/gazebo/msgs/test/MsgFactory.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <boost/lexical_cast.hpp>
-#include <boost/algorithm/string/trim.hpp>
-
-#include "gazebo/msgs/msgs.hh"
-#include "gazebo/msgs/MsgFactory.hh"
-#include "test_config.h"
-
-std::string custom_exec(const std::string &_cmd)
-{
-  FILE* pipe = popen(_cmd.c_str(), "r");
-
-  if (!pipe)
-    return "ERROR";
-
-  char buffer[128];
-  std::string result = "";
-
-  while (!feof(pipe))
-  {
-    if (fgets(buffer, 128, pipe) != NULL)
-      result += buffer;
-  }
-
-  pclose(pipe);
-  return result;
-}
-
-/////////////////////////////////////////////////
-/// Check for null when asked for a bad message type
-TEST(MsgFactory, BadMsgType)
-{
-  boost::shared_ptr<google::protobuf::Message> msg =
-    gazebo::msgs::MsgFactory::NewMsg("bad");
-  EXPECT_EQ(NULL, msg.get());
-}
-
-/////////////////////////////////////////////////
-/// Check to make sure that NewMsg works properly
-TEST(MsgFactory, NewMsg)
-{
-  gazebo::msgs::Vector3d goodMsg;
-  goodMsg.set_x(1.1);
-  goodMsg.set_y(2.2);
-  goodMsg.set_z(3.3);
-
-  std::string serializedData;
-  goodMsg.SerializeToString(&serializedData);
-
-  gazebo::msgs::Vector3dPtr msg =
-    boost::dynamic_pointer_cast<gazebo::msgs::Vector3d>(
-        gazebo::msgs::MsgFactory::NewMsg("gazebo.msgs.Vector3d"));
-
-  msg->ParseFromString(serializedData);
-  EXPECT_NEAR(msg->x(), 1.1, 1e-6);
-  EXPECT_NEAR(msg->y(), 2.2, 1e-6);
-  EXPECT_NEAR(msg->z(), 3.3, 1e-6);
-}
-
-/////////////////////////////////////////////////
-/// Check to make sure that all the proto files have been registered
-TEST(MsgFactory, AllTypes)
-{
-  std::vector<std::string> types;
-  gazebo::msgs::MsgFactory::GetMsgTypes(types);
-  std::string protoCount = custom_exec(std::string("ls ") +
-      PROJECT_SOURCE_PATH + "/gazebo/msgs/*.proto | wc -l");
-  boost::trim_right(protoCount);
-
-  EXPECT_EQ(boost::lexical_cast<size_t>(protoCount), types.size());
-}
-
-/////////////////////////////////////////////////
-/// Main
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/gazebo/msgs/topic_info.proto b/gazebo/msgs/topic_info.proto
index 2c6d09e..366a281 100644
--- a/gazebo/msgs/topic_info.proto
+++ b/gazebo/msgs/topic_info.proto
@@ -14,5 +14,3 @@ message TopicInfo
   repeated Publish publisher    = 2;
   repeated Subscribe subscriber = 3;
 }
-
-
diff --git a/gazebo/msgs/track_visual.proto b/gazebo/msgs/track_visual.proto
index 18f3353..10886db 100644
--- a/gazebo/msgs/track_visual.proto
+++ b/gazebo/msgs/track_visual.proto
@@ -1,16 +1,15 @@
 package gazebo.msgs;
 
 /// \ingroup gazebo_msgs
-/// \interface Trackvisual
+/// \interface TrackVisual
 /// \brief Message for a trackking a rendering::Visual with a rendering::Camera
 
 
 message TrackVisual
 {
   required string name              = 1;
-  optional bool inherit_orientation = 2;
-  optional double min_dist          = 3;
-  optional double max_dist          = 4;
+  optional uint32 id                = 2;
+  optional bool inherit_orientation = 3;
+  optional double min_dist          = 4;
+  optional double max_dist          = 5;
 }
-
-
diff --git a/gazebo/msgs/vector3d.proto b/gazebo/msgs/vector3d.proto
index 20f545e..2bc6428 100644
--- a/gazebo/msgs/vector3d.proto
+++ b/gazebo/msgs/vector3d.proto
@@ -13,5 +13,3 @@ message Vector3d
   required double y = 3;
   required double z = 4;
 }
-
-
diff --git a/gazebo/msgs/visual.proto b/gazebo/msgs/visual.proto
index ee0c561..7dbe06b 100644
--- a/gazebo/msgs/visual.proto
+++ b/gazebo/msgs/visual.proto
@@ -9,20 +9,24 @@ import "pose.proto";
 import "geometry.proto";
 import "material.proto";
 import "plugin.proto";
+import "vector3d.proto";
 
 message Visual
 {
   required string name         = 1;
-  optional string parent_name  = 2;
-  optional bool cast_shadows   = 3;
-  optional double transparency = 4;
-  optional double laser_retro  = 5;
-  optional Pose pose           = 6;
-  optional Geometry geometry   = 7;
-  optional Material material   = 8;
+  optional uint32 id           = 2; 
+  required string parent_name  = 3;
+  optional uint32 parent_id    = 4;
+  optional bool cast_shadows   = 5;
+  optional double transparency = 6;
+  optional double laser_retro  = 7;
+  optional Pose pose           = 8;
+  optional Geometry geometry   = 9;
+  optional Material material   = 10;
 
-  optional bool visible        = 9;
-  optional bool delete_me      = 11;
-  optional bool is_static      = 12;
-  optional Plugin plugin       = 13;
+  optional bool visible        = 11;
+  optional bool delete_me      = 12;
+  optional bool is_static      = 13;
+  optional Plugin plugin       = 14;
+  optional Vector3d scale      = 15;
 }
diff --git a/gazebo/msgs/wireless_node.proto b/gazebo/msgs/wireless_node.proto
new file mode 100644
index 0000000..f69863a
--- /dev/null
+++ b/gazebo/msgs/wireless_node.proto
@@ -0,0 +1,13 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface WirelessNode
+/// \brief Message for sending info about a detected wireless transmitter
+
+
+message WirelessNode
+{
+  required string essid        = 1;
+  required double frequency    = 2;
+  required double signal_level = 3;
+}
diff --git a/gazebo/msgs/wireless_nodes.proto b/gazebo/msgs/wireless_nodes.proto
new file mode 100644
index 0000000..3269465
--- /dev/null
+++ b/gazebo/msgs/wireless_nodes.proto
@@ -0,0 +1,14 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface WirelessNodes
+/// \brief Msgs for sending information about a list of wireless transmitters
+
+
+import "wireless_node.proto";
+
+message WirelessNodes
+{
+  repeated WirelessNode node = 1;
+}
+
diff --git a/gazebo/msgs/world_control.proto b/gazebo/msgs/world_control.proto
index c2060b8..d8870d5 100644
--- a/gazebo/msgs/world_control.proto
+++ b/gazebo/msgs/world_control.proto
@@ -10,6 +10,7 @@ message WorldControl
 {
   optional bool pause           = 1;
   optional bool step            = 2;
-  optional WorldReset reset     = 3;
-  optional uint32 seed          = 4;
+  optional uint32 multi_step    = 3;
+  optional WorldReset reset     = 4;
+  optional uint32 seed          = 5;
 }
diff --git a/gazebo/msgs/wrench.proto b/gazebo/msgs/wrench.proto
new file mode 100644
index 0000000..3629962
--- /dev/null
+++ b/gazebo/msgs/wrench.proto
@@ -0,0 +1,14 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface Wrench 
+/// \brief Message for a wrench value
+
+
+import "vector3d.proto";
+
+message Wrench
+{
+  required Vector3d force  = 1;
+  required Vector3d torque = 2;
+}
diff --git a/gazebo/msgs/wrench_stamped.proto b/gazebo/msgs/wrench_stamped.proto
new file mode 100644
index 0000000..339b47c
--- /dev/null
+++ b/gazebo/msgs/wrench_stamped.proto
@@ -0,0 +1,15 @@
+package gazebo.msgs;
+
+/// \ingroup gazebo_msgs
+/// \interface WrenchStamped
+/// \brief Message for a time stamped wrench value
+
+import "time.proto";
+import "wrench.proto";
+
+message WrenchStamped
+{
+  // Time when the data was captured
+  required Time time       = 1;
+  required Wrench wrench   = 2;
+}
diff --git a/gazebo/physics/Actor.cc b/gazebo/physics/Actor.cc
index c1edb52..138e6da 100644
--- a/gazebo/physics/Actor.cc
+++ b/gazebo/physics/Actor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,35 +14,35 @@
  * limitations under the License.
  *
 */
-#include <msgs/msgs.hh>
-
 #include <boost/thread/recursive_mutex.hpp>
 #include <sstream>
 #include <limits>
 #include <algorithm>
 
-#include "common/KeyFrame.hh"
-#include "common/Animation.hh"
-#include "common/Plugin.hh"
-#include "common/Events.hh"
-#include "common/Exception.hh"
-#include "common/Console.hh"
-#include "common/CommonTypes.hh"
-#include "common/MeshManager.hh"
-#include "common/Mesh.hh"
-#include "common/Skeleton.hh"
-#include "common/SkeletonAnimation.hh"
-#include "common/BVHLoader.hh"
-
-#include "physics/World.hh"
-#include "physics/Joint.hh"
-#include "physics/Link.hh"
-#include "physics/Model.hh"
-#include "physics/PhysicsEngine.hh"
-#include "physics/Actor.hh"
-#include "physics/Physics.hh"
-
-#include "transport/Node.hh"
+#include "gazebo/msgs/msgs.hh"
+
+#include "gazebo/common/KeyFrame.hh"
+#include "gazebo/common/Animation.hh"
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/Skeleton.hh"
+#include "gazebo/common/SkeletonAnimation.hh"
+#include "gazebo/common/BVHLoader.hh"
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Joint.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/Actor.hh"
+#include "gazebo/physics/PhysicsIface.hh"
+
+#include "gazebo/transport/Node.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -70,11 +70,11 @@ Actor::~Actor()
 void Actor::Load(sdf::ElementPtr _sdf)
 {
   sdf::ElementPtr skinSdf = _sdf->GetElement("skin");
-  this->skinFile = skinSdf->GetValueString("filename");
-  this->skinScale = skinSdf->GetValueDouble("scale");
+  this->skinFile = skinSdf->Get<std::string>("filename");
+  this->skinScale = skinSdf->Get<double>("scale");
 
   MeshManager::Instance()->Load(this->skinFile);
-  std::string actorName = _sdf->GetValueString("name");
+  std::string actorName = _sdf->Get<std::string>("name");
 
 /*  double radius = 1.0;
   unsigned int pointNum = 32;
@@ -117,6 +117,8 @@ void Actor::Load(sdf::ElementPtr _sdf)
     this->visualName = actorName + "::" + actorName + "_pose::"
                              + actorName + "_visual";
 
+    this->visualId = gazebo::physics::getUniqueId();
+
     for (NodeMapIter iter = nodes.begin(); iter != nodes.end(); ++iter)
     {
       SkeletonNode* bone = iter->second;
@@ -203,9 +205,9 @@ void Actor::Load(sdf::ElementPtr _sdf)
 //////////////////////////////////////////////////
 void Actor::LoadScript(sdf::ElementPtr _sdf)
 {
-  this->loop = _sdf->GetValueBool("loop");
-  this->startDelay = _sdf->GetValueDouble("delay_start");
-  this->autoStart = _sdf->GetValueBool("auto_start");
+  this->loop = _sdf->Get<bool>("loop");
+  this->startDelay = _sdf->Get<double>("delay_start");
+  this->autoStart = _sdf->Get<bool>("auto_start");
   this->active = this->autoStart;
 
   if (_sdf->HasElement("trajectory"))
@@ -213,17 +215,17 @@ void Actor::LoadScript(sdf::ElementPtr _sdf)
     sdf::ElementPtr trajSdf = _sdf->GetElement("trajectory");
     while (trajSdf)
     {
-      if (this->skelAnimation.find(trajSdf->GetValueString("type")) ==
+      if (this->skelAnimation.find(trajSdf->Get<std::string>("type")) ==
               this->skelAnimation.end())
       {
         gzwarn << "Resource not found for trajectory of type " <<
-                  trajSdf->GetValueString("type") << "\n";
+                  trajSdf->Get<std::string>("type") << "\n";
         continue;
       }
 
       TrajectoryInfo tinfo;
-      tinfo.id = trajSdf->GetValueInt("id");
-      tinfo.type = trajSdf->GetValueString("type");
+      tinfo.id = trajSdf->Get<int>("id");
+      tinfo.type = trajSdf->Get<std::string>("type");
       std::vector<TrajectoryInfo>::iterator iter = this->trajInfo.begin();
       while (iter != this->trajInfo.end())
       {
@@ -242,8 +244,8 @@ void Actor::LoadScript(sdf::ElementPtr _sdf)
         sdf::ElementPtr wayptSdf = trajSdf->GetElement("waypoint");
         while (wayptSdf)
         {
-          points[wayptSdf->GetValueDouble("time")] =
-                                          wayptSdf->GetValuePose("pose");
+          points[wayptSdf->Get<double>("time")] =
+                                          wayptSdf->Get<math::Pose>("pose");
           wayptSdf = wayptSdf->GetNextElement("waypoint");
         }
 
@@ -283,9 +285,9 @@ void Actor::LoadScript(sdf::ElementPtr _sdf)
     }
   }
   double scriptTime = 0.0;
-  if (this->skelAnimation.size() > 0)
+  if (!this->skelAnimation.empty())
   {
-    if (this->trajInfo.size() == 0)
+    if (this->trajInfo.empty())
     {
       TrajectoryInfo tinfo;
       tinfo.id = 0;
@@ -310,7 +312,7 @@ void Actor::LoadScript(sdf::ElementPtr _sdf)
 //////////////////////////////////////////////////
 void Actor::LoadAnimation(sdf::ElementPtr _sdf)
 {
-  std::string animName = _sdf->GetValueString("name");
+  std::string animName = _sdf->Get<std::string>("name");
 
   if (animName == "__default__")
   {
@@ -325,16 +327,16 @@ void Actor::LoadAnimation(sdf::ElementPtr _sdf)
   }
   else
   {
-    std::string animFile = _sdf->GetValueString("filename");
+    std::string animFile = _sdf->Get<std::string>("filename");
     std::string extension = animFile.substr(animFile.rfind(".") + 1,
         animFile.size());
-    double scale = _sdf->GetValueDouble("scale");
+    double animScale = _sdf->Get<double>("scale");
     Skeleton *skel = NULL;
 
     if (extension == "bvh")
     {
       BVHLoader loader;
-      skel = loader.Load(animFile, scale);
+      skel = loader.Load(animFile, animScale);
     }
     else
       if (extension == "dae")
@@ -346,7 +348,7 @@ void Actor::LoadAnimation(sdf::ElementPtr _sdf)
         if (animMesh && animMesh->HasSkeleton())
         {
           skel = animMesh->GetSkeleton();
-          skel->Scale(scale);
+          skel->Scale(animScale);
         }
       }
 
@@ -381,7 +383,7 @@ void Actor::LoadAnimation(sdf::ElementPtr _sdf)
       {
         this->skelAnimation[animName] =
             skel->GetAnimation(0);
-        this->interpolateX[animName] = _sdf->GetValueBool("interpolate_x");
+        this->interpolateX[animName] = _sdf->Get<bool>("interpolate_x");
         this->skelNodesMap[animName] = skelMap;
       }
     }
@@ -524,6 +526,7 @@ void Actor::SetPose(std::map<std::string, math::Matrix4> _frame,
 {
   msgs::PoseAnimation msg;
   msg.set_model_name(this->visualName);
+  msg.set_model_id(this->visualId);
 
   math::Matrix4 modelTrans(math::Matrix4::IDENTITY);
   math::Pose mainLinkPose;
@@ -693,3 +696,10 @@ void Actor::AddActorVisual(sdf::ElementPtr _linkSdf, const std::string &_name,
   meshSdf->GetElement("scale")->Set(math::Vector3(this->skinScale,
       this->skinScale, this->skinScale));
 }
+
+//////////////////////////////////////////////////
+TrajectoryInfo::TrajectoryInfo()
+  : id(0), type(""), duration(0.0), startTime(0.0), endTime(0.0),
+  translated(false)
+{
+}
diff --git a/gazebo/physics/Actor.hh b/gazebo/physics/Actor.hh
index fdf0fa1..896aa3f 100644
--- a/gazebo/physics/Actor.hh
+++ b/gazebo/physics/Actor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,10 +21,11 @@
 #include <map>
 #include <vector>
 
-#include "physics/Model.hh"
-#include "common/Time.hh"
-#include "common/Skeleton.hh"
-#include "common/Animation.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/common/Time.hh"
+#include "gazebo/common/Skeleton.hh"
+#include "gazebo/common/Animation.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,14 +37,29 @@ namespace gazebo
 
   namespace physics
   {
-    struct TrajectoryInfo
+    /// \brief Information about a trajectory for an Actor.
+    class GAZEBO_VISIBLE TrajectoryInfo
     {
-      unsigned int id;
-      std::string type;
-      double duration;
-      double startTime;
-      double endTime;
-      bool translated;
+      /// \brief Constructor.
+      public: TrajectoryInfo();
+
+      /// \brief ID of the trajectory.
+      public: unsigned int id;
+
+      /// \brief Type of trajectory.
+      public: std::string type;
+
+      /// \brief Duration of the trajectory.
+      public: double duration;
+
+      /// \brief Start time of the trajectory.
+      public: double startTime;
+
+      /// \brief End time of the trajectory.
+      public: double endTime;
+
+      /// \brief True if the trajectory is tranlated.
+      public: bool translated;
     };
 
     /// \addtogroup gazebo_physics
@@ -52,7 +68,7 @@ namespace gazebo
     /// \class Actor Actor.hh physics/physics.hh
     /// \brief Actor class enables GPU based mesh model / skeleton
     /// scriptable animation.
-    class Actor : public Model
+    class GAZEBO_VISIBLE Actor : public Model
     {
       /// \brief Constructor
       /// \param[in] _parent Parent object
@@ -229,6 +245,9 @@ namespace gazebo
       /// \brief Name of the visual
       protected: std::string visualName;
 
+      /// \brief ID for this visual
+      protected: uint32_t visualId;
+
       /// \brief Where to send bone info.
       protected: transport::PublisherPtr bonePosePub;
 
diff --git a/gazebo/physics/BallJoint.hh b/gazebo/physics/BallJoint.hh
index 1981c48..205fe33 100644
--- a/gazebo/physics/BallJoint.hh
+++ b/gazebo/physics/BallJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,7 +22,8 @@
 #ifndef _BALLJOINT_HH_
 #define _BALLJOINT_HH_
 
-#include "Joint.hh"
+#include "gazebo/physics/Joint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,7 +37,7 @@ namespace gazebo
     ///
     /// Each physics engine should implement this class.
     template< class T>
-    class BallJoint : public T
+    class GAZEBO_VISIBLE BallJoint : public T
     {
       /// \brief Constructor
       /// \param[in] _parent Pointer to the parent link.
@@ -50,38 +51,25 @@ namespace gazebo
               {
               }
 
+      /// \internal
+      public: virtual unsigned int GetAngleCount() const
+              {
+                return 0;
+              }
+
       /// \brief Template to ::Load the BallJoint.
       /// \param[in] _sdf SDF to load the joint from.
       public: void Load(sdf::ElementPtr _sdf)
-              {T::Load(_sdf);}
-
-      /// \internal
-      /// \brief Set the axis of rotation. This is not used for ball joints.
-      public: virtual void SetAxis(int /*_index*/,
-                                   const math::Vector3 &/*_axis*/) {}
-
-      /// \internal
-      /// \brief Set the high stop of an axis(index).
-      public: virtual void SetHighStop(int /*_index*/,
-                                       math::Angle /*_angle*/) {}
-
-      /// \internal
-      /// \brief Set the low stop of an axis(index).
-      public: virtual void SetLowStop(int /*_index*/, math::Angle /*_angle*/) {}
-
-      /// \internal
-      /// \brief Get the high stop of an axis(index).
-      public: virtual math::Angle GetHighStop(int /*_index*/)
-              {return math::Angle();}
+              {
+                T::Load(_sdf);
+              }
 
-      /// \internal
-      /// \brief Get the low stop of an axis(index).
-      public: virtual math::Angle GetLowStop(int /*_index*/)
-              {return math::Angle();}
 
-      /// \internal
-      public: virtual unsigned int GetAngleCount() const
-              {return 0;}
+      /// \brief Initialize joint
+      protected: virtual void Init()
+                 {
+                   T::Init();
+                 }
     };
     /// \}
   }
diff --git a/gazebo/physics/Base.cc b/gazebo/physics/Base.cc
index eb47a0f..44cb453 100644
--- a/gazebo/physics/Base.cc
+++ b/gazebo/physics/Base.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,25 +24,25 @@
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Exception.hh"
+#include "gazebo/physics/PhysicsIface.hh"
 #include "gazebo/physics/World.hh"
 #include "gazebo/physics/Base.hh"
 
 using namespace gazebo;
 using namespace physics;
 
-unsigned int Base::idCounter = 0;
-
 //////////////////////////////////////////////////
 Base::Base(BasePtr _parent)
 : parent(_parent)
 {
   this->type = BASE;
-  this->id = ++idCounter;
+  this->id = physics::getUniqueId();
   this->saveable = true;
   this->selected = false;
 
   this->sdf.reset(new sdf::Element);
   this->sdf->AddAttribute("name", "string", "__default__", true);
+  this->name = "__default__";
 
   if (this->parent)
   {
@@ -60,28 +60,37 @@ Base::~Base()
   this->SetParent(BasePtr());
 
   for (Base_V::iterator iter = this->children.begin();
-       iter != this->childrenEnd; ++iter)
+       iter != this->children.end(); ++iter)
   {
     if (*iter)
       (*iter)->SetParent(BasePtr());
   }
   this->children.clear();
-  this->childrenEnd = this->children.end();
-  this->sdf->Reset();
+  if (this->sdf)
+    this->sdf->Reset();
   this->sdf.reset();
 }
 
 //////////////////////////////////////////////////
 void Base::Load(sdf::ElementPtr _sdf)
 {
-  GZ_ASSERT(_sdf != NULL, "_sdf parameter is NULL");
+  if (_sdf)
+    this->sdf = _sdf;
+
+  GZ_ASSERT(this->sdf != NULL, "this->sdf is NULL");
+
+  if (this->sdf->HasAttribute("name"))
+    this->name = this->sdf->Get<std::string>("name");
+  else
+    this->name.clear();
 
-  this->sdf = _sdf;
   if (this->parent)
   {
     this->world = this->parent->GetWorld();
     this->parent->AddChild(shared_from_this());
   }
+
+  this->ComputeScopedName();
 }
 
 //////////////////////////////////////////////////
@@ -97,12 +106,11 @@ void Base::Fini()
 {
   Base_V::iterator iter;
 
-  for (iter = this->children.begin(); iter != this->childrenEnd; ++iter)
+  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
     if (*iter)
       (*iter)->Fini();
 
   this->children.clear();
-  this->childrenEnd = this->children.end();
 
   this->world.reset();
   this->parent.reset();
@@ -117,7 +125,7 @@ void Base::Reset()
 void Base::Reset(Base::EntityType _resetType)
 {
   Base_V::iterator iter;
-  for (iter = this->children.begin(); iter != this->childrenEnd; ++iter)
+  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
   {
     if ((*iter)->HasType(_resetType))
       (*iter)->Reset();
@@ -132,21 +140,18 @@ void Base::SetName(const std::string &_name)
   GZ_ASSERT(this->sdf != NULL, "Base sdf member is NULL");
   GZ_ASSERT(this->sdf->GetAttribute("name"), "Base sdf missing name attribute");
   this->sdf->GetAttribute("name")->Set(_name);
+  this->name = _name;
+  this->ComputeScopedName();
 }
 
 //////////////////////////////////////////////////
 std::string Base::GetName() const
 {
-  GZ_ASSERT(this->sdf != NULL, "Base sdf member is NULL");
-
-  if (this->sdf->HasAttribute("name"))
-    return this->sdf->GetValueString("name");
-  else
-    return std::string();
+  return this->name;
 }
 
 //////////////////////////////////////////////////
-unsigned int Base::GetId() const
+uint32_t Base::GetId() const
 {
   return this->id;
 }
@@ -189,14 +194,13 @@ void Base::AddChild(BasePtr _child)
 
   // Add this _child to our list
   this->children.push_back(_child);
-  this->childrenEnd = this->children.end();
 }
 
 //////////////////////////////////////////////////
 void Base::RemoveChild(unsigned int _id)
 {
   Base_V::iterator iter;
-  for (iter = this->children.begin(); iter != this->childrenEnd; ++iter)
+  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
   {
     if ((*iter)->GetId() == _id)
     {
@@ -205,7 +209,6 @@ void Base::RemoveChild(unsigned int _id)
       break;
     }
   }
-  this->childrenEnd = this->children.end();
 }
 
 //////////////////////////////////////////////////
@@ -241,7 +244,7 @@ void Base::RemoveChild(const std::string &_name)
 {
   Base_V::iterator iter;
 
-  for (iter = this->children.begin(); iter != this->childrenEnd; ++iter)
+  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
   {
     if ((*iter)->GetScopedName() == _name)
       break;
@@ -252,15 +255,12 @@ void Base::RemoveChild(const std::string &_name)
     (*iter)->Fini();
     this->children.erase(iter);
   }
-
-  this->childrenEnd = this->children.end();
 }
 
 //////////////////////////////////////////////////
 void Base::RemoveChildren()
 {
   this->children.clear();
-  this->childrenEnd = this->children.end();
 }
 
 //////////////////////////////////////////////////
@@ -289,10 +289,9 @@ BasePtr Base::GetByName(const std::string &_name)
 
   BasePtr result;
   Base_V::const_iterator iter;
-  Base_V::const_iterator iterEnd = this->childrenEnd;
 
-  for (iter =  this->children.begin();
-      iter != iterEnd && result == NULL; ++iter)
+  for (iter = this->children.begin();
+      iter != this->children.end() && result == NULL; ++iter)
     result = (*iter)->GetByName(_name);
 
   return result;
@@ -301,20 +300,23 @@ BasePtr Base::GetByName(const std::string &_name)
 //////////////////////////////////////////////////
 std::string Base::GetScopedName() const
 {
+  return this->scopedName;
+}
+
+//////////////////////////////////////////////////
+void Base::ComputeScopedName()
+{
   BasePtr p = this->parent;
-  std::string scopedName = this->GetName();
+  this->scopedName = this->GetName();
 
   while (p)
   {
     if (p->GetParent())
-      scopedName.insert(0, p->GetName()+"::");
+      this->scopedName.insert(0, p->GetName()+"::");
     p = p->GetParent();
   }
-
-  return scopedName;
 }
 
-
 //////////////////////////////////////////////////
 bool Base::HasType(const Base::EntityType &_t) const
 {
@@ -333,7 +335,7 @@ void Base::Print(const std::string &_prefix)
   Base_V::iterator iter;
   gzmsg << _prefix << this->GetName() << "\n";
 
-  for (iter = this->children.begin(); iter != this->childrenEnd; ++iter)
+  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
     (*iter)->Print(_prefix + "  ");
 }
 
@@ -343,7 +345,7 @@ bool Base::SetSelected(bool _s)
   this->selected = _s;
 
   Base_V::iterator iter;
-  for (iter = this->children.begin(); iter != this->childrenEnd; ++iter)
+  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
     (*iter)->SetSelected(_s);
 
   return true;
@@ -367,7 +369,7 @@ void Base::SetWorld(const WorldPtr &_newWorld)
   this->world = _newWorld;
 
   Base_V::iterator iter;
-  for (iter = this->children.begin(); iter != this->childrenEnd; ++iter)
+  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
   {
     (*iter)->SetWorld(this->world);
   }
diff --git a/gazebo/physics/Base.hh b/gazebo/physics/Base.hh
index 0cfece1..0596adc 100644
--- a/gazebo/physics/Base.hh
+++ b/gazebo/physics/Base.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,9 +26,11 @@
 #include <boost/enable_shared_from_this.hpp>
 #include <string>
 
-#include "gazebo/sdf/sdf.hh"
+#include <sdf/sdf.hh>
+
 #include "gazebo/common/CommonTypes.hh"
 #include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -68,7 +70,7 @@ namespace gazebo
 
     /// \class Base Base.hh physics/physics.hh
     /// \brief Base class for most physics classes
-    class Base : public boost::enable_shared_from_this<Base>
+    class GAZEBO_VISIBLE Base : public boost::enable_shared_from_this<Base>
     {
       /// \enum EntityType
       /// \brief Unique identifiers for all entity types.
@@ -104,27 +106,32 @@ namespace gazebo
                 SCREW_JOINT     = 0x00000800,
                 /// \brief UniversalJoint type
                 UNIVERSAL_JOINT = 0x00001000,
+                /// \brief GearboxJoint type
+                GEARBOX_JOINT   = 0x00002000,
 
                 /// \brief Shape type
-                SHAPE           = 0x00002000,
+                SHAPE           = 0x00010000,
                 /// \brief BoxShape type
-                BOX_SHAPE       = 0x00004000,
+                BOX_SHAPE       = 0x00020000,
                 /// \brief CylinderShape type
-                CYLINDER_SHAPE  = 0x00008000,
+                CYLINDER_SHAPE  = 0x00040000,
                 /// \brief HeightmapShape type
-                HEIGHTMAP_SHAPE = 0x00010000,
+                HEIGHTMAP_SHAPE = 0x00080000,
                 /// \brief MapShape type
-                MAP_SHAPE       = 0x00020000,
+                MAP_SHAPE       = 0x00100000,
                 /// \brief MultiRayShape type
-                MULTIRAY_SHAPE  = 0x00040000,
+                MULTIRAY_SHAPE  = 0x00200000,
                 /// \brief RayShape type
-                RAY_SHAPE       = 0x00080000,
+                RAY_SHAPE       = 0x00400000,
                 /// \brief PlaneShape type
-                PLANE_SHAPE     = 0x00100000,
+                PLANE_SHAPE     = 0x00800000,
                 /// \brief SphereShape type
-                SPHERE_SHAPE    = 0x00200000,
-                /// \brief TrimeshShape type
-                TRIMESH_SHAPE   = 0x00400000
+                SPHERE_SHAPE    = 0x01000000,
+                /// \brief MeshShape type
+                MESH_SHAPE      = 0x02000000,
+
+                /// \brief Indicates a collision shape used for sensing
+                SENSOR_COLLISION = 0x10000000
               };
 
       /// \brief Constructor
@@ -169,7 +176,7 @@ namespace gazebo
 
       /// \brief Return the ID of this entity. This id is unique.
       /// \return Integer ID.
-      public: unsigned int GetId() const;
+      public: uint32_t GetId() const;
 
       /// \brief Set whether the object should be "saved", when the user
       /// selects to save the world to xml
@@ -287,6 +294,11 @@ namespace gazebo
       /// \return The SDF values for the object.
       public: virtual const sdf::ElementPtr GetSDF();
 
+      /// \brief Compute the scoped name of this object based on its
+      /// parents.
+      /// \sa Base::GetScopedName
+      protected: void ComputeScopedName();
+
       /// \brief The SDF values for this object.
       protected: sdf::ElementPtr sdf;
 
@@ -296,9 +308,6 @@ namespace gazebo
       /// \brief Children of this entity.
       protected: Base_V children;
 
-      /// \brief End of the children vector.
-      protected: Base_V::iterator childrenEnd;
-
       /// \brief Pointer to the world.
       protected: WorldPtr world;
 
@@ -306,10 +315,7 @@ namespace gazebo
       private: bool saveable;
 
       /// \brief This entities ID.
-      private: unsigned int id;
-
-      /// \brief Used to automaticaly chose a unique ID on creation.
-      private: static unsigned int idCounter;
+      private: uint32_t id;
 
       /// \brief The type of this object.
       private: unsigned int type;
@@ -317,6 +323,12 @@ namespace gazebo
       /// \brief True if selected.
       private: bool selected;
 
+      /// \brief Local copy of the sdf name.
+      private: std::string name;
+
+      /// \brief Local copy of the scoped name.
+      private: std::string scopedName;
+
       protected: friend class Entity;
     };
     /// \}
diff --git a/gazebo/physics/BoxShape.cc b/gazebo/physics/BoxShape.cc
index 5e6fc2f..379f629 100644
--- a/gazebo/physics/BoxShape.cc
+++ b/gazebo/physics/BoxShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,13 +15,12 @@
  *
 */
 
-#include "math/Vector3.hh"
-#include "BoxShape.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/physics/BoxShape.hh"
 
 using namespace gazebo;
 using namespace physics;
 
-
 //////////////////////////////////////////////////
 BoxShape::BoxShape(CollisionPtr _parent) : Shape(_parent)
 {
@@ -36,7 +35,7 @@ BoxShape::~BoxShape()
 //////////////////////////////////////////////////
 void BoxShape::Init()
 {
-  this->SetSize(this->sdf->GetValueVector3("size"));
+  this->SetSize(this->sdf->Get<math::Vector3>("size"));
 }
 
 //////////////////////////////////////////////////
@@ -48,7 +47,21 @@ void BoxShape::SetSize(const math::Vector3 &_size)
 //////////////////////////////////////////////////
 math::Vector3 BoxShape::GetSize() const
 {
-  return this->sdf->GetValueVector3("size");
+  return this->sdf->Get<math::Vector3>("size");
+}
+
+//////////////////////////////////////////////////
+void BoxShape::SetScale(const math::Vector3 &_scale)
+{
+  if (_scale.x < 0 || _scale.y < 0 || _scale.z < 0)
+    return;
+
+  if (_scale == this->scale)
+    return;
+
+  this->SetSize((_scale/this->scale)*this->GetSize());
+
+  this->scale = _scale;
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/physics/BoxShape.hh b/gazebo/physics/BoxShape.hh
index a094553..f992bbe 100644
--- a/gazebo/physics/BoxShape.hh
+++ b/gazebo/physics/BoxShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #define _BOXSHAPE_HH_
 
 #include "gazebo/physics/Shape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,7 +34,7 @@ namespace gazebo
 
     /// \class BoxShape BoxShape.hh physics/physcs.hh
     /// \brief Box geometry primitive.
-    class BoxShape : public Shape
+    class GAZEBO_VISIBLE BoxShape : public Shape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent Collision.
@@ -49,6 +50,10 @@ namespace gazebo
       /// \param[in] _size Size of each side of the box.
       public: virtual void SetSize(const math::Vector3 &_size);
 
+      /// \brief Set the scale of the box.
+      /// \param[in] _scale Scale of the box.
+      public: virtual void SetScale(const math::Vector3 &_scale);
+
       /// \brief Get the size of the box.
       /// \return The size of each side of the box.
       public: math::Vector3 GetSize() const;
diff --git a/gazebo/physics/BoxShape_TEST.cc b/gazebo/physics/BoxShape_TEST.cc
new file mode 100644
index 0000000..ec9e4f3
--- /dev/null
+++ b/gazebo/physics/BoxShape_TEST.cc
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/BoxShape.hh"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class BoxShapeTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(BoxShapeTest, Scale)
+{
+  std::ostringstream boxStr;
+  boxStr << "<sdf version ='" << SDF_VERSION << "'>"
+    << "<model name='model'>"
+    << "<link name ='link'>"
+    <<   "<collision name ='collision'>"
+    <<     "<geometry>"
+    <<       "<box>"
+    <<         "<size>1.0 1.0 1.0</size>"
+    <<       "</box>"
+    <<     "</geometry>"
+    <<   "</collision>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  sdf::SDFPtr boxSDF(new sdf::SDF);
+  boxSDF->SetFromString(boxStr.str());
+
+  physics::BoxShapePtr box(new physics::BoxShape(physics::CollisionPtr()));
+  sdf::ElementPtr elem = boxSDF->root;
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("model");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("link");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("collision");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("geometry");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("box");
+  ASSERT_TRUE(elem);
+  box->Load(elem);
+
+  // Test scaling with unit size
+  math::Vector3 size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 1.0);
+  EXPECT_DOUBLE_EQ(size.y, 1.0);
+  EXPECT_DOUBLE_EQ(size.z, 1.0);
+
+  box->SetScale(math::Vector3(1.5, 1.5, 1.5));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 1.5);
+  EXPECT_DOUBLE_EQ(size.y, 1.5);
+  EXPECT_DOUBLE_EQ(size.z, 1.5);
+
+  box->SetScale(math::Vector3(2.0, 2.0, 2.0));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 2.0);
+  EXPECT_DOUBLE_EQ(size.y, 2.0);
+  EXPECT_DOUBLE_EQ(size.z, 2.0);
+
+  // reset scale
+  box->SetScale(math::Vector3(1.0, 1.0, 1.0));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 1.0);
+  EXPECT_DOUBLE_EQ(size.y, 1.0);
+  EXPECT_DOUBLE_EQ(size.z, 1.0);
+
+  // Test scaling with non-unit size
+  box->SetSize(math::Vector3(0.5, 0.5, 0.5));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 0.5);
+  EXPECT_DOUBLE_EQ(size.y, 0.5);
+  EXPECT_DOUBLE_EQ(size.z, 0.5);
+
+  box->SetScale(math::Vector3(2.0, 2.0, 2.0));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 1.0);
+  EXPECT_DOUBLE_EQ(size.y, 1.0);
+  EXPECT_DOUBLE_EQ(size.z, 1.0);
+
+  box->SetScale(math::Vector3(100.0, 100.0, 100.0));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 50.0);
+  EXPECT_DOUBLE_EQ(size.y, 50.0);
+  EXPECT_DOUBLE_EQ(size.z, 50.0);
+
+  box->SetScale(math::Vector3(0.1, 0.1, 0.1));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 0.05);
+  EXPECT_DOUBLE_EQ(size.y, 0.05);
+  EXPECT_DOUBLE_EQ(size.z, 0.05);
+
+  // reset scale
+  box->SetScale(math::Vector3(1.0, 1.0, 1.0));
+  box->SetSize(math::Vector3(1.0, 1.0, 1.0));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 1.0);
+  EXPECT_DOUBLE_EQ(size.y, 1.0);
+  EXPECT_DOUBLE_EQ(size.z, 1.0);
+
+  // Test scaling with different x, y and z components
+  box->SetScale(math::Vector3(0.5, 1.0, 2.5));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 0.5);
+  EXPECT_DOUBLE_EQ(size.y, 1.0);
+  EXPECT_DOUBLE_EQ(size.z, 2.5);
+
+  // Test scaling with negative components
+  // This should fail and size should remain the same as before
+  box->SetScale(math::Vector3(-1.0, -2.0, -3.0));
+  size = box->GetSize();
+  EXPECT_DOUBLE_EQ(size.x, 0.5);
+  EXPECT_DOUBLE_EQ(size.y, 1.0);
+  EXPECT_DOUBLE_EQ(size.z, 2.5);
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/physics/CMakeLists.txt b/gazebo/physics/CMakeLists.txt
index 12950fb..0a1853c 100644
--- a/gazebo/physics/CMakeLists.txt
+++ b/gazebo/physics/CMakeLists.txt
@@ -4,6 +4,17 @@ add_subdirectory(ode)
 if (HAVE_BULLET)
   add_subdirectory(bullet)
 endif()
+if (HAVE_DART)
+  add_subdirectory(dart)
+endif()
+
+if (HAVE_SIMBODY)
+  add_subdirectory(simbody)
+endif()
+
+if (HAVE_GDAL)
+  include_directories(${GDAL_INCLUDE_DIR})
+endif()
 
 set (sources
   Actor.cc
@@ -27,7 +38,7 @@ set (sources
   Model.cc
   ModelState.cc
   MultiRayShape.cc
-  Physics.cc
+  PhysicsIface.cc
   PhysicsEngine.cc
   PhysicsFactory.cc
   PlaneShape.cc
@@ -37,7 +48,7 @@ set (sources
   SphereShape.cc
   State.cc
   SurfaceParams.cc
-  TrimeshShape.cc
+  MeshShape.cc
   World.cc
   WorldState.cc
 )
@@ -50,11 +61,13 @@ set (headers
   Collision.hh
   CollisionState.hh
   Contact.hh
+  ContactManager.hh
   CylinderShape.hh
   Entity.hh
   HeightmapShape.hh
   Hinge2Joint.hh
   HingeJoint.hh
+  GearboxJoint.hh
   Inertial.hh
   Gripper.hh
   Joint.hh
@@ -67,7 +80,7 @@ set (headers
   Model.hh
   ModelState.hh
   MultiRayShape.hh
-  Physics.hh
+  PhysicsIface.hh
   PhysicsEngine.hh
   PhysicsFactory.hh
   PhysicsTypes.hh
@@ -80,7 +93,7 @@ set (headers
   SphereShape.hh
   State.hh
   SurfaceParams.hh
-  TrimeshShape.hh
+  MeshShape.hh
   UniversalJoint.hh
   World.hh
   WorldState.hh)
@@ -88,7 +101,7 @@ set (headers
 set (physics_headers "" CACHE INTERNAL "physics headers" FORCE)
 foreach (hdr ${headers})
   APPEND_TO_CACHED_STRING(physics_headers
-    "Physics Headers" "#include \"physics/${hdr}\"\n")
+    "Physics Headers" "#include \"gazebo/physics/${hdr}\"\n")
 endforeach()
 configure_file (${CMAKE_CURRENT_SOURCE_DIR}/physics.hh.in
                 ${CMAKE_CURRENT_BINARY_DIR}/physics.hh)
@@ -98,36 +111,35 @@ gz_add_library(gazebo_physics ${sources})
 target_link_libraries(gazebo_physics
   gazebo_common
   gazebo_util
-  gazebo_sdf_interface
   gazebo_physics_ode
-  ${TBB_LIBRARIES}
-  ${libtool_library}
-  ${Boost_LIBRARIES}
 )
 
 if (HAVE_BULLET)
   target_link_libraries(gazebo_physics gazebo_physics_bullet)
 endif()
+if (HAVE_DART)
+  target_link_libraries(gazebo_physics gazebo_physics_dart)
+endif()
 
-gz_add_executable(gzphysics server.cc)
-target_link_libraries(gzphysics
-  gazebo_common
-  gazebo_util
-  gazebo_transport
-  gazebo_physics
-  gazebo_sensors
-  gazebo_sdf_interface
-  gazebo_msgs
-  pthread
-  )
+if (HAVE_SIMBODY)
+  target_link_libraries(gazebo_physics gazebo_physics_simbody)
+endif()
+
+if (HAVE_GDAL)
+  target_link_libraries(gazebo_physics ${GDAL_LIBRARY})
+endif()
 
-gz_install_executable( gzphysics )
 gz_install_library(gazebo_physics)
 gz_install_includes("physics" ${headers} ${CMAKE_CURRENT_BINARY_DIR}/physics.hh)
 
 # unit tests
 set (gtest_sources
-  PhysicsEngine_TEST.cc
+  BoxShape_TEST.cc
+  ContactManager_TEST.cc
+  CylinderShape_TEST.cc
   Inertial_TEST.cc
-  Joint_TEST.cc)
+  JointController_TEST.cc
+  PhysicsEngine_TEST.cc
+  SphereShape_TEST.cc
+)
 gz_build_tests(${gtest_sources})
diff --git a/gazebo/physics/Collision.cc b/gazebo/physics/Collision.cc
index c575883..66bcccf 100644
--- a/gazebo/physics/Collision.cc
+++ b/gazebo/physics/Collision.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,47 +14,49 @@
  * limitations under the License.
  *
 */
-/* Desc: Collision class
- * Author: Nate Koenig
- * Date: 13 Feb 2006
- */
 
 #include <sstream>
 
-#include "msgs/msgs.hh"
-#include "msgs/MessageTypes.hh"
-
-#include "common/Events.hh"
-#include "common/Console.hh"
-
-#include "transport/Publisher.hh"
-
-#include "physics/Contact.hh"
-#include "physics/Shape.hh"
-#include "physics/BoxShape.hh"
-#include "physics/CylinderShape.hh"
-#include "physics/TrimeshShape.hh"
-#include "physics/SphereShape.hh"
-#include "physics/HeightmapShape.hh"
-#include "physics/SurfaceParams.hh"
-#include "physics/Model.hh"
-#include "physics/Link.hh"
-#include "physics/Collision.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/msgs/MessageTypes.hh"
+
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/transport/TransportIface.hh"
+
+#include "gazebo/transport/Publisher.hh"
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/ContactManager.hh"
+#include "gazebo/physics/PhysicsIface.hh"
+#include "gazebo/physics/Contact.hh"
+#include "gazebo/physics/Shape.hh"
+#include "gazebo/physics/BoxShape.hh"
+#include "gazebo/physics/CylinderShape.hh"
+#include "gazebo/physics/MeshShape.hh"
+#include "gazebo/physics/SphereShape.hh"
+#include "gazebo/physics/HeightmapShape.hh"
+#include "gazebo/physics/SurfaceParams.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/Collision.hh"
 
 using namespace gazebo;
 using namespace physics;
 
 //////////////////////////////////////////////////
 Collision::Collision(LinkPtr _link)
-    : Entity(_link)
+    : Entity(_link), maxContacts(1)
 {
   this->AddType(Base::COLLISION);
 
   this->link = _link;
 
-  this->contactsEnabled = false;
+  this->placeable = false;
+
+  sdf::initFile("collision.sdf", this->sdf);
 
-  this->surface.reset(new SurfaceParams());
+  this->collisionVisualId = physics::getUniqueId();
 }
 
 //////////////////////////////////////////////////
@@ -83,7 +85,13 @@ void Collision::Load(sdf::ElementPtr _sdf)
 {
   Entity::Load(_sdf);
 
-  this->SetRelativePose(this->sdf->GetValuePose("pose"));
+  this->maxContacts = _sdf->Get<unsigned int>("max_contacts");
+  this->SetMaxContacts(this->maxContacts);
+
+  if (this->sdf->HasElement("laser_retro"))
+    this->SetLaserRetro(this->sdf->Get<double>("laser_retro"));
+
+  this->SetRelativePose(this->sdf->Get<math::Pose>("pose"));
 
   this->surface->Load(this->sdf->GetElement("surface"));
 
@@ -97,13 +105,6 @@ void Collision::Load(sdf::ElementPtr _sdf)
   {
     this->visPub->Publish(this->CreateCollisionVisual());
   }
-
-  // Force max correcting velocity to zero for certain collision entities
-  if (this->IsStatic() || this->shape->HasType(Base::HEIGHTMAP_SHAPE) ||
-      this->shape->HasType(Base::MAP_SHAPE))
-  {
-    this->surface->maxVel = 0.0;
-  }
 }
 
 //////////////////////////////////////////////////
@@ -112,7 +113,7 @@ void Collision::Init()
   this->shape->Init();
 
   this->SetRelativePose(
-    this->sdf->GetValuePose("pose"));
+    this->sdf->Get<math::Pose>("pose"));
 }
 
 //////////////////////////////////////////////////
@@ -184,26 +185,25 @@ ShapePtr Collision::GetShape() const
 }
 
 //////////////////////////////////////////////////
-void Collision::SetContactsEnabled(bool _enable)
+void Collision::SetScale(const math::Vector3 &_scale)
 {
-  this->contactsEnabled = _enable;
+  this->shape->SetScale(_scale);
 }
 
 //////////////////////////////////////////////////
-bool Collision::GetContactsEnabled() const
+void Collision::SetContactsEnabled(bool /*_enable*/)
 {
-  return this->contact.ConnectionCount() > 0 || this->contactsEnabled;
 }
 
 //////////////////////////////////////////////////
-void Collision::AddContact(const Contact &_contact)
+bool Collision::GetContactsEnabled() const
 {
-  if (!this->GetContactsEnabled() ||
-      this->HasType(Base::RAY_SHAPE) ||
-      this->HasType(Base::PLANE_SHAPE))
-    return;
+  return false;
+}
 
-  this->contact(this->GetScopedName(), _contact);
+//////////////////////////////////////////////////
+void Collision::AddContact(const Contact & /*_contact*/)
+{
 }
 
 //////////////////////////////////////////////////
@@ -296,8 +296,12 @@ void Collision::FillMsg(msgs::Collision &_msg)
   this->surface->FillMsg(*_msg.mutable_surface());
 
   msgs::Set(this->visualMsg->mutable_pose(), this->GetRelativePose());
-  _msg.add_visual()->CopyFrom(*this->visualMsg);
-  _msg.add_visual()->CopyFrom(this->CreateCollisionVisual());
+
+  if (!this->HasType(physics::Base::SENSOR_COLLISION))
+  {
+    _msg.add_visual()->CopyFrom(*this->visualMsg);
+    _msg.add_visual()->CopyFrom(this->CreateCollisionVisual());
+  }
 }
 
 //////////////////////////////////////////////////
@@ -337,7 +341,11 @@ msgs::Visual Collision::CreateCollisionVisual()
 {
   msgs::Visual msg;
   msg.set_name(this->GetScopedName()+"__COLLISION_VISUAL__");
+
+  // Put in a unique ID because this is a special visual.
+  msg.set_id(this->collisionVisualId);
   msg.set_parent_name(this->parent->GetScopedName());
+  msg.set_parent_id(this->parent->GetId());
   msg.set_is_static(this->IsStatic());
   msg.set_cast_shadows(false);
   msgs::Set(msg.mutable_pose(), this->GetRelativePose());
@@ -362,3 +370,16 @@ void Collision::SetState(const CollisionState &_state)
 {
   this->SetRelativePose(_state.GetPose());
 }
+
+/////////////////////////////////////////////////
+void Collision::SetMaxContacts(unsigned int _maxContacts)
+{
+  this->maxContacts = _maxContacts;
+  this->sdf->GetElement("max_contacts")->GetValue()->Set(_maxContacts);
+}
+
+/////////////////////////////////////////////////
+unsigned int Collision::GetMaxContacts()
+{
+  return this->maxContacts;
+}
diff --git a/gazebo/physics/Collision.hh b/gazebo/physics/Collision.hh
index ba5acd8..463c39f 100644
--- a/gazebo/physics/Collision.hh
+++ b/gazebo/physics/Collision.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,12 +25,13 @@
 #include <string>
 #include <vector>
 
-#include "common/Event.hh"
-#include "common/CommonTypes.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/common/CommonTypes.hh"
 
-#include "physics/PhysicsTypes.hh"
-#include "physics/CollisionState.hh"
-#include "physics/Entity.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/CollisionState.hh"
+#include "gazebo/physics/Entity.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -40,7 +41,7 @@ namespace gazebo
     /// \{
 
     /// \brief Base class for all collision entities
-    class Collision : public Entity
+    class GAZEBO_VISIBLE Collision : public Entity
     {
       /// \brief Constructor.
       /// \param[in] _link Link that contains this collision object.
@@ -113,18 +114,25 @@ namespace gazebo
       /// \return The collision shape.
       public: ShapePtr GetShape() const;
 
+      /// \brief Set the scale of the collision.
+      /// \param[in] _scale Scale to set the collision to.
+      public: void SetScale(const math::Vector3 &_scale);
+
       /// \brief Turn contact recording on or off.
+      /// Deprecated by?
       /// \param[in] _enable True to enable collision contacts.
-      public: void SetContactsEnabled(bool _enable);
+      public: void SetContactsEnabled(bool _enable) GAZEBO_DEPRECATED(2.0);
 
       /// \brief Return true of contacts are on.
+      /// Deprecated by?
       /// \return True of contact are on.
-      public: bool GetContactsEnabled() const;
+      public: bool GetContactsEnabled() const GAZEBO_DEPRECATED(2.0);
 
       /// \brief Add an occurance of a contact to this collision.
+      /// Deprecated by?
       /// \param[in] _contact The contact which was detected by a collision
       /// engine.
-      public: void AddContact(const Contact &_contact);
+      public: void AddContact(const Contact &_contact) GAZEBO_DEPRECATED(2.0);
 
       /// \brief Get the linear velocity of the collision.
       /// \return The linear velocity relative to the parent model.
@@ -169,15 +177,6 @@ namespace gazebo
       /// \param[in] The collision state.
       public: void SetState(const CollisionState &_state);
 
-      /// Deprecated.
-      public: template<typename T>
-              event::ConnectionPtr ConnectContact(T _subscriber)
-              {return contact.Connect(_subscriber);}
-
-      /// Deprecated.
-      public: void DisconnectContact(event::ConnectionPtr &_conn)
-              {contact.Disconnect(_conn);}
-
       /// \brief Fill a collision message.
       /// \param[out] _msg The message to fill with this collision's data.
       public: void FillMsg(msgs::Collision &_msg);
@@ -191,6 +190,16 @@ namespace gazebo
       public: inline SurfaceParamsPtr GetSurface() const
               {return this->surface;}
 
+      /// \brief Number of contacts allowed for this collision.
+      /// This overrides global value (in PhysicsEngine) if specified.
+      /// \param[in] _maxContacts max num contacts allowed for this collision.
+      public: virtual void SetMaxContacts(unsigned int _maxContacts);
+
+      /// \brief returns number of contacts allowed for this collision.
+      /// This overrides global value (in PhysicsEngine) if specified.
+      /// \return max num contacts allowed for this collision.
+      public: virtual unsigned int GetMaxContacts();
+
       /// \brief Helper function used to create a collision visual message.
       /// \return Visual message for a collision.
       private: msgs::Visual CreateCollisionVisual();
@@ -204,20 +213,20 @@ namespace gazebo
       /// \brief Pointer to physics::Shape.
       protected: ShapePtr shape;
 
-      /// \brief True if contacts are enabled.
-      private: bool contactsEnabled;
-
-      /// \brief The contact event.
-      private: event::EventT<void (const std::string &,
-                                   const Contact &)> contact;
-
       /// \brief The surface parameters.
-      private: SurfaceParamsPtr surface;
+      protected: SurfaceParamsPtr surface;
 
       /// \brief The laser retro value.
       private: float laserRetro;
 
+      /// \brief Stores collision state information.
       private: CollisionState state;
+
+      /// \brief Number of contact points allowed for this collision.
+      private: unsigned int maxContacts;
+
+      /// \brief Unique id for collision visual.
+      private: uint32_t collisionVisualId;
     };
     /// \}
   }
diff --git a/gazebo/physics/CollisionState.cc b/gazebo/physics/CollisionState.cc
index b8a2999..eccc4ab 100644
--- a/gazebo/physics/CollisionState.cc
+++ b/gazebo/physics/CollisionState.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License")
  * you may not use this file except in compliance with the License.
@@ -53,11 +53,11 @@ CollisionState::~CollisionState()
 void CollisionState::Load(const sdf::ElementPtr _elem)
 {
   // Set the name
-  this->name = _elem->GetValueString("name");
+  this->name = _elem->Get<std::string>("name");
 
   // Set the pose
   if (_elem->HasElement("pose"))
-    this->pose = _elem->GetValuePose("pose");
+    this->pose = _elem->Get<math::Pose>("pose");
   else
     this->pose.Set(0, 0, 0, 0, 0, 0);
 }
diff --git a/gazebo/physics/CollisionState.hh b/gazebo/physics/CollisionState.hh
index 6069c45..486af3d 100644
--- a/gazebo/physics/CollisionState.hh
+++ b/gazebo/physics/CollisionState.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 
 #include "gazebo/physics/State.hh"
 #include "gazebo/math/Pose.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -38,7 +39,7 @@ namespace gazebo
     /// specific time during a simulation run.
     ///
     /// State of a Collision is its Pose.
-    class CollisionState : public State
+    class GAZEBO_VISIBLE CollisionState : public State
     {
       /// \brief Default constructor
       public: CollisionState();
@@ -96,12 +97,12 @@ namespace gazebo
       /// \param[in] _out output stream
       /// \param[in] _state Collision state to output
       /// \return the stream
-      public: friend std::ostream &operator<<(std::ostream &_out,
-                                 const gazebo::physics::CollisionState &_state)
+      public: inline friend std::ostream &operator<<(std::ostream &_out,
+                  const gazebo::physics::CollisionState &_state)
       {
-        _out << "      <collision name='" << _state.name << "'>\n"
-             << "        <pose>" << _state.pose << "</pose>\n";
-        _out << "      </collision>\n";
+        _out << "<collision name='" << _state.name << "'>"
+             << "<pose>" << _state.pose << "</pose>";
+        _out << "</collision>";
 
         return _out;
       }
diff --git a/gazebo/physics/Contact.cc b/gazebo/physics/Contact.cc
index 85f64a1..6d41861 100644
--- a/gazebo/physics/Contact.cc
+++ b/gazebo/physics/Contact.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -50,8 +50,6 @@ Contact &Contact::operator =(const Contact &_contact)
   this->world = _contact.world;
   this->collision1 = _contact.collision1;
   this->collision2 = _contact.collision2;
-  this->collisionPtr1 = _contact.collisionPtr1;
-  this->collisionPtr2 = _contact.collisionPtr2;
 
   this->count = _contact.count;
   for (int i = 0; i < MAX_CONTACT_JOINTS; i++)
@@ -73,15 +71,13 @@ Contact &Contact::operator =(const msgs::Contact &_contact)
   this->count = 0;
 
   this->world = physics::get_world(_contact.world());
-  this->collision1 = _contact.collision1();
-  this->collision2 = _contact.collision2();
 
   if (world)
   {
-    this->collisionPtr1 = boost::dynamic_pointer_cast<Collision>(
-        this->world->GetEntity(this->collision1)).get();
-    this->collisionPtr2 = boost::dynamic_pointer_cast<Collision>(
-      this->world->GetEntity(this->collision2)).get();
+    this->collision1 = boost::dynamic_pointer_cast<Collision>(
+        this->world->GetEntity(_contact.collision1())).get();
+    this->collision2 = boost::dynamic_pointer_cast<Collision>(
+      this->world->GetEntity(_contact.collision2())).get();
   }
   else
   {
@@ -98,16 +94,16 @@ Contact &Contact::operator =(const msgs::Contact &_contact)
     this->depths[j] = _contact.depth(j);
 
     this->wrench[j].body1Force =
-      msgs::Convert(_contact.wrench(j).body_1_force());
+      msgs::Convert(_contact.wrench(j).body_1_wrench().force());
 
     this->wrench[j].body2Force =
-      msgs::Convert(_contact.wrench(j).body_2_force());
+      msgs::Convert(_contact.wrench(j).body_2_wrench().force());
 
     this->wrench[j].body1Torque =
-      msgs::Convert(_contact.wrench(j).body_1_torque());
+      msgs::Convert(_contact.wrench(j).body_1_wrench().torque());
 
     this->wrench[j].body2Torque =
-      msgs::Convert(_contact.wrench(j).body_2_torque());
+      msgs::Convert(_contact.wrench(j).body_2_wrench().torque());
 
     this->count++;
   }
@@ -129,8 +125,8 @@ std::string Contact::DebugString() const
   std::ostringstream stream;
 
   stream << "World [" << this->world->GetName() << "]\n"
-         << "Collision 1[" << this->collision1 << "]\n"
-         << "Collision 2[" << this->collision2 << "]\n"
+         << "Collision 1[" << this->collision1->GetScopedName() << "]\n"
+         << "Collision 2[" << this->collision2->GetScopedName() << "]\n"
          << "Time[" << this->time << "]\n"
          << "Contact Count[" << this->count << "]\n";
 
@@ -153,8 +149,8 @@ std::string Contact::DebugString() const
 void Contact::FillMsg(msgs::Contact &_msg) const
 {
   _msg.set_world(this->world->GetName());
-  _msg.set_collision1(this->collision1);
-  _msg.set_collision2(this->collision2);
+  _msg.set_collision1(this->collision1->GetScopedName());
+  _msg.set_collision2(this->collision2->GetScopedName());
   msgs::Set(_msg.mutable_time(), this->time);
 
   for (int j = 0; j < this->count; ++j)
@@ -165,11 +161,17 @@ void Contact::FillMsg(msgs::Contact &_msg) const
     msgs::Set(_msg.add_normal(), this->normals[j]);
 
     msgs::JointWrench *jntWrench = _msg.add_wrench();
-    jntWrench->set_body_1_name(this->collision1);
-    jntWrench->set_body_2_name(this->collision2);
-    msgs::Set(jntWrench->mutable_body_1_force(), this->wrench[j].body1Force);
-    msgs::Set(jntWrench->mutable_body_2_force(), this->wrench[j].body2Force);
-    msgs::Set(jntWrench->mutable_body_1_torque(), this->wrench[j].body1Torque);
-    msgs::Set(jntWrench->mutable_body_2_torque(), this->wrench[j].body2Torque);
+    jntWrench->set_body_1_name(this->collision1->GetScopedName());
+    jntWrench->set_body_1_id(this->collision1->GetId());
+    jntWrench->set_body_2_name(this->collision2->GetScopedName());
+    jntWrench->set_body_2_id(this->collision2->GetId());
+
+    msgs::Wrench *wrenchMsg =  jntWrench->mutable_body_1_wrench();
+    msgs::Set(wrenchMsg->mutable_force(), this->wrench[j].body1Force);
+    msgs::Set(wrenchMsg->mutable_torque(), this->wrench[j].body1Torque);
+
+    wrenchMsg =  jntWrench->mutable_body_2_wrench();
+    msgs::Set(wrenchMsg->mutable_force(), this->wrench[j].body2Force);
+    msgs::Set(wrenchMsg->mutable_torque(), this->wrench[j].body2Torque);
   }
 }
diff --git a/gazebo/physics/Contact.hh b/gazebo/physics/Contact.hh
index 817db81..401f44b 100644
--- a/gazebo/physics/Contact.hh
+++ b/gazebo/physics/Contact.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@
 #include "gazebo/common/Time.hh"
 #include "gazebo/math/Vector3.hh"
 #include "gazebo/physics/JointWrench.hh"
+#include "gazebo/util/system.hh"
 
 // For the sake of efficiency, use fixed size arrays for collision
 // MAX_COLLIDE_RETURNS limits contact detection, needs to be large
@@ -50,7 +51,7 @@ namespace gazebo
     /// \class Contact Contact.hh physics/physics.hh
     /// \brief A contact between two collisions. Each contact can consist of
     /// a number of contact points
-    class Contact
+    class GAZEBO_VISIBLE Contact
     {
       /// \brief Constructor.
       public: Contact();
@@ -83,17 +84,11 @@ namespace gazebo
       /// \brief Reset to default values.
       public: void Reset();
 
-      /// \brief Name of the first collision object
-      public: std::string collision1;
-
-      /// \brief Name of the second collision object
-      public: std::string collision2;
-
       /// \brief Pointer to the first collision object
-      public: Collision *collisionPtr1;
+      public: Collision *collision1;
 
       /// \brief Pointer to the second collision object
-      public: Collision *collisionPtr2;
+      public: Collision *collision2;
 
       /// \brief Array of forces for the contact.
       /// All forces and torques are relative to the center of mass of the
diff --git a/gazebo/physics/ContactManager.cc b/gazebo/physics/ContactManager.cc
index d96016c..66a5813 100644
--- a/gazebo/physics/ContactManager.cc
+++ b/gazebo/physics/ContactManager.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
 
 #include "gazebo/transport/Node.hh"
 #include "gazebo/transport/Publisher.hh"
+#include "gazebo/transport/TransportIface.hh"
 
 #include "gazebo/common/Time.hh"
 
@@ -32,6 +33,7 @@ using namespace physics;
 ContactManager::ContactManager()
 {
   this->contactIndex = 0;
+  this->customMutex = new boost::recursive_mutex();
 }
 
 /////////////////////////////////////////////////
@@ -40,6 +42,23 @@ ContactManager::~ContactManager()
   this->Clear();
   this->node.reset();
   this->contactPub.reset();
+
+  boost::unordered_map<std::string, ContactPublisher *>::iterator iter;
+  for (iter = this->customContactPublishers.begin();
+      iter != this->customContactPublishers.end(); ++iter)
+  {
+    if (iter->second)
+    {
+      iter->second->collisions.clear();
+      iter->second->collisionNames.clear();
+      iter->second->publisher.reset();
+      delete iter->second;
+      iter->second = NULL;
+    }
+  }
+  this->customContactPublishers.clear();
+  delete this->customMutex;
+  this->customMutex = NULL;
 }
 
 /////////////////////////////////////////////////
@@ -51,7 +70,7 @@ void ContactManager::Init(WorldPtr _world)
   this->node->Init(this->world->GetName());
 
   this->contactPub =
-    this->node->Advertise<msgs::Contacts>("~/physics/contacts");
+    this->node->Advertise<msgs::Contacts>("~/physics/contacts", 50);
 }
 
 /////////////////////////////////////////////////
@@ -64,27 +83,72 @@ Contact *ContactManager::NewContact(Collision *_collision1,
   if (!_collision1 || !_collision2)
     return result;
 
-  // If no one is listening, then don't create any contact information.
+  // If no one is listening to the default topic, or there are no
+  // custom contact publishers then don't create any contact information.
   // This is a signal to the Physics engine that it can skip the extra
   // processing necessary to get back contact information.
-  if (!this->contactPub->HasConnections())
-    return result;
 
-  // Get or create a contact feedback object.
-  if (this->contactIndex < this->contacts.size())
-    result = this->contacts[this->contactIndex++];
-  else
+  std::vector<ContactPublisher *> publishers;
+  {
+    boost::recursive_mutex::scoped_lock lock(*this->customMutex);
+    boost::unordered_map<std::string, ContactPublisher *>::iterator iter;
+    for (iter = this->customContactPublishers.begin();
+        iter != this->customContactPublishers.end(); ++iter)
+    {
+      // A model can simply be loaded later, so convert ones that are not yet
+      // found
+      if (!iter->second->collisionNames.empty())
+      {
+        std::vector<std::string>::iterator it;
+        for (it = iter->second->collisionNames.begin();
+            it != iter->second->collisionNames.end();)
+        {
+          Collision *col = boost::dynamic_pointer_cast<Collision>(
+              this->world->GetByName(*it)).get();
+          if (!col)
+          {
+            ++it;
+            continue;
+          }
+          else
+            it = iter->second->collisionNames.erase(it);
+          iter->second->collisions.insert(col);
+        }
+      }
+
+      if (iter->second->collisions.find(_collision1) !=
+          iter->second->collisions.end() ||
+          iter->second->collisions.find(_collision2) !=
+          iter->second->collisions.end())
+      {
+        publishers.push_back(iter->second);
+      }
+    }
+  }
+
+  if (this->contactPub->HasConnections() || !publishers.empty())
   {
-    result = new Contact();
-    this->contacts.push_back(result);
-    this->contactIndex = this->contacts.size();
+    // Get or create a contact feedback object.
+    if (this->contactIndex < this->contacts.size())
+      result = this->contacts[this->contactIndex++];
+    else
+    {
+      result = new Contact();
+      this->contacts.push_back(result);
+      this->contactIndex = this->contacts.size();
+    }
+    for (unsigned int i = 0; i < publishers.size(); ++i)
+    {
+      publishers[i]->contacts.push_back(result);
+    }
   }
 
+  if (!result)
+    return result;
+
   result->count = 0;
-  result->collision1 = _collision1->GetScopedName();
-  result->collision2 = _collision2->GetScopedName();
-  result->collisionPtr1 = _collision1;
-  result->collisionPtr2 = _collision2;
+  result->collision1 = _collision1;
+  result->collision2 = _collision2;
   result->time = _time;
   result->world = this->world;
 
@@ -122,10 +186,16 @@ void ContactManager::ResetCount()
 void ContactManager::Clear()
 {
   // Delete all the contacts.
-  for (unsigned int i = 0; i < this->contacts.size(); i++)
+  for (unsigned int i = 0; i < this->contacts.size(); ++i)
     delete this->contacts[i];
+
   this->contacts.clear();
 
+  boost::unordered_map<std::string, ContactPublisher *>::iterator iter;
+  for (iter = this->customContactPublishers.begin();
+      iter != this->customContactPublishers.end(); ++iter)
+    iter->second->contacts.clear();
+
   // Reset the contact count to zero.
   this->contactIndex = 0;
 }
@@ -143,17 +213,166 @@ void ContactManager::PublishContacts()
     return;
   }
 
-  msgs::Contacts msg;
+  // publish to default topic, ~/physics/contacts
+  if (!transport::getMinimalComms())
+  {
+    msgs::Contacts msg;
+    for (unsigned int i = 0; i < this->contactIndex; ++i)
+    {
+      if (this->contacts[i]->count == 0)
+        continue;
+
+      msgs::Contact *contactMsg = msg.add_contact();
+      this->contacts[i]->FillMsg(*contactMsg);
+    }
+
+    msgs::Set(msg.mutable_time(), this->world->GetSimTime());
+    this->contactPub->Publish(msg);
+  }
+
+  // publish to other custom topics
+  boost::recursive_mutex::scoped_lock lock(*this->customMutex);
+  boost::unordered_map<std::string, ContactPublisher *>::iterator iter;
+  for (iter = this->customContactPublishers.begin();
+      iter != this->customContactPublishers.end(); ++iter)
+  {
+    ContactPublisher *contactPublisher = iter->second;
+    msgs::Contacts msg2;
+    for (unsigned int j = 0;
+        j < contactPublisher->contacts.size(); ++j)
+    {
+      if (contactPublisher->contacts[j]->count == 0)
+        continue;
+
+      msgs::Contact *contactMsg = msg2.add_contact();
+      contactPublisher->contacts[j]->FillMsg(*contactMsg);
+    }
+    msgs::Set(msg2.mutable_time(), this->world->GetSimTime());
+    contactPublisher->publisher->Publish(msg2);
+    contactPublisher->contacts.clear();
+  }
+}
+
+/////////////////////////////////////////////////
+std::string ContactManager::CreateFilter(const std::string &_name,
+    const std::string &_collision)
+{
+  std::vector<std::string> collisions;
+  collisions.push_back(_collision);
+  return this->CreateFilter(_name, collisions);
+}
+
+/////////////////////////////////////////////////
+std::string ContactManager::CreateFilter(const std::string &_name,
+    const std::map<std::string, physics::CollisionPtr> &_collisions)
+{
+  std::string name = _name;
+  boost::replace_all(name, "::", "/");
+
+  if (this->customContactPublishers.find(name) !=
+    this->customContactPublishers.end())
+  {
+    gzerr << "Filter with the same name already exists! Aborting" << std::endl;
+    return "";
+  }
+
+  // Contact sensors make use of this filter
+  std::string topic = "~/" + name + "/contacts";
 
-  for (unsigned int i = 0; i < this->contactIndex; ++i)
+  transport::PublisherPtr pub =
+    this->node->Advertise<msgs::Contacts>(topic);
+
+  ContactPublisher *contactPublisher = new ContactPublisher;
+  contactPublisher->publisher = pub;
+
+  std::map<std::string, physics::CollisionPtr>::const_iterator iter;
+  for (iter = _collisions.begin(); iter != _collisions.end(); ++iter)
   {
-    if (this->contacts[i]->count == 0)
-      continue;
+    Collision *col = iter->second.get();
+    if (col)
+      contactPublisher->collisions.insert(col);
+  }
 
-    msgs::Contact *contactMsg = msg.add_contact();
-    this->contacts[i]->FillMsg(*contactMsg);
+  {
+    boost::recursive_mutex::scoped_lock lock(*this->customMutex);
+    this->customContactPublishers[name] = contactPublisher;
   }
 
-  msgs::Set(msg.mutable_time(), this->world->GetSimTime());
-  this->contactPub->Publish(msg);
+  return topic;
+}
+
+/////////////////////////////////////////////////
+std::string ContactManager::CreateFilter(const std::string &_name,
+    const std::vector<std::string> &_collisions)
+{
+  if (_collisions.empty())
+    return "";
+
+  std::map<std::string, physics::CollisionPtr> collisionMap;
+
+  // some collisions may not be loaded yet, so store their names in
+  // collisionNames and try to find them later.
+  std::vector<std::string> collisionNames;
+  for (unsigned int i = 0; i < _collisions.size(); ++i)
+  {
+    CollisionPtr colPtr = boost::dynamic_pointer_cast<Collision>(
+       this->world->GetByName(_collisions[i]));
+    if (colPtr)
+    {
+      collisionMap[_collisions[i]] = colPtr;
+    }
+    else
+    {
+      collisionNames.push_back(_collisions[i]);
+    }
+  }
+
+  std::string topic  = this->CreateFilter(_name, collisionMap);
+
+  // The filter should be created in the last call.
+  std::string name = _name;
+  boost::replace_all(name, "::", "/");
+
+  {
+    boost::recursive_mutex::scoped_lock lock(*this->customMutex);
+    GZ_ASSERT(this->customContactPublishers.count(name) > 0,
+        "Failed to create a custom filter");
+
+    // Let it know about collisions not yet found.
+    this->customContactPublishers[name]->collisionNames = collisionNames;
+  }
+
+  return topic;
+}
+
+/////////////////////////////////////////////////
+void ContactManager::RemoveFilter(const std::string &_name)
+{
+  boost::recursive_mutex::scoped_lock lock(*this->customMutex);
+  boost::unordered_map<std::string, ContactPublisher *>::iterator iter
+      = this->customContactPublishers.find(_name);
+  if (iter != customContactPublishers.end())
+  {
+    ContactPublisher *contactPublisher = iter->second;
+    contactPublisher->contacts.clear();
+    contactPublisher->collisionNames.clear();
+    contactPublisher->collisions.clear();
+    contactPublisher->publisher.reset();
+    this->customContactPublishers.erase(iter);
+  }
+}
+
+/////////////////////////////////////////////////
+unsigned int ContactManager::GetFilterCount()
+{
+  boost::recursive_mutex::scoped_lock lock(*this->customMutex);
+  return this->customContactPublishers.size();
+}
+
+/////////////////////////////////////////////////
+bool ContactManager::HasFilter(const std::string &_name)
+{
+  boost::recursive_mutex::scoped_lock lock(*this->customMutex);
+  return this->customContactPublishers.find(_name) !=
+      this->customContactPublishers.end();
 }
diff --git a/gazebo/physics/ContactManager.hh b/gazebo/physics/ContactManager.hh
index 005dfcc..41a8c61 100644
--- a/gazebo/physics/ContactManager.hh
+++ b/gazebo/physics/ContactManager.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,23 +19,50 @@
 #define _CONTACTMANAGER_HH_
 
 #include <vector>
+#include <string>
+#include <map>
+
+#include <boost/unordered/unordered_set.hpp>
+#include <boost/unordered/unordered_map.hpp>
+#include <boost/thread/recursive_mutex.hpp>
 
 #include "gazebo/transport/TransportTypes.hh"
 
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/physics/Contact.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
+    /// \brief A custom contact publisher created for each contact filter
+    /// in the Contact Manager.
+    class GAZEBO_VISIBLE ContactPublisher
+    {
+      /// \brief Contact message publisher
+      public: transport::PublisherPtr publisher;
+
+      /// \brief Pointers of collisions monitored by contact manager for
+      /// contacts.
+      public: boost::unordered_set<Collision *> collisions;
+
+      /// \internal
+      /// \brief Names of collisions passed in by CreateFilter. Cleared
+      /// once converted to pointers.
+      public: std::vector<std::string> collisionNames;
+
+      /// \brief A list of contacts associated to the collisions.
+      public: std::vector<Contact *> contacts;
+    };
+
     /// \addtogroup gazebo_physics
     /// \{
 
     /// \class ContactManager ContactManager.hh physics/physics.hh
     /// \brief Aggregates all the contact information generated by the
     /// collision detection engine.
-    class ContactManager
+    class GAZEBO_VISIBLE ContactManager
     {
       /// \brief Constructor.
       public: ContactManager();
@@ -80,7 +107,7 @@ namespace gazebo
       /// The return vector may have invalid contacts. Only use contents of
       /// the vector between 0 and ContactManager::GetContactCount
       /// \return Vector of contact pointers.
-      public: const std::vector<Contact*> &GetContacts() const;
+      public: const std::vector<Contact *> &GetContacts() const;
 
       /// \brief Clear all stored contacts.
       public: void Clear();
@@ -91,6 +118,45 @@ namespace gazebo
       /// \brief Set the contact count to zero.
       public: void ResetCount();
 
+      /// \brief Create a filter for contacts. A new publisher will be created
+      /// that publishes contacts associated to the input collisions.
+      /// param[in] _name Filter name.
+      /// param[in] _collisions A list of collision names used for filtering.
+      /// \return New topic where filtered messages will be published to.
+      public: std::string CreateFilter(const std::string &_topic,
+                  const std::vector<std::string> &_collisions);
+
+      /// \brief Create a filter for contacts. A new publisher will be created
+      /// that publishes contacts associated to the input collision.
+      /// param[in] _name Filter name.
+      /// param[in] _collision A collision name used for filtering.
+      /// \return New topic where filtered messages will be published to.
+      public: std::string CreateFilter(const std::string &_topic,
+                  const std::string &_collision);
+
+      /// \brief Create a filter for contacts. A new publisher will be created
+      /// that publishes contacts associated to the input collision.
+      /// param[in] _name Filter name.
+      /// param[in] _collisions A map of collision name to collision
+      /// object.
+      /// \return New topic where filtered messages will be published to.
+      public: std::string CreateFilter(const std::string &_name,
+                  const std::map<std::string, physics::CollisionPtr>
+                  &_collisions);
+
+      /// \brief Remove a contacts filter and the associated custom publisher
+      /// param[in] _name Filter name.
+      public: void RemoveFilter(const std::string &_name);
+
+      /// \brief Get the number of filters in the contact manager.
+      /// return Number of filters
+      public: unsigned int GetFilterCount();
+
+      /// \brief Check if a filter with the specified name exists.
+      /// param[in] _name Name of filter.
+      /// return True if the filter exists.
+      public: bool HasFilter(const std::string &_name);
+
       private: std::vector<Contact*> contacts;
 
       private: unsigned int contactIndex;
@@ -103,6 +169,14 @@ namespace gazebo
 
       /// \brief Pointer to the world.
       private: WorldPtr world;
+
+      /// \brief A list of custom publishers that publish filtered contact
+      /// messages to the specified topic
+      private: boost::unordered_map<std::string, ContactPublisher *>
+          customContactPublishers;
+
+      /// \brief Mutex to protect the list of custom publishers.
+      private: boost::recursive_mutex *customMutex;
     };
     /// \}
   }
diff --git a/gazebo/physics/ContactManager_TEST.cc b/gazebo/physics/ContactManager_TEST.cc
new file mode 100644
index 0000000..ad48aba
--- /dev/null
+++ b/gazebo/physics/ContactManager_TEST.cc
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/ContactManager.hh"
+#include "test/ServerFixture.hh"
+
+using namespace gazebo;
+
+class ContactManagerTest : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+TEST_F(ContactManagerTest, CreateFilter)
+{
+  Load("worlds/empty.world", false);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+
+  physics::ContactManager *manager = physics->GetContactManager();
+  ASSERT_TRUE(physics != NULL);
+
+  EXPECT_EQ(manager->GetFilterCount(), 0u);
+
+  // Verify that no topic is created if passing in an empty collisions
+  std::vector<std::string> collisions;
+  std::string emptyName = "empty";
+  std::string topic  = manager->CreateFilter(emptyName, collisions);
+  EXPECT_EQ(topic, "");
+  EXPECT_TRUE(!manager->HasFilter(emptyName));
+  EXPECT_EQ(manager->GetFilterCount(), 0u);
+
+  // Verify we get a valid topic name after passing in collisions
+  std::map<std::string, physics::CollisionPtr> collisionMap;
+  collisionMap["test_collision"] = physics::CollisionPtr();
+  std::string collisionMapName = "collision_map";
+  topic  = manager->CreateFilter(collisionMapName, collisionMap);
+  EXPECT_TRUE(topic.find(collisionMapName) != std::string::npos);
+  EXPECT_TRUE(manager->HasFilter(collisionMapName));
+  EXPECT_EQ(manager->GetFilterCount(), 1u);
+
+  std::vector<std::string> collisionVector;
+  collisionVector.push_back("test_collision2");
+  std::string collisionVectorName = "collision_vector";
+  topic = manager->CreateFilter(
+      collisionVectorName, collisionVector);
+  EXPECT_TRUE(topic.find(collisionVectorName) != std::string::npos);
+  EXPECT_TRUE(manager->HasFilter(collisionVectorName));
+  EXPECT_EQ(manager->GetFilterCount(), 2u);
+}
+
+/////////////////////////////////////////////////
+TEST_F(ContactManagerTest, RemoveFilter)
+{
+  Load("worlds/empty.world", false);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+
+  physics::ContactManager *manager = physics->GetContactManager();
+  ASSERT_TRUE(physics != NULL);
+
+  // Add one filter then remove it
+  std::map<std::string, physics::CollisionPtr> collisionMap;
+  collisionMap["test_collision"] = physics::CollisionPtr();
+  std::string collisionMapName = "collision_map";
+  std::string topic  = manager->CreateFilter(collisionMapName, collisionMap);
+  EXPECT_TRUE(topic.find(collisionMapName) != std::string::npos);
+  EXPECT_TRUE(manager->HasFilter(collisionMapName));
+  EXPECT_EQ(manager->GetFilterCount(), 1u);
+  // Verify that the filter is removed
+  manager->RemoveFilter(collisionMapName);
+  EXPECT_TRUE(!manager->HasFilter(collisionMapName));
+  EXPECT_EQ(manager->GetFilterCount(), 0u);
+
+  // Add more filters then remove them one by one
+  std::string name = "collisions";
+  unsigned int runs = 5;
+  for (unsigned int i = 0; i < runs; ++i)
+  {
+    std::stringstream ss;
+    ss << name << i;
+    std::map<std::string, physics::CollisionPtr> collisions;
+    collisionMap["collision"] = physics::CollisionPtr();
+    manager->CreateFilter(ss.str(), collisions);
+    EXPECT_TRUE(manager->HasFilter(ss.str()));
+    EXPECT_EQ(manager->GetFilterCount(), i+1);
+  }
+  for (unsigned int i = 0; i < runs; ++i)
+  {
+    std::stringstream ss;
+    ss << name << i;
+    manager->RemoveFilter(ss.str());
+    EXPECT_TRUE(!manager->HasFilter(ss.str()));
+    EXPECT_EQ(manager->GetFilterCount(), runs - (i+1));
+  }
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/physics/CylinderShape.cc b/gazebo/physics/CylinderShape.cc
index bb4ed67..2838ca1 100644
--- a/gazebo/physics/CylinderShape.cc
+++ b/gazebo/physics/CylinderShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  *
 */
 
-#include "physics/CylinderShape.hh"
+#include "gazebo/physics/CylinderShape.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -25,6 +25,8 @@ using namespace physics;
 CylinderShape::CylinderShape(CollisionPtr _parent) : Shape(_parent)
 {
   this->AddType(Base::CYLINDER_SHAPE);
+  this->scale = math::Vector3::One;
+  sdf::initFile("cylinder_shape.sdf", this->sdf);
 }
 
 //////////////////////////////////////////////////
@@ -35,25 +37,28 @@ CylinderShape::~CylinderShape()
 //////////////////////////////////////////////////
 void CylinderShape::Init()
 {
-  this->SetSize(this->sdf->GetValueDouble("radius"),
-                 this->sdf->GetValueDouble("length"));
+  this->SetSize(this->sdf->Get<double>("radius"),
+                 this->sdf->Get<double>("length"));
 }
 
-
 //////////////////////////////////////////////////
 void CylinderShape::SetRadius(double _radius)
 {
   this->sdf->GetElement("radius")->Set(_radius);
-  this->SetSize(this->sdf->GetValueDouble("radius"),
-                this->sdf->GetValueDouble("length"));
+  if (this->sdf->HasElement("length"))
+  {
+    this->SetSize(_radius, this->sdf->Get<double>("length"));
+  }
 }
 
 //////////////////////////////////////////////////
 void CylinderShape::SetLength(double _length)
 {
   this->sdf->GetElement("length")->Set(_length);
-  this->SetSize(this->sdf->GetValueDouble("radius"),
-                 this->sdf->GetValueDouble("length"));
+  if (this->sdf->HasElement("radius"))
+  {
+    this->SetSize(this->sdf->Get<double>("radius"), _length);
+  }
 }
 
 //////////////////////////////////////////////////
@@ -63,16 +68,34 @@ void CylinderShape::SetSize(double _radius, double _length)
   this->sdf->GetElement("length")->Set(_length);
 }
 
+//////////////////////////////////////////////////
+void CylinderShape::SetScale(const math::Vector3 &_scale)
+{
+  if (_scale.x < 0 || _scale.y < 0 || _scale.z < 0)
+    return;
+
+  if (_scale == this->scale)
+    return;
+
+  double newRadius = std::max(_scale.x, _scale.y);
+  double oldRadius = std::max(this->scale.x, this->scale.y);
+
+  this->SetRadius((newRadius/oldRadius)*this->GetRadius());
+  this->SetLength((_scale.z/this->scale.z)*this->GetLength());
+
+  this->scale = _scale;
+}
+
 /////////////////////////////////////////////////
 double CylinderShape::GetRadius() const
 {
-  return this->sdf->GetValueDouble("radius");
+  return this->sdf->Get<double>("radius");
 }
 
 /////////////////////////////////////////////////
 double CylinderShape::GetLength() const
 {
-  return this->sdf->GetValueDouble("length");
+  return this->sdf->Get<double>("length");
 }
 
 /////////////////////////////////////////////////
diff --git a/gazebo/physics/CylinderShape.hh b/gazebo/physics/CylinderShape.hh
index 9c57756..91b0e0e 100644
--- a/gazebo/physics/CylinderShape.hh
+++ b/gazebo/physics/CylinderShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,7 +22,8 @@
 #ifndef _CYLINDERSHAPE_HH_
 #define _CYLINDERSHAPE_HH_
 
-#include "physics/Shape.hh"
+#include "gazebo/physics/Shape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,7 +34,7 @@ namespace gazebo
 
     /// \class CylinderShape CylinderShape.hh physics/physics.hh
     /// \brief Cylinder collision
-    class CylinderShape : public Shape
+    class GAZEBO_VISIBLE CylinderShape : public Shape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent of the shape.
@@ -66,6 +67,10 @@ namespace gazebo
       /// \param[in] _lenght New length.
       public: virtual void SetSize(double _radius, double _length);
 
+      /// \brief Set scale of cylinder.
+      /// \param[in] _scale Scale to set the cylinder to.
+      public: virtual void SetScale(const math::Vector3 &_scale);
+
       /// \brief Fill in the values for a geomertry message.
       /// \param[out] _msg The geometry message to fill.
       public: void FillMsg(msgs::Geometry &_msg);
diff --git a/gazebo/physics/CylinderShape_TEST.cc b/gazebo/physics/CylinderShape_TEST.cc
new file mode 100644
index 0000000..a5d705c
--- /dev/null
+++ b/gazebo/physics/CylinderShape_TEST.cc
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/CylinderShape.hh"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class CylinderShapeTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(CylinderShapeTest, Scale)
+{
+  std::ostringstream cylinderStr;
+  cylinderStr << "<sdf version ='" << SDF_VERSION << "'>"
+    << "<model name='model'>"
+    << "<link name ='link'>"
+    <<   "<collision name ='collision'>"
+    <<     "<geometry>"
+    <<       "<cylinder>"
+    <<         "<radius>0.5</radius>"
+    <<         "<length>1.0</length>"
+    <<       "</cylinder>"
+    <<     "</geometry>"
+    <<   "</collision>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  sdf::SDFPtr cylinderSDF(new sdf::SDF);
+  cylinderSDF->SetFromString(cylinderStr.str());
+
+  physics::CylinderShapePtr cylinder(
+      new physics::CylinderShape(physics::CollisionPtr()));
+  sdf::ElementPtr elem = cylinderSDF->root;
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("model");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("link");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("collision");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("geometry");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("cylinder");
+  ASSERT_TRUE(elem);
+  cylinder->Load(elem);
+
+  // Test scaling with unit size
+  double radius = cylinder->GetRadius();
+  double length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 0.5);
+  EXPECT_DOUBLE_EQ(length, 1.0);
+
+  cylinder->SetScale(math::Vector3(1.5, 1.5, 1.5));
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 0.75);
+  EXPECT_DOUBLE_EQ(length, 1.5);
+
+  cylinder->SetScale(math::Vector3(2.0, 2.0, 2.0));
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 1.0);
+  EXPECT_DOUBLE_EQ(length, 2.0);
+
+  // reset scale
+  cylinder->SetScale(math::Vector3(1.0, 1.0, 1.0));
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 0.5);
+  EXPECT_DOUBLE_EQ(length, 1.0);
+
+  // Test scaling with non-unit size
+  cylinder->SetRadius(2.5);
+  cylinder->SetLength(3.5);
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 2.5);
+  EXPECT_DOUBLE_EQ(length, 3.5);
+
+  cylinder->SetScale(math::Vector3(2.0, 2.0, 2.0));
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 5.0);
+  EXPECT_DOUBLE_EQ(length, 7.0);
+
+  cylinder->SetScale(math::Vector3(100.0, 100.0, 100.0));
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 250.0);
+  EXPECT_DOUBLE_EQ(length, 350.0);
+
+  cylinder->SetScale(math::Vector3(0.1, 0.1, 0.1));
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 0.25);
+  EXPECT_DOUBLE_EQ(length, 0.35);
+
+  // reset scale
+  cylinder->SetScale(math::Vector3(1.0, 1.0, 1.0));
+  cylinder->SetRadius(0.5);
+  cylinder->SetLength(1.0);
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 0.5);
+  EXPECT_DOUBLE_EQ(length, 1.0);
+
+  // Test scaling with different x, y and z components
+  cylinder->SetScale(math::Vector3(0.5, 1.0, 2.5));
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  // radius should be multiplied by max of (0.5, 1.0)
+  EXPECT_DOUBLE_EQ(radius, 0.5);
+  EXPECT_DOUBLE_EQ(length, 2.5);
+
+  // Test scaling with negative components
+  // This should fail and radius and length should remain the same as before
+  cylinder->SetScale(math::Vector3(-1.0, -2.0, -3.0));
+  radius = cylinder->GetRadius();
+  length = cylinder->GetLength();
+  EXPECT_DOUBLE_EQ(radius, 0.5);
+  EXPECT_DOUBLE_EQ(length, 2.5);
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/physics/Entity.cc b/gazebo/physics/Entity.cc
index 0c452ec..c67aa63 100644
--- a/gazebo/physics/Entity.cc
+++ b/gazebo/physics/Entity.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
 
 #include <boost/thread/recursive_mutex.hpp>
 
-#include "msgs/msgs.hh"
+#include "gazebo/msgs/msgs.hh"
 
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Events.hh"
@@ -30,7 +30,7 @@
 #include "gazebo/common/KeyFrame.hh"
 
 #include "gazebo/transport/Publisher.hh"
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Node.hh"
 
 #include "gazebo/physics/RayShape.hh"
@@ -53,31 +53,37 @@ Entity::Entity(BasePtr _parent)
   this->AddType(ENTITY);
 
   this->visualMsg = new msgs::Visual;
-  this->poseMsg = new msgs::Pose;
+  this->visualMsg->set_id(this->id);
+
+  if (this->world)
+    this->visualMsg->set_parent_name(this->world->GetName());
+  else
+  {
+    gzerr << "No world set when constructing an Entity.\n";
+    this->visualMsg->set_parent_name("no_world_name");
+  }
 
   if (this->parent && this->parent->HasType(ENTITY))
   {
     this->parentEntity = boost::dynamic_pointer_cast<Entity>(this->parent);
+    this->visualMsg->set_parent_name(this->parentEntity->GetScopedName());
     this->SetStatic(this->parentEntity->IsStatic());
   }
 
   this->setWorldPoseFunc = &Entity::SetWorldPoseDefault;
+
+  this->scale = math::Vector3::One;
 }
 
 //////////////////////////////////////////////////
 Entity::~Entity()
 {
-  Base_V::iterator iter;
-
   // TODO: put this back in
   // this->GetWorld()->GetPhysicsEngine()->RemoveEntity(this);
 
   delete this->visualMsg;
   this->visualMsg = NULL;
 
-  delete this->poseMsg;
-  this->poseMsg = NULL;
-
   this->visPub.reset();
   this->requestPub.reset();
   this->poseSub.reset();
@@ -97,25 +103,30 @@ void Entity::Load(sdf::ElementPtr _sdf)
 
   this->visualMsg->set_name(this->GetScopedName());
 
-  if (this->sdf->HasElement("pose"))
   {
     if (this->parent && this->parentEntity)
-      this->worldPose = this->sdf->GetValuePose("pose") +
+      this->worldPose = this->sdf->Get<math::Pose>("pose") +
                         this->parentEntity->worldPose;
     else
-      this->worldPose = this->sdf->GetValuePose("pose");
+      this->worldPose = this->sdf->Get<math::Pose>("pose");
 
-    this->initialRelativePose = this->sdf->GetValuePose("pose");
+    this->initialRelativePose = this->sdf->Get<math::Pose>("pose");
   }
 
   if (this->parent)
+  {
     this->visualMsg->set_parent_name(this->parent->GetScopedName());
+    this->visualMsg->set_parent_id(this->parent->GetId());
+  }
+  else
+  {
+    this->visualMsg->set_parent_name(this->world->GetName());
+    this->visualMsg->set_parent_id(0);
+  }
   msgs::Set(this->visualMsg->mutable_pose(), this->GetRelativePose());
 
   this->visPub->Publish(*this->visualMsg);
 
-  this->poseMsg->set_name(this->GetScopedName());
-
   if (this->HasType(Base::MODEL))
     this->setWorldPoseFunc = &Entity::SetWorldPoseModel;
   else if (this->IsCanonicalLink())
@@ -139,7 +150,7 @@ void Entity::SetStatic(const bool &_s)
 
   this->isStatic = _s;
 
-  for (iter = this->children.begin(); iter != this->childrenEnd; ++iter)
+  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
   {
     EntityPtr e = boost::dynamic_pointer_cast<Entity>(*iter);
     if (e)
@@ -271,7 +282,7 @@ void Entity::SetWorldTwist(const math::Vector3 &_linear,
     {
       // force an update of all children
       for  (Base_V::iterator iter = this->children.begin();
-            iter != this->childrenEnd; ++iter)
+            iter != this->children.end(); ++iter)
       {
         if ((*iter)->HasType(ENTITY))
         {
@@ -305,7 +316,7 @@ void Entity::SetWorldPoseModel(const math::Pose &_pose, bool _notify,
   // update all children pose, moving them with the model.
   // The outer loop updates all the links.
   for (Base_V::iterator iter = this->children.begin();
-      iter != this->childrenEnd; ++iter)
+      iter != this->children.end(); ++iter)
   {
     if ((*iter)->HasType(ENTITY))
     {
@@ -339,11 +350,9 @@ void Entity::SetWorldPoseCanonicalLink(const math::Pose &_pose, bool _notify,
   // also update parent model's pose
   if (this->parentEntity->HasType(MODEL))
   {
-    this->parentEntity->worldPose.pos = _pose.pos -
-      this->parentEntity->worldPose.rot.RotateVector(
-          this->initialRelativePose.pos);
-    this->parentEntity->worldPose.rot = _pose.rot *
-      this->initialRelativePose.rot.GetInverse();
+    // setting parent Model world pose from canonical link world pose
+    // where _pose is the canonical link's world pose
+    this->parentEntity->worldPose = (-this->initialRelativePose) + _pose;
 
     this->parentEntity->worldPose.Correct();
 
@@ -419,7 +428,7 @@ void Entity::UpdatePhysicsPose(bool _updateChildren)
   if (_updateChildren)
   {
     for (Base_V::iterator iter = this->children.begin();
-         iter != this->childrenEnd; ++iter)
+         iter != this->children.end(); ++iter)
     {
       if ((*iter)->HasType(LINK))
       {
@@ -435,7 +444,7 @@ void Entity::UpdatePhysicsPose(bool _updateChildren)
   if (this->IsStatic())
   {
     for (Base_V::iterator iter = this->children.begin();
-         iter != this->childrenEnd; ++iter)
+         iter != this->children.end(); ++iter)
     {
       CollisionPtr coll = boost::static_pointer_cast<Collision>(*iter);
       if (coll && (*iter)->HasType(COLLISION))
@@ -537,7 +546,7 @@ void Entity::UpdateParameters(sdf::ElementPtr _sdf)
   if (this->parent && this->parentEntity)
     parentPose = this->parentEntity->worldPose;
 
-  math::Pose newPose = _sdf->GetValuePose("pose");
+  math::Pose newPose = _sdf->Get<math::Pose>("pose");
   if (newPose != this->GetRelativePose())
   {
     this->SetRelativePose(newPose);
@@ -579,14 +588,8 @@ const math::Pose &Entity::GetDirtyPose() const
 //////////////////////////////////////////////////
 math::Box Entity::GetCollisionBoundingBox() const
 {
-  math::Box box;
-  for (Base_V::const_iterator iter = this->children.begin();
-       iter != this->children.end(); ++iter)
-  {
-    box += this->GetCollisionBoundingBoxHelper(*iter);
-  }
-
-  return box;
+  BasePtr base = boost::const_pointer_cast<Base>(shared_from_this()); return
+  this->GetCollisionBoundingBoxHelper(base);
 }
 
 //////////////////////////////////////////////////
@@ -621,6 +624,7 @@ void Entity::PlaceOnEntity(const std::string &_entityName)
 void Entity::GetNearestEntityBelow(double &_distBelow,
                                    std::string &_entityName)
 {
+  this->GetWorld()->GetPhysicsEngine()->InitForThread();
   RayShapePtr rayShape = boost::dynamic_pointer_cast<RayShape>(
     this->GetWorld()->GetPhysicsEngine()->CreateShape("ray", CollisionPtr()));
 
diff --git a/gazebo/physics/Entity.hh b/gazebo/physics/Entity.hh
index 750a763..444923e 100644
--- a/gazebo/physics/Entity.hh
+++ b/gazebo/physics/Entity.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -37,6 +37,7 @@
 
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/physics/Base.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
@@ -52,7 +53,7 @@ namespace gazebo
 
     /// \class Entity Entity.hh physics/physics.hh
     /// \brief Base class for all physics objects in Gazebo.
-    class Entity : public Base
+    class GAZEBO_VISIBLE Entity : public Base
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent of the entity.
@@ -317,9 +318,6 @@ namespace gazebo
       /// \brief Visual message container.
       protected: msgs::Visual *visualMsg;
 
-      /// \brief Pose message container.
-      protected: msgs::Pose *poseMsg;
-
       /// \brief Current pose animation
       protected: common::PoseAnimationPtr animation;
 
@@ -338,6 +336,9 @@ namespace gazebo
       /// \brief The pose set by a physics engine.
       protected: math::Pose dirtyPose;
 
+      /// \brief Scale of the entity
+      protected: math::Vector3 scale;
+
       /// \brief Callback for when an animation completes.
       private: boost::function<void()> onAnimationComplete;
 
diff --git a/gazebo/physics/GearboxJoint.hh b/gazebo/physics/GearboxJoint.hh
new file mode 100644
index 0000000..aa3ae6e
--- /dev/null
+++ b/gazebo/physics/GearboxJoint.hh
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GEARBOXJOINT_HH_
+#define _GEARBOXJOINT_HH_
+
+#include <string>
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \addtogroup gazebo_physics
+    /// \{
+
+    /// \class GearboxJoint GearboxJoint.hh physics/physics.hh
+    /// \brief A double axis gearbox joint
+    template<class T>
+    class GAZEBO_VISIBLE GearboxJoint : public T
+    {
+      /// \brief Constructor
+      /// \param[in] _parent Parent link
+      public: GearboxJoint(BasePtr _parent) : T(_parent), gearRatio(1.0)
+              { this->AddType(Base::GEARBOX_JOINT); }
+      /// \brief Destructor
+      public: virtual ~GearboxJoint()
+              { }
+
+      // Documentation inherited.
+      public: virtual unsigned int GetAngleCount() const
+              {return 2;}
+
+      /// \brief Load joint
+      /// \param[in] _sdf Pointer to SDF element
+      public: virtual void Load(sdf::ElementPtr _sdf)
+              {
+                T::Load(_sdf);
+                if (_sdf->HasElement("gearbox_ratio"))
+                {
+                  this->gearRatio =
+                    _sdf->Get<double>("gearbox_ratio");
+                }
+                else
+                {
+                  gzerr << "gearbox_ratio_not_specified, set to 1.\n";
+                  this->gearRatio = 1.0;
+                  /* below should bring in default values for sdf 1.4+
+                  this->gearRatio =
+                    _sdf->Get<double>("gearbox_ratio");
+                  */
+                }
+
+                if (_sdf->HasElement("gearbox_reference_body"))
+                {
+                  this->referenceBody =
+                    _sdf->Get<std::string>("gearbox_reference_body");
+                }
+                else
+                {
+                  gzerr << "Gearbox joint missing reference body.\n";
+                }
+              }
+
+      /// \brief Initialize joint
+      protected: virtual void Init()
+                 {
+                   T::Init();
+                 }
+
+      /// \brief Get gearbox joint gear ratio.
+      /// \return Gear ratio value.
+      public: virtual double GetGearboxRatio() const
+              { return this->gearRatio; }
+
+      /// \brief Set gearbox joint gear ratio.
+      ///
+      /// This must be implemented in a child class
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _gearRatio Gear ratio value.
+      public: virtual void SetGearboxRatio(double _gearRatio) = 0;
+
+      /// \brief Gearbox gearRatio
+      protected: double gearRatio;
+
+      /// \brief reference link/body for computing joint angles
+      protected: std::string referenceBody;
+    };
+    /// \}
+  }
+}
+#endif
+
diff --git a/gazebo/physics/Gripper.cc b/gazebo/physics/Gripper.cc
index 877cf60..9799674 100644
--- a/gazebo/physics/Gripper.cc
+++ b/gazebo/physics/Gripper.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,16 +15,20 @@
  *
 */
 
-#include "common/Events.hh"
+#include "gazebo/common/Events.hh"
 
-#include "physics/World.hh"
-#include "physics/Joint.hh"
-#include "physics/Link.hh"
-#include "physics/Collision.hh"
-#include "physics/Contact.hh"
-#include "physics/Model.hh"
-#include "physics/PhysicsEngine.hh"
-#include "physics/Gripper.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Subscriber.hh"
+
+#include "gazebo/physics/ContactManager.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Joint.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/Contact.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/Gripper.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -43,11 +47,20 @@ Gripper::Gripper(ModelPtr _model)
   this->attached = false;
 
   this->updateRate = common::Time(0, common::Time::SecToNano(0.75));
+
+  this->node = transport::NodePtr(new transport::Node());
 }
 
 /////////////////////////////////////////////////
 Gripper::~Gripper()
 {
+  if (this->world && this->world->GetRunning())
+  {
+    physics::ContactManager *mgr =
+        this->world->GetPhysicsEngine()->GetContactManager();
+    mgr->RemoveFilter(this->GetName());
+  }
+
   this->model.reset();
   this->physics.reset();
   this->world.reset();
@@ -57,26 +70,28 @@ Gripper::~Gripper()
 /////////////////////////////////////////////////
 void Gripper::Load(sdf::ElementPtr _sdf)
 {
+  this->node->Init(this->world->GetName());
+
+  this->name = _sdf->Get<std::string>("name");
   this->fixedJoint = this->physics->CreateJoint("revolute", this->model);
 
-  sdf::ElementPtr grasp_check = _sdf->GetElement("grasp_check");
-  this->min_contact_count = grasp_check->GetValueUInt("min_contact_count");
-  this->attachSteps = grasp_check->GetValueInt("attach_steps");
-  this->detachSteps = grasp_check->GetValueInt("detach_steps");
+  sdf::ElementPtr graspCheck = _sdf->GetElement("grasp_check");
+  this->minContactCount = graspCheck->Get<unsigned int>("min_contact_count");
+  this->attachSteps = graspCheck->Get<int>("attach_steps");
+  this->detachSteps = graspCheck->Get<int>("detach_steps");
 
   sdf::ElementPtr palmLinkElem = _sdf->GetElement("palm_link");
-  this->palmLink = this->model->GetLink(palmLinkElem->GetValueString());
+  this->palmLink = this->model->GetLink(palmLinkElem->Get<std::string>());
   if (!this->palmLink)
-    gzerr << "palm link [" << palmLinkElem->GetValueString()
+    gzerr << "palm link [" << palmLinkElem->Get<std::string>()
           << "] not found!\n";
 
   sdf::ElementPtr gripperLinkElem = _sdf->GetElement("gripper_link");
 
-
   while (gripperLinkElem)
   {
     physics::LinkPtr gripperLink
-      = this->model->GetLink(gripperLinkElem->GetValueString());
+      = this->model->GetLink(gripperLinkElem->Get<std::string>());
     for (unsigned int j = 0; j < gripperLink->GetChildCount(); ++j)
     {
       physics::CollisionPtr collision = gripperLink->GetCollision(j);
@@ -84,13 +99,25 @@ void Gripper::Load(sdf::ElementPtr _sdf)
         = this->collisions.find(collision->GetScopedName());
       if (collIter != this->collisions.end())
         continue;
-      collision->SetContactsEnabled(true);
 
       this->collisions[collision->GetScopedName()] = collision;
     }
     gripperLinkElem = gripperLinkElem->GetNextElement("gripper_link");
   }
 
+  if (!this->collisions.empty())
+  {
+    // request the contact manager to publish messages to a custom topic for
+    // this sensor
+    physics::ContactManager *mgr =
+        this->world->GetPhysicsEngine()->GetContactManager();
+    std::string topic = mgr->CreateFilter(this->GetName(), this->collisions);
+    if (!this->contactSub)
+    {
+      this->contactSub = this->node->Subscribe(topic,
+          &Gripper::OnContacts, this);
+    }
+  }
   this->connections.push_back(event::Events::ConnectWorldUpdateEnd(
           boost::bind(&Gripper::OnUpdate, this)));
 }
@@ -111,7 +138,7 @@ void Gripper::OnUpdate()
     return;
 
   // @todo: should package the decision into a function
-  if (this->contacts.size() >= this->min_contact_count)
+  if (this->contacts.size() >= this->minContactCount)
   {
     this->posCount++;
     this->zeroCount = 0;
@@ -127,7 +154,11 @@ void Gripper::OnUpdate()
   else if (this->zeroCount > this->detachSteps && this->attached)
     this->HandleDetach();
 
-  this->contacts.clear();
+  {
+    boost::mutex::scoped_lock lock(this->mutexContacts);
+    this->contacts.clear();
+  }
+
   this->prevUpdateTime = common::Time::GetWallTime();
 }
 
@@ -144,21 +175,26 @@ void Gripper::HandleAttach()
   std::map<std::string, int> contactCounts;
   std::map<std::string, int>::iterator iter;
 
+  // This function is only called from the OnUpdate function so
+  // the call to contacts.clear() is not going to happen in
+  // parallel with the reads in the following code, no mutex
+  // needed.
   for (unsigned int i = 0; i < this->contacts.size(); ++i)
   {
-    std::string name1 = this->contacts[i].collision1;
-    std::string name2 = this->contacts[i].collision2;
+    std::string name1 = this->contacts[i].collision1();
+    std::string name2 = this->contacts[i].collision2();
 
     if (this->collisions.find(name1) == this->collisions.end())
     {
       cc[name1] = boost::dynamic_pointer_cast<Collision>(
-          this->world->GetEntity(this->contacts[i].collision1));
+          this->world->GetEntity(name1));
       contactCounts[name1] += 1;
     }
+
     if (this->collisions.find(name2) == this->collisions.end())
     {
       cc[name2] = boost::dynamic_pointer_cast<Collision>(
-          this->world->GetEntity(this->contacts[i].collision2));
+          this->world->GetEntity(name2));
       contactCounts[name2] += 1;
     }
   }
@@ -209,22 +245,22 @@ void Gripper::HandleDetach()
 }
 
 /////////////////////////////////////////////////
-void Gripper::OnContact(const std::string &/*_collisionName*/,
-                        const physics::Contact &_contact)
+void Gripper::OnContacts(ConstContactsPtr &_msg)
 {
-  CollisionPtr collision1 = boost::dynamic_pointer_cast<Collision>(
-        this->world->GetEntity(_contact.collision1));
-
-  CollisionPtr collision2 = boost::dynamic_pointer_cast<Collision>(
-        this->world->GetEntity(_contact.collision1));
-
-  if ((collision1 && collision1->IsStatic()) ||
-      (collision2 && collision2->IsStatic()))
+  for (int i = 0; i < _msg->contact_size(); ++i)
   {
-    return;
-  }
+    CollisionPtr collision1 = boost::dynamic_pointer_cast<Collision>(
+        this->world->GetEntity(_msg->contact(i).collision1()));
+    CollisionPtr collision2 = boost::dynamic_pointer_cast<Collision>(
+        this->world->GetEntity(_msg->contact(i).collision2()));
 
-  this->contacts.push_back(_contact);
+    if ((collision1 && !collision1->IsStatic()) &&
+        (collision2 && !collision2->IsStatic()))
+    {
+      boost::mutex::scoped_lock lock(this->mutexContacts);
+      this->contacts.push_back(_msg->contact(i));
+    }
+  }
 }
 
 /////////////////////////////////////////////////
@@ -233,3 +269,15 @@ void Gripper::ResetDiffs()
   for (unsigned int i = 0; i < 10; ++i)
     this->diffs[i] = GZ_DBL_MAX;
 }
+
+/////////////////////////////////////////////////
+std::string Gripper::GetName() const
+{
+  return this->name;
+}
+
+/////////////////////////////////////////////////
+bool Gripper::IsAttached() const
+{
+  return this->attached;
+}
diff --git a/gazebo/physics/Gripper.hh b/gazebo/physics/Gripper.hh
index d0b980e..995c66b 100644
--- a/gazebo/physics/Gripper.hh
+++ b/gazebo/physics/Gripper.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +21,11 @@
 #include <vector>
 #include <string>
 
-#include "physics/PhysicsTypes.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +41,7 @@ namespace gazebo
     /// will intelligently generate fixed joints between the gripper and an
     /// object within the gripper. This allows the object to be manipulated
     /// without falling or behaving poorly.
-    class Gripper
+    class GAZEBO_VISIBLE Gripper
     {
       /// \brief Constructor
       /// \param[in] _model The model which contains the Gripper.
@@ -54,15 +58,20 @@ namespace gazebo
       /// \brief Initialize.
       public: virtual void Init();
 
+      /// \brief Return the name of the gripper.
+      public: std::string GetName() const;
+
+      /// \brief True if the gripper is attached to another model.
+      /// \return True if the gripper is active and a joint has been
+      /// created between the gripper and another model.
+      public: bool IsAttached() const;
+
       /// \brief Update the gripper.
       private: void OnUpdate();
 
       /// \brief Callback used when the gripper contacts an object.
-      /// \param[in] _collisionName Name of the collision object that
-      /// contacted the gripper.
-      /// \param[in] _contact Contact information.
-      private: void OnContact(const std::string &_collisionName,
-                              const physics::Contact &_contact);
+      /// \param[in] _msg Message that contains contact information.
+      private: void OnContacts(ConstContactsPtr &_msg);
 
       /// \brief Attach an object to the gripper.
       private: void HandleAttach();
@@ -94,8 +103,11 @@ namespace gazebo
       /// \brief The collisions for the links in the gripper.
       private: std::map<std::string, physics::CollisionPtr> collisions;
 
-      /// \brief The current contacts that.
-      private: std::vector<physics::Contact> contacts;
+      /// \brief The current contacts.
+      private: std::vector<msgs::Contact> contacts;
+
+      /// \brief Mutex used to protect reading/writing the sonar message.
+      private: boost::mutex mutexContacts;
 
       /// \brief True if the gripper has an object.
       private: bool attached;
@@ -125,13 +137,22 @@ namespace gazebo
       private: int zeroCount;
 
       /// \brief Minimum number of links touching.
-      private: unsigned int min_contact_count;
+      private: unsigned int minContactCount;
 
       /// \brief Steps touching before engaging fixed joint
       private: int attachSteps;
 
-      /// \brief Steps not touching before deisengaging fixed joint
+      /// \brief Steps not touching before disengaging fixed joint
       private: int detachSteps;
+
+      /// \brief Name of the gripper.
+      private: std::string name;
+
+      /// \brief Node for communication.
+      protected: transport::NodePtr node;
+
+      /// \brief Subscription to contact messages from the physics engine.
+      private: transport::SubscriberPtr contactSub;
     };
     /// \}
   }
diff --git a/gazebo/physics/HeightmapShape.cc b/gazebo/physics/HeightmapShape.cc
index 3d10c72..317cb1c 100644
--- a/gazebo/physics/HeightmapShape.cc
+++ b/gazebo/physics/HeightmapShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,14 +19,24 @@
  * Date: 8 May 2003
  */
 
-#include <string.h>
-#include <math.h>
-
-#include "common/Image.hh"
-#include "common/Common.hh"
-#include "common/Exception.hh"
-
-#include "physics/HeightmapShape.hh"
+#include <gazebo/gazebo_config.h>
+
+#ifdef HAVE_GDAL
+# include <gdal/gdalwarper.h>
+#endif
+
+#include <algorithm>
+#include <cmath>
+#include <string>
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Image.hh"
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/SphericalCoordinates.hh"
+#include "gazebo/math/gzmath.hh"
+#include "gazebo/physics/HeightmapShape.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/transport/transport.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -36,6 +46,7 @@ using namespace physics;
 HeightmapShape::HeightmapShape(CollisionPtr _parent)
     : Shape(_parent)
 {
+  this->vertSize = 0;
   this->AddType(Base::HEIGHTMAP_SHAPE);
 }
 
@@ -45,24 +56,153 @@ HeightmapShape::~HeightmapShape()
 }
 
 //////////////////////////////////////////////////
+void HeightmapShape::OnRequest(ConstRequestPtr &_msg)
+{
+  if (_msg->request() == "heightmap_data")
+  {
+    msgs::Geometry msg;
+
+    msgs::Response response;
+    response.set_id(_msg->id());
+    response.set_request(_msg->request());
+    response.set_response("success");
+
+    this->FillMsg(msg);
+
+    response.set_type(msg.GetTypeName());
+    std::string *serializedData = response.mutable_serialized_data();
+    msg.SerializeToString(serializedData);
+
+    this->responsePub->Publish(response);
+  }
+}
+
+//////////////////////////////////////////////////
+int HeightmapShape::LoadImageAsTerrain(const std::string &_filename)
+{
+  if (this->img.Load(_filename) != 0)
+  {
+    gzerr << "Unable to load an image as a terrain [" << _filename << "]\n";
+    return -1;
+  }
+
+  this->heightmapData = static_cast<common::HeightmapData*>(&this->img);
+  this->heightmapSize = this->sdf->Get<math::Vector3>("size");
+
+  return 0;
+}
+
+#ifdef HAVE_GDAL
+//////////////////////////////////////////////////
+int HeightmapShape::LoadDEMAsTerrain(const std::string &_filename)
+{
+  if (this->dem.Load(_filename) != 0)
+  {
+    gzerr << "Unable to load a DEM file as a terrain [" << _filename << "]\n";
+    return -1;
+  }
+
+  if (this->sdf->HasElement("size"))
+  {
+    this->heightmapSize = this->sdf->Get<math::Vector3>("size");
+  }
+  else
+  {
+    this->heightmapSize.x = this->dem.GetWorldWidth();
+    this->heightmapSize.y = this->dem.GetWorldHeight();
+    this->heightmapSize.z = this->dem.GetMaxElevation() -
+        std::max(0.0f, this->dem.GetMinElevation());
+  }
+
+  this->heightmapData = static_cast<common::HeightmapData*>(&this->dem);
+
+  // Modify the reference geotedic latitude/longitude.
+  // A GPS sensor will use the real georeferenced coordinates of the terrain.
+  common::SphericalCoordinatesPtr sphericalCoordinates;
+  sphericalCoordinates = this->world->GetSphericalCoordinates();
+
+  if (sphericalCoordinates)
+  {
+    math::Angle latitude, longitude;
+    double elevation;
+
+    this->dem.GetGeoReferenceOrigin(latitude, longitude);
+    elevation = this->dem.GetElevation(0.0, 0.0);
+
+    sphericalCoordinates->SetLatitudeReference(latitude);
+    sphericalCoordinates->SetLongitudeReference(longitude);
+    sphericalCoordinates->SetElevationReference(elevation);
+    sphericalCoordinates.reset();
+  }
+  else
+    gzerr << "Unable to get a valid SphericalCoordinates pointer\n";
+
+  return 0;
+}
+
+//////////////////////////////////////////////////
+int HeightmapShape::LoadTerrainFile(const std::string &_filename)
+{
+  // Register the GDAL drivers
+  GDALAllRegister();
+
+  GDALDataset *poDataset = reinterpret_cast<GDALDataset *>
+      (GDALOpen(_filename.c_str(), GA_ReadOnly));
+
+  if (!poDataset)
+  {
+    gzerr << "Unrecognized terrain format in file [" << _filename << "]\n";
+    return -1;
+  }
+
+  this->fileFormat = poDataset->GetDriver()->GetDescription();
+  GDALClose(reinterpret_cast<GDALDataset *>(poDataset));
+
+  // Check if the heightmap file is an image
+  if (fileFormat == "JPEG" || fileFormat == "PNG")
+  {
+    // Load the terrain file as an image
+    return this->LoadImageAsTerrain(_filename);
+  }
+  else
+  {
+    // Load the terrain file as a DEM
+    return this->LoadDEMAsTerrain(_filename);
+  }
+}
+#else
+int HeightmapShape::LoadTerrainFile(const std::string &_filename)
+{
+  // Load the terrain file as an image
+  return this->LoadImageAsTerrain(_filename);
+}
+#endif
+
+//////////////////////////////////////////////////
 void HeightmapShape::Load(sdf::ElementPtr _sdf)
 {
   Base::Load(_sdf);
 
-  std::string filename = common::find_file(this->sdf->GetValueString("uri"));
+  std::string filename = common::find_file(this->sdf->Get<std::string>("uri"));
   if (filename.empty())
   {
-    gzthrow("Unable to find heightmap[" +
-            this->sdf->GetValueString("uri") + "]\n");
+    gzerr << "Unable to find heightmap[" +
+             this->sdf->Get<std::string>("uri") + "]\n";
+    return;
   }
 
-  // Use the image to get the size of the heightmap
-  this->img.Load(filename);
+  if (LoadTerrainFile(filename) != 0)
+  {
+    gzerr << "Heightmap data size must be square, with a size of 2^n+1\n";
+    return;
+  }
 
-  if (this->img.GetWidth() != this->img.GetHeight() ||
-      !math::isPowerOfTwo(this->img.GetWidth()-1))
+  // Check if the geometry of the terrain data matches Ogre constrains
+  if (this->heightmapData->GetWidth() != this->heightmapData->GetHeight() ||
+      !math::isPowerOfTwo(this->heightmapData->GetWidth() - 1))
   {
-    gzthrow("Heightmap image size must be square, with a size of 2^n+1\n");
+    gzerr << "Heightmap data size must be square, with a size of 2^n+1\n";
+    return;
   }
 }
 
@@ -75,122 +215,80 @@ int HeightmapShape::GetSubSampling() const
 //////////////////////////////////////////////////
 void HeightmapShape::Init()
 {
-  this->subSampling = 1;
+  this->node = transport::NodePtr(new transport::Node());
+  this->node->Init();
+
+  this->requestSub = this->node->Subscribe("~/request",
+      &HeightmapShape::OnRequest, this, true);
+  this->responsePub = this->node->Advertise<msgs::Response>("~/response");
+
+  this->subSampling = 2;
 
   math::Vector3 terrainSize = this->GetSize();
 
   // sampling size along image width and height
-  this->vertSize = this->img.GetWidth() * this->subSampling;
+  this->vertSize = (this->heightmapData->GetWidth() * this->subSampling)-1;
   this->scale.x = terrainSize.x / this->vertSize;
   this->scale.y = terrainSize.y / this->vertSize;
 
-  if (math::equal(this->img.GetMaxColor().r, 0.0f))
+  if (math::equal(this->heightmapData->GetMaxElevation(), 0.0f))
     this->scale.z = fabs(terrainSize.z);
   else
-    this->scale.z = fabs(terrainSize.z) / this->img.GetMaxColor().r;
+    this->scale.z = fabs(terrainSize.z) /
+                    this->heightmapData->GetMaxElevation();
 
   // Step 1: Construct the heightmap lookup table
-  this->FillHeightMap();
+  this->heightmapData->FillHeightMap(this->subSampling, this->vertSize,
+      this->GetSize(), this->scale, this->flipY, this->heights);
 }
 
 //////////////////////////////////////////////////
-void HeightmapShape::FillHeightMap()
+void HeightmapShape::SetScale(const math::Vector3 &_scale)
 {
-  unsigned int x, y;
-  float h = 0;
-  float h1 = 0;
-  float h2 = 0;
-
-  // Resize the vector to match the size of the vertices
-  this->heights.resize(this->vertSize * this->vertSize);
+  if (this->scale == _scale)
+    return;
 
-  common::Color pixel;
-
-  double yf, xf, dy, dx;
-  int y1, y2, x1, x2;
-  double px1, px2, px3, px4;
-
-  int imgHeight = this->img.GetHeight();
-  int imgWidth = this->img.GetWidth();
-  // Bytes per row
-  unsigned int pitch = this->img.GetPitch();
-  // Bytes per pixel
-  unsigned int bpp = pitch / imgWidth;
-
-  unsigned char *data = NULL;
-  unsigned int count;
-  this->img.GetData(&data, count);
-
-  // Iterate over all the vertices
-  for (y = 0; y < this->vertSize; y++)
-  {
-    // yf ranges between 0 and 4
-    yf = y / static_cast<double>(this->subSampling);
-    y1 = floor(yf);
-    y2 = ceil(yf);
-    if (y2 >= imgHeight)
-      y2 = imgHeight-1;
-    dy = yf - y1;
-
-    for (x = 0; x < this->vertSize; x++)
-    {
-      xf = x / static_cast<double>(this->subSampling);
-      x1 = floor(xf);
-      x2 = ceil(xf);
-      if (x2 >= imgWidth)
-        x2 = imgWidth-1;
-      dx = xf - x1;
-
-      px1 = static_cast<int>(data[y1 * pitch + x1 * bpp]) / 255.0;
-      px2 = static_cast<int>(data[y1 * pitch + x2 * bpp]) / 255.0;
-      h1 = (px1 - ((px1 - px2) * dx));
-
-      px3 = static_cast<int>(data[y2 * pitch + x1 * bpp]) / 255.0;
-      px4 = static_cast<int>(data[y2 * pitch + x2 * bpp]) / 255.0;
-      h2 = (px3 - ((px3 - px4) * dx));
-
-      h = (h1 - ((h1 - h2) * dy)) * this->scale.z;
-
-      // invert pixel definition so 1=ground, 0=full height,
-      //   if the terrain size has a negative z component
-      //   this is mainly for backward compatibility
-      if (this->GetSize().z < 0)
-        h = 1.0 - h;
-
-      // Store the height for future use
-      this->heights[y * this->vertSize + x] = h;
-    }
-  }
-
-  delete [] data;
+  this->scale = _scale;
 }
 
 //////////////////////////////////////////////////
 std::string HeightmapShape::GetURI() const
 {
-  return this->sdf->GetValueString("uri");
+  return this->sdf->Get<std::string>("uri");
 }
 
 //////////////////////////////////////////////////
 math::Vector3 HeightmapShape::GetSize() const
 {
-  return this->sdf->GetValueVector3("size");
+  return this->heightmapSize;
 }
 
 //////////////////////////////////////////////////
 math::Vector3 HeightmapShape::GetPos() const
 {
-  return this->sdf->GetValueVector3("pos");
+  return this->sdf->Get<math::Vector3>("pos");
 }
 
 //////////////////////////////////////////////////
 void HeightmapShape::FillMsg(msgs::Geometry &_msg)
 {
   _msg.set_type(msgs::Geometry::HEIGHTMAP);
-  msgs::Set(_msg.mutable_heightmap()->mutable_image(),
-            common::Image(this->GetURI()));
+
+  _msg.mutable_heightmap()->set_width(this->vertSize);
+  _msg.mutable_heightmap()->set_height(this->vertSize);
+
+  for (unsigned int y = 0; y < this->vertSize; ++y)
+  {
+    for (unsigned int x = 0; x < this->vertSize; ++x)
+    {
+      int index = (this->vertSize - y - 1) * this->vertSize + x;
+      _msg.mutable_heightmap()->add_heights(this->heights[index]);
+    }
+  }
+
   msgs::Set(_msg.mutable_heightmap()->mutable_size(), this->GetSize());
   msgs::Set(_msg.mutable_heightmap()->mutable_origin(), this->GetPos());
+  _msg.mutable_heightmap()->set_filename(this->img.GetFilename());
 }
 
 //////////////////////////////////////////////////
@@ -206,10 +304,12 @@ math::Vector2i HeightmapShape::GetVertexCount() const
 }
 
 /////////////////////////////////////////////////
-float HeightmapShape::GetHeight(int _x, int _y)
+float HeightmapShape::GetHeight(int _x, int _y) const
 {
-  return this->heights[(_y * this->subSampling) * this->vertSize +
-                       (_x * this->subSampling)];
+  if (_x < 0 || _y < 0)
+    return 0.0;
+
+  return this->heights[_y * this->vertSize + _x];
 }
 
 /////////////////////////////////////////////////
@@ -237,3 +337,49 @@ float HeightmapShape::GetMinHeight() const
 
   return min;
 }
+
+//////////////////////////////////////////////////
+common::Image HeightmapShape::GetImage() const
+{
+  double height = 0.0;
+  unsigned char *imageData = NULL;
+
+  /// \todo Support multiple terrain objects
+  double minHeight = this->GetMinHeight();
+  double maxHeight = this->GetMaxHeight() - minHeight;
+
+  int size = (this->vertSize+1) / this->subSampling;
+
+  // Create the image data buffer
+  imageData = new unsigned char[size * size];
+
+  // Get height data from all vertices
+  for (uint16_t y = 0; y < size; ++y)
+  {
+    for (uint16_t x = 0; x < size; ++x)
+    {
+      int sx = static_cast<int>(x * this->subSampling);
+      int sy;
+
+      if (!this->flipY)
+        sy = static_cast<int>(y * this->subSampling);
+      else
+        sy = static_cast<int>(size - 1 -y) * this->subSampling;
+
+      // Normalize height value
+      height = (this->GetHeight(sx, sy) - minHeight) / maxHeight;
+
+      GZ_ASSERT(height <= 1.0, "Normalized terrain height > 1.0");
+      GZ_ASSERT(height >= 0.0, "Normalized terrain height < 0.0");
+
+      // Scale height to a value between 0 and 255
+      imageData[y * size + x] = static_cast<unsigned char>(height * 255.0);
+    }
+  }
+
+  common::Image result;
+  result.SetFromData(imageData, size, size, common::Image::L_INT8);
+
+  delete [] imageData;
+  return result;
+}
diff --git a/gazebo/physics/HeightmapShape.hh b/gazebo/physics/HeightmapShape.hh
index 6388b7b..f33a6c7 100644
--- a/gazebo/physics/HeightmapShape.hh
+++ b/gazebo/physics/HeightmapShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,10 +25,14 @@
 #include <string>
 #include <vector>
 
-#include "gazebo/common/Image.hh"
+#include "gazebo/common/ImageHeightmap.hh"
+#include "gazebo/common/HeightmapData.hh"
+#include "gazebo/common/Dem.hh"
 #include "gazebo/math/Vector3.hh"
+#include "gazebo/transport/TransportTypes.hh"
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/physics/Shape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -41,7 +45,7 @@ namespace gazebo
     /// \brief HeightmapShape collision shape builds a heightmap from
     /// an image.  The supplied image must be square with
     /// N*N+1 pixels per side, where N is an integer.
-    class HeightmapShape : public Shape
+    class GAZEBO_VISIBLE HeightmapShape : public Shape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent Collision object.
@@ -57,6 +61,10 @@ namespace gazebo
       /// \brief Initialize the heightmap.
       public: virtual void Init();
 
+      /// \brief Set the scale of the heightmap shape.
+      /// \param[in] _scale Scale to set the heightmap shape to.
+      public: virtual void SetScale(const math::Vector3 &_scale);
+
       /// \brief Get the URI of the heightmap image.
       /// \return The heightmap image URI.
       public: std::string GetURI() const;
@@ -79,7 +87,7 @@ namespace gazebo
       /// \param[in] _x X position.
       /// \param[in] _y Y position.
       /// \return The height at a the specified location.
-      public: float GetHeight(int _x, int _y);
+      public: float GetHeight(int _x, int _y) const;
 
       /// \brief Fill a geometry message with this shape's data.
       /// \param[in] _msg Message to fill.
@@ -101,23 +109,72 @@ namespace gazebo
       /// \return Amount of subsampling.
       public: int GetSubSampling() const;
 
-      /// \brief Create a lookup table of the terrain's height.
-      private: void FillHeightMap();
+      /// \brief Return an image representation of the heightmap.
+      /// \return Image where white pixels represents the highest locations,
+      /// and black pixels the lowest.
+      public: common::Image GetImage() const;
+
+      /// \brief Load a terrain file specified by _filename. The terrain file
+      /// format might be an image or a DEM file. libgdal is required to enable
+      /// DEM support. For a list of all raster formats supported you can type
+      /// the command "gdalinfo --formats".
+      /// \param[in] _filename The path to the terrain file.
+      /// \return 0 when the operation succeeds to load a file or -1 when fails.
+      private: int LoadTerrainFile(const std::string &_filename);
+
+      #ifdef HAVE_GDAL
+      /// \brief Load a DEM specified by _filename as a terrain file.
+      /// \param[in] _filename The path to the terrain file.
+      /// \return 0 when the operation succeeds to load a file or -1 when fails.
+      private: int LoadDEMAsTerrain(const std::string &_filename);
+      #endif
+
+      /// \brief Load an image specified by _filename as a terrain file.
+      /// \param[in] _filename The path to the terrain file.
+      /// \return 0 when the operation succeeds to load a file or -1 when fails.
+      private: int LoadImageAsTerrain(const std::string &_filename);
+
+      /// \brief Handle request messages.
+      /// \param[in] _msg The request message.
+      private: void OnRequest(ConstRequestPtr &_msg);
 
       /// \brief Lookup table of heights.
       protected: std::vector<float> heights;
 
       /// \brief Image used to generate the heights.
-      protected: common::Image img;
+      protected: common::ImageHeightmap img;
+
+      /// \brief HeightmapData used to generate the heights.
+      protected: common::HeightmapData *heightmapData;
 
       /// \brief Size of the height lookup table.
       protected: unsigned int vertSize;
 
-      /// \brief Scaling factor.
-      protected: math::Vector3 scale;
+      /// \brief True to flip the heights along the y direction.
+      protected: bool flipY;
 
-      /// \brief Level of subsampling.
+      /// \brief The amount of subsampling. Default is 2.
       protected: int subSampling;
+
+      /// \brief Transportation node.
+      private: transport::NodePtr node;
+
+      /// \brief Subscriber to request messages.
+      private: transport::SubscriberPtr requestSub;
+
+      /// \brief Publisher for request response messages.
+      private: transport::PublisherPtr responsePub;
+
+      /// \brief File format of the heightmap
+      private: std::string fileFormat;
+
+      /// \brief Terrain size
+      private: math::Vector3 heightmapSize;
+
+      #ifdef HAVE_GDAL
+      /// \brief DEM used to generate the heights.
+      private: common::Dem dem;
+      #endif
     };
     /// \}
   }
diff --git a/gazebo/physics/Hinge2Joint.hh b/gazebo/physics/Hinge2Joint.hh
index 61b7ffb..0ad6537 100644
--- a/gazebo/physics/Hinge2Joint.hh
+++ b/gazebo/physics/Hinge2Joint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,9 +22,12 @@
 #ifndef _HINGE2JOINT_HH_
 #define _HINGE2JOINT_HH_
 
+#include <sdf/sdf.hh>
+
 #include "gazebo/math/Angle.hh"
 #include "gazebo/math/Vector3.hh"
 #include "gazebo/physics/Joint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,7 +39,7 @@ namespace gazebo
     /// \class Hinge2Joint Hinge2Joint.hh physics/physics.hh
     /// \brief A two axis hinge joint
     template< class T>
-    class Hinge2Joint : public T
+    class GAZEBO_VISIBLE Hinge2Joint : public T
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent link.
@@ -47,7 +50,7 @@ namespace gazebo
       public: virtual ~Hinge2Joint()
               { }
 
-      /// \interal
+      // Documentation inherited.
       public: virtual unsigned int GetAngleCount() const
               {return 2;}
 
@@ -58,10 +61,10 @@ namespace gazebo
                 T::Load(_sdf);
 
                 this->SetAxis(0,
-                    _sdf->GetElement("axis")->GetValueVector3("xyz"));
+                    _sdf->GetElement("axis")->Get<math::Vector3>("xyz"));
 
                 this->SetAxis(1,
-                    _sdf->GetElement("axis2")->GetValueVector3("xyz"));
+                    _sdf->GetElement("axis2")->Get<math::Vector3>("xyz"));
               }
     };
     /// \}
diff --git a/gazebo/physics/HingeJoint.hh b/gazebo/physics/HingeJoint.hh
index afe16cf..2d17fcf 100644
--- a/gazebo/physics/HingeJoint.hh
+++ b/gazebo/physics/HingeJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
 
 #include "gazebo/math/Angle.hh"
 #include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
     /// \class HingeJoint HingeJoint.hh physics/physics.hh
     /// \brief A single axis hinge joint
     template<class T>
-    class HingeJoint : public T
+    class GAZEBO_VISIBLE HingeJoint : public T
     {
       /// \brief Constructor
       /// \param[in] _parent Parent link
@@ -45,7 +46,7 @@ namespace gazebo
       public: virtual ~HingeJoint()
               { }
 
-      /// \interal
+      // Documentation inherited.
       public: virtual unsigned int GetAngleCount() const
               {return 1;}
 
diff --git a/gazebo/physics/Inertial.cc b/gazebo/physics/Inertial.cc
index fd349df..09a745d 100644
--- a/gazebo/physics/Inertial.cc
+++ b/gazebo/physics/Inertial.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,6 @@
  * limitations under the License.
  *
 */
-#include "sdf/sdf.hh"
 #include "Inertial.hh"
 
 using namespace gazebo;
@@ -32,7 +31,7 @@ Inertial::Inertial()
   if (!this->sdfInertial)
   {
     this->sdfInertial.reset(new sdf::Element);
-    sdf::initFile("inertial.sdf", this->sdfInertial);
+    initFile("inertial.sdf", this->sdfInertial);
   }
 
   // This is the only time this->sdfInertial should be used.
@@ -43,7 +42,7 @@ Inertial::Inertial()
 Inertial::Inertial(double _m)
 {
   this->sdf.reset(new sdf::Element);
-  sdf::initFile("inertial.sdf", this->sdf);
+  initFile("inertial.sdf", this->sdf);
 
   this->mass = _m;
   this->cog.Set(0, 0, 0, 0, 0, 0);
@@ -55,7 +54,7 @@ Inertial::Inertial(double _m)
 Inertial::Inertial(const Inertial &_inertial)
 {
   this->sdf.reset(new sdf::Element);
-  sdf::initFile("inertial.sdf", this->sdf);
+  initFile("inertial.sdf", this->sdf);
 
   (*this) = _inertial;
 }
@@ -78,7 +77,7 @@ void Inertial::UpdateParameters(sdf::ElementPtr _sdf)
   this->sdf = _sdf;
 
   // use default pose (identity) if not specified in sdf
-  math::Pose pose = this->sdf->GetValuePose("pose");
+  math::Pose pose = this->sdf->Get<math::Pose>("pose");
   this->SetCoG(pose);
 
   // if (this->sdf->HasElement("inertia"))
@@ -87,12 +86,12 @@ void Inertial::UpdateParameters(sdf::ElementPtr _sdf)
   {
     sdf::ElementPtr inertiaElem = this->sdf->GetElement("inertia");
     this->SetInertiaMatrix(
-        inertiaElem->GetValueDouble("ixx"),
-        inertiaElem->GetValueDouble("iyy"),
-        inertiaElem->GetValueDouble("izz"),
-        inertiaElem->GetValueDouble("ixy"),
-        inertiaElem->GetValueDouble("ixz"),
-        inertiaElem->GetValueDouble("iyz"));
+        inertiaElem->Get<double>("ixx"),
+        inertiaElem->Get<double>("iyy"),
+        inertiaElem->Get<double>("izz"),
+        inertiaElem->Get<double>("ixy"),
+        inertiaElem->Get<double>("ixz"),
+        inertiaElem->Get<double>("iyz"));
 
     inertiaElem->GetElement("ixx")->GetValue()->SetUpdateFunc(
         boost::bind(&Inertial::GetIXX, this));
@@ -108,7 +107,7 @@ void Inertial::UpdateParameters(sdf::ElementPtr _sdf)
         boost::bind(&Inertial::GetIYZ, this));
   }
 
-  this->SetMass(this->sdf->GetValueDouble("mass"));
+  this->SetMass(this->sdf->Get<double>("mass"));
   this->sdf->GetElement("mass")->GetValue()->SetUpdateFunc(
       boost::bind(&Inertial::GetMass, this));
 }
@@ -133,16 +132,16 @@ void Inertial::Reset()
 {
   sdf::ElementPtr inertiaElem = this->sdf->GetElement("inertia");
 
-  this->mass = this->sdf->GetValueDouble("mass");
+  this->mass = this->sdf->Get<double>("mass");
   this->cog.Set(0, 0, 0, 0, 0, 0);
   this->SetInertiaMatrix(
-        inertiaElem->GetValueDouble("ixx"),
-        inertiaElem->GetValueDouble("iyy"),
-        inertiaElem->GetValueDouble("izz"),
+        inertiaElem->Get<double>("ixx"),
+        inertiaElem->Get<double>("iyy"),
+        inertiaElem->Get<double>("izz"),
 
-        inertiaElem->GetValueDouble("ixy"),
-        inertiaElem->GetValueDouble("ixz"),
-        inertiaElem->GetValueDouble("iyz"));
+        inertiaElem->Get<double>("ixy"),
+        inertiaElem->Get<double>("ixz"),
+        inertiaElem->Get<double>("iyz"));
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/physics/Inertial.hh b/gazebo/physics/Inertial.hh
index e636a9a..d640f97 100644
--- a/gazebo/physics/Inertial.hh
+++ b/gazebo/physics/Inertial.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,11 +19,13 @@
 
 #include <string>
 
+#include <sdf/sdf.hh>
+
 #include "gazebo/msgs/msgs.hh"
-#include "gazebo/sdf/sdf.hh"
 #include "gazebo/math/Quaternion.hh"
 #include "gazebo/math/Vector3.hh"
 #include "gazebo/math/Matrix3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +36,7 @@ namespace gazebo
 
     /// \class Inertial Inertial.hh physics/physics.hh
     /// \brief A class for inertial information about a link
-    class Inertial
+    class GAZEBO_VISIBLE Inertial
     {
       /// \brief Default Constructor
       public: Inertial();
diff --git a/gazebo/physics/Inertial_TEST.cc b/gazebo/physics/Inertial_TEST.cc
index f2a65cc..ae746ef 100644
--- a/gazebo/physics/Inertial_TEST.cc
+++ b/gazebo/physics/Inertial_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@ class Inertial_TEST : public ServerFixture
 TEST_F(Inertial_TEST, InertialWorld)
 {
   // Load our inertial test world
-  Load("worlds/Inertial_TEST.world", true);
+  Load("worlds/inertial_test.world", true);
 
   // Get a pointer to the world, make sure world loads
   physics::WorldPtr world = physics::get_world("default");
@@ -47,7 +47,7 @@ TEST_F(Inertial_TEST, InertialWorld)
   physics->SetGravity(math::Vector3(0, 0, -50));
 
   // simulate 1 step
-  world->StepWorld(1);
+  world->Step(1);
   double t = world->GetSimTime().Double();
 
   // get time step size
diff --git a/gazebo/physics/Joint.cc b/gazebo/physics/Joint.cc
index b11f9e7..54723e3 100644
--- a/gazebo/physics/Joint.cc
+++ b/gazebo/physics/Joint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,14 +14,12 @@
  * limitations under the License.
  *
 */
-/* Desc: The base joint class
- * Author: Nate Koenig, Andrew Howard
- * Date: 21 May 2003
- */
-
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Publisher.hh"
 
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/sensors/SensorsIface.hh"
+
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Events.hh"
@@ -36,35 +34,53 @@
 using namespace gazebo;
 using namespace physics;
 
+sdf::ElementPtr Joint::sdfJoint;
+
 //////////////////////////////////////////////////
 Joint::Joint(BasePtr _parent)
   : Base(_parent)
 {
   this->AddType(Base::JOINT);
-  this->forceApplied[0] = 0;
-  this->forceApplied[1] = 0;
   this->effortLimit[0] = -1;
   this->effortLimit[1] = -1;
   this->velocityLimit[0] = -1;
   this->velocityLimit[1] = -1;
-  this->useCFMDamping = false;
   this->lowerLimit[0] = -1e16;
   this->lowerLimit[1] = -1e16;
   this->upperLimit[0] =  1e16;
   this->upperLimit[1] =  1e16;
-  this->inertiaRatio[0] = 0;
-  this->inertiaRatio[1] = 0;
+  this->dissipationCoefficient[0] = 0;
+  this->dissipationCoefficient[1] = 0;
+  this->stiffnessCoefficient[0] = 0;
+  this->stiffnessCoefficient[1] = 0;
+  this->springReferencePosition[0] = 0;
+  this->springReferencePosition[1] = 0;
+  this->provideFeedback = false;
+  this->stopStiffness[0] = 1e8;
+  this->stopDissipation[0] = 1.0;
+  this->stopStiffness[1] = 1e8;
+  this->stopDissipation[1] = 1.0;
+  // these flags are related to issue #494
+  // set default to true for backward compatibility
+  this->axisParentModelFrame[0] = true;
+  this->axisParentModelFrame[1] = true;
+
+  if (!this->sdfJoint)
+  {
+    this->sdfJoint.reset(new sdf::Element);
+    sdf::initFile("joint.sdf", this->sdfJoint);
+  }
 }
 
 //////////////////////////////////////////////////
 Joint::~Joint()
 {
-}
-
-//////////////////////////////////////////////////
-void Joint::Load(LinkPtr _parent, LinkPtr _child, const math::Vector3 &_pos)
-{
-  this->Load(_parent, _child, math::Pose(_pos, math::Quaternion()));
+  for (std::vector<std::string>::iterator iter = this->sensors.begin();
+      iter != this->sensors.end(); ++iter)
+  {
+    sensors::remove_sensor(*iter);
+  }
+  this->sensors.clear();
 }
 
 //////////////////////////////////////////////////
@@ -88,7 +104,7 @@ void Joint::Load(LinkPtr _parent, LinkPtr _child, const math::Pose &_pose)
 
   // Joint is loaded without sdf from a model
   // Initialize this->sdf so it can be used for data storage
-  sdf::initFile("joint.sdf", this->sdf);
+  this->sdf = this->sdfJoint->Clone();
 
   this->LoadImpl(_pose);
 }
@@ -98,14 +114,78 @@ void Joint::Load(sdf::ElementPtr _sdf)
 {
   Base::Load(_sdf);
 
+  // Joint force and torque feedback
+  if (_sdf->HasElement("physics"))
+  {
+    sdf::ElementPtr physicsElem = _sdf->GetElement("physics");
+    if (physicsElem->HasElement("provide_feedback"))
+    {
+      this->SetProvideFeedback(physicsElem->Get<bool>("provide_feedback"));
+    }
+  }
+
+  if (_sdf->HasElement("axis"))
+  {
+    sdf::ElementPtr axisElem = _sdf->GetElement("axis");
+    {
+      std::string param = "use_parent_model_frame";
+      // Check if "use_parent_model_frame" element exists.
+      // It has `required=1`, so if it does not exist, then SDF is old,
+      // and we should assume support for backwards compatibility
+      if (axisElem->HasElement(param))
+      {
+        this->axisParentModelFrame[0] = axisElem->Get<bool>(param);
+      }
+    }
+    if (axisElem->HasElement("limit"))
+    {
+      sdf::ElementPtr limitElem = axisElem->GetElement("limit");
+
+      // store upper and lower joint limits
+      this->upperLimit[0] = limitElem->Get<double>("upper");
+      this->lowerLimit[0] = limitElem->Get<double>("lower");
+      // store joint stop stiffness and dissipation coefficients
+      this->stopStiffness[0] = limitElem->Get<double>("stiffness");
+      this->stopDissipation[0] = limitElem->Get<double>("dissipation");
+      // store joint effort and velocity limits
+      this->effortLimit[0] = limitElem->Get<double>("effort");
+      this->velocityLimit[0] = limitElem->Get<double>("velocity");
+    }
+  }
+  if (_sdf->HasElement("axis2"))
+  {
+    sdf::ElementPtr axisElem = _sdf->GetElement("axis2");
+    {
+      std::string param = "use_parent_model_frame";
+      if (axisElem->HasElement(param))
+      {
+        this->axisParentModelFrame[1] = axisElem->Get<bool>(param);
+      }
+    }
+    if (axisElem->HasElement("limit"))
+    {
+      sdf::ElementPtr limitElem = axisElem->GetElement("limit");
+
+      // store upper and lower joint limits
+      this->upperLimit[1] = limitElem->Get<double>("upper");
+      this->lowerLimit[1] = limitElem->Get<double>("lower");
+      // store joint stop stiffness and dissipation coefficients
+      this->stopStiffness[1] = limitElem->Get<double>("stiffness");
+      this->stopDissipation[1] = limitElem->Get<double>("dissipation");
+      // store joint effort and velocity limits
+      this->effortLimit[1] = limitElem->Get<double>("effort");
+      this->velocityLimit[1] = limitElem->Get<double>("velocity");
+    }
+  }
+
   sdf::ElementPtr parentElem = _sdf->GetElement("parent");
   sdf::ElementPtr childElem = _sdf->GetElement("child");
 
   GZ_ASSERT(parentElem, "Parent element is NULL");
   GZ_ASSERT(childElem, "Child element is NULL");
 
-  std::string parentName = parentElem->GetValueString("link_name");
-  std::string childName = childElem->GetValueString("link_name");
+  std::string parentName = parentElem->Get<std::string>();
+  std::string childName = childElem->Get<std::string>();
 
   if (this->model)
   {
@@ -127,143 +207,155 @@ void Joint::Load(sdf::ElementPtr _sdf)
   if (!this->childLink && childName != std::string("world"))
     gzthrow("Couldn't Find Child Link[" + childName  + "]");
 
-  this->anchorPose = _sdf->GetValuePose("pose");
-  this->LoadImpl(this->anchorPose);
-}
-
-/////////////////////////////////////////////////
-void Joint::LoadImpl(const math::Vector3 &_pos)
-{
-  this->LoadImpl(math::Pose(_pos, math::Quaternion()));
+  this->LoadImpl(_sdf->Get<math::Pose>("pose"));
 }
 
 /////////////////////////////////////////////////
 void Joint::LoadImpl(const math::Pose &_pose)
 {
+  this->anchorPose = _pose;
+
   BasePtr myBase = shared_from_this();
 
   if (this->parentLink)
     this->parentLink->AddChildJoint(boost::static_pointer_cast<Joint>(myBase));
-  else if (this->childLink)
+
+  if (this->childLink)
     this->childLink->AddParentJoint(boost::static_pointer_cast<Joint>(myBase));
-  else
+
+  if (!this->parentLink && !this->childLink)
     gzthrow("both parent and child link do no exist");
 
   // setting anchor relative to gazebo child link frame position
-  if (this->childLink)
-    this->anchorPos = (_pose + this->childLink->GetWorldPose()).pos;
-  // otherwise set anchor relative to world frame
+  math::Pose worldPose = this->GetWorldPose();
+  this->anchorPos = worldPose.pos;
+
+  // Compute anchor pose relative to parent frame.
+  if (this->parentLink)
+    this->parentAnchorPose = worldPose - this->parentLink->GetWorldPose();
   else
-    this->anchorPos = _pose.pos;
+    this->parentAnchorPose = worldPose;
+
+  if (this->sdf->HasElement("sensor"))
+  {
+    sdf::ElementPtr sensorElem = this->sdf->GetElement("sensor");
+    while (sensorElem)
+    {
+      /// \todo This if statement is a hack to prevent Joints from creating
+      /// other sensors. We should make this more generic.
+      if (sensorElem->Get<std::string>("type") == "force_torque")
+      {
+        std::string sensorName =
+          sensors::create_sensor(sensorElem, this->GetWorld()->GetName(),
+              this->GetScopedName(), this->GetId());
+        this->sensors.push_back(sensorName);
+      }
+      else
+        gzerr << "A joint cannot load a [" <<
+          sensorElem->Get<std::string>("type") << "] sensor.\n";
+      sensorElem = sensorElem->GetNextElement("sensor");
+    }
+  }
 }
 
 //////////////////////////////////////////////////
 void Joint::Init()
 {
-  this->Attach(this->parentLink, this->childLink);
+  try
+  {
+    this->Attach(this->parentLink, this->childLink);
+  }
+  catch(...)
+  {
+    gzerr << "Attach joint failed" << std::endl;
+    return;
+  }
 
   // Set the anchor vector
   this->SetAnchor(0, this->anchorPos);
 
-  if (this->sdf->HasElement("axis"))
+  if (this->GetAngleCount() >= 1 && this->sdf->HasElement("axis"))
   {
     sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
-    this->SetAxis(0, axisElem->GetValueVector3("xyz"));
+    this->SetAxis(0, axisElem->Get<math::Vector3>("xyz"));
     if (axisElem->HasElement("limit"))
     {
       sdf::ElementPtr limitElem = axisElem->GetElement("limit");
 
-      // store upper and lower joint limits
-      this->upperLimit[0] = limitElem->GetValueDouble("upper");
-      this->lowerLimit[0] = limitElem->GetValueDouble("lower");
-
       // Perform this three step ordering to ensure the
       // parameters are set properly.
       // This is taken from the ODE wiki.
       this->SetHighStop(0, this->upperLimit[0].Radian());
       this->SetLowStop(0, this->lowerLimit[0].Radian());
       this->SetHighStop(0, this->upperLimit[0].Radian());
-
-      this->effortLimit[0] = limitElem->GetValueDouble("effort");
-      this->velocityLimit[0] = limitElem->GetValueDouble("velocity");
     }
   }
 
-  if (this->sdf->HasElement("axis2"))
+  if (this->GetAngleCount() >= 2 && this->sdf->HasElement("axis2"))
   {
     sdf::ElementPtr axisElem = this->sdf->GetElement("axis2");
-    this->SetAxis(1, axisElem->GetValueVector3("xyz"));
+    this->SetAxis(1, axisElem->Get<math::Vector3>("xyz"));
     if (axisElem->HasElement("limit"))
     {
       sdf::ElementPtr limitElem = axisElem->GetElement("limit");
 
-      // store upper and lower joint limits
-      this->upperLimit[1] = limitElem->GetValueDouble("upper");
-      this->lowerLimit[1] = limitElem->GetValueDouble("lower");
-
       // Perform this three step ordering to ensure the
       // parameters  are set properly.
       // This is taken from the ODE wiki.
       this->SetHighStop(1, this->upperLimit[1].Radian());
       this->SetLowStop(1, this->lowerLimit[1].Radian());
       this->SetHighStop(1, this->upperLimit[1].Radian());
-
-      this->effortLimit[1] = limitElem->GetValueDouble("effort");
-      this->velocityLimit[1] = limitElem->GetValueDouble("velocity");
     }
   }
 
-  if (this->parentLink)
-  {
-    math::Pose modelPose = this->parentLink->GetModel()->GetWorldPose();
-
-    // Set joint axis
-    if (this->sdf->HasElement("axis"))
-    {
-      this->SetAxis(0, modelPose.rot.RotateVector(
-            this->sdf->GetElement("axis")->GetValueVector3("xyz")));
-    }
+  // Set parent name: if parentLink is NULL, it's name be the world
+  if (!this->parentLink)
+    this->sdf->GetElement("parent")->Set("world");
+}
 
-    if (this->sdf->HasElement("axis2"))
-    {
-      this->SetAxis(1, modelPose.rot.RotateVector(
-            this->sdf->GetElement("axis2")->GetValueVector3("xyz")));
-    }
-  }
-  else
+//////////////////////////////////////////////////
+void Joint::Fini()
+{
+  for (std::vector<std::string>::iterator iter = this->sensors.begin();
+      iter != this->sensors.end(); ++iter)
   {
-    // if parentLink is NULL, it's name be the world
-    this->sdf->GetElement("parent")->GetElement("link_name")->Set("world");
-    if (this->sdf->HasElement("axis"))
-    {
-      this->SetAxis(0, this->sdf->GetElement("axis")->GetValueVector3("xyz"));
-    }
-    if (this->sdf->HasElement("axis2"))
-    {
-      this->SetAxis(1, this->sdf->GetElement("axis2")->GetValueVector3("xyz"));
-    }
+    sensors::remove_sensor(*iter);
   }
-  this->ComputeInertiaRatio();
+  this->sensors.clear();
+
+  Base::Fini();
 }
 
 //////////////////////////////////////////////////
-math::Vector3 Joint::GetLocalAxis(int _index) const
+math::Vector3 Joint::GetLocalAxis(unsigned int _index) const
 {
   math::Vector3 vec;
 
   if (_index == 0 && this->sdf->HasElement("axis"))
-    vec = this->sdf->GetElement("axis")->GetValueVector3("xyz");
+    vec = this->sdf->GetElement("axis")->Get<math::Vector3>("xyz");
   else if (this->sdf->HasElement("axis2"))
-    vec = this->sdf->GetElement("axis2")->GetValueVector3("xyz");
+    vec = this->sdf->GetElement("axis2")->Get<math::Vector3>("xyz");
   // vec = this->childLink->GetWorldPose().rot.RotateVectorReverse(vec);
   // vec.Round();
   return vec;
 }
 
 //////////////////////////////////////////////////
-double Joint::GetEffortLimit(int _index)
+void Joint::SetEffortLimit(unsigned int _index, double _effort)
 {
-  if (_index >= 0 && static_cast<unsigned int>(_index) < this->GetAngleCount())
+  if (_index < this->GetAngleCount())
+  {
+    this->effortLimit[_index] = _effort;
+    return;
+  }
+
+  gzerr << "SetEffortLimit index[" << _index << "] out of range" << std::endl;
+}
+
+//////////////////////////////////////////////////
+double Joint::GetEffortLimit(unsigned int _index)
+{
+  if (_index < this->GetAngleCount())
     return this->effortLimit[_index];
 
   gzerr << "GetEffortLimit index[" << _index << "] out of range\n";
@@ -271,9 +363,9 @@ double Joint::GetEffortLimit(int _index)
 }
 
 //////////////////////////////////////////////////
-double Joint::GetVelocityLimit(int _index)
+double Joint::GetVelocityLimit(unsigned int _index)
 {
-  if (_index >= 0 && static_cast<unsigned int>(_index) < this->GetAngleCount())
+  if (_index < this->GetAngleCount())
     return this->velocityLimit[_index];
 
   gzerr << "GetVelocityLimit index[" << _index << "] out of range\n";
@@ -339,19 +431,17 @@ LinkPtr Joint::GetParent() const
 void Joint::FillMsg(msgs::Joint &_msg)
 {
   _msg.set_name(this->GetScopedName());
+  _msg.set_id(this->GetId());
 
   msgs::Set(_msg.mutable_pose(), this->anchorPose);
 
   if (this->HasType(Base::HINGE_JOINT))
   {
     _msg.set_type(msgs::Joint::REVOLUTE);
-    _msg.add_angle(this->GetAngle(0).Radian());
   }
   else if (this->HasType(Base::HINGE2_JOINT))
   {
     _msg.set_type(msgs::Joint::REVOLUTE2);
-    _msg.add_angle(this->GetAngle(0).Radian());
-    _msg.add_angle(this->GetAngle(1).Radian());
   }
   else if (this->HasType(Base::BALL_JOINT))
   {
@@ -360,41 +450,80 @@ void Joint::FillMsg(msgs::Joint &_msg)
   else if (this->HasType(Base::SLIDER_JOINT))
   {
     _msg.set_type(msgs::Joint::PRISMATIC);
-    _msg.add_angle(this->GetAngle(0).Radian());
   }
   else if (this->HasType(Base::SCREW_JOINT))
   {
     _msg.set_type(msgs::Joint::SCREW);
-    _msg.add_angle(this->GetAngle(0).Radian());
+  }
+  else if (this->HasType(Base::GEARBOX_JOINT))
+  {
+    _msg.set_type(msgs::Joint::GEARBOX);
   }
   else if (this->HasType(Base::UNIVERSAL_JOINT))
   {
     _msg.set_type(msgs::Joint::UNIVERSAL);
-    _msg.add_angle(this->GetAngle(0).Radian());
-    _msg.add_angle(this->GetAngle(1).Radian());
   }
 
-  msgs::Set(_msg.mutable_axis1()->mutable_xyz(), this->GetLocalAxis(0));
-  _msg.mutable_axis1()->set_limit_lower(0);
-  _msg.mutable_axis1()->set_limit_upper(0);
-  _msg.mutable_axis1()->set_limit_effort(0);
-  _msg.mutable_axis1()->set_limit_velocity(0);
-  _msg.mutable_axis1()->set_damping(0);
-  _msg.mutable_axis1()->set_friction(0);
+  for (unsigned int i = 0; i < this->GetAngleCount(); ++i)
+  {
+    _msg.add_angle(this->GetAngle(i).Radian());
+    msgs::Axis *axis;
+    if (i == 0)
+      axis = _msg.mutable_axis1();
+    else if (i == 1)
+      axis = _msg.mutable_axis2();
+    else
+      break;
+
+    msgs::Set(axis->mutable_xyz(), this->GetLocalAxis(i));
+    axis->set_limit_lower(this->GetLowStop(i).Radian());
+    axis->set_limit_upper(this->GetHighStop(i).Radian());
+    axis->set_limit_effort(this->GetEffortLimit(i));
+    axis->set_limit_velocity(this->GetVelocityLimit(i));
+    axis->set_damping(this->GetDamping(i));
+    axis->set_friction(0);
+  }
 
   if (this->GetParent())
+  {
     _msg.set_parent(this->GetParent()->GetScopedName());
+    _msg.set_parent_id(this->GetParent()->GetId());
+  }
   else
+  {
     _msg.set_parent("world");
+    _msg.set_parent_id(0);
+  }
 
   if (this->GetChild())
+  {
     _msg.set_child(this->GetChild()->GetScopedName());
+    _msg.set_child_id(this->GetChild()->GetId());
+  }
   else
+  {
     _msg.set_child("world");
+    _msg.set_parent_id(0);
+  }
+
+  for (std::vector<std::string>::iterator iter = this->sensors.begin();
+       iter != this->sensors.end(); ++iter)
+  {
+    sensors::SensorPtr sensor = sensors::get_sensor(*iter);
+    if (sensor)
+    {
+      msgs::Sensor *sensorMsg =_msg.add_sensor();
+      sensor->FillMsg(*sensorMsg);
+    }
+    else
+    {
+      gzlog << "Joint::FillMsg: sensor [" << *iter << "] not found.\n";
+    }
+  }
 }
 
 //////////////////////////////////////////////////
-math::Angle Joint::GetAngle(int _index) const
+math::Angle Joint::GetAngle(unsigned int _index) const
 {
   if (this->model->IsStatic())
     return this->staticAngle;
@@ -403,172 +532,429 @@ math::Angle Joint::GetAngle(int _index) const
 }
 
 //////////////////////////////////////////////////
-void Joint::SetHighStop(int _index, const math::Angle &_angle)
+bool Joint::SetHighStop(unsigned int _index, const math::Angle &_angle)
+{
+  this->SetUpperLimit(_index, _angle);
+  // switch below to return this->SetUpperLimit when we implement
+  // issue #1108
+  return true;
+}
+
+//////////////////////////////////////////////////
+bool Joint::SetLowStop(unsigned int _index, const math::Angle &_angle)
 {
-  GZ_ASSERT(this->sdf != NULL, "Joint sdf member is NULL");
+  this->SetLowerLimit(_index, _angle);
+  // switch below to return this->SetLowerLimit when we implement
+  // issue #1108
+  return true;
+}
+
+//////////////////////////////////////////////////
+void Joint::SetAngle(unsigned int _index, math::Angle _angle)
+{
+  if (this->model->IsStatic())
+    this->staticAngle = _angle;
+  else
+    this->model->SetJointPosition(
+      this->GetScopedName(), _angle.Radian(), _index);
+}
+
+//////////////////////////////////////////////////
+void Joint::SetState(const JointState &_state)
+{
+  this->SetMaxForce(0, 0);
+  this->SetVelocity(0, 0);
+  for (unsigned int i = 0; i < _state.GetAngleCount(); ++i)
+    this->SetAngle(i, _state.GetAngle(i));
+}
+
+//////////////////////////////////////////////////
+double Joint::CheckAndTruncateForce(unsigned int _index, double _effort)
+{
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "Calling Joint::SetForce with an index ["
+          << _index << "] out of range\n";
+    return _effort;
+  }
+
+  // truncating SetForce effort if velocity limit is reached and
+  // effort is applied in the same direction.
+  if (this->velocityLimit[_index] >= 0)
+  {
+    if (this->GetVelocity(_index) > this->velocityLimit[_index])
+      _effort = _effort > 0 ? 0 : _effort;
+    else if (this->GetVelocity(_index) < -this->velocityLimit[_index])
+      _effort = _effort < 0 ? 0 : _effort;
+  }
+
+  // truncate effort if effortLimit is not negative
+  if (this->effortLimit[_index] >= 0.0)
+    _effort = math::clamp(_effort, -this->effortLimit[_index],
+      this->effortLimit[_index]);
+
+  return _effort;
+}
+
+//////////////////////////////////////////////////
+double Joint::GetForce(unsigned int /*_index*/)
+{
+  gzerr << "Joint::GetForce should be overloaded by physics engines.\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+double Joint::GetDampingCoefficient() const
+{
+  gzerr << "Joint::GetDampingCoefficient() is deprecated, please switch "
+        << "to Joint::GetDamping(index)\n";
+  return this->dissipationCoefficient[0];
+}
+
+//////////////////////////////////////////////////
+void Joint::ApplyDamping()
+{
+  gzerr << "Joint::ApplyDamping deprecated by Joint::ApplyStiffnessDamping.\n";
+  this->ApplyStiffnessDamping();
+}
+
+//////////////////////////////////////////////////
+void Joint::ApplyStiffnessDamping()
+{
+  gzerr << "Joint::ApplyStiffnessDamping should be overloaded by "
+        << "physics engines.\n";
+}
+
+//////////////////////////////////////////////////
+double Joint::GetInertiaRatio(const math::Vector3 &_axis) const
+{
+  if (this->parentLink && this->childLink)
+  {
+    math::Matrix3 pm = this->parentLink->GetWorldInertiaMatrix();
+    math::Matrix3 cm = this->childLink->GetWorldInertiaMatrix();
+
+    // matrix times axis
+    math::Vector3 pia = pm * _axis;
+    math::Vector3 cia = cm * _axis;
+    double piam = pia.GetLength();
+    double ciam = cia.GetLength();
+
+    // return ratio of child MOI to parent MOI.
+    if (!math::equal(piam, 0.0))
+    {
+      return ciam/piam;
+    }
+    else
+    {
+      gzerr << "Parent MOI is zero, ratio is not well defined.\n";
+      return 0;
+    }
+  }
+  else
+  {
+    gzerr << "Either parent or child link is missing or static, "
+          << "cannot compute inertia ratio.  Returning 0.\n";
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+double Joint::GetInertiaRatio(const unsigned int _index) const
+{
+  if (this->parentLink && this->childLink)
+  {
+    if (_index < this->GetAngleCount())
+    {
+      // joint axis in global frame
+      math::Vector3 axis = this->GetGlobalAxis(_index);
+
+      // compute ratio about axis
+      return this->GetInertiaRatio(axis);
+    }
+    else
+    {
+      gzerr << "Invalid joint index [" << _index
+            << "] when trying to get inertia ratio across joint.\n";
+      return 0;
+    }
+  }
+  else
+  {
+    gzerr << "Either parent or child link is missing or static, "
+          << "cannot compute inertia ratio.  Returning 0.\n";
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+double Joint::GetDamping(unsigned int _index)
+{
+  if (_index < this->GetAngleCount())
+  {
+    return this->dissipationCoefficient[_index];
+  }
+  else
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get damping coefficient.\n";
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+double Joint::GetStiffness(unsigned int _index)
+{
+  if (static_cast<unsigned int>(_index) < this->GetAngleCount())
+  {
+    return this->stiffnessCoefficient[_index];
+  }
+  else
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get stiffness coefficient.\n";
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+double Joint::GetSpringReferencePosition(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+  {
+    return this->springReferencePosition[_index];
+  }
+  else
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get spring reference position.\n";
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle Joint::GetLowerLimit(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+    return this->lowerLimit[_index];
+
+  gzwarn << "requesting lower limit of joint index out of bound\n";
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+math::Angle Joint::GetUpperLimit(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+    return this->upperLimit[_index];
+
+  gzwarn << "requesting upper limit of joint index out of bound\n";
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+void Joint::SetLowerLimit(unsigned int _index, math::Angle _limit)
+{
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "SetLowerLimit for index [" << _index
+          << "] out of bounds [" << this->GetAngleCount()
+          << "]\n";
+    return;
+  }
+
   if (_index == 0)
   {
-    this->sdf->GetElement("axis")->GetElement("limit")
-             ->GetElement("upper")->Set(_angle.Radian());
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
+    sdf::ElementPtr limitElem = axisElem->GetElement("limit");
+
+    // store lower joint limits
+    this->lowerLimit[_index] = _limit;
+    limitElem->GetElement("lower")->Set(_limit.Radian());
   }
   else if (_index == 1)
   {
-    this->sdf->GetElement("axis2")->GetElement("limit")
-             ->GetElement("upper")->Set(_angle.Radian());
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis2");
+    sdf::ElementPtr limitElem = axisElem->GetElement("limit");
+
+    // store lower joint limits
+    this->lowerLimit[_index] = _limit;
+    limitElem->GetElement("lower")->Set(_limit.Radian());
   }
   else
   {
-    gzerr << "Invalid joint index [" << _index
-          << "] when trying to set high stop\n";
+    gzwarn << "SetLowerLimit for joint [" << this->GetName()
+           << "] index [" << _index
+           << "] not supported\n";
   }
 }
 
 //////////////////////////////////////////////////
-void Joint::SetLowStop(int _index, const math::Angle &_angle)
+void Joint::SetUpperLimit(unsigned int _index, math::Angle _limit)
 {
-  GZ_ASSERT(this->sdf != NULL, "Joint sdf member is NULL");
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "SetUpperLimit for index [" << _index
+          << "] out of bounds [" << this->GetAngleCount()
+          << "]\n";
+    return;
+  }
+
   if (_index == 0)
   {
-    this->sdf->GetElement("axis")->GetElement("limit")
-             ->GetElement("lower")->Set(_angle.Radian());
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
+    sdf::ElementPtr limitElem = axisElem->GetElement("limit");
+
+    // store upper joint limits
+    this->upperLimit[_index] = _limit;
+    limitElem->GetElement("upper")->Set(_limit.Radian());
   }
   else if (_index == 1)
   {
-    this->sdf->GetElement("axis2")->GetElement("limit")
-             ->GetElement("lower")->Set(_angle.Radian());
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis2");
+    sdf::ElementPtr limitElem = axisElem->GetElement("limit");
+
+    // store upper joint limits
+    this->upperLimit[_index] = _limit;
+    limitElem->GetElement("upper")->Set(_limit.Radian());
   }
   else
   {
-    gzerr << "Invalid joint index [" << _index
-          << "] when trying to set low stop\n";
+    gzwarn << "SetUpperLimit for joint [" << this->GetName()
+           << "] index [" << _index
+           << "] not supported\n";
   }
 }
 
 //////////////////////////////////////////////////
-void Joint::SetAngle(int /*index*/, math::Angle _angle)
+void Joint::SetProvideFeedback(bool _enable)
 {
-  if (this->model->IsStatic())
-    this->staticAngle = _angle;
+  this->provideFeedback = _enable;
+}
+
+//////////////////////////////////////////////////
+void Joint::SetStopStiffness(unsigned int _index, double _stiffness)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->stopStiffness[_index] = _stiffness;
+  }
   else
-    this->model->SetJointPosition(this->GetScopedName(), _angle.Radian());
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to set joint stop stiffness.\n";
+  }
 }
 
 //////////////////////////////////////////////////
-void Joint::SetState(const JointState &_state)
+void Joint::SetStopDissipation(unsigned int _index, double _dissipation)
 {
-  this->SetMaxForce(0, 0);
-  this->SetVelocity(0, 0);
-  for (unsigned int i = 0; i < _state.GetAngleCount(); ++i)
-    this->SetAngle(i, _state.GetAngle(i));
+  if (_index < this->GetAngleCount())
+  {
+    this->stopDissipation[_index] = _dissipation;
+  }
+  else
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to set joint stop dissipation.\n";
+  }
 }
 
 //////////////////////////////////////////////////
-void Joint::SetForce(int _index, double _force)
+double Joint::GetStopStiffness(unsigned int _index) const
 {
-  // this bit of code actually doesn't do anything physical,
-  // it simply records the forces commanded inside forceApplied.
-  if (_index >= 0 && static_cast<unsigned int>(_index) < this->GetAngleCount())
-    this->forceApplied[_index] = _force;
+  if (_index < this->GetAngleCount())
+  {
+    return this->stopStiffness[_index];
+  }
   else
-    gzerr << "Something's wrong, joint [" << this->GetName()
-          << "] index [" << _index
-          << "] out of range.\n";
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get joint stop stiffness.\n";
+    return 0;
+  }
 }
 
 //////////////////////////////////////////////////
-double Joint::GetForce(unsigned int _index)
+double Joint::GetStopDissipation(unsigned int _index) const
 {
   if (_index < this->GetAngleCount())
   {
-    return this->forceApplied[_index];
+    return this->stopDissipation[_index];
   }
   else
   {
     gzerr << "Invalid joint index [" << _index
-          << "] when trying to get force\n";
+          << "] when trying to get joint stop dissipation.\n";
     return 0;
   }
 }
 
 //////////////////////////////////////////////////
-double Joint::GetForce(int _index)
+math::Pose Joint::GetInitialAnchorPose() const
 {
-  return this->GetForce(static_cast<unsigned int>(_index));
+  return this->anchorPose;
 }
 
 //////////////////////////////////////////////////
-void Joint::ApplyDamping()
+math::Pose Joint::GetWorldPose() const
 {
-  double dampingForce = -this->dampingCoefficient * this->GetVelocity(0);
-  this->SetForce(0, dampingForce);
+  if (this->childLink)
+    return this->anchorPose + this->childLink->GetWorldPose();
+  return this->anchorPose;
 }
 
 //////////////////////////////////////////////////
-void Joint::ComputeInertiaRatio()
+math::Pose Joint::GetParentWorldPose() const
 {
-  for (unsigned int i = 0; i < this->GetAngleCount(); ++i)
-  {
-    math::Vector3 axis = this->GetGlobalAxis(i);
-    if (this->parentLink && this->childLink)
-    {
-      physics::InertialPtr pi = this->parentLink->GetInertial();
-      physics::InertialPtr ci = this->childLink->GetInertial();
-      math::Matrix3 pm(
-       pi->GetIXX(), pi->GetIXY(), pi->GetIXZ(),
-       pi->GetIXY(), pi->GetIYY(), pi->GetIYZ(),
-       pi->GetIXZ(), pi->GetIYZ(), pi->GetIZZ());
-      math::Matrix3 cm(
-       ci->GetIXX(), ci->GetIXY(), ci->GetIXZ(),
-       ci->GetIXY(), ci->GetIYY(), ci->GetIYZ(),
-       ci->GetIXZ(), ci->GetIYZ(), ci->GetIZZ());
-
-      // rotate pm and cm into inertia frame
-      math::Pose pPose = this->parentLink->GetWorldPose();
-      math::Pose cPose = this->childLink->GetWorldPose();
-      for (unsigned col = 0; col < 3; ++col)
-      {
-        // get each column, and inverse rotate by pose
-        math::Vector3 pmCol(pm[0][col], pm[1][col], pm[2][col]);
-        pmCol = pPose.rot.RotateVector(pmCol);
-        pm.SetCol(col, pmCol);
-        math::Vector3 cmCol(cm[0][col], cm[1][col], cm[2][col]);
-        cmCol = pPose.rot.RotateVector(cmCol);
-        cm.SetCol(col, cmCol);
-      }
+  if (this->parentLink)
+    return this->parentAnchorPose + this->parentLink->GetWorldPose();
+  return this->parentAnchorPose;
+}
 
-      // matrix times axis
-      // \todo: add operator in Matrix3 class so we can do Matrix3 * Vector3
-      math::Vector3 pia(
-        pm[0][0] * axis.x + pm[0][1] * axis.y + pm[0][2] * axis.z,
-        pm[1][0] * axis.x + pm[1][1] * axis.y + pm[1][2] * axis.z,
-        pm[2][0] * axis.x + pm[2][1] * axis.y + pm[2][2] * axis.z);
-      math::Vector3 cia(
-        cm[0][0] * axis.x + cm[0][1] * axis.y + cm[0][2] * axis.z,
-        cm[1][0] * axis.x + cm[1][1] * axis.y + cm[1][2] * axis.z,
-        cm[2][0] * axis.x + cm[2][1] * axis.y + cm[2][2] * axis.z);
-      double piam = pia.GetLength();
-      double ciam = cia.GetLength();
-
-      // should we flip? sure, so the measure of ratio is between [1, +inf]
-      if (piam > ciam)
-        this->inertiaRatio[i] = piam/ciam;
-      else
-        this->inertiaRatio[i] = ciam/piam;
-    }
-  }
+//////////////////////////////////////////////////
+math::Pose Joint::GetAnchorErrorPose() const
+{
+  return this->GetWorldPose() - this->GetParentWorldPose();
 }
 
 //////////////////////////////////////////////////
-double Joint::GetInertiaRatio(unsigned int _index) const
+math::Quaternion Joint::GetAxisFrame(unsigned int _index) const
 {
-  if (_index < this->GetAngleCount())
+  if (_index >= this->GetAngleCount())
   {
-    return this->inertiaRatio[_index];
+    gzerr << "GetAxisFrame error, _index[" << _index << "] out of range"
+          << std::endl;
+    return math::Quaternion();
   }
-  else
+
+  // Legacy support for specifying axis in parent model frame (#494)
+  if (this->axisParentModelFrame[_index])
   {
-    gzerr << "Invalid joint index [" << _index
-          << "] when trying to get inertia ratio across joint.\n";
+    // Use parent model frame
+    if (this->parentLink)
+      return this->parentLink->GetModel()->GetWorldPose().rot;
+
+    // Parent model is world, use world frame
+    return math::Quaternion();
+  }
+
+  return this->GetWorldPose().rot;
+}
+
+//////////////////////////////////////////////////
+double Joint::GetWorldEnergyPotentialSpring(unsigned int _index) const
+{
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "Get spring potential error, _index[" << _index
+          << "] out of range" << std::endl;
     return 0;
   }
+
+  // compute potential energy due to spring compression
+  // 1/2 k x^2
+  double k = this->stiffnessCoefficient[_index];
+  double x = this->GetAngle(_index).Radian() -
+    this->springReferencePosition[_index];
+  return 0.5 * k * x * x;
 }
diff --git a/gazebo/physics/Joint.hh b/gazebo/physics/Joint.hh
index 73420c9..c24860c 100644
--- a/gazebo/physics/Joint.hh
+++ b/gazebo/physics/Joint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,11 @@
  * limitations under the License.
  *
 */
-/* Desc: The base joint class
- * Author: Nate Koenig, Andrew Howard
- * Date: 21 May 2003
- */
-
-#ifndef _JOINT_HH_
-#define _JOINT_HH_
+#ifndef _GAZEBO_JOINT_HH_
+#define _GAZEBO_JOINT_HH_
 
 #include <string>
+#include <vector>
 
 #include <boost/any.hpp>
 
@@ -35,6 +31,7 @@
 #include "gazebo/physics/JointState.hh"
 #include "gazebo/physics/Base.hh"
 #include "gazebo/physics/JointWrench.hh"
+#include "gazebo/util/system.hh"
 
 /// \brief maximum number of axis per joint anticipated.
 /// Currently, this is 2 as 3-axis joints (e.g. ball)
@@ -50,7 +47,7 @@ namespace gazebo
 
     /// \class Joint Joint.hh physics/physics.hh
     /// \brief Base class for all joints
-    class Joint : public Base
+    class GAZEBO_VISIBLE Joint : public Base
     {
       /// \enum Attribute
       /// \brief Joint attribute types.
@@ -104,16 +101,6 @@ namespace gazebo
       public: void Load(LinkPtr _parent, LinkPtr _child,
                         const math::Pose &_pose);
 
-      /// \brief Set parent and child links of a physics::Joint and its
-      /// anchor offset position.
-      /// This funciton is deprecated, use
-      /// Load(LinkPtr _parent, LinkPtr _child, const math::Pose &_pose)
-      /// \param[in] _parent Parent link.
-      /// \param[in] _child Child link.
-      /// \param[in] _pos Joint Anchor offset from child link.
-      public: void Load(LinkPtr _parent, LinkPtr _child,
-                        const math::Vector3 &_pos) GAZEBO_DEPRECATED(1.5);
-
       /// \brief Load physics::Joint from a SDF sdf::Element.
       /// \param[in] _sdf SDF values to load from.
       public: virtual void Load(sdf::ElementPtr _sdf);
@@ -121,6 +108,9 @@ namespace gazebo
       /// \brief Initialize a joint.
       public: virtual void Init();
 
+      /// \brief Finialize the object
+      public: virtual void Fini();
+
       /// \brief Update the joint.
       public: void Update();
 
@@ -144,7 +134,7 @@ namespace gazebo
       /// \param[in] _index Index of the link to retreive.
       /// \return Pointer to the request link. NULL if the index was
       /// invalid.
-      public: virtual LinkPtr GetJointLink(int _index) const = 0;
+      public: virtual LinkPtr GetJointLink(unsigned int _index) const = 0;
 
       /// \brief Determines of the two bodies are connected by a joint.
       /// \param[in] _one First link.
@@ -160,19 +150,64 @@ namespace gazebo
       /// \brief Detach this joint from all links.
       public: virtual void Detach();
 
-      /// \brief Set the axis of rotation.
+      /// \brief Set the axis of rotation where axis is specified in local
+      /// joint frame.
       /// \param[in] _index Index of the axis to set.
-      /// \param[in] _axis Vector in world frame of axis direction
+      /// \param[in] _axis Vector in local joint frame of axis direction
       ///                  (must have length greater than zero).
-      public: virtual void SetAxis(int _index, const math::Vector3 &_axis) = 0;
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis) = 0;
 
       /// \brief Set the joint damping.
-      /// \param[in] _index Index of the axis to set.
+      /// \param[in] _index Index of the axis to set, currently ignored, to be
+      ///                   implemented.
       /// \param[in] _damping Damping value for the axis.
-      public: virtual void SetDamping(int _index, double _damping) = 0;
+      public: virtual void SetDamping(unsigned int _index, double _damping) = 0;
+
+      /// \brief Returns the current joint damping coefficient.
+      /// \param[in] _index Index of the axis to get, currently ignored, to be
+      ///                   implemented.
+      /// \return Joint viscous damping coefficient for this joint.
+      public: double GetDamping(unsigned int _index);
 
       /// \brief Callback to apply damping force to joint.
-      public: virtual void ApplyDamping();
+      /// Deprecated by ApplySpringStiffnessDamping.
+      public: virtual void ApplyDamping() GAZEBO_DEPRECATED(3.0);
+
+      /// \brief Callback to apply spring stiffness and viscous damping
+      /// effects to joint.
+      /// \TODO: rename to ApplySpringStiffnessDamping()
+      public: virtual void ApplyStiffnessDamping();
+
+      /// \brief Set the joint spring stiffness.
+      /// \param[in] _index Index of the axis to set, currently ignored, to be
+      ///                   implemented.
+      /// \param[in] _stiffness Stiffness value for the axis.
+      /// \param[in] _reference Spring zero load reference position.
+      /// \TODO: rename to SetSpringStiffnessDamping()
+      public: virtual void SetStiffnessDamping(unsigned int _index,
+        double _stiffness, double _damping, double _reference = 0) = 0;
+
+      /// \brief Set the joint spring stiffness.
+      /// \param[in] _index Index of the axis to set, currently ignored, to be
+      ///                   implemented.
+      /// \param[in] _stiffness Spring stiffness value for the axis.
+      /// \TODO: rename to SetSpringStiffness()
+      public: virtual void SetStiffness(unsigned int _index,
+                                        double _stiffness) = 0;
+
+      /// \brief Returns the current joint spring stiffness coefficient.
+      /// \param[in] _index Index of the axis to get, currently ignored, to be
+      ///                   implemented.
+      /// \return Joint spring stiffness coefficient for this joint.
+      /// \TODO: rename to GetSpringStiffness()
+      public: double GetStiffness(unsigned int _index);
+
+      /// \brief Get joint spring reference position.
+      /// \param[in] _index Index of the axis to get.
+      /// \return Joint spring reference position
+      /// (in radians for angular joints).
+      public: double GetSpringReferencePosition(unsigned int _index) const;
 
       /// \brief Connect a boost::slot the the joint update signal.
       /// \param[in] _subscriber Callback for the connection.
@@ -189,34 +224,35 @@ namespace gazebo
       /// \brief Get the axis of rotation.
       /// \param[in] _index Index of the axis to get.
       /// \return Axis value for the provided index.
-      public: math::Vector3 GetLocalAxis(int _index) const;
+      public: math::Vector3 GetLocalAxis(unsigned int _index) const;
 
       /// \brief Get the axis of rotation in global cooridnate frame.
       /// \param[in] _index Index of the axis to get.
       /// \return Axis value for the provided index.
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const = 0;
+      public: virtual math::Vector3 GetGlobalAxis(
+                  unsigned int _index) const = 0;
 
       /// \brief Set the anchor point.
       /// \param[in] _index Indx of the axis.
       /// \param[in] _anchor Anchor value.
-      public: virtual void SetAnchor(int _index,
+      public: virtual void SetAnchor(unsigned int _index,
                                      const math::Vector3 &_anchor) = 0;
 
       /// \brief Get the anchor point.
       /// \param[in] _index Index of the axis.
       /// \return Anchor value for the axis.
-      public: virtual math::Vector3 GetAnchor(int _index) const = 0;
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const = 0;
 
       /// \brief Set the high stop of an axis(index).
       /// \param[in] _index Index of the axis.
       /// \param[in] _angle High stop angle.
-      public: virtual void SetHighStop(int _index,
+      public: virtual bool SetHighStop(unsigned int _index,
                                        const math::Angle &_angle);
 
       /// \brief Set the low stop of an axis(index).
       /// \param[in] _index Index of the axis.
       /// \param[in] _angle Low stop angle.
-      public: virtual void SetLowStop(int _index,
+      public: virtual bool SetLowStop(unsigned int _index,
                                       const math::Angle &_angle);
 
       /// \brief Get the high stop of an axis(index).
@@ -225,7 +261,7 @@ namespace gazebo
       /// use GetAttribute(hi_stop, _index)
       /// \param[in] _index Index of the axis.
       /// \return Angle of the high stop value.
-      public: virtual math::Angle GetHighStop(int _index) = 0;
+      public: virtual math::Angle GetHighStop(unsigned int _index) = 0;
 
       /// \brief Get the low stop of an axis(index).
       /// This function is replaced by GetLowerLimit(unsigned int).
@@ -233,103 +269,100 @@ namespace gazebo
       /// use GetAttribute(hi_stop, _index)
       /// \param[in] _index Index of the axis.
       /// \return Angle of the low stop value.
-      public: virtual math::Angle GetLowStop(int _index) = 0;
+      public: virtual math::Angle GetLowStop(unsigned int _index) = 0;
 
       /// \brief Get the effort limit on axis(index).
       /// \param[in] _index Index of axis, where 0=first axis and 1=second axis
       /// \return Effort limit specified in SDF
-      public: virtual double GetEffortLimit(int _index);
+      public: virtual double GetEffortLimit(unsigned int _index);
+
+      /// \brief Set the effort limit on a joint axis.
+      /// \param[in] _index Index of the axis to set.
+      /// \param[in] _effort Effort limit for the axis.
+      public: virtual void SetEffortLimit(unsigned int _index, double _effort);
 
       /// \brief Get the velocity limit on axis(index).
       /// \param[in] _index Index of axis, where 0=first axis and 1=second axis
       /// \return Velocity limit specified in SDF
-      public: virtual double GetVelocityLimit(int _index);
+      public: virtual double GetVelocityLimit(unsigned int _index);
 
       /// \brief Set the velocity of an axis(index).
       /// \param[in] _index Index of the axis.
       /// \param[in] _vel Velocity.
-      public: virtual void SetVelocity(int _index, double _vel) = 0;
+      public: virtual void SetVelocity(unsigned int _index, double _vel) = 0;
 
       /// \brief Get the rotation rate of an axis(index)
       /// \param[in] _index Index of the axis.
       /// \return The rotaional velocity of the joint axis.
-      public: virtual double GetVelocity(int _index) const = 0;
+      public: virtual double GetVelocity(unsigned int _index) const = 0;
 
       /// \brief Set the force applied to this physics::Joint.
       /// Note that the unit of force should be consistent with the rest
-      /// of the simulation scales.  E.g.  if you are using
-      /// metric units, the unit for force is Newtons.  If using
-      /// imperial units (sorry), then unit of force is lb-force
-      /// not (lb-mass), etc.
+      /// of the simulation scales.  Force is additive (multiple calls
+      /// to SetForce to the same joint in the same time
+      /// step will accumulate forces on that Joint).
+      /// Forces are truncated by effortLimit before applied.
       /// \param[in] _index Index of the axis.
-      /// \param[in] _force Force value.
-      public: virtual void SetForce(int _index, double _force);
+      /// \param[in] _effort Force value.
+      public: virtual void SetForce(unsigned int _index, double _effort) = 0;
 
-      /// \brief @todo: not yet implemented.
-      /// Get the forces applied at this Joint.
-      /// Note that the unit of force should be consistent with the rest
-      /// of the simulation scales.  E.g.  if you are using
-      /// metric units, the unit for force is Newtons.  If using
-      /// imperial units (sorry), then unit of force is lb-force
-      /// not (lb-mass), etc.
+      /// \brief check if the force against velocityLimit and effortLimit,
+      /// truncate if necessary.
       /// \param[in] _index Index of the axis.
-      /// \return The force applied to an axis.
-      public: virtual double GetForce(int _index) GAZEBO_DEPRECATED(1.5);
+      /// \param[in] _effort Force value.
+      /// \return truncated effort
+      public: double CheckAndTruncateForce(unsigned int _index, double _effort);
 
       /// \brief @todo: not yet implemented.
-      /// Get the forces applied at this Joint.
+      /// Get external forces applied at this Joint.
       /// Note that the unit of force should be consistent with the rest
-      /// of the simulation scales.  E.g.  if you are using
-      /// metric units, the unit for force is Newtons.  If using
-      /// imperial units (sorry), then unit of force is lb-force
-      /// not (lb-mass), etc.
+      /// of the simulation scales.
       /// \param[in] _index Index of the axis.
       /// \return The force applied to an axis.
       public: virtual double GetForce(unsigned int _index);
 
-      /// \brief get internal force and torque values at a joint
-      /// Note that you must set
-      ///   <provide_feedback>true<provide_feedback>
-      /// in the joint sdf to use this.
-      /// \param[in] _index Force and torque on child link if _index = 0
-      /// and on parent link of _index = 1
-      /// \return The force and torque at the joint
-      public: virtual JointWrench GetForceTorque(int _index)
-        GAZEBO_DEPRECATED(1.5) = 0;
-
-      /// \brief get internal force and torque values at a joint
-      /// Note that you must set
-      ///   <provide_feedback>true<provide_feedback>
-      /// in the joint sdf to use this.
-      /// \param[in] _index Force and torque on child link if _index = 0
-      /// and on parent link of _index = 1
-      /// \return The force and torque at the joint
+      /// \brief get internal force and torque values at a joint.
+      ///
+      ///   The force and torque values are returned in  a JointWrench
+      ///   data structure.  Where JointWrench.body1Force contains the
+      ///   force applied by the parent Link on the Joint specified in
+      ///   the parent Link frame, and JointWrench.body2Force contains
+      ///   the force applied by the child Link on the Joint specified
+      ///   in the child Link frame.  Note that this sign convention
+      ///   is opposite of the reaction forces of the Joint on the Links.
+      ///
+      ///   FIXME TODO: change name of this function to something like:
+      ///     GetNegatedForceTorqueInLinkFrame
+      ///   and make GetForceTorque call return non-negated reaction forces
+      ///   in perspective Link frames.
+      ///
+      ///   Note that for ODE you must set
+      ///     <provide_feedback>true<provide_feedback>
+      ///   in the joint sdf to use this.
+      ///
+      /// \param[in] _index Not used right now
+      /// \return The force and torque at the joint, see above for details
+      /// on conventions.
       public: virtual JointWrench GetForceTorque(unsigned int _index) = 0;
 
       /// \brief Set the max allowed force of an axis(index).
       /// Note that the unit of force should be consistent with the rest
-      /// of the simulation scales.  E.g.  if you are using
-      /// metric units, the unit for force is Newtons.  If using
-      /// imperial units (sorry), then unit of force is lb-force
-      /// not (lb-mass), etc.
+      /// of the simulation scales.
       /// \param[in] _index Index of the axis.
       /// \param[in] _force Maximum force that can be applied to the axis.
-      public: virtual void SetMaxForce(int _index, double _force) = 0;
+      public: virtual void SetMaxForce(unsigned int _index, double _force) = 0;
 
       /// \brief Get the max allowed force of an axis(index).
       /// Note that the unit of force should be consistent with the rest
-      /// of the simulation scales.  E.g.  if you are using
-      /// metric units, the unit for force is Newtons.  If using
-      /// imperial units (sorry), then unit of force is lb-force
-      /// not (lb-mass), etc.
+      /// of the simulation scales.
       /// \param[in] _index Index of the axis.
       /// \return The maximum force.
-      public: virtual double GetMaxForce(int _index) = 0;
+      public: virtual double GetMaxForce(unsigned int _index) = 0;
 
       /// \brief Get the angle of rotation of an axis(index)
       /// \param[in] _index Index of the axis.
       /// \return Angle of the axis.
-      public: math::Angle GetAngle(int _index) const;
+      public: math::Angle GetAngle(unsigned int _index) const;
 
       /// \brief Get the angle count.
       /// \return The number of DOF for the joint.
@@ -344,15 +377,12 @@ namespace gazebo
       /// by calling JointController::SetJointPosition.
       /// \param[in] _index Index of the axis.
       /// \param[in] _angle Angle to set the joint to.
-      public: void SetAngle(int _index, math::Angle _angle);
+      public: void SetAngle(unsigned int _index, math::Angle _angle);
 
       /// \brief Get the forces applied to the center of mass of a physics::Link
       /// due to the existence of this Joint.
       /// Note that the unit of force should be consistent with the rest
-      /// of the simulation scales.  E.g.  if you are using
-      /// metric units, the unit for force is Newtons.  If using
-      /// imperial units (sorry), then unit of force is lb-force
-      /// not (lb-mass), etc.
+      /// of the simulation scales.
       /// \param[in] index The index of the link(0 or 1).
       /// \return Force applied to the link.
       public: virtual math::Vector3 GetLinkForce(unsigned int _index) const = 0;
@@ -360,10 +390,7 @@ namespace gazebo
       /// \brief Get the torque applied to the center of mass of a physics::Link
       /// due to the existence of this Joint.
       /// Note that the unit of torque should be consistent with the rest
-      /// of the simulation scales.  E.g.  if you are using
-      /// metric units, the unit for force is Newtons-Meters.  If using
-      /// imperial units (sorry), then unit of force is lb-force-inches
-      /// not (lb-mass-inches), etc.
+      /// of the simulation scales.
       /// \param[in] index The index of the link(0 or 1)
       /// \return Torque applied to the link.
       public: virtual math::Vector3 GetLinkTorque(
@@ -374,15 +401,33 @@ namespace gazebo
       /// \param[in] _key String key.
       /// \param[in] _index Index of the axis.
       /// \param[in] _value Value of the attribute.
-      public: virtual void SetAttribute(const std::string &_key, int _index,
-                                        const boost::any &_value) = 0;
+      public: virtual bool SetParam(const std::string &_key,
+                                    unsigned int _index,
+                                    const boost::any &_value) = 0;
 
-      /// \brief Get a non-generic parameter for the joint.
+      /// \brief Set a non-generic parameter for the joint.
+      /// replaces SetAttribute(Attribute, int, double)
+      /// Deprecated by bool SetParam
       /// \param[in] _key String key.
       /// \param[in] _index Index of the axis.
       /// \param[in] _value Value of the attribute.
+      public: virtual void SetAttribute(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value)
+                                        GAZEBO_DEPRECATED(3.0) = 0;
+
+      /// \brief Get a non-generic parameter for the joint.
+      /// \param[in] _key String key.
+      /// \param[in] _index Index of the axis.
+      public: virtual double GetParam(const std::string &_key,
+                                          unsigned int _index) = 0;
+
+      /// \brief Get a non-generic parameter for the joint.
+      /// Deprecated by GetParam
+      /// \param[in] _key String key.
+      /// \param[in] _index Index of the axis.
       public: virtual double GetAttribute(const std::string &_key,
-                                                unsigned int _index) = 0;
+                unsigned int _index) GAZEBO_DEPRECATED(3.0) = 0;
 
       /// \brief Get the child link
       /// \return Pointer to the child link.
@@ -396,56 +441,130 @@ namespace gazebo
       /// \param[out] _msg Message to fill with this joint's properties.
       public: void FillMsg(msgs::Joint &_msg);
 
-      /// \brief Accessor to inertia ratio across this joint.
-      /// \param[in] _index Joint axis index.
-      /// \return returns the inertia ratio across specified joint axis.
-      public: double GetInertiaRatio(unsigned int _index) const;
+      /// \brief Computes moment of inertia (MOI) across a specified joint axis.
+      /// The ratio is given in the form of MOI_chidl / MOI_parent.
+      /// If MOI_parent is zero, this funciton will return 0.
+      /// The inertia ratio for each joint axis indicates the sensitivity
+      /// of the joint to actuation torques.
+      /// \param[in] _index axis number about which MOI ratio is computed.
+      /// \return ratio of child MOI to parent MOI.
+      public: double GetInertiaRatio(const unsigned int _index) const;
+
+      /// \brief Computes moment of inertia (MOI) across an arbitrary axis
+      /// specified in the world frame.
+      /// The ratio is given in the form of MOI_chidl / MOI_parent.
+      /// If MOI_parent is zero, this funciton will return 0.
+      /// The moment of inertia ratio along constrained directions of a joint
+      /// has an impact on the performance of Projected Gauss Seidel (PGS)
+      /// iterative LCP methods.
+      /// \param[in] _axis axis in world frame for which MOI ratio is computed.
+      /// \return ratio of child MOI to parent MOI.
+      public: double GetInertiaRatio(const math::Vector3 &_axis) const;
 
       /// \brief:  get the joint upper limit
       /// (replaces GetLowStop and GetHighStop)
       /// \param[in] _index Index of the axis.
-      /// \return Upper limit of the axis.
-      public: math::Angle GetLowerLimit(unsigned int _index) const
-        {
-          if (_index < this->GetAngleCount())
-            return this->lowerLimit[_index];
-
-          gzwarn << "requesting lower limit of joint index out of bound\n";
-          return math::Angle();
-        }
+      /// \return Lower limit of the axis.
+      public: math::Angle GetLowerLimit(unsigned int _index) const;
 
       /// \brief:  get the joint lower limit
       /// (replacee GetLowStop and GetHighStop)
       /// \param[in] _index Index of the axis.
       /// \return Upper limit of the axis.
-      public: math::Angle GetUpperLimit(unsigned int _index) const
-        {
-          if (_index < this->GetAngleCount())
-            return this->upperLimit[_index];
+      public: math::Angle GetUpperLimit(unsigned int _index) const;
 
-          gzwarn << "requesting upper limit of joint index out of bound\n";
-          return math::Angle();
-        }
+      /// \brief:  set the joint upper limit
+      /// (replaces SetLowStop and SetHighStop)
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _limit Lower limit of the axis.
+      public: void SetLowerLimit(unsigned int _index, math::Angle _limit);
+
+      /// \brief:  set the joint lower limit
+      /// (replacee GetLowStop and GetHighStop)
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _limit Upper limit of the axis.
+      public: void SetUpperLimit(unsigned int _index, math::Angle _limit);
+
+      /// \brief Set whether the joint should generate feedback.
+      /// \param[in] _enable True to enable joint feedback.
+      public: virtual void SetProvideFeedback(bool _enable);
+
+      /// \brief Cache Joint Force Torque Values if necessary for physics engine
+      public: virtual void CacheForceTorque() { }
+
+      /// \brief Get damping coefficient of this joint
+      /// Depreated, use GetDamping(_index) instead.
+      /// \return viscous joint damping coefficient
+      public: double GetDampingCoefficient() const GAZEBO_DEPRECATED(3.0);
+
+      /// \brief Set joint stop stiffness.
+      /// \param[in] _index joint axis index.
+      /// \param[in] _stiffness joint stop stiffness coefficient.
+      public: void SetStopStiffness(unsigned int _index, double _stiffness);
+
+      /// \brief Set joint stop dissipation.
+      /// \param[in] _index joint axis index.
+      /// \param[in] _dissipation joint stop dissipation coefficient.
+      public: void SetStopDissipation(unsigned int _index, double _dissipation);
+
+      /// \brief Get joint stop stiffness.
+      /// \param[in] _index joint axis index.
+      /// \return joint stop stiffness coefficient.
+      public: double GetStopStiffness(unsigned int _index) const;
+
+      /// \brief Get joint stop dissipation.
+      /// \param[in] _index joint axis index.
+      /// \return joint stop dissipation coefficient.
+      public: double GetStopDissipation(unsigned int _index) const;
+
+      /// \brief Get initial Anchor Pose specified by model
+      /// <joint><pose>...</pose></joint>
+      /// \return Joint::anchorPose, initial joint anchor pose.
+      public: math::Pose GetInitialAnchorPose() const;
+
+      /// \brief Get pose of joint frame relative to world frame.
+      /// Note that the joint frame is defined with a fixed offset from
+      /// the child link frame.
+      /// \return Pose of joint frame relative to world frame.
+      public: math::Pose GetWorldPose() const;
+
+      /// \brief Get anchor pose on parent link relative to world frame.
+      /// When there is zero joint error, this should match the value
+      /// returned by Joint::GetWorldPose() for the constrained degrees
+      /// of freedom.
+      /// \return Anchor pose on parent link in world frame.
+      public: math::Pose GetParentWorldPose() const;
+
+      /// \brief Get pose offset between anchor pose on child and parent,
+      /// expressed in the parent link frame. This can be used to compute
+      /// the bilateral constraint error.
+      /// \return Pose offset between anchor pose on child and parent,
+      /// in parent link frame.
+      public: math::Pose GetAnchorErrorPose() const;
+
+      /// \brief Get orientation of reference frame for specified axis,
+      /// relative to world frame. The value of axisParentModelFrame
+      /// is used to determine the appropriate frame.
+      /// \param[in] _index joint axis index.
+      /// \return Orientation of axis frame relative to world frame.
+      public: math::Quaternion GetAxisFrame(unsigned int _index) const;
+
+      /// \brief Returns this joint's spring potential energy,
+      /// based on the reference position of the spring.
+      /// If using metric system, the unit of energy will be Joules.
+      /// \return this joint's spring potential energy,
+      public: double GetWorldEnergyPotentialSpring(unsigned int _index) const;
 
       /// \brief Get the angle of an axis helper function.
       /// \param[in] _index Index of the axis.
       /// \return Angle of the axis.
-      protected: virtual math::Angle GetAngleImpl(int _index) const = 0;
+      protected: virtual math::Angle GetAngleImpl(
+                     unsigned int _index) const = 0;
 
       /// \brief Helper function to load a joint.
       /// \param[in] _pose Pose of the anchor.
       private: void LoadImpl(const math::Pose &_pose);
 
-      /// \brief Helper function to load a joint.
-      /// This function is deprecated, use LoadImpl(math::Pose &)
-      /// \param[in] _pos Position of the anchor.
-      private: void LoadImpl(const math::Vector3 &_pos) GAZEBO_DEPRECATED(1.5);
-
-      /// \brief Computes inertiaRatio for this joint during Joint::Init
-      /// The inertia ratio for each joint between [1, +inf] gives a sense
-      /// of how well this model will perform in iterative LCP methods.
-      private: void ComputeInertiaRatio();
-
       /// \brief The first link this joint connects to
       protected: LinkPtr childLink;
 
@@ -466,45 +585,76 @@ namespace gazebo
       /// we do need this (e.g. GetForceTorque and joint visualization).
       protected: math::Pose anchorPose;
 
+      /// \brief Anchor pose relative to parent link frame.
+      protected: math::Pose parentAnchorPose;
+
       /// \brief Anchor link.
       protected: LinkPtr anchorLink;
 
-      /// \brief Joint update event.
-      private: event::EventT<void ()> jointUpdate;
-
-      /// \brief joint dampingCoefficient
+      /// \brief joint dissipationCoefficient
+      /// Deprecated: not used, replaced by dissipationCoefficient array
       protected: double dampingCoefficient;
 
-      /// \brief Angle used when the joint is paret of a static model.
-      private: math::Angle staticAngle;
+      /// \brief joint viscous damping coefficient
+      /// Replaces dampingCoefficient
+      protected: double dissipationCoefficient[MAX_JOINT_AXIS];
+
+      /// \brief joint stiffnessCoefficient
+      protected: double stiffnessCoefficient[MAX_JOINT_AXIS];
+
+      /// \brief joint spring reference (zero load) position
+      protected: double springReferencePosition[MAX_JOINT_AXIS];
 
       /// \brief apply damping for adding viscous damping forces on updates
       protected: gazebo::event::ConnectionPtr applyDamping;
 
-      /// \brief Save force applied by user
-      /// This plus the joint feedback (joint contstraint forces) is the
-      /// equivalent of simulated force torque sensor reading
-      /// Allocate a 2 vector in case hinge2 joint is used.
-      protected: double forceApplied[MAX_JOINT_AXIS];
-
       /// \brief Store Joint effort limit as specified in SDF
       protected: double effortLimit[MAX_JOINT_AXIS];
 
       /// \brief Store Joint velocity limit as specified in SDF
       protected: double velocityLimit[MAX_JOINT_AXIS];
 
-      /// \brief Store Joint inertia ratio.  This is a measure of how well
-      /// this model behaves using interative LCP solvers.
-      protected: double inertiaRatio[MAX_JOINT_AXIS];
-
       /// \brief Store Joint position lower limit as specified in SDF
       protected: math::Angle lowerLimit[MAX_JOINT_AXIS];
 
       /// \brief Store Joint position upper limit as specified in SDF
       protected: math::Angle upperLimit[MAX_JOINT_AXIS];
 
-      /// \brief option to use CFM damping
+      /// \brief Cache Joint force torque values in case physics engine
+      /// clears them at the end of update step.
+      protected: JointWrench wrench;
+
+      /// \brief option to use implicit damping
+      /// Deprecated, pushing this flag into individual physics engine,
+      /// for example: ODEJoint::useImplicitSpringDamper.
       protected: bool useCFMDamping;
+
+      /// \brief Flags that are set to true if an axis value is expressed
+      /// in the parent model frame. Otherwise use the joint frame.
+      /// See issue #494.
+      protected: bool axisParentModelFrame[MAX_JOINT_AXIS];
+
+      /// \brief An SDF pointer that allows us to only read the joint.sdf
+      /// file once, which in turns limits disk reads.
+      private: static sdf::ElementPtr sdfJoint;
+
+      /// \brief Provide Feedback data for contact forces
+      protected: bool provideFeedback;
+
+      /// \brief Names of all the sensors attached to the link.
+      private: std::vector<std::string> sensors;
+
+      /// \brief Joint update event.
+      private: event::EventT<void ()> jointUpdate;
+
+      /// \brief Angle used when the joint is parent of a static model.
+      private: math::Angle staticAngle;
+
+      /// \brief Joint stop stiffness
+      private: double stopStiffness[MAX_JOINT_AXIS];
+
+      /// \brief Joint stop dissipation
+      private: double stopDissipation[MAX_JOINT_AXIS];
     };
     /// \}
   }
diff --git a/gazebo/physics/JointController.cc b/gazebo/physics/JointController.cc
index 59767fd..48f6e3a 100644
--- a/gazebo/physics/JointController.cc
+++ b/gazebo/physics/JointController.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,54 +15,75 @@
  *
 */
 
-#include "transport/Node.hh"
-#include "transport/Subscriber.hh"
-#include "physics/Model.hh"
-#include "physics/World.hh"
-#include "physics/Joint.hh"
-#include "physics/Link.hh"
-#include "physics/JointController.hh"
-#include "physics/PhysicsEngine.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Subscriber.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Joint.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
+
+#include "gazebo/physics/JointControllerPrivate.hh"
+#include "gazebo/physics/JointController.hh"
 
 using namespace gazebo;
 using namespace physics;
 
 /////////////////////////////////////////////////
 JointController::JointController(ModelPtr _model)
-  : model(_model)
+  : dataPtr(new JointControllerPrivate)
 {
-  this->node = transport::NodePtr(new transport::Node());
-  this->node->Init(this->model->GetWorld()->GetName());
+  this->dataPtr->model = _model;
+
+  if (this->dataPtr->model && this->dataPtr->model->GetWorld())
+  {
+    this->dataPtr->node = transport::NodePtr(new transport::Node());
+    this->dataPtr->node->Init(this->dataPtr->model->GetWorld()->GetName());
+
+    this->dataPtr->jointCmdSub = this->dataPtr->node->Subscribe(
+        std::string("~/") + this->dataPtr->model->GetName() + "/joint_cmd",
+        &JointController::OnJointCmd, this);
+  }
+  else
+  {
+    gzwarn << "Unable to get world name. "
+      << "JointController will not receive commands via messages\n";
+  }
+}
 
-  this->jointCmdSub = this->node->Subscribe(std::string("~/") +
-      this->model->GetName() + "/joint_cmd",
-      &JointController::OnJointCmd, this);
+/////////////////////////////////////////////////
+JointController::~JointController()
+{
+  delete this->dataPtr;
+  this->dataPtr = NULL;
 }
 
 /////////////////////////////////////////////////
 void JointController::AddJoint(JointPtr _joint)
 {
-  this->joints[_joint->GetScopedName()] = _joint;
-  this->posPids[_joint->GetScopedName()].Init(1, 0.1, 0.01, 1, -1);
-  this->velPids[_joint->GetScopedName()].Init(1, 0.1, 0.01, 1, -1);
+  this->dataPtr->joints[_joint->GetScopedName()] = _joint;
+  this->dataPtr->posPids[_joint->GetScopedName()].Init(
+      1, 0.1, 0.01, 1, -1, 1000, -1000);
+  this->dataPtr->velPids[_joint->GetScopedName()].Init(
+      1, 0.1, 0.01, 1, -1, 1000, -1000);
 }
 
 /////////////////////////////////////////////////
 void JointController::Reset()
 {
   // Reset setpoints and feed-forward.
-  this->positions.clear();
-  this->velocities.clear();
-  this->forces.clear();
+  this->dataPtr->positions.clear();
+  this->dataPtr->velocities.clear();
+  this->dataPtr->forces.clear();
   // Should the PID's be reset as well?
 }
 
 /////////////////////////////////////////////////
 void JointController::Update()
 {
-  common::Time currTime = this->model->GetWorld()->GetSimTime();
-  common::Time stepTime = currTime - this->prevUpdateTime;
-  this->prevUpdateTime = currTime;
+  common::Time currTime = this->dataPtr->model->GetWorld()->GetSimTime();
+  common::Time stepTime = currTime - this->dataPtr->prevUpdateTime;
+  this->dataPtr->prevUpdateTime = currTime;
 
   // Skip the update step if SimTime appears to have gone backward.
   // Negative update time wreaks havok on the integrators.
@@ -70,109 +91,191 @@ void JointController::Update()
   // TODO: fix this when World::ResetTime is improved
   if (stepTime > 0)
   {
-    if (this->forces.size() > 0)
+    if (!this->dataPtr->forces.empty())
     {
       std::map<std::string, double>::iterator iter;
-      for (iter = this->forces.begin(); iter != this->forces.end(); ++iter)
-        this->joints[iter->first]->SetForce(0, iter->second);
+      for (iter = this->dataPtr->forces.begin();
+          iter != this->dataPtr->forces.end(); ++iter)
+      {
+        this->dataPtr->joints[iter->first]->SetForce(0, iter->second);
+      }
     }
 
-    if (this->positions.size() > 0)
+    if (!this->dataPtr->positions.empty())
     {
-      double cmd;
       std::map<std::string, double>::iterator iter;
 
-      for (iter = this->positions.begin(); iter != this->positions.end();
-           ++iter)
+      for (iter = this->dataPtr->positions.begin();
+           iter != this->dataPtr->positions.end(); ++iter)
       {
-        cmd = this->posPids[iter->first].Update(
-            this->joints[iter->first]->GetAngle(0).Radian() - iter->second,
-            stepTime);
-        this->joints[iter->first]->SetForce(0, cmd);
+        double cmd = this->dataPtr->posPids[iter->first].Update(
+            this->dataPtr->joints[iter->first]->GetAngle(0).Radian() -
+            iter->second, stepTime);
+        this->dataPtr->joints[iter->first]->SetForce(0, cmd);
       }
     }
 
-    if (this->velocities.size() > 0)
+    if (!this->dataPtr->velocities.empty())
     {
-      double cmd;
       std::map<std::string, double>::iterator iter;
 
-      for (iter = this->velocities.begin();
-           iter != this->velocities.end(); ++iter)
+      for (iter = this->dataPtr->velocities.begin();
+           iter != this->dataPtr->velocities.end(); ++iter)
       {
-        cmd = this->velPids[iter->first].Update(
-            this->joints[iter->first]->GetVelocity(0) - iter->second,
+        double cmd = this->dataPtr->velPids[iter->first].Update(
+            this->dataPtr->joints[iter->first]->GetVelocity(0) - iter->second,
             stepTime);
-        this->joints[iter->first]->SetForce(0, cmd);
+        this->dataPtr->joints[iter->first]->SetForce(0, cmd);
       }
     }
   }
 
   // Disabled for now. Collisions don't update properly
-  /*if (this->positions.size() > 0)
-  {
-    std::map<std::string, JointPtr>::iterator iter;
-    for (iter = this->joints.begin(); iter != this->joints.end(); ++iter)
-    {
-      if (this->positions.find(iter->first) == this->positions.end())
-        this->positions[iter->first] = iter->second->GetAngle(0).Radian();
-    }
-    this->SetJointPositions(this->positions);
-    this->positions.clear();
-  }*/
+  // if (this->dataPtr->positions.size() > 0)
+  // {
+  //   std::map<std::string, JointPtr>::iterator iter;
+  //   for (iter = this->dataPtr->joints.begin();
+  //        iter != this->dataPtr->joints.end(); ++iter)
+  //   {
+  //     if (this->dataPtr->positions.find(iter->first) ==
+  //         this->dataPtr->positions.end())
+  //     {
+  //       this->dataPtr->positions[iter->first] =
+  //         iter->second->GetAngle(0).Radian();
+  //     }
+  //   }
+  //   this->SetJointPositions(this->dataPtr->positions);
+  //   this->dataPtr->positions.clear();
+  // }
 }
 
 /////////////////////////////////////////////////
 void JointController::OnJointCmd(ConstJointCmdPtr &_msg)
 {
   std::map<std::string, JointPtr>::iterator iter;
-  iter = this->joints.find(_msg->name());
-  if (iter != this->joints.end())
+  iter = this->dataPtr->joints.find(_msg->name());
+  if (iter != this->dataPtr->joints.end())
   {
     if (_msg->has_reset() && _msg->reset())
     {
-      if (this->forces.find(_msg->name()) != this->forces.end())
-        this->forces.erase(this->forces.find(_msg->name()));
-      if (this->positions.find(_msg->name()) != this->positions.end())
-        this->positions.erase(this->positions.find(_msg->name()));
-      if (this->velocities.find(_msg->name()) != this->velocities.end())
-        this->velocities.erase(this->velocities.find(_msg->name()));
+      if (this->dataPtr->forces.find(_msg->name()) !=
+          this->dataPtr->forces.end())
+      {
+        this->dataPtr->forces.erase(this->dataPtr->forces.find(_msg->name()));
+      }
+
+      if (this->dataPtr->positions.find(_msg->name()) !=
+          this->dataPtr->positions.end())
+      {
+        this->dataPtr->positions.erase(
+            this->dataPtr->positions.find(_msg->name()));
+      }
+
+      if (this->dataPtr->velocities.find(_msg->name()) !=
+          this->dataPtr->velocities.end())
+      {
+        this->dataPtr->velocities.erase(
+            this->dataPtr->velocities.find(_msg->name()));
+      }
     }
 
     if (_msg->has_force())
-      this->forces[_msg->name()] = _msg->force();
-
+      this->dataPtr->forces[_msg->name()] = _msg->force();
 
     if (_msg->has_position())
     {
       if (_msg->position().has_target())
-        this->positions[_msg->name()] = _msg->position().target();
+      {
+        if (!this->SetPositionTarget(_msg->name(), _msg->position().target()))
+        {
+          gzerr << "Unable to set position target for joint["
+            << _msg->name() << "]. Joint is not found.\n";
+        }
+      }
+
       if (_msg->position().has_p_gain())
-        this->posPids[_msg->name()].SetPGain(_msg->position().p_gain());
+      {
+        this->dataPtr->posPids[_msg->name()].SetPGain(
+            _msg->position().p_gain());
+      }
+
       if (_msg->position().has_i_gain())
-        this->posPids[_msg->name()].SetIGain(_msg->position().i_gain());
+      {
+        this->dataPtr->posPids[_msg->name()].SetIGain(
+            _msg->position().i_gain());
+      }
+
       if (_msg->position().has_d_gain())
-        this->posPids[_msg->name()].SetDGain(_msg->position().d_gain());
+      {
+        this->dataPtr->posPids[_msg->name()].SetDGain(
+            _msg->position().d_gain());
+      }
+
       if (_msg->position().has_i_max())
-        this->posPids[_msg->name()].SetIMax(_msg->position().i_max());
+      {
+        this->dataPtr->posPids[_msg->name()].SetIMax(_msg->position().i_max());
+      }
+
       if (_msg->position().has_i_min())
-        this->posPids[_msg->name()].SetIMax(_msg->position().i_min());
+      {
+        this->dataPtr->posPids[_msg->name()].SetIMin(_msg->position().i_min());
+      }
+
+      if (_msg->position().has_limit())
+      {
+        this->dataPtr->posPids[_msg->name()].SetCmdMax(
+            _msg->position().limit());
+        this->dataPtr->posPids[_msg->name()].SetCmdMin(
+            -_msg->position().limit());
+      }
     }
 
     if (_msg->has_velocity())
     {
       if (_msg->velocity().has_target())
-        this->velocities[_msg->name()] = _msg->velocity().target();
+      {
+        if (!this->SetVelocityTarget(_msg->name(), _msg->velocity().target()))
+        {
+          gzerr << "Unable to set velocity target for joint["
+            << _msg->name() << "]. Joint is not found.\n";
+        }
+      }
+
       if (_msg->velocity().has_p_gain())
-        this->velPids[_msg->name()].SetPGain(_msg->velocity().p_gain());
+      {
+        this->dataPtr->velPids[_msg->name()].SetPGain(
+            _msg->velocity().p_gain());
+      }
+
       if (_msg->velocity().has_i_gain())
-        this->velPids[_msg->name()].SetIGain(_msg->velocity().i_gain());
+      {
+        this->dataPtr->velPids[_msg->name()].SetIGain(
+            _msg->velocity().i_gain());
+      }
+
       if (_msg->velocity().has_d_gain())
-        this->velPids[_msg->name()].SetDGain(_msg->velocity().d_gain());
+      {
+        this->dataPtr->velPids[_msg->name()].SetDGain(
+            _msg->velocity().d_gain());
+      }
+
       if (_msg->velocity().has_i_max())
-        this->velPids[_msg->name()].SetIMax(_msg->velocity().i_max());
+      {
+        this->dataPtr->velPids[_msg->name()].SetIMax(_msg->velocity().i_max());
+      }
+
       if (_msg->velocity().has_i_min())
-        this->velPids[_msg->name()].SetIMax(_msg->velocity().i_min());
+      {
+        this->dataPtr->velPids[_msg->name()].SetIMin(_msg->velocity().i_min());
+      }
+
+      if (_msg->velocity().has_limit())
+      {
+        this->dataPtr->velPids[_msg->name()].SetCmdMax(
+            _msg->velocity().limit());
+        this->dataPtr->velPids[_msg->name()].SetCmdMin(
+            -_msg->velocity().limit());
+      }
     }
   }
   else
@@ -180,229 +283,347 @@ void JointController::OnJointCmd(ConstJointCmdPtr &_msg)
 }
 
 //////////////////////////////////////////////////
-void JointController::SetJointPosition(const std::string &_name,
-                                       double _position)
+void JointController::SetJointPosition(const std::string & /*_name*/,
+                                       double /*_position*/, int /*_index*/)
 {
-  std::map<std::string, JointPtr>::iterator jiter = this->joints.find(_name);
-  if (jiter != this->joints.end())
-    this->SetJointPosition(jiter->second, _position);
-  else
-    gzwarn << "SetJointPosition [" << _name << "] not found\n";
+  gzwarn << "Setting joint position is disabled, see issue #1138\n";
+  return;
+
+  /// std::map<std::string, JointPtr>::iterator jiter =
+  ///   this->dataPtr->joints.find(_name);
+
+  /// if (jiter != this->dataPtr->joints.end())
+  ///   this->SetJointPosition(jiter->second, _position, _index);
+  /// else
+  ///   gzwarn << "SetJointPosition [" << _name << "] not found\n";
 }
 
 //////////////////////////////////////////////////
 void JointController::SetJointPositions(
-    const std::map<std::string, double> &_jointPositions)
+    const std::map<std::string, double> & /*_jointPositions*/)
 {
+  gzwarn << "Setting joint positions is disabled, see issue #1138\n";
+  return;
+
   // go through all joints in this model and update each one
   //   for each joint update, recursively update all children
-  std::map<std::string, JointPtr>::iterator iter;
-  std::map<std::string, double>::const_iterator jiter;
-
-  for (iter = this->joints.begin(); iter != this->joints.end(); ++iter)
-  {
-    jiter = _jointPositions.find(iter->second->GetScopedName());
-    if (jiter != _jointPositions.end())
-      this->SetJointPosition(iter->second, jiter->second);
-  }
+  // std::map<std::string, JointPtr>::iterator iter;
+  // std::map<std::string, double>::const_iterator jiter;
+
+  // for (iter = this->dataPtr->joints.begin();
+  //     iter != this->dataPtr->joints.end(); ++iter)
+  // {
+  //   // First try name without scope, i.e. joint_name
+  //   jiter = _jointPositions.find(iter->second->GetName());
+
+  //   if (jiter == _jointPositions.end())
+  //   {
+  //     // Second try name with scope, i.e. model_name::joint_name
+  //     jiter = _jointPositions.find(iter->second->GetScopedName());
+  //     if (jiter == _jointPositions.end())
+  //       continue;
+  //   }
+
+  //   this->SetJointPosition(iter->second, jiter->second);
+  // }
 }
 
 //////////////////////////////////////////////////
-void JointController::SetJointPosition(JointPtr _joint, double _position)
+void JointController::SetJointPosition(
+  JointPtr /*_joint*/, double /*_position*/, int /*_index*/)
 {
-  // truncate position by joint limits
-  double lower = _joint->GetLowStop(0).Radian();
-  double upper = _joint->GetHighStop(0).Radian();
-  _position = _position < lower? lower : (_position > upper? upper : _position);
+  gzwarn << "Setting joint position is disabled, see issue #1138\n";
+  return;
 
-  // keep track of updatd links, make sure each is upated only once
-  this->updatedLinks.clear();
-
-  // only deal with hinge and revolute joints in the user
-  // request joint_names list
-  if (_joint->HasType(Base::HINGE_JOINT) || _joint->HasType(Base::SLIDER_JOINT))
-  {
-    LinkPtr parentLink = _joint->GetParent();
-    LinkPtr childLink = _joint->GetChild();
-
-    if ((!parentLink && childLink) ||
-        (parentLink && childLink &&
-         parentLink->GetScopedName() != childLink->GetScopedName()))
-    {
-      // transform about the current anchor, about the axis
-      // rotate child (childLink) about anchor point, by delta-angle
-      // along axis
-      double dposition = _position - _joint->GetAngle(0).Radian();
-
-      math::Vector3 anchor;
-      math::Vector3 axis;
-
-      if (this->model->IsStatic())
-      {
-        math::Pose linkWorldPose = childLink->GetWorldPose();
-        axis = linkWorldPose.rot.RotateVector(_joint->GetLocalAxis(0));
-        anchor = linkWorldPose.pos;
-      }
-      else
-      {
-        anchor = _joint->GetAnchor(0);
-        axis = _joint->GetGlobalAxis(0);
-      }
-
-      // we don't want to move the parent link
-      if (parentLink)
-        this->updatedLinks.push_back(parentLink);
-
-      this->MoveLinks(_joint, childLink, anchor, axis, dposition,
-        true);
-    }
-  }
-
-  /// @todo:  Set link and joint "velocities" based on change / time
+  // truncate position by joint limits
+  // double lower = _joint->GetLowStop(_index).Radian();
+  // double upper = _joint->GetHighStop(_index).Radian();
+  // _position = _position < lower? lower :
+  // (_position > upper? upper : _position);
+
+  // // keep track of updatd links, make sure each is upated only once
+  // this->dataPtr->updatedLinks.clear();
+
+  // // only deal with hinge and revolute joints in the user
+  // // request joint_names list
+  // if (_joint->HasType(Base::HINGE_JOINT) ||
+  //     _joint->HasType(Base::UNIVERSAL_JOINT) ||
+  //     _joint->HasType(Base::SLIDER_JOINT))
+  // {
+  //   LinkPtr parentLink = _joint->GetParent();
+  //   LinkPtr childLink = _joint->GetChild();
+
+  //   if ((!parentLink && childLink) ||
+  //       (parentLink && childLink &&
+  //        parentLink->GetScopedName() != childLink->GetScopedName()))
+  //   {
+  //     // transform about the current anchor, about the axis
+  //     // rotate child (childLink) about anchor point, by delta-angle
+  //     // along axis
+  //     double dposition = _position - _joint->GetAngle(_index).Radian();
+
+  //     math::Vector3 anchor;
+  //     math::Vector3 axis;
+
+  //     if (this->dataPtr->model->IsStatic())
+  //     {
+  //       math::Pose linkWorldPose = childLink->GetWorldPose();
+  //       /// \TODO: we want to get axis in global frame, but GetGlobalAxis
+  //       /// not implemented for static models yet.
+  //       axis = linkWorldPose.rot.RotateVector(_joint->GetLocalAxis(_index));
+  //       anchor = linkWorldPose.pos;
+  //     }
+  //     else
+  //     {
+  //       anchor = _joint->GetAnchor(_index);
+  //       axis = _joint->GetGlobalAxis(_index);
+  //     }
+
+  //     // we don't want to move the parent link
+  //     if (parentLink)
+  //       this->dataPtr->updatedLinks.push_back(parentLink);
+
+  //     this->MoveLinks(_joint, childLink, anchor, axis, dposition,
+  //       true);
+  //   }
+  // }
+
+  /// \todo:  Set link and joint "velocities" based on change / time
 }
 
-
-
 //////////////////////////////////////////////////
-void JointController::MoveLinks(JointPtr _joint, LinkPtr _link,
-    const math::Vector3 &_anchor, const math::Vector3 &_axis,
-    double _dposition, bool _updateChildren)
-{
-  if (!this->ContainsLink(this->updatedLinks, _link))
-  {
-    if (_joint->HasType(Base::HINGE_JOINT))
-    {
-      math::Pose linkWorldPose = _link->GetWorldPose();
-
-      // relative to anchor point
-      math::Pose relativePose(linkWorldPose.pos - _anchor, linkWorldPose.rot);
-
-      // take axis rotation and turn it int a quaternion
-      math::Quaternion rotation(_axis, _dposition);
-
-      // rotate relative pose by rotation
-      math::Pose newRelativePose;
-
-      newRelativePose.pos = rotation.RotateVector(relativePose.pos);
-      newRelativePose.rot = rotation * relativePose.rot;
+// void JointController::MoveLinks(JointPtr _joint, LinkPtr _link,
+//     const math::Vector3 &_anchor, const math::Vector3 &_axis,
+//     double _dposition, bool _updateChildren)
+// {
+//   if (!this->ContainsLink(this->dataPtr->updatedLinks, _link))
+//   {
+//     if (_joint->HasType(Base::HINGE_JOINT) ||
+//         _joint->HasType(Base::UNIVERSAL_JOINT))
+//     {
+//       math::Pose linkWorldPose = _link->GetWorldPose();
+//
+//       // relative to anchor point
+//       math::Pose relativePose(linkWorldPose.pos - _anchor,
+//                               linkWorldPose.rot);
+//
+//       // take axis rotation and turn it int a quaternion
+//       math::Quaternion rotation(_axis, _dposition);
+//
+//       // rotate relative pose by rotation
+//       math::Pose newRelativePose;
+//
+//       newRelativePose.pos = rotation.RotateVector(relativePose.pos);
+//       newRelativePose.rot = rotation * relativePose.rot;
+//
+//       math::Pose newWorldPose(newRelativePose.pos + _anchor,
+//                               newRelativePose.rot);
+//
+//       _link->SetWorldPose(newWorldPose);
+//
+//       // \TODO: ideally we want to set this according to
+//       // Joint Trajectory velocity and use time step since last update.
+//       // double dt =
+//       // this->dataPtr->model->GetWorld()->GetPhysicsEngine()->
+//               GetMaxStepTime();
+//       // this->ComputeAndSetLinkTwist(_link, newWorldPose,
+//                                       newWorldPose, dt);
+//
+//       this->dataPtr->updatedLinks.push_back(_link);
+//     }
+//     else if (_joint->HasType(Base::SLIDER_JOINT))
+//     {
+//       math::Pose linkWorldPose = _link->GetWorldPose();
+//
+//       // relative to anchor point
+//       math::Pose relativePose(linkWorldPose.pos - _anchor,
+//                               linkWorldPose.rot);
+//
+//       // slide relative pose by dposition along axis
+//       math::Pose newRelativePose;
+//       newRelativePose.pos = relativePose.pos + _axis * _dposition;
+//       newRelativePose.rot = relativePose.rot;
+//
+//       math::Pose newWorldPose(newRelativePose.pos + _anchor,
+//                               newRelativePose.rot);
+//
+//       _link->SetWorldPose(newWorldPose);
+//
+//       /// \TODO: ideally we want to set this according to Joint Trajectory
+//       /// velocity and use time step since last update.
+//       /// double dt = this->dataPtr->model->GetWorld()->GetPhysicsEngine()->
+//       /// GetMaxStepTime();
+//       /// this->ComputeAndSetLinkTwist(_link, newWorldPose,
+//                                        newWorldPose, dt);
+//
+//       this->dataPtr->updatedLinks.push_back(_link);
+//     }
+//     else
+//       gzerr << "should not be here\n";
+//   }
+//
+//
+//   // recurse through connected links
+//   if (_updateChildren)
+//   {
+//     Link_V connected_links;
+//     this->AddConnectedLinks(connected_links, _link, true);
+//
+//     for (Link_V::iterator liter = connected_links.begin();
+//         liter != connected_links.end(); ++liter)
+//     {
+//       this->MoveLinks(_joint, (*liter), _anchor, _axis, _dposition);
+//     }
+//   }
+// }
 
-      math::Pose newWorldPose(newRelativePose.pos + _anchor,
-                              newRelativePose.rot);
+//////////////////////////////////////////////////
+// void JointController::ComputeAndSetLinkTwist(LinkPtr _link,
+//      const math::Pose &_old, const math::Pose &_new, double _dt)
+// {
+//     math::Vector3 linear_vel(0, 0, 0);
+//     math::Vector3 angular_vel(0, 0, 0);
+//     if (math::equal(_dt, 0.0))
+//     {
+//       gzwarn << "dt is 0, unable to compute velocity, set to 0s\n";
+//     }
+//     else
+//     {
+//       linear_vel = (_new.pos - _old.pos) / _dt;
+//       angular_vel = (_new.rot.GetAsEuler() - _old.rot.GetAsEuler()) / _dt;
+//     }
+//     _link->SetLinearVel(linear_vel);
+//     _link->SetAngularVel(angular_vel);
+// }
 
-      _link->SetWorldPose(newWorldPose);
+//////////////////////////////////////////////////
+// void JointController::AddConnectedLinks(Link_V &_linksOut,
+//                                         const LinkPtr &_link,
+//                                         bool _checkParentTree)
+// {
+//   // strategy, for each child, recursively look for children
+//   //           for each child, also look for parents to catch multiple roots
+//
+//
+//   Link_V childLinks = _link->GetChildJointsLinks();
+//   for (Link_V::iterator childLink = childLinks.begin();
+//                                       childLink != childLinks.end();
+//                                       ++childLink)
+//   {
+//     // add this link to the list of links to be updated by SetJointPosition
+//     if (!this->ContainsLink(_linksOut, *childLink))
+//     {
+//       _linksOut.push_back(*childLink);
+//       // recurse into children, but not parents
+//       this->AddConnectedLinks(_linksOut, *childLink);
+//     }
+//
+//     if (_checkParentTree)
+//     {
+//       // catch additional roots by looping
+//       // through all parents of childLink,
+//       // but skip parent link itself (_link)
+//       Link_V parentLinks = (*childLink)->GetParentJointsLinks();
+//       for (Link_V::iterator parentLink = parentLinks.begin();
+//                                           parentLink != parentLinks.end();
+//                                           ++parentLink)
+//       {
+//         if ((*parentLink)->GetName() != _link->GetName() &&
+//             !this->ContainsLink(_linksOut, (*parentLink)))
+//         {
+//           _linksOut.push_back(*parentLink);
+//           // add all childrend links of parentLink, but
+//           // stop the recursion if any of the child link is already added
+//           this->AddConnectedLinks(_linksOut, *parentLink, _link);
+//         }
+//       }
+//     }
+//   }
+// }
 
-      /// \TODO: ideally we want to set this according to
-      /// Joint Trajectory velocity and use time step since last update.
-      /// double dt =
-      /// this->model->GetWorld()->GetPhysicsEngine()->GetStepTime();
-      /// this->ComputeAndSetLinkTwist(_link, newWorldPose, newWorldPose, dt);
+/////////////////////////////////////////////////
+/// bool JointController::ContainsLink(
+/// const Link_V &_vector, const LinkPtr &_value)
+/// {
+///   for (Link_V::const_iterator iter = _vector.begin();
+///        iter != _vector.end(); ++iter)
+///   {
+///     if ((*iter)->GetScopedName() == _value->GetScopedName())
+///       return true;
+///   }
+///   return false;
+/// }
 
-      this->updatedLinks.push_back(_link);
-    }
-    else if (_joint->HasType(Base::SLIDER_JOINT))
-    {
-      math::Pose linkWorldPose = _link->GetWorldPose();
+/////////////////////////////////////////////////
+common::Time JointController::GetLastUpdateTime() const
+{
+  return this->dataPtr->prevUpdateTime;
+}
 
-      // relative to anchor point
-      math::Pose relativePose(linkWorldPose.pos - _anchor, linkWorldPose.rot);
+/////////////////////////////////////////////////
+std::map<std::string, JointPtr> JointController::GetJoints() const
+{
+  return this->dataPtr->joints;
+}
 
-      // slide relative pose by dposition along axis
-      math::Pose newRelativePose;
-      newRelativePose.pos = relativePose.pos + _axis * _dposition;
-      newRelativePose.rot = relativePose.rot;
+/////////////////////////////////////////////////
+std::map<std::string, common::PID> JointController::GetPositionPIDs() const
+{
+  return this->dataPtr->posPids;
+}
 
-      math::Pose newWorldPose(newRelativePose.pos + _anchor,
-                              newRelativePose.rot);
+/////////////////////////////////////////////////
+std::map<std::string, common::PID> JointController::GetVelocityPIDs() const
+{
+  return this->dataPtr->velPids;
+}
 
-      _link->SetWorldPose(newWorldPose);
+/////////////////////////////////////////////////
+std::map<std::string, double> JointController::GetForces() const
+{
+  return this->dataPtr->forces;
+}
 
-      /// \TODO: ideally we want to set this according to Joint Trajectory
-      /// velocity and use time step since last update.
-      /// double dt = this->model->GetWorld()->GetPhysicsEngine()->
-      /// GetStepTime();
-      /// this->ComputeAndSetLinkTwist(_link, newWorldPose, newWorldPose, dt);
+/////////////////////////////////////////////////
+std::map<std::string, double> JointController::GetPositions() const
+{
+  return this->dataPtr->positions;
+}
 
-      this->updatedLinks.push_back(_link);
-    }
-    else
-      gzerr << "should not be here\n";
-  }
+/////////////////////////////////////////////////
+std::map<std::string, double> JointController::GetVelocities() const
+{
+  return this->dataPtr->velocities;
+}
 
+/////////////////////////////////////////////////
+bool JointController::SetPositionTarget(const std::string &_jointName,
+    double _target)
+{
+  bool result = false;
 
-  // recurse through connected links
-  if (_updateChildren)
+  if (this->dataPtr->posPids.find(_jointName) !=
+      this->dataPtr->posPids.end())
   {
-    Link_V connected_links;
-    this->AddConnectedLinks(connected_links, _link, true);
-
-    for (Link_V::iterator liter = connected_links.begin();
-        liter != connected_links.end(); ++liter)
-    {
-      this->MoveLinks(_joint, (*liter), _anchor, _axis, _dposition);
-    }
+    this->dataPtr->positions[_jointName] = _target;
+    result = true;
   }
-}
 
-//////////////////////////////////////////////////
-void JointController::ComputeAndSetLinkTwist(LinkPtr _link,
-     const math::Pose &_old, const math::Pose &_new, double _dt)
-{
-    math::Vector3 linear_vel(0, 0, 0);
-    math::Vector3 angular_vel(0, 0, 0);
-    if (math::equal(_dt, 0.0))
-    {
-      gzwarn << "dt is 0, unable to compute velocity, set to 0s\n";
-    }
-    else
-    {
-      linear_vel = (_new.pos - _old.pos) / _dt;
-      angular_vel = (_new.rot.GetAsEuler() - _old.rot.GetAsEuler()) / _dt;
-    }
-    _link->SetLinearVel(linear_vel);
-    _link->SetAngularVel(angular_vel);
+  return result;
 }
 
-//////////////////////////////////////////////////
-void JointController::AddConnectedLinks(Link_V &_linksOut,
-                                        const LinkPtr &_link,
-                                        bool _checkParentTree)
+/////////////////////////////////////////////////
+bool JointController::SetVelocityTarget(const std::string &_jointName,
+    double _target)
 {
-  // strategy, for each child, recursively look for children
-  //           for each child, also look for parents to catch multiple roots
+  bool result = false;
 
-
-  Link_V childLinks = _link->GetChildJointsLinks();
-  for (Link_V::iterator childLink = childLinks.begin();
-                                      childLink != childLinks.end();
-                                      ++childLink)
+  if (this->dataPtr->velPids.find(_jointName) !=
+      this->dataPtr->velPids.end())
   {
-    // add this link to the list of links to be updated by SetJointPosition
-    if (!this->ContainsLink(_linksOut, *childLink))
-    {
-      _linksOut.push_back(*childLink);
-      // recurse into children, but not parents
-      this->AddConnectedLinks(_linksOut, *childLink);
-    }
-
-    if (_checkParentTree)
-    {
-      // catch additional roots by looping
-      // through all parents of childLink,
-      // but skip parent link is self (_link)
-      Link_V parentLinks = (*childLink)->GetParentJointsLinks();
-      for (Link_V::iterator parentLink = parentLinks.begin();
-                                          parentLink != parentLinks.end();
-                                          ++parentLink)
-      {
-        if ((*parentLink)->GetName() != _link->GetName() &&
-            !this->ContainsLink(_linksOut, (*parentLink)))
-        {
-          _linksOut.push_back(*parentLink);
-          // add all childrend links of parentLink, but
-          // stop the recursion if any of the child link is already added
-          this->AddConnectedLinks(_linksOut, *parentLink, _link);
-        }
-      }
-    }
+    this->dataPtr->velocities[_jointName] = _target;
+    result = true;
   }
+
+  return result;
 }
diff --git a/gazebo/physics/JointController.hh b/gazebo/physics/JointController.hh
index b315774..ad82e56 100644
--- a/gazebo/physics/JointController.hh
+++ b/gazebo/physics/JointController.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,8 @@
  * limitations under the License.
  *
 */
-#ifndef _JOINTCONTROLLER_HH_
-#define _JOINTCONTROLLER_HH_
+#ifndef _GAZEBO_JOINTCONTROLLER_HH_
+#define _GAZEBO_JOINTCONTROLLER_HH_
 
 #include <map>
 #include <string>
@@ -26,22 +26,29 @@
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/transport/TransportTypes.hh"
 #include "gazebo/msgs/msgs.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
+    // Forward declare private data values.
+    class JointControllerPrivate;
+
     /// \addtogroup gazebo_physics
     /// \{
 
     /// \class JointController JointController.hh physics/physics.hh
     /// \brief A class for manipulating physics::Joint
-    class JointController
+    class GAZEBO_VISIBLE JointController
     {
       /// \brief Constructor
       /// \param[in] _model Model that uses this joint controller.
       public: explicit JointController(ModelPtr _model);
 
+      /// \brief Destructor
+      public: virtual ~JointController();
+
       /// \brief Add a joint to control.
       /// \param[in] _joint Joint to control.
       public: void AddJoint(JointPtr _joint);
@@ -53,14 +60,67 @@ namespace gazebo
       public: void Reset();
 
       /// \brief Set the positions of a Joint by name.
+      /// Warning: This function is disabled since collisions are not
+      /// updated correctly. See issue #1138
       /// \sa JointController::SetJointPosition(JointPtr, double)
-      public: void SetJointPosition(const std::string &_name, double _position);
+      public: void SetJointPosition(
+        const std::string &_name, double _position, int _index = 0);
 
       /// \brief Set the positions of a set of Joint's.
+      /// Warning: This function is disabled since collisions are not
+      /// updated correctly. See issue #1138
       /// \sa JointController::SetJointPosition(JointPtr, double)
       public: void SetJointPositions(
                   const std::map<std::string, double> &_jointPositions);
 
+      /// \brief Get the last time the controller was updated.
+      /// \return Last time the controller was updated.
+      public: common::Time GetLastUpdateTime() const;
+
+      /// \brief Get all the joints.
+      /// \return A map<joint_name, joint_ptr> to all the joints that can
+      /// be controlled.
+      public: std::map<std::string, JointPtr> GetJoints() const;
+
+      /// \brief Set the target position for the position PID controller.
+      /// \param[in] _jointName Scoped name of the joint.
+      /// \param[in] _target Position target.
+      /// \return False if the joint was not found.
+      public: bool SetPositionTarget(const std::string &_jointName,
+                  double _target);
+
+      /// \brief Set the target velocity for the velocity PID controller.
+      /// \param[in] _jointName Scoped name of the joint.
+      /// \param[in] _target Velocity target.
+      /// \return False if the joint was not found.
+      public: bool SetVelocityTarget(const std::string &_jointName,
+                  double _target);
+
+      /// \brief Get all the position PID controllers.
+      /// \return A map<joint_name, PID> for all the position PID
+      /// controllers.
+      public: std::map<std::string, common::PID> GetPositionPIDs() const;
+
+      /// \brief Get all the velocity PID controllers.
+      /// \return A map<joint_name, PID> for all the velocity PID
+      /// controllers.
+      public: std::map<std::string, common::PID> GetVelocityPIDs() const;
+
+      /// \brief Get all the applied forces.
+      /// \return A map<joint_name, force> that contains force values set by
+      /// the user of the JointController.
+      public: std::map<std::string, double> GetForces() const;
+
+      /// \brief Get all the position PID set points.
+      /// \return A map<joint_name, position> that contains position values
+      /// set by the user of the JointController.
+      public: std::map<std::string, double> GetPositions() const;
+
+      /// \brief Get all the velocity PID set points.
+      /// \return A map<joint_name, position> that contains velocity values
+      /// set by the user of the JointController.
+      public: std::map<std::string, double> GetVelocities() const;
+
       /// \brief Callback when a joint command message is received.
       /// \param[in] _msg The received message.
       private: void OnJointCmd(ConstJointCmdPtr &_msg);
@@ -79,9 +139,13 @@ namespace gazebo
       ///   traversal through the kinematic graph has unexpected behavior
       ///   if you try to set the joint position of a link inside
       ///   a loop structure.
+      /// Warning:
+      /// This function is disabled since collisions are not
+      /// updated correctly. See issue #1138
       /// \param[in] _joint Joint to set.
       /// \param[in] _position Position of the joint.
-      public: void SetJointPosition(JointPtr _joint, double _position);
+      public: void SetJointPosition(
+        JointPtr _joint, double _position, int _index = 0);
 
       /// \brief Helper for SetJointPositions.
       /// \param[in] _joint Joint to move.
@@ -90,68 +154,39 @@ namespace gazebo
       /// \param[in] _axis Axis of the joint.
       /// \param[in] _dposition Rotation angle.
       /// \param[in] _updateChildren Update child joints.
-      private: void MoveLinks(JointPtr _joint, LinkPtr _link,
-                   const math::Vector3 &_anchor, const math::Vector3 &_axis,
-                   double _dposition, bool _updateChildren = false);
+      /// Disabled for now, manually moving joints doesn't properly update
+      /// collisions.
+      /// private: void MoveLinks(JointPtr _joint, LinkPtr _link,
+      ///             const math::Vector3 &_anchor, const math::Vector3 &_axis,
+      ///             double _dposition, bool _updateChildren = false);
 
       /// \internal
       /// \TODO: Set Link Velocity based on old and new poses and dt
-      private: void ComputeAndSetLinkTwist(LinkPtr _link,
-                    const math::Pose &_old, const math::Pose &_new, double dt);
+      /// Disabled for now, manually moving joints doesn't properly update
+      /// collisions.
+      /// private: void ComputeAndSetLinkTwist(LinkPtr _link,
+      ///           onst math::Pose &_old, const math::Pose &_new, double dt);
 
       /// \brief Helper for SetJointPositions
       /// \param[out] _linksOut All the connected links.
       /// \param[in] _link Link to get the connections from.
       /// \param[in] _checkParentTree True to recurse down parent link trees.
-      private: void AddConnectedLinks(std::vector<LinkPtr> &_linksOut,
-                                      const LinkPtr &_link,
-                                      bool _checkParentTree = false);
+      /// Disabled for now, manually moving joints doesn't properly update
+      /// collisions.
+      /// private: void AddConnectedLinks(std::vector<LinkPtr> &_linksOut,
+      ///                                 const LinkPtr &_link,
+      ///                                 bool _checkParentTree = false);
 
       /// \brief Helper for SetJointPositions.
       /// \param[in] _vector List of links.
       /// \param[in] _value Link to check against.
-      private: template<class InputVector, class T>
-                 bool ContainsLink(InputVector _vector, const T &_value)
-                 {
-                   typename InputVector::iterator iter = _vector.begin();
-                   for (; iter != _vector.end(); ++iter)
-                     if ((*iter)->GetScopedName() == _value->GetScopedName())
-                       return true;
-                   return false;
-                 }
-
-      /// \brief Model to control.
-      private: ModelPtr model;
-
-      /// \brief List of links that have been updated.
-      private: Link_V updatedLinks;
-
-      /// \brief Map of joint names to the joint pointer.
-      private: std::map<std::string, JointPtr> joints;
-
-      /// \brief Position PID controllers.
-      private: std::map<std::string, common::PID> posPids;
-
-      /// \brief Velocity PID controllers.
-      private: std::map<std::string, common::PID> velPids;
-
-      /// \brief Forces applied to joints.
-      private: std::map<std::string, double> forces;
-
-      /// \brief Joint positions.
-      private: std::map<std::string, double> positions;
-
-      /// \brief Joint velocities.
-      private: std::map<std::string, double> velocities;
-
-      /// \brief Node for communication.
-      private: transport::NodePtr node;
-
-      /// \brief Subscribe to joint command.
-      private: transport::SubscriberPtr jointCmdSub;
+      /// Disabled for now, manually moving joints doesn't properly update
+      /// collisions.
+      /// private: bool ContainsLink(
+      ///     const Link_V &_vector, const LinkPtr &_value);
 
-      /// \brief Last time the controller was updated.
-      private: common::Time prevUpdateTime;
+      /// \brief Private data values.
+      private: JointControllerPrivate *dataPtr;
     };
     /// \}
   }
diff --git a/gazebo/physics/JointControllerPrivate.hh b/gazebo/physics/JointControllerPrivate.hh
new file mode 100644
index 0000000..c765a4e
--- /dev/null
+++ b/gazebo/physics/JointControllerPrivate.hh
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_JOINTCONTROLLER_PRIVATE_HH_
+#define _GAZEBO_JOINTCONTROLLER_PRIVATE_HH_
+
+#include <string>
+#include <map>
+
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/common/PID.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    class JointControllerPrivate
+    {
+      /// \brief Model to control.
+      public: ModelPtr model;
+
+      /// \brief List of links that have been updated.
+      public: Link_V updatedLinks;
+
+      /// \brief Map of joint names to the joint pointer.
+      public: std::map<std::string, JointPtr> joints;
+
+      /// \brief Position PID controllers.
+      public: std::map<std::string, common::PID> posPids;
+
+      /// \brief Velocity PID controllers.
+      public: std::map<std::string, common::PID> velPids;
+
+      /// \brief Forces applied to joints.
+      public: std::map<std::string, double> forces;
+
+      /// \brief Joint positions.
+      public: std::map<std::string, double> positions;
+
+      /// \brief Joint velocities.
+      public: std::map<std::string, double> velocities;
+
+      /// \brief Node for communication.
+      public: transport::NodePtr node;
+
+      /// \brief Subscribe to joint command.
+      public: transport::SubscriberPtr jointCmdSub;
+
+      /// \brief Last time the controller was updated.
+      public: common::Time prevUpdateTime;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/JointController_TEST.cc b/gazebo/physics/JointController_TEST.cc
new file mode 100644
index 0000000..2427db7
--- /dev/null
+++ b/gazebo/physics/JointController_TEST.cc
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+
+#include "gazebo/common/PID.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/Joint.hh"
+#include "gazebo/physics/JointController.hh"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class JointControllerTest : public gazebo::testing::AutoLogFixture { };
+
+class FakeJoint : public physics::Joint
+{
+  public: FakeJoint(physics::ModelPtr _model) : physics::Joint(_model)
+          {}
+
+  public: virtual physics::LinkPtr GetJointLink(unsigned int) const
+          {return physics::LinkPtr();}
+
+  public: virtual bool AreConnected(physics::LinkPtr, physics::LinkPtr) const
+          {return true;}
+
+  public: virtual void SetAxis(unsigned int, const math::Vector3 &)
+          {}
+
+  public: virtual void SetDamping(unsigned int, double)
+          {}
+
+  public: virtual void SetStiffnessDamping(unsigned int, double,
+              double , double)
+          {}
+
+  public: virtual void SetStiffness(unsigned int , double)
+          {}
+
+  public: virtual math::Vector3 GetGlobalAxis(unsigned int) const
+          {return math::Vector3::Zero;}
+
+  public: virtual void SetAnchor(unsigned int, const math::Vector3 &)
+          {}
+
+  public: virtual math::Vector3 GetAnchor(unsigned int) const
+          {return math::Vector3::Zero;}
+
+  public: virtual math::Angle GetHighStop(unsigned int)
+          {return math::Angle::Zero;}
+
+  public: virtual math::Angle GetLowStop(unsigned int)
+          {return math::Angle::Zero;}
+
+  public: virtual void SetVelocity(unsigned int, double)
+          {}
+
+  public: virtual double GetVelocity(unsigned int) const
+          {return 0.0;}
+
+  public: virtual void SetForce(unsigned int, double)
+          {}
+
+  public: virtual physics::JointWrench GetForceTorque(unsigned int)
+          {return physics::JointWrench();}
+
+  public: virtual void SetMaxForce(unsigned int, double)
+          {}
+
+  public: virtual double GetMaxForce(unsigned int)
+          {return 0.0;}
+
+  public: virtual unsigned int GetAngleCount() const
+          {return 0;}
+
+  public: virtual math::Vector3 GetLinkForce(unsigned int) const
+          {return math::Vector3::Zero;}
+
+  public: virtual math::Vector3 GetLinkTorque(unsigned int) const
+          {return math::Vector3::Zero;}
+
+  public: virtual void SetAttribute(const std::string &, unsigned int,
+              const boost::any &)
+          {}
+
+  public: virtual double GetAttribute(const std::string &,
+              unsigned int)
+          {return 0.0;}
+
+  public: virtual bool SetParam(const std::string &, unsigned int,
+              const boost::any &)
+          {return true;}
+
+  public: virtual double GetParam(const std::string &, unsigned int)
+          {return 0.0;}
+
+  protected: virtual math::Angle GetAngleImpl(
+                 unsigned int) const
+          {return math::Angle::Zero;}
+};
+
+/////////////////////////////////////////////////
+TEST_F(JointControllerTest, Construction)
+{
+  // Create a dummy model
+  physics::ModelPtr model(new physics::Model(physics::BasePtr()));
+  EXPECT_TRUE(model);
+
+  // Create the joint controller
+  physics::JointControllerPtr jointController(
+      new physics::JointController(model));
+  EXPECT_TRUE(jointController);
+
+  // All values should be empty
+  EXPECT_TRUE(jointController->GetJoints().empty());
+  EXPECT_TRUE(jointController->GetPositionPIDs().empty());
+  EXPECT_TRUE(jointController->GetVelocityPIDs().empty());
+  EXPECT_TRUE(jointController->GetForces().empty());
+  EXPECT_TRUE(jointController->GetPositions().empty());
+  EXPECT_TRUE(jointController->GetVelocities().empty());
+
+  // The last update time should be zero.
+  EXPECT_EQ(jointController->GetLastUpdateTime(), common::Time::Zero);
+}
+
+/////////////////////////////////////////////////
+TEST_F(JointControllerTest, AddJoint)
+{
+  // Create a dummy model
+  physics::ModelPtr model(new physics::Model(physics::BasePtr()));
+  EXPECT_TRUE(model);
+
+  // Create the joint controller
+  physics::JointControllerPtr jointController(
+      new physics::JointController(model));
+  EXPECT_TRUE(jointController);
+
+  physics::JointPtr joint(new FakeJoint(model));
+  joint->SetName("joint");
+
+  // There should be one joint in the controller
+  jointController->AddJoint(joint);
+  std::map<std::string, physics::JointPtr> joints =
+    jointController->GetJoints();
+  EXPECT_EQ(joints.size(), 1u);
+
+  // Check the default position PID values
+  std::map<std::string, common::PID> posPids =
+    jointController->GetPositionPIDs();
+  EXPECT_EQ(posPids.size(), 1u);
+  EXPECT_DOUBLE_EQ(posPids[joint->GetScopedName()].GetPGain(), 1);
+  EXPECT_DOUBLE_EQ(posPids[joint->GetScopedName()].GetIGain(), 0.1);
+  EXPECT_DOUBLE_EQ(posPids[joint->GetScopedName()].GetDGain(), 0.01);
+
+  // Check the default velocity PID values
+  std::map<std::string, common::PID> velPids =
+    jointController->GetVelocityPIDs();
+  EXPECT_EQ(velPids.size(), 1u);
+  EXPECT_DOUBLE_EQ(velPids[joint->GetScopedName()].GetPGain(), 1);
+  EXPECT_DOUBLE_EQ(velPids[joint->GetScopedName()].GetIGain(), 0.1);
+  EXPECT_DOUBLE_EQ(velPids[joint->GetScopedName()].GetDGain(), 0.01);
+
+  // Set a joint position target
+  EXPECT_TRUE(jointController->SetPositionTarget(
+        joint->GetScopedName(), 12.3));
+  std::map<std::string, double> positions = jointController->GetPositions();
+  EXPECT_EQ(positions.size(), 1u);
+  EXPECT_DOUBLE_EQ(positions[joint->GetScopedName()], 12.3);
+
+  // Set a joint velocity target
+  EXPECT_TRUE(jointController->SetVelocityTarget(
+        joint->GetScopedName(), 3.21));
+  std::map<std::string, double> velocities = jointController->GetVelocities();
+  EXPECT_EQ(velocities.size(), 1u);
+  EXPECT_DOUBLE_EQ(velocities[joint->GetScopedName()], 3.21);
+
+  // Try setting a position target on a joint that doesn't exist.
+  EXPECT_FALSE(jointController->SetPositionTarget("my_bad_name", 12.3));
+  positions = jointController->GetPositions();
+  EXPECT_EQ(positions.size(), 1u);
+  EXPECT_DOUBLE_EQ(positions[joint->GetScopedName()], 12.3);
+
+  // Try setting a velocity target on a joint that doesn't exist.
+  EXPECT_FALSE(jointController->SetVelocityTarget("my_bad_name", 3.21));
+  velocities = jointController->GetVelocities();
+  EXPECT_EQ(velocities.size(), 1u);
+  EXPECT_DOUBLE_EQ(velocities[joint->GetScopedName()], 3.21);
+
+  // Reset the controller
+  jointController->Reset();
+  positions = jointController->GetPositions();
+  velocities = jointController->GetVelocities();
+  EXPECT_EQ(positions.size(), 0u);
+  EXPECT_EQ(velocities.size(), 0u);
+}
+
+/////////////////////////////////////////////////
+TEST_F(JointControllerTest, SetJointPositions)
+{
+  // Create a dummy model
+  physics::ModelPtr model(new physics::Model(physics::BasePtr()));
+  EXPECT_TRUE(model);
+
+  // Create the joint controller
+  physics::JointControllerPtr jointController(
+      new physics::JointController(model));
+  EXPECT_TRUE(jointController);
+
+  physics::JointPtr joint1(new FakeJoint(model));
+  joint1->SetName("joint1");
+
+  physics::JointPtr joint2(new FakeJoint(model));
+  joint2->SetName("joint2");
+
+  // Add the joints.
+  jointController->AddJoint(joint1);
+  jointController->AddJoint(joint2);
+  std::map<std::string, physics::JointPtr> joints =
+    jointController->GetJoints();
+  EXPECT_EQ(joints.size(), 2u);
+
+  // Set joint positions for the two joints, and expect no expections.
+  std::map<std::string, double> positions;
+  positions[joint1->GetScopedName()] = 1.2;
+  positions[joint2->GetScopedName()] = 2.3;
+  EXPECT_NO_THROW(jointController->SetJointPositions(positions));
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/physics/JointState.cc b/gazebo/physics/JointState.cc
index c595a4e..a44a353 100644
--- a/gazebo/physics/JointState.cc
+++ b/gazebo/physics/JointState.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License")
  * you may not use this file except in compliance with the License.
@@ -31,6 +31,16 @@ JointState::JointState()
 }
 
 /////////////////////////////////////////////////
+JointState::JointState(JointPtr _joint, const common::Time &_realTime,
+    const common::Time &_simTime)
+: State(_joint->GetName(), _realTime, _simTime)
+{
+  // Set the joint angles.
+  for (unsigned int i = 0; i < _joint->GetAngleCount(); ++i)
+    this->angles.push_back(_joint->GetAngle(i));
+}
+
+/////////////////////////////////////////////////
 JointState::JointState(JointPtr _joint)
 : State(_joint->GetName(), _joint->GetWorld()->GetRealTime(),
         _joint->GetWorld()->GetSimTime())
@@ -54,10 +64,24 @@ JointState::~JointState()
 }
 
 /////////////////////////////////////////////////
+void JointState::Load(JointPtr _joint, const common::Time &_realTime,
+    const common::Time &_simTime)
+{
+  this->name = _joint->GetName();
+  this->realTime = _realTime;
+  this->simTime = _simTime;
+  this->wallTime = common::Time::GetWallTime();
+
+  // Set the joint angles.
+  for (unsigned int i = 0; i < _joint->GetAngleCount(); ++i)
+    this->angles.push_back(_joint->GetAngle(i));
+}
+
+/////////////////////////////////////////////////
 void JointState::Load(const sdf::ElementPtr _elem)
 {
   // Set the name
-  this->name = _elem->GetValueString("name");
+  this->name = _elem->Get<std::string>("name");
 
   // Set the angles
   this->angles.clear();
@@ -66,10 +90,10 @@ void JointState::Load(const sdf::ElementPtr _elem)
     sdf::ElementPtr childElem = _elem->GetElement("angle");
     while (childElem)
     {
-      unsigned int axis = childElem->GetValueUInt("axis");
+      unsigned int axis = childElem->Get<unsigned int>("axis");
       if (axis+1 > this->angles.size())
         this->angles.resize(axis+1, math::Angle(0.0));
-      this->angles[axis] = childElem->GetValueDouble();
+      this->angles[axis] = childElem->Get<double>();
       childElem = childElem->GetNextElement("angle");
     }
   }
@@ -105,7 +129,7 @@ bool JointState::IsZero() const
   for (std::vector<math::Angle>::const_iterator iter = this->angles.begin();
        iter != this->angles.end() && result; ++iter)
   {
-    result = result && (*iter) == math::Angle(0.0);
+    result = result && (*iter) == math::Angle::Zero;
   }
 
   return result;
diff --git a/gazebo/physics/JointState.hh b/gazebo/physics/JointState.hh
index aa82e2d..869d18a 100644
--- a/gazebo/physics/JointState.hh
+++ b/gazebo/physics/JointState.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
 
 #include "gazebo/physics/State.hh"
 #include "gazebo/math/Pose.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,13 +37,20 @@ namespace gazebo
 
     /// \class JointState JointState.hh physics/physics.hh
     /// \brief keeps track of state of a physics::Joint
-    class JointState : public State
+    class GAZEBO_VISIBLE JointState : public State
     {
       /// \brief Default constructor.
       public: JointState();
 
       /// \brief Constructor.
       /// \param[in] _joint Joint to get the state of.
+      /// \param[in] _realTime Real time stamp.
+      /// \param[in] _simTime Sim time stamp.
+      public: JointState(JointPtr _joint, const common::Time &_realTime,
+                  const common::Time &_simTime);
+
+      /// \brief Constructor.
+      /// \param[in] _joint Joint to get the state of.
       public: explicit JointState(JointPtr _joint);
 
       /// \brief Constructor
@@ -54,6 +62,13 @@ namespace gazebo
       /// \brief Destructor.
       public: virtual ~JointState();
 
+      /// \brief Load.
+      /// \param[in] _joint Joint to get the state of.
+      /// \param[in] _realTime Real time stamp.
+      /// \param[in] _simTime Sim time stamp.
+      public: void Load(JointPtr _joint, const common::Time &_realTime,
+                  const common::Time &_simTime);
+
       /// \brief Load state from SDF element.
       /// \param[in] _elem SDf values to load from.
       public: virtual void Load(const sdf::ElementPtr _elem);
@@ -99,19 +114,19 @@ namespace gazebo
       /// \param[in] _out output stream.
       /// \param[in] _state Joint state to output.
       /// \return The stream.
-      public: friend std::ostream &operator<<(std::ostream &_out,
-                                     const gazebo::physics::JointState &_state)
+      public: inline friend std::ostream &operator<<(std::ostream &_out,
+                  const gazebo::physics::JointState &_state)
       {
-        _out << "    <joint name='" << _state.GetName() << "'>\n";
+        _out << "<joint name='" << _state.GetName() << "'>";
 
         int i = 0;
         for (std::vector<math::Angle>::const_iterator iter =
             _state.angles.begin(); iter != _state.angles.end(); ++iter)
         {
-          _out << "      <angle axis='" << i << "'>" << (*iter) << "</angle>\n";
+          _out << "<angle axis='" << i << "'>" << (*iter) << "</angle>";
         }
 
-        _out << "    </joint>\n";
+        _out << "</joint>";
 
         return _out;
       }
diff --git a/gazebo/physics/JointWrench.hh b/gazebo/physics/JointWrench.hh
index 8db1690..bfc5ace 100644
--- a/gazebo/physics/JointWrench.hh
+++ b/gazebo/physics/JointWrench.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,7 +22,8 @@
 #ifndef _JOINT_WRENCH_HH_
 #define _JOINT_WRENCH_HH_
 
-#include "math/Vector3.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,9 +34,9 @@ namespace gazebo
 
     /// \class JointWrench JointWrench.hh physics/physics.hh
     /// \brief Wrench information from a joint.  These are
-    /// forces and torques on parent and child Links, relative to the Link's
-    /// center of mass.
-    class JointWrench
+    /// forces and torques on parent and child Links, relative to
+    /// the Joint frame immediately after rotation.
+    class GAZEBO_VISIBLE JointWrench
     {
       /// \brief Operator =
       /// \param[in] _wrench Joint wrench to set from.
diff --git a/gazebo/physics/Joint_TEST.cc b/gazebo/physics/Joint_TEST.cc
deleted file mode 100644
index e43f666..0000000
--- a/gazebo/physics/Joint_TEST.cc
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <gtest/gtest.h>
-#include "gazebo/physics/physics.hh"
-#include "test/ServerFixture.hh"
-#include "gazebo/physics/Joint.hh"
-
-#define TOL 1e-6
-using namespace gazebo;
-
-class Joint_TEST : public ServerFixture
-{
-};
-
-////////////////////////////////////////////////////////////////////////
-// Test world template
-////////////////////////////////////////////////////////////////////////
-TEST_F(Joint_TEST, JointCreationDestructionTest)
-{
-  // Load our inertial test world
-  Load("worlds/joint_test.world", true);
-
-  // Get a pointer to the world, make sure world loads
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // Verify physics engine type
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), "ode");
-
-  // create some fake links
-  physics::ModelPtr model = world->GetModel("model_1");
-  ASSERT_TRUE(model != NULL);
-  physics::LinkPtr link = model->GetLink("link_1");
-  ASSERT_TRUE(link != NULL);
-
-  physics::LinkPtr parentLink;
-  physics::LinkPtr childLink(link);
-  physics::JointPtr joint;
-  math::Pose anchor;
-  math::Vector3 axis(1, 0, 0);
-  double upper = M_PI;
-  double lower = -M_PI;
-
-  double residentLast = 0, shareLast = 0;
-  double residentCur, shareCur;
-
-  for (unsigned int i = 0; i < 100; ++i)
-  {
-    // try creating a joint
-    {
-      joint = world->GetPhysicsEngine()->CreateJoint(
-        "revolute", model);
-      joint->Attach(parentLink, childLink);
-      // load adds the joint to a vector of shared pointers kept
-      // in parent and child links, preventing joint from being destroyed.
-      joint->Load(parentLink, childLink, anchor);
-      // joint->SetAnchor(0, anchor);
-      joint->SetAxis(0, axis);
-      joint->SetHighStop(0, upper);
-      joint->SetLowStop(0, lower);
-
-      if (parentLink)
-        joint->SetName(parentLink->GetName() + std::string("_") +
-                       childLink->GetName() + std::string("_joint"));
-      else
-        joint->SetName(std::string("world_") +
-                       childLink->GetName() + std::string("_joint"));
-      joint->Init();
-    }
-    // remove the joint
-    {
-      bool paused = world->IsPaused();
-      world->SetPaused(true);
-      if (joint)
-      {
-        // reenable collision between the link pair
-        physics::LinkPtr parent = joint->GetParent();
-        physics::LinkPtr child = joint->GetChild();
-        if (parent)
-          parent->SetCollideMode("all");
-        if (child)
-          child->SetCollideMode("all");
-
-        joint->Detach();
-        joint.reset();
-      }
-      world->SetPaused(paused);
-    }
-    gazebo::common::Time::MSleep(10);
-    this->GetMemInfo(residentCur, shareCur);
-    if (i > 1)  // give it 2 cycles to stabilize
-    {
-      EXPECT_LE(residentCur, residentLast);
-      EXPECT_LE(shareCur, shareLast);
-    }
-    // gzdbg << "memory res[" << residentCur
-    //       << "] shr[" << shareCur
-    //       << "] res[" << residentLast
-    //       << "] shr[" << shareLast
-    //       << "]\n";
-    residentLast = residentCur;
-    shareLast = shareCur;
-  }
-}
-
-TEST_F(Joint_TEST, joint_SDF14)
-{
-  Load("worlds/SDF_1_4.world");
-
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-
-  int i = 0;
-  while (!this->HasEntity("joint14_model") && i < 20)
-  {
-    common::Time::MSleep(100);
-    ++i;
-  }
-
-  if (i > 20)
-    gzthrow("Unable to get joint14_model");
-
-  physics::PhysicsEnginePtr physicsEngine = world->GetPhysicsEngine();
-  EXPECT_TRUE(physicsEngine);
-  physics::ModelPtr model = world->GetModel("joint14_model");
-  EXPECT_TRUE(model);
-  physics::LinkPtr link1 = model->GetLink("body1");
-  EXPECT_TRUE(link1);
-  physics::LinkPtr link2 = model->GetLink("body2");
-  EXPECT_TRUE(link2);
-
-  EXPECT_EQ(model->GetJointCount(), 1u);
-  physics::JointPtr joint = model->GetJoint("joint14_revolute_joint");
-  EXPECT_TRUE(joint);
-
-  physics::LinkPtr parent = joint->GetParent();
-  EXPECT_TRUE(parent);
-  physics::LinkPtr child = joint->GetChild();
-  EXPECT_TRUE(child);
-  EXPECT_EQ(parent->GetName(), "body2");
-  EXPECT_EQ(child->GetName(), "body1");
-}
-
-
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/gazebo/physics/Link.cc b/gazebo/physics/Link.cc
index f2f4699..656576c 100644
--- a/gazebo/physics/Link.cc
+++ b/gazebo/physics/Link.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,57 +14,70 @@
  * limitations under the License.
  *
 */
-/* Desc: Link class
- * Author: Nate Koenig
- * Date: 13 Feb 2006
- */
 
 #include <sstream>
 
-#include "msgs/msgs.hh"
+#include "gazebo/msgs/msgs.hh"
 
+#include "gazebo/transport/TransportIface.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
+
+#include "gazebo/util/OpenAL.hh"
 #include "gazebo/common/Events.hh"
 #include "gazebo/math/Quaternion.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Exception.hh"
 #include "gazebo/common/Assert.hh"
 
-#include "gazebo/sensors/Sensors.hh"
+#include "gazebo/sensors/SensorsIface.hh"
 #include "gazebo/sensors/Sensor.hh"
 
+#include "gazebo/physics/PhysicsIface.hh"
 #include "gazebo/physics/Model.hh"
 #include "gazebo/physics/World.hh"
+#include "gazebo/physics/ContactManager.hh"
 #include "gazebo/physics/PhysicsEngine.hh"
 #include "gazebo/physics/Collision.hh"
 #include "gazebo/physics/Link.hh"
 
-#include "gazebo/transport/Publisher.hh"
-
 using namespace gazebo;
 using namespace physics;
 
 //////////////////////////////////////////////////
 Link::Link(EntityPtr _parent)
-    : Entity(_parent)
+    : Entity(_parent), initialized(false)
 {
   this->AddType(Base::LINK);
   this->inertial.reset(new Inertial);
   this->parentJoints.clear();
   this->childJoints.clear();
+  this->publishData = false;
+  this->publishDataMutex = new boost::recursive_mutex();
 }
 
 
 //////////////////////////////////////////////////
 Link::~Link()
 {
-  std::vector<Entity*>::iterator iter;
-
   this->attachedModels.clear();
 
-  for (unsigned int i = 0; i < this->visuals.size(); i++)
+  for (Visuals_M::iterator iter = this->visuals.begin();
+      iter != this->visuals.end(); ++iter)
   {
     msgs::Visual msg;
-    msg.set_name(this->visuals[i]);
+    msg.set_name(iter->second.name());
+    msg.set_id(iter->second.id());
+    if (this->parent)
+    {
+      msg.set_parent_name(this->parent->GetScopedName());
+      msg.set_parent_id(this->parent->GetId());
+    }
+    else
+    {
+      msg.set_parent_name("");
+      msg.set_parent_id(0);
+    }
     msg.set_delete_me(true);
     this->visPub->Publish(msg);
   }
@@ -76,6 +89,10 @@ Link::~Link()
     {
       msgs::Visual msg;
       msg.set_name(this->cgVisuals[i]);
+      if (this->parent)
+        msg.set_parent_name(this->parent->GetScopedName());
+      else
+        msg.set_parent_name("");
       msg.set_delete_me(true);
       this->visPub->Publish(msg);
     }
@@ -84,44 +101,32 @@ Link::~Link()
 
   this->visPub.reset();
   this->sensors.clear();
+
+  this->requestPub.reset();
+  this->dataPub.reset();
+  this->connections.clear();
+
+  delete this->publishDataMutex;
+  this->publishDataMutex = NULL;
+
+  this->collisions.clear();
 }
 
 //////////////////////////////////////////////////
 void Link::Load(sdf::ElementPtr _sdf)
 {
+  bool needUpdate = false;
+
   Entity::Load(_sdf);
 
   // before loading child collsion, we have to figure out of selfCollide is true
   // and modify parent class Entity so this body has its own spaceId
-  this->SetSelfCollide(this->sdf->GetValueBool("self_collide"));
+  this->SetSelfCollide(this->sdf->Get<bool>("self_collide"));
   this->sdf->GetElement("self_collide")->GetValue()->SetUpdateFunc(
       boost::bind(&Link::GetSelfCollide, this));
 
-  // TODO: this shouldn't be in the physics sim
-  if (this->sdf->HasElement("visual"))
-  {
-    sdf::ElementPtr visualElem = this->sdf->GetElement("visual");
-    while (visualElem)
-    {
-      msgs::Visual msg = msgs::VisualFromSDF(visualElem);
-
-      std::string visName = this->GetScopedName() + "::" + msg.name();
-      msg.set_name(visName);
-      msg.set_parent_name(this->GetScopedName());
-      msg.set_is_static(this->IsStatic());
-
-      this->visPub->Publish(msg);
-
-      std::vector<std::string>::iterator iter;
-      iter = std::find(this->visuals.begin(), this->visuals.end(), msg.name());
-      if (iter != this->visuals.end())
-        gzthrow(std::string("Duplicate visual name[")+msg.name()+"]\n");
-
-      this->visuals.push_back(msg.name());
-
-      visualElem = visualElem->GetNextElement("visual");
-    }
-  }
+  // Parse visuals from SDF
+  this->ParseVisuals();
 
   // Load the geometries
   if (this->sdf->HasElement("collision"))
@@ -140,10 +145,20 @@ void Link::Load(sdf::ElementPtr _sdf)
     sdf::ElementPtr sensorElem = this->sdf->GetElement("sensor");
     while (sensorElem)
     {
-      std::string sensorName =
-        sensors::create_sensor(sensorElem, this->GetWorld()->GetName(),
-                               this->GetScopedName());
-      this->sensors.push_back(sensorName);
+      /// \todo This if statement is a hack to prevent Links from creating
+      /// a force torque sensor. We should make this more generic.
+      if (sensorElem->Get<std::string>("type") == "force_torque")
+      {
+        gzerr << "A link cannot load a [" <<
+          sensorElem->Get<std::string>("type") << "] sensor.\n";
+      }
+      else if (sensorElem->Get<std::string>("type") != "__default__")
+      {
+        std::string sensorName =
+          sensors::create_sensor(sensorElem, this->GetWorld()->GetName(),
+              this->GetScopedName(), this->GetId());
+        this->sensors.push_back(sensorName);
+      }
       sensorElem = sensorElem->GetNextElement("sensor");
     }
   }
@@ -152,108 +167,120 @@ void Link::Load(sdf::ElementPtr _sdf)
   {
     this->inertial->Load(this->sdf->GetElement("inertial"));
   }
-}
 
-//////////////////////////////////////////////////
-void Link::Init()
-{
-  this->linearAccel.Set(0, 0, 0);
-  this->angularAccel.Set(0, 0, 0);
-
-  /// Attach mesh for CG visualization
-  /// Add a renderable visual for CG, make visible in Update()
-  /// TODO: this shouldn't be in the physics sim
-  /*if (this->mass.GetAsDouble() > 0.0)
+#ifdef HAVE_OPENAL
+  if (_sdf->HasElement("audio_source"))
   {
-    std::ostringstream visname;
-    visname << this->GetCompleteScopedName() + ":" + this->GetName() << "_CGVISUAL" ;
+    // bool onContact = false;
+    sdf::ElementPtr audioElem = this->sdf->GetElement("audio_source");
+    std::vector<std::string> collisionNames;
 
-    msgs::Visual msg;
-    msg.set_name(visname.str());
-    msg.set_parent_id(this->comEntity->GetCompleteScopedName());
-    msg.set_render_type(msgs::Visual::MESH_RESOURCE);
-    msg.set_mesh("unit_box");
-    msg.set_material("Gazebo/RedGlow");
-    msg.set_cast_shadows(false);
-    msg.set_attach_axes(true);
-    msg.set_visible(false);
-    msgs::Set(msg.mutable_scale(), math::Vector3(0.1, 0.1, 0.1));
-    this->vis_pub->Publish(msg);
-    this->cgVisuals.push_back(msg.header().str_id());
-
-    if (this->children.size() > 1)
+    while (audioElem)
     {
-      msgs::Visual g_msg;
-      g_msg.set_name(visname.str() + "_connectors");
-
-      g_msg.set_parent_id(this->comEntity->GetCompleteScopedName());
-      g_msg.set_render_type(msgs::Visual::LINE_LIST);
-      g_msg.set_attach_axes(false);
-      g_msg.set_material("Gazebo/GreenGlow");
-      g_msg.set_visible(false);
-
-      // Create a line to each collision
-      for (Base_V::iterator giter = this->children.begin();
-           giter != this->children.end(); giter++)
+      util::OpenALSourcePtr source = util::OpenAL::Instance()->CreateSource(
+          audioElem);
+
+      std::vector<std::string> names = source->GetCollisionNames();
+      std::copy(names.begin(), names.end(), std::back_inserter(collisionNames));
+
+      audioElem = audioElem->GetNextElement("audio_source");
+      this->audioSources.push_back(source);
+    }
+
+    if (!collisionNames.empty())
+    {
+      for (std::vector<std::string>::iterator iter = collisionNames.begin();
+          iter != collisionNames.end(); ++iter)
       {
-        EntityPtr e = boost::dynamic_pointer_cast<Entity>(*giter);
-
-        msgs::Point *pt;
-        pt = g_msg.add_points();
-        pt->set_x(0);
-        pt->set_y(0);
-        pt->set_z(0);
-
-        pt = g_msg.add_points();
-        pt->set_x(e->GetRelativePose().pos.x);
-        pt->set_y(e->GetRelativePose().pos.y);
-        pt->set_z(e->GetRelativePose().pos.z);
+        (*iter) = this->GetScopedName() + "::" + (*iter);
       }
-      this->vis_pub->Publish(msg);
-      this->cgVisuals.push_back(g_msg.header().str_id());
+
+      std::string topic =
+        this->world->GetPhysicsEngine()->GetContactManager()->CreateFilter(
+            this->GetScopedName() + "/audio_collision", collisionNames);
+      this->audioContactsSub = this->node->Subscribe(topic,
+          &Link::OnCollision, this);
     }
-  }*/
+
+    needUpdate = true;
+  }
+
+  if (_sdf->HasElement("audio_sink"))
+  {
+    needUpdate = true;
+    this->audioSink = util::OpenAL::Instance()->CreateSink(
+        _sdf->GetElement("audio_sink"));
+  }
+#endif
+
+  if (needUpdate)
+    this->connections.push_back(event::Events::ConnectWorldUpdateBegin(
+          boost::bind(&Link::Update, this, _1)));
+}
+
+//////////////////////////////////////////////////
+void Link::Init()
+{
+  this->linearAccel.Set(0, 0, 0);
+  this->angularAccel.Set(0, 0, 0);
 
   this->enabled = true;
 
   // Set Link pose before setting pose of child collisions
-  this->SetRelativePose(this->sdf->GetValuePose("pose"));
-  this->SetInitialRelativePose(this->sdf->GetValuePose("pose"));
+  this->SetRelativePose(this->sdf->Get<math::Pose>("pose"));
+  this->SetInitialRelativePose(this->sdf->Get<math::Pose>("pose"));
 
   // Call Init for child collisions, which whill set their pose
   Base_V::iterator iter;
   for (iter = this->children.begin(); iter != this->children.end(); ++iter)
   {
     if ((*iter)->HasType(Base::COLLISION))
-      boost::static_pointer_cast<Collision>(*iter)->Init();
+    {
+      CollisionPtr collision = boost::static_pointer_cast<Collision>(*iter);
+      this->collisions.push_back(collision);
+      collision->Init();
+    }
   }
+
+  this->initialized = true;
 }
 
 //////////////////////////////////////////////////
 void Link::Fini()
 {
-  std::vector<std::string>::iterator iter;
-
   this->parentJoints.clear();
   this->childJoints.clear();
+  this->collisions.clear();
   this->inertial.reset();
 
-  for (iter = this->sensors.begin(); iter != this->sensors.end(); ++iter)
+  for (std::vector<std::string>::iterator iter = this->sensors.begin();
+       iter != this->sensors.end(); ++iter)
+  {
     sensors::remove_sensor(*iter);
+  }
   this->sensors.clear();
 
-  for (iter = this->visuals.begin(); iter != this->visuals.end(); ++iter)
+  for (Visuals_M::iterator iter = this->visuals.begin();
+       iter != this->visuals.end(); ++iter)
   {
-    msgs::Request *msg = msgs::CreateRequest("entity_delete", *iter);
+    msgs::Request *msg = msgs::CreateRequest("entity_delete",
+        boost::lexical_cast<std::string>(iter->second.id()));
     this->requestPub->Publish(*msg, true);
   }
 
-  for (iter = this->cgVisuals.begin(); iter != this->cgVisuals.end(); ++iter)
+  for (std::vector<std::string>::iterator iter = this->cgVisuals.begin();
+       iter != this->cgVisuals.end(); ++iter)
   {
     msgs::Request *msg = msgs::CreateRequest("entity_delete", *iter);
     this->requestPub->Publish(*msg, true);
   }
 
+#ifdef HAVE_OPENAL
+  this->world->GetPhysicsEngine()->GetContactManager()->RemoveFilter(
+      this->GetScopedName() + "/audio_collision");
+  this->audioSink.reset();
+#endif
+
   Entity::Fini();
 }
 
@@ -294,13 +321,13 @@ void Link::UpdateParameters(sdf::ElementPtr _sdf)
   this->sdf->GetElement("kinematic")->GetValue()->SetUpdateFunc(
       boost::bind(&Link::GetKinematic, this));
 
-  if (this->sdf->GetValueBool("gravity") != this->GetGravityMode())
-    this->SetGravityMode(this->sdf->GetValueBool("gravity"));
+  if (this->sdf->Get<bool>("gravity") != this->GetGravityMode())
+    this->SetGravityMode(this->sdf->Get<bool>("gravity"));
 
   // before loading child collsiion, we have to figure out if
   // selfCollide is true and modify parent class Entity so this
   // body has its own spaceId
-  this->SetSelfCollide(this->sdf->GetValueBool("self_collide"));
+  this->SetSelfCollide(this->sdf->Get<bool>("self_collide"));
 
   // TODO: this shouldn't be in the physics sim
   if (this->sdf->HasElement("visual"))
@@ -327,7 +354,7 @@ void Link::UpdateParameters(sdf::ElementPtr _sdf)
     while (collisionElem)
     {
       CollisionPtr collision = boost::dynamic_pointer_cast<Collision>(
-          this->GetChild(collisionElem->GetValueString("name")));
+          this->GetChild(collisionElem->Get<std::string>("name")));
 
       if (collision)
         collision->UpdateParameters(collisionElem);
@@ -373,28 +400,23 @@ void Link::SetCollideMode(const std::string &_mode)
     return;
   }
 
-  for (Base_V::iterator iter = this->children.begin();
-       iter != this->children.end(); ++iter)
+  for (Collision_V::iterator iter = this->collisions.begin();
+       iter != this->collisions.end(); ++iter)
   {
-    if ((*iter)->HasType(Base::COLLISION))
+    if ((*iter))
     {
-      physics::CollisionPtr pc =
-        boost::dynamic_pointer_cast<physics::Collision>(*iter);
-      if (pc)
-      {
-        pc->SetCategoryBits(categoryBits);
-        pc->SetCollideBits(collideBits);
-      }
+      (*iter)->SetCategoryBits(categoryBits);
+      (*iter)->SetCollideBits(collideBits);
     }
   }
 }
 
 //////////////////////////////////////////////////
-bool Link::GetSelfCollide()
+bool Link::GetSelfCollide() const
 {
   GZ_ASSERT(this->sdf != NULL, "Link sdf member is NULL");
   if (this->sdf->HasElement("self_collide"))
-    return this->sdf->GetValueBool("self_collide");
+    return this->sdf->Get<bool>("self_collide");
   else
     return false;
 }
@@ -402,18 +424,32 @@ bool Link::GetSelfCollide()
 //////////////////////////////////////////////////
 void Link::SetLaserRetro(float _retro)
 {
-  Base_V::iterator iter;
-
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (Collision_V::iterator iter = this->collisions.begin();
+       iter != this->collisions.end(); ++iter)
   {
-    if ((*iter)->HasType(Base::COLLISION))
-      boost::static_pointer_cast<Collision>(*iter)->SetLaserRetro(_retro);
+    (*iter)->SetLaserRetro(_retro);
   }
 }
 
 //////////////////////////////////////////////////
-void Link::Update()
+void Link::Update(const common::UpdateInfo & /*_info*/)
 {
+#ifdef HAVE_OPENAL
+  if (this->audioSink)
+  {
+    this->audioSink->SetPose(this->GetWorldPose());
+    this->audioSink->SetVelocity(this->GetWorldLinearVel());
+  }
+
+  // Update all the audio sources
+  for (std::vector<util::OpenALSourcePtr>::iterator iter =
+      this->audioSources.begin(); iter != this->audioSources.end(); ++iter)
+  {
+    (*iter)->SetPose(this->GetWorldPose());
+    (*iter)->SetVelocity(this->GetWorldLinearVel());
+  }
+#endif
+
   // Apply our linear accel
   // this->SetForce(this->linearAccel);
 
@@ -429,6 +465,18 @@ void Link::Update()
 }
 
 /////////////////////////////////////////////////
+Joint_V Link::GetParentJoints() const
+{
+  return this->parentJoints;
+}
+
+/////////////////////////////////////////////////
+Joint_V Link::GetChildJoints() const
+{
+  return this->childJoints;
+}
+
+/////////////////////////////////////////////////
 Link_V Link::GetChildJointsLinks() const
 {
   Link_V links;
@@ -501,17 +549,7 @@ CollisionPtr Link::GetCollision(const std::string &_name)
 //////////////////////////////////////////////////
 Collision_V Link::GetCollisions() const
 {
-  Collision_V result;
-  Base_V::const_iterator biter;
-  for (biter = this->children.begin(); biter != this->children.end(); ++biter)
-  {
-    if ((*biter)->HasType(Base::COLLISION))
-    {
-      result.push_back(boost::static_pointer_cast<Collision>(*biter));
-    }
-  }
-
-  return result;
+  return this->collisions;
 }
 
 //////////////////////////////////////////////////
@@ -608,15 +646,14 @@ ModelPtr Link::GetModel() const
 math::Box Link::GetBoundingBox() const
 {
   math::Box box;
-  Base_V::const_iterator iter;
 
   box.min.Set(GZ_DBL_MAX, GZ_DBL_MAX, GZ_DBL_MAX);
   box.max.Set(0, 0, 0);
 
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (Collision_V::const_iterator iter = this->collisions.begin();
+       iter != this->collisions.end(); ++iter)
   {
-    if ((*iter)->HasType(Base::COLLISION))
-      box += boost::static_pointer_cast<Collision>(*iter)->GetBoundingBox();
+    box += (*iter)->GetBoundingBox();
   }
 
   return box;
@@ -640,47 +677,37 @@ void Link::SetInertial(const InertialPtr &/*_inertial*/)
 }
 
 //////////////////////////////////////////////////
-void Link::AddParentJoint(JointPtr _joint)
+math::Pose Link::GetWorldInertialPose() const
 {
-  this->parentJoints.push_back(_joint);
+  math::Pose inertialPose;
+  if (this->inertial)
+    inertialPose = this->inertial->GetPose();
+  return inertialPose + this->GetWorldPose();
 }
 
 //////////////////////////////////////////////////
-void Link::AddChildJoint(JointPtr _joint)
+math::Matrix3 Link::GetWorldInertiaMatrix() const
 {
-  this->childJoints.push_back(_joint);
+  math::Matrix3 moi;
+  if (this->inertial)
+  {
+    math::Vector3 pos = this->inertial->GetPose().pos;
+    math::Quaternion rot = this->GetWorldPose().rot.GetInverse();
+    moi = this->inertial->GetMOI(math::Pose(pos, rot));
+  }
+  return moi;
 }
 
 //////////////////////////////////////////////////
-void Link::RemoveParentJoint(JointPtr _joint)
+void Link::AddParentJoint(JointPtr _joint)
 {
-  for (std::vector<JointPtr>::iterator iter = this->parentJoints.begin();
-                                       iter != this->parentJoints.end();
-                                       ++iter)
-  {
-    /// @todo: can we assume there are no repeats?
-    if ((*iter)->GetName() == _joint->GetName())
-    {
-      this->parentJoints.erase(iter);
-      break;
-    }
-  }
+  this->parentJoints.push_back(_joint);
 }
 
 //////////////////////////////////////////////////
-void Link::RemoveChildJoint(JointPtr _joint)
+void Link::AddChildJoint(JointPtr _joint)
 {
-  for (std::vector<JointPtr>::iterator iter = this->childJoints.begin();
-                                       iter != this->childJoints.end();
-                                       ++iter)
-  {
-    /// @todo: can we assume there are no repeats?
-    if ((*iter)->GetName() == _joint->GetName())
-    {
-      this->childJoints.erase(iter);
-      break;
-    }
-  }
+  this->childJoints.push_back(_joint);
 }
 
 //////////////////////////////////////////////////
@@ -718,15 +745,17 @@ void Link::RemoveChildJoint(const std::string &_jointName)
 //////////////////////////////////////////////////
 void Link::FillMsg(msgs::Link &_msg)
 {
+  math::Pose relPose = this->GetRelativePose();
+
   _msg.set_id(this->GetId());
   _msg.set_name(this->GetScopedName());
   _msg.set_self_collide(this->GetSelfCollide());
   _msg.set_gravity(this->GetGravityMode());
   _msg.set_kinematic(this->GetKinematic());
   _msg.set_enabled(this->GetEnabled());
-  msgs::Set(_msg.mutable_pose(), this->GetRelativePose());
+  msgs::Set(_msg.mutable_pose(), relPose);
 
-  msgs::Set(this->visualMsg->mutable_pose(), this->GetRelativePose());
+  msgs::Set(this->visualMsg->mutable_pose(), relPose);
   _msg.add_visual()->CopyFrom(*this->visualMsg);
 
   _msg.mutable_inertial()->set_mass(this->inertial->GetMass());
@@ -738,36 +767,29 @@ void Link::FillMsg(msgs::Link &_msg)
   _msg.mutable_inertial()->set_izz(this->inertial->GetIZZ());
   msgs::Set(_msg.mutable_inertial()->mutable_pose(), this->inertial->GetPose());
 
-  for (unsigned int j = 0; j < this->GetChildCount(); j++)
+  for (Collision_V::iterator iter = this->collisions.begin();
+      iter != this->collisions.end(); ++iter)
   {
-    if (this->GetChild(j)->HasType(Base::COLLISION))
-    {
-      CollisionPtr coll = boost::dynamic_pointer_cast<Collision>(
-          this->GetChild(j));
-      coll->FillMsg(*_msg.add_collision());
-    }
+    (*iter)->FillMsg(*_msg.add_collision());
   }
 
   for (std::vector<std::string>::iterator iter = this->sensors.begin();
-       iter != this->sensors.end(); ++iter)
+      iter != this->sensors.end(); ++iter)
   {
     sensors::SensorPtr sensor = sensors::get_sensor(*iter);
     if (sensor)
       sensor->FillMsg(*_msg.add_sensor());
   }
 
-  if (this->sdf->HasElement("visual"))
-  {
-    sdf::ElementPtr visualElem = this->sdf->GetElement("visual");
-    while (visualElem)
-    {
-      msgs::Visual *vis = _msg.add_visual();
-      vis->CopyFrom(msgs::VisualFromSDF(visualElem));
-      vis->set_name(this->GetScopedName() + "::" + vis->name());
-      vis->set_parent_name(this->GetScopedName());
+  // Parse visuals from SDF
+  if (this->visuals.empty())
+    this->ParseVisuals();
 
-      visualElem = visualElem->GetNextElement("visual");
-    }
+  for (Visuals_M::iterator iter = this->visuals.begin();
+      iter != this->visuals.end(); ++iter)
+  {
+    msgs::Visual *vis = _msg.add_visual();
+    vis->CopyFrom(iter->second);
   }
 
   if (this->sdf->HasElement("projector"))
@@ -775,13 +797,17 @@ void Link::FillMsg(msgs::Link &_msg)
     sdf::ElementPtr elem = this->sdf->GetElement("projector");
 
     msgs::Projector *proj = _msg.add_projector();
-    proj->set_name(this->GetScopedName() + "::" + elem->GetValueString("name"));
-    proj->set_texture(elem->GetValueString("texture"));
-    proj->set_fov(elem->GetValueDouble("fov"));
-    proj->set_near_clip(elem->GetValueDouble("near_clip"));
-    proj->set_far_clip(elem->GetValueDouble("far_clip"));
-    msgs::Set(proj->mutable_pose(), elem->GetValuePose("pose"));
+    proj->set_name(
+        this->GetScopedName() + "::" + elem->Get<std::string>("name"));
+    proj->set_texture(elem->Get<std::string>("texture"));
+    proj->set_fov(elem->Get<double>("fov"));
+    proj->set_near_clip(elem->Get<double>("near_clip"));
+    proj->set_far_clip(elem->Get<double>("far_clip"));
+    msgs::Set(proj->mutable_pose(), elem->Get<math::Pose>("pose"));
   }
+
+  if (this->IsCanonicalLink())
+    _msg.set_canonical(true);
 }
 
 //////////////////////////////////////////////////
@@ -829,7 +855,6 @@ void Link::ProcessMsg(const msgs::Link &_msg)
     this->UpdateSurface();
 }
 
-
 //////////////////////////////////////////////////
 unsigned int Link::GetSensorCount() const
 {
@@ -894,9 +919,9 @@ void Link::OnPoseChange()
 }
 
 //////////////////////////////////////////////////
-void Link::SetState(const LinkState & /*_state*/)
+void Link::SetState(const LinkState &_state)
 {
-  // this->SetRelativePose(_state.GetPose());
+  this->SetWorldPose(_state.GetPose());
 
   /*
   for (unsigned int i = 0; i < _state.GetCollisionStateCount(); ++i)
@@ -914,7 +939,7 @@ void Link::SetState(const LinkState & /*_state*/)
 double Link::GetLinearDamping() const
 {
   if (this->sdf->HasElement("velocity_decay"))
-    return this->sdf->GetElement("velocity_decay")->GetValueDouble("linear");
+    return this->sdf->GetElement("velocity_decay")->Get<double>("linear");
   else
     return 0.0;
 }
@@ -923,7 +948,7 @@ double Link::GetLinearDamping() const
 double Link::GetAngularDamping() const
 {
   if (this->sdf->HasElement("velocity_decay"))
-    return this->sdf->GetElement("velocity_decay")->GetValueDouble("angular");
+    return this->sdf->GetElement("velocity_decay")->Get<double>("angular");
   else
     return 0.0;
 }
@@ -932,3 +957,202 @@ double Link::GetAngularDamping() const
 void Link::SetKinematic(const bool &/*_kinematic*/)
 {
 }
+
+/////////////////////////////////////////////////
+void Link::SetPublishData(bool _enable)
+{
+  {
+    boost::recursive_mutex::scoped_lock lock(*this->publishDataMutex);
+    if (this->publishData == _enable)
+      return;
+
+    this->publishData = _enable;
+  }
+  if (_enable)
+  {
+    std::string topic = "~/" + this->GetScopedName();
+    this->dataPub = this->node->Advertise<msgs::LinkData>(topic);
+    this->connections.push_back(
+      event::Events::ConnectWorldUpdateEnd(
+        boost::bind(&Link::PublishData, this)));
+  }
+  else
+  {
+    this->dataPub.reset();
+    this->connections.clear();
+  }
+}
+
+/////////////////////////////////////////////////
+void Link::PublishData()
+{
+  if (this->publishData && this->dataPub->HasConnections())
+  {
+    msgs::Set(this->linkDataMsg.mutable_time(), this->world->GetSimTime());
+    linkDataMsg.set_name(this->GetScopedName());
+    msgs::Set(this->linkDataMsg.mutable_linear_velocity(),
+        this->GetWorldLinearVel());
+    msgs::Set(this->linkDataMsg.mutable_angular_velocity(),
+        this->GetWorldAngularVel());
+    this->dataPub->Publish(this->linkDataMsg);
+  }
+}
+
+//////////////////////////////////////////////////
+void Link::OnCollision(ConstContactsPtr &_msg)
+{
+  std::string collisionName1;
+  std::string collisionName2;
+  std::string::size_type pos1, pos2;
+
+  for (int i = 0; i < _msg->contact_size(); ++i)
+  {
+    collisionName1 = _msg->contact(i).collision1();
+    collisionName2 = _msg->contact(i).collision2();
+    pos1 = collisionName1.rfind("::");
+    pos2 = collisionName2.rfind("::");
+
+    GZ_ASSERT(pos1 != std::string::npos, "Invalid collision name");
+    GZ_ASSERT(pos2 != std::string::npos, "Invalid collision name");
+
+    collisionName1 = collisionName1.substr(pos1+2);
+    collisionName2 = collisionName2.substr(pos2+2);
+
+#ifdef HAVE_OPENAL
+    for (std::vector<util::OpenALSourcePtr>::iterator iter =
+        this->audioSources.begin(); iter != this->audioSources.end(); ++iter)
+    {
+      if ((*iter)->HasCollisionName(collisionName1) ||
+          (*iter)->HasCollisionName(collisionName2))
+        (*iter)->Play();
+    }
+#endif
+  }
+}
+
+/////////////////////////////////////////////////
+void Link::ParseVisuals()
+{
+  // TODO: this shouldn't be in the physics sim
+  if (this->sdf->HasElement("visual"))
+  {
+    sdf::ElementPtr visualElem = this->sdf->GetElement("visual");
+    while (visualElem)
+    {
+      msgs::Visual msg = msgs::VisualFromSDF(visualElem);
+
+      std::string visName = this->GetScopedName() + "::" + msg.name();
+      msg.set_name(visName);
+      msg.set_id(physics::getUniqueId());
+      msg.set_parent_name(this->GetScopedName());
+      msg.set_parent_id(this->GetId());
+      msg.set_is_static(this->IsStatic());
+
+      this->visPub->Publish(msg);
+
+      Visuals_M::iterator iter = this->visuals.find(msg.id());
+      if (iter != this->visuals.end())
+        gzthrow(std::string("Duplicate visual name[")+msg.name()+"]\n");
+
+      this->visuals[msg.id()] = msg;
+
+      visualElem = visualElem->GetNextElement("visual");
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void Link::RemoveChild(EntityPtr _child)
+{
+  if (_child->HasType(COLLISION))
+  {
+    this->RemoveCollision(_child->GetScopedName());
+  }
+
+  Entity::RemoveChild(_child->GetId());
+
+  this->SetEnabled(true);
+}
+
+/////////////////////////////////////////////////
+void Link::RemoveCollision(const std::string &_name)
+{
+  for (Collision_V::iterator iter = this->collisions.begin();
+       iter != this->collisions.end(); ++iter)
+  {
+    if ((*iter)->GetName() == _name || (*iter)->GetScopedName() == _name)
+    {
+      this->collisions.erase(iter);
+      break;
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void Link::SetScale(const math::Vector3 &_scale)
+{
+  Base_V::const_iterator biter;
+  for (biter = this->children.begin(); biter != this->children.end(); ++biter)
+  {
+    if ((*biter)->HasType(Base::COLLISION))
+    {
+      boost::static_pointer_cast<Collision>(*biter)->SetScale(_scale);
+    }
+  }
+
+/*  for (unsigned int i = 0; i < this->visuals.size(); ++i)
+  {
+    msgs::Visual msg;
+    msg.set_name(this->visuals[i]);
+    if (this->parent)
+      msg.set_parent_name(this->parent->GetScopedName());
+    else
+      msg.set_parent_name("");
+
+    msgs::Set(msg.mutable_scale(), _scale);
+
+    this->visPub->Publish(msg);
+  }*/
+}
+
+/////////////////////////////////////////////////
+double Link::GetWorldEnergyPotential() const
+{
+  // compute gravitational potential energy for link CG location
+  // use origin as reference position
+  // E = -m g^T z
+  double m = this->GetInertial()->GetMass();
+  math::Vector3 g = this->GetWorld()->GetPhysicsEngine()->GetGravity();
+  math::Vector3 z = this->GetWorldCoGPose().pos;
+  return -m * g.Dot(z);
+}
+
+/////////////////////////////////////////////////
+double Link::GetWorldEnergyKinetic() const
+{
+  double energy = 0.0;
+
+  // compute linear kinetic energy
+  // E = 1/2 m v^T v
+  {
+    double m = this->GetInertial()->GetMass();
+    math::Vector3 v = this->GetWorldCoGLinearVel();
+    energy += 0.5 * m * v.Dot(v);
+  }
+
+  // compute angular kinetic energy
+  // E = 1/2 w^T I w
+  {
+    math::Vector3 w = this->GetWorldAngularVel();
+    math::Matrix3 I = this->GetWorldInertiaMatrix();
+    energy += 0.5 * w.Dot(I * w);
+  }
+
+  return energy;
+}
+
+/////////////////////////////////////////////////
+double Link::GetWorldEnergy() const
+{
+  return this->GetWorldEnergyPotential() + this->GetWorldEnergyKinetic();
+}
diff --git a/gazebo/physics/Link.hh b/gazebo/physics/Link.hh
index 9069bea..4562328 100644
--- a/gazebo/physics/Link.hh
+++ b/gazebo/physics/Link.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,10 @@
 #include <vector>
 #include <string>
 
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/TransportTypes.hh"
+
+#include "gazebo/util/UtilTypes.hh"
 #include "gazebo/common/Event.hh"
 #include "gazebo/common/CommonTypes.hh"
 
@@ -32,9 +36,16 @@
 #include "gazebo/physics/Entity.hh"
 #include "gazebo/physics/Inertial.hh"
 #include "gazebo/physics/Joint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
+  namespace util
+  {
+    class OpenALSource;
+    class OpenALSink;
+  }
+
   namespace physics
   {
     class Model;
@@ -47,7 +58,7 @@ namespace gazebo
     /// \brief Link class defines a rigid body entity, containing
     /// information on inertia, visual and collision properties of
     /// a rigid body.
-    class Link : public Entity
+    class GAZEBO_VISIBLE Link : public Entity
     {
       /// \brief Constructor
       /// \param[in] _parent Parent of this link.
@@ -76,8 +87,14 @@ namespace gazebo
       /// \param[in] _sdf SDF values to load from.
       public: virtual void UpdateParameters(sdf::ElementPtr _sdf);
 
-      /// \brief Update the body.
-      public: virtual void Update();
+      /// \brief Update the collision.
+      /// \param[in] _info Update information.
+      public: void Update(const common::UpdateInfo &_info);
+      using Base::Update;
+
+      /// \brief Set the scale of the link.
+      /// \param[in] _scale Scale to set the link to.
+      public: void SetScale(const math::Vector3 &_scale);
 
       /// \brief Set whether this body is enabled.
       /// \param[in] _enable True to enable the link in the physics engine.
@@ -105,7 +122,6 @@ namespace gazebo
       /// \param[in] _collid True to enable collisions.
       public: virtual void SetSelfCollide(bool _collide) = 0;
 
-
       /// \brief Set the collide mode of the body.
       /// \param[in] _mode Collision Mode,
       /// this can be: [all|none|sensors|fixed|ghost]
@@ -119,7 +135,7 @@ namespace gazebo
       /// \brief Get Self-Collision Flag, if this is true, this body will
       /// collide with other bodies even if they share the same parent.
       /// \return True if self collision is enabled.
-      public: bool GetSelfCollide();
+      public: bool GetSelfCollide() const;
 
       /// \brief Set the laser retro reflectiveness.
       /// \param[in] _retro Retro value for all child collisions.
@@ -187,6 +203,12 @@ namespace gazebo
       ///         frame.
       public: math::Pose GetWorldCoGPose() const;
 
+      /// \brief Get the linear velocity of the origin of the link frame,
+      ///        expressed in the world frame.
+      /// \return Linear velocity of the link frame.
+      public: virtual math::Vector3 GetWorldLinearVel() const
+              {return this->GetWorldLinearVel(math::Vector3::Zero);}
+
       /// \brief Get the linear velocity of a point on the body in the world
       ///        frame, using an offset expressed in a body-fixed frame. If
       ///        no offset is given, the velocity at the origin of the Link
@@ -195,7 +217,7 @@ namespace gazebo
       ///                    frame, expressed in the body-fixed frame.
       /// \return Linear velocity of the point on the body
       public: virtual math::Vector3 GetWorldLinearVel(
-          const math::Vector3 &_offset = math::Vector3(0, 0, 0)) const = 0;
+                  const math::Vector3 &_offset) const = 0;
 
       /// \brief Get the linear velocity of a point on the body in the world
       ///        frame, using an offset expressed in an arbitrary frame.
@@ -267,6 +289,18 @@ namespace gazebo
       /// \parma[in] _inertial Inertial value for the link.
       public: void SetInertial(const InertialPtr &_inertial);
 
+      /// \brief Get the world pose of the link inertia (cog position
+      /// and Moment of Inertia frame). This differs from GetWorldCoGPose(),
+      /// which returns the cog position in the link frame
+      /// (not the Moment of Inertia frame).
+      /// \return Inertial pose in world frame.
+      public: math::Pose GetWorldInertialPose() const;
+
+      /// \brief Get the inertia matrix in the world frame.
+      /// \return Inertia matrix in world frame, returns matrix
+      /// of zeros if link has no inertia.
+      public: math::Matrix3 GetWorldInertiaMatrix() const;
+
       /// \cond
       /// This is an internal function
       /// \brief Get a collision by id.
@@ -369,14 +403,6 @@ namespace gazebo
       /// \param[in] _joint Joint that is a parent of this link.
       public: void AddParentJoint(JointPtr _joint);
 
-      /// \brief Remove Joints that have this Link as a parent Link.
-      /// \param[in] _joint Joint that is a child of this link.
-      public: void RemoveChildJoint(JointPtr _joint) GAZEBO_DEPRECATED(1.5);
-
-      /// \brief Remove Joints that have this Link as a child Link
-      /// \param[in] _joint Joint that is a parent of this link.
-      public: void RemoveParentJoint(JointPtr _joint) GAZEBO_DEPRECATED(1.5);
-
       /// \brief Remove Joints that have this Link as a child Link.
       /// \param[in] _jointName Parent Joint name.
       public: void RemoveParentJoint(const std::string &_jointName);
@@ -385,6 +411,10 @@ namespace gazebo
       /// \param[in] _jointName Child Joint name.
       public: void RemoveChildJoint(const std::string &_jointName);
 
+      // Documentation inherited.
+      public: virtual void RemoveChild(EntityPtr _child);
+      using Base::RemoveChild;
+
       /// \brief Attach a static model to this link
       /// \param[in] _model Pointer to a static model.
       /// \param[in] _offset Pose relative to this link to place the model.
@@ -424,6 +454,44 @@ namespace gazebo
       /// \return Vector of parent Links connected by joints.
       public: Link_V GetParentJointsLinks() const;
 
+      /// \brief Enable/Disable link data publishing
+      /// \param[in] _enable True to enable publishing, false to stop publishing
+      public: void SetPublishData(bool _enable);
+
+      /// \brief Get the parent joints.
+      public: Joint_V GetParentJoints() const;
+
+      /// \brief Get the child joints.
+      public: Joint_V GetChildJoints() const;
+
+      /// \brief Remove a collision from the link.
+      /// \param[int] _name Name of the collision to remove.
+      public: void RemoveCollision(const std::string &_name);
+
+      /// \brief Returns this link's potential energy,
+      /// based on position in world frame and gravity.
+      /// \return this link's potential energy,
+      public: double GetWorldEnergyPotential() const;
+
+      /// \brief Returns this link's kinetic energy
+      /// computed using link's CoG velocity in the inertial (world) frame.
+      /// \return this link's kinetic energy
+      public: double GetWorldEnergyKinetic() const;
+
+      /// \brief Returns this link's total energy, or
+      /// sum of Link::GetWorldEnergyPotential() and
+      /// Link::GetWorldEnergyKinetic().
+      /// \return this link's total energy
+      public: double GetWorldEnergy() const;
+
+      /// \brief Freeze link to ground (inertial frame).
+      /// \param[in] _static if true, freeze link to ground.  Otherwise
+      /// unfreeze link.
+      public: virtual void SetLinkStatic(bool _static) = 0;
+
+      /// \brief Publish timestamped link data such as velocity.
+      private: void PublishData();
+
       /// \brief Load a new collision helper function.
       /// \param[in] _sdf SDF element used to load the collision.
       private: void LoadCollision(sdf::ElementPtr _sdf);
@@ -432,14 +500,25 @@ namespace gazebo
       /// entities.
       private: void SetInertialFromCollisions();
 
+      /// \brief On collision callback.
+      /// \param[in] _msg Message that contains contact information.
+      private: void OnCollision(ConstContactsPtr &_msg);
+
+      /// \brief Parse visuals from SDF
+      private: void ParseVisuals();
+
       /// \brief Inertial properties.
       protected: InertialPtr inertial;
 
       /// \brief Center of gravity visual elements.
       protected: std::vector<std::string> cgVisuals;
 
+      /// \def Visuals_M
+      /// \brief Map of unique ID to visual message.
+      typedef std::map<uint32_t, msgs::Visual> Visuals_M;
+
       /// \brief Link visual elements.
-      protected: std::vector<std::string> visuals;
+      protected: Visuals_M visuals;
 
       /// \brief Linear acceleration.
       protected: math::Vector3 linearAccel;
@@ -450,6 +529,9 @@ namespace gazebo
       /// \brief Offsets for the attached models.
       protected: std::vector<math::Pose> attachedModelsOffset;
 
+      /// \brief This flag is set to true when the link is initialized.
+      protected: bool initialized;
+
       /// \brief Event used when the link is enabled or disabled.
       private: event::EventT<void (bool)> enabledSignal;
 
@@ -467,6 +549,33 @@ namespace gazebo
 
       /// \brief All the attached models.
       private: std::vector<ModelPtr> attachedModels;
+
+      /// \brief Link data publisher
+      private: transport::PublisherPtr dataPub;
+
+      /// \brief Link data message
+      private: msgs::LinkData linkDataMsg;
+
+      /// \brief True to publish data, false otherwise
+      private: bool publishData;
+
+      /// \brief Mutex to protect the publishData variable
+      private: boost::recursive_mutex *publishDataMutex;
+
+      /// \brief Cached list of collisions. This is here for performance.
+      private: Collision_V collisions;
+
+#ifdef HAVE_OPENAL
+      /// \brief All the audio sources
+      private: std::vector<util::OpenALSourcePtr> audioSources;
+
+      /// \brief An audio sink
+      private: util::OpenALSinkPtr audioSink;
+
+      /// \brief Subscriber to contacts with this collision. Used for audio
+      /// playback.
+      private: transport::SubscriberPtr audioContactsSub;
+#endif
     };
     /// \}
   }
diff --git a/gazebo/physics/LinkState.cc b/gazebo/physics/LinkState.cc
index 832a4aa..ed93142 100644
--- a/gazebo/physics/LinkState.cc
+++ b/gazebo/physics/LinkState.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License")
  * you may not use this file except in compliance with the License.
@@ -31,24 +31,40 @@ LinkState::LinkState()
 }
 
 /////////////////////////////////////////////////
+LinkState::LinkState(const LinkPtr _link, const common::Time &_realTime,
+                  const common::Time &_simTime)
+  : State(_link->GetName(), _realTime, _simTime)
+{
+  this->pose = _link->GetWorldPose();
+  this->velocity = math::Pose(_link->GetWorldLinearVel(),
+                   math::Quaternion(_link->GetWorldAngularVel()));
+  this->acceleration = math::Pose(_link->GetWorldLinearAccel(),
+                       math::Quaternion(_link->GetWorldAngularAccel()));
+  this->wrench = math::Pose(_link->GetWorldForce(), math::Quaternion());
+}
+
+/////////////////////////////////////////////////
 LinkState::LinkState(const LinkPtr _link)
   : State(_link->GetName(), _link->GetWorld()->GetRealTime(),
           _link->GetWorld()->GetSimTime())
 {
-  this->pose = _link->GetRelativePose();
-  this->velocity = math::Pose(_link->GetRelativeLinearVel(),
-                   math::Quaternion(_link->GetRelativeAngularVel()));
-  this->acceleration = math::Pose(_link->GetRelativeLinearAccel(),
-                       math::Quaternion(_link->GetRelativeAngularAccel()));
-  this->wrench = math::Pose(_link->GetRelativeForce(), math::Quaternion());
-
-  // Create all the collision states.
-  Collision_V collisions = _link->GetCollisions();
-  for (Collision_V::const_iterator iter = collisions.begin();
-       iter != collisions.end(); ++iter)
-  {
-    this->collisionStates.push_back(CollisionState(*iter));
-  }
+  this->pose = _link->GetWorldPose();
+  this->velocity = math::Pose(_link->GetWorldLinearVel(),
+                   math::Quaternion(_link->GetWorldAngularVel()));
+  this->acceleration = math::Pose(_link->GetWorldLinearAccel(),
+                       math::Quaternion(_link->GetWorldAngularAccel()));
+  this->wrench = math::Pose(_link->GetWorldForce(), math::Quaternion());
+
+  // Disabling CollisionStates to improve performance. This information is
+  // probably not required.
+  //
+  // // Create all the collision states.
+  // Collision_V collisions = _link->GetCollisions();
+  // for (Collision_V::const_iterator iter = collisions.begin();
+  //      iter != collisions.end(); ++iter)
+  // {
+  //   this->collisionStates.push_back(CollisionState(*iter));
+  // }
 }
 
 /////////////////////////////////////////////////
@@ -64,32 +80,49 @@ LinkState::~LinkState()
 }
 
 /////////////////////////////////////////////////
+void LinkState::Load(const LinkPtr _link, const common::Time &_realTime,
+    const common::Time &_simTime)
+{
+  this->name = _link->GetName();
+  this->wallTime = common::Time::GetWallTime();
+  this->realTime = _realTime;
+  this->simTime = _simTime;
+
+  this->pose = _link->GetWorldPose();
+  this->velocity.Set(_link->GetWorldLinearVel(),
+                     _link->GetWorldAngularVel());
+  this->acceleration.Set(_link->GetWorldLinearAccel(),
+                         _link->GetWorldAngularAccel());
+  this->wrench.Set(_link->GetWorldForce(), math::Quaternion());
+}
+
+/////////////////////////////////////////////////
 void LinkState::Load(const sdf::ElementPtr _elem)
 {
   // Set the name
-  this->name = _elem->GetValueString("name");
+  this->name = _elem->Get<std::string>("name");
 
   // Set the link name
   if (_elem->HasElement("pose"))
-    this->pose = _elem->GetValuePose("pose");
+    this->pose = _elem->Get<math::Pose>("pose");
   else
     this->pose.Set(0, 0, 0, 0, 0, 0);
 
   // Set the link velocity
   if (_elem->HasElement("velocity"))
-    this->velocity = _elem->GetValuePose("velocity");
+    this->velocity = _elem->Get<math::Pose>("velocity");
   else
     this->velocity.Set(0, 0, 0, 0, 0, 0);
 
   // Set the link acceleration
   if (_elem->HasElement("acceleration"))
-    this->acceleration = _elem->GetValuePose("acceleration");
+    this->acceleration = _elem->Get<math::Pose>("acceleration");
   else
     this->acceleration.Set(0, 0, 0, 0, 0, 0);
 
   // Set the link wrench
   if (_elem->HasElement("wrench"))
-    this->wrench = _elem->GetValuePose("wrench");
+    this->wrench = _elem->Get<math::Pose>("wrench");
   else
     this->wrench.Set(0, 0, 0, 0, 0, 0);
 }
@@ -159,19 +192,18 @@ const std::vector<CollisionState> &LinkState::GetCollisionStates() const
 /////////////////////////////////////////////////
 bool LinkState::IsZero() const
 {
-  bool result = true;
-
-  for (std::vector<CollisionState>::const_iterator iter =
-       this->collisionStates.begin();
-       iter != this->collisionStates.end() && result; ++iter)
-  {
-    result = result && (*iter).IsZero();
-  }
-
-  return result && this->pose == math::Pose::Zero &&
-         this->velocity == math::Pose::Zero &&
-         this->acceleration == math::Pose::Zero &&
-         this->wrench == math::Pose::Zero;
+  // Disabled for efficiency
+  // bool result = true;
+  // for (std::vector<CollisionState>::const_iterator iter =
+  //      this->collisionStates.begin();
+  //      iter != this->collisionStates.end() && result; ++iter)
+  // {
+  //   result = result && (*iter).IsZero();
+  // }
+
+  // return result && this->pose == math::Pose::Zero;
+
+  return this->pose == math::Pose::Zero;
 }
 
 /////////////////////////////////////////////////
@@ -191,16 +223,16 @@ LinkState &LinkState::operator=(const LinkState &_state)
   // Copy the wrench
   this->wrench = _state.wrench;
 
+  // Disabled for efficiency
   // Clear the collision states
-  this->collisionStates.clear();
-
-  // Copy the collision states
-  for (std::vector<CollisionState>::const_iterator iter =
-       _state.collisionStates.begin();
-       iter != _state.collisionStates.end(); ++iter)
-  {
-    this->collisionStates.push_back(*iter);
-  }
+  // this->collisionStates.clear();
+  //// Copy the collision states
+  // for (std::vector<CollisionState>::const_iterator iter =
+  //     _state.collisionStates.begin();
+  //     iter != _state.collisionStates.end(); ++iter)
+  // {
+  //  this->collisionStates.push_back(*iter);
+  // }
 
   return *this;
 }
@@ -219,15 +251,17 @@ LinkState LinkState::operator-(const LinkState &_state) const
   result.acceleration = this->acceleration - _state.acceleration;
   result.wrench = this->wrench - _state.wrench;
 
+  // Disabled for efficiency
   // Insert the collision differences
-  for (std::vector<CollisionState>::const_iterator iter =
-       _state.collisionStates.begin();
-       iter != _state.collisionStates.end(); ++iter)
-  {
-    CollisionState state = this->GetCollisionState((*iter).GetName()) - *iter;
-    if (!state.IsZero())
-      result.collisionStates.push_back(state);
-  }
+  // for (std::vector<CollisionState>::const_iterator iter =
+  //      _state.collisionStates.begin();
+  //      iter != _state.collisionStates.end(); ++iter)
+  // {
+  //   CollisionState state =
+  //   this->GetCollisionState((*iter).GetName()) - *iter;
+  //   if (!state.IsZero())
+  //     result.collisionStates.push_back(state);
+  // }
 
   return result;
 }
@@ -246,14 +280,16 @@ LinkState LinkState::operator+(const LinkState &_state) const
   result.acceleration = this->acceleration + _state.acceleration;
   result.wrench = this->wrench + _state.wrench;
 
+  // Disabled for efficiency
   // Insert the collision differences
-  for (std::vector<CollisionState>::const_iterator iter =
-       _state.collisionStates.begin();
-       iter != _state.collisionStates.end(); ++iter)
-  {
-    CollisionState state = this->GetCollisionState((*iter).GetName()) + *iter;
-    result.collisionStates.push_back(state);
-  }
+  // for (std::vector<CollisionState>::const_iterator iter =
+  //      _state.collisionStates.begin();
+  //      iter != _state.collisionStates.end(); ++iter)
+  // {
+  //   CollisionState state =
+  //   this->GetCollisionState((*iter).GetName()) + *iter;
+  //   result.collisionStates.push_back(state);
+  // }
 
   return result;
 }
@@ -269,11 +305,51 @@ void LinkState::FillSDF(sdf::ElementPtr _sdf)
   _sdf->GetElement("acceleration")->Set(this->acceleration);
   _sdf->GetElement("wrench")->Set(this->wrench);
 
-  for (std::vector<CollisionState>::iterator iter =
-       this->collisionStates.begin();
+  // Disabled for efficiency
+  // for (std::vector<CollisionState>::iterator iter =
+  //      this->collisionStates.begin();
+  //      iter != this->collisionStates.end(); ++iter)
+  // {
+  //   sdf::ElementPtr elem = _sdf->AddElement("collision");
+  //   (*iter).FillSDF(elem);
+  // }
+}
+
+/////////////////////////////////////////////////
+void LinkState::SetWallTime(const common::Time &_time)
+{
+  State::SetWallTime(_time);
+
+  for (std::vector<CollisionState>::iterator
+       iter = this->collisionStates.begin();
+       iter != this->collisionStates.end(); ++iter)
+  {
+    (*iter).SetWallTime(_time);
+  }
+}
+
+/////////////////////////////////////////////////
+void LinkState::SetRealTime(const common::Time &_time)
+{
+  State::SetRealTime(_time);
+
+  for (std::vector<CollisionState>::iterator
+       iter = this->collisionStates.begin();
+       iter != this->collisionStates.end(); ++iter)
+  {
+    (*iter).SetRealTime(_time);
+  }
+}
+
+/////////////////////////////////////////////////
+void LinkState::SetSimTime(const common::Time &_time)
+{
+  State::SetSimTime(_time);
+
+  for (std::vector<CollisionState>::iterator
+       iter = this->collisionStates.begin();
        iter != this->collisionStates.end(); ++iter)
   {
-    sdf::ElementPtr elem = _sdf->AddElement("collision");
-    (*iter).FillSDF(elem);
+    (*iter).SetSimTime(_time);
   }
 }
diff --git a/gazebo/physics/LinkState.hh b/gazebo/physics/LinkState.hh
index d485653..311cdb1 100644
--- a/gazebo/physics/LinkState.hh
+++ b/gazebo/physics/LinkState.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,10 +24,12 @@
 #include <vector>
 #include <string>
 
-#include "gazebo/sdf/sdf.hh"
+#include <sdf/sdf.hh>
+
 #include "gazebo/physics/State.hh"
 #include "gazebo/physics/CollisionState.hh"
 #include "gazebo/math/Pose.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -44,7 +46,7 @@ namespace gazebo
     ///
     /// State of a Link includes the state of itself all its child Collision
     /// entities.
-    class LinkState : public State
+    class GAZEBO_VISIBLE LinkState : public State
     {
       /// \brief Default constructor
       public: LinkState();
@@ -54,6 +56,16 @@ namespace gazebo
       /// Build a LinkState from an existing Link.
       /// \param[in] _model Pointer to the Link from which to gather state
       /// info.
+      /// \param[in] _realTime Real time stamp.
+      /// \param[in] _simTime Sim time stamp
+      public: LinkState(const LinkPtr _link, const common::Time &_realTime,
+                  const common::Time &_simTime);
+
+      /// \brief Constructor
+      ///
+      /// Build a LinkState from an existing Link.
+      /// \param[in] _model Pointer to the Link from which to gather state
+      /// info.
       public: explicit LinkState(const LinkPtr _link);
 
       /// \brief Constructor
@@ -65,6 +77,16 @@ namespace gazebo
       /// \brief Destructor.
       public: virtual ~LinkState();
 
+      /// \brief Load a LinkState from a Link pointer.
+      ///
+      /// Build a LinkState from an existing Link.
+      /// \param[in] _model Pointer to the Link from which to gather state
+      /// info.
+      /// \param[in] _realTime Real time stamp.
+      /// \param[in] _simTime Sim time stamp
+      public: void Load(const LinkPtr _link, const common::Time &_realTime,
+                  const common::Time &_simTime);
+
       /// \brief Load state from SDF element.
       ///
       /// Load LinkState information from stored data in and SDF::Element.
@@ -124,6 +146,19 @@ namespace gazebo
       /// \param[out] _sdf SDF element to populate.
       public: void FillSDF(sdf::ElementPtr _sdf);
 
+      /// \brief Set the wall time when this state was generated
+      /// \param[in] _time The absolute clock time when the State
+      /// data was recorded.
+      public: virtual void SetWallTime(const common::Time &_time);
+
+      /// \brief Set the real time when this state was generated
+      /// \param[in] _time Clock time since simulation was stated.
+      public: virtual void SetRealTime(const common::Time &_time);
+
+      /// \brief Set the sim time when this state was generated
+      /// \param[in] _time Simulation time when the data was recorded.
+      public: virtual void SetSimTime(const common::Time &_time);
+
       /// \brief Assignment operator
       /// \param[in] _state State value
       /// \return this
@@ -143,24 +178,44 @@ namespace gazebo
       /// \param[in] _out output stream
       /// \param[in] _state Link state to output
       /// \return the stream
-      public: friend std::ostream &operator<<(std::ostream &_out,
-                                     const gazebo::physics::LinkState &_state)
+      public: inline friend std::ostream &operator<<(std::ostream &_out,
+                  const gazebo::physics::LinkState &_state)
       {
-        _out << "    <link name='" << _state.name << "'>\n";
-        _out << "      <pose>" << _state.pose << "</pose>\n";
-        _out << "      <velocity>" << _state.velocity << "</velocity>\n";
-        _out << "      <acceleration>" << _state.acceleration
-             << "</acceleration>\n";
-        _out << "      <wrench>" << _state.wrench << "</wrench>\n";
-
-        for (std::vector<CollisionState>::const_iterator iter =
-             _state.collisionStates.begin();
-             iter != _state.collisionStates.end(); ++iter)
-        {
-          _out << *iter;
-        }
-
-        _out << "    </link>\n";
+        math::Vector3 q(_state.pose.rot.GetAsEuler());
+        _out << std::fixed <<std::setprecision(5)
+          << "<link name='" << _state.name << "'>"
+          << "<pose>"
+          << _state.pose.pos.x << " "
+          << _state.pose.pos.y << " "
+          << _state.pose.pos.z << " "
+          << q.x << " "
+          << q.y << " "
+          << q.z << " "
+          << "</pose>";
+
+        /// Disabling this for efficiency.
+        q = _state.velocity.rot.GetAsEuler();
+         _out << std::fixed <<std::setprecision(4)
+           << "<velocity>"
+           << _state.velocity.pos.x << " "
+           << _state.velocity.pos.y << " "
+           << _state.velocity.pos.z << " "
+           << q.x << " "
+           << q.y << " "
+           << q.z << " "
+           << "</velocity>";
+        // << "<acceleration>" << _state.acceleration << "</acceleration>"
+        // << "<wrench>" << _state.wrench << "</wrench>";
+
+        /// Disabling this for efficiency.
+        // for (std::vector<CollisionState>::const_iterator iter =
+        //      _state.collisionStates.begin();
+        //      iter != _state.collisionStates.end(); ++iter)
+        // {
+        //   _out << *iter;
+        // }
+
+        _out << "</link>";
 
         return _out;
       }
diff --git a/gazebo/physics/MapShape.cc b/gazebo/physics/MapShape.cc
index 920cd39..c703484 100644
--- a/gazebo/physics/MapShape.cc
+++ b/gazebo/physics/MapShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,14 +21,15 @@
 #include <string.h>
 #include <math.h>
 
-#include "common/Image.hh"
-#include "common/Exception.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Image.hh"
+#include "gazebo/common/Exception.hh"
 
-#include "physics/World.hh"
-#include "physics/PhysicsEngine.hh"
-#include "physics/BoxShape.hh"
-#include "physics/Collision.hh"
-#include "physics/MapShape.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/BoxShape.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/MapShape.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -63,14 +64,14 @@ void MapShape::Load(sdf::ElementPtr _sdf)
 {
   Base::Load(_sdf);
 
-  std::string imageFilename = _sdf->GetValueString("uri");
+  std::string imageFilename = _sdf->Get<std::string>("uri");
 
   // Make sure they are ok
-  if (_sdf->GetValueDouble("scale") <= 0)
+  if (_sdf->Get<double>("scale") <= 0)
     _sdf->GetElement("scale")->Set(0.1);
-  if (this->sdf->GetValueInt("threshold") <= 0)
+  if (this->sdf->Get<int>("threshold") <= 0)
     _sdf->GetElement("threshold")->Set(200);
-  if (this->sdf->GetValueDouble("height") <= 0)
+  if (this->sdf->Get<double>("height") <= 0)
     _sdf->GetElement("height")->Set(1.0);
 
   // Load the image
@@ -107,7 +108,7 @@ void MapShape::FillMsg(msgs::Geometry &_msg)
 {
   _msg.set_type(msgs::Geometry::IMAGE);
   _msg.mutable_image()->set_uri(this->GetURI());
-  _msg.mutable_image()->set_scale(this->GetScale());
+  _msg.mutable_image()->set_scale(this->GetScale().x);
   _msg.mutable_image()->set_threshold(this->GetThreshold());
   _msg.mutable_image()->set_height(this->GetHeight());
   _msg.mutable_image()->set_granularity(this->GetGranularity());
@@ -117,31 +118,45 @@ void MapShape::FillMsg(msgs::Geometry &_msg)
 //////////////////////////////////////////////////
 std::string MapShape::GetURI() const
 {
-  return this->sdf->GetValueString("uri");
+  return this->sdf->Get<std::string>("uri");
 }
 
 //////////////////////////////////////////////////
-double MapShape::GetScale() const
+void MapShape::SetScale(const math::Vector3 &_scale)
 {
-  return this->sdf->GetValueDouble("scale");
+  if (this->scale == _scale)
+    return;
+
+  this->scale = _scale;
+
+  this->sdf->GetElement("scale")->Set(_scale);
+
+  /// TODO MapShape::SetScale not yet implemented.
+}
+
+//////////////////////////////////////////////////
+math::Vector3 MapShape::GetScale() const
+{
+  double mapScale = this->sdf->Get<double>("scale");
+  return math::Vector3(mapScale, mapScale, mapScale);
 }
 
 //////////////////////////////////////////////////
 int MapShape::GetThreshold() const
 {
-  return this->sdf->GetValueInt("threshold");
+  return this->sdf->Get<int>("threshold");
 }
 
 //////////////////////////////////////////////////
 double MapShape::GetHeight() const
 {
-  return this->sdf->GetValueDouble("height");
+  return this->sdf->Get<double>("height");
 }
 
 //////////////////////////////////////////////////
 int MapShape::GetGranularity() const
 {
-  return this->sdf->GetValueInt("granularity");
+  return this->sdf->Get<int>("granularity");
 }
 
 //////////////////////////////////////////////////
@@ -161,12 +176,12 @@ void MapShape::CreateBoxes(QuadNode * /*_node*/)
 
     stream << "<gazebo:world xmlns:gazebo =\"http://playerstage.sourceforge.net/gazebo/xmlschema/#gz\" xmlns:collision =\"http://playerstage.sourceforge.net/gazebo/xmlschema/#collision\">";
 
-    float x = (node->x + node->width / 2.0) * this->sdf->GetValueDouble("scale");
-    float y = (node->y + node->height / 2.0) * this->sdf->GetValueDouble("scale");
-    float z = this->sdf->GetValueDouble("height") / 2.0;
-    float xSize = (node->width) * this->sdf->GetValueDouble("scale");
-    float ySize = (node->height) * this->sdf->GetValueDouble("scale");
-    float zSize = this->sdf->GetValueDouble("height");
+    float x = (node->x + node->width / 2.0) * this->sdf->Get<double>("scale");
+    float y = (node->y + node->height / 2.0) * this->sdf->Get<double>("scale");
+    float z = this->sdf->Get<double>("height") / 2.0;
+    float xSize = (node->width) * this->sdf->Get<double>("scale");
+    float ySize = (node->height) * this->sdf->Get<double>("scale");
+    float zSize = this->sdf->Get<double>("height");
 
     char collisionName[256];
     sprintf(collisionName, "map_collision_%d", collisionCounter++);
@@ -312,7 +327,6 @@ void MapShape::Merge(QuadNode *_nodeA, QuadNode *_nodeB)
 //////////////////////////////////////////////////
 void MapShape::BuildTree(QuadNode *_node)
 {
-  QuadNode *newNode = NULL;
   unsigned int freePixels, occPixels;
 
   this->GetPixelCount(_node->x, _node->y, _node->width, _node->height,
@@ -321,11 +335,12 @@ void MapShape::BuildTree(QuadNode *_node)
   // int diff = labs(freePixels - occPixels);
 
   if (static_cast<int>(_node->width*_node->height) >
-      this->sdf->GetValueInt("granularity"))
+      this->sdf->Get<int>("granularity"))
   {
     float newX, newY;
     float newW, newH;
 
+    newX = _node->x;
     newY = _node->y;
     newW = _node->width / 2.0;
     newH = _node->height / 2.0;
@@ -337,7 +352,7 @@ void MapShape::BuildTree(QuadNode *_node)
 
       for (int j = 0; j < 2; j++)
       {
-        newNode = new QuadNode(_node);
+        QuadNode *newNode = new QuadNode(_node);
         newNode->x = (unsigned int)newX;
         newNode->y = (unsigned int)newY;
 
@@ -403,10 +418,10 @@ void MapShape::GetPixelCount(unsigned int xStart, unsigned int yStart,
 
       v = (unsigned char)(255 *
           ((pixColor.r + pixColor.g + pixColor.b) / 3.0));
-      // if (this->sdf->GetValueBool("negative"))
+      // if (this->sdf->Get<bool>("negative"))
         // v = 255 - v;
 
-      if (v > this->sdf->GetValueInt("threshold"))
+      if (v > this->sdf->Get<int>("threshold"))
         freePixels++;
       else
         occPixels++;
@@ -419,4 +434,3 @@ void MapShape::ProcessMsg(const msgs::Geometry & /*_msg*/)
 {
   gzerr << "TODO: not implement yet.";
 }
-
diff --git a/gazebo/physics/MapShape.hh b/gazebo/physics/MapShape.hh
index ba7fcf6..6e3ff0c 100644
--- a/gazebo/physics/MapShape.hh
+++ b/gazebo/physics/MapShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@
 
 #include "gazebo/physics/Collision.hh"
 #include "gazebo/physics/Shape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -42,7 +43,7 @@ namespace gazebo
     /// \class MapShape MapShape.hh physics/physics.hh
     /// \brief Creates box extrusions based on an image.
     /// This function is not yet complete, to be implemented.
-    class MapShape : public Shape
+    class GAZEBO_VISIBLE MapShape : public Shape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent collision object.
@@ -74,9 +75,13 @@ namespace gazebo
       /// \return The image URI that was used to load the map.
       public: std::string GetURI() const;
 
+      /// \brief Set the scale of the map shape.
+      /// \param[in] _scale Scale to set the map shape to.
+      public: void SetScale(const math::Vector3 &_scale);
+
       /// \brief Returns scaling factor for this geometry.
       /// \return Scaling factor.
-      public: double GetScale() const;
+      public: virtual math::Vector3 GetScale() const;
 
       /// \brief Returns image threshold for this geometry.
       /// All regions in image with value larger than MapShape::scale
@@ -144,7 +149,7 @@ namespace gazebo
 
     /// \class QuadNode MapShape.hh physics/physics.hh
     /// \cond
-    class QuadNode
+    class GAZEBO_VISIBLE QuadNode
     {
       /// \brief Constructor
       /// \param[in] _parent Parent quad tree node.
diff --git a/gazebo/physics/MeshShape.cc b/gazebo/physics/MeshShape.cc
new file mode 100644
index 0000000..530f84e
--- /dev/null
+++ b/gazebo/physics/MeshShape.cc
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/* Desc: Trimesh shape
+ * Author: Nate Koenig
+ * Date: 16 Oct 2009
+ */
+
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/MeshShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+MeshShape::MeshShape(CollisionPtr _parent)
+  : Shape(_parent)
+{
+  this->submesh = NULL;
+  this->AddType(Base::MESH_SHAPE);
+  sdf::initFile("mesh_shape.sdf", this->sdf);
+}
+
+//////////////////////////////////////////////////
+MeshShape::~MeshShape()
+{
+}
+
+//////////////////////////////////////////////////
+void MeshShape::Init()
+{
+  std::string meshStr = this->sdf->Get<std::string>("uri");
+
+  common::MeshManager *meshManager = common::MeshManager::Instance();
+  this->mesh = meshManager->GetMesh(meshStr);
+
+  if (!this->mesh)
+  {
+    meshStr = common::find_file(this->sdf->Get<std::string>("uri"));
+
+    if (meshStr == "__default__" || meshStr.empty())
+    {
+      gzerr << "No mesh specified\n";
+      return;
+    }
+
+    if ((this->mesh = meshManager->Load(meshStr)) == NULL)
+      gzerr << "Unable to load mesh from file[" << meshStr << "]\n";
+  }
+
+  if (this->submesh)
+    delete this->submesh;
+  this->submesh = NULL;
+
+  if (this->sdf->HasElement("submesh"))
+  {
+    sdf::ElementPtr submeshElem = this->sdf->GetElement("submesh");
+    this->submesh = new common::SubMesh(
+      this->mesh->GetSubMesh(submeshElem->Get<std::string>("name")));
+
+    if (!this->submesh)
+      gzthrow("Unable to get submesh with name[" +
+          submeshElem->Get<std::string>("name") + "]");
+
+    // Center the submesh if specified in SDF.
+    if (submeshElem->HasElement("center") &&
+        submeshElem->Get<bool>("center"))
+    {
+      this->submesh->Center();
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+void MeshShape::SetScale(const math::Vector3 &_scale)
+{
+  this->sdf->GetElement("scale")->Set(_scale);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 MeshShape::GetSize() const
+{
+  return this->sdf->Get<math::Vector3>("scale");
+}
+
+//////////////////////////////////////////////////
+std::string MeshShape::GetMeshURI() const
+{
+  return this->sdf->Get<std::string>("uri");
+}
+
+//////////////////////////////////////////////////
+void MeshShape::SetMesh(const std::string &_uri,
+                           const std::string &_submesh,
+                           bool _center)
+{
+  this->sdf->GetElement("uri")->Set(_uri);
+
+  if (!_submesh.empty())
+  {
+    this->sdf->GetElement("submesh")->GetElement("name")->Set(_submesh);
+    this->sdf->GetElement("submesh")->GetElement("center")->Set(_center);
+  }
+
+  this->Init();
+}
+
+//////////////////////////////////////////////////
+void MeshShape::FillMsg(msgs::Geometry &_msg)
+{
+  _msg.set_type(msgs::Geometry::MESH);
+  _msg.mutable_mesh()->CopyFrom(msgs::MeshFromSDF(this->sdf));
+}
+
+//////////////////////////////////////////////////
+void MeshShape::ProcessMsg(const msgs::Geometry &_msg)
+{
+  this->SetScale(msgs::Convert(_msg.mesh().scale()));
+  this->SetMesh(_msg.mesh().filename(),
+      _msg.mesh().has_submesh() ? _msg.mesh().submesh() : std::string(),
+      _msg.mesh().has_center_submesh() ? _msg.mesh().center_submesh() :  false);
+}
diff --git a/gazebo/physics/MeshShape.hh b/gazebo/physics/MeshShape.hh
new file mode 100644
index 0000000..7c6199d
--- /dev/null
+++ b/gazebo/physics/MeshShape.hh
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/* Desc: Trimesh geometry
+ * Author: Nate Koenig, Andrew Howard
+ * Date: 8 May 2003
+ */
+
+#ifndef _MESHSHAPE_HH_
+#define _MESHSHAPE_HH_
+
+#include <string>
+
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/Shape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \addtogroup gazebo_physics
+    /// \{
+
+    /// \class MeshShape MeshShape.hh physics/physics.hh
+    /// \brief Triangle mesh collision shape
+    class GAZEBO_VISIBLE MeshShape : public Shape
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent collision.
+      public: explicit MeshShape(CollisionPtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~MeshShape();
+
+      /// \brief Update the tri mesh.
+      public: virtual void Update() {}
+
+      /// \copydoc Shape::Init()
+      public: virtual void Init();
+
+      /// \brief Get the size of the triangle mesh.
+      /// \return The size of the triangle mesh.
+      public: virtual math::Vector3 GetSize() const;
+
+      /// \brief Get the URI of the mesh data.
+      /// \return The URI of the mesh data.
+      public: std::string GetMeshURI() const;
+
+      /// \brief Set the mesh uri and submesh name.
+      /// \param[in] _uri Filename of the mesh file to load from.
+      /// \param[in] _submesh Name of the submesh to use within the mesh
+      /// \param[in] _center True to center the submesh.
+      /// specified in the _uri.
+      public: void SetMesh(const std::string &_uri,
+                           const std::string &_submesh = "",
+                           bool _center = false);
+
+
+      /// \brief Set the scaling factor.
+      /// \param[in] _scale Scaling factor.
+      public: void SetScale(const math::Vector3 &_scale);
+
+      /// \brief Populate a msgs::Geometry message with data from this
+      /// shape.
+      /// \param[out] _msg Message to fill.
+      public: void FillMsg(msgs::Geometry &_msg);
+
+      /// \brief Update this shape from a message.
+      /// \param[in] _msg Message that contains triangle mesh info.
+      public: virtual void ProcessMsg(const msgs::Geometry &_msg);
+
+      /// \brief Pointer to the mesh data.
+      protected: const common::Mesh *mesh;
+
+      /// \brief The submesh to use from within the parent mesh.
+      protected: common::SubMesh *submesh;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/Model.cc b/gazebo/physics/Model.cc
index a16ff4a..e8a5a00 100644
--- a/gazebo/physics/Model.cc
+++ b/gazebo/physics/Model.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,6 @@
  * limitations under the License.
  *
 */
-/* Desc: Base class for all models.
- * Author: Nathan Koenig and Andrew Howard
- * Date: 8 May 2003
- */
 
 #include <tbb/parallel_for.h>
 #include <tbb/blocked_range.h>
@@ -26,6 +22,7 @@
 #include <boost/thread/recursive_mutex.hpp>
 #include <sstream>
 
+#include "gazebo/util/OpenAL.hh"
 #include "gazebo/common/KeyFrame.hh"
 #include "gazebo/common/Animation.hh"
 #include "gazebo/common/Plugin.hh"
@@ -45,38 +42,21 @@
 
 #include "gazebo/sensors/SensorManager.hh"
 
-#include "transport/Node.hh"
+#include "gazebo/transport/Node.hh"
 
 using namespace gazebo;
 using namespace physics;
 
-class LinkUpdate_TBB
-{
-  public: LinkUpdate_TBB(Link_V *_bodies) : bodies(_bodies) {}
-  public: void operator() (const tbb::blocked_range<size_t> &_r) const
-  {
-    for (size_t i = _r.begin(); i != _r.end(); i++)
-    {
-      (*this->bodies)[i]->Update();
-    }
-  }
-
-  private: Link_V *bodies;
-};
-
-
 //////////////////////////////////////////////////
 Model::Model(BasePtr _parent)
   : Entity(_parent)
 {
   this->AddType(MODEL);
-  this->updateMutex = new boost::recursive_mutex();
 }
 
 //////////////////////////////////////////////////
 Model::~Model()
 {
-  delete this->updateMutex;
 }
 
 //////////////////////////////////////////////////
@@ -86,11 +66,11 @@ void Model::Load(sdf::ElementPtr _sdf)
 
   this->jointPub = this->node->Advertise<msgs::Joint>("~/joint");
 
-  this->SetStatic(this->sdf->GetValueBool("static"));
+  this->SetStatic(this->sdf->Get<bool>("static"));
   this->sdf->GetElement("static")->GetValue()->SetUpdateFunc(
       boost::bind(&Entity::IsStatic, this));
 
-  this->SetAutoDisable(this->sdf->GetValueBool("allow_auto_disable"));
+  this->SetAutoDisable(this->sdf->Get<bool>("allow_auto_disable"));
   this->LoadLinks();
 
   // Load the joints if the world is already loaded. Otherwise, the World
@@ -131,6 +111,7 @@ void Model::LoadLinks()
       // bodies collisionetries
       link->Load(linkElem);
       linkElem = linkElem->GetNextElement("link");
+      this->links.push_back(link);
     }
   }
 }
@@ -177,10 +158,17 @@ void Model::Init()
 
   // Initialize the bodies before the joints
   for (Base_V::iterator iter = this->children.begin();
-       iter!= this->children.end(); ++iter)
+       iter != this->children.end(); ++iter)
   {
     if ((*iter)->HasType(Base::LINK))
-      boost::static_pointer_cast<Link>(*iter)->Init();
+    {
+      LinkPtr link = boost::static_pointer_cast<Link>(*iter);
+      if (link)
+        link->Init();
+      else
+        gzerr << "Child [" << (*iter)->GetName()
+              << "] has type Base::LINK, but cannot be dynamically casted\n";
+    }
     else if ((*iter)->HasType(Base::MODEL))
       boost::static_pointer_cast<Model>(*iter)->Init();
   }
@@ -189,7 +177,15 @@ void Model::Init()
   for (Joint_V::iterator iter = this->joints.begin();
        iter != this->joints.end(); ++iter)
   {
-    (*iter)->Init();
+    try
+    {
+      (*iter)->Init();
+    }
+    catch(...)
+    {
+      gzerr << "Init joint failed" << std::endl;
+      return;
+    }
     // The following message used to be filled and sent in Model::LoadJoint
     // It is moved here, after Joint::Init, so that the joint properties
     // can be included in the message.
@@ -198,18 +194,20 @@ void Model::Init()
     this->jointPub->Publish(msg);
   }
 
-  for (std::vector<Gripper*>::iterator iter = this->grippers.begin();
+  for (std::vector<GripperPtr>::iterator iter = this->grippers.begin();
        iter != this->grippers.end(); ++iter)
   {
     (*iter)->Init();
   }
 }
 
-
 //////////////////////////////////////////////////
 void Model::Update()
 {
-  this->updateMutex->lock();
+  if (this->IsStatic())
+    return;
+
+  boost::recursive_mutex::scoped_lock lock(this->updateMutex);
 
   for (Joint_V::iterator jiter = this->joints.begin();
        jiter != this->joints.end(); ++jiter)
@@ -218,7 +216,7 @@ void Model::Update()
   if (this->jointController)
     this->jointController->Update();
 
-  if (this->jointAnimations.size() > 0)
+  if (!this->jointAnimations.empty())
   {
     common::NumericKeyFrame kf(0);
     std::map<std::string, double> jointPositions;
@@ -253,15 +251,14 @@ void Model::Update()
     }
     this->prevAnimationTime = this->world->GetSimTime();
   }
-
-  this->updateMutex->unlock();
 }
 
 //////////////////////////////////////////////////
-void Model::SetJointPosition(const std::string &_jointName, double _position)
+void Model::SetJointPosition(
+  const std::string &_jointName, double _position, int _index)
 {
   if (this->jointController)
-    this->jointController->SetJointPosition(_jointName, _position);
+    this->jointController->SetJointPosition(_jointName, _position, _index);
 }
 
 //////////////////////////////////////////////////
@@ -303,14 +300,17 @@ void Model::RemoveChild(EntityPtr _child)
         }
       }
     }
+
+    this->RemoveLink(_child->GetScopedName());
   }
 
   Entity::RemoveChild(_child->GetId());
 
-  Base_V::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
-    if (*iter && (*iter)->HasType(LINK))
-      boost::static_pointer_cast<Link>(*iter)->SetEnabled(true);
+  for (Link_V::iterator liter = this->links.begin();
+       liter != this->links.end(); ++liter)
+  {
+    (*liter)->SetEnabled(true);
+  }
 }
 
 //////////////////////////////////////////////////
@@ -321,6 +321,7 @@ void Model::Fini()
   this->attachedModels.clear();
   this->joints.clear();
   this->plugins.clear();
+  this->links.clear();
   this->canonicalLink.reset();
 }
 
@@ -335,7 +336,7 @@ void Model::UpdateParameters(sdf::ElementPtr _sdf)
     while (linkElem)
     {
       LinkPtr link = boost::dynamic_pointer_cast<Link>(
-          this->GetChild(linkElem->GetValueString("name")));
+          this->GetChild(linkElem->Get<std::string>("name")));
       link->UpdateParameters(linkElem);
       linkElem = linkElem->GetNextElement("link");
     }
@@ -347,7 +348,7 @@ void Model::UpdateParameters(sdf::ElementPtr _sdf)
     sdf::ElementPtr jointElem = _sdf->GetElement("joint");
     while (jointElem)
     {
-      JointPtr joint = boost::dynamic_pointer_cast<Joint>(this->GetChild(jointElem->GetValueString("name")));
+      JointPtr joint = boost::dynamic_pointer_cast<Joint>(this->GetChild(jointElem->Get<std::string>("name")));
       joint->UpdateParameters(jointElem);
       jointElem = jointElem->GetNextElement("joint");
     }
@@ -373,15 +374,14 @@ void Model::Reset()
   }
 
   // reset link velocities when resetting model
-  Link_V links = this->GetLinks();
-  for (Link_V::iterator liter = links.begin();
-       liter!= links.end(); ++liter)
+  for (Link_V::iterator liter = this->links.begin();
+       liter != this->links.end(); ++liter)
   {
     (*liter)->ResetPhysicsStates();
   }
 
   for (Joint_V::iterator jiter = this->joints.begin();
-       jiter!= this->joints.end(); ++jiter)
+       jiter != this->joints.end(); ++jiter)
   {
     (*jiter)->Reset();
   }
@@ -390,14 +390,13 @@ void Model::Reset()
 //////////////////////////////////////////////////
 void Model::SetLinearVel(const math::Vector3 &_vel)
 {
-  for (Base_V::iterator iter = this->children.begin();
-      iter != this->children.end(); ++iter)
+  for (Link_V::iterator iter = this->links.begin();
+       iter != this->links.end(); ++iter)
   {
-    if (*iter && (*iter)->HasType(LINK))
+    if (*iter)
     {
-      LinkPtr link = boost::static_pointer_cast<Link>(*iter);
-      link->SetEnabled(true);
-      link->SetLinearVel(_vel);
+      (*iter)->SetEnabled(true);
+      (*iter)->SetLinearVel(_vel);
     }
   }
 }
@@ -405,15 +404,13 @@ void Model::SetLinearVel(const math::Vector3 &_vel)
 //////////////////////////////////////////////////
 void Model::SetAngularVel(const math::Vector3 &_vel)
 {
-  Base_V::iterator iter;
-
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (Link_V::iterator iter = this->links.begin();
+       iter != this->links.end(); ++iter)
   {
-    if (*iter && (*iter)->HasType(LINK))
+    if (*iter)
     {
-      LinkPtr link = boost::static_pointer_cast<Link>(*iter);
-      link->SetEnabled(true);
-      link->SetAngularVel(_vel);
+      (*iter)->SetEnabled(true);
+      (*iter)->SetAngularVel(_vel);
     }
   }
 }
@@ -421,15 +418,13 @@ void Model::SetAngularVel(const math::Vector3 &_vel)
 //////////////////////////////////////////////////
 void Model::SetLinearAccel(const math::Vector3 &_accel)
 {
-  Base_V::iterator iter;
-
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (Link_V::iterator iter = this->links.begin();
+       iter != this->links.end(); ++iter)
   {
-    if (*iter && (*iter)->HasType(LINK))
+    if (*iter)
     {
-      LinkPtr link = boost::static_pointer_cast<Link>(*iter);
-      link->SetEnabled(true);
-      link->SetLinearAccel(_accel);
+      (*iter)->SetEnabled(true);
+      (*iter)->SetLinearAccel(_accel);
     }
   }
 }
@@ -437,15 +432,13 @@ void Model::SetLinearAccel(const math::Vector3 &_accel)
 //////////////////////////////////////////////////
 void Model::SetAngularAccel(const math::Vector3 &_accel)
 {
-  Base_V::iterator iter;
-
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (Link_V::iterator iter = this->links.begin();
+       iter != this->links.end(); ++iter)
   {
-    if (*iter && (*iter)->HasType(LINK))
+    if (*iter)
     {
-      LinkPtr link = boost::static_pointer_cast<Link>(*iter);
-      link->SetEnabled(true);
-      link->SetAngularAccel(_accel);
+      (*iter)->SetEnabled(true);
+      (*iter)->SetAngularAccel(_accel);
     }
   }
 }
@@ -527,18 +520,17 @@ math::Vector3 Model::GetWorldAngularAccel() const
 math::Box Model::GetBoundingBox() const
 {
   math::Box box;
-  Base_V::const_iterator iter;
 
   box.min.Set(FLT_MAX, FLT_MAX, FLT_MAX);
   box.max.Set(-FLT_MAX, -FLT_MAX, -FLT_MAX);
 
-  for (iter = this->children.begin(); iter!= this->children.end(); ++iter)
+  for (Link_V::const_iterator iter = this->links.begin();
+       iter != this->links.end(); ++iter)
   {
-    if (*iter && (*iter)->HasType(LINK))
+    if (*iter)
     {
       math::Box linkBox;
-      LinkPtr link = boost::static_pointer_cast<Link>(*iter);
-      linkBox = link->GetBoundingBox();
+      linkBox = (*iter)->GetBoundingBox();
       box += linkBox;
     }
   }
@@ -594,26 +586,13 @@ LinkPtr Model::GetLinkById(unsigned int _id) const
 //////////////////////////////////////////////////
 Link_V Model::GetLinks() const
 {
-  Link_V links;
-  for (unsigned int i = 0; i < this->GetChildCount(); ++i)
-  {
-    if (this->GetChild(i)->HasType(Base::LINK))
-    {
-      LinkPtr link = boost::static_pointer_cast<Link>(this->GetChild(i));
-      if (link)
-        links.push_back(link);
-      else
-        gzerr << "Child [" << this->GetChild(i)->GetName()
-              << "] has type Base::LINK, but cannot be dynamically casted\n";
-    }
-  }
-  return links;
+  return this->links;
 }
 
 //////////////////////////////////////////////////
 LinkPtr Model::GetLink(const std::string &_name) const
 {
-  Base_V::const_iterator biter;
+  Link_V::const_iterator iter;
   LinkPtr result;
 
   if (_name == "canonical")
@@ -622,12 +601,11 @@ LinkPtr Model::GetLink(const std::string &_name) const
   }
   else
   {
-    for (biter = this->children.begin(); biter != this->children.end(); ++biter)
+    for (iter = this->links.begin(); iter != this->links.end(); ++iter)
     {
-      if (((*biter)->GetScopedName() == _name) ||
-          ((*biter)->GetName() == _name))
+      if (((*iter)->GetScopedName() == _name) || ((*iter)->GetName() == _name))
       {
-        result = boost::dynamic_pointer_cast<Link>(*biter);
+        result = *iter;
         break;
       }
     }
@@ -641,12 +619,16 @@ void Model::LoadJoint(sdf::ElementPtr _sdf)
 {
   JointPtr joint;
 
-  std::string stype = _sdf->GetValueString("type");
+  std::string stype = _sdf->Get<std::string>("type");
 
   joint = this->GetWorld()->GetPhysicsEngine()->CreateJoint(stype,
      boost::static_pointer_cast<Model>(shared_from_this()));
   if (!joint)
-    gzthrow("Unable to create joint of type[" + stype + "]\n");
+  {
+    gzerr << "Unable to create joint of type[" << stype << "]\n";
+    // gzthrow("Unable to create joint of type[" + stype + "]\n");
+    return;
+  }
 
   joint->SetModel(boost::static_pointer_cast<Model>(shared_from_this()));
 
@@ -654,7 +636,11 @@ void Model::LoadJoint(sdf::ElementPtr _sdf)
   joint->Load(_sdf);
 
   if (this->GetJoint(joint->GetScopedName()) != NULL)
-    gzthrow("can't have two joint with the same name");
+  {
+    gzerr << "can't have two joint with the same name\n";
+    gzthrow("can't have two joints with the same name ["+
+      joint->GetScopedName() + "]\n");
+  }
 
   this->joints.push_back(joint);
 
@@ -667,8 +653,8 @@ void Model::LoadJoint(sdf::ElementPtr _sdf)
 //////////////////////////////////////////////////
 void Model::LoadGripper(sdf::ElementPtr _sdf)
 {
-  Gripper *gripper = new Gripper(
-      boost::static_pointer_cast<Model>(shared_from_this()));
+  GripperPtr gripper(new Gripper(
+      boost::static_pointer_cast<Model>(shared_from_this())));
   gripper->Load(_sdf);
   this->grippers.push_back(gripper);
 }
@@ -737,8 +723,8 @@ unsigned int Model::GetSensorCount() const
   unsigned int result = 0;
 
   // Count all the sensors on all the links
-  Link_V links = this->GetLinks();
-  for (Link_V::const_iterator iter = links.begin(); iter != links.end(); ++iter)
+  for (Link_V::const_iterator iter = this->links.begin();
+       iter != this->links.end(); ++iter)
   {
     result += (*iter)->GetSensorCount();
   }
@@ -749,16 +735,18 @@ unsigned int Model::GetSensorCount() const
 //////////////////////////////////////////////////
 void Model::LoadPlugin(sdf::ElementPtr _sdf)
 {
-  std::string name = _sdf->GetValueString("name");
-  std::string filename = _sdf->GetValueString("filename");
-  gazebo::ModelPluginPtr plugin = gazebo::ModelPlugin::Create(filename, name);
+  std::string pluginName = _sdf->Get<std::string>("name");
+  std::string filename = _sdf->Get<std::string>("filename");
+  gazebo::ModelPluginPtr plugin =
+    gazebo::ModelPlugin::Create(filename, pluginName);
   if (plugin)
   {
     if (plugin->GetType() != MODEL_PLUGIN)
     {
       gzerr << "Model[" << this->GetName() << "] is attempting to load "
             << "a plugin, but detected an incorrect plugin type. "
-            << "Plugin filename[" << filename << "] name[" << name << "]\n";
+            << "Plugin filename[" << filename << "] name["
+            << pluginName << "]\n";
       return;
     }
 
@@ -772,13 +760,12 @@ void Model::LoadPlugin(sdf::ElementPtr _sdf)
 //////////////////////////////////////////////////
 void Model::SetGravityMode(const bool &_v)
 {
-  Base_V::iterator iter;
-
-  for (iter = this->children.begin(); iter!= this->children.end(); ++iter)
+  for (Link_V::iterator liter = this->links.begin();
+      liter != this->links.end(); ++liter)
   {
-    if (*iter && (*iter)->HasType(LINK))
+    if (*liter)
     {
-      boost::static_pointer_cast<Link>(*iter)->SetGravityMode(_v);
+      (*liter)->SetGravityMode(_v);
     }
   }
 }
@@ -786,13 +773,12 @@ void Model::SetGravityMode(const bool &_v)
 //////////////////////////////////////////////////
 void Model::SetCollideMode(const std::string &_m)
 {
-  Base_V::iterator iter;
-
-  for (iter = this->children.begin(); iter!= this->children.end(); ++iter)
+  for (Link_V::iterator liter = this->links.begin();
+      liter != this->links.end(); ++liter)
   {
-    if (*iter && (*iter)->HasType(LINK))
+    if (*liter)
     {
-      boost::static_pointer_cast<Link>(*iter)->SetCollideMode(_m);
+      (*liter)->SetCollideMode(_m);
     }
   }
 }
@@ -800,13 +786,12 @@ void Model::SetCollideMode(const std::string &_m)
 //////////////////////////////////////////////////
 void Model::SetLaserRetro(const float _retro)
 {
-  Base_V::iterator iter;
-
-  for (iter = this->children.begin(); iter!= this->children.end(); ++iter)
+  for (Link_V::iterator liter = this->links.begin();
+      liter != this->links.end(); ++liter)
   {
-    if (*iter && (*iter)->HasType(LINK))
+    if (*liter)
     {
-       boost::static_pointer_cast<Link>(*iter)->SetLaserRetro(_retro);
+      (*liter)->SetLaserRetro(_retro);
     }
   }
 }
@@ -816,29 +801,30 @@ void Model::FillMsg(msgs::Model &_msg)
 {
   _msg.set_name(this->GetScopedName());
   _msg.set_is_static(this->IsStatic());
-  _msg.mutable_pose()->CopyFrom(msgs::Convert(this->GetWorldPose()));
+  msgs::Set(_msg.mutable_pose(), this->GetWorldPose());
   _msg.set_id(this->GetId());
+  msgs::Set(_msg.mutable_scale(), this->scale);
 
   msgs::Set(this->visualMsg->mutable_pose(), this->GetWorldPose());
   _msg.add_visual()->CopyFrom(*this->visualMsg);
 
-  for (unsigned int j = 0; j < this->GetChildCount(); ++j)
+  for (Link_V::iterator iter = this->links.begin(); iter != this->links.end();
+      ++iter)
   {
-    if (this->GetChild(j)->HasType(Base::LINK))
-    {
-      LinkPtr link = boost::dynamic_pointer_cast<Link>(this->GetChild(j));
-      link->FillMsg(*_msg.add_link());
-    }
+    (*iter)->FillMsg(*_msg.add_link());
   }
 
-  for (unsigned int j = 0; j < this->joints.size(); ++j)
-    this->joints[j]->FillMsg(*_msg.add_joint());
+  for (Joint_V::iterator iter = this->joints.begin();
+       iter != this->joints.end(); ++iter)
+  {
+    (*iter)->FillMsg(*_msg.add_joint());
+  }
 }
 
 //////////////////////////////////////////////////
 void Model::ProcessMsg(const msgs::Model &_msg)
 {
-  if (!(_msg.has_id() && _msg.id() == this->GetId()))
+  if (_msg.has_id() && _msg.id() != this->GetId())
   {
     gzerr << "Incorrect ID[" << _msg.id() << " != " << this->GetId() << "]\n";
     return;
@@ -863,14 +849,17 @@ void Model::ProcessMsg(const msgs::Model &_msg)
 
   if (_msg.has_is_static())
     this->SetStatic(_msg.is_static());
+
+  if (_msg.has_scale())
+    this->SetScale(msgs::Convert(_msg.scale()));
 }
 
 //////////////////////////////////////////////////
 void Model::SetJointAnimation(
-    const std::map<std::string, common::NumericAnimationPtr> _anims,
+    const std::map<std::string, common::NumericAnimationPtr> &_anims,
     boost::function<void()> _onComplete)
 {
-  this->updateMutex->lock();
+  boost::recursive_mutex::scoped_lock lock(this->updateMutex);
   std::map<std::string, common::NumericAnimationPtr>::const_iterator iter;
   for (iter = _anims.begin(); iter != _anims.end(); ++iter)
   {
@@ -878,17 +867,15 @@ void Model::SetJointAnimation(
   }
   this->onJointAnimationComplete = _onComplete;
   this->prevAnimationTime = this->world->GetSimTime();
-  this->updateMutex->unlock();
 }
 
 //////////////////////////////////////////////////
 void Model::StopAnimation()
 {
-  this->updateMutex->lock();
+  boost::recursive_mutex::scoped_lock lock(this->updateMutex);
   Entity::StopAnimation();
   this->onJointAnimationComplete.clear();
   this->jointAnimations.clear();
-  this->updateMutex->unlock();
 }
 
 //////////////////////////////////////////////////
@@ -935,33 +922,54 @@ void Model::SetState(const ModelState &_state)
 {
   this->SetWorldPose(_state.GetPose(), true);
 
-  // For now we don't use the link state values to set the state of
-  // simulation.
-  /*for (unsigned int i = 0; i < _state.GetLinkStateCount(); ++i)
+  LinkState_M linkStates = _state.GetLinkStates();
+  for (LinkState_M::iterator iter = linkStates.begin();
+       iter != linkStates.end(); ++iter)
   {
-    LinkState linkState = _state.GetLinkState(i);
-    LinkPtr link = this->GetLink(linkState.GetName());
+    LinkPtr link = this->GetLink(iter->first);
     if (link)
-      link->SetState(linkState);
+      link->SetState(iter->second);
     else
-      gzerr << "Unable to find link[" << linkState.GetName() << "]\n";
-  }*/
-
-  for (unsigned int i = 0; i < _state.GetJointStateCount(); ++i)
-  {
-    JointState jointState = _state.GetJointState(i);
-    this->SetJointPosition(this->GetName() + "::" + jointState.GetName(),
-                           jointState.GetAngle(0).Radian());
+      gzerr << "Unable to find link[" << iter->first << "]\n";
   }
+
+  // For now we don't use the joint state values to set the state of
+  // simulation.
+  // for (unsigned int i = 0; i < _state.GetJointStateCount(); ++i)
+  // {
+  //   JointState jointState = _state.GetJointState(i);
+  //   this->SetJointPosition(this->GetName() + "::" + jointState.GetName(),
+  //                          jointState.GetAngle(0).Radian());
+  // }
 }
 
 /////////////////////////////////////////////////
-void Model::SetEnabled(bool _enabled)
+void Model::SetScale(const math::Vector3 &_scale)
 {
+  if (this->scale == _scale)
+    return;
+
+  this->scale = _scale;
+
   Base_V::iterator iter;
   for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  {
     if (*iter && (*iter)->HasType(LINK))
-      boost::static_pointer_cast<Link>(*iter)->SetEnabled(_enabled);
+    {
+      boost::static_pointer_cast<Link>(*iter)->SetScale(_scale);
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void Model::SetEnabled(bool _enabled)
+{
+  for (Link_V::iterator liter = this->links.begin();
+      liter != this->links.end(); ++liter)
+  {
+    if (*liter)
+      (*liter)->SetEnabled(_enabled);
+  }
 }
 
 /////////////////////////////////////////////////
@@ -989,17 +997,93 @@ void Model::SetLinkWorldPose(const math::Pose &_pose, const LinkPtr &_link)
 /////////////////////////////////////////////////
 void Model::SetAutoDisable(bool _auto)
 {
-  if (this->joints.size() > 0)
+  if (!this->joints.empty())
     return;
 
-  Base_V::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
-    if (*iter && (*iter)->HasType(LINK))
-      boost::static_pointer_cast<Link>(*iter)->SetAutoDisable(_auto);
+  for (Link_V::iterator liter = this->links.begin();
+      liter != this->links.end(); ++liter)
+  {
+    if (*liter)
+    {
+      (*liter)->SetAutoDisable(_auto);
+    }
+  }
 }
 
 /////////////////////////////////////////////////
 bool Model::GetAutoDisable() const
 {
-  return this->sdf->GetValueBool("allow_auto_disable");
+  return this->sdf->Get<bool>("allow_auto_disable");
+}
+
+/////////////////////////////////////////////////
+void Model::RemoveLink(const std::string &_name)
+{
+  for (Link_V::iterator iter = this->links.begin();
+       iter != this->links.end(); ++iter)
+  {
+    if ((*iter)->GetName() == _name || (*iter)->GetScopedName() == _name)
+    {
+      this->links.erase(iter);
+      break;
+    }
+  }
+}
+/////////////////////////////////////////////////
+JointControllerPtr Model::GetJointController()
+{
+  return this->jointController;
+}
+
+/////////////////////////////////////////////////
+GripperPtr Model::GetGripper(size_t _index) const
+{
+  if (_index < this->grippers.size())
+    return this->grippers[_index];
+  else
+    return GripperPtr();
+}
+
+/////////////////////////////////////////////////
+size_t Model::GetGripperCount() const
+{
+  return this->grippers.size();
+}
+
+/////////////////////////////////////////////////
+double Model::GetWorldEnergyPotential() const
+{
+  double e = 0;
+  for (Link_V::const_iterator iter = this->links.begin();
+    iter != this->links.end(); ++iter)
+  {
+    e += (*iter)->GetWorldEnergyPotential();
+  }
+  for (Joint_V::const_iterator iter = this->joints.begin();
+    iter != this->joints.end(); ++iter)
+  {
+    for (unsigned int j = 0; j < (*iter)->GetAngleCount(); ++j)
+    {
+      e += (*iter)->GetWorldEnergyPotentialSpring(j);
+    }
+  }
+  return e;
+}
+
+/////////////////////////////////////////////////
+double Model::GetWorldEnergyKinetic() const
+{
+  double e = 0;
+  for (Link_V::const_iterator iter = this->links.begin();
+    iter != this->links.end(); ++iter)
+  {
+    e += (*iter)->GetWorldEnergyKinetic();
+  }
+  return e;
+}
+
+/////////////////////////////////////////////////
+double Model::GetWorldEnergy() const
+{
+  return this->GetWorldEnergyPotential() + this->GetWorldEnergyKinetic();
 }
diff --git a/gazebo/physics/Model.hh b/gazebo/physics/Model.hh
index bb9926b..264cc32 100644
--- a/gazebo/physics/Model.hh
+++ b/gazebo/physics/Model.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,12 +25,13 @@
 #include <string>
 #include <map>
 #include <vector>
+#include <boost/thread/recursive_mutex.hpp>
 
 #include "gazebo/common/CommonTypes.hh"
 #include "gazebo/physics/PhysicsTypes.hh"
-
 #include "gazebo/physics/ModelState.hh"
 #include "gazebo/physics/Entity.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
@@ -48,7 +49,7 @@ namespace gazebo
 
     /// \class Model Model.hh physics/physics.hh
     /// \brief A model is a collection of links, joints, and plugins.
-    class Model : public Entity
+    class GAZEBO_VISIBLE Model : public Entity
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent object.
@@ -84,6 +85,7 @@ namespace gazebo
       /// \brief Remove a child.
       /// \param[in] _child Remove a child entity.
       public: virtual void RemoveChild(EntityPtr _child);
+      using Base::RemoveChild;
 
       /// \brief Reset the model.
       public: void Reset();
@@ -188,7 +190,7 @@ namespace gazebo
 
       /// \brief Fill a model message.
       /// \param[in] _msg Message to fill using this model's data.
-      public: void FillMsg(msgs::Model &_msg);
+      public: virtual void FillMsg(msgs::Model &_msg);
 
       /// \brief Update parameters from a model message.
       /// \param[in] _msg Message to process.
@@ -199,7 +201,7 @@ namespace gazebo
       /// \param[in] _jointName Name of the joint to set.
       /// \param[in] _position Position to set the joint to.
       public: void SetJointPosition(const std::string &_jointName,
-                                    double _position);
+                                    double _position, int _index = 0);
 
       /// \brief Set the positions of a set of joints.
       /// \sa JointController::SetJointPositions.
@@ -212,8 +214,8 @@ namespace gazebo
       /// \param[in] _onComplete Callback function for when the animation
       /// completes.
       public: void SetJointAnimation(
-                 const std::map<std::string, common::NumericAnimationPtr> _anim,
-                 boost::function<void()> _onComplete = NULL);
+               const std::map<std::string, common::NumericAnimationPtr> &_anims,
+               boost::function<void()> _onComplete = NULL);
 
       /// \brief Stop the current animations.
       public: virtual void StopAnimation();
@@ -239,11 +241,14 @@ namespace gazebo
       /// \sa Model::AttachStaticModel.
       public: void DetachStaticModel(const std::string &_model);
 
-
       /// \brief Set the current model state.
       /// \param[in] _state State to set the model to.
       public: void SetState(const ModelState &_state);
 
+      /// \brief Set the scale of model.
+      /// \param[in] _scale Scale to set the model to.
+      public: void SetScale(const math::Vector3 &_scale);
+
       /// \brief Enable all the links in all the models.
       /// \param[in] _enabled True to enable all the links.
       public: void SetEnabled(bool _enabled);
@@ -289,6 +294,36 @@ namespace gazebo
       /// \return Number of sensors.
       public: unsigned int GetSensorCount() const;
 
+      /// \brief Get a handle to the Controller for the joints in this model.
+      /// \return A handle to the Controller for the joints in this model.
+      public: JointControllerPtr GetJointController();
+
+      /// \brief Get a gripper based on an index.
+      /// \return A pointer to a Gripper. Null if the _index is invalid.
+      public: GripperPtr GetGripper(size_t _index) const;
+
+      /// \brief Get the number of grippers in this model.
+      /// \return Size of this->grippers array.
+      /// \sa Model::GetGripper()
+      public: size_t GetGripperCount() const;
+
+      /// \brief Returns the potential energy of all links
+      /// and joint springs in the model.
+      /// \return this link's potential energy,
+      public: double GetWorldEnergyPotential() const;
+
+      /// \brief Returns sum of the kinetic energies of all links
+      /// in this model.  Computed using link's CoG velocity in
+      /// the inertial (world) frame.
+      /// \return this link's kinetic energy
+      public: double GetWorldEnergyKinetic() const;
+
+      /// \brief Returns this model's total energy, or
+      /// sum of Model::GetWorldEnergyPotential() and
+      /// Model::GetWorldEnergyKinetic().
+      /// \return this link's total energy
+      public: double GetWorldEnergy() const;
+
       /// \brief Callback when the pose of the model has been changed.
       protected: virtual void OnPoseChange();
 
@@ -307,31 +342,35 @@ namespace gazebo
       /// \param[in] _sdf SDF parameter.
       private: void LoadGripper(sdf::ElementPtr _sdf);
 
-      /// \brief Get a handle to the Controller for the joints in this model.
-      /// \return A handle to the Controller for the joints in this model.
-      public: JointControllerPtr GetJointController()
-        { return this->jointController; }
+      /// \brief Remove a link from the model's cached list of links.
+      /// This does not delete the link.
+      /// \param[in] _name Name of the link to remove.
+      private: void RemoveLink(const std::string &_name);
 
       /// used by Model::AttachStaticModel
       protected: std::vector<ModelPtr> attachedModels;
 
       /// used by Model::AttachStaticModel
       protected: std::vector<math::Pose> attachedModelsOffset;
+
+      /// \brief Publisher for joint info.
+      protected: transport::PublisherPtr jointPub;
+
       /// \brief The canonical link of the model.
       private: LinkPtr canonicalLink;
 
       /// \brief All the joints in the model.
       private: Joint_V joints;
 
+      /// \brief Cached list of links. This is here for performance.
+      private: Link_V links;
+
       /// \brief All the grippers in the model.
-      private: std::vector<Gripper*> grippers;
+      private: std::vector<GripperPtr> grippers;
 
       /// \brief All the model plugins.
       private: std::vector<ModelPluginPtr> plugins;
 
-      /// \brief Publisher for joint info.
-      private: transport::PublisherPtr jointPub;
-
       /// \brief The joint animations.
       private: std::map<std::string, common::NumericAnimationPtr>
                jointAnimations;
@@ -339,16 +378,11 @@ namespace gazebo
       /// \brief Callback used when a joint animation completes.
       private: boost::function<void()> onJointAnimationComplete;
 
-      /// \brief Previous time of the animation update.
-      private: common::Time prevAnimationTime;
-
       /// \brief Mutex used during the update cycle.
-      private: boost::recursive_mutex *updateMutex;
+      private: mutable boost::recursive_mutex updateMutex;
 
       /// \brief Controller for the joints.
       private: JointControllerPtr jointController;
-
-      private: bool pluginsLoaded;
     };
     /// \}
   }
diff --git a/gazebo/physics/ModelState.cc b/gazebo/physics/ModelState.cc
index 9b48a70..1fbff78 100644
--- a/gazebo/physics/ModelState.cc
+++ b/gazebo/physics/ModelState.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License")
  * you may not use this file except in compliance with the License.
@@ -31,6 +31,31 @@ ModelState::ModelState()
 }
 
 /////////////////////////////////////////////////
+ModelState::ModelState(const ModelPtr _model, const common::Time &_realTime,
+    const common::Time &_simTime)
+: State(_model->GetName(), _realTime, _simTime)
+{
+  this->pose = _model->GetWorldPose();
+
+  // Copy all the links
+  const Link_V links = _model->GetLinks();
+  for (Link_V::const_iterator iter = links.begin(); iter != links.end(); ++iter)
+  {
+    this->linkStates.insert(std::make_pair((*iter)->GetName(),
+          LinkState(*iter, _realTime, _simTime)));
+  }
+
+  // Copy all the joints
+  /*const Joint_V joints = _model->GetJoints();
+  for (Joint_V::const_iterator iter = joints.begin();
+       iter != joints.end(); ++iter)
+  {
+    this->jointStates.insert(std::make_pair((*iter)->GetName(),
+          JointState(*iter, _realTime, _simTime)));
+  }*/
+}
+
+/////////////////////////////////////////////////
 ModelState::ModelState(const ModelPtr _model)
 : State(_model->GetName(), _model->GetWorld()->GetRealTime(),
         _model->GetWorld()->GetSimTime())
@@ -41,16 +66,18 @@ ModelState::ModelState(const ModelPtr _model)
   const Link_V links = _model->GetLinks();
   for (Link_V::const_iterator iter = links.begin(); iter != links.end(); ++iter)
   {
-    this->linkStates.push_back(LinkState((*iter)));
+    this->linkStates.insert(std::make_pair((*iter)->GetName(),
+          LinkState((*iter))));
   }
 
   // Copy all the joints
-  const Joint_V joints = _model->GetJoints();
+  /*const Joint_V joints = _model->GetJoints();
   for (Joint_V::const_iterator iter = joints.begin();
        iter != joints.end(); ++iter)
   {
-    this->jointStates.push_back(JointState(*iter));
-  }
+    this->jointStates.insert(std::make_pair((*iter)->GetName(),
+          JointState(*iter)));
+  }*/
 }
 
 /////////////////////////////////////////////////
@@ -66,14 +93,62 @@ ModelState::~ModelState()
 }
 
 /////////////////////////////////////////////////
+void ModelState::Load(const ModelPtr _model, const common::Time &_realTime,
+    const common::Time &_simTime)
+{
+  this->name = _model->GetName();
+  this->wallTime = common::Time::GetWallTime();
+  this->realTime = _realTime;
+  this->simTime = _simTime;
+  this->pose = _model->GetWorldPose();
+
+  // Load all the links
+  const Link_V links = _model->GetLinks();
+  for (Link_V::const_iterator iter = links.begin(); iter != links.end(); ++iter)
+  {
+    this->linkStates[(*iter)->GetName()].Load(*iter, _realTime, _simTime);
+  }
+
+  // Remove links that no longer exist. We determine this by check the time
+  // stamp on each link.
+  for (LinkState_M::iterator iter = this->linkStates.begin();
+       iter != this->linkStates.end();)
+  {
+    if (iter->second.GetRealTime() != this->realTime)
+      this->linkStates.erase(iter++);
+    else
+      ++iter;
+  }
+
+  // Copy all the joints
+  /*const Joint_V joints = _model->GetJoints();
+  for (Joint_V::const_iterator iter = joints.begin();
+      iter != joints.end(); ++iter)
+  {
+    this->jointStates[(*iter)->GetName()].Load(*iter, _realTime, _simTime);
+  }
+
+  // Remove joints that no longer exist. We determine this by check the time
+  // stamp on each joint.
+  for (JointState_M::iterator iter = this->jointStates.begin();
+       iter != this->jointStates.end();)
+  {
+    if (iter->second.GetRealTime() != this->realTime)
+      this->jointStates.erase(iter++);
+    else
+      ++iter;
+  }*/
+}
+
+/////////////////////////////////////////////////
 void ModelState::Load(const sdf::ElementPtr _elem)
 {
   // Set the name
-  this->name = _elem->GetValueString("name");
+  this->name = _elem->Get<std::string>("name");
 
   // Set the model pose
   if (_elem->HasElement("pose"))
-    this->pose = _elem->GetValuePose("pose");
+    this->pose = _elem->Get<math::Pose>("pose");
   else
     this->pose.Set(0, 0, 0, 0, 0, 0);
 
@@ -85,23 +160,25 @@ void ModelState::Load(const sdf::ElementPtr _elem)
 
     while (childElem)
     {
-      this->linkStates.push_back(LinkState(childElem));
+      this->linkStates.insert(std::make_pair(
+            childElem->Get<std::string>("name"), LinkState(childElem)));
       childElem = childElem->GetNextElement("link");
     }
   }
 
   // Set all the joints
-  this->jointStates.clear();
+  /*this->jointStates.clear();
   if (_elem->HasElement("joint"))
   {
     sdf::ElementPtr childElem = _elem->GetElement("joint");
 
     while (childElem)
     {
-      this->jointStates.push_back(JointState(childElem));
+      this->jointStates.insert(std::make_pair(childElem->Get<std::string>("name"),
+            JointState(childElem)));
       childElem = childElem->GetNextElement("joint");
     }
-  }
+  }*/
 }
 
 /////////////////////////////////////////////////
@@ -115,17 +192,17 @@ bool ModelState::IsZero() const
 {
   bool result = true;
 
-  for (std::vector<LinkState>::const_iterator iter = this->linkStates.begin();
+  for (LinkState_M::const_iterator iter = this->linkStates.begin();
        iter != this->linkStates.end() && result; ++iter)
   {
-    result = result && (*iter).IsZero();
+    result = result && iter->second.IsZero();
   }
 
-  for (std::vector<JointState>::const_iterator iter = this->jointStates.begin();
+  /*for (JointState_M::const_iterator iter = this->jointStates.begin();
        iter != this->jointStates.end() && result; ++iter)
   {
-    result = result && (*iter).IsZero();
-  }
+    result = result && iter->second.IsZero();
+  }*/
 
   return result && this->pose == math::Pose::Zero;
 }
@@ -137,26 +214,45 @@ unsigned int ModelState::GetLinkStateCount() const
 }
 
 /////////////////////////////////////////////////
-LinkState ModelState::GetLinkState(unsigned int _index) const
+LinkState_M ModelState::GetLinkStates(const boost::regex &_regex) const
 {
-  if (_index < this->linkStates.size())
-    return this->linkStates[_index];
+  LinkState_M result;
 
-  gzthrow("Index is out of range");
-  return LinkState();
+  // Search for matching link names
+  for (LinkState_M::const_iterator iter = this->linkStates.begin();
+       iter != this->linkStates.end(); ++iter)
+  {
+    if (boost::regex_match(iter->first, _regex))
+      result.insert(std::make_pair(iter->first, iter->second));
+  }
+
+  return result;
 }
 
 /////////////////////////////////////////////////
-LinkState ModelState::GetLinkState(const std::string &_linkName) const
+JointState_M ModelState::GetJointStates(const boost::regex &_regex) const
 {
-  // Search for the link name
-  for (std::vector<LinkState>::const_iterator iter = this->linkStates.begin();
-       iter != this->linkStates.end(); ++iter)
+  JointState_M result;
+
+  // Search for matching link names
+  for (JointState_M::const_iterator iter = this->jointStates.begin();
+       iter != this->jointStates.end(); ++iter)
   {
-    if ((*iter).GetName() == _linkName)
-      return *iter;
+    if (boost::regex_match(iter->second.GetName(), _regex))
+      result.insert(std::make_pair(iter->first, iter->second));
   }
 
+  return result;
+}
+
+/////////////////////////////////////////////////
+LinkState ModelState::GetLinkState(const std::string &_linkName) const
+{
+  // Search for the link name
+  LinkState_M::const_iterator iter = this->linkStates.find(_linkName);
+  if (iter != this->linkStates.end())
+    return iter->second;
+
   gzthrow("Invalid link name[" + _linkName + "]");
   return LinkState();
 }
@@ -165,18 +261,15 @@ LinkState ModelState::GetLinkState(const std::string &_linkName) const
 bool ModelState::HasLinkState(const std::string &_linkName) const
 {
   // Search for the link name
-  for (std::vector<LinkState>::const_iterator iter = this->linkStates.begin();
-       iter != this->linkStates.end(); ++iter)
-  {
-    if ((*iter).GetName() == _linkName)
-      return true;
-  }
+  LinkState_M::const_iterator iter = this->linkStates.find(_linkName);
+  if (iter != this->linkStates.end())
+    return true;
 
   return false;
 }
 
 /////////////////////////////////////////////////
-const std::vector<LinkState> &ModelState::GetLinkStates() const
+const LinkState_M &ModelState::GetLinkStates() const
 {
   return this->linkStates;
 }
@@ -191,7 +284,11 @@ unsigned int ModelState::GetJointStateCount() const
 JointState ModelState::GetJointState(unsigned int _index) const
 {
   if (_index < this->jointStates.size())
-    return this->jointStates[_index];
+  {
+    JointState_M::const_iterator iter = this->jointStates.begin();
+    std::advance(iter, _index);
+    return iter->second;
+  }
 
   gzthrow("Index is out of range");
   return JointState();
@@ -200,12 +297,9 @@ JointState ModelState::GetJointState(unsigned int _index) const
 /////////////////////////////////////////////////
 JointState ModelState::GetJointState(const std::string &_jointName) const
 {
-  for (std::vector<JointState>::const_iterator iter = this->jointStates.begin();
-       iter != this->jointStates.end(); ++iter)
-  {
-    if ((*iter).GetName() == _jointName)
-      return *iter;
-  }
+  JointState_M::const_iterator iter = this->jointStates.find(_jointName);
+  if (iter != this->jointStates.end())
+    return iter->second;
 
   gzthrow("Invalid joint name[" + _jointName + "]");
   return JointState();
@@ -214,18 +308,16 @@ JointState ModelState::GetJointState(const std::string &_jointName) const
 /////////////////////////////////////////////////
 bool ModelState::HasJointState(const std::string &_jointName) const
 {
-  for (std::vector<JointState>::const_iterator iter = this->jointStates.begin();
-       iter != this->jointStates.end(); ++iter)
-  {
-    if ((*iter).GetName() == _jointName)
-      return true;
-  }
+  JointState_M::const_iterator iter = this->jointStates.find(_jointName);
+  if (iter != this->jointStates.end())
+    return true;
+
 
   return false;
 }
 
 /////////////////////////////////////////////////
-const std::vector<JointState> &ModelState::GetJointStates() const
+const JointState_M &ModelState::GetJointStates() const
 {
   return this->jointStates;
 }
@@ -243,18 +335,18 @@ ModelState &ModelState::operator=(const ModelState &_state)
   this->jointStates.clear();
 
   // Copy the link states.
-  for (std::vector<LinkState>::const_iterator iter =
+  for (LinkState_M::const_iterator iter =
        _state.linkStates.begin(); iter != _state.linkStates.end(); ++iter)
   {
-    this->linkStates.push_back(LinkState(*iter));
+    this->linkStates.insert(std::make_pair(iter->first, iter->second));
   }
 
   // Copy the joint states.
-  for (std::vector<JointState>::const_iterator iter =
-       _state.jointStates.begin(); iter != _state.jointStates.end(); ++iter)
-  {
-    this->jointStates.push_back(JointState(*iter));
-  }
+  // for (JointState_M::const_iterator iter =
+  //     _state.jointStates.begin(); iter != _state.jointStates.end(); ++iter)
+  // {
+  //   this->jointStates.insert(std::make_pair(iter->first, iter->second));
+  // }
 
   return *this;
 }
@@ -269,16 +361,17 @@ ModelState ModelState::operator-(const ModelState &_state) const
   result.pose.rot = _state.pose.rot.GetInverse() * this->pose.rot;
 
   // Insert the link state diffs.
-  for (std::vector<LinkState>::const_iterator iter =
+  for (LinkState_M::const_iterator iter =
        this->linkStates.begin(); iter != this->linkStates.end(); ++iter)
   {
     try
     {
-      if (_state.HasLinkState((*iter).GetName()))
+      if (_state.HasLinkState(iter->second.GetName()))
       {
-        LinkState state = (*iter) - _state.GetLinkState((*iter).GetName());
+        LinkState state = iter->second - _state.GetLinkState(
+            iter->second.GetName());
         if (!state.IsZero())
-          result.linkStates.push_back(state);
+          result.linkStates.insert(std::make_pair(state.GetName(), state));
       }
     }
     catch(common::Exception &)
@@ -289,16 +382,17 @@ ModelState ModelState::operator-(const ModelState &_state) const
   }
 
   // Insert the joint state diffs.
-  for (std::vector<JointState>::const_iterator iter =
+  /*for (JointState_M::const_iterator iter =
        this->jointStates.begin(); iter != this->jointStates.end(); ++iter)
   {
     try
     {
-      if (_state.HasJointState((*iter).GetName()))
+      if (_state.HasJointState(iter->second.GetName()))
       {
-        JointState state = (*iter) - _state.GetJointState((*iter).GetName());
+        JointState state = iter->second -
+          _state.GetJointState(iter->second.GetName());
         if (!state.IsZero())
-          result.jointStates.push_back(state);
+          result.jointStates.insert(std::make_pair(state.GetName(), state));
       }
     }
     catch(common::Exception &)
@@ -306,7 +400,7 @@ ModelState ModelState::operator-(const ModelState &_state) const
       // Ignore exception, which is just the fact that a joint state may not
       // have been recorded.
     }
-  }
+  }*/
 
   return result;
 }
@@ -321,15 +415,16 @@ ModelState ModelState::operator+(const ModelState &_state) const
   result.pose.rot = _state.pose.rot * this->pose.rot;
 
   // Insert the link state diffs.
-  for (std::vector<LinkState>::const_iterator iter =
+  for (LinkState_M::const_iterator iter =
        this->linkStates.begin(); iter != this->linkStates.end(); ++iter)
   {
     try
     {
-      if (_state.HasLinkState((*iter).GetName()))
+      if (_state.HasLinkState(iter->second.GetName()))
       {
-        LinkState state = (*iter) + _state.GetLinkState((*iter).GetName());
-        result.linkStates.push_back(state);
+        LinkState state = iter->second + _state.GetLinkState(
+            iter->second.GetName());
+        result.linkStates.insert(std::make_pair(state.GetName(), state));
       }
     }
     catch(common::Exception &)
@@ -340,15 +435,16 @@ ModelState ModelState::operator+(const ModelState &_state) const
   }
 
   // Insert the joint state diffs.
-  for (std::vector<JointState>::const_iterator iter =
+  for (JointState_M::const_iterator iter =
        this->jointStates.begin(); iter != this->jointStates.end(); ++iter)
   {
     try
     {
-      if (_state.HasJointState((*iter).GetName()))
+      if (_state.HasJointState(iter->second.GetName()))
       {
-        JointState state = (*iter) + _state.GetJointState((*iter).GetName());
-        result.jointStates.push_back(state);
+        JointState state = iter->second +
+          _state.GetJointState(iter->second.GetName());
+        result.jointStates.insert(std::make_pair(state.GetName(), state));
       }
     }
     catch(common::Exception &)
@@ -369,17 +465,71 @@ void ModelState::FillSDF(sdf::ElementPtr _sdf)
   _sdf->GetAttribute("name")->Set(this->name);
   _sdf->GetElement("pose")->Set(this->pose);
 
-  for (std::vector<LinkState>::iterator iter = this->linkStates.begin();
+  for (LinkState_M::iterator iter = this->linkStates.begin();
        iter != this->linkStates.end(); ++iter)
   {
     sdf::ElementPtr elem = _sdf->AddElement("link");
-    (*iter).FillSDF(elem);
+    iter->second.FillSDF(elem);
   }
 
-  for (std::vector<JointState>::iterator iter = this->jointStates.begin();
+  for (JointState_M::iterator iter = this->jointStates.begin();
        iter != this->jointStates.end(); ++iter)
   {
     sdf::ElementPtr elem = _sdf->AddElement("joint");
-    (*iter).FillSDF(elem);
+    iter->second.FillSDF(elem);
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelState::SetWallTime(const common::Time &_time)
+{
+  State::SetWallTime(_time);
+
+  for (LinkState_M::iterator iter = this->linkStates.begin();
+       iter != this->linkStates.end(); ++iter)
+  {
+    iter->second.SetWallTime(_time);
+  }
+
+  for (JointState_M::iterator iter = this->jointStates.begin();
+       iter != this->jointStates.end(); ++iter)
+  {
+    iter->second.SetWallTime(_time);
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelState::SetRealTime(const common::Time &_time)
+{
+  State::SetRealTime(_time);
+
+  for (LinkState_M::iterator iter = this->linkStates.begin();
+           iter != this->linkStates.end(); ++iter)
+  {
+    iter->second.SetRealTime(_time);
+  }
+
+  for (JointState_M::iterator iter = this->jointStates.begin();
+       iter != this->jointStates.end(); ++iter)
+  {
+    iter->second.SetRealTime(_time);
+  }
+}
+
+/////////////////////////////////////////////////
+void ModelState::SetSimTime(const common::Time &_time)
+{
+  State::SetSimTime(_time);
+
+  for (LinkState_M::iterator iter = this->linkStates.begin();
+       iter != this->linkStates.end(); ++iter)
+  {
+    iter->second.SetSimTime(_time);
+  }
+
+  for (JointState_M::iterator iter = this->jointStates.begin();
+       iter != this->jointStates.end(); ++iter)
+  {
+    iter->second.SetSimTime(_time);
   }
 }
diff --git a/gazebo/physics/ModelState.hh b/gazebo/physics/ModelState.hh
index 1756b22..dee939e 100644
--- a/gazebo/physics/ModelState.hh
+++ b/gazebo/physics/ModelState.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,12 +23,14 @@
 
 #include <vector>
 #include <string>
+#include <boost/regex.hpp>
 
 #include "gazebo/math/Pose.hh"
 
 #include "gazebo/physics/State.hh"
 #include "gazebo/physics/LinkState.hh"
 #include "gazebo/physics/JointState.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -45,7 +47,7 @@ namespace gazebo
     ///
     /// State of a Model includes the state of all its child Links and
     /// Joints.
-    class ModelState : public State
+    class GAZEBO_VISIBLE ModelState : public State
     {
       /// \brief Default constructor.
       public: ModelState();
@@ -55,6 +57,16 @@ namespace gazebo
       /// Build a ModelState from an existing Model.
       /// \param[in] _model Pointer to the model from which to gather state
       /// info.
+      /// \param[in] _realTime Real time stamp.
+      /// \param[in] _simTime Sim time stamp.
+      public: ModelState(const ModelPtr _model, const common::Time &_realTime,
+                  const common::Time &_simTime);
+
+      /// \brief Constructor.
+      ///
+      /// Build a ModelState from an existing Model.
+      /// \param[in] _model Pointer to the model from which to gather state
+      /// info.
       public: explicit ModelState(const ModelPtr _model);
 
       /// \brief Constructor
@@ -66,6 +78,16 @@ namespace gazebo
       /// \brief Destructor.
       public: virtual ~ModelState();
 
+      /// \brief Load state from Model pointer.
+      ///
+      /// Build a ModelState from an existing Model.
+      /// \param[in] _model Pointer to the model from which to gather state
+      /// info.
+      /// \param[in] _realTime Real time stamp.
+      /// \param[in] _simTime Sim time stamp.
+      public: void Load(const ModelPtr _model, const common::Time &_realTime,
+                  const common::Time &_simTime);
+
       /// \brief Load state from SDF element.
       ///
       /// Load ModelState information from stored data in and SDF::Element
@@ -86,14 +108,17 @@ namespace gazebo
       /// \return Number of LinkState recorded.
       public: unsigned int GetLinkStateCount() const;
 
-      /// \brief Get a link state.
-      ///
-      /// Get a Link State based on an index, where index is in the range of
-      /// 0...ModelState::GetLinkStateCount
-      /// \param[in] _index Index of the LinkState
-      /// \return State of the Link.
-      /// \throws common::Exception When _index is out of range.
-      public: LinkState GetLinkState(unsigned int _index) const;
+      /// \brief Get link states based on a regular expression.
+      /// \param[in] _regex The regular expression.
+      /// \return List of link states whose names match the regular
+      /// expression.
+      public: LinkState_M GetLinkStates(const boost::regex &_regex) const;
+
+      /// \brief Get joint states based on a regular expression.
+      /// \param[in] _regex The regular expression.
+      /// \return List of joint states whose names match the regular
+      /// expression.
+      public: JointState_M GetJointStates(const boost::regex &_regex) const;
 
       /// \brief Get a link state by Link name
       ///
@@ -110,8 +135,8 @@ namespace gazebo
       public: bool HasLinkState(const std::string &_linkName) const;
 
       /// \brief Get the link states.
-      /// \return A vector of link states.
-      public: const std::vector<LinkState> &GetLinkStates() const;
+      /// \return A map of link states.
+      public: const LinkState_M &GetLinkStates() const;
 
       /// \brief Get the number of joint states.
       ///
@@ -138,8 +163,8 @@ namespace gazebo
       public: JointState GetJointState(const std::string &_jointName) const;
 
       /// \brief Get the joint states.
-      /// \return A vector of joint states.
-      public: const std::vector<JointState> &GetJointStates() const;
+      /// \return A map of joint states.
+      public: const JointState_M &GetJointStates() const;
 
       /// \brief Return true if there is a joint with the specified name.
       /// \param[in] _jointName Name of the Jointtate.
@@ -150,6 +175,19 @@ namespace gazebo
       /// \param[out] _sdf SDF element to populate.
       public: void FillSDF(sdf::ElementPtr _sdf);
 
+      /// \brief Set the wall time when this state was generated
+      /// \param[in] _time The absolute clock time when the State
+      /// data was recorded.
+      public: virtual void SetWallTime(const common::Time &_time);
+
+      /// \brief Set the real time when this state was generated
+      /// \param[in] _time Clock time since simulation was stated.
+      public: virtual void SetRealTime(const common::Time &_time);
+
+      /// \brief Set the sim time when this state was generated
+      /// \param[in] _time Simulation time when the data was recorded.
+      public: virtual void SetSimTime(const common::Time &_time);
+
       /// \brief Assignment operator
       /// \param[in] _state State value
       /// \return this
@@ -169,28 +207,37 @@ namespace gazebo
       /// \param[in] _out output stream.
       /// \param[in] _state Model state to output.
       /// \return The stream.
-      public: friend std::ostream &operator<<(std::ostream &_out,
-                                     const gazebo::physics::ModelState &_state)
+      public: inline friend std::ostream &operator<<(std::ostream &_out,
+                  const gazebo::physics::ModelState &_state)
       {
-        _out << "  <model name='" << _state.GetName() << "'>\n";
-        _out << "    <pose>" << _state.pose << "</pose>\n";
-
-        for (std::vector<LinkState>::const_iterator iter =
+        math::Vector3 q(_state.pose.rot.GetAsEuler());
+        _out << std::fixed <<std::setprecision(3)
+          << "<model name='" << _state.GetName() << "'>"
+          << "<pose>"
+          << _state.pose.pos.x << " "
+          << _state.pose.pos.y << " "
+          << _state.pose.pos.z << " "
+          << q.x << " "
+          << q.y << " "
+          << q.z << " "
+          << "</pose>";
+
+        for (LinkState_M::const_iterator iter =
             _state.linkStates.begin(); iter != _state.linkStates.end();
             ++iter)
         {
-          _out << *iter;
+          _out << iter->second;
         }
 
         // Output the joint information
-        for (std::vector<JointState>::const_iterator iter =
-            _state.jointStates.begin(); iter != _state.jointStates.end();
-            ++iter)
-        {
-          _out << *iter;
-        }
+        // for (JointState_M::const_iterator iter =
+        //     _state.jointStates.begin(); iter != _state.jointStates.end();
+        //     ++iter)
+        // {
+        //   _out << iter->second;
+        // }
 
-        _out << "  </model>\n";
+        _out << "</model>";
 
         return _out;
       }
@@ -199,10 +246,10 @@ namespace gazebo
       private: math::Pose pose;
 
       /// \brief All the link states.
-      private: std::vector<LinkState> linkStates;
+      private: LinkState_M linkStates;
 
       /// \brief All the joint states.
-      private: std::vector<JointState> jointStates;
+      private: JointState_M jointStates;
     };
     /// \}
   }
diff --git a/gazebo/physics/MultiRayShape.cc b/gazebo/physics/MultiRayShape.cc
index 7c74c18..872a222 100644
--- a/gazebo/physics/MultiRayShape.cc
+++ b/gazebo/physics/MultiRayShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,9 +14,9 @@
  * limitations under the License.
  *
 */
-#include "common/Exception.hh"
-#include "msgs/msgs.hh"
-#include "physics/MultiRayShape.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/physics/MultiRayShape.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -50,7 +50,6 @@ void MultiRayShape::Init()
   int vertSamples = 1;
   // double vertResolution = 1.0;
   double vertMinAngle = 0;
-  double vertMaxAngle = 0;
 
   double minRange, maxRange;
 
@@ -62,21 +61,21 @@ void MultiRayShape::Init()
   if (this->scanElem->HasElement("vertical"))
   {
     this->vertElem = this->scanElem->GetElement("vertical");
-    vertMinAngle = this->vertElem->GetValueDouble("min_angle");
-    vertMaxAngle = this->vertElem->GetValueDouble("max_angle");
-    vertSamples = this->vertElem->GetValueUInt("samples");
-    // vertResolution = this->vertElem->GetValueDouble("resolution");
+    vertMinAngle = this->vertElem->Get<double>("min_angle");
+    double vertMaxAngle = this->vertElem->Get<double>("max_angle");
+    vertSamples = this->vertElem->Get<unsigned int>("samples");
+    // vertResolution = this->vertElem->Get<double>("resolution");
     pDiff = vertMaxAngle - vertMinAngle;
   }
 
-  horzMinAngle = this->horzElem->GetValueDouble("min_angle");
-  horzMaxAngle = this->horzElem->GetValueDouble("max_angle");
-  horzSamples = this->horzElem->GetValueUInt("samples");
-  // horzResolution = this->horzElem->GetValueDouble("resolution");
+  horzMinAngle = this->horzElem->Get<double>("min_angle");
+  horzMaxAngle = this->horzElem->Get<double>("max_angle");
+  horzSamples = this->horzElem->Get<unsigned int>("samples");
+  // horzResolution = this->horzElem->Get<double>("resolution");
   yDiff = horzMaxAngle - horzMinAngle;
 
-  minRange = this->rangeElem->GetValueDouble("min");
-  maxRange = this->rangeElem->GetValueDouble("max");
+  minRange = this->rangeElem->Get<double>("min");
+  maxRange = this->rangeElem->Get<double>("max");
 
   this->offset = this->collisionParent->GetRelativePose();
 
@@ -91,7 +90,9 @@ void MultiRayShape::Init()
       pitchAngle = (vertSamples == 1)? 0 :
         j * pDiff / (vertSamples - 1) + vertMinAngle;
 
-      ray.SetFromEuler(math::Vector3(0.0, pitchAngle, yawAngle));
+      // since we're rotating a unit x vector, a pitch rotation will now be
+      // around the negative y axis
+      ray.SetFromEuler(math::Vector3(0.0, -pitchAngle, yawAngle));
       axis = this->offset.rot * ray * math::Vector3(1.0, 0.0, 0.0);
 
       start = (axis * minRange) + this->offset.pos;
@@ -103,9 +104,23 @@ void MultiRayShape::Init()
 }
 
 //////////////////////////////////////////////////
-double MultiRayShape::GetRange(int _index)
+void MultiRayShape::SetScale(const math::Vector3 &_scale)
 {
-  if (_index < 0 || _index >= static_cast<int>(this->rays.size()))
+  if (this->scale == _scale)
+    return;
+
+  this->scale = _scale;
+
+  for (unsigned int i = 0; i < this->rays.size(); ++i)
+  {
+    this->rays[i]->SetScale(this->scale);
+  }
+}
+
+//////////////////////////////////////////////////
+double MultiRayShape::GetRange(unsigned int _index)
+{
+  if (_index >= this->rays.size())
   {
     std::ostringstream stream;
     stream << "index[" << _index << "] out of range[0-"
@@ -113,13 +128,14 @@ double MultiRayShape::GetRange(int _index)
     gzthrow(stream.str());
   }
 
-  return this->rays[_index]->GetLength();
+  // Add min range, because we measured from min range.
+  return this->GetMinRange() + this->rays[_index]->GetLength();
 }
 
 //////////////////////////////////////////////////
-double MultiRayShape::GetRetro(int _index)
+double MultiRayShape::GetRetro(unsigned int _index)
 {
-  if (_index < 0 || _index >= static_cast<int>(this->rays.size()))
+  if (_index >= this->rays.size())
   {
     std::ostringstream stream;
     stream << "index[" << _index << "] out of range[0-"
@@ -131,9 +147,9 @@ double MultiRayShape::GetRetro(int _index)
 }
 
 //////////////////////////////////////////////////
-int MultiRayShape::GetFiducial(int _index)
+int MultiRayShape::GetFiducial(unsigned int _index)
 {
-  if (_index < 0 || _index >= static_cast<int>(this->rays.size()))
+  if (_index >= this->rays.size())
   {
     std::ostringstream stream;
     stream << "index[" << _index << "] out of range[0-"
@@ -147,14 +163,15 @@ int MultiRayShape::GetFiducial(int _index)
 //////////////////////////////////////////////////
 void MultiRayShape::Update()
 {
-  double maxRange = this->rangeElem->GetValueDouble("max");
+  // The measurable range is (max-min)
+  double fullRange = this->GetMaxRange() - this->GetMinRange();
 
   // Reset the ray lengths and mark the collisions as dirty (so they get
   // redrawn)
   unsigned int ray_size = this->rays.size();
   for (unsigned int i = 0; i < ray_size; i++)
   {
-    this->rays[i]->SetLength(maxRange);
+    this->rays[i]->SetLength(fullRange);
     this->rays[i]->SetRetro(0.0);
 
     // Get the global points of the line
@@ -183,50 +200,50 @@ void MultiRayShape::AddRay(const math::Vector3 &/*_start*/,
 //////////////////////////////////////////////////
 double MultiRayShape::GetMinRange() const
 {
-  return this->rangeElem->GetValueDouble("min");
+  return this->rangeElem->Get<double>("min");
 }
 
 //////////////////////////////////////////////////
 double MultiRayShape::GetMaxRange() const
 {
-  return this->rangeElem->GetValueDouble("max");
+  return this->rangeElem->Get<double>("max");
 }
 
 //////////////////////////////////////////////////
 double MultiRayShape::GetResRange() const
 {
-  return this->rangeElem->GetValueDouble("resolution");
+  return this->rangeElem->Get<double>("resolution");
 }
 
 //////////////////////////////////////////////////
 int MultiRayShape::GetSampleCount() const
 {
-  return this->horzElem->GetValueUInt("samples");
+  return this->horzElem->Get<unsigned int>("samples");
 }
 
 //////////////////////////////////////////////////
 double MultiRayShape::GetScanResolution() const
 {
-  return this->horzElem->GetValueDouble("resolution");
+  return this->horzElem->Get<double>("resolution");
 }
 
 //////////////////////////////////////////////////
 math::Angle MultiRayShape::GetMinAngle() const
 {
-  return this->horzElem->GetValueDouble("min_angle");
+  return this->horzElem->Get<double>("min_angle");
 }
 
 //////////////////////////////////////////////////
 math::Angle MultiRayShape::GetMaxAngle() const
 {
-  return this->horzElem->GetValueDouble("max_angle");
+  return this->horzElem->Get<double>("max_angle");
 }
 
 //////////////////////////////////////////////////
 int MultiRayShape::GetVerticalSampleCount() const
 {
   if (this->vertElem)
-    return this->vertElem->GetValueUInt("samples");
+    return this->vertElem->Get<unsigned int>("samples");
   else
     return 1;
 }
@@ -235,7 +252,7 @@ int MultiRayShape::GetVerticalSampleCount() const
 double MultiRayShape::GetVerticalScanResolution() const
 {
   if (this->vertElem)
-    return this->vertElem->GetValueDouble("resolution");
+    return this->vertElem->Get<double>("resolution");
   else
     return 1;
 }
@@ -244,7 +261,7 @@ double MultiRayShape::GetVerticalScanResolution() const
 math::Angle MultiRayShape::GetVerticalMinAngle() const
 {
   if (this->vertElem)
-    return this->vertElem->GetValueDouble("min_angle");
+    return this->vertElem->Get<double>("min_angle");
   else
     return math::Angle(0);
 }
@@ -253,7 +270,7 @@ math::Angle MultiRayShape::GetVerticalMinAngle() const
 math::Angle MultiRayShape::GetVerticalMaxAngle() const
 {
   if (this->vertElem)
-    return this->vertElem->GetValueDouble("max_angle");
+    return this->vertElem->Get<double>("max_angle");
   else
     return math::Angle(0);
 }
diff --git a/gazebo/physics/MultiRayShape.hh b/gazebo/physics/MultiRayShape.hh
index a5aa4c7..92f5599 100644
--- a/gazebo/physics/MultiRayShape.hh
+++ b/gazebo/physics/MultiRayShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
 #include "gazebo/physics/Collision.hh"
 #include "gazebo/physics/Shape.hh"
 #include "gazebo/physics/RayShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +38,7 @@ namespace gazebo
     /// \class MultiRayShape MultiRayShape.hh physics/physics.hh
     /// \brief Laser collision contains a set of ray-collisions,
     /// structured to simulate a laser range scanner.
-    class MultiRayShape : public Shape
+    class GAZEBO_VISIBLE MultiRayShape : public Shape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent collision shape.
@@ -49,20 +50,24 @@ namespace gazebo
       /// \brief Init the shape.
       public: virtual void Init();
 
+      /// \brief Set the scale of the multi ray shape.
+      /// \return _scale Scale to set the multi ray shape to.
+      public: virtual void SetScale(const math::Vector3 &_scale);
+
       /// \brief Get detected range for a ray.
       /// \param[in] _index Index of the ray.
       /// \returns Returns DBL_MAX for no detection.
-      public: double GetRange(int _index);
+      public: double GetRange(unsigned int _index);
 
       /// \brief Get detected retro (intensity) value for a ray.
       /// \param[in] _index Index of the ray.
       /// \return Retro value for the ray.
-      public: double GetRetro(int _index);
+      public: double GetRetro(unsigned int _index);
 
       /// \brief Get detected fiducial value for a ray.
       /// \param[in] _index Index of the ray.
       /// \return Fiducial value for the ray.
-      public: int GetFiducial(int _index);
+      public: int GetFiducial(unsigned int _index);
 
       /// \brief Get the minimum range.
       /// \return Minimum range of all the rays.
@@ -105,7 +110,7 @@ namespace gazebo
       public: math::Angle GetVerticalMinAngle() const;
 
       /// \brief Get the vertical max angle.
-      /// \return Verticam max angle.
+      /// \return Vertical max angle.
       public: math::Angle GetVerticalMaxAngle() const;
 
       /// \brief Update the ray collisions.
@@ -126,12 +131,12 @@ namespace gazebo
       /// \return The connection, which must be kept in scope.
       public: template<typename T>
               event::ConnectionPtr ConnectNewLaserScans(T _subscriber)
-              {return newLaserScans.Connect(_subscriber);}
+              {return this->newLaserScans.Connect(_subscriber);}
 
       /// \brief Disconnect from the new laser scans signal.
       /// \param[in] _conn Connection to remove.
       public: void DisconnectNewLaserScans(event::ConnectionPtr &_conn)
-              {newLaserScans.Disconnect(_conn);}
+              {this->newLaserScans.Disconnect(_conn);}
 
       /// \brief Physics engine specific method for updating the rays.
       protected: virtual void UpdateRays() = 0;
diff --git a/gazebo/physics/Physics.cc b/gazebo/physics/Physics.cc
deleted file mode 100644
index 52e38ae..0000000
--- a/gazebo/physics/Physics.cc
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "common/Console.hh"
-#include "common/Exception.hh"
-#include "physics/World.hh"
-#include "physics/PhysicsFactory.hh"
-#include "physics/Physics.hh"
-#include "gazebo_config.h"
-
-using namespace gazebo;
-
-std::vector<physics::WorldPtr> g_worlds;
-
-/////////////////////////////////////////////////
-bool physics::load()
-{
-  physics::PhysicsFactory::RegisterAll();
-  return true;
-}
-
-/////////////////////////////////////////////////
-bool physics::fini()
-{
-  remove_worlds();
-  return true;
-}
-
-/////////////////////////////////////////////////
-physics::WorldPtr physics::create_world(const std::string &_name)
-{
-  physics::WorldPtr world(new physics::World(_name));
-  g_worlds.push_back(world);
-  return world;
-}
-
-/////////////////////////////////////////////////
-physics::WorldPtr physics::get_world(const std::string &_name)
-{
-  if (_name.empty())
-  {
-    if (g_worlds.empty())
-      gzerr << "no worlds\n";
-    else
-      return *(g_worlds.begin());
-  }
-  else
-  {
-    for (std::vector<WorldPtr>::iterator iter = g_worlds.begin();
-        iter != g_worlds.end(); ++iter)
-    {
-      if ((*iter)->GetName() == _name)
-        return (*iter);
-    }
-  }
-
-  gzerr << "Unable to find world by name in physics::get_world["
-    << _name.c_str() << "]\n";
-  gzthrow("Unable to find world by name in physics::get_world(world_name)");
-}
-
-/////////////////////////////////////////////////
-void physics::load_worlds(sdf::ElementPtr _sdf)
-{
-  std::vector<WorldPtr>::iterator iter;
-  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
-    (*iter)->Load(_sdf);
-}
-
-/////////////////////////////////////////////////
-void physics::init_worlds()
-{
-  std::vector<WorldPtr>::iterator iter;
-  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
-    (*iter)->Init();
-}
-
-/////////////////////////////////////////////////
-void physics::run_worlds()
-{
-  std::vector<WorldPtr>::iterator iter;
-  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
-    (*iter)->Run();
-}
-
-/////////////////////////////////////////////////
-void physics::pause_worlds(bool _pause)
-{
-  std::vector<WorldPtr>::iterator iter;
-  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
-    (*iter)->SetPaused(_pause);
-}
-
-/////////////////////////////////////////////////
-void physics::stop_worlds()
-{
-  std::vector<WorldPtr>::iterator iter;
-  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
-    (*iter)->Stop();
-}
-
-/////////////////////////////////////////////////
-void physics::load_world(WorldPtr _world, sdf::ElementPtr _sdf)
-{
-  _world->Load(_sdf);
-}
-
-/////////////////////////////////////////////////
-void physics::init_world(WorldPtr _world)
-{
-  _world->Init();
-}
-
-/////////////////////////////////////////////////
-void physics::run_world(WorldPtr _world)
-{
-  _world->Run();
-}
-
-/////////////////////////////////////////////////
-void physics::pause_world(WorldPtr _world, bool _pause)
-{
-  _world->SetPaused(_pause);
-}
-
-/////////////////////////////////////////////////
-void physics::stop_world(WorldPtr _world)
-{
-  _world->Stop();
-}
-
-/////////////////////////////////////////////////
-void physics::remove_worlds()
-{
-  for (std::vector<WorldPtr>::iterator iter = g_worlds.begin();
-      iter != g_worlds.end(); ++iter)
-  {
-    (*iter)->Fini();
-    (*iter).reset();
-  }
-
-  g_worlds.clear();
-}
-
-
diff --git a/gazebo/physics/Physics.hh b/gazebo/physics/Physics.hh
deleted file mode 100644
index c202cb1..0000000
--- a/gazebo/physics/Physics.hh
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef _PHYSICS_HH_
-#define _PHYSICS_HH_
-
-#include <string>
-
-#include "gazebo/physics/PhysicsTypes.hh"
-#include "gazebo/sdf/sdf.hh"
-
-namespace gazebo
-{
-  /// \ingroup gazebo_physics
-  /// \brief physics namespace
-  namespace physics
-  {
-    /// \addtogroup gazebo_physics
-    /// \{
-
-    /// \brief Setup gazebo::SystemPlugin's and call gazebo::transport::init.
-    bool load();
-
-    /// \brief Finalize transport by calling gazebo::transport::fini.
-    bool fini();
-
-    /// \brief Create a world given a name.
-    /// \param[in] _name Name of the world to create.
-    /// \return Pointer to the new world.
-    WorldPtr create_world(const std::string &_name ="");
-
-    /// \brief Returns a pointer to a world by name.
-    /// \param[in] _name Name of the world to get.
-    /// \return Pointer to the world.
-    WorldPtr get_world(const std::string &_name = "");
-
-    /// \brief Load world from sdf::Element pointer.
-    /// \param[in] _world Pointer to a world.
-    /// \param[in] _sdf SDF values to load from.
-    void load_world(WorldPtr _world, sdf::ElementPtr _sdf);
-
-    /// \brief Init world given a pointer to it.
-    /// \param[in] _world World to initialize.
-    void init_world(WorldPtr _world);
-
-    /// \brief Run world by calling World::Run() given a pointer to it.
-    /// \param[in] _world World to run.
-    void run_world(WorldPtr _world);
-
-    /// \brief Stop world by calling World::Stop() given a pointer to it.
-    /// \param[in] _world World to stop.
-    void stop_world(WorldPtr _world);
-
-    /// \brief Pause world by calling World::SetPaused.
-    /// \param[in] _world World to pause or unpause.
-    /// \param[in] _pause True to pause, False to unpause.
-    void pause_world(WorldPtr _world, bool _pause);
-
-    /// \brief load multiple worlds from single sdf::Element pointer
-    /// \param[in] _sdf SDF values used to create worlds.
-    void load_worlds(sdf::ElementPtr _sdf);
-
-    /// \brief initialize multiple worlds stored in static variable
-    /// gazebo::g_worlds
-    void init_worlds();
-
-    /// \brief run multiple worlds stored in static variable
-    /// gazebo::g_worlds
-    void run_worlds();
-
-    /// \brief stop multiple worlds stored in static variable
-    /// gazebo::g_worlds
-    void stop_worlds();
-
-    /// \brief pause multiple worlds stored in static variable
-    /// gazebo::g_worlds
-    /// \param[in] _pause True to pause, False to unpause.
-    void pause_worlds(bool pause);
-
-    /// \brief remove multiple worlds stored in static variable
-    /// gazebo::g_worlds
-    void remove_worlds();
-    /// \}
-  }
-}
-#endif
diff --git a/gazebo/physics/PhysicsEngine.cc b/gazebo/physics/PhysicsEngine.cc
index b080493..44981ac 100644
--- a/gazebo/physics/PhysicsEngine.cc
+++ b/gazebo/physics/PhysicsEngine.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,20 +18,21 @@
  * Author: Nate Koenig
  */
 
-#include "sdf/sdf.hh"
+#include <sdf/sdf.hh>
 
 #include "gazebo/msgs/msgs.hh"
 #include "gazebo/common/Exception.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Events.hh"
 
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Node.hh"
 
 #include "gazebo/math/Rand.hh"
 
 #include "gazebo/physics/ContactManager.hh"
 #include "gazebo/physics/Link.hh"
+#include "gazebo/physics/Model.hh"
 #include "gazebo/physics/World.hh"
 #include "gazebo/physics/PhysicsEngine.hh"
 
@@ -73,11 +74,11 @@ void PhysicsEngine::Load(sdf::ElementPtr _sdf)
   this->sdf->Copy(_sdf);
 
   this->realTimeUpdateRate =
-      this->sdf->GetElement("real_time_update_rate")->GetValueDouble();
+      this->sdf->GetElement("real_time_update_rate")->Get<double>();
   this->targetRealTimeFactor =
-      this->sdf->GetElement("real_time_factor")->GetValueDouble();
+      this->sdf->GetElement("real_time_factor")->Get<double>();
   this->maxStepSize =
-      this->sdf->GetElement("max_step_size")->GetValueDouble();
+      this->sdf->GetElement("max_step_size")->Get<double>();
 }
 
 //////////////////////////////////////////////////
@@ -104,7 +105,7 @@ PhysicsEngine::~PhysicsEngine()
 //////////////////////////////////////////////////
 math::Vector3 PhysicsEngine::GetGravity() const
 {
-  return this->sdf->GetValueVector3("gravity");
+  return this->sdf->Get<math::Vector3>("gravity");
 }
 
 //////////////////////////////////////////////////
@@ -124,18 +125,6 @@ CollisionPtr PhysicsEngine::CreateCollision(const std::string &_shapeType,
 }
 
 //////////////////////////////////////////////////
-void PhysicsEngine::SetUpdateRate(double _value)
-{
-  this->SetRealTimeUpdateRate(_value);
-}
-
-//////////////////////////////////////////////////
-double PhysicsEngine::GetUpdateRate()
-{
-  return this->GetRealTimeUpdateRate();
-}
-
-//////////////////////////////////////////////////
 double PhysicsEngine::GetUpdatePeriod()
 {
   double updateRate = this->GetRealTimeUpdateRate();
@@ -146,15 +135,10 @@ double PhysicsEngine::GetUpdatePeriod()
 }
 
 //////////////////////////////////////////////////
-void PhysicsEngine::SetStepTime(double _value)
-{
-  this->SetMaxStepSize(_value);
-}
-
-//////////////////////////////////////////////////
-double PhysicsEngine::GetStepTime()
+ModelPtr PhysicsEngine::CreateModel(BasePtr _base)
 {
-  return this->GetMaxStepSize();
+  ModelPtr ret(new Model(_base));
+  return ret;
 }
 
 //////////////////////////////////////////////////
@@ -232,7 +216,7 @@ void PhysicsEngine::SetContactMaxCorrectingVel(double /*_vel*/)
 }
 
 //////////////////////////////////////////////////
-void PhysicsEngine::SetMaxContacts(double /*_maxContacts*/)
+void PhysicsEngine::SetMaxContacts(unsigned int /*_maxContacts*/)
 {
 }
 
@@ -252,13 +236,14 @@ void PhysicsEngine::SetContactSurfaceLayer(double /*_layerDepth*/)
 }
 
 //////////////////////////////////////////////////
-void PhysicsEngine::SetParam(std::string /*_key*/,
+bool PhysicsEngine::SetParam(const std::string &/*_key*/,
     const boost::any &/*_value*/)
 {
+  return true;
 }
 
 //////////////////////////////////////////////////
-boost::any PhysicsEngine::GetParam(std::string /*_key*/) const
+boost::any PhysicsEngine::GetParam(const std::string &/*_key*/) const
 {
   return 0;
 }
diff --git a/gazebo/physics/PhysicsEngine.hh b/gazebo/physics/PhysicsEngine.hh
index 4223b6e..10e35f1 100644
--- a/gazebo/physics/PhysicsEngine.hh
+++ b/gazebo/physics/PhysicsEngine.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@
 #include "gazebo/msgs/msgs.hh"
 
 #include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -40,7 +41,7 @@ namespace gazebo
 
     /// \class PhysicsEngine PhysicsEngine.hh physics/physics.hh
     /// \brief Base class for a physics engine.
-    class PhysicsEngine
+    class GAZEBO_VISIBLE PhysicsEngine
     {
       /// \brief Default constructor.
       /// \param[in] _world Pointer to the world.
@@ -68,7 +69,7 @@ namespace gazebo
       /// \brief Update the physics engine collision.
       public: virtual void UpdateCollision() = 0;
 
-      /// \brief Return the type of the physics engine (ode|bullet).
+      /// \brief Return the physics engine type (ode|bullet|dart|simbody).
       /// \return Type of the physics engine.
       public: virtual std::string GetType() const = 0;
 
@@ -76,30 +77,10 @@ namespace gazebo
       /// \param[in] _seed The random number seed.
       public: virtual void SetSeed(uint32_t _seed) = 0;
 
-      /// \brief Set the simulation update rate.
-      /// This funciton is deprecated, use PhysicsEngine::SetRealTimeUpdateRate.
-      /// \param[in] _value Value of the update rate.
-      public: void SetUpdateRate(double _value) GAZEBO_DEPRECATED(1.5);
-
-      /// \brief Get the simulation update rate.
-      /// This funciton is deprecated, use PhysicsEngine::GetRealTimeUpdateRate.
-      /// \return Update rate.
-      public: double GetUpdateRate() GAZEBO_DEPRECATED(1.5);
-
       /// \brief Get the simulation update period.
       /// \return Simulation update period.
       public: double GetUpdatePeriod();
 
-      /// \brief Set the simulation step time.
-      /// This funciton is deprecated, use World::SetMaxStepSize.
-      /// \param[in] _value Value of the step time.
-      public: virtual void SetStepTime(double _value) GAZEBO_DEPRECATED(1.5);
-
-      /// \brief Get the simulation step time.
-      /// This funciton is deprecated, use World::GetMaxStepSize.
-      /// \return Simulation step time.
-      public: virtual double GetStepTime() GAZEBO_DEPRECATED(1.5);
-
       /// \brief Get target real time factor
       /// \return Target real time factor
       public: double GetTargetRealTimeFactor() const;
@@ -127,6 +108,10 @@ namespace gazebo
       /// \brief Update the physics engine.
       public: virtual void UpdatePhysics() {}
 
+      /// \brief Create a new model.
+      /// \param[in] _base Boost shared pointer to a new model.
+      public: virtual ModelPtr CreateModel(BasePtr _base);
+
       /// \brief Create a new body.
       /// \param[in] _parent Parent model for the link.
       public: virtual LinkPtr CreateLink(ModelPtr _parent) = 0;
@@ -153,7 +138,7 @@ namespace gazebo
       /// \param[in] _type Type of joint to create.
       /// \param[in] _parent Model parent.
       public: virtual JointPtr CreateJoint(const std::string &_type,
-                                           ModelPtr _parent) = 0;
+                                           ModelPtr _parent = ModelPtr()) = 0;
 
       /// \brief Return the gavity vector.
       /// \return The gavity vector.
@@ -186,19 +171,21 @@ namespace gazebo
       /// property map
       /// \brief Access functions to set ODE parameters.
       /// \param[in] _iter Number of iterations.
-      public: virtual void SetSORPGSPreconIters(unsigned int _iters);
+      public: virtual void SetSORPGSPreconIters(unsigned int _iters)
+              GAZEBO_DEPRECATED(3.0);
 
       /// \TODO: Remove this function, and replace it with a more generic
       /// property map
       /// \brief Access functions to set ODE parameters.
       /// \param[in] _iter Number of iterations.
-      public: virtual void SetSORPGSIters(unsigned int _iters);
+      public: virtual void SetSORPGSIters(unsigned int _iters)
+              GAZEBO_DEPRECATED(3.0);
 
       /// \TODO: Remove this function, and replace it with a more generic
       /// property map
       /// \brief Access functions to set ODE parameters.
       /// \param[in] _w SORPGSW value.
-      public: virtual void SetSORPGSW(double _w);
+      public: virtual void SetSORPGSW(double _w) GAZEBO_DEPRECATED(3.0);
 
       /// \TODO: Remove this function, and replace it with a more generic
       /// property map
@@ -216,7 +203,7 @@ namespace gazebo
       /// property map
       /// \brief access functions to set ODE parameters
       /// \param[in] _maxContacts Maximum number of contacts.
-      public: virtual void SetMaxContacts(double _maxContacts);
+      public: virtual void SetMaxContacts(unsigned int _maxContacts);
 
       /// \TODO: Remove this function, and replace it with a more generic
       /// property map
@@ -240,19 +227,22 @@ namespace gazebo
       /// property map
       /// \brief access functions to set ODE parameters.
       /// \return SORPGS precondition iterations.
-      public: virtual int GetSORPGSPreconIters() {return 0;}
+      public: virtual int GetSORPGSPreconIters() GAZEBO_DEPRECATED(3.0)
+              {return 0;}
 
       /// \TODO: Remove this function, and replace it with a more generic
       /// property map
       /// \brief access functions to set ODE parameters.
       /// \return SORPGS iterations.
-      public: virtual int GetSORPGSIters() {return 0;}
+      public: virtual int GetSORPGSIters() GAZEBO_DEPRECATED(3.0)
+              {return 0;}
 
       /// \TODO: Remove this function, and replace it with a more generic
       /// property map.
       /// \brief access functions to set ODE parameters
       /// \return SORPGSW value.
-      public: virtual double GetSORPGSW() {return 0;}
+      public: virtual double GetSORPGSW() GAZEBO_DEPRECATED(3.0)
+              {return 0;}
 
       /// \TODO: Remove this function, and replace it with a more generic
       /// property map.
@@ -270,18 +260,48 @@ namespace gazebo
       /// property map.
       /// \brief access functions to set ODE parameters.
       /// \return Maximum number of allows contacts.
-      public: virtual int GetMaxContacts() {return 0;}
+      public: virtual unsigned int GetMaxContacts() {return 0;}
 
-      /// \brief Set a parameter of the physics engine
+      /// \brief Set a parameter of the physics engine.
+      /// See SetParam documentation for descriptions of duplicate parameters.
       /// \param[in] _key String key
+      /// Below is a list of _key parameter definitions:
+      ///       -# "solver_type" (string) - returns solver used by engine, e.g.
+      ///          "sequential_impulse' for Bullet, "quick" for ODE
+      ///          "Featherstone and Lemkes" for DART and
+      ///          "Spatial Algebra and Elastic Foundation" for Simbody.
+      ///       -# "type" (string) - deprecated, use keyword "solver_type".
+      ///       -# "cfm" (double) - global CFM
+      ///       -# "erp" (double) - global ERP
+      ///       -# "precon_iters" (bool) - precondition iterations
+      ///          (experimental).
+      ///       -# "iters" (int) - number of LCP PGS iterations. If
+      ///          sor_lcp_tolerance is negative, full iteration count is
+      ///          executed.  Otherwise, PGS may stop iteration early if
+      ///          sor_lcp_tolerance is satisfied by the total RMS residual.
+      ///       -# "sor" (double) - relaxation parameter for Projected
+      ///          Gauss-Seidel (PGS) updates.
+      ///       -# "contact_max_correcting_vel" (double) - truncates correction
+      ///          impulses from ERP by this value.
+      ///       -# "contact_surface_layer" (double) - ERP is 0 for
+      ///          interpenetration depths below this value.
+      ///       -# "max_contacts" (int) - max number of contact constraints
+      ///          between any pair of collision bodies.
+      ///       -# "min_step_size" (double) - minimum internal step size.
+      ///          (defined but not used in ode).
+      ///       -# "max_step_size" (double) - maximum physics step size when
+      ///          physics update step must return.
+      ///
       /// \param[in] _value The value to set to
-      public: virtual void SetParam(std::string _key,
+      /// \return true if SetParam is successful, false if operation fails.
+      public: virtual bool SetParam(const std::string &_key,
                   const boost::any &_value);
 
       /// \brief Get an parameter of the physics engine
       /// \param[in] _attr String key
+      /// \sa SetParam
       /// \return The value of the parameter
-      public: virtual boost::any GetParam(std::string _key) const;
+      public: virtual boost::any GetParam(const std::string &_key) const;
 
       /// \brief Debug print out of the physic engine state.
       public: virtual void DebugPrint() const = 0;
diff --git a/gazebo/physics/PhysicsEngine_TEST.cc b/gazebo/physics/PhysicsEngine_TEST.cc
index ee4dd84..2701acc 100644
--- a/gazebo/physics/PhysicsEngine_TEST.cc
+++ b/gazebo/physics/PhysicsEngine_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,11 +16,13 @@
 */
 
 #include "test/ServerFixture.hh"
+#include "test/integration/helper_physics_generator.hh"
 #include "gazebo/msgs/msgs.hh"
 
 using namespace gazebo;
 
-class PhysicsEngineTest : public ServerFixture
+class PhysicsEngineTest : public ServerFixture,
+                          public testing::WithParamInterface<const char*>
 {
   public: void OnPhysicsMsgResponse(ConstResponsePtr &_msg);
   public: void PhysicsEngineParam(const std::string &_physicsEngine);
@@ -64,6 +66,8 @@ void PhysicsEngineTest::PhysicsEngineParam(const std::string &_physicsEngine)
     type = msgs::Physics::ODE;
   else if (_physicsEngine == "bullet")
     type = msgs::Physics::BULLET;
+  else if (_physicsEngine == "dart")
+    type = msgs::Physics::DART;
   else
     type = msgs::Physics::ODE;
   physicsPubMsg.set_type(type);
@@ -92,17 +96,14 @@ void PhysicsEngineTest::PhysicsEngineParam(const std::string &_physicsEngine)
   physicsNode->Fini();
 }
 
-TEST_F(PhysicsEngineTest, PhysicsEngineParamODE)
+/////////////////////////////////////////////////
+TEST_P(PhysicsEngineTest, PhysicsEngineParam)
 {
-  PhysicsEngineParam("ode");
+  PhysicsEngineParam(GetParam());
 }
 
-#ifdef HAVE_BULLET
-TEST_F(PhysicsEngineTest, PhysicsEngineParamBullet)
-{
-  PhysicsEngineParam("bullet");
-}
-#endif  // HAVE_BULLET
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, PhysicsEngineTest,
+                        PHYSICS_ENGINE_VALUES);
 
 int main(int argc, char **argv)
 {
diff --git a/gazebo/physics/PhysicsFactory.cc b/gazebo/physics/PhysicsFactory.cc
index 392a001..e060d8b 100644
--- a/gazebo/physics/PhysicsFactory.cc
+++ b/gazebo/physics/PhysicsFactory.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,16 +20,28 @@
  * Date: 21 May 2009
  */
 
-#include "physics/World.hh"
-#include "physics/PhysicsEngine.hh"
-#include "physics/PhysicsFactory.hh"
-#include "common/Console.hh"
-#include "gazebo_config.h"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/PhysicsFactory.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/util/system.hh"
+#include "gazebo/gazebo_config.h"
 
+GAZEBO_VISIBLE
 void RegisterODEPhysics();
 
+#ifdef HAVE_SIMBODY
+GAZEBO_VISIBLE
+void RegisterSimbodyPhysics();
+#endif
+
 #ifdef HAVE_BULLET
-  void RegisterBulletPhysics();
+GAZEBO_VISIBLE
+void RegisterBulletPhysics();
+#endif
+
+#ifdef HAVE_DART
+  void RegisterDARTPhysics();
 #endif
 
 using namespace gazebo;
@@ -43,9 +55,17 @@ void PhysicsFactory::RegisterAll()
 {
   RegisterODEPhysics();
 
+#ifdef HAVE_SIMBODY
+  RegisterSimbodyPhysics();
+#endif
+
 #ifdef HAVE_BULLET
   RegisterBulletPhysics();
 #endif
+
+#ifdef HAVE_DART
+  RegisterDARTPhysics();
+#endif
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/physics/PhysicsFactory.hh b/gazebo/physics/PhysicsFactory.hh
index 821e96b..53bae00 100644
--- a/gazebo/physics/PhysicsFactory.hh
+++ b/gazebo/physics/PhysicsFactory.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,7 +26,8 @@
 #include <string>
 #include <map>
 
-#include "physics/PhysicsTypes.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -41,7 +42,7 @@ namespace gazebo
 
     /// \class PhysicsFactory PhysicsFactory.hh physics/physics.hh
     /// \brief The physics factory instantiates different physics engines.
-    class PhysicsFactory
+    class GAZEBO_VISIBLE PhysicsFactory
     {
       /// \brief Register everything.
       public: static void RegisterAll();
@@ -74,10 +75,11 @@ namespace gazebo
     /// \param[in] name Physics type name, as it appears in the world file.
     /// \param[in] classname C++ class name for the physics engine.
     #define GZ_REGISTER_PHYSICS_ENGINE(name, classname) \
-    PhysicsEnginePtr New##classname(WorldPtr _world) \
+    GAZEBO_VISIBLE PhysicsEnginePtr New##classname(WorldPtr _world) \
     { \
       return PhysicsEnginePtr(new gazebo::physics::classname(_world)); \
     } \
+    GAZEBO_VISIBLE \
     void Register##classname() \
     {\
       PhysicsFactory::RegisterPhysicsEngine(name, New##classname);\
diff --git a/gazebo/physics/PhysicsIface.cc b/gazebo/physics/PhysicsIface.cc
new file mode 100644
index 0000000..452c434
--- /dev/null
+++ b/gazebo/physics/PhysicsIface.cc
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/thread/mutex.hpp>
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/PhysicsFactory.hh"
+#include "gazebo/physics/PhysicsIface.hh"
+#include "gazebo/gazebo_config.h"
+
+using namespace gazebo;
+
+std::vector<physics::WorldPtr> g_worlds;
+
+boost::mutex g_uniqueIdMutex;
+uint32_t g_uniqueId = 0;
+
+/////////////////////////////////////////////////
+bool physics::load()
+{
+  physics::PhysicsFactory::RegisterAll();
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool physics::fini()
+{
+  remove_worlds();
+  return true;
+}
+
+/////////////////////////////////////////////////
+physics::WorldPtr physics::create_world(const std::string &_name)
+{
+  physics::WorldPtr world(new physics::World(_name));
+  g_worlds.push_back(world);
+  return world;
+}
+
+/////////////////////////////////////////////////
+physics::WorldPtr physics::get_world(const std::string &_name)
+{
+  if (_name.empty())
+  {
+    if (g_worlds.empty())
+      gzerr << "no worlds\n";
+    else
+      return *(g_worlds.begin());
+  }
+  else
+  {
+    for (std::vector<WorldPtr>::iterator iter = g_worlds.begin();
+        iter != g_worlds.end(); ++iter)
+    {
+      if ((*iter)->GetName() == _name)
+        return (*iter);
+    }
+  }
+
+  gzerr << "Unable to find world by name in physics::get_world["
+    << _name.c_str() << "]\n";
+  gzthrow("Unable to find world by name in physics::get_world(world_name)");
+}
+
+/////////////////////////////////////////////////
+void physics::load_worlds(sdf::ElementPtr _sdf)
+{
+  std::vector<WorldPtr>::iterator iter;
+  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
+    (*iter)->Load(_sdf);
+}
+
+/////////////////////////////////////////////////
+void physics::init_worlds()
+{
+  std::vector<WorldPtr>::iterator iter;
+  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
+    (*iter)->Init();
+}
+
+/////////////////////////////////////////////////
+void physics::run_worlds(unsigned int _steps)
+{
+  std::vector<WorldPtr>::iterator iter;
+  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
+    (*iter)->Run(_steps);
+}
+
+/////////////////////////////////////////////////
+void physics::pause_worlds(bool _pause)
+{
+  std::vector<WorldPtr>::iterator iter;
+  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
+    (*iter)->SetPaused(_pause);
+}
+
+/////////////////////////////////////////////////
+void physics::stop_worlds()
+{
+  std::vector<WorldPtr>::iterator iter;
+  for (iter = g_worlds.begin(); iter != g_worlds.end(); ++iter)
+    (*iter)->Stop();
+}
+
+/////////////////////////////////////////////////
+void physics::load_world(WorldPtr _world, sdf::ElementPtr _sdf)
+{
+  _world->Load(_sdf);
+}
+
+/////////////////////////////////////////////////
+void physics::init_world(WorldPtr _world)
+{
+  _world->Init();
+}
+
+/////////////////////////////////////////////////
+void physics::run_world(WorldPtr _world, unsigned int _iterations)
+{
+  _world->Run(_iterations);
+}
+
+/////////////////////////////////////////////////
+void physics::pause_world(WorldPtr _world, bool _pause)
+{
+  _world->SetPaused(_pause);
+}
+
+/////////////////////////////////////////////////
+void physics::stop_world(WorldPtr _world)
+{
+  _world->Stop();
+}
+
+/////////////////////////////////////////////////
+void physics::remove_worlds()
+{
+  for (std::vector<WorldPtr>::iterator iter = g_worlds.begin();
+      iter != g_worlds.end(); ++iter)
+  {
+    (*iter)->Fini();
+    (*iter).reset();
+  }
+
+  g_worlds.clear();
+}
+
+/////////////////////////////////////////////////
+bool physics::worlds_running()
+{
+  for (std::vector<WorldPtr>::const_iterator iter = g_worlds.begin();
+      iter != g_worlds.end(); ++iter)
+  {
+    if ((*iter)->GetRunning())
+      return true;
+  }
+
+  return false;
+}
+
+/////////////////////////////////////////////////
+uint32_t physics::getUniqueId()
+{
+  boost::mutex::scoped_lock lock(g_uniqueIdMutex);
+  return ++g_uniqueId;
+}
diff --git a/gazebo/physics/PhysicsIface.hh b/gazebo/physics/PhysicsIface.hh
new file mode 100644
index 0000000..6616faa
--- /dev/null
+++ b/gazebo/physics/PhysicsIface.hh
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _PHYSICSIFACE_HH_
+#define _PHYSICSIFACE_HH_
+
+#include <string>
+#include <sdf/sdf.hh>
+
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  /// \ingroup gazebo_physics
+  /// \brief physics namespace
+  namespace physics
+  {
+    /// \addtogroup gazebo_physics
+    /// \{
+
+    /// \brief Setup gazebo::SystemPlugin's and call gazebo::transport::init.
+    GAZEBO_VISIBLE
+    bool load();
+
+    /// \brief Finalize transport by calling gazebo::transport::fini.
+    GAZEBO_VISIBLE
+    bool fini();
+
+    /// \brief Create a world given a name.
+    /// \param[in] _name Name of the world to create.
+    /// \return Pointer to the new world.
+    GAZEBO_VISIBLE
+    WorldPtr create_world(const std::string &_name ="");
+
+    /// \brief Returns a pointer to a world by name.
+    /// \param[in] _name Name of the world to get.
+    /// \return Pointer to the world.
+    GAZEBO_VISIBLE
+    WorldPtr get_world(const std::string &_name = "");
+
+    /// \brief Load world from sdf::Element pointer.
+    /// \param[in] _world Pointer to a world.
+    /// \param[in] _sdf SDF values to load from.
+    GAZEBO_VISIBLE
+    void load_world(WorldPtr _world, sdf::ElementPtr _sdf);
+
+    /// \brief Init world given a pointer to it.
+    /// \param[in] _world World to initialize.
+    GAZEBO_VISIBLE
+    void init_world(WorldPtr _world);
+
+    /// \brief Run world by calling World::Run() given a pointer to it.
+    /// \param[in] _world World to run.
+    /// \param[in] _iterations Number of iterations for each world to take.
+    /// Zero indicates that each world should continue forever.
+    GAZEBO_VISIBLE
+    void run_world(WorldPtr _world, unsigned int _iterations = 0);
+
+    /// \brief Stop world by calling World::Stop() given a pointer to it.
+    /// \param[in] _world World to stop.
+    GAZEBO_VISIBLE
+    void stop_world(WorldPtr _world);
+
+    /// \brief Pause world by calling World::SetPaused.
+    /// \param[in] _world World to pause or unpause.
+    /// \param[in] _pause True to pause, False to unpause.
+    GAZEBO_VISIBLE
+    void pause_world(WorldPtr _world, bool _pause);
+
+    /// \brief load multiple worlds from single sdf::Element pointer
+    /// \param[in] _sdf SDF values used to create worlds.
+    GAZEBO_VISIBLE
+    void load_worlds(sdf::ElementPtr _sdf);
+
+    /// \brief initialize multiple worlds stored in static variable
+    /// gazebo::g_worlds
+    GAZEBO_VISIBLE
+    void init_worlds();
+
+    /// \brief Run multiple worlds stored in static variable
+    /// gazebo::g_worlds
+    /// \param[in] _iterations Number of iterations for each world to take.
+    /// Zero indicates that each world should continue forever.
+    GAZEBO_VISIBLE
+    void run_worlds(unsigned int _iterations = 0);
+
+    /// \brief stop multiple worlds stored in static variable
+    /// gazebo::g_worlds
+    GAZEBO_VISIBLE
+    void stop_worlds();
+
+    /// \brief pause multiple worlds stored in static variable
+    /// gazebo::g_worlds
+    /// \param[in] _pause True to pause, False to unpause.
+    GAZEBO_VISIBLE
+    void pause_worlds(bool pause);
+
+    /// \brief remove multiple worlds stored in static variable
+    /// gazebo::g_worlds
+    GAZEBO_VISIBLE
+    void remove_worlds();
+
+    /// \brief Return true if any world is running.
+    /// \return True if any world is running.
+    GAZEBO_VISIBLE
+    bool worlds_running();
+
+    /// \brief Get a unique ID
+    /// \return A unique integer
+    GAZEBO_VISIBLE
+    uint32_t getUniqueId();
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/PhysicsTypes.hh b/gazebo/physics/PhysicsTypes.hh
index dd3875f..53ee406 100644
--- a/gazebo/physics/PhysicsTypes.hh
+++ b/gazebo/physics/PhysicsTypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,10 @@
 #define _PHYSICSTYPES_HH_
 
 #include <vector>
+#include <map>
+#include <string>
 #include <boost/shared_ptr.hpp>
+#include "gazebo/util/system.hh"
 
 /// \file
 /// \ingroup gazebo_physics
@@ -35,6 +38,7 @@ namespace gazebo
     class Actor;
     class Link;
     class Collision;
+    class Gripper;
     class Joint;
     class JointController;
     class Contact;
@@ -48,9 +52,13 @@ namespace gazebo
     class SurfaceParams;
     class BoxShape;
     class CylinderShape;
+    class MeshShape;
     class SphereShape;
     class MeshShape;
     class HeightmapShape;
+    class ModelState;
+    class LinkState;
+    class JointState;
 
     /// \def BasePtr
     /// \brief Boost shared pointer to a Base object
@@ -140,6 +148,10 @@ namespace gazebo
     /// \brief Boost shared pointer to a MeshShape object
     typedef boost::shared_ptr<MeshShape> MeshShapePtr;
 
+    /// \def GripperPtr
+    /// \brief Boost shared pointer to a Gripper object
+    typedef boost::shared_ptr<Gripper> GripperPtr;
+
     /// \def Base_V
     /// \brief Vector of BasePtr
     typedef std::vector<BasePtr> Base_V;
@@ -168,6 +180,18 @@ namespace gazebo
     /// \brief Vector of CollisionPtr
     typedef std::vector<CollisionPtr>  Collision_V;
 
+    /// \def ModelState_M
+    /// \brief Map of model state
+    typedef std::map<std::string, ModelState> ModelState_M;
+
+    /// \def LinkState_M
+    /// \brief Map of link state
+    typedef std::map<std::string, LinkState> LinkState_M;
+
+    /// \def JointState_M
+    /// \brief Map of joint state
+    typedef std::map<std::string, JointState> JointState_M;
+
     #ifndef GZ_COLLIDE_BITS
 
     /// \def GZ_ALL_COLLIDE
diff --git a/gazebo/physics/PlaneShape.cc b/gazebo/physics/PlaneShape.cc
index 3a5d770..38f6cd4 100644
--- a/gazebo/physics/PlaneShape.cc
+++ b/gazebo/physics/PlaneShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,8 +15,8 @@
  *
 */
 
-#include "physics/Collision.hh"
-#include "physics/PlaneShape.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/PlaneShape.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -61,7 +61,7 @@ void PlaneShape::SetNormal(const math::Vector3 &_norm)
 //////////////////////////////////////////////////
 math::Vector3 PlaneShape::GetNormal() const
 {
-  return this->sdf->GetValueVector3("normal");
+  return this->sdf->Get<math::Vector3>("normal");
 }
 
 //////////////////////////////////////////////////
@@ -73,7 +73,19 @@ void PlaneShape::SetSize(const math::Vector2d &_size)
 //////////////////////////////////////////////////
 math::Vector2d PlaneShape::GetSize() const
 {
-  return this->sdf->GetValueVector2d("size");
+  return this->sdf->Get<math::Vector2d>("size");
+}
+
+//////////////////////////////////////////////////
+void PlaneShape::SetScale(const math::Vector3 &_scale)
+{
+  if (this->scale == _scale)
+    return;
+
+  this->scale = _scale;
+
+  math::Vector2d size = this->GetSize() * math::Vector2d(_scale.x, scale.y);
+  this->SetSize(size);
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/physics/PlaneShape.hh b/gazebo/physics/PlaneShape.hh
index c709a2b..206e1a6 100644
--- a/gazebo/physics/PlaneShape.hh
+++ b/gazebo/physics/PlaneShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
 
 #include "gazebo/common/CommonTypes.hh"
 #include "gazebo/physics/Shape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +38,7 @@ namespace gazebo
     ///
     /// This collision is used primarily for ground planes.  Note that while
     /// the plane in infinite, only the part near the camera is drawn.
-    class PlaneShape : public Shape
+    class GAZEBO_VISIBLE PlaneShape : public Shape
     {
       /// \brief Constructor.
       /// \param[in] _parent Link to which we are attached.
@@ -72,6 +73,10 @@ namespace gazebo
       /// \return Size of the plane.
       public: math::Vector2d GetSize() const;
 
+      /// \brief Set the scale of the plane.
+      /// \return _scale Scale to set the plane to.
+      public: virtual void SetScale(const math::Vector3 &_scale);
+
       /// \brief Fill a geometry message with data from this object.
       /// \param[out] _msg Message to fill.
       public: void FillMsg(msgs::Geometry &_msg);
diff --git a/gazebo/physics/RayShape.cc b/gazebo/physics/RayShape.cc
index 2b40ab8..0f31bab 100644
--- a/gazebo/physics/RayShape.cc
+++ b/gazebo/physics/RayShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/shared_ptr.hpp>
 
-#include "sdf/sdf.hh"
+#include <sdf/sdf.hh>
 
 #include "gazebo/transport/TransportTypes.hh"
 
@@ -41,6 +41,7 @@
 using namespace gazebo;
 using namespace physics;
 
+//////////////////////////////////////////////////
 RayShape::RayShape(PhysicsEnginePtr /*_physicsEngine*/)
   : Shape(CollisionPtr())
 {
@@ -127,6 +128,17 @@ void RayShape::SetLength(double _len)
 }
 
 //////////////////////////////////////////////////
+void RayShape::SetScale(const math::Vector3 &_scale)
+{
+  if (this->scale == _scale)
+    return;
+
+  this->scale = _scale;
+
+  /// TODO RayShape::SetScale not yet implemented.
+}
+
+//////////////////////////////////////////////////
 double RayShape::GetLength() const
 {
   return this->contactLen;
diff --git a/gazebo/physics/RayShape.hh b/gazebo/physics/RayShape.hh
index a9d1406..6b2d265 100644
--- a/gazebo/physics/RayShape.hh
+++ b/gazebo/physics/RayShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
 
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/physics/Shape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,7 +37,7 @@ namespace gazebo
 
     /// \class RayShape RayShape.hh physics/physics.hh
     /// \brief Base class for Ray collision geometry
-    class RayShape : public Shape
+    class GAZEBO_VISIBLE RayShape : public Shape
     {
       /// \brief Constructor for a global ray.
       /// \param[in] _physicsEngine Pointer to the physics engine.
@@ -77,6 +78,9 @@ namespace gazebo
       /// \return The ray length.
       public: double GetLength() const;
 
+      /// \brief Set the scale of the ray
+      public: virtual void SetScale(const math::Vector3 &_scale);
+
       /// \brief Update the ray collision.
       public: virtual void Update() = 0;
 
diff --git a/gazebo/physics/Road.cc b/gazebo/physics/Road.cc
index 01c29b1..a7f3df3 100644
--- a/gazebo/physics/Road.cc
+++ b/gazebo/physics/Road.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -36,24 +36,28 @@ Road::~Road()
 /////////////////////////////////////////////////
 void Road::Load(sdf::ElementPtr _elem)
 {
+  Base::Load(_elem);
+  this->SetName(_elem->Get<std::string>("name"));
+}
+
+/////////////////////////////////////////////////
+void Road::Init()
+{
   this->node = transport::NodePtr(new transport::Node());
-  this->node->Init("default");
+  this->node->Init();
 
   this->roadPub = this->node->Advertise<msgs::Road>("~/roads", 10);
 
   msgs::Road msg;
-  Base::Load(_elem);
-
-  this->SetName(_elem->GetValueString("name"));
   msg.set_name(this->GetName());
 
-  this->width = _elem->GetValueDouble("width");
+  this->width = this->sdf->Get<double>("width");
   msg.set_width(this->width);
 
-  sdf::ElementPtr pointElem = _elem->GetElement("point");
+  sdf::ElementPtr pointElem = this->sdf->GetElement("point");
   while (pointElem)
   {
-    math::Vector3 point = pointElem->GetValueVector3();
+    math::Vector3 point = pointElem->Get<math::Vector3>();
     pointElem = pointElem->GetNextElement("point");
 
     msgs::Vector3d *ptMsg = msg.add_point();
@@ -62,8 +66,3 @@ void Road::Load(sdf::ElementPtr _elem)
 
   this->roadPub->Publish(msg);
 }
-
-/////////////////////////////////////////////////
-void Road::Init()
-{
-}
diff --git a/gazebo/physics/Road.hh b/gazebo/physics/Road.hh
index 4efcf5b..c239b15 100644
--- a/gazebo/physics/Road.hh
+++ b/gazebo/physics/Road.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 
 #include "gazebo/transport/TransportTypes.hh"
 #include "gazebo/physics/Base.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,7 +33,7 @@ namespace gazebo
 
     /// \class Road Road.hh physics/physics.hh
     /// \brief for building a Road from SDF
-    class Road : public Base
+    class GAZEBO_VISIBLE Road : public Base
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent of this road object.
diff --git a/gazebo/physics/ScrewJoint.hh b/gazebo/physics/ScrewJoint.hh
index f8d6688..c33d487 100644
--- a/gazebo/physics/ScrewJoint.hh
+++ b/gazebo/physics/ScrewJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
 
 #include "gazebo/physics/Joint.hh"
 #include "gazebo/common/Console.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
     /// \class ScrewJoint ScrewJoint.hh physics/physics.hh
     /// \brief A screw joint, which has both  prismatic and rotational DOFs
     template<class T>
-    class ScrewJoint : public T
+    class GAZEBO_VISIBLE ScrewJoint : public T
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent of the joint.
@@ -46,7 +47,7 @@ namespace gazebo
       public: virtual ~ScrewJoint()
               { }
 
-      /// \interal
+      // Documentation inherited.
       public: virtual unsigned int GetAngleCount() const
               {return 2;}
 
@@ -56,77 +57,58 @@ namespace gazebo
                  {
                    T::Load(_sdf);
 
-                   if (_sdf->HasElement("thread_pitch"))
-                   {
-                     this->threadPitch =
-                       _sdf->GetElement("thread_pitch")->GetValueDouble();
-                   }
-                   else
-                   {
-                     gzerr << "should not see this\n";
-                     this->threadPitch = 1.0;
-                   }
-
-                   if (_sdf->HasElement("axis"))
-                   {
-                     sdf::ElementPtr axisElem = _sdf->GetElement("axis");
-                     this->SetAxis(0, axisElem->GetValueVector3("xyz"));
-                     if (axisElem->HasElement("limit"))
-                     {
-                       sdf::ElementPtr limitElem =
-                         _sdf->GetElement("axis")->GetElement("limit");
-
-                       // Perform this three step ordering to ensure the
-                       // parameters are set properly. This is taken from
-                       // the ODE wiki.
-                       this->SetHighStop(0, limitElem->GetValueDouble("upper"));
-                       this->SetLowStop(0, limitElem->GetValueDouble("lower"));
-                       this->SetHighStop(0, limitElem->GetValueDouble("upper"));
-                     }
-                   }
+                   this->threadPitch =
+                     _sdf->GetElement("thread_pitch")->Get<double>();
                  }
 
-      /// \brief Set the anchor.
-      /// \param[in] _index Index of the axis. Not Used.
-      /// \param[in] _anchor Anchor value for the joint.
-      public: virtual void SetAnchor(int _index,
-                                     const math::Vector3 &_anchor);
-
-      /// \brief Get the anchor.
-      /// \param[in] _index Index of the axis. Not Used.
-      /// \return Anchor for the joint.
-      public: virtual math::Vector3 GetAnchor(int _index) const;
-
       /// \brief Set screw joint thread pitch.
-      ///
+      /// Thread Pitch is defined as angular motion per linear
+      /// motion or rad / m in metric.
       /// This must be implemented in a child class
+      /// Deprecated, please use the index-less version in the future:
+      /// virtual void SetThreadPitch(double _threadPitch) = 0;
       /// \param[in] _index Index of the axis.
       /// \param[in] _threadPitch Thread pitch value.
-      public: virtual void SetThreadPitch(int _index, double _threadPitch) = 0;
+      public: virtual void SetThreadPitch(unsigned int _index,
+                  double _threadPitch) GAZEBO_DEPRECATED(3.0) = 0;
+
+      /// \brief Set screw joint thread pitch.
+      /// Thread Pitch is defined as angular motion per linear
+      /// motion or rad / m in metric.
+      /// This must be implemented in a child class
+      /// To clarify direction, these are modeling right handed threads
+      /// with positive thread_pitch, i.e. the child Link is the nut
+      /// (interior threads) while the parent Link is the bolt/screw
+      /// (exterior threads).
+      /// \param[in] _threadPitch Thread pitch value.
+      public: virtual void SetThreadPitch(double _threadPitch) = 0;
 
       /// \brief Get screw joint thread pitch.
-      ///
+      /// Thread Pitch is defined as angular motion per linear
+      /// motion or rad / m in metric.
       /// This must be implemented in a child class
       /// \param[in] _index Index of the axis.
       /// \return _threadPitch Thread pitch value.
-      public: virtual double GetThreadPitch(unsigned int _index) = 0;
+      public: virtual double GetThreadPitch(unsigned int _index)
+        GAZEBO_DEPRECATED(3.0) = 0;
 
-      /// \brief The anchor value is not used internally.
-      protected: math::Vector3 fakeAnchor;
+      /// \brief Get screw joint thread pitch.
+      /// Thread Pitch is defined as angular motion per linear
+      /// motion or rad / m in metric.
+      /// This must be implemented in a child class
+      /// \return _threadPitch Thread pitch value.
+      public: virtual double GetThreadPitch() = 0;
 
       /// \brief Pitch of the thread.
       protected: double threadPitch;
+
+      /// \brief Initialize joint
+      protected: virtual void Init()
+                 {
+                   T::Init();
+                 }
     };
     /// \}
-
-    template<class T>
-    void ScrewJoint<T>::SetAnchor(int /*_index*/,
-                                  const math::Vector3 &_anchor)
-    {this->fakeAnchor = _anchor;}
-
-    template<class T>
-    math::Vector3 ScrewJoint<T>::GetAnchor(int /*_index*/) const
-    {return this->fakeAnchor;}
   }
 }
 #endif
diff --git a/gazebo/physics/Shape.cc b/gazebo/physics/Shape.cc
index a3aac62..498f9fb 100644
--- a/gazebo/physics/Shape.cc
+++ b/gazebo/physics/Shape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,8 @@
  * limitations under the License.
  *
 */
-#include "physics/Collision.hh"
-#include "physics/Shape.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/Shape.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -29,6 +29,8 @@ Shape::Shape(CollisionPtr _p)
 
   if (_p)
     this->collisionParent = _p;
+
+  this->scale = math::Vector3::One;
 }
 
 //////////////////////////////////////////////////
@@ -37,3 +39,9 @@ Shape::~Shape()
   if (this->collisionParent)
     this->collisionParent->SetShape(ShapePtr());
 }
+
+//////////////////////////////////////////////////
+math::Vector3 Shape::GetScale() const
+{
+  return this->scale;
+}
diff --git a/gazebo/physics/Shape.hh b/gazebo/physics/Shape.hh
index f68066d..6f4e6f9 100644
--- a/gazebo/physics/Shape.hh
+++ b/gazebo/physics/Shape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/physics/Inertial.hh"
 #include "gazebo/physics/Base.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,7 +37,7 @@ namespace gazebo
 
     /// \class Shape Shape.hh physics/physics.hh
     /// \brief Base class for all shapes.
-    class Shape : public Base
+    class GAZEBO_VISIBLE Shape : public Base
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent of the shape.
@@ -48,6 +49,14 @@ namespace gazebo
       /// \brief Initialize the shape.
       public: virtual void Init() = 0;
 
+      /// \brief Set the scale of the shape.
+      /// \param[in] _scale Scale to set the shape to.
+      public: virtual void SetScale(const math::Vector3 &_scale) = 0;
+
+      /// \brief Get the scale of the shape.
+      /// \return Scale of the shape.
+      public: virtual math::Vector3 GetScale() const;
+
       /// \brief Fill in the values for a geometry message.
       /// \param[out] _msg The geometry message to fill.
       public: virtual void FillMsg(msgs::Geometry &_msg) = 0;
@@ -58,6 +67,9 @@ namespace gazebo
 
       /// \brief This shape's collision parent.
       protected: CollisionPtr collisionParent;
+
+      /// \brief This shape's scale;
+      protected: math::Vector3 scale;
     };
     /// \}
   }
diff --git a/gazebo/physics/SliderJoint.hh b/gazebo/physics/SliderJoint.hh
index cb2edd4..610eaf7 100644
--- a/gazebo/physics/SliderJoint.hh
+++ b/gazebo/physics/SliderJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #define _SLIDERJOINT_HH_
 
 #include "gazebo/physics/Joint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,7 @@ namespace gazebo
     /// \class SliderJoint SliderJoint.hh physics/physics.hh
     /// \brief A slider joint
     template<class T>
-    class SliderJoint : public T
+    class GAZEBO_VISIBLE SliderJoint : public T
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent of the joint.
@@ -50,32 +51,11 @@ namespace gazebo
       public: virtual void Load(sdf::ElementPtr _sdf)
               {T::Load(_sdf);}
 
-      /// \interal
+      // Documentation inherited.
       public: virtual unsigned int GetAngleCount() const
               {return 1;}
-
-      /// \brief Set the anchor.
-      /// \param[in] _index Index of the axis. Not used.
-      /// \param[in] _anchor Anchor for the axis.
-      public: virtual void SetAnchor(int _index, const math::Vector3 &_anchor);
-
-      /// \brief Get the anchor.
-      /// \param[in] _index Index of the axis. Not used.
-      /// \return Anchor for the joint.
-      public: virtual math::Vector3 GetAnchor(int _index) const;
-
-      /// \brief The anchor value is not used internally.
-      protected: math::Vector3 fakeAnchor;
     };
     /// \}
-
-    template<class T>
-    void SliderJoint<T>::SetAnchor(int /*_index*/, const math::Vector3 &_anchor)
-    {this->fakeAnchor = _anchor;}
-
-    template<class T>
-    math::Vector3 SliderJoint<T>::GetAnchor(int /*_index*/) const
-    {return this->fakeAnchor;}
   }
 }
 #endif
diff --git a/gazebo/physics/SphereShape.cc b/gazebo/physics/SphereShape.cc
index 51963d5..43cf96a 100644
--- a/gazebo/physics/SphereShape.cc
+++ b/gazebo/physics/SphereShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
  * Author: Nate Koenig
  * Date: 14 Oct 2009
  */
-#include "physics/SphereShape.hh"
+#include "gazebo/physics/SphereShape.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -38,7 +38,7 @@ SphereShape::~SphereShape()
 //////////////////////////////////////////////////
 void SphereShape::Init()
 {
-  this->SetRadius(this->sdf->GetValueDouble("radius"));
+  this->SetRadius(this->sdf->Get<double>("radius"));
 }
 
 //////////////////////////////////////////////////
@@ -50,7 +50,25 @@ void SphereShape::SetRadius(double _radius)
 //////////////////////////////////////////////////
 double SphereShape::GetRadius() const
 {
-  return this->sdf->GetValueDouble("radius");
+  return this->sdf->Get<double>("radius");
+}
+
+//////////////////////////////////////////////////
+void SphereShape::SetScale(const math::Vector3 &_scale)
+{
+  if (_scale.x < 0 || _scale.y < 0 || _scale.z < 0)
+    return;
+
+  if (_scale == this->scale)
+    return;
+
+  double newRadius = std::max(_scale.z, std::max(_scale.x, _scale.y));
+  double oldRadius = std::max(this->scale.z,
+      std::max(this->scale.x, this->scale.y));
+
+  this->SetRadius((newRadius/oldRadius)*this->GetRadius());
+
+  this->scale = _scale;
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/physics/SphereShape.hh b/gazebo/physics/SphereShape.hh
index 85f28f1..94fadff 100644
--- a/gazebo/physics/SphereShape.hh
+++ b/gazebo/physics/SphereShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
 
 #include "gazebo/physics/Shape.hh"
 #include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,7 @@ namespace gazebo
 
     /// \class SphereShape SphereShape.hh physics/physics.hh
     /// \brief Sphere collision shape.
-    class SphereShape : public Shape
+    class GAZEBO_VISIBLE SphereShape : public Shape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent collision object.
@@ -54,6 +55,10 @@ namespace gazebo
       /// \return Radius of the sphere.
       public: double GetRadius() const;
 
+      /// \brief Set the scale of the sphere.
+      /// \param[in] _scale Scale to set the sphere to.
+      public: virtual void SetScale(const math::Vector3 &_scale);
+
       /// \brief Fill in the values for a geomertry message.
       /// \param[out] _msg The geometry message to fill.
       public: virtual void FillMsg(msgs::Geometry &_msg);
diff --git a/gazebo/physics/SphereShape_TEST.cc b/gazebo/physics/SphereShape_TEST.cc
new file mode 100644
index 0000000..9f27a62
--- /dev/null
+++ b/gazebo/physics/SphereShape_TEST.cc
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "test/util.hh"
+#include "gazebo/physics/SphereShape.hh"
+
+using namespace gazebo;
+
+class SphereShapeTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(SphereShapeTest, Scale)
+{
+  std::ostringstream sphereStr;
+  sphereStr << "<sdf version ='" << SDF_VERSION << "'>"
+    << "<model name='model'>"
+    << "<link name ='link'>"
+    <<   "<collision name ='collision'>"
+    <<     "<geometry>"
+    <<       "<sphere>"
+    <<         "<radius>0.5</radius>"
+    <<       "</sphere>"
+    <<     "</geometry>"
+    <<   "</collision>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  sdf::SDFPtr sphereSDF(new sdf::SDF);
+  sphereSDF->SetFromString(sphereStr.str());
+
+  physics::SphereShapePtr sphere(
+      new physics::SphereShape(physics::CollisionPtr()));
+  sdf::ElementPtr elem = sphereSDF->root;
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("model");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("link");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("collision");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("geometry");
+  ASSERT_TRUE(elem);
+  elem = elem->GetElement("sphere");
+  ASSERT_TRUE(elem);
+  sphere->Load(elem);
+
+  // Test scaling with unit size
+  double radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 0.5);
+
+  sphere->SetScale(math::Vector3(1.5, 1.5, 1.5));
+  radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 0.75);
+
+  sphere->SetScale(math::Vector3(2.0, 2.0, 2.0));
+  radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 1.0);
+
+  // reset scale
+  sphere->SetScale(math::Vector3(1.0, 1.0, 1.0));
+  radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 0.5);
+
+  // Test scaling with non-unit size
+  sphere->SetRadius(2.5);
+  radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 2.5);
+
+  sphere->SetScale(math::Vector3(2.0, 2.0, 2.0));
+  radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 5.0);
+
+  sphere->SetScale(math::Vector3(100.0, 100.0, 100.0));
+  radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 250.0);
+
+  sphere->SetScale(math::Vector3(0.1, 0.1, 0.1));
+  radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 0.25);
+
+  // reset scale
+  sphere->SetScale(math::Vector3(1.0, 1.0, 1.0));
+  sphere->SetRadius(0.5);
+  radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 0.5);
+
+  // Test scaling with different x, y and z components
+  sphere->SetScale(math::Vector3(0.5, 1.0, 2.5));
+  radius = sphere->GetRadius();
+  // radius should be multiplied by max of (0.5, 1.0, 2.5)
+  EXPECT_DOUBLE_EQ(radius, 1.25);
+
+  // Test scaling with negative components
+  // This should fail and radius should remain the same as before
+  sphere->SetScale(math::Vector3(-1.0, -2.0, -3.0));
+  radius = sphere->GetRadius();
+  EXPECT_DOUBLE_EQ(radius, 1.25);
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/physics/State.cc b/gazebo/physics/State.cc
index 443ff5f..67b1938 100644
--- a/gazebo/physics/State.cc
+++ b/gazebo/physics/State.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -99,3 +99,21 @@ State State::operator-(const State &_state) const
   return State(this->name, this->realTime - _state.realTime,
                this->simTime - _state.simTime);
 }
+
+/////////////////////////////////////////////////
+void State::SetWallTime(const common::Time &_time)
+{
+  this->wallTime = _time;
+}
+
+/////////////////////////////////////////////////
+void State::SetRealTime(const common::Time &_time)
+{
+  this->realTime = _time;
+}
+
+/////////////////////////////////////////////////
+void State::SetSimTime(const common::Time &_time)
+{
+  this->simTime = _time;
+}
diff --git a/gazebo/physics/State.hh b/gazebo/physics/State.hh
index ae4e191..9392128 100644
--- a/gazebo/physics/State.hh
+++ b/gazebo/physics/State.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,9 +23,11 @@
 
 #include <string>
 
-#include "gazebo/sdf/sdf.hh"
+#include <sdf/sdf.hh>
+
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/common/Time.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -38,7 +40,7 @@ namespace gazebo
     /// \brief State of an entity.
     ///
     /// This is the base class for all State information.
-    class State
+    class GAZEBO_VISIBLE State
     {
       /// \brief Default constructor
       public: State();
@@ -95,6 +97,19 @@ namespace gazebo
       /// \return Simulation time when the data was recorded.
       public: common::Time GetSimTime() const;
 
+      /// \brief Set the wall time when this state was generated
+      /// \param[in] _time The absolute clock time when the State
+      /// data was recorded.
+      public: virtual void SetWallTime(const common::Time &_time);
+
+      /// \brief Set the real time when this state was generated
+      /// \param[in] _time Clock time since simulation was stated.
+      public: virtual void SetRealTime(const common::Time &_time);
+
+      /// \brief Set the sim time when this state was generated
+      /// \param[in] _time Simulation time when the data was recorded.
+      public: virtual void SetSimTime(const common::Time &_time);
+
       /// Name associated with this State
       protected: std::string name;
 
diff --git a/gazebo/physics/SurfaceParams.cc b/gazebo/physics/SurfaceParams.cc
index 498b52f..4f4ecb2 100644
--- a/gazebo/physics/SurfaceParams.cc
+++ b/gazebo/physics/SurfaceParams.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,64 +14,100 @@
  * limitations under the License.
  *
 */
-/* Desc: common::Parameters for contact joints
- * Author: Nate Koenig
- * Date: 30 July 2003
- */
 
-#include <float.h>
-#include "physics/SurfaceParams.hh"
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/physics/SurfaceParams.hh"
 
 using namespace gazebo;
 using namespace physics;
 
 //////////////////////////////////////////////////
-SurfaceParams::SurfaceParams()
+FrictionPyramid::FrictionPyramid()
 {
+  this->mu[0] = 1.0;
+  this->mu[1] = 1.0;
 }
 
 //////////////////////////////////////////////////
-SurfaceParams::~SurfaceParams()
+FrictionPyramid::~FrictionPyramid()
 {
 }
 
 //////////////////////////////////////////////////
-void SurfaceParams::Load(sdf::ElementPtr _sdf)
+double FrictionPyramid::GetMuPrimary()
+{
+  return this->GetMu(0);
+}
+
+//////////////////////////////////////////////////
+double FrictionPyramid::GetMuSecondary()
+{
+  return this->GetMu(1);
+}
+
+//////////////////////////////////////////////////
+void FrictionPyramid::SetMuPrimary(double _mu)
+{
+  this->SetMu(0, _mu);
+}
+
+//////////////////////////////////////////////////
+void FrictionPyramid::SetMuSecondary(double _mu)
+{
+  this->SetMu(1, _mu);
+}
+
+//////////////////////////////////////////////////
+double FrictionPyramid::GetMu(unsigned int _index)
+{
+  GZ_ASSERT(_index < 2, "Invalid _index to GetMu");
+  return this->mu[_index];
+}
+
+//////////////////////////////////////////////////
+void FrictionPyramid::SetMu(unsigned int _index, double _mu)
 {
+  GZ_ASSERT(_index < 2, "Invalid _index to SetMu");
+  if (_mu < 0)
   {
-    sdf::ElementPtr bounceElem = _sdf->GetElement("bounce");
-    this->bounce = bounceElem->GetValueDouble("restitution_coefficient");
-    this->bounceThreshold = bounceElem->GetValueDouble("threshold");
+    this->mu[_index] = GZ_FLT_MAX;
   }
-
+  else
   {
-    sdf::ElementPtr frictionElem = _sdf->GetElement("friction");
-    {
-      sdf::ElementPtr frictionOdeElem = frictionElem->GetElement("ode");
-      this->mu1 = frictionOdeElem->GetValueDouble("mu");
-      this->mu2 = frictionOdeElem->GetValueDouble("mu2");
-
-      if (this->mu1 < 0)
-        this->mu1 = FLT_MAX;
-      if (this->mu2 < 0)
-        this->mu2 = FLT_MAX;
-
-      this->slip1 = frictionOdeElem->GetValueDouble("slip1");
-      this->slip2 = frictionOdeElem->GetValueDouble("slip2");
-      this->fdir1 = frictionOdeElem->GetValueVector3("fdir1");
-    }
+    this->mu[_index] = _mu;
   }
+}
+
+//////////////////////////////////////////////////
+SurfaceParams::SurfaceParams()
+  : collideWithoutContact(false),
+    collideWithoutContactBitmask(1)
+{
+}
+
+//////////////////////////////////////////////////
+SurfaceParams::~SurfaceParams()
+{
+}
 
+//////////////////////////////////////////////////
+void SurfaceParams::Load(sdf::ElementPtr _sdf)
+{
+  if (!_sdf)
+    gzerr << "Surface _sdf is NULL" << std::endl;
+  else
   {
     sdf::ElementPtr contactElem = _sdf->GetElement("contact");
+    if (!contactElem)
+      gzerr << "Surface contact sdf member is NULL" << std::endl;
+    else
     {
-      sdf::ElementPtr contactOdeElem = contactElem->GetElement("ode");
-      this->kp = contactOdeElem->GetValueDouble("kp");
-      this->kd = contactOdeElem->GetValueDouble("kd");
-      this->cfm = contactOdeElem->GetValueDouble("soft_cfm");
-      this->erp = contactOdeElem->GetValueDouble("soft_erp");
-      this->maxVel = contactOdeElem->GetValueDouble("max_vel");
-      this->minDepth = contactOdeElem->GetValueDouble("min_depth");
+      this->collideWithoutContact =
+        contactElem->Get<bool>("collide_without_contact");
+      this->collideWithoutContactBitmask =
+          contactElem->Get<unsigned int>("collide_without_contact_bitmask");
     }
   }
 }
@@ -79,61 +115,15 @@ void SurfaceParams::Load(sdf::ElementPtr _sdf)
 /////////////////////////////////////////////////
 void SurfaceParams::FillMsg(msgs::Surface &_msg)
 {
-  _msg.mutable_friction()->set_mu(this->mu1);
-  _msg.mutable_friction()->set_mu2(this->mu2);
-  _msg.mutable_friction()->set_slip1(this->slip1);
-  _msg.mutable_friction()->set_slip2(this->slip2);
-  msgs::Set(_msg.mutable_friction()->mutable_fdir1(), this->fdir1);
-
-  _msg.set_restitution_coefficient(this->bounce);
-  _msg.set_bounce_threshold(this->bounceThreshold);
-
-  _msg.set_soft_cfm(this->cfm);
-  _msg.set_soft_erp(this->erp);
-  _msg.set_kp(this->kp);
-  _msg.set_kd(this->kd);
-  _msg.set_max_vel(this->maxVel);
-  _msg.set_min_depth(this->minDepth);
+  _msg.set_collide_without_contact(this->collideWithoutContact);
+  _msg.set_collide_without_contact_bitmask(this->collideWithoutContactBitmask);
 }
 
 
 void SurfaceParams::ProcessMsg(const msgs::Surface &_msg)
 {
-  if (_msg.has_friction())
-  {
-    if (_msg.friction().has_mu())
-      this->mu1 = _msg.friction().mu();
-    if (_msg.friction().has_mu2())
-      this->mu2 = _msg.friction().mu2();
-    if (_msg.friction().has_slip1())
-      this->slip1 = _msg.friction().slip1();
-    if (_msg.friction().has_slip2())
-      this->slip2 = _msg.friction().slip2();
-    if (_msg.friction().has_fdir1())
-      this->fdir1 = msgs::Convert(_msg.friction().fdir1());
-
-    if (this->mu1 < 0)
-      this->mu1 = FLT_MAX;
-    if (this->mu2 < 0)
-      this->mu2 = FLT_MAX;
-  }
-
-  if (_msg.has_restitution_coefficient())
-    this->bounce = _msg.restitution_coefficient();
-  if (_msg.has_bounce_threshold())
-    this->bounceThreshold = _msg.bounce_threshold();
-  if (_msg.has_soft_cfm())
-    this->cfm = _msg.soft_cfm();
-  if (_msg.has_soft_erp())
-    this->erp = _msg.soft_erp();
-  if (_msg.has_kp())
-    this->kp = _msg.kp();
-  if (_msg.has_kd())
-    this->kd = _msg.kd();
-  if (_msg.has_max_vel())
-    this->maxVel = _msg.max_vel();
-  if (_msg.has_min_depth())
-    this->minDepth = _msg.min_depth();
+  if (_msg.has_collide_without_contact())
+    this->collideWithoutContact = _msg.collide_without_contact();
+  if (_msg.has_collide_without_contact_bitmask())
+    this->collideWithoutContactBitmask = _msg.collide_without_contact_bitmask();
 }
-
-
diff --git a/gazebo/physics/SurfaceParams.hh b/gazebo/physics/SurfaceParams.hh
index 52d9ddd..3c6b661 100644
--- a/gazebo/physics/SurfaceParams.hh
+++ b/gazebo/physics/SurfaceParams.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,16 +14,14 @@
  * limitations under the License.
  *
 */
-/* Desc: common::Parameters for a surface
- * Author: Nate Koenig
- * Date: 30 July 2003
- */
 
 #ifndef _SURFACEPARAMS_HH_
 #define _SURFACEPARAMS_HH_
 
+#include <sdf/sdf.hh>
+
 #include "gazebo/msgs/msgs.hh"
-#include "gazebo/sdf/sdf.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,11 +30,67 @@ namespace gazebo
     /// \addtogroup gazebo_physics
     /// \{
 
+    /// \class FrictionPyramid SurfaceParams.hh physics/physics.hh
+    /// \brief Parameters used for friction pyramid model.
+    class GAZEBO_VISIBLE FrictionPyramid
+    {
+      /// \brief Constructor.
+      public: FrictionPyramid();
+
+      /// \brief Destructor.
+      public: virtual ~FrictionPyramid();
+
+      /// \brief Get the friction coefficient in the primary direction.
+      /// \return Friction coefficient in primary direction.
+      public: double GetMuPrimary();
+
+      /// \brief Get the friction coefficient in the secondary direction.
+      /// \return Friction coefficient in secondary direction.
+      public: double GetMuSecondary();
+
+      /// \brief Set the friction coefficient in the primary direction.
+      /// \param[in] _mu Friction coefficient.
+      public: void SetMuPrimary(double _mu);
+
+      /// \brief Set the friction coefficient in the secondary direction.
+      /// \param[in] _mu Friction coefficient.
+      public: void SetMuSecondary(double _mu);
+
+      /// \brief Get the friction coefficient in a single direction.
+      /// \param[in] _index Index of friction direction, 0 for primary,
+      /// 1 for secondary direction.
+      /// \return Friction coefficient, or negative value if invalid
+      /// _index is supplied.
+      private: double GetMu(unsigned int _index);
+
+      /// \brief Set the friction coefficient in a single direction.
+      /// If a negative value is supplied, use an astronomically high
+      /// value instead.
+      /// \param[in] _index Index of friction direction, 0 for primary,
+      /// 1 for secondary direction.
+      /// \param[in] _mu Friction coefficient.
+      private: void SetMu(unsigned int _index, double _mu);
+
+      /// \brief Vector for specifying the primary friction direction,
+      /// relative to the parent collision frame. The component of this
+      /// vector that is orthogonal to the surface normal will be set
+      /// as the primary friction direction.
+      /// If undefined, a vector consstrained to be perpendicular
+      /// to the contact normal in the global y-z plane is used.
+      /// \sa http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
+      public: math::Vector3 direction1;
+
+      /// \brief Array of dry friction coefficients. mu[0] is in the
+      /// primary direction as defined by the friction pyramid.
+      /// mu[1] is in the second direction.
+      private: double mu[2];
+    };
+
     /// \class SurfaceParams SurfaceParams.hh physics/physics.hh
     /// \brief SurfaceParams defines various Surface contact parameters.
     /// These parameters defines the properties of a
     /// physics::Contact constraint.
-    class SurfaceParams
+    class GAZEBO_VISIBLE SurfaceParams
     {
       /// \brief Constructor.
       public: SurfaceParams();
@@ -50,88 +104,18 @@ namespace gazebo
 
       /// \brief Fill in a surface message.
       /// \param[in] _msg Message to fill with this object's values.
-      public: void FillMsg(msgs::Surface &_msg);
+      public: virtual void FillMsg(msgs::Surface &_msg);
 
+      /// \brief Process a surface message.
+      /// \param[in] _msg Message to read values from.
       public: virtual void ProcessMsg(const msgs::Surface &_msg);
 
-      /// \brief bounce restitution coefficient [0,1], with 0 being inelastic,
-      ///        and 1 being perfectly elastic.
-      /// \sa    http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
-      public: double bounce;
-
-      /// \brief minimum contact velocity for bounce to take effect, otherwise
-      ///        the collision is treated as an inelastic collision.
-      /// \sa    http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
-      public: double bounceThreshold;
-
-      /// \brief spring constant equivalents of a contact as a function of
-      ///        SurfaceParams::cfm and SurfaceParams::erp.
-      /// \sa    See for example
-      ///        http://www.ode.org/ode-latest-userguide.html#sec_3_8_2
-      ///        for more details.
-      public: double kp;
-
-      /// \brief spring damping constant equivalents of a contact as a
-      ///        function of SurfaceParams::cfm and SurfaceParams::erp.
-      /// \sa    See for example
-      ///        http://www.ode.org/ode-latest-userguide.html#sec_3_8_2
-      ///        for more details.
-      public: double kd;
-
-      /// \brief Constraint Force Mixing parameter.
-      ///        See for example
-      ///        http://www.ode.org/ode-latest-userguide.html#sec_3_8_0
-      ///        for more details.
-      public: double cfm;
-
-      /// \brief Error Reduction Parameter.
-      /// \sa    See for example
-      ///        http://www.ode.org/ode-latest-userguide.html#sec_3_8_0
-      ///        for more details.
-      public: double erp;
-
-      /// \brief Maximum interpenetration error correction velocity.  If
-      ///        set to 0, two objects interpenetrating each other
-      ///        will not be pushed apart.
-      /// \sa    See dWroldSetContactMaxCorrectingVel
-      ///        (http://www.ode.org/ode-latest-userguide.html#sec_5_2_0)
-      public: double maxVel;
-
-      /// \brief Minimum depth before ERP takes effect.
-      /// \sa    See dWorldSetContactSurfaceLayer
-      ///        (http://www.ode.org/ode-latest-userguide.html#sec_5_2_0)
-      public: double minDepth;
-
-      /// \brief Dry friction coefficient in the primary friction direction
-      ///        as defined by the friction pyramid.  This is fdir1 if defined,
-      ///        otherwise, a vector consstrained to be perpendicular to the
-      ///        contact normal in the global y-z plane is used.
-      /// \sa    http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
-      public: double mu1;
-
-      /// \brief Dry friction coefficient in the second friction direction
-      ///        as defined by the friction pyramid.  This is fdir1 if defined,
-      ///        otherwise, a vector consstrained to be perpendicular to the
-      ///        contact normal in the global y-z plane is used.
-      /// \sa    http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
-      public: double mu2;
-
-      /// \brief Artificial contact slip in the primary friction direction.
-      /// \sa    See dContactSlip1 in
-      ///        http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
-      public: double slip1;
-
-      /// \brief Artificial contact slip in the secondary friction dirction.
-      /// \sa    See dContactSlip2 in
-      ///        http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
-      public: double slip2;
-
-      /// \brief Primary friction direction for dry friction coefficient
-      ///        (SurfaceParams::mu1) of the friction pyramid.
-      ///        If undefined, a vector consstrained to be perpendicular
-      ///        to the contact normal in the global y-z plane is used.
-      /// \sa    http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
-      public: math::Vector3 fdir1;
+      /// \brief Allow collision checking without generating a contact joint.
+      public: bool collideWithoutContact;
+
+      /// \brief Custom collision filtering used when collideWithoutContact is
+      /// true.
+      public: unsigned int collideWithoutContactBitmask;
     };
     /// \}
   }
diff --git a/gazebo/physics/TrimeshShape.cc b/gazebo/physics/TrimeshShape.cc
deleted file mode 100644
index 5598a37..0000000
--- a/gazebo/physics/TrimeshShape.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: Trimesh shape
- * Author: Nate Koenig
- * Date: 16 Oct 2009
- */
-
-#include "common/Common.hh"
-#include "common/MeshManager.hh"
-#include "common/Mesh.hh"
-#include "common/Exception.hh"
-
-#include "physics/World.hh"
-#include "physics/PhysicsEngine.hh"
-#include "physics/Collision.hh"
-#include "physics/TrimeshShape.hh"
-
-using namespace gazebo;
-using namespace physics;
-
-//////////////////////////////////////////////////
-TrimeshShape::TrimeshShape(CollisionPtr _parent)
-  : Shape(_parent)
-{
-  this->submesh = NULL;
-  this->AddType(Base::TRIMESH_SHAPE);
-}
-
-
-//////////////////////////////////////////////////
-TrimeshShape::~TrimeshShape()
-{
-}
-
-//////////////////////////////////////////////////
-void TrimeshShape::Init()
-{
-  std::string filename;
-
-  this->mesh = NULL;
-  common::MeshManager *meshManager = common::MeshManager::Instance();
-
-  filename = common::find_file(this->sdf->GetValueString("uri"));
-
-  if (filename == "__default__" || filename.empty())
-  {
-    gzerr << "No mesh specified\n";
-    return;
-  }
-
-  if ((this->mesh = meshManager->Load(filename)) == NULL)
-    gzerr << "Unable to load mesh from file[" << filename << "]\n";
-
-  if (this->submesh)
-    delete this->submesh;
-  this->submesh = NULL;
-
-  if (this->sdf->HasElement("submesh"))
-  {
-    sdf::ElementPtr submeshElem = this->sdf->GetElement("submesh");
-    this->submesh = new common::SubMesh(
-      this->mesh->GetSubMesh(submeshElem->GetValueString("name")));
-
-    if (!this->submesh)
-      gzthrow("Unable to get submesh with name[" +
-          submeshElem->GetValueString("name") + "]");
-
-    if (submeshElem->HasElement("center"))
-      this->submesh->Center();
-  }
-}
-
-//////////////////////////////////////////////////
-void TrimeshShape::SetScale(const math::Vector3 &_scale)
-{
-  this->sdf->GetElement("scale")->Set(_scale);
-}
-
-//////////////////////////////////////////////////
-math::Vector3 TrimeshShape::GetSize() const
-{
-  return this->sdf->GetValueVector3("scale");
-}
-
-//////////////////////////////////////////////////
-std::string TrimeshShape::GetFilename() const
-{
-  return this->GetMeshURI();
-}
-
-//////////////////////////////////////////////////
-std::string TrimeshShape::GetMeshURI() const
-{
-  return this->sdf->GetValueString("uri");
-}
-
-//////////////////////////////////////////////////
-void TrimeshShape::SetFilename(const std::string &_filename)
-{
-  this->SetMesh(_filename);
-}
-
-//////////////////////////////////////////////////
-void TrimeshShape::SetMesh(const std::string &_uri,
-                           const std::string &_submesh,
-                           bool _center)
-{
-  if (_uri.find("://") == std::string::npos)
-  {
-    gzerr << "Invalid URI[" << _uri
-          << "]. Must use a URI, like file://" << _uri << "\n";
-    return;
-  }
-
-  this->sdf->GetElement("uri")->Set(_uri);
-  this->sdf->GetElement("submesh")->GetElement("name")->Set(_submesh);
-  this->sdf->GetElement("submesh")->GetElement("center")->Set(_center);
-
-  this->Init();
-}
-
-//////////////////////////////////////////////////
-void TrimeshShape::FillMsg(msgs::Geometry &_msg)
-{
-  _msg.set_type(msgs::Geometry::MESH);
-  _msg.mutable_mesh()->CopyFrom(msgs::MeshFromSDF(this->sdf));
-}
-
-//////////////////////////////////////////////////
-void TrimeshShape::ProcessMsg(const msgs::Geometry &_msg)
-{
-  this->SetScale(msgs::Convert(_msg.mesh().scale()));
-  this->SetMesh(_msg.mesh().filename(),
-      _msg.mesh().has_submesh() ? _msg.mesh().submesh() : std::string(),
-      _msg.mesh().has_center_submesh() ? _msg.mesh().center_submesh() :  false);
-}
diff --git a/gazebo/physics/TrimeshShape.hh b/gazebo/physics/TrimeshShape.hh
deleted file mode 100644
index 4341daf..0000000
--- a/gazebo/physics/TrimeshShape.hh
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: Trimesh geometry
- * Author: Nate Koenig, Andrew Howard
- * Date: 8 May 2003
- */
-
-#ifndef _TRIMESHSHAPE_HH_
-#define _TRIMESHSHAPE_HH_
-
-#include <string>
-
-#include "gazebo/common/CommonTypes.hh"
-#include "gazebo/physics/PhysicsTypes.hh"
-#include "gazebo/physics/Shape.hh"
-
-namespace gazebo
-{
-  namespace physics
-  {
-    /// \addtogroup gazebo_physics
-    /// \{
-
-    /// \class TrimeshShape TrimeshShape.hh physics/physics.hh
-    /// \brief Triangle mesh collision shape
-    class TrimeshShape : public Shape
-    {
-      /// \brief Constructor.
-      /// \param[in] _parent Parent collision.
-      public: explicit TrimeshShape(CollisionPtr _parent);
-
-      /// \brief Destructor.
-      public: virtual ~TrimeshShape();
-
-      /// \brief Update the tri mesh.
-      public: virtual void Update() {}
-
-      /// \copydoc Shape::Init()
-      public: virtual void Init();
-
-      /// \brief Get the size of the triangle mesh.
-      /// \return The size of the triangle mesh.
-      public: virtual math::Vector3 GetSize() const;
-
-      /// Deprecated
-      /// \sa GetMeshURI
-      public: std::string GetFilename() const GAZEBO_DEPRECATED(1.5);
-
-      /// \brief Get the URI of the mesh data.
-      /// \return The URI of the mesh data.
-      public: std::string GetMeshURI() const;
-
-      /// Deprecated.
-      /// \sa SetMesh
-      public: void SetFilename(
-                  const std::string &_filename) GAZEBO_DEPRECATED(1.5);
-
-      /// \brief Set the mesh uri and submesh name.
-      /// \param[in] _uri Filename of the mesh file to load from.
-      /// \param[in] _submesh Name of the submesh to use within the mesh
-      /// \param[in] _center True to center the submesh.
-      /// specified in the _uri.
-      public: void SetMesh(const std::string &_uri,
-                           const std::string &_submesh = "",
-                           bool _center = false);
-
-
-      /// \brief Set the scaling factor.
-      /// \param[in] _scale Scaling factor.
-      public: void SetScale(const math::Vector3 &_scale);
-
-      /// \brief Populate a msgs::Geometry message with data from this
-      /// shape.
-      /// \param[out] _msg Message to fill.
-      public: void FillMsg(msgs::Geometry &_msg);
-
-      /// \brief Update this shape from a message.
-      /// \param[in] _msg Message that contains triangle mesh info.
-      public: virtual void ProcessMsg(const msgs::Geometry &_msg);
-
-      /// \brief Pointer to the mesh data.
-      protected: const common::Mesh *mesh;
-
-      /// \brief The submesh to use from within the parent mesh.
-      protected: common::SubMesh *submesh;
-    };
-    /// \}
-  }
-}
-#endif
diff --git a/gazebo/physics/UniversalJoint.hh b/gazebo/physics/UniversalJoint.hh
index 8357d51..231be31 100644
--- a/gazebo/physics/UniversalJoint.hh
+++ b/gazebo/physics/UniversalJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,12 @@
  * limitations under the License.
  *
 */
-/* Desc: A universal joint
- * Author: Nate Koenig, Andrew Howard
- * Date: 21 May 2003
- */
-
-#ifndef _UNIVERSALJOINT_HH_
-#define _UNIVERSALJOINT_HH_
+#ifndef _GAZEBO_UNIVERSALJOINT_HH_
+#define _GAZEBO_UNIVERSALJOINT_HH_
 
+#include "gazebo/math/Vector3.hh"
 #include "gazebo/physics/Joint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,9 +30,19 @@ namespace gazebo
 
     /// \class UniversalJoint UniversalJoint.hh physics/physics.hh
     /// \brief A universal joint.
+    /// Axis1 and axis2 are body-fixed, with axis1 attached to parent
+    /// body and axis2 attached to child body.
     template<class T>
-    class UniversalJoint : public T
+    class GAZEBO_VISIBLE UniversalJoint : public T
     {
+      /// \enum AxisIndex
+      /// \brief Map joint axes to corresponding link.
+      public: enum AxisIndex
+      {
+        AXIS_PARENT = 0,
+        AXIS_CHILD  = 1
+      };
+
       /// \brief Constructor.
       /// \param[in] _parent Parent link of the univeral joint.
       public: explicit UniversalJoint(BasePtr _parent) : T(_parent)
@@ -45,7 +52,7 @@ namespace gazebo
       public: virtual ~UniversalJoint()
               { }
 
-      /// \interal
+      // Documentation inherited.
       public: virtual unsigned int GetAngleCount() const
               {return 2;}
 
@@ -55,11 +62,19 @@ namespace gazebo
               {
                 T::Load(_sdf);
 
+                /*
                 this->SetAxis(0,
-                    this->sdf->GetElement("axis")->GetValueVector3("xyz"));
+                    this->sdf->GetElement("axis")->Get<math::Vector3("xyz"));
                 this->SetAxis(1,
-                    this->sdf->GetElement("axis2")->GetValueVector3("xyz"));
+                    this->sdf->GetElement("axis2")->Get<math::Vector3>("xyz"));
+                    */
               }
+
+      /// \brief Initialize joint
+      protected: virtual void Init()
+                 {
+                   T::Init();
+                 }
     };
     /// \}
   }
diff --git a/gazebo/physics/World.cc b/gazebo/physics/World.cc
index b0e85e6..3cf6c79 100644
--- a/gazebo/physics/World.cc
+++ b/gazebo/physics/World.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,9 +14,6 @@
  * limitations under the License.
  *
 */
-/* Desc: The world; all models are collected here
- * Author: Andrew Howard and Nate Koenig
- */
 
 #include <time.h>
 
@@ -27,25 +24,28 @@
 #include <boost/thread/mutex.hpp>
 #include <boost/thread/recursive_mutex.hpp>
 
+#include <sdf/sdf.hh>
+
 #include "gazebo/sensors/SensorManager.hh"
 #include "gazebo/math/Rand.hh"
 
-#include "gazebo/sdf/sdf.hh"
 #include "gazebo/transport/Node.hh"
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Publisher.hh"
 #include "gazebo/transport/Subscriber.hh"
 
-#include "gazebo/common/LogPlay.hh"
-#include "gazebo/common/LogRecord.hh"
+#include "gazebo/util/LogPlay.hh"
+
 #include "gazebo/common/ModelDatabase.hh"
-#include "gazebo/common/Common.hh"
+#include "gazebo/common/CommonIface.hh"
 #include "gazebo/common/Events.hh"
 #include "gazebo/common/Exception.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Plugin.hh"
 
+#include "gazebo/util/OpenAL.hh"
 #include "gazebo/util/Diagnostics.hh"
+#include "gazebo/util/LogRecord.hh"
 
 #include "gazebo/physics/Road.hh"
 #include "gazebo/physics/RayShape.hh"
@@ -55,13 +55,17 @@
 #include "gazebo/physics/Model.hh"
 #include "gazebo/physics/Actor.hh"
 #include "gazebo/physics/World.hh"
+#include "gazebo/common/SphericalCoordinates.hh"
 
-#include "physics/Collision.hh"
-#include "physics/ContactManager.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/ContactManager.hh"
 
 using namespace gazebo;
 using namespace physics;
 
+/// \brief Flag used to say if/when to clear all models.
+/// This will be replaced with a class member variable in Gazebo 3.0
+bool g_clearModels;
 
 class ModelUpdate_TBB
 {
@@ -80,6 +84,7 @@ class ModelUpdate_TBB
 //////////////////////////////////////////////////
 World::World(const std::string &_name)
 {
+  g_clearModels = false;
   this->sdf.reset(new sdf::Element);
   sdf::initFile("world.sdf", this->sdf);
 
@@ -97,8 +102,10 @@ World::World(const std::string &_name)
   this->stepInc = 0;
   this->pause = false;
   this->thread = NULL;
+  this->logThread = NULL;
   this->stop = false;
 
+  this->currentStateBuffer = 0;
   this->stateToggle = 0;
 
   this->pluginsLoaded = false;
@@ -123,6 +130,9 @@ World::World(const std::string &_name)
   this->connections.push_back(
      event::Events::ConnectSetSelectedEntity(
        boost::bind(&World::SetSelectedEntityCB, this, _1)));
+  this->connections.push_back(
+     event::Events::ConnectPause(
+       boost::bind(&World::SetPaused, this, _1)));
 }
 
 //////////////////////////////////////////////////
@@ -153,27 +163,37 @@ void World::Load(sdf::ElementPtr _sdf)
   this->loaded = false;
   this->sdf = _sdf;
 
-  if (this->sdf->GetValueString("name").empty())
+  if (this->sdf->Get<std::string>("name").empty())
     gzwarn << "create_world(world_name =["
            << this->name << "]) overwrites sdf world name\n!";
   else
-    this->name = this->sdf->GetValueString("name");
+    this->name = this->sdf->Get<std::string>("name");
+
+#ifdef HAVE_OPENAL
+  util::OpenAL::Instance()->Load(this->sdf->GetElement("audio"));
+#endif
 
   this->sceneMsg.CopyFrom(msgs::SceneFromSDF(this->sdf->GetElement("scene")));
   this->sceneMsg.set_name(this->GetName());
 
-  // The period at which statistics about the world are published
-  this->statPeriod = common::Time(0, 200000000);
-
   // The period at which messages are processed
   this->processMsgsPeriod = common::Time(0, 200000000);
 
   this->node = transport::NodePtr(new transport::Node());
   this->node->Init(this->GetName());
 
-  this->posePub = this->node->Advertise<msgs::Pose_V>("~/pose/info", 10, 60.0);
+  // pose pub for server side, mainly used for updating and timestamping
+  // Scene, which in turn will be used by rendering sensors.
+  // TODO: replace local communication with shared memory for efficiency.
+  this->poseLocalPub = this->node->Advertise<msgs::PosesStamped>(
+    "~/pose/local/info", 10);
 
-  this->guiPub = this->node->Advertise<msgs::GUI>("~/gui");
+  // pose pub for client with a cap on publishing rate to reduce traffic
+  // overhead
+  this->posePub = this->node->Advertise<msgs::PosesStamped>(
+    "~/pose/info", 10, 60);
+
+  this->guiPub = this->node->Advertise<msgs::GUI>("~/gui", 5);
   if (this->sdf->HasElement("gui"))
     this->guiPub->Publish(msgs::GUIFromSDF(this->sdf->GetElement("gui")));
 
@@ -182,24 +202,22 @@ void World::Load(sdf::ElementPtr _sdf)
   this->controlSub = this->node->Subscribe("~/world_control",
                                            &World::OnControl, this);
 
-  this->logControlSub = this->node->Subscribe("~/log/control",
-                                              &World::OnLogControl, this);
-  this->logStatusPub = this->node->Advertise<msgs::LogStatus>("~/log/status");
-
   this->requestSub = this->node->Subscribe("~/request",
                                            &World::OnRequest, this, true);
   this->jointSub = this->node->Subscribe("~/joint", &World::JointLog, this);
+  this->lightSub = this->node->Subscribe("~/light", &World::OnLightMsg, this);
+
   this->modelSub = this->node->Subscribe<msgs::Model>("~/model/modify",
       &World::OnModelMsg, this);
 
   this->responsePub = this->node->Advertise<msgs::Response>("~/response");
   this->statPub =
-    this->node->Advertise<msgs::WorldStatistics>("~/world_stats");
+    this->node->Advertise<msgs::WorldStatistics>("~/world_stats", 100, 5);
   this->selectionPub = this->node->Advertise<msgs::Selection>("~/selection", 1);
   this->modelPub = this->node->Advertise<msgs::Model>("~/model/info");
   this->lightPub = this->node->Advertise<msgs::Light>("~/light");
 
-  std::string type = this->sdf->GetElement("physics")->GetValueString("type");
+  std::string type = this->sdf->GetElement("physics")->Get<std::string>("type");
   this->physicsEngine = PhysicsFactory::NewPhysicsEngine(type,
       shared_from_this());
 
@@ -209,6 +227,25 @@ void World::Load(sdf::ElementPtr _sdf)
   // This should come before loading of entities
   this->physicsEngine->Load(this->sdf->GetElement("physics"));
 
+  // This should also come before loading of entities
+  {
+    sdf::ElementPtr spherical = this->sdf->GetElement("spherical_coordinates");
+    common::SphericalCoordinates::SurfaceType surfaceType =
+      common::SphericalCoordinates::Convert(
+        spherical->Get<std::string>("surface_model"));
+    math::Angle latitude, longitude, heading;
+    double elevation = spherical->Get<double>("elevation");
+    latitude.SetFromDegree(spherical->Get<double>("latitude_deg"));
+    longitude.SetFromDegree(spherical->Get<double>("longitude_deg"));
+    heading.SetFromDegree(spherical->Get<double>("heading_deg"));
+
+    this->sphericalCoordinates.reset(new common::SphericalCoordinates(
+      surfaceType, latitude, longitude, elevation, heading));
+  }
+
+  if (this->sphericalCoordinates == NULL)
+    gzthrow("Unable to create spherical coordinates data structure\n");
+
   this->rootElement.reset(new Base(BasePtr()));
   this->rootElement->SetName(this->GetName());
   this->rootElement->SetWorld(shared_from_this());
@@ -279,7 +316,7 @@ void World::Save(const std::string &_filename)
 //////////////////////////////////////////////////
 void World::Init()
 {
-  // Initialize all the entities
+  // Initialize all the entities (i.e. Model)
   for (unsigned int i = 0; i < this->rootElement->GetChildCount(); i++)
     this->rootElement->GetChild(i)->Init();
 
@@ -289,39 +326,56 @@ void World::Init()
   this->testRay = boost::dynamic_pointer_cast<RayShape>(
       this->GetPhysicsEngine()->CreateShape("ray", CollisionPtr()));
 
-  common::LogRecord::Instance()->Add(this->GetName(), "state.log",
-      boost::bind(&World::OnLog, this, _1));
-
   this->prevStates[0].SetWorld(shared_from_this());
   this->prevStates[1].SetWorld(shared_from_this());
 
   this->prevStates[0].SetName(this->GetName());
   this->prevStates[1].SetName(this->GetName());
 
-  this->initialized = true;
-
   this->updateInfo.worldName = this->GetName();
 
   this->iterations = 0;
+  this->logPrevIteration = 0;
+
+  util::DiagnosticManager::Instance()->Init(this->GetName());
+
+  util::LogRecord::Instance()->Add(this->GetName(), "state.log",
+      boost::bind(&World::OnLog, this, _1));
+
+  this->initialized = true;
 
   // Mark the world initialization
-  gzlog << "World::Init" << std::endl;
+  gzlog << "Init world[" << this->GetName() << "]" << std::endl;
+}
 
-  util::DiagnosticManager::Instance()->Init(this->GetName());
+//////////////////////////////////////////////////
+void World::Run(unsigned int _iterations)
+{
+  this->stop = false;
+  this->stopIterations = _iterations;
+
+  this->thread = new boost::thread(boost::bind(&World::RunLoop, this));
 }
 
 //////////////////////////////////////////////////
-void World::Run()
+void World::RunBlocking(unsigned int _iterations)
 {
   this->stop = false;
-  this->thread = new boost::thread(
-      boost::bind(&World::RunLoop, this));
+  this->stopIterations = _iterations;
+  this->RunLoop();
+}
+
+//////////////////////////////////////////////////
+bool World::GetRunning() const
+{
+  return !this->stop;
 }
 
 //////////////////////////////////////////////////
 void World::Stop()
 {
   this->stop = true;
+
   if (this->thread)
   {
     this->thread->join();
@@ -345,18 +399,41 @@ void World::RunLoop()
 
   // Get the first state
   this->prevStates[0] = WorldState(shared_from_this());
+  this->prevStates[1] = WorldState(shared_from_this());
   this->stateToggle = 0;
 
-  if (!common::LogPlay::Instance()->IsOpen())
+  this->logThread = new boost::thread(boost::bind(&World::LogWorker, this));
+
+  if (!util::LogPlay::Instance()->IsOpen())
   {
-    while (!this->stop)
+    for (this->iterations = 0; !this->stop &&
+        (!this->stopIterations || (this->iterations < this->stopIterations));)
+    {
       this->Step();
+    }
   }
   else
   {
     this->enablePhysicsEngine = false;
-    while (!this->stop)
+    for (this->iterations = 0; !this->stop &&
+        (!this->stopIterations || (this->iterations < this->stopIterations));)
+    {
       this->LogStep();
+    }
+  }
+
+  this->stop = true;
+
+  if (this->logThread)
+  {
+    this->logCondition.notify_all();
+    {
+      boost::mutex::scoped_lock lock(this->logMutex);
+      this->logCondition.notify_all();
+    }
+    this->logThread->join();
+    delete this->logThread;
+    this->logThread = NULL;
   }
 }
 
@@ -366,7 +443,7 @@ void World::LogStep()
   if (!this->IsPaused() || this->stepInc > 0)
   {
     std::string data;
-    if (!common::LogPlay::Instance()->Step(data))
+    if (!util::LogPlay::Instance()->Step(data))
     {
       this->SetPaused(true);
     }
@@ -387,7 +464,9 @@ void World::LogStep()
         {
           ModelPtr model = this->LoadModel(modelElem, this->rootElement);
           model->Init();
-          model->LoadPlugins();
+
+          // Disabling plugins on playback
+          // model->LoadPlugins();
 
           modelElem = modelElem->GetNextElement("model");
         }
@@ -401,14 +480,12 @@ void World::LogStep()
         while (nameElem)
         {
           transport::requestNoReply(this->GetName(), "entity_delete",
-                                    nameElem->GetValueString());
+                                    nameElem->Get<std::string>());
           nameElem = nameElem->GetNextElement("name");
         }
       }
 
-      WorldState state = WorldState(shared_from_this()) + this->logPlayState;
-      this->SetState(state);
-
+      this->SetState(this->logPlayState);
       this->Update();
       this->iterations++;
     }
@@ -441,10 +518,7 @@ void World::Step()
   DIAG_TIMER_LAP("World::Step", "loadPlugins");
 
   // Send statistics about the world simulation
-  if (common::Time::GetWallTime() - this->prevStatTime > this->statPeriod)
-  {
-    this->PublishWorldStats();
-  }
+  this->PublishWorldStats();
 
   DIAG_TIMER_LAP("World::Step", "publishWorldStats");
 
@@ -494,20 +568,34 @@ void World::Step()
         this->stepInc--;
     }
     else
+    {
+      // Flush the log record buffer, if there is data in it.
+      if (util::LogRecord::Instance()->GetBufferSize() > 0)
+        util::LogRecord::Instance()->Notify();
       this->pauseTime += stepTime;
+    }
   }
 
   this->ProcessMessages();
 
   DIAG_TIMER_STOP("World::Step");
+
+  if (g_clearModels)
+    this->ClearModels();
 }
 
 //////////////////////////////////////////////////
 void World::StepWorld(int _steps)
 {
+  this->Step(_steps);
+}
+
+//////////////////////////////////////////////////
+void World::Step(unsigned int _steps)
+{
   if (!this->IsPaused())
   {
-    gzwarn << "Calling World::StepWorld(steps) while world is not paused\n";
+    gzwarn << "Calling World::Step(steps) while world is not paused\n";
     this->SetPaused(true);
   }
 
@@ -542,10 +630,8 @@ void World::Update()
       this->ResetEntities(Base::MODEL);
     this->needsReset = false;
   }
-
   DIAG_TIMER_LAP("World::Update", "needsReset");
 
-  event::Events::worldUpdateStart();
   this->updateInfo.simTime = this->GetSimTime();
   this->updateInfo.realTime = this->GetRealTime();
   event::Events::worldUpdateBegin(this->updateInfo);
@@ -562,6 +648,21 @@ void World::Update()
 
   DIAG_TIMER_LAP("World::Update", "PhysicsEngine::UpdateCollision");
 
+  // Wait for logging to finish, if it's running.
+  if (util::LogRecord::Instance()->GetRunning())
+  {
+    boost::mutex::scoped_lock lock(this->logMutex);
+
+    // It's possible the logWorker thread never processed the previous
+    // state. This checks to make sure that we don't continute until the log
+    // worker catchs up.
+    if (this->iterations - this->logPrevIteration > 1)
+    {
+      this->logCondition.notify_one();
+      this->logContinueCondition.wait(lock);
+    }
+  }
+
   // Update the physics engine
   if (this->enablePhysicsEngine && this->physicsEngine)
   {
@@ -584,34 +685,16 @@ void World::Update()
     DIAG_TIMER_LAP("World::Update", "SetWorldPose(dirtyPoses)");
   }
 
+  // Only update state information if logging data.
+  if (util::LogRecord::Instance()->GetRunning())
+    this->logCondition.notify_one();
+  DIAG_TIMER_LAP("World::Update", "LogRecordNotify");
+
   // Output the contact information
   this->physicsEngine->GetContactManager()->PublishContacts();
 
   DIAG_TIMER_LAP("World::Update", "ContactManager::PublishContacts");
 
-  // Only update state informatin if logging data.
-  if (common::LogRecord::Instance()->GetRunning())
-  {
-    int currState = (this->stateToggle + 1) % 2;
-    this->prevStates[currState] = WorldState(shared_from_this());
-
-    WorldState diffState = this->prevStates[currState] -
-      this->prevStates[this->stateToggle];
-
-    if (!diffState.IsZero())
-    {
-      this->stateToggle = currState;
-      this->states.push_back(diffState);
-      if (this->states.size() > 1000)
-        this->states.pop_front();
-
-      /// Publish a log status message if the logger is running.
-      this->PublishLogStatus();
-    }
-  }
-
-  DIAG_TIMER_LAP("World::Update", "LogRecord");
-
   event::Events::worldUpdateEnd();
 
   DIAG_TIMER_STOP("World::Update");
@@ -639,14 +722,39 @@ void World::Fini()
     this->physicsEngine.reset();
   }
 
+  this->models.clear();
   this->prevStates[0].SetWorld(WorldPtr());
   this->prevStates[1].SetWorld(WorldPtr());
+
+#ifdef HAVE_OPENAL
+  util::OpenAL::Instance()->Fini();
+#endif
 }
 
 //////////////////////////////////////////////////
 void World::Clear()
 {
-  // TODO: Implement this
+  g_clearModels = true;
+}
+
+//////////////////////////////////////////////////
+void World::ClearModels()
+{
+  g_clearModels = false;
+  bool pauseState = this->IsPaused();
+  this->SetPaused(true);
+
+  this->publishModelPoses.clear();
+
+  // Remove all models
+  for (Model_V::iterator iter = this->models.begin();
+       iter != this->models.end(); ++iter)
+  {
+    this->rootElement->RemoveChild((*iter)->GetId());
+  }
+  this->models.clear();
+
+  this->SetPaused(pauseState);
 }
 
 //////////////////////////////////////////////////
@@ -662,9 +770,18 @@ PhysicsEnginePtr World::GetPhysicsEngine() const
 }
 
 //////////////////////////////////////////////////
+common::SphericalCoordinatesPtr World::GetSphericalCoordinates() const
+{
+  return this->sphericalCoordinates;
+}
+
+//////////////////////////////////////////////////
 BasePtr World::GetByName(const std::string &_name)
 {
-  return this->rootElement->GetByName(_name);
+  if (this->rootElement)
+    return this->rootElement->GetByName(_name);
+  else
+    return BasePtr();
 }
 
 /////////////////////////////////////////////////
@@ -694,7 +811,7 @@ ModelPtr World::LoadModel(sdf::ElementPtr _sdf , BasePtr _parent)
 
   if (_sdf->GetName() == "model")
   {
-    model.reset(new Model(_parent));
+    model = this->physicsEngine->CreateModel(_parent);
     model->SetWorld(shared_from_this());
     model->Load(_sdf);
 
@@ -709,10 +826,10 @@ ModelPtr World::LoadModel(sdf::ElementPtr _sdf , BasePtr _parent)
   else
   {
     gzerr << "SDF is missing the <model> tag:\n";
-    _sdf->PrintValues("  ");
   }
 
   this->PublishModelPose(model);
+  this->models.push_back(model);
   return model;
 }
 
@@ -796,58 +913,26 @@ void World::LoadEntities(sdf::ElementPtr _sdf, BasePtr _parent)
 //////////////////////////////////////////////////
 unsigned int World::GetModelCount() const
 {
-  // Not all children of the root element are models. We have to iterate
-  // through the children and count only the models.
-  unsigned int result = 0;
-  for (unsigned int i = 0; i < this->rootElement->GetChildCount(); i++)
-    result += this->rootElement->GetChild(i)->HasType(Base::MODEL) ? 1 : 0;
-  return result;
+  return this->models.size();
 }
 
 //////////////////////////////////////////////////
 ModelPtr World::GetModel(unsigned int _index) const
 {
-  ModelPtr model;
-
-  if (_index < this->rootElement->GetChildCount())
-  {
-    // Not all children of the root element are models. We have to iterate
-    // through the children and count only the models.
-    for (unsigned int i = 0, count = 0;
-         i < this->rootElement->GetChildCount(); i++)
-    {
-      if (this->rootElement->GetChild(i)->HasType(Base::MODEL))
-      {
-        if (count == _index)
-        {
-          model = boost::static_pointer_cast<Model>(
-              this->rootElement->GetChild(i));
-          break;
-        }
-        count++;
-      }
-    }
-
-    if (!model)
-      gzerr << "Unable to get model with index[" << _index << "]\n";
-  }
-  else
+  if (_index >= this->models.size())
   {
     gzerr << "Given model index[" << _index << "] is out of range[0.."
-          << this->rootElement->GetChildCount() << "]\n";
+          << this->models.size() << "]\n";
+    return ModelPtr();
   }
 
-  return model;
+  return this->models[_index];
 }
 
 //////////////////////////////////////////////////
 Model_V World::GetModels() const
 {
-  Model_V models;
-  for (unsigned int i = 0; i < this->GetModelCount(); ++i)
-    models.push_back(this->GetModel(i));
-
-  return models;
+  return this->models;
 }
 
 //////////////////////////////////////////////////
@@ -876,6 +961,9 @@ void World::Reset()
   {
     boost::recursive_mutex::scoped_lock(*this->worldUpdateMutex);
 
+    math::Rand::SetSeed(math::Rand::GetSeed());
+    this->physicsEngine->SetSeed(math::Rand::GetSeed());
+
     this->ResetTime();
     this->ResetEntities(Base::BASE);
     for (std::vector<WorldPluginPtr>::iterator iter = this->plugins.begin();
@@ -969,11 +1057,16 @@ gazebo::common::Time World::GetStartTime() const
 //////////////////////////////////////////////////
 common::Time World::GetRealTime() const
 {
-  if (this->pause)
-    return (this->pauseStartTime - this->startTime) - this->realTimeOffset;
+  if (!util::LogPlay::Instance()->IsOpen())
+  {
+    if (this->pause)
+      return (this->pauseStartTime - this->startTime) - this->realTimeOffset;
+    else
+      return (common::Time::GetWallTime() - this->startTime) -
+        this->realTimeOffset;
+  }
   else
-    return (common::Time::GetWallTime() - this->startTime) -
-             this->realTimeOffset;
+    return this->logRealTime;
 }
 
 //////////////////////////////////////////////////
@@ -994,7 +1087,12 @@ void World::SetPaused(bool _p)
   }
 
   if (_p)
+  {
+    // This is also a good time to clear out the logging buffer.
+    util::LogRecord::Instance()->Notify();
+
     this->pauseStartTime = common::Time::GetWallTime();
+  }
   else
     this->realTimeOffset += common::Time::GetWallTime() - this->pauseStartTime;
 
@@ -1009,38 +1107,6 @@ void World::OnFactoryMsg(ConstFactoryPtr &_msg)
 }
 
 //////////////////////////////////////////////////
-void World::OnLogControl(ConstLogControlPtr &_data)
-{
-  if (_data->has_base_path() && !_data->base_path().empty())
-    common::LogRecord::Instance()->SetBasePath(_data->base_path());
-
-  if (_data->has_start() && _data->start())
-  {
-    if (common::LogRecord::Instance()->GetPaused())
-    {
-      common::LogRecord::Instance()->Start("bz2");
-    }
-    else
-    {
-      common::LogRecord::Instance()->Start("bz2");
-      common::LogRecord::Instance()->Add(this->GetName(), "state.log",
-          boost::bind(&World::OnLog, this, _1));
-    }
-  }
-  else if (_data->has_stop() && _data->stop())
-  {
-    common::LogRecord::Instance()->Stop();
-  }
-  else if (_data->has_paused())
-  {
-    common::LogRecord::Instance()->SetPaused(_data->paused());
-  }
-
-  // Output the new log status
-  this->PublishLogStatus();
-}
-
-//////////////////////////////////////////////////
 void World::OnControl(ConstWorldControlPtr &_data)
 {
   if (_data->has_pause())
@@ -1049,6 +1115,15 @@ void World::OnControl(ConstWorldControlPtr &_data)
   if (_data->has_step())
     this->OnStep();
 
+  if (_data->has_multi_step())
+  {
+    // stepWorld is a blocking call so set stepInc directly so that world stats
+    // will still be published
+    this->SetPaused(true);
+    boost::recursive_mutex::scoped_lock lock(*this->worldUpdateMutex);
+    this->stepInc = _data->multi_step();
+  }
+
   if (_data->has_seed())
   {
     math::Rand::SetSeed(_data->seed());
@@ -1133,7 +1208,7 @@ void World::BuildSceneMsg(msgs::Scene &_scene, BasePtr _entity)
 //////////////////////////////////////////////////
 /*void World::ModelUpdateTBB()
 {
-  tbb::parallel_for(tbb::blocked_range<size_t>(0, this->models.size(), 10),
+  tbb::parallel_for (tbb::blocked_range<size_t>(0, this->models.size(), 10),
       ModelUpdate_TBB(&this->models));
 }*/
 
@@ -1220,14 +1295,16 @@ void World::RemovePlugin(const std::string &_name)
 //////////////////////////////////////////////////
 void World::LoadPlugin(sdf::ElementPtr _sdf)
 {
-  std::string pluginName = _sdf->GetValueString("name");
-  std::string filename = _sdf->GetValueString("filename");
+  std::string pluginName = _sdf->Get<std::string>("name");
+  std::string filename = _sdf->Get<std::string>("filename");
   this->LoadPlugin(filename, pluginName, _sdf);
 }
 
 //////////////////////////////////////////////////
 void World::ProcessEntityMsgs()
 {
+  boost::mutex::scoped_lock lock(this->entityDeleteMutex);
+
   std::list<std::string>::iterator iter;
   for (iter = this->deleteEntity.begin();
        iter != this->deleteEntity.end(); ++iter)
@@ -1248,16 +1325,17 @@ void World::ProcessEntityMsgs()
     if (this->sdf->HasElement("model"))
     {
       sdf::ElementPtr childElem = this->sdf->GetElement("model");
-      while (childElem && childElem->GetValueString("name") != (*iter))
+      while (childElem && childElem->Get<std::string>("name") != (*iter))
         childElem = childElem->GetNextElement("model");
       if (childElem)
         this->sdf->RemoveChild(childElem);
     }
 
     this->rootElement->RemoveChild((*iter));
+    this->RemoveModel(*iter);
   }
 
-  if (this->deleteEntity.size() > 0)
+  if (!this->deleteEntity.empty())
   {
     this->EnableAllModels();
     this->deleteEntity.clear();
@@ -1267,6 +1345,7 @@ void World::ProcessEntityMsgs()
 //////////////////////////////////////////////////
 void World::ProcessRequestMsgs()
 {
+  boost::recursive_mutex::scoped_lock lock(*this->receiveMutex);
   msgs::Response response;
 
   std::list<msgs::Request>::iterator iter;
@@ -1299,6 +1378,7 @@ void World::ProcessRequestMsgs()
     }
     else if ((*iter).request() == "entity_delete")
     {
+      boost::mutex::scoped_lock lock2(this->entityDeleteMutex);
       this->deleteEntity.push_back((*iter).data());
     }
     else if ((*iter).request() == "entity_info")
@@ -1379,6 +1459,15 @@ void World::ProcessRequestMsgs()
       this->sceneMsg.SerializeToString(serializedData);
       response.set_type(sceneMsg.GetTypeName());
     }
+    else if ((*iter).request() == "spherical_coordinates_info")
+    {
+      msgs::SphericalCoordinates sphereCoordMsg;
+      msgs::Set(&sphereCoordMsg, *(this->sphericalCoordinates));
+
+      std::string *serializedData = response.mutable_serialized_data();
+      sphereCoordMsg.SerializeToString(serializedData);
+      response.set_type(sphereCoordMsg.GetTypeName());
+    }
     else
       send = false;
 
@@ -1394,6 +1483,7 @@ void World::ProcessRequestMsgs()
 //////////////////////////////////////////////////
 void World::ProcessModelMsgs()
 {
+  boost::recursive_mutex::scoped_lock lock(*this->receiveMutex);
   std::list<msgs::Model>::iterator iter;
   for (iter = this->modelMsgs.begin(); iter != this->modelMsgs.end(); ++iter)
   {
@@ -1410,13 +1500,32 @@ void World::ProcessModelMsgs()
     {
       model->ProcessMsg(*iter);
 
+      // May 30, 2013: The following code was removed because it has a
+      // major performance impact when dragging complex object via the GUI.
+      // This code also does not seem to be necessary, since can just
+      // publish the incoming changes instead of a full model message. We
+      // are leaving it temporarily in case we find a need for it.
+      //
       // Let all other subscribers know about the change
-      msgs::Model msg;
-      model->FillMsg(msg);
-      this->modelPub->Publish(msg);
+      // msgs::Model msg;
+      // model->FillMsg(msg);
+      // // FillMsg fills the visual components from initial sdf
+      // // but problem is that Visuals may have changed e.g. through ~/visual,
+      // // so don't publish them to subscribers.
+      // for (int i = 0; i < msg.link_size(); ++i)
+      // {
+      //   msg.mutable_link(i)->clear_visual();
+      //   for (int j = 0; j < msg.link(i).collision_size(); ++j)
+      //   {
+      //     msg.mutable_link(i)->mutable_collision(j)->clear_visual();
+      //   }
+      // }
+
+      this->modelPub->Publish(*iter);
     }
   }
-  if (this->modelMsgs.size())
+
+  if (!this->modelMsgs.empty())
   {
     this->EnableAllModels();
     this->modelMsgs.clear();
@@ -1426,146 +1535,163 @@ void World::ProcessModelMsgs()
 //////////////////////////////////////////////////
 void World::ProcessFactoryMsgs()
 {
+  std::list<sdf::ElementPtr> modelsToLoad;
   std::list<msgs::Factory>::iterator iter;
 
-  for (iter = this->factoryMsgs.begin();
-       iter != this->factoryMsgs.end(); ++iter)
   {
-    this->factorySDF->root->ClearElements();
-
-    if ((*iter).has_sdf() && !(*iter).sdf().empty())
-    {
-      // SDF Parsing happens here
-      if (!sdf::readString((*iter).sdf(), factorySDF))
-      {
-        gzerr << "Unable to read sdf string[" << (*iter).sdf() << "]\n";
-        continue;
-      }
-    }
-    else if ((*iter).has_sdf_filename() && !(*iter).sdf_filename().empty())
+    boost::recursive_mutex::scoped_lock lock(*this->receiveMutex);
+    for (iter = this->factoryMsgs.begin();
+        iter != this->factoryMsgs.end(); ++iter)
     {
-      std::string filename = common::ModelDatabase::Instance()->GetModelFile(
-          (*iter).sdf_filename());
+      this->factorySDF->root->ClearElements();
 
-      if (!sdf::readFile(filename, factorySDF))
+      if ((*iter).has_sdf() && !(*iter).sdf().empty())
       {
-        gzerr << "Unable to read sdf file.\n";
-        continue;
+        // SDF Parsing happens here
+        if (!sdf::readString((*iter).sdf(), factorySDF))
+        {
+          gzerr << "Unable to read sdf string[" << (*iter).sdf() << "]\n";
+          continue;
+        }
       }
-    }
-    else if ((*iter).has_clone_model_name())
-    {
-      ModelPtr model = this->GetModel((*iter).clone_model_name());
-      if (!model)
+      else if ((*iter).has_sdf_filename() && !(*iter).sdf_filename().empty())
       {
-        gzerr << "Unable to clone model[" << (*iter).clone_model_name()
-              << "]. Model not found.\n";
-        continue;
-      }
-
-      factorySDF->root->InsertElement(model->GetSDF()->Clone());
+        std::string filename = common::ModelDatabase::Instance()->GetModelFile(
+            (*iter).sdf_filename());
 
-      std::string newName = model->GetName() + "_clone";
-      int i = 0;
-      while (this->GetModel(newName))
-      {
-        newName = model->GetName() + "_clone_" +
-                  boost::lexical_cast<std::string>(i);
-        i++;
+        if (!sdf::readFile(filename, factorySDF))
+        {
+          gzerr << "Unable to read sdf file.\n";
+          continue;
+        }
       }
-
-      factorySDF->root->GetElement("model")->GetAttribute("name")->Set(newName);
-    }
-    else
-    {
-      gzerr << "Unable to load sdf from factory message."
-            << "No SDF or SDF filename specified.\n";
-      continue;
-    }
-
-    if ((*iter).has_edit_name())
-    {
-      BasePtr base = this->rootElement->GetByName((*iter).edit_name());
-      if (base)
+      else if ((*iter).has_clone_model_name())
       {
-        sdf::ElementPtr elem;
-        if (factorySDF->root->GetName() == "sdf")
-          elem = factorySDF->root->GetFirstElement();
-        else
-          elem = factorySDF->root;
-
-        base->UpdateParameters(elem);
-      }
-    }
-    else
-    {
-      bool isActor = false;
-      bool isModel = false;
-      bool isLight = false;
+        ModelPtr model = this->GetModel((*iter).clone_model_name());
+        if (!model)
+        {
+          gzerr << "Unable to clone model[" << (*iter).clone_model_name()
+            << "]. Model not found.\n";
+          continue;
+        }
 
-      sdf::ElementPtr elem = factorySDF->root;
+        factorySDF->root->InsertElement(model->GetSDF()->Clone());
 
-      if (elem->HasElement("world"))
-        elem = elem->GetElement("world");
+        std::string newName = model->GetName() + "_clone";
+        int i = 0;
+        while (this->GetModel(newName))
+        {
+          newName = model->GetName() + "_clone_" +
+            boost::lexical_cast<std::string>(i);
+          i++;
+        }
 
-      if (elem->HasElement("model"))
-      {
-        elem = elem->GetElement("model");
-        isModel = true;
-      }
-      else if (elem->HasElement("light"))
-      {
-        elem = elem->GetElement("light");
-        isLight = true;
-      }
-      else if (elem->HasElement("actor"))
-      {
-        elem = elem->GetElement("actor");
-        isActor = true;
+        factorySDF->root->GetElement("model")->GetAttribute("name")->Set(
+            newName);
       }
       else
       {
-        gzerr << "Unable to find a model, light, or actor in:\n";
-        factorySDF->root->PrintValues("");
+        gzerr << "Unable to load sdf from factory message."
+          << "No SDF or SDF filename specified.\n";
         continue;
       }
 
-      if (!elem)
+      if ((*iter).has_edit_name())
       {
-        gzerr << "Invalid SDF:";
-        factorySDF->root->PrintValues("");
-        continue;
-      }
-
-      elem->SetParent(this->sdf);
-      elem->GetParent()->InsertElement(elem);
-      if ((*iter).has_pose())
-        elem->GetElement("pose")->Set(msgs::Convert((*iter).pose()));
+        BasePtr base = this->rootElement->GetByName((*iter).edit_name());
+        if (base)
+        {
+          sdf::ElementPtr elem;
+          if (factorySDF->root->GetName() == "sdf")
+            elem = factorySDF->root->GetFirstElement();
+          else
+            elem = factorySDF->root;
 
-      if (isActor)
-      {
-        ActorPtr actor = this->LoadActor(elem, this->rootElement);
-        actor->Init();
+          base->UpdateParameters(elem);
+        }
       }
-      else if (isModel)
+      else
       {
-        ModelPtr model = this->LoadModel(elem, this->rootElement);
-        model->Init();
+        bool isActor = false;
+        bool isModel = false;
+        bool isLight = false;
 
-        model->LoadPlugins();
-      }
-      else if (isLight)
-      {
-        /// \TODO: Current broken. See Issue #67.
-        msgs::Light *lm = this->sceneMsg.add_light();
-        lm->CopyFrom(msgs::LightFromSDF(elem));
+        sdf::ElementPtr elem = factorySDF->root->Clone();
+
+        if (elem->HasElement("world"))
+          elem = elem->GetElement("world");
 
-        this->lightPub->Publish(*lm);
+        if (elem->HasElement("model"))
+        {
+          elem = elem->GetElement("model");
+          isModel = true;
+        }
+        else if (elem->HasElement("light"))
+        {
+          elem = elem->GetElement("light");
+          isLight = true;
+        }
+        else if (elem->HasElement("actor"))
+        {
+          elem = elem->GetElement("actor");
+          isActor = true;
+        }
+        else
+        {
+          gzerr << "Unable to find a model, light, or actor in:\n";
+          factorySDF->root->PrintValues("");
+          continue;
+        }
+
+        if (!elem)
+        {
+          gzerr << "Invalid SDF:";
+          factorySDF->root->PrintValues("");
+          continue;
+        }
+
+        elem->SetParent(this->sdf);
+        elem->GetParent()->InsertElement(elem);
+        if ((*iter).has_pose())
+          elem->GetElement("pose")->Set(msgs::Convert((*iter).pose()));
+
+        if (isActor)
+        {
+          ActorPtr actor = this->LoadActor(elem, this->rootElement);
+          actor->Init();
+        }
+        else if (isModel)
+        {
+          modelsToLoad.push_back(elem);
+        }
+        else if (isLight)
+        {
+          /// \TODO: Current broken. See Issue #67.
+          msgs::Light *lm = this->sceneMsg.add_light();
+          lm->CopyFrom(msgs::LightFromSDF(elem));
+
+          this->lightPub->Publish(*lm);
+        }
       }
     }
+
+    this->factoryMsgs.clear();
   }
 
-  this->factoryMsgs.clear();
+  for (std::list<sdf::ElementPtr>::iterator iter2 = modelsToLoad.begin();
+       iter2 != modelsToLoad.end(); ++iter2)
+  {
+    try
+    {
+      ModelPtr model = this->LoadModel(*iter2, this->rootElement);
+      model->Init();
+      model->LoadPlugins();
+    }
+    catch(...)
+    {
+      gzerr << "Loading model from factory message failed\n";
+    }
+  }
 }
 
 //////////////////////////////////////////////////
@@ -1602,15 +1728,17 @@ EntityPtr World::GetEntityBelowPoint(const math::Vector3 &_pt)
 void World::SetState(const WorldState &_state)
 {
   this->SetSimTime(_state.GetSimTime());
+  this->logRealTime = _state.GetRealTime();
 
-  for (unsigned int i = 0; i < _state.GetModelStateCount(); ++i)
+  const ModelState_M modelStates = _state.GetModelStates();
+  for (ModelState_M::const_iterator iter = modelStates.begin();
+       iter != modelStates.end(); ++iter)
   {
-    ModelState modelState = _state.GetModelState(i);
-    ModelPtr model = this->GetModel(modelState.GetName());
+    ModelPtr model = this->GetModel(iter->second.GetName());
     if (model)
-      model->SetState(modelState);
+      model->SetState(iter->second);
     else
-      gzerr << "Unable to find model[" << modelState.GetName() << "]\n";
+      gzerr << "Unable to find model[" << iter->second.GetName() << "]\n";
   }
 }
 
@@ -1653,15 +1781,21 @@ std::string World::StripWorldName(const std::string &_name) const
 //////////////////////////////////////////////////
 void World::EnableAllModels()
 {
-  for (unsigned int i = 0; i < this->GetModelCount(); ++i)
-    this->GetModel(i)->SetEnabled(true);
+  for (Model_V::iterator iter = this->models.begin();
+       iter != this->models.end(); ++iter)
+  {
+    (*iter)->SetEnabled(true);
+  }
 }
 
 //////////////////////////////////////////////////
 void World::DisableAllModels()
 {
-  for (unsigned int i = 0; i < this->GetModelCount(); ++i)
-    this->GetModel(i)->SetEnabled(false);
+  for (Model_V::iterator iter = this->models.begin();
+       iter != this->models.end(); ++iter)
+  {
+    (*iter)->SetEnabled(false);
+  }
 }
 
 //////////////////////////////////////////////////
@@ -1671,14 +1805,16 @@ void World::UpdateStateSDF()
   sdf::ElementPtr stateElem = this->sdf->GetElement("state");
   stateElem->ClearElements();
 
-  this->prevStates[(this->stateToggle + 1) % 2].FillSDF(stateElem);
+  WorldState currentState(shared_from_this());
+  currentState.FillSDF(stateElem);
 }
 
 //////////////////////////////////////////////////
 bool World::OnLog(std::ostringstream &_stream)
 {
+  int bufferIndex = this->currentStateBuffer;
   // Save the entire state when its the first call to OnLog.
-  if (common::LogRecord::Instance()->GetFirstUpdate())
+  if (util::LogRecord::Instance()->GetFirstUpdate())
   {
     this->UpdateStateSDF();
     _stream << "<sdf version ='";
@@ -1687,13 +1823,46 @@ bool World::OnLog(std::ostringstream &_stream)
     _stream << this->sdf->ToString("");
     _stream << "</sdf>\n";
   }
-  else if (this->states.size() >= 1)
+  else if (this->states[bufferIndex].size() >= 1)
   {
-    // Get the difference from the previous state.
-    _stream << "<sdf version='" << SDF_VERSION << "'>";
-    _stream << this->states[0];
-    _stream << "</sdf>";
-    this->states.pop_front();
+    {
+      boost::mutex::scoped_lock lock(this->logBufferMutex);
+      this->currentStateBuffer ^= 1;
+    }
+    for (std::deque<WorldState>::iterator iter =
+        this->states[bufferIndex].begin();
+        iter != this->states[bufferIndex].end(); ++iter)
+    {
+      _stream << "<sdf version='" << SDF_VERSION << "'>" << *iter << "</sdf>";
+    }
+
+    this->states[bufferIndex].clear();
+  }
+
+  // Logging has stopped. Wait for log worker to finish. Output last bit
+  // of data, and reset states.
+  if (!util::LogRecord::Instance()->GetRunning())
+  {
+    boost::mutex::scoped_lock lock(this->logBufferMutex);
+
+    // Output any data that may have been pushed onto the queue
+    for (size_t i = 0; i < this->states[this->currentStateBuffer^1].size(); ++i)
+    {
+      _stream << "<sdf version='" << SDF_VERSION << "'>"
+        << this->states[this->currentStateBuffer^1][i] << "</sdf>";
+    }
+    for (size_t i = 0; i < this->states[this->currentStateBuffer].size(); ++i)
+    {
+      _stream << "<sdf version='" << SDF_VERSION << "'>"
+        << this->states[this->currentStateBuffer][i] << "</sdf>";
+    }
+
+    // Clear everything.
+    this->states[0].clear();
+    this->states[1].clear();
+    this->stateToggle = 0;
+    this->prevStates[0] = WorldState();
+    this->prevStates[1] = WorldState();
   }
 
   return true;
@@ -1702,37 +1871,55 @@ bool World::OnLog(std::ostringstream &_stream)
 //////////////////////////////////////////////////
 void World::ProcessMessages()
 {
-  boost::recursive_mutex::scoped_lock lock(*this->receiveMutex);
-  msgs::Pose *poseMsg;
-
-  if (this->posePub && this->posePub->HasConnections() &&
-      this->publishModelPoses.size() > 0)
   {
-    msgs::Pose_V msg;
+    boost::recursive_mutex::scoped_lock lock(*this->receiveMutex);
 
-    for (std::set<ModelPtr>::iterator iter = this->publishModelPoses.begin();
-        iter != this->publishModelPoses.end(); ++iter)
+    if ((this->posePub && this->posePub->HasConnections()) ||
+        (this->poseLocalPub && this->poseLocalPub->HasConnections()))
     {
-      poseMsg = msg.add_pose();
+      msgs::PosesStamped msg;
+
+      // Time stamp this PosesStamped message
+      msgs::Set(msg.mutable_time(), this->GetSimTime());
 
-      // Publish the model's relative pose
-      poseMsg->set_name((*iter)->GetScopedName());
-      msgs::Set(poseMsg, (*iter)->GetRelativePose());
+      if (!this->publishModelPoses.empty())
+      {
+        for (std::set<ModelPtr>::iterator iter =
+            this->publishModelPoses.begin();
+            iter != this->publishModelPoses.end(); ++iter)
+        {
+          msgs::Pose *poseMsg = msg.add_pose();
+
+          // Publish the model's relative pose
+          poseMsg->set_name((*iter)->GetScopedName());
+          poseMsg->set_id((*iter)->GetId());
+          msgs::Set(poseMsg, (*iter)->GetRelativePose());
+
+          // Publish each of the model's children relative poses
+          Link_V links = (*iter)->GetLinks();
+          for (Link_V::iterator linkIter = links.begin();
+              linkIter != links.end(); ++linkIter)
+          {
+            poseMsg = msg.add_pose();
+            poseMsg->set_name((*linkIter)->GetScopedName());
+            poseMsg->set_id((*linkIter)->GetId());
+            msgs::Set(poseMsg, (*linkIter)->GetRelativePose());
+          }
+        }
+
+        if (this->posePub && this->posePub->HasConnections())
+          this->posePub->Publish(msg);
+      }
 
-      // Publish each of the model's children relative poses
-      Link_V links = (*iter)->GetLinks();
-      for (Link_V::iterator linkIter = links.begin();
-          linkIter != links.end(); ++linkIter)
+      if (this->poseLocalPub && this->poseLocalPub->HasConnections())
       {
-        poseMsg = msg.add_pose();
-        poseMsg->set_name((*linkIter)->GetScopedName());
-        msgs::Set(poseMsg, (*linkIter)->GetRelativePose());
+        // rendering::Scene depends on this timestamp, which is used by
+        // rendering sensors to time stamp their data
+        this->poseLocalPub->Publish(msg);
       }
     }
-    this->posePub->Publish(msg);
+    this->publishModelPoses.clear();
   }
-  this->publishModelPoses.clear();
-
 
   if (common::Time::GetWallTime() - this->prevProcessMsgsTime >
       this->processMsgsPeriod)
@@ -1754,7 +1941,8 @@ void World::PublishWorldStats()
   this->worldStatsMsg.set_iterations(this->iterations);
   this->worldStatsMsg.set_paused(this->IsPaused());
 
-  this->statPub->Publish(this->worldStatsMsg);
+  if (this->statPub && this->statPub->HasConnections())
+    this->statPub->Publish(this->worldStatsMsg);
   this->prevStatTime = common::Time::GetWallTime();
 }
 
@@ -1774,46 +1962,96 @@ void World::PublishModelPose(physics::ModelPtr _model)
 }
 
 //////////////////////////////////////////////////
-void World::PublishLogStatus()
+void World::LogWorker()
 {
-  msgs::LogStatus msg;
-  unsigned int size = 0;
+  boost::mutex::scoped_lock lock(this->logMutex);
+
+  WorldPtr self = shared_from_this();
+  this->logPrevIteration = this->iterations;
+
+  GZ_ASSERT(self, "Self pointer to World is invalid");
 
-  // Set the time of the status message
-  msgs::Set(msg.mutable_sim_time(),
-            common::LogRecord::Instance()->GetRunTime());
+  while (!this->stop)
+  {
+    int currState = (this->stateToggle + 1) % 2;
 
-  // Set the log recording base path name
-  msg.mutable_log_file()->set_base_path(
-      common::LogRecord::Instance()->GetBasePath());
+    this->prevStates[currState].Load(self);
+    WorldState diffState = this->prevStates[currState] -
+      this->prevStates[this->stateToggle];
+    this->logPrevIteration = this->iterations;
 
-  // Get the full name of the log file
-  msg.mutable_log_file()->set_full_path(
-    common::LogRecord::Instance()->GetFilename(this->GetName()));
+    if (!diffState.IsZero())
+    {
+      this->stateToggle = currState;
+      {
+        // Store the entire current state (instead of the diffState). A slow
+        // moving link may never be captured if only diff state is recorded.
+        boost::mutex::scoped_lock bLock(this->logBufferMutex);
+        this->states[this->currentStateBuffer].push_back(
+            this->prevStates[currState]);
+        // Tell the logger to update, once the number of states exceeds 1000
+        if (this->states[this->currentStateBuffer].size() > 1000)
+          util::LogRecord::Instance()->Notify();
+      }
+    }
 
-  // Set the URI of th log file
-  msg.mutable_log_file()->set_uri(transport::Connection::GetLocalHostname());
+    this->logContinueCondition.notify_all();
 
-  // Get the size of the log file
-  size = common::LogRecord::Instance()->GetFileSize(this->GetName());
+    // Wait until there is work to be done.
+    this->logCondition.wait(lock);
+  }
+
+  // Make sure nothing is blocked by this thread.
+  this->logContinueCondition.notify_all();
+}
 
-  if (size < 1000)
-    msg.mutable_log_file()->set_size_units(msgs::LogStatus::LogFile::BYTES);
-  else if (size < 1e6)
+/////////////////////////////////////////////////
+uint32_t World::GetIterations() const
+{
+  return this->iterations;
+}
+
+//////////////////////////////////////////////////
+void World::RemoveModel(const std::string &_name)
+{
+  for (Model_V::iterator iter = this->models.begin();
+       iter != this->models.end(); ++iter)
   {
-    msg.mutable_log_file()->set_size(size / 1.0e3);
-    msg.mutable_log_file()->set_size_units(msgs::LogStatus::LogFile::K_BYTES);
+    if ((*iter)->GetName() == _name || (*iter)->GetScopedName() == _name)
+    {
+      this->models.erase(iter);
+      break;
+    }
   }
-  else if (size < 1e9)
+}
+
+/////////////////////////////////////////////////
+void World::OnLightMsg(ConstLightPtr &_msg)
+{
+  boost::recursive_mutex::scoped_lock lock(*this->receiveMutex);
+
+  bool lightExists = false;
+
+  // Find the light by name, and copy the new parameters.
+  for (int i = 0; i < this->sceneMsg.light_size(); ++i)
   {
-    msg.mutable_log_file()->set_size(size / 1.0e6);
-    msg.mutable_log_file()->set_size_units(msgs::LogStatus::LogFile::M_BYTES);
+    if (this->sceneMsg.light(i).name() == _msg->name())
+    {
+      lightExists = true;
+      this->sceneMsg.mutable_light(i)->CopyFrom(*_msg);
+      break;
+    }
   }
-  else
+
+  // Add a new light if the light doesn't exist.
+  if (!lightExists)
   {
-    msg.mutable_log_file()->set_size(size / 1.0e9);
-    msg.mutable_log_file()->set_size_units(msgs::LogStatus::LogFile::G_BYTES);
+    this->sceneMsg.add_light()->CopyFrom(*_msg);
   }
+}
 
-  this->logStatusPub->Publish(msg);
+/////////////////////////////////////////////////
+msgs::Scene World::GetSceneMsg() const
+{
+  return this->sceneMsg;
 }
diff --git a/gazebo/physics/World.hh b/gazebo/physics/World.hh
index 8a0f4b4..8f363e4 100644
--- a/gazebo/physics/World.hh
+++ b/gazebo/physics/World.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,6 @@
  * limitations under the License.
  *
 */
-/* Desc: The world; all models are collected here
- * Author: Andrew Howard and Nate Koenig
- * Date: 3 Apr 2007
- */
-
 #ifndef _WORLD_HH_
 #define _WORLD_HH_
 
@@ -27,9 +22,12 @@
 #include <set>
 #include <deque>
 #include <string>
+#include <boost/thread.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/shared_ptr.hpp>
 
+#include <sdf/sdf.hh>
+
 #include "gazebo/transport/TransportTypes.hh"
 
 #include "gazebo/msgs/msgs.hh"
@@ -41,14 +39,7 @@
 #include "gazebo/physics/Base.hh"
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/physics/WorldState.hh"
-#include "gazebo/sdf/sdf.hh"
-
-namespace boost
-{
-  class thread;
-  class mutex;
-  class recursive_mutex;
-}
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -65,10 +56,9 @@ namespace gazebo
     /// (links, joints, sensors, plugins, etc), and WorldPlugin instances.
     /// Many core function are also handled in the World, including physics
     /// update, model updates, and message processing.
-    class World : public boost::enable_shared_from_this<World>
+    class GAZEBO_VISIBLE World : public boost::enable_shared_from_this<World>
     {
       /// \brief Constructor.
-      ///
       /// Constructor for the World. Must specify a unique name.
       /// \param[in] _name Name of the world.
       public: explicit World(const std::string &_name = "");
@@ -77,38 +67,40 @@ namespace gazebo
       public: ~World();
 
       /// \brief Load the world using SDF parameters.
-      ///
       /// Load a world from and SDF pointer.
       /// \param[in] _sdf SDF parameters.
       public: void Load(sdf::ElementPtr _sdf);
 
       /// \brief Save a world to a file.
-      ///
       /// Save the current world and its state to a file.
       /// \param[in] _filename Name of the file to save into.
       public: void Save(const std::string &_filename);
 
       /// \brief Initialize the world.
-      ///
       /// This is called after Load.
       public: void Init();
 
       /// \brief Run the world in a thread.
-      ///
       /// Run the update loop.
-      public: void Run();
+      /// \param[in] _iterations Run for this many iterations, then stop.
+      /// A value of zero disables run stop.
+      public: void Run(unsigned int _iterations = 0);
+
+      /// \brief Return the running state of the world.
+      /// \return True if the world is running.
+      public: bool GetRunning() const;
 
       /// \brief Stop the world.
-      ///
       /// Stop the update loop.
       public: void Stop();
 
       /// \brief Finalize the world.
-      ///
       /// Call this function to tear-down the world.
       public: void Fini();
 
       /// \brief Remove all entities from the world.
+      /// This function has delayed effect. Models are cleared at the end
+      /// of the current update iteration.
       public: void Clear();
 
       /// \brief Get the name of the world.
@@ -116,17 +108,19 @@ namespace gazebo
       public: std::string GetName() const;
 
       /// \brief Return the physics engine.
-      ///
       /// Get a pointer to the physics engine used by the world.
       /// \return Pointer to the physics engine.
       public: PhysicsEnginePtr GetPhysicsEngine() const;
 
+      /// \brief Return the spherical coordinates converter.
+      /// \return Pointer to the spherical coordinates converter.
+      public: common::SphericalCoordinatesPtr GetSphericalCoordinates() const;
+
       /// \brief Get the number of models.
       /// \return The number of models in the World.
       public: unsigned int GetModelCount() const;
 
       /// \brief Get a model based on an index.
-      ///
       /// Get a Model using an index, where index must be greater than zero
       /// and less than World::GetModelCount()
       /// \param[in] _index The index of the model [0..GetModelCount)
@@ -138,7 +132,6 @@ namespace gazebo
       public: Model_V GetModels() const;
 
       /// \brief Reset with options.
-      ///
       /// The _type parameter specifies which type of eneities to reset. See
       /// Base::EntityType.
       /// \param[in] _type The type of reset.
@@ -151,13 +144,11 @@ namespace gazebo
       public: void Reset();
 
       /// \brief Get the selected Entity.
-      ///
       /// The selected entity is set via the GUI.
       /// \return A point to the Entity, NULL if nothing is selected.
       public: EntityPtr GetSelectedEntity() const;
 
       /// \brief Print Entity tree.
-      ///
       /// Prints alls the entities to stdout.
       public: void PrintEntityTree();
 
@@ -191,7 +182,6 @@ namespace gazebo
       public: void SetPaused(bool _p);
 
       /// \brief Get an element by name.
-      ///
       /// Searches the list of entities, and return a pointer to the model
       /// with a matching _name.
       /// \param[in] _name The name of the Model to find.
@@ -199,7 +189,6 @@ namespace gazebo
       public: BasePtr GetByName(const std::string &_name);
 
       /// \brief Get a model by name.
-      ///
       /// This function is the same as GetByName, but limits the search to
       /// only models.
       /// \param[in] _name The name of the Model to find.
@@ -207,22 +196,22 @@ namespace gazebo
       public: ModelPtr GetModel(const std::string &_name);
 
       /// \brief Get a pointer to an Entity based on a name.
-      ///
       /// This function is the same as GetByName, but limits the search to
       /// only Entities.
       /// \param[in] _name The name of the Entity to find.
       /// \return A pointer to the Entity, or NULL if no Entity was found.
       public: EntityPtr GetEntity(const std::string &_name);
 
-      /// \brief Get the nearest model below a point.
-      ///
+      /// \brief Get the nearest model below and not encapsulating a point.
+      /// Only objects below the start point can be returned. Any object
+      /// that encapsulates the start point can not be returned from this
+      /// function.
       /// This function makes use of World::GetEntityBelowPoint.
       /// \param[in] _pt The 3D point to search below.
       /// \return A pointer to nearest Model, NULL if none is found.
       public: ModelPtr GetModelBelowPoint(const math::Vector3 &_pt);
 
       /// \brief Get the nearest entity below a point.
-      ///
       /// Projects a Ray down (-Z axis) starting at the given point. The
       /// first entity hit by the Ray is returned.
       /// \param[in] _pt The 3D point to search below
@@ -234,19 +223,16 @@ namespace gazebo
       public: void SetState(const WorldState &_state);
 
       /// \brief Insert a model from an SDF file.
-      ///
       /// Spawns a model into the world base on and SDF file.
       /// \param[in] _sdfFilename The name of the SDF file (including path).
       public: void InsertModelFile(const std::string &_sdfFilename);
 
       /// \brief Insert a model from an SDF string.
-      ///
       /// Spawns a model into the world base on and SDF string.
       /// \param[in] _sdfString A string containing valid SDF markup.
       public: void InsertModelString(const std::string &_sdfString);
 
       /// \brief Insert a model using SDF.
-      ///
       /// Spawns a model into the world base on and SDF object.
       /// \param[in] _sdf A reference to an SDF object.
       public: void InsertModelSDF(const sdf::SDF &_sdf);
@@ -257,20 +243,23 @@ namespace gazebo
       public: std::string StripWorldName(const std::string &_name) const;
 
       /// \brief Enable all links in all the models.
-      ///
       /// Enable is a physics concept. Enabling means that the physics
       /// engine should update an entity.
       public: void EnableAllModels();
 
       /// \brief Disable all links in all the models.
-      ///
       /// Disable is a physics concept. Disabling means that the physics
       /// engine should not update an entity.
       public: void DisableAllModels();
 
-      /// \brief Step callback.
+      /// \brief Step the world forward in time.
       /// \param[in] _steps The number of steps the World should take.
-      public: void StepWorld(int _steps);
+      /// \note Deprecated. Please use World::Step
+      public: void StepWorld(int _steps) GAZEBO_DEPRECATED(3.0);
+
+      /// \brief Step the world forward in time.
+      /// \param[in] _steps The number of steps the World should take.
+      public: void Step(unsigned int _steps);
 
       /// \brief Load a plugin
       /// \param[in] _filename The filename of the plugin.
@@ -306,16 +295,27 @@ namespace gazebo
       /// \return True if World::Load has completed.
       public: bool IsLoaded() const;
 
+      /// \brief Remove all entities from the world. Implementation of
+      /// World::Clear
+      public: void ClearModels();
+
       /// \brief Publish pose updates for a model.
       /// This list of models to publish is processed and cleared once every
       /// iteration.
       /// \param[in] _model Pointer to the model to publish.
       public: void PublishModelPose(physics::ModelPtr _model);
 
+      /// \brief Get the total number of iterations.
+      /// \return Number of iterations that simulation has taken.
+      public: uint32_t GetIterations() const;
+
+      /// \brief Get the current scene in message form.
+      /// \return The scene state as a protobuf message.
+      public: msgs::Scene GetSceneMsg() const;
+
       /// \cond
       /// This is an internal function.
       /// \brief Get a model by id.
-      ///
       /// Each Entity has a unique ID, this function finds a Model with
       /// a passed in _id.
       /// \param[in] _id The id of the Model
@@ -374,10 +374,6 @@ namespace gazebo
       /// \param[in] _data The world control message.
       private: void OnControl(ConstWorldControlPtr &_data);
 
-      /// \brief Called when a log control message is received.
-      /// \param[in] _data The log control message.
-      private: void OnLogControl(ConstLogControlPtr &_data);
-
       /// \brief Called when a request message is received.
       /// \param[in] _msg The request message.
       private: void OnRequest(ConstRequestPtr &_msg);
@@ -407,7 +403,7 @@ namespace gazebo
       /// \brief TBB version of model updating.
       private: void ModelUpdateTBB();
 
-      /// \brief Single loop verison of model updating.
+      /// \brief Single loop version of model updating.
       private: void ModelUpdateSingleLoop();
 
       /// \brief Helper function to load a plugin from SDF.
@@ -431,6 +427,11 @@ namespace gazebo
       /// Must only be called from the World::ProcessMessages function.
       private: void ProcessFactoryMsgs();
 
+      /// \brief Remove a model from the cached list of models.
+      /// This does not delete the model.
+      /// \param[in] _name Name of the model to remove.
+      private: void RemoveModel(const std::string &_name);
+
       /// \brief Process all received model messages.
       /// Must only be called from the World::ProcessMessages function.
       private: void ProcessModelMsgs();
@@ -444,8 +445,12 @@ namespace gazebo
       /// \brief Publish the world stats message.
       private: void PublishWorldStats();
 
-      /// \brief Publish log status message.
-      private: void PublishLogStatus();
+      /// \brief Thread function for logging state data.
+      private: void LogWorker();
+
+      /// \brief Callback when a light message is received.
+      /// \param[in] _msg Pointer to the light message.
+      private: void OnLightMsg(ConstLightPtr &_msg);
 
       /// \brief For keeping track of time step throttling.
       private: common::Time prevStepWallTime;
@@ -453,6 +458,9 @@ namespace gazebo
       /// \brief Pointer the physics engine.
       private: PhysicsEnginePtr physicsEngine;
 
+      /// \brief Pointer the spherical coordinates data.
+      private: common::SphericalCoordinatesPtr sphericalCoordinates;
+
       /// \brief The root of all entities in the world.
       private: BasePtr rootElement;
 
@@ -465,9 +473,6 @@ namespace gazebo
       /// \brief The entity currently selected by the user.
       private: EntityPtr selectedEntity;
 
-      /// \brief Incoming message buffer.
-      private: std::vector<google::protobuf::Message> messages;
-
       /// \brief Name of the world.
       private: std::string name;
 
@@ -516,21 +521,21 @@ namespace gazebo
       /// \brief Publisher for pose messages.
       private: transport::PublisherPtr posePub;
 
+      /// \brief Publisher for local pose messages.
+      private: transport::PublisherPtr poseLocalPub;
+
       /// \brief Subscriber to world control messages.
       private: transport::SubscriberPtr controlSub;
 
-      /// \brief Subscriber to log control messages.
-      private: transport::SubscriberPtr logControlSub;
-
-      /// \brief Publisher of log status messages.
-      private: transport::PublisherPtr logStatusPub;
-
       /// \brief Subscriber to factory messages.
       private: transport::SubscriberPtr factorySub;
 
       /// \brief Subscriber to joint messages.
       private: transport::SubscriberPtr jointSub;
 
+      /// \brief Subscriber to light messages.
+      private: transport::SubscriberPtr lightSub;
+
       /// \brief Subscriber to model messages.
       private: transport::SubscriberPtr modelSub;
 
@@ -546,9 +551,6 @@ namespace gazebo
       /// \brief Function pointer to the model update function.
       private: void (World::*modelUpdateFunc)();
 
-      /// \brief Period used to send out world statistics.
-      private: common::Time statPeriod;
-
       /// \brief Last time a world statistics message was sent.
       private: common::Time prevStatTime;
 
@@ -637,8 +639,12 @@ namespace gazebo
       /// \brief Period over which messages should be processed.
       private: common::Time processMsgsPeriod;
 
-      /// \brief Buffer of states.
-      private: std::deque<WorldState> states;
+      /// \brief Alternating buffer of states.
+      private: std::deque<WorldState> states[2];
+
+      /// \brief Keep track of current state buffer being updated
+      private: int currentStateBuffer;
+
       private: WorldState prevStates[2];
       private: int stateToggle;
 
@@ -657,6 +663,44 @@ namespace gazebo
 
       /// \brief The number of simulation iterations.
       private: uint64_t iterations;
+
+      /// \brief The number of simulation iterations to take before stopping.
+      private: uint64_t stopIterations;
+
+      /// \brief Condition used for log worker.
+      private: boost::condition_variable logCondition;
+
+      /// \brief Condition used to guarantee the log worker thread doesn't
+      /// skip an interation.
+      private: boost::condition_variable logContinueCondition;
+
+      /// \brief Last iteration recorded by the log worker thread.
+      private: uint64_t logPrevIteration;
+
+      /// \brief Real time value set from a log file.
+      private: common::Time logRealTime;
+
+      /// \brief Mutex to protect the log worker thread.
+      private: boost::mutex logMutex;
+
+      /// \brief Mutex to protect the log state buffers
+      private: boost::mutex logBufferMutex;
+
+      /// \brief Mutex to protect the deleteEntity list.
+      private: boost::mutex entityDeleteMutex;
+
+      /// \brief Worker thread for logging.
+      private: boost::thread *logThread;
+
+      /// \brief A cached list of models. This is here for performance.
+      private: Model_V models;
+
+      /// \todo In gazebo 3.0 this should be move to the proper section.
+      /// \brief Run the world. This call blocks.
+      /// Run the update loop.
+      /// \param[in] _iterations Run for this many iterations, then stop.
+      /// A value of zero disables run stop.
+      public: void RunBlocking(unsigned int _iterations = 0);
     };
     /// \}
   }
diff --git a/gazebo/physics/WorldState.cc b/gazebo/physics/WorldState.cc
index 308e93f..a8bf508 100644
--- a/gazebo/physics/WorldState.cc
+++ b/gazebo/physics/WorldState.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  * Author: Nate Koenig
  */
 
+#include "gazebo/common/Console.hh"
 #include "gazebo/common/Exception.hh"
 #include "gazebo/physics/World.hh"
 #include "gazebo/physics/Model.hh"
@@ -34,7 +35,7 @@ WorldState::WorldState()
 
 /////////////////////////////////////////////////
 WorldState::WorldState(const WorldPtr _world)
-  : State(_world->GetName(), _world->GetSimTime(), _world->GetRealTime())
+  : State(_world->GetName(), _world->GetRealTime(), _world->GetSimTime())
 {
   this->world = _world;
 
@@ -43,7 +44,8 @@ WorldState::WorldState(const WorldPtr _world)
   for (Model_V::const_iterator iter = models.begin();
        iter != models.end(); ++iter)
   {
-    this->modelStates.push_back(ModelState(*iter));
+    this->modelStates.insert(std::make_pair((*iter)->GetName(),
+          ModelState(*iter, this->realTime, this->simTime)));
   }
 }
 
@@ -62,13 +64,43 @@ WorldState::~WorldState()
 }
 
 /////////////////////////////////////////////////
+void WorldState::Load(const WorldPtr _world)
+{
+  this->world = _world;
+  this->name = _world->GetName();
+  this->wallTime = common::Time::GetWallTime();
+  this->simTime = _world->GetSimTime();
+  this->realTime = _world->GetRealTime();
+
+  // Add a state for all the models
+  Model_V models = _world->GetModels();
+  for (Model_V::const_iterator iter = models.begin();
+       iter != models.end(); ++iter)
+  {
+    this->modelStates[(*iter)->GetName()].Load(*iter, this->realTime,
+        this->simTime);
+  }
+
+  // Remove models that no longer exist. We determine this by check the time
+  // stamp on each model.
+  for (ModelState_M::iterator iter = this->modelStates.begin();
+       iter != this->modelStates.end();)
+  {
+    if (iter->second.GetRealTime() != this->realTime)
+      this->modelStates.erase(iter++);
+    else
+      ++iter;
+  }
+}
+
+/////////////////////////////////////////////////
 void WorldState::Load(const sdf::ElementPtr _elem)
 {
   // Copy the name and time information
-  this->name = _elem->GetValueString("world_name");
-  this->simTime = _elem->GetValueTime("sim_time");
-  this->wallTime = _elem->GetValueTime("wall_time");
-  this->realTime = _elem->GetValueTime("real_time");
+  this->name = _elem->Get<std::string>("world_name");
+  this->simTime = _elem->Get<common::Time>("sim_time");
+  this->wallTime = _elem->Get<common::Time>("wall_time");
+  this->realTime = _elem->Get<common::Time>("real_time");
 
   // Add the model states
   this->modelStates.clear();
@@ -78,7 +110,12 @@ void WorldState::Load(const sdf::ElementPtr _elem)
 
     while (childElem)
     {
-      this->modelStates.push_back(ModelState(childElem));
+      std::string modelName = childElem->Get<std::string>("name");
+      this->modelStates.insert(std::make_pair(
+            modelName, ModelState(childElem)));
+      this->modelStates[modelName].SetSimTime(this->simTime);
+      this->modelStates[modelName].SetWallTime(this->wallTime);
+      this->modelStates[modelName].SetRealTime(this->realTime);
       childElem = childElem->GetNextElement("model");
     }
   }
@@ -91,39 +128,40 @@ void WorldState::SetWorld(const WorldPtr _world)
 }
 
 /////////////////////////////////////////////////
-const std::vector<ModelState> &WorldState::GetModelStates() const
+const ModelState_M &WorldState::GetModelStates() const
 {
   return this->modelStates;
 }
 
 /////////////////////////////////////////////////
-unsigned int WorldState::GetModelStateCount() const
+ModelState_M WorldState::GetModelStates(const boost::regex &_regex) const
 {
-  return this->modelStates.size();
+  ModelState_M result;
+
+  // Search for matching link names
+  for (ModelState_M::const_iterator iter = this->modelStates.begin();
+       iter != this->modelStates.end(); ++iter)
+  {
+    if (boost::regex_match(iter->first, _regex))
+      result.insert(std::make_pair(iter->first, iter->second));
+  }
+
+  return result;
 }
 
 /////////////////////////////////////////////////
-ModelState WorldState::GetModelState(unsigned int _index) const
+unsigned int WorldState::GetModelStateCount() const
 {
-  // Check to see if the _index is valid.
-  if (_index < this->modelStates.size())
-    return this->modelStates[_index];
-  else
-    gzerr << "Index is out of range\n";
-
-  return ModelState();
+  return this->modelStates.size();
 }
 
 /////////////////////////////////////////////////
 ModelState WorldState::GetModelState(const std::string &_modelName) const
 {
   // Search for the model name
-  for (std::vector<ModelState>::const_iterator iter = this->modelStates.begin();
-       iter != this->modelStates.end(); ++iter)
-  {
-    if ((*iter).GetName() == _modelName)
-      return *iter;
-  }
+  ModelState_M::const_iterator iter = this->modelStates.find(_modelName);
+  if (iter != this->modelStates.end())
+    return iter->second;
 
   // Throw exception if the model name doesn't exist.
   gzthrow("Invalid model name[" + _modelName + "].");
@@ -134,12 +172,9 @@ ModelState WorldState::GetModelState(const std::string &_modelName) const
 bool WorldState::HasModelState(const std::string &_modelName) const
 {
   // Search for the model name
-  for (std::vector<ModelState>::const_iterator iter = this->modelStates.begin();
-       iter != this->modelStates.end(); ++iter)
-  {
-    if ((*iter).GetName() == _modelName)
-      return true;
-  }
+  ModelState_M::const_iterator iter = this->modelStates.find(_modelName);
+  if (iter != this->modelStates.end())
+    return true;
 
   return false;
 }
@@ -149,10 +184,10 @@ bool WorldState::IsZero() const
 {
   bool result = this->insertions.size() == 0 && this->deletions.size() == 0;
 
-  for (std::vector<ModelState>::const_iterator iter = this->modelStates.begin();
+  for (ModelState_M::const_iterator iter = this->modelStates.begin();
        iter != this->modelStates.end() && result; ++iter)
   {
-    result = result && (*iter).IsZero();
+    result = result && iter->second.IsZero();
   }
 
   return result;
@@ -170,10 +205,11 @@ WorldState &WorldState::operator=(const WorldState &_state)
   this->deletions.clear();
 
   // Copy the model states.
-  for (std::vector<ModelState>::const_iterator iter =
+  for (ModelState_M::const_iterator iter =
        _state.modelStates.begin(); iter != _state.modelStates.end(); ++iter)
   {
-    this->modelStates.push_back(ModelState(*iter));
+    this->modelStates.insert(std::make_pair(iter->first,
+          ModelState(iter->second)));
   }
 
   // Copy the insertions
@@ -198,31 +234,32 @@ WorldState WorldState::operator-(const WorldState &_state) const
   result.wallTime = this->wallTime;
 
   // Subtract the model states.
-  for (std::vector<ModelState>::const_iterator iter =
+  for (ModelState_M::const_iterator iter =
        _state.modelStates.begin(); iter != _state.modelStates.end(); ++iter)
   {
-    if (this->HasModelState((*iter).GetName()))
+    if (this->HasModelState(iter->second.GetName()))
     {
-      ModelState state = this->GetModelState((*iter).GetName()) - *iter;
+      ModelState state = this->GetModelState(iter->second.GetName()) -
+        iter->second;
 
       if (!state.IsZero())
       {
-        result.modelStates.push_back(state);
+        result.modelStates.insert(std::make_pair(state.GetName(), state));
       }
     }
     else
     {
-      result.deletions.push_back((*iter).GetName());
+      result.deletions.push_back(iter->second.GetName());
     }
   }
 
   // Add in the new model states
-  for (std::vector<ModelState>::const_iterator iter =
+  for (ModelState_M::const_iterator iter =
        this->modelStates.begin(); iter != this->modelStates.end(); ++iter)
   {
-    if (!_state.HasModelState((*iter).GetName()) && this->world)
+    if (!_state.HasModelState(iter->second.GetName()) && this->world)
     {
-      ModelPtr model = this->world->GetModel((*iter).GetName());
+      ModelPtr model = this->world->GetModel(iter->second.GetName());
       result.insertions.push_back(model->GetSDF()->ToString(""));
     }
   }
@@ -241,11 +278,12 @@ WorldState WorldState::operator+(const WorldState &_state) const
   result.wallTime = this->wallTime;
 
   // Add the states.
-  for (std::vector<ModelState>::const_iterator iter =
+  for (ModelState_M::const_iterator iter =
        _state.modelStates.begin(); iter != _state.modelStates.end(); ++iter)
   {
-    ModelState state = this->GetModelState((*iter).GetName()) + *iter;
-    result.modelStates.push_back(state);
+    ModelState state = this->GetModelState(iter->second.GetName()) +
+      iter->second;
+    result.modelStates.insert(std::make_pair(state.GetName(), state));
   }
 
   return result;
@@ -261,10 +299,46 @@ void WorldState::FillSDF(sdf::ElementPtr _sdf)
   _sdf->GetElement("real_time")->Set(this->realTime);
   _sdf->GetElement("wall_time")->Set(this->wallTime);
 
-  for (std::vector<ModelState>::iterator iter =
+  for (ModelState_M::iterator iter =
        this->modelStates.begin(); iter != this->modelStates.end(); ++iter)
   {
     sdf::ElementPtr elem = _sdf->AddElement("model");
-    (*iter).FillSDF(elem);
+    iter->second.FillSDF(elem);
+  }
+}
+
+/////////////////////////////////////////////////
+void WorldState::SetWallTime(const common::Time &_time)
+{
+  State::SetWallTime(_time);
+
+  for (ModelState_M::iterator iter = this->modelStates.begin();
+       iter != this->modelStates.end(); ++iter)
+  {
+    iter->second.SetWallTime(_time);
+  }
+}
+
+/////////////////////////////////////////////////
+void WorldState::SetRealTime(const common::Time &_time)
+{
+  State::SetRealTime(_time);
+
+  for (ModelState_M::iterator iter = this->modelStates.begin();
+           iter != this->modelStates.end(); ++iter)
+  {
+    iter->second.SetRealTime(_time);
+  }
+}
+
+/////////////////////////////////////////////////
+void WorldState::SetSimTime(const common::Time &_time)
+{
+  State::SetSimTime(_time);
+
+  for (ModelState_M::iterator iter = this->modelStates.begin();
+       iter != this->modelStates.end(); ++iter)
+  {
+    iter->second.SetSimTime(_time);
   }
 }
diff --git a/gazebo/physics/WorldState.hh b/gazebo/physics/WorldState.hh
index 58761dc..e423754 100644
--- a/gazebo/physics/WorldState.hh
+++ b/gazebo/physics/WorldState.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,9 +24,11 @@
 #include <string>
 #include <vector>
 
-#include "sdf/sdf.hh"
-#include "physics/State.hh"
-#include "physics/ModelState.hh"
+#include <sdf/sdf.hh>
+
+#include "gazebo/physics/State.hh"
+#include "gazebo/physics/ModelState.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -41,7 +43,7 @@ namespace gazebo
     /// Instances of this class contain the state of a World at a specific
     /// time. World state includes the state of all models, and their
     /// children.
-    class WorldState : public State
+    class GAZEBO_VISIBLE WorldState : public State
     {
       /// \brief Default constructor
       public: WorldState();
@@ -61,6 +63,12 @@ namespace gazebo
       /// \brief Destructor.
       public: virtual ~WorldState();
 
+      /// \brief Load from a World pointer.
+      ///
+      /// Generate a WorldState from an instance of a World.
+      /// \param[in] _world Pointer to a world
+      public: void Load(const WorldPtr _world);
+
       /// \brief Load state from SDF element.
       ///
       /// Set a WorldState from an SDF element containing WorldState info.
@@ -71,9 +79,15 @@ namespace gazebo
       /// \param[in] _world Pointer to the world.
       public: void SetWorld(const WorldPtr _world);
 
+      /// \brief Get model states based on a regular expression.
+      /// \param[in] _regex The regular expression.
+      /// \return List of model states whose names match the regular
+      /// expression.
+      public: ModelState_M GetModelStates(const boost::regex &_regex) const;
+
       /// \brief Get the model states.
       /// \return A vector of model states.
-      public: const std::vector<ModelState> &GetModelStates() const;
+      public: const ModelState_M &GetModelStates() const;
 
       /// \brief Get the number of model states.
       ///
@@ -81,15 +95,6 @@ namespace gazebo
       /// \return Number of models.
       public: unsigned int GetModelStateCount() const;
 
-      /// \brief Get a model state.
-      ///
-      /// Get the state of a Model based on an index. The min index is
-      /// and the max is WorldState::GetModelStateCount().
-      ///
-      /// \param[in] _index Index of the model.
-      /// \return State of the requested Model.
-      public: ModelState GetModelState(unsigned int _index) const;
-
       /// \brief Get a model state by model name.
       /// \param[in] _modelName Name of the model state to get.
       /// \return The model state.
@@ -112,6 +117,19 @@ namespace gazebo
       /// \param[out] _sdf SDF element to populate.
       public: void FillSDF(sdf::ElementPtr _sdf);
 
+      /// \brief Set the wall time when this state was generated
+      /// \param[in] _time The absolute clock time when the State
+      /// data was recorded.
+      public: virtual void SetWallTime(const common::Time &_time);
+
+      /// \brief Set the real time when this state was generated
+      /// \param[in] _time Clock time since simulation was stated.
+      public: virtual void SetRealTime(const common::Time &_time);
+
+      /// \brief Set the sim time when this state was generated
+      /// \param[in] _time Simulation time when the data was recorded.
+      public: virtual void SetSimTime(const common::Time &_time);
+
       /// \brief Assignment operator
       /// \param[in] _state State value
       /// \return Reference to this
@@ -131,55 +149,54 @@ namespace gazebo
       /// \param[in] _out output stream
       /// \param[in] _state World state to output
       /// \return the stream
-      public: friend std::ostream &operator<<(std::ostream &_out,
-                                 const gazebo::physics::WorldState &_state)
+      public: inline friend std::ostream &operator<<(std::ostream &_out,
+                  const gazebo::physics::WorldState &_state)
       {
-        _out << "<state world_name='" << _state.name << "'>\n";
-        _out << "  <sim_time>" << _state.simTime << "</sim_time>\n";
-        _out << "  <wall_time>" << _state.wallTime << "</wall_time>\n";
-        _out << "  <real_time>" << _state.realTime << "</real_time>\n";
+        _out << "<state world_name='" << _state.name << "'>"
+          << "<sim_time>" << _state.simTime << "</sim_time>"
+          << "<wall_time>" << _state.wallTime << "</wall_time>"
+          << "<real_time>" << _state.realTime << "</real_time>";
 
         // List all of the inserted models
         if (_state.insertions.size() > 0)
         {
-          _out << "  <insertions>\n";
+          _out << "<insertions>";
           for (std::vector<std::string>::const_iterator iter =
                _state.insertions.begin();
                iter != _state.insertions.end(); ++iter)
           {
-            _out << *iter << "\n";
+            _out << *iter;
           }
-          _out << "  </insertions>\n";
+          _out << "</insertions>";
         }
 
         // List all of the deleted models
         if (_state.deletions.size() > 0)
         {
-          _out << "  <deletions>\n";
+          _out << "<deletions>";
           for (std::vector<std::string>::const_iterator iter =
                _state.deletions.begin();
                iter != _state.deletions.end(); ++iter)
           {
-            _out << "    <name>" << (*iter) << "</name>\n";
+            _out << "<name>" << (*iter) << "</name>";
           }
-          _out << "  </deletions>\n";
+          _out << "</deletions>";
         }
 
         // List the model states
-        for (std::vector<ModelState>::const_iterator iter =
-            _state.modelStates.begin(); iter != _state.modelStates.end();
-            ++iter)
+        for (ModelState_M::const_iterator iter = _state.modelStates.begin();
+            iter != _state.modelStates.end(); ++iter)
         {
-          _out << *iter;
+          _out << iter->second;
         }
 
-        _out << "</state>\n";
+        _out << "</state>";
 
         return _out;
       }
 
       /// \brief State of all the models.
-      private: std::vector<ModelState> modelStates;
+      private: ModelState_M modelStates;
 
       /// \brief List of new added models. The
       /// value is the SDF that describes the model.
diff --git a/gazebo/physics/bullet/BulletBallJoint.cc b/gazebo/physics/bullet/BulletBallJoint.cc
index 89cc5ee..b31c4bb 100644
--- a/gazebo/physics/bullet/BulletBallJoint.cc
+++ b/gazebo/physics/bullet/BulletBallJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -45,49 +45,83 @@ BulletBallJoint::~BulletBallJoint()
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletBallJoint::GetAnchor(int /*_index*/) const
+void BulletBallJoint::Load(sdf::ElementPtr _sdf)
 {
-  return this->anchorPos;
-}
-
-//////////////////////////////////////////////////
-void BulletBallJoint::SetAnchor(int /*_index*/,
-                                const math::Vector3 &/*_anchor*/)
-{
-  gzerr << "Not implemented\n";
-}
-
-//////////////////////////////////////////////////
-void BulletBallJoint::SetDamping(int /*_index*/, double /*_damping*/)
-{
-  gzerr << "Not implemented\n";
+  BallJoint<BulletJoint>::Load(_sdf);
 }
 
 //////////////////////////////////////////////////
-void BulletBallJoint::Attach(LinkPtr _one, LinkPtr _two)
+void BulletBallJoint::Init()
 {
-  BallJoint<BulletJoint>::Attach(_one, _two);
+  BallJoint<BulletJoint>::Init();
 
+  // Cast to BulletLink
   BulletLinkPtr bulletChildLink =
     boost::static_pointer_cast<BulletLink>(this->childLink);
   BulletLinkPtr bulletParentLink =
     boost::static_pointer_cast<BulletLink>(this->parentLink);
 
-  if (!bulletChildLink || !bulletParentLink)
-    gzthrow("Requires bullet bodies");
+  // Local variables used to compute pivots and axes in body-fixed frames
+  // for the parent and child links.
+  math::Vector3 pivotParent, pivotChild;
+  math::Pose pose;
 
-  math::Vector3 pivotA, pivotB;
+  // Initialize pivots to anchorPos, which is expressed in the
+  // world coordinate frame.
+  pivotParent = this->anchorPos;
+  pivotChild = this->anchorPos;
 
-  // Compute the pivot point, based on the anchorPos
-  pivotA = this->anchorPos + this->childLink->GetWorldPose().pos
-                           - this->parentLink->GetWorldPose().pos;
-  pivotB = this->anchorPos;
+  // Check if parentLink exists. If not, the parent will be the world.
+  if (this->parentLink)
+  {
+    // Compute relative pose between joint anchor and CoG of parent link.
+    pose = this->parentLink->GetWorldCoGPose();
+    // Subtract CoG position from anchor position, both in world frame.
+    pivotParent -= pose.pos;
+    // Rotate pivot offset and axis into body-fixed frame of parent.
+    pivotParent = pose.rot.RotateVectorReverse(pivotParent);
+  }
+  // Check if childLink exists. If not, the child will be the world.
+  if (this->childLink)
+  {
+    // Compute relative pose between joint anchor and CoG of child link.
+    pose = this->childLink->GetWorldCoGPose();
+    // Subtract CoG position from anchor position, both in world frame.
+    pivotChild -= pose.pos;
+    // Rotate pivot offset and axis into body-fixed frame of child.
+    pivotChild = pose.rot.RotateVectorReverse(pivotChild);
+  }
 
-  this->bulletBall = new btPoint2PointConstraint(
+  // If both links exist, then create a joint between the two links.
+  if (bulletChildLink && bulletParentLink)
+  {
+    this->bulletBall = new btPoint2PointConstraint(
+      *bulletChildLink->GetBulletLink(),
       *bulletParentLink->GetBulletLink(),
+      BulletTypes::ConvertVector3(pivotChild),
+      BulletTypes::ConvertVector3(pivotParent));
+  }
+  // If only the child exists, then create a joint between the child
+  // and the world.
+  else if (bulletChildLink)
+  {
+    this->bulletBall = new btPoint2PointConstraint(
       *bulletChildLink->GetBulletLink(),
-      btVector3(pivotA.x, pivotA.y, pivotA.z),
-      btVector3(pivotB.x, pivotB.y, pivotB.z));
+      BulletTypes::ConvertVector3(pivotChild));
+  }
+  // If only the parent exists, then create a joint between the parent
+  // and the world.
+  else if (bulletParentLink)
+  {
+    this->bulletBall = new btPoint2PointConstraint(
+      *bulletParentLink->GetBulletLink(),
+      BulletTypes::ConvertVector3(pivotParent));
+  }
+  // Throw an error if no links are given.
+  else
+  {
+    gzthrow("joint without links\n");
+  }
 
   this->constraint = this->bulletBall;
 
@@ -97,56 +131,60 @@ void BulletBallJoint::Attach(LinkPtr _one, LinkPtr _two)
 
   // Allows access to impulse
   this->constraint->enableFeedback(true);
+
+  // Setup Joint force and torque feedback
+  this->SetupJointFeedback();
 }
 
-/////////////////////////////////////////////////
-void BulletBallJoint::SetVelocity(int /*_index*/, double /*_angle*/)
+//////////////////////////////////////////////////
+math::Vector3 BulletBallJoint::GetAnchor(unsigned int /*_index*/) const
 {
-  gzerr << "Not implemented\n";
+  return this->anchorPos;
 }
 
 /////////////////////////////////////////////////
-double BulletBallJoint::GetVelocity(int /*_index*/) const
+void BulletBallJoint::SetVelocity(unsigned int /*_index*/, double /*_angle*/)
 {
   gzerr << "Not implemented\n";
-  return 0;
 }
 
 /////////////////////////////////////////////////
-double BulletBallJoint::GetMaxForce(int /*_index*/)
+double BulletBallJoint::GetVelocity(unsigned int /*_index*/) const
 {
   gzerr << "Not implemented\n";
   return 0;
 }
 
 /////////////////////////////////////////////////
-void BulletBallJoint::SetMaxForce(int /*_index*/, double /*_t*/)
+double BulletBallJoint::GetMaxForce(unsigned int /*_index*/)
 {
   gzerr << "Not implemented\n";
-  return;
+  return 0;
 }
 
 /////////////////////////////////////////////////
-math::Angle BulletBallJoint::GetAngle(int /*_index*/) const
+void BulletBallJoint::SetMaxForce(unsigned int /*_index*/, double /*_t*/)
 {
   gzerr << "Not implemented\n";
-  return 0;
+  return;
 }
 
 /////////////////////////////////////////////////
-math::Vector3 BulletBallJoint::GetGlobalAxis(int /*_index*/) const
+math::Vector3 BulletBallJoint::GetGlobalAxis(unsigned int /*_index*/) const
 {
+  gzerr << "Not implemented\n";
   return math::Vector3();
 }
 
 /////////////////////////////////////////////////
-math::Angle BulletBallJoint::GetAngleImpl(int /*_index*/) const
+math::Angle BulletBallJoint::GetAngleImpl(unsigned int /*_index*/) const
 {
+  gzerr << "Not implemented\n";
   return math::Angle();
 }
 
 //////////////////////////////////////////////////
-void BulletBallJoint::SetHighStop(int /*_index*/,
+bool BulletBallJoint::SetHighStop(unsigned int /*_index*/,
                                    const math::Angle &/*_angle*/)
 {
   if (this->bulletBall)
@@ -156,15 +194,24 @@ void BulletBallJoint::SetHighStop(int /*_index*/,
     // settings
     // this->bulletBall->setLimit(this->btBall->getLowerLimit(),
     //                         _angle.Radian());
+    gzerr << "BulletBallJoint limits not implemented" << std::endl;
+    return false;
   }
   else
   {
-    gzthrow("Joint must be created first");
+    gzerr << "bulletBall does not yet exist" << std::endl;
+    return false;
   }
 }
 
 //////////////////////////////////////////////////
-void BulletBallJoint::SetLowStop(int /*_index*/,
+void BulletBallJoint::SetForceImpl(unsigned int /*_index*/, double /*_torque*/)
+{
+  gzerr << "Not implemented";
+}
+
+//////////////////////////////////////////////////
+bool BulletBallJoint::SetLowStop(unsigned int /*_index*/,
                                   const math::Angle &/*_angle*/)
 {
   if (this->bulletBall)
@@ -174,8 +221,39 @@ void BulletBallJoint::SetLowStop(int /*_index*/,
     // settings
     // this->bulletBall->setLimit(-_angle.Radian(),
     //                         this->bulletBall->getUpperLimit());
+    gzerr << "BulletBallJoint limits not implemented" << std::endl;
+    return false;
   }
   else
-    gzthrow("Joint must be created first");
+  {
+    gzerr << "bulletBall does not yet exist" << std::endl;
+    return false;
+  }
 }
 
+//////////////////////////////////////////////////
+math::Vector3 BulletBallJoint::GetAxis(unsigned int /*_index*/) const
+{
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+void BulletBallJoint::SetAxis(unsigned int /*_index*/,
+                        const math::Vector3 &/*_axis*/)
+{
+  gzerr << "BulletBallJoint::SetAxis not implemented" << std::endl;
+}
+
+//////////////////////////////////////////////////
+math::Angle BulletBallJoint::GetHighStop(unsigned int /*_index*/)
+{
+  gzerr << "BulletBallJoint::GetHighStop not implemented" << std::endl;
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+math::Angle BulletBallJoint::GetLowStop(unsigned int /*_index*/)
+{
+  gzerr << "BulletBallJoint::GetLowStop not implemented" << std::endl;
+  return math::Angle();
+}
diff --git a/gazebo/physics/bullet/BulletBallJoint.hh b/gazebo/physics/bullet/BulletBallJoint.hh
index 222afca..21187cf 100644
--- a/gazebo/physics/bullet/BulletBallJoint.hh
+++ b/gazebo/physics/bullet/BulletBallJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,9 +22,10 @@
 #ifndef _BULLETBALLJOINT_HH_
 #define _BULLETBALLJOINT_HH_
 
-#include "physics/BallJoint.hh"
-#include "physics/bullet/BulletJoint.hh"
-#include "physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/BallJoint.hh"
+#include "gazebo/physics/bullet/BulletJoint.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/util/system.hh"
 
 class btPoint2PointConstraint;
 
@@ -37,7 +38,7 @@ namespace gazebo
     /// \{
 
     /// \brief BulletBallJoint class models a ball joint in Bullet.
-    class BulletBallJoint : public BallJoint<BulletJoint>
+    class GAZEBO_VISIBLE BulletBallJoint : public BallJoint<BulletJoint>
     {
       /// \brief Bullet Ball Joint Constructor
       public: BulletBallJoint(btDynamicsWorld *_world, BasePtr _parent);
@@ -45,50 +46,58 @@ namespace gazebo
       /// \brief Destructor
       public: virtual ~BulletBallJoint();
 
-      /// \brief Get joint's anchor point
-      public: math::Vector3 GetAnchor(int _index) const;
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
 
-      /// \brief Set joint's anchor point
-      public: void SetAnchor(int _index, const math::Vector3 &_anchor);
+      // Documentation inherited.
+      public: virtual void Init();
 
-      /// \brief Set joint damping, not yet implemented
-      public: virtual void SetDamping(int _index, double _damping);
+      // Documentation inherited.
+      public: math::Vector3 GetAnchor(unsigned int _index) const;
 
-      /// \brief Attach the two bodies with this joint
-      public: void Attach(LinkPtr _one, LinkPtr _two);
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAxis(unsigned int _index) const;
 
-      /// \brief Get the axis of rotation
-      public: virtual math::Vector3 GetAxis(int /*_index*/) const
-              {return math::Vector3();}
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
-      /// \brief Set the velocity of an axis(index).
-      public: virtual void SetVelocity(int _index, double _angle);
+      // Documentation inherited.
+      public: virtual double GetVelocity(unsigned int _index) const;
 
-      /// \brief Get the rotation rate of an axis(index)
-      public: virtual double GetVelocity(int _index) const;
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
 
-      /// \brief Get the max allowed force of an axis(index).
-      public: virtual double GetMaxForce(int _index);
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
-      /// \brief Set the max allowed force of an axis(index).
-      public: virtual void SetMaxForce(int _index, double _t);
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                  const math::Angle &_angle);
 
-      /// \brief Set the high stop of an axis(index).
-      public: virtual void SetHighStop(int _index, const math::Angle &_angle);
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                  const math::Angle &_angle);
 
-      /// \brief Set the low stop of an axis(index).
-      public: virtual void SetLowStop(int _index, const math::Angle &_angle);
+      // Documentation inherited.
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
-      /// \brief Get the angle of rotation of an axis(index)
-      public: virtual math::Angle GetAngle(int _index) const;
+      // Documentation inherited.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
-      /// \brief Get the axis of rotation
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _torque);
 
-      /// \brief Get the angle of rotation
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                                   const math::Vector3 &_axis);
 
-      /// \brief Pointer to Bullet ball constraint
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
+
+      /// \brief bullet ball constraint
       private: btPoint2PointConstraint *bulletBall;
     };
 
diff --git a/gazebo/physics/bullet/BulletBoxShape.hh b/gazebo/physics/bullet/BulletBoxShape.hh
index 4a3be28..f28ed42 100644
--- a/gazebo/physics/bullet/BulletBoxShape.hh
+++ b/gazebo/physics/bullet/BulletBoxShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,8 +22,10 @@
 #ifndef _BULLETBOXSHAPE_HH_
 #define _BULLETBOXSHAPE_HH_
 
-#include "physics/bullet/BulletPhysics.hh"
-#include "physics/BoxShape.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/BoxShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +36,7 @@ namespace gazebo
     /// \{
 
     /// \brief Bullet box collision
-    class BulletBoxShape : public BoxShape
+    class GAZEBO_VISIBLE BulletBoxShape : public BoxShape
     {
       /// \brief Constructor
       public: BulletBoxShape(CollisionPtr _parent) : BoxShape(_parent) {}
@@ -47,9 +49,8 @@ namespace gazebo
               {
                 if (_size.x < 0 || _size.y < 0 || _size.z < 0)
                 {
-                    gzerr << "Box shape does not support negative"
-                          << " size\n";
-                    return;
+                  gzerr << "Box shape does not support negative size\n";
+                  return;
                 }
                 math::Vector3 size = _size;
                 if (math::equal(size.x, 0.0))
@@ -80,19 +81,45 @@ namespace gazebo
                 btCollisionShape *shape = bParent->GetCollisionShape();
                 if (!shape)
                 {
+                  this->initialSize = size;
                   bParent->SetCollisionShape(new btBoxShape(
                       btVector3(size.x*0.5, size.y*0.5, size.z*0.5)));
                 }
                 else
                 {
-                  btVector3 scale = shape->getLocalScaling();
-                  math::Vector3 boxSize = this->GetSize();
-                  scale.setX(size.x / boxSize.x);
-                  scale.setY(size.y / boxSize.y);
-                  scale.setZ(size.z / boxSize.z);
-                  shape->setLocalScaling(scale);
+                  btVector3 boxScale = shape->getLocalScaling();
+                  boxScale.setX(size.x / this->initialSize.x);
+                  boxScale.setY(size.y / this->initialSize.y);
+                  boxScale.setZ(size.z / this->initialSize.z);
+
+                  shape->setLocalScaling(boxScale);
+
+                  // clear bullet cache and re-add the collision shape
+                  // otherwise collisions won't work properly after scaling
+                  BulletLinkPtr bLink =
+                    boost::dynamic_pointer_cast<BulletLink>(
+                    bParent->GetLink());
+                  bLink->ClearCollisionCache();
+
+                  // remove and add the shape again
+                  if (bLink->GetBulletLink()->getCollisionShape()->isCompound())
+                  {
+                    btCompoundShape *compoundShape =
+                        dynamic_cast<btCompoundShape *>(
+                        bLink->GetBulletLink()->getCollisionShape());
+
+                    compoundShape->removeChildShape(shape);
+                    math::Pose relativePose =
+                        this->collisionParent->GetRelativePose();
+                    relativePose.pos -= bLink->GetInertial()->GetCoG();
+                    compoundShape->addChildShape(
+                        BulletTypes::ConvertPose(relativePose), shape);
+                  }
                 }
               }
+
+      /// \brief Initial size of box.
+      private: math::Vector3 initialSize;
     };
     /// \}
   }
diff --git a/gazebo/physics/bullet/BulletCollision.cc b/gazebo/physics/bullet/BulletCollision.cc
index 32b9982..6910e16 100644
--- a/gazebo/physics/bullet/BulletCollision.cc
+++ b/gazebo/physics/bullet/BulletCollision.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,8 +19,10 @@
  * Date: 13 Feb 2006
  */
 
-#include "physics/bullet/bullet_inc.h"
-#include "physics/bullet/BulletCollision.hh"
+#include "gazebo/physics/bullet/bullet_inc.h"
+#include "gazebo/physics/bullet/BulletLink.hh"
+#include "gazebo/physics/bullet/BulletCollision.hh"
+#include "gazebo/physics/bullet/BulletSurfaceParams.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -31,6 +33,7 @@ BulletCollision::BulletCollision(LinkPtr _parent)
 {
   this->SetName("Bullet_Collision");
   this->collisionShape = NULL;
+  this->surface.reset(new BulletSurfaceParams());
 }
 
 //////////////////////////////////////////////////
@@ -57,12 +60,10 @@ void BulletCollision::Load(sdf::ElementPtr _sdf)
 //////////////////////////////////////////////////
 void BulletCollision::OnPoseChange()
 {
-  /*
   math::Pose pose = this->GetRelativePose();
-  BulletLink *bbody = static_cast<BulletLink*>(this->body);
+  BulletLinkPtr bbody = boost::dynamic_pointer_cast<BulletLink>(this->parent);
 
-  bbody->SetCollisionRelativePose(this, pose);
-  */
+  // bbody->motionState.setWorldTransform(this, pose);
 }
 
 //////////////////////////////////////////////////
@@ -122,6 +123,9 @@ void BulletCollision::SetCollisionShape(btCollisionShape *_shape,
   // this->collisionShape->calculateLocalInertia(this->mass.GetAsDouble(), vec);
 
   // this->mass.SetCoG(this->GetRelativePose().pos);
+
+  // this->collisionShape->setFriction(1.0);
+  // this->collisionShape->setAnisotropicFriction(btVector3(0, 0, 0));
 }
 
 //////////////////////////////////////////////////
@@ -135,3 +139,9 @@ void BulletCollision::SetCompoundShapeIndex(int /*_index*/)
 {
   // this->compoundShapeIndex = 0;
 }
+
+/////////////////////////////////////////////////
+BulletSurfaceParamsPtr BulletCollision::GetBulletSurface() const
+{
+  return boost::dynamic_pointer_cast<BulletSurfaceParams>(this->surface);
+}
diff --git a/gazebo/physics/bullet/BulletCollision.hh b/gazebo/physics/bullet/BulletCollision.hh
index 1966610..90b4dbb 100644
--- a/gazebo/physics/bullet/BulletCollision.hh
+++ b/gazebo/physics/bullet/BulletCollision.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,15 +26,18 @@
 
 /*
 
-#include "common/Param.hh"
+#include "gazebo/common/Param.hh"
 #include "Entity.hh"
-#include "math/Pose.hh"
-#include "math/Vector3.hh"
-#include "physics/Collision.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/util/system.hh"
 */
 
-#include "physics/PhysicsTypes.hh"
-#include "physics/Collision.hh"
+#include "gazebo/physics/bullet/BulletTypes.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/util/system.hh"
 
 class btCollisionShape;
 
@@ -47,7 +50,7 @@ namespace gazebo
     /// \{
 
     /// \brief Bullet collisions
-    class BulletCollision : public Collision
+    class GAZEBO_VISIBLE BulletCollision : public Collision
     {
       /// \brief Constructor
       public: BulletCollision(LinkPtr _parent);
@@ -92,6 +95,11 @@ namespace gazebo
       /// \brief Set the index of the compound shape
       public: void SetCompoundShapeIndex(int _index);
 
+      /// \brief Similar to Collision::GetSurface, but provides dynamically
+      ///        casted pointer to BulletSurfaceParams.
+      /// \return Dynamically casted pointer to BulletSurfaceParams.
+      public: BulletSurfaceParamsPtr GetBulletSurface() const;
+
       protected: btCollisionShape *collisionShape;
 
       /// \brief Category bits for collision detection
diff --git a/gazebo/physics/bullet/BulletCylinderShape.hh b/gazebo/physics/bullet/BulletCylinderShape.hh
index 2cb857e..5b90b73 100644
--- a/gazebo/physics/bullet/BulletCylinderShape.hh
+++ b/gazebo/physics/bullet/BulletCylinderShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,8 +22,9 @@
 #ifndef _BULLETCYLINDERSHAPE_HH_
 #define _BULLETCYLINDERSHAPE_HH_
 
-#include "physics/bullet/BulletPhysics.hh"
-#include "physics/CylinderShape.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/CylinderShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,7 @@ namespace gazebo
     /// \{
 
     /// \brief Cylinder collision
-    class BulletCylinderShape : public CylinderShape
+    class GAZEBO_VISIBLE BulletCylinderShape : public CylinderShape
     {
       /// \brief Constructor
       public: BulletCylinderShape(CollisionPtr _parent)
@@ -50,15 +51,13 @@ namespace gazebo
               {
                 if (_radius < 0)
                 {
-                    gzerr << "Cylinder shape does not support negative"
-                          << " radius\n";
-                    return;
+                  gzerr << "Cylinder shape does not support negative radius\n";
+                  return;
                 }
                 if (_length < 0)
                 {
-                    gzerr << "Cylinder shape does not support negative"
-                          << " length\n";
-                    return;
+                  gzerr << "Cylinder shape does not support negative length\n";
+                  return;
                 }
                 if (math::equal(_radius, 0.0))
                 {
@@ -82,20 +81,45 @@ namespace gazebo
                 btCollisionShape *shape = bParent->GetCollisionShape();
                 if (!shape)
                 {
+                  this->initialSize = math::Vector3(_radius, _radius, _length);
                   bParent->SetCollisionShape(new btCylinderShapeZ(
                       btVector3(_radius, _radius, _length * 0.5)));
                 }
                 else
                 {
-                  btVector3 scale = shape->getLocalScaling();
-                  double cylinderRadius = this->GetRadius();
-                  double cylinderLength = this->GetLength();
-                  scale.setX(_radius / cylinderRadius);
-                  scale.setY(scale.x());
-                  scale.setZ(_length / cylinderLength);
-                  shape->setLocalScaling(scale);
+                  btVector3 cylinderScale;
+                  cylinderScale.setX(_radius / this->initialSize.x);
+                  cylinderScale.setY(_radius / this->initialSize.y);
+                  cylinderScale.setZ(_length / this->initialSize.z);
+
+                  shape->setLocalScaling(cylinderScale);
+
+                  // clear bullet cache and re-add the collision shape
+                  // otherwise collisions won't work properly after scaling
+                  BulletLinkPtr bLink =
+                      boost::dynamic_pointer_cast<BulletLink>(
+                      bParent->GetLink());
+                  bLink->ClearCollisionCache();
+
+                  // remove and add the shape again
+                  if (bLink->GetBulletLink()->getCollisionShape()->isCompound())
+                  {
+                    btCompoundShape *compoundShape =
+                        dynamic_cast<btCompoundShape *>(
+                        bLink->GetBulletLink()->getCollisionShape());
+
+                    compoundShape->removeChildShape(shape);
+                    math::Pose relativePose =
+                        this->collisionParent->GetRelativePose();
+                    relativePose.pos -= bLink->GetInertial()->GetCoG();
+                    compoundShape->addChildShape(
+                        BulletTypes::ConvertPose(relativePose), shape);
+                  }
                 }
               }
+
+      /// \brief Initial size of cylinder.
+      private: math::Vector3 initialSize;
     };
     /// \}
   }
diff --git a/gazebo/physics/bullet/BulletHeightmapShape.cc b/gazebo/physics/bullet/BulletHeightmapShape.cc
index 61e63c3..a516cf3 100644
--- a/gazebo/physics/bullet/BulletHeightmapShape.cc
+++ b/gazebo/physics/bullet/BulletHeightmapShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,17 +14,16 @@
  * limitations under the License.
  *
 */
-/* Desc: Heightmap collisionetry
- * Author: Nate Koenig, Andrew Howard
- * Date: 8 May 2003
- */
 
-#include "common/Exception.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Assert.hh"
 
-#include "physics/bullet/bullet_inc.h"
-#include "physics/bullet/BulletTypes.hh"
-#include "physics/bullet/BulletCollision.hh"
-#include "physics/bullet/BulletHeightmapShape.hh"
+#include "gazebo/physics/bullet/bullet_inc.h"
+#include "gazebo/physics/bullet/BulletTypes.hh"
+#include "gazebo/physics/bullet/BulletLink.hh"
+#include "gazebo/physics/bullet/BulletMotionState.hh"
+#include "gazebo/physics/bullet/BulletCollision.hh"
+#include "gazebo/physics/bullet/BulletHeightmapShape.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -33,6 +32,8 @@ using namespace physics;
 BulletHeightmapShape::BulletHeightmapShape(CollisionPtr _parent)
     : HeightmapShape(_parent)
 {
+  // Bullet need the height values flipped in the y direction
+  this->flipY = true;
 }
 
 //////////////////////////////////////////////////
@@ -63,17 +64,35 @@ void BulletHeightmapShape::Init()
       PHY_FLOAT,
       false);             // Flip quad edges
 
-  this->heightFieldShape->setUseDiamondSubdivision(true);
   this->heightFieldShape->setLocalScaling(localScaling);
 
+  // This is suppose to match up with Ogre rendering a bit better.
+  this->heightFieldShape->setUseZigzagSubdivision(true);
+
+  // Get a pointer to the parent collision
   BulletCollisionPtr bParent;
   bParent = boost::dynamic_pointer_cast<BulletCollision>(this->collisionParent);
 
+  GZ_ASSERT(bParent != NULL, "Bullet collision parent of a heightmap is NULL");
+
   bParent->SetCollisionShape(this->heightFieldShape, false);
 
-  math::Pose pose;
-  pose.pos.x = 0;
-  pose.pos.y = 0;
-  pose.pos.z = (maxHeight - minHeight) * 0.5;
-  bParent->SetRelativePose(pose, false);
+  btVector3 min, max;
+  this->heightFieldShape->getAabb(btTransform::getIdentity(), min, max);
+
+  BulletLinkPtr bLink = boost::dynamic_pointer_cast<BulletLink>(
+      bParent->GetParent());
+
+  GZ_ASSERT(bLink != NULL, "Bullet heightmap does not have a link.");
+
+  BulletMotionStatePtr motionState = bLink->motionState;
+
+  GZ_ASSERT(motionState != NULL, "Invalid motion state for heightmap.");
+
+  btTransform tr;
+  tr.setIdentity();
+  tr.setOrigin(btVector3(0, 0, (maxHeight - minHeight) * 0.5));
+
+  // Set the transform for the heightmap.
+  motionState->setWorldTransform(tr);
 }
diff --git a/gazebo/physics/bullet/BulletHeightmapShape.hh b/gazebo/physics/bullet/BulletHeightmapShape.hh
index 45a0a91..9021948 100644
--- a/gazebo/physics/bullet/BulletHeightmapShape.hh
+++ b/gazebo/physics/bullet/BulletHeightmapShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,9 +23,10 @@
 #define _BULLETHEIGHTMAPGEOM_HH_
 #include <string>
 
-#include "physics/HeightmapShape.hh"
-#include "physics/bullet/BulletPhysics.hh"
-#include "physics/Collision.hh"
+#include "gazebo/physics/HeightmapShape.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/util/system.hh"
 
 class btHeightfieldTerrainShape;
 
@@ -38,7 +39,7 @@ namespace gazebo
     /// \{
 
     /// \brief Height map collision
-    class BulletHeightmapShape : public HeightmapShape
+    class GAZEBO_VISIBLE BulletHeightmapShape : public HeightmapShape
     {
       /// \brief Constructor
       public: BulletHeightmapShape(CollisionPtr _parent);
diff --git a/gazebo/physics/bullet/BulletHinge2Joint.cc b/gazebo/physics/bullet/BulletHinge2Joint.cc
index 7757ee3..e6bf706 100644
--- a/gazebo/physics/bullet/BulletHinge2Joint.cc
+++ b/gazebo/physics/bullet/BulletHinge2Joint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -52,23 +52,26 @@ void BulletHinge2Joint::Load(sdf::ElementPtr _sdf)
 }
 
 //////////////////////////////////////////////////
-void BulletHinge2Joint::Attach(LinkPtr _one, LinkPtr _two)
+void BulletHinge2Joint::Init()
 {
-  Hinge2Joint<BulletJoint>::Attach(_one, _two);
-
+  Hinge2Joint<BulletJoint>::Init();
   BulletLinkPtr bulletChildLink =
     boost::static_pointer_cast<BulletLink>(this->childLink);
   BulletLinkPtr bulletParentLink =
     boost::static_pointer_cast<BulletLink>(this->parentLink);
 
-  if (!bulletChildLink || !bulletParentLink)
-    gzthrow("Requires bullet bodies");
+  if (!bulletParentLink)
+    gzthrow("BulletHinge2Joint cannot be connected to the world (parent)");
+  if (!bulletChildLink)
+    gzthrow("BulletHinge2Joint cannot be connected to the world (child)");
 
   sdf::ElementPtr axis1Elem = this->sdf->GetElement("axis");
-  math::Vector3 axis1 = axis1Elem->GetValueVector3("xyz");
+  math::Vector3 axis1 = axis1Elem->Get<math::Vector3>("xyz");
+
+  sdf::ElementPtr axis2Elem = this->sdf->GetElement("axis2");
+  math::Vector3 axis2 = axis2Elem->Get<math::Vector3>("xyz");
 
-  sdf::ElementPtr axis2Elem = this->sdf->GetElement("axis");
-  math::Vector3 axis2 = axis2Elem->GetValueVector3("xyz");
+  // TODO: should check that axis1 and axis2 are orthogonal unit vectors
 
   btVector3 banchor(this->anchorPos.x, this->anchorPos.y, this->anchorPos.z);
   btVector3 baxis1(axis1.x, axis1.y, axis1.z);
@@ -87,49 +90,58 @@ void BulletHinge2Joint::Attach(LinkPtr _one, LinkPtr _two)
 
   // Allows access to impulse
   this->constraint->enableFeedback(true);
+
+  // Setup Joint force and torque feedback
+  this->SetupJointFeedback();
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletHinge2Joint::GetAnchor(int /*index*/) const
+math::Vector3 BulletHinge2Joint::GetAnchor(unsigned int /*index*/) const
 {
   return this->anchorPos;
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletHinge2Joint::GetAxis(int /*index*/) const
+math::Vector3 BulletHinge2Joint::GetAxis(unsigned int /*index*/) const
 {
+  if (!this->bulletHinge2)
+  {
+    gzerr << "Joint must be created first.\n";
+    return math::Vector3();
+  }
+
   btVector3 vec = this->bulletHinge2->getAxis1();
   return math::Vector3(vec.getX(), vec.getY(), vec.getZ());
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletHinge2Joint::GetAngle(int /*_index*/) const
+math::Angle BulletHinge2Joint::GetAngle(unsigned int /*_index*/) const
 {
+  if (!this->bulletHinge2)
+  {
+    gzerr << "Joint must be created first.\n";
+    return math::Angle();
+  }
+
   return this->bulletHinge2->getAngle1();
 }
 
 //////////////////////////////////////////////////
-double BulletHinge2Joint::GetVelocity(int /*_index*/) const
+double BulletHinge2Joint::GetVelocity(unsigned int /*_index*/) const
 {
   gzerr << "Not implemented";
   return 0;
 }
 
 //////////////////////////////////////////////////
-void BulletHinge2Joint::SetVelocity(int /*_index*/, double /*_angle*/)
-{
-  gzerr << "Not implemented";
-}
-
-//////////////////////////////////////////////////
-void BulletHinge2Joint::SetAnchor(int /*_index*/,
-                                  const math::Vector3 &/*_anchor*/)
+void BulletHinge2Joint::SetVelocity(unsigned int /*_index*/, double /*_angle*/)
 {
   gzerr << "Not implemented";
 }
 
 //////////////////////////////////////////////////
-void BulletHinge2Joint::SetAxis(int /*_index*/, const math::Vector3 &/*_axis*/)
+void BulletHinge2Joint::SetAxis(unsigned int /*_index*/,
+    const math::Vector3 &/*_axis*/)
 {
   // Bullet seems to handle setAxis improperly. It readjust all the pivot
   // points
@@ -139,75 +151,102 @@ void BulletHinge2Joint::SetAxis(int /*_index*/, const math::Vector3 &/*_axis*/)
 }
 
 //////////////////////////////////////////////////
-void BulletHinge2Joint::SetDamping(int /*index*/, double /*_damping*/)
-{
-  gzerr << "Not implemented\n";
-}
-
-//////////////////////////////////////////////////
-void BulletHinge2Joint::SetForce(int /*_index*/, double /*_torque*/)
+void BulletHinge2Joint::SetForceImpl(unsigned int /*_index*/,
+    double /*_torque*/)
 {
   gzerr << "Not implemented";
 }
 
 //////////////////////////////////////////////////
-void BulletHinge2Joint::SetMaxForce(int /*_index*/, double /*_t*/)
+void BulletHinge2Joint::SetMaxForce(unsigned int /*_index*/, double /*_t*/)
 {
   gzerr << "Not implemented";
 }
 
 //////////////////////////////////////////////////
-double BulletHinge2Joint::GetMaxForce(int /*_index*/)
+double BulletHinge2Joint::GetMaxForce(unsigned int /*_index*/)
 {
   gzerr << "Not implemented";
   return 0;
 }
 
 //////////////////////////////////////////////////
-void BulletHinge2Joint::SetHighStop(int /*_index*/, const math::Angle &_angle)
+bool BulletHinge2Joint::SetHighStop(unsigned int /*_index*/,
+    const math::Angle &_angle)
 {
-  this->bulletHinge2->setUpperLimit(_angle.Radian());
+  if (this->bulletHinge2)
+  {
+    this->bulletHinge2->setUpperLimit(_angle.Radian());
+    return true;
+  }
+  else
+  {
+    gzerr << "Joint must be created first.\n";
+    return false;
+  }
 }
 
 //////////////////////////////////////////////////
-void BulletHinge2Joint::SetLowStop(int /*_index*/, const math::Angle &_angle)
+bool BulletHinge2Joint::SetLowStop(unsigned int /*_index*/,
+    const math::Angle &_angle)
 {
-  this->bulletHinge2->setLowerLimit(_angle.Radian());
+  if (this->bulletHinge2)
+  {
+    this->bulletHinge2->setLowerLimit(_angle.Radian());
+    return true;
+  }
+  else
+  {
+    gzerr << "Joint must be created first.\n";
+    return false;
+  }
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletHinge2Joint::GetHighStop(int _index)
+math::Angle BulletHinge2Joint::GetHighStop(unsigned int _index)
 {
+  if (!this->bulletHinge2)
+  {
+    gzerr << "Joint must be created first.\n";
+    return math::Angle();
+  }
+
   btRotationalLimitMotor *motor =
     this->bulletHinge2->getRotationalLimitMotor(_index);
   if (motor)
     return motor->m_hiLimit;
 
-  gzthrow("Unable to get high stop for axis _index[" << _index << "]");
+  gzerr << "Unable to get high stop for axis _index[" << _index << "]\n";
   return 0;
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletHinge2Joint::GetLowStop(int _index)
+math::Angle BulletHinge2Joint::GetLowStop(unsigned int _index)
 {
+  if (!this->bulletHinge2)
+  {
+    gzerr << "BulletHinge2Joint::bulletHigne2 not created yet, returning 0.\n";
+    return math::Angle(0.0);
+  }
+
   btRotationalLimitMotor *motor =
     this->bulletHinge2->getRotationalLimitMotor(_index);
   if (motor)
     return motor->m_loLimit;
 
-  gzthrow("Unable to get high stop for axis _index[" << _index << "]");
+  gzerr << "Unable to get high stop for axis _index[" << _index << "]\n";
   return 0;
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletHinge2Joint::GetGlobalAxis(int /*_index*/) const
+math::Vector3 BulletHinge2Joint::GetGlobalAxis(unsigned int /*_index*/) const
 {
   gzerr << "BulletHinge2Joint::GetGlobalAxis not implemented\n";
   return math::Vector3();
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletHinge2Joint::GetAngleImpl(int /*_index*/) const
+math::Angle BulletHinge2Joint::GetAngleImpl(unsigned int /*_index*/) const
 {
   gzerr << "BulletHinge2Joint::GetAngleImpl not implemented\n";
   return math::Angle();
diff --git a/gazebo/physics/bullet/BulletHinge2Joint.hh b/gazebo/physics/bullet/BulletHinge2Joint.hh
index 1e00f0d..913147d 100644
--- a/gazebo/physics/bullet/BulletHinge2Joint.hh
+++ b/gazebo/physics/bullet/BulletHinge2Joint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,11 +22,12 @@
 #ifndef _BULLETHINGE2JOINT_HH_
 #define _BULLETHINGE2JOINT_HH_
 
-#include "math/Angle.hh"
-#include "math/Vector3.hh"
-#include "physics/Hinge2Joint.hh"
-#include "physics/bullet/BulletJoint.hh"
-#include "physics/bullet/BulletPhysics.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/physics/Hinge2Joint.hh"
+#include "gazebo/physics/bullet/BulletJoint.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/util/system.hh"
 
 class btHinge2Constraint;
 
@@ -39,7 +40,7 @@ namespace gazebo
     /// \{
 
     /// \brief A two axis hinge joint
-    class BulletHinge2Joint : public Hinge2Joint<BulletJoint>
+    class GAZEBO_VISIBLE BulletHinge2Joint : public Hinge2Joint<BulletJoint>
     {
       /// \brief Constructor
       public: BulletHinge2Joint(btDynamicsWorld *world, BasePtr _parent);
@@ -47,62 +48,59 @@ namespace gazebo
       /// \brief Destructor
       public: virtual ~BulletHinge2Joint();
 
-      /// \brief Load the BulletHinge2Joint
+      // Documentation inherited.
       protected: virtual void Load(sdf::ElementPtr _sdf);
 
-      /// \brief Attach the two bodies with this joint
-      public: virtual void Attach(LinkPtr _one, LinkPtr _two);
+      // Documentation inherited.
+      public: virtual void Init();
 
-      /// \brief Set the anchor point
-      public: virtual void SetAnchor(int _index, const math::Vector3 &_anchor);
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
-      /// \brief Get anchor point
-      public: virtual math::Vector3 GetAnchor(int _index) const;
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
 
-      /// \brief Set the first axis of rotation
-      public: virtual void SetAxis(int _index, const math::Vector3 &_axis);
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAxis(unsigned int _index) const;
 
-      /// \brief Set joint damping, not yet implemented
-      public: virtual void SetDamping(int _index, double _damping);
+      // Documentation inherited.
+      public: math::Angle GetAngle(unsigned int _index) const;
 
-      /// \brief Get first axis of rotation
-      public: virtual math::Vector3 GetAxis(int _index) const;
+      // Documentation inherited.
+      public: double GetVelocity(unsigned int _index) const;
 
-      /// \brief Get angle of rotation about first axis
-      public: math::Angle GetAngle(int _index) const;
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
-      /// \brief Get rate of rotation about first axis
-      public: double GetVelocity(int _index) const;
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
-      /// \brief Set the velocity of an axis(index).
-      public: virtual void SetVelocity(int _index, double _angle);
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
 
-      /// \brief Set the torque
-      public: void SetForce(int _index, double _torque);
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                  const math::Angle &_angle);
 
-      /// \brief Set the max allowed force of an axis(index).
-      public: virtual void SetMaxForce(int _index, double _t);
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                  const math::Angle &_angle);
 
-      /// \brief Get the max allowed force of an axis(index).
-      public: virtual double GetMaxForce(int _index);
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
 
-      /// \brief Set the high stop of an axis(index).
-      public: virtual void SetHighStop(int _index, const math::Angle &_angle);
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
 
-      /// \brief Set the low stop of an axis(index).
-      public: virtual void SetLowStop(int _index, const math::Angle &_angle);
+      // Documentation inherited.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
-      /// \brief Get the high stop of an axis(index).
-      public: virtual math::Angle GetHighStop(int _index);
+      // Documentation inherited.
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
-      /// \brief Get the low stop of an axis(index).
-      public: virtual math::Angle GetLowStop(int _index);
-
-      /// \brief Get the axis of rotation
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
-
-      /// \brief Get the angle of rotation
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _torque);
 
       /// \brief Pointer to bullet hinge2 constraint
       private: btHinge2Constraint *bulletHinge2;
diff --git a/gazebo/physics/bullet/BulletHingeJoint.cc b/gazebo/physics/bullet/BulletHingeJoint.cc
index 92c000a..a0a30ef 100644
--- a/gazebo/physics/bullet/BulletHingeJoint.cc
+++ b/gazebo/physics/bullet/BulletHingeJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,14 +14,11 @@
  * limitations under the License.
  *
 */
-/* Desc: A BulletHingeJoint
- * Author: Nate Koenig, Andrew Howard
- * Date: 21 May 2003
- */
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Exception.hh"
 
+#include "gazebo/physics/Model.hh"
 #include "gazebo/physics/bullet/BulletLink.hh"
 #include "gazebo/physics/bullet/BulletPhysics.hh"
 #include "gazebo/physics/bullet/BulletHingeJoint.hh"
@@ -136,11 +133,15 @@ void BulletHingeJoint::Init()
   // Throw an error if no links are given.
   else
   {
-    gzthrow("joint without links\n");
+    gzerr << "unable to create bullet hinge without links.\n";
+    return;
   }
 
   if (!this->bulletHinge)
-    gzthrow("unable to create bullet hinge constraint\n");
+  {
+    gzerr << "unable to create bullet hinge constraint\n";
+    return;
+  }
 
   // Give parent class BulletJoint a pointer to this constraint.
   this->constraint = this->bulletHinge;
@@ -155,8 +156,8 @@ void BulletHingeJoint::Init()
   sdf::ElementPtr limitElem;
   limitElem = this->sdf->GetElement("axis")->GetElement("limit");
   this->bulletHinge->setLimit(
-    this->angleOffset + limitElem->GetValueDouble("lower"),
-    this->angleOffset + limitElem->GetValueDouble("upper"));
+    this->angleOffset + limitElem->Get<double>("lower"),
+    this->angleOffset + limitElem->Get<double>("upper"));
 
   // Add the joint to the world
   GZ_ASSERT(this->bulletWorld, "bullet world pointer is NULL");
@@ -164,10 +165,13 @@ void BulletHingeJoint::Init()
 
   // Allows access to impulse
   this->bulletHinge->enableFeedback(true);
+
+  // Setup Joint force and torque feedback
+  this->SetupJointFeedback();
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletHingeJoint::GetAnchor(int /*_index*/) const
+math::Vector3 BulletHingeJoint::GetAnchor(unsigned int /*_index*/) const
 {
   btTransform trans = this->bulletHinge->getAFrame();
   trans.getOrigin() +=
@@ -177,21 +181,16 @@ math::Vector3 BulletHingeJoint::GetAnchor(int /*_index*/) const
 }
 
 //////////////////////////////////////////////////
-void BulletHingeJoint::SetAnchor(int /*_index*/,
-                                 const math::Vector3 &/*_anchor*/)
-{
-  // The anchor (pivot in Bullet lingo), can only be set on creation
-}
-
-//////////////////////////////////////////////////
-void BulletHingeJoint::SetAxis(int /*_index*/, const math::Vector3 &_axis)
+void BulletHingeJoint::SetAxis(unsigned int /*_index*/,
+    const math::Vector3 &_axis)
 {
   // Note that _axis is given in a world frame,
   // but bullet uses a body-fixed frame
   if (this->bulletHinge == NULL)
   {
     // this hasn't been initialized yet, store axis in initialWorldAxis
-    this->initialWorldAxis = _axis;
+    math::Quaternion axisFrame = this->GetAxisFrame(0);
+    this->initialWorldAxis = axisFrame.RotateVector(_axis);
   }
   else
   {
@@ -206,31 +205,33 @@ void BulletHingeJoint::SetAxis(int /*_index*/, const math::Vector3 &_axis)
 }
 
 //////////////////////////////////////////////////
-void BulletHingeJoint::SetDamping(int /*index*/, double /*_damping*/)
-{
-  gzerr << "Not implemented\n";
-}
-
-//////////////////////////////////////////////////
-math::Angle BulletHingeJoint::GetAngleImpl(int /*_index*/) const
+math::Angle BulletHingeJoint::GetAngleImpl(unsigned int /*_index*/) const
 {
   math::Angle result;
   if (this->bulletHinge)
     result = this->bulletHinge->getHingeAngle() - this->angleOffset;
-  else
-    gzwarn << "bulletHinge does not exist, returning default angle\n";
   return result;
 }
 
 //////////////////////////////////////////////////
-void BulletHingeJoint::SetVelocity(int /*_index*/, double /*_angle*/)
+void BulletHingeJoint::SetVelocity(unsigned int _index, double _angle)
 {
-  // this->bulletHinge->enableAngularMotor(true, -_angle,
+  // The following call should work, but doesn't:
+  // this->bulletHinge->enableAngularMotor(true, _angle,
   // this->GetMaxForce(_index));
+
+  // TODO: Should prescribe the linear velocity of the child link if there is an
+  // offset between the child's CG and the joint anchor.
+  math::Vector3 desiredVel;
+  if (this->parentLink)
+    desiredVel = this->parentLink->GetWorldAngularVel();
+  desiredVel += _angle * this->GetGlobalAxis(_index);
+  if (this->childLink)
+    this->childLink->SetAngularVel(desiredVel);
 }
 
 //////////////////////////////////////////////////
-double BulletHingeJoint::GetVelocity(int /*_index*/) const
+double BulletHingeJoint::GetVelocity(unsigned int /*_index*/) const
 {
   double result = 0;
   math::Vector3 globalAxis = this->GetGlobalAxis(0);
@@ -242,45 +243,22 @@ double BulletHingeJoint::GetVelocity(int /*_index*/) const
 }
 
 //////////////////////////////////////////////////
-void BulletHingeJoint::SetMaxForce(int /*_index*/, double _t)
+void BulletHingeJoint::SetMaxForce(unsigned int /*_index*/, double _t)
 {
   this->bulletHinge->setMaxMotorImpulse(_t);
 }
 
 //////////////////////////////////////////////////
-double BulletHingeJoint::GetMaxForce(int /*_index*/)
+double BulletHingeJoint::GetMaxForce(unsigned int /*_index*/)
 {
   return this->bulletHinge->getMaxMotorImpulse();
 }
 
 //////////////////////////////////////////////////
-void BulletHingeJoint::SetForce(int _index, double _effort)
+void BulletHingeJoint::SetForceImpl(unsigned int /*_index*/, double _effort)
 {
-  if (_index < 0 || static_cast<unsigned int>(_index) >= this->GetAngleCount())
-  {
-    gzerr << "Calling BulletHingeJoint::SetForce with an index ["
-          << _index << "] out of range\n";
-    return;
-  }
-
-  // truncating SetForce effort if velocity limit reached.
-  if (this->velocityLimit[_index] >= 0)
-  {
-    if (this->GetVelocity(_index) > this->velocityLimit[_index])
-      _effort = _effort > 0 ? 0 : _effort;
-    else if (this->GetVelocity(_index) < -this->velocityLimit[_index])
-      _effort = _effort < 0 ? 0 : _effort;
-  }
-
-  // truncate effort unless effortLimit is negative.
-  if (this->effortLimit[_index] >= 0)
-    _effort = math::clamp(_effort, -this->effortLimit[_index],
-       this->effortLimit[_index]);
-
   if (this->bulletHinge)
   {
-    BulletJoint::SetForce(_index, _effort);
-
     // z-axis of constraint frame
     btVector3 hingeAxisLocalA =
       this->bulletHinge->getFrameOffsetA().getBasis().getColumn(2);
@@ -303,7 +281,7 @@ void BulletHingeJoint::SetForce(int _index, double _effort)
 }
 
 //////////////////////////////////////////////////
-void BulletHingeJoint::SetHighStop(int /*_index*/,
+bool BulletHingeJoint::SetHighStop(unsigned int /*_index*/,
                       const math::Angle &_angle)
 {
   Joint::SetHighStop(0, _angle);
@@ -314,11 +292,17 @@ void BulletHingeJoint::SetHighStop(int /*_index*/,
     // settings
     this->bulletHinge->setLimit(this->bulletHinge->getLowerLimit(),
                                 this->angleOffset + _angle.Radian());
+    return true;
+  }
+  else
+  {
+    gzerr << "bulletHinge not yet created.\n";
+    return false;
   }
 }
 
 //////////////////////////////////////////////////
-void BulletHingeJoint::SetLowStop(int /*_index*/,
+bool BulletHingeJoint::SetLowStop(unsigned int /*_index*/,
                      const math::Angle &_angle)
 {
   Joint::SetLowStop(0, _angle);
@@ -329,11 +313,17 @@ void BulletHingeJoint::SetLowStop(int /*_index*/,
     // settings
     this->bulletHinge->setLimit(this->angleOffset + _angle.Radian(),
                                 this->bulletHinge->getUpperLimit());
+    return true;
+  }
+  else
+  {
+    gzerr << "bulletHinge not yet created.\n";
+    return false;
   }
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletHingeJoint::GetHighStop(int /*_index*/)
+math::Angle BulletHingeJoint::GetHighStop(unsigned int /*_index*/)
 {
   math::Angle result;
 
@@ -346,7 +336,7 @@ math::Angle BulletHingeJoint::GetHighStop(int /*_index*/)
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletHingeJoint::GetLowStop(int /*_index*/)
+math::Angle BulletHingeJoint::GetLowStop(unsigned int /*_index*/)
 {
   math::Angle result;
   if (this->bulletHinge)
@@ -358,9 +348,10 @@ math::Angle BulletHingeJoint::GetLowStop(int /*_index*/)
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletHingeJoint::GetGlobalAxis(int /*_index*/) const
+math::Vector3 BulletHingeJoint::GetGlobalAxis(unsigned int /*_index*/) const
 {
-  math::Vector3 result;
+  math::Vector3 result = this->initialWorldAxis;
+
   if (this->bulletHinge)
   {
     // I have not verified the following math, though I based it on internal
@@ -370,7 +361,6 @@ math::Vector3 BulletHingeJoint::GetGlobalAxis(int /*_index*/) const
       bulletHinge->getFrameOffsetA().getBasis().getColumn(2);
     result = BulletTypes::ConvertVector3(vec);
   }
-  else
-    gzwarn << "bulletHinge does not exist, returning fake axis\n";
+
   return result;
 }
diff --git a/gazebo/physics/bullet/BulletHingeJoint.hh b/gazebo/physics/bullet/BulletHingeJoint.hh
index 40c5edc..c3910e7 100644
--- a/gazebo/physics/bullet/BulletHingeJoint.hh
+++ b/gazebo/physics/bullet/BulletHingeJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,19 +14,15 @@
  * limitations under the License.
  *
 */
-/* Desc: A body that has a box shape
- * Author: Nate Koenig, Andrew Howard
- * Date: 21 May 2003
- */
-
 #ifndef _BULLETHINGEJOINT_HH_
 #define _BULLETHINGEJOINT_HH_
 
-#include "math/Angle.hh"
-#include "math/Vector3.hh"
-#include "physics/HingeJoint.hh"
-#include "physics/bullet/BulletJoint.hh"
-#include "physics/bullet/BulletPhysics.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/physics/HingeJoint.hh"
+#include "gazebo/physics/bullet/BulletJoint.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/util/system.hh"
 
 class btHingeConstraint;
 
@@ -39,7 +35,7 @@ namespace gazebo
     /// \{
 
     /// \brief A single axis hinge joint
-    class BulletHingeJoint : public HingeJoint<BulletJoint>
+    class GAZEBO_VISIBLE BulletHingeJoint : public HingeJoint<BulletJoint>
     {
       ///  Constructor
       public: BulletHingeJoint(btDynamicsWorld *world, BasePtr _parent);
@@ -54,49 +50,46 @@ namespace gazebo
       public: virtual void Init();
 
       // Documentation inherited.
-      public: virtual math::Vector3 GetAnchor(int _index) const;
-
-      // Documentation inherited.
-      public: virtual void SetAnchor(int _index, const math::Vector3 &_anchor);
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
       // Documentation inherited.
-      public: virtual void SetAxis(int _index, const math::Vector3 &_axis);
-
-      /// \brief Set joint damping, not yet implemented
-      public: virtual void SetDamping(int _index, double _damping);
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
 
       // Documentation inherited.
-      public: virtual void SetVelocity(int _index, double _vel);
+      public: virtual void SetVelocity(unsigned int _index, double _vel);
 
       // Documentation inherited.
-      public: virtual double GetVelocity(int _index) const;
+      public: virtual double GetVelocity(unsigned int _index) const;
 
       // Documentation inherited.
-      public: virtual void SetMaxForce(int _index, double _t);
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
       // Documentation inherited.
-      public: virtual double GetMaxForce(int _index);
+      public: virtual double GetMaxForce(unsigned int _index);
 
       // Documentation inherited.
-      public: virtual void SetForce(int _index, double _effort);
+      public: virtual bool SetHighStop(unsigned int _index,
+                  const math::Angle &_angle);
 
       // Documentation inherited.
-      public: virtual void SetHighStop(int _index, const math::Angle &_angle);
+      public: virtual bool SetLowStop(unsigned int _index,
+                  const math::Angle &_angle);
 
       // Documentation inherited.
-      public: virtual void SetLowStop(int _index, const math::Angle &_angle);
+      public: virtual math::Angle GetHighStop(unsigned int _index);
 
       // Documentation inherited.
-      public: virtual math::Angle GetHighStop(int _index);
+      public: virtual math::Angle GetLowStop(unsigned int _index);
 
       // Documentation inherited.
-      public: virtual math::Angle GetLowStop(int _index);
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
       // Documentation inherited.
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
       // Documentation inherited.
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
 
       /// \brief Pointer to bullet hinge constraint.
       private: btHingeConstraint *bulletHinge;
diff --git a/gazebo/physics/bullet/BulletJoint.cc b/gazebo/physics/bullet/BulletJoint.cc
index a188bb2..16aac89 100644
--- a/gazebo/physics/bullet/BulletJoint.cc
+++ b/gazebo/physics/bullet/BulletJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,12 +19,15 @@
  * Date: 15 May 2009
  */
 
-#include "common/Exception.hh"
-#include "common/Console.hh"
+#include <string>
 
-#include "physics/bullet/bullet_inc.h"
-#include "physics/bullet/BulletLink.hh"
-#include "physics/bullet/BulletJoint.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/bullet/bullet_inc.h"
+#include "gazebo/physics/bullet/BulletLink.hh"
+#include "gazebo/physics/bullet/BulletJoint.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -35,6 +38,10 @@ BulletJoint::BulletJoint(BasePtr _parent)
 {
   this->constraint = NULL;
   this->bulletWorld = NULL;
+  this->feedback = NULL;
+  this->stiffnessDampingInitialized = false;
+  this->forceApplied[0] = 0;
+  this->forceApplied[1] = 0;
 }
 
 //////////////////////////////////////////////////
@@ -48,6 +55,50 @@ BulletJoint::~BulletJoint()
 void BulletJoint::Load(sdf::ElementPtr _sdf)
 {
   Joint::Load(_sdf);
+
+  if (this->sdf->HasElement("axis"))
+  {
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
+    if (axisElem->HasElement("dynamics"))
+    {
+      sdf::ElementPtr dynamicsElem = axisElem->GetElement("dynamics");
+
+      if (dynamicsElem->HasElement("damping"))
+      {
+        this->SetDamping(0, dynamicsElem->Get<double>("damping"));
+      }
+      if (dynamicsElem->HasElement("friction"))
+      {
+        sdf::ElementPtr frictionElem = dynamicsElem->GetElement("friction");
+        gzlog << "joint friction not implemented\n";
+      }
+    }
+  }
+
+  if (this->sdf->HasElement("axis2"))
+  {
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
+    if (axisElem->HasElement("dynamics"))
+    {
+      sdf::ElementPtr dynamicsElem = axisElem->GetElement("dynamics");
+
+      if (dynamicsElem->HasElement("damping"))
+      {
+        this->SetDamping(1, dynamicsElem->Get<double>("damping"));
+      }
+      if (dynamicsElem->HasElement("friction"))
+      {
+        sdf::ElementPtr frictionElem = dynamicsElem->GetElement("friction");
+        gzlog << "joint friction not implemented\n";
+      }
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::Init()
+{
+  Joint::Init();
 }
 
 //////////////////////////////////////////////////
@@ -57,7 +108,7 @@ void BulletJoint::Reset()
 }
 
 //////////////////////////////////////////////////
-LinkPtr BulletJoint::GetJointLink(int _index) const
+LinkPtr BulletJoint::GetJointLink(unsigned int _index) const
 {
   LinkPtr result;
 
@@ -103,14 +154,433 @@ void BulletJoint::Detach()
 }
 
 //////////////////////////////////////////////////
-JointWrench BulletJoint::GetForceTorque(int _index)
+void BulletJoint::CacheForceTorque()
 {
-  return this->GetForceTorque(static_cast<unsigned int>(_index));
+  if (!this->provideFeedback)
+    return;
+
+  // caching force torque for the joint
+  // if cached, GetForceTorque should use this value
+  // this->wrench
+  this->wrench.body2Force = BulletTypes::ConvertVector3(
+                      this->feedback->m_appliedForceBodyA);
+  this->wrench.body2Torque = BulletTypes::ConvertVector3(
+                      this->feedback->m_appliedTorqueBodyA);
+  this->wrench.body1Force = BulletTypes::ConvertVector3(
+                      this->feedback->m_appliedForceBodyB);
+  this->wrench.body1Torque = BulletTypes::ConvertVector3(
+                      this->feedback->m_appliedTorqueBodyB);
+  // gzerr << "   " << this->GetName()
+  //       << " : " << this->wrench.body1Force
+  //       << " : " << this->wrench.body1Torque
+  //       << " : " << this->wrench.body2Force
+  //       << " : " << this->wrench.body2Torque
+  //       << "\n";
+
+  // get force applied through SetForce
+  physics::JointWrench wrenchAppliedWorld;
+  if (this->HasType(physics::Base::HINGE_JOINT))
+  {
+    // rotate force into child link frame
+    // GetLocalAxis is the axis specified in parent link frame!!!
+    wrenchAppliedWorld.body2Torque =
+      this->GetForce(0u) * this->GetLocalAxis(0u);
+
+    // gzerr << "body2Torque [" << wrenchAppliedWorld.body2Torque
+    //       << "] axis [" << this->GetLocalAxis(0u)
+    //       << "]\n";
+
+    wrenchAppliedWorld.body1Torque = -wrenchAppliedWorld.body2Torque;
+  }
+  else if (this->HasType(physics::Base::SLIDER_JOINT))
+  {
+    // rotate force into child link frame
+    wrenchAppliedWorld.body2Force =
+      this->GetForce(0u) * this->GetLocalAxis(0u);
+    wrenchAppliedWorld.body1Force = -wrenchAppliedWorld.body2Force;
+  }
+  else
+  {
+    /// \TODO: implement for other joint types
+    // gzerr << "force torque for joint type [" << this->GetType()
+    //       << "] not implemented, returns false results!!\n";
+  }
+
+  // convert wrench from child cg location to child link frame
+  if (this->childLink)
+  {
+    math::Pose childPose = this->childLink->GetWorldPose();
+
+    // convert torque from about child CG to joint anchor location
+    // cg position specified in child link frame
+    math::Pose cgPose = this->childLink->GetInertial()->GetPose();
+
+    // anchorPose location of joint in child frame
+    // childMomentArm: from child CG to joint location in child link frame
+    // moment arm rotated into world frame (given feedback is in world frame)
+    math::Vector3 childMomentArm = childPose.rot.RotateVector(
+      (this->anchorPose - math::Pose(cgPose.pos, math::Quaternion())).pos);
+
+    // gzerr << "anchor [" << anchorPose
+    //       << "] iarm[" << this->childLink->GetInertial()->GetPose().pos
+    //       << "] childMomentArm[" << childMomentArm
+    //       << "] f1[" << this->wrench.body2Force
+    //       << "] t1[" << this->wrench.body2Torque
+    //       << "] fxp[" << this->wrench.body2Force.Cross(childMomentArm)
+    //       << "]\n";
+
+    this->wrench.body2Torque += this->wrench.body2Force.Cross(childMomentArm);
+
+    // rotate resulting body2Force in world frame into link frame
+    this->wrench.body2Force = childPose.rot.RotateVectorReverse(
+      -this->wrench.body2Force);
+
+    // rotate resulting body2Torque in world frame into link frame
+    this->wrench.body2Torque = childPose.rot.RotateVectorReverse(
+      -this->wrench.body2Torque);
+  }
+
+  // convert torque from about parent CG to joint anchor location
+  if (this->parentLink)
+  {
+    // get child pose, or it's the inertial world if childLink is NULL
+    math::Pose childPose;
+    if (this->childLink)
+      childPose = this->childLink->GetWorldPose();
+
+    math::Pose parentPose = this->parentLink->GetWorldPose();
+
+    // if parent link exists, convert torque from about parent
+    // CG to joint anchor location
+
+    // parent cg specified in parent link frame
+    math::Pose cgPose = this->parentLink->GetInertial()->GetPose();
+
+    // get parent CG pose in child link frame
+    math::Pose parentCGInChildLink =
+      math::Pose(cgPose.pos, math::Quaternion()) - (childPose - parentPose);
+
+    // anchor location in parent CG frame
+    // this is the moment arm, but it's in parent CG frame, we need
+    // to convert it into world frame
+    math::Pose anchorInParendCGFrame = this->anchorPose - parentCGInChildLink;
+
+    // paretnCGFrame in world frame
+    math::Pose parentCGInWorld = cgPose + parentPose;
+
+    // rotate momeent arms into world frame
+    math::Vector3 parentMomentArm = parentCGInWorld.rot.RotateVector(
+      (this->anchorPose - parentCGInChildLink).pos);
+
+    // gzerr << "anchor [" << this->anchorPose
+    //       << "] pcginc[" << parentCGInChildLink
+    //       << "] iarm[" << cgPose
+    //       << "] anc2pcg[" << this->anchorPose - parentCGInChildLink
+    //       << "] parentMomentArm[" << parentMomentArm
+    //       << "] f1[" << this->wrench.body1Force
+    //       << "] t1[" << this->wrench.body1Torque
+    //       << "] fxp[" << this->wrench.body1Force.Cross(parentMomentArm)
+    //       << "]\n";
+
+    this->wrench.body1Torque += this->wrench.body1Force.Cross(parentMomentArm);
+
+    // rotate resulting body1Force in world frame into link frame
+    this->wrench.body1Force = parentPose.rot.RotateVectorReverse(
+      -this->wrench.body1Force);
+
+    // rotate resulting body1Torque in world frame into link frame
+    this->wrench.body1Torque = parentPose.rot.RotateVectorReverse(
+      -this->wrench.body1Torque);
+
+    if (!this->childLink)
+    {
+      // if child link does not exist, use equal and opposite
+      this->wrench.body2Force = -this->wrench.body1Force;
+      this->wrench.body2Torque = -this->wrench.body1Torque;
+
+      // force/torque are in parent link frame, transform them into
+      // child link(world) frame.
+      math::Pose parentToWorldTransform = this->parentLink->GetWorldPose();
+      this->wrench.body1Force =
+        parentToWorldTransform.rot.RotateVector(
+        this->wrench.body1Force);
+      this->wrench.body1Torque =
+        parentToWorldTransform.rot.RotateVector(
+        this->wrench.body1Torque);
+    }
+  }
+  else
+  {
+    if (!this->childLink)
+    {
+      gzerr << "Joint [" << this->GetScopedName()
+            << "]: Both parent and child links are invalid, abort.\n";
+      return;
+    }
+    else
+    {
+      // if parentLink does not exist, use equal opposite body1 wrench
+      this->wrench.body1Force = -this->wrench.body2Force;
+      this->wrench.body1Torque = -this->wrench.body2Torque;
+
+      // force/torque are in child link frame, transform them into
+      // parent link frame.  Here, parent link is world, so zero transform.
+      math::Pose childToWorldTransform = this->childLink->GetWorldPose();
+      this->wrench.body1Force =
+        childToWorldTransform.rot.RotateVector(
+        this->wrench.body1Force);
+      this->wrench.body1Torque =
+        childToWorldTransform.rot.RotateVector(
+        this->wrench.body1Torque);
+    }
+  }
+  this->wrench = this->wrench - wrenchAppliedWorld;
 }
 
 //////////////////////////////////////////////////
 JointWrench BulletJoint::GetForceTorque(unsigned int /*_index*/)
 {
-  JointWrench wrench;
-  return wrench;
+  return this->wrench;
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::SetupJointFeedback()
+{
+  if (this->provideFeedback)
+  {
+    this->feedback = new btJointFeedback;
+    this->feedback->m_appliedForceBodyA = btVector3(0, 0, 0);
+    this->feedback->m_appliedForceBodyB = btVector3(0, 0, 0);
+    this->feedback->m_appliedTorqueBodyA = btVector3(0, 0, 0);
+    this->feedback->m_appliedTorqueBodyB = btVector3(0, 0, 0);
+
+    if (this->constraint)
+      this->constraint->setJointFeedback(this->feedback);
+    else
+    {
+      gzerr << "Bullet Joint [" << this->GetName() << "] ID is invalid\n";
+      getchar();
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::SetDamping(unsigned int _index, double _damping)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->SetStiffnessDamping(_index, this->stiffnessCoefficient[_index],
+      _damping);
+  }
+  else
+  {
+     gzerr << "BulletJoint::SetDamping: index[" << _index
+           << "] is out of bounds (GetAngleCount() = "
+           << this->GetAngleCount() << ").\n";
+     return;
+  }
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::SetStiffness(unsigned int _index, double _stiffness)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->SetStiffnessDamping(_index, _stiffness,
+      this->dissipationCoefficient[_index]);
+  }
+  else
+  {
+     gzerr << "BulletJoint::SetStiffness: index[" << _index
+           << "] is out of bounds (GetAngleCount() = "
+           << this->GetAngleCount() << ").\n";
+     return;
+  }
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::SetStiffnessDamping(unsigned int _index,
+  double _stiffness, double _damping, double _reference)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->stiffnessCoefficient[_index] = _stiffness;
+    this->dissipationCoefficient[_index] = _damping;
+    this->springReferencePosition[_index] = _reference;
+
+    /// \TODO: this check might not be needed?  attaching an object to a static
+    /// body should not affect damping application.
+    bool parentStatic =
+      this->GetParent() ? this->GetParent()->IsStatic() : false;
+    bool childStatic =
+      this->GetChild() ? this->GetChild()->IsStatic() : false;
+
+    if (!this->stiffnessDampingInitialized)
+    {
+      if (!parentStatic && !childStatic)
+      {
+        this->applyDamping = physics::Joint::ConnectJointUpdate(
+          boost::bind(&BulletJoint::ApplyStiffnessDamping, this));
+        this->stiffnessDampingInitialized = true;
+      }
+      else
+      {
+        gzwarn << "Spring Damper for Joint[" << this->GetName()
+               << "] is not initialized because either parent[" << parentStatic
+               << "] or child[" << childStatic << "] is static.\n";
+      }
+    }
+  }
+  else
+    gzerr << "SetStiffnessDamping _index too large.\n";
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::SetForce(unsigned int _index, double _force)
+{
+  double force = Joint::CheckAndTruncateForce(_index, _force);
+  this->SaveForce(_index, force);
+  this->SetForceImpl(_index, force);
+
+  // for engines that supports auto-disable of links
+  if (this->childLink) this->childLink->SetEnabled(true);
+  if (this->parentLink) this->parentLink->SetEnabled(true);
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::SaveForce(unsigned int _index, double _force)
+{
+  // this bit of code actually doesn't do anything physical,
+  // it simply records the forces commanded inside forceApplied.
+  if (_index < this->GetAngleCount())
+  {
+    if (this->forceAppliedTime < this->GetWorld()->GetSimTime())
+    {
+      // reset forces if time step is new
+      this->forceAppliedTime = this->GetWorld()->GetSimTime();
+      this->forceApplied[0] = this->forceApplied[1] = 0;
+    }
+
+    this->forceApplied[_index] += _force;
+  }
+  else
+    gzerr << "Something's wrong, joint [" << this->GetName()
+          << "] index [" << _index
+          << "] out of range.\n";
+}
+
+//////////////////////////////////////////////////
+double BulletJoint::GetForce(unsigned int _index)
+{
+  if (_index < this->GetAngleCount())
+  {
+    return this->forceApplied[_index];
+  }
+  else
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get force\n";
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::ApplyStiffnessDamping()
+{
+  for (unsigned int i = 0; i < this->GetAngleCount(); ++i)
+  {
+    // Take absolute value of dissipationCoefficient, since negative values of
+    // dissipationCoefficient are used for adaptive damping to
+    // enforce stability.
+    double dampingForce = -fabs(this->dissipationCoefficient[i])
+      * this->GetVelocity(i);
+
+    double springForce = this->stiffnessCoefficient[i]
+      * (this->springReferencePosition[i] - this->GetAngle(i).Radian());
+
+    // do not change forceApplied if setting internal damping forces
+    this->SetForceImpl(i, dampingForce + springForce);
+
+    // gzerr << this->GetVelocity(0) << " : " << dampingForce << "\n";
+  }
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::SetAnchor(unsigned int /*_index*/,
+    const gazebo::math::Vector3 & /*_anchor*/)
+{
+  // nothing to do here for bullet.
+}
+
+//////////////////////////////////////////////////
+math::Vector3 BulletJoint::GetAnchor(unsigned int /*_index*/) const
+{
+  gzerr << "Not implement in Bullet\n";
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 BulletJoint::GetLinkForce(unsigned int /*_index*/) const
+{
+  gzerr << "Not implement in Bullet\n";
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 BulletJoint::GetLinkTorque(unsigned int /*_index*/) const
+{
+  gzerr << "Not implement in Bullet\n";
+  return math::Vector3();
 }
+
+//////////////////////////////////////////////////
+void BulletJoint::SetAttribute(Attribute, unsigned int /*_index*/,
+    double /*_value*/)
+{
+  gzdbg << "Not implement in Bullet\n";
+}
+
+//////////////////////////////////////////////////
+void BulletJoint::SetAttribute(const std::string &_key,
+    unsigned int _index,
+    const boost::any &_value)
+{
+  this->SetParam(_key, _index, _value);
+}
+
+//////////////////////////////////////////////////
+bool BulletJoint::SetParam(const std::string &/*_key*/,
+    unsigned int /*_index*/,
+    const boost::any &/*_value*/)
+{
+  gzdbg << "Not implement in Bullet\n";
+  return false;
+}
+
+//////////////////////////////////////////////////
+double BulletJoint::GetParam(const std::string &/*_key*/,
+    unsigned int /*_index*/)
+{
+  gzdbg << "Not implement in Bullet\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+double BulletJoint::GetAttribute(const std::string &_key,
+    unsigned int _index)
+{
+  return this->GetParam(_key, _index);
+}
+
+//////////////////////////////////////////////////
+math::Angle BulletJoint::GetHighStop(unsigned int _index)
+{
+  return this->GetUpperLimit(_index);
+}
+
+//////////////////////////////////////////////////
+math::Angle BulletJoint::GetLowStop(unsigned int _index)
+{
+  return this->GetLowerLimit(_index);
+}
+
diff --git a/gazebo/physics/bullet/BulletJoint.hh b/gazebo/physics/bullet/BulletJoint.hh
index b1a2540..473687a 100644
--- a/gazebo/physics/bullet/BulletJoint.hh
+++ b/gazebo/physics/bullet/BulletJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,8 +25,9 @@
 #include <boost/any.hpp>
 #include <string>
 
-#include "physics/bullet/BulletPhysics.hh"
-#include "physics/Joint.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/Joint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +38,7 @@ namespace gazebo
     /// \{
 
     /// \brief Base class for all joints
-    class BulletJoint : public Joint
+    class GAZEBO_VISIBLE BulletJoint : public Joint
     {
       /// \brief Constructor
       public: BulletJoint(BasePtr _parent);
@@ -53,7 +54,7 @@ namespace gazebo
 
       /// \brief Get the body to which the joint is attached
       ///        according the _index
-      public: LinkPtr GetJointLink(int _index) const;
+      public: LinkPtr GetJointLink(unsigned int _index) const;
 
       /// \brief Determines of the two bodies are connected by a joint
       public: bool AreConnected(LinkPtr _one, LinkPtr _two) const;
@@ -62,73 +63,123 @@ namespace gazebo
       public: virtual void Detach();
 
       /// \brief Set the anchor point
-      public: virtual void SetAnchor(int /*index*/,
-                                      const gazebo::math::Vector3 & /*anchor*/)
-              {
-                gzerr << "Not implement in Bullet\n";
-              }
-
-      /// \brief Set the joint damping
-      public: virtual void SetDamping(int /*index*/,
-                                      const double /*damping*/)
-              {
-                gzerr << "Not implement in Bullet\n";
-              }
+      public: virtual void SetAnchor(unsigned int _index,
+                                     const gazebo::math::Vector3 &_anchor);
+
+      // Documentation inherited
+      public: virtual void SetDamping(unsigned int _index, double _damping);
+
+      // Documentation inherited.
+      public: virtual void SetStiffness(unsigned int _index,
+                  const double _stiffness);
+
+      // Documentation inherited.
+      public: virtual void SetStiffnessDamping(unsigned int _index,
+        double _stiffness, double _damping, double _reference = 0);
 
       /// \brief Get the anchor point
-      public: virtual math::Vector3 GetAnchor(int /*_index*/) const
-              {
-                gzerr << "Not implement in Bullet\n";
-                return math::Vector3();
-              }
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
       /// \brief Get the force the joint applies to the first body
       /// \param index The index of the body(0 or 1)
-      public: virtual math::Vector3 GetLinkForce(unsigned int /*_index*/) const
-              {
-                gzerr << "Not implement in Bullet\n";
-                return math::Vector3();
-              }
+      public: virtual math::Vector3 GetLinkForce(unsigned int _index) const;
 
       /// \brief Get the torque the joint applies to the first body
       /// \param index The index of the body(0 or 1)
-      public: virtual math::Vector3 GetLinkTorque(unsigned int /*_index*/) const
-              {
-                gzerr << "Not implement in Bullet\n";
-                return math::Vector3();
-              }
+      public: virtual math::Vector3 GetLinkTorque(unsigned int _index) const;
 
       /// \brief Set a parameter for the joint
-      public: virtual void SetAttribute(Attribute, int /*_index*/,
-                                        double /*_value*/)
-              {
-                gzerr << "Not implement in Bullet\n";
-              }
+      public: virtual void SetAttribute(Attribute, unsigned int _index,
+                                        double _value);
 
       // Documentation inherited.
-      public: virtual void SetAttribute(const std::string &/*_key*/,
-                                        int /*_index*/,
-                                        const boost::any &/*_value*/)
-              {
-                gzerr << "Not implement in Bullet\n";
-              }
+      public: virtual bool SetParam(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value);
 
       // Documentation inherited.
-      public: virtual double GetAttribute(const std::string &/*_key*/,
-                                                unsigned int /*_index*/)
-              {
-                gzerr << "Not implement in Bullet\n";
-                return 0;
-              }
+      public: virtual void SetAttribute(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value)
+                                        GAZEBO_DEPRECATED(3.0);
 
-      protected: btTypedConstraint *constraint;
-      protected: btDynamicsWorld *bulletWorld;
+      // Documentation inherited.
+      public: virtual double GetParam(const std::string &_key,
+                                          unsigned int _index);
 
       // Documentation inherited.
-      public: virtual JointWrench GetForceTorque(int _index);
+      public: virtual double GetAttribute(const std::string &_key,
+                unsigned int _index) GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual void CacheForceTorque();
 
       // Documentation inherited.
       public: virtual JointWrench GetForceTorque(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual void SetForce(unsigned int _index, double _force);
+
+      // Documentation inherited.
+      public: virtual double GetForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited.
+      public: virtual void ApplyStiffnessDamping();
+
+      /// \brief Set the force applied to this physics::Joint.
+      /// Note that the unit of force should be consistent with the rest
+      /// of the simulation scales.
+      /// Force is additive (multiple calls
+      /// to SetForceImpl to the same joint in the same time
+      /// step will accumulate forces on that Joint).
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _force Force value.
+      /// internal force, e.g. damping forces.  This way, Joint::appliedForce
+      /// keep track of external forces only.
+      protected: virtual void SetForceImpl(unsigned int _index,
+                     double _force) = 0;
+
+      /// \brief: Setup joint feedback datatructure.
+      /// This is called after Joint::constraint is setup in Init.
+      protected: void SetupJointFeedback();
+
+      /// \brief Save external forces applied to this Joint.
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _force Force value.
+      private: void SaveForce(unsigned int _index, double _force);
+
+      /// \brief Pointer to a contraint object in Bullet.
+      protected: btTypedConstraint *constraint;
+
+      /// \brief Pointer to Bullet's btDynamicsWorld.
+      protected: btDynamicsWorld *bulletWorld;
+
+      /// \brief Feedback data for this joint
+      private: btJointFeedback *feedback;
+
+      /// \brief internal variable to keep track if ConnectJointUpdate
+      /// has been called on a damping method
+      private: bool stiffnessDampingInitialized;
+
+      /// \brief Save force applied by user
+      /// This plus the joint feedback (joint contstraint forces) is the
+      /// equivalent of simulated force torque sensor reading
+      /// Allocate a 2 vector in case hinge2 joint is used.
+      /// This is used by Bullet to store external force applied by the user.
+      private: double forceApplied[MAX_JOINT_AXIS];
+
+      /// \brief Save time at which force is applied by user
+      /// This will let us know if it's time to clean up forceApplied.
+      private: common::Time forceAppliedTime;
     };
     /// \}
   }
diff --git a/gazebo/physics/bullet/BulletLink.cc b/gazebo/physics/bullet/BulletLink.cc
index 6f0f5db..db14cb6 100644
--- a/gazebo/physics/bullet/BulletLink.cc
+++ b/gazebo/physics/bullet/BulletLink.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,12 +24,14 @@
 #include "gazebo/common/Exception.hh"
 
 #include "gazebo/physics/World.hh"
+#include "gazebo/physics/Model.hh"
 
 #include "gazebo/physics/bullet/bullet_inc.h"
 #include "gazebo/physics/bullet/BulletCollision.hh"
+#include "gazebo/physics/bullet/BulletLink.hh"
 #include "gazebo/physics/bullet/BulletMotionState.hh"
 #include "gazebo/physics/bullet/BulletPhysics.hh"
-#include "gazebo/physics/bullet/BulletLink.hh"
+#include "gazebo/physics/bullet/BulletSurfaceParams.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -63,10 +65,14 @@ void BulletLink::Load(sdf::ElementPtr _sdf)
 //////////////////////////////////////////////////
 void BulletLink::Init()
 {
+  // Set the initial pose of the body
+  this->motionState.reset(new BulletMotionState(
+    boost::dynamic_pointer_cast<Link>(shared_from_this())));
+
   Link::Init();
 
   GZ_ASSERT(this->sdf != NULL, "Unable to initialize link, SDF is NULL");
-  this->SetKinematic(this->sdf->GetValueBool("kinematic"));
+  this->SetKinematic(this->sdf->Get<bool>("kinematic"));
 
   GZ_ASSERT(this->inertial != NULL, "Inertial pointer is NULL");
   btScalar mass = this->inertial->GetMass();
@@ -80,9 +86,18 @@ void BulletLink::Init()
   btVector3 fallInertia(0, 0, 0);
   math::Vector3 cogVec = this->inertial->GetCoG();
 
-  // Set the initial pose of the body
-  this->motionState.reset(new BulletMotionState(
-    boost::dynamic_pointer_cast<Link>(shared_from_this())));
+  /// \todo FIXME:  Friction Parameters
+  /// Currently, gazebo uses btCompoundShape to store multiple
+  /// <collision> shapes in bullet.  Each child shape could have a
+  /// different mu1 and mu2.  This is not ideal as friction is set
+  /// per BulletLink::rigidLink (btRigidBody : btCollisionObject).
+  /// Right now, the friction coefficients for the last BulletCollision
+  /// processed in this link below is stored in hackMu1, hackMu2.
+  /// The average is stored in this->rigidLink.
+  /// Final friction coefficient is applied in ContactCallback
+  /// by taking the lower of the 2 colliding rigidLink's.
+  double hackMu1 = 0;
+  double hackMu2 = 0;
 
   for (Base_V::iterator iter = this->children.begin();
        iter != this->children.end(); ++iter)
@@ -93,6 +108,12 @@ void BulletLink::Init()
       collision = boost::static_pointer_cast<BulletCollision>(*iter);
       btCollisionShape *shape = collision->GetCollisionShape();
 
+      hackMu1 = collision->GetBulletSurface()->frictionPyramid.GetMuPrimary();
+      hackMu2 = collision->GetBulletSurface()->frictionPyramid.GetMuSecondary();
+      // gzerr << "link[" << this->GetName()
+      //       << "] mu[" << hackMu1
+      //       << "] mu2[" << hackMu2 << "]\n";
+
       math::Pose relativePose = collision->GetRelativePose();
       relativePose.pos -= cogVec;
       if (!this->compoundShape)
@@ -127,6 +148,10 @@ void BulletLink::Init()
   this->rigidLink->setCollisionFlags(this->rigidLink->getCollisionFlags() |
       btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
 
+  /// \TODO: get friction from collision object
+  this->rigidLink->setAnisotropicFriction(btVector3(1, 1, 1),
+    btCollisionObject::CF_ANISOTROPIC_FRICTION);
+  this->rigidLink->setFriction(0.5*(hackMu1 + hackMu2));  // Hack
 
   // Setup motion clamping to prevent objects from moving too fast.
   // this->rigidLink->setCcdMotionThreshold(1);
@@ -157,9 +182,19 @@ void BulletLink::Init()
     }
   }
   bulletWorld->addRigidBody(this->rigidLink, categortyBits, collideBits);
-  // this->rigidLink->setSleepingThresholds(0,0);
 
-  this->SetGravityMode(this->sdf->GetValueBool("gravity"));
+  // Only use auto disable if no joints and no sensors are present
+  this->rigidLink->setActivationState(DISABLE_DEACTIVATION);
+  if (this->GetModel()->GetAutoDisable() &&
+      this->GetModel()->GetJointCount() == 0 &&
+      this->GetSensorCount() == 0)
+  {
+    this->rigidLink->setActivationState(ACTIVE_TAG);
+    this->rigidLink->setSleepingThresholds(0.1, 0.1);
+    this->rigidLink->setDeactivationTime(1.0);
+  }
+
+  this->SetGravityMode(this->sdf->Get<bool>("gravity"));
 
   this->SetLinearDamping(this->GetLinearDamping());
   this->SetAngularDamping(this->GetAngularDamping());
@@ -175,12 +210,6 @@ void BulletLink::Fini()
 }
 
 //////////////////////////////////////////////////
-void BulletLink::Update()
-{
-  Link::Update();
-}
-
-//////////////////////////////////////////////////
 void BulletLink::SetGravityMode(bool _mode)
 {
   if (!this->rigidLink)
@@ -393,31 +422,26 @@ math::Vector3 BulletLink::GetWorldAngularVel() const
 }
 
 //////////////////////////////////////////////////
-void BulletLink::SetForce(const math::Vector3 &/*_force*/)
+void BulletLink::SetForce(const math::Vector3 &_force)
 {
-  /*
   if (!this->rigidLink)
     return;
 
   this->rigidLink->applyCentralForce(
-      btmath::Vector3(_force.x, _force.y, _force.z));
-      */
+    btVector3(_force.x, _force.y, _force.z));
 }
 
 //////////////////////////////////////////////////
 math::Vector3 BulletLink::GetWorldForce() const
 {
-  /*
   if (!this->rigidLink)
     return math::Vector3(0, 0, 0);
 
-  btmath::Vector3 btVec;
+  btVector3 btVec;
 
   btVec = this->rigidLink->getTotalForce();
 
   return math::Vector3(btVec.x(), btVec.y(), btVec.z());
-  */
-  return math::Vector3();
 }
 
 //////////////////////////////////////////////////
@@ -456,6 +480,25 @@ btRigidBody *BulletLink::GetBulletLink() const
 }
 
 //////////////////////////////////////////////////
+void BulletLink::ClearCollisionCache()
+{
+  if (!this->rigidLink)
+  {
+    gzlog << "Bullet rigid body for link [" << this->GetName() << "]"
+          << " does not exist, unable to ClearCollisionCache" << std::endl;
+    return;
+  }
+
+  btDynamicsWorld *bulletWorld = this->bulletPhysics->GetDynamicsWorld();
+  GZ_ASSERT(bulletWorld != NULL, "Bullet dynamics world is NULL");
+
+  bulletWorld->updateSingleAabb(this->rigidLink);
+  bulletWorld->getBroadphase()->getOverlappingPairCache()->
+      cleanProxyFromPairs(this->rigidLink->getBroadphaseHandle(),
+      bulletWorld->getDispatcher());
+}
+
+//////////////////////////////////////////////////
 void BulletLink::SetLinearDamping(double _damping)
 {
   if (!this->rigidLink)
@@ -550,3 +593,9 @@ void BulletLink::SetAutoDisable(bool /*_disable*/)
 {
   gzlog << "BulletLink::SetAutoDisable not yet implemented." << std::endl;
 }
+
+//////////////////////////////////////////////////
+void BulletLink::SetLinkStatic(bool /*_static*/)
+{
+  gzlog << "To be implemented\n";
+}
diff --git a/gazebo/physics/bullet/BulletLink.hh b/gazebo/physics/bullet/BulletLink.hh
index e5ca0bf..801d8ce 100644
--- a/gazebo/physics/bullet/BulletLink.hh
+++ b/gazebo/physics/bullet/BulletLink.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,9 +22,10 @@
 #ifndef _BULLETLINK_HH_
 #define _BULLETLINK_HH_
 
-#include "physics/bullet/bullet_inc.h"
-#include "physics/bullet/BulletTypes.hh"
-#include "physics/Link.hh"
+#include "gazebo/physics/bullet/bullet_inc.h"
+#include "gazebo/physics/bullet/BulletTypes.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/util/system.hh"
 
 class btRigidBody;
 
@@ -40,7 +41,7 @@ namespace gazebo
     /// \{
 
     /// \brief Bullet Link class
-    class BulletLink : public Link
+    class GAZEBO_VISIBLE BulletLink : public Link
     {
       /// \brief Constructor
       public: BulletLink(EntityPtr _parent);
@@ -58,9 +59,6 @@ namespace gazebo
       public: virtual void Fini();
 
       // Documentation inherited.
-      public: virtual void Update();
-
-      // Documentation inherited.
       public: virtual void OnPoseChange();
 
       // Documentation inherited.
@@ -115,6 +113,10 @@ namespace gazebo
       /// \return Pointer to bullet rigid body object.
       public: btRigidBody *GetBulletLink() const;
 
+      /// \internal
+      /// \brief Clear bullet collision cache needed when the body is resized.
+      public: void ClearCollisionCache();
+
       // Documentation inherited.
       public: virtual void SetLinearDamping(double _damping);
 
@@ -150,13 +152,16 @@ namespace gazebo
       // Documentation inherited.
       public: virtual void SetAutoDisable(bool _disable);
 
+      // Documentation inherited
+      public: virtual void SetLinkStatic(bool _static);
+
       /// \brief Pointer to bullet compound shape, which is a container
       ///        for other child shapes.
       private: btCollisionShape *compoundShape;
 
       /// \brief Pointer to bullet motion state, which manages updates to the
       ///        world pose from bullet.
-      private: BulletMotionStatePtr motionState;
+      public: BulletMotionStatePtr motionState;
 
       /// \brief Pointer to the bullet rigid body object.
       private: btRigidBody *rigidLink;
diff --git a/gazebo/physics/bullet/BulletMeshShape.cc b/gazebo/physics/bullet/BulletMeshShape.cc
new file mode 100644
index 0000000..4ec9a4f
--- /dev/null
+++ b/gazebo/physics/bullet/BulletMeshShape.cc
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/* Desc: Trimesh shape
+ * Author: Nate Koenig
+ * Date: 21 May 2009
+ */
+
+#include "gazebo/common/Mesh.hh"
+
+#include "gazebo/physics/bullet/BulletTypes.hh"
+#include "gazebo/physics/bullet/BulletCollision.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/bullet/BulletMeshShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+BulletMeshShape::BulletMeshShape(CollisionPtr _parent)
+  : MeshShape(_parent)
+{
+}
+
+
+//////////////////////////////////////////////////
+BulletMeshShape::~BulletMeshShape()
+{
+}
+
+//////////////////////////////////////////////////
+void BulletMeshShape::Load(sdf::ElementPtr _sdf)
+{
+  MeshShape::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void BulletMeshShape::Init()
+{
+  MeshShape::Init();
+
+  BulletCollisionPtr bParent =
+    boost::static_pointer_cast<BulletCollision>(this->collisionParent);
+
+  float *vertices = NULL;
+  int *indices = NULL;
+
+  btTriangleMesh *mTriMesh = new btTriangleMesh();
+
+  unsigned int numVertices = this->submesh ? this->submesh->GetVertexCount() :
+    this->mesh->GetVertexCount();
+
+  unsigned int numIndices = this->submesh ? this->submesh->GetIndexCount() :
+    this->mesh->GetIndexCount();
+
+  // Get all the vertex and index data
+  if (!this->submesh)
+    this->mesh->FillArrays(&vertices, &indices);
+  else
+    this->submesh->FillArrays(&vertices, &indices);
+
+  // Scale the vertex data
+  for (unsigned int j = 0;  j < numVertices; j++)
+  {
+    vertices[j*3+0] = vertices[j*3+0] *
+      this->sdf->Get<math::Vector3>("scale").x;
+    vertices[j*3+1] = vertices[j*3+1] *
+      this->sdf->Get<math::Vector3>("scale").y;
+    vertices[j*3+2] = vertices[j*3+2] *
+      this->sdf->Get<math::Vector3>("scale").z;
+  }
+
+  // Create the Bullet trimesh
+  for (unsigned int j = 0; j < numIndices; j += 3)
+  {
+    btVector3 bv0(vertices[indices[j]*3+0],
+                  vertices[indices[j]*3+1],
+                  vertices[indices[j]*3+2]);
+
+    btVector3 bv1(vertices[indices[j+1]*3+0],
+                  vertices[indices[j+1]*3+1],
+                  vertices[indices[j+1]*3+2]);
+
+    btVector3 bv2(vertices[indices[j+2]*3+0],
+                  vertices[indices[j+2]*3+1],
+                  vertices[indices[j+2]*3+2]);
+
+    mTriMesh->addTriangle(bv0, bv1, bv2);
+  }
+
+  btGImpactMeshShape *gimpactMeshShape =
+    new btGImpactMeshShape(mTriMesh);
+  gimpactMeshShape->updateBound();
+
+  bParent->SetCollisionShape(gimpactMeshShape);
+
+  delete [] vertices;
+  delete [] indices;
+}
diff --git a/gazebo/physics/bullet/BulletMeshShape.hh b/gazebo/physics/bullet/BulletMeshShape.hh
new file mode 100644
index 0000000..d835cbc
--- /dev/null
+++ b/gazebo/physics/bullet/BulletMeshShape.hh
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/* Desc: Trimesh collision
+ * Author: Nate Koenig
+ * Date: 21 May 2009
+ */
+
+#ifndef _BULLETMESHSHAPE_HH_
+#define _BULLETMESHSHAPE_HH_
+
+#include "gazebo/physics/MeshShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_bullet Bullet Physics
+    /// \{
+
+    /// \brief Triangle mesh collision
+    class GAZEBO_VISIBLE BulletMeshShape : public MeshShape
+    {
+      /// \brief Constructor
+      public: BulletMeshShape(CollisionPtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~BulletMeshShape();
+
+      /// \brief Load the trimesh
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      protected: virtual void Init();
+    };
+
+    /// \}
+  }
+}
+#endif
+
diff --git a/gazebo/physics/bullet/BulletMotionState.cc b/gazebo/physics/bullet/BulletMotionState.cc
index fc3d397..d8749d9 100644
--- a/gazebo/physics/bullet/BulletMotionState.cc
+++ b/gazebo/physics/bullet/BulletMotionState.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -42,7 +42,8 @@ BulletMotionState::~BulletMotionState()
 //////////////////////////////////////////////////
 void BulletMotionState::getWorldTransform(btTransform &_cogWorldTrans) const
 {
-  _cogWorldTrans = BulletTypes::ConvertPose(this->link->GetWorldCoGPose());
+  _cogWorldTrans =
+    BulletTypes::ConvertPose(this->link->GetWorldInertialPose());
 }
 
 //////////////////////////////////////////////////
@@ -50,11 +51,32 @@ void BulletMotionState::setWorldTransform(const btTransform &_cogWorldTrans)
 {
   math::Pose pose = BulletTypes::ConvertPose(_cogWorldTrans);
 
-  math::Vector3 cg = pose.rot.RotateVector(this->link->GetInertial()->GetCoG());
-  pose.pos -= cg;
+  // transform pose from cg location to link location
+  // cg: pose of cg in link frame, so -cg is transform from cg to
+  //     link defined in cg frame.
+  // pose: transform from world origin to cg in inertial frame.
+  // -cg + pose:  transform from world origin to link frame in inertial frame.
+  math::Pose cg = this->link->GetInertial()->GetPose();
+  pose = -cg + pose;
 
   // The second argument is set to false to prevent Entity.cc from propagating
   // the pose change all the way back to bullet.
   // \TODO: consider using the dirtyPose mechanism employed by ODE.
   this->link->SetWorldPose(pose, false);
+
+  // below is inefficient as we end up double caching for some joints
+  // should consider adding a "dirty" flag.
+  // or trying doing this during BulletPhysics::InternalTickCallback(...)
+  Joint_V parentJoints = this->link->GetParentJoints();
+  for (unsigned int j = 0; j < parentJoints.size(); ++j)
+  {
+    JointPtr joint = parentJoints[j];
+    joint->CacheForceTorque();
+  }
+  Joint_V childJoints = this->link->GetChildJoints();
+  for (unsigned int j = 0; j < childJoints.size(); ++j)
+  {
+    JointPtr joint = childJoints[j];
+    joint->CacheForceTorque();
+  }
 }
diff --git a/gazebo/physics/bullet/BulletMotionState.hh b/gazebo/physics/bullet/BulletMotionState.hh
index 511070d..897be58 100644
--- a/gazebo/physics/bullet/BulletMotionState.hh
+++ b/gazebo/physics/bullet/BulletMotionState.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/math/MathTypes.hh"
 #include "gazebo/math/Pose.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -38,7 +39,7 @@ namespace gazebo
     /// \{
 
     /// \brief Bullet btMotionState encapsulation
-    class BulletMotionState : public btMotionState
+    class GAZEBO_VISIBLE BulletMotionState : public btMotionState
     {
       /// \brief Constructor
       public: BulletMotionState(LinkPtr _link);
diff --git a/gazebo/physics/bullet/BulletMultiRayShape.cc b/gazebo/physics/bullet/BulletMultiRayShape.cc
index 72a95a4..1eb4556 100644
--- a/gazebo/physics/bullet/BulletMultiRayShape.cc
+++ b/gazebo/physics/bullet/BulletMultiRayShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/physics/bullet/BulletMultiRayShape.hh b/gazebo/physics/bullet/BulletMultiRayShape.hh
index 6845596..47e8596 100644
--- a/gazebo/physics/bullet/BulletMultiRayShape.hh
+++ b/gazebo/physics/bullet/BulletMultiRayShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,7 +17,8 @@
 #ifndef _BULLETMULTIRAYSHAPE_HH_
 #define _BULLETMULTIRAYSHAPE_HH_
 
-#include "physics/MultiRayShape.hh"
+#include "gazebo/physics/MultiRayShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -28,7 +29,7 @@ namespace gazebo
     /// \{
 
     /// \brief Bullet specific version of MultiRayShape
-    class BulletMultiRayShape : public MultiRayShape
+    class GAZEBO_VISIBLE BulletMultiRayShape : public MultiRayShape
     {
       /// \brief Constructor
       public: BulletMultiRayShape(CollisionPtr parent);
diff --git a/gazebo/physics/bullet/BulletPhysics.cc b/gazebo/physics/bullet/BulletPhysics.cc
index e39f178..5f1866b 100644
--- a/gazebo/physics/bullet/BulletPhysics.cc
+++ b/gazebo/physics/bullet/BulletPhysics.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,9 @@
  * limitations under the License.
  *
 */
-/* Desc: The Bullet physics engine wrapper
- * Author: Nate Koenig
- * Date: 11 June 2007
- */
+
+#include <algorithm>
+#include <string>
 
 #include "gazebo/physics/bullet/BulletTypes.hh"
 #include "gazebo/physics/bullet/BulletLink.hh"
@@ -29,7 +28,7 @@
 #include "gazebo/physics/bullet/BulletMultiRayShape.hh"
 #include "gazebo/physics/bullet/BulletBoxShape.hh"
 #include "gazebo/physics/bullet/BulletCylinderShape.hh"
-#include "gazebo/physics/bullet/BulletTrimeshShape.hh"
+#include "gazebo/physics/bullet/BulletMeshShape.hh"
 #include "gazebo/physics/bullet/BulletRayShape.hh"
 
 #include "gazebo/physics/bullet/BulletHingeJoint.hh"
@@ -58,6 +57,7 @@
 #include "gazebo/math/Rand.hh"
 
 #include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/bullet/BulletSurfaceParams.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -138,7 +138,7 @@ void InternalTickCallback(btDynamicsWorld *_world, btScalar _timeStep)
     CollisionPtr collisionPtr2 = link2->GetCollision(colIndex);
 
     if (!collisionPtr1 || !collisionPtr2)
-      return;
+      continue;
 
     PhysicsEnginePtr engine = collisionPtr1->GetWorld()->GetPhysicsEngine();
     BulletPhysicsPtr bulletPhysics =
@@ -151,7 +151,7 @@ void InternalTickCallback(btDynamicsWorld *_world, btScalar _timeStep)
         collisionPtr1->GetWorld()->GetSimTime());
 
     if (!contactFeedback)
-      return;
+      continue;
 
     math::Pose body1Pose = link1->GetWorldPose();
     math::Pose body2Pose = link2->GetWorldPose();
@@ -209,11 +209,15 @@ void InternalTickCallback(btDynamicsWorld *_world, btScalar _timeStep)
 }
 
 //////////////////////////////////////////////////
-bool ContactCallback(btManifoldPoint &/*_cp*/,
-    const btCollisionObjectWrapper */*_obj0*/, int /*_partId0*/,
-    int /*_index0*/, const btCollisionObjectWrapper */*_obj1*/,
-    int /*_partId1*/, int /*_index1*/)
+bool ContactCallback(btManifoldPoint &_cp,
+    const btCollisionObjectWrapper *_obj0, int /*_partId0*/, int /*_index0*/,
+    const btCollisionObjectWrapper *_obj1, int /*_partId1*/, int /*_index1*/)
 {
+  _cp.m_combinedFriction = std::min(_obj1->m_collisionObject->getFriction(),
+    _obj0->m_collisionObject->getFriction());
+
+  // this return value is currently ignored, but to be on the safe side:
+  //  return false if you don't calculate friction
   return true;
 }
 
@@ -274,6 +278,8 @@ BulletPhysics::BulletPhysics(WorldPtr _world)
   // Set random seed for physics engine based on gazebo's random seed.
   // Note: this was moved from physics::PhysicsEngine constructor.
   this->SetSeed(math::Rand::GetSeed());
+
+  btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher);
 }
 
 //////////////////////////////////////////////////
@@ -300,7 +306,7 @@ void BulletPhysics::Load(sdf::ElementPtr _sdf)
 
   sdf::ElementPtr bulletElem = this->sdf->GetElement("bullet");
 
-  math::Vector3 g = this->sdf->GetValueVector3("gravity");
+  math::Vector3 g = this->sdf->Get<math::Vector3>("gravity");
   // ODEPhysics checks this, so we will too.
   if (g == math::Vector3(0, 0, 0))
     gzwarn << "Gravity vector is (0, 0, 0). Objects will float.\n";
@@ -312,8 +318,11 @@ void BulletPhysics::Load(sdf::ElementPtr _sdf)
   // but can lead to improper stacking of objects, see
   // http://web.archive.org/web/20120430155635/http://bulletphysics.org/
   //     mediawiki-1.5.8/index.php/BtContactSolverInfo#Split_Impulse
-  info.m_splitImpulse = 1;
-  info.m_splitImpulsePenetrationThreshold = -0.02;
+  info.m_splitImpulse =
+      boost::any_cast<bool>(this->GetParam("split_impulse"));
+  info.m_splitImpulsePenetrationThreshold =
+    boost::any_cast<double>(
+    this->GetParam("split_impulse_penetration_threshold"));
 
   // Use multiple friction directions.
   // This is important for rolling without slip (see issue #480)
@@ -322,14 +331,31 @@ void BulletPhysics::Load(sdf::ElementPtr _sdf)
   // the following are undocumented members of btContactSolverInfo
   // m_globalCfm: constraint force mixing
   info.m_globalCfm =
-    bulletElem->GetElement("constraints")->GetValueDouble("cfm");
+    bulletElem->GetElement("constraints")->Get<double>("cfm");
   // m_erp: Baumgarte factor
-  info.m_erp = bulletElem->GetElement("constraints")->GetValueDouble("erp");
+  info.m_erp = bulletElem->GetElement("constraints")->Get<double>("erp");
 
   info.m_numIterations =
-      boost::any_cast<int>(this->GetParam(PGS_ITERS));
+      boost::any_cast<int>(this->GetParam("iters"));
   info.m_sor =
-      boost::any_cast<double>(this->GetParam(SOR));
+      boost::any_cast<double>(this->GetParam("sor"));
+
+  gzlog << " debug physics: "
+        << " iters[" << info.m_numIterations
+        << "] sor[" << info.m_sor
+        << "] erp[" << info.m_erp
+        << "] cfm[" << info.m_globalCfm
+        << "] split[" << info.m_splitImpulse
+        << "] split tol[" << info.m_splitImpulsePenetrationThreshold
+        << "]\n";
+
+  // debugging
+  // info.m_numIterations = 1000;
+  // info.m_sor = 1.0;
+  // info.m_erp = 0.2;
+  // info.m_globalCfm = 0.0;
+  // info.m_splitImpulse = 0;
+  // info.m_splitImpulsePenetrationThreshold = 0.0;
 }
 
 //////////////////////////////////////////////////
@@ -358,18 +384,20 @@ void BulletPhysics::OnRequest(ConstRequestPtr &_msg)
     physicsMsg.set_solver_type(this->solverType);
     // min_step_size is defined but not yet used
     physicsMsg.set_min_step_size(
-        boost::any_cast<double>(this->GetParam(MIN_STEP_SIZE)));
+      boost::any_cast<double>(this->GetParam("min_step_size")));
     physicsMsg.set_iters(
-        boost::any_cast<int>(this->GetParam(PGS_ITERS)));
+      boost::any_cast<int>(this->GetParam("iters")));
     physicsMsg.set_enable_physics(this->world->GetEnablePhysicsEngine());
     physicsMsg.set_sor(
-        boost::any_cast<double>(this->GetParam(SOR)));
+      boost::any_cast<double>(this->GetParam("sor")));
     physicsMsg.set_cfm(
-        boost::any_cast<double>(this->GetParam(GLOBAL_CFM)));
+      boost::any_cast<double>(this->GetParam("cfm")));
     physicsMsg.set_erp(
-        boost::any_cast<double>(this->GetParam(GLOBAL_ERP)));
+      boost::any_cast<double>(this->GetParam("erp")));
+
     physicsMsg.set_contact_surface_layer(
-        boost::any_cast<double>(this->GetParam(CONTACT_SURFACE_LAYER)));
+      boost::any_cast<double>(this->GetParam("contact_surface_layer")));
+
     physicsMsg.mutable_gravity()->CopyFrom(msgs::Convert(this->GetGravity()));
     physicsMsg.set_real_time_update_rate(this->realTimeUpdateRate);
     physicsMsg.set_real_time_factor(this->targetRealTimeFactor);
@@ -385,28 +413,28 @@ void BulletPhysics::OnRequest(ConstRequestPtr &_msg)
 void BulletPhysics::OnPhysicsMsg(ConstPhysicsPtr &_msg)
 {
   if (_msg->has_min_step_size())
-    this->SetParam(MIN_STEP_SIZE, _msg->min_step_size());
+    this->SetParam("min_step_size", _msg->min_step_size());
 
   if (_msg->has_solver_type())
-    this->SetParam(SOLVER_TYPE, _msg->solver_type());
+    this->SetParam("solver_type", _msg->solver_type());
 
   if (_msg->has_iters())
-    this->SetParam(PGS_ITERS, _msg->iters());
+    this->SetParam("iters", _msg->iters());
 
   if (_msg->has_sor())
-    this->SetParam(SOR, _msg->sor());
+    this->SetParam("sor", _msg->sor());
 
   if (_msg->has_cfm())
-    this->SetParam(GLOBAL_CFM, _msg->cfm());
+    this->SetParam("cfm", _msg->cfm());
 
   if (_msg->has_erp())
-    this->SetParam(GLOBAL_ERP, _msg->erp());
+    this->SetParam("erp", _msg->erp());
 
   if (_msg->has_enable_physics())
     this->world->EnablePhysicsEngine(_msg->enable_physics());
 
   if (_msg->has_contact_surface_layer())
-    this->SetParam(CONTACT_SURFACE_LAYER, _msg->contact_surface_layer());
+    this->SetParam("contact_surface_layer", _msg->contact_surface_layer());
 
   if (_msg->has_gravity())
     this->SetGravity(msgs::Convert(_msg->gravity()));
@@ -418,25 +446,17 @@ void BulletPhysics::OnPhysicsMsg(ConstPhysicsPtr &_msg)
   {
     this->SetRealTimeUpdateRate(_msg->real_time_update_rate());
   }
-  else if (_msg->has_update_rate())
-  {
-    this->SetRealTimeUpdateRate(_msg->update_rate());
-    gzwarn <<
-        "Physics update rate is deprecated by real time update rate\n";
-  }
 
   if (_msg->has_max_step_size())
   {
     this->SetMaxStepSize(_msg->max_step_size());
   }
-  else if (_msg->has_dt())
-  {
-    this->SetMaxStepSize(_msg->dt());
-    gzwarn << "Physics dt is deprecated by max step size\n";
-  }
 
   /// Make sure all models get at least one update cycle.
   this->world->EnableAllModels();
+
+  // Parent class handles many generic parameters
+  PhysicsEngine::OnPhysicsMsg(_msg);
 }
 
 //////////////////////////////////////////////////
@@ -451,11 +471,8 @@ void BulletPhysics::UpdatePhysics()
   // need to lock, otherwise might conflict with world resetting
   boost::recursive_mutex::scoped_lock lock(*this->physicsUpdateMutex);
 
-  // common::Time currTime =  this->world->GetRealTime();
-
   this->dynamicsWorld->stepSimulation(
-      this->maxStepSize, 1, this->maxStepSize);
-  // this->lastUpdateTime = currTime;
+    this->maxStepSize, 1, this->maxStepSize);
 }
 
 //////////////////////////////////////////////////
@@ -475,286 +492,373 @@ void BulletPhysics::Reset()
 
 //////////////////////////////////////////////////
 
-// //////////////////////////////////////////////////
-// void BulletPhysics::SetSORPGSIters(unsigned int _iters)
-// {
-//   // TODO: set SDF parameter
-//   btContactSolverInfo& info = this->dynamicsWorld->getSolverInfo();
-//   // Line below commented out because it wasn't helping pendulum test.
-//   // info.m_numIterations = _iters;
-// }
+//////////////////////////////////////////////////
+void BulletPhysics::SetSORPGSIters(unsigned int _iters)
+{
+  // TODO: set SDF parameter
+  btContactSolverInfo& info = this->dynamicsWorld->getSolverInfo();
+  // Line below commented out because it wasn't helping pendulum test.
+  info.m_numIterations = _iters;
+
+  this->sdf->GetElement("bullet")->GetElement(
+      "solver")->GetElement("iters")->Set(_iters);
+}
 
 
 //////////////////////////////////////////////////
-void BulletPhysics::SetParam(BulletParam _param, const boost::any &_value)
+bool BulletPhysics::SetParam(BulletParam _param, const boost::any &_value)
 {
   if (!this->dynamicsWorld)
-    return;
+    return false;
 
-  sdf::ElementPtr bulletElem = this->sdf->GetElement("bullet");
-  GZ_ASSERT(bulletElem != NULL, "Bullet SDF element does not exist");
-
-  btContactSolverInfo& info = this->dynamicsWorld->getSolverInfo();
+  gzwarn << "Deprecated by "
+         << "bool SetParam(const std::string&, const boost::any&).\n";
 
   switch (_param)
   {
     case SOLVER_TYPE:
     {
-      std::string value;
-      try
-      {
-        value = boost::any_cast<std::string>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        gzerr << "boost any_cast error:" << e.what() << "\n";
-        return;
-      }
-      if (value == "sequential_impulse")
-      {
-        bulletElem->GetElement("solver")->GetElement("type")->Set(value);
-        this->solverType = value;
-      }
-      else
-        gzwarn << "Currently only 'sequential_impulse' solver is supported"
-            << std::endl;
-      break;
+      return this->SetParam("solver_type", _value);
     }
     case GLOBAL_CFM:
     {
-      double value;
-      try
-      {
-        value = boost::any_cast<double>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        gzerr << "boost any_cast error:" << e.what() << "\n";
-        return;
-      }
-      bulletElem->GetElement("constraints")->GetElement("cfm")->Set(value);
-      info.m_globalCfm = value;
-      break;
+      return this->SetParam("cfm", _value);
     }
     case GLOBAL_ERP:
     {
-      double value;
-      try
-      {
-        value = boost::any_cast<double>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        gzerr << "boost any_cast error:" << e.what() << "\n";
-        return;
-      }
-      bulletElem->GetElement("constraints")->GetElement("erp")->Set(value);
-      info.m_erp = value;
-      break;
+      return this->SetParam("erp", _value);
     }
     case PGS_ITERS:
     {
-      int value;
-      try
-      {
-        value = boost::any_cast<int>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        value = boost::any_cast<unsigned int>(_value);
-      }
-      bulletElem->GetElement("solver")->GetElement("iters")->Set(value);
-      info.m_numIterations = value;
-      break;
+      return this->SetParam("iters", _value);
     }
     case SOR:
     {
-      double value;
-      try
-      {
-        value = boost::any_cast<double>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        gzerr << "boost any_cast error:" << e.what() << "\n";
-        return;
-      }
-      bulletElem->GetElement("solver")->GetElement("sor")->Set(value);
-      info.m_sor = value;
-      break;
+      return this->SetParam("sor", _value);
     }
     case CONTACT_SURFACE_LAYER:
     {
-      /// TODO: Implement contact surface layer param
-      double value;
-      try
-      {
-        value = boost::any_cast<double>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        gzerr << "boost any_cast error:" << e.what() << "\n";
-        return;
-      }
-      bulletElem->GetElement("constraints")->GetElement(
-          "contact_surface_layer")->Set(value);
-      break;
+      return this->SetParam("contact_surface_layer", _value);
     }
     case MAX_CONTACTS:
     {
-      /// TODO: Implement max contacts param
-      int value;
-      try
-      {
-        value = boost::any_cast<int>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        value = boost::any_cast<unsigned int>(_value);
-      }
-      bulletElem->GetElement("max_contacts")->GetValue()->Set(value);
-      break;
+      return this->SetParam("max_contacts", _value);
     }
     case MIN_STEP_SIZE:
     {
-      /// TODO: Implement min step size param
-      double value;
-      try
-      {
-        value = boost::any_cast<double>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        gzerr << "boost any_cast error:" << e.what() << "\n";
-        return;
-      }
-      bulletElem->GetElement("solver")->GetElement("min_step_size")->Set(value);
-      break;
+      return this->SetParam("min_step_size", _value);
     }
     default:
     {
       gzwarn << "Param not supported in bullet" << std::endl;
-      break;
+      return false;
     }
   }
+  return true;
 }
 
 //////////////////////////////////////////////////
-void BulletPhysics::SetParam(const std::string &_key, const boost::any &_value)
+bool BulletPhysics::SetParam(const std::string &_key, const boost::any &_value)
 {
-  BulletParam param;
+  sdf::ElementPtr bulletElem = this->sdf->GetElement("bullet");
+  GZ_ASSERT(bulletElem != NULL, "Bullet SDF element does not exist");
+
+  btContactSolverInfo& info = this->dynamicsWorld->getSolverInfo();
 
   if (_key == "type")
-    param = SOLVER_TYPE;
+  {
+    gzwarn << "keyword `type` for GetParam/SetParam is deprecated, please"
+           << " use `solver_type`.\n";
+    return this->SetParam("solver_type", _value);
+  }
+  else if (_key == "solver_type")
+  {
+    std::string value;
+    try
+    {
+      value = boost::any_cast<std::string>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    if (value == "sequential_impulse")
+    {
+      bulletElem->GetElement("solver")->GetElement("type")->Set(value);
+      this->solverType = value;
+    }
+    else
+    {
+      gzwarn << "Currently only 'sequential_impulse' solver is supported"
+             << std::endl;
+      return false;
+    }
+  }
   else if (_key == "cfm")
-    param = GLOBAL_CFM;
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    bulletElem->GetElement("constraints")->GetElement("cfm")->Set(value);
+    info.m_globalCfm = value;
+  }
   else if (_key == "erp")
-    param = GLOBAL_ERP;
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    bulletElem->GetElement("constraints")->GetElement("erp")->Set(value);
+    info.m_erp = value;
+  }
   else if (_key == "iters")
-    param = PGS_ITERS;
+  {
+    int value;
+    try
+    {
+      try
+      {
+        value = boost::any_cast<int>(_value);
+      }
+      catch(const boost::bad_any_cast &e)
+      {
+        value = boost::any_cast<unsigned int>(_value);
+      }
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    bulletElem->GetElement("solver")->GetElement("iters")->Set(value);
+    info.m_numIterations = value;
+  }
   else if (_key == "sor")
-    param = SOR;
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    bulletElem->GetElement("solver")->GetElement("sor")->Set(value);
+    info.m_sor = value;
+  }
   else if (_key == "contact_surface_layer")
-    param = CONTACT_SURFACE_LAYER;
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    bulletElem->GetElement("constraints")->GetElement(
+        "contact_surface_layer")->Set(value);
+  }
+  else if (_key == "split_impulse")
+  {
+    bool value;
+    try
+    {
+      value = boost::any_cast<bool>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    bulletElem->GetElement("constraints")->GetElement(
+        "split_impulse")->Set(value);
+  }
+  else if (_key == "split_impulse_penetration_threshold")
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    bulletElem->GetElement("constraints")->GetElement(
+        "split_impulse_penetration_threshold")->Set(value);
+  }
   else if (_key == "max_contacts")
-    param = MAX_CONTACTS;
+  {
+    /// TODO: Implement max contacts param
+    int value;
+    try
+    {
+      try
+      {
+        value = boost::any_cast<int>(_value);
+      }
+      catch(const boost::bad_any_cast &e)
+      {
+        value = boost::any_cast<unsigned int>(_value);
+      }
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    this->sdf->GetElement("max_contacts")->GetValue()->Set(value);
+  }
   else if (_key == "min_step_size")
-    param = MIN_STEP_SIZE;
+  {
+    /// TODO: Implement min step size param
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    bulletElem->GetElement("solver")->GetElement("min_step_size")->Set(value);
+  }
+  else if (_key == "max_step_size")
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    this->SetMaxStepSize(value);
+  }
   else
   {
     gzwarn << _key << " is not supported in bullet" << std::endl;
-    return;
+    return false;
   }
 
-  this->SetParam(param, _value);
+  return true;
 }
 
 //////////////////////////////////////////////////
 boost::any BulletPhysics::GetParam(BulletParam _param) const
 {
-  sdf::ElementPtr bulletElem = this->sdf->GetElement("bullet");
-  GZ_ASSERT(bulletElem != NULL, "Bullet SDF element does not exist");
-
   boost::any value = 0;
   switch (_param)
   {
     case SOLVER_TYPE:
     {
-      value = bulletElem->GetElement("solver")->GetValueString("type");
-      break;
+      return this->GetParam("solver_type");
     }
     case GLOBAL_CFM:
     {
-      value = bulletElem->GetElement("constraints")->GetValueDouble("cfm");
-      break;
+      return this->GetParam("cfm");
     }
     case GLOBAL_ERP:
     {
-      value = bulletElem->GetElement("constraints")->GetValueDouble("erp");
-      break;
+      return this->GetParam("erp");
     }
     case PGS_ITERS:
     {
-      value = bulletElem->GetElement("solver")->GetValueInt("iters");
-      break;
+      return this->GetParam("iters");
     }
     case SOR:
     {
-      value = bulletElem->GetElement("solver")->GetValueDouble("sor");
-      break;
+      return this->GetParam("sor");
     }
     case CONTACT_SURFACE_LAYER:
     {
-      value = bulletElem->GetElement("constraints")->GetValueDouble(
-          "contact_surface_layer");
-      break;
+      return this->GetParam("contact_surface_layer");
     }
     case MAX_CONTACTS:
     {
-      value = bulletElem->GetElement("max_contacts")->GetValueInt();
-      break;
+      return this->GetParam("max_contacts");
     }
     case MIN_STEP_SIZE:
     {
-      value = bulletElem->GetElement("solver")->GetValueDouble("min_step_size");
-      break;
+      return this->GetParam("min_step_size");
     }
     default:
     {
       gzwarn << "Param not supported in bullet" << std::endl;
-      break;
+      return value;
     }
   }
-  return value;
 }
 
 //////////////////////////////////////////////////
 boost::any BulletPhysics::GetParam(const std::string &_key) const
 {
-  BulletParam param;
+  sdf::ElementPtr bulletElem = this->sdf->GetElement("bullet");
+  GZ_ASSERT(bulletElem != NULL, "Bullet SDF element does not exist");
 
   if (_key == "type")
-    param = SOLVER_TYPE;
+  {
+    gzwarn << "keyword `type` for GetParam/SetParam is deprecated, please"
+           << " use `solver_type`.\n";
+    return this->GetParam("solver_type");
+  }
+  else if (_key == "solver_type")
+    return bulletElem->GetElement("solver")->Get<std::string>("type");
   else if (_key == "cfm")
-    param = GLOBAL_CFM;
+    return bulletElem->GetElement("constraints")->Get<double>("cfm");
   else if (_key == "erp")
-    param = GLOBAL_ERP;
+    return bulletElem->GetElement("constraints")->Get<double>("erp");
   else if (_key == "iters")
-    param = PGS_ITERS;
+    return bulletElem->GetElement("solver")->Get<int>("iters");
   else if (_key == "sor")
-    param = SOR;
+    return bulletElem->GetElement("solver")->Get<double>("sor");
   else if (_key == "contact_surface_layer")
-    param = CONTACT_SURFACE_LAYER;
+    return bulletElem->GetElement("constraints")->Get<double>(
+        "contact_surface_layer");
+  else if (_key == "split_impulse")
+  {
+    return bulletElem->GetElement("constraints")->Get<bool>(
+      "split_impulse");
+  }
+  else if (_key == "split_impulse_penetration_threshold")
+  {
+    return bulletElem->GetElement("constraints")->Get<double>(
+      "split_impulse_penetration_threshold");
+  }
   else if (_key == "max_contacts")
-    param = MAX_CONTACTS;
+    return this->sdf->GetElement("max_contacts")->Get<int>();
   else if (_key == "min_step_size")
-    param = MIN_STEP_SIZE;
+    return bulletElem->GetElement("solver")->Get<double>("min_step_size");
+  else if (_key == "max_step_size")
+    return this->GetMaxStepSize();
   else
   {
     gzwarn << _key << " is not supported in bullet" << std::endl;
     return 0;
   }
-  return this->GetParam(param);
 }
 
 //////////////////////////////////////////////////
@@ -797,7 +901,7 @@ ShapePtr BulletPhysics::CreateShape(const std::string &_type,
   else if (_type == "cylinder")
     shape.reset(new BulletCylinderShape(collision));
   else if (_type == "mesh" || _type == "trimesh")
-    shape.reset(new BulletTrimeshShape(collision));
+    shape.reset(new BulletMeshShape(collision));
   else if (_type == "heightmap")
     shape.reset(new BulletHeightmapShape(collision));
   else if (_type == "multiray")
@@ -857,7 +961,7 @@ double BulletPhysics::GetWorldCFM()
 {
   sdf::ElementPtr elem = this->sdf->GetElement("bullet");
   elem = elem->GetElement("constraints");
-  return elem->GetValueDouble("cfm");
+  return elem->Get<double>("cfm");
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/physics/bullet/BulletPhysics.hh b/gazebo/physics/bullet/BulletPhysics.hh
index 766a2e4..5a1ed30 100644
--- a/gazebo/physics/bullet/BulletPhysics.hh
+++ b/gazebo/physics/bullet/BulletPhysics.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,10 +26,11 @@
 #include <boost/thread/thread.hpp>
 #include <boost/thread/mutex.hpp>
 
-#include "physics/bullet/bullet_inc.h"
-#include "physics/PhysicsEngine.hh"
-#include "physics/Collision.hh"
-#include "physics/Shape.hh"
+#include "gazebo/physics/bullet/bullet_inc.h"
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/Shape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -44,7 +45,7 @@ namespace gazebo
     /// \{
 
     /// \brief Bullet physics engine
-    class BulletPhysics : public PhysicsEngine
+    class GAZEBO_VISIBLE BulletPhysics : public PhysicsEngine
     {
       /// \enum BulletParam
       /// \brief Bullet physics parameter types.
@@ -157,22 +158,29 @@ namespace gazebo
       public: virtual void DebugPrint() const;
 
       /// \brief Set a parameter of the bullet physics engine
+      /// \sa bool SetParam(const std::string&, const boost::any&)
       /// \param[in] _param A parameter listed in the BulletParam enum
       /// \param[in] _value The value to set to
-      public: virtual void SetParam(BulletParam _param,
-                  const boost::any &_value);
+      /// \return true if SetParam is successful, false if operation fails.
+      public: virtual bool SetParam(BulletParam _param,
+                  const boost::any &_value) GAZEBO_DEPRECATED(3.0);
 
       /// Documentation inherited
-      public: virtual void SetParam(const std::string &_key,
+      public: virtual bool SetParam(const std::string &_key,
                   const boost::any &_value);
 
       /// Documentation inherited
       public: virtual boost::any GetParam(const std::string &_key) const;
 
       /// \brief Get an parameter of the physics engine
+      /// \sa bool GetParam(const std::string &_key)
       /// \param[in] _param A parameter listed in the BulletParam enum
       /// \return The value of the parameter
-      public: virtual boost::any GetParam(BulletParam _param) const;
+      public: virtual boost::any GetParam(BulletParam _param) const
+                GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited
+      public: virtual void SetSORPGSIters(unsigned int iters);
 
       private: btBroadphaseInterface *broadPhase;
       private: btDefaultCollisionConfiguration *collisionConfig;
diff --git a/gazebo/physics/bullet/BulletPhysics_TEST.cc b/gazebo/physics/bullet/BulletPhysics_TEST.cc
index 788d7a3..0ba18c1 100644
--- a/gazebo/physics/bullet/BulletPhysics_TEST.cc
+++ b/gazebo/physics/bullet/BulletPhysics_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
 */
 
 #include <gtest/gtest.h>
+#include <string>
 
 #include "gazebo/physics/physics.hh"
 #include "gazebo/physics/PhysicsEngine.hh"
@@ -61,36 +62,52 @@ TEST_F(BulletPhysics_TEST, PhysicsParam)
   double cfm = 0.3;
   double erp = 0.12;
   double contactSurfaceLayer = 0.02;
+  bool splitImpulse = true;
+  double splitImpulsePenetrationThreshold = 0.02;
 
   // test setting/getting physics engine params
-  bulletPhysics->SetParam(BulletPhysics::SOLVER_TYPE, type);
-  bulletPhysics->SetParam(BulletPhysics::PGS_ITERS, iters);
-  bulletPhysics->SetParam(BulletPhysics::SOR, sor);
-  bulletPhysics->SetParam(BulletPhysics::GLOBAL_CFM, cfm);
-  bulletPhysics->SetParam(BulletPhysics::GLOBAL_ERP, erp);
-  bulletPhysics->SetParam(BulletPhysics::CONTACT_SURFACE_LAYER,
+  bulletPhysics->SetParam("solver_type", type);
+  bulletPhysics->SetParam("iters", iters);
+  bulletPhysics->SetParam("sor", sor);
+  bulletPhysics->SetParam("cfm", cfm);
+  bulletPhysics->SetParam("erp", erp);
+  bulletPhysics->SetParam("contact_surface_layer",
       contactSurfaceLayer);
+  bulletPhysics->SetParam("split_impulse",
+      splitImpulse);
+  bulletPhysics->SetParam("split_impulse_penetration_threshold",
+      splitImpulsePenetrationThreshold);
 
   boost::any value;
-  value = bulletPhysics->GetParam(BulletPhysics::SOLVER_TYPE);
+  value = bulletPhysics->GetParam("solver_type");
   std::string typeRet = boost::any_cast<std::string>(value);
   EXPECT_EQ(type, typeRet);
-  value = bulletPhysics->GetParam(BulletPhysics::PGS_ITERS);
+  value = bulletPhysics->GetParam("iters");
   int itersRet = boost::any_cast<int>(value);
   EXPECT_EQ(iters, itersRet);
-  value = bulletPhysics->GetParam(BulletPhysics::SOR);
+  value = bulletPhysics->GetParam("sor");
   double sorRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(sor, sorRet);
-  value = bulletPhysics->GetParam(BulletPhysics::GLOBAL_CFM);
+  value = bulletPhysics->GetParam("cfm");
   double cfmRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(cfm, cfmRet);
-  value = bulletPhysics->GetParam(BulletPhysics::GLOBAL_ERP);
+  value = bulletPhysics->GetParam("erp");
   double erpRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(erp, erpRet);
-  value = bulletPhysics->GetParam(BulletPhysics::CONTACT_SURFACE_LAYER);
+
+  value = bulletPhysics->GetParam("contact_surface_layer");
   double contactSurfaceLayerRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(contactSurfaceLayer, contactSurfaceLayerRet);
 
+  value = bulletPhysics->GetParam("split_impulse");
+  double splitImpulseRet = boost::any_cast<bool>(value);
+  EXPECT_DOUBLE_EQ(splitImpulse, splitImpulseRet);
+
+  value = bulletPhysics->GetParam("split_impulse_penetration_threshold");
+  double splitImpulsePenetrationThresholdRet = boost::any_cast<double>(value);
+  EXPECT_DOUBLE_EQ(splitImpulsePenetrationThreshold,
+    splitImpulsePenetrationThresholdRet);
+
   // Set params to different values and verify the old values are correctly
   // replaced by the new ones.
   iters = 55;
@@ -98,6 +115,12 @@ TEST_F(BulletPhysics_TEST, PhysicsParam)
   cfm = 0.1;
   erp = 0.22;
   contactSurfaceLayer = 0.03;
+  splitImpulse = true;
+  splitImpulsePenetrationThreshold = 0.0;
+
+  int maxContacts = 32;
+  double minStepSize = 32.32;
+  double maxStepSize = 3232.32;
 
   bulletPhysics->SetParam("type", type);
   bulletPhysics->SetParam("iters", iters);
@@ -106,6 +129,10 @@ TEST_F(BulletPhysics_TEST, PhysicsParam)
   bulletPhysics->SetParam("erp", erp);
   bulletPhysics->SetParam("contact_surface_layer",
       contactSurfaceLayer);
+  bulletPhysics->SetParam("split_impulse",
+      splitImpulse);
+  bulletPhysics->SetParam("split_impulse_penetration_threshold",
+      splitImpulsePenetrationThreshold);
 
   value = bulletPhysics->GetParam("type");
   typeRet = boost::any_cast<std::string>(value);
@@ -122,9 +149,35 @@ TEST_F(BulletPhysics_TEST, PhysicsParam)
   value = bulletPhysics->GetParam("erp");
   erpRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(erp, erpRet);
+
   value = bulletPhysics->GetParam("contact_surface_layer");
   contactSurfaceLayerRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(contactSurfaceLayer, contactSurfaceLayerRet);
+
+  value = bulletPhysics->GetParam("split_impulse");
+  splitImpulseRet = boost::any_cast<bool>(value);
+  EXPECT_DOUBLE_EQ(splitImpulse, splitImpulseRet);
+
+  value = bulletPhysics->GetParam("split_impulse_penetration_threshold");
+  splitImpulsePenetrationThresholdRet = boost::any_cast<double>(value);
+  EXPECT_DOUBLE_EQ(splitImpulsePenetrationThreshold,
+    splitImpulsePenetrationThresholdRet);
+
+  int maxContactsRet;
+  double minStepSizeRet;
+  double maxStepSizeRet;
+  bulletPhysics->SetParam("max_contacts", maxContacts);
+  bulletPhysics->SetParam("min_step_size", minStepSize);
+  bulletPhysics->SetParam("max_step_size", maxStepSize);
+  value = bulletPhysics->GetParam("max_contacts");
+  maxContactsRet = boost::any_cast<int>(value);
+  EXPECT_DOUBLE_EQ(maxContacts, maxContactsRet);
+  value = bulletPhysics->GetParam("min_step_size");
+  minStepSizeRet = boost::any_cast<double>(value);
+  EXPECT_DOUBLE_EQ(minStepSize, minStepSizeRet);
+  value = bulletPhysics->GetParam("max_step_size");
+  maxStepSizeRet = boost::any_cast<double>(value);
+  EXPECT_DOUBLE_EQ(maxStepSize, maxStepSizeRet);
 }
 
 /////////////////////////////////////////////////
@@ -167,7 +220,6 @@ void BulletPhysics_TEST::PhysicsMsgParam()
   physicsPubMsg.set_sor(1.4);
   physicsPubMsg.set_cfm(0.12);
   physicsPubMsg.set_erp(0.23);
-  physicsPubMsg.set_contact_max_correcting_vel(10);
   physicsPubMsg.set_contact_surface_layer(0.01);
   physicsPubMsg.set_type(msgs::Physics::BULLET);
   physicsPubMsg.set_solver_type("sequential_impulse");
diff --git a/gazebo/physics/bullet/BulletPlaneShape.hh b/gazebo/physics/bullet/BulletPlaneShape.hh
index 7d21f86..a67a7f9 100644
--- a/gazebo/physics/bullet/BulletPlaneShape.hh
+++ b/gazebo/physics/bullet/BulletPlaneShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,8 +24,9 @@
 
 #include <iostream>
 
-#include "physics/bullet/BulletPhysics.hh"
-#include "physics/PlaneShape.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/PlaneShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,7 +37,7 @@ namespace gazebo
     /// \{
 
     /// \brief Bullet collision for an infinite plane.
-    class BulletPlaneShape : public PlaneShape
+    class GAZEBO_VISIBLE BulletPlaneShape : public PlaneShape
     {
       /// \brief Constructor
       public: BulletPlaneShape(CollisionPtr _parent) : PlaneShape(_parent) {}
diff --git a/gazebo/physics/bullet/BulletRaySensor.cc b/gazebo/physics/bullet/BulletRaySensor.cc
index 8bcf4b6..a387b91 100644
--- a/gazebo/physics/bullet/BulletRaySensor.cc
+++ b/gazebo/physics/bullet/BulletRaySensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/physics/bullet/BulletRaySensor.hh b/gazebo/physics/bullet/BulletRaySensor.hh
index 1bcc21b..2c740b1 100644
--- a/gazebo/physics/bullet/BulletRaySensor.hh
+++ b/gazebo/physics/bullet/BulletRaySensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #define BULLETRAYSENSOR_HH
 
 #include <vector>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,7 +37,7 @@ namespace gazebo
     /// \{
 
     /// \brief An Bullet Ray sensor
-    class BulletRaySensor : public PhysicsRaySensor
+    class GAZEBO_VISIBLE BulletRaySensor : public PhysicsRaySensor
     {
       /// \brief Constructor
       public: BulletRaySensor(Link *body);
diff --git a/gazebo/physics/bullet/BulletRayShape.cc b/gazebo/physics/bullet/BulletRayShape.cc
index a62b634..36a10c4 100644
--- a/gazebo/physics/bullet/BulletRayShape.cc
+++ b/gazebo/physics/bullet/BulletRayShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -103,7 +103,22 @@ void BulletRayShape::GetIntersection(double &_dist, std::string &_entity)
   _dist = 0;
   _entity = "";
 
-  if (this->physicsEngine && this->collisionParent)
+  if (this->collisionParent)
+  {
+    BulletCollisionPtr collision =
+        boost::static_pointer_cast<BulletCollision>(this->collisionParent);
+
+    LinkPtr link = this->collisionParent->GetLink();
+    GZ_ASSERT(link != NULL, "Bullet link is NULL");
+
+    this->globalStartPos = link->GetWorldPose().CoordPositionAdd(
+          this->relativeStartPos);
+
+    this->globalEndPos = link->GetWorldPose().CoordPositionAdd(
+          this->relativeEndPos);
+  }
+
+  if (this->physicsEngine)
   {
     btVector3 start(this->globalStartPos.x, this->globalStartPos.y,
         this->globalStartPos.z);
diff --git a/gazebo/physics/bullet/BulletRayShape.hh b/gazebo/physics/bullet/BulletRayShape.hh
index 25f7f2f..b2b0c0d 100644
--- a/gazebo/physics/bullet/BulletRayShape.hh
+++ b/gazebo/physics/bullet/BulletRayShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,7 +23,8 @@
 #define _BULLETRAYGEOM_HH_
 
 #include <string>
-#include "physics/RayShape.hh"
+#include "gazebo/physics/RayShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,7 @@ namespace gazebo
     /// \{
 
     /// \brief Ray shape for bullet
-    class BulletRayShape : public RayShape
+    class GAZEBO_VISIBLE BulletRayShape : public RayShape
     {
       public: BulletRayShape(PhysicsEnginePtr _physicsEngine);
 
diff --git a/gazebo/physics/bullet/BulletScrewJoint.cc b/gazebo/physics/bullet/BulletScrewJoint.cc
index 8570f57..d9ece36 100644
--- a/gazebo/physics/bullet/BulletScrewJoint.cc
+++ b/gazebo/physics/bullet/BulletScrewJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,9 @@
  * limitations under the License.
  *
  */
-/* Desc: A bullet screw or primastic joint
- * Author: Nate Koenig
- * Date: 13 Oct 2009
- */
+#include <algorithm>
+#include <limits>
+#include <string>
 
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Console.hh"
@@ -28,6 +27,71 @@
 #include "gazebo/physics/bullet/BulletTypes.hh"
 #include "gazebo/physics/bullet/BulletScrewJoint.hh"
 
+namespace gazebo
+{
+  namespace physics
+  {
+    class btScrewConstraint : public btSliderConstraint
+    {
+      public: btScrewConstraint(btRigidBody &_rbA, btRigidBody &_rbB,
+          const btTransform &_frameInA, const btTransform &_frameInB,
+          bool _useLinearReferenceFrameA)
+          : btSliderConstraint(_rbA, _rbB, _frameInA, _frameInB,
+              _useLinearReferenceFrameA), threadPitch(1.0) {}
+
+      public: btScrewConstraint(btRigidBody &_rbB,
+          const btTransform &_frameInB, bool _useLinearReferenceFrameA)
+          : btSliderConstraint(_rbB, _frameInB, _useLinearReferenceFrameA),
+          threadPitch(1.0) {}
+
+      public: virtual void getInfo1(btConstraintInfo1 *_info)
+      {
+        this->_getInfo1NonVirtual(_info);
+      }
+
+      public: virtual void getInfo2(btConstraintInfo2 *_info)
+      {
+        this->_getInfo2NonVirtual(
+            _info,
+            m_rbA.getCenterOfMassTransform(),
+            m_rbB.getCenterOfMassTransform(),
+            m_rbA.getLinearVelocity(),
+            m_rbB.getLinearVelocity(),
+            m_rbA.getInvMass(),
+            m_rbB.getInvMass());
+      }
+
+      public: void _getInfo1NonVirtual(btConstraintInfo1* info);
+      public: void _getInfo2NonVirtual(
+          btConstraintInfo2* info,
+          const btTransform& transA,
+          const btTransform& transB,
+          const btVector3& linVelA,
+          const btVector3& linVelB,
+          btScalar rbAinvMass, btScalar rbBinvMass);
+
+      public: btScalar getLinearPosition();
+      public: btScalar getAngularPosition();
+
+      // needed non-const version for SetForce
+      public: btRigidBody& getRigidBodyA();
+      public: btRigidBody& getRigidBodyB();
+
+      public: virtual void setThreadPitch(double _threadPitch)
+      {
+        this->threadPitch = -_threadPitch;
+      }
+
+      public: virtual double getThreadPitch() const
+      {
+        return -this->threadPitch;
+      }
+
+      private: double threadPitch;
+    };
+  }
+}
+
 using namespace gazebo;
 using namespace physics;
 
@@ -52,36 +116,67 @@ void BulletScrewJoint::Load(sdf::ElementPtr _sdf)
 }
 
 //////////////////////////////////////////////////
-void BulletScrewJoint::Attach(LinkPtr _one, LinkPtr _two)
+math::Vector3 BulletScrewJoint::GetAnchor(unsigned int /*index*/) const
 {
-  gzwarn << "Screw joint constraints are currently not enforced" << "\n";
+  gzerr << "BulletScrewJoint::GetAnchor not implemented, return 0 vector.\n";
+  return math::Vector3();
+}
 
-  ScrewJoint<BulletJoint>::Attach(_one, _two);
+//////////////////////////////////////////////////
+void BulletScrewJoint::SetAnchor(unsigned int /*index*/,
+    const math::Vector3 &/*_anchor*/)
+{
+  gzerr << "BulletScrewJoint::SetAnchor not implemented.\n";
+}
+
+//////////////////////////////////////////////////
+void BulletScrewJoint::Init()
+{
+  ScrewJoint<BulletJoint>::Init();
 
   BulletLinkPtr bulletChildLink =
     boost::static_pointer_cast<BulletLink>(this->childLink);
   BulletLinkPtr bulletParentLink =
     boost::static_pointer_cast<BulletLink>(this->parentLink);
 
+  // Get axis unit vector (expressed in world frame).
+  math::Vector3 axis = this->initialWorldAxis;
+  if (axis == math::Vector3::Zero)
+  {
+    gzerr << "axis must have non-zero length, resetting to 0 0 1\n";
+    axis.Set(0, 0, 1);
+  }
 
-  btTransform frame1, frame2;
-  frame1 = btTransform::getIdentity();
-  frame2 = btTransform::getIdentity();
-
-  math::Vector3 pivotA, pivotB;
+  // Local variables used to compute pivots and axes in body-fixed frames
+  // for the parent and child links.
+  math::Vector3 pivotParent, pivotChild, axisParent, axisChild;
   math::Pose pose;
+  btTransform frameParent, frameChild;
+  btVector3 axis2, axis3;
+
+  // Initialize pivots to anchorPos, which is expressed in the
+  // world coordinate frame.
+  pivotParent = this->anchorPos;
+  pivotChild = this->anchorPos;
 
-  pivotA = this->anchorPos;
-  pivotB = this->anchorPos;
   // Check if parentLink exists. If not, the parent will be the world.
   if (this->parentLink)
   {
     // Compute relative pose between joint anchor and CoG of parent link.
     pose = this->parentLink->GetWorldCoGPose();
     // Subtract CoG position from anchor position, both in world frame.
-    pivotA -= pose.pos;
+    pivotParent -= pose.pos;
     // Rotate pivot offset and axis into body-fixed frame of parent.
-    pivotA = pose.rot.RotateVectorReverse(pivotA);
+    pivotParent = pose.rot.RotateVectorReverse(pivotParent);
+    frameParent.setOrigin(BulletTypes::ConvertVector3(pivotParent));
+    axisParent = pose.rot.RotateVectorReverse(axis);
+    axisParent = axisParent.Normalize();
+    // The following math is based on btHingeConstraint.cpp:95-115
+    btPlaneSpace1(BulletTypes::ConvertVector3(axisParent), axis2, axis3);
+    frameParent.getBasis().setValue(
+      axisParent.x, axis2.x(), axis3.x(),
+      axisParent.y, axis2.y(), axis3.y(),
+      axisParent.z, axis2.z(), axis3.z());
   }
   // Check if childLink exists. If not, the child will be the world.
   if (this->childLink)
@@ -89,44 +184,84 @@ void BulletScrewJoint::Attach(LinkPtr _one, LinkPtr _two)
     // Compute relative pose between joint anchor and CoG of child link.
     pose = this->childLink->GetWorldCoGPose();
     // Subtract CoG position from anchor position, both in world frame.
-    pivotB -= pose.pos;
+    pivotChild -= pose.pos;
     // Rotate pivot offset and axis into body-fixed frame of child.
-    pivotB = pose.rot.RotateVectorReverse(pivotB);
+    pivotChild = pose.rot.RotateVectorReverse(pivotChild);
+    frameChild.setOrigin(BulletTypes::ConvertVector3(pivotChild));
+    axisChild = pose.rot.RotateVectorReverse(axis);
+    axisChild = axisChild.Normalize();
+    // The following math is based on btHingeConstraint.cpp:95-115
+    btPlaneSpace1(BulletTypes::ConvertVector3(axisChild), axis2, axis3);
+    frameChild.getBasis().setValue(
+      axisChild.x, axis2.x(), axis3.x(),
+      axisChild.y, axis2.y(), axis3.y(),
+      axisChild.z, axis2.z(), axis3.z());
   }
 
-  frame1.setOrigin(btVector3(pivotA.x, pivotA.y, pivotA.z));
-  frame2.setOrigin(btVector3(pivotB.x, pivotB.y, pivotB.z));
-
-  frame1.getBasis().setEulerZYX(0, M_PI*0.5, 0);
-  frame2.getBasis().setEulerZYX(0, M_PI*0.5, 0);
-
   // If both links exist, then create a joint between the two links.
   if (bulletChildLink && bulletParentLink)
   {
-    this->bulletScrew = new btSliderConstraint(
+    this->bulletScrew = new btScrewConstraint(
         *bulletParentLink->GetBulletLink(),
         *bulletChildLink->GetBulletLink(),
-        frame1, frame2, true);
+        frameParent, frameChild, true);
   }
   // If only the child exists, then create a joint between the child
   // and the world.
   else if (bulletChildLink)
   {
-    this->bulletScrew = new btSliderConstraint(
-        *bulletChildLink->GetBulletLink(), frame2, true);
+    this->bulletScrew = new btScrewConstraint(
+        *bulletChildLink->GetBulletLink(), frameChild, true);
   }
   // If only the parent exists, then create a joint between the parent
   // and the world.
   else if (bulletParentLink)
   {
-    this->bulletScrew = new btSliderConstraint(
-        *bulletParentLink->GetBulletLink(), frame1, true);
+    this->bulletScrew = new btScrewConstraint(
+        *bulletParentLink->GetBulletLink(), frameParent, true);
   }
   // Throw an error if no links are given.
   else
   {
-    gzthrow("joint without links\n");
+    gzerr << "Unable to create a joint without links\n";
+    return;
+  }
+
+  if (!this->bulletScrew)
+  {
+    gzerr << "unable to create bullet screw joint\n";
+    return;
+  }
+
+  // Apply joint translation limits here.
+  // TODO: velocity and effort limits.
+  GZ_ASSERT(this->sdf != NULL, "Joint sdf member is NULL");
+  sdf::ElementPtr limitElem;
+  limitElem = this->sdf->GetElement("axis")->GetElement("limit");
+  // joint limit is set on the revolute dof in sdf,
+  double upper = limitElem->Get<double>("upper");
+  double lower = limitElem->Get<double>("lower");
+  this->bulletScrew->setLowerAngLimit(lower);
+  this->bulletScrew->setUpperAngLimit(upper);
+  // enforce linear dof in bullet.
+  double tp = this->threadPitch;
+  if (math::equal(tp, 0.0))
+  {
+    gzerr << "thread pitch should not be zero (joint is a slider?)"
+          << " using thread pitch = 1.0e6\n";
+    tp = 1.0e6;
+  }
+  if (tp > 0)
+  {
+    this->bulletScrew->setLowerLinLimit(lower/tp);
+    this->bulletScrew->setUpperLinLimit(upper/tp);
+  }
+  else
+  {
+    this->bulletScrew->setLowerLinLimit(upper/tp);
+    this->bulletScrew->setUpperLinLimit(lower/tp);
   }
+  this->bulletScrew->setThreadPitch(tp);
 
   this->constraint = this->bulletScrew;
 
@@ -136,127 +271,978 @@ void BulletScrewJoint::Attach(LinkPtr _one, LinkPtr _two)
 
   // Allows access to impulse
   this->constraint->enableFeedback(true);
+
+  // Setup Joint force and torque feedback
+  this->SetupJointFeedback();
 }
 
 //////////////////////////////////////////////////
-double BulletScrewJoint::GetVelocity(int /*_index*/) const
+double BulletScrewJoint::GetVelocity(unsigned int /*_index*/) const
 {
   double result = 0;
-  if (this->bulletScrew)
-    result = this->bulletScrew->getTargetLinMotorVelocity();
+  math::Vector3 globalAxis = this->GetGlobalAxis(0);
+  if (this->childLink)
+    result += globalAxis.Dot(this->childLink->GetWorldLinearVel());
+  if (this->parentLink)
+    result -= globalAxis.Dot(this->parentLink->GetWorldLinearVel());
   return result;
 }
 
 //////////////////////////////////////////////////
-void BulletScrewJoint::SetVelocity(int /*_index*/, double _angle)
+void BulletScrewJoint::SetVelocity(unsigned int _index, double _vel)
 {
-  if (this->bulletScrew)
-    this->bulletScrew->setTargetLinMotorVelocity(_angle);
+  math::Vector3 desiredVel;
+  if (this->parentLink)
+    desiredVel = this->parentLink->GetWorldLinearVel();
+  desiredVel += _vel * this->GetGlobalAxis(_index);
+  if (this->childLink)
+    this->childLink->SetLinearVel(desiredVel);
 }
 
 //////////////////////////////////////////////////
-void BulletScrewJoint::SetAxis(int /*_index*/, const math::Vector3 &/*_axis*/)
+void BulletScrewJoint::SetAxis(unsigned int /*_index*/,
+    const math::Vector3 &_axis)
 {
-  gzerr << "Not implemented in bullet\n";
+  // Note that _axis is given in a world frame,
+  // but bullet uses a body-fixed frame
+  if (!this->bulletScrew)
+  {
+    // this hasn't been initialized yet, store axis in initialWorldAxis
+    math::Quaternion axisFrame = this->GetAxisFrame(0);
+    this->initialWorldAxis = axisFrame.RotateVector(_axis);
+  }
+  else
+  {
+    gzerr << "SetAxis for existing joint is not implemented\n";
+  }
 }
 
 //////////////////////////////////////////////////
-void BulletScrewJoint::SetDamping(int /*index*/, double _damping)
+void BulletScrewJoint::SetThreadPitch(unsigned int /*_index*/,
+    double _threadPitch)
 {
-  if (this->bulletScrew)
-    this->bulletScrew->setDampingDirLin(_damping);
+  this->SetThreadPitch(_threadPitch);
 }
 
 //////////////////////////////////////////////////
-void BulletScrewJoint::SetThreadPitch(int /*_index*/, double /*_threadPitch*/)
+void BulletScrewJoint::SetThreadPitch(double _threadPitch)
 {
-  gzerr << "Not implemented\n";
+  this->threadPitch = _threadPitch;
 }
 
 //////////////////////////////////////////////////
-double BulletScrewJoint::GetThreadPitch(unsigned int /*_index*/)
+double BulletScrewJoint::GetThreadPitch()
 {
-  gzerr << "Not implemented\n";
-  return 0;
+  double result = this->threadPitch;
+  if (this->bulletScrew)
+    result = this->bulletScrew->getThreadPitch();
+  else
+    gzwarn << "bulletScrew not created yet, returning cached threadPitch.\n";
+  return result;
 }
 
 //////////////////////////////////////////////////
-void BulletScrewJoint::SetForce(int /*_index*/, double /*_force*/)
+double BulletScrewJoint::GetThreadPitch(unsigned int /*_index*/)
 {
-  gzerr << "Not implemented\n";
+  return this->GetThreadPitch();
 }
 
 //////////////////////////////////////////////////
-void BulletScrewJoint::SetHighStop(int /*_index*/, const math::Angle &_angle)
+void BulletScrewJoint::SetForceImpl(unsigned int _index, double _force)
 {
   if (this->bulletScrew)
-    this->bulletScrew->setUpperLinLimit(_angle.Radian());
-}
+  {
+    // x-axis of constraint frame
+    btVector3 hingeAxisLocalA =
+      this->bulletScrew->getFrameOffsetA().getBasis().getColumn(0);
+    btVector3 hingeAxisLocalB =
+      this->bulletScrew->getFrameOffsetB().getBasis().getColumn(0);
 
-//////////////////////////////////////////////////
-void BulletScrewJoint::SetLowStop(int /*_index*/, const math::Angle &_angle)
-{
-  if (this->bulletScrew)
-    this->bulletScrew->setLowerLinLimit(_angle.Radian());
+    btVector3 hingeAxisWorldA =
+      this->bulletScrew->getRigidBodyA().getWorldTransform().getBasis() *
+      hingeAxisLocalA;
+    btVector3 hingeAxisWorldB =
+      this->bulletScrew->getRigidBodyB().getWorldTransform().getBasis() *
+      hingeAxisLocalB;
+
+    btVector3 hingeEffortA = _force * hingeAxisWorldA;
+    btVector3 hingeEffortB = _force * hingeAxisWorldB;
+
+    if (_index == 0)
+    {
+      this->bulletScrew->getRigidBodyA().applyTorque(-hingeEffortA);
+      this->bulletScrew->getRigidBodyB().applyTorque(hingeEffortB);
+    }
+    else if (_index == 1)
+    {
+      if (this->constraint)
+      {
+        // TODO: switch to applyForce and specify body-fixed offset
+        this->constraint->getRigidBodyA().applyCentralForce(-hingeEffortA);
+        this->constraint->getRigidBodyB().applyCentralForce(hingeEffortB);
+      }
+      else
+        gzerr << "BulletScrewJoint::constraint not created yet.\n";
+    }
+    else
+      gzerr << "Invalid index [" << _index << "]\n";
+  }
+  else
+    gzerr << "bulletScrew not created yet.\n";
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletScrewJoint::GetHighStop(int /*_index*/)
+void BulletScrewJoint::SetMaxForce(unsigned int /*_index*/, double _force)
 {
-  math::Angle result;
   if (this->bulletScrew)
-    result = this->bulletScrew->getUpperLinLimit();
-  return result;
+    this->bulletScrew->setMaxLinMotorForce(_force);
+  else
+    gzerr << "bulletScrew not created yet\n";
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletScrewJoint::GetLowStop(int /*_index*/)
+double BulletScrewJoint::GetMaxForce(unsigned int /*index*/)
 {
-  math::Angle result;
+  double result = 0;
   if (this->bulletScrew)
-    result = this->bulletScrew->getLowerLinLimit();
+    result = this->bulletScrew->getMaxLinMotorForce();
+  else
+    gzerr << "bulletScrew not created yet\n";
   return result;
 }
 
 //////////////////////////////////////////////////
-void BulletScrewJoint::SetMaxForce(int /*_index*/, double _force)
+bool BulletScrewJoint::SetHighStop(unsigned int _index,
+                      const math::Angle &_angle)
 {
-  if (this->bulletScrew)
-    this->bulletScrew->setMaxLinMotorForce(_force);
+  Joint::SetHighStop(0, _angle);
+
+  // bulletScrew axial rotation is backward
+  if (!this->bulletScrew)
+  {
+    gzerr << "bulletScrew not created yet.\n";
+    return false;
+  }
+
+  if (_index == 0)
+  {
+    // _index = 0: angular constraint
+    double upperAng = this->bulletScrew->getUpperAngLimit();
+    this->bulletScrew->setUpperAngLimit(std::max(upperAng, _angle.Radian()));
+
+    // set corresponding linear constraints
+    double tp = this->threadPitch;
+    if (math::equal(tp, 0.0))
+    {
+      gzwarn << "thread pitch should not be zero (joint is a slider?)"
+             << " using thread pitch = 1.0e6\n";
+      tp = 1.0e6;
+    }
+    // linear is angular / threadPitch
+    if (tp > 0)
+    {
+      double lowerLin = this->bulletScrew->getLowerLinLimit();
+      this->bulletScrew->setUpperLinLimit(std::max(lowerLin,
+        _angle.Radian()/tp));
+    }
+    else
+    {
+      // flip upper lower because thread pitch is negative
+      double upperLin = this->bulletScrew->getUpperLinLimit();
+      this->bulletScrew->setLowerLinLimit(std::min(upperLin,
+        _angle.Radian()/tp));
+    }
+    return true;
+  }
+  else if (_index == 1)
+  {
+    // _index = 1: linear constraint
+    double lowerLin = this->bulletScrew->getLowerLinLimit();
+    this->bulletScrew->setUpperLinLimit(std::max(lowerLin, _angle.Radian()));
+
+    // set corresponding angular constraints
+    double tp = this->threadPitch;
+    // angular is linear * threadPitch
+    if (tp > 0)
+    {
+      double lowerAng = this->bulletScrew->getLowerAngLimit();
+      this->bulletScrew->setUpperAngLimit(std::max(lowerAng,
+        _angle.Radian()*tp));
+    }
+    else
+    {
+      // flip upper lower because thread pitch is negative
+      double upperAng = this->bulletScrew->getUpperAngLimit();
+      this->bulletScrew->setLowerAngLimit(std::min(upperAng,
+        _angle.Radian()*tp));
+    }
+    return true;
+  }
+  else
+  {
+    gzerr << "Invalid index [" << _index << "]\n";
+    return false;
+  }
 }
 
 //////////////////////////////////////////////////
-double BulletScrewJoint::GetMaxForce(int /*index*/)
+bool BulletScrewJoint::SetLowStop(unsigned int _index,
+                     const math::Angle &_angle)
 {
-  double result = 0;
-  if (this->bulletScrew)
-    result = this->bulletScrew->getMaxLinMotorForce();
-  return result;
+  Joint::SetLowStop(0, _angle);
+
+  // bulletScrew axial rotation is backward
+  if (!this->bulletScrew)
+  {
+    gzerr << "bulletScrew not created yet.\n";
+    return false;
+  }
+
+  // bulletScrew axial rotation is backward
+  if (_index == 0)
+  {
+    // _index = 0: angular constraint
+    double upperAng = this->bulletScrew->getUpperAngLimit();
+    this->bulletScrew->setLowerAngLimit(std::min(upperAng, _angle.Radian()));
+
+    // set corresponding linear constraints
+    double tp = this->threadPitch;
+    if (math::equal(tp, 0.0))
+    {
+      gzerr << "thread pitch should not be zero (joint is a slider?)"
+            << " using thread pitch = 1.0e6\n";
+      tp = 1.0e6;
+    }
+    // linear is angular / threadPitch
+    if (tp > 0)
+    {
+      double upperLin = this->bulletScrew->getUpperLinLimit();
+      this->bulletScrew->setLowerLinLimit(std::min(upperLin,
+        _angle.Radian()/tp));
+    }
+    else
+    {
+        // flip upper lower because thread pitch is negative
+      double lowerLin = this->bulletScrew->getLowerLinLimit();
+      this->bulletScrew->setUpperLinLimit(std::max(lowerLin,
+        _angle.Radian()/tp));
+    }
+    return true;
+  }
+  else if (_index == 1)
+  {
+    // _index = 1: linear constraint
+    double upperLin = this->bulletScrew->getUpperLinLimit();
+    this->bulletScrew->setLowerLinLimit(std::min(upperLin, _angle.Radian()));
+
+    // set corresponding angular constraints
+    double tp = this->threadPitch;
+    // angular is linear * threadPitch
+    if (tp > 0)
+    {
+      double upperAng = this->bulletScrew->getUpperAngLimit();
+      this->bulletScrew->setLowerAngLimit(std::min(upperAng,
+        _angle.Radian()*tp));
+    }
+    else
+    {
+        // flip upper lower because thread pitch is negative
+      double lowerAng = this->bulletScrew->getLowerAngLimit();
+      this->bulletScrew->setUpperAngLimit(std::max(lowerAng,
+        _angle.Radian()*tp));
+    }
+    return true;
+  }
+  else
+  {
+    gzerr << "Invalid index [" << _index << "]\n";
+    return false;
+  }
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletScrewJoint::GetGlobalAxis(int /*_index*/) const
+math::Vector3 BulletScrewJoint::GetGlobalAxis(unsigned int /*_index*/) const
 {
-  math::Vector3 result;
+  math::Vector3 result = this->initialWorldAxis;
   if (this->bulletScrew)
   {
-    // I have not verified the following math, though I based it on internal
-    // bullet code at line 250 of btHingeConstraint.cpp
+    // bullet uses x-axis for slider
     btVector3 vec =
-      this->bulletScrew->getRigidBodyA().getCenterOfMassTransform().getBasis() *
-      this->bulletScrew->getFrameOffsetA().getBasis().getColumn(2);
+      this->bulletScrew->getRigidBodyA().getCenterOfMassTransform().getBasis()
+      * this->bulletScrew->getFrameOffsetA().getBasis().getColumn(0);
     result = BulletTypes::ConvertVector3(vec);
   }
   else
-    gzwarn << "bulletHinge does not exist, returning fake axis\n";
+    gzwarn << "bulletScrew does not exist, returning fake axis\n";
   return result;
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletScrewJoint::GetAngleImpl(int /*_index*/) const
+math::Angle BulletScrewJoint::GetAngleImpl(unsigned int _index) const
 {
   math::Angle result;
   if (this->bulletScrew)
-    result = this->bulletScrew->getLinearPos();
+  {
+    if (_index == 0)
+    {
+      // angular position
+      result = this->bulletScrew->getAngularPosition();
+    }
+    else if (_index == 1)
+    {
+      // linear position
+      result = this->bulletScrew->getLinearPosition();
+    }
+    else
+      gzerr << "Invalid index [" << _index << "]\n";
+  }
+  else
+    gzerr << "bulletScrew not created yet\n";
   return result;
 }
+
+//////////////////////////////////////////////////
+double BulletScrewJoint::GetAttribute(
+  const std::string &_key, unsigned int _index)
+{
+  return this->GetParam(_key, _index);
+}
+
+//////////////////////////////////////////////////
+double BulletScrewJoint::GetParam(
+  const std::string &_key, unsigned int _index)
+{
+  if (_key  == "thread_pitch")
+    return this->threadPitch;
+  else
+    return BulletJoint::GetParam(_key, _index);
+}
+
+//////////////////////////////////////////////////
+btScalar btScrewConstraint::getAngularPosition()
+{
+  this->calculateTransforms(
+    m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
+  const btVector3 axisA0 = m_calculatedTransformA.getBasis().getColumn(1);
+  const btVector3 axisA1 = m_calculatedTransformA.getBasis().getColumn(2);
+  const btVector3 axisB0 = m_calculatedTransformB.getBasis().getColumn(1);
+  return btAtan2(axisB0.dot(axisA1), axisB0.dot(axisA0));
+}
+
+//////////////////////////////////////////////////
+btScalar btScrewConstraint::getLinearPosition()
+{
+  this->calculateTransforms(
+    m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
+  return this->m_depth[0];
+}
+
+//////////////////////////////////////////////////
+btRigidBody& btScrewConstraint::getRigidBodyA()
+{
+  return this->m_rbA;
+}
+
+//////////////////////////////////////////////////
+btRigidBody& btScrewConstraint::getRigidBodyB()
+{
+  return this->m_rbB;
+}
+
+//////////////////////////////////////////////////
+void btScrewConstraint::_getInfo2NonVirtual(
+    btConstraintInfo2* info,
+    const btTransform& transA,
+    const btTransform& transB,
+    const btVector3& linVelA,
+    const btVector3& linVelB,
+    btScalar rbAinvMass, btScalar rbBinvMass)
+{
+  /// This is a copy of btSliderConstraint::getInfo2NonVirtual(...)
+  /// with minor changes to the ax1 direction constraint.
+  /// Mainly, the axial limit constraint is always on and is
+  /// changed to a screw constraint.
+
+  /// First, always turn on
+  const btTransform& trA = getCalculatedTransformA();
+  const btTransform& trB = getCalculatedTransformB();
+
+  btAssert(!m_useSolveConstraintObsolete);
+  int i, s = info->rowskip;
+
+  btScalar signFact = m_useLinearReferenceFrameA ?
+    btScalar(1.0f) : btScalar(-1.0f);
+
+  // difference between frames in WCS
+  btVector3 ofs = trB.getOrigin() - trA.getOrigin();
+  // now get weight factors depending on masses
+  btScalar miA = rbAinvMass;
+  btScalar miB = rbBinvMass;
+  bool hasStaticBody = (miA < SIMD_EPSILON) || (miB < SIMD_EPSILON);
+  btScalar miS = miA + miB;
+  btScalar factA, factB;
+  if (miS > btScalar(0.f))
+  {
+    factA = miB / miS;
+  }
+  else
+  {
+    factA = btScalar(0.5f);
+  }
+  factB = btScalar(1.0f) - factA;
+  btVector3 ax1, p, q;
+  btVector3 ax1A = trA.getBasis().getColumn(0);
+  btVector3 ax1B = trB.getBasis().getColumn(0);
+  if (m_useOffsetForConstraintFrame)
+  {
+    // get the desired direction of slider axis
+    // as weighted sum of X-orthos of frameA and frameB in WCS
+    ax1 = ax1A * factA + ax1B * factB;
+    ax1.normalize();
+    // construct two orthos to slider axis
+    btPlaneSpace1(ax1, p, q);
+  }
+  else
+  { // old way - use frameA
+    ax1 = trA.getBasis().getColumn(0);
+    // get 2 orthos to slider axis (Y, Z)
+    p = trA.getBasis().getColumn(1);
+    q = trA.getBasis().getColumn(2);
+  }
+  // make rotations around these orthos equal
+  // the slider axis should be the only unconstrained
+  // rotational axis, the angular velocity of the two bodies perpendicular to
+  // the slider axis should be equal. thus the constraint equations are
+  //    p*w1 - p*w2 = 0
+  //    q*w1 - q*w2 = 0
+  // where p and q are unit vectors normal to the slider axis, and w1 and w2
+  // are the angular velocity vectors of the two bodies.
+  info->m_J1angularAxis[0] = p[0];
+  info->m_J1angularAxis[1] = p[1];
+  info->m_J1angularAxis[2] = p[2];
+  info->m_J1angularAxis[s+0] = q[0];
+  info->m_J1angularAxis[s+1] = q[1];
+  info->m_J1angularAxis[s+2] = q[2];
+
+  info->m_J2angularAxis[0] = -p[0];
+  info->m_J2angularAxis[1] = -p[1];
+  info->m_J2angularAxis[2] = -p[2];
+  info->m_J2angularAxis[s+0] = -q[0];
+  info->m_J2angularAxis[s+1] = -q[1];
+  info->m_J2angularAxis[s+2] = -q[2];
+  // compute the right hand side of the constraint equation. set relative
+  // body velocities along p and q to bring the slider back into alignment.
+  // if ax1A,ax1B are the unit length slider axes as computed from bodyA and
+  // bodyB, we need to rotate both bodies along the axis u = (ax1 x ax2).
+  // if "theta" is the angle between ax1 and ax2, we need an angular velocity
+  // along u to cover angle erp*theta in one step :
+  //   |angular_velocity| = angle/time = erp*theta / stepsize
+  //                      = (erp*fps) * theta
+  //    angular_velocity  = |angular_velocity| * (ax1 x ax2) / |ax1 x ax2|
+  //                      = (erp*fps) * theta * (ax1 x ax2) / sin(theta)
+  // ...as ax1 and ax2 are unit length. if theta is smallish,
+  // theta ~= sin(theta), so
+  //    angular_velocity  = (erp*fps) * (ax1 x ax2)
+  // ax1 x ax2 is in the plane space of ax1, so we project the angular
+  // velocity to p and q to find the right hand side.
+//  btScalar k = info->fps * info->erp * getSoftnessOrthoAng();
+  btScalar currERP = (m_flags & BT_SLIDER_FLAGS_ERP_ORTANG) ?
+    m_softnessOrthoAng : m_softnessOrthoAng * info->erp;
+  btScalar k = info->fps * currERP;
+
+  btVector3 u = ax1A.cross(ax1B);
+  info->m_constraintError[0] = k * u.dot(p);
+  info->m_constraintError[s] = k * u.dot(q);
+  if (m_flags & BT_SLIDER_FLAGS_CFM_ORTANG)
+  {
+    info->cfm[0] = m_cfmOrthoAng;
+    info->cfm[s] = m_cfmOrthoAng;
+  }
+
+  // last filled row
+  int nrow = 1;
+  int srow;
+  btScalar limit_err;
+  int limit;
+  int powered;
+
+  // next two rows.
+  // we want: velA + wA x relA == velB + wB x relB ... but this would
+  // result in three equations, so we project along two orthos to the
+  // slider axis
+
+  btTransform bodyA_trans = transA;
+  btTransform bodyB_trans = transB;
+  nrow++;
+  int s2 = nrow * s;
+  nrow++;
+  int s3 = nrow * s;
+  btVector3 tmpA(0, 0, 0), tmpB(0, 0, 0), relA(0, 0, 0),
+    relB(0, 0, 0), c(0, 0, 0);
+  if (m_useOffsetForConstraintFrame)
+  {
+    // get vector from bodyB to frameB in WCS
+    relB = trB.getOrigin() - bodyB_trans.getOrigin();
+    // get its projection to slider axis
+    btVector3 projB = ax1 * relB.dot(ax1);
+    // get vector directed from bodyB to slider axis (and orthogonal to it)
+    btVector3 orthoB = relB - projB;
+    // same for bodyA
+    relA = trA.getOrigin() - bodyA_trans.getOrigin();
+    btVector3 projA = ax1 * relA.dot(ax1);
+    btVector3 orthoA = relA - projA;
+    // get desired offset between frames A and B along slider axis
+    btScalar sliderOffs = m_linPos - m_depth[0];
+    // desired vector from projection of center of bodyA to projection of
+    // center of bodyB to slider axis
+    btVector3 totalDist = projA + ax1 * sliderOffs - projB;
+    // get offset vectors relA and relB
+    relA = orthoA + totalDist * factA;
+    relB = orthoB - totalDist * factB;
+    // now choose average ortho to slider axis
+    p = orthoB * factA + orthoA * factB;
+    btScalar len2 = p.length2();
+    if (len2 > SIMD_EPSILON)
+    {
+      p /= btSqrt(len2);
+    }
+    else
+    {
+      p = trA.getBasis().getColumn(1);
+    }
+    // make one more ortho
+    q = ax1.cross(p);
+    // fill two rows
+    tmpA = relA.cross(p);
+    tmpB = relB.cross(p);
+    for (i = 0; i < 3; ++i)
+    {
+      info->m_J1angularAxis[s2+i] = tmpA[i];
+      info->m_J2angularAxis[s2+i] = -tmpB[i];
+    }
+    tmpA = relA.cross(q);
+    tmpB = relB.cross(q);
+    if (hasStaticBody && getSolveAngLimit())
+    { // to make constraint between static and dynamic objects more rigid
+      // remove wA (or wB) from equation if angular limit is hit
+      tmpB *= factB;
+      tmpA *= factA;
+    }
+    for (i = 0; i < 3; ++i)
+    {
+      info->m_J1angularAxis[s3+i] = tmpA[i];
+      info->m_J2angularAxis[s3+i] = -tmpB[i];
+      info->m_J1linearAxis[s2+i] = p[i];
+      info->m_J1linearAxis[s3+i] = q[i];
+      info->m_J2linearAxis[s2+i] = -p[i];
+      info->m_J2linearAxis[s3+i] = -q[i];
+    }
+  }
+  else
+  {
+    // old way - maybe incorrect if bodies are not on the slider axis
+    // see discussion "Bug in slider constraint"
+    // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=4024&start=0
+    c = bodyB_trans.getOrigin() - bodyA_trans.getOrigin();
+    btVector3 tmp = c.cross(p);
+    for (i = 0; i < 3; ++i)
+    {
+     info->m_J1angularAxis[s2+i] = factA*tmp[i];
+     info->m_J2angularAxis[s2+i] = factB*tmp[i];
+    }
+    tmp = c.cross(q);
+    for (i = 0; i < 3; ++i)
+    {
+      info->m_J1angularAxis[s3+i] = factA*tmp[i];
+      info->m_J2angularAxis[s3+i] = factB*tmp[i];
+      info->m_J1linearAxis[s2+i] = p[i];
+      info->m_J1linearAxis[s3+i] = q[i];
+      info->m_J2linearAxis[s2+i] = -p[i];
+      info->m_J2linearAxis[s3+i] = -q[i];
+    }
+  }
+  // compute two elements of right hand side
+
+  //  k = info->fps * info->erp * getSoftnessOrthoLin();
+  currERP = (m_flags & BT_SLIDER_FLAGS_ERP_ORTLIN) ?
+    m_softnessOrthoLin : m_softnessOrthoLin * info->erp;
+  k = info->fps * currERP;
+
+  btScalar rhs = k * p.dot(ofs);
+  info->m_constraintError[s2] = rhs;
+  rhs = k * q.dot(ofs);
+  info->m_constraintError[s3] = rhs;
+  if (m_flags & BT_SLIDER_FLAGS_CFM_ORTLIN)
+  {
+    info->cfm[s2] = m_cfmOrthoLin;
+    info->cfm[s3] = m_cfmOrthoLin;
+  }
+
+  // Screw Constraint (coupled linear and angular motion)
+  {
+    nrow++;
+    srow = nrow * info->rowskip;
+    info->m_J1linearAxis[srow+0] = -ax1[0] * this->threadPitch;
+    info->m_J1linearAxis[srow+1] = -ax1[1] * this->threadPitch;
+    info->m_J1linearAxis[srow+2] = -ax1[2] * this->threadPitch;
+
+    info->m_J1angularAxis[srow+0] = ax1[0];
+    info->m_J1angularAxis[srow+1] = ax1[1];
+    info->m_J1angularAxis[srow+2] = ax1[2];
+
+    info->m_J2linearAxis[srow+0] = ax1[0] * this->threadPitch;
+    info->m_J2linearAxis[srow+1] = ax1[1] * this->threadPitch;
+    info->m_J2linearAxis[srow+2] = ax1[2] * this->threadPitch;
+
+    info->m_J2angularAxis[srow+0] = -ax1[0];
+    info->m_J2angularAxis[srow+1] = -ax1[1];
+    info->m_J2angularAxis[srow+2] = -ax1[2];
+
+    // correction
+    // rhs = k * ax1.dot(ofs);  // from hinge constraint
+    btScalar lin_disp = ax1.dot(ofs);
+    btScalar ang_pos = this->getAngularPosition();
+    info->m_constraintError[srow] =
+      -k * (lin_disp * this->threadPitch - ang_pos);
+    info->cfm[srow] = -m_cfmOrthoLin;
+
+    // debug, set cfm to 0
+    // info->cfm[srow] = 0;
+    // debug, set error correction to 0
+    // info->m_constraintError[srow] = 0.0;
+  }
+
+  // notes: below enforces
+  // joint limit
+  // powered joint
+  // rotation along slider axis
+
+  // check linear limits
+  limit_err = btScalar(0.0);
+  limit = 0;
+  if (getSolveLinLimit())
+  {
+    limit_err = getLinDepth() *  signFact;
+    limit = (limit_err > btScalar(0.0)) ? 2 : 1;
+  }
+  powered = 0;
+  if (getPoweredLinMotor())
+  {
+    powered = 1;
+  }
+  // if the slider has joint limits or motor, add in the extra row
+  if (limit || powered)
+  {
+    nrow++;
+    srow = nrow * info->rowskip;
+    info->m_J1linearAxis[srow+0] = ax1[0];
+    info->m_J1linearAxis[srow+1] = ax1[1];
+    info->m_J1linearAxis[srow+2] = ax1[2];
+    info->m_J2linearAxis[srow+0] = -ax1[0];
+    info->m_J2linearAxis[srow+1] = -ax1[1];
+    info->m_J2linearAxis[srow+2] = -ax1[2];
+    // linear torque decoupling step:
+    //
+    // we have to be careful that the linear constraint forces (+/- ax1)
+    // applied to the two bodies
+    // do not create a torque couple. in other words, the points that the
+    // constraint force is applied at must lie along the same ax1 axis.
+    // a torque couple will result in limited slider-jointed free
+    // bodies from gaining angular momentum.
+    if (m_useOffsetForConstraintFrame)
+    {
+      // this is needed only when bodyA and bodyB are both dynamic.
+      if (!hasStaticBody)
+      {
+        tmpA = relA.cross(ax1);
+        tmpB = relB.cross(ax1);
+        info->m_J1angularAxis[srow+0] = tmpA[0];
+        info->m_J1angularAxis[srow+1] = tmpA[1];
+        info->m_J1angularAxis[srow+2] = tmpA[2];
+        info->m_J2angularAxis[srow+0] = -tmpB[0];
+        info->m_J2angularAxis[srow+1] = -tmpB[1];
+        info->m_J2angularAxis[srow+2] = -tmpB[2];
+      }
+    }
+    else
+    { // The old way. May be incorrect if bodies are not on the slider axis
+      // Linear Torque Decoupling vector (a torque)
+      btVector3 ltd;
+      ltd = c.cross(ax1);
+      info->m_J1angularAxis[srow+0] = factA*ltd[0];
+      info->m_J1angularAxis[srow+1] = factA*ltd[1];
+      info->m_J1angularAxis[srow+2] = factA*ltd[2];
+      info->m_J2angularAxis[srow+0] = factB*ltd[0];
+      info->m_J2angularAxis[srow+1] = factB*ltd[1];
+      info->m_J2angularAxis[srow+2] = factB*ltd[2];
+    }
+    // right-hand part
+    btScalar lostop = getLowerLinLimit();
+    btScalar histop = getUpperLinLimit();
+
+    // issue #1104:
+    // if (limit && (lostop == histop)) raises warnings, using
+    // a warning-less implementation.
+    if (limit &&
+      math::equal(lostop, histop,
+      static_cast<btScalar>(std::numeric_limits<double>::epsilon())))
+    {
+      // the joint motor is ineffective
+      powered = 0;
+    }
+    info->m_constraintError[srow] = 0.;
+    info->m_lowerLimit[srow] = 0.;
+    info->m_upperLimit[srow] = 0.;
+    currERP = (m_flags & BT_SLIDER_FLAGS_ERP_LIMLIN) ?
+      m_softnessLimLin : info->erp;
+    if (powered)
+    {
+      if (m_flags & BT_SLIDER_FLAGS_CFM_DIRLIN)
+      {
+        info->cfm[srow] = m_cfmDirLin;
+      }
+      btScalar tag_vel = getTargetLinMotorVelocity();
+      btScalar mot_fact = getMotorFactor(m_linPos, m_lowerLinLimit,
+        m_upperLinLimit, tag_vel, info->fps * currERP);
+      info->m_constraintError[srow] -=
+        signFact * mot_fact * getTargetLinMotorVelocity();
+      info->m_lowerLimit[srow] += -getMaxLinMotorForce() * info->fps;
+      info->m_upperLimit[srow] += getMaxLinMotorForce() * info->fps;
+    }
+    if (limit)
+    {
+      k = info->fps * currERP;
+      info->m_constraintError[srow] += k * limit_err;
+      if (m_flags & BT_SLIDER_FLAGS_CFM_LIMLIN)
+      {
+        info->cfm[srow] = m_cfmLimLin;
+      }
+      // issue #1104:
+      // if (lostop == histop) raises warnings, using
+      // a warning-less implementation.
+      if (math::equal(lostop, histop,
+          static_cast<btScalar>(std::numeric_limits<double>::epsilon())))
+      {
+        // limited low and high simultaneously
+        info->m_lowerLimit[srow] = -SIMD_INFINITY;
+        info->m_upperLimit[srow] = SIMD_INFINITY;
+      }
+      else if (limit == 1)
+      {
+         // low limit
+        info->m_lowerLimit[srow] = -SIMD_INFINITY;
+        info->m_upperLimit[srow] = 0;
+      }
+      else
+      { // high limit
+        info->m_lowerLimit[srow] = 0;
+        info->m_upperLimit[srow] = SIMD_INFINITY;
+      }
+      // bounce (we'll use slider parameter abs(1.0 - m_dampingLimLin)
+      //   for that)
+      btScalar bounce = btFabs(btScalar(1.0) - getDampingLimLin());
+      if (bounce > btScalar(0.0))
+      {
+        btScalar vel = linVelA.dot(ax1);
+        vel -= linVelB.dot(ax1);
+        vel *= signFact;
+        // only apply bounce if the velocity is incoming, and if the
+        // resulting c[] exceeds what we already have.
+        if (limit == 1)
+        {  // low limit
+          if (vel < 0)
+          {
+            btScalar newc = -bounce * vel;
+            if (newc > info->m_constraintError[srow])
+            {
+              info->m_constraintError[srow] = newc;
+            }
+          }
+        }
+        else
+        { // high limit - all those computations are reversed
+          if (vel > 0)
+          {
+            btScalar newc = -bounce * vel;
+            if (newc < info->m_constraintError[srow])
+            {
+              info->m_constraintError[srow] = newc;
+            }
+          }
+        }
+      }
+      info->m_constraintError[srow] *= getSoftnessLimLin();
+    }
+    // line above is the end of if (limit)
+  }
+  // line above is the end of if linear limit
+
+  // printf("tp: %f\n", this->threadPitch);
+
+  // check angular limits
+  limit_err = btScalar(0.0);
+  limit = 0;
+  if (getSolveAngLimit())
+  {
+    limit_err = getAngDepth();
+    limit = (limit_err > btScalar(0.0)) ? 1 : 2;
+  }
+  // if the slider has joint limits, add in the extra row
+  powered = 0;
+  if (getPoweredAngMotor())
+  {
+    powered = 1;
+  }
+  if (limit || powered)
+  {
+    nrow++;
+    srow = nrow * info->rowskip;
+    info->m_J1angularAxis[srow+0] = ax1[0];
+    info->m_J1angularAxis[srow+1] = ax1[1];
+    info->m_J1angularAxis[srow+2] = ax1[2];
+
+    info->m_J2angularAxis[srow+0] = -ax1[0];
+    info->m_J2angularAxis[srow+1] = -ax1[1];
+    info->m_J2angularAxis[srow+2] = -ax1[2];
+
+    btScalar lostop = getLowerAngLimit();
+    btScalar histop = getUpperAngLimit();
+    // issue #1104:
+    // if (limit && (lostop == histop)) raises warnings, using
+    // a warning-less implementation.
+    if (limit &&
+      math::equal(lostop, histop,
+      static_cast<btScalar>(std::numeric_limits<double>::epsilon())))
+    {  // the joint motor is ineffective
+      powered = 0;
+    }
+    currERP = (m_flags & BT_SLIDER_FLAGS_ERP_LIMANG) ?
+      m_softnessLimAng : info->erp;
+    if (powered)
+    {
+      if (m_flags & BT_SLIDER_FLAGS_CFM_DIRANG)
+      {
+        info->cfm[srow] = m_cfmDirAng;
+      }
+      btScalar mot_fact = getMotorFactor(m_angPos, m_lowerAngLimit,
+        m_upperAngLimit, getTargetAngMotorVelocity(), info->fps * currERP);
+      info->m_constraintError[srow] = mot_fact * getTargetAngMotorVelocity();
+      info->m_lowerLimit[srow] = -getMaxAngMotorForce() * info->fps;
+      info->m_upperLimit[srow] = getMaxAngMotorForce() * info->fps;
+    }
+    if (limit)
+    {
+      k = info->fps * currERP;
+      info->m_constraintError[srow] += k * limit_err;
+      if (m_flags & BT_SLIDER_FLAGS_CFM_LIMANG)
+      {
+        info->cfm[srow] = m_cfmLimAng;
+      }
+      // issue #1104:
+      // if (lostop == histop) raises warnings, using
+      // a warning-less implementation.
+      if (math::equal(lostop, histop,
+          static_cast<btScalar>(std::numeric_limits<double>::epsilon())))
+      {
+        // limited low and high simultaneously
+        info->m_lowerLimit[srow] = -SIMD_INFINITY;
+        info->m_upperLimit[srow] = SIMD_INFINITY;
+      }
+      else if (limit == 1)
+      { // low limit
+        info->m_lowerLimit[srow] = 0;
+        info->m_upperLimit[srow] = SIMD_INFINITY;
+      }
+      else
+      { // high limit
+        info->m_lowerLimit[srow] = -SIMD_INFINITY;
+        info->m_upperLimit[srow] = 0;
+      }
+      // bounce (we'll use slider parameter abs(1.0 - m_dampingLimAng)
+      // for that)
+      btScalar bounce = btFabs(btScalar(1.0) - getDampingLimAng());
+      if (bounce > btScalar(0.0))
+      {
+        btScalar vel = m_rbA.getAngularVelocity().dot(ax1);
+        vel -= m_rbB.getAngularVelocity().dot(ax1);
+        // only apply bounce if the velocity is incoming, and if the
+        // resulting c[] exceeds what we already have.
+        if (limit == 1)
+        {  // low limit
+          if (vel < 0)
+          {
+            btScalar newc = -bounce * vel;
+            if (newc > info->m_constraintError[srow])
+            {
+              info->m_constraintError[srow] = newc;
+            }
+          }
+        }
+        else
+        {  // high limit - all those computations are reversed
+          if (vel > 0)
+          {
+            btScalar newc = -bounce * vel;
+            if (newc < info->m_constraintError[srow])
+            {
+              info->m_constraintError[srow] = newc;
+            }
+          }
+        }
+      }
+      info->m_constraintError[srow] *= getSoftnessLimAng();
+    }
+    // line above is the end of if (limit)
+  }
+  // line above is the end of if angular limit or powered
+}
+
+//////////////////////////////////////////////////
+void btScrewConstraint::_getInfo1NonVirtual(btConstraintInfo1* info)
+{
+  /// this is a modified version of
+  /// void btSliderConstraint::getInfo1(btConstraintInfo1* info)
+  /// with the rotational limits always turned on.
+  /// The rotational limit constraint is modified to be a screw constraint
+  /// in btScrewConstraint::_getInfo2NonVirtual
+  /// which is a copy of btSliderConstraint::getInfo2NonVirtual.
+
+  // info->m_numConstraintRows = 6;
+  // Fixed 2 linear + 2 angular + 1 limit (even if not used)
+  // info->nub = 0;
+
+  if (m_useSolveConstraintObsolete)
+  {
+    info->m_numConstraintRows = 0;
+    info->nub = 0;
+  }
+  else
+  {
+    // Fixed 2 linear + 2 angular
+    info->m_numConstraintRows = 4;
+    info->nub = 2;
+
+    // Add constraint for screw motion, coupling linear and angular motion.
+    info->m_numConstraintRows++;
+    info->nub++;
+
+    // prepare constraint
+    calculateTransforms(
+      m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
+    testLinLimits();
+    if (getSolveLinLimit() || getPoweredLinMotor())
+    {
+      // limit 3rd linear as well
+      info->m_numConstraintRows++;
+      info->nub--;
+    }
+    testAngLimits();
+    if (getSolveAngLimit() || getPoweredAngMotor())
+    {
+      // limit 3rd angular as well
+      info->m_numConstraintRows++;
+      info->nub--;
+    }
+  }
+  // printf("m: %d\n", info->m_numConstraintRows);
+}
diff --git a/gazebo/physics/bullet/BulletScrewJoint.hh b/gazebo/physics/bullet/BulletScrewJoint.hh
index bd56d3c..02a1050 100644
--- a/gazebo/physics/bullet/BulletScrewJoint.hh
+++ b/gazebo/physics/bullet/BulletScrewJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,81 +22,117 @@
 #ifndef _BULLETSCREWJOINT_HH_
 #define _BULLETSCREWJOINT_HH_
 
-#include "physics/bullet/BulletJoint.hh"
-#include "physics/ScrewJoint.hh"
+#include <string>
 
-class btSliderConstraint;
+#include "gazebo/physics/bullet/BulletJoint.hh"
+#include "gazebo/physics/ScrewJoint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
+    class btScrewConstraint;
+
     /// \ingroup gazebo_physics
     /// \addtogroup gazebo_physics_bullet Bullet Physics
     /// \{
 
     /// \brief A screw joint
-    class BulletScrewJoint : public ScrewJoint<BulletJoint>
+    class GAZEBO_VISIBLE BulletScrewJoint : public ScrewJoint<BulletJoint>
     {
       /// \brief Constructor
-      public: BulletScrewJoint(btDynamicsWorld *world, BasePtr _parent);
+      /// \param[in] _world Pointer to the dynamics world.
+      /// \param[in] _parent Pointer to the parent.
+      public: BulletScrewJoint(btDynamicsWorld *_world, BasePtr _parent);
 
       /// \brief Destructor
       public: virtual ~BulletScrewJoint();
 
       /// \brief Load the BulletScrewJoint
-      protected: virtual void Load(sdf::ElementPtr _sdf);
+      /// \param[in] _sdf SDF values.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAnchor(unsigned int _index,
+                  const math::Vector3 &_anchor);
 
-      /// \brief Attach the two bodies with this joint
-      public: void Attach(LinkPtr _one, LinkPtr _two);
+      // Documentation inherited.
+      public: virtual void Init();
 
       /// \brief Set the axis of motion
-      public: void SetAxis(int _index, const math::Vector3 &_axis);
+      /// \param[in] _index Axis index.
+      /// \param[in] _axis Axis value.
+      public: void SetAxis(unsigned int _index, const math::Vector3 &_axis);
 
-      /// \brief Set joint damping, not yet implemented
-      public: virtual void SetDamping(int _index, double _damping);
+      // Documentation inherited
+      public: virtual void SetThreadPitch(unsigned int _index,
+                  double _threadPitch);
 
-      /// \copydoc ScrewJoint::SetThreadPitch
-      public: virtual void SetThreadPitch(int _index, double _threadPitch);
+      // Documentation inherited
+      public: virtual void SetThreadPitch(double _threadPitch);
 
-      /// \copydoc ScrewJoint::GetThreadPitch
+      // Documentation inherited
       public: virtual double GetThreadPitch(unsigned int _index);
 
-      /// \brief Set the high stop of an axis(index).
-      public: virtual void SetHighStop(int _index, const math::Angle &_angle);
+      // Documentation inherited
+      public: virtual double GetThreadPitch();
 
-      /// \brief Set the low stop of an axis(index).
-      public: virtual void SetLowStop(int _index, const math::Angle &_angle);
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                  const math::Angle &_angle);
 
-      /// \brief Get the high stop of an axis(index).
-      public: virtual math::Angle GetHighStop(int _index);
-
-      /// \brief Get the low stop of an axis(index).
-      public: virtual math::Angle GetLowStop(int _index);
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                  const math::Angle &_angle);
 
       /// \brief Get the rate of change
-      public: virtual double GetVelocity(int _index) const;
-
-       /// \brief Set the velocity of an axis(index).
-      public: virtual void SetVelocity(int _index, double _angle);
+      /// \param[in] _index Axis index.
+      public: virtual double GetVelocity(unsigned int _index) const;
 
-      /// \brief Set the screw force
-      public: virtual void SetForce(int _index, double _force);
+      /// \brief Set the velocity of an axis(index).
+      /// \param[in] _index Axis index.
+      /// \param[in] _vel Velocity to apply to the joint axis.
+      public: virtual void SetVelocity(unsigned int _index, double _vel);
 
       /// \brief Set the max allowed force of an axis(index).
-      public: virtual void SetMaxForce(int _index, double _t);
+      /// \param[in] _index Axis index.
+      /// \param[in] _force Maximum force value.
+      public: virtual void SetMaxForce(unsigned int _index, double _force);
 
       /// \brief Get the max allowed force of an axis(index).
-      public: virtual double GetMaxForce(int _index);
+      /// \param[in] _index Axis index.
+      /// \return Maximum force value.
+      public: virtual double GetMaxForce(unsigned int _index);
 
       /// \brief Get the axis of rotation
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      /// \param[in] _index Axis index.
+      /// \return The axis in world coordinate frame.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
-      /// \brief Get the angle of rotation
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      // Documentation inherited.
+      public: virtual double GetParam(const std::string &_key,
+                  unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual double GetAttribute(const std::string &_key,
+                  unsigned int _index) GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      protected: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _force);
 
       /// \brief Pointer to bullet screw constraint
-      private: btSliderConstraint *bulletScrew;
+      private: btScrewConstraint *bulletScrew;
+
+      /// \brief Initial value of joint axis, expressed as unit vector
+      ///        in world frame.
+      private: math::Vector3 initialWorldAxis;
     };
     /// \}
   }
diff --git a/gazebo/physics/bullet/BulletSliderJoint.cc b/gazebo/physics/bullet/BulletSliderJoint.cc
index 56c98e0..47710f3 100644
--- a/gazebo/physics/bullet/BulletSliderJoint.cc
+++ b/gazebo/physics/bullet/BulletSliderJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,11 @@
  * limitations under the License.
  *
 */
-/* Desc: A bullet slider or primastic joint
- * Author: Nate Koenig
- * Date: 13 Oct 2009
- */
-
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Exception.hh"
 
+#include "gazebo/physics/Model.hh"
 #include "gazebo/physics/bullet/bullet_inc.h"
 #include "gazebo/physics/bullet/BulletLink.hh"
 #include "gazebo/physics/bullet/BulletPhysics.hh"
@@ -145,11 +141,15 @@ void BulletSliderJoint::Init()
   // Throw an error if no links are given.
   else
   {
-    gzthrow("joint without links\n");
+    gzerr << "joint without links\n";
+    return;
   }
 
   if (!this->bulletSlider)
-    gzthrow("unable to create bullet slider joint\n");
+  {
+    gzerr << "unable to create bullet slider joint\n";
+    return;
+  }
 
   // btSliderConstraint has 2 degrees-of-freedom (like a piston)
   // so disable the rotation.
@@ -161,8 +161,8 @@ void BulletSliderJoint::Init()
   GZ_ASSERT(this->sdf != NULL, "Joint sdf member is NULL");
   sdf::ElementPtr limitElem;
   limitElem = this->sdf->GetElement("axis")->GetElement("limit");
-  this->bulletSlider->setLowerLinLimit(limitElem->GetValueDouble("lower"));
-  this->bulletSlider->setUpperLinLimit(limitElem->GetValueDouble("upper"));
+  this->bulletSlider->setLowerLinLimit(limitElem->Get<double>("lower"));
+  this->bulletSlider->setUpperLinLimit(limitElem->Get<double>("upper"));
 
   this->constraint = this->bulletSlider;
 
@@ -172,10 +172,13 @@ void BulletSliderJoint::Init()
 
   // Allows access to impulse
   this->constraint->enableFeedback(true);
+
+  // Setup Joint force and torque feedback
+  this->SetupJointFeedback();
 }
 
 //////////////////////////////////////////////////
-double BulletSliderJoint::GetVelocity(int /*_index*/) const
+double BulletSliderJoint::GetVelocity(unsigned int /*_index*/) const
 {
   double result = 0;
   // I'm not sure this will work
@@ -185,21 +188,23 @@ double BulletSliderJoint::GetVelocity(int /*_index*/) const
 }
 
 //////////////////////////////////////////////////
-void BulletSliderJoint::SetVelocity(int /*_index*/, double _angle)
+void BulletSliderJoint::SetVelocity(unsigned int /*_index*/, double _angle)
 {
   if (this->bulletSlider)
     this->bulletSlider->setTargetLinMotorVelocity(_angle);
 }
 
 //////////////////////////////////////////////////
-void BulletSliderJoint::SetAxis(int /*_index*/, const math::Vector3 &_axis)
+void BulletSliderJoint::SetAxis(unsigned int /*_index*/,
+    const math::Vector3 &_axis)
 {
   // Note that _axis is given in a world frame,
   // but bullet uses a body-fixed frame
   if (!this->bulletSlider)
   {
     // this hasn't been initialized yet, store axis in initialWorldAxis
-    this->initialWorldAxis = _axis;
+    math::Quaternion axisFrame = this->GetAxisFrame(0);
+    this->initialWorldAxis = axisFrame.RotateVector(_axis);
   }
   else
   {
@@ -208,36 +213,17 @@ void BulletSliderJoint::SetAxis(int /*_index*/, const math::Vector3 &_axis)
 }
 
 //////////////////////////////////////////////////
-void BulletSliderJoint::SetDamping(int /*index*/, const double _damping)
+void BulletSliderJoint::SetDamping(unsigned int /*index*/,
+    const double _damping)
 {
+  /// \TODO: special case bullet specific linear damping, this needs testing.
   if (this->bulletSlider)
     this->bulletSlider->setDampingDirLin(_damping);
 }
 
 //////////////////////////////////////////////////
-void BulletSliderJoint::SetForce(int _index, double _effort)
+void BulletSliderJoint::SetForceImpl(unsigned int /*_index*/, double _effort)
 {
-  if (_index < 0 || static_cast<unsigned int>(_index) >= this->GetAngleCount())
-  {
-    gzerr << "Calling BulletSliderJoint::SetForce with an index ["
-          << _index << "] out of range\n";
-    return;
-  }
-
-  // truncating SetForce effort if velocity limit reached.
-  if (this->velocityLimit[_index] >= 0)
-  {
-    if (this->GetVelocity(_index) > this->velocityLimit[_index])
-      _effort = _effort > 0 ? 0 : _effort;
-    else if (this->GetVelocity(_index) < -this->velocityLimit[_index])
-      _effort = _effort < 0 ? 0 : _effort;
-  }
-
-  // truncate effort if effortLimit is not negative
-  if (this->effortLimit[_index] >= 0)
-    _effort = math::clamp(_effort, -this->effortLimit[_index],
-       this->effortLimit[_index]);
-
   if (this->bulletSlider && this->constraint)
   {
     // x-axis of constraint frame
@@ -263,25 +249,41 @@ void BulletSliderJoint::SetForce(int _index, double _effort)
 }
 
 //////////////////////////////////////////////////
-void BulletSliderJoint::SetHighStop(int /*_index*/,
+bool BulletSliderJoint::SetHighStop(unsigned int /*_index*/,
                                     const math::Angle &_angle)
 {
   Joint::SetHighStop(0, _angle);
   if (this->bulletSlider)
+  {
     this->bulletSlider->setUpperLinLimit(_angle.Radian());
+    return true;
+  }
+  else
+  {
+    gzerr << "bulletSlider not yet created.\n";
+    return false;
+  }
 }
 
 //////////////////////////////////////////////////
-void BulletSliderJoint::SetLowStop(int /*_index*/,
+bool BulletSliderJoint::SetLowStop(unsigned int /*_index*/,
                                    const math::Angle &_angle)
 {
   Joint::SetLowStop(0, _angle);
   if (this->bulletSlider)
+  {
     this->bulletSlider->setLowerLinLimit(_angle.Radian());
+    return true;
+  }
+  else
+  {
+    gzerr << "bulletSlider not yet created.\n";
+    return false;
+  }
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletSliderJoint::GetHighStop(int /*_index*/)
+math::Angle BulletSliderJoint::GetHighStop(unsigned int /*_index*/)
 {
   math::Angle result;
   if (this->bulletSlider)
@@ -292,7 +294,7 @@ math::Angle BulletSliderJoint::GetHighStop(int /*_index*/)
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletSliderJoint::GetLowStop(int /*_index*/)
+math::Angle BulletSliderJoint::GetLowStop(unsigned int /*_index*/)
 {
   math::Angle result;
   if (this->bulletSlider)
@@ -303,14 +305,14 @@ math::Angle BulletSliderJoint::GetLowStop(int /*_index*/)
 }
 
 //////////////////////////////////////////////////
-void BulletSliderJoint::SetMaxForce(int /*_index*/, double _force)
+void BulletSliderJoint::SetMaxForce(unsigned int /*_index*/, double _force)
 {
   if (this->bulletSlider)
     this->bulletSlider->setMaxLinMotorForce(_force);
 }
 
 //////////////////////////////////////////////////
-double BulletSliderJoint::GetMaxForce(int /*_index*/)
+double BulletSliderJoint::GetMaxForce(unsigned int /*_index*/)
 {
   double result = 0;
   if (this->bulletSlider)
@@ -319,25 +321,24 @@ double BulletSliderJoint::GetMaxForce(int /*_index*/)
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletSliderJoint::GetGlobalAxis(int /*_index*/) const
+math::Vector3 BulletSliderJoint::GetGlobalAxis(unsigned int /*_index*/) const
 {
-  math::Vector3 result;
+  math::Vector3 result = this->initialWorldAxis;
+
   if (this->bulletSlider)
   {
-    // I have not verified the following math, though I based it on internal
-    // bullet code at line 250 of btHingeConstraint.cpp
+    // bullet uses x-axis for slider
     btVector3 vec =
       this->bulletSlider->getRigidBodyA().getCenterOfMassTransform().getBasis()
-      * this->bulletSlider->getFrameOffsetA().getBasis().getColumn(2);
+      * this->bulletSlider->getFrameOffsetA().getBasis().getColumn(0);
     result = BulletTypes::ConvertVector3(vec);
   }
-  else
-    gzwarn << "bulletHinge does not exist, returning fake axis\n";
+
   return result;
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletSliderJoint::GetAngleImpl(int /*_index*/) const
+math::Angle BulletSliderJoint::GetAngleImpl(unsigned int /*_index*/) const
 {
   math::Angle result;
   if (this->bulletSlider)
diff --git a/gazebo/physics/bullet/BulletSliderJoint.hh b/gazebo/physics/bullet/BulletSliderJoint.hh
index 91afd16..acf759c 100644
--- a/gazebo/physics/bullet/BulletSliderJoint.hh
+++ b/gazebo/physics/bullet/BulletSliderJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,18 +14,14 @@
  * limitations under the License.
  *
 */
-/* Desc: A slider or primastic joint
- * Author: Nate Koenig
- * Date: 24 May 2009
- */
-
 #ifndef _BULLETSLIDERJOINT_HH_
 #define _BULLETSLIDERJOINT_HH_
-#include "math/Angle.hh"
-#include "math/Vector3.hh"
-#include "physics/bullet/BulletJoint.hh"
-#include "physics/SliderJoint.hh"
-#include "physics/bullet/BulletPhysics.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/physics/bullet/BulletJoint.hh"
+#include "gazebo/physics/SliderJoint.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/util/system.hh"
 
 class btSliderConstraint;
 
@@ -38,7 +34,7 @@ namespace gazebo
     /// \{
 
     /// \brief A slider joint
-    class BulletSliderJoint : public SliderJoint<BulletJoint>
+    class GAZEBO_VISIBLE BulletSliderJoint : public SliderJoint<BulletJoint>
     {
       /// \brief Constructor
       public: BulletSliderJoint(btDynamicsWorld *world, BasePtr _parent);
@@ -53,43 +49,47 @@ namespace gazebo
       protected: virtual void Init();
 
       // Documentation inherited.
-      public: virtual void SetAxis(int _index, const math::Vector3 &_axis);
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
 
-      /// \brief Set joint damping, not yet implemented
-      public: virtual void SetDamping(int _index, const double _damping);
+      // Documentation inherited.
+      public: virtual void SetDamping(unsigned int _index,
+                  const double _damping);
 
-      /// \brief Set the high stop of an axis(index).
-      public: virtual void SetHighStop(int _index, const math::Angle &_angle);
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                  const math::Angle &_angle);
 
-      /// \brief Set the low stop of an axis(index).
-      public: virtual void SetLowStop(int _index, const math::Angle &_angle);
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                  const math::Angle &_angle);
 
-      /// \brief Get the high stop of an axis(index).
-      public: virtual math::Angle GetHighStop(int _index);
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
 
-      /// \brief Get the low stop of an axis(index).
-      public: virtual math::Angle GetLowStop(int _index);
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
 
-      /// \brief Get the rate of change
-      public: virtual double GetVelocity(int _index) const;
+      // Documentation inherited.
+      public: virtual double GetVelocity(unsigned int _index) const;
 
-       /// \brief Set the velocity of an axis(index).
-      public: virtual void SetVelocity(int _index, double _angle);
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
-      /// \brief Set the slider force
-      public: virtual void SetForce(int _index, double _effort);
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _force);
 
-      /// \brief Set the max allowed force of an axis(index).
-      public: virtual void SetMaxForce(int _index, double _force);
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
 
-      /// \brief Get the max allowed force of an axis(index).
-      public: virtual double GetMaxForce(int _index);
+      // Documentation inherited.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
-      /// \brief Get the axis of rotation
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      // Documentation inherited.
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
-      /// \brief Get the angle of rotation
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
 
       /// \brief Pointer to bullet slider constraint
       private: btSliderConstraint *bulletSlider;
diff --git a/gazebo/physics/bullet/BulletSphereShape.hh b/gazebo/physics/bullet/BulletSphereShape.hh
index 748d07b..4df2d6d 100644
--- a/gazebo/physics/bullet/BulletSphereShape.hh
+++ b/gazebo/physics/bullet/BulletSphereShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,8 +22,10 @@
 #ifndef _BULLETSPHERESHAPE_HH_
 #define _BULLETSPHERESHAPE_HH_
 
-#include "physics/bullet/BulletPhysics.hh"
-#include "physics/SphereShape.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/SphereShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +36,7 @@ namespace gazebo
     /// \{
 
     /// \brief Bullet sphere collision
-    class BulletSphereShape : public SphereShape
+    class GAZEBO_VISIBLE BulletSphereShape : public SphereShape
     {
       /// \brief Constructor
       public: BulletSphereShape(CollisionPtr _parent) : SphereShape(_parent) {}
@@ -48,9 +50,8 @@ namespace gazebo
               {
                 if (_radius < 0)
                 {
-                    gzerr << "Sphere shape does not support negative"
-                          << " radius\n";
-                    return;
+                  gzerr << "Sphere shape does not support negative radius\n";
+                  return;
                 }
                 if (math::equal(_radius, 0.0))
                 {
@@ -69,15 +70,44 @@ namespace gazebo
                 btCollisionShape *shape = bParent->GetCollisionShape();
                 if (!shape)
                 {
+                  this->initialSize = math::Vector3(_radius, _radius, _radius);
                   bParent->SetCollisionShape(new btSphereShape(_radius));
                 }
                 else
                 {
-                  double sphereRadius = this->GetRadius();
-                  double scale = _radius / sphereRadius;
-                  shape->setLocalScaling(btVector3(scale, scale, scale));
+                  btVector3 sphereScale;
+                  sphereScale.setX(_radius / this->initialSize.x);
+                  sphereScale.setY(_radius / this->initialSize.y);
+                  sphereScale.setZ(_radius / this->initialSize.z);
+
+                  shape->setLocalScaling(sphereScale);
+
+                  // clear bullet cache and re-add the collision shape
+                  // otherwise collisions won't work properly after scaling
+                  BulletLinkPtr bLink =
+                      boost::dynamic_pointer_cast<BulletLink>(
+                      bParent->GetLink());
+                  bLink->ClearCollisionCache();
+
+                  // remove and add the shape again
+                  if (bLink->GetBulletLink()->getCollisionShape()->isCompound())
+                  {
+                    btCompoundShape *compoundShape =
+                        dynamic_cast<btCompoundShape *>(
+                        bLink->GetBulletLink()->getCollisionShape());
+
+                    compoundShape->removeChildShape(shape);
+                    math::Pose relativePose =
+                        this->collisionParent->GetRelativePose();
+                    relativePose.pos -= bLink->GetInertial()->GetCoG();
+                    compoundShape->addChildShape(
+                        BulletTypes::ConvertPose(relativePose), shape);
+                  }
                 }
               }
+
+      /// \brief Initial size of sphere.
+      private: math::Vector3 initialSize;
     };
     /// \}
   }
diff --git a/gazebo/physics/bullet/BulletSurfaceParams.cc b/gazebo/physics/bullet/BulletSurfaceParams.cc
new file mode 100644
index 0000000..fd8a5a4
--- /dev/null
+++ b/gazebo/physics/bullet/BulletSurfaceParams.cc
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <float.h>
+#include "gazebo/common/Console.hh"
+#include "gazebo/physics/bullet/BulletSurfaceParams.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+BulletSurfaceParams::BulletSurfaceParams()
+  : SurfaceParams()
+{
+}
+
+//////////////////////////////////////////////////
+BulletSurfaceParams::~BulletSurfaceParams()
+{
+}
+
+//////////////////////////////////////////////////
+void BulletSurfaceParams::Load(sdf::ElementPtr _sdf)
+{
+  // Load parent class
+  SurfaceParams::Load(_sdf);
+
+  if (!_sdf)
+    gzerr << "Surface _sdf is NULL" << std::endl;
+  else
+  {
+    sdf::ElementPtr frictionElem = _sdf->GetElement("friction");
+    if (!frictionElem)
+      gzerr << "Surface friction sdf member is NULL" << std::endl;
+    {
+      // Note this should not be looking in the "ode" block
+      // Update this when sdformat has bullet friction parameters
+      // See sdformat issue #31
+      // https://bitbucket.org/osrf/sdformat/issue/31
+      sdf::ElementPtr frictionOdeElem = frictionElem->GetElement("ode");
+      if (!frictionOdeElem)
+        gzerr << "Surface friction ode sdf member is NULL" << std::endl;
+      else
+      {
+        this->frictionPyramid.SetMuPrimary(
+          frictionOdeElem->Get<double>("mu"));
+        this->frictionPyramid.SetMuSecondary(
+          frictionOdeElem->Get<double>("mu2"));
+      }
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void BulletSurfaceParams::FillMsg(msgs::Surface &_msg)
+{
+  SurfaceParams::FillMsg(_msg);
+
+  _msg.mutable_friction()->set_mu(this->frictionPyramid.GetMuPrimary());
+  _msg.mutable_friction()->set_mu2(this->frictionPyramid.GetMuSecondary());
+}
+
+/////////////////////////////////////////////////
+void BulletSurfaceParams::ProcessMsg(const msgs::Surface &_msg)
+{
+  SurfaceParams::ProcessMsg(_msg);
+
+  if (_msg.has_friction())
+  {
+    if (_msg.friction().has_mu())
+      this->frictionPyramid.SetMuPrimary(_msg.friction().mu());
+    if (_msg.friction().has_mu2())
+      this->frictionPyramid.SetMuSecondary(_msg.friction().mu2());
+  }
+}
diff --git a/gazebo/physics/bullet/BulletSurfaceParams.hh b/gazebo/physics/bullet/BulletSurfaceParams.hh
new file mode 100644
index 0000000..5102486
--- /dev/null
+++ b/gazebo/physics/bullet/BulletSurfaceParams.hh
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _BULLETSURFACEPARAMS_HH_
+#define _BULLETSURFACEPARAMS_HH_
+
+#include <sdf/sdf.hh>
+
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/physics/SurfaceParams.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \addtogroup gazebo_physics
+    /// \{
+
+    /// \brief Bullet surface parameters.
+    class GAZEBO_VISIBLE BulletSurfaceParams : public SurfaceParams
+    {
+      /// \brief Constructor.
+      public: BulletSurfaceParams();
+
+      /// \brief Destructor.
+      public: virtual ~BulletSurfaceParams();
+
+      /// \brief Load the contact params.
+      /// \param[in] _sdf SDF values to load from.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void FillMsg(msgs::Surface &_msg);
+
+      // Documentation inherited.
+      public: virtual void ProcessMsg(const msgs::Surface &_msg);
+
+      /// \brief Friction pyramid parameters (mu1, mu2).
+      // For further documentation, see:
+      // github.com/erwincoumans/bullet3/blob/master/src/BulletDynamics
+      // /ConstraintSolver/btSequentialImpulseConstraintSolver.cpp#L910
+      FrictionPyramid frictionPyramid;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/bullet/BulletTrimeshShape.cc b/gazebo/physics/bullet/BulletTrimeshShape.cc
deleted file mode 100644
index bea2344..0000000
--- a/gazebo/physics/bullet/BulletTrimeshShape.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: Trimesh shape
- * Author: Nate Koenig
- * Date: 21 May 2009
- */
-
-#include "common/Mesh.hh"
-
-#include "physics/bullet/BulletTypes.hh"
-#include "physics/bullet/BulletCollision.hh"
-#include "physics/bullet/BulletPhysics.hh"
-#include "physics/bullet/BulletTrimeshShape.hh"
-
-using namespace gazebo;
-using namespace physics;
-
-//////////////////////////////////////////////////
-BulletTrimeshShape::BulletTrimeshShape(CollisionPtr _parent)
-  : TrimeshShape(_parent)
-{
-}
-
-
-//////////////////////////////////////////////////
-BulletTrimeshShape::~BulletTrimeshShape()
-{
-}
-
-//////////////////////////////////////////////////
-void BulletTrimeshShape::Load(sdf::ElementPtr _sdf)
-{
-  TrimeshShape::Load(_sdf);
-}
-
-//////////////////////////////////////////////////
-void BulletTrimeshShape::Init()
-{
-  TrimeshShape::Init();
-
-  BulletCollisionPtr bParent =
-    boost::static_pointer_cast<BulletCollision>(this->collisionParent);
-
-  float *vertices = NULL;
-  int *indices = NULL;
-
-  btTriangleMesh *mTriMesh = new btTriangleMesh();
-
-  unsigned int numVertices = this->mesh->GetVertexCount();
-  unsigned int numIndices = this->mesh->GetIndexCount();
-
-  // Get all the vertex and index data
-  this->mesh->FillArrays(&vertices, &indices);
-
-  // Scale the vertex data
-  for (unsigned int j = 0;  j < numVertices; j++)
-  {
-    vertices[j*3+0] = vertices[j*3+0] * this->sdf->GetValueVector3("scale").x;
-    vertices[j*3+1] = vertices[j*3+1] * this->sdf->GetValueVector3("scale").y;
-    vertices[j*3+2] = vertices[j*3+2] * this->sdf->GetValueVector3("scale").z;
-  }
-
-  // Create the Bullet trimesh
-  for (unsigned int j = 0; j < numIndices; j += 3)
-  {
-    btVector3 bv0(vertices[indices[j]*3+0],
-                  vertices[indices[j]*3+1],
-                  vertices[indices[j]*3+2]);
-
-    btVector3 bv1(vertices[indices[j+1]*3+0],
-                  vertices[indices[j+1]*3+1],
-                  vertices[indices[j+1]*3+2]);
-
-    btVector3 bv2(vertices[indices[j+2]*3+0],
-                  vertices[indices[j+2]*3+1],
-                  vertices[indices[j+2]*3+2]);
-
-    mTriMesh->addTriangle(bv0, bv1, bv2);
-  }
-
-  btConvexShape* convexShape = new btConvexTriangleMeshShape(mTriMesh, true);
-  convexShape->setMargin(0.001f);
-  bParent->SetCollisionShape(convexShape);
-
-  delete [] vertices;
-  delete [] indices;
-}
diff --git a/gazebo/physics/bullet/BulletTrimeshShape.hh b/gazebo/physics/bullet/BulletTrimeshShape.hh
deleted file mode 100644
index cc8454f..0000000
--- a/gazebo/physics/bullet/BulletTrimeshShape.hh
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: Trimesh collisionetry
- * Author: Nate Koenig
- * Date: 21 May 2009
- */
-
-#ifndef _BULLETTRIMESHSHAPE_HH_
-#define _BULLETTRIMESHSHAPE_HH_
-
-#include "physics/TrimeshShape.hh"
-
-namespace gazebo
-{
-  namespace physics
-  {
-    /// \ingroup gazebo_physics
-    /// \addtogroup gazebo_physics_bullet Bullet Physics
-    /// \{
-
-    /// \brief Triangle mesh collision
-    class BulletTrimeshShape : public TrimeshShape
-    {
-      /// \brief Constructor
-      public: BulletTrimeshShape(CollisionPtr _parent);
-
-      /// \brief Destructor
-      public: virtual ~BulletTrimeshShape();
-
-      /// \brief Load the trimesh
-      public: virtual void Load(sdf::ElementPtr _sdf);
-
-      protected: virtual void Init();
-    };
-
-    /// \}
-  }
-}
-#endif
-
diff --git a/gazebo/physics/bullet/BulletTypes.hh b/gazebo/physics/bullet/BulletTypes.hh
index 7e78a58..2f7a43b 100644
--- a/gazebo/physics/bullet/BulletTypes.hh
+++ b/gazebo/physics/bullet/BulletTypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #include "gazebo/math/Vector3.hh"
 #include "gazebo/math/Vector4.hh"
 #include "gazebo/math/Pose.hh"
+#include "gazebo/util/system.hh"
 
 /// \file
 /// \ingroup gazebo_physics
@@ -34,15 +35,17 @@ namespace gazebo
   {
     class BulletCollision;
     class BulletLink;
+    class BulletMotionState;
     class BulletPhysics;
     class BulletRayShape;
-    class BulletMotionState;
+    class BulletSurfaceParams;
 
-    typedef boost::shared_ptr<BulletPhysics> BulletPhysicsPtr;
     typedef boost::shared_ptr<BulletCollision> BulletCollisionPtr;
     typedef boost::shared_ptr<BulletLink> BulletLinkPtr;
-    typedef boost::shared_ptr<BulletRayShape> BulletRayShapePtr;
     typedef boost::shared_ptr<BulletMotionState> BulletMotionStatePtr;
+    typedef boost::shared_ptr<BulletPhysics> BulletPhysicsPtr;
+    typedef boost::shared_ptr<BulletRayShape> BulletRayShapePtr;
+    typedef boost::shared_ptr<BulletSurfaceParams> BulletSurfaceParamsPtr;
 
     /// \addtogroup gazebo_physics_bullet
     /// \{
@@ -50,7 +53,7 @@ namespace gazebo
     /// \class BulletTypes BulletTypes.hh
     /// \brief A set of functions for converting between the math types used
     ///        by gazebo and bullet.
-    class BulletTypes {
+    class GAZEBO_VISIBLE BulletTypes {
       /// \brief Convert a bullet btVector3 to a gazebo Vector3.
       /// \param[in] _bt Bullet Vector3.
       /// \return Gazebo Vector3.
diff --git a/gazebo/physics/bullet/BulletTypes_TEST.cc b/gazebo/physics/bullet/BulletTypes_TEST.cc
index 3c922c6..cd29898 100644
--- a/gazebo/physics/bullet/BulletTypes_TEST.cc
+++ b/gazebo/physics/bullet/BulletTypes_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,14 +21,17 @@
 #include "gazebo/physics/physics.hh"
 #include "gazebo/physics/bullet/BulletTypes.hh"
 #include "test_config.h"
+#include "test/util.hh"
 
 #define NEAR_TOL 2e-5
 
 using namespace gazebo;
 
+class BulletTypes : public gazebo::testing::AutoLogFixture { };
+
 /////////////////////////////////////////////////
 /// Check Vector3 conversions
-TEST(BulletTypes, ConvertVector3)
+TEST_F(BulletTypes, ConvertVector3)
 {
   {
     math::Vector3 vec, vec2;
@@ -53,7 +56,7 @@ TEST(BulletTypes, ConvertVector3)
 
 /////////////////////////////////////////////////
 /// Check Vector4 conversions
-TEST(BulletTypes, ConvertVector4)
+TEST_F(BulletTypes, ConvertVector4)
 {
   {
     math::Vector4 vec, vec2;
@@ -80,7 +83,7 @@ TEST(BulletTypes, ConvertVector4)
 
 /////////////////////////////////////////////////
 /// Check Pose conversions
-TEST(BulletTypes, ConvertPose)
+TEST_F(BulletTypes, ConvertPose)
 {
   {
     math::Pose pose, pose2;
diff --git a/gazebo/physics/bullet/BulletUniversalJoint.cc b/gazebo/physics/bullet/BulletUniversalJoint.cc
index dfd488c..3120b75 100644
--- a/gazebo/physics/bullet/BulletUniversalJoint.cc
+++ b/gazebo/physics/bullet/BulletUniversalJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,6 @@
  * limitations under the License.
  *
 */
-/* Desc: A universal joint
- * Author: Nate Koenig
- * Date: 24 May 2009
- */
-
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Exception.hh"
@@ -45,189 +40,415 @@ BulletUniversalJoint::~BulletUniversalJoint()
 }
 
 //////////////////////////////////////////////////
-void BulletUniversalJoint::Attach(LinkPtr _one, LinkPtr _two)
+void BulletUniversalJoint::Load(sdf::ElementPtr _sdf)
 {
-  UniversalJoint<BulletJoint>::Attach(_one, _two);
+  UniversalJoint<BulletJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void BulletUniversalJoint::Init()
+{
+  UniversalJoint<BulletJoint>::Init();
 
   BulletLinkPtr bulletChildLink =
     boost::static_pointer_cast<BulletLink>(this->childLink);
   BulletLinkPtr bulletParentLink =
     boost::static_pointer_cast<BulletLink>(this->parentLink);
 
-  if (!bulletChildLink || !bulletParentLink)
-    gzthrow("Requires bullet bodies");
+  math::Vector3 axis1 = this->initialWorldAxis[0];
+  math::Vector3 axis2 = this->initialWorldAxis[1];
 
-  sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
-  math::Vector3 axis1 = axisElem->GetValueVector3("xyz");
-  math::Vector3 axis2 = axisElem->GetValueVector3("xyz");
+  // Check that axis1 and axis2 are orthogonal unit vectors
+  if (math::equal(axis1.GetLength(), 0.0))
+  {
+    gzerr << "Joint [" << this->GetScopedName()
+          << "] axis1 must have non-zero length, aborting"
+          << std::endl;
+    return;
+  }
+  if (math::equal(axis2.GetLength(), 0.0))
+  {
+    gzerr << "Joint [" << this->GetScopedName()
+          << "] axis2 must have non-zero length, aborting"
+          << std::endl;
+    return;
+  }
+  if (math::equal(axis1.Cross(axis2).GetLength(), 0.0))
+  {
+    gzerr << "Joint [" << this->GetScopedName()
+          << "] axis1 and axis2 must not be parallel, aborting"
+          << std::endl;
+    return;
+  }
+
+  // Normalize axis unit vectors
+  axis1.Normalize();
+  axis2.Normalize();
 
-  this->bulletUniversal = new btUniversalConstraint(
-      *bulletParentLink->GetBulletLink(),
-      *bulletChildLink->GetBulletLink(),
-      btVector3(this->anchorPos.x, this->anchorPos.y, this->anchorPos.z),
-      btVector3(axis1.x, axis1.y, axis1.z),
-      btVector3(axis2.x, axis2.y, axis2.z));
+  if (bulletChildLink && bulletParentLink)
+  {
+    this->bulletUniversal = new gzBtUniversalConstraint(
+        *bulletParentLink->GetBulletLink(),
+        *bulletChildLink->GetBulletLink(),
+        btVector3(this->anchorPos.x, this->anchorPos.y, this->anchorPos.z),
+        btVector3(axis1.x, axis1.y, axis1.z),
+        btVector3(axis2.x, axis2.y, axis2.z));
+  }
+  else if (bulletParentLink)
+  {
+    this->bulletUniversal = new gzBtUniversalConstraint(
+        *bulletParentLink->GetBulletLink(),
+        btVector3(this->anchorPos.x, this->anchorPos.y, this->anchorPos.z),
+        btVector3(axis1.x, axis1.y, axis1.z),
+        btVector3(axis2.x, axis2.y, axis2.z));
+  }
+  else if (bulletChildLink)
+  {
+    this->bulletUniversal = new gzBtUniversalConstraint(
+        *bulletChildLink->GetBulletLink(),
+        btVector3(this->anchorPos.x, this->anchorPos.y, this->anchorPos.z),
+        btVector3(axis1.x, axis1.y, axis1.z),
+        btVector3(axis2.x, axis2.y, axis2.z));
+  }
 
   this->constraint = this->bulletUniversal;
 
+  // Set angleOffset based on hinge angle at joint creation.
+  // GetAngleImpl will report angles relative to this offset.
+  this->angleOffset[0] = this->bulletUniversal->getAngle2();
+  this->angleOffset[1] = this->bulletUniversal->getAngle1();
+
+  this->bulletUniversal->setUpperLimit(
+    this->angleOffset[1] + this->GetUpperLimit(1).Radian(),
+    this->angleOffset[0] + this->GetUpperLimit(0).Radian());
+  this->bulletUniversal->setLowerLimit(
+    this->angleOffset[1] + this->GetLowerLimit(1).Radian(),
+    this->angleOffset[0] + this->GetLowerLimit(0).Radian());
+
   // Add the joint to the world
   GZ_ASSERT(this->bulletWorld, "bullet world pointer is NULL");
   this->bulletWorld->addConstraint(this->bulletUniversal, true);
 
   // Allows access to impulse
   this->bulletUniversal->enableFeedback(true);
+
+  // Setup Joint force and torque feedback
+  this->SetupJointFeedback();
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletUniversalJoint::GetAnchor(int /*index*/) const
+math::Vector3 BulletUniversalJoint::GetAnchor(unsigned int /*index*/) const
 {
   return this->anchorPos;
 }
 
 //////////////////////////////////////////////////
-void BulletUniversalJoint::SetAnchor(int /*_index*/,
-                                     const math::Vector3 &/*_anchor*/)
+void BulletUniversalJoint::SetAxis(unsigned int _index,
+                                   const math::Vector3 &_axis)
 {
-  gzerr << "Not implemented\n";
+  // Note that _axis is given in a world frame,
+  // but bullet uses a body-fixed frame
+  if (!this->bulletUniversal)
+  {
+    if (_index < this->GetAngleCount())
+    {
+      // this hasn't been initialized yet, store axis in initialWorldAxis
+      math::Quaternion axisFrame = this->GetAxisFrame(_index);
+      this->initialWorldAxis[_index] = axisFrame.RotateVector(_axis);
+    }
+    else
+      gzerr << "Invalid axis index[" << _index << "]\n";
+  }
+  else
+  {
+    gzerr << "SetAxis for existing joint is not implemented\n";
+  }
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletUniversalJoint::GetAxis(int _index) const
+double BulletUniversalJoint::GetVelocity(unsigned int _index) const
 {
-  btVector3 axis = this->bulletUniversal->getAxis(_index);
-  return math::Vector3(axis.getX(), axis.getY(), axis.getZ());
-}
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "Invalid joint axis index[" << _index << "], returning 0.\n";
+    return 0;
+  }
 
-//////////////////////////////////////////////////
-void BulletUniversalJoint::SetDamping(int /*index*/, double /*_damping*/)
-{
-  gzerr << "Not implemented\n";
+  double result = 0;
+  math::Vector3 globalAxis = this->GetGlobalAxis(_index);
+  if (this->childLink)
+    result += globalAxis.Dot(this->childLink->GetWorldAngularVel());
+  if (this->parentLink)
+    result -= globalAxis.Dot(this->parentLink->GetWorldAngularVel());
+  return result;
 }
 
 //////////////////////////////////////////////////
-void BulletUniversalJoint::SetAxis(int /*_index*/,
-                                   const math::Vector3 &/*_axis*/)
+void BulletUniversalJoint::SetVelocity(unsigned int _index, double _angle)
 {
-  gzerr << "Not implemented\n";
+  math::Vector3 desiredVel;
+  if (this->parentLink)
+    desiredVel = this->parentLink->GetWorldAngularVel();
+  desiredVel += _angle * this->GetGlobalAxis(_index);
+  if (this->childLink)
+    this->childLink->SetAngularVel(desiredVel);
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletUniversalJoint::GetAngle(int _index) const
+void BulletUniversalJoint::SetForceImpl(unsigned int _index, double _effort)
 {
-  if (_index == 0)
-    return this->bulletUniversal->getAngle1();
+  if (this->bulletUniversal)
+  {
+    int col;
+    switch (_index)
+    {
+      case 0:
+        col = 2;
+        break;
+      case 1:
+        col = 1;
+        break;
+      default:
+        gzerr << "Invalid axis index [" << _index << "].\n";
+        return;
+    }
+
+    // z-axis of constraint frame
+    btVector3 hingeAxisLocalA =
+      this->bulletUniversal->getFrameOffsetA().getBasis().getColumn(col);
+
+    btVector3 hingeAxisLocalB =
+      this->bulletUniversal->getFrameOffsetB().getBasis().getColumn(col);
+
+    btVector3 hingeAxisWorldA =
+      this->bulletUniversal->getRigidBodyA().getWorldTransform().getBasis() *
+      hingeAxisLocalA;
+
+    btVector3 hingeAxisWorldB =
+      this->bulletUniversal->getRigidBodyB().getWorldTransform().getBasis() *
+      hingeAxisLocalB;
+
+    btVector3 hingeTorqueA = _effort * hingeAxisWorldA;
+    btVector3 hingeTorqueB = _effort * hingeAxisWorldB;
+
+    this->bulletUniversal->getRigidBodyA().applyTorque(-hingeTorqueA);
+    this->bulletUniversal->getRigidBodyB().applyTorque(hingeTorqueB);
+  }
   else
-    return this->bulletUniversal->getAngle2();
-}
-
-//////////////////////////////////////////////////
-double BulletUniversalJoint::GetVelocity(int /*_index*/) const
-{
-  gzerr << "Not implemented\n";
-  return 0;
+    gzerr << "Trying to set force on a joint that has not been created\n";
 }
 
 //////////////////////////////////////////////////
-void BulletUniversalJoint::SetVelocity(int /*_index*/, double /*_angle*/)
+void BulletUniversalJoint::SetMaxForce(unsigned int _index, double _t)
 {
-  gzerr << "Not implemented\n";
+  if (this->bulletUniversal)
+  {
+    if (_index == 0)
+      this->bulletUniversal->setMaxMotorImpulse1(_t);
+    else if (_index == 1)
+      this->bulletUniversal->setMaxMotorImpulse2(_t);
+    else
+      gzerr << "Invalid axis index[" << _index << "]\n";
+  }
+  else
+    gzerr << "bulletUniversal does not yet exist" << std::endl;
 }
 
 //////////////////////////////////////////////////
-void BulletUniversalJoint::SetForce(int /*_index*/, double /*_torque*/)
+double BulletUniversalJoint::GetMaxForce(unsigned int _index)
 {
-  gzerr << "Not implemented\n";
-}
+  double result = 0;
+  if (this->bulletUniversal)
+  {
+    if (_index == 0)
+      result = this->bulletUniversal->getMaxMotorImpulse1();
+    else if (_index == 1)
+      result = this->bulletUniversal->getMaxMotorImpulse2();
+    else
+      gzerr << "Invalid axis index[" << _index << "]\n";
+  }
+  else
+    gzerr << "bulletUniversal does not yet exist" << std::endl;
 
-//////////////////////////////////////////////////
-void BulletUniversalJoint::SetMaxForce(int /*_index*/, double /*_t*/)
-{
-  gzerr << "Not implemented\n";
+  return result;
 }
 
 //////////////////////////////////////////////////
-double BulletUniversalJoint::GetMaxForce(int /*_index*/)
+bool BulletUniversalJoint::SetHighStop(unsigned int _index,
+    const math::Angle &_angle)
 {
-  gzerr << "Not implemented\n";
-  return 0;
-}
+  // bullet does not handle joint angles near [-pi/2, +pi/2]
+  // so artificially truncate it and let users know
+  double angle = _angle.Radian();
+  if (angle < -M_PI/2.1 || angle > M_PI/2.1)
+  {
+    angle = math::clamp(angle, -M_PI/2.1, M_PI/2.1);
+    gzwarn << "Truncating joint limit [" << _angle.Radian()
+           << "] to [" << angle << "] due to issue #1113.\n";
+  }
 
-//////////////////////////////////////////////////
-void BulletUniversalJoint::SetHighStop(int _index, const math::Angle &_angle)
-{
+  Joint::SetHighStop(_index, angle);
   if (this->bulletUniversal)
   {
-    if (_index == 0)
-      this->bulletUniversal->setUpperLimit(
-        _angle.Radian(), this->GetHighStop(1).Radian());
+    if (_index == 1)
+    {
+      this->bulletUniversal->setLowerLimit(
+        this->angleOffset[0] - angle, -this->GetHighStop(0).Radian());
+      return true;
+    }
+    else if (_index == 0)
+    {
+      this->bulletUniversal->setLowerLimit(
+        -this->GetHighStop(1).Radian(), this->angleOffset[1] - angle);
+      return true;
+    }
     else
-      this->bulletUniversal->setUpperLimit(
-        this->GetHighStop(0).Radian(), _angle.Radian());
+    {
+      gzerr << "Invalid axis index [" << _index << "].\n";
+      return false;
+    }
   }
   else
-    gzthrow("Joint must be created first");
+  {
+    gzerr << "bulletUniversal not yet created.\n";
+    return false;
+  }
 }
 
 //////////////////////////////////////////////////
-void BulletUniversalJoint::SetLowStop(int _index, const math::Angle &_angle)
+bool BulletUniversalJoint::SetLowStop(unsigned int _index,
+    const math::Angle &_angle)
 {
+  // bullet does not handle joint angles near [-pi/2, +pi/2]
+  // so artificially truncate it and let users know
+  double angle = _angle.Radian();
+  if (angle < -M_PI/2.1 || angle > M_PI/2.1)
+  {
+    angle = math::clamp(angle, -M_PI/2.1, M_PI/2.1);
+    gzwarn << "Truncating joint limit [" << _angle.Radian()
+           << "] to [" << angle << "] due to issue #1113.\n";
+  }
+
+  Joint::SetLowStop(_index, angle);
   if (this->bulletUniversal)
   {
-    if (_index == 0)
-      this->bulletUniversal->setLowerLimit(
-        _angle.Radian(), this->GetLowStop(1).Radian());
-    else
+    if (_index == 1)
+    {
+      this->bulletUniversal->setUpperLimit(
+        this->angleOffset[0] - angle, -this->GetLowStop(0).Radian());
+      return true;
+    }
+    else if (_index == 0)
+    {
       this->bulletUniversal->setUpperLimit(
-        this->GetLowStop(0).Radian(), _angle.Radian());
+        -this->GetLowStop(1).Radian(), this->angleOffset[1] - angle);
+      return true;
+    }
+    else
+    {
+      gzerr << "Invalid axis index [" << _index << "].\n";
+      return false;
+    }
   }
   else
-    gzthrow("Joint must be created first");
+  {
+    gzerr << "bulletUniversal not yet created.\n";
+    return false;
+  }
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletUniversalJoint::GetHighStop(int _index)
+math::Angle BulletUniversalJoint::GetHighStop(unsigned int _index)
 {
   math::Angle result;
 
   if (this->bulletUniversal)
   {
-    btRotationalLimitMotor *motor;
-    motor = this->bulletUniversal->getRotationalLimitMotor(_index);
-    result = motor->m_hiLimit;
+    btScalar limit1, limit2;
+    this->bulletUniversal->getLowerLimit(limit1, limit2);
+    if (_index == 1)
+      result.SetFromRadian(-limit1);
+    else if (_index == 0)
+      result.SetFromRadian(-limit2);
+    else
+      gzerr << "Invalid axis index[" << _index << "]" << std::endl;
   }
-  else
-    gzthrow("Joint must be created first");
 
   return result;
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletUniversalJoint::GetLowStop(int _index)
+math::Angle BulletUniversalJoint::GetLowStop(unsigned int _index)
 {
   math::Angle result;
 
   if (this->bulletUniversal)
   {
-    btRotationalLimitMotor *motor;
-    motor = this->bulletUniversal->getRotationalLimitMotor(_index);
-    result = motor->m_loLimit;
+    btScalar limit1, limit2;
+    this->bulletUniversal->getUpperLimit(limit1, limit2);
+    if (_index == 1)
+      result.SetFromRadian(-limit1);
+    else if (_index == 0)
+      result.SetFromRadian(-limit2);
+    else
+      gzerr << "Invalid axis index[" << _index << "]" << std::endl;
   }
-  else
-    gzthrow("Joint must be created first");
 
   return result;
 }
 
 //////////////////////////////////////////////////
-math::Vector3 BulletUniversalJoint::GetGlobalAxis(int /*_index*/) const
+math::Vector3 BulletUniversalJoint::GetGlobalAxis(unsigned int _index) const
 {
-  gzerr << "BulletUniversalJoint::GetGlobalAxis not implemented\n";
-  return math::Vector3();
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "Invalid joint axis index[" << _index << "]\n";
+    return math::Vector3::Zero;
+  }
+
+  math::Vector3 result = this->initialWorldAxis[_index];
+
+  if (this->bulletUniversal)
+  {
+    if (_index == 0)
+    {
+      btVector3 vec = this->bulletUniversal->
+        getRigidBodyA().getCenterOfMassTransform().getBasis() *
+        this->bulletUniversal->getFrameOffsetA().getBasis().getColumn(2);
+
+      result = BulletTypes::ConvertVector3(vec);
+    }
+    else if (_index == 1)
+    {
+      btVector3 vec = this->bulletUniversal->
+        getRigidBodyB().getCenterOfMassTransform().getBasis() *
+        this->bulletUniversal->getFrameOffsetB().getBasis().getColumn(1);
+
+      result = BulletTypes::ConvertVector3(vec);
+    }
+    else
+      gzerr << "Invalid axis index[" << _index << "]\n";
+  }
+
+  return result;
 }
 
 //////////////////////////////////////////////////
-math::Angle BulletUniversalJoint::GetAngleImpl(int /*_index*/) const
+math::Angle BulletUniversalJoint::GetAngleImpl(unsigned int _index) const
 {
-  gzerr << "BulletUniversalJoint::GetAngleImpl not implemented\n";
-  return math::Angle();
+  math::Angle result;
+
+  if (this->bulletUniversal)
+  {
+    if (_index == 0)
+      result = this->angleOffset[0] - this->bulletUniversal->getAngle2();
+    else if (_index == 1)
+      result = this->angleOffset[1] - this->bulletUniversal->getAngle1();
+    else
+      gzerr << "Invalid axis index[" << _index << "]\n";
+  }
+  else
+    gzlog << "bulletUniversal does not yet exist" << std::endl;
+
+  return result;
 }
diff --git a/gazebo/physics/bullet/BulletUniversalJoint.hh b/gazebo/physics/bullet/BulletUniversalJoint.hh
index bd75042..aeff592 100644
--- a/gazebo/physics/bullet/BulletUniversalJoint.hh
+++ b/gazebo/physics/bullet/BulletUniversalJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,17 +14,14 @@
  * limitations under the License.
  *
 */
-/* Desc: A universal joint
- * Author: Nate Koenig
- * Date: 24 May 2009
- */
+#ifndef _GAZEBO_BULLETUNIVERSALJOINT_HH_
+#define _GAZEBO_BULLETUNIVERSALJOINT_HH_
 
-#ifndef _BULLETUNIVERSALJOINT_HH_
-#define _BULLETUNIVERSALJOINT_HH_
-
-#include "physics/UniversalJoint.hh"
-#include "physics/bullet/BulletJoint.hh"
-#include "physics/bullet/BulletPhysics.hh"
+#include "gazebo/physics/bullet/gzBtUniversalConstraint.hh"
+#include "gazebo/physics/UniversalJoint.hh"
+#include "gazebo/physics/bullet/BulletJoint.hh"
+#include "gazebo/physics/bullet/BulletPhysics.hh"
+#include "gazebo/util/system.hh"
 
 class btUniversalConstraint;
 
@@ -37,7 +34,8 @@ namespace gazebo
     /// \{
 
     /// \brief A bullet universal joint class
-    class BulletUniversalJoint : public UniversalJoint<BulletJoint>
+    class GAZEBO_VISIBLE BulletUniversalJoint
+      : public UniversalJoint<BulletJoint>
     {
       /// \brief Constructor
       public: BulletUniversalJoint(btDynamicsWorld *world, BasePtr _parent);
@@ -45,64 +43,64 @@ namespace gazebo
       /// \brief Destuctor
       public: virtual ~BulletUniversalJoint();
 
-      /// \brief Attach the two bodies with this joint
-      public: void Attach(LinkPtr _one, LinkPtr _two);
-
-      /// \brief Get the anchor point
-      public: virtual math::Vector3 GetAnchor(int _index) const;
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
 
-      /// \brief Set the anchor point
-      public: virtual void SetAnchor(int _index, const math::Vector3 &_anchor);
+      // Documentation inherited.
+      public: virtual void Init();
 
-      /// \brief Set the first axis of rotation
-      public: void SetAxis(int _index, const math::Vector3 &_axis);
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
-      /// \brief Set joint damping, not yet implemented
-      public: virtual void SetDamping(int _index, const double _damping);
+      // Documentation inherited.
+      public: void SetAxis(unsigned int _index, const math::Vector3 &_axis);
 
-      /// \brief Get the first axis of rotation
-      public: virtual math::Vector3 GetAxis(int _index) const;
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
-      /// \brief Get the angle of axis 1
-      public: virtual math::Angle GetAngle(int _index) const;
+      // Documentation inherited.
+      public: virtual double GetVelocity(unsigned int _index) const;
 
-      /// \brief Set the velocity of an axis(index).
-      public: virtual void SetVelocity(int _index, double _angle);
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
-      /// \brief Get the angular rate of axis 1
-      public: virtual double GetVelocity(int _index) const;
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
 
-      /// \brief Set the torque of a joint.
-      public: virtual void SetForce(int _index, double _torque);
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                  const math::Angle &_angle);
 
-      /// \brief Set the max allowed force of an axis(index).
-      public: virtual void SetMaxForce(int _index, double _t);
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                  const math::Angle &_angle);
 
-      /// \brief Get the max allowed force of an axis(index).
-      public: virtual double GetMaxForce(int _index);
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
 
-      /// \brief Set the high stop of an axis(index).
-      public: virtual void SetHighStop(int _index, const math::Angle &_angle);
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
 
-      /// \brief Set the low stop of an axis(index).
-      public: virtual void SetLowStop(int _index, const math::Angle &_angle);
+      // Documentation inherited. \sa Joint::GetGlobalAxis
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
-      /// \brief Get the high stop of an axis(index).
-      public: virtual math::Angle GetHighStop(int _index);
+      // Documentation inherited. \sa Joint::GetAngleImpl
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
-      /// \brief Get the low stop of an axis(index).
-      public: virtual math::Angle GetLowStop(int _index);
+      // Documentation inherited. \sa void BulletJoint::SetForceImpl
+      protected: virtual void SetForceImpl(unsigned int _index, double _torque);
 
-      /// \brief Get the axis of rotation
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      /// \brief Pointer to bullet universal constraint
+      private: gzBtUniversalConstraint *bulletUniversal;
 
-      /// \brief Get the angle of rotation
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      /// \brief Offset angle used in GetAngleImpl, so that angles are reported
+      /// relative to the initial configuration.
+      private: double angleOffset[2];
 
-      /// \brief Pointer to bullet universal constraint
-      private: btUniversalConstraint *bulletUniversal;
+      /// \brief Initial value of joint axis, expressed as unit vector
+      /// in world frame.
+      private: math::Vector3 initialWorldAxis[2];
     };
-
     /// \}
   }
 }
diff --git a/gazebo/physics/bullet/CMakeLists.txt b/gazebo/physics/bullet/CMakeLists.txt
index f6694c4..e4d825f 100644
--- a/gazebo/physics/bullet/CMakeLists.txt
+++ b/gazebo/physics/bullet/CMakeLists.txt
@@ -7,26 +7,28 @@ link_directories(${BULLET_LIBRARY_DIRS})
 add_definitions(${BULLET_CFLAGS})
 
 set (sources
-  BulletPhysics.cc
-  BulletLink.cc
+  BulletBallJoint.cc
   BulletCollision.cc
-  BulletMotionState.cc
-  BulletTrimeshShape.cc
-  BulletJoint.cc
+  BulletHeightmapShape.cc
+  BulletHinge2Joint.cc
   BulletHingeJoint.cc
+  BulletJoint.cc
+  BulletLink.cc
+  BulletMeshShape.cc
+  BulletMotionState.cc
+  BulletMultiRayShape.cc
+  BulletPhysics.cc
+  BulletRayShape.cc
+  BulletScrewJoint.cc
   BulletSliderJoint.cc
+  BulletSurfaceParams.cc
   BulletUniversalJoint.cc
-  BulletBallJoint.cc
-  BulletHinge2Joint.cc
-  BulletScrewJoint.cc
-  BulletRayShape.cc
-  BulletMultiRayShape.cc
-  BulletHeightmapShape.cc
+  gzBtUniversalConstraint.cc
 )
 
 set (headers
   bullet_inc.h
-  bullet_math.h
+  bullet_math_inc.h
   BulletBallJoint.hh
   BulletBoxShape.hh
   BulletCollision.hh
@@ -36,6 +38,7 @@ set (headers
   BulletHingeJoint.hh
   BulletJoint.hh
   BulletLink.hh
+  BulletMeshShape.hh
   BulletMotionState.hh
   BulletMultiRayShape.hh
   BulletPhysics.hh
@@ -45,9 +48,10 @@ set (headers
   BulletScrewJoint.hh
   BulletSliderJoint.hh
   BulletSphereShape.hh
-  BulletTrimeshShape.hh
+  BulletSurfaceParams.hh
   BulletTypes.hh
   BulletUniversalJoint.hh
+  gzBtUniversalConstraint.hh
 )
 
 set (gtest_sources
diff --git a/gazebo/physics/bullet/bullet_inc.h b/gazebo/physics/bullet/bullet_inc.h
index a485e9e..a8cec27 100644
--- a/gazebo/physics/bullet/bullet_inc.h
+++ b/gazebo/physics/bullet/bullet_inc.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,5 +23,6 @@
 #include <btBulletDynamicsCommon.h>
 #include <btBulletCollisionCommon.h>
 #include <BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h>
+#include <BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h>
 
 #endif
diff --git a/gazebo/physics/bullet/bullet_math_inc.h b/gazebo/physics/bullet/bullet_math_inc.h
index 686d882..fbe0a30 100644
--- a/gazebo/physics/bullet/bullet_math_inc.h
+++ b/gazebo/physics/bullet/bullet_math_inc.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/physics/bullet/gzBtUniversalConstraint.cc b/gazebo/physics/bullet/gzBtUniversalConstraint.cc
new file mode 100644
index 0000000..25f9a5e
--- /dev/null
+++ b/gazebo/physics/bullet/gzBtUniversalConstraint.cc
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <iostream>
+#include "gazebo/physics/bullet/gzBtUniversalConstraint.hh"
+
+#define UNIV_EPS btScalar(0.01f)
+
+/////////////////////////////////////////////////
+gzBtUniversalConstraint::gzBtUniversalConstraint(btRigidBody &_rbA,
+    btRigidBody &_rbB, const btVector3 &_anchor, const btVector3 &_axis1,
+    const btVector3 &_axis2)
+: btGeneric6DofConstraint(_rbA, _rbB, btTransform::getIdentity(),
+    btTransform::getIdentity(), true),
+  m_anchor(_anchor),
+  m_axis1(_axis1),
+  m_axis2(_axis2)
+{
+  this->maxMotorImpulse[0] = 0;
+  this->maxMotorImpulse[1] = 0;
+
+  // build frame basis
+  // 6DOF constraint uses Euler angles and to define limits
+  // it is assumed that rotational order is :
+  // Z - first, allowed limits are (-PI,PI);
+  // new position of Y - second (allowed limits are
+  // (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number
+  // used to prevent constraint from instability on poles;
+  // new position of X, allowed limits are (-PI,PI);
+  // So to simulate ODE Universal joint we should use parent
+  // axis as Z, child axis as Y and limit all other DOFs
+  // Build the frame in world coordinate system first
+  btVector3 zAxis = m_axis1.normalize();
+  btVector3 yAxis = m_axis2.normalize();
+
+  // we want right coordinate system
+  btVector3 xAxis = yAxis.cross(zAxis);
+  btTransform frameInW;
+  frameInW.setIdentity();
+  frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+      xAxis[1], yAxis[1], zAxis[1],
+      xAxis[2], yAxis[2], zAxis[2]);
+  frameInW.setOrigin(_anchor);
+
+  // now get constraint frame in local coordinate systems
+  m_frameInA = _rbA.getCenterOfMassTransform().inverse() * frameInW;
+  m_frameInB = _rbB.getCenterOfMassTransform().inverse() * frameInW;
+
+  // set limits
+  setLinearLowerLimit(btVector3(0., 0., 0.));
+  setLinearUpperLimit(btVector3(0., 0., 0.));
+  this->setAngularLowerLimit(btVector3(0.f,
+        -SIMD_HALF_PI + UNIV_EPS, -SIMD_PI + UNIV_EPS));
+  this->setAngularUpperLimit(btVector3(0.f,
+        SIMD_HALF_PI - UNIV_EPS,  SIMD_PI - UNIV_EPS));
+}
+
+/////////////////////////////////////////////////
+gzBtUniversalConstraint::gzBtUniversalConstraint(btRigidBody &_rbB,
+    const btVector3 &_anchor, const btVector3 &_axis1, const btVector3 &_axis2)
+: btGeneric6DofConstraint(_rbB, btTransform::getIdentity(), true),
+  m_anchor(_anchor),
+  m_axis1(_axis1),
+  m_axis2(_axis2)
+{
+  this->maxMotorImpulse[0] = 0;
+  this->maxMotorImpulse[1] = 0;
+
+  // build frame basis
+  // 6DOF constraint uses Euler angles and to define limits
+  // it is assumed that rotational order is :
+  // Z - first, allowed limits are (-PI,PI);
+  // new position of Y - second (allowed limits are
+  // (-PI/2 + epsilon, PI/2 - epsilon),
+  // where epsilon is a small positive number
+  // used to prevent constraint from instability on poles;
+  // new position of X, allowed limits are (-PI,PI);
+  // So to simulate ODE Universal joint we should use parent axis as Z,
+  // child axis as Y and limit all other DOFs
+  // Build the frame in world coordinate system first
+  btVector3 zAxis = m_axis1.normalize();
+  btVector3 yAxis = m_axis2.normalize();
+
+  // we want right coordinate system
+  btVector3 xAxis = yAxis.cross(zAxis);
+
+  btTransform frameInW;
+  frameInW.setIdentity();
+  frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+                               xAxis[1], yAxis[1], zAxis[1],
+                               xAxis[2], yAxis[2], zAxis[2]);
+  frameInW.setOrigin(_anchor);
+
+  // now get constraint frame in local coordinate systems
+  m_frameInA = frameInW;
+  m_frameInB = _rbB.getCenterOfMassTransform().inverse() * frameInW;
+
+  // set limits
+  setLinearLowerLimit(btVector3(0., 0., 0.));
+  setLinearUpperLimit(btVector3(0., 0., 0.));
+  setAngularLowerLimit(btVector3(0.f,
+        -SIMD_HALF_PI + UNIV_EPS, -SIMD_PI + UNIV_EPS));
+  setAngularUpperLimit(btVector3(0.f,
+        SIMD_HALF_PI - UNIV_EPS,  SIMD_PI - UNIV_EPS));
+}
+
+/////////////////////////////////////////////////
+void gzBtUniversalConstraint::setAxis(const btVector3 &_axis1,
+    const btVector3 &_axis2)
+{
+  m_axis1 = _axis1;
+  m_axis2 = _axis2;
+
+  btVector3 zAxis = _axis1.normalized();
+  btVector3 yAxis = _axis2.normalized();
+
+  // we want right coordinate system
+  btVector3 xAxis = yAxis.cross(zAxis);
+
+  btTransform frameInW;
+  frameInW.setIdentity();
+  frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+                               xAxis[1], yAxis[1], zAxis[1],
+                               xAxis[2], yAxis[2], zAxis[2]);
+  frameInW.setOrigin(m_anchor);
+
+  // now get constraint frame in local coordinate systems
+  m_frameInA = m_rbA.getCenterOfMassTransform().inverse() * frameInW;
+  m_frameInB = m_rbB.getCenterOfMassTransform().inverse() * frameInW;
+
+  this->calculateTransforms();
+}
+
+/////////////////////////////////////////////////
+const btVector3 &gzBtUniversalConstraint::getAnchor()
+{
+  return m_calculatedTransformA.getOrigin();
+}
+
+/////////////////////////////////////////////////
+const btVector3 &gzBtUniversalConstraint::getAnchor2()
+{
+  return m_calculatedTransformB.getOrigin();
+}
+
+/////////////////////////////////////////////////
+const btVector3 &gzBtUniversalConstraint::getAxis1()
+{
+  return m_axis1;
+}
+
+/////////////////////////////////////////////////
+const btVector3 &gzBtUniversalConstraint::getAxis2()
+{
+  return m_axis2;
+}
+
+/////////////////////////////////////////////////
+btScalar gzBtUniversalConstraint::getAngle1()
+{
+  this->calculateTransforms();
+  return this->getAngle(1);
+}
+
+/////////////////////////////////////////////////
+btScalar gzBtUniversalConstraint::getAngle2()
+{
+  this->calculateTransforms();
+  return this->getAngle(2);
+}
+
+/////////////////////////////////////////////////
+void gzBtUniversalConstraint::getUpperLimit(
+    btScalar &_ang1max, btScalar &_ang2max)
+{
+  btVector3 angles;
+  this->getAngularUpperLimit(angles);
+  _ang1max = angles.getY();
+  _ang2max = angles.getZ();
+}
+
+/////////////////////////////////////////////////
+void gzBtUniversalConstraint::getLowerLimit(
+    btScalar &_ang1min, btScalar &_ang2min)
+{
+  btVector3 angles;
+  this->getAngularLowerLimit(angles);
+  _ang1min = angles.getY();
+  _ang2min = angles.getZ();
+}
+
+/////////////////////////////////////////////////
+void gzBtUniversalConstraint::setUpperLimit(
+    btScalar _ang1max, btScalar _ang2max)
+{
+  this->setAngularUpperLimit(btVector3(0.f, _ang1max, _ang2max));
+}
+
+/////////////////////////////////////////////////
+void gzBtUniversalConstraint::setLowerLimit(
+    btScalar _ang1min, btScalar _ang2min)
+{
+  this->setAngularLowerLimit(btVector3(0.f, _ang1min, _ang2min));
+}
+
+/////////////////////////////////////////////////
+btScalar gzBtUniversalConstraint::getMaxMotorImpulse1() const
+{
+  return this->maxMotorImpulse[0];
+}
+
+/////////////////////////////////////////////////
+btScalar gzBtUniversalConstraint::getMaxMotorImpulse2() const
+{
+  return this->maxMotorImpulse[1];
+}
+
+/////////////////////////////////////////////////
+void gzBtUniversalConstraint::setMaxMotorImpulse1(btScalar _i)
+{
+  this->maxMotorImpulse[0] = _i;
+}
+
+/////////////////////////////////////////////////
+void gzBtUniversalConstraint::setMaxMotorImpulse2(btScalar _i)
+{
+  this->maxMotorImpulse[1] = _i;
+}
diff --git a/gazebo/physics/bullet/gzBtUniversalConstraint.hh b/gazebo/physics/bullet/gzBtUniversalConstraint.hh
new file mode 100644
index 0000000..50bbd55
--- /dev/null
+++ b/gazebo/physics/bullet/gzBtUniversalConstraint.hh
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#ifndef _GAZEBO_BULLET_UNIVERSAL_CONSTRAINT_
+#define _GAZEBO_BULLET_UNIVERSAL_CONSTRAINT_
+
+#include "gazebo/physics/bullet/bullet_inc.h"
+
+ATTRIBUTE_ALIGNED16(class) gzBtUniversalConstraint
+: public btGeneric6DofConstraint
+{
+  public: BT_DECLARE_ALIGNED_ALLOCATOR();
+
+  /// \brief Constructor
+  /// \param[in] _rbA Rigid body A, also known as the parent link.
+  /// \param[in] _rbB Rigid body B, also known as the child link.
+  /// \param[in] _anchor The point in world space that constrains the two
+  /// rigid bodies.
+  /// \param[in] _axis1 First axis of rotation in world frame.
+  /// \param[in] _axis2 Second axis of rotation in world frame.
+  public: gzBtUniversalConstraint(
+              btRigidBody &_rbA,
+              btRigidBody &_rbB,
+              const btVector3 &_anchor,
+              const btVector3 &_axis1,
+              const btVector3 &_axis2);
+
+  /// \brief Constructor
+  /// \param[in] _rbB Rigid body B, also known as the child link.
+  /// \param[in] _anchor The point in world space that constrains the child
+  /// link to the world.
+  /// \param[in] _axis1 First axis of rotation in world frame.
+  /// \param[in] _axis2 Second axis of rotation in world frame.
+  public: gzBtUniversalConstraint(
+              btRigidBody &_rbA,
+              const btVector3 &_anchor,
+              const btVector3 &_axis1,
+              const btVector3 &_axis2);
+
+  /// \brief Get the anchor point in link A reference frame.
+  /// \return Anchor point in link A's reference frame.
+  public: const btVector3 &getAnchor();
+
+  /// \brief Get the anchor point in link B reference frame.
+  /// \return Anchor point in link B's reference frame.
+  public: const btVector3 &getAnchor2();
+
+  /// \brief Get the first axis of rotation.
+  /// \return The first axis of rotation as a vector
+  public: const btVector3 &getAxis1();
+
+  /// \brief Get the second axis of rotation.
+  /// \return The second axis of rotation as a vector
+  public: const btVector3 &getAxis2();
+
+  /// \brief Get the value of angle 1 in radians.
+  /// \return Angle value of the first axis in radians.
+  public: btScalar getAngle1();
+
+  /// \brief Get the value of angle 2 in radians.
+  /// \return Angle value of the second axis in radians.
+  public: btScalar getAngle2();
+
+  /// \brief Get upper limits.
+  /// \param[out] _ang1max Maximum value for angle 1
+  /// \param[out] _ang2max Maximum value for angle 2
+  public: void getUpperLimit(btScalar &_ang1max, btScalar &_ang2max);
+
+  /// \brief Get lower limits.
+  /// \param[out] _ang1min Minimum value for angle 1
+  /// \param[out] _ang2min Minimum value for angle 2
+  public: void getLowerLimit(btScalar &_ang1min, btScalar &_ang2min);
+
+  /// \brief Set upper limits.
+  /// \param[in] _ang1max Maximum value for angle 1
+  /// \param[in] _ang2max Maximum value for angle 2
+  public: void setUpperLimit(btScalar _ang1max, btScalar _ang2max);
+
+  /// \brief Set lower limits.
+  /// \param[in] _ang1min Minimum value for angle 1
+  /// \param[in] _ang2min Minimum value for angle 2
+  public: void setLowerLimit(btScalar _ang1min, btScalar _ang2min);
+
+  /// \brief Set the axis of rotation.
+  /// \param[in] _axis1 First axis of rotation.
+  /// \param[in] _axis2 Second axis of rotation.
+  public: void setAxis(const btVector3 &_axis1, const btVector3 &_axis2);
+
+  /// \brief Get the maximum allowed motor impluse for the first axis of
+  /// rotation.
+  /// \return Maximum motor impulse for axis 1.
+  public: btScalar getMaxMotorImpulse1() const;
+
+  /// \brief Get the maximum allowed motor impluse for the second axis of
+  /// rotation.
+  /// \return Maximum motor impulse for axis 2.
+  public: btScalar getMaxMotorImpulse2() const;
+
+  /// \brief Set the maximum allowed motor impluse for the first axis of
+  /// rotation.
+  /// \param[in] _i Maximum motor impulse for axis 1.
+  public: void setMaxMotorImpulse1(btScalar _i);
+
+  /// \brief Set the maximum allowed motor impluse for the second axis of
+  /// rotation.
+  /// \param[in] _i Maximum motor impulse for axis 2.
+  public: void setMaxMotorImpulse2(btScalar _i);
+
+  /// \brief Anchor point in world coordinate frame.
+  protected: btVector3 m_anchor;
+
+  /// \brief First axis of rotation.
+  protected: btVector3 m_axis1;
+
+  /// \brief Second axis of rotation.
+  protected: btVector3 m_axis2;
+
+  /// \brief Maximum motor impulses.
+  private: btScalar maxMotorImpulse[2];
+};
+
+#endif
diff --git a/gazebo/physics/dart/CMakeLists.txt b/gazebo/physics/dart/CMakeLists.txt
new file mode 100644
index 0000000..801b763
--- /dev/null
+++ b/gazebo/physics/dart/CMakeLists.txt
@@ -0,0 +1,64 @@
+include (${gazebo_cmake_dir}/GazeboUtils.cmake)
+
+include_directories(${DARTCore_INCLUDE_DIRS})
+
+link_directories(${DARTCore_LIBRARY_DIRS})
+
+set (sources
+    DARTBallJoint.cc
+    DARTCollision.cc
+    DARTLink.cc
+    DARTHeightmapShape.cc
+    DARTHingeJoint.cc
+    DARTHinge2Joint.cc
+    DARTJoint.cc
+    DARTMeshShape.cc
+    DARTModel.cc
+    DARTMultiRayShape.cc
+    DARTPhysics.cc
+    DARTRayShape.cc
+    DARTScrewJoint.cc
+    DARTSliderJoint.cc
+    DARTUniversalJoint.cc
+)
+
+SET (headers
+    DARTBallJoint.hh
+    DARTBoxShape.hh
+    DARTCollision.hh
+    DARTCylinderShape.hh
+    DARTHeightmapShape.hh
+    DARTHingeJoint.hh
+    DARTHinge2Joint.hh
+    DARTJoint.hh
+    DARTLink.hh
+    DARTMeshShape.hh
+    DARTModel.hh
+    DARTMultiRayShape.hh
+    DARTPhysics.hh
+    DARTPlaneShape.hh
+    DARTRayShape.hh
+    DARTScrewJoint.hh
+    DARTSliderJoint.hh
+    DARTSphereShape.hh
+    DARTTypes.hh
+    DARTUniversalJoint.hh
+    dart_inc.h
+)
+
+set (gtest_sources
+  #DARTPhysics_TEST.cc
+)
+gz_build_tests(${gtest_sources})
+
+gz_add_library(gazebo_physics_dart ${headers} ${sources})
+
+target_link_libraries(gazebo_physics_dart ${DARTCore_LIBRARIES})
+
+gz_install_library(gazebo_physics_dart)
+
+# unit tests
+#set (gtest_sources
+#  DARTJoint_TEST.cc
+#)
+#gz_build_tests(${gtest_sources})
diff --git a/gazebo/physics/dart/DARTBallJoint.cc b/gazebo/physics/dart/DARTBallJoint.cc
new file mode 100644
index 0000000..ae173d7
--- /dev/null
+++ b/gazebo/physics/dart/DARTBallJoint.cc
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/dart/DARTBallJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTBallJoint::DARTBallJoint(BasePtr _parent)
+  : BallJoint<DARTJoint>(_parent),
+    dtBallJoint(new dart::dynamics::BallJoint())
+{
+  this->dtJoint = this->dtBallJoint;
+}
+
+//////////////////////////////////////////////////
+DARTBallJoint::~DARTBallJoint()
+{
+  delete dtBallJoint;
+}
+
+//////////////////////////////////////////////////
+void DARTBallJoint::Load(sdf::ElementPtr _sdf)
+{
+  BallJoint<DARTJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void DARTBallJoint::Init()
+{
+  BallJoint<DARTJoint>::Init();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTBallJoint::GetAnchor(unsigned int /*_index*/) const
+{
+  Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                        this->dtJoint->getTransformFromChildBodyNode();
+  Eigen::Vector3d worldOrigin = T.translation();
+
+  return DARTTypes::ConvVec3(worldOrigin);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTBallJoint::GetGlobalAxis(unsigned int /*_index*/) const
+{
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+void DARTBallJoint::SetVelocity(unsigned int /*_index*/, double /*_angle*/)
+{
+}
+
+//////////////////////////////////////////////////
+double DARTBallJoint::GetVelocity(unsigned int /*_index*/) const
+{
+  gzerr << "DARTBallJoint::GetVelocity not implemented" << std::endl;
+  return 0;
+}
+
+//////////////////////////////////////////////////
+double DARTBallJoint::GetMaxForce(unsigned int /*_index*/)
+{
+  return 0;
+}
+
+//////////////////////////////////////////////////
+void DARTBallJoint::SetMaxForce(unsigned int /*_index*/, double /*_t*/)
+{
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTBallJoint::GetAngleImpl(unsigned int /*_index*/) const
+{
+  gzerr << "DARTBallJoint::GetAngleImpl not implemented" << std::endl;
+  return math::Angle(0);
+}
+
+//////////////////////////////////////////////////
+void DARTBallJoint::SetForceImpl(unsigned int /*_index*/, double /*_torque*/)
+{
+  gzerr << "DARTBallJoint::SetForceImpl not implemented";
+}
+
+//////////////////////////////////////////////////
+void DARTBallJoint::SetAxis(unsigned int /*_index*/,
+                            const math::Vector3 &/*_axis*/)
+{
+  gzerr << "DARTBallJoint::SetAxis not implemented" << std::endl;
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTBallJoint::GetHighStop(unsigned int /*_index*/)
+{
+  gzerr << "DARTBallJoint::GetHighStop not implemented" << std::endl;
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTBallJoint::GetLowStop(unsigned int /*_index*/)
+{
+  gzerr << "DARTBallJoint::GetLowStop not implemented" << std::endl;
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+bool DARTBallJoint::SetHighStop(unsigned int /*_index*/,
+                                const math::Angle &/*_angle*/)
+{
+  gzerr << "DARTBallJoint::SetHighStop not implemented" << std::endl;
+  return false;
+}
+
+//////////////////////////////////////////////////
+bool DARTBallJoint::SetLowStop(unsigned int /*_index*/,
+                               const math::Angle &/*_angle*/)
+{
+  gzerr << "DARTBallJoint::SetLowStop not implemented" << std::endl;
+  return false;
+}
diff --git a/gazebo/physics/dart/DARTBallJoint.hh b/gazebo/physics/dart/DARTBallJoint.hh
new file mode 100644
index 0000000..bc9eafa
--- /dev/null
+++ b/gazebo/physics/dart/DARTBallJoint.hh
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTBALLJOINT_HH_
+#define _GAZEBO_DARTBALLJOINT_HH_
+
+#include "gazebo/physics/BallJoint.hh"
+#include "gazebo/physics/dart/DARTJoint.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief An DARTBallJoint
+    class GAZEBO_VISIBLE DARTBallJoint : public BallJoint<DARTJoint>
+    {
+      /// \brief Constructor
+      /// \param[in] _parent Parent of the Joint
+      public: DARTBallJoint(BasePtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~DARTBallJoint();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
+
+      // Documentation inherited
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
+
+      // Documentation inherited
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited.
+      protected: void SetForceImpl(unsigned int _index, double _torque);
+
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                                   const math::Vector3 &_axis);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                                       const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                                      const math::Angle &_angle);
+
+      /// \brief
+      protected: dart::dynamics::BallJoint *dtBallJoint;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTBoxShape.hh b/gazebo/physics/dart/DARTBoxShape.hh
new file mode 100644
index 0000000..b54ecd0
--- /dev/null
+++ b/gazebo/physics/dart/DARTBoxShape.hh
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_DARTBOXSHAPE_HH_
+#define _GAZEBO_DARTBOXSHAPE_HH_
+
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/math/Vector3.hh"
+
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/physics/dart/DARTTypes.hh"
+#include "gazebo/physics/dart/DARTCollision.hh"
+
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/BoxShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief DART Box shape
+    class GAZEBO_VISIBLE DARTBoxShape : public BoxShape
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent Collision.
+      public: explicit DARTBoxShape(DARTCollisionPtr _parent)
+              : BoxShape(_parent) {}
+
+      /// \brief Destructor.
+      public: virtual ~DARTBoxShape() {}
+
+      // Documentation inherited.
+      public: virtual void SetSize(const math::Vector3 &_size)
+      {
+        if (_size.x < 0 || _size.y < 0 || _size.z < 0)
+        {
+          gzerr << "Box shape does not support negative size\n";
+          return;
+        }
+        math::Vector3 size = _size;
+        if (math::equal(size.x, 0.0))
+        {
+          // Warn user, but still create shape with very small value
+          // otherwise later resize operations using setLocalScaling
+          // will not be possible
+          gzwarn << "Setting box shape's x to zero is not supported in DART, "
+                 << "using 1e-4.\n";
+          size.x = 1e-4;
+        }
+
+        if (math::equal(size.y, 0.0))
+        {
+          gzwarn << "Setting box shape's y to zero is not supported in DART, "
+                 << "using 1e-4.\n";
+          size.y = 1e-4;
+        }
+
+        if (math::equal(size.z, 0.0))
+        {
+          gzwarn << "Setting box shape's z to zero is not supported in DART "
+                 << "using 1e-4.\n";
+          size.z = 1e-4;
+        }
+
+        BoxShape::SetSize(size);
+
+        DARTCollisionPtr dartCollisionParent =
+            boost::dynamic_pointer_cast<DARTCollision>(this->collisionParent);
+
+        if (dartCollisionParent->GetDARTCollisionShape() == NULL)
+        {
+          dart::dynamics::BodyNode *dtBodyNode =
+              dartCollisionParent->GetDARTBodyNode();
+          dart::dynamics::BoxShape *dtBoxShape =
+              new dart::dynamics::BoxShape(DARTTypes::ConvVec3(size));
+          dtBodyNode->addCollisionShape(dtBoxShape);
+          dartCollisionParent->SetDARTCollisionShape(dtBoxShape);
+        }
+        else
+        {
+          dart::dynamics::BoxShape *dtBoxShape =
+              dynamic_cast<dart::dynamics::BoxShape*>(
+                dartCollisionParent->GetDARTCollisionShape());
+          dtBoxShape->setDim(DARTTypes::ConvVec3(size));
+        }
+      }
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTCollision.cc b/gazebo/physics/dart/DARTCollision.cc
new file mode 100644
index 0000000..61c9c46
--- /dev/null
+++ b/gazebo/physics/dart/DARTCollision.cc
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <sstream>
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/math/Box.hh"
+
+#include "gazebo/physics/SurfaceParams.hh"
+
+#include "gazebo/physics/dart/dart_inc.h"
+#include "gazebo/physics/dart/DARTLink.hh"
+#include "gazebo/physics/dart/DARTCollision.hh"
+#include "gazebo/physics/dart/DARTPlaneShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTCollision::DARTCollision(LinkPtr _link)
+  : Collision(_link),
+    dtBodyNode(NULL),
+    dtCollisionShape(NULL)
+{
+  this->SetName("DART_Collision");
+  this->surface.reset(new SurfaceParams());
+}
+
+//////////////////////////////////////////////////
+DARTCollision::~DARTCollision()
+{
+}
+
+//////////////////////////////////////////////////
+void DARTCollision::Load(sdf::ElementPtr _sdf)
+{
+  Collision::Load(_sdf);
+
+  if (this->IsStatic())
+  {
+    this->SetCategoryBits(GZ_FIXED_COLLIDE);
+    this->SetCollideBits(~GZ_FIXED_COLLIDE);
+  }
+
+  this->dtBodyNode
+      = boost::static_pointer_cast<DARTLink>(this->link)->GetDARTBodyNode();
+}
+
+//////////////////////////////////////////////////
+void DARTCollision::Init()
+{
+  Collision::Init();
+
+  // Offset
+  if (this->dtCollisionShape)
+  {
+    // TODO: Don't change offset of shape until dart supports plane shape.
+    boost::shared_ptr<DARTPlaneShape> planeShape =
+        boost::dynamic_pointer_cast<DARTPlaneShape>(this->shape);
+
+    if (!planeShape)
+    {
+      math::Pose relativePose = this->GetRelativePose();
+      this->dtCollisionShape->setOffset(DARTTypes::ConvVec3(relativePose.pos));
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTCollision::Fini()
+{
+  Collision::Fini();
+}
+
+//////////////////////////////////////////////////
+void DARTCollision::OnPoseChange()
+{
+  // Nothing to do in dart.
+}
+
+//////////////////////////////////////////////////
+void DARTCollision::SetCategoryBits(unsigned int _bits)
+{
+  this->categoryBits = _bits;
+}
+
+//////////////////////////////////////////////////
+void DARTCollision::SetCollideBits(unsigned int _bits)
+{
+  this->collideBits = _bits;
+}
+
+//////////////////////////////////////////////////
+unsigned int DARTCollision::GetCategoryBits() const
+{
+  return this->categoryBits;
+}
+
+//////////////////////////////////////////////////
+unsigned int DARTCollision::GetCollideBits() const
+{
+  return this->collideBits;
+}
+
+//////////////////////////////////////////////////
+gazebo::math::Box DARTCollision::GetBoundingBox() const
+{
+  math::Box result;
+
+  gzerr << "DART does not provide bounding box info.\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+dart::dynamics::BodyNode *DARTCollision::GetDARTBodyNode() const
+{
+  return dtBodyNode;
+}
+
+//////////////////////////////////////////////////
+void DARTCollision::SetDARTCollisionShape(dart::dynamics::Shape *_shape,
+                                          bool _placeable)
+{
+  Collision::SetCollision(_placeable);
+  this->dtCollisionShape = _shape;
+}
+
+//////////////////////////////////////////////////
+dart::dynamics::Shape *DARTCollision::GetDARTCollisionShape() const
+{
+  return dtCollisionShape;
+}
diff --git a/gazebo/physics/dart/DARTCollision.hh b/gazebo/physics/dart/DARTCollision.hh
new file mode 100644
index 0000000..610d47e
--- /dev/null
+++ b/gazebo/physics/dart/DARTCollision.hh
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTCOLLISION_HH_
+#define _GAZEBO_DARTCOLLISION_HH_
+
+#include "gazebo/common/CommonTypes.hh"
+
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/Collision.hh"
+
+#include "gazebo/physics/dart/dart_inc.h"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief Base class for all DART collisions.
+    class GAZEBO_VISIBLE DARTCollision : public Collision
+    {
+      /// \brief Constructor.
+      /// \param[in] _link Parent Link
+      public: explicit DARTCollision(LinkPtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~DARTCollision();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited.
+      public: virtual void Fini();
+
+      // Documentation inherited.
+      public: virtual void OnPoseChange();
+
+      // Documentation inherited.
+      public: virtual void SetCategoryBits(unsigned int _bits);
+
+      // Documentation inherited.
+      public: virtual void SetCollideBits(unsigned int _bits);
+
+      /// \brief Get the category bits, used during collision detection
+      /// \return The bits
+      public: virtual unsigned int GetCategoryBits() const;
+
+      /// \brief Get the collide bits, used during collision detection
+      /// \return The bits
+      public: virtual unsigned int GetCollideBits() const;
+
+      // Documentation inherited.
+      public: virtual math::Box GetBoundingBox() const;
+
+      /// \brief Get DART body node.
+      /// \return Pointer to the dart BodyNode.
+      public: dart::dynamics::BodyNode *GetDARTBodyNode() const;
+
+      /// \brief Set DART collision shape.
+      /// \param[in] _shape DART Collision shape
+      /// \param[in] _placeable True to make the object movable.
+      public: void SetDARTCollisionShape(dart::dynamics::Shape *_shape,
+                                         bool _placeable = true);
+
+      /// \brief Get DART collision shape.
+      public: dart::dynamics::Shape* GetDARTCollisionShape() const;
+
+      /// \brief DART body node associated with this collision.
+      private: dart::dynamics::BodyNode *dtBodyNode;
+
+      /// \brief DART collision shape associated with this collision.
+      private: dart::dynamics::Shape *dtCollisionShape;
+
+      /// \brief Category bits for collision detection
+      private: unsigned int categoryBits;
+
+      /// \brief Collide bits for collision detection
+      private: unsigned int collideBits;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTCylinderShape.hh b/gazebo/physics/dart/DARTCylinderShape.hh
new file mode 100644
index 0000000..7aaeb11
--- /dev/null
+++ b/gazebo/physics/dart/DARTCylinderShape.hh
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTCYLINDERSHAPE_HH_
+#define _GAZEBO_DARTCYLINDERSHAPE_HH_
+
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/physics/CylinderShape.hh"
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief DART cylinder shape
+    class GAZEBO_VISIBLE DARTCylinderShape : public CylinderShape
+    {
+      /// \brief Constructor
+      /// \param[in] _parent Collision parent.
+      public: explicit DARTCylinderShape(CollisionPtr _parent)
+              : CylinderShape(_parent) {}
+
+      /// \brief Destructor.
+      public: virtual ~DARTCylinderShape() {}
+
+      // Documentation inerited.
+      public: void SetSize(double _radius, double _length)
+      {
+        if (_radius < 0)
+        {
+          gzerr << "Cylinder shape does not support negative radius\n";
+          return;
+        }
+
+        if (_length < 0)
+        {
+          gzerr << "Cylinder shape does not support negative length\n";
+          return;
+        }
+
+        if (math::equal(_radius, 0.0))
+        {
+          // Warn user, but still create shape with very small value
+          // otherwise later resize operations using setLocalScaling
+          // will not be possible
+          gzwarn << "Setting cylinder shape's radius to zero not supported "
+                 << "in DART, using 1e-4.\n";
+          _radius = 1e-4;
+        }
+
+        if (math::equal(_length, 0.0))
+        {
+          gzwarn << "Setting cylinder shape's length to zero not supported "
+                 << "in DART, using 1e-4.\n";
+          _length = 1e-4;
+        }
+
+        CylinderShape::SetSize(_radius, _length);
+
+        DARTCollisionPtr dartCollisionParent =
+            boost::dynamic_pointer_cast<DARTCollision>(this->collisionParent);
+
+        if (dartCollisionParent->GetDARTCollisionShape() == NULL)
+        {
+          dart::dynamics::BodyNode *dtBodyNode =
+              dartCollisionParent->GetDARTBodyNode();
+          dart::dynamics::CylinderShape *dtCylinderShape =
+              new dart::dynamics::CylinderShape(_radius, _length);
+          dtBodyNode->addCollisionShape(dtCylinderShape);
+          dartCollisionParent->SetDARTCollisionShape(dtCylinderShape);
+        }
+        else
+        {
+          dart::dynamics::CylinderShape *dtCylinderShape =
+              dynamic_cast<dart::dynamics::CylinderShape*>(
+                dartCollisionParent->GetDARTCollisionShape());
+          dtCylinderShape->setRadius(_radius);
+          dtCylinderShape->setHeight(_length);
+        }
+      }
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTHeightmapShape.cc b/gazebo/physics/dart/DARTHeightmapShape.cc
new file mode 100644
index 0000000..6edd1d1
--- /dev/null
+++ b/gazebo/physics/dart/DARTHeightmapShape.cc
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/physics/dart/DARTCollision.hh"
+#include "gazebo/physics/dart/DARTHeightmapShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTHeightmapShape::DARTHeightmapShape(CollisionPtr _parent)
+    : HeightmapShape(_parent)
+{
+}
+
+//////////////////////////////////////////////////
+DARTHeightmapShape::~DARTHeightmapShape()
+{
+}
+
+//////////////////////////////////////////////////
+void DARTHeightmapShape::Init()
+{
+  gzwarn << "Not implemented!\n";
+}
diff --git a/gazebo/physics/dart/DARTHeightmapShape.hh b/gazebo/physics/dart/DARTHeightmapShape.hh
new file mode 100644
index 0000000..59e78ac
--- /dev/null
+++ b/gazebo/physics/dart/DARTHeightmapShape.hh
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTHEIGHTMAPSHAPE_HH_
+#define _GAZEBO_DARTHEIGHTMAPSHAPE_HH_
+
+#include <vector>
+
+#include "gazebo/physics/HeightmapShape.hh"
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief DART Height map collision.
+    class GAZEBO_VISIBLE DARTHeightmapShape : public HeightmapShape
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Collision parent.
+      public: DARTHeightmapShape(CollisionPtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~DARTHeightmapShape();
+
+      // Documentation inerited.
+      public: virtual void Init();
+
+      /// \brief Called by ODE to get the height at a vertex.
+      /// \param[in] _data Pointer to the heightmap data.
+      /// \param[in] _x X location.
+      /// \param[in] _y Y location.
+      // private: static dReal GetHeightCallback(void *_data, int _x, int _y);
+
+      /// \brief The heightmap data.
+      // private: dHeightfieldDataID odeData;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTHinge2Joint.cc b/gazebo/physics/dart/DARTHinge2Joint.cc
new file mode 100644
index 0000000..bfcce6b
--- /dev/null
+++ b/gazebo/physics/dart/DARTHinge2Joint.cc
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/dart/DARTHinge2Joint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTHinge2Joint::DARTHinge2Joint(BasePtr _parent)
+    : Hinge2Joint<DARTJoint>(_parent),
+      dtUniveralJoint(new dart::dynamics::UniversalJoint())
+{
+  this->dtJoint = dtUniveralJoint;
+}
+
+//////////////////////////////////////////////////
+DARTHinge2Joint::~DARTHinge2Joint()
+{
+  delete dtUniveralJoint;
+}
+
+//////////////////////////////////////////////////
+void DARTHinge2Joint::Load(sdf::ElementPtr _sdf)
+{
+  Hinge2Joint<DARTJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void DARTHinge2Joint::Init()
+{
+  Hinge2Joint<DARTJoint>::Init();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTHinge2Joint::GetAnchor(unsigned int /*_index*/) const
+{
+  Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                        this->dtJoint->getTransformFromChildBodyNode();
+  Eigen::Vector3d worldOrigin = T.translation();
+
+  return DARTTypes::ConvVec3(worldOrigin);
+}
+
+//////////////////////////////////////////////////
+void DARTHinge2Joint::SetAxis(unsigned int _index, const math::Vector3 &_axis)
+{
+  Eigen::Vector3d dartAxis = DARTTypes::ConvVec3(_axis);
+
+  if (_index == 0)
+  {
+    // TODO: Issue #494
+    // See: https://bitbucket.org/osrf/gazebo/issue/494/joint-axis-reference
+    Eigen::Isometry3d dartTransfJointLeftToParentLink
+        = this->dtJoint->getTransformFromParentBodyNode().inverse();
+    dartAxis = dartTransfJointLeftToParentLink.linear() * dartAxis;
+
+    this->dtUniveralJoint->setAxis1(dartAxis);
+  }
+  else if (_index == 1)
+  {
+    // TODO: Issue #494
+    // See: https://bitbucket.org/osrf/gazebo/issue/494/joint-axis-reference
+    Eigen::Isometry3d dartTransfJointLeftToParentLink
+        = this->dtJoint->getTransformFromParentBodyNode().inverse();
+    dartAxis = dartTransfJointLeftToParentLink.linear() * dartAxis;
+
+    this->dtUniveralJoint->setAxis2(dartAxis);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTHinge2Joint::GetGlobalAxis(unsigned int _index) const
+{
+  Eigen::Vector3d globalAxis = Eigen::Vector3d::UnitX();
+
+  if (_index == 0)
+  {
+    Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                          this->dtJoint->getLocalTransform().inverse() *
+                          this->dtJoint->getTransformFromParentBodyNode();
+    Eigen::Vector3d axis = this->dtUniveralJoint->getAxis1();
+
+    globalAxis = T.linear() * axis;
+  }
+  else if (_index == 1)
+  {
+    Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                          this->dtJoint->getTransformFromChildBodyNode();
+    Eigen::Vector3d axis = this->dtUniveralJoint->getAxis2();
+
+    globalAxis = T.linear() * axis;
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  // TODO: Issue #494
+  // See: https://bitbucket.org/osrf/gazebo/issue/494/
+  // joint-axis-reference-frame-doesnt-match
+  return DARTTypes::ConvVec3(globalAxis);
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTHinge2Joint::GetAngleImpl(unsigned int _index) const
+{
+  math::Angle result;
+
+  if (_index == 0)
+  {
+    double radianAngle = this->dtJoint->getGenCoord(0)->get_q();
+    result.SetFromRadian(radianAngle);
+  }
+  else if (_index == 1)
+  {
+    double radianAngle = this->dtJoint->getGenCoord(1)->get_q();
+    result.SetFromRadian(radianAngle);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+double DARTHinge2Joint::GetVelocity(unsigned int _index) const
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_dq();
+  else if (_index == 1)
+    result = this->dtJoint->getGenCoord(1)->get_dq();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTHinge2Joint::SetVelocity(unsigned int _index, double _vel)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_dq(_vel);
+  else if (_index == 1)
+    this->dtJoint->getGenCoord(1)->set_dq(_vel);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+double DARTHinge2Joint::GetMaxForce(unsigned int _index)
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_tauMax();
+  else if (_index == 1)
+    result = this->dtJoint->getGenCoord(1)->get_tauMax();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTHinge2Joint::SetMaxForce(unsigned int _index, double _force)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tauMax(_force);
+  else if (_index == 1)
+    this->dtJoint->getGenCoord(1)->set_tauMax(_force);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+void DARTHinge2Joint::SetForceImpl(unsigned int _index, double _effort)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tau(_effort);
+  else if (_index == 1)
+    this->dtJoint->getGenCoord(1)->set_tau(_effort);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
diff --git a/gazebo/physics/dart/DARTHinge2Joint.hh b/gazebo/physics/dart/DARTHinge2Joint.hh
new file mode 100644
index 0000000..0b088b6
--- /dev/null
+++ b/gazebo/physics/dart/DARTHinge2Joint.hh
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTHINGE2JOINT_HH_
+#define _GAZEBO_DARTHINGE2JOINT_HH_
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+
+#include "gazebo/physics/Hinge2Joint.hh"
+#include "gazebo/physics/dart/DARTJoint.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief A two axis hinge joint
+    class GAZEBO_VISIBLE DARTHinge2Joint : public Hinge2Joint<DARTJoint>
+    {
+      /// \brief Constructor
+      /// \param[in] _parent Parent of the Joint
+      public: DARTHinge2Joint(BasePtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~DARTHinge2Joint();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetVelocity(unsigned int _index, double _vel);
+
+      // Documentation inherited
+      public: virtual void SetMaxForce(unsigned int _index, double _force);
+
+      // Documentation inherited
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
+
+      /// \brief Universal joint of DART
+      protected: dart::dynamics::UniversalJoint *dtUniveralJoint;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTHingeJoint.cc b/gazebo/physics/dart/DARTHingeJoint.cc
new file mode 100644
index 0000000..2c17279
--- /dev/null
+++ b/gazebo/physics/dart/DARTHingeJoint.cc
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/bind.hpp>
+
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/dart/DARTHingeJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTHingeJoint::DARTHingeJoint(BasePtr _parent)
+  : HingeJoint<DARTJoint>(_parent),
+    dtRevoluteJoint(new dart::dynamics::RevoluteJoint())
+{
+  this->dtJoint = this->dtRevoluteJoint;
+}
+
+//////////////////////////////////////////////////
+DARTHingeJoint::~DARTHingeJoint()
+{
+  delete dtRevoluteJoint;
+}
+
+//////////////////////////////////////////////////
+void DARTHingeJoint::Load(sdf::ElementPtr _sdf)
+{
+  HingeJoint<DARTJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void DARTHingeJoint::Init()
+{
+  HingeJoint<DARTJoint>::Init();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTHingeJoint::GetAnchor(unsigned int /*index*/) const
+{
+  Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                        this->dtJoint->getTransformFromChildBodyNode();
+  Eigen::Vector3d worldOrigin = T.translation();
+
+  return DARTTypes::ConvVec3(worldOrigin);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTHingeJoint::GetGlobalAxis(unsigned int _index) const
+{
+  Eigen::Vector3d globalAxis = Eigen::Vector3d::UnitX();
+
+  if (_index == 0)
+  {
+    Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                          this->dtJoint->getTransformFromChildBodyNode();
+    Eigen::Vector3d axis = this->dtRevoluteJoint->getAxis();
+    globalAxis = T.linear() * axis;
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  // TODO: Issue #494
+  // See: https://bitbucket.org/osrf/gazebo/issue/494/
+  // joint-axis-reference-frame-doesnt-match
+  return DARTTypes::ConvVec3(globalAxis);
+}
+
+//////////////////////////////////////////////////
+void DARTHingeJoint::SetAxis(unsigned int _index, const math::Vector3& _axis)
+{
+  if (_index == 0)
+  {
+    //--------------------------------------------------------------------------
+    // TODO: Issue #494
+    // See: https://bitbucket.org/osrf/gazebo/issue/494
+    // joint-axis-reference-frame-doesnt-match
+    Eigen::Vector3d dartAxis = DARTTypes::ConvVec3(_axis);
+    Eigen::Isometry3d dartTransfJointLeftToParentLink
+        = this->dtJoint->getTransformFromParentBodyNode().inverse();
+    dartAxis = dartTransfJointLeftToParentLink.linear() * dartAxis;
+    //--------------------------------------------------------------------------
+
+    this->dtRevoluteJoint->setAxis(dartAxis);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTHingeJoint::GetAngleImpl(unsigned int _index) const
+{
+  math::Angle result;
+
+  if (_index == 0)
+  {
+    double radianAngle = this->dtJoint->getGenCoord(0)->get_q();
+    result.SetFromRadian(radianAngle);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTHingeJoint::SetVelocity(unsigned int _index, double _vel)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_dq(_vel);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+double DARTHingeJoint::GetVelocity(unsigned int _index) const
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_dq();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTHingeJoint::SetMaxForce(unsigned int _index, double _force)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tauMax(_force);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+double DARTHingeJoint::GetMaxForce(unsigned int _index)
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_tauMax();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTHingeJoint::SetForceImpl(unsigned int _index, double _effort)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tau(_effort);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
diff --git a/gazebo/physics/dart/DARTHingeJoint.hh b/gazebo/physics/dart/DARTHingeJoint.hh
new file mode 100644
index 0000000..7d2fb54
--- /dev/null
+++ b/gazebo/physics/dart/DARTHingeJoint.hh
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTHINGEJOINT_HH_
+#define _GAZEBO_DARTHINGEJOINT_HH_
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+
+#include "gazebo/physics/HingeJoint.hh"
+#include "gazebo/physics/dart/DARTJoint.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief A single axis hinge joint.
+    class GAZEBO_VISIBLE DARTHingeJoint : public HingeJoint<DARTJoint>
+    {
+      /// \brief Constructor
+      /// \param[in] _parent Parent of the Joint
+      public: DARTHingeJoint(BasePtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~DARTHingeJoint();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetVelocity(unsigned int _index, double _vel);
+
+      // Documentation inherited
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetMaxForce(unsigned int _index, double _force);
+
+      // Documentation inherited
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
+
+      /// \brief Revolute joint of DART
+      protected: dart::dynamics::RevoluteJoint *dtRevoluteJoint;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTJoint.cc b/gazebo/physics/dart/DARTJoint.cc
new file mode 100644
index 0000000..b88770b
--- /dev/null
+++ b/gazebo/physics/dart/DARTJoint.cc
@@ -0,0 +1,660 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/dart/DARTLink.hh"
+#include "gazebo/physics/dart/DARTModel.hh"
+#include "gazebo/physics/dart/DARTJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTJoint::DARTJoint(BasePtr _parent)
+  : Joint(_parent),
+    dtJoint(NULL),
+    dtChildBodyNode(NULL)
+{
+  this->dartPhysicsEngine = boost::dynamic_pointer_cast<DARTPhysics>(
+                              this->GetWorld()->GetPhysicsEngine());
+
+  this->forceApplied[0] = 0.0;
+  this->forceApplied[1] = 0.0;
+}
+
+//////////////////////////////////////////////////
+DARTJoint::~DARTJoint()
+{
+  this->Detach();
+
+  if (dtJoint)
+    delete dtJoint;
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::Load(sdf::ElementPtr _sdf)
+{
+  // In Joint::Load(sdf::ElementPtr), this joint stored the information of the
+  // parent link and child link.
+  Joint::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::Init()
+{
+  Joint::Init();
+
+  // Name
+  std::string jointName = this->GetName();
+  this->dtJoint->setName(jointName.c_str());
+
+  // Parent and child link information
+  DARTLinkPtr dartParentLink =
+    boost::static_pointer_cast<DARTLink>(this->parentLink);
+  DARTLinkPtr dartChildLink =
+    boost::static_pointer_cast<DARTLink>(this->childLink);
+
+  Eigen::Isometry3d dtTransformParentLinkToJoint =
+      Eigen::Isometry3d::Identity();
+  Eigen::Isometry3d dtTransformChildLinkToJoint = Eigen::Isometry3d::Identity();
+  Eigen::Isometry3d dtTransformParentBodyNode = Eigen::Isometry3d::Identity();
+  Eigen::Isometry3d dtTransformChildBodyNode = Eigen::Isometry3d::Identity();
+
+  // if (theChildLink != NULL)
+  GZ_ASSERT(dartChildLink.get() != NULL, "dartChildLink pointer is NULL");
+  {
+    dtTransformChildBodyNode =
+        DARTTypes::ConvPose(dartChildLink->GetWorldPose());
+    this->dtChildBodyNode = dartChildLink->GetDARTBodyNode();
+    this->dtChildBodyNode->setParentJoint(this->dtJoint);
+  }
+  dtTransformChildLinkToJoint = DARTTypes::ConvPose(this->anchorPose);
+
+  if (dartParentLink.get() != NULL)
+  {
+    dtTransformParentBodyNode =
+        DARTTypes::ConvPose(dartParentLink->GetWorldPose());
+    dart::dynamics::BodyNode* dtParentBodyNode =
+      dartParentLink->GetDARTBodyNode();
+    dtParentBodyNode->addChildBodyNode(this->dtChildBodyNode);
+  }
+
+  dtTransformParentLinkToJoint = dtTransformParentBodyNode.inverse() *
+                                 dtTransformChildBodyNode *
+                                 dtTransformChildLinkToJoint;
+
+  // We assume that the joint angles are all zero.
+  this->dtJoint->setTransformFromParentBodyNode(dtTransformParentLinkToJoint);
+  this->dtJoint->setTransformFromChildBodyNode(dtTransformChildLinkToJoint);
+
+  //----------------------------------------------------------------------------
+  // TODO: Currently, dampingCoefficient seems not to be initialized when
+  //       this joint is loaded. Therefore, we need below code...
+  //----------------------------------------------------------------------------
+  if (this->sdf->HasElement("axis"))
+  {
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
+    if (axisElem->HasElement("dynamics"))
+    {
+      sdf::ElementPtr dynamicsElem = axisElem->GetElement("dynamics");
+
+      if (dynamicsElem->HasElement("damping"))
+      {
+        this->SetDamping(0, dynamicsElem->Get<double>("damping"));
+      }
+      if (dynamicsElem->HasElement("friction"))
+      {
+        sdf::ElementPtr frictionElem = dynamicsElem->GetElement("friction");
+        gzlog << "joint friction not implemented in DART.\n";
+      }
+    }
+  }
+
+  if (this->sdf->HasElement("axis2"))
+  {
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
+    if (axisElem->HasElement("dynamics"))
+    {
+      sdf::ElementPtr dynamicsElem = axisElem->GetElement("dynamics");
+
+      if (dynamicsElem->HasElement("damping"))
+      {
+        this->SetDamping(1, dynamicsElem->Get<double>("damping"));
+      }
+      if (dynamicsElem->HasElement("friction"))
+      {
+        sdf::ElementPtr frictionElem = dynamicsElem->GetElement("friction");
+        gzlog << "joint friction not implemented in DART.\n";
+      }
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::Reset()
+{
+  Joint::Reset();
+}
+
+//////////////////////////////////////////////////
+LinkPtr DARTJoint::GetJointLink(unsigned int _index) const
+{
+  LinkPtr result;
+
+  if (_index == 0)
+  {
+    DARTLinkPtr dartLink1
+        = boost::static_pointer_cast<DARTLink>(this->parentLink);
+
+    if (dartLink1 != NULL)
+      return this->parentLink;
+  }
+
+  if (_index == 1)
+  {
+    DARTLinkPtr dartLink2
+        = boost::static_pointer_cast<DARTLink>(this->childLink);
+
+    if (dartLink2 != NULL)
+      return this->childLink;
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+bool DARTJoint::AreConnected(LinkPtr _one, LinkPtr _two) const
+{
+  if (_one.get() == NULL && _two.get() == NULL)
+    return false;
+
+  if ((this->childLink.get() == _one.get() &&
+       this->parentLink.get() == _two.get()) ||
+      (this->childLink.get() == _two.get() &&
+       this->parentLink.get() == _one.get()))
+    return true;
+
+  return false;
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::Attach(LinkPtr _parent, LinkPtr _child)
+{
+  Joint::Attach(_parent, _child);
+
+  if (this->AreConnected(_parent, _child))
+    return;
+
+  gzerr << "DART does not support joint attaching.\n";
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::Detach()
+{
+  if (!this->AreConnected(this->parentLink, this->childLink))
+    return;
+
+  this->childLink.reset();
+  this->parentLink.reset();
+
+  gzerr << "DART does not support joint dettaching.\n";
+
+  Joint::Detach();
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::SetAnchor(unsigned int /*_index*/,
+    const gazebo::math::Vector3 &/*_anchor*/)
+{
+  // nothing to do here for DART.
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::SetDamping(unsigned int _index, double _damping)
+{
+  this->dampingCoefficient = _damping;
+
+  if (this->GetAngleCount() > 2)
+  {
+     gzerr << "Incompatible joint type, GetAngleCount() = "
+           << this->GetAngleCount() << " > 2\n";
+     return;
+  }
+
+  // \TODO: implement on a per axis basis (requires additional sdf parameters)
+
+  /// \TODO:  this check might not be needed?  attaching an object to a static
+  /// body should not affect damping application.
+  bool parentStatic = this->GetParent() ? this->GetParent()->IsStatic() : false;
+  bool childStatic = this->GetChild() ? this->GetChild()->IsStatic() : false;
+
+  if (!parentStatic && !childStatic)
+  {
+    this->dtJoint->setDampingCoefficient(_index, _damping);
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::SetStiffness(unsigned int _index, const double _stiffness)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->SetStiffnessDamping(_index, _stiffness,
+      this->dissipationCoefficient[_index]);
+  }
+  else
+  {
+     gzerr << "DARTJoint::SetStiffness: index[" << _index
+           << "] is out of bounds (GetAngleCount() = "
+           << this->GetAngleCount() << ").\n";
+     return;
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::SetStiffnessDamping(unsigned int _index,
+  double _stiffness, double _damping, double _reference)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->stiffnessCoefficient[_index] = _stiffness;
+    this->dissipationCoefficient[_index] = _damping;
+    this->springReferencePosition[_index] = _reference;
+
+    /// \TODO: set joint stiffness coefficient
+
+    /// setting joint damping
+    bool parentStatic = this->GetParent() ?
+      this->GetParent()->IsStatic() : false;
+    bool childStatic = this->GetChild() ? this->GetChild()->IsStatic() : false;
+
+    if (!parentStatic && !childStatic)
+    {
+      this->dtJoint->setDampingCoefficient(_index, _damping);
+    }
+
+    /// \TODO: add spring force element
+    gzdbg << "Joint [" << this->GetName()
+           << "] stiffness not implement in DART\n";
+  }
+  else
+    gzerr << "SetStiffnessDamping _index " << _index << " is too large.\n";
+}
+
+//////////////////////////////////////////////////
+bool DARTJoint::SetHighStop(unsigned int _index, const math::Angle &_angle)
+{
+  switch (_index)
+  {
+    case 0:
+    case 1:
+    case 2:
+      this->dtJoint->getGenCoord(_index)->set_qMax(_angle.Radian());
+      return true;
+    default:
+      gzerr << "Invalid index[" << _index << "]\n";
+      return false;
+  };
+}
+
+//////////////////////////////////////////////////
+bool DARTJoint::SetLowStop(unsigned int _index, const math::Angle &_angle)
+{
+  switch (_index)
+  {
+  case 0:
+  case 1:
+  case 2:
+    this->dtJoint->getGenCoord(_index)->set_qMin(_angle.Radian());
+    return true;
+  default:
+    gzerr << "Invalid index[" << _index << "]\n";
+    return false;
+  };
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTJoint::GetHighStop(unsigned int _index)
+{
+  switch (_index)
+  {
+  case 0:
+  case 1:
+  case 2:
+    return this->dtJoint->getGenCoord(_index)->get_qMax();
+  default:
+    gzerr << "Invalid index[" << _index << "]\n";
+  };
+
+  return 0;
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTJoint::GetLowStop(unsigned int _index)
+{
+  switch (_index)
+  {
+  case 0:
+  case 1:
+  case 2:
+    return this->dtJoint->getGenCoord(_index)->get_qMin();
+  default:
+    gzerr << "Invalid index[" << _index << "]\n";
+  };
+
+  return 0;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTJoint::GetLinkForce(unsigned int _index) const
+{
+  math::Vector3 result;
+
+  if (!this->dtJoint)
+  {
+    gzerr << "DART joint is invalid\n";
+    return result;
+  }
+
+  //---------------------------------------------
+  // Parent and child link information
+  //---------------------------------------------
+  DARTLinkPtr theChildLink =
+    boost::static_pointer_cast<DARTLink>(this->childLink);
+
+  Eigen::Vector6d F1 = Eigen::Vector6d::Zero();
+  Eigen::Vector6d F2 = Eigen::Vector6d::Zero();
+  Eigen::Isometry3d T12 = dtJoint->getLocalTransform();
+
+  // JointWrench.body1Force contains the
+  // force applied by the parent Link on the Joint specified in
+  // the parent Link frame.
+  if (theChildLink != NULL)
+  {
+    dart::dynamics::BodyNode *dartChildBody = theChildLink->GetDARTBodyNode();
+    GZ_ASSERT(dartChildBody, "dartChildBody pointer is NULL");
+    F2 = -dart::math::dAdT(dtJoint->getTransformFromChildBodyNode(),
+                           dartChildBody->getBodyForce());
+  }
+
+  // JointWrench.body2Force contains
+  // the force applied by the child Link on the Joint specified
+  // in the child Link frame.
+  F1 = -dart::math::dAdInvR(T12, F2);
+
+  if (_index == 0)
+    result.Set(F1(3), F1(4), F1(5));
+  else
+    result.Set(F2(3), F2(4), F2(5));
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTJoint::GetLinkTorque(unsigned int _index) const
+{
+  math::Vector3 result;
+
+  if (!this->dtJoint)
+  {
+    gzerr << "DART joint is invalid\n";
+    return result;
+  }
+
+  // Parent and child link information
+  DARTLinkPtr theChildLink =
+    boost::static_pointer_cast<DARTLink>(this->childLink);
+
+  Eigen::Vector6d F1 = Eigen::Vector6d::Zero();
+  Eigen::Vector6d F2 = Eigen::Vector6d::Zero();
+  Eigen::Isometry3d T12 = dtJoint->getLocalTransform();
+
+  // JointWrench.body1Force contains the
+  // force applied by the parent Link on the Joint specified in
+  // the parent Link frame.
+  if (theChildLink != NULL)
+  {
+    dart::dynamics::BodyNode *dartChildBody = theChildLink->GetDARTBodyNode();
+    GZ_ASSERT(dartChildBody, "dartChildBody pointer is NULL");
+    F2 = -dart::math::dAdT(
+      dtJoint->getTransformFromChildBodyNode(), dartChildBody->getBodyForce());
+  }
+
+  // JointWrench.body2Force contains
+  // the force applied by the child Link on the Joint specified
+  // in the child Link frame.
+  F1 = -dart::math::dAdInvR(T12, F2);
+
+  if (_index == 0)
+    result.Set(F1(0), F1(1), F1(2));
+  else
+    result.Set(F2(0), F2(1), F2(2));
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTJoint::SetAttribute(const std::string &_key, unsigned int _index,
+                             const boost::any &_value)
+{
+  this->SetParam(_key, _index, _value);
+}
+
+//////////////////////////////////////////////////
+bool DARTJoint::SetParam(const std::string &_key, unsigned int _index,
+                             const boost::any &_value)
+{
+  if (_key == "hi_stop")
+  {
+    try
+    {
+      this->SetHighStop(_index, boost::any_cast<double>(_value));
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+  }
+  else if (_key == "lo_stop")
+  {
+    try
+    {
+      this->SetLowStop(_index, boost::any_cast<double>(_value));
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+  }
+  else
+  {
+    gzerr << "Unable to handle joint attribute[" << _key << "]\n";
+    return false;
+  }
+  return true;
+}
+
+//////////////////////////////////////////////////
+double DARTJoint::GetAttribute(const std::string& _key,
+                               unsigned int _index)
+{
+  return this->GetParam(_key, _index);
+}
+
+//////////////////////////////////////////////////
+double DARTJoint::GetParam(const std::string& _key,
+                               unsigned int _index)
+{
+  if (_key == "hi_stop")
+  {
+    try
+    {
+      return this->GetHighStop(_index).Radian();
+    }
+    catch(common::Exception &e)
+    {
+      gzerr << "GetParam error:" << e.GetErrorStr() << "\n";
+      return 0;
+    }
+  }
+  else if (_key == "lo_stop")
+  {
+    try
+    {
+      return this->GetLowStop(_index).Radian();
+    }
+    catch(common::Exception &e)
+    {
+      gzerr << "GetParam error:" << e.GetErrorStr() << "\n";
+      return 0;
+    }
+  }
+  else
+  {
+    gzerr << "Unable to get joint attribute[" << _key << "]\n";
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+JointWrench DARTJoint::GetForceTorque(unsigned int /*_index*/)
+{
+  JointWrench jointWrench;
+
+  //---------------------------------------------
+  // Parent and child link information
+  //---------------------------------------------
+  DARTLinkPtr theChildLink =
+    boost::static_pointer_cast<DARTLink>(this->childLink);
+
+  Eigen::Vector6d F1 = Eigen::Vector6d::Zero();
+  Eigen::Vector6d F2 = Eigen::Vector6d::Zero();
+  Eigen::Isometry3d T12 = dtJoint->getLocalTransform();
+
+  // JointWrench.body1Force contains the
+  // force applied by the parent Link on the Joint specified in
+  // the parent Link frame.
+  if (theChildLink != NULL)
+  {
+    dart::dynamics::BodyNode *dartChildBody = theChildLink->GetDARTBodyNode();
+    GZ_ASSERT(dartChildBody, "dartChildBody pointer is NULL");
+    F2 = -dart::math::dAdT(dtJoint->getTransformFromChildBodyNode(),
+                           dartChildBody->getBodyForce());
+  }
+
+  // JointWrench.body2Force contains
+  // the force applied by the child Link on the Joint specified
+  // in the child Link frame.
+  F1 = -dart::math::dAdInvR(T12, F2);
+
+  // kind of backwards here, body1 (parent) corresponds go f2, t2
+  // and body2 (child) corresponds go f1, t1
+  jointWrench.body1Force.Set(F1(3), F1(4), F1(5));
+  jointWrench.body1Torque.Set(F1(0), F1(1), F1(2));
+  jointWrench.body2Force.Set(F2(3), F2(4), F2(5));
+  jointWrench.body2Torque.Set(F2(0), F2(1), F2(2));
+
+  return jointWrench;
+}
+
+/////////////////////////////////////////////////
+void DARTJoint::SetForce(unsigned int _index, double _force)
+{
+  double force = Joint::CheckAndTruncateForce(_index, _force);
+  this->SaveForce(_index, force);
+  this->SetForceImpl(_index, force);
+
+  // for engines that supports auto-disable of links
+  if (this->childLink)
+    this->childLink->SetEnabled(true);
+  if (this->parentLink)
+    this->parentLink->SetEnabled(true);
+}
+
+/////////////////////////////////////////////////
+double DARTJoint::GetForce(unsigned int _index)
+{
+  if (_index < this->GetAngleCount())
+  {
+    return this->forceApplied[_index];
+  }
+  else
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get force\n";
+    return 0;
+  }
+}
+
+/////////////////////////////////////////////////
+unsigned int DARTJoint::GetAngleCount() const
+{
+  unsigned int angleCount = 0;
+
+  angleCount = this->dtJoint->getNumGenCoords();
+
+  return angleCount;
+}
+
+/////////////////////////////////////////////////
+void DARTJoint::ApplyDamping()
+{
+  // DART applying damping force inside of DART.
+}
+
+/////////////////////////////////////////////////
+DARTModelPtr DARTJoint::GetDARTModel() const
+{
+  return boost::dynamic_pointer_cast<DARTModel>(this->model);
+}
+
+/////////////////////////////////////////////////
+dart::dynamics::Joint *DARTJoint::GetDARTJoint()
+{
+  return this->dtJoint;
+}
+
+/////////////////////////////////////////////////
+void DARTJoint::SaveForce(unsigned int _index, double _force)
+{
+  // this bit of code actually doesn't do anything physical,
+  // it simply records the forces commanded inside forceApplied.
+  if (_index < this->GetAngleCount())
+  {
+    if (this->forceAppliedTime < this->GetWorld()->GetSimTime())
+    {
+      // reset forces if time step is new
+      this->forceAppliedTime = this->GetWorld()->GetSimTime();
+      this->forceApplied[0] = this->forceApplied[1] = 0.0;
+    }
+
+    this->forceApplied[_index] += _force;
+  }
+  else
+    gzerr << "Something's wrong, joint [" << this->GetName()
+          << "] index [" << _index
+          << "] out of range.\n";
+}
diff --git a/gazebo/physics/dart/DARTJoint.hh b/gazebo/physics/dart/DARTJoint.hh
new file mode 100644
index 0000000..66242dd
--- /dev/null
+++ b/gazebo/physics/dart/DARTJoint.hh
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTJOINT_HH_
+#define _GAZEBO_DARTJOINT_HH_
+
+#include <boost/any.hpp>
+#include <string>
+
+#include "gazebo/common/Exception.hh"
+#include "gazebo/physics/Joint.hh"
+#include "gazebo/physics/dart/dart_inc.h"
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief DART joint interface
+    class GAZEBO_VISIBLE DARTJoint : public Joint
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent of the Joint.
+      public: DARTJoint(BasePtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~DARTJoint();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      /// \brief Initialize a joint.
+      public: virtual void Init();
+
+      // Documentation inherited.
+      public: virtual void Reset();
+
+      // Documentation inherited.
+      public: virtual LinkPtr GetJointLink(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual bool AreConnected(LinkPtr _one, LinkPtr _two) const;
+
+      // Documentation inherited.
+      public: virtual void Attach(LinkPtr _parent, LinkPtr _child);
+
+      // Documentation inherited.
+      public: virtual void Detach();
+
+      /// \brief Set the anchor point
+      public: virtual void SetAnchor(unsigned int /*_index*/,
+                                     const gazebo::math::Vector3 &/*_anchor*/);
+
+      // Documentation inherited
+      public: virtual void SetDamping(unsigned int _index, double _damping);
+
+      // Documentation inherited.
+      public: virtual void SetStiffness(unsigned int _index,
+                  const double _stiffness);
+
+      // Documentation inherited.
+      public: virtual void SetStiffnessDamping(unsigned int _index,
+        double _stiffness, double _damping, double _reference = 0);
+
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                  const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                  const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetLinkForce(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetLinkTorque(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual bool SetParam(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value);
+
+      // Documentation inherited.
+      public: virtual void SetAttribute(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value)
+                                        GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      public: virtual double GetParam(const std::string &_key,
+                                          unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual double GetAttribute(const std::string &_key,
+                unsigned int _index) GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      public: virtual JointWrench GetForceTorque(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual void SetForce(unsigned int _index, double _force);
+
+      // Documentation inherited.
+      public: virtual double GetForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual unsigned int GetAngleCount() const;
+
+      // Documentation inherited.
+      public: virtual void ApplyDamping();
+
+      /// \brief Set the force applied to this physics::Joint.
+      /// Note that the unit of force should be consistent with the rest
+      /// of the simulation scales.
+      /// Force is additive (multiple calls
+      /// to SetForceImpl to the same joint in the same time
+      /// step will accumulate forces on that Joint).
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _force Force value.
+      protected: virtual void SetForceImpl(unsigned int _index,
+                     double _force) = 0;
+
+      /// \brief Save external forces applied to this Joint.
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _force Force value.
+      private: void SaveForce(unsigned int _index, double _force);
+
+      /// \brief Get DART model pointer.
+      /// \return A pointer to the DART model.
+      public: DARTModelPtr GetDARTModel() const;
+
+      /// \brief Get DART joint pointer.
+      /// \return A pointer to the DART joint.
+      public: dart::dynamics::Joint *GetDARTJoint();
+
+      /// \brief Save force applied by user
+      /// This plus the joint feedback (joint contstraint forces) is the
+      /// equivalent of simulated force torque sensor reading
+      /// Allocate a 2 vector in case hinge2 joint is used.
+      /// This is used by DART to store external force applied by the user.
+      private: double forceApplied[MAX_JOINT_AXIS];
+
+      /// \brief Save time at which force is applied by user
+      /// This will let us know if it's time to clean up forceApplied.
+      private: common::Time forceAppliedTime;
+
+      /// \brief DARTPhysics engine pointer
+      protected: DARTPhysicsPtr dartPhysicsEngine;
+
+      /// \brief DART joint pointer
+      protected: dart::dynamics::Joint *dtJoint;
+
+      /// \brief DART child body node pointer
+      protected: dart::dynamics::BodyNode *dtChildBodyNode;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTLink.cc b/gazebo/physics/dart/DARTLink.cc
new file mode 100644
index 0000000..386fcc8
--- /dev/null
+++ b/gazebo/physics/dart/DARTLink.cc
@@ -0,0 +1,522 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/World.hh"
+
+#include "gazebo/physics/dart/dart_inc.h"
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/physics/dart/DARTModel.hh"
+#include "gazebo/physics/dart/DARTLink.hh"
+#include "gazebo/physics/dart/DARTJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTLink::DARTLink(EntityPtr _parent)
+  : Link(_parent),
+    dtBodyNode(new dart::dynamics::BodyNode)
+{
+  staticLink = false;
+}
+
+//////////////////////////////////////////////////
+DARTLink::~DARTLink()
+{
+  // We don't need to delete dartBodyNode because skeletone will delete
+  // dartBodyNode if this is registered to the skeletone.
+}
+
+//////////////////////////////////////////////////
+void DARTLink::Load(sdf::ElementPtr _sdf)
+{
+  this->dartPhysics = boost::dynamic_pointer_cast<DARTPhysics>(
+      this->GetWorld()->GetPhysicsEngine());
+
+  if (this->dartPhysics == NULL)
+    gzthrow("Not using the dart physics engine");
+
+  Link::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void DARTLink::Init()
+{
+  Link::Init();
+
+  // Name
+  std::string bodyName = this->GetName();
+  this->dtBodyNode->setName(bodyName);
+
+  // Mass
+  double mass = this->inertial->GetMass();
+  this->dtBodyNode->setMass(mass);
+
+  // Inertia
+  double Ixx = this->inertial->GetIXX();
+  double Iyy = this->inertial->GetIYY();
+  double Izz = this->inertial->GetIZZ();
+  double Ixy = this->inertial->GetIXY();
+  double Ixz = this->inertial->GetIXZ();
+  double Iyz = this->inertial->GetIYZ();
+  this->dtBodyNode->setInertia(Ixx, Iyy, Izz, Ixy, Ixz, Iyz);
+
+  // Visual
+  this->visuals;
+
+  // COG offset
+  math::Vector3 cog = this->inertial->GetCoG();
+  this->dtBodyNode->setLocalCOM(DARTTypes::ConvVec3(cog));
+
+  // Gravity mode
+  this->SetGravityMode(this->sdf->Get<bool>("gravity"));
+
+  // We don't add dart body node to the skeleton here because dart body node
+  // should be set its parent joint before being added. This body node will be
+  // added to the skeleton in DARTModel::Init().
+}
+
+//////////////////////////////////////////////////
+void DARTLink::Fini()
+{
+  Link::Fini();
+}
+
+//////////////////////////////////////////////////
+void DARTLink::OnPoseChange()
+{
+  Link::OnPoseChange();
+
+  // DART body node always have its parent joint.
+  dart::dynamics::Joint* joint = this->dtBodyNode->getParentJoint();
+
+  // This is for the case this function called before DARTModel::Init() is
+  // called.
+  if (joint == NULL)
+    return;
+
+  if (joint->getJointType() == dart::dynamics::Joint::FREE)
+  {
+    dart::dynamics::FreeJoint* freeJoint =
+        dynamic_cast<dart::dynamics::FreeJoint*>(joint);
+
+    const Eigen::Isometry3d &W = DARTTypes::ConvPose(this->GetWorldPose());
+    const Eigen::Isometry3d &T1 = joint->getTransformFromParentBodyNode();
+    const Eigen::Isometry3d &InvT2 = joint->getTransformFromChildBodyNode();
+    Eigen::Isometry3d P = Eigen::Isometry3d::Identity();
+
+    if (this->dtBodyNode->getParentBodyNode())
+      P = this->dtBodyNode->getParentBodyNode()->getWorldTransform();
+
+    Eigen::Isometry3d Q = T1.inverse() * P.inverse() * W * InvT2;
+    Eigen::Vector6d t = Eigen::Vector6d::Zero();
+    t.tail<3>() = Q.translation();
+    t.head<3>() = dart::math::logMap(Q.linear());
+    freeJoint->set_q(t);
+  }
+  else
+  {
+    gzdbg << "DARTLink::OnPoseChange() doesn't make sense unless the link has "
+          << "free joint.\n";
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetEnabled(bool /*_enable*/) const
+{
+  // TODO: DART does not support this functionality.
+}
+
+//////////////////////////////////////////////////
+bool DARTLink::GetEnabled() const
+{
+  // TODO: DART does not support this functionality.
+  return true;
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetLinearVel(const math::Vector3 &/*_vel*/)
+{
+  gzdbg << "DARTLink::SetLinearVel() doesn't make sense in dart.\n";
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetAngularVel(const math::Vector3 &/*_vel*/)
+{
+  gzdbg << "DARTLink::SetAngularVel() doesn't make sense in dart.\n";
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetForce(const math::Vector3 &_force)
+{
+  // DART assume that _force is external force.
+  this->dtBodyNode->setExtForce(Eigen::Vector3d::Zero(),
+                                DARTTypes::ConvVec3(_force));
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetTorque(const math::Vector3 &_torque)
+{
+  // DART assume that _torque is external torque.
+  this->dtBodyNode->setExtTorque(DARTTypes::ConvVec3(_torque));
+}
+
+//////////////////////////////////////////////////
+void DARTLink::AddForce(const math::Vector3 &_force)
+{
+  this->dtBodyNode->addExtForce(Eigen::Vector3d::Zero(),
+                                DARTTypes::ConvVec3(_force));
+}
+
+/////////////////////////////////////////////////
+void DARTLink::AddRelativeForce(const math::Vector3 &_force)
+{
+  this->dtBodyNode->addExtForce(Eigen::Vector3d::Zero(),
+                                DARTTypes::ConvVec3(_force),
+                                true, true);
+}
+
+/////////////////////////////////////////////////
+void DARTLink::AddForceAtWorldPosition(const math::Vector3 &_force,
+                                        const math::Vector3 &_pos)
+{
+  this->dtBodyNode->addExtForce(DARTTypes::ConvVec3(_pos),
+                                DARTTypes::ConvVec3(_force),
+                                false, false);
+}
+
+/////////////////////////////////////////////////
+void DARTLink::AddForceAtRelativePosition(const math::Vector3 &_force,
+                                          const math::Vector3 &_relpos)
+{
+  this->dtBodyNode->addExtForce(DARTTypes::ConvVec3(_relpos),
+                                DARTTypes::ConvVec3(_force),
+                                true, true);
+}
+
+/////////////////////////////////////////////////
+void DARTLink::AddTorque(const math::Vector3 &_torque)
+{
+  this->dtBodyNode->addExtTorque(DARTTypes::ConvVec3(_torque));
+}
+
+/////////////////////////////////////////////////
+void DARTLink::AddRelativeTorque(const math::Vector3 &_torque)
+{
+  this->dtBodyNode->addExtTorque(DARTTypes::ConvVec3(_torque), true);
+}
+
+//////////////////////////////////////////////////
+gazebo::math::Vector3 DARTLink::GetWorldLinearVel(
+    const math::Vector3 &_offset) const
+{
+  const Eigen::Vector3d &linVel =
+      this->dtBodyNode->getWorldVelocity(
+        DARTTypes::ConvVec3(_offset)).tail<3>();
+
+  return DARTTypes::ConvVec3(linVel);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTLink::GetWorldLinearVel(
+    const gazebo::math::Vector3 &_offset,
+    const gazebo::math::Quaternion &_q) const
+{
+  Eigen::Matrix3d R1 = Eigen::Matrix3d(DARTTypes::ConvQuat(_q));
+  Eigen::Vector3d worldOffset = R1 * DARTTypes::ConvVec3(_offset);
+  Eigen::Vector3d linVel =
+    this->dtBodyNode->getWorldVelocity(worldOffset).tail<3>();
+
+  return DARTTypes::ConvVec3(linVel);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTLink::GetWorldCoGLinearVel() const
+{
+  Eigen::Vector3d worldCOM = this->dtBodyNode->getWorldCOM();
+  Eigen::Vector3d linVel
+    = this->dtBodyNode->getWorldVelocity(worldCOM).tail<3>();
+
+  return DARTTypes::ConvVec3(linVel);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTLink::GetWorldAngularVel() const
+{
+  const Eigen::Vector3d &angVel
+    = this->dtBodyNode->getWorldVelocity().head<3>();
+
+  return DARTTypes::ConvVec3(angVel);
+}
+
+/////////////////////////////////////////////////
+math::Vector3 DARTLink::GetWorldForce() const
+{
+  Eigen::Vector6d F = this->dtBodyNode->getExternalForceGlobal();
+  return DARTTypes::ConvVec3(F.tail<3>());
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTLink::GetWorldTorque() const
+{
+  // TODO: Need verification
+  math::Vector3 torque;
+
+  Eigen::Isometry3d W = this->dtBodyNode->getWorldTransform();
+  Eigen::Matrix6d G   = this->dtBodyNode->getInertia();
+  Eigen::VectorXd V   = this->dtBodyNode->getBodyVelocity();
+  Eigen::VectorXd dV  = this->dtBodyNode->getBodyAcceleration();
+  Eigen::Vector6d F   = G * dV - dart::math::dad(V, G * V);
+
+  torque = DARTTypes::ConvVec3(W.linear() * F.head<3>());
+
+  return torque;
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetGravityMode(bool _mode)
+{
+  this->sdf->GetElement("gravity")->Set(_mode);
+  this->dtBodyNode->setGravityMode(_mode);
+}
+
+//////////////////////////////////////////////////
+bool DARTLink::GetGravityMode() const
+{
+  return this->dtBodyNode->getGravityMode();
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetSelfCollide(bool _collide)
+{
+  this->sdf->GetElement("self_collide")->Set(_collide);
+
+  // If this function is called before the body node is not added to a skeleton,
+  // the body node does not have parent skeleton. So we just return here. Self
+  // collision setting will be done later in DARTModel::Init().
+  if (dtBodyNode->getSkeleton() == NULL)
+    return;
+
+  dart::simulation::World *dtWorld = this->dartPhysics->GetDARTWorld();
+  dart::dynamics::Skeleton *dtSkeleton = this->dtBodyNode->getSkeleton();
+  dart::collision::CollisionDetector *dtCollDet =
+      dtWorld->getConstraintHandler()->getCollisionDetector();
+
+  Link_V links = this->GetModel()->GetLinks();
+
+  bool isSkeletonSelfCollidable =
+      this->dtBodyNode->getSkeleton()->isSelfCollidable();
+
+  if (_collide)
+  {
+    // If the skeleton is already self collidable, then we enable self
+    // collidable pairs those are associated with this link. The links in the
+    // pairs should be all and not itself each other.
+    if (isSkeletonSelfCollidable)
+    {
+      for (size_t i = 0; i < links.size(); ++i)
+      {
+        if (links[i].get() != this && links[i]->GetSelfCollide())
+        {
+          dart::dynamics::BodyNode *itdtBodyNode =
+            boost::dynamic_pointer_cast<DARTLink>(links[i])->GetDARTBodyNode();
+
+          // If this->dtBodyNode and itdtBodyNode are connected then don't
+          // enable the pair.
+          // Please see: https://bitbucket.org/osrf/gazebo/issue/899
+          if ((this->dtBodyNode->getParentBodyNode() == itdtBodyNode) ||
+              itdtBodyNode->getParentBodyNode() == this->dtBodyNode)
+            continue;
+
+          dtCollDet->enablePair(this->dtBodyNode, itdtBodyNode);
+        }
+      }
+    }
+    // If the skeleton is not self collidable, we first set the skeleton as
+    // self collidable. If the skeleton is self collidable, then DART regards
+    // that all the links in the skeleton is self collidable. So, we disable all
+    // the pairs of which both of the links in the pair is not self collidable.
+    else
+    {
+      dtSkeleton->setSelfCollidable(true);
+
+      for (size_t i = 0; i < links.size() - 1; ++i)
+      {
+        for (size_t j = i + 1; j < links.size(); ++j)
+        {
+          dart::dynamics::BodyNode *itdtBodyNode1 =
+            boost::dynamic_pointer_cast<DARTLink>(links[i])->GetDARTBodyNode();
+          dart::dynamics::BodyNode *itdtBodyNode2 =
+            boost::dynamic_pointer_cast<DARTLink>(links[j])->GetDARTBodyNode();
+
+          // If this->dtBodyNode and itdtBodyNode are connected then don't
+          // enable the pair.
+          // Please see: https://bitbucket.org/osrf/gazebo/issue/899
+          if ((itdtBodyNode1->getParentBodyNode() == itdtBodyNode2) ||
+              itdtBodyNode2->getParentBodyNode() == itdtBodyNode1)
+            dtCollDet->disablePair(itdtBodyNode1, itdtBodyNode2);
+
+          if (!links[i]->GetSelfCollide() || !links[j]->GetSelfCollide())
+            dtCollDet->disablePair(itdtBodyNode1, itdtBodyNode2);
+        }
+      }
+    }
+  }
+  else
+  {
+    // If the skeleton is self collidable, then we disable all the pairs
+    // associated with this link.
+    if (isSkeletonSelfCollidable)
+    {
+      for (size_t i = 0; i < links.size(); ++i)
+      {
+        if (links[i].get() != this)
+        {
+          dart::dynamics::BodyNode *itdtBodyNode =
+            boost::dynamic_pointer_cast<DARTLink>(links[i])->GetDARTBodyNode();
+          dtCollDet->disablePair(this->dtBodyNode, itdtBodyNode);
+        }
+      }
+    }
+
+    // If now all the links are not self collidable, then we set the skeleton
+    // as not self collidable.
+    bool isAllLinksNotCollidable = true;
+    for (size_t i = 0; i < links.size(); ++i)
+    {
+      if (links[i]->GetSelfCollide())
+      {
+        isAllLinksNotCollidable = false;
+        break;
+      }
+    }
+    if (isAllLinksNotCollidable)
+      dtSkeleton->setSelfCollidable(false);
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetLinearDamping(double /*_damping*/)
+{
+  // see: https://github.com/dartsim/dart/issues/85
+  gzwarn << "DART does not support DARTLink::SetLinearDamping() yet.\n";
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetAngularDamping(double /*_damping*/)
+{
+  // see: https://github.com/dartsim/dart/issues/85
+  gzwarn << "DART does not support DARTLink::SetAngularDamping() yet.\n";
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetKinematic(const bool& _state)
+{
+  this->sdf->GetElement("kinematic")->Set(_state);
+
+  gzwarn << "DART does not support DARTLink::SetKinematic() yet.\n";
+}
+
+//////////////////////////////////////////////////
+bool DARTLink::GetKinematic() const
+{
+  // DART does not support kinematic mode for link.";
+  return false;
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetAutoDisable(bool /*_disable*/)
+{
+  gzwarn << "DART does not support DARTLink::SetAutoDisable() yet.\n";
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetLinkStatic(bool /*_static*/)
+{
+//  if (_static == staticLink)
+//    return;
+
+//  if (_static)
+//  {
+//    // Store the original joint
+//    this->dtDynamicJoint = this->dtBodyNode->getParentJoint();
+
+//    this->dtBodyNode->setParentJoint(this->dtStaticJoint);
+//  }
+//  else
+//  {
+
+//  }
+
+  gzwarn << "DART does not support DARTLink::SetLinkStatic() yet.\n";
+}
+
+//////////////////////////////////////////////////
+void DARTLink::updateDirtyPoseFromDARTTransformation()
+{
+  // Step 1: get dart body's transformation
+  // Step 2: set gazebo link's pose using the transformation
+  math::Pose newPose = DARTTypes::ConvPose(
+                         this->dtBodyNode->getWorldTransform());
+
+  // Set the new pose to this link
+  this->dirtyPose = newPose;
+
+  // Set the new pose to the world
+  // (Below method can be changed in gazebo code)
+  this->world->dirtyPoses.push_back(this);
+}
+
+//////////////////////////////////////////////////
+DARTPhysicsPtr DARTLink::GetDARTPhysics(void) const
+{
+  return boost::dynamic_pointer_cast<DARTPhysics>(
+        this->GetWorld()->GetPhysicsEngine());
+}
+
+//////////////////////////////////////////////////
+dart::simulation::World *DARTLink::GetDARTWorld(void) const
+{
+  return GetDARTPhysics()->GetDARTWorld();
+}
+
+//////////////////////////////////////////////////
+DARTModelPtr DARTLink::GetDARTModel() const
+{
+  return boost::dynamic_pointer_cast<DARTModel>(this->GetModel());
+}
+
+//////////////////////////////////////////////////
+dart::dynamics::BodyNode *DARTLink::GetDARTBodyNode() const
+{
+  return dtBodyNode;
+}
+
+//////////////////////////////////////////////////
+void DARTLink::SetDARTParentJoint(DARTJointPtr _dartParentJoint)
+{
+  dartParentJoint = _dartParentJoint;
+}
+
+//////////////////////////////////////////////////
+void DARTLink::AddDARTChildJoint(DARTJointPtr _dartChildJoint)
+{
+  dartChildJoints.push_back(_dartChildJoint);
+}
diff --git a/gazebo/physics/dart/DARTLink.hh b/gazebo/physics/dart/DARTLink.hh
new file mode 100644
index 0000000..ba4125f
--- /dev/null
+++ b/gazebo/physics/dart/DARTLink.hh
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTLINK_HH_
+#define _GAZEBO_DARTLINK_HH_
+
+#include <vector>
+
+#include "gazebo/physics/Link.hh"
+
+#include "gazebo/physics/dart/dart_inc.h"
+#include "gazebo/physics/dart/DARTTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_dart DART Physics
+    /// \brief dart physics engine wrapper
+    /// \{
+
+    /// \brief DART Link class
+    class GAZEBO_VISIBLE DARTLink : public Link
+    {
+      /// \brief Constructor
+      public: explicit DARTLink(EntityPtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~DARTLink();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _ptr);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited.
+      public: virtual void Fini();
+
+      // Documentation inherited
+      public: virtual void OnPoseChange();
+
+      // Documentation inherited
+      public: virtual void SetEnabled(bool _enable) const;
+
+      // Documentation inherited
+      public: virtual bool GetEnabled() const;
+
+      // Documentation inherited
+      public: virtual void SetLinearVel(const math::Vector3 &_vel);
+
+      // Documentation inherited
+      public: virtual void SetAngularVel(const math::Vector3 &_vel);
+
+      // Documentation inherited
+      public: virtual void SetForce(const math::Vector3 &_force);
+
+      // Documentation inherited
+      public: virtual void SetTorque(const math::Vector3 &_torque);
+
+      // Documentation inherited
+      public: virtual void AddForce(const math::Vector3 &_force);
+
+      // Documentation inherited
+      public: virtual void AddRelativeForce(const math::Vector3 &_force);
+
+      // Documentation inherited
+      public: virtual void AddForceAtWorldPosition(const math::Vector3 &_force,
+                                                   const math::Vector3 &_pos);
+
+      // Documentation inherited
+      public: virtual void AddForceAtRelativePosition(
+          const math::Vector3 &_force,
+          const math::Vector3 &_relpos);
+
+      // Documentation inherited
+      public: virtual void AddTorque(const math::Vector3 &_torque);
+
+      // Documentation inherited
+      public: virtual void AddRelativeTorque(const math::Vector3& _torque);
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetWorldLinearVel(
+          const math::Vector3& _offset = math::Vector3(0, 0, 0)) const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetWorldLinearVel(
+          const math::Vector3 &_offset,
+          const math::Quaternion &_q) const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetWorldCoGLinearVel() const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetWorldAngularVel() const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetWorldForce() const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetWorldTorque() const;
+
+      // Documentation inherited
+      public: virtual void SetGravityMode(bool _mode);
+
+      // Documentation inherited
+      public: virtual bool GetGravityMode() const;
+
+      // Documentation inherited
+      public: virtual void SetSelfCollide(bool _collide);
+
+      // Documentation inherited
+      public: virtual void SetLinearDamping(double _damping);
+
+      // Documentation inherited
+      public: virtual void SetAngularDamping(double _damping);
+
+      // Documentation inherited
+      public: virtual void SetKinematic(const bool &_state);
+
+      // Documentation inherited
+      public: virtual bool GetKinematic() const;
+
+      // Documentation inherited
+      public: virtual void SetAutoDisable(bool _disable);
+
+      // Documentation inherited
+      public: virtual void SetLinkStatic(bool _static);
+
+      /// \brief Store DART Transformation to Entity::dirtyPose and add this
+      ///        link to World::dirtyPoses so that World::Update() trigger
+      ///        Entity::SetWorldPose() for this link.
+      public: void updateDirtyPoseFromDARTTransformation();
+
+      /// \brief Get pointer to DART Physics engine associated with this link.
+      /// \return Pointer to the DART Physics engine.
+      public: DARTPhysicsPtr GetDARTPhysics(void) const;
+
+      /// \brief Get pointer to DART World associated with this link.
+      /// \return Pointer to the DART World.
+      public: dart::simulation::World *GetDARTWorld(void) const;
+
+      /// \brief Get pointer to DART Model associated with this link.
+      /// \return Pointer to the DART Model.
+      public: DARTModelPtr GetDARTModel() const;
+
+      /// \brief Get pointer to DART BodyNode associated with this link.
+      /// \return Pointer to DART BodyNode.
+      public: dart::dynamics::BodyNode *GetDARTBodyNode() const;
+
+      /// \brief Set parent joint of this link.
+      /// \param[in] _dartParentJoint Pointer to the parent joint.
+      public: void SetDARTParentJoint(DARTJointPtr _dartParentJoint);
+
+      /// \brief Set child joint of this link.
+      /// \param[in] _dartChildJoint Pointer to the child joint.
+      public: void AddDARTChildJoint(DARTJointPtr _dartChildJoint);
+
+      /// \brief Pointer to the DART physics engine.
+      private: DARTPhysicsPtr dartPhysics;
+
+      /// \brief Pointer to the DART BodyNode.
+      private: dart::dynamics::BodyNode *dtBodyNode;
+
+      /// \brief Pointer to the parent joint.
+      private: DARTJointPtr dartParentJoint;
+
+      /// \brief List of pointers to the child joints.
+      private: std::vector<DARTJointPtr> dartChildJoints;
+
+      /// \biref If true, freeze link to world (inertial) frame.
+      private: bool staticLink;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTMeshShape.cc b/gazebo/physics/dart/DARTMeshShape.cc
new file mode 100644
index 0000000..03a9cc6
--- /dev/null
+++ b/gazebo/physics/dart/DARTMeshShape.cc
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/physics/dart/DARTCollision.hh"
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/physics/dart/DARTMeshShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+
+//////////////////////////////////////////////////
+DARTMeshShape::DARTMeshShape(CollisionPtr _parent) : MeshShape(_parent)
+{
+}
+
+//////////////////////////////////////////////////
+DARTMeshShape::~DARTMeshShape()
+{
+}
+
+//////////////////////////////////////////////////
+void DARTMeshShape::Update()
+{
+  gzwarn << "Not implemented!\n";
+}
+
+//////////////////////////////////////////////////
+void DARTMeshShape::Load(sdf::ElementPtr _sdf)
+{
+  MeshShape::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void DARTMeshShape::Init()
+{
+  gzwarn << "Not implemented!\n";
+}
diff --git a/gazebo/physics/dart/DARTMeshShape.hh b/gazebo/physics/dart/DARTMeshShape.hh
new file mode 100644
index 0000000..d40e9c2
--- /dev/null
+++ b/gazebo/physics/dart/DARTMeshShape.hh
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTMESHSHAPE_HH_
+#define _GAZEBO_DARTMESHSHAPE_HH_
+
+#include "gazebo/physics/MeshShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief Triangle mesh collision.
+    class GAZEBO_VISIBLE DARTMeshShape : public MeshShape
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent collision object.
+      public: explicit DARTMeshShape(CollisionPtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~DARTMeshShape();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual void Update();
+
+      /// \brief Transform matrix.
+      // private: dReal transform[16*2];
+
+      /// \brief Transform matrix index.
+      private: int transformIndex;
+
+      /// \brief Array of vertex values.
+      private: float *vertices;
+
+      /// \brief Array of index values.
+      private: int *indices;
+
+      /// \brief DART trimesh data.
+      // private: dTriMeshDataID odeData;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTModel.cc b/gazebo/physics/dart/DARTModel.cc
new file mode 100644
index 0000000..a7ce6c8
--- /dev/null
+++ b/gazebo/physics/dart/DARTModel.cc
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Assert.hh"
+
+#include "gazebo/physics/World.hh"
+
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/physics/dart/DARTLink.hh"
+#include "gazebo/physics/dart/DARTModel.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTModel::DARTModel(BasePtr _parent)
+  : Model(_parent), dtSkeleton(NULL)
+{
+}
+
+//////////////////////////////////////////////////
+DARTModel::~DARTModel()
+{
+  if (dtSkeleton)
+    delete dtSkeleton;
+}
+
+//////////////////////////////////////////////////
+void DARTModel::Load(sdf::ElementPtr _sdf)
+{
+  // create skeletonDynamics of DART
+  this->dtSkeleton = new dart::dynamics::Skeleton();
+
+  Model::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void DARTModel::Init()
+{
+  Model::Init();
+
+  //----------------------------------------------
+  // Name
+  std::string modelName = this->GetName();
+  this->dtSkeleton->setName(modelName.c_str());
+
+  //----------------------------------------------
+  // Static
+  this->dtSkeleton->setMobile(!this->IsStatic());
+
+  //----------------------------------------------
+  // Check if this link is free floating body
+  // If a link of this model has no parent joint, then we add 6-dof free joint
+  // to the link.
+  Link_V linkList = this->GetLinks();
+  for (unsigned int i = 0; i < linkList.size(); ++i)
+  {
+    dart::dynamics::BodyNode *dtBodyNode
+        = boost::static_pointer_cast<DARTLink>(linkList[i])->GetDARTBodyNode();
+
+    if (dtBodyNode->getParentJoint() == NULL)
+    {
+      dart::dynamics::FreeJoint *newFreeJoint = new dart::dynamics::FreeJoint;
+
+      newFreeJoint->setTransformFromParentBodyNode(
+            DARTTypes::ConvPose(linkList[i]->GetWorldPose()));
+      newFreeJoint->setTransformFromChildBodyNode(
+        Eigen::Isometry3d::Identity());
+
+      dtBodyNode->setParentJoint(newFreeJoint);
+    }
+
+    dtSkeleton->addBodyNode(dtBodyNode);
+  }
+
+  // Add the skeleton to the world
+  this->GetDARTWorld()->addSkeleton(dtSkeleton);
+
+  // Self collision
+  // Note: This process should be done after this skeleton is added to the
+  //       world.
+
+  // Check whether there exist at least one pair of self collidable links.
+  int numSelfCollidableLinks = 0;
+  bool hasPairOfSelfCollidableLinks = false;
+  for (size_t i = 0; i < linkList.size(); ++i)
+  {
+    if (linkList[i]->GetSelfCollide())
+    {
+      ++numSelfCollidableLinks;
+      if (numSelfCollidableLinks >= 2)
+      {
+        hasPairOfSelfCollidableLinks = true;
+        break;
+      }
+    }
+  }
+
+  // If the skeleton has at least two self collidable links, then we set the
+  // skeleton as self collidable. If the skeleton is self collidable, then
+  // DART regards that all the links in the skeleton is self collidable. So, we
+  // disable all the pairs of which both of the links in the pair is not self
+  // collidable.
+  if (hasPairOfSelfCollidableLinks)
+  {
+    this->dtSkeleton->setSelfCollidable(true);
+
+    dart::simulation::World *dtWorld = this->GetDARTPhysics()->GetDARTWorld();
+    dart::collision::CollisionDetector *dtCollDet =
+        dtWorld->getConstraintHandler()->getCollisionDetector();
+
+    for (size_t i = 0; i < linkList.size() - 1; ++i)
+    {
+      for (size_t j = i + 1; j < linkList.size(); ++j)
+      {
+        dart::dynamics::BodyNode *itdtBodyNode1 =
+          boost::dynamic_pointer_cast<DARTLink>(linkList[i])->GetDARTBodyNode();
+        dart::dynamics::BodyNode *itdtBodyNode2 =
+          boost::dynamic_pointer_cast<DARTLink>(linkList[j])->GetDARTBodyNode();
+
+        // If this->dtBodyNode and itdtBodyNode are connected then don't enable
+        // the pair.
+        // Please see: https://bitbucket.org/osrf/gazebo/issue/899
+        if ((itdtBodyNode1->getParentBodyNode() == itdtBodyNode2) ||
+            itdtBodyNode2->getParentBodyNode() == itdtBodyNode1)
+        {
+          dtCollDet->disablePair(itdtBodyNode1, itdtBodyNode2);
+        }
+
+        if (!linkList[i]->GetSelfCollide() || !linkList[j]->GetSelfCollide())
+        {
+          dtCollDet->disablePair(itdtBodyNode1, itdtBodyNode2);
+        }
+      }
+    }
+  }
+
+  // Note: This function should be called after the skeleton is added to the
+  //       world.
+  this->BackupState();
+}
+
+
+//////////////////////////////////////////////////
+void DARTModel::Update()
+{
+  Model::Update();
+}
+
+//////////////////////////////////////////////////
+void DARTModel::Fini()
+{
+  Model::Fini();
+}
+
+//////////////////////////////////////////////////
+void DARTModel::BackupState()
+{
+  dtConfig = this->dtSkeleton->get_q();
+  dtVelocity = this->dtSkeleton->get_dq();
+}
+
+//////////////////////////////////////////////////
+void DARTModel::RestoreState()
+{
+  GZ_ASSERT(dtConfig.size() == this->dtSkeleton->getNumGenCoords(),
+            "Cannot RestoreState, invalid size");
+  GZ_ASSERT(dtVelocity.size() == this->dtSkeleton->getNumGenCoords(),
+            "Cannot RestoreState, invalid size");
+
+  this->dtSkeleton->set_q(dtConfig);
+  this->dtSkeleton->set_dq(dtVelocity);
+}
+
+//////////////////////////////////////////////////
+dart::dynamics::Skeleton *DARTModel::GetDARTSkeleton()
+{
+  return dtSkeleton;
+}
+
+//////////////////////////////////////////////////
+DARTPhysicsPtr DARTModel::GetDARTPhysics(void) const
+{
+  return boost::dynamic_pointer_cast<DARTPhysics>(
+    this->GetWorld()->GetPhysicsEngine());
+}
+
+//////////////////////////////////////////////////
+dart::simulation::World *DARTModel::GetDARTWorld(void) const
+{
+  return GetDARTPhysics()->GetDARTWorld();
+}
diff --git a/gazebo/physics/dart/DARTModel.hh b/gazebo/physics/dart/DARTModel.hh
new file mode 100644
index 0000000..442c889
--- /dev/null
+++ b/gazebo/physics/dart/DARTModel.hh
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTMODEL_HH_
+#define _GAZEBO_DARTMODEL_HH_
+
+#include "gazebo/physics/dart/dart_inc.h"
+#include "gazebo/physics/dart/DARTTypes.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_dart DART Physics
+    /// \brief dart physics engine wrapper
+    /// \{
+
+    /// \class DARTModel
+    /// \brief DART model class
+    class GAZEBO_VISIBLE DARTModel : public Model
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent object.
+      public: explicit DARTModel(BasePtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~DARTModel();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited.
+      public: virtual void Update();
+
+      // Documentation inherited.
+      public: virtual void Fini();
+
+      /// \brief
+      public: void BackupState();
+
+      /// \brief
+      public: void RestoreState();
+
+      /// \brief
+      public: dart::dynamics::Skeleton *GetDARTSkeleton();
+
+      /// \brief
+      public: DARTPhysicsPtr GetDARTPhysics(void) const;
+
+      /// \brief
+      public: dart::simulation::World *GetDARTWorld(void) const;
+
+      /// \brief
+      protected: dart::dynamics::Skeleton *dtSkeleton;
+
+      /// \brief
+      protected: Eigen::VectorXd dtConfig;
+
+      /// \brief
+      protected: Eigen::VectorXd dtVelocity;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTMultiRayShape.cc b/gazebo/physics/dart/DARTMultiRayShape.cc
new file mode 100644
index 0000000..6ae75ea
--- /dev/null
+++ b/gazebo/physics/dart/DARTMultiRayShape.cc
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/dart/DARTTypes.hh"
+#include "gazebo/physics/dart/DARTLink.hh"
+#include "gazebo/physics/dart/DARTCollision.hh"
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/physics/dart/DARTRayShape.hh"
+#include "gazebo/physics/dart/DARTMultiRayShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+
+//////////////////////////////////////////////////
+DARTMultiRayShape::DARTMultiRayShape(CollisionPtr _parent)
+  : MultiRayShape(_parent)
+{
+  this->SetName("DART_multiray_shape");
+  this->physicsEngine = boost::static_pointer_cast<DARTPhysics>(
+      this->collisionParent->GetWorld()->GetPhysicsEngine());
+}
+
+//////////////////////////////////////////////////
+DARTMultiRayShape::~DARTMultiRayShape()
+{
+}
+
+//////////////////////////////////////////////////
+void DARTMultiRayShape::UpdateRays()
+{
+  std::vector<RayShapePtr>::iterator iter;
+  for (iter = this->rays.begin(); iter != this->rays.end(); ++iter)
+  {
+    (*iter)->Update();
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTMultiRayShape::AddRay(const math::Vector3& _start,
+                               const math::Vector3& _end)
+{
+  MultiRayShape::AddRay(_start, _end);
+
+  DARTRayShapePtr ray(new DARTRayShape(this->collisionParent));
+  ray->SetPoints(_start, _end);
+
+  this->rays.push_back(ray);
+}
diff --git a/gazebo/physics/dart/DARTMultiRayShape.hh b/gazebo/physics/dart/DARTMultiRayShape.hh
new file mode 100644
index 0000000..41f915b
--- /dev/null
+++ b/gazebo/physics/dart/DARTMultiRayShape.hh
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTMULTIRAYSHAPE_HH_
+#define _GAZEBO_DARTMULTIRAYSHAPE_HH_
+
+#include "gazebo/physics/MultiRayShape.hh"
+#include "gazebo/physics/dart/DARTTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_bullet Bullet Physics
+    /// \{
+
+    /// \brief DART specific version of MultiRayShape
+    class GAZEBO_VISIBLE DARTMultiRayShape : public MultiRayShape
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent Collision.
+      public: explicit DARTMultiRayShape(CollisionPtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~DARTMultiRayShape();
+
+      // Documentation inherited.
+      public: virtual void UpdateRays();
+
+      /// \brief Add a ray to the collision.
+      /// \param[in] _start Start location of the ray.
+      /// \param[in] _end End location of the ray.
+      protected: void AddRay(const math::Vector3 &_start,
+                             const math::Vector3 &_end);
+
+      /// \brief Pointer to the DART physics engine.
+      private: DARTPhysicsPtr physicsEngine;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTPhysics.cc b/gazebo/physics/dart/DARTPhysics.cc
new file mode 100644
index 0000000..2a6cfa2
--- /dev/null
+++ b/gazebo/physics/dart/DARTPhysics.cc
@@ -0,0 +1,568 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/math/Vector3.hh"
+
+#include "gazebo/transport/Publisher.hh"
+
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/ContactManager.hh"
+#include "gazebo/physics/Entity.hh"
+#include "gazebo/physics/MapShape.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/PhysicsFactory.hh"
+#include "gazebo/physics/SurfaceParams.hh"
+#include "gazebo/physics/World.hh"
+
+#include "gazebo/physics/dart/DARTScrewJoint.hh"
+#include "gazebo/physics/dart/DARTHingeJoint.hh"
+#include "gazebo/physics/dart/DARTHinge2Joint.hh"
+#include "gazebo/physics/dart/DARTSliderJoint.hh"
+#include "gazebo/physics/dart/DARTBallJoint.hh"
+#include "gazebo/physics/dart/DARTUniversalJoint.hh"
+
+#include "gazebo/physics/dart/DARTRayShape.hh"
+#include "gazebo/physics/dart/DARTBoxShape.hh"
+#include "gazebo/physics/dart/DARTSphereShape.hh"
+#include "gazebo/physics/dart/DARTCylinderShape.hh"
+#include "gazebo/physics/dart/DARTPlaneShape.hh"
+#include "gazebo/physics/dart/DARTMeshShape.hh"
+#include "gazebo/physics/dart/DARTMultiRayShape.hh"
+#include "gazebo/physics/dart/DARTHeightmapShape.hh"
+
+#include "gazebo/physics/dart/DARTModel.hh"
+#include "gazebo/physics/dart/DARTLink.hh"
+
+#include "gazebo/physics/dart/DARTPhysics.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+GZ_REGISTER_PHYSICS_ENGINE("dart", DARTPhysics)
+
+//////////////////////////////////////////////////
+DARTPhysics::DARTPhysics(WorldPtr _world)
+    : PhysicsEngine(_world)
+{
+  this->dtWorld = new dart::simulation::World;
+  this->dtWorld->getConstraintHandler()->setCollisionDetector(
+        new dart::collision::DARTCollisionDetector());
+//  this->dtWorld->getConstraintHandler()->setAllowablePenetration(1e-6);
+//  this->dtWorld->getConstraintHandler()->setMaxReducingPenetrationVelocity(
+//        0.01);
+//  this->dtWorld->getConstraintHandler()->setAllowableJointViolation(
+//        DART_TO_RADIAN*1e-1);
+//  this->dtWorld->getConstraintHandler()->setMaxReducingJointViolationVelocity(
+//        DART_TO_RADIAN*1e-0);
+}
+
+//////////////////////////////////////////////////
+DARTPhysics::~DARTPhysics()
+{
+  delete this->dtWorld;
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::Load(sdf::ElementPtr _sdf)
+{
+  PhysicsEngine::Load(_sdf);
+
+  // Gravity
+  math::Vector3 g = this->sdf->Get<math::Vector3>("gravity");
+  this->dtWorld->setGravity(Eigen::Vector3d(g.x, g.y, g.z));
+
+  // Time step
+  // double timeStep = this->sdf->GetValueDouble("time_step");
+  // this->dartWorld->setTimeStep(timeStep);
+
+  // TODO: Elements for dart settings
+  // sdf::ElementPtr dartElem = this->sdf->GetElement("dart");
+  // this->stepTimeDouble = dartElem->GetElement("dt")->GetValueDouble();
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::Init()
+{
+  // this->dartWorld->initialize();
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::Fini()
+{
+  PhysicsEngine::Fini();
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::Reset()
+{
+  boost::recursive_mutex::scoped_lock lock(*this->physicsUpdateMutex);
+
+  // Restore state all the models
+  unsigned int modelCount = this->world->GetModelCount();
+  DARTModelPtr dartModelIt;
+
+  for (unsigned int i = 0; i < modelCount; ++i)
+  {
+    dartModelIt =
+      boost::dynamic_pointer_cast<DARTModel>(this->world->GetModel(i));
+    GZ_ASSERT(dartModelIt.get(), "dartModelIt pointer is NULL");
+
+    dartModelIt->RestoreState();
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::InitForThread()
+{
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::UpdateCollision()
+{
+  this->contactManager->ResetCount();
+
+  dart::constraint::ConstraintDynamics *dtConstraintDynamics =
+      this->dtWorld->getConstraintHandler();
+  dart::collision::CollisionDetector *dtCollisionDetector =
+      dtConstraintDynamics->getCollisionDetector();
+  int numContacts = dtCollisionDetector->getNumContacts();
+
+  for (int i = 0; i < numContacts; ++i)
+  {
+    const dart::collision::Contact &dtContact =
+        dtCollisionDetector->getContact(i);
+    dart::dynamics::BodyNode *dtBodyNode1 =
+        dtContact.collisionNode1->getBodyNode();
+    dart::dynamics::BodyNode *dtBodyNode2 =
+        dtContact.collisionNode2->getBodyNode();
+
+    DARTLinkPtr dartLink1 = this->FindDARTLink(dtBodyNode1);
+    DARTLinkPtr dartLink2 = this->FindDARTLink(dtBodyNode2);
+
+    GZ_ASSERT(dartLink1.get() != NULL, "dartLink1 in collision pare is NULL");
+    GZ_ASSERT(dartLink2.get() != NULL, "dartLink2 in collision pare is NULL");
+
+    unsigned int colIndex = 0;
+    CollisionPtr collisionPtr1 = dartLink1->GetCollision(colIndex);
+    CollisionPtr collisionPtr2 = dartLink2->GetCollision(colIndex);
+
+    // Add a new contact to the manager. This will return NULL if no one is
+    // listening for contact information.
+    Contact *contactFeedback = this->GetContactManager()->NewContact(
+                                 collisionPtr1.get(), collisionPtr2.get(),
+                                 this->world->GetSimTime());
+
+    if (!contactFeedback)
+      continue;
+
+    math::Pose body1Pose = dartLink1->GetWorldPose();
+    math::Pose body2Pose = dartLink2->GetWorldPose();
+    math::Vector3 localForce1;
+    math::Vector3 localForce2;
+    math::Vector3 localTorque1;
+    math::Vector3 localTorque2;
+
+    // calculate force in world frame
+    Eigen::Vector3d force = dtContact.force;
+
+    // calculate torque in world frame
+    Eigen::Vector3d torqueA =
+        (dtContact.point -
+         dtBodyNode1->getWorldTransform().translation()).cross(force);
+    Eigen::Vector3d torqueB =
+        (dtContact.point -
+         dtBodyNode2->getWorldTransform().translation()).cross(-force);
+
+    // Convert from world to link frame
+    localForce1 = body1Pose.rot.RotateVectorReverse(
+        DARTTypes::ConvVec3(force));
+    localForce2 = body2Pose.rot.RotateVectorReverse(
+        DARTTypes::ConvVec3(-force));
+    localTorque1 = body1Pose.rot.RotateVectorReverse(
+        DARTTypes::ConvVec3(torqueA));
+    localTorque2 = body2Pose.rot.RotateVectorReverse(
+        DARTTypes::ConvVec3(torqueB));
+
+    contactFeedback->positions[0] = DARTTypes::ConvVec3(dtContact.point);
+    contactFeedback->normals[0] = DARTTypes::ConvVec3(dtContact.normal);
+    contactFeedback->depths[0] = dtContact.penetrationDepth;
+
+    if (!dartLink1->IsStatic())
+    {
+      contactFeedback->wrench[0].body1Force = localForce1;
+      contactFeedback->wrench[0].body1Torque = localTorque1;
+    }
+
+    if (!dartLink2->IsStatic())
+    {
+      contactFeedback->wrench[0].body2Force = localForce2;
+      contactFeedback->wrench[0].body2Torque = localTorque2;
+    }
+
+    ++contactFeedback->count;
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::UpdatePhysics()
+{
+  // need to lock, otherwise might conflict with world resetting
+  boost::recursive_mutex::scoped_lock lock(*this->physicsUpdateMutex);
+
+  // common::Time currTime =  this->world->GetRealTime();
+
+  this->dtWorld->setTimeStep(this->maxStepSize);
+  this->dtWorld->step();
+
+  // Update all the transformation of DART's links to gazebo's links
+  // TODO: How to visit all the links in the world?
+  unsigned int modelCount = this->world->GetModelCount();
+  ModelPtr modelItr;
+
+  for (unsigned int i = 0; i < modelCount; ++i)
+  {
+    modelItr = this->world->GetModel(i);
+    // TODO: need to improve speed
+    Link_V links = modelItr->GetLinks();
+    unsigned int linkCount = links.size();
+    DARTLinkPtr dartLinkItr;
+
+    for (unsigned int j = 0; j < linkCount; ++j)
+    {
+      dartLinkItr
+          = boost::dynamic_pointer_cast<DARTLink>(links.at(j));
+      dartLinkItr->updateDirtyPoseFromDARTTransformation();
+    }
+  }
+
+  // this->lastUpdateTime = currTime;
+}
+
+//////////////////////////////////////////////////
+std::string DARTPhysics::GetType() const
+{
+  return "dart";
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::SetSeed(uint32_t /*_seed*/)
+{
+  gzwarn << "Not implemented yet in DART.\n";
+}
+
+//////////////////////////////////////////////////
+ModelPtr DARTPhysics::CreateModel(BasePtr _parent)
+{
+  DARTModelPtr model(new DARTModel(_parent));
+
+  return model;
+}
+
+//////////////////////////////////////////////////
+LinkPtr DARTPhysics::CreateLink(ModelPtr _parent)
+{
+  if (_parent == NULL)
+  {
+    gzerr << "Link must have a parent in DART.\n";
+    return LinkPtr();
+  }
+
+  DARTLinkPtr link(new DARTLink(_parent));
+  link->SetWorld(_parent->GetWorld());
+
+  return link;
+}
+
+//////////////////////////////////////////////////
+CollisionPtr DARTPhysics::CreateCollision(const std::string &_type,
+                                          LinkPtr _body)
+{
+  DARTCollisionPtr collision(new DARTCollision(_body));
+  ShapePtr shape = this->CreateShape(_type, collision);
+  collision->SetShape(shape);
+  shape->SetWorld(_body->GetWorld());
+  return collision;
+}
+
+//////////////////////////////////////////////////
+ShapePtr DARTPhysics::CreateShape(const std::string &_type,
+                                    CollisionPtr _collision)
+{
+  ShapePtr shape;
+  DARTCollisionPtr collision =
+    boost::dynamic_pointer_cast<DARTCollision>(_collision);
+
+  if (_type == "sphere")
+    shape.reset(new DARTSphereShape(collision));
+  else if (_type == "plane")
+    shape.reset(new DARTPlaneShape(collision));
+  else if (_type == "box")
+    shape.reset(new DARTBoxShape(collision));
+  else if (_type == "cylinder")
+    shape.reset(new DARTCylinderShape(collision));
+  else if (_type == "multiray")
+    shape.reset(new DARTMultiRayShape(collision));
+  else if (_type == "mesh" || _type == "trimesh")
+    shape.reset(new DARTMeshShape(collision));
+  else if (_type == "heightmap")
+    shape.reset(new DARTHeightmapShape(collision));
+  else if (_type == "map" || _type == "image")
+    shape.reset(new MapShape(collision));
+  else if (_type == "ray")
+    if (_collision)
+      shape.reset(new DARTRayShape(collision));
+    else
+      shape.reset(new DARTRayShape(this->world->GetPhysicsEngine()));
+  else
+    gzerr << "Unable to create collision of type[" << _type << "]\n";
+
+  return shape;
+}
+
+//////////////////////////////////////////////////
+JointPtr DARTPhysics::CreateJoint(const std::string &_type, ModelPtr _parent)
+{
+  JointPtr joint;
+
+  if (_type == "prismatic")
+    joint.reset(new DARTSliderJoint(_parent));
+  else if (_type == "screw")
+    joint.reset(new DARTScrewJoint(_parent));
+  else if (_type == "revolute")
+    joint.reset(new DARTHingeJoint(_parent));
+  else if (_type == "revolute2")
+    joint.reset(new DARTHinge2Joint(_parent));
+  else if (_type == "ball")
+    joint.reset(new DARTBallJoint(_parent));
+  else if (_type == "universal")
+    joint.reset(new DARTUniversalJoint(_parent));
+  else
+    gzerr << "Unable to create joint of type[" << _type << "]";
+
+  return joint;
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::SetGravity(const gazebo::math::Vector3 &_gravity)
+{
+  this->sdf->GetElement("gravity")->Set(_gravity);
+  this->dtWorld->setGravity(
+    Eigen::Vector3d(_gravity.x, _gravity.y, _gravity.z));
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::DebugPrint() const
+{
+  gzwarn << "Not implemented in DART.\n";
+}
+
+//////////////////////////////////////////////////
+boost::any DARTPhysics::GetParam(const std::string &_key) const
+{
+  sdf::ElementPtr dartElem = this->sdf->GetElement("dart");
+  GZ_ASSERT(dartElem != NULL, "DART SDF element does not exist");
+
+  if (_key == "max_contacts")
+  {
+    return dartElem->GetElement("max_contacts")->Get<int>();
+  }
+  else if (_key == "min_step_size")
+  {
+    return dartElem->GetElement("solver")->Get<double>("min_step_size");
+  }
+  else
+  {
+    gzwarn << _key << " is not supported in ode" << std::endl;
+    return 0;
+  }
+
+  gzerr << "We should not be here, something is wrong." << std::endl;
+  return 0;
+}
+
+//////////////////////////////////////////////////
+bool DARTPhysics::SetParam(const std::string &_key, const boost::any &_value)
+{
+  /// \TODO fill this out, see issue #1115
+  if (_key == "max_contacts")
+  {
+    int value;
+    try
+    {
+      value = boost::any_cast<int>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    gzerr << "Setting [" << _key << "] in DART to [" << value
+          << "] not yet supported.\n";
+  }
+  else if (_key == "min_step_size")
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    gzerr << "Setting [" << _key << "] in DART to [" << value
+          << "] not yet supported.\n";
+  }
+  else if (_key == "max_step_size")
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    this->dtWorld->setTimeStep(value);
+  }
+  else
+  {
+    gzwarn << _key << " is not supported in DART" << std::endl;
+    return false;
+  }
+  return true;
+}
+
+//////////////////////////////////////////////////
+boost::any DARTPhysics::GetParam(DARTPhysics::DARTParam _param) const
+{
+  boost::any value = 0;
+  switch (_param)
+  {
+    case MAX_CONTACTS:
+    {
+      return this->GetParam("max_contacts");
+    }
+    case MIN_STEP_SIZE:
+    {
+      return this->GetParam("min_step_size");
+    }
+    default:
+    {
+      gzwarn << "Attribute not supported in bullet" << std::endl;
+      break;
+    }
+  }
+  return value;
+}
+
+//////////////////////////////////////////////////
+dart::simulation::World *DARTPhysics::GetDARTWorld()
+{
+  return this->dtWorld;
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::OnRequest(ConstRequestPtr &_msg)
+{
+  msgs::Response response;
+  response.set_id(_msg->id());
+  response.set_request(_msg->request());
+  response.set_response("success");
+  std::string *serializedData = response.mutable_serialized_data();
+
+  if (_msg->request() == "physics_info")
+  {
+    msgs::Physics physicsMsg;
+    physicsMsg.set_type(msgs::Physics::DART);
+    physicsMsg.mutable_gravity()->CopyFrom(msgs::Convert(this->GetGravity()));
+    physicsMsg.set_enable_physics(this->world->GetEnablePhysicsEngine());
+    physicsMsg.set_real_time_update_rate(this->realTimeUpdateRate);
+    physicsMsg.set_real_time_factor(this->targetRealTimeFactor);
+    physicsMsg.set_max_step_size(this->maxStepSize);
+
+    response.set_type(physicsMsg.GetTypeName());
+    physicsMsg.SerializeToString(serializedData);
+    this->responsePub->Publish(response);
+  }
+}
+
+//////////////////////////////////////////////////
+void DARTPhysics::OnPhysicsMsg(ConstPhysicsPtr& _msg)
+{
+  if (_msg->has_enable_physics())
+    this->world->EnablePhysicsEngine(_msg->enable_physics());
+
+  if (_msg->has_gravity())
+    this->SetGravity(msgs::Convert(_msg->gravity()));
+
+  if (_msg->has_real_time_factor())
+    this->SetTargetRealTimeFactor(_msg->real_time_factor());
+
+  if (_msg->has_real_time_update_rate())
+  {
+    this->SetRealTimeUpdateRate(_msg->real_time_update_rate());
+  }
+
+  if (_msg->has_max_step_size())
+  {
+    this->SetMaxStepSize(_msg->max_step_size());
+  }
+
+  /// Make sure all models get at least on update cycle.
+  this->world->EnableAllModels();
+
+  // Parent class handles many generic parameters
+  PhysicsEngine::OnPhysicsMsg(_msg);
+}
+
+//////////////////////////////////////////////////
+DARTLinkPtr DARTPhysics::FindDARTLink(
+    const dart::dynamics::BodyNode *_dtBodyNode)
+{
+  DARTLinkPtr res;
+
+  const Model_V& models = this->world->GetModels();
+
+  for (Model_V::const_iterator itModel = models.begin();
+       itModel != models.end(); ++itModel)
+  {
+    const Link_V& links = (*itModel)->GetLinks();
+
+    for (Link_V::const_iterator itLink = links.begin();
+         itLink != links.end(); ++itLink)
+    {
+      DARTLinkPtr dartLink = boost::dynamic_pointer_cast<DARTLink>(*itLink);
+
+      if (dartLink->GetDARTBodyNode() == _dtBodyNode)
+      {
+        res = dartLink;
+        break;
+      }
+    }
+  }
+
+  return res;
+}
+
diff --git a/gazebo/physics/dart/DARTPhysics.hh b/gazebo/physics/dart/DARTPhysics.hh
new file mode 100644
index 0000000..18d9a5e
--- /dev/null
+++ b/gazebo/physics/dart/DARTPhysics.hh
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTPHYSICS_HH_
+#define _GAZEBO_DARTPHYSICS_HH_
+
+#include <string>
+
+#include <boost/thread/thread.hpp>
+#include <boost/thread/mutex.hpp>
+
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/Shape.hh"
+
+#include "gazebo/physics/dart/dart_inc.h"
+#include "gazebo/physics/dart/DARTTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_dart DART Physics
+    /// \{
+
+    /// \brief DART physics engine
+    class GAZEBO_VISIBLE DARTPhysics : public PhysicsEngine
+    {
+      /// \enum DARTParam
+      /// \brief DART physics parameter types.
+      public: enum DARTParam
+      {
+        // /// \brief Solve type
+        // SOLVER_TYPE,
+
+        // /// \brief Constraint force mixing
+        // GLOBAL_CFM,
+
+        // /// \brief Error reduction parameter
+        // GLOBAL_ERP,
+
+        // /// \brief Number of iterations
+        // PGS_ITERS,
+
+        // /// \brief SOR over-relaxation parameter
+        // SOR,
+
+        // /// \brief Surface layer depth
+        // CONTACT_SURFACE_LAYER,
+
+        /// \brief Maximum number of contacts
+        MAX_CONTACTS,
+
+        /// \brief Minimum step size
+        MIN_STEP_SIZE
+      };
+
+      /// \brief Constructor
+      public: DARTPhysics(WorldPtr _world);
+
+      /// \brief Destructor
+      public: virtual ~DARTPhysics();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual void Fini();
+
+      // Documentation inherited
+      public: virtual void Reset();
+
+      // Documentation inherited
+      public: virtual void InitForThread();
+
+      // Documentation inherited
+      public: virtual void UpdateCollision();
+
+      // Documentation inherited
+      public: virtual void UpdatePhysics();
+
+      // Documentation inherited
+      public: virtual std::string GetType() const;
+
+      // Documentation inherited
+      public: virtual void SetSeed(uint32_t _seed);
+
+      // Documentation inherited
+      public: virtual ModelPtr CreateModel(BasePtr _parent);
+
+      // Documentation inherited
+      public: virtual LinkPtr CreateLink(ModelPtr _parent);
+
+      // Documentation inherited
+      public: virtual CollisionPtr CreateCollision(const std::string &_type,
+                                                   LinkPtr _body);
+
+      // Documentation inherited
+      public: virtual JointPtr CreateJoint(const std::string &_type,
+                                           ModelPtr _parent);
+
+      // Documentation inherited
+      public: virtual ShapePtr CreateShape(const std::string &_shapeType,
+                                           CollisionPtr _collision);
+
+      // Documentation inherited
+      public: virtual void SetGravity(const gazebo::math::Vector3 &_gravity);
+
+      // Documentation inherited
+      public: virtual void DebugPrint() const;
+
+      // Documentation inherited
+      public: virtual boost::any GetParam(const std::string &_key) const;
+
+      // Documentation inherited
+      public: virtual bool SetParam(const std::string &_key,
+                  const boost::any &_value);
+
+      /// \brief Get an parameter of the physics engine
+      /// \sa boost::any GetParam(const std::string &_key) const
+      /// \param[in] _param A parameter listed in the ODEParam enum
+      /// \return The value of the parameter
+      public: virtual boost::any GetParam(DARTParam _param) const
+                GAZEBO_DEPRECATED(3.0);
+
+      /// \brief Get pointer to DART World associated with this DART Physics.
+      /// \return The pointer to DART World.
+      public: dart::simulation::World *GetDARTWorld();
+
+      // Documentation inherited
+      protected: virtual void OnRequest(ConstRequestPtr &_msg);
+
+      // Documentation inherited
+      protected: virtual void OnPhysicsMsg(ConstPhysicsPtr &_msg);
+
+      /// \brief Find DART Link corresponding to DART BodyNode.
+      /// \param[in] _dtBodyNode The DART BodyNode.
+      /// \return Pointer to the DART Link.
+      private: DARTLinkPtr FindDARTLink(
+          const dart::dynamics::BodyNode *_dtBodyNode);
+
+      /// \brief Pointer to DART World associated with this DART Physics.
+      private: dart::simulation::World *dtWorld;
+    };
+
+  /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTPlaneShape.hh b/gazebo/physics/dart/DARTPlaneShape.hh
new file mode 100644
index 0000000..6ae8f6b
--- /dev/null
+++ b/gazebo/physics/dart/DARTPlaneShape.hh
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_DARTPLANESHAPE_HH_
+#define _GAZEBO_DARTPLANESHAPE_HH_
+
+#include "gazebo/physics/PlaneShape.hh"
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief An DART Plane shape.
+    class GAZEBO_VISIBLE DARTPlaneShape : public PlaneShape
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent Collision.
+      public: explicit DARTPlaneShape(CollisionPtr _parent)
+              : PlaneShape(_parent) {}
+
+      /// \brief Destructor.
+      public: virtual ~DARTPlaneShape() {}
+
+      // Documentation inherited
+      public: virtual void CreatePlane()
+      {
+        PlaneShape::CreatePlane();
+
+        DARTCollisionPtr dartCollisionParent =
+            boost::dynamic_pointer_cast<DARTCollision>(this->collisionParent);
+
+        // math::Vector3 n = this->GetNormal();
+
+        dart::dynamics::BodyNode *dtBodyNode =
+            dartCollisionParent->GetDARTBodyNode();
+        dart::dynamics::BoxShape *dtBoxShape =
+            new dart::dynamics::BoxShape(Eigen::Vector3d(2100, 2100, 0.01));
+        dtBodyNode->addCollisionShape(dtBoxShape);
+        dtBoxShape->setOffset(Eigen::Vector3d(0.0, 0.0, -0.005));
+        dartCollisionParent->SetDARTCollisionShape(dtBoxShape, false);
+      }
+
+      // Documentation inherited
+      public: virtual void SetAltitude(const math::Vector3 &_pos)
+      {
+        PlaneShape::SetAltitude(_pos);
+      }
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTRayShape.cc b/gazebo/physics/dart/DARTRayShape.cc
new file mode 100644
index 0000000..30fe1b2
--- /dev/null
+++ b/gazebo/physics/dart/DARTRayShape.cc
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Assert.hh"
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/physics/dart/DARTTypes.hh"
+#include "gazebo/physics/dart/DARTLink.hh"
+#include "gazebo/physics/dart/DARTCollision.hh"
+#include "gazebo/physics/dart/DARTRayShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTRayShape::DARTRayShape(PhysicsEnginePtr _physicsEngine)
+  : RayShape(_physicsEngine)
+{
+  this->SetName("DART_ray_shape");
+  this->physicsEngine =
+    boost::static_pointer_cast<DARTPhysics>(_physicsEngine);
+}
+
+//////////////////////////////////////////////////
+DARTRayShape::DARTRayShape(CollisionPtr _parent)
+    : RayShape(_parent)
+{
+  this->SetName("DART_ray_shape");
+  this->physicsEngine = boost::static_pointer_cast<DARTPhysics>(
+      this->collisionParent->GetWorld()->GetPhysicsEngine());
+}
+
+//////////////////////////////////////////////////
+DARTRayShape::~DARTRayShape()
+{
+}
+
+//////////////////////////////////////////////////
+void DARTRayShape::Update()
+{
+  // Not implemented yet, please see issue #911
+}
+
+//////////////////////////////////////////////////
+void DARTRayShape::GetIntersection(double &_dist, std::string &_entity)
+{
+  _dist = 0;
+  _entity = "";
+
+  if (this->physicsEngine)
+  {
+  }
+
+  // Not implemented yet, please see issue #911
+}
+
+//////////////////////////////////////////////////
+void DARTRayShape::SetPoints(const math::Vector3& _posStart,
+                             const math::Vector3& _posEnd)
+{
+  RayShape::SetPoints(_posStart, _posEnd);
+
+  // Not implemented yet, please see issue #911
+}
diff --git a/gazebo/physics/dart/DARTRayShape.hh b/gazebo/physics/dart/DARTRayShape.hh
new file mode 100644
index 0000000..96ea048
--- /dev/null
+++ b/gazebo/physics/dart/DARTRayShape.hh
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTRAYSHAPE_HH_
+#define _GAZEBO_DARTRAYSHAPE_HH_
+
+#include <string>
+
+#include "gazebo/physics/RayShape.hh"
+#include "gazebo/physics/Shape.hh"
+#include "gazebo/physics/dart/DARTTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_dart DART Physics
+    /// \{
+
+    /// \brief Ray collision
+    class GAZEBO_VISIBLE DARTRayShape : public RayShape
+    {
+      /// \brief Constructor for a global ray.
+      /// \param[in] _physicsEngine Pointer to the physics engine.
+      public: explicit DARTRayShape(PhysicsEnginePtr _physicsEngine);
+
+      /// \brief Constructor.
+      /// \param[in] _collision Collision object this ray is attached to.
+      public: explicit DARTRayShape(CollisionPtr _collision);
+
+      /// \brief Destructor.
+      public: virtual ~DARTRayShape();
+
+      /// \brief Update the ray collision
+      public: virtual void Update();
+
+      /// \brief Get the nearest intersection
+      /// \param[out] _dist Distance to the intersection.
+      /// \param[out] _entity Name of the entity that was hit.
+      public: virtual void GetIntersection(double &_dist, std::string &_entity);
+
+      /// \brief Set the ray based on starting and ending points relative to
+      ///        the body
+      /// \param[in] _posStart Start position, relative the body
+      /// \param[in] _posEnd End position, relative to the body
+      public: virtual void SetPoints(const math::Vector3 &_posStart,
+                                     const math::Vector3 &_posEnd);
+
+      /// \brief Pointer to the DART physics engine
+      private: DARTPhysicsPtr physicsEngine;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTScrewJoint.cc b/gazebo/physics/dart/DARTScrewJoint.cc
new file mode 100644
index 0000000..4a209e8
--- /dev/null
+++ b/gazebo/physics/dart/DARTScrewJoint.cc
@@ -0,0 +1,245 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <boost/bind.hpp>
+
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/dart/DARTScrewJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTScrewJoint::DARTScrewJoint(BasePtr _parent)
+    : ScrewJoint<DARTJoint>(_parent),
+      dartScrewJoint(new dart::dynamics::ScrewJoint())
+{
+  this->dtJoint = dartScrewJoint;
+}
+
+//////////////////////////////////////////////////
+DARTScrewJoint::~DARTScrewJoint()
+{
+  delete dartScrewJoint;
+}
+
+//////////////////////////////////////////////////
+void DARTScrewJoint::Load(sdf::ElementPtr _sdf)
+{
+  ScrewJoint<DARTJoint>::Load(_sdf);
+  this->SetThreadPitch(0, this->threadPitch);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTScrewJoint::GetAnchor(unsigned int /*index*/) const
+{
+  gzerr << "DARTScrewJoint::GetAnchor not implemented, return 0 vector.\n";
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+void DARTScrewJoint::SetAnchor(unsigned int /*index*/,
+    const math::Vector3 &/*_anchor*/)
+{
+  gzerr << "DARTScrewJoint::SetAnchor not implemented.\n";
+}
+
+//////////////////////////////////////////////////
+void DARTScrewJoint::Init()
+{
+  ScrewJoint<DARTJoint>::Init();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTScrewJoint::GetGlobalAxis(unsigned int _index) const
+{
+  Eigen::Vector3d globalAxis = Eigen::Vector3d::UnitX();
+
+  if (_index == 0)
+  {
+    Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                          this->dtJoint->getTransformFromChildBodyNode();
+    Eigen::Vector3d axis = this->dartScrewJoint->getAxis();
+    globalAxis = T.linear() * axis;
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  // TODO: Issue #494
+  // See: https://bitbucket.org/osrf/gazebo/issue/494
+  // joint-axis-reference-frame-doesnt-match
+  return DARTTypes::ConvVec3(globalAxis);
+}
+
+//////////////////////////////////////////////////
+void DARTScrewJoint::SetAxis(unsigned int _index, const math::Vector3 &_axis)
+{
+  if (_index == 0)
+  {
+    // TODO: Issue #494
+    // See: https://bitbucket.org/osrf/gazebo/issue/494
+    // joint-axis-reference-frame-doesnt-match
+    Eigen::Vector3d dartVec3 = DARTTypes::ConvVec3(_axis);
+    Eigen::Isometry3d dartTransfJointLeftToParentLink
+        = this->dtJoint->getTransformFromParentBodyNode().inverse();
+    dartVec3 = dartTransfJointLeftToParentLink.linear() * dartVec3;
+
+    this->dartScrewJoint->setAxis(dartVec3);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+}
+
+//////////////////////////////////////////////////
+double DARTScrewJoint::GetVelocity(unsigned int _index) const
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_dq();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTScrewJoint::SetVelocity(unsigned int _index, double _vel)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_dq(_vel);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+void DARTScrewJoint::SetThreadPitch(unsigned int _index, double _threadPitch)
+{
+  if (_index == 0)
+    this->dartScrewJoint->setPitch(_threadPitch);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+void DARTScrewJoint::SetThreadPitch(double _threadPitch)
+{
+  this->SetThreadPitch(0, _threadPitch);
+}
+
+//////////////////////////////////////////////////
+double DARTScrewJoint::GetThreadPitch(unsigned int _index)
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dartScrewJoint->getPitch();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+double DARTScrewJoint::GetThreadPitch()
+{
+  return this->GetThreadPitch(0);
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTScrewJoint::GetAngleImpl(unsigned int _index) const
+{
+  math::Angle result;
+
+  if (_index == 0)
+  {
+    double radianAngle = this->dtJoint->getGenCoord(0)->get_q();
+    result.SetFromRadian(radianAngle);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTScrewJoint::SetMaxForce(unsigned int _index, double _force)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tauMax(_force);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+double DARTScrewJoint::GetMaxForce(unsigned int _index)
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_tauMax();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTScrewJoint::SetForceImpl(unsigned int _index, double _effort)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tau(_effort);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTScrewJoint::GetHighStop(unsigned int _index)
+{
+  switch (_index)
+  {
+  case 0:
+    return this->dtJoint->getGenCoord(_index)->get_qMax();
+  default:
+    gzerr << "Invalid index[" << _index << "]\n";
+  };
+
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTScrewJoint::GetLowStop(unsigned int _index)
+{
+  switch (_index)
+  {
+  case 0:
+    return this->dtJoint->getGenCoord(_index)->get_qMin();
+  default:
+    gzerr << "Invalid index[" << _index << "]\n";
+  };
+
+  return math::Angle();
+}
diff --git a/gazebo/physics/dart/DARTScrewJoint.hh b/gazebo/physics/dart/DARTScrewJoint.hh
new file mode 100644
index 0000000..41e5237
--- /dev/null
+++ b/gazebo/physics/dart/DARTScrewJoint.hh
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTSCREWJOINT_HH_
+#define _GAZEBO_DARTSCREWJOINT_HH_
+
+#include "gazebo/physics/ScrewJoint.hh"
+#include "gazebo/physics/dart/DARTJoint.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief A screw joint.
+    class GAZEBO_VISIBLE DARTScrewJoint : public ScrewJoint<DARTJoint>
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Pointer to the Link that is the joint' parent
+      public: DARTScrewJoint(BasePtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~DARTScrewJoint();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAnchor(unsigned int _index,
+                  const math::Vector3 &_anchor);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited
+      public: virtual void SetThreadPitch(unsigned int _index,
+                  double _threadPitch);
+
+      ///  \copydoc ScrewJoint::SetThreadPitch
+      public: virtual void SetThreadPitch(double _threadPitch);
+
+      // Documentation inherited
+      public: virtual double GetThreadPitch(unsigned int _index);
+
+      ///  \copydoc ScrewJoint::GetThreadPitch
+      public: virtual double GetThreadPitch();
+
+      // Documentation inherited
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetVelocity(unsigned int _index, double _vel);
+
+      // Documentation inherited
+      public: virtual void SetMaxForce(unsigned int _index, double _force);
+
+      // Documentation inherited
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
+
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
+
+      /// \brief Universal joint of DART
+      protected: dart::dynamics::ScrewJoint *dartScrewJoint;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTSliderJoint.cc b/gazebo/physics/dart/DARTSliderJoint.cc
new file mode 100644
index 0000000..b3d2798
--- /dev/null
+++ b/gazebo/physics/dart/DARTSliderJoint.cc
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/bind.hpp>
+
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/dart/DARTSliderJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTSliderJoint::DARTSliderJoint(BasePtr _parent)
+    : SliderJoint<DARTJoint>(_parent),
+      dtPrismaticJoint(new dart::dynamics::PrismaticJoint())
+{
+  this->dtJoint = this->dtPrismaticJoint;
+}
+
+//////////////////////////////////////////////////
+DARTSliderJoint::~DARTSliderJoint()
+{
+  delete dtPrismaticJoint;
+}
+
+//////////////////////////////////////////////////
+void DARTSliderJoint::Load(sdf::ElementPtr _sdf)
+{
+  SliderJoint<DARTJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void DARTSliderJoint::Init()
+{
+  SliderJoint<DARTJoint>::Init();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTSliderJoint::GetAnchor(unsigned int /*_index*/) const
+{
+  Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                        this->dtJoint->getTransformFromChildBodyNode();
+  Eigen::Vector3d worldOrigin = T.translation();
+
+  return DARTTypes::ConvVec3(worldOrigin);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTSliderJoint::GetGlobalAxis(unsigned int _index) const
+{
+  Eigen::Vector3d globalAxis = Eigen::Vector3d::UnitX();
+
+  if (_index == 0)
+  {
+    Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                          this->dtJoint->getTransformFromChildBodyNode();
+    Eigen::Vector3d axis = this->dtPrismaticJoint->getAxis();
+    globalAxis = T.linear() * axis;
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  // TODO: Issue #494
+  // See: https://bitbucket.org/osrf/gazebo/issue/494
+  // joint-axis-reference-frame-doesnt-match
+  return DARTTypes::ConvVec3(globalAxis);
+}
+
+//////////////////////////////////////////////////
+void DARTSliderJoint::SetAxis(unsigned int _index, const math::Vector3 &_axis)
+{
+  if (_index == 0)
+  {
+    // TODO: Issue #494
+    // See: https://bitbucket.org/osrf/gazebo/issue/494
+    // joint-axis-reference-frame-doesnt-match
+    Eigen::Vector3d dartVec3 = DARTTypes::ConvVec3(_axis);
+    Eigen::Isometry3d dartTransfJointLeftToParentLink
+        = this->dtJoint->getTransformFromParentBodyNode().inverse();
+    dartVec3 = dartTransfJointLeftToParentLink.linear() * dartVec3;
+
+    this->dtPrismaticJoint->setAxis(dartVec3);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTSliderJoint::GetAngleImpl(unsigned int _index) const
+{
+  math::Angle result;
+
+  if (_index == 0)
+  {
+    double radianAngle = this->dtJoint->getGenCoord(0)->get_q();
+    result.SetFromRadian(radianAngle);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTSliderJoint::SetVelocity(unsigned int _index, double _vel)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_dq(_vel);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+double DARTSliderJoint::GetVelocity(unsigned int _index) const
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_dq();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTSliderJoint::SetMaxForce(unsigned int _index, double _force)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tauMax(_force);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+double DARTSliderJoint::GetMaxForce(unsigned int _index)
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_tauMax();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTSliderJoint::SetForceImpl(unsigned int _index, double _effort)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tau(_effort);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
diff --git a/gazebo/physics/dart/DARTSliderJoint.hh b/gazebo/physics/dart/DARTSliderJoint.hh
new file mode 100644
index 0000000..0721b4a
--- /dev/null
+++ b/gazebo/physics/dart/DARTSliderJoint.hh
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTSLIDERJOINT_HH_
+#define _GAZEBO_DARTSLIDERJOINT_HH_
+
+#include "gazebo/physics/SliderJoint.hh"
+#include "gazebo/physics/dart/DARTJoint.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief A slider joint
+    class GAZEBO_VISIBLE DARTSliderJoint : public SliderJoint<DARTJoint>
+    {
+      /// \brief Constructor
+      /// \param[in] _parent Pointer to the Link that is the joint' parent
+      public: DARTSliderJoint(BasePtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~DARTSliderJoint();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetVelocity(unsigned int _index, double _vel);
+
+      // Documentation inherited
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetMaxForce(unsigned int _index, double _force);
+
+      // Documentation inherited
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
+
+      /// \brief Prismatic joint of DART
+      protected: dart::dynamics::PrismaticJoint *dtPrismaticJoint;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTSphereShape.hh b/gazebo/physics/dart/DARTSphereShape.hh
new file mode 100644
index 0000000..0a7ef76
--- /dev/null
+++ b/gazebo/physics/dart/DARTSphereShape.hh
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_DARTSPHERESHAPE_HH_
+#define _GAZEBO_DARTSPHERESHAPE_HH_
+
+#include "gazebo/physics/dart/DARTPhysics.hh"
+#include "gazebo/physics/dart/DARTCollision.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/SphereShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief A DART sphere shape
+    class GAZEBO_VISIBLE DARTSphereShape : public SphereShape
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent Collision.
+      public: explicit DARTSphereShape(DARTCollisionPtr _parent)
+              : SphereShape(_parent) {}
+
+      /// \brief Destructor.
+      public: virtual ~DARTSphereShape() {}
+
+      // Documentation inherited.
+      public: virtual void SetRadius(double _radius)
+      {
+        if (_radius < 0)
+        {
+          gzerr << "Sphere shape does not support negative radius.\n";
+          return;
+        }
+        if (math::equal(_radius, 0.0))
+        {
+          // Warn user, but still create shape with very small value
+          // otherwise later resize operations using setLocalScaling
+          // will not be possible
+          gzwarn << "Setting sphere shape's radius to zero is not supported "
+                 << "in DART, using 1e-4.\n";
+          _radius = 1e-4;
+        }
+
+        SphereShape::SetRadius(_radius);
+
+        DARTCollisionPtr dartCollisionParent =
+            boost::dynamic_pointer_cast<DARTCollision>(this->collisionParent);
+
+        if (dartCollisionParent->GetDARTCollisionShape() == NULL)
+        {
+          dart::dynamics::BodyNode *dtBodyNode =
+              dartCollisionParent->GetDARTBodyNode();
+          dart::dynamics::EllipsoidShape *dtEllisoidShape =
+              new dart::dynamics::EllipsoidShape(Eigen::Vector3d(_radius*2.0,
+                                                                 _radius*2.0,
+                                                                 _radius*2.0));
+          dtBodyNode->addCollisionShape(dtEllisoidShape);
+          dartCollisionParent->SetDARTCollisionShape(dtEllisoidShape);
+        }
+        else
+        {
+          dart::dynamics::EllipsoidShape *dtEllipsoidShape =
+              dynamic_cast<dart::dynamics::EllipsoidShape*>(
+                dartCollisionParent->GetDARTCollisionShape());
+          dtEllipsoidShape->setDim(Eigen::Vector3d(_radius*2.0,
+                                                   _radius*2.0,
+                                                   _radius*2.0));
+        }
+      }
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/DARTTypes.hh b/gazebo/physics/dart/DARTTypes.hh
new file mode 100644
index 0000000..f42e45d
--- /dev/null
+++ b/gazebo/physics/dart/DARTTypes.hh
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTTYPES_HH_
+#define _GAZEBO_DARTTYPES_HH_
+
+#include <boost/shared_ptr.hpp>
+#include "gazebo/math/Pose.hh"
+#include "gazebo/physics/dart/dart_inc.h"
+#include "gazebo/util/system.hh"
+
+/// \file
+/// \ingroup gazebo_physics
+/// \ingroup gazebo_physics_dart
+/// \brief DART wrapper forward declarations and typedefs
+namespace gazebo
+{
+  namespace physics
+  {
+    class DARTPhysics;
+    class DARTModel;
+    class DARTLink;
+    class DARTJoint;
+    class DARTCollision;
+    class DARTRayShape;
+
+    typedef boost::shared_ptr<DARTPhysics>   DARTPhysicsPtr;
+    typedef boost::shared_ptr<DARTModel>     DARTModelPtr;
+    typedef boost::shared_ptr<DARTLink>      DARTLinkPtr;
+    typedef boost::shared_ptr<DARTJoint>     DARTJointPtr;
+    typedef boost::shared_ptr<DARTCollision> DARTCollisionPtr;
+    typedef boost::shared_ptr<DARTRayShape>  DARTRayShapePtr;
+
+    /// \addtogroup gazebo_physics_dart
+    /// \{
+
+    /// \class DARTTypes DARTTypes.hh
+    /// \brief A set of functions for converting between the math types used
+    ///        by gazebo and dart.
+    class GAZEBO_VISIBLE DARTTypes
+    {
+      /// \brief
+      public: static Eigen::Vector3d ConvVec3(const math::Vector3 &_vec3)
+        {
+            return Eigen::Vector3d(_vec3.x, _vec3.y, _vec3.z);
+        }
+
+        /// \brief
+      public: static math::Vector3 ConvVec3(const Eigen::Vector3d &_vec3)
+        {
+            return math::Vector3(_vec3.x(), _vec3.y(), _vec3.z());
+        }
+
+        /// \brief
+      public: static Eigen::Quaterniond ConvQuat(const math::Quaternion &_quat)
+        {
+            return Eigen::Quaterniond(_quat.w, _quat.x, _quat.y, _quat.z);
+        }
+
+        /// \brief
+      public: static math::Quaternion ConvQuat(const Eigen::Quaterniond &_quat)
+        {
+            return math::Quaternion(_quat.w(), _quat.x(), _quat.y(), _quat.z());
+        }
+
+        /// \brief
+      public: static Eigen::Isometry3d ConvPose(const math::Pose &_pose)
+        {
+            // Below line doesn't work with 'libeigen3-dev is 3.0.5-1'
+            // return Eigen::Translation3d(ConvVec3(_pose.pos)) *
+            //        ConvQuat(_pose.rot);
+
+            Eigen::Isometry3d res;
+
+            res.translation() = ConvVec3(_pose.pos);
+            res.linear() = Eigen::Matrix3d(ConvQuat(_pose.rot));
+
+            return res;
+        }
+
+        /// \brief
+      public: static math::Pose ConvPose(const Eigen::Isometry3d &_T)
+        {
+            math::Pose pose;
+            pose.pos = ConvVec3(_T.translation());
+            pose.rot = ConvQuat(Eigen::Quaterniond(_T.linear()));
+            return pose;
+        }
+    };
+  }
+}
+
+#endif
diff --git a/gazebo/physics/dart/DARTUniversalJoint.cc b/gazebo/physics/dart/DARTUniversalJoint.cc
new file mode 100644
index 0000000..c1570a1
--- /dev/null
+++ b/gazebo/physics/dart/DARTUniversalJoint.cc
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/dart/DARTUniversalJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+DARTUniversalJoint::DARTUniversalJoint(BasePtr _parent)
+    : UniversalJoint<DARTJoint>(_parent),
+      dtUniveralJoint(new dart::dynamics::UniversalJoint())
+{
+  this->dtJoint = dtUniveralJoint;
+}
+
+//////////////////////////////////////////////////
+DARTUniversalJoint::~DARTUniversalJoint()
+{
+  delete dtUniveralJoint;
+}
+
+//////////////////////////////////////////////////
+void DARTUniversalJoint::Load(sdf::ElementPtr _sdf)
+{
+  UniversalJoint<DARTJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void DARTUniversalJoint::Init()
+{
+  UniversalJoint<DARTJoint>::Init();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTUniversalJoint::GetAnchor(unsigned int /*index*/) const
+{
+  Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                        this->dtJoint->getTransformFromChildBodyNode();
+  Eigen::Vector3d worldOrigin = T.translation();
+
+  return DARTTypes::ConvVec3(worldOrigin);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 DARTUniversalJoint::GetGlobalAxis(unsigned int _index) const
+{
+  Eigen::Vector3d globalAxis = Eigen::Vector3d::UnitX();
+
+  if (_index == 0)
+  {
+    Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                          this->dtJoint->getLocalTransform().inverse() *
+                          this->dtJoint->getTransformFromParentBodyNode();
+    Eigen::Vector3d axis = this->dtUniveralJoint->getAxis1();
+
+    globalAxis = T.linear() * axis;
+  }
+  else if (_index == 1)
+  {
+    Eigen::Isometry3d T = this->dtChildBodyNode->getWorldTransform() *
+                          this->dtJoint->getTransformFromChildBodyNode();
+    Eigen::Vector3d axis = this->dtUniveralJoint->getAxis2();
+
+    globalAxis = T.linear() * axis;
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  // TODO: Issue #494
+  // See: https://bitbucket.org/osrf/gazebo/issue/494
+  // joint-axis-reference-frame-doesnt-match
+  return DARTTypes::ConvVec3(globalAxis);
+}
+
+//////////////////////////////////////////////////
+void DARTUniversalJoint::SetAxis(unsigned int _index,
+    const math::Vector3 &_axis)
+{
+  Eigen::Vector3d dtAxis = DARTTypes::ConvVec3(_axis);
+
+  if (_index == 0)
+  {
+    // TODO: Issue #494
+    // See: https://bitbucket.org/osrf/gazebo/issue/494
+    // joint-axis-reference-frame-doesnt-match
+    Eigen::Isometry3d dtTransfJointLeftToParentLink
+        = this->dtJoint->getTransformFromParentBodyNode().inverse();
+    dtAxis = dtTransfJointLeftToParentLink.linear() * dtAxis;
+
+    this->dtUniveralJoint->setAxis1(dtAxis);
+  }
+  else if (_index == 1)
+  {
+    // TODO: Issue #494
+    // See: https://bitbucket.org/osrf/gazebo/issue/494
+    // joint-axis-reference-frame-doesnt-match
+    Eigen::Isometry3d dtTransfJointLeftToParentLink
+        = this->dtJoint->getTransformFromParentBodyNode().inverse();
+    dtAxis = dtTransfJointLeftToParentLink.linear() * dtAxis;
+
+    this->dtUniveralJoint->setAxis2(dtAxis);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle DARTUniversalJoint::GetAngleImpl(unsigned int _index) const
+{
+  math::Angle result;
+
+  if (_index == 0)
+  {
+    double radianAngle = this->dtJoint->getGenCoord(0)->get_q();
+    result.SetFromRadian(radianAngle);
+  }
+  else if (_index == 1)
+  {
+    double radianAngle = this->dtJoint->getGenCoord(1)->get_q();
+    result.SetFromRadian(radianAngle);
+  }
+  else
+  {
+    gzerr << "Invalid index[" << _index << "]\n";
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+double DARTUniversalJoint::GetVelocity(unsigned int _index) const
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_dq();
+  else if (_index == 1)
+    result = this->dtJoint->getGenCoord(1)->get_dq();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTUniversalJoint::SetVelocity(unsigned int _index, double _vel)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_dq(_vel);
+  else if (_index == 1)
+    this->dtJoint->getGenCoord(1)->set_dq(_vel);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+void DARTUniversalJoint::SetMaxForce(unsigned int _index, double _force)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tauMax(_force);
+  else if (_index == 1)
+    this->dtJoint->getGenCoord(1)->set_tauMax(_force);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
+
+//////////////////////////////////////////////////
+double DARTUniversalJoint::GetMaxForce(unsigned int _index)
+{
+  double result = 0.0;
+
+  if (_index == 0)
+    result = this->dtJoint->getGenCoord(0)->get_tauMax();
+  else if (_index == 1)
+    result = this->dtJoint->getGenCoord(1)->get_tauMax();
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void DARTUniversalJoint::SetForceImpl(unsigned int _index, double _effort)
+{
+  if (_index == 0)
+    this->dtJoint->getGenCoord(0)->set_tau(_effort);
+  else if (_index == 1)
+    this->dtJoint->getGenCoord(1)->set_tau(_effort);
+  else
+    gzerr << "Invalid index[" << _index << "]\n";
+}
diff --git a/gazebo/physics/dart/DARTUniversalJoint.hh b/gazebo/physics/dart/DARTUniversalJoint.hh
new file mode 100644
index 0000000..e0e5f39
--- /dev/null
+++ b/gazebo/physics/dart/DARTUniversalJoint.hh
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DARTUNIVERSALJOINT_HH_
+#define _GAZEBO_DARTUNIVERSALJOINT_HH_
+
+#include "gazebo/physics/UniversalJoint.hh"
+#include "gazebo/physics/dart/DARTJoint.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief A universal joint.
+    class GAZEBO_VISIBLE DARTUniversalJoint : public UniversalJoint<DARTJoint>
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Pointer to the Link that is the joint' parent
+      public: DARTUniversalJoint(BasePtr _parent);
+
+      /// \brief Destuctor.
+      public: virtual ~DARTUniversalJoint();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetVelocity(unsigned int _index, double _vel);
+
+      // Documentation inherited
+      public: virtual void SetMaxForce(unsigned int _index, double _force);
+
+      // Documentation inherited
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
+
+      /// \brief Universal joint of DART
+      protected: dart::dynamics::UniversalJoint *dtUniveralJoint;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/dart/dart_inc.h b/gazebo/physics/dart/dart_inc.h
new file mode 100644
index 0000000..f134d60
--- /dev/null
+++ b/gazebo/physics/dart/dart_inc.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_DART_INC_H_
+#define _GAZEBO_DART_INC_H_
+
+// This disables warning messages for ODE
+#pragma GCC system_header
+
+#include <dart/math/Helpers.h>
+#include <dart/math/Geometry.h>
+
+#include <dart/collision/CollisionDetector.h>
+#include <dart/collision/dart/DARTCollisionDetector.h>
+
+#include <dart/integration/Integrator.h>
+#include <dart/integration/EulerIntegrator.h>
+#include <dart/integration/RK4Integrator.h>
+
+#include <dart/dynamics/BallJoint.h>
+#include <dart/dynamics/BodyNode.h>
+#include <dart/dynamics/BoxShape.h>
+#include <dart/dynamics/CylinderShape.h>
+#include <dart/dynamics/EllipsoidShape.h>
+#include <dart/dynamics/FreeJoint.h>
+#include <dart/dynamics/GenCoord.h>
+#include <dart/dynamics/Joint.h>
+#include <dart/dynamics/MeshShape.h>
+#include <dart/dynamics/PrismaticJoint.h>
+#include <dart/dynamics/RevoluteJoint.h>
+#include <dart/dynamics/Shape.h>
+#include <dart/dynamics/Skeleton.h>
+#include <dart/dynamics/ScrewJoint.h>
+#include <dart/dynamics/UniversalJoint.h>
+#include <dart/dynamics/WeldJoint.h>
+
+#include <dart/constraint/Constraint.h>
+#include <dart/constraint/ConstraintDynamics.h>
+
+#include <dart/simulation/World.h>
+
+#endif
diff --git a/gazebo/physics/ode/CMakeLists.txt b/gazebo/physics/ode/CMakeLists.txt
index 95681d6..e577120 100644
--- a/gazebo/physics/ode/CMakeLists.txt
+++ b/gazebo/physics/ode/CMakeLists.txt
@@ -1,48 +1,54 @@
 include (${gazebo_cmake_dir}/GazeboUtils.cmake)
 
 include_directories(SYSTEM ${CMAKE_SOURCE_DIR}/deps/opende/include)
+
 link_directories(
   ${CCD_LIBRARY_DIRS}
 )
 
 
-set (sources ODEPhysics.cc
-             ODECollision.cc
-             ODELink.cc
-             ODEJoint.cc
-             ODESliderJoint.cc
-             ODEHingeJoint.cc
-             ODEHinge2Joint.cc
-             ODEUniversalJoint.cc
-             ODEBallJoint.cc
-             ODETrimeshShape.cc
-             ODERayShape.cc
-             ODEMultiRayShape.cc
-             ODEHeightmapShape.cc
-             ODEScrewJoint.cc
+set (sources
+  ODEBallJoint.cc
+  ODECollision.cc
+  ODEGearboxJoint.cc
+  ODEHeightmapShape.cc
+  ODEHinge2Joint.cc
+  ODEHingeJoint.cc
+  ODEJoint.cc
+  ODELink.cc
+  ODEMeshShape.cc
+  ODEMultiRayShape.cc
+  ODEPhysics.cc
+  ODERayShape.cc
+  ODEScrewJoint.cc
+  ODESliderJoint.cc
+  ODESurfaceParams.cc
+  ODEUniversalJoint.cc
 )
 
 SET (headers
   ode_inc.h
-  ODEPhysics.hh
+  ODEBallJoint.hh
+  ODEBoxShape.hh
   ODECollision.hh
-  ODELink.hh
-  ODEJoint.hh
-  ODESliderJoint.hh
-  ODEHingeJoint.hh
+  ODECylinderShape.hh
+  ODEGearboxJoint.hh
+  ODEHeightmapShape.hh
   ODEHinge2Joint.hh
-  ODEUniversalJoint.hh
-  ODEBallJoint.hh
-  ODETrimeshShape.hh
-  ODERayShape.hh
+  ODEHingeJoint.hh
+  ODEJoint.hh
+  ODELink.hh
+  ODEMeshShape.hh
   ODEMultiRayShape.hh
-  ODEHeightmapShape.hh
-  ODESphereShape.hh
-  ODEBoxShape.hh
+  ODEPhysics.hh
   ODEPlaneShape.hh
-  ODECylinderShape.hh
-  ODETypes.hh
+  ODERayShape.hh
   ODEScrewJoint.hh
+  ODESliderJoint.hh
+  ODESphereShape.hh
+  ODESurfaceParams.hh
+  ODETypes.hh
+  ODEUniversalJoint.hh
 )
 
 set (gtest_sources
@@ -50,13 +56,18 @@ set (gtest_sources
 )
 gz_build_tests(${gtest_sources})
 
-gz_add_library(gazebo_physics_ode ${sources})
-target_link_libraries(gazebo_physics_ode gazebo_ode gazebo_opcode ${TBB_LIBRARIES})
+gz_add_library(gazebo_physics_ode ${headers} ${sources})
+target_link_libraries(gazebo_physics_ode
+  gazebo_ode
+  gazebo_opcode
+  gazebo_math
+  gazebo_common
+  ${TBB_LIBRARIES}
+)
 
 gz_install_library(gazebo_physics_ode)
 
 # unit tests
 set (gtest_sources
-  ODEJoint_TEST.cc
 )
 gz_build_tests(${gtest_sources})
diff --git a/gazebo/physics/ode/ODEBallJoint.cc b/gazebo/physics/ode/ODEBallJoint.cc
index 4bddcae..489abc7 100644
--- a/gazebo/physics/ode/ODEBallJoint.cc
+++ b/gazebo/physics/ode/ODEBallJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -41,7 +41,7 @@ ODEBallJoint::~ODEBallJoint()
 }
 
 //////////////////////////////////////////////////
-math::Vector3 ODEBallJoint::GetAnchor(int /*_index*/) const
+math::Vector3 ODEBallJoint::GetAnchor(unsigned int /*_index*/) const
 {
   dVector3 result;
   if (this->jointId)
@@ -54,10 +54,88 @@ math::Vector3 ODEBallJoint::GetAnchor(int /*_index*/) const
 
 
 //////////////////////////////////////////////////
-void ODEBallJoint::SetAnchor(int /*_index*/, const math::Vector3 &_anchor)
+void ODEBallJoint::SetAnchor(unsigned int /*_index*/,
+    const math::Vector3 &_anchor)
 {
   if (this->jointId)
     dJointSetBallAnchor(jointId, _anchor.x, _anchor.y, _anchor.z);
   else
     gzerr << "ODE Joint ID is invalid\n";
 }
+
+//////////////////////////////////////////////////
+void ODEBallJoint::SetForceImpl(unsigned int /*_index*/, double /*_torque*/)
+{
+  gzerr << "Not implemented";
+}
+
+//////////////////////////////////////////////////
+math::Vector3 ODEBallJoint::GetGlobalAxis(unsigned int /*_index*/) const
+{
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+void ODEBallJoint::SetVelocity(unsigned int /*_index*/, double /*_angle*/)
+{
+}
+
+//////////////////////////////////////////////////
+double ODEBallJoint::GetVelocity(unsigned int /*_index*/) const
+{
+  return 0;
+}
+
+//////////////////////////////////////////////////
+double ODEBallJoint::GetMaxForce(unsigned int /*_index*/)
+{
+  return 0;
+}
+
+//////////////////////////////////////////////////
+void ODEBallJoint::SetMaxForce(unsigned int /*_index*/, double /*_t*/)
+{
+}
+
+//////////////////////////////////////////////////
+math::Angle ODEBallJoint::GetAngleImpl(unsigned int /*_index*/) const
+{
+  return math::Angle(0);
+}
+
+//////////////////////////////////////////////////
+void ODEBallJoint::SetAxis(unsigned int /*_index*/,
+                            const math::Vector3 &/*_axis*/)
+{
+  gzerr << "ODEBallJoint::SetAxis not implemented" << std::endl;
+}
+
+//////////////////////////////////////////////////
+math::Angle ODEBallJoint::GetHighStop(unsigned int /*_index*/)
+{
+  gzerr << "ODEBallJoint::GetHighStop not implemented" << std::endl;
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+math::Angle ODEBallJoint::GetLowStop(unsigned int /*_index*/)
+{
+  gzerr << "ODEBallJoint::GetLowStop not implemented" << std::endl;
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+bool ODEBallJoint::SetHighStop(unsigned int /*_index*/,
+                               const math::Angle &/*_angle*/)
+{
+  gzerr << "ODEBallJoint::SetHighStop not implemented" << std::endl;
+  return false;
+}
+
+//////////////////////////////////////////////////
+bool ODEBallJoint::SetLowStop(unsigned int /*_index*/,
+                              const math::Angle &/*_angle*/)
+{
+  gzerr << "ODEBallJoint::SetLowStop not implemented" << std::endl;
+  return false;
+}
diff --git a/gazebo/physics/ode/ODEBallJoint.hh b/gazebo/physics/ode/ODEBallJoint.hh
index bc36798..061b334 100644
--- a/gazebo/physics/ode/ODEBallJoint.hh
+++ b/gazebo/physics/ode/ODEBallJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,13 +24,14 @@
 
 #include "gazebo/physics/BallJoint.hh"
 #include "gazebo/physics/ode/ODEJoint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief An ODEBallJoint
-    class ODEBallJoint : public BallJoint<ODEJoint>
+    class GAZEBO_VISIBLE ODEBallJoint : public BallJoint<ODEJoint>
     {
       /// \brief Constructor
       /// \param[in] _worldID ODE id of the world.
@@ -41,30 +42,50 @@ namespace gazebo
       public: virtual ~ODEBallJoint();
 
       // Documentation inherited
-      public: virtual math::Vector3 GetAnchor(int _index) const;
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetAnchor(int _index, const math::Vector3 &_anchor);
+      public: virtual void SetAnchor(unsigned int _index,
+                                     const math::Vector3 &_anchor);
 
       // Documentation inherited
-      public: virtual math::Vector3 GetGlobalAxis(int /*_index*/) const
-              {return math::Vector3();}
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetVelocity(int /*index*/, double /*angle*/) {}
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
       // Documentation inherited
-      public: virtual double GetVelocity(int /*index*/) const {return 0;}
+      public: virtual double GetVelocity(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual double GetMaxForce(int /*index*/) {return 0;}
+      public: virtual double GetMaxForce(unsigned int _index);
 
       // Documentation inherited
-      public: virtual void SetMaxForce(int /*index*/, double /*t*/) {}
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
       // Documentation inherited
-      public: virtual math::Angle GetAngleImpl(int /*index*/) const
-              {return math::Angle(0);}
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                                   const math::Vector3 &_axis);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                                       const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                                      const math::Angle &_angle);
+
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _torque);
     };
   }
 }
diff --git a/gazebo/physics/ode/ODEBoxShape.hh b/gazebo/physics/ode/ODEBoxShape.hh
index 027a893..ef22645 100644
--- a/gazebo/physics/ode/ODEBoxShape.hh
+++ b/gazebo/physics/ode/ODEBoxShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,21 +17,22 @@
 #ifndef _ODEBOXSHAPE_HH_
 #define _ODEBOXSHAPE_HH_
 
-#include "math/Vector3.hh"
+#include "gazebo/math/Vector3.hh"
 
-#include "physics/ode/ODEPhysics.hh"
-#include "physics/ode/ODETypes.hh"
-#include "physics/ode/ODECollision.hh"
+#include "gazebo/physics/ode/ODEPhysics.hh"
+#include "gazebo/physics/ode/ODETypes.hh"
+#include "gazebo/physics/ode/ODECollision.hh"
 
-#include "physics/PhysicsTypes.hh"
-#include "physics/BoxShape.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/BoxShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief ODE Box shape
-    class ODEBoxShape : public BoxShape
+    class GAZEBO_VISIBLE ODEBoxShape : public BoxShape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent Collision.
diff --git a/gazebo/physics/ode/ODECollision.cc b/gazebo/physics/ode/ODECollision.cc
index 09a0e40..e9732e7 100644
--- a/gazebo/physics/ode/ODECollision.cc
+++ b/gazebo/physics/ode/ODECollision.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@
 #include "gazebo/common/Console.hh"
 #include "gazebo/math/Box.hh"
 
-#include "gazebo/physics/SurfaceParams.hh"
+#include "gazebo/physics/ode/ODESurfaceParams.hh"
 #include "gazebo/physics/ode/ODEPhysics.hh"
 #include "gazebo/physics/ode/ODELink.hh"
 #include "gazebo/physics/ode/ODECollision.hh"
@@ -40,6 +40,11 @@ ODECollision::ODECollision(LinkPtr _link)
   this->SetName("ODE_Collision");
   this->collisionId = NULL;
   this->onPoseChangeFunc = &ODECollision::OnPoseChangeNull;
+
+  this->SetSpaceId(
+      boost::static_pointer_cast<ODELink>(this->link)->GetSpaceId());
+
+  this->surface.reset(new ODESurfaceParams());
 }
 
 //////////////////////////////////////////////////
@@ -55,14 +60,18 @@ void ODECollision::Load(sdf::ElementPtr _sdf)
 {
   Collision::Load(_sdf);
 
-  this->SetSpaceId(
-      boost::static_pointer_cast<ODELink>(this->link)->GetSpaceId());
-
   if (this->IsStatic())
   {
     this->SetCategoryBits(GZ_FIXED_COLLIDE);
     this->SetCollideBits(~GZ_FIXED_COLLIDE);
   }
+
+  // Force max correcting velocity to zero for certain collision entities
+  if (this->IsStatic() || this->shape->HasType(Base::HEIGHTMAP_SHAPE) ||
+      this->shape->HasType(Base::MAP_SHAPE))
+  {
+    this->GetODESurface()->maxVel = 0.0;
+  }
 }
 
 //////////////////////////////////////////////////
@@ -167,9 +176,6 @@ math::Box ODECollision::GetBoundingBox() const
 
   memset(aabb, 0, 6 * sizeof(dReal));
 
-  if (this->collisionId == NULL)
-    printf("HOW IS THIS NULL\n");
-
   // if (this->collisionId && this->type != Shape::PLANE)
   dGeomGetAABB(this->collisionId, aabb);
 
@@ -192,6 +198,12 @@ void ODECollision::SetSpaceId(dSpaceID _spaceid)
 }
 
 /////////////////////////////////////////////////
+ODESurfaceParamsPtr ODECollision::GetODESurface() const
+{
+  return boost::dynamic_pointer_cast<ODESurfaceParams>(this->surface);
+}
+
+/////////////////////////////////////////////////
 void ODECollision::OnPoseChangeGlobal()
 {
   dQuaternion q;
diff --git a/gazebo/physics/ode/ODECollision.hh b/gazebo/physics/ode/ODECollision.hh
index fe3c784..37abc1d 100644
--- a/gazebo/physics/ode/ODECollision.hh
+++ b/gazebo/physics/ode/ODECollision.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,13 +28,15 @@
 
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/ode/ODETypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief Base class for all ODE collisions.
-    class ODECollision : public Collision
+    class GAZEBO_VISIBLE ODECollision : public Collision
     {
       /// \brief Constructor.
       /// \param[in] _link Parent Link
@@ -82,6 +84,11 @@ namespace gazebo
       /// \param[in] _spaceid ID of an ODE collision space.
       public: void SetSpaceId(dSpaceID _spaceid);
 
+      /// \brief Similar to Collision::GetSurface, but provides dynamically
+      ///        casted pointer to ODESurfaceParams.
+      /// \return Dynamically casted pointer to ODESurfaceParams.
+      public: ODESurfaceParamsPtr GetODESurface() const;
+
       /// \brief Used when this is static to set the posse.
       private: void OnPoseChangeGlobal();
 
diff --git a/gazebo/physics/ode/ODECylinderShape.hh b/gazebo/physics/ode/ODECylinderShape.hh
index 3a5e851..27485c7 100644
--- a/gazebo/physics/ode/ODECylinderShape.hh
+++ b/gazebo/physics/ode/ODECylinderShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,13 +19,14 @@
 
 #include "gazebo/physics/CylinderShape.hh"
 #include "gazebo/physics/ode/ODEPhysics.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief ODE cylinder shape
-    class ODECylinderShape : public CylinderShape
+    class GAZEBO_VISIBLE ODECylinderShape : public CylinderShape
     {
       /// \brief Constructor
       /// \param[in] _parent Collision parent.
diff --git a/gazebo/physics/ode/ODEGearboxJoint.cc b/gazebo/physics/ode/ODEGearboxJoint.cc
new file mode 100644
index 0000000..79a7aec
--- /dev/null
+++ b/gazebo/physics/ode/ODEGearboxJoint.cc
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/bind.hpp>
+
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/ode/ODELink.hh"
+#include "gazebo/physics/ode/ODEGearboxJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+ODEGearboxJoint::ODEGearboxJoint(dWorldID _worldId, BasePtr _parent)
+    : GearboxJoint<ODEJoint>(_parent)
+{
+  this->jointId = dJointCreateGearbox(_worldId, NULL);
+}
+
+//////////////////////////////////////////////////
+ODEGearboxJoint::~ODEGearboxJoint()
+{
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::Init()
+{
+  Joint::Init();
+  LinkPtr link = this->model->GetLink(this->referenceBody);
+  this->SetReferenceBody(link);
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::Load(sdf::ElementPtr _sdf)
+{
+  GearboxJoint<ODEJoint>::Load(_sdf);
+
+  this->SetGearboxRatio(this->gearRatio);
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::SetReferenceBody(LinkPtr _body)
+{
+  ODELinkPtr odelink = boost::dynamic_pointer_cast<ODELink>(_body);
+  dBodyID refId;
+  if (odelink == NULL)
+  {
+    gzwarn << "Reference body not valid, using inertial frame.\n";
+    refId = 0;
+  }
+  else
+  {
+    refId = odelink->GetODEId();
+  }
+
+  dJointSetGearboxReferenceBody(this->jointId, refId);
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::SetGearboxRatio(double _gearRatio)
+{
+  this->gearRatio = _gearRatio;
+  dJointSetGearboxRatio(this->jointId, _gearRatio);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 ODEGearboxJoint::GetGlobalAxis(unsigned int _index) const
+{
+  dVector3 result;
+
+  if (_index == 0)
+    dJointGetGearboxAxis1(this->jointId, result);
+  else if (_index == 1)
+    dJointGetGearboxAxis2(this->jointId, result);
+  else
+    gzerr << "index [" << _index << "] out of range\n";
+
+  return math::Vector3(result[0], result[1], result[2]);
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::SetAxis(unsigned int _index, const math::Vector3 &_axis)
+{
+  ODEJoint::SetAxis(_index, _axis);
+
+  if (this->childLink)
+    this->childLink->SetEnabled(true);
+  if (this->parentLink)
+    this->parentLink->SetEnabled(true);
+
+  /// ODE needs global axis
+  math::Quaternion axisFrame = this->GetAxisFrame(_index);
+  math::Vector3 globalAxis = axisFrame.RotateVector(_axis);
+
+  if (_index == 0)
+  {
+    dJointSetGearboxAxis1(this->jointId, globalAxis.x, globalAxis.y,
+      globalAxis.z);
+  }
+  else if (_index == 1)
+  {
+    dJointSetGearboxAxis2(this->jointId, globalAxis.x, globalAxis.y,
+      globalAxis.z);
+  }
+  else
+    gzerr << "index [" << _index << "] out of range\n";
+}
+
+//////////////////////////////////////////////////
+math::Angle ODEGearboxJoint::GetAngleImpl(unsigned int /*index*/) const
+{
+  gzlog << "GetAngle not implemented for gearbox\n";
+  return math::Angle(0);
+}
+
+//////////////////////////////////////////////////
+double ODEGearboxJoint::GetVelocity(unsigned int /*index*/) const
+{
+  gzlog << "GetVelocity not implemented for gearbox\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::SetVelocity(unsigned int /*index*/, double /*_angle*/)
+{
+  gzlog << "SetVelocity not implemented for gearbox\n";
+  return;
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::SetMaxForce(unsigned int /*index*/, double /*_t*/)
+{
+  gzlog << "SetMaxForce not implemented for gearbox\n";
+  return;
+}
+
+//////////////////////////////////////////////////
+double ODEGearboxJoint::GetMaxForce(unsigned int /*index*/)
+{
+  gzlog << "GetMaxForce not implemented for gearbox\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::SetForceImpl(unsigned int /*_index*/, double /*_effort*/)
+{
+  if (this->jointId)
+    gzlog << "SetForce not implemented for gearbox\n";
+  else
+    gzerr << "ODE Joint ID is invalid\n";
+}
+
+//////////////////////////////////////////////////
+double ODEGearboxJoint::GetParam(unsigned int /*_parameter*/) const
+{
+  gzlog << "GetParam not implemented for gearbox\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::SetParam(unsigned int /*_parameter*/, double /*_value*/)
+{
+  gzlog << "SetParam not implemented for gearbox\n";
+  return;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 ODEGearboxJoint::GetAnchor(unsigned int /*_index*/) const
+{
+  dVector3 result;
+  gzlog << "ODEGearboxJoint::GetAnchor not implemented.\n";
+  return math::Vector3(result[0], result[1], result[2]);
+}
+
+//////////////////////////////////////////////////
+void ODEGearboxJoint::SetAnchor(unsigned int /*_index*/,
+  const math::Vector3 &/*_anchor*/)
+{
+  gzlog << "ODEGearboxJoint::SetAnchor not implemented.\n";
+}
diff --git a/gazebo/physics/ode/ODEGearboxJoint.hh b/gazebo/physics/ode/ODEGearboxJoint.hh
new file mode 100644
index 0000000..a87ce91
--- /dev/null
+++ b/gazebo/physics/ode/ODEGearboxJoint.hh
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _ODEGEARBOXJOINT_HH_
+#define _ODEGEARBOXJOINT_HH_
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+
+#include "gazebo/physics/GearboxJoint.hh"
+#include "gazebo/physics/ode/ODEJoint.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \class ODEGearboxJoint ODEGearboxJoint.hh physics/physics.hh
+    /// \brief A double axis gearbox joint.
+    class GAZEBO_VISIBLE ODEGearboxJoint : public GearboxJoint<ODEJoint>
+    {
+      /// \brief Constructor
+      /// \param[in] _worldID ODE id of the world.
+      /// \param[in] _parent Parent of the Joint
+      public: ODEGearboxJoint(dWorldID _worldId, BasePtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~ODEGearboxJoint();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAnchor(unsigned int _index,
+                                     const math::Vector3 &_anchor);
+
+      // Documentation inherited
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAxis(unsigned int _index,
+                                   const math::Vector3 &_axis);
+
+      // Documentation inherited
+      public: virtual void SetGearboxRatio(double _gearRatio);
+
+      // Documentation inherited
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
+
+      // Documentation inherited
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
+
+      // Documentation inherited
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited
+      public: virtual double GetParam(unsigned int _parameter) const;
+
+      // Documentation inherited
+      public: virtual void SetParam(unsigned int _parameter, double _value);
+
+      // Documentation inherited
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
+
+      /// \brief Set gearbox joint gear reference body
+      /// \param[in] _body an ode body as the reference link for the gears.
+      private: void SetReferenceBody(LinkPtr _body);
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/ode/ODEHeightmapShape.cc b/gazebo/physics/ode/ODEHeightmapShape.cc
index b792731..cf3c733 100644
--- a/gazebo/physics/ode/ODEHeightmapShape.cc
+++ b/gazebo/physics/ode/ODEHeightmapShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,9 +19,9 @@
  * Date: 12 Nov 2009
  */
 
-#include "common/Exception.hh"
-#include "physics/ode/ODECollision.hh"
-#include "physics/ode/ODEHeightmapShape.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/physics/ode/ODECollision.hh"
+#include "gazebo/physics/ode/ODEHeightmapShape.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -30,6 +30,7 @@ using namespace physics;
 ODEHeightmapShape::ODEHeightmapShape(CollisionPtr _parent)
     : HeightmapShape(_parent)
 {
+  this->flipY = false;
 }
 
 //////////////////////////////////////////////////
@@ -56,10 +57,10 @@ void ODEHeightmapShape::Init()
   this->odeData = dGeomHeightfieldDataCreate();
 
   // Step 3: Setup a callback method for ODE
-  dGeomHeightfieldDataBuildCallback(
+  dGeomHeightfieldDataBuildSingle(
       this->odeData,
-      this,
-      ODEHeightmapShape::GetHeightCallback,
+      &this->heights[0],
+      0,
       this->GetSize().x,  // in meters
       this->GetSize().y,  // in meters
       this->vertSize,  // width sampling size
diff --git a/gazebo/physics/ode/ODEHeightmapShape.hh b/gazebo/physics/ode/ODEHeightmapShape.hh
index 7b3450d..569f794 100644
--- a/gazebo/physics/ode/ODEHeightmapShape.hh
+++ b/gazebo/physics/ode/ODEHeightmapShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,13 +27,14 @@
 #include "gazebo/physics/HeightmapShape.hh"
 #include "gazebo/physics/ode/ODEPhysics.hh"
 #include "gazebo/physics/Collision.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief ODE Height map collision.
-    class ODEHeightmapShape : public HeightmapShape
+    class GAZEBO_VISIBLE ODEHeightmapShape : public HeightmapShape
     {
       /// \brief Constructor.
       /// \param[in] _parent Collision parent.
diff --git a/gazebo/physics/ode/ODEHinge2Joint.cc b/gazebo/physics/ode/ODEHinge2Joint.cc
index e533d72..88deec4 100644
--- a/gazebo/physics/ode/ODEHinge2Joint.cc
+++ b/gazebo/physics/ode/ODEHinge2Joint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,11 +19,12 @@
  * Date: 21 May 2003
  */
 
-#include "gazebo_config.h"
-#include "common/Console.hh"
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
 
-#include "physics/Link.hh"
-#include "physics/ode/ODEHinge2Joint.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/ode/ODEHinge2Joint.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -50,7 +51,7 @@ void ODEHinge2Joint::Load(sdf::ElementPtr _sdf)
 }
 
 //////////////////////////////////////////////////
-math::Vector3 ODEHinge2Joint::GetAnchor(int _index) const
+math::Vector3 ODEHinge2Joint::GetAnchor(unsigned int _index) const
 {
   dVector3 result;
 
@@ -68,7 +69,8 @@ math::Vector3 ODEHinge2Joint::GetAnchor(int _index) const
 }
 
 //////////////////////////////////////////////////
-void ODEHinge2Joint::SetAnchor(int /*index*/, const math::Vector3 &_anchor)
+void ODEHinge2Joint::SetAnchor(unsigned int /*_index*/,
+    const math::Vector3 &_anchor)
 {
   if (this->childLink)
     this->childLink->SetEnabled(true);
@@ -82,26 +84,37 @@ void ODEHinge2Joint::SetAnchor(int /*index*/, const math::Vector3 &_anchor)
 }
 
 //////////////////////////////////////////////////
-void ODEHinge2Joint::SetAxis(int _index, const math::Vector3 &_axis)
+void ODEHinge2Joint::SetAxis(unsigned int _index, const math::Vector3 &_axis)
 {
   if (this->childLink)
     this->childLink->SetEnabled(true);
   if (this->parentLink)
     this->parentLink->SetEnabled(true);
 
+  /// ODE needs global axis
+  /// \TODO: currently we assume joint axis is specified in model frame,
+  /// this is incorrect, and should be corrected to be
+  /// joint frame which is specified in child link frame.
+  math::Vector3 globalAxis = _axis;
+  if (this->parentLink)
+    globalAxis =
+      this->GetParent()->GetModel()->GetWorldPose().rot.RotateVector(_axis);
+
   if (this->jointId)
   {
     if (_index == 0)
-      dJointSetHinge2Axis1(this->jointId, _axis.x, _axis.y, _axis.z);
+      dJointSetHinge2Axis1(this->jointId,
+        globalAxis.x, globalAxis.y, globalAxis.z);
     else
-      dJointSetHinge2Axis2(this->jointId, _axis.x, _axis.y, _axis.z);
+      dJointSetHinge2Axis2(this->jointId,
+        globalAxis.x, globalAxis.y, globalAxis.z);
   }
   else
     gzerr << "ODE Joint ID is invalid\n";
 }
 
 //////////////////////////////////////////////////
-math::Vector3 ODEHinge2Joint::GetGlobalAxis(int _index) const
+math::Vector3 ODEHinge2Joint::GetGlobalAxis(unsigned int _index) const
 {
   dVector3 result;
 
@@ -114,7 +127,7 @@ math::Vector3 ODEHinge2Joint::GetGlobalAxis(int _index) const
 }
 
 //////////////////////////////////////////////////
-math::Angle ODEHinge2Joint::GetAngleImpl(int _index) const
+math::Angle ODEHinge2Joint::GetAngleImpl(unsigned int _index) const
 {
   math::Angle result;
 
@@ -130,7 +143,7 @@ math::Angle ODEHinge2Joint::GetAngleImpl(int _index) const
 }
 
 //////////////////////////////////////////////////
-double ODEHinge2Joint::GetVelocity(int _index) const
+double ODEHinge2Joint::GetVelocity(unsigned int _index) const
 {
   double result = 0;
 
@@ -148,7 +161,7 @@ double ODEHinge2Joint::GetVelocity(int _index) const
 }
 
 //////////////////////////////////////////////////
-void ODEHinge2Joint::SetVelocity(int _index, double _angle)
+void ODEHinge2Joint::SetVelocity(unsigned int _index, double _angle)
 {
   if (_index == 0)
     this->SetParam(dParamVel, _angle);
@@ -157,7 +170,7 @@ void ODEHinge2Joint::SetVelocity(int _index, double _angle)
 }
 
 //////////////////////////////////////////////////
-double ODEHinge2Joint::GetMaxForce(int _index)
+double ODEHinge2Joint::GetMaxForce(unsigned int _index)
 {
   if (_index == 0)
     return this->GetParam(dParamFMax);
@@ -167,7 +180,7 @@ double ODEHinge2Joint::GetMaxForce(int _index)
 
 
 //////////////////////////////////////////////////
-void ODEHinge2Joint::SetMaxForce(int _index, double _t)
+void ODEHinge2Joint::SetMaxForce(unsigned int _index, double _t)
 {
   if (_index == 0)
     this->SetParam(dParamFMax, _t);
@@ -177,35 +190,8 @@ void ODEHinge2Joint::SetMaxForce(int _index, double _t)
 
 
 //////////////////////////////////////////////////
-void ODEHinge2Joint::SetForce(int _index, double _effort)
+void ODEHinge2Joint::SetForceImpl(unsigned int _index, double _effort)
 {
-  if (_index < 0 || static_cast<unsigned int>(_index) >= this->GetAngleCount())
-  {
-    gzerr << "Calling BulletHingeJoint::SetForce with an index ["
-          << _index << "] out of range\n";
-    return;
-  }
-
-  // truncating SetForce effort if velocity limit reached.
-  if (this->velocityLimit[_index] >= 0)
-  {
-    if (this->GetVelocity(_index) > this->velocityLimit[_index])
-      _effort = _effort > 0 ? 0 : _effort;
-    else if (this->GetVelocity(_index) < -this->velocityLimit[_index])
-      _effort = _effort < 0 ? 0 : _effort;
-  }
-
-  // truncate effort if effortLimit is not negative
-  if (this->effortLimit[_index] >= 0)
-    _effort = math::clamp(_effort,
-      -this->effortLimit[_index], this->effortLimit[_index]);
-
-  ODEJoint::SetForce(_index, _effort);
-  if (this->childLink)
-    this->childLink->SetEnabled(true);
-  if (this->parentLink)
-    this->parentLink->SetEnabled(true);
-
   if (this->jointId)
   {
     if (_index == 0)
@@ -218,7 +204,7 @@ void ODEHinge2Joint::SetForce(int _index, double _effort)
 }
 
 //////////////////////////////////////////////////
-double ODEHinge2Joint::GetParam(int _parameter) const
+double ODEHinge2Joint::GetParam(unsigned int _parameter) const
 {
   double result = 0;
 
@@ -231,7 +217,7 @@ double ODEHinge2Joint::GetParam(int _parameter) const
 }
 
 //////////////////////////////////////////////////
-void ODEHinge2Joint::SetParam(int _parameter, double _value)
+void ODEHinge2Joint::SetParam(unsigned int _parameter, double _value)
 {
   ODEJoint::SetParam(_parameter, _value);
   if (this->jointId)
diff --git a/gazebo/physics/ode/ODEHinge2Joint.hh b/gazebo/physics/ode/ODEHinge2Joint.hh
index 3eefc8f..2a2defa 100644
--- a/gazebo/physics/ode/ODEHinge2Joint.hh
+++ b/gazebo/physics/ode/ODEHinge2Joint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,13 +27,14 @@
 
 #include "gazebo/physics/Hinge2Joint.hh"
 #include "gazebo/physics/ode/ODEJoint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief A two axis hinge joint
-    class ODEHinge2Joint : public Hinge2Joint<ODEJoint>
+    class GAZEBO_VISIBLE ODEHinge2Joint : public Hinge2Joint<ODEJoint>
     {
       /// \brief Constructor
       /// \param[in] _worldID ODE id of the world.
@@ -47,39 +48,41 @@ namespace gazebo
       public: virtual void Load(sdf::ElementPtr _sdf);
 
       // Documentation inherited.
-      public: virtual void SetAnchor(int _index, const math::Vector3 &_anchor);
+      public: virtual void SetAnchor(unsigned int _index,
+                                     const math::Vector3 &_anchor);
 
       // Documentation inherited.
-      public: virtual void SetAxis(int _index, const math::Vector3 &_axis);
+      public: virtual void SetAxis(unsigned int _index,
+                                   const math::Vector3 &_axis);
 
       // Documentation inherited.
-      public: virtual math::Vector3 GetAnchor(int _index) const;
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
       // Documentation inherited.
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
       // Documentation inherited.
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
       // Documentation inherited.
-      public: virtual double GetVelocity(int _index) const;
+      public: virtual double GetVelocity(unsigned int _index) const;
 
       // Documentation inherited.
-      public: virtual void SetVelocity(int index, double angle);
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
       // Documentation inherited.
-      public: virtual void SetMaxForce(int index, double t);
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
       // Documentation inherited.
-      public: virtual double GetMaxForce(int index);
+      public: virtual double GetMaxForce(unsigned int _index);
 
       // Documentation inherited.
-      public: virtual void SetForce(int _index, double _effort);
+      public: virtual double GetParam(unsigned int _parameter) const;
 
-      // Documentation inherited.
-      public: virtual double GetParam(int parameter) const;
+      public: virtual void SetParam(unsigned int _parameter, double _value);
 
-      public: virtual void SetParam(int parameter, double value);
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
     };
   }
 }
diff --git a/gazebo/physics/ode/ODEHingeJoint.cc b/gazebo/physics/ode/ODEHingeJoint.cc
index e9e41e4..3bfc084 100644
--- a/gazebo/physics/ode/ODEHingeJoint.cc
+++ b/gazebo/physics/ode/ODEHingeJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,11 +21,12 @@
 
 #include <boost/bind.hpp>
 
-#include "gazebo_config.h"
-#include "common/Console.hh"
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
 
-#include "physics/Link.hh"
-#include "physics/ode/ODEHingeJoint.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/ode/ODEHingeJoint.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -50,11 +51,10 @@ void ODEHingeJoint::Load(sdf::ElementPtr _sdf)
   HingeJoint<ODEJoint>::Load(_sdf);
 
   this->SetParam(dParamFMax, 0);
-  this->SetForce(0, 0);
 }
 
 //////////////////////////////////////////////////
-math::Vector3 ODEHingeJoint::GetAnchor(int /*index*/) const
+math::Vector3 ODEHingeJoint::GetAnchor(unsigned int /*index*/) const
 {
   dVector3 result;
 
@@ -67,7 +67,8 @@ math::Vector3 ODEHingeJoint::GetAnchor(int /*index*/) const
 }
 
 //////////////////////////////////////////////////
-void ODEHingeJoint::SetAnchor(int /*index*/, const math::Vector3 &_anchor)
+void ODEHingeJoint::SetAnchor(unsigned int /*index*/,
+    const math::Vector3 &_anchor)
 {
   if (this->childLink)
     this->childLink->SetEnabled(true);
@@ -82,7 +83,7 @@ void ODEHingeJoint::SetAnchor(int /*index*/, const math::Vector3 &_anchor)
 
 
 //////////////////////////////////////////////////
-math::Vector3 ODEHingeJoint::GetGlobalAxis(int /*_index*/) const
+math::Vector3 ODEHingeJoint::GetGlobalAxis(unsigned int /*_index*/) const
 {
   dVector3 result;
   if (this->jointId)
@@ -94,21 +95,27 @@ math::Vector3 ODEHingeJoint::GetGlobalAxis(int /*_index*/) const
 }
 
 //////////////////////////////////////////////////
-void ODEHingeJoint::SetAxis(int /*index*/, const math::Vector3 &_axis)
+void ODEHingeJoint::SetAxis(unsigned int _index, const math::Vector3 &_axis)
 {
+  ODEJoint::SetAxis(_index, _axis);
+
   if (this->childLink)
     this->childLink->SetEnabled(true);
   if (this->parentLink)
     this->parentLink->SetEnabled(true);
 
+  // ODE needs global axis
+  math::Quaternion axisFrame = this->GetAxisFrame(0);
+  math::Vector3 globalAxis = axisFrame.RotateVector(_axis);
+
   if (this->jointId)
-    dJointSetHingeAxis(this->jointId, _axis.x, _axis.y, _axis.z);
+    dJointSetHingeAxis(this->jointId, globalAxis.x, globalAxis.y, globalAxis.z);
   else
     gzerr << "ODE Joint ID is invalid\n";
 }
 
 //////////////////////////////////////////////////
-math::Angle ODEHingeJoint::GetAngleImpl(int /*index*/) const
+math::Angle ODEHingeJoint::GetAngleImpl(unsigned int /*index*/) const
 {
   math::Angle result;
   if (this->jointId)
@@ -120,7 +127,7 @@ math::Angle ODEHingeJoint::GetAngleImpl(int /*index*/) const
 }
 
 //////////////////////////////////////////////////
-double ODEHingeJoint::GetVelocity(int /*index*/) const
+double ODEHingeJoint::GetVelocity(unsigned int /*index*/) const
 {
   double result = 0;
 
@@ -133,53 +140,26 @@ double ODEHingeJoint::GetVelocity(int /*index*/) const
 }
 
 //////////////////////////////////////////////////
-void ODEHingeJoint::SetVelocity(int /*index*/, double _angle)
+void ODEHingeJoint::SetVelocity(unsigned int /*index*/, double _angle)
 {
   this->SetParam(dParamVel, _angle);
 }
 
 //////////////////////////////////////////////////
-void ODEHingeJoint::SetMaxForce(int /*index*/, double _t)
+void ODEHingeJoint::SetMaxForce(unsigned int /*index*/, double _t)
 {
   return this->SetParam(dParamFMax, _t);
 }
 
 //////////////////////////////////////////////////
-double ODEHingeJoint::GetMaxForce(int /*index*/)
+double ODEHingeJoint::GetMaxForce(unsigned int /*index*/)
 {
   return this->GetParam(dParamFMax);
 }
 
 //////////////////////////////////////////////////
-void ODEHingeJoint::SetForce(int _index, double _effort)
+void ODEHingeJoint::SetForceImpl(unsigned int /*_index*/, double _effort)
 {
-  if (_index < 0 || static_cast<unsigned int>(_index) >= this->GetAngleCount())
-  {
-    gzerr << "Calling ODEHingeJoint::SetForce with an index ["
-          << _index << "] out of range\n";
-    return;
-  }
-
-  // truncating SetForce effort if velocity limit reached.
-  if (this->velocityLimit[_index] >= 0)
-  {
-    if (this->GetVelocity(_index) > this->velocityLimit[_index])
-      _effort = _effort > 0 ? 0 : _effort;
-    else if (this->GetVelocity(_index) < -this->velocityLimit[_index])
-      _effort = _effort < 0 ? 0 : _effort;
-  }
-
-  // truncate effort if effortLimit is not negative
-  if (this->effortLimit[_index] >= 0)
-    _effort = math::clamp(_effort,
-      -this->effortLimit[_index], this->effortLimit[_index]);
-
-  ODEJoint::SetForce(_index, _effort);
-  if (this->childLink)
-    this->childLink->SetEnabled(true);
-  if (this->parentLink)
-    this->parentLink->SetEnabled(true);
-
   if (this->jointId)
     dJointAddHingeTorque(this->jointId, _effort);
   else
@@ -187,7 +167,7 @@ void ODEHingeJoint::SetForce(int _index, double _effort)
 }
 
 //////////////////////////////////////////////////
-double ODEHingeJoint::GetParam(int _parameter) const
+double ODEHingeJoint::GetParam(unsigned int _parameter) const
 {
   double result = 0;
 
@@ -200,7 +180,7 @@ double ODEHingeJoint::GetParam(int _parameter) const
 }
 
 //////////////////////////////////////////////////
-void ODEHingeJoint::SetParam(int _parameter, double _value)
+void ODEHingeJoint::SetParam(unsigned int _parameter, double _value)
 {
   ODEJoint::SetParam(_parameter, _value);
 
diff --git a/gazebo/physics/ode/ODEHingeJoint.hh b/gazebo/physics/ode/ODEHingeJoint.hh
index ba650dc..1df6709 100644
--- a/gazebo/physics/ode/ODEHingeJoint.hh
+++ b/gazebo/physics/ode/ODEHingeJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,13 +27,14 @@
 
 #include "gazebo/physics/HingeJoint.hh"
 #include "gazebo/physics/ode/ODEJoint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief A single axis hinge joint.
-    class ODEHingeJoint : public HingeJoint<ODEJoint>
+    class GAZEBO_VISIBLE ODEHingeJoint : public HingeJoint<ODEJoint>
     {
       /// \brief Constructor
       /// \param[in] _worldID ODE id of the world.
@@ -47,40 +48,42 @@ namespace gazebo
       public: virtual void Load(sdf::ElementPtr _sdf);
 
       // Documentation inherited
-      public: virtual math::Vector3 GetAnchor(int _index) const;
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetAnchor(int _index, const math::Vector3 &_anchor);
+      public: virtual void SetAnchor(unsigned int _index,
+                  const math::Vector3 &_anchor);
 
       // Documentation inherited
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetAxis(int _index, const math::Vector3 &_axis);
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
 
       // Documentation inherited
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetVelocity(int _index, double _angle);
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
       // Documentation inherited
-      public: virtual double GetVelocity(int _index) const;
+      public: virtual double GetVelocity(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetMaxForce(int _index, double _t);
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
       // Documentation inherited
-      public: virtual double GetMaxForce(int _index);
+      public: virtual double GetMaxForce(unsigned int _index);
 
       // Documentation inherited
-      public: virtual void SetForce(int _index, double _effort);
+      public: virtual double GetParam(unsigned int _parameter) const;
 
       // Documentation inherited
-      public: virtual double GetParam(int _parameter) const;
+      public: virtual void SetParam(unsigned int _parameter, double _value);
 
       // Documentation inherited
-      public: virtual void SetParam(int _parameter, double _value);
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
     };
   }
 }
diff --git a/gazebo/physics/ode/ODEJoint.cc b/gazebo/physics/ode/ODEJoint.cc
index 598c6f5..5e264d6 100644
--- a/gazebo/physics/ode/ODEJoint.cc
+++ b/gazebo/physics/ode/ODEJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,6 @@
  * limitations under the License.
  *
 */
-/* Desc: The ODE base joint class
- * Author: Nate Koenig, Andrew Howard
- * Date: 12 Oct 2009
- */
-
 #include "gazebo/common/Exception.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Assert.hh"
@@ -28,6 +23,7 @@
 #include "gazebo/physics/PhysicsEngine.hh"
 #include "gazebo/physics/ode/ODELink.hh"
 #include "gazebo/physics/ode/ODEJoint.hh"
+#include "gazebo/physics/GearboxJoint.hh"
 #include "gazebo/physics/ScrewJoint.hh"
 #include "gazebo/physics/JointWrench.hh"
 
@@ -40,15 +36,27 @@ ODEJoint::ODEJoint(BasePtr _parent)
   : Joint(_parent)
 {
   this->jointId = NULL;
-  this->cfmDampingState[0] = ODEJoint::NONE;
-  this->cfmDampingState[1] = ODEJoint::NONE;
-  this->dampingInitialized = false;
+  this->implicitDampingState[0] = ODEJoint::NONE;
+  this->implicitDampingState[1] = ODEJoint::NONE;
+  this->stiffnessDampingInitialized = false;
   this->feedback = NULL;
+  this->currentKd[0] = 0;
+  this->currentKd[1] = 0;
+  this->currentKp[0] = 0;
+  this->currentKp[1] = 0;
+  this->forceApplied[0] = 0;
+  this->forceApplied[1] = 0;
+  this->useImplicitSpringDamper = false;
+  this->stopERP = 0.0;
+  this->stopCFM = 0.0;
 }
 
 //////////////////////////////////////////////////
 ODEJoint::~ODEJoint()
 {
+  if (this->applyDamping)
+    physics::Joint::DisconnectJointUpdate(this->applyDamping);
+
   delete this->feedback;
   this->Detach();
 
@@ -66,52 +74,56 @@ void ODEJoint::Load(sdf::ElementPtr _sdf)
   {
     sdf::ElementPtr elem = this->sdf->GetElement("physics")->GetElement("ode");
 
-    if (elem->HasElement("provide_feedback"))
+    if (elem->HasElement("cfm_damping"))
     {
-      this->provideFeedback = elem->GetValueBool("provide_feedback");
+      gzwarn << "Deprecating sdf <cfm_damping>, "
+             << "replace with <implicit_spring_damper> in sdf 1.5.\n";
+      this->useImplicitSpringDamper = elem->Get<bool>("cfm_damping");
     }
-
-    if (elem->HasElement("cfm_damping"))
+    else if (elem->HasElement("implicit_spring_damper"))
     {
-      this->useCFMDamping = elem->GetValueBool("cfm_damping");
+      this->useImplicitSpringDamper = elem->Get<bool>("implicit_spring_damper");
     }
 
     // initializa both axis, \todo: make cfm, erp per axis
-    this->stopERP = elem->GetElement("limit")->GetValueDouble("erp");
+    this->stopERP = elem->GetElement("limit")->Get<double>("erp");
     for (unsigned int i = 0; i < this->GetAngleCount(); ++i)
-      this->SetAttribute("stop_erp", i, this->stopERP);
+      this->SetParam("stop_erp", i, this->stopERP);
 
     // initializa both axis, \todo: make cfm, erp per axis
-    this->stopCFM = elem->GetElement("limit")->GetValueDouble("cfm");
+    this->stopCFM = elem->GetElement("limit")->Get<double>("cfm");
     for (unsigned int i = 0; i < this->GetAngleCount(); ++i)
-      this->SetAttribute("stop_cfm", i, this->stopCFM);
+      this->SetParam("stop_cfm", i, this->stopCFM);
 
     if (elem->HasElement("suspension"))
     {
       this->SetParam(dParamSuspensionERP,
-          elem->GetElement("suspension")->GetValueDouble("erp"));
+          elem->GetElement("suspension")->Get<double>("erp"));
       this->SetParam(dParamSuspensionCFM,
-          elem->GetElement("suspension")->GetValueDouble("cfm"));
+          elem->GetElement("suspension")->Get<double>("cfm"));
     }
 
     if (elem->HasElement("fudge_factor"))
       this->SetParam(dParamFudgeFactor,
-          elem->GetElement("fudge_factor")->GetValueDouble());
+          elem->GetElement("fudge_factor")->Get<double>());
 
     if (elem->HasElement("cfm"))
-        this->SetParam(dParamCFM, elem->GetElement("cfm")->GetValueDouble());
+        this->SetParam("cfm", 0, elem->Get<double>("cfm"));
+
+    if (elem->HasElement("erp"))
+        this->SetParam("erp", 0, elem->Get<double>("erp"));
 
     if (elem->HasElement("bounce"))
         this->SetParam(dParamBounce,
-          elem->GetElement("bounce")->GetValueDouble());
+          elem->GetElement("bounce")->Get<double>());
 
     if (elem->HasElement("max_force"))
       this->SetParam(dParamFMax,
-          elem->GetElement("max_force")->GetValueDouble());
+          elem->GetElement("max_force")->Get<double>());
 
     if (elem->HasElement("velocity"))
       this->SetParam(dParamVel,
-          elem->GetElement("velocity")->GetValueDouble());
+          elem->GetElement("velocity")->Get<double>());
   }
 
   if (this->sdf->HasElement("axis"))
@@ -123,7 +135,7 @@ void ODEJoint::Load(sdf::ElementPtr _sdf)
 
       if (dynamicsElem->HasElement("damping"))
       {
-        this->SetDamping(0, dynamicsElem->GetValueDouble("damping"));
+        this->SetDamping(0, dynamicsElem->Get<double>("damping"));
       }
       if (dynamicsElem->HasElement("friction"))
       {
@@ -133,20 +145,28 @@ void ODEJoint::Load(sdf::ElementPtr _sdf)
     }
   }
 
-
-  if (this->provideFeedback)
+  if (this->sdf->HasElement("axis2"))
   {
-    this->feedback = new dJointFeedback;
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
+    if (axisElem->HasElement("dynamics"))
+    {
+      sdf::ElementPtr dynamicsElem = axisElem->GetElement("dynamics");
 
-    if (this->jointId)
-      dJointSetFeedback(this->jointId, this->feedback);
-    else
-      gzerr << "ODE Joint ID is invalid\n";
+      if (dynamicsElem->HasElement("damping"))
+      {
+        this->SetDamping(1, dynamicsElem->Get<double>("damping"));
+      }
+      if (dynamicsElem->HasElement("friction"))
+      {
+        sdf::ElementPtr frictionElem = dynamicsElem->GetElement("friction");
+        gzlog << "joint friction not implemented\n";
+      }
+    }
   }
 }
 
 //////////////////////////////////////////////////
-LinkPtr ODEJoint::GetJointLink(int _index) const
+LinkPtr ODEJoint::GetJointLink(unsigned int _index) const
 {
   LinkPtr result;
   if (!this->jointId)
@@ -183,7 +203,7 @@ bool ODEJoint::AreConnected(LinkPtr _one, LinkPtr _two) const
 
 //////////////////////////////////////////////////
 // child classes where appropriate
-double ODEJoint::GetParam(int /*parameter*/) const
+double ODEJoint::GetParam(unsigned int /*parameter*/) const
 {
   return 0;
 }
@@ -202,6 +222,10 @@ void ODEJoint::Attach(LinkPtr _parent, LinkPtr _child)
   if (!this->jointId)
     gzerr << "ODE Joint ID is invalid\n";
 
+  if (this->HasType(Base::HINGE2_JOINT) &&
+      (odechild == NULL || odeparent == NULL))
+    gzthrow("ODEHinge2Joint cannot be connected to the world");
+
   if (!odechild && odeparent)
   {
     dJointAttach(this->jointId, 0, odeparent->GetODEId());
@@ -234,7 +258,7 @@ void ODEJoint::Detach()
 
 //////////////////////////////////////////////////
 // where appropriate
-void ODEJoint::SetParam(int /*parameter*/, double /*value*/)
+void ODEJoint::SetParam(unsigned int /*parameter*/, double /*value*/)
 {
   if (this->childLink)
     this->childLink->SetEnabled(true);
@@ -277,54 +301,55 @@ dJointFeedback *ODEJoint::GetFeedback()
 }
 
 //////////////////////////////////////////////////
-void ODEJoint::SetHighStop(int _index, const math::Angle &_angle)
+bool ODEJoint::SetHighStop(unsigned int _index, const math::Angle &_angle)
 {
   Joint::SetHighStop(_index, _angle);
   switch (_index)
   {
     case 0:
       this->SetParam(dParamHiStop, _angle.Radian());
-      break;
+      return true;
     case 1:
       this->SetParam(dParamHiStop2, _angle.Radian());
-      break;
+      return true;
     case 2:
       this->SetParam(dParamHiStop3, _angle.Radian());
-      break;
+      return true;
     default:
       gzerr << "Invalid index[" << _index << "]\n";
-      break;
+      return false;
   };
 }
 
 //////////////////////////////////////////////////
-void ODEJoint::SetLowStop(int _index, const math::Angle &_angle)
+bool ODEJoint::SetLowStop(unsigned int _index, const math::Angle &_angle)
 {
   Joint::SetLowStop(_index, _angle);
   switch (_index)
   {
     case 0:
       this->SetParam(dParamLoStop, _angle.Radian());
-      break;
+      return true;
     case 1:
       this->SetParam(dParamLoStop2, _angle.Radian());
-      break;
+      return true;
     case 2:
       this->SetParam(dParamLoStop3, _angle.Radian());
-      break;
+      return true;
     default:
       gzerr << "Invalid index[" << _index << "]\n";
+      return false;
   };
 }
 
 //////////////////////////////////////////////////
-math::Angle ODEJoint::GetHighStop(int _index)
+math::Angle ODEJoint::GetHighStop(unsigned int _index)
 {
   return this->GetUpperLimit(_index);
 }
 
 //////////////////////////////////////////////////
-math::Angle ODEJoint::GetLowStop(int _index)
+math::Angle ODEJoint::GetLowStop(unsigned int _index)
 {
   return this->GetLowerLimit(_index);
 }
@@ -376,7 +401,19 @@ math::Vector3 ODEJoint::GetLinkTorque(unsigned int _index) const
 }
 
 //////////////////////////////////////////////////
-void ODEJoint::SetAttribute(Attribute _attr, int _index, double _value)
+void ODEJoint::SetAxis(unsigned int _index, const math::Vector3 &_axis)
+{
+  // record axis in sdf element
+  if (_index == 0)
+    this->sdf->GetElement("axis")->GetElement("xyz")->Set(_axis);
+  else if (_index == 1)
+    this->sdf->GetElement("axis2")->GetElement("xyz")->Set(_axis);
+  else
+    gzerr << "SetAxis index [" << _index << "] out of bounds\n";
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::SetAttribute(Attribute _attr, unsigned int _index, double _value)
 {
   switch (_attr)
   {
@@ -390,38 +427,10 @@ void ODEJoint::SetAttribute(Attribute _attr, int _index, double _value)
       this->SetParam(dParamSuspensionCFM, _value);
       break;
     case STOP_ERP:
-      switch (_index)
-      {
-        case 0:
-          this->SetParam(dParamStopERP, _value);
-          break;
-        case 1:
-          this->SetParam(dParamStopERP2, _value);
-          break;
-        case 2:
-          this->SetParam(dParamStopERP3, _value);
-          break;
-        default:
-          gzerr << "Invalid index[" << _index << "]\n";
-          break;
-      };
+      this->SetParam("stop_erp", _index, _value);
       break;
     case STOP_CFM:
-      switch (_index)
-      {
-        case 0:
-          this->SetParam(dParamStopCFM, _value);
-          break;
-        case 1:
-          this->SetParam(dParamStopCFM2, _value);
-          break;
-        case 2:
-          this->SetParam(dParamStopCFM3, _value);
-          break;
-        default:
-          gzerr << "Invalid index[" << _index << "]\n";
-          break;
-      };
+      this->SetParam("stop_cfm", _index, _value);
       break;
     case ERP:
       this->SetParam(dParamERP, _value);
@@ -436,38 +445,10 @@ void ODEJoint::SetAttribute(Attribute _attr, int _index, double _value)
       this->SetParam(dParamVel, _value);
       break;
     case HI_STOP:
-      switch (_index)
-      {
-        case 0:
-          this->SetParam(dParamHiStop, _value);
-          break;
-        case 1:
-          this->SetParam(dParamHiStop2, _value);
-          break;
-        case 2:
-          this->SetParam(dParamHiStop3, _value);
-          break;
-        default:
-          gzerr << "Invalid index[" << _index << "]\n";
-          break;
-      };
+      this->SetParam("hi_stop", _index, _value);
       break;
     case LO_STOP:
-      switch (_index)
-      {
-        case 0:
-          this->SetParam(dParamLoStop, _value);
-          break;
-        case 1:
-          this->SetParam(dParamLoStop2, _value);
-          break;
-        case 2:
-          this->SetParam(dParamLoStop3, _value);
-          break;
-        default:
-          gzerr << "Invalid index[" << _index << "]\n";
-          break;
-      };
+      this->SetParam("lo_stop", _index, _value);
       break;
     default:
       gzerr << "Unable to handle joint attribute[" << _attr << "]\n";
@@ -476,7 +457,14 @@ void ODEJoint::SetAttribute(Attribute _attr, int _index, double _value)
 }
 
 //////////////////////////////////////////////////
-void ODEJoint::SetAttribute(const std::string &_key, int _index,
+void ODEJoint::SetAttribute(const std::string &_key, unsigned int _index,
+                            const boost::any &_value)
+{
+  this->SetParam(_key, _index, _value);
+}
+
+//////////////////////////////////////////////////
+bool ODEJoint::SetParam(const std::string &_key, unsigned int _index,
                             const boost::any &_value)
 {
   if (_key == "fudge_factor")
@@ -485,9 +473,10 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
     {
       this->SetParam(dParamFudgeFactor, boost::any_cast<double>(_value));
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "suspension_erp")
@@ -496,9 +485,10 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
     {
       this->SetParam(dParamSuspensionERP, boost::any_cast<double>(_value));
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "suspension_cfm")
@@ -507,9 +497,10 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
     {
       this->SetParam(dParamSuspensionCFM, boost::any_cast<double>(_value));
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "stop_erp")
@@ -529,12 +520,13 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
           break;
         default:
           gzerr << "Invalid index[" << _index << "]\n";
-          break;
+          return false;
       };
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "stop_cfm")
@@ -554,12 +546,13 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
           break;
         default:
           gzerr << "Invalid index[" << _index << "]\n";
-          break;
+          return false;
       };
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "erp")
@@ -568,9 +561,10 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
     {
       this->SetParam(dParamERP, boost::any_cast<double>(_value));
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "cfm")
@@ -579,9 +573,10 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
     {
       this->SetParam(dParamCFM, boost::any_cast<double>(_value));
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "fmax")
@@ -590,9 +585,10 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
     {
       this->SetParam(dParamFMax, boost::any_cast<double>(_value));
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "vel")
@@ -601,9 +597,10 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
     {
       this->SetParam(dParamVel, boost::any_cast<double>(_value));
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "hi_stop")
@@ -623,12 +620,13 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
           break;
         default:
           gzerr << "Invalid index[" << _index << "]\n";
-          break;
+          return false;
       };
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "lo_stop")
@@ -648,12 +646,13 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
           break;
         default:
           gzerr << "Invalid index[" << _index << "]\n";
-          break;
+          return false;
       };
     }
-    catch(boost::bad_any_cast &e)
+    catch(const boost::bad_any_cast &e)
     {
       gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
     }
   }
   else if (_key == "thread_pitch")
@@ -664,30 +663,42 @@ void ODEJoint::SetAttribute(const std::string &_key, int _index,
     {
       try
       {
-        screwJoint->SetThreadPitch(0, boost::any_cast<double>(_value));
+        screwJoint->SetThreadPitch(boost::any_cast<double>(_value));
       }
-      catch(boost::bad_any_cast &e)
+      catch(const boost::bad_any_cast &e)
       {
         gzerr << "boost any_cast error:" << e.what() << "\n";
+        return false;
       }
     }
   }
-  else
+  else if (_key == "gearbox_ratio")
   {
-    try
+    GearboxJoint<ODEJoint>* gearboxJoint =
+      dynamic_cast<GearboxJoint<ODEJoint>* >(this);
+    if (gearboxJoint != NULL)
     {
-      gzerr << "Unable to handle joint attribute["
-            << boost::any_cast<std::string>(_value) << "]\n";
-    }
-    catch(boost::bad_any_cast &e)
-    {
-      gzerr << "boost any_cast error:" << e.what() << "\n";
+      try
+      {
+        gearboxJoint->SetGearboxRatio(boost::any_cast<double>(_value));
+      }
+      catch(const boost::bad_any_cast &e)
+      {
+        gzerr << "boost any_cast error:" << e.what() << "\n";
+        return false;
+      }
     }
   }
+  else
+  {
+    gzerr << "Unable to handle joint attribute[" << _key << "]\n";
+    return false;
+  }
+  return true;
 }
 
 //////////////////////////////////////////////////
-double ODEJoint::GetAttribute(const std::string &_key, unsigned int _index)
+double ODEJoint::GetParam(const std::string &_key, unsigned int _index)
 {
   if (_key == "fudge_factor")
   {
@@ -853,7 +864,7 @@ double ODEJoint::GetAttribute(const std::string &_key, unsigned int _index)
     {
       try
       {
-        return screwJoint->GetThreadPitch(0);
+        return screwJoint->GetThreadPitch();
       }
       catch(common::Exception &e)
       {
@@ -867,6 +878,28 @@ double ODEJoint::GetAttribute(const std::string &_key, unsigned int _index)
       return 0;
     }
   }
+  else if (_key == "gearbox_ratio")
+  {
+    GearboxJoint<ODEJoint>* gearboxJoint =
+      dynamic_cast<GearboxJoint<ODEJoint>* >(this);
+    if (gearboxJoint != NULL)
+    {
+      try
+      {
+        return gearboxJoint->GetGearboxRatio();
+      }
+      catch(common::Exception &e)
+      {
+        gzerr << "GetParam error:" << e.GetErrorStr() << "\n";
+        return 0;
+      }
+    }
+    else
+    {
+      gzerr << "Trying to get thread_pitch for non-gearbox joints.\n";
+      return 0;
+    }
+  }
   else
   {
     gzerr << "Unable to get joint attribute[" << _key << "]\n";
@@ -878,6 +911,12 @@ double ODEJoint::GetAttribute(const std::string &_key, unsigned int _index)
 }
 
 //////////////////////////////////////////////////
+double ODEJoint::GetAttribute(const std::string &_key, unsigned int _index)
+{
+  return this->GetParam(_key, _index);
+}
+
+//////////////////////////////////////////////////
 void ODEJoint::Reset()
 {
   if (this->jointId)
@@ -889,43 +928,41 @@ void ODEJoint::Reset()
 }
 
 //////////////////////////////////////////////////
-JointWrench ODEJoint::GetForceTorque(int _index)
-{
-  return this->GetForceTorque(static_cast<unsigned int>(_index));
-}
-
-//////////////////////////////////////////////////
 JointWrench ODEJoint::GetForceTorque(unsigned int /*_index*/)
 {
-  JointWrench wrench;
   // Note that:
   // f2, t2 are the force torque measured on parent body's cg
   // f1, t1 are the force torque measured on child body's cg
-  dJointFeedback* fb = this->GetFeedback();
+  dJointFeedback *fb = this->GetFeedback();
   if (fb)
   {
     // kind of backwards here, body1 (parent) corresponds go f2, t2
     // and body2 (child) corresponds go f1, t1
-    wrench.body2Force.Set(fb->f1[0], fb->f1[1], fb->f1[2]);
-    wrench.body2Torque.Set(fb->t1[0], fb->t1[1], fb->t1[2]);
-    wrench.body1Force.Set(fb->f2[0], fb->f2[1], fb->f2[2]);
-    wrench.body1Torque.Set(fb->t2[0], fb->t2[1], fb->t2[2]);
+    this->wrench.body2Force.Set(fb->f1[0], fb->f1[1], fb->f1[2]);
+    this->wrench.body2Torque.Set(fb->t1[0], fb->t1[1], fb->t1[2]);
+    this->wrench.body1Force.Set(fb->f2[0], fb->f2[1], fb->f2[2]);
+    this->wrench.body1Torque.Set(fb->t2[0], fb->t2[1], fb->t2[2]);
 
     // get force applied through SetForce
     physics::JointWrench wrenchAppliedWorld;
     if (this->HasType(physics::Base::HINGE_JOINT))
     {
       // rotate force into child link frame
+      // GetLocalAxis is the axis specified in parent link frame!!!
       wrenchAppliedWorld.body2Torque =
-        this->GetForce(0u) * this->GetGlobalAxis(0u);
+        this->GetForce(0u) * this->GetLocalAxis(0u);
+
+      // gzerr << "body2Torque [" << wrenchAppliedWorld.body2Torque
+      //       << "] axis [" << this->GetLocalAxis(0u)
+      //       << "]\n";
+
       wrenchAppliedWorld.body1Torque = -wrenchAppliedWorld.body2Torque;
     }
     else if (this->HasType(physics::Base::SLIDER_JOINT))
     {
       // rotate force into child link frame
-      this->GetGlobalAxis(0u);
       wrenchAppliedWorld.body2Force =
-        this->GetForce(0u) * this->GetGlobalAxis(0u);
+        this->GetForce(0u) * this->GetLocalAxis(0u);
       wrenchAppliedWorld.body1Force = -wrenchAppliedWorld.body2Force;
     }
     else
@@ -942,31 +979,31 @@ JointWrench ODEJoint::GetForceTorque(unsigned int /*_index*/)
 
       // convert torque from about child CG to joint anchor location
       // cg position specified in child link frame
-      math::Vector3 cgPos = this->childLink->GetInertial()->GetPose().pos;
+      math::Pose cgPose = this->childLink->GetInertial()->GetPose();
 
       // anchorPose location of joint in child frame
       // childMomentArm: from child CG to joint location in child link frame
       // moment arm rotated into world frame (given feedback is in world frame)
       math::Vector3 childMomentArm = childPose.rot.RotateVector(
-        (this->anchorPose - math::Pose(cgPos, math::Quaternion())).pos);
+        (this->anchorPose - math::Pose(cgPose.pos, math::Quaternion())).pos);
 
       // gzerr << "anchor [" << anchorPose
       //       << "] iarm[" << this->childLink->GetInertial()->GetPose().pos
       //       << "] childMomentArm[" << childMomentArm
-      //       << "] f1[" << wrench.body2Force
-      //       << "] t1[" << wrench.body2Torque
-      //       << "] fxp[" << wrench.body2Force.Cross(childMomentArm)
+      //       << "] f1[" << this->wrench.body2Force
+      //       << "] t1[" << this->wrench.body2Torque
+      //       << "] fxp[" << this->wrench.body2Force.Cross(childMomentArm)
       //       << "]\n";
 
-      wrench.body2Torque += wrench.body2Force.Cross(childMomentArm);
+      this->wrench.body2Torque += this->wrench.body2Force.Cross(childMomentArm);
 
-      // rotate resulting body1Force in world frame into link frame
-      wrench.body2Force = childPose.rot.RotateVectorReverse(
-        -wrench.body2Force);
+      // rotate resulting body2Force in world frame into link frame
+      this->wrench.body2Force = childPose.rot.RotateVectorReverse(
+        -this->wrench.body2Force);
 
-      // rotate resulting body1Torque in world frame into link frame
-      wrench.body2Torque = childPose.rot.RotateVectorReverse(
-        -wrench.body2Torque);
+      // rotate resulting body2Torque in world frame into link frame
+      this->wrench.body2Torque = childPose.rot.RotateVectorReverse(
+        -this->wrench.body2Torque);
     }
 
     // convert torque from about parent CG to joint anchor location
@@ -976,6 +1013,8 @@ JointWrench ODEJoint::GetForceTorque(unsigned int /*_index*/)
       math::Pose childPose;
       if (this->childLink)
         childPose = this->childLink->GetWorldPose();
+      else
+        gzerr << "missing child link, double check model.";
 
       math::Pose parentPose = this->parentLink->GetWorldPose();
 
@@ -983,40 +1022,63 @@ JointWrench ODEJoint::GetForceTorque(unsigned int /*_index*/)
       // CG to joint anchor location
 
       // parent cg specified in parent link frame
-      math::Vector3 cgPos = this->parentLink->GetInertial()->GetPose().pos;
+      math::Pose cgPose = this->parentLink->GetInertial()->GetPose();
 
       // get parent CG pose in child link frame
-      math::Pose parentCGinChildLink =
-        math::Pose(cgPos, math::Quaternion()) - (childPose - parentPose);
+      math::Pose parentCGInChildLink =
+        math::Pose(cgPose.pos, math::Quaternion()) - (childPose - parentPose);
+
+      // anchor location in parent CG frame
+      // this is the moment arm, but it's in parent CG frame, we need
+      // to convert it into world frame
+      math::Pose anchorInParendCGFrame = this->anchorPose - parentCGInChildLink;
+
+      // paretnCGFrame in world frame
+      math::Pose parentCGInWorld = cgPose + parentPose;
 
       // rotate momeent arms into world frame
-      math::Vector3 parentMomentArm = childPose.rot.RotateVector(
-        (this->anchorPose - parentCGinChildLink).pos);
+      math::Vector3 parentMomentArm = parentCGInWorld.rot.RotateVector(
+        (this->anchorPose - parentCGInChildLink).pos);
 
       // gzerr << "anchor [" << this->anchorPose
-      //       << "] pcginc[" << parentCGinChildLink
-      //       << "] iarm[" << cgPos
+      //       << "] pcginc[" << parentCGInChildLink
+      //       << "] iarm[" << cgPose
+      //       << "] anc2pcg[" << this->anchorPose - parentCGInChildLink
       //       << "] parentMomentArm[" << parentMomentArm
-      //       << "] f1[" << wrench.body1Force
-      //       << "] t1[" << wrench.body1Torque
-      //       << "] fxp[" << wrench.body1Force.Cross(parentMomentArm)
+      //       << "] f1[" << this->wrench.body1Force
+      //       << "] t1[" << this->wrench.body1Torque
+      //       << "] fxp[" << this->wrench.body1Force.Cross(parentMomentArm)
       //       << "]\n";
 
-      wrench.body1Torque += wrench.body1Force.Cross(parentMomentArm);
+      this->wrench.body1Torque +=
+        this->wrench.body1Force.Cross(parentMomentArm);
 
       // rotate resulting body1Force in world frame into link frame
-      wrench.body1Force = parentPose.rot.RotateVectorReverse(
-        -wrench.body1Force);
+      this->wrench.body1Force = parentPose.rot.RotateVectorReverse(
+        -this->wrench.body1Force);
 
       // rotate resulting body1Torque in world frame into link frame
-      wrench.body1Torque = parentPose.rot.RotateVectorReverse(
-        -wrench.body1Torque);
+      this->wrench.body1Torque = parentPose.rot.RotateVectorReverse(
+        -this->wrench.body1Torque);
 
       if (!this->childLink)
       {
+        gzlog << "Joint [" << this->GetScopedName()
+              << "] with parent Link [" << this->parentLink->GetScopedName()
+              << "] but no child Link.  Child Link must be world.\n";
         // if child link does not exist, use equal and opposite
-        wrench.body2Force = -wrench.body1Force;
-        wrench.body2Torque = -wrench.body1Torque;
+        this->wrench.body2Force = -this->wrench.body1Force;
+        this->wrench.body2Torque = -this->wrench.body1Torque;
+
+        // force/torque are in parent link frame, transform them into
+        // child link(world) frame.
+        math::Pose parentToWorldTransform = this->parentLink->GetWorldPose();
+        this->wrench.body1Force =
+          parentToWorldTransform.rot.RotateVector(
+          this->wrench.body1Force);
+        this->wrench.body1Torque =
+          parentToWorldTransform.rot.RotateVector(
+          this->wrench.body1Torque);
       }
     }
     else
@@ -1028,25 +1090,50 @@ JointWrench ODEJoint::GetForceTorque(unsigned int /*_index*/)
       }
       else
       {
+        gzlog << "Joint [" << this->GetScopedName()
+              << "] with child Link [" << this->childLink->GetScopedName()
+              << "] but no parent Link.  Parent Link must be world.\n";
         // if parentLink does not exist, use equal opposite body1 wrench
-        wrench.body1Force = -wrench.body2Force;
-        wrench.body1Torque = -wrench.body2Torque;
+        this->wrench.body1Force = -this->wrench.body2Force;
+        this->wrench.body1Torque = -this->wrench.body2Torque;
+
+        // force/torque are in child link frame, transform them into
+        // parent link frame.  Here, parent link is world, so zero transform.
+        math::Pose childToWorldTransform = this->childLink->GetWorldPose();
+        this->wrench.body1Force =
+          childToWorldTransform.rot.RotateVector(
+          this->wrench.body1Force);
+        this->wrench.body1Torque =
+          childToWorldTransform.rot.RotateVector(
+          this->wrench.body1Torque);
       }
     }
-    wrench = wrench - wrenchAppliedWorld;
+    this->wrench = this->wrench - wrenchAppliedWorld;
   }
   else
   {
     // forgot to set provide_feedback?
-    gzwarn << "GetForceTorque: forget to set <provide_feedback>?\n";
+    gzwarn << "GetForceTorque: forgot to set <provide_feedback>?\n";
   }
 
-  return wrench;
+  return this->wrench;
 }
 
 //////////////////////////////////////////////////
 void ODEJoint::CFMDamping()
 {
+  this->ApplyImplicitStiffnessDamping();
+}
+
+//////////////////////////////////////////////////
+bool ODEJoint::UsesImplicitSpringDamper()
+{
+  return this->useImplicitSpringDamper;
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::ApplyImplicitStiffnessDamping()
+{
   // check if we are violating joint limits
   if (this->GetAngleCount() > 2)
   {
@@ -1055,72 +1142,327 @@ void ODEJoint::CFMDamping()
      return;
   }
 
+  double dt = this->GetWorld()->GetPhysicsEngine()->GetMaxStepSize();
   for (unsigned int i = 0; i < this->GetAngleCount(); ++i)
   {
-    if (this->GetAngle(i) >= this->upperLimit[i] ||
-        this->GetAngle(i) <= this->lowerLimit[i] ||
-        math::equal(this->dampingCoefficient, 0.0))
+    double angle = this->GetAngle(i).Radian();
+    double dAngle = 2.0 * this->GetVelocity(i) * dt;
+    angle += dAngle;
+
+    if ((math::equal(this->dissipationCoefficient[i], 0.0) &&
+         math::equal(this->stiffnessCoefficient[i], 0.0)) ||
+        angle >= this->upperLimit[i].Radian() ||
+        angle <= this->lowerLimit[i].Radian())
     {
-      if (this->cfmDampingState[i] != ODEJoint::JOINT_LIMIT)
+      if (this->implicitDampingState[i] != ODEJoint::JOINT_LIMIT)
       {
-        // we have hit the actual joint limit!
+        // We have hit the actual joint limit!
         // turn off simulated damping by recovering cfm and erp,
         // and recover joint limits
-        this->SetAttribute("stop_erp", i, this->stopERP);
-        this->SetAttribute("stop_cfm", i, this->stopCFM);
-        this->SetAttribute("hi_stop", i, this->upperLimit[i].Radian());
-        this->SetAttribute("lo_stop", i, this->lowerLimit[i].Radian());
-        this->SetAttribute("hi_stop", i, this->upperLimit[i].Radian());
-        this->cfmDampingState[i] = ODEJoint::JOINT_LIMIT;
+        this->SetParam("stop_erp", i, this->stopERP);
+        this->SetParam("stop_cfm", i, this->stopCFM);
+        this->SetParam("hi_stop", i, this->upperLimit[i].Radian());
+        this->SetParam("lo_stop", i, this->lowerLimit[i].Radian());
+        this->SetParam("hi_stop", i, this->upperLimit[i].Radian());
+        this->implicitDampingState[i] = ODEJoint::JOINT_LIMIT;
       }
+      /* test to see if we can reduce jitter at joint limits
+      // apply spring damper explicitly if in joint limit
+      // this limits oscillations if spring is pushing joint
+      // into the limit.
+      {
+        double dampingForce = -fabs(this->dissipationCoefficient[i])
+          * this->GetVelocity(i);
+        double springForce = this->stiffnessCoefficient[i]
+          * (this->springReferencePosition[i] - this->GetAngle(i).Radian());
+        this->SetForceImpl(i, dampingForce + springForce);
+      }
+      */
     }
-    else if (!math::equal(this->dampingCoefficient, 0.0))
+    else if (!math::equal(this->dissipationCoefficient[i], 0.0) ||
+             !math::equal(this->stiffnessCoefficient[i], 0.0))
     {
-      if (this->cfmDampingState[i] != ODEJoint::DAMPING_ACTIVE)
+      double kd = fabs(this->dissipationCoefficient[i]);
+      double kp = this->stiffnessCoefficient[i];
+
+      /// \TODO: This bit of code involving adaptive damping
+      /// might be too complicated, add some more comments or simplify it.
+      if (this->dissipationCoefficient[i] < 0)
+        kd = this->ApplyAdaptiveDamping(i, kd);
+
+      // update if going into DAMPING_ACTIVE mode, or
+      // if current applied damping value is not the same as predicted.
+      if (this->implicitDampingState[i] != ODEJoint::DAMPING_ACTIVE ||
+          !math::equal(kd, this->currentKd[i]) ||
+          !math::equal(kp, this->currentKp[i]))
       {
+        // save kp, kd applied for efficiency
+        this->currentKd[i] = kd;
+        this->currentKp[i] = kp;
+
+        // convert kp, kd to cfm, erp
+        double erp, cfm;
+        this->KpKdToCFMERP(dt, kp, kd, cfm, erp);
+
         // add additional constraint row by fake hitting joint limit
         // then, set erp and cfm to simulate viscous joint damping
-        this->SetAttribute("stop_erp", i, 0.0);
-        this->SetAttribute("stop_cfm", i, 1.0 / this->dampingCoefficient);
-        this->SetAttribute("hi_stop", i, 0.0);
-        this->SetAttribute("lo_stop", i, 0.0);
-        this->SetAttribute("hi_stop", i, 0.0);
-        this->cfmDampingState[i] = ODEJoint::DAMPING_ACTIVE;
+        this->SetParam("stop_erp", i, erp);
+        this->SetParam("stop_cfm", i, cfm);
+        this->SetParam("hi_stop", i, this->springReferencePosition[i]);
+        this->SetParam("lo_stop", i, this->springReferencePosition[i]);
+        this->SetParam("hi_stop", i, this->springReferencePosition[i]);
+        this->implicitDampingState[i] = ODEJoint::DAMPING_ACTIVE;
       }
     }
   }
 }
 
 //////////////////////////////////////////////////
-void ODEJoint::SetDamping(int /*_index*/, double _damping)
+double ODEJoint::ApplyAdaptiveDamping(unsigned int _index,
+    const double _damping)
+{
+  /// \TODO: hardcoded thresholds for now, make them params.
+  static double vThreshold = 0.01;
+  static double fThreshold = 1.0;
+
+  double f = this->GetForce(_index);
+  double v = this->GetVelocity(_index);
+
+  if (fabs(v) < vThreshold && fabs(f) > fThreshold)
+  {
+    // guess what the stable damping value might be based on v.
+    double tmpDStable = f / (v/fabs(v)*std::max(fabs(v), vThreshold));
+
+    // debug
+    // gzerr << "joint [" << this->GetName()
+    //       << "] damping[" << _damping
+    //       << "] f [" << f
+    //       << "] v [" << v
+    //       << "] f*v [" << f*v
+    //       << "] f/v [" << tmpDStable
+    //       << "] cur currentKd[" << _index
+    //       << "] = [" << currentKd[_index] << "]\n";
+
+    // limit v(n+1)/v(n) to 2.0 by multiplying tmpDStable by 0.5
+    return std::max(_damping, 0.5*tmpDStable);
+  }
+  else
+    return _damping;
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::KpKdToCFMERP(const double _dt,
+                           const double _kp, const double _kd,
+                           double &_cfm, double &_erp)
 {
-  this->dampingCoefficient = _damping;
+  /// \TODO: check for NaN cases
+  _erp = _dt * _kp / (_dt * _kp + _kd);
+  _cfm = 1.0 / (_dt * _kp + _kd);
+}
 
-  // \TODO: implement on a per axis basis (requires additional sdf parameters)
-  // trigger an update in CFMDAmping if this is called
-  if (this->useCFMDamping)
+//////////////////////////////////////////////////
+void ODEJoint::CFMERPToKpKd(const double _dt,
+                           const double _cfm, const double _erp,
+                           double &_kp, double &_kd)
+{
+  /// \TODO: check for NaN cases
+  _kp = _erp / (_dt * _cfm);
+  _kd = (1.0 - _erp) / _cfm;
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::SetDamping(unsigned int _index, double _damping)
+{
+  if (_index < this->GetAngleCount())
   {
-    if (this->GetAngleCount() > 2)
+    this->SetStiffnessDamping(_index, this->stiffnessCoefficient[_index],
+      _damping);
+  }
+  else
+  {
+     gzerr << "ODEJoint::SetDamping: index[" << _index
+           << "] is out of bounds (GetAngleCount() = "
+           << this->GetAngleCount() << ").\n";
+     return;
+  }
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::SetStiffness(unsigned int _index, double _stiffness)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->SetStiffnessDamping(_index, _stiffness,
+      this->dissipationCoefficient[_index]);
+  }
+  else
+  {
+     gzerr << "ODEJoint::SetStiffness: index[" << _index
+           << "] is out of bounds (GetAngleCount() = "
+           << this->GetAngleCount() << ").\n";
+     return;
+  }
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::SetStiffnessDamping(unsigned int _index,
+  double _stiffness, double _damping, double _reference)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->stiffnessCoefficient[_index] = _stiffness;
+    this->dissipationCoefficient[_index] = _damping;
+    this->springReferencePosition[_index] = _reference;
+
+    /// reset state of implicit damping state machine.
+    if (this->useImplicitSpringDamper)
     {
-       gzerr << "Incompatible joint type, GetAngleCount() = "
-             << this->GetAngleCount() << " > 2\n";
-       return;
+      if (static_cast<unsigned int>(_index) < this->GetAngleCount())
+      {
+        this->implicitDampingState[_index] = ODEJoint::NONE;
+      }
+      else
+      {
+         gzerr << "Incompatible joint type, index[" << _index
+               << "] is out of bounds (GetAngleCount() = "
+               << this->GetAngleCount() << ").\n";
+         return;
+      }
+    }
+
+    /// \TODO:  The check for static parent or child below might not be needed,
+    /// but we need to test first.  In theory, attaching an object to a static
+    /// body should not affect spring/damper application.
+    bool parentStatic =
+      this->GetParent() ? this->GetParent()->IsStatic() : false;
+    bool childStatic =
+      this->GetChild() ? this->GetChild()->IsStatic() : false;
+
+    if (!this->stiffnessDampingInitialized)
+    {
+      if (!parentStatic && !childStatic)
+      {
+        this->applyDamping = physics::Joint::ConnectJointUpdate(
+          boost::bind(&ODEJoint::ApplyStiffnessDamping, this));
+        this->stiffnessDampingInitialized = true;
+      }
+      else
+      {
+        gzwarn << "Spring Damper for Joint[" << this->GetName()
+               << "] is not initialized because either parent[" << parentStatic
+               << "] or child[" << childStatic << "] is static.\n";
+      }
     }
-    for (unsigned int i = 0; i < this->GetAngleCount(); ++i)
-      this->cfmDampingState[i] = ODEJoint::NONE;
   }
+  else
+    gzerr << "SetStiffnessDamping _index too large.\n";
+}
 
-  bool parentStatic = this->GetParent() ? this->GetParent()->IsStatic() : false;
-  bool childStatic = this->GetChild() ? this->GetChild()->IsStatic() : false;
+//////////////////////////////////////////////////
+void ODEJoint::SetProvideFeedback(bool _enable)
+{
+  Joint::SetProvideFeedback(_enable);
 
-  if (!this->dampingInitialized && !parentStatic && !childStatic)
+  if (this->provideFeedback)
   {
-    if (this->useCFMDamping)
-      this->applyDamping = physics::Joint::ConnectJointUpdate(
-        boost::bind(&ODEJoint::CFMDamping, this));
+    this->feedback = new dJointFeedback;
+    this->feedback->f1[0] = 0;
+    this->feedback->f1[1] = 0;
+    this->feedback->f1[2] = 0;
+    this->feedback->t1[0] = 0;
+    this->feedback->t1[1] = 0;
+    this->feedback->t1[2] = 0;
+    this->feedback->f2[0] = 0;
+    this->feedback->f2[1] = 0;
+    this->feedback->f2[2] = 0;
+    this->feedback->t2[0] = 0;
+    this->feedback->t2[1] = 0;
+    this->feedback->t2[2] = 0;
+
+    if (this->jointId)
+      dJointSetFeedback(this->jointId, this->feedback);
     else
-      this->applyDamping = physics::Joint::ConnectJointUpdate(
-        boost::bind(&ODEJoint::ApplyDamping, this));
-    this->dampingInitialized = true;
+      gzerr << "ODE Joint ID is invalid\n";
+  }
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::SetForce(unsigned int _index, double _force)
+{
+  double force = Joint::CheckAndTruncateForce(_index, _force);
+  this->SaveForce(_index, force);
+  this->SetForceImpl(_index, force);
+
+  // for engines that supports auto-disable of links
+  if (this->childLink)
+    this->childLink->SetEnabled(true);
+  if (this->parentLink)
+    this->parentLink->SetEnabled(true);
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::SaveForce(unsigned int _index, double _force)
+{
+  // this bit of code actually doesn't do anything physical,
+  // it simply records the forces commanded inside forceApplied.
+  if (_index < this->GetAngleCount())
+  {
+    if (this->forceAppliedTime < this->GetWorld()->GetSimTime())
+    {
+      // reset forces if time step is new
+      this->forceAppliedTime = this->GetWorld()->GetSimTime();
+      this->forceApplied[0] = this->forceApplied[1] = 0;
+    }
+
+    this->forceApplied[_index] += _force;
+  }
+  else
+    gzerr << "Something's wrong, joint [" << this->GetScopedName()
+          << "] index [" << _index
+          << "] out of range.\n";
+}
+
+//////////////////////////////////////////////////
+double ODEJoint::GetForce(unsigned int _index)
+{
+  if (_index < this->GetAngleCount())
+  {
+    return this->forceApplied[_index];
+  }
+  else
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get force\n";
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::ApplyStiffnessDamping()
+{
+  if (this->useImplicitSpringDamper)
+    this->ApplyImplicitStiffnessDamping();
+  else
+    this->ApplyExplicitStiffnessDamping();
+}
+
+//////////////////////////////////////////////////
+void ODEJoint::ApplyExplicitStiffnessDamping()
+{
+  for (unsigned int i = 0; i < this->GetAngleCount(); ++i)
+  {
+    // Take absolute value of dissipationCoefficient, since negative values of
+    // dissipationCoefficient are used for adaptive damping to
+    // enforce stability.
+    double dampingForce = -fabs(this->dissipationCoefficient[i])
+      * this->GetVelocity(i);
+
+    double springForce = this->stiffnessCoefficient[i]
+      * (this->springReferencePosition[i] - this->GetAngle(i).Radian());
+
+    // do not change forceApplied if setting internal damping forces
+    this->SetForceImpl(i, dampingForce + springForce);
+
+    // gzerr << this->GetVelocity(0) << " : " << dampingForce << "\n";
   }
 }
diff --git a/gazebo/physics/ode/ODEJoint.hh b/gazebo/physics/ode/ODEJoint.hh
index 4efbe50..4b93331 100644
--- a/gazebo/physics/ode/ODEJoint.hh
+++ b/gazebo/physics/ode/ODEJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,22 +27,23 @@
 
 #include "gazebo/physics/ode/ODEPhysics.hh"
 #include "gazebo/physics/Joint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief ODE joint interface
-    class ODEJoint : public Joint
+    class GAZEBO_VISIBLE ODEJoint : public Joint
     {
-      /// \brief internal variables used for cfm damping
+      /// \brief internal variables used for implicit damping
       public:  enum CFMMode
       {
-        /// \brief cfm damping not active
+        /// \brief implicit damping not active
         NONE           = 0x00000000,
-        /// \brief cfm damping active, joints within limits
+        /// \brief implicit damping active, joints within limits
         DAMPING_ACTIVE = 0x00000001,
-        /// \brief cfm damping not active, enforcing joints limits
+        /// \brief implicit damping not active, enforcing joints limits
         JOINT_LIMIT    = 0x00000002
       };
 
@@ -60,7 +61,7 @@ namespace gazebo
       public: virtual void Reset();
 
       // Documentation inherited.
-      public: virtual LinkPtr GetJointLink(int _index) const;
+      public: virtual LinkPtr GetJointLink(unsigned int _index) const;
 
       // Documentation inherited.
       public: virtual bool AreConnected(LinkPtr _one, LinkPtr _two) const;
@@ -71,7 +72,7 @@ namespace gazebo
       /// overriden in the child classes where appropriate.
       /// \param[in] _parameter ID of the parameter to get.
       /// \return Value of the parameter.
-      public: virtual double GetParam(int _parameter) const;
+      public: virtual double GetParam(unsigned int _parameter) const;
 
       /// \brief Set an ODE joint paramter.
       ///
@@ -79,10 +80,18 @@ namespace gazebo
       /// classes where appropriate
       /// \param[in] _parameter ID of the parameter to set.
       /// \param[in] _value Value to set.
-      public: virtual void SetParam(int _parameter, double _value);
+      public: virtual void SetParam(unsigned int _parameter, double _value);
 
       // Documentation inherited
-      public: virtual void SetDamping(int _index, double _damping);
+      public: virtual void SetDamping(unsigned int _index, double _damping);
+
+      // Documentation inherited.
+      public: virtual void SetStiffness(unsigned int _index,
+                                        const double _stiffness);
+
+      // Documentation inherited.
+      public: virtual void SetStiffnessDamping(unsigned int _index,
+        double _stiffness, double _damping, double _reference = 0);
 
       // Documentation inherited.
       public: virtual void Attach(LinkPtr _parent, LinkPtr _child);
@@ -111,7 +120,19 @@ namespace gazebo
       public: dJointFeedback *GetFeedback();
 
       /// \brief simulating damping with CFM and meddling with Joint limits
-      public: void CFMDamping();
+      /// Deprecated by ODEJoint::ApplyImplicitStiffnessDamping()
+      public: void CFMDamping() GAZEBO_DEPRECATED(3.0);
+
+      /// \brief Get flag indicating whether implicit spring damper is enabled.
+      /// \return True if implicit spring damper is used.
+      public: bool UsesImplicitSpringDamper();
+
+      /// \brief simulate implicit spring and damper with CFM/ERP
+      /// and meddling with Joint limits.
+      public: void ApplyImplicitStiffnessDamping();
+
+      /// \brief simulating a joint spring and damper explicitly.
+      public: void ApplyExplicitStiffnessDamping();
 
       /// \brief Get access to stopCFM
       /// \return Returns joint's cfm for end stops
@@ -127,24 +148,67 @@ namespace gazebo
         return this->stopERP;
       }
 
-      /// \brief internal variable to keep track of cfm damping internals
-      private: int cfmDampingState[3];
+      /// \brief EXPERIMENTAL: If specified damping coefficient is negative,
+      /// apply adaptive damping.  What this means is that
+      /// if resulting acceleration is outside of stability region,
+      /// then increase damping using a limiter based on (f, v).
+      /// This approach safeguards dynamics against unstable joint behavior
+      /// at low speed (|v| < vThreshold) and
+      /// high force (|f| > fThreshold) scenarios.
+      /// Stability region is determined by:
+      ///   max_damping_coefficient = f / ( sign(v) * max( |v|, vThreshold ) )
+      private: double ApplyAdaptiveDamping(unsigned int _index,
+                   const double _damping);
+
+      /// \brief Helper funciton to convert Kp and Kd to CFM and ERP
+      /// \param[in] _dt time step size
+      /// \param[in] _kp spring stiffness
+      /// \param[in] _kd spring damping
+      /// \param[out] _cfm equivalent constraint force mixing
+      /// \param[out] _erp equivalent error reduction parameter
+      private: void KpKdToCFMERP(const double _dt,
+                                 const double _kp, const double _kd,
+                                 double &_cfm, double &_erp);
+
+      /// \brief Helper funciton to convert CFM and ERP to Kp and Kd
+      /// \param[in] _dt time step size
+      /// \param[in] _cfm constraint force mixing
+      /// \param[in] _erp error reduction parameter
+      /// \param[out] _kp equivalent spring stiffness
+      /// \param[out] _kd equivalent spring damping
+      private: void CFMERPToKpKd(const double _dt,
+                                 const double _cfm, const double _erp,
+                                 double &_kp, double &_kd);
+
+      /// \brief internal variable to keep track of implicit damping internals
+      private: int implicitDampingState[MAX_JOINT_AXIS];
+
+      /// \brief save current implicit damping coefficient
+      private: double currentKd[MAX_JOINT_AXIS];
+
+      /// \brief save current implicit stiffness coefficient
+      private: double currentKp[MAX_JOINT_AXIS];
 
       /// \brief internal variable to keep track if ConnectJointUpdate
       /// has been called on a damping method
-      private: bool dampingInitialized;
+      private: bool stiffnessDampingInitialized;
+
+      /// \brief flag to use implicit joint stiffness damping if true.
+      private: bool useImplicitSpringDamper;
 
       // Documentation inherited.
-      public: virtual void SetHighStop(int _index, const math::Angle &_angle);
+      public: virtual bool SetHighStop(unsigned int _index,
+                  const math::Angle &_angle);
 
       // Documentation inherited.
-      public: virtual void SetLowStop(int _index, const math::Angle &_angle);
+      public: virtual bool SetLowStop(unsigned int _index,
+                  const math::Angle &_angle);
 
       // Documentation inherited.
-      public: virtual math::Angle GetHighStop(int _index);
+      public: virtual math::Angle GetHighStop(unsigned int _index);
 
       // Documentation inherited.
-      public: virtual math::Angle GetLowStop(int _index);
+      public: virtual math::Angle GetLowStop(unsigned int _index);
 
       // Documentation inherited.
       public: virtual math::Vector3 GetLinkForce(unsigned int _index) const;
@@ -153,37 +217,86 @@ namespace gazebo
       public: virtual math::Vector3 GetLinkTorque(unsigned int _index) const;
 
       // Documentation inherited.
-      public: virtual void SetAttribute(Attribute _attr, int _index,
-                                        double _value);
+      public: virtual void SetAttribute(Attribute _attr, unsigned int _index,
+                                        double _value) GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
 
       // Documentation inherited.
-      public: virtual void SetAttribute(const std::string &_key, int _index,
+      public: virtual bool SetParam(const std::string &_key,
+                                        unsigned int _index,
                                         const boost::any &_value);
 
       // Documentation inherited.
-      public: virtual double GetAttribute(const std::string &_key,
+      public: virtual void SetAttribute(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value)
+                                        GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      public: virtual double GetParam(const std::string &_key,
                                                 unsigned int _index);
 
-      /// \brief This is our ODE ID
-      protected: dJointID jointId;
+      // Documentation inherited.
+      public: virtual double GetAttribute(const std::string &_key,
+                unsigned int _index) GAZEBO_DEPRECATED(3.0);
 
-      /// \brief Feedback data for this joint
-      private: dJointFeedback *feedback;
+      // Documentation inherited.
+      public: virtual void SetProvideFeedback(bool _enable);
 
-      /// \brief Provide Feedback data for contact forces
-      private: bool provideFeedback;
+      // Documentation inherited.
+      public: virtual JointWrench GetForceTorque(unsigned int _index);
 
       // Documentation inherited.
-      public: virtual JointWrench GetForceTorque(int _index);
+      public: virtual void SetForce(unsigned int _index, double _force);
 
       // Documentation inherited.
-      public: virtual JointWrench GetForceTorque(unsigned int _index);
+      public: virtual double GetForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual void ApplyStiffnessDamping();
+
+      // Documentation inherited.
+      /// \brief Set the force applied to this physics::Joint.
+      /// Note that the unit of force should be consistent with the rest
+      /// of the simulation scales.
+      /// Force is additive (multiple calls
+      /// to SetForceImpl to the same joint in the same time
+      /// step will accumulate forces on that Joint).
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _force Force value.
+      protected: virtual void SetForceImpl(
+                     unsigned int _index, double _force) = 0;
+
+      /// \brief Save external forces applied to this Joint.
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _force Force value.
+      private: void SaveForce(unsigned int _index, double _force);
+
+      /// \brief This is our ODE ID
+      protected: dJointID jointId;
+
+      /// \brief Feedback data for this joint
+      private: dJointFeedback *feedback;
 
       /// \brief CFM for joint's limit constraint
       private: double stopCFM;
 
       /// \brief ERP for joint's limit constraint
       private: double stopERP;
+
+      /// \brief Save force applied by user
+      /// This plus the joint feedback (joint contstraint forces) is the
+      /// equivalent of simulated force torque sensor reading
+      /// Allocate a 2 vector in case hinge2 joint is used.
+      /// This is used by ODE to store external force applied by the user.
+      private: double forceApplied[MAX_JOINT_AXIS];
+
+      /// \brief Save time at which force is applied by user
+      /// This will let us know if it's time to clean up forceApplied.
+      private: common::Time forceAppliedTime;
     };
   }
 }
diff --git a/gazebo/physics/ode/ODEJoint_TEST.cc b/gazebo/physics/ode/ODEJoint_TEST.cc
index db39eef..93c93d9 100644
--- a/gazebo/physics/ode/ODEJoint_TEST.cc
+++ b/gazebo/physics/ode/ODEJoint_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,11 +16,12 @@
 */
 
 #include <gtest/gtest.h>
+#include "gazebo/physics/ode/ODETypes.hh"
+#include "gazebo/physics/ode/ODEJoint.hh"
 #include "gazebo/physics/physics.hh"
 #include "test/ServerFixture.hh"
 
 #define TOL 1e-6
-#define TOL_CONT 2.0
 using namespace gazebo;
 
 class ODEJoint_TEST : public ServerFixture
@@ -28,129 +29,13 @@ class ODEJoint_TEST : public ServerFixture
 };
 
 ////////////////////////////////////////////////////////////////////////
-// Load example world with a few joints
-// Measure force torques
-// with active torque control at joints
-////////////////////////////////////////////////////////////////////////
-TEST_F(ODEJoint_TEST, GetForceTorqueWithAppliedForce)
-{
-  // Load our force torque test world
-  Load("worlds/force_torque_demo2.world", true);
-
-  // Get a pointer to the world, make sure world loads
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // Verify physics engine type
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), "ode");
-
-  physics->SetGravity(math::Vector3(0, 0, -50));
-
-  // simulate 1 step
-  world->StepWorld(1);
-  double t = world->GetSimTime().Double();
-
-  // get time step size
-  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
-  EXPECT_GT(dt, 0);
-  gzdbg << "dt : " << dt << "\n";
-
-  // verify that time moves forward
-  EXPECT_GT(t, 0);
-  gzdbg << "t after one step : " << t << "\n";
-
-  // get joint and get force torque
-  physics::ModelPtr model_1 = world->GetModel("boxes");
-  physics::JointPtr joint_01 = model_1->GetJoint("joint1");
-  physics::JointPtr joint_12 = model_1->GetJoint("joint2");
-
-  gzdbg << "------------------- PD CONTROL -------------------\n";
-  static const double kp1 = 50000.0;
-  static const double kp2 = 10000.0;
-  for (unsigned int i = 0; i < 3388; ++i)
-  {
-    // pd control
-    double j1State = joint_01->GetAngle(0u).Radian();
-    double j2State = joint_12->GetAngle(0u).Radian();
-    double p1Error = -j1State;
-    double p2Error = -j2State;
-    double effort1 = kp1 * p1Error;
-    double effort2 = kp2 * p2Error;
-    joint_01->SetForce(0u, effort1);
-    joint_12->SetForce(0u, effort2);
-
-    world->StepWorld(1);
-    // test joint_01 wrench
-    physics::JointWrench wrench_01 = joint_01->GetForceTorque(0u);
-
-    if (i == 3387)
-    {
-      EXPECT_NEAR(wrench_01.body1Force.x,     0.0, TOL_CONT);
-      EXPECT_NEAR(wrench_01.body1Force.y,     0.0, TOL_CONT);
-      EXPECT_NEAR(wrench_01.body1Force.z,   300.0, TOL_CONT);
-      EXPECT_NEAR(wrench_01.body1Torque.x,    0.0, TOL_CONT);
-      EXPECT_NEAR(wrench_01.body1Torque.y, -200.0, TOL_CONT);
-      EXPECT_NEAR(wrench_01.body1Torque.z,    0.0, TOL_CONT);
-
-      EXPECT_NEAR(wrench_01.body2Force.x,  -wrench_01.body1Force.x,  TOL_CONT);
-      EXPECT_NEAR(wrench_01.body2Force.y,  -wrench_01.body1Force.y,  TOL_CONT);
-      EXPECT_NEAR(wrench_01.body2Force.z,  -wrench_01.body1Force.z,  TOL_CONT);
-      EXPECT_NEAR(wrench_01.body2Torque.x, -wrench_01.body1Torque.x, TOL_CONT);
-      EXPECT_NEAR(wrench_01.body2Torque.y, -wrench_01.body1Torque.y, TOL_CONT);
-      EXPECT_NEAR(wrench_01.body2Torque.z, -wrench_01.body1Torque.z, TOL_CONT);
-
-      gzdbg << "joint_01 force torque : "
-            << "step [" << i
-            << "] GetForce [" << joint_01->GetForce(0u)
-            << "] command [" << effort1
-            << "] force1 [" << wrench_01.body1Force
-            << "] torque1 [" << wrench_01.body1Torque
-            << "] force2 [" << wrench_01.body2Force
-            << "] torque2 [" << wrench_01.body2Torque
-            << "]\n";
-    }
-
-    // test joint_12 wrench
-    physics::JointWrench wrench_12 = joint_12->GetForceTorque(0u);
-    if (i == 3387)
-    {
-      EXPECT_NEAR(wrench_12.body1Force.x,     0.0, TOL_CONT);
-      EXPECT_NEAR(wrench_12.body1Force.y,     0.0, TOL_CONT);
-      EXPECT_NEAR(wrench_12.body1Force.z,    50.0, TOL_CONT);
-      EXPECT_NEAR(wrench_12.body1Torque.x,    0.0, TOL_CONT);
-      EXPECT_NEAR(wrench_12.body1Torque.y,  -25.0, TOL_CONT);
-      EXPECT_NEAR(wrench_12.body1Torque.z,    0.0, TOL_CONT);
-
-      EXPECT_NEAR(wrench_12.body2Force.x,  -wrench_12.body1Force.x,  TOL_CONT);
-      EXPECT_NEAR(wrench_12.body2Force.y,  -wrench_12.body1Force.y,  TOL_CONT);
-      EXPECT_NEAR(wrench_12.body2Force.z,  -wrench_12.body1Force.z,  TOL_CONT);
-      EXPECT_NEAR(wrench_12.body2Torque.x, -wrench_12.body1Torque.x, TOL_CONT);
-      EXPECT_NEAR(wrench_12.body2Torque.y, -wrench_12.body1Torque.y, TOL_CONT);
-      EXPECT_NEAR(wrench_12.body2Torque.z, -wrench_12.body1Torque.z, TOL_CONT);
-
-      gzdbg << "joint_12 force torque : "
-            << "step [" << i
-            << "] GetForce [" << joint_12->GetForce(0u)
-            << "] command [" << effort2
-            << "] force1 [" << wrench_12.body1Force
-            << "] torque1 [" << wrench_12.body1Torque
-            << "] force2 [" << wrench_12.body2Force
-            << "] torque2 [" << wrench_12.body2Torque
-            << "]\n";
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
 // Test multi-axis universal joints
-// with cfm damping
+// with implicit (cfm) damping
 ////////////////////////////////////////////////////////////////////////
-TEST_F(ODEJoint_TEST, CFMDamping)
+TEST_F(ODEJoint_TEST, ImplicitDamping)
 {
   // Load our force torque test world
-  Load("worlds/cfm_damping_test.world", true);
+  Load("worlds/implicit_damping_test.world", true);
 
   // Get a pointer to the world, make sure world loads
   physics::WorldPtr world = physics::get_world("default");
@@ -164,7 +49,7 @@ TEST_F(ODEJoint_TEST, CFMDamping)
   physics->SetGravity(math::Vector3(0, 0, -50));
 
   // simulate 1 step
-  world->StepWorld(1);
+  world->Step(1);
   double t = world->GetSimTime().Double();
 
   // get time step size
@@ -181,9 +66,14 @@ TEST_F(ODEJoint_TEST, CFMDamping)
   physics::JointPtr joint_0 = model_1->GetJoint("joint_0");
   physics::JointPtr joint_1 = model_1->GetJoint("joint_1");
 
+  EXPECT_TRUE(boost::dynamic_pointer_cast<physics::ODEJoint>(joint_0)->
+      UsesImplicitSpringDamper());
+  EXPECT_TRUE(boost::dynamic_pointer_cast<physics::ODEJoint>(joint_1)->
+      UsesImplicitSpringDamper());
+
   gzdbg << "-------------------Test 1 (y)-------------------\n";
   physics->SetGravity(math::Vector3(0, 10, 0));
-  world->StepWorld(100);
+  world->Step(100);
   EXPECT_NEAR(joint_0->GetAngle(0).Radian(), 0.0, 1e-6);
   EXPECT_NEAR(joint_1->GetAngle(0).Radian(), 0.0048295899143964149, 1e-5);
   EXPECT_NEAR(joint_1->GetAngle(1).Radian(), 0.0, 1e-6);
@@ -195,7 +85,7 @@ TEST_F(ODEJoint_TEST, CFMDamping)
 
   gzdbg << "-------------------Test 2 (x)-------------------\n";
   physics->SetGravity(math::Vector3(10, 0, 0));
-  world->StepWorld(100);
+  world->Step(100);
   EXPECT_NEAR(joint_0->GetAngle(0).Radian(), 0.0, 1e-6);
   EXPECT_NEAR(joint_1->GetAngle(0).Radian(), 0.0050046318305403403, 1e-5);
   EXPECT_NEAR(joint_1->GetAngle(1).Radian(), -0.0048293115636619532, 1e-5);
@@ -207,7 +97,7 @@ TEST_F(ODEJoint_TEST, CFMDamping)
 
   gzdbg << "-------------------Test 3 (joint limit)-------------------\n";
   physics->SetGravity(math::Vector3(1000, 1000, 0));
-  world->StepWorld(1000);
+  world->Step(1000);
   EXPECT_NEAR(joint_0->GetAngle(0).Radian(), 0.0, 0.001);
   EXPECT_NEAR(joint_1->GetAngle(0).Radian(), 0.7, 0.001);
   EXPECT_NEAR(joint_1->GetAngle(1).Radian(), -0.7, 0.001);
@@ -218,168 +108,6 @@ TEST_F(ODEJoint_TEST, CFMDamping)
         << "]\n";
 }
 
-////////////////////////////////////////////////////////////////////////
-// Load example world with a few joints
-// Measure force torques
-// Tip over the joints until joint stops are hit, then check force
-// torques again
-////////////////////////////////////////////////////////////////////////
-TEST_F(ODEJoint_TEST, GetForceTorque)
-{
-  // Load our force torque test world
-  Load("worlds/force_torque_demo.world", true);
-
-  // Get a pointer to the world, make sure world loads
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // Verify physics engine type
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), "ode");
-
-  physics->SetGravity(math::Vector3(0, 0, -50));
-
-  // simulate 1 step
-  world->StepWorld(1);
-  double t = world->GetSimTime().Double();
-
-  // get time step size
-  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
-  EXPECT_GT(dt, 0);
-  gzdbg << "dt : " << dt << "\n";
-
-  // verify that time moves forward
-  EXPECT_GT(t, 0);
-  gzdbg << "t after one step : " << t << "\n";
-
-  // get joint and get force torque
-  physics::ModelPtr model_1 = world->GetModel("model_1");
-  physics::JointPtr joint_01 = model_1->GetJoint("joint_01");
-  physics::JointPtr joint_12 = model_1->GetJoint("joint_12");
-
-  gzdbg << "-------------------Test 1-------------------\n";
-  for (unsigned int i = 0; i < 5; ++i)
-  {
-    world->StepWorld(1);
-    // test joint_01 wrench
-    physics::JointWrench wrench_01 = joint_01->GetForceTorque(0u);
-    EXPECT_NEAR(wrench_01.body1Force.x,    0.0, TOL);
-    EXPECT_NEAR(wrench_01.body1Force.y,    0.0, TOL);
-    EXPECT_NEAR(wrench_01.body1Force.z, 1000.0, TOL);
-    EXPECT_NEAR(wrench_01.body1Torque.x,   0.0, TOL);
-    EXPECT_NEAR(wrench_01.body1Torque.y,   0.0, TOL);
-    EXPECT_NEAR(wrench_01.body1Torque.z,   0.0, TOL);
-
-    EXPECT_NEAR(wrench_01.body2Force.x,  -wrench_01.body1Force.x,  TOL);
-    EXPECT_NEAR(wrench_01.body2Force.y,  -wrench_01.body1Force.y,  TOL);
-    EXPECT_NEAR(wrench_01.body2Force.z,  -wrench_01.body1Force.z,  TOL);
-    EXPECT_NEAR(wrench_01.body2Torque.x, -wrench_01.body1Torque.x, TOL);
-    EXPECT_NEAR(wrench_01.body2Torque.y, -wrench_01.body1Torque.y, TOL);
-    EXPECT_NEAR(wrench_01.body2Torque.z, -wrench_01.body1Torque.z, TOL);
-
-    gzdbg << "joint_01 force torque : "
-          << "force1 [" << wrench_01.body1Force
-          << "] torque1 [" << wrench_01.body1Torque
-          << "] force2 [" << wrench_01.body2Force
-          << "] torque2 [" << wrench_01.body2Torque
-          << "]\n";
-
-    // test joint_12 wrench
-    physics::JointWrench wrench_12 = joint_12->GetForceTorque(0u);
-    EXPECT_NEAR(wrench_12.body1Force.x,    0.0, TOL);
-    EXPECT_NEAR(wrench_12.body1Force.y,    0.0, TOL);
-    EXPECT_NEAR(wrench_12.body1Force.z,  500.0, TOL);
-    EXPECT_NEAR(wrench_12.body1Torque.x,   0.0, TOL);
-    EXPECT_NEAR(wrench_12.body1Torque.y,   0.0, TOL);
-    EXPECT_NEAR(wrench_12.body1Torque.z,   0.0, TOL);
-
-    EXPECT_NEAR(wrench_12.body2Force.x,  -wrench_12.body1Force.x,  TOL);
-    EXPECT_NEAR(wrench_12.body2Force.y,  -wrench_12.body1Force.y,  TOL);
-    EXPECT_NEAR(wrench_12.body2Force.z,  -wrench_12.body1Force.z,  TOL);
-    EXPECT_NEAR(wrench_12.body2Torque.x, -wrench_12.body1Torque.x, TOL);
-    EXPECT_NEAR(wrench_12.body2Torque.y, -wrench_12.body1Torque.y, TOL);
-    EXPECT_NEAR(wrench_12.body2Torque.z, -wrench_12.body1Torque.z, TOL);
-
-    gzdbg << "joint_12 force torque : "
-          << "force1 [" << wrench_12.body1Force
-          << "] torque1 [" << wrench_12.body1Torque
-          << "] force2 [" << wrench_12.body2Force
-          << "] torque2 [" << wrench_12.body2Torque
-          << "]\n";
-  }
-
-  // perturbe joints so top link topples over, then remeasure
-  physics->SetGravity(math::Vector3(-30, 10, -50));
-  // tune joint stop properties
-  joint_01->SetAttribute("stop_erp", 0, 0.02);
-  joint_12->SetAttribute("stop_erp", 0, 0.02);
-  // wait for dynamics to stabilize
-  world->StepWorld(2000);
-  // check force torques in new system
-  gzdbg << "\n-------------------Test 2-------------------\n";
-  for (unsigned int i = 0; i < 5; ++i)
-  {
-    world->StepWorld(1);
-
-    // test joint_01 wrench
-    physics::JointWrench wrench_01 = joint_01->GetForceTorque(0u);
-    EXPECT_NEAR(wrench_01.body1Force.x,   600.0,  6.0);
-    EXPECT_NEAR(wrench_01.body1Force.y, -1000.0, 10.0);
-    EXPECT_NEAR(wrench_01.body1Force.z,  -200.0,  2.0);
-    EXPECT_NEAR(wrench_01.body1Torque.x,  750.0,  7.5);
-    EXPECT_NEAR(wrench_01.body1Torque.y,  450.0,  4.5);
-    EXPECT_NEAR(wrench_01.body1Torque.z,    0.0,  0.1);
-
-    // since first link is world, these should be exact
-    EXPECT_NEAR(wrench_01.body2Force.x,  -wrench_01.body1Force.x,  TOL);
-    EXPECT_NEAR(wrench_01.body2Force.y,  -wrench_01.body1Force.y,  TOL);
-    EXPECT_NEAR(wrench_01.body2Force.z,  -wrench_01.body1Force.z,  TOL);
-    EXPECT_NEAR(wrench_01.body2Torque.x, -wrench_01.body1Torque.x, TOL);
-    EXPECT_NEAR(wrench_01.body2Torque.y, -wrench_01.body1Torque.y, TOL);
-    EXPECT_NEAR(wrench_01.body2Torque.z, -wrench_01.body1Torque.z, TOL);
-
-    gzdbg << "joint_01 force torque : "
-          << "force1 [" << wrench_01.body1Force
-          << "] torque1 [" << wrench_01.body1Torque
-          << "] force2 [" << wrench_01.body2Force
-          << "] torque2 [" << wrench_01.body2Torque
-          << "]\n";
-
-    // test joint_12 wrench
-    physics::JointWrench wrench_12 = joint_12->GetForceTorque(0u);
-    EXPECT_NEAR(wrench_12.body1Force.x,   300.0,  3.0);
-    EXPECT_NEAR(wrench_12.body1Force.y,  -500.0,  5.0);
-    EXPECT_NEAR(wrench_12.body1Force.z,  -100.0,  1.0);
-    EXPECT_NEAR(wrench_12.body1Torque.x,  250.0,  5.0);
-    EXPECT_NEAR(wrench_12.body1Torque.y,  150.0,  3.0);
-    EXPECT_NEAR(wrench_12.body1Torque.z,    0.0,  0.1);
-
-    // A good check is that
-    // the computed body1Torque shoud in fact be opposite of body1Torque
-    EXPECT_NEAR(wrench_12.body2Force.x,  -wrench_12.body1Force.x,  1e-1);
-    EXPECT_NEAR(wrench_12.body2Force.y,  -wrench_12.body1Force.y,  1e-1);
-    EXPECT_NEAR(wrench_12.body2Force.z,  -wrench_12.body1Force.z,  1e-1);
-    EXPECT_NEAR(wrench_12.body2Torque.x, -wrench_12.body1Torque.x, 1e-1);
-    EXPECT_NEAR(wrench_12.body2Torque.y, -wrench_12.body1Torque.y, 1e-1);
-    EXPECT_NEAR(wrench_12.body2Torque.z, -wrench_12.body1Torque.z, 1e-1);
-
-    gzdbg << "joint_12 force torque : "
-          << "force1 [" << wrench_12.body1Force
-          << "] torque1 [" << wrench_12.body1Torque
-          << "] force2 [" << wrench_12.body2Force
-          << "] torque2 [" << wrench_12.body2Torque
-          << "]\n";
-  }
-
-  // simulate a few steps
-  int steps = 20;
-  world->StepWorld(steps);
-  t = world->GetSimTime().Double();
-  EXPECT_GT(t, 0.99*dt*static_cast<double>(steps+1));
-  gzdbg << "t after 20 steps : " << t << "\n";
-}
-
 int main(int argc, char **argv)
 {
   ::testing::InitGoogleTest(&argc, argv);
diff --git a/gazebo/physics/ode/ODELink.cc b/gazebo/physics/ode/ODELink.cc
index 8a679e2..9c93e70 100644
--- a/gazebo/physics/ode/ODELink.cc
+++ b/gazebo/physics/ode/ODELink.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,7 +30,7 @@
 #include "gazebo/physics/World.hh"
 #include "gazebo/physics/Model.hh"
 #include "gazebo/physics/ode/ODECollision.hh"
-#include "gazebo/physics/SurfaceParams.hh"
+#include "gazebo/physics/ode/ODESurfaceParams.hh"
 #include "gazebo/physics/ode/ODEPhysics.hh"
 #include "gazebo/physics/ode/ODELink.hh"
 
@@ -87,8 +87,8 @@ void ODELink::Init()
   }
 
   GZ_ASSERT(this->sdf != NULL, "Unable to initialize link, SDF is NULL");
-  this->SetKinematic(this->sdf->GetValueBool("kinematic"));
-  this->SetGravityMode(this->sdf->GetValueBool("gravity"));
+  this->SetKinematic(this->sdf->Get<bool>("kinematic"));
+  this->SetGravityMode(this->sdf->Get<bool>("gravity"));
 
   this->SetLinearDamping(this->GetLinearDamping());
   this->SetAngularDamping(this->GetAngularDamping());
@@ -126,20 +126,20 @@ void ODELink::Init()
           dGeomSetOffsetQuaternion(g->GetCollisionId(), q);
 
           // Set max_vel and min_depth
-          if (g->GetSurface()->maxVel < 0)
+          if (g->GetODESurface()->maxVel < 0)
           {
-            g->GetSurface()->maxVel =
+            g->GetODESurface()->maxVel =
              this->GetWorld()->GetPhysicsEngine()->GetContactMaxCorrectingVel();
           }
-          dBodySetMaxVel(this->linkId, g->GetSurface()->maxVel);
-          dBodySetMinDepth(this->linkId, g->GetSurface()->minDepth);
+          dBodySetMaxVel(this->linkId, g->GetODESurface()->maxVel);
+          dBodySetMinDepth(this->linkId, g->GetODESurface()->minDepth);
         }
       }
     }
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to place collision bodies"
           << " in ODELink::Init" << std::endl;
   }
@@ -152,9 +152,9 @@ void ODELink::Init()
     dBodySetMovedCallback(this->linkId, MoveCallback);
     dBodySetDisabledCallback(this->linkId, DisabledCallback);
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to set callbacks in ODELink::Init"
           << std::endl;
   }
@@ -204,12 +204,6 @@ void ODELink::Fini()
 }
 
 //////////////////////////////////////////////////
-void ODELink::Update()
-{
-  Link::Update();
-}
-
-//////////////////////////////////////////////////
 void ODELink::SetGravityMode(bool _mode)
 {
   this->sdf->GetElement("gravity")->Set(_mode);
@@ -217,9 +211,9 @@ void ODELink::SetGravityMode(bool _mode)
   {
     dBodySetGravityMode(this->linkId, _mode ? 1: 0);
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to SetGravityMode" << std::endl;
   }
 }
@@ -232,9 +226,9 @@ bool ODELink::GetGravityMode() const
   {
     mode = dBodyGetGravityMode(this->linkId);
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, GetGravityMode returns default of "
           << mode << std::endl;
   }
@@ -257,9 +251,10 @@ void ODELink::OnPoseChange()
 
   if (!this->linkId)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
-          << " does not exist, unable to respond to OnPoseChange"
-          << std::endl;
+    if (!this->IsStatic() && this->initialized)
+      gzlog << "ODE body for link [" << this->GetScopedName() << "]"
+            << " does not exist, unable to respond to OnPoseChange"
+            << std::endl;
     return;
   }
 
@@ -298,8 +293,9 @@ void ODELink::SetEnabled(bool _enable) const
 {
   if (!this->linkId)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
-          << " does not exist, unable to SetEnabled" << std::endl;
+    if (!this->IsStatic() && this->initialized)
+      gzlog << "ODE body for link [" << this->GetScopedName() << "]"
+            << " does not exist, unable to SetEnabled" << std::endl;
     return;
   }
 
@@ -316,9 +312,9 @@ bool ODELink::GetEnabled() const
 
   if (this->linkId)
     result = dBodyIsEnabled(this->linkId);
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, GetEnabled returns default of "
           << result << std::endl;
   }
@@ -339,8 +335,8 @@ void ODELink::UpdateSurface()
       if (g->IsPlaceable() && g->GetCollisionId())
       {
         // Set surface properties max_vel and min_depth
-        dBodySetMaxVel(this->linkId, g->GetSurface()->maxVel);
-        dBodySetMinDepth(this->linkId, g->GetSurface()->minDepth);
+        dBodySetMaxVel(this->linkId, g->GetODESurface()->maxVel);
+        dBodySetMinDepth(this->linkId, g->GetODESurface()->minDepth);
       }
     }
   }
@@ -350,8 +346,9 @@ void ODELink::UpdateMass()
 {
   if (!this->linkId)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
-          << " does not exist, unable to UpdateMass" << std::endl;
+    if (!this->IsStatic() && this->initialized)
+      gzlog << "ODE body for link [" << this->GetScopedName() << "]"
+            << " does not exist, unable to UpdateMass" << std::endl;
     return;
   }
 
@@ -376,7 +373,7 @@ void ODELink::UpdateMass()
   if (this->inertial->GetMass() > 0)
     dBodySetMass(this->linkId, &odeMass);
   else
-    gzthrow("Setting custom link " + this->GetName() + "mass to zero!");
+    gzthrow("Setting custom link " + this->GetScopedName() + "mass to zero!");
 }
 
 //////////////////////////////////////////////////
@@ -386,8 +383,8 @@ void ODELink::SetLinearVel(const math::Vector3 &_vel)
   {
     dBodySetLinearVel(this->linkId, _vel.x, _vel.y, _vel.z);
   }
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic())
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to SetLinearVel" << std::endl;
 }
 
@@ -405,13 +402,12 @@ math::Vector3 ODELink::GetWorldLinearVel(const math::Vector3 &_offset) const
         offsetFromCoG.z, dvel);
     vel.Set(dvel[0], dvel[1], dvel[2]);
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, GetWorldLinearVel returns default of "
           << vel << std::endl;
   }
-
   return vel;
 }
 
@@ -433,9 +429,9 @@ math::Vector3 ODELink::GetWorldLinearVel(const math::Vector3 &_offset,
         offsetFromCoG.z, dvel);
     vel.Set(dvel[0], dvel[1], dvel[2]);
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, GetWorldLinearVel returns default of "
           << vel << std::endl;
   }
@@ -454,9 +450,9 @@ math::Vector3 ODELink::GetWorldCoGLinearVel() const
     dvel = dBodyGetLinearVel(this->linkId);
     vel.Set(dvel[0], dvel[1], dvel[2]);
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, GetWorldCoGLinearVel returns default of "
           << vel << std::endl;
   }
@@ -471,8 +467,8 @@ void ODELink::SetAngularVel(const math::Vector3 &_vel)
   {
     dBodySetAngularVel(this->linkId, _vel.x, _vel.y, _vel.z);
   }
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic())
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to SetAngularVel" << std::endl;
 }
 
@@ -489,9 +485,9 @@ math::Vector3 ODELink::GetWorldAngularVel() const
 
     vel.Set(dvel[0], dvel[1], dvel[2]);
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, GetWorldAngularVel returns default of "
           << vel << std::endl;
   }
@@ -507,8 +503,8 @@ void ODELink::SetForce(const math::Vector3 &_force)
     this->SetEnabled(true);
     dBodySetForce(this->linkId, _force.x, _force.y, _force.z);
   }
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic())
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to SetForce" << std::endl;
 }
 
@@ -520,8 +516,8 @@ void ODELink::SetTorque(const math::Vector3 &_torque)
     this->SetEnabled(true);
     dBodySetTorque(this->linkId, _torque.x, _torque.y, _torque.z);
   }
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic())
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to SetTorque" << std::endl;
 }
 
@@ -533,8 +529,8 @@ void ODELink::AddForce(const math::Vector3 &_force)
     this->SetEnabled(true);
     dBodyAddForce(this->linkId, _force.x, _force.y, _force.z);
   }
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic())
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to AddForce" << std::endl;
 }
 
@@ -546,8 +542,8 @@ void ODELink::AddRelativeForce(const math::Vector3 &_force)
     this->SetEnabled(true);
     dBodyAddRelForce(this->linkId, _force.x, _force.y, _force.z);
   }
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic())
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to AddRelativeForce" << std::endl;
 }
 
@@ -561,9 +557,9 @@ void ODELink::AddForceAtRelativePosition(const math::Vector3 &_force,
     dBodyAddForceAtRelPos(this->linkId, _force.x, _force.y, _force.z,
                           _relpos.x, _relpos.y, _relpos.z);
   }
-  else
+  else if (!this->IsStatic())
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to AddForceAtRelativePosition"
           << std::endl;
   }
@@ -579,9 +575,9 @@ void ODELink::AddForceAtWorldPosition(const math::Vector3 &_force,
     dBodyAddForceAtPos(this->linkId, _force.x, _force.y, _force.z,
                           _pos.x, _pos.y, _pos.z);
   }
-  else
+  else if (!this->IsStatic())
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to AddForceAtWorldPosition"
           << std::endl;
   }
@@ -595,8 +591,8 @@ void ODELink::AddTorque(const math::Vector3 &_torque)
     this->SetEnabled(true);
     dBodyAddTorque(this->linkId, _torque.x, _torque.y, _torque.z);
   }
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic())
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to AddTorque" << std::endl;
 }
 
@@ -608,8 +604,8 @@ void ODELink::AddRelativeTorque(const math::Vector3 &_torque)
     this->SetEnabled(true);
     dBodyAddRelTorque(this->linkId, _torque.x, _torque.y, _torque.z);
   }
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic())
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to AddRelativeTorque" << std::endl;
 }
 
@@ -628,9 +624,9 @@ math::Vector3 ODELink::GetWorldForce() const
     force.y = dforce[1];
     force.z = dforce[2];
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, GetWorldForce returns default of "
           << force << std::endl;
   }
@@ -653,9 +649,9 @@ math::Vector3 ODELink::GetWorldTorque() const
     torque.y = dtorque[1];
     torque.z = dtorque[2];
   }
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, GetWorldTorque returns default of "
           << torque << std::endl;
   }
@@ -680,8 +676,8 @@ void ODELink::SetLinearDamping(double _damping)
 {
   if (this->GetODEId())
     dBodySetLinearDamping(this->GetODEId(), _damping);
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic() && this->initialized)
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to SetLinearDamping" << std::endl;
 }
 
@@ -690,8 +686,8 @@ void ODELink::SetAngularDamping(double _damping)
 {
   if (this->GetODEId())
     dBodySetAngularDamping(this->GetODEId(), _damping);
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic() && this->initialized)
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to SetAngularDamping" << std::endl;
 }
 
@@ -701,13 +697,13 @@ void ODELink::SetKinematic(const bool &_state)
   this->sdf->GetElement("kinematic")->Set(_state);
   if (this->linkId)
   {
-    if (_state)
+    if (_state && !dBodyIsKinematic(this->linkId))
       dBodySetKinematic(this->linkId);
-    else
+    else if (dBodyIsKinematic(this->linkId))
       dBodySetDynamic(this->linkId);
   }
-  else
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+  else if (!this->IsStatic() && this->initialized)
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to SetKinematic" << std::endl;
 }
 
@@ -718,9 +714,9 @@ bool ODELink::GetKinematic() const
 
   if (this->linkId)
     result = dBodyIsKinematic(this->linkId);
-  else
+  else if (!this->IsStatic() && this->initialized)
   {
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, GetKinematic returns default of "
           << result << std::endl;
   }
@@ -736,8 +732,14 @@ void ODELink::SetAutoDisable(bool _disable)
     dBodySetAutoDisableFlag(this->linkId, _disable);
   }
   else if (!this->linkId)
-    gzlog << "ODE body for link [" << this->GetName() << "]"
+    gzlog << "ODE body for link [" << this->GetScopedName() << "]"
           << " does not exist, unable to SetAutoDisable" << std::endl;
   else
     gzlog << "ODE model has joints, unable to SetAutoDisable" << std::endl;
 }
+
+//////////////////////////////////////////////////
+void ODELink::SetLinkStatic(bool /*_static*/)
+{
+  gzlog << "To be implemented\n";
+}
diff --git a/gazebo/physics/ode/ODELink.hh b/gazebo/physics/ode/ODELink.hh
index 4b7ec79..0d60583 100644
--- a/gazebo/physics/ode/ODELink.hh
+++ b/gazebo/physics/ode/ODELink.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,13 +24,14 @@
 #include "gazebo/physics/ode/ode_inc.h"
 #include "gazebo/physics/ode/ODETypes.hh"
 #include "gazebo/physics/Link.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief ODE Link class.
-    class ODELink : public Link
+    class GAZEBO_VISIBLE ODELink : public Link
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent model.
@@ -49,9 +50,6 @@ namespace gazebo
       public: virtual void Fini();
 
       // Documentation inherited
-      public: virtual void Update();
-
-      // Documentation inherited
       public: virtual void OnPoseChange();
 
       // Documentation inherited
@@ -165,6 +163,9 @@ namespace gazebo
       /// \param[in] _id Id of the body.
       public: static void MoveCallback(dBodyID _id);
 
+      // Documentation inherited
+      public: virtual void SetLinkStatic(bool _static);
+
       /// \brief ODE link handle
       private: dBodyID linkId;
 
diff --git a/gazebo/physics/ode/ODEMeshShape.cc b/gazebo/physics/ode/ODEMeshShape.cc
new file mode 100644
index 0000000..cf3ca74
--- /dev/null
+++ b/gazebo/physics/ode/ODEMeshShape.cc
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/* Desc: ODE Trimesh shape
+ * Author: Nate Koenig
+ * Date: 16 Oct 2009
+ */
+
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/physics/ode/ODECollision.hh"
+#include "gazebo/physics/ode/ODEPhysics.hh"
+#include "gazebo/physics/ode/ODEMeshShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+
+//////////////////////////////////////////////////
+ODEMeshShape::ODEMeshShape(CollisionPtr _parent) : MeshShape(_parent)
+{
+  this->odeData = NULL;
+  this->vertices = NULL;
+  this->indices = NULL;
+}
+
+//////////////////////////////////////////////////
+ODEMeshShape::~ODEMeshShape()
+{
+  delete [] this->vertices;
+  delete [] this->indices;
+  dGeomTriMeshDataDestroy(this->odeData);
+}
+
+//////////////////////////////////////////////////
+void ODEMeshShape::Update()
+{
+  ODECollisionPtr ocollision =
+    boost::dynamic_pointer_cast<ODECollision>(this->collisionParent);
+
+  /// FIXME: use below to update trimesh geometry for collision without
+  // using above Ogre codes
+  // tell the tri-tri collider the current transform of the trimesh --
+  // this is fairly important for good results.
+
+  // Fill in the (4x4) matrix.
+  dReal *matrix = this->transform + (this->transformIndex * 16);
+  const dReal *Pos = dGeomGetPosition(ocollision->GetCollisionId());
+  const dReal *Rot = dGeomGetRotation(ocollision->GetCollisionId());
+
+  matrix[ 0 ] = Rot[ 0 ];
+  matrix[ 1 ] = Rot[ 1 ];
+  matrix[ 2 ] = Rot[ 2 ];
+  matrix[ 3 ] = 0;
+  matrix[ 4 ] = Rot[ 4 ];
+  matrix[ 5 ] = Rot[ 5 ];
+  matrix[ 6 ] = Rot[ 6 ];
+  matrix[ 7 ] = 0;
+  matrix[ 8 ] = Rot[ 8 ];
+  matrix[ 9 ] = Rot[ 9 ];
+  matrix[10 ] = Rot[10 ];
+  matrix[11 ] = 0;
+  matrix[12 ] = Pos[ 0 ];
+  matrix[13 ] = Pos[ 1 ];
+  matrix[14 ] = Pos[ 2 ];
+  matrix[15 ] = 1;
+
+  // Flip to other matrix.
+  this->transformIndex = !this->transformIndex;
+
+  dGeomTriMeshSetLastTransform(ocollision->GetCollisionId(),
+      *reinterpret_cast<dMatrix4*>(this->transform +
+                                   this->transformIndex * 16));
+}
+
+//////////////////////////////////////////////////
+void ODEMeshShape::Load(sdf::ElementPtr _sdf)
+{
+  MeshShape::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void ODEMeshShape::Init()
+{
+  MeshShape::Init();
+  if (!this->mesh)
+    return;
+
+  ODECollisionPtr pcollision =
+    boost::static_pointer_cast<ODECollision>(this->collisionParent);
+
+  /// This will hold the vertex data of the triangle mesh
+  if (this->odeData == NULL)
+    this->odeData = dGeomTriMeshDataCreate();
+
+  unsigned int numVertices = this->submesh ? this->submesh->GetVertexCount() :
+    this->mesh->GetVertexCount();
+
+  unsigned int numIndices = this->submesh ? this->submesh->GetIndexCount() :
+    this->mesh->GetIndexCount();
+
+  this->vertices = NULL;
+  this->indices = NULL;
+
+  // Get all the vertex and index data
+  if (!this->submesh)
+    this->mesh->FillArrays(&this->vertices, &this->indices);
+  else
+    this->submesh->FillArrays(&this->vertices, &this->indices);
+
+  // Scale the vertex data
+  for (unsigned int j = 0;  j < numVertices; j++)
+  {
+    this->vertices[j*3+0] = this->vertices[j*3+0] *
+      this->sdf->Get<math::Vector3>("scale").x;
+    this->vertices[j*3+1] = this->vertices[j*3+1] *
+      this->sdf->Get<math::Vector3>("scale").y;
+    this->vertices[j*3+2] = this->vertices[j*3+2] *
+      this->sdf->Get<math::Vector3>("scale").z;
+  }
+
+  // Build the ODE triangle mesh
+  dGeomTriMeshDataBuildSingle(this->odeData,
+      this->vertices, 3*sizeof(this->vertices[0]), numVertices,
+      this->indices, numIndices, 3*sizeof(this->indices[0]));
+
+  if (pcollision->GetCollisionId() == NULL)
+  {
+    pcollision->SetSpaceId(dSimpleSpaceCreate(pcollision->GetSpaceId()));
+    pcollision->SetCollision(dCreateTriMesh(pcollision->GetSpaceId(),
+          this->odeData, 0, 0, 0), true);
+  }
+  else
+  {
+    dGeomTriMeshSetData(pcollision->GetCollisionId(), this->odeData);
+  }
+
+  memset(this->transform, 0, 32*sizeof(dReal));
+  this->transformIndex = 0;
+}
diff --git a/gazebo/physics/ode/ODEMeshShape.hh b/gazebo/physics/ode/ODEMeshShape.hh
new file mode 100644
index 0000000..8a7a9f2
--- /dev/null
+++ b/gazebo/physics/ode/ODEMeshShape.hh
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/* Desc: Trimesh geometry
+ * Author: Nate Koenig
+ * Date: 16 Oct 2009
+ */
+
+#ifndef _ODEMESHSHAPE_HH_
+#define _ODEMESHSHAPE_HH_
+
+#include "gazebo/physics/MeshShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \brief Triangle mesh collision.
+    class GAZEBO_VISIBLE ODEMeshShape : public MeshShape
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent collision object.
+      public: explicit ODEMeshShape(CollisionPtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~ODEMeshShape();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual void Update();
+
+      /// \brief Transform matrix.
+      private: dReal transform[16*2];
+
+      /// \brief Transform matrix index.
+      private: int transformIndex;
+
+      /// \brief Array of vertex values.
+      private: float *vertices;
+
+      /// \brief Array of index values.
+      private: int *indices;
+
+      /// \brief ODE trimesh data.
+      private: dTriMeshDataID odeData;
+    };
+  }
+}
+#endif
diff --git a/gazebo/physics/ode/ODEMultiRayShape.cc b/gazebo/physics/ode/ODEMultiRayShape.cc
index 0c6583f..972ea00 100644
--- a/gazebo/physics/ode/ODEMultiRayShape.cc
+++ b/gazebo/physics/ode/ODEMultiRayShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,16 @@
  * limitations under the License.
  *
  */
-#include "common/Exception.hh"
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Exception.hh"
 
-#include "physics/World.hh"
-#include "physics/ode/ODETypes.hh"
-#include "physics/ode/ODELink.hh"
-#include "physics/ode/ODECollision.hh"
-#include "physics/ode/ODEPhysics.hh"
-#include "physics/ode/ODERayShape.hh"
-#include "physics/ode/ODEMultiRayShape.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/ode/ODETypes.hh"
+#include "gazebo/physics/ode/ODELink.hh"
+#include "gazebo/physics/ode/ODECollision.hh"
+#include "gazebo/physics/ode/ODEPhysics.hh"
+#include "gazebo/physics/ode/ODERayShape.hh"
+#include "gazebo/physics/ode/ODEMultiRayShape.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -87,9 +88,6 @@ void ODEMultiRayShape::UpdateRays()
 void ODEMultiRayShape::UpdateCallback(void *_data, dGeomID _o1, dGeomID _o2)
 {
   dContactGeom contact;
-  ODECollision *collision1, *collision2 = NULL;
-  ODECollision *rayCollision = NULL;
-  ODECollision *hitCollision = NULL;
   ODEMultiRayShape *self = NULL;
 
   self = static_cast<ODEMultiRayShape*>(_data);
@@ -107,8 +105,8 @@ void ODEMultiRayShape::UpdateCallback(void *_data, dGeomID _o1, dGeomID _o2)
   }
   else
   {
-    collision1 = NULL;
-    collision2 = NULL;
+    ODECollision *collision1 = NULL;
+    ODECollision *collision2 = NULL;
 
     // Get pointers to the underlying collisions
     if (dGeomGetClass(_o1) == dGeomTransformClass)
@@ -129,10 +127,11 @@ void ODEMultiRayShape::UpdateCallback(void *_data, dGeomID _o1, dGeomID _o2)
       collision2 = static_cast<ODECollision*>(dGeomGetData(_o2));
     }
 
-    assert(collision1 && collision2);
+    GZ_ASSERT(collision1, "collision1 is null");
+    GZ_ASSERT(collision2, "collision2 is null");
 
-    rayCollision = NULL;
-    hitCollision = NULL;
+    ODECollision *rayCollision = NULL;
+    ODECollision *hitCollision = NULL;
 
     // Figure out which one is a ray; note that this assumes
     // that the ODE dRayClass is used *soley* by the RayCollision.
@@ -145,7 +144,7 @@ void ODEMultiRayShape::UpdateCallback(void *_data, dGeomID _o1, dGeomID _o2)
     }
     else if (dGeomGetClass(_o2) == dRayClass)
     {
-      assert(rayCollision == NULL);
+      GZ_ASSERT(rayCollision == NULL, "rayCollision is not null");
       rayCollision = static_cast<ODECollision*>(collision2);
       hitCollision = static_cast<ODECollision*>(collision1);
       dGeomRaySetParams(_o2, 0, 0);
@@ -169,9 +168,9 @@ void ODEMultiRayShape::UpdateCallback(void *_data, dGeomID _o1, dGeomID _o2)
           //        << ", " << contact.pos[1]
           //        << ", " << contact.pos[2]
           //        << ", " << "]"
-          //      << " ray[" << rayCollision->GetName() << "]"
+          //      << " ray[" << rayCollision->GetScopedName() << "]"
           //      << " pose[" << rayCollision->GetWorldPose() << "]"
-          //      << " hit[" << hitCollision->GetName() << "]"
+          //      << " hit[" << hitCollision->GetScopedName() << "]"
           //      << " pose[" << hitCollision->GetWorldPose() << "]"
           //      << "\n";
           shape->SetLength(contact.depth);
diff --git a/gazebo/physics/ode/ODEMultiRayShape.hh b/gazebo/physics/ode/ODEMultiRayShape.hh
index cd62420..d873e4e 100644
--- a/gazebo/physics/ode/ODEMultiRayShape.hh
+++ b/gazebo/physics/ode/ODEMultiRayShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,13 +18,14 @@
 #define _ODEMULTIRAYSHAPE_HH_
 
 #include "gazebo/physics/MultiRayShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief ODE specific version of MultiRayShape
-    class ODEMultiRayShape : public MultiRayShape
+    class GAZEBO_VISIBLE ODEMultiRayShape : public MultiRayShape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent Collision.
diff --git a/gazebo/physics/ode/ODEPhysics.cc b/gazebo/physics/ode/ODEPhysics.cc
index fbc6c34..9b1343c 100644
--- a/gazebo/physics/ode/ODEPhysics.cc
+++ b/gazebo/physics/ode/ODEPhysics.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,14 +14,17 @@
  * limitations under the License.
  *
 */
-/* Desc: The ODE physics engine wrapper
- * Author: Nate Koenig
- * Date: 11 June 2007
- */
 #include <tbb/parallel_for.h>
 #include <tbb/blocked_range.h>
 
-#include "gazebo/gazebo_config.h"
+#include <sdf/sdf.hh>
+
+#include <algorithm>
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
 #include "gazebo/util/Diagnostics.hh"
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Console.hh"
@@ -47,6 +50,7 @@
 #include "gazebo/physics/ode/ODELink.hh"
 #include "gazebo/physics/ode/ODEScrewJoint.hh"
 #include "gazebo/physics/ode/ODEHingeJoint.hh"
+#include "gazebo/physics/ode/ODEGearboxJoint.hh"
 #include "gazebo/physics/ode/ODEHinge2Joint.hh"
 #include "gazebo/physics/ode/ODESliderJoint.hh"
 #include "gazebo/physics/ode/ODEBallJoint.hh"
@@ -57,11 +61,12 @@
 #include "gazebo/physics/ode/ODESphereShape.hh"
 #include "gazebo/physics/ode/ODECylinderShape.hh"
 #include "gazebo/physics/ode/ODEPlaneShape.hh"
-#include "gazebo/physics/ode/ODETrimeshShape.hh"
+#include "gazebo/physics/ode/ODEMeshShape.hh"
 #include "gazebo/physics/ode/ODEMultiRayShape.hh"
 #include "gazebo/physics/ode/ODEHeightmapShape.hh"
 
 #include "gazebo/physics/ode/ODEPhysics.hh"
+#include "gazebo/physics/ode/ODESurfaceParams.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -115,7 +120,7 @@ class Colliders_TBB
 
 //////////////////////////////////////////////////
 ODEPhysics::ODEPhysics(WorldPtr _world)
-    : PhysicsEngine(_world)
+    : PhysicsEngine(_world), physicsStepFunc(NULL), maxContacts(0)
 {
   // Collision detection init
   dInitODE2(0);
@@ -169,21 +174,24 @@ void ODEPhysics::Load(sdf::ElementPtr _sdf)
 {
   PhysicsEngine::Load(_sdf);
 
+  this->maxContacts = _sdf->Get<unsigned int>("max_contacts");
+  this->SetMaxContacts(this->maxContacts);
+
   sdf::ElementPtr odeElem = this->sdf->GetElement("ode");
   sdf::ElementPtr solverElem = odeElem->GetElement("solver");
 
-  this->stepType = solverElem->GetValueString("type");
+  this->stepType = solverElem->Get<std::string>("type");
 
   dWorldSetDamping(this->worldId, 0.0001, 0.0001);
 
   // Help prevent "popping of deeply embedded object
   dWorldSetContactMaxCorrectingVel(this->worldId,
-      odeElem->GetElement("constraints")->GetValueDouble(
+      odeElem->GetElement("constraints")->Get<double>(
         "contact_max_correcting_vel"));
 
   // This helps prevent jittering problems.
   dWorldSetContactSurfaceLayer(this->worldId,
-       odeElem->GetElement("constraints")->GetValueDouble(
+       odeElem->GetElement("constraints")->Get<double>(
         "contact_surface_layer"));
 
   // Enable auto-disable by default. Models with joints are excluded from
@@ -195,7 +203,7 @@ void ODEPhysics::Load(sdf::ElementPtr _sdf)
   dWorldSetAutoDisableAngularThreshold(this->worldId, 0.1);
   dWorldSetAutoDisableSteps(this->worldId, 5);
 
-  math::Vector3 g = this->sdf->GetValueVector3("gravity");
+  math::Vector3 g = this->sdf->Get<math::Vector3>("gravity");
 
   if (g == math::Vector3(0, 0, 0))
     gzwarn << "Gravity vector is (0, 0, 0). Objects will float.\n";
@@ -205,9 +213,9 @@ void ODEPhysics::Load(sdf::ElementPtr _sdf)
   if (odeElem->HasElement("constraints"))
   {
     dWorldSetCFM(this->worldId,
-        odeElem->GetElement("constraints")->GetValueDouble("cfm"));
+        odeElem->GetElement("constraints")->Get<double>("cfm"));
     dWorldSetERP(this->worldId,
-        odeElem->GetElement("constraints")->GetValueDouble("erp"));
+        odeElem->GetElement("constraints")->Get<double>("erp"));
   }
   else
     dWorldSetERP(this->worldId, 0.2);
@@ -216,11 +224,8 @@ void ODEPhysics::Load(sdf::ElementPtr _sdf)
   dWorldSetQuickStepW(this->worldId, this->GetSORPGSW());
 
   // Set the physics update function
-  if (this->stepType == "quick")
-    this->physicsStepFunc = &dWorldQuickStep;
-  else if (this->stepType == "world")
-    this->physicsStepFunc = &dWorldStep;
-  else
+  this->SetStepType(this->stepType);
+  if (this->physicsStepFunc == NULL)
     gzthrow(std::string("Invalid step type[") + this->stepType);
 }
 
@@ -240,7 +245,7 @@ void ODEPhysics::OnRequest(ConstRequestPtr &_msg)
     physicsMsg.set_solver_type(this->stepType);
     // min_step_size is defined but not yet used
     physicsMsg.set_min_step_size(
-        boost::any_cast<double>(this->GetParam(MIN_STEP_SIZE)));
+        boost::any_cast<double>(this->GetParam("min_step_size")));
     physicsMsg.set_precon_iters(this->GetSORPGSPreconIters());
     physicsMsg.set_iters(this->GetSORPGSIters());
     physicsMsg.set_enable_physics(this->world->GetEnablePhysicsEngine());
@@ -248,8 +253,9 @@ void ODEPhysics::OnRequest(ConstRequestPtr &_msg)
     physicsMsg.set_cfm(this->GetWorldCFM());
     physicsMsg.set_erp(this->GetWorldERP());
     physicsMsg.set_contact_max_correcting_vel(
-        this->GetContactMaxCorrectingVel());
-    physicsMsg.set_contact_surface_layer(this->GetContactSurfaceLayer());
+      this->GetContactMaxCorrectingVel());
+    physicsMsg.set_contact_surface_layer(
+      this->GetContactSurfaceLayer());
     physicsMsg.mutable_gravity()->CopyFrom(msgs::Convert(this->GetGravity()));
     physicsMsg.set_real_time_update_rate(this->realTimeUpdateRate);
     physicsMsg.set_real_time_factor(this->targetRealTimeFactor);
@@ -265,20 +271,10 @@ void ODEPhysics::OnRequest(ConstRequestPtr &_msg)
 void ODEPhysics::OnPhysicsMsg(ConstPhysicsPtr &_msg)
 {
   if (_msg->has_solver_type())
-  {
-    sdf::ElementPtr solverElem =
-      this->sdf->GetElement("ode")->GetElement("solver");
-    if (_msg->solver_type() == "quick")
-    {
-      solverElem->GetElement("type")->Set("quick");
-      this->physicsStepFunc = &dWorldQuickStep;
-    }
-    else if (_msg->solver_type() == "world")
-    {
-      solverElem->GetElement("type")->Set("world");
-      this->physicsStepFunc = &dWorldStep;
-    }
-  }
+    this->SetStepType(_msg->solver_type());
+
+  if (_msg->has_min_step_size())
+    this->SetParam("min_step_size", _msg->min_step_size());
 
   if (_msg->has_precon_iters())
     this->SetSORPGSPreconIters(_msg->precon_iters());
@@ -314,25 +310,17 @@ void ODEPhysics::OnPhysicsMsg(ConstPhysicsPtr &_msg)
   {
     this->SetRealTimeUpdateRate(_msg->real_time_update_rate());
   }
-  else if (_msg->has_update_rate())
-  {
-    this->SetRealTimeUpdateRate(_msg->update_rate());
-    gzwarn <<
-        "Physics update rate is deprecated by real time update rate\n";
-  }
 
   if (_msg->has_max_step_size())
   {
     this->SetMaxStepSize(_msg->max_step_size());
   }
-  else if (_msg->has_dt())
-  {
-    this->SetMaxStepSize(_msg->dt());
-    gzwarn << "Physics dt is deprecated by max step size\n";
-  }
 
   /// Make sure all models get at least on update cycle.
   this->world->EnableAllModels();
+
+  // Parent class handles many generic parameters
+  PhysicsEngine::OnPhysicsMsg(_msg);
 }
 
 
@@ -407,8 +395,8 @@ void ODEPhysics::UpdatePhysics()
     for (unsigned int i = 0; i < this->jointFeedbackIndex; ++i)
     {
       Contact *contactFeedback = this->jointFeedbacks[i]->contact;
-      Collision *col1 = contactFeedback->collisionPtr1;
-      Collision *col2 = contactFeedback->collisionPtr2;
+      Collision *col1 = contactFeedback->collision1;
+      Collision *col2 = contactFeedback->collision2;
 
       GZ_ASSERT(col1 != NULL, "Collision 1 is NULL");
       GZ_ASSERT(col2 != NULL, "Collision 2 is NULL");
@@ -501,7 +489,7 @@ ShapePtr ODEPhysics::CreateShape(const std::string &_type,
   else if (_type == "multiray")
     shape.reset(new ODEMultiRayShape(collision));
   else if (_type == "mesh" || _type == "trimesh")
-    shape.reset(new ODETrimeshShape(collision));
+    shape.reset(new ODEMeshShape(collision));
   else if (_type == "heightmap")
     shape.reset(new ODEHeightmapShape(collision));
   else if (_type == "map" || _type == "image")
@@ -599,28 +587,28 @@ void ODEPhysics::SetContactSurfaceLayer(double _depth)
 //////////////////////////////////////////////////
 void ODEPhysics::SetMaxContacts(unsigned int _maxContacts)
 {
-  this->sdf->GetElement("ode")->GetElement(
-      "max_contacts")->GetValue()->Set(_maxContacts);
+  this->maxContacts = _maxContacts;
+  this->sdf->GetElement("max_contacts")->GetValue()->Set(_maxContacts);
 }
 
 //////////////////////////////////////////////////
 int ODEPhysics::GetSORPGSPreconIters()
 {
   return this->sdf->GetElement("ode")->GetElement(
-      "solver")->GetValueInt("precon_iters");
+      "solver")->Get<int>("precon_iters");
 }
 //////////////////////////////////////////////////
 int ODEPhysics::GetSORPGSIters()
 {
   return this->sdf->GetElement("ode")->GetElement(
-      "solver")->GetValueInt("iters");
+      "solver")->Get<int>("iters");
 }
 
 //////////////////////////////////////////////////
 double ODEPhysics::GetSORPGSW()
 {
   return this->sdf->GetElement("ode")->GetElement(
-      "solver")->GetValueDouble("sor");
+      "solver")->Get<double>("sor");
 }
 
 //////////////////////////////////////////////////
@@ -628,7 +616,7 @@ double ODEPhysics::GetWorldCFM()
 {
   sdf::ElementPtr elem = this->sdf->GetElement("ode");
   elem = elem->GetElement("constraints");
-  return elem->GetValueDouble("cfm");
+  return elem->Get<double>("cfm");
 }
 
 //////////////////////////////////////////////////
@@ -636,27 +624,27 @@ double ODEPhysics::GetWorldERP()
 {
   sdf::ElementPtr elem = this->sdf->GetElement("ode");
   elem = elem->GetElement("constraints");
-  return elem->GetValueDouble("erp");
+  return elem->Get<double>("erp");
 }
 
 //////////////////////////////////////////////////
 double ODEPhysics::GetContactMaxCorrectingVel()
 {
   return this->sdf->GetElement("ode")->GetElement(
-      "constraints")->GetValueDouble("contact_max_correcting_vel");
+      "constraints")->Get<double>("contact_max_correcting_vel");
 }
 
 //////////////////////////////////////////////////
 double ODEPhysics::GetContactSurfaceLayer()
 {
   return this->sdf->GetElement("ode")->GetElement(
-      "constraints")->GetValueDouble("contact_surface_layer");
+      "constraints")->Get<double>("contact_surface_layer");
 }
 
 //////////////////////////////////////////////////
-int ODEPhysics::GetMaxContacts()
+unsigned int ODEPhysics::GetMaxContacts()
 {
-  return this->sdf->GetElement("max_contacts")->GetValueInt();
+  return this->maxContacts;
 }
 
 //////////////////////////////////////////////////
@@ -694,6 +682,8 @@ JointPtr ODEPhysics::CreateJoint(const std::string &_type, ModelPtr _parent)
     joint.reset(new ODEScrewJoint(this->worldId, _parent));
   else if (_type == "revolute")
     joint.reset(new ODEHingeJoint(this->worldId, _parent));
+  else if (_type == "gearbox")
+    joint.reset(new ODEGearboxJoint(this->worldId, _parent));
   else if (_type == "revolute2")
     joint.reset(new ODEHinge2Joint(this->worldId, _parent));
   else if (_type == "ball")
@@ -716,7 +706,7 @@ dSpaceID ODEPhysics::GetSpaceId() const
 std::string ODEPhysics::GetStepType() const
 {
   sdf::ElementPtr elem = this->sdf->GetElement("ode")->GetElement("solver");
-  return elem->GetValueString("type");
+  return elem->Get<std::string>("type");
 }
 
 //////////////////////////////////////////////////
@@ -725,6 +715,14 @@ void ODEPhysics::SetStepType(const std::string &_type)
   sdf::ElementPtr elem = this->sdf->GetElement("ode")->GetElement("solver");
   elem->GetElement("type")->Set(_type);
   this->stepType = _type;
+
+  // Set the physics update function
+  if (this->stepType == "quick")
+    this->physicsStepFunc = &dWorldQuickStep;
+  else if (this->stepType == "world")
+    this->physicsStepFunc = &dWorldStep;
+  else
+    gzerr << "Invalid step type[" << this->stepType << "]" << std::endl;
 }
 
 //////////////////////////////////////////////////
@@ -758,9 +756,11 @@ void ODEPhysics::CollisionCallback(void *_data, dGeomID _o1, dGeomID _o2)
     ODECollision *collision2 = NULL;
 
     // Exit if both bodies are not enabled
-    if ((b1 && b2 && !dBodyIsEnabled(b1) && !dBodyIsEnabled(b2)) ||
-         (!b2 && b1 && !dBodyIsEnabled(b1)) ||
-         (!b1 && b2 && !dBodyIsEnabled(b2)))
+    if (dGeomGetCategoryBits(_o1) != GZ_SENSOR_COLLIDE &&
+        dGeomGetCategoryBits(_o2) != GZ_SENSOR_COLLIDE &&
+        ((b1 && b2 && !dBodyIsEnabled(b1) && !dBodyIsEnabled(b2)) ||
+        (!b2 && b1 && !dBodyIsEnabled(b1)) ||
+        (!b1 && b2 && !dBodyIsEnabled(b2))))
     {
       return;
     }
@@ -782,8 +782,8 @@ void ODEPhysics::CollisionCallback(void *_data, dGeomID _o1, dGeomID _o2)
     if (collision1 && collision2)
     {
       // Add either a tri-mesh collider or a regular collider.
-      if (collision1->HasType(Base::TRIMESH_SHAPE) ||
-          collision2->HasType(Base::TRIMESH_SHAPE))
+      if (collision1->HasType(Base::MESH_SHAPE) ||
+          collision2->HasType(Base::MESH_SHAPE))
         self->AddTrimeshCollider(collision1, collision2);
       else
       {
@@ -798,20 +798,52 @@ void ODEPhysics::CollisionCallback(void *_data, dGeomID _o1, dGeomID _o2)
 void ODEPhysics::Collide(ODECollision *_collision1, ODECollision *_collision2,
                          dContactGeom *_contactCollisions)
 {
-  int numc = 0;
+  // Filter collisions based on contact bitmask if collide_without_contact is
+  // on.The bitmask is set mainly for speed improvements otherwise a collision
+  // with collide_without_contact may potentially generate a large number of
+  // contacts.
+  if (_collision1->GetSurface()->collideWithoutContact ||
+      _collision2->GetSurface()->collideWithoutContact)
+  {
+    if ((_collision1->GetSurface()->collideWithoutContactBitmask &
+         _collision2->GetSurface()->collideWithoutContactBitmask) == 0)
+    {
+      return;
+    }
+  }
+
+  /*
+  if (_collision1->GetCollisionId() && _collision2->GetCollisionId())
+  {
+    const dVector3 *pos1 = (const dVector3*)dGeomGetPosition(_collision1->GetCollisionId());
+    const dVector3 *pos2 = (const dVector3*)dGeomGetPosition(_collision2->GetCollisionId());
+    std::cout << "1[" << (*pos1)[0]<< " " << (*pos1)[1] << " " << (*pos1)[2] << "] "
+      << "2[" << (*pos2)[0]<< " " << (*pos2)[1] << " " << (*pos2)[2] << "]\n";
+  }*/
+
+  unsigned int numc = 0;
   dContact contact;
 
   // maxCollide must less than the size of this->indices. Check the header
-  int maxCollide = MAX_CONTACT_JOINTS;
-  if (this->GetMaxContacts() < MAX_CONTACT_JOINTS)
+  unsigned int maxCollide = MAX_CONTACT_JOINTS;
+
+  // max_contacts specified globally
+  if (this->GetMaxContacts() > 0 && this->GetMaxContacts() < MAX_CONTACT_JOINTS)
     maxCollide = this->GetMaxContacts();
 
+  // over-ride with minimum of max_contacts from both collisions
+  if (_collision1->GetMaxContacts() < maxCollide)
+    maxCollide = _collision1->GetMaxContacts();
+
+  if (_collision2->GetMaxContacts() < maxCollide)
+    maxCollide = _collision2->GetMaxContacts();
+
   // Generate the contacts
   numc = dCollide(_collision1->GetCollisionId(), _collision2->GetCollisionId(),
       MAX_COLLIDE_RETURNS, _contactCollisions, sizeof(_contactCollisions[0]));
 
   // Return if no contacts.
-  if (numc <= 0)
+  if (numc == 0)
     return;
 
   // Store the indices of the contacts.
@@ -822,7 +854,7 @@ void ODEPhysics::Collide(ODECollision *_collision1, ODECollision *_collision2,
   if (numc > maxCollide)
   {
     double max = _contactCollisions[maxCollide-1].depth;
-    for (int i = maxCollide; i < numc; i++)
+    for (unsigned int i = maxCollide; i < numc; ++i)
     {
       if (_contactCollisions[i].depth > max)
       {
@@ -844,11 +876,13 @@ void ODEPhysics::Collide(ODECollision *_collision1, ODECollision *_collision2,
                          dContactSlip1 |
                          dContactSlip2;
 
+  ODESurfaceParamsPtr surf1 = _collision1->GetODESurface();
+  ODESurfaceParamsPtr surf2 = _collision2->GetODESurface();
+
   // Compute the CFM and ERP by assuming the two bodies form a
   // spring-damper system.
-  double kp = 1.0 /
-    (1.0 / _collision1->GetSurface()->kp + 1.0 / _collision2->GetSurface()->kp);
-  double kd = _collision1->GetSurface()->kd + _collision2->GetSurface()->kd;
+  double kp = 1.0 / (1.0 / surf1->kp + 1.0 / surf2->kp);
+  double kd = surf1->kd + surf2->kd;
 
   contact.surface.soft_erp = (this->maxStepSize * kp) /
                              (this->maxStepSize * kp + kd);
@@ -861,14 +895,11 @@ void ODEPhysics::Collide(ODECollision *_collision1, ODECollision *_collision2,
   //                                _collision2->surface->softCFM);
 
   // assign fdir1 if not set as 0
-  math::Vector3 fd = _collision1->GetSurface()->fdir1;
+  math::Vector3 fd = surf1->frictionPyramid.direction1;
   if (fd != math::Vector3::Zero)
   {
     // fdir1 is in body local frame, rotate it into world frame
-    /// \TODO: once issue #624 is fixed, switch to below:
-    /// fd = _collision1->GetWorldPose().rot.RotateVector(fd);
-    fd = (_collision1->GetRelativePose() +
-      _collision1->GetLink()->GetWorldPose()).rot.RotateVector(fd.Normalize());
+    fd = _collision1->GetWorldPose().rot.RotateVector(fd);
   }
 
   /// \TODO: Better treatment when both surfaces have fdir1 specified.
@@ -878,15 +909,14 @@ void ODEPhysics::Collide(ODECollision *_collision1, ODECollision *_collision2,
   /// As a hack, we'll simply compare mu1 from
   /// both surfaces for now, and use fdir1 specified by
   /// surface with smaller mu1.
-  math::Vector3 fd2 = _collision2->GetSurface()->fdir1;
+  math::Vector3 fd2 = surf2->frictionPyramid.direction1;
   if (fd2 != math::Vector3::Zero && (fd == math::Vector3::Zero ||
-        _collision1->GetSurface()->mu1 > _collision2->GetSurface()->mu1))
+        surf1->frictionPyramid.GetMuPrimary() >
+        surf2->frictionPyramid.GetMuPrimary()))
   {
     // fdir1 is in body local frame, rotate it into world frame
-    /// \TODO: once issue #624 is fixed, switch to below:
-    /// fd2 = _collision2->GetWorldPose().rot.RotateVector(fd2);
-    fd = (_collision2->GetRelativePose() +
-      _collision2->GetLink()->GetWorldPose()).rot.RotateVector(fd2.Normalize());
+    fd2 = _collision2->GetWorldPose().rot.RotateVector(fd2);
+
     /// \TODO: uncomment gzlog below once we confirm it does not affect
     /// performance
     /// if (fd2 != math::Vector3::Zero && fd != math::Vector3::Zero &&
@@ -905,24 +935,24 @@ void ODEPhysics::Collide(ODECollision *_collision1, ODECollision *_collision2,
   }
 
   // Set the friction coefficients.
-  contact.surface.mu = std::min(_collision1->GetSurface()->mu1,
-                                _collision2->GetSurface()->mu1);
-  contact.surface.mu2 = std::min(_collision1->GetSurface()->mu2,
-                                 _collision2->GetSurface()->mu2);
+  contact.surface.mu = std::min(surf1->frictionPyramid.GetMuPrimary(),
+                                surf2->frictionPyramid.GetMuPrimary());
+  contact.surface.mu2 = std::min(surf1->frictionPyramid.GetMuSecondary(),
+                                 surf2->frictionPyramid.GetMuSecondary());
 
 
   // Set the slip values
-  contact.surface.slip1 = std::min(_collision1->GetSurface()->slip1,
-                                   _collision2->GetSurface()->slip1);
-  contact.surface.slip2 = std::min(_collision1->GetSurface()->slip2,
-                                   _collision2->GetSurface()->slip2);
+  contact.surface.slip1 = std::min(surf1->slip1,
+                                   surf2->slip1);
+  contact.surface.slip2 = std::min(surf1->slip2,
+                                   surf2->slip2);
 
   // Set the bounce values
-  contact.surface.bounce = std::min(_collision1->GetSurface()->bounce,
-                                    _collision2->GetSurface()->bounce);
+  contact.surface.bounce = std::min(surf1->bounce,
+                                    surf2->bounce);
   contact.surface.bounce_vel =
-    std::min(_collision1->GetSurface()->bounceThreshold,
-             _collision2->GetSurface()->bounceThreshold);
+    std::min(surf1->bounceThreshold,
+             surf2->bounceThreshold);
 
   // Get the ODE body IDs
   dBodyID b1 = dGeomGetBody(_collision1->GetCollisionId());
@@ -952,7 +982,7 @@ void ODEPhysics::Collide(ODECollision *_collision1, ODECollision *_collision2,
   }
 
   // Create a joint for each contact
-  for (int j = 0; j < numc; j++)
+  for (unsigned int j = 0; j < numc; ++j)
   {
     contact.geom = _contactCollisions[this->indices[j]];
 
@@ -987,8 +1017,10 @@ void ODEPhysics::Collide(ODECollision *_collision1, ODECollision *_collision2,
       jointFeedback->count++;
     }
 
-    // Attach the contact joint.
-    dJointAttach(contactJoint, b1, b2);
+    // Attach the contact joint if collideWithoutContact flags aren't set.
+    if (!_collision1->GetSurface()->collideWithoutContact &&
+        !_collision2->GetSurface()->collideWithoutContact)
+      dJointAttach(contactJoint, b1, b2);
   }
 }
 
@@ -1074,190 +1106,278 @@ void ODEPhysics::SetSeed(uint32_t _seed)
 }
 
 //////////////////////////////////////////////////
-void ODEPhysics::SetParam(ODEParam _param, const boost::any &_value)
+bool ODEPhysics::SetParam(ODEParam _param, const boost::any &_value)
 {
-  sdf::ElementPtr odeElem = this->sdf->GetElement("ode");
-  GZ_ASSERT(odeElem != NULL, "ODE SDF element does not exist");
-
   switch (_param)
   {
     case SOLVER_TYPE:
     {
-      std::string value;
-      try
-      {
-        value = boost::any_cast<std::string>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        gzerr << "boost any_cast error:" << e.what() << "\n";
-        return;
-      }
-      odeElem->GetElement("solver")->GetElement("type")->Set(value);
-      this->stepType = value;
-      break;
+      return this->SetParam("solver_type", _value);
     }
     case GLOBAL_CFM:
     {
-      double value;
-      try
-      {
-        value = boost::any_cast<double>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        gzerr << "boost any_cast error:" << e.what() << "\n";
-        return;
-      }
-      odeElem->GetElement("constraints")->GetElement("cfm")->Set(value);
-      dWorldSetCFM(this->worldId, value);
-      break;
+      return this->SetParam("cfm", _value);
     }
     case GLOBAL_ERP:
     {
-      double value;
-      try
-      {
-        value = boost::any_cast<double>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        gzerr << "boost any_cast error:" << e.what() << "\n";
-        return;
-      }
-      odeElem->GetElement("constraints")->GetElement("erp")->Set(value);
-      dWorldSetERP(this->worldId, value);
-      break;
+      return this->SetParam("erp", _value);
     }
     case SOR_PRECON_ITERS:
     {
-      int value;
-      try
-      {
-        value = boost::any_cast<int>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        value = boost::any_cast<unsigned int>(_value);
-      }
-      odeElem->GetElement("solver")->GetElement("precon_iters")->Set(value);
-      dWorldSetQuickStepPreconIterations(this->worldId, value);
-      break;
+      return this->SetParam("precon_iters", _value);
     }
     case PGS_ITERS:
     {
-      int value;
-      try
-      {
-        value = boost::any_cast<int>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        value = boost::any_cast<unsigned int>(_value);
-      }
-      odeElem->GetElement("solver")->GetElement("iters")->Set(value);
-      dWorldSetQuickStepNumIterations(this->worldId, value);
-      break;
+      return this->SetParam("iters", _value);
     }
     case SOR:
     {
-      double value = boost::any_cast<double>(_value);
-      odeElem->GetElement("solver")->GetElement("sor")->Set(value);
-      dWorldSetQuickStepW(this->worldId, value);
-      break;
+      return this->SetParam("sor", _value);
     }
     case CONTACT_SURFACE_LAYER:
     {
-      double value;
-      try
-      {
-        value = boost::any_cast<double>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        value = boost::any_cast<unsigned int>(_value);
-      }
-      odeElem->GetElement("constraints")->GetElement(
-          "contact_surface_layer")->Set(value);
-      dWorldSetContactSurfaceLayer(this->worldId, value);
-      break;
+      return this->SetParam("contact_surface_layer", _value);
     }
     case CONTACT_MAX_CORRECTING_VEL:
     {
-      double value = boost::any_cast<double>(_value);
-      odeElem->GetElement("constraints")->GetElement(
-          "contact_max_correcting_vel")->Set(value);
-      dWorldSetContactMaxCorrectingVel(this->worldId, value);
-      break;
+      return this->SetParam("contact_max_correcting_vel", _value);
     }
     case MAX_CONTACTS:
     {
-      int value;
-      try
-      {
-        value = boost::any_cast<int>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        value = boost::any_cast<unsigned int>(_value);
-      }
-      odeElem->GetElement("max_contacts")->GetValue()->Set(value);
-      break;
+      return this->SetParam("max_contacts", _value);
     }
     case MIN_STEP_SIZE:
     {
-      /// TODO: Implement min step size param
-      double value;
-      try
-      {
-        value = boost::any_cast<double>(_value);
-      }
-      catch(boost::bad_any_cast &e)
-      {
-        value = boost::any_cast<unsigned int>(_value);
-      }
-      odeElem->GetElement("solver")->GetElement("min_step_size")->Set(value);
-      break;
+      return this->SetParam("min_step_size", _value);
     }
     default:
     {
       gzwarn << "Param not supported in ode" << std::endl;
-      break;
+      return false;
     }
   }
 }
 
 //////////////////////////////////////////////////
-void ODEPhysics::SetParam(const std::string &_key, const boost::any &_value)
+bool ODEPhysics::SetParam(const std::string &_key, const boost::any &_value)
 {
-  ODEParam param;
+  sdf::ElementPtr odeElem = this->sdf->GetElement("ode");
+  GZ_ASSERT(odeElem != NULL, "ODE SDF element does not exist");
 
   if (_key == "type")
-    param = SOLVER_TYPE;
+  {
+    gzwarn << "keyword `type` for GetParam/SetParam is deprecated, please"
+           << " use `solver_type`.\n";
+    return this->SetParam("solver_type", _value);
+  }
+  else if (_key == "solver_type")
+  {
+    std::string value;
+    try
+    {
+      value = boost::any_cast<std::string>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    this->SetStepType(value);
+  }
   else if (_key == "cfm")
-    param = GLOBAL_CFM;
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    odeElem->GetElement("constraints")->GetElement("cfm")->Set(value);
+    dWorldSetCFM(this->worldId, value);
+  }
   else if (_key == "erp")
-    param = GLOBAL_ERP;
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    odeElem->GetElement("constraints")->GetElement("erp")->Set(value);
+    dWorldSetERP(this->worldId, value);
+  }
   else if (_key == "precon_iters")
-    param = SOR_PRECON_ITERS;
+  {
+    int value;
+    try
+    {
+      try
+      {
+        value = boost::any_cast<int>(_value);
+      }
+      catch(const boost::bad_any_cast &e)
+      {
+        value = boost::any_cast<unsigned int>(_value);
+      }
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    odeElem->GetElement("solver")->GetElement("precon_iters")->Set(value);
+    dWorldSetQuickStepPreconIterations(this->worldId, value);
+  }
   else if (_key == "iters")
-    param = PGS_ITERS;
+  {
+    int value;
+    try
+    {
+      try
+      {
+        value = boost::any_cast<int>(_value);
+      }
+      catch(const boost::bad_any_cast &e)
+      {
+        value = boost::any_cast<unsigned int>(_value);
+      }
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    odeElem->GetElement("solver")->GetElement("iters")->Set(value);
+    dWorldSetQuickStepNumIterations(this->worldId, value);
+  }
   else if (_key == "sor")
-    param = SOR;
+  {
+    double value = boost::any_cast<double>(_value);
+    odeElem->GetElement("solver")->GetElement("sor")->Set(value);
+    dWorldSetQuickStepW(this->worldId, value);
+  }
   else if (_key == "contact_max_correcting_vel")
-    param = CONTACT_MAX_CORRECTING_VEL;
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    odeElem->GetElement("constraints")->GetElement(
+        "contact_max_correcting_vel")->Set(value);
+    dWorldSetContactMaxCorrectingVel(this->worldId, value);
+  }
   else if (_key == "contact_surface_layer")
-    param = CONTACT_SURFACE_LAYER;
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    odeElem->GetElement("constraints")->GetElement(
+        "contact_surface_layer")->Set(value);
+    dWorldSetContactSurfaceLayer(this->worldId, value);
+  }
   else if (_key == "max_contacts")
-    param = MAX_CONTACTS;
+  {
+    int value;
+    try
+    {
+      try
+      {
+        value = boost::any_cast<int>(_value);
+      }
+      catch(const boost::bad_any_cast &e)
+      {
+        value = boost::any_cast<unsigned int>(_value);
+      }
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    this->sdf->GetElement("max_contacts")->GetValue()->Set(value);
+  }
   else if (_key == "min_step_size")
-    param = MIN_STEP_SIZE;
+  {
+    /// TODO: Implement min step size param
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    odeElem->GetElement("solver")->GetElement("min_step_size")->Set(value);
+  }
+  else if (_key == "max_step_size")
+  {
+    this->SetMaxStepSize(boost::any_cast<double>(_value));
+  }
+  else if (_key == "sor_lcp_tolerance")
+  {
+    dWorldSetQuickStepTolerance(this->worldId,
+        boost::any_cast<double>(_value));
+  }
+  else if (_key == "rms_error_tolerance")
+  {
+    gzwarn << "please use sor_lcp_tolerance in the future.\n";
+    dWorldSetQuickStepTolerance(this->worldId,
+        boost::any_cast<double>(_value));
+  }
+  else if (_key == "inertia_ratio_reduction")
+  {
+    dWorldSetQuickStepInertiaRatioReduction(this->worldId,
+        boost::any_cast<bool>(_value));
+  }
+  else if (_key == "contact_residual_smoothing")
+  {
+    dWorldSetQuickStepContactResidualSmoothing(this->worldId,
+      boost::any_cast<double>(_value));
+  }
+  else if (_key == "experimental_row_reordering")
+  {
+    dWorldSetQuickStepExperimentalRowReordering(this->worldId,
+      boost::any_cast<bool>(_value));
+  }
+  else if (_key == "warm_start_factor")
+  {
+    dWorldSetQuickStepWarmStartFactor(this->worldId,
+      boost::any_cast<double>(_value));
+  }
+  else if (_key == "extra_friction_iterations")
+  {
+    dWorldSetQuickStepExtraFrictionIterations(this->worldId,
+      boost::any_cast<int>(_value));
+  }
   else
   {
     gzwarn << _key << " is not supported in ode" << std::endl;
-    return;
+    return false;
   }
-  this->SetParam(param, _value);
+  return true;
 }
 
 //////////////////////////////////////////////////
@@ -1266,99 +1386,122 @@ boost::any ODEPhysics::GetParam(ODEParam _param) const
   sdf::ElementPtr odeElem = this->sdf->GetElement("ode");
   GZ_ASSERT(odeElem != NULL, "ODE SDF element does not exist");
 
-  boost::any value = 0;
   switch (_param)
   {
     case SOLVER_TYPE:
     {
-      value = odeElem->GetElement("solver")->GetValueString("type");
-      break;
+      return this->GetParam("solver_type");
     }
     case GLOBAL_CFM:
     {
-      value = odeElem->GetElement("constraints")->GetValueDouble("cfm");
-      break;
+      return this->GetParam("cfm");
     }
     case GLOBAL_ERP:
     {
-      value = odeElem->GetElement("constraints")->GetValueDouble("erp");
-      break;
+      return this->GetParam("erp");
     }
     case SOR_PRECON_ITERS:
     {
-      value = odeElem->GetElement("solver")->GetValueInt("precon_iters");
-      break;
+      return this->GetParam("precon_iters");
     }
     case PGS_ITERS:
     {
-      value = odeElem->GetElement("solver")->GetValueInt("iters");
-      break;
+      return this->GetParam("iters");
     }
     case SOR:
     {
-      value = odeElem->GetElement("solver")->GetValueDouble("sor");
-      break;
+      return this->GetParam("sor");
     }
     case CONTACT_MAX_CORRECTING_VEL:
     {
-      value = odeElem->GetElement("constraints")->GetValueDouble(
-          "contact_max_correcting_vel");
-      break;
+      return this->GetParam("contact_max_correcting_vel");
     }
     case CONTACT_SURFACE_LAYER:
     {
-      value = odeElem->GetElement("constraints")->GetValueDouble(
-          "contact_surface_layer");
-      break;
+      return this->GetParam("contact_surface_layer");
     }
     case MAX_CONTACTS:
     {
-      value = odeElem->GetElement("max_contacts")->GetValueInt();
-      break;
+      return this->GetParam("max_contacts");
     }
     case MIN_STEP_SIZE:
     {
-      value = odeElem->GetElement("solver")->GetValueDouble("min_step_size");
-      break;
+      return this->GetParam("min_step_size");
     }
     default:
     {
       gzwarn << "Attribute not supported in bullet" << std::endl;
-      break;
+      return 0;
     }
   }
-  return value;
 }
 
 //////////////////////////////////////////////////
 boost::any ODEPhysics::GetParam(const std::string &_key) const
 {
-  ODEParam param;
+  sdf::ElementPtr odeElem = this->sdf->GetElement("ode");
+  GZ_ASSERT(odeElem != NULL, "ODE SDF element does not exist");
 
   if (_key == "type")
-    param = SOLVER_TYPE;
+  {
+    gzwarn << "keyword `type` for GetParam/SetParam is deprecated, please"
+           << " use `solver_type`.\n";
+    return this->GetParam("solver_type");
+  }
+  else if (_key == "solver_type")
+  {
+    return odeElem->GetElement("solver")->Get<std::string>("type");
+  }
   else if (_key == "cfm")
-    param = GLOBAL_CFM;
+  {
+    return odeElem->GetElement("constraints")->Get<double>("cfm");
+  }
   else if (_key == "erp")
-    param = GLOBAL_ERP;
+    return odeElem->GetElement("constraints")->Get<double>("erp");
   else if (_key == "precon_iters")
-    param = SOR_PRECON_ITERS;
+    return odeElem->GetElement("solver")->Get<int>("precon_iters");
   else if (_key == "iters")
-    param = PGS_ITERS;
+    return odeElem->GetElement("solver")->Get<int>("iters");
   else if (_key == "sor")
-    param = SOR;
+    return odeElem->GetElement("solver")->Get<double>("sor");
   else if (_key == "contact_max_correcting_vel")
-    param = CONTACT_MAX_CORRECTING_VEL;
+    return odeElem->GetElement("constraints")->Get<double>(
+        "contact_max_correcting_vel");
   else if (_key == "contact_surface_layer")
-    param = CONTACT_SURFACE_LAYER;
+    return odeElem->GetElement("constraints")->Get<double>(
+        "contact_surface_layer");
   else if (_key == "max_contacts")
-    param = MAX_CONTACTS;
+    return this->sdf->Get<int>("max_contacts");
   else if (_key == "min_step_size")
-    param = MIN_STEP_SIZE;
+    return odeElem->GetElement("solver")->Get<double>("min_step_size");
+  else if (_key == "max_step_size")
+    return this->GetMaxStepSize();
+  else if (_key == "sor_lcp_tolerance")
+    return dWorldGetQuickStepTolerance(this->worldId);
+  else if (_key == "rms_error_tolerance")
+  {
+    gzwarn << "please use sor_lcp_tolerance in the future.\n";
+    return dWorldGetQuickStepTolerance(this->worldId);
+  }
+  else if (_key == "rms_error")
+    return dWorldGetQuickStepRMSDeltaLambda(this->worldId);
+  else if (_key == "constraint_residual")
+    return dWorldGetQuickStepRMSConstraintResidual(this->worldId);
+  else if (_key == "num_contacts")
+    return dWorldGetQuickStepNumContacts(this->worldId);
+  else if (_key == "inertia_ratio_reduction")
+    return dWorldGetQuickStepInertiaRatioReduction(this->worldId);
+  else if (_key == "contact_residual_smoothing")
+    return dWorldGetQuickStepContactResidualSmoothing (this->worldId);
+  else if (_key == "experimental_row_reordering")
+    return dWorldGetQuickStepExperimentalRowReordering (this->worldId);
+  else if (_key == "warm_start_factor")
+    return dWorldGetQuickStepWarmStartFactor (this->worldId);
+  else if (_key == "extra_friction_iterations")
+    return dWorldGetQuickStepExtraFrictionIterations (this->worldId);
   else
   {
     gzwarn << _key << " is not supported in ode" << std::endl;
     return 0;
   }
-  return this->GetParam(param);
 }
diff --git a/gazebo/physics/ode/ODEPhysics.hh b/gazebo/physics/ode/ODEPhysics.hh
index 657fd05..4c104d9 100644
--- a/gazebo/physics/ode/ODEPhysics.hh
+++ b/gazebo/physics/ode/ODEPhysics.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -37,13 +37,14 @@
 #include "gazebo/physics/Contact.hh"
 #include "gazebo/physics/Shape.hh"
 #include "gazebo/gazebo_config.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief Data structure for contact feedbacks
-    class ODEJointFeedback
+    class GAZEBO_VISIBLE ODEJointFeedback
     {
       public: ODEJointFeedback() : contact(NULL), count(0) {}
 
@@ -58,7 +59,7 @@ namespace gazebo
     };
 
     /// \brief ODE physics engine.
-    class ODEPhysics : public PhysicsEngine
+    class GAZEBO_VISIBLE ODEPhysics : public PhysicsEngine
     {
       /// \enum ODEParam
       /// \brief ODE Physics parameter types.
@@ -191,7 +192,7 @@ namespace gazebo
       public: virtual double GetContactSurfaceLayer();
 
       // Documentation inherited
-      public: virtual int GetMaxContacts();
+      public: virtual unsigned int GetMaxContacts();
 
       // Documentation inherited
       public: virtual void DebugPrint() const;
@@ -200,22 +201,27 @@ namespace gazebo
       public: virtual void SetSeed(uint32_t _seed);
 
       /// \brief Set a parameter of the bullet physics engine
+      /// \sa bool SetParam(const std::string &_key,
+      /// const boost::any &_value)
       /// \param[in] _param A parameter listed in the ODEParam enum
       /// \param[in] _value The value to set to
-      public: virtual void SetParam(ODEParam _param,
-                  const boost::any &_value);
+      /// \return true if SetParam is successful, false if operation fails.
+      public: virtual bool SetParam(ODEParam _param,
+                  const boost::any &_value) GAZEBO_DEPRECATED(3.0);
 
       /// Documentation inherited
-      public: virtual void SetParam(const std::string &_key,
+      public: virtual bool SetParam(const std::string &_key,
                   const boost::any &_value);
 
       /// Documentation inherited
       public: virtual boost::any GetParam(const std::string &_key) const;
 
       /// \brief Get an parameter of the physics engine
+      /// \sa boost::any GetParam(const std::string &_key) const
       /// \param[in] _param A parameter listed in the ODEParam enum
       /// \return The value of the parameter
-      public: virtual boost::any GetParam(ODEParam _param) const;
+      public: virtual boost::any GetParam(ODEParam _param) const
+                GAZEBO_DEPRECATED(3.0);
 
       /// \brief Return the world space id.
       /// \return The space id for the world.
@@ -322,6 +328,9 @@ namespace gazebo
 
       /// \brief Indices used during creation of contact joints.
       private: int indices[MAX_CONTACT_JOINTS];
+
+      /// \brief Maximum number of contact points per collision pair.
+      private: unsigned int maxContacts;
     };
   }
 }
diff --git a/gazebo/physics/ode/ODEPhysics_TEST.cc b/gazebo/physics/ode/ODEPhysics_TEST.cc
index 74e1437..be48422 100644
--- a/gazebo/physics/ode/ODEPhysics_TEST.cc
+++ b/gazebo/physics/ode/ODEPhysics_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -64,40 +64,38 @@ TEST_F(ODEPhysics_TEST, PhysicsParam)
   double contactSurfaceLayer = 0.02;
 
   // test setting/getting physics engine params
-  odePhysics->SetParam(ODEPhysics::SOLVER_TYPE, type);
-  odePhysics->SetParam(ODEPhysics::SOR_PRECON_ITERS, preconIters);
-  odePhysics->SetParam(ODEPhysics::PGS_ITERS, iters);
-  odePhysics->SetParam(ODEPhysics::SOR, sor);
-  odePhysics->SetParam(ODEPhysics::GLOBAL_CFM, cfm);
-  odePhysics->SetParam(ODEPhysics::GLOBAL_ERP, erp);
-  odePhysics->SetParam(ODEPhysics::CONTACT_MAX_CORRECTING_VEL,
-      contactMaxCorrectingVel);
-  odePhysics->SetParam(ODEPhysics::CONTACT_SURFACE_LAYER,
-      contactSurfaceLayer);
+  odePhysics->SetParam("solver_type", type);
+  odePhysics->SetParam("precon_iters", preconIters);
+  odePhysics->SetParam("iters", iters);
+  odePhysics->SetParam("sor", sor);
+  odePhysics->SetParam("cfm", cfm);
+  odePhysics->SetParam("erp", erp);
+  odePhysics->SetParam("contact_max_correcting_vel", contactMaxCorrectingVel);
+  odePhysics->SetParam("contact_surface_layer", contactSurfaceLayer);
 
   boost::any value;
-  value = odePhysics->GetParam(ODEPhysics::SOLVER_TYPE);
+  value = odePhysics->GetParam("solver_type");
   std::string typeRet = boost::any_cast<std::string>(value);
   EXPECT_EQ(type, typeRet);
-  value = odePhysics->GetParam(ODEPhysics::SOR_PRECON_ITERS);
+  value = odePhysics->GetParam("precon_iters");
   int preconItersRet = boost::any_cast<int>(value);
   EXPECT_EQ(preconIters, preconItersRet);
-  value = odePhysics->GetParam(ODEPhysics::PGS_ITERS);
+  value = odePhysics->GetParam("iters");
   int itersRet = boost::any_cast<int>(value);
   EXPECT_EQ(iters, itersRet);
-  value = odePhysics->GetParam(ODEPhysics::SOR);
+  value = odePhysics->GetParam("sor");
   double sorRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(sor, sorRet);
-  value = odePhysics->GetParam(ODEPhysics::GLOBAL_CFM);
+  value = odePhysics->GetParam("cfm");
   double cfmRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(cfm, cfmRet);
-  value = odePhysics->GetParam(ODEPhysics::GLOBAL_ERP);
+  value = odePhysics->GetParam("erp");
   double erpRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(erp, erpRet);
-  value = odePhysics->GetParam(ODEPhysics::CONTACT_MAX_CORRECTING_VEL);
+  value = odePhysics->GetParam("contact_max_correcting_vel");
   double contactMaxCorrectingVelRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(contactMaxCorrectingVel, contactMaxCorrectingVelRet);
-  value = odePhysics->GetParam(ODEPhysics::CONTACT_SURFACE_LAYER);
+  value = odePhysics->GetParam("contact_surface_layer");
   double contactSurfaceLayerRet = boost::any_cast<double>(value);
   EXPECT_DOUBLE_EQ(contactSurfaceLayer, contactSurfaceLayerRet);
 
diff --git a/gazebo/physics/ode/ODEPlaneShape.hh b/gazebo/physics/ode/ODEPlaneShape.hh
index 07764c2..d725753 100644
--- a/gazebo/physics/ode/ODEPlaneShape.hh
+++ b/gazebo/physics/ode/ODEPlaneShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,13 +19,14 @@
 
 #include "gazebo/physics/PlaneShape.hh"
 #include "gazebo/physics/ode/ODEPhysics.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief An ODE Plane shape.
-    class ODEPlaneShape : public PlaneShape
+    class GAZEBO_VISIBLE ODEPlaneShape : public PlaneShape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent Collision.
@@ -42,9 +43,8 @@ namespace gazebo
         ODECollisionPtr oParent;
         oParent =
           boost::dynamic_pointer_cast<ODECollision>(this->collisionParent);
-
-        double altitude = 0;
-
+        math::Pose pose = oParent->GetWorldPose();
+        double altitude = pose.pos.z;
         math::Vector3 n = this->GetNormal();
         if (oParent->GetCollisionId() == NULL)
           oParent->SetCollision(dCreatePlane(oParent->GetSpaceId(),
diff --git a/gazebo/physics/ode/ODERayShape.cc b/gazebo/physics/ode/ODERayShape.cc
index 4a1cb58..0af029e 100644
--- a/gazebo/physics/ode/ODERayShape.cc
+++ b/gazebo/physics/ode/ODERayShape.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/physics/ode/ODERayShape.hh b/gazebo/physics/ode/ODERayShape.hh
index 5469518..a4ab2dc 100644
--- a/gazebo/physics/ode/ODERayShape.hh
+++ b/gazebo/physics/ode/ODERayShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,13 +26,14 @@
 
 #include "gazebo/physics/RayShape.hh"
 #include "gazebo/physics/Shape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief Ray collision
-    class ODERayShape : public RayShape
+    class GAZEBO_VISIBLE ODERayShape : public RayShape
     {
       /// \brief Constructor for a global ray.
       /// \param[in] _physicsEngine Pointer to the physics engine.
@@ -45,10 +46,18 @@ namespace gazebo
       /// \brief Destructor.
       public: virtual ~ODERayShape();
 
+      /// \brief Update the ray collision
       public: virtual void Update();
 
+      /// \brief Get the nearest intersection
+      /// \param[out] _dist Distance to the intersection.
+      /// \param[out] _entity Name of the entity that was hit.
       public: virtual void GetIntersection(double &_dist, std::string &_entity);
 
+      /// \brief Set the ray based on starting and ending points relative to
+      ///        the body
+      /// \param[in] _posStart Start position, relative the body
+      /// \param[in] _posEnd End position, relative to the body
       public: virtual void SetPoints(const math::Vector3 &_posStart,
                                      const math::Vector3 &_posEnd);
 
diff --git a/gazebo/physics/ode/ODEScrewJoint.cc b/gazebo/physics/ode/ODEScrewJoint.cc
index 9f367da..366c8d4 100644
--- a/gazebo/physics/ode/ODEScrewJoint.cc
+++ b/gazebo/physics/ode/ODEScrewJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,9 +21,12 @@
 
 #include <boost/bind.hpp>
 
+#include <string>
+
 #include "gazebo/gazebo_config.h"
 #include "gazebo/common/Console.hh"
 
+#include "gazebo/physics/Model.hh"
 #include "gazebo/physics/Link.hh"
 #include "gazebo/physics/ode/ODEScrewJoint.hh"
 
@@ -48,11 +51,45 @@ ODEScrewJoint::~ODEScrewJoint()
 void ODEScrewJoint::Load(sdf::ElementPtr _sdf)
 {
   ScrewJoint<ODEJoint>::Load(_sdf);
-  this->SetThreadPitch(0, this->threadPitch);
+  this->SetThreadPitch(this->threadPitch);
 }
 
 //////////////////////////////////////////////////
-math::Vector3 ODEScrewJoint::GetGlobalAxis(int /*index*/) const
+math::Vector3 ODEScrewJoint::GetAnchor(unsigned int /*index*/) const
+{
+  dVector3 result;
+  // initialize to 0
+  result[0] = result[1] = result[2] = 0.0;
+
+  if (this->jointId)
+    dJointGetScrewAnchor(this->jointId, result);
+  else
+    gzerr << "ODE Joint ID is invalid, returning 0 vector.\n";
+
+  return math::Vector3(result[0], result[1], result[2]);
+}
+
+//////////////////////////////////////////////////
+void ODEScrewJoint::SetAnchor(unsigned int /*index*/,
+    const math::Vector3 &_anchor)
+{
+  if (!this->jointId)
+  {
+    gzerr << "ODE Joint ID is invalid, anchor not set.\n";
+    return;
+  }
+
+  if (this->childLink)
+    this->childLink->SetEnabled(true);
+  if (this->parentLink)
+    this->parentLink->SetEnabled(true);
+
+  if (this->jointId)
+    dJointSetScrewAnchor(this->jointId, _anchor.x, _anchor.y, _anchor.z);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 ODEScrewJoint::GetGlobalAxis(unsigned int /*_index*/) const
 {
   dVector3 result;
 
@@ -65,11 +102,48 @@ math::Vector3 ODEScrewJoint::GetGlobalAxis(int /*index*/) const
 }
 
 //////////////////////////////////////////////////
-math::Angle ODEScrewJoint::GetAngleImpl(int /*_index*/) const
+void ODEScrewJoint::SetAxis(unsigned int /*_index*/, const math::Vector3 &_axis)
+{
+  if (this->childLink)
+    this->childLink->SetEnabled(true);
+  if (this->parentLink)
+    this->parentLink->SetEnabled(true);
+
+  /// ODE needs global axis
+  /// \TODO: currently we assume joint axis is specified in model frame,
+  /// this is incorrect, and should be corrected to be
+  /// joint frame which is specified in child link frame.
+  math::Vector3 globalAxis = _axis;
+  if (this->parentLink)
+    globalAxis =
+      this->GetParent()->GetModel()->GetWorldPose().rot.RotateVector(_axis);
+
+  if (this->jointId)
+    dJointSetScrewAxis(this->jointId, globalAxis.x, globalAxis.y, globalAxis.z);
+  else
+    gzerr << "ODE Joint ID is invalid\n";
+}
+
+//////////////////////////////////////////////////
+math::Angle ODEScrewJoint::GetAngleImpl(unsigned int _index) const
 {
   math::Angle result;
   if (this->jointId)
-    result = dJointGetScrewPosition(this->jointId);
+  {
+    if (_index < this->GetAngleCount())
+    {
+      if (_index == 0)
+        result = dJointGetScrewAngle(this->jointId);
+      else if (_index == 1)
+        result = dJointGetScrewPosition(this->jointId);
+    }
+    else
+    {
+      gzwarn << "ODEScrewJoint::GetAngleImpl(" << _index
+             << "): invalid index exceeds allowed range("
+             << this->GetAngleCount() << ").\n";
+    }
+  }
   else
     gzerr << "ODE Joint ID is invalid\n";
 
@@ -77,7 +151,7 @@ math::Angle ODEScrewJoint::GetAngleImpl(int /*_index*/) const
 }
 
 //////////////////////////////////////////////////
-double ODEScrewJoint::GetVelocity(int /*index*/) const
+double ODEScrewJoint::GetVelocity(unsigned int /*index*/) const
 {
   double result = 0;
 
@@ -90,28 +164,32 @@ double ODEScrewJoint::GetVelocity(int /*index*/) const
 }
 
 //////////////////////////////////////////////////
-void ODEScrewJoint::SetVelocity(int /*index*/, double _angle)
+void ODEScrewJoint::SetVelocity(unsigned int /*index*/, double _angle)
 {
   this->SetParam(dParamVel, _angle);
 }
 
 //////////////////////////////////////////////////
-void ODEScrewJoint::SetAxis(int /*index*/, const math::Vector3 &_axis)
+void ODEScrewJoint::SetThreadPitch(unsigned int /*_index*/, double _threadPitch)
 {
-  if (this->childLink) this->childLink->SetEnabled(true);
-  if (this->parentLink) this->parentLink->SetEnabled(true);
-
   if (this->jointId)
-    dJointSetScrewAxis(this->jointId, _axis.x, _axis.y, _axis.z);
+  {
+    /// \TODO: create an issue on making thread pitch = translation / angle
+    /// \TODO: create an issue on making thread pitch = translation / angle
+    dJointSetScrewThreadPitch(this->jointId, -_threadPitch);
+  }
   else
     gzerr << "ODE Joint ID is invalid\n";
 }
 
 //////////////////////////////////////////////////
-void ODEScrewJoint::SetThreadPitch(int /*_index*/, double _threadPitch)
+void ODEScrewJoint::SetThreadPitch(double _threadPitch)
 {
   if (this->jointId)
-    dJointSetScrewThreadPitch(this->jointId, _threadPitch);
+  {
+    /// \TODO: create an issue on making thread pitch = translation / angle
+    dJointSetScrewThreadPitch(this->jointId, -_threadPitch);
+  }
   else
     gzerr << "ODE Joint ID is invalid\n";
 }
@@ -119,38 +197,18 @@ void ODEScrewJoint::SetThreadPitch(int /*_index*/, double _threadPitch)
 //////////////////////////////////////////////////
 double ODEScrewJoint::GetThreadPitch(unsigned int /*_index*/)
 {
-  gzerr << "not yet implemented\n";
-  return 0;
+  return this->GetThreadPitch();
 }
 
 //////////////////////////////////////////////////
-void ODEScrewJoint::SetForce(int _index, double _effort)
+double ODEScrewJoint::GetThreadPitch()
 {
-  if (_index < 0 || static_cast<unsigned int>(_index) >= this->GetAngleCount())
-  {
-    gzerr << "Calling ODEScrewJoint::SetForce with an index ["
-          << _index << "] out of range\n";
-    return;
-  }
-
-  // truncating SetForce effort if velocity limit reached.
-  if (this->velocityLimit[_index] >= 0)
-  {
-    if (this->GetVelocity(_index) > this->velocityLimit[_index])
-      _effort = _effort > 0 ? 0 : _effort;
-    else if (this->GetVelocity(_index) < -this->velocityLimit[_index])
-      _effort = _effort < 0 ? 0 : _effort;
-  }
-
-  // truncate effort if effortLimit is not negative
-  if (this->effortLimit[_index] >= 0.0)
-    _effort = math::clamp(_effort,
-      -this->effortLimit[_index], this->effortLimit[_index]);
-
-  ODEJoint::SetForce(_index, _effort);
-  if (this->childLink) this->childLink->SetEnabled(true);
-  if (this->parentLink) this->parentLink->SetEnabled(true);
+  return this->threadPitch;
+}
 
+//////////////////////////////////////////////////
+void ODEScrewJoint::SetForceImpl(unsigned int /*_index*/, double _effort)
+{
   if (this->jointId)
   {
     // dJointAddScrewForce(this->jointId, _effort);
@@ -161,9 +219,10 @@ void ODEScrewJoint::SetForce(int _index, double _effort)
 }
 
 //////////////////////////////////////////////////
-void ODEScrewJoint::SetParam(int _parameter, double _value)
+void ODEScrewJoint::SetParam(unsigned int _parameter, double _value)
 {
   ODEJoint::SetParam(_parameter, _value);
+
   if (this->jointId)
     dJointSetScrewParam(this->jointId, _parameter, _value);
   else
@@ -171,7 +230,7 @@ void ODEScrewJoint::SetParam(int _parameter, double _value)
 }
 
 //////////////////////////////////////////////////
-double ODEScrewJoint::GetParam(int _parameter) const
+double ODEScrewJoint::GetParam(unsigned int _parameter) const
 {
   double result = 0;
 
@@ -184,13 +243,57 @@ double ODEScrewJoint::GetParam(int _parameter) const
 }
 
 //////////////////////////////////////////////////
-void ODEScrewJoint::SetMaxForce(int /*_index*/, double _t)
+void ODEScrewJoint::SetMaxForce(unsigned int /*_index*/, double _t)
 {
   this->SetParam(dParamFMax, _t);
 }
 
 //////////////////////////////////////////////////
-double ODEScrewJoint::GetMaxForce(int /*_index*/)
+double ODEScrewJoint::GetMaxForce(unsigned int /*_index*/)
 {
   return this->GetParam(dParamFMax);
 }
+
+//////////////////////////////////////////////////
+void ODEScrewJoint::SetAttribute(const std::string &_key,
+  unsigned int _index, const boost::any &_value)
+{
+  this->SetParam(_key, _index, _value);
+}
+
+//////////////////////////////////////////////////
+bool ODEScrewJoint::SetParam(const std::string &_key,
+  unsigned int _index, const boost::any &_value)
+{
+  if (_key  == "thread_pitch")
+  {
+    try
+    {
+      this->threadPitch = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+  }
+  else
+    return ODEJoint::SetParam(_key, _index, _value);
+
+  return true;
+}
+
+//////////////////////////////////////////////////
+double ODEScrewJoint::GetParam(const std::string &_key, unsigned int _index)
+{
+  if (_key  == "thread_pitch")
+    return this->threadPitch;
+  else
+    return ODEJoint::GetParam(_key, _index);
+}
+
+//////////////////////////////////////////////////
+double ODEScrewJoint::GetAttribute(const std::string &_key, unsigned int _index)
+{
+  return this->GetParam(_key, _index);
+}
diff --git a/gazebo/physics/ode/ODEScrewJoint.hh b/gazebo/physics/ode/ODEScrewJoint.hh
index 8e5efd9..a577114 100644
--- a/gazebo/physics/ode/ODEScrewJoint.hh
+++ b/gazebo/physics/ode/ODEScrewJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,15 +22,17 @@
 #ifndef _ODESCREWJOINT_HH_
 #define _ODESCREWJOINT_HH_
 
+#include <string>
 #include "gazebo/physics/ScrewJoint.hh"
 #include "gazebo/physics/ode/ODEJoint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief A screw joint.
-    class ODEScrewJoint : public ScrewJoint<ODEJoint>
+    class GAZEBO_VISIBLE ODEScrewJoint : public ScrewJoint<ODEJoint>
     {
       /// \brief Constructor.
       /// \param[in] _worldId ODE world id.
@@ -44,40 +46,74 @@ namespace gazebo
       public: virtual void Load(sdf::ElementPtr _sdf);
 
       // Documentation inherited
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetAxis(int index, const math::Vector3 &_axis);
+      public: virtual void SetAnchor(unsigned int _index,
+                  const math::Vector3 &_anchor);
 
       // Documentation inherited
-      public: virtual void SetThreadPitch(int _index, double _threadPitch);
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited
+      public: virtual void SetThreadPitch(unsigned int _index,
+                  double _threadPitch);
+
+      // Documentation inherited
+      public: virtual void SetThreadPitch(double _threadPitch);
 
       // Documentation inherited
       public: virtual double GetThreadPitch(unsigned int _index);
 
       // Documentation inherited
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      public: virtual double GetThreadPitch();
 
       // Documentation inherited
-      public: virtual double GetVelocity(int _index) const;
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetVelocity(int _index, double _angle);
+      public: virtual double GetVelocity(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetForce(int _index, double _effort);
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
       // Documentation inherited
-      public: virtual void SetMaxForce(int _index, double _t);
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
       // Documentation inherited
-      public: virtual double GetMaxForce(int _index);
+      public: virtual double GetMaxForce(unsigned int _index);
 
       // Documentation inherited
-      public: virtual double GetParam(int _parameter) const;
+      public: virtual double GetParam(unsigned int _parameter) const;
+
+      // Documentation inherited
+      public: virtual void SetParam(unsigned int _parameter, double _value);
+
+      // Documentation inherited.
+      public: virtual bool SetParam(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value);
+
+      // Documentation inherited.
+      public: virtual void SetAttribute(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value)
+                                        GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      public: virtual double GetParam(const std::string &_key,
+                                                unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual double GetAttribute(const std::string &_key,
+                unsigned int _index) GAZEBO_DEPRECATED(3.0);
 
       // Documentation inherited
-      public: virtual void SetParam(int _parameter, double _value);
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
     };
   }
 }
diff --git a/gazebo/physics/ode/ODESliderJoint.cc b/gazebo/physics/ode/ODESliderJoint.cc
index 8ac613e..a94336b 100644
--- a/gazebo/physics/ode/ODESliderJoint.cc
+++ b/gazebo/physics/ode/ODESliderJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,11 +20,12 @@
  */
 #include <boost/bind.hpp>
 
-#include "gazebo_config.h"
-#include "common/Console.hh"
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
 
-#include "physics/Link.hh"
-#include "physics/ode/ODESliderJoint.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/ode/ODESliderJoint.hh"
 
 using namespace gazebo;
 using namespace physics;
@@ -51,7 +52,7 @@ void ODESliderJoint::Load(sdf::ElementPtr _sdf)
 }
 
 //////////////////////////////////////////////////
-math::Vector3 ODESliderJoint::GetGlobalAxis(int /*_index*/) const
+math::Vector3 ODESliderJoint::GetGlobalAxis(unsigned int /*_index*/) const
 {
   dVector3 result;
   if (this->jointId)
@@ -63,7 +64,7 @@ math::Vector3 ODESliderJoint::GetGlobalAxis(int /*_index*/) const
 }
 
 //////////////////////////////////////////////////
-math::Angle ODESliderJoint::GetAngleImpl(int /*_index*/) const
+math::Angle ODESliderJoint::GetAngleImpl(unsigned int /*_index*/) const
 {
   math::Angle result;
   if (this->jointId)
@@ -75,7 +76,7 @@ math::Angle ODESliderJoint::GetAngleImpl(int /*_index*/) const
 }
 
 //////////////////////////////////////////////////
-double ODESliderJoint::GetVelocity(int /*index*/) const
+double ODESliderJoint::GetVelocity(unsigned int /*index*/) const
 {
   double result = 0;
   if (this->jointId)
@@ -87,54 +88,35 @@ double ODESliderJoint::GetVelocity(int /*index*/) const
 }
 
 //////////////////////////////////////////////////
-void ODESliderJoint::SetVelocity(int /*index*/, double _angle)
+void ODESliderJoint::SetVelocity(unsigned int /*index*/, double _angle)
 {
   this->SetParam(dParamVel, _angle);
 }
 
 //////////////////////////////////////////////////
-void ODESliderJoint::SetAxis(int /*index*/, const math::Vector3 &_axis)
+void ODESliderJoint::SetAxis(unsigned int /*index*/, const math::Vector3 &_axis)
 {
   if (this->childLink)
     this->childLink->SetEnabled(true);
-  if (this->parentLink) this->parentLink->SetEnabled(true);
+  if (this->parentLink)
+    this->parentLink->SetEnabled(true);
+
+  // ODE needs global axis
+  math::Quaternion axisFrame = this->GetAxisFrame(0);
+  math::Vector3 globalAxis = axisFrame.RotateVector(_axis);
 
   if (this->jointId)
-    dJointSetSliderAxis(this->jointId, _axis.x, _axis.y, _axis.z);
+  {
+    dJointSetSliderAxis(this->jointId,
+                        globalAxis.x, globalAxis.y, globalAxis.z);
+  }
   else
     gzerr << "ODE Joint ID is invalid\n";
 }
 
 //////////////////////////////////////////////////
-void ODESliderJoint::SetForce(int _index, double _effort)
+void ODESliderJoint::SetForceImpl(unsigned int /*_index*/, double _effort)
 {
-  if (_index < 0 || static_cast<unsigned int>(_index) >= this->GetAngleCount())
-  {
-    gzerr << "Calling ODEScrewJoint::SetForce with an index ["
-          << _index << "] out of range\n";
-    return;
-  }
-
-  // truncating SetForce effort if velocity limit reached.
-  if (this->velocityLimit[_index] >= 0)
-  {
-    if (this->GetVelocity(_index) > this->velocityLimit[_index])
-      _effort = _effort > 0 ? 0 : _effort;
-    else if (this->GetVelocity(_index) < -this->velocityLimit[_index])
-      _effort = _effort < 0 ? 0 : _effort;
-  }
-
-  // truncate effort if effortLimit is not negative
-  if (this->effortLimit[_index] >= 0.0)
-    _effort = math::clamp(_effort, -this->effortLimit[_index],
-      this->effortLimit[_index]);
-
-  ODEJoint::SetForce(_index, _effort);
-  if (this->childLink)
-    this->childLink->SetEnabled(true);
-  if (this->parentLink)
-    this->parentLink->SetEnabled(true);
-
   if (this->jointId)
     dJointAddSliderForce(this->jointId, _effort);
   else
@@ -142,14 +124,14 @@ void ODESliderJoint::SetForce(int _index, double _effort)
 }
 
 //////////////////////////////////////////////////
-void ODESliderJoint::SetParam(int _parameter, double _value)
+void ODESliderJoint::SetParam(unsigned int _parameter, double _value)
 {
   ODEJoint::SetParam(_parameter, _value);
   dJointSetSliderParam(this->jointId, _parameter, _value);
 }
 
 //////////////////////////////////////////////////
-double ODESliderJoint::GetParam(int _parameter) const
+double ODESliderJoint::GetParam(unsigned int _parameter) const
 {
   double result = 0;
 
@@ -162,13 +144,28 @@ double ODESliderJoint::GetParam(int _parameter) const
 }
 
 //////////////////////////////////////////////////
-void ODESliderJoint::SetMaxForce(int /*_index*/, double _t)
+void ODESliderJoint::SetMaxForce(unsigned int /*_index*/, double _t)
 {
   this->SetParam(dParamFMax, _t);
 }
 
 //////////////////////////////////////////////////
-double ODESliderJoint::GetMaxForce(int /*_index*/)
+double ODESliderJoint::GetMaxForce(unsigned int /*_index*/)
 {
   return this->GetParam(dParamFMax);
 }
+
+//////////////////////////////////////////////////
+math::Vector3 ODESliderJoint::GetAnchor(unsigned int /*_index*/) const
+{
+  dVector3 result;
+  gzlog << "ODESliderJoint::GetAnchor not implemented.\n";
+  return math::Vector3(result[0], result[1], result[2]);
+}
+
+//////////////////////////////////////////////////
+void ODESliderJoint::SetAnchor(unsigned int /*_index*/,
+  const math::Vector3 &/*_anchor*/)
+{
+  gzlog << "ODESliderJoint::SetAnchor not implemented.\n";
+}
diff --git a/gazebo/physics/ode/ODESliderJoint.hh b/gazebo/physics/ode/ODESliderJoint.hh
index 4e0fa27..ed8597c 100644
--- a/gazebo/physics/ode/ODESliderJoint.hh
+++ b/gazebo/physics/ode/ODESliderJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,13 +24,14 @@
 
 #include "gazebo/physics/SliderJoint.hh"
 #include "gazebo/physics/ode/ODEJoint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief A slider joint
-    class ODESliderJoint : public SliderJoint<ODEJoint>
+    class GAZEBO_VISIBLE ODESliderJoint : public SliderJoint<ODEJoint>
     {
       /// \brief Constructor
       /// \param[in] _worldId ODE world id.
@@ -44,34 +45,42 @@ namespace gazebo
       public: virtual void Load(sdf::ElementPtr _sdf);
 
       // Documentation inherited
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetAxis(int _index, const math::Vector3 &_axis);
+      public: virtual void SetAnchor(unsigned int _index,
+                                     const math::Vector3 &_anchor);
 
       // Documentation inherited
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual double GetVelocity(int _index) const;
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
 
       // Documentation inherited
-      public: virtual void SetVelocity(int _index, double _angle);
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetForce(int _index, double _effort);
+      public: virtual double GetVelocity(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetMaxForce(int _index, double _t);
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
       // Documentation inherited
-      public: virtual double GetMaxForce(int _index);
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
       // Documentation inherited
-      public: virtual double GetParam(int _parameter) const;
+      public: virtual double GetMaxForce(unsigned int _index);
 
       // Documentation inherited
-      public: virtual void SetParam(int _parameter, double _value);
+      public: virtual double GetParam(unsigned int _parameter) const;
+
+      // Documentation inherited
+      public: virtual void SetParam(unsigned int _parameter, double _value);
+
+      // Documentation inherited
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
     };
   }
 }
diff --git a/gazebo/physics/ode/ODESphereShape.hh b/gazebo/physics/ode/ODESphereShape.hh
index 8a49452..ca11b7f 100644
--- a/gazebo/physics/ode/ODESphereShape.hh
+++ b/gazebo/physics/ode/ODESphereShape.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,13 +21,14 @@
 #include "gazebo/physics/ode/ODECollision.hh"
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/physics/SphereShape.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief A ODE sphere shape
-    class ODESphereShape : public SphereShape
+    class GAZEBO_VISIBLE ODESphereShape : public SphereShape
     {
       /// \brief Constructor.
       /// \param[in] _parent Parent Collision.
diff --git a/gazebo/physics/ode/ODESurfaceParams.cc b/gazebo/physics/ode/ODESurfaceParams.cc
index ecdc222..cfe6dcc 100644
--- a/gazebo/physics/ode/ODESurfaceParams.cc
+++ b/gazebo/physics/ode/ODESurfaceParams.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,19 +14,21 @@
  * limitations under the License.
  *
 */
-/* Desc: common::Parameters for contact joints
- * Author: Nate Koenig
- * Date: 30 July 2003
- */
 
 #include <float.h>
-#include "physics/ode/ODESurfaceParams.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/physics/ode/ODESurfaceParams.hh"
 
 using namespace gazebo;
 using namespace physics;
 
 //////////////////////////////////////////////////
 ODESurfaceParams::ODESurfaceParams()
+  : SurfaceParams(),
+    bounce(0), bounceThreshold(100000),
+    kp(1000000000000), kd(1), cfm(0), erp(0.2),
+    maxVel(0.01), minDepth(0),
+    slip1(0), slip2(0)
 {
 }
 
@@ -38,10 +40,141 @@ ODESurfaceParams::~ODESurfaceParams()
 //////////////////////////////////////////////////
 void ODESurfaceParams::Load(sdf::ElementPtr _sdf)
 {
+  // Load parent class
   SurfaceParams::Load(_sdf);
+
+  if (!_sdf)
+    gzerr << "Surface _sdf is NULL" << std::endl;
+  else
+  {
+    {
+      sdf::ElementPtr bounceElem = _sdf->GetElement("bounce");
+      if (!bounceElem)
+        gzerr << "Surface bounce sdf member is NULL" << std::endl;
+      else
+      {
+        this->bounce = bounceElem->Get<double>("restitution_coefficient");
+        if (this->bounce < 0)
+        {
+          gzwarn << "bounce restitution_coefficient ["
+                 << this->bounce
+                 << "] < 0, so it will not be applied by ODE."
+                 << std::endl;
+        }
+        else if (this->bounce > 1)
+        {
+          gzwarn << "bounce restitution_coefficient ["
+                 << this->bounce
+                 << "] > 1, which is outside the recommended range."
+                 << std::endl;
+        }
+        this->bounceThreshold = bounceElem->Get<double>("threshold");
+      }
+    }
+
+    {
+      sdf::ElementPtr frictionElem = _sdf->GetElement("friction");
+      if (!frictionElem)
+        gzerr << "Surface friction sdf member is NULL" << std::endl;
+      else
+      {
+        sdf::ElementPtr frictionOdeElem = frictionElem->GetElement("ode");
+        if (!frictionOdeElem)
+          gzerr << "Surface friction ode sdf member is NULL" << std::endl;
+        else
+        {
+          this->frictionPyramid.SetMuPrimary(
+            frictionOdeElem->Get<double>("mu"));
+          this->frictionPyramid.SetMuSecondary(
+            frictionOdeElem->Get<double>("mu2"));
+          this->frictionPyramid.direction1 =
+            frictionOdeElem->Get<math::Vector3>("fdir1");
+
+          this->slip1 = frictionOdeElem->Get<double>("slip1");
+          this->slip2 = frictionOdeElem->Get<double>("slip2");
+        }
+      }
+    }
+
+    {
+      sdf::ElementPtr contactElem = _sdf->GetElement("contact");
+      if (!contactElem)
+        gzerr << "Surface contact sdf member is NULL" << std::endl;
+      else
+      {
+        sdf::ElementPtr contactOdeElem = contactElem->GetElement("ode");
+        if (!contactOdeElem)
+          gzerr << "Surface contact ode sdf member is NULL" << std::endl;
+        {
+          this->kp = contactOdeElem->Get<double>("kp");
+          this->kd = contactOdeElem->Get<double>("kd");
+          this->cfm = contactOdeElem->Get<double>("soft_cfm");
+          this->erp = contactOdeElem->Get<double>("soft_erp");
+          this->maxVel = contactOdeElem->Get<double>("max_vel");
+          this->minDepth = contactOdeElem->Get<double>("min_depth");
+        }
+      }
+    }
+  }
 }
 
+/////////////////////////////////////////////////
+void ODESurfaceParams::FillMsg(msgs::Surface &_msg)
+{
+  SurfaceParams::FillMsg(_msg);
+
+  _msg.mutable_friction()->set_mu(this->frictionPyramid.GetMuPrimary());
+  _msg.mutable_friction()->set_mu2(this->frictionPyramid.GetMuSecondary());
+  _msg.mutable_friction()->set_slip1(this->slip1);
+  _msg.mutable_friction()->set_slip2(this->slip2);
+  msgs::Set(_msg.mutable_friction()->mutable_fdir1(),
+            this->frictionPyramid.direction1);
 
+  _msg.set_restitution_coefficient(this->bounce);
+  _msg.set_bounce_threshold(this->bounceThreshold);
 
+  _msg.set_soft_cfm(this->cfm);
+  _msg.set_soft_erp(this->erp);
+  _msg.set_kp(this->kp);
+  _msg.set_kd(this->kd);
+  _msg.set_max_vel(this->maxVel);
+  _msg.set_min_depth(this->minDepth);
+}
 
+/////////////////////////////////////////////////
+void ODESurfaceParams::ProcessMsg(const msgs::Surface &_msg)
+{
+  SurfaceParams::ProcessMsg(_msg);
 
+  if (_msg.has_friction())
+  {
+    if (_msg.friction().has_mu())
+      this->frictionPyramid.SetMuPrimary(_msg.friction().mu());
+    if (_msg.friction().has_mu2())
+      this->frictionPyramid.SetMuSecondary(_msg.friction().mu2());
+    if (_msg.friction().has_slip1())
+      this->slip1 = _msg.friction().slip1();
+    if (_msg.friction().has_slip2())
+      this->slip2 = _msg.friction().slip2();
+    if (_msg.friction().has_fdir1())
+      this->frictionPyramid.direction1 =
+        msgs::Convert(_msg.friction().fdir1());
+  }
+
+  if (_msg.has_restitution_coefficient())
+    this->bounce = _msg.restitution_coefficient();
+  if (_msg.has_bounce_threshold())
+    this->bounceThreshold = _msg.bounce_threshold();
+  if (_msg.has_soft_cfm())
+    this->cfm = _msg.soft_cfm();
+  if (_msg.has_soft_erp())
+    this->erp = _msg.soft_erp();
+  if (_msg.has_kp())
+    this->kp = _msg.kp();
+  if (_msg.has_kd())
+    this->kd = _msg.kd();
+  if (_msg.has_max_vel())
+    this->maxVel = _msg.max_vel();
+  if (_msg.has_min_depth())
+    this->minDepth = _msg.min_depth();
+}
diff --git a/gazebo/physics/ode/ODESurfaceParams.hh b/gazebo/physics/ode/ODESurfaceParams.hh
index 7ae7ec8..cb976e4 100644
--- a/gazebo/physics/ode/ODESurfaceParams.hh
+++ b/gazebo/physics/ode/ODESurfaceParams.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,32 +14,109 @@
  * limitations under the License.
  *
 */
-/* Desc: common::Parameters for contact joints
- * Author: Nate Koenig
- * Date: 30 July 2003
- */
 
 #ifndef _ODESURFACEPARAMS_HH_
 #define _ODESURFACEPARAMS_HH_
 
-#include "sdf/sdf.hh"
+#include <sdf/sdf.hh>
+
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/physics/SurfaceParams.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
-    /// \brief Surface params
-    class ODESurfaceParams
+    /// \addtogroup gazebo_physics
+    /// \{
+
+    /// \brief ODE surface parameters.
+    class GAZEBO_VISIBLE ODESurfaceParams : public SurfaceParams
     {
-      /// \brief Constructor
+      /// \brief Constructor.
       public: ODESurfaceParams();
 
-      /// \brief Destructor
+      /// \brief Destructor.
       public: virtual ~ODESurfaceParams();
 
-      // Documentation inherited
+      /// \brief Load the contact params.
+      /// \param[in] _sdf SDF values to load from.
       public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void FillMsg(msgs::Surface &_msg);
+
+      // Documentation inherited.
+      public: virtual void ProcessMsg(const msgs::Surface &_msg);
+
+      /// \brief bounce restitution coefficient [0,1], with 0 being inelastic,
+      ///        and 1 being perfectly elastic.
+      /// \sa    http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
+      public: double bounce;
+
+      /// \brief minimum contact velocity for bounce to take effect, otherwise
+      ///        the collision is treated as an inelastic collision.
+      /// \sa    http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
+      public: double bounceThreshold;
+
+      /// \brief spring constant equivalents of a contact as a function of
+      ///        SurfaceParams::cfm and SurfaceParams::erp.
+      /// \sa    See for example
+      ///        http://www.ode.org/ode-latest-userguide.html#sec_3_8_2
+      ///        for more details.
+      public: double kp;
+
+      /// \brief spring damping constant equivalents of a contact as a
+      ///        function of SurfaceParams::cfm and SurfaceParams::erp.
+      /// \sa    See for example
+      ///        http://www.ode.org/ode-latest-userguide.html#sec_3_8_2
+      ///        for more details.
+      public: double kd;
+
+      /// \brief Constraint Force Mixing parameter.
+      ///        See for example
+      ///        http://www.ode.org/ode-latest-userguide.html#sec_3_8_0
+      ///        for more details.
+      public: double cfm;
+
+      /// \brief Error Reduction Parameter.
+      /// \sa    See for example
+      ///        http://www.ode.org/ode-latest-userguide.html#sec_3_8_0
+      ///        for more details.
+      public: double erp;
+
+      /// \brief Maximum interpenetration error correction velocity.  If
+      ///        set to 0, two objects interpenetrating each other
+      ///        will not be pushed apart.
+      /// \sa    See dWroldSetContactMaxCorrectingVel
+      ///        (http://www.ode.org/ode-latest-userguide.html#sec_5_2_0)
+      public: double maxVel;
+
+      /// \brief Minimum depth before ERP takes effect.
+      /// \sa    See dWorldSetContactSurfaceLayer
+      ///        (http://www.ode.org/ode-latest-userguide.html#sec_5_2_0)
+      public: double minDepth;
+
+      /// \brief Friction pyramid parameters (mu1, mu2).
+      /// Note that the primary friction pyramid direction can be specified
+      /// by fdir1, otherwise a vector constrained to be perpendicular to the
+      /// contact normal in the global y-z plane is used.
+      /// \sa    http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
+      public: FrictionPyramid frictionPyramid;
+
+      /// \brief Artificial contact slip in the primary friction direction.
+      /// \sa    See dContactSlip1 in
+      ///        http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
+      public: double slip1;
+
+      /// \brief Artificial contact slip in the secondary friction dirction.
+      /// \sa    See dContactSlip2 in
+      ///        http://www.ode.org/ode-latest-userguide.html#sec_7_3_7
+      public: double slip2;
     };
+    /// \}
   }
 }
 #endif
diff --git a/gazebo/physics/ode/ODETrimeshShape.cc b/gazebo/physics/ode/ODETrimeshShape.cc
deleted file mode 100644
index 9662460..0000000
--- a/gazebo/physics/ode/ODETrimeshShape.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: ODE Trimesh shape
- * Author: Nate Koenig
- * Date: 16 Oct 2009
- */
-
-#include "common/Mesh.hh"
-#include "common/Exception.hh"
-#include "common/Console.hh"
-
-#include "physics/ode/ODECollision.hh"
-#include "physics/ode/ODEPhysics.hh"
-#include "physics/ode/ODETrimeshShape.hh"
-
-using namespace gazebo;
-using namespace physics;
-
-
-//////////////////////////////////////////////////
-ODETrimeshShape::ODETrimeshShape(CollisionPtr _parent) : TrimeshShape(_parent)
-{
-  this->odeData = NULL;
-  this->vertices = NULL;
-  this->indices = NULL;
-}
-
-//////////////////////////////////////////////////
-ODETrimeshShape::~ODETrimeshShape()
-{
-  delete [] this->vertices;
-  delete [] this->indices;
-  dGeomTriMeshDataDestroy(this->odeData);
-}
-
-//////////////////////////////////////////////////
-void ODETrimeshShape::Update()
-{
-  ODECollisionPtr ocollision =
-    boost::dynamic_pointer_cast<ODECollision>(this->collisionParent);
-
-  /// FIXME: use below to update trimesh geometry for collision without
-  // using above Ogre codes
-  // tell the tri-tri collider the current transform of the trimesh --
-  // this is fairly important for good results.
-
-  // Fill in the (4x4) matrix.
-  dReal *matrix = this->transform + (this->transformIndex * 16);
-  const dReal *Pos = dGeomGetPosition(ocollision->GetCollisionId());
-  const dReal *Rot = dGeomGetRotation(ocollision->GetCollisionId());
-
-  matrix[ 0 ] = Rot[ 0 ];
-  matrix[ 1 ] = Rot[ 1 ];
-  matrix[ 2 ] = Rot[ 2 ];
-  matrix[ 3 ] = 0;
-  matrix[ 4 ] = Rot[ 4 ];
-  matrix[ 5 ] = Rot[ 5 ];
-  matrix[ 6 ] = Rot[ 6 ];
-  matrix[ 7 ] = 0;
-  matrix[ 8 ] = Rot[ 8 ];
-  matrix[ 9 ] = Rot[ 9 ];
-  matrix[10 ] = Rot[10 ];
-  matrix[11 ] = 0;
-  matrix[12 ] = Pos[ 0 ];
-  matrix[13 ] = Pos[ 1 ];
-  matrix[14 ] = Pos[ 2 ];
-  matrix[15 ] = 1;
-
-  // Flip to other matrix.
-  this->transformIndex = !this->transformIndex;
-
-  dGeomTriMeshSetLastTransform(ocollision->GetCollisionId(),
-      *reinterpret_cast<dMatrix4*>(this->transform +
-                                   this->transformIndex * 16));
-}
-
-//////////////////////////////////////////////////
-void ODETrimeshShape::Load(sdf::ElementPtr _sdf)
-{
-  TrimeshShape::Load(_sdf);
-}
-
-//////////////////////////////////////////////////
-void ODETrimeshShape::Init()
-{
-  TrimeshShape::Init();
-  if (!this->mesh)
-    return;
-
-  ODECollisionPtr pcollision =
-    boost::static_pointer_cast<ODECollision>(this->collisionParent);
-
-  /// This will hold the vertex data of the triangle mesh
-  if (this->odeData == NULL)
-    this->odeData = dGeomTriMeshDataCreate();
-
-  unsigned int numVertices = this->submesh ? this->submesh->GetVertexCount() :
-    this->mesh->GetVertexCount();
-
-  unsigned int numIndices = this->submesh ? this->submesh->GetIndexCount() :
-    this->mesh->GetIndexCount();
-
-  this->vertices = NULL;
-  this->indices = NULL;
-
-  // Get all the vertex and index data
-  if (!this->submesh)
-    this->mesh->FillArrays(&this->vertices, &this->indices);
-  else
-    this->submesh->FillArrays(&this->vertices, &this->indices);
-
-  // Scale the vertex data
-  for (unsigned int j = 0;  j < numVertices; j++)
-  {
-    this->vertices[j*3+0] = this->vertices[j*3+0] *
-      this->sdf->GetValueVector3("scale").x;
-    this->vertices[j*3+1] = this->vertices[j*3+1] *
-      this->sdf->GetValueVector3("scale").y;
-    this->vertices[j*3+2] = this->vertices[j*3+2] *
-      this->sdf->GetValueVector3("scale").z;
-  }
-
-  // Build the ODE triangle mesh
-  dGeomTriMeshDataBuildSingle(this->odeData,
-      this->vertices, 3*sizeof(this->vertices[0]), numVertices,
-      this->indices, numIndices, 3*sizeof(this->indices[0]));
-
-  if (pcollision->GetCollisionId() == NULL)
-  {
-    pcollision->SetSpaceId(dSimpleSpaceCreate(pcollision->GetSpaceId()));
-    pcollision->SetCollision(dCreateTriMesh(pcollision->GetSpaceId(),
-          this->odeData, 0, 0, 0), true);
-  }
-  else
-  {
-    dGeomTriMeshSetData(pcollision->GetCollisionId(), this->odeData);
-  }
-
-  memset(this->transform, 0, 32*sizeof(dReal));
-  this->transformIndex = 0;
-}
diff --git a/gazebo/physics/ode/ODETrimeshShape.hh b/gazebo/physics/ode/ODETrimeshShape.hh
deleted file mode 100644
index 4c622fb..0000000
--- a/gazebo/physics/ode/ODETrimeshShape.hh
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: Trimesh geometry
- * Author: Nate Koenig
- * Date: 16 Oct 2009
- */
-
-#ifndef _ODETRIMESHSHAPE_HH_
-#define _ODETRIMESHSHAPE_HH_
-
-#include "gazebo/physics/TrimeshShape.hh"
-
-namespace gazebo
-{
-  namespace physics
-  {
-    /// \brief Triangle mesh collision.
-    class ODETrimeshShape : public TrimeshShape
-    {
-      /// \brief Constructor.
-      /// \param[in] _parent Parent collision object.
-      public: explicit ODETrimeshShape(CollisionPtr _parent);
-
-      /// \brief Destructor.
-      public: virtual ~ODETrimeshShape();
-
-      // Documentation inherited
-      public: virtual void Load(sdf::ElementPtr _sdf);
-
-      // Documentation inherited
-      public: virtual void Init();
-
-      // Documentation inherited
-      public: virtual void Update();
-
-      /// \brief Transform matrix.
-      private: dReal transform[16*2];
-
-      /// \brief Transform matrix index.
-      private: int transformIndex;
-
-      /// \brief Array of vertex values.
-      private: float *vertices;
-
-      /// \brief Array of index values.
-      private: int *indices;
-
-      /// \brief ODE trimesh data.
-      private: dTriMeshDataID odeData;
-    };
-  }
-}
-#endif
diff --git a/gazebo/physics/ode/ODETypes.hh b/gazebo/physics/ode/ODETypes.hh
index 8053df3..b3226fc 100644
--- a/gazebo/physics/ode/ODETypes.hh
+++ b/gazebo/physics/ode/ODETypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
 */
 
 #include <boost/shared_ptr.hpp>
+#include "gazebo/util/system.hh"
 
 /// \file
 /// \brief ODE wrapper forward declarations and typedefs
@@ -24,6 +25,7 @@ namespace gazebo
   namespace physics
   {
     class ODECollision;
+    class ODEJoint;
     class ODELink;
     class ODERayShape;
     class ODESurfaceParams;
@@ -33,6 +35,10 @@ namespace gazebo
     /// \brief Boost shared point to ODECollision
     typedef boost::shared_ptr<ODECollision> ODECollisionPtr;
 
+    /// \def ODEJointPtr
+    /// \brief Boost shared point to ODEJoint
+    typedef boost::shared_ptr<ODEJoint> ODEJointPtr;
+
     /// \def ODELinkPtr
     /// \brief Boost shared point to ODELink
     typedef boost::shared_ptr<ODELink> ODELinkPtr;
diff --git a/gazebo/physics/ode/ODEUniversalJoint.cc b/gazebo/physics/ode/ODEUniversalJoint.cc
index 8a7f86a..d06ea0e 100644
--- a/gazebo/physics/ode/ODEUniversalJoint.cc
+++ b/gazebo/physics/ode/ODEUniversalJoint.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,21 +14,18 @@
  * limitations under the License.
  *
 */
-/* Desc: A universal joint
- * Author: Nate Koenig, Andrew Howard
- * Date: 21 May 2003
- */
+#include <string>
 
-#include "gazebo_config.h"
-#include "common/Console.hh"
+#include "gazebo/gazebo_config.h"
+#include "gazebo/common/Console.hh"
 
-#include "physics/Link.hh"
-#include "physics/ode/ODEUniversalJoint.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/ode/ODEUniversalJoint.hh"
 
 using namespace gazebo;
 using namespace physics;
 
-
 //////////////////////////////////////////////////
 ODEUniversalJoint::ODEUniversalJoint(dWorldID _worldId, BasePtr _parent)
     : UniversalJoint<ODEJoint>(_parent)
@@ -44,7 +41,7 @@ ODEUniversalJoint::~ODEUniversalJoint()
 }
 
 //////////////////////////////////////////////////
-math::Vector3 ODEUniversalJoint::GetAnchor(int /*index*/) const
+math::Vector3 ODEUniversalJoint::GetAnchor(unsigned int /*index*/) const
 {
   dVector3 result;
   if (this->jointId)
@@ -56,7 +53,8 @@ math::Vector3 ODEUniversalJoint::GetAnchor(int /*index*/) const
 }
 
 //////////////////////////////////////////////////
-void ODEUniversalJoint::SetAnchor(int /*index*/, const math::Vector3 &_anchor)
+void ODEUniversalJoint::SetAnchor(unsigned int /*index*/,
+    const math::Vector3 &_anchor)
 {
   if (this->childLink) this->childLink->SetEnabled(true);
   if (this->parentLink) this->parentLink->SetEnabled(true);
@@ -68,16 +66,19 @@ void ODEUniversalJoint::SetAnchor(int /*index*/, const math::Vector3 &_anchor)
 }
 
 //////////////////////////////////////////////////
-math::Vector3 ODEUniversalJoint::GetGlobalAxis(int _index) const
+math::Vector3 ODEUniversalJoint::GetGlobalAxis(unsigned int _index) const
 {
   dVector3 result;
 
   if (this->jointId)
   {
-    if (_index == 0)
+    // flipping axis 1 and 2 around
+    if (_index == UniversalJoint::AXIS_CHILD)
       dJointGetUniversalAxis1(this->jointId, result);
-    else
+    else if (_index == UniversalJoint::AXIS_PARENT)
       dJointGetUniversalAxis2(this->jointId, result);
+    else
+      gzerr << "Joint index out of bounds.\n";
   }
   else
     gzerr << "ODE Joint ID is invalid\n";
@@ -86,33 +87,52 @@ math::Vector3 ODEUniversalJoint::GetGlobalAxis(int _index) const
 }
 
 //////////////////////////////////////////////////
-void ODEUniversalJoint::SetAxis(int _index, const math::Vector3 &_axis)
+void ODEUniversalJoint::SetAxis(unsigned int _index, const math::Vector3 &_axis)
 {
-  if (this->childLink) this->childLink->SetEnabled(true);
-  if (this->parentLink) this->parentLink->SetEnabled(true);
+  if (this->childLink)
+    this->childLink->SetEnabled(true);
+  if (this->parentLink)
+    this->parentLink->SetEnabled(true);
+
+  /// ODE needs global axis
+  /// \TODO: currently we assume joint axis is specified in model frame,
+  /// this is incorrect, and should be corrected to be
+  /// joint frame which is specified in child link frame.
+  math::Vector3 globalAxis = _axis;
+  if (this->parentLink)
+    globalAxis =
+      this->GetParent()->GetModel()->GetWorldPose().rot.RotateVector(_axis);
 
   if (this->jointId)
   {
-    if (_index == 0)
-      dJointSetUniversalAxis1(this->jointId, _axis.x, _axis.y, _axis.z);
+    // flipping axis 1 and 2 around
+    if (_index == UniversalJoint::AXIS_CHILD)
+      dJointSetUniversalAxis1(this->jointId,
+        globalAxis.x, globalAxis.y, globalAxis.z);
+    else if (_index == UniversalJoint::AXIS_PARENT)
+      dJointSetUniversalAxis2(this->jointId,
+        globalAxis.x, globalAxis.y, globalAxis.z);
     else
-      dJointSetUniversalAxis2(this->jointId, _axis.x, _axis.y, _axis.z);
+      gzerr << "Joint index out of bounds.\n";
   }
   else
     gzerr << "ODE Joint ID is invalid\n";
 }
 
 //////////////////////////////////////////////////
-math::Angle ODEUniversalJoint::GetAngleImpl(int _index) const
+math::Angle ODEUniversalJoint::GetAngleImpl(unsigned int _index) const
 {
   math::Angle result;
 
   if (this->jointId)
   {
-    if (_index == 0)
+    // flipping axis 1 and 2 around
+    if (_index == UniversalJoint::AXIS_CHILD)
       result = dJointGetUniversalAngle1(this->jointId);
-    else
+    else if (_index == UniversalJoint::AXIS_PARENT)
       result = dJointGetUniversalAngle2(this->jointId);
+    else
+      gzerr << "Joint index out of bounds.\n";
   }
   else
     gzerr << "ODE Joint ID is invalid\n";
@@ -121,16 +141,19 @@ math::Angle ODEUniversalJoint::GetAngleImpl(int _index) const
 }
 
 //////////////////////////////////////////////////
-double ODEUniversalJoint::GetVelocity(int _index) const
+double ODEUniversalJoint::GetVelocity(unsigned int _index) const
 {
   double result = 0;
 
   if (this->jointId)
   {
-    if (_index == 0)
+    // flipping axis 1 and 2 around
+    if (_index == UniversalJoint::AXIS_CHILD)
       result = dJointGetUniversalAngle1Rate(this->jointId);
-    else
+    else if (_index == UniversalJoint::AXIS_PARENT)
       result = dJointGetUniversalAngle2Rate(this->jointId);
+    else
+      gzerr << "Joint index out of bounds.\n";
   }
   else
     gzerr << "ODE Joint ID is invalid\n";
@@ -139,73 +162,61 @@ double ODEUniversalJoint::GetVelocity(int _index) const
 }
 
 //////////////////////////////////////////////////
-void ODEUniversalJoint::SetVelocity(int _index, double _angle)
+void ODEUniversalJoint::SetVelocity(unsigned int _index, double _angle)
 {
-  if (_index == 0)
+  // flipping axis 1 and 2 around
+  if (_index == UniversalJoint::AXIS_CHILD)
     this->SetParam(dParamVel, _angle);
-  else
+  else if (_index == UniversalJoint::AXIS_PARENT)
     this->SetParam(dParamVel2, _angle);
+  else
+    gzerr << "Joint index out of bounds.\n";
 }
 
 //////////////////////////////////////////////////
-void ODEUniversalJoint::SetForce(int _index, double _effort)
+void ODEUniversalJoint::SetForceImpl(unsigned int _index, double _effort)
 {
-  if (_index < 0 || static_cast<unsigned int>(_index) >= this->GetAngleCount())
-  {
-    gzerr << "Calling ODEUniversalJoint::SetForce with an index ["
-          << _index << "] out of range\n";
-    return;
-  }
-
-  // truncating SetForce effort if velocity limit reached.
-  if (this->velocityLimit[_index] >= 0)
-  {
-    if (this->GetVelocity(_index) > this->velocityLimit[_index])
-      _effort = _effort > 0 ? 0 : _effort;
-    else if (this->GetVelocity(_index) < -this->velocityLimit[_index])
-      _effort = _effort < 0 ? 0 : _effort;
-  }
-
-  // truncate effort if effortLimit is not negative
-  if (this->effortLimit[_index] >= 0.0)
-    _effort = math::clamp(_effort, -this->effortLimit[_index],
-      this->effortLimit[_index]);
-
-  ODEJoint::SetForce(_index, _effort);
-  if (this->childLink) this->childLink->SetEnabled(true);
-  if (this->parentLink) this->parentLink->SetEnabled(true);
-
   if (this->jointId)
   {
-    if (_index == 0)
+    // flipping axis 1 and 2 around
+    if (_index == UniversalJoint::AXIS_CHILD)
       dJointAddUniversalTorques(this->jointId, _effort, 0);
-    else
+    else if (_index == UniversalJoint::AXIS_PARENT)
       dJointAddUniversalTorques(this->jointId, 0, _effort);
+    else
+      gzerr << "Joint index out of bounds.\n";
   }
   else
     gzerr << "ODE Joint ID is invalid\n";
 }
 
 //////////////////////////////////////////////////
-void ODEUniversalJoint::SetMaxForce(int _index, double _t)
+void ODEUniversalJoint::SetMaxForce(unsigned int _index, double _t)
 {
-  if (_index == 0)
+  // flipping axis 1 and 2 around
+  if (_index == UniversalJoint::AXIS_CHILD)
     this->SetParam(dParamFMax, _t);
-  else
+  else if (_index == UniversalJoint::AXIS_PARENT)
     this->SetParam(dParamFMax2, _t);
+  else
+    gzerr << "Joint index out of bounds.\n";
 }
 
 //////////////////////////////////////////////////
-double ODEUniversalJoint::GetMaxForce(int _index)
+double ODEUniversalJoint::GetMaxForce(unsigned int _index)
 {
-  if (_index == 0)
-    return this->GetParam(dParamFMax);
-  else
-    return this->GetParam(dParamFMax2);
+  // flipping axis 1 and 2 around
+  if (_index == UniversalJoint::AXIS_CHILD)
+    return ODEJoint::GetParam(dParamFMax);
+  else if (_index == UniversalJoint::AXIS_PARENT)
+    return ODEJoint::GetParam(dParamFMax2);
+
+  gzerr << "Joint index out of bounds.\n";
+  return 0;
 }
 
 //////////////////////////////////////////////////
-void ODEUniversalJoint::SetParam(int _parameter, double _value)
+void ODEUniversalJoint::SetParam(unsigned int _parameter, double _value)
 {
   ODEJoint::SetParam(_parameter, _value);
 
@@ -214,3 +225,216 @@ void ODEUniversalJoint::SetParam(int _parameter, double _value)
   else
     gzerr << "ODE Joint ID is invalid\n";
 }
+
+//////////////////////////////////////////////////
+bool ODEUniversalJoint::SetHighStop(
+  unsigned int _index, const math::Angle &_angle)
+{
+  // Overload because we switched axis orders
+  Joint::SetHighStop(_index, _angle);
+  switch (_index)
+  {
+    case UniversalJoint::AXIS_CHILD:
+      this->SetParam(dParamHiStop, _angle.Radian());
+      return true;
+    case UniversalJoint::AXIS_PARENT:
+      this->SetParam(dParamHiStop2, _angle.Radian());
+      return true;
+    default:
+      gzerr << "Invalid index[" << _index << "]\n";
+      return false;
+  };
+}
+
+//////////////////////////////////////////////////
+bool ODEUniversalJoint::SetLowStop(
+  unsigned int _index, const math::Angle &_angle)
+{
+  // Overload because we switched axis orders
+  Joint::SetLowStop(_index, _angle);
+  switch (_index)
+  {
+    case UniversalJoint::AXIS_CHILD:
+      this->SetParam(dParamLoStop, _angle.Radian());
+      return true;
+    case UniversalJoint::AXIS_PARENT:
+      this->SetParam(dParamLoStop2, _angle.Radian());
+      return true;
+    default:
+      gzerr << "Invalid index[" << _index << "]\n";
+      return false;
+  };
+}
+
+//////////////////////////////////////////////////
+void ODEUniversalJoint::SetAttribute(
+  const std::string &_key, unsigned int _index, const boost::any &_value)
+{
+  this->SetParam(_key, _index, _value);
+}
+
+//////////////////////////////////////////////////
+bool ODEUniversalJoint::SetParam(
+  const std::string &_key, unsigned int _index, const boost::any &_value)
+{
+  if (_key == "stop_erp")
+  {
+    try
+    {
+      switch (_index)
+      {
+        case UniversalJoint::AXIS_CHILD:
+          this->SetParam(dParamStopERP, boost::any_cast<double>(_value));
+          break;
+        case UniversalJoint::AXIS_PARENT:
+          this->SetParam(dParamStopERP2, boost::any_cast<double>(_value));
+          break;
+        default:
+          gzerr << "Invalid index[" << _index << "]\n";
+          return false;
+      };
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+  }
+  else if (_key == "stop_cfm")
+  {
+    try
+    {
+      switch (_index)
+      {
+        case UniversalJoint::AXIS_CHILD:
+          this->SetParam(dParamStopCFM, boost::any_cast<double>(_value));
+          break;
+        case UniversalJoint::AXIS_PARENT:
+          this->SetParam(dParamStopCFM2, boost::any_cast<double>(_value));
+          break;
+        default:
+          gzerr << "Invalid index[" << _index << "]\n";
+          return false;
+      };
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+  }
+  else if (_key == "hi_stop")
+  {
+    try
+    {
+      switch (_index)
+      {
+        case UniversalJoint::AXIS_CHILD:
+          this->SetParam(dParamHiStop, boost::any_cast<double>(_value));
+          break;
+        case UniversalJoint::AXIS_PARENT:
+          this->SetParam(dParamHiStop2, boost::any_cast<double>(_value));
+          break;
+        default:
+          gzerr << "Invalid index[" << _index << "]\n";
+          return false;
+      };
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+  }
+  else if (_key == "lo_stop")
+  {
+    try
+    {
+      switch (_index)
+      {
+        case UniversalJoint::AXIS_CHILD:
+          this->SetParam(dParamLoStop, boost::any_cast<double>(_value));
+          break;
+        case UniversalJoint::AXIS_PARENT:
+          this->SetParam(dParamLoStop2, boost::any_cast<double>(_value));
+          break;
+        default:
+          gzerr << "Invalid index[" << _index << "]\n";
+          return false;
+      };
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+  }
+  else
+  {
+    // Overload because we switched axis orders
+    return ODEJoint::SetParam(_key, _index, _value);
+  }
+  return true;
+}
+
+//////////////////////////////////////////////////
+double ODEUniversalJoint::GetAttribute(
+  const std::string &_key, unsigned int _index)
+{
+  return this->GetParam(_key, _index);
+}
+
+//////////////////////////////////////////////////
+double ODEUniversalJoint::GetParam(
+  const std::string &_key, unsigned int _index)
+{
+  // Overload because we switched axis orders
+  if (_key == "hi_stop")
+  {
+    try
+    {
+      switch (_index)
+      {
+        case UniversalJoint::AXIS_CHILD:
+          return ODEJoint::GetParam(dParamHiStop);
+        case UniversalJoint::AXIS_PARENT:
+          return ODEJoint::GetParam(dParamHiStop2);
+        default:
+          gzerr << "Invalid index[" << _index << "]\n";
+          return 0;
+          break;
+      };
+    }
+    catch(const common::Exception &e)
+    {
+      gzerr << "GetParam error:" << e.GetErrorStr() << "\n";
+      return 0;
+    }
+  }
+  else if (_key == "lo_stop")
+  {
+    try
+    {
+      switch (_index)
+      {
+        case UniversalJoint::AXIS_CHILD:
+          return ODEJoint::GetParam(dParamLoStop);
+        case UniversalJoint::AXIS_PARENT:
+          return ODEJoint::GetParam(dParamLoStop2);
+        default:
+          gzerr << "Invalid index[" << _index << "]\n";
+          return 0;
+          break;
+      };
+    }
+    catch(const common::Exception &e)
+    {
+      gzerr << "GetParam error:" << e.GetErrorStr() << "\n";
+      return 0;
+    }
+  }
+  else
+  {
+    return ODEJoint::GetParam(_key, _index);
+  }
+}
diff --git a/gazebo/physics/ode/ODEUniversalJoint.hh b/gazebo/physics/ode/ODEUniversalJoint.hh
index af9daac..08a81f6 100644
--- a/gazebo/physics/ode/ODEUniversalJoint.hh
+++ b/gazebo/physics/ode/ODEUniversalJoint.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,15 +22,20 @@
 #ifndef _ODEUNIVERSALJOINT_HH_
 #define _ODEUNIVERSALJOINT_HH_
 
+#include <boost/any.hpp>
+#include <string>
+
+#include "gazebo/common/Exception.hh"
 #include "gazebo/physics/UniversalJoint.hh"
 #include "gazebo/physics/ode/ODEJoint.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace physics
   {
     /// \brief A universal joint.
-    class ODEUniversalJoint : public UniversalJoint<ODEJoint>
+    class GAZEBO_VISIBLE ODEUniversalJoint : public UniversalJoint<ODEJoint>
     {
       /// \brief Constructor.
       /// \param[in] _worldId ODE world id.
@@ -41,37 +46,66 @@ namespace gazebo
       public: virtual ~ODEUniversalJoint();
 
       // Documentation inherited
-      public: virtual math::Vector3 GetAnchor(int _index) const;
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetAnchor(int _index, const math::Vector3 &_anchor);
+      public: virtual void SetAnchor(unsigned int _index,
+                  const math::Vector3 &_anchor);
 
       // Documentation inherited
-      public: virtual math::Vector3 GetGlobalAxis(int _index) const;
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetAxis(int _index, const math::Vector3 &_axis);
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
 
       // Documentation inherited
-      public: virtual math::Angle GetAngleImpl(int _index) const;
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual double GetVelocity(int _index) const;
+      public: virtual double GetVelocity(unsigned int _index) const;
 
       // Documentation inherited
-      public: virtual void SetVelocity(int _index, double _angle);
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
 
       // Documentation inherited
-      public: virtual void SetForce(int _index, double _effort);
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
 
       // Documentation inherited
-      public: virtual void SetMaxForce(int _index, double _t);
+      public: virtual double GetMaxForce(unsigned int _index);
 
       // Documentation inherited
-      public: virtual double GetMaxForce(int _index);
+      public: virtual void SetParam(unsigned int _parameter, double _value);
+
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                  const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                  const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual bool SetParam(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value);
+
+      // Documentation inherited.
+      public: virtual void SetAttribute(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value)
+                                        GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      public: virtual double GetParam(const std::string &_key,
+                                                unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual double GetAttribute(const std::string &_key,
+                unsigned int _index) GAZEBO_DEPRECATED(3.0);
 
       // Documentation inherited
-      public: virtual void SetParam(int _parameter, double _value);
+      protected: virtual void SetForceImpl(unsigned int _index, double _effort);
     };
   }
 }
diff --git a/gazebo/physics/ode/ode_inc.h b/gazebo/physics/ode/ode_inc.h
index 31c80dd..1a2c24e 100644
--- a/gazebo/physics/ode/ode_inc.h
+++ b/gazebo/physics/ode/ode_inc.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/physics/server.cc b/gazebo/physics/server.cc
deleted file mode 100644
index af33a43..0000000
--- a/gazebo/physics/server.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <errno.h>
-#include <iostream>
-#include <vector>
-
-#include "physics/Physics.hh"
-#include "common/Time.hh"
-#include "transport/Transport.hh"
-#include "sdf/sdf.hh"
-#include "gazebo_config.h"
-
-// Command line options
-std::string config_filename = "";
-
-bool quit = false;
-
-//////////////////////////////////////////////////
-void PrintUsage()
-{
-  fprintf(stderr, "Usage: gzphysics [-hv] <worldfile>\n");
-  return;
-}
-
-//////////////////////////////////////////////////
-void PrintVersion()
-{
-  fprintf(stderr, "%s", GAZEBO_VERSION_HEADER);
-}
-
-//////////////////////////////////////////////////
-int ParseArgs(int _argc, char **_argv)
-{
-  // FILE *tmpFile;
-  int ch;
-
-  char *flags = const_cast<char*>("h");
-
-  // Get letter options
-  while ((ch = getopt(_argc, _argv, flags)) != -1)
-  {
-    switch (ch)
-    {
-      case 'h':
-      default:
-        PrintUsage();
-        return -1;
-    }
-  }
-
-  _argc -= optind;
-  _argv += optind;
-
-  // Get the world file name
-  if (_argc >= 1)
-    config_filename = _argv[0];
-
-  return 0;
-}
-
-//////////////////////////////////////////////////
-void SignalHandler(int)
-{
-  quit = true;
-}
-
-void Load()
-{
-  gazebo::transport::init();
-  gazebo::physics::load();
-
-
-  // Load the world file
-  sdf::SDFPtr sdf(new sdf::SDF());
-  sdf::initFile(config_filename, sdf);
-  sdf::readFile(config_filename, sdf);
-
-  sdf::ElementPtr worldElem = sdf->root->GetElement("world");
-
-  while (worldElem)
-  {
-    gazebo::physics::WorldPtr world =
-      gazebo::physics::create_world(worldElem->GetValueString("name"));
-
-    // Create the world
-    try
-    {
-      gazebo::physics::load_world(world, worldElem);
-    }
-    catch(gazebo::common::Exception &e)
-    {
-      gzthrow("Failed to load the World\n"  << e);
-    }
-
-    worldElem = worldElem->GetNextElement("world");
-  }
-
-  gazebo::physics::init_worlds();
-}
-
-void Run()
-{
-  gazebo::physics::run_worlds();
-
-  while (!quit)
-  {
-    gazebo::common::Time::MSleep(50);
-  }
-}
-
-//////////////////////////////////////////////////
-int main(int _argc, char **_argv)
-{
-  // Application Setup
-  if (ParseArgs(_argc, _argv) != 0)
-    return -1;
-
-  PrintVersion();
-
-  if (signal(SIGINT, SignalHandler) == SIG_ERR)
-  {
-    std::cerr << "signal(2) failed while setting up for SIGINT" << std::endl;
-    return -1;
-  }
-
-  Load();
-  Run();
-
-  return 0;
-}
-
-
diff --git a/gazebo/physics/simbody/CMakeLists.txt b/gazebo/physics/simbody/CMakeLists.txt
new file mode 100644
index 0000000..f604723
--- /dev/null
+++ b/gazebo/physics/simbody/CMakeLists.txt
@@ -0,0 +1,37 @@
+include (${gazebo_cmake_dir}/GazeboUtils.cmake)
+
+#message("includes: ${Simbody_INCLUDE_DIR}\n\n")
+#message("library dirs: ${Simbody_LIB_DIR}\n\n")
+#message("libraries: ${Simbody_LIBRARIES}\n\n")
+#message("cflags: ${Simbody_CFLAGS}\n\n")
+
+include_directories(SYSTEM ${Simbody_INCLUDE_DIR})
+
+link_directories(${Simbody_LIB_DIR})
+
+add_definitions(${Simbody_CFLAGS})
+
+set (sources
+SimbodyBallJoint.cc
+SimbodyCollision.cc
+SimbodyHeightmapShape.cc
+SimbodyHinge2Joint.cc
+SimbodyHingeJoint.cc
+SimbodyJoint.cc
+SimbodyLink.cc
+SimbodyMeshShape.cc
+SimbodyModel.cc
+SimbodyMultiRayShape.cc
+SimbodyPhysics.cc
+SimbodyPlaneShape.cc
+SimbodyRayShape.cc
+SimbodyScrewJoint.cc
+SimbodySliderJoint.cc
+SimbodyUniversalJoint.cc
+)
+
+gz_add_library(gazebo_physics_simbody ${sources})
+target_link_libraries(gazebo_physics_simbody ${Simbody_LIBRARIES})
+
+gz_install_library(gazebo_physics_simbody)
+
diff --git a/gazebo/physics/simbody/SimbodyBallJoint.cc b/gazebo/physics/simbody/SimbodyBallJoint.cc
new file mode 100644
index 0000000..645e163
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyBallJoint.cc
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyBallJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyBallJoint::SimbodyBallJoint(SimTK::MultibodySystem * /*_world*/,
+                                   BasePtr _parent)
+    : BallJoint<SimbodyJoint>(_parent)
+{
+  this->physicsInitialized = false;
+}
+
+//////////////////////////////////////////////////
+SimbodyBallJoint::~SimbodyBallJoint()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyBallJoint::Load(sdf::ElementPtr _sdf)
+{
+  BallJoint<SimbodyJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyBallJoint::GetAnchor(unsigned int /*_index*/) const
+{
+  return this->anchorPos;
+}
+
+/////////////////////////////////////////////////
+void SimbodyBallJoint::SetVelocity(unsigned int /*_index*/, double /*_angle*/)
+{
+  gzerr << "Not implemented\n";
+}
+
+/////////////////////////////////////////////////
+double SimbodyBallJoint::GetVelocity(unsigned int /*_index*/) const
+{
+  gzerr << "Not implemented\n";
+  return 0;
+}
+
+/////////////////////////////////////////////////
+double SimbodyBallJoint::GetMaxForce(unsigned int /*_index*/)
+{
+  gzerr << "Not implemented\n";
+  return 0;
+}
+
+/////////////////////////////////////////////////
+void SimbodyBallJoint::SetMaxForce(unsigned int /*_index*/, double /*_t*/)
+{
+  gzerr << "Not implemented\n";
+  return;
+}
+
+/////////////////////////////////////////////////
+math::Vector3 SimbodyBallJoint::GetGlobalAxis(unsigned int /*_index*/) const
+{
+  gzerr << "Not implemented\n";
+  return math::Vector3();
+}
+
+/////////////////////////////////////////////////
+math::Angle SimbodyBallJoint::GetAngleImpl(unsigned int /*_index*/) const
+{
+  gzerr << "Not implemented\n";
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+void SimbodyBallJoint::SetForceImpl(unsigned int /*_index*/, double /*_torque*/)
+{
+  gzerr << "Not implemented";
+}
+
+//////////////////////////////////////////////////
+void SimbodyBallJoint::SetAxis(unsigned int /*_index*/,
+                               const math::Vector3 &/*_axis*/)
+{
+  gzerr << "SimbodyBallJoint::SetAxis not implemented" << std::endl;
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyBallJoint::GetHighStop(unsigned int /*_index*/)
+{
+  gzerr << "SimbodyBallJoint::GetHighStop not implemented" << std::endl;
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyBallJoint::GetLowStop(unsigned int /*_index*/)
+{
+  gzerr << "SimbodyBallJoint::GetLowStop not implemented" << std::endl;
+  return math::Angle();
+}
+
+//////////////////////////////////////////////////
+bool SimbodyBallJoint::SetHighStop(unsigned int /*_index*/,
+                                   const math::Angle &/*_angle*/)
+{
+  gzerr << "SimbodyBallJoint::SetHighStop not implemented" << std::endl;
+  return false;
+}
+
+//////////////////////////////////////////////////
+bool SimbodyBallJoint::SetLowStop(unsigned int /*_index*/,
+                                  const math::Angle &/*_angle*/)
+{
+  gzerr << "SimbodyBallJoint::SetLowStop not implemented" << std::endl;
+  return false;
+}
+
diff --git a/gazebo/physics/simbody/SimbodyBallJoint.hh b/gazebo/physics/simbody/SimbodyBallJoint.hh
new file mode 100644
index 0000000..1612be5
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyBallJoint.hh
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODYBALLJOINT_HH_
+#define _SIMBODYBALLJOINT_HH_
+
+#include "gazebo/physics/BallJoint.hh"
+#include "gazebo/physics/simbody/SimbodyJoint.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief SimbodyBallJoint class models a ball joint in Simbody.
+    class GAZEBO_VISIBLE SimbodyBallJoint : public BallJoint<SimbodyJoint>
+    {
+      /// \brief Simbody Ball Joint Constructor
+      public: SimbodyBallJoint(SimTK::MultibodySystem *_world, BasePtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyBallJoint();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAxis(unsigned int /*_index*/) const
+              {return math::Vector3();}
+
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
+
+      // Documentation inherited.
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                                   const math::Vector3 &_axis);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                                       const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                                      const math::Angle &_angle);
+
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _torque);
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyBoxShape.hh b/gazebo/physics/simbody/SimbodyBoxShape.hh
new file mode 100644
index 0000000..2c4222f
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyBoxShape.hh
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_BOXSHAPE_HH_
+#define _SIMBODY_BOXSHAPE_HH_
+
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/BoxShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Simbody box collision
+    class GAZEBO_VISIBLE SimbodyBoxShape : public BoxShape
+    {
+      /// \brief Constructor
+      public: SimbodyBoxShape(CollisionPtr _parent) : BoxShape(_parent) {}
+
+      /// \brief Destructor
+      public: virtual ~SimbodyBoxShape() {}
+
+      // Documentation inherited
+      public: void SetSize(const math::Vector3 &_size)
+              {
+                if (_size.x < 0 || _size.y < 0 || _size.z < 0)
+                {
+                  gzerr << "Box shape does not support negative size\n";
+                  return;
+                }
+                math::Vector3 size = _size;
+                if (math::equal(size.x, 0.0))
+                {
+                  // Warn user, but still create shape with very small value
+                  // otherwise later resize operations using setLocalScaling
+                  // will not be possible
+                  gzwarn << "Setting box shape's x to zero \n";
+                  size.x = 1e-4;
+                }
+                if (math::equal(size.y, 0.0))
+                {
+                  gzwarn << "Setting box shape's y to zero \n";
+                  size.y = 1e-4;
+                }
+                if (math::equal(size.z, 0.0))
+                {
+                  gzwarn << "Setting box shape's z to zero \n";
+                  size.z = 1e-4;
+                }
+
+                BoxShape::SetSize(size);
+
+                SimbodyCollisionPtr bParent;
+                bParent = boost::dynamic_pointer_cast<SimbodyCollision>(
+                    this->collisionParent);
+              }
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyCollision.cc b/gazebo/physics/simbody/SimbodyCollision.cc
new file mode 100644
index 0000000..cf13258
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyCollision.cc
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/simbody/simbody_inc.h"
+#include "gazebo/physics/simbody/SimbodyCollision.hh"
+#include "gazebo/physics/SurfaceParams.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyCollision::SimbodyCollision(LinkPtr _parent)
+    : Collision(_parent)
+{
+  this->SetName("Simbody_Collision");
+  this->collisionShape = NULL;
+  this->surface.reset(new SurfaceParams());
+}
+
+//////////////////////////////////////////////////
+SimbodyCollision::~SimbodyCollision()
+{
+  delete this->collisionShape;
+  this->collisionShape = NULL;
+}
+
+//////////////////////////////////////////////////
+void SimbodyCollision::Load(sdf::ElementPtr _sdf)
+{
+  Collision::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void SimbodyCollision::OnPoseChange()
+{
+  // math::Pose pose = this->GetRelativePose();
+  // SimbodyLink *bbody = static_cast<SimbodyLink*>(this->body);
+
+  // bbody->SetCollisionRelativePose(this, pose);
+}
+
+//////////////////////////////////////////////////
+void SimbodyCollision::SetCategoryBits(unsigned int /*_bits*/)
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyCollision::SetCollideBits(unsigned int /*_bits*/)
+{
+}
+
+//////////////////////////////////////////////////
+math::Box SimbodyCollision::GetBoundingBox() const
+{
+  math::Box result;
+  return result;
+}
+
+//////////////////////////////////////////////////
+void SimbodyCollision::SetCollisionShape(SimTK::ContactGeometry *_shape)
+{
+  this->collisionShape = _shape;
+}
+
+//////////////////////////////////////////////////
+SimTK::ContactGeometry *SimbodyCollision::GetCollisionShape() const
+{
+  return this->collisionShape;
+}
diff --git a/gazebo/physics/simbody/SimbodyCollision.hh b/gazebo/physics/simbody/SimbodyCollision.hh
new file mode 100644
index 0000000..162c207
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyCollision.hh
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_COLLISION_HH_
+#define _SIMBODY_COLLISION_HH_
+
+#include <string>
+
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/util/system.hh"
+
+namespace SimTK
+{
+  class ContactGeometry;
+}
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Simbody collisions
+    class GAZEBO_VISIBLE SimbodyCollision : public Collision
+    {
+      /// \brief Constructor
+      public: SimbodyCollision(LinkPtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyCollision();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _ptr);
+
+      // Documentation inherited
+      public: virtual void OnPoseChange();
+
+      // Documentation inherited
+      public: virtual void SetCategoryBits(unsigned int _bits);
+
+      // Documentation inherited
+      public: virtual void SetCollideBits(unsigned int _bits);
+
+      // Documentation inherited
+      public: virtual math::Box GetBoundingBox() const;
+
+      /// \brief Set the collision shape.
+      /// \param[in] _shape SimTK geometry to use as the collision
+      /// SimTK geometry to use as the collision shape.
+      public: void SetCollisionShape(SimTK::ContactGeometry *_shape);
+
+      /// \brief Get the simbody collision shape.
+      /// \return SimTK geometry used as the collision shape.
+      public: SimTK::ContactGeometry *GetCollisionShape() const;
+
+      /// \brief The SimTK collision geometry.
+      private: SimTK::ContactGeometry *collisionShape;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyCylinderShape.hh b/gazebo/physics/simbody/SimbodyCylinderShape.hh
new file mode 100644
index 0000000..50e6ce2
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyCylinderShape.hh
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_CYLINDERSHAPE_HH_
+#define _SIMBODY_CYLINDERSHAPE_HH_
+
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/CylinderShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Cylinder collision
+    class GAZEBO_VISIBLE SimbodyCylinderShape : public CylinderShape
+    {
+      /// \brief Constructor
+      public: SimbodyCylinderShape(CollisionPtr _parent)
+              : CylinderShape(_parent) {}
+
+      /// \brief Destructor
+      public: virtual ~SimbodyCylinderShape() {}
+
+      // Documentation inherited
+      public: void SetSize(double _radius, double _length)
+              {
+                if (_radius < 0)
+                {
+                  gzerr << "Cylinder shape does not support negative radius\n";
+                  return;
+                }
+                if (_length < 0)
+                {
+                  gzerr << "Cylinder shape does not support negative length\n";
+                  return;
+                }
+                if (math::equal(_radius, 0.0))
+                {
+                  // Warn user, but still create shape with very small value
+                  // otherwise later resize operations using setLocalScaling
+                  // will not be possible
+                  gzwarn << "Setting cylinder shape's radius to zero \n";
+                  _radius = 1e-4;
+                }
+                if (math::equal(_length, 0.0))
+                {
+                  gzwarn << "Setting cylinder shape's length to zero \n";
+                  _length = 1e-4;
+                }
+
+                CylinderShape::SetSize(_radius, _length);
+                SimbodyCollisionPtr bParent;
+                bParent = boost::dynamic_pointer_cast<SimbodyCollision>(
+                    this->collisionParent);
+
+                // set collision shape
+              }
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyHeightmapShape.cc b/gazebo/physics/simbody/SimbodyHeightmapShape.cc
new file mode 100644
index 0000000..cb56f75
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyHeightmapShape.cc
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/physics/simbody/simbody_inc.h"
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyCollision.hh"
+#include "gazebo/physics/simbody/SimbodyHeightmapShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyHeightmapShape::SimbodyHeightmapShape(CollisionPtr _parent)
+    : HeightmapShape(_parent)
+{
+  gzerr << "SimbodyHeightmapShape not implemented yet.\n";
+}
+
+//////////////////////////////////////////////////
+SimbodyHeightmapShape::~SimbodyHeightmapShape()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyHeightmapShape::Init()
+{
+  HeightmapShape::Init();
+}
diff --git a/gazebo/physics/simbody/SimbodyHeightmapShape.hh b/gazebo/physics/simbody/SimbodyHeightmapShape.hh
new file mode 100644
index 0000000..51ed58b
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyHeightmapShape.hh
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_HEIGHTMAPGEOM_HH_
+#define _SIMBODY_HEIGHTMAPGEOM_HH_
+
+#include <string>
+
+#include "gazebo/physics/HeightmapShape.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Height map collision.
+    class GAZEBO_VISIBLE SimbodyHeightmapShape : public HeightmapShape
+    {
+      /// \brief Constructor.
+      public: SimbodyHeightmapShape(CollisionPtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~SimbodyHeightmapShape();
+
+      // Documentation inherited.
+      public: virtual void Init();
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyHinge2Joint.cc b/gazebo/physics/simbody/SimbodyHinge2Joint.cc
new file mode 100644
index 0000000..1b59449
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyHinge2Joint.cc
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/simbody/SimbodyHinge2Joint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyHinge2Joint::SimbodyHinge2Joint(SimTK::MultibodySystem * /*_world*/,
+                                       BasePtr _parent)
+    : Hinge2Joint<SimbodyJoint>(_parent)
+{
+  this->physicsInitialized = false;
+}
+
+//////////////////////////////////////////////////
+SimbodyHinge2Joint::~SimbodyHinge2Joint()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyHinge2Joint::Load(sdf::ElementPtr _sdf)
+{
+  Hinge2Joint<SimbodyJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyHinge2Joint::GetAnchor(unsigned int /*index*/) const
+{
+  return this->anchorPos;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyHinge2Joint::GetAxis(unsigned int /*index*/) const
+{
+  gzerr << "Not implemented";
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+double SimbodyHinge2Joint::GetVelocity(unsigned int /*_index*/) const
+{
+  gzerr << "Not implemented";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+void SimbodyHinge2Joint::SetVelocity(unsigned int /*_index*/,
+    double /*_angle*/)
+{
+  gzerr << "Not implemented";
+}
+
+//////////////////////////////////////////////////
+void SimbodyHinge2Joint::SetAxis(unsigned int /*_index*/,
+    const math::Vector3 &/*_axis*/)
+{
+  // Simbody seems to handle setAxis improperly. It readjust all the pivot
+  // points
+}
+
+//////////////////////////////////////////////////
+void SimbodyHinge2Joint::SetForceImpl(
+    unsigned int /*_index*/, double /*_torque*/)
+{
+  gzerr << "Not implemented";
+}
+
+//////////////////////////////////////////////////
+void SimbodyHinge2Joint::SetMaxForce(unsigned int /*_index*/, double /*_t*/)
+{
+  gzerr << "Not implemented";
+}
+
+//////////////////////////////////////////////////
+double SimbodyHinge2Joint::GetMaxForce(unsigned int /*_index*/)
+{
+  gzerr << "Not implemented";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyHinge2Joint::GetGlobalAxis(unsigned int /*_index*/) const
+{
+  gzerr << "SimbodyHinge2Joint::GetGlobalAxis not implemented\n";
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyHinge2Joint::GetAngleImpl(unsigned int /*_index*/) const
+{
+  gzerr << "SimbodyHinge2Joint::GetAngleImpl not implemented\n";
+  return math::Angle();
+}
diff --git a/gazebo/physics/simbody/SimbodyHinge2Joint.hh b/gazebo/physics/simbody/SimbodyHinge2Joint.hh
new file mode 100644
index 0000000..6d77858
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyHinge2Joint.hh
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_HINGE2JOINT_HH_
+#define _SIMBODY_HINGE2JOINT_HH_
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/physics/Hinge2Joint.hh"
+#include "gazebo/physics/simbody/SimbodyJoint.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief A two axis hinge joint
+    class GAZEBO_VISIBLE SimbodyHinge2Joint : public Hinge2Joint<SimbodyJoint>
+    {
+      /// \brief Constructor
+      public: SimbodyHinge2Joint(SimTK::MultibodySystem *world,
+                                 BasePtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyHinge2Joint();
+
+      // Documentation inherited.
+      protected: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAxis(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
+
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
+
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited
+      protected: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      /// \brief Set the torque
+      protected: virtual void SetForceImpl(unsigned int _index, double _torque);
+    };
+  /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyHingeJoint.cc b/gazebo/physics/simbody/SimbodyHingeJoint.cc
new file mode 100644
index 0000000..2da53c7
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyHingeJoint.cc
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/simbody/SimbodyHingeJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyHingeJoint::SimbodyHingeJoint(SimTK::MultibodySystem * /*_world*/,
+                                     BasePtr _parent)
+    : HingeJoint<SimbodyJoint>(_parent)
+{
+  this->physicsInitialized = false;
+}
+
+//////////////////////////////////////////////////
+SimbodyHingeJoint::~SimbodyHingeJoint()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyHingeJoint::Load(sdf::ElementPtr _sdf)
+{
+  HingeJoint<SimbodyJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void SimbodyHingeJoint::SetAxis(unsigned int /*_index*/,
+    const math::Vector3 &/*_axis*/)
+{
+  // Simbody seems to handle setAxis improperly. It readjust all the pivot
+  // points
+  gzdbg << "SetAxis: setting axis is not yet implemented.  The axis are set "
+        << " during joint construction in SimbodyPhysics.cc for now.\n";
+}
+
+//////////////////////////////////////////////////
+void SimbodyHingeJoint::SetVelocity(unsigned int _index, double _rate)
+{
+  if (_index < this->GetAngleCount())
+    this->mobod.setOneU(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      SimTK::MobilizerUIndex(_index), _rate);
+  else
+    gzerr << "SetVelocity _index too large.\n";
+}
+
+//////////////////////////////////////////////////
+double SimbodyHingeJoint::GetVelocity(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized &&
+        this->simbodyPhysics->simbodyPhysicsInitialized)
+      return this->mobod.getOneU(
+        this->simbodyPhysics->integ->getState(),
+        SimTK::MobilizerUIndex(_index));
+    else
+    {
+      gzdbg << "GetVelocity() simbody not yet initialized, "
+            << "initial velocity should be zero until restart from "
+            << "state has been implemented.\n";
+      return 0.0;
+    }
+  }
+  else
+  {
+    gzerr << "Invalid index for joint, returning NaN\n";
+    return SimTK::NaN;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyHingeJoint::SetMaxForce(unsigned int /*_index*/, double /*_t*/)
+{
+  gzdbg << "SetMaxForce: doesn't make sense in simbody...\n";
+}
+
+//////////////////////////////////////////////////
+double SimbodyHingeJoint::GetMaxForce(unsigned int /*_index*/)
+{
+  gzdbg << "GetMaxForce: doesn't make sense in simbody...\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+void SimbodyHingeJoint::SetForceImpl(unsigned int _index, double _torque)
+{
+  if (_index < this->GetAngleCount() && this->physicsInitialized)
+    this->simbodyPhysics->discreteForces.setOneMobilityForce(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      this->mobod, SimTK::MobilizerUIndex(_index), _torque);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyHingeJoint::GetGlobalAxis(unsigned int _index) const
+{
+  if (this->simbodyPhysics &&
+      this->simbodyPhysics->simbodyPhysicsStepped &&
+      _index < this->GetAngleCount())
+  {
+    const SimTK::Transform &X_OM = this->mobod.getOutboardFrame(
+      this->simbodyPhysics->integ->getState());
+
+    // express Z-axis of X_OM in world frame
+    SimTK::Vec3 z_W(this->mobod.expressVectorInGroundFrame(
+      this->simbodyPhysics->integ->getState(), X_OM.z()));
+
+    return SimbodyPhysics::Vec3ToVector3(z_W);
+  }
+  else
+  {
+    if (_index >= this->GetAngleCount())
+    {
+      gzerr << "index out of bound\n";
+      return math::Vector3(SimTK::NaN, SimTK::NaN, SimTK::NaN);
+    }
+    else
+    {
+      gzdbg << "GetGlobalAxis() sibmody physics engine not initialized yet, "
+            << "use local axis and initial pose to compute "
+            << "global axis.\n";
+      // if local axis specified in model frame (to be changed)
+      // switch to code below if issue #494 is to be addressed
+      return this->model->GetWorldPose().rot.RotateVector(
+        this->GetLocalAxis(_index));
+
+      // if local axis specified in joint frame (Issue #494)
+      // Remember to remove include of Model.hh when switching.
+      // if (this->childLink)
+      // {
+      //   math::Pose jointPose =
+      //    this->anchorPose + this->childLink->GetWorldPose();
+      //   return jointPose.rot.RotateVector(this->GetLocalAxis(_index));
+      // }
+      // else
+      // {
+      //   gzerr << "Joint [" << this->GetName() << "] missing child link.\n";
+      //   return math::Vector3(SimTK::NaN, SimTK::NaN, SimTK::NaN);
+      // }
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyHingeJoint::GetAngleImpl(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized &&
+        this->simbodyPhysics->simbodyPhysicsInitialized)
+      return math::Angle(this->mobod.getOneQ(
+        this->simbodyPhysics->integ->getState(), _index));
+    else
+    {
+      gzdbg << "GetAngleImpl() simbody not yet initialized, "
+            << "initial angle should be zero until <initial_angle> "
+            << "is implemented.\n";
+      return math::Angle(0.0);
+    }
+  }
+  else
+  {
+    gzerr << "index out of bound\n";
+    return math::Angle(SimTK::NaN);
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyHingeJoint::SaveSimbodyState(const SimTK::State &_state)
+{
+  if (!this->mobod.isEmptyHandle())
+  {
+    if (this->simbodyQ.empty())
+      this->simbodyQ.resize(this->mobod.getNumQ(_state));
+
+    if (this->simbodyU.empty())
+      this->simbodyU.resize(this->mobod.getNumU(_state));
+
+    for (unsigned int i = 0; i < this->simbodyQ.size(); ++i)
+      this->simbodyQ[i] = this->mobod.getOneQ(_state, i);
+
+    for (unsigned int i = 0; i < this->simbodyU.size(); ++i)
+      this->simbodyU[i] = this->mobod.getOneU(_state, i);
+  }
+  else
+  {
+    // gzerr << "debug: joint name: " << this->GetScopedName() << "\n";
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyHingeJoint::RestoreSimbodyState(SimTK::State &_state)
+{
+  if (!this->mobod.isEmptyHandle())
+  {
+    for (unsigned int i = 0; i < this->simbodyQ.size(); ++i)
+      this->mobod.setOneQ(_state, i, this->simbodyQ[i]);
+
+    for (unsigned int i = 0; i < this->simbodyU.size(); ++i)
+      this->mobod.setOneU(_state, i, this->simbodyU[i]);
+  }
+  else
+  {
+    // gzerr << "restoring model [" << this->GetScopedName()
+    //       << "] failed due to uninitialized mobod\n";
+  }
+}
diff --git a/gazebo/physics/simbody/SimbodyHingeJoint.hh b/gazebo/physics/simbody/SimbodyHingeJoint.hh
new file mode 100644
index 0000000..2e4397a
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyHingeJoint.hh
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_HINGEJOINT_HH_
+#define _SIMBODY_HINGEJOINT_HH_
+
+#include <vector>
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/physics/HingeJoint.hh"
+#include "gazebo/physics/simbody/SimbodyJoint.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief A single axis hinge joint
+    class GAZEBO_VISIBLE SimbodyHingeJoint : public HingeJoint<SimbodyJoint>
+    {
+      ///  Constructor
+      public: SimbodyHingeJoint(SimTK::MultibodySystem *world, BasePtr _parent);
+
+      /// Destructor
+      public: virtual ~SimbodyHingeJoint();
+
+      // Documentation inherited.
+      protected: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: void SetAxis(unsigned int _index, const math::Vector3 &_axis);
+
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _rate);
+
+      // Documentation inherited.
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
+
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      /// \brief save simbody state for spawning
+      public: virtual void SaveSimbodyState(const SimTK::State &_state);
+
+      /// \brief restore  simbody state for spawning
+      public: virtual void RestoreSimbodyState(SimTK::State &_state);
+
+      // Documentation inherited.
+      protected: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _torque);
+
+      /// \brief save simbody state for reconstructing simbody model graph
+      private: std::vector<double> simbodyQ;
+
+      /// \brief save simbody state for reconstructing simbody model graph
+      private: std::vector<double> simbodyU;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyJoint.cc b/gazebo/physics/simbody/SimbodyJoint.cc
new file mode 100644
index 0000000..1fa3bfa
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyJoint.cc
@@ -0,0 +1,616 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <string>
+
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/World.hh"
+
+#include "gazebo/physics/simbody/simbody_inc.h"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyJoint::SimbodyJoint(BasePtr _parent)
+  : Joint(_parent)
+{
+  this->isReversed = false;
+  this->mustBreakLoopHere = false;
+}
+
+//////////////////////////////////////////////////
+SimbodyJoint::~SimbodyJoint()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::Load(sdf::ElementPtr _sdf)
+{
+  // store a pointer to the simbody physics engine for convenience
+  this->simbodyPhysics = boost::dynamic_pointer_cast<SimbodyPhysics>(
+    this->model->GetWorld()->GetPhysicsEngine());
+
+  Joint::Load(_sdf);
+
+  // read must_be_loop_joint
+  // \TODO: clean up
+  if (_sdf->HasElement("physics") &&
+    _sdf->GetElement("physics")->HasElement("simbody"))
+  {
+    this->mustBreakLoopHere = _sdf->GetElement("physics")->
+      GetElement("simbody")->Get<bool>("must_be_loop_joint");
+  }
+
+  if (this->sdf->HasElement("axis"))
+  {
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis");
+    if (axisElem->HasElement("dynamics"))
+    {
+      sdf::ElementPtr dynamicsElem = axisElem->GetElement("dynamics");
+
+      /// \TODO: switch to GetElement so default values apply
+      /// \TODO: check all physics engines
+      if (dynamicsElem->HasElement("damping"))
+      {
+        this->dissipationCoefficient[0] = dynamicsElem->Get<double>("damping");
+      }
+    }
+  }
+
+  if (this->sdf->HasElement("axis2"))
+  {
+    sdf::ElementPtr axisElem = this->sdf->GetElement("axis2");
+    if (axisElem->HasElement("dynamics"))
+    {
+      sdf::ElementPtr dynamicsElem = axisElem->GetElement("dynamics");
+
+      /// \TODO: switch to GetElement so default values apply
+      /// \TODO: check all physics engines
+      if (dynamicsElem->HasElement("damping"))
+      {
+        this->dissipationCoefficient[1] = dynamicsElem->Get<double>("damping");
+      }
+    }
+  }
+
+  // Read old style
+  //    <pose>pose on child</pose>
+  // or new style
+
+  // to support alternative unassembled joint pose specification
+  // check if the new style of pose specification exists
+  //    <parent>
+  //      <link>parentName</link>
+  //      <pose>parentPose</pose>
+  //    </parent>
+  // as compared to old style
+  //    <parent>parentName</parent>
+  //
+  // \TODO: consider storing the unassembled format parent pose when
+  // calling Joint::Load(sdf::ElementPtr)
+
+  math::Pose childPose = _sdf->Get<math::Pose>("pose");
+  if (_sdf->GetElement("child")->HasElement("pose"))
+    childPose = _sdf->GetElement("child")->Get<math::Pose>("pose");
+
+  this->xCB = physics::SimbodyPhysics::Pose2Transform(childPose);
+
+  math::Pose parentPose;
+  if (_sdf->GetElement("parent")->HasElement("pose"))
+    this->xPA = physics::SimbodyPhysics::GetPose(_sdf->GetElement("parent"));
+  else
+  {
+    SimTK::Transform X_MC, X_MP;
+    if (this->parentLink)
+    {
+      X_MP = physics::SimbodyPhysics::Pose2Transform(
+        this->parentLink->GetRelativePose());
+    }
+    else
+    {
+      // TODO: verify
+      // parent frame is at the world frame
+      X_MP = ~physics::SimbodyPhysics::Pose2Transform(
+        this->model->GetWorldPose());
+    }
+
+    if (this->childLink)
+    {
+      X_MC = physics::SimbodyPhysics::Pose2Transform(
+        this->childLink->GetRelativePose());
+    }
+    else
+    {
+      // TODO: verify
+      X_MC = ~physics::SimbodyPhysics::Pose2Transform(
+        this->model->GetWorldPose());
+    }
+
+    const SimTK::Transform X_PC = ~X_MP*X_MC;
+
+    // i.e., A spatially coincident with B
+    this->xPA = X_PC*this->xCB;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::Reset()
+{
+  Joint::Reset();
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::CacheForceTorque()
+{
+  const SimTK::State &state = this->simbodyPhysics->integ->getAdvancedState();
+
+  // force calculation of reaction forces
+  this->simbodyPhysics->system.realize(state);
+
+  // In simbody, parent is always inboard (closer to ground in the tree),
+  //   child is always outboard (further away from ground in the tree).
+  SimTK::SpatialVec spatialForceOnInboardBodyInGround =
+    this->mobod.findMobilizerReactionOnParentAtFInGround(state);
+
+  SimTK::SpatialVec spatialForceOnOutboardBodyInGround =
+    this->mobod.findMobilizerReactionOnBodyAtMInGround(state);
+
+  // determine if outboard body is parent or child based on isReversed flag.
+  // determine if inboard body is parent or child based on isReversed flag.
+  SimTK::SpatialVec spatialForceOnParentBodyInGround;
+  SimTK::SpatialVec spatialForceOnChildBodyInGround;
+  // parent and child mobods in gazebo's parent/child tree structure.
+  SimTK::MobilizedBody parentMobod;
+  SimTK::MobilizedBody childMobod;
+  if (!this->isReversed)
+  {
+    spatialForceOnParentBodyInGround = spatialForceOnInboardBodyInGround;
+    spatialForceOnChildBodyInGround = spatialForceOnOutboardBodyInGround;
+    childMobod = this->mobod;
+    parentMobod = this->mobod.getParentMobilizedBody();
+  }
+  else
+  {
+    spatialForceOnParentBodyInGround = spatialForceOnOutboardBodyInGround;
+    spatialForceOnChildBodyInGround = spatialForceOnInboardBodyInGround;
+    childMobod = this->mobod.getParentMobilizedBody();
+    parentMobod = this->mobod;
+  }
+
+  // get rotation from ground to child/parent link frames
+  const SimTK::Rotation& R_GC = childMobod.getBodyRotation(state);
+  const SimTK::Rotation& R_GP = parentMobod.getBodyRotation(state);
+
+  // re-express in child link frame
+  SimTK::Vec3 reactionTorqueOnChildBody =
+    ~R_GC * spatialForceOnChildBodyInGround[0];
+  SimTK::Vec3 reactionForceOnChildBody =
+    ~R_GC * spatialForceOnChildBodyInGround[1];
+
+  SimTK::Vec3 reactionTorqueOnParentBody =
+    ~R_GP * spatialForceOnParentBodyInGround[0];
+  SimTK::Vec3 reactionForceOnParentBody =
+    ~R_GP * spatialForceOnParentBodyInGround[1];
+
+  // gzerr << "parent[" << this->GetName()
+  //       << "]: t[" << reactionTorqueOnParentBody
+  //       << "] f[" << reactionForceOnParentBody
+  //       << "]\n";
+
+  // gzerr << "child[" << this->GetName()
+  //       << "]: t[" << reactionTorqueOnChildBody
+  //       << "] f[" << reactionForceOnChildBody
+  //       << "]\n";
+
+  // Note minus sign indicates these are reaction forces
+  // by the Link on the Joint in the target Link frame.
+  this->wrench.body1Force =
+    -SimbodyPhysics::Vec3ToVector3(reactionForceOnParentBody);
+  this->wrench.body1Torque =
+    -SimbodyPhysics::Vec3ToVector3(reactionTorqueOnParentBody);
+
+  this->wrench.body2Force =
+    -SimbodyPhysics::Vec3ToVector3(reactionForceOnChildBody);
+  this->wrench.body2Torque =
+    -SimbodyPhysics::Vec3ToVector3(reactionTorqueOnChildBody);
+}
+
+//////////////////////////////////////////////////
+LinkPtr SimbodyJoint::GetJointLink(unsigned int _index) const
+{
+  LinkPtr result;
+
+  if (_index == 0 || _index == 1)
+  {
+    SimbodyLinkPtr simbodyLink1 =
+      boost::static_pointer_cast<SimbodyLink>(this->childLink);
+
+    SimbodyLinkPtr simbodyLink2 =
+      boost::static_pointer_cast<SimbodyLink>(this->parentLink);
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+bool SimbodyJoint::AreConnected(LinkPtr _one, LinkPtr _two) const
+{
+  return ((this->childLink.get() == _one.get() &&
+           this->parentLink.get() == _two.get()) ||
+          (this->childLink.get() == _two.get() &&
+           this->parentLink.get() == _one.get()));
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::Detach()
+{
+  this->childLink.reset();
+  this->parentLink.reset();
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SetAxis(unsigned int _index, const math::Vector3 &/*_axis*/)
+{
+  math::Pose parentModelPose;
+  if (this->parentLink)
+    parentModelPose = this->parentLink->GetModel()->GetWorldPose();
+
+  // Set joint axis
+  // assuming incoming axis is defined in the model frame, so rotate them
+  // into the inertial frame
+  // TODO: switch so the incoming axis is defined in the child frame.
+  math::Vector3 axis = parentModelPose.rot.RotateVector(
+    this->sdf->GetElement("axis")->Get<math::Vector3>("xyz"));
+
+  if (_index == 0)
+    this->sdf->GetElement("axis")->GetElement("xyz")->Set(axis);
+  else if (_index == 1)
+    this->sdf->GetElement("axis2")->GetElement("xyz")->Set(axis);
+  else
+    gzerr << "SetAxis index [" << _index << "] out of bounds\n";
+}
+
+//////////////////////////////////////////////////
+JointWrench SimbodyJoint::GetForceTorque(unsigned int /*_index*/)
+{
+  return this->wrench;
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SetForce(unsigned int _index, double _force)
+{
+  double force = Joint::CheckAndTruncateForce(_index, _force);
+  this->SaveForce(_index, force);
+  this->SetForceImpl(_index, force);
+
+  // for engines that supports auto-disable of links
+  if (this->childLink) this->childLink->SetEnabled(true);
+  if (this->parentLink) this->parentLink->SetEnabled(true);
+}
+
+//////////////////////////////////////////////////
+double SimbodyJoint::GetForce(unsigned int _index)
+{
+  if (_index < this->GetAngleCount())
+  {
+    return this->forceApplied[_index];
+  }
+  else
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get force\n";
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SaveForce(unsigned int _index, double _force)
+{
+  // this bit of code actually doesn't do anything physical,
+  // it simply records the forces commanded inside forceApplied.
+  if (_index < this->GetAngleCount())
+  {
+    if (this->forceAppliedTime < this->GetWorld()->GetSimTime())
+    {
+      // reset forces if time step is new
+      this->forceAppliedTime = this->GetWorld()->GetSimTime();
+      this->forceApplied[0] = this->forceApplied[1] = 0;
+    }
+
+    this->forceApplied[_index] += _force;
+  }
+  else
+    gzerr << "Something's wrong, joint [" << this->GetName()
+          << "] index [" << _index
+          << "] out of range.\n";
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SaveSimbodyState(const SimTK::State &/*_state*/)
+{
+/*
+  // Implementation not complete
+  // Not implemented
+  // skip if not a free joint, state is saved in SimbodyJoint::mobod
+  if (!this->masterMobod.isEmptyHandle() &&
+      SimTK::MobilizedBody::Free::isInstanceOf(this->masterMobod))
+  {
+    if (this->simbodyQ.empty())
+      this->simbodyQ.resize(this->masterMobod.getNumQ(_state));
+
+    if (this->simbodyU.empty())
+      this->simbodyU.resize(this->masterMobod.getNumU(_state));
+
+    for (unsigned int i = 0; i < this->simbodyQ.size(); ++i)
+      this->simbodyQ[i] = this->masterMobod.getOneQ(_state, i);
+
+    for (unsigned int i = 0; i < this->simbodyU.size(); ++i)
+      this->simbodyU[i] = this->masterMobod.getOneU(_state, i);
+  }
+  else
+  {
+    // gzerr << "debug: joint name: " << this->GetScopedName() << "\n";
+  }
+*/
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::RestoreSimbodyState(SimTK::State &/*_state*/)
+{
+  // Not implemented
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SetAnchor(unsigned int /*_index*/,
+    const gazebo::math::Vector3 & /*_anchor*/)
+{
+  gzerr << "SimbodyJoint::SetAnchor:  Not implement in Simbody."
+        << " Anchor is set during joint construction in SimbodyPhysics.cc\n";
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SetDamping(unsigned int _index, const double _damping)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->SetStiffnessDamping(_index, this->stiffnessCoefficient[_index],
+      _damping);
+  }
+  else
+  {
+     gzerr << "SimbodyJoint::SetDamping: index[" << _index
+           << "] is out of bounds (GetAngleCount() = "
+           << this->GetAngleCount() << ").\n";
+     return;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SetStiffness(unsigned int _index, const double _stiffness)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->SetStiffnessDamping(_index, _stiffness,
+      this->dissipationCoefficient[_index]);
+  }
+  else
+  {
+     gzerr << "SimbodyJoint::SetStiffness: index[" << _index
+           << "] is out of bounds (GetAngleCount() = "
+           << this->GetAngleCount() << ").\n";
+     return;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SetStiffnessDamping(unsigned int _index,
+  double _stiffness, double _damping, double _reference)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->stiffnessCoefficient[_index] = _stiffness;
+    this->dissipationCoefficient[_index] = _damping;
+    this->springReferencePosition[_index] = _reference;
+
+    // set damper coefficient
+    this->damper[_index].setDamping(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      _damping);
+
+    // set spring stiffness and reference position
+    this->spring[_index].setStiffness(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      _stiffness);
+    this->spring[_index].setQZero(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      _reference);
+  }
+  else
+    gzerr << "SetStiffnessDamping _index too large.\n";
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyJoint::GetAnchor(unsigned int /*_index*/) const
+{
+  gzerr << "Not implement in Simbody\n";
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyJoint::GetLinkForce(unsigned int /*_index*/) const
+{
+  gzerr << "Not implement in Simbody\n";
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyJoint::GetLinkTorque(unsigned int /*_index*/) const
+{
+  gzerr << "Not implement in Simbody\n";
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SetAttribute(Attribute, unsigned int /*_index*/,
+    double /*_value*/)
+{
+  gzerr << "Not implement in Simbody\n";
+}
+
+//////////////////////////////////////////////////
+void SimbodyJoint::SetAttribute(const std::string &_key,
+    unsigned int _index, const boost::any &_value)
+{
+  this->SetParam(_key, _index, _value);
+}
+
+//////////////////////////////////////////////////
+bool SimbodyJoint::SetParam(const std::string &/*_key*/,
+    unsigned int /*_index*/, const boost::any &/*_value*/)
+{
+  gzerr << "Not implement in Simbody\n";
+  return false;
+}
+
+//////////////////////////////////////////////////
+double SimbodyJoint::GetAttribute(const std::string &_key, unsigned int _index)
+{
+  return this->GetParam(_key, _index);
+}
+//////////////////////////////////////////////////
+double SimbodyJoint::GetParam(const std::string &/*_key*/,
+    unsigned int /*_index*/)
+{
+  gzerr << "Not implement in Simbody\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+bool SimbodyJoint::SetHighStop(unsigned int _index, const math::Angle &_angle)
+{
+  Joint::SetHighStop(_index, _angle);
+
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized)
+    {
+      this->limitForce[_index].setBounds(
+        this->simbodyPhysics->integ->updAdvancedState(),
+        this->GetLowStop(_index).Radian(), _angle.Radian());
+    }
+    else
+    {
+      gzerr << "SetHighStop: State not initialized, SetHighStop failed.\n";
+      return false;
+    }
+  }
+  else
+  {
+    gzerr << "SetHighStop: index out of bounds.\n";
+    return false;
+  }
+  return true;
+}
+
+//////////////////////////////////////////////////
+bool SimbodyJoint::SetLowStop(unsigned int _index, const math::Angle &_angle)
+{
+  Joint::SetLowStop(_index, _angle);
+
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized)
+    {
+      this->limitForce[_index].setBounds(
+        this->simbodyPhysics->integ->updAdvancedState(),
+        _angle.Radian(),
+        this->GetHighStop(_index).Radian());
+    }
+    else
+    {
+      gzerr << "SetLowStop: State not initialized, SetLowStop failed.\n";
+      return false;
+    }
+  }
+  else
+  {
+    gzerr << "SetLowStop: index out of bounds.\n";
+    return false;
+  }
+  return true;
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyJoint::GetHighStop(unsigned int _index)
+{
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get high stop\n";
+    /// \TODO: should return NaN
+    return math::Angle(0.0);
+  }
+  else if (_index == 0)
+  {
+    return math::Angle(this->sdf->GetElement("axis")->GetElement("limit")
+             ->Get<double>("upper"));
+  }
+  else if (_index == 1)
+  {
+    return math::Angle(this->sdf->GetElement("axis2")->GetElement("limit")
+             ->Get<double>("upper"));
+  }
+  else
+  {
+    gzerr << "Should not be here in code, GetAngleCount > 2?\n";
+    /// \TODO: should return NaN
+    return math::Angle(0.0);
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyJoint::GetLowStop(unsigned int _index)
+{
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get low stop\n";
+    /// \TODO: should return NaN
+    return math::Angle(0.0);
+  }
+  else if (_index == 0)
+  {
+    return math::Angle(this->sdf->GetElement("axis")->GetElement("limit")
+             ->Get<double>("lower"));
+  }
+  else if (_index == 1)
+  {
+    return math::Angle(this->sdf->GetElement("axis2")->GetElement("limit")
+             ->Get<double>("lower"));
+  }
+  else
+  {
+    gzerr << "Should not be here in code, GetAngleCount > 2?\n";
+    /// \TODO: should return NaN
+    return math::Angle(0.0);
+  }
+}
diff --git a/gazebo/physics/simbody/SimbodyJoint.hh b/gazebo/physics/simbody/SimbodyJoint.hh
new file mode 100644
index 0000000..fdab894
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyJoint.hh
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_JOINT_HH_
+#define _SIMBODY_JOINT_HH_
+
+#include <boost/any.hpp>
+#include <string>
+
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/Joint.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Base class for all joints
+    class GAZEBO_VISIBLE SimbodyJoint : public Joint
+    {
+      /// \brief Constructor
+      public: SimbodyJoint(BasePtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyJoint();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void Reset();
+
+      // Documentation inherited.
+      public: virtual LinkPtr GetJointLink(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual bool AreConnected(LinkPtr _one, LinkPtr _two) const;
+
+      // Documentation inherited.
+      public: virtual void Detach();
+
+      // Documentation inherited.
+      public: virtual void SetAnchor(unsigned int _index,
+                  const gazebo::math::Vector3 &_anchor);
+
+      // Documentation inherited.
+      public: virtual void SetDamping(unsigned int _index,
+                                      const double _damping);
+
+      // Documentation inherited.
+      public: virtual void SetStiffness(unsigned int _index,
+                                        const double _stiffness);
+
+      // Documentation inherited.
+      public: virtual void SetStiffnessDamping(unsigned int _index,
+        double _stiffness, double _damping, double _reference = 0);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetLinkForce(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetLinkTorque(unsigned int _index) const;
+
+      /// \brief Set a parameter for the joint
+      public: virtual void SetAttribute(Attribute, unsigned int _index,
+                                        double _value);
+
+      // Documentation inherited.
+      public: virtual bool SetParam(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value);
+
+      // Documentation inherited.
+      public: virtual void SetAttribute(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value)
+                                        GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      public: virtual double GetParam(const std::string &_key,
+                  unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual double GetAttribute(const std::string &_key,
+                  unsigned int _index) GAZEBO_DEPRECATED(3.0);
+
+      // Save current Simbody State
+      public: virtual void SaveSimbodyState(const SimTK::State &_state);
+
+      // Restore saved Simbody State
+      public: virtual void RestoreSimbodyState(SimTK::State &_state);
+
+      // Documentation inherited.
+      public: virtual void SetForce(unsigned int _index, double _force);
+
+      // Documentation inherited.
+      public: virtual double GetForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                                   const math::Vector3 &_axis);
+
+      // Documentation inherited.
+      public: virtual JointWrench GetForceTorque(unsigned int _index);
+
+      /// \brief Set the force applied to this physics::Joint.
+      /// Note that the unit of force should be consistent with the rest
+      /// of the simulation scales.
+      /// Force is additive (multiple calls
+      /// to SetForceImpl to the same joint in the same time
+      /// step will accumulate forces on that Joint).
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _force Force value.
+      /// internal force, e.g. damping forces.  This way, Joint::appliedForce
+      /// keep track of external forces only.
+      protected: virtual void SetForceImpl(unsigned int _index,
+                                           double _force) = 0;
+
+      /// \brief Save external forces applied to this Joint.
+      /// \param[in] _index Index of the axis.
+      /// \param[in] _force Force value.
+      private: void SaveForce(unsigned int _index, double _force);
+
+      // Documentation inherited.
+      public: virtual void CacheForceTorque();
+
+      /// \brief Force Simbody to break a loop by using a weld constraint.
+      /// This flag is needed by SimbodyPhysics::MultibodyGraphMaker, so kept
+      /// public.
+      public: bool mustBreakLoopHere;
+
+      /// \brief Normally A=F, B=M. But if reversed, then B=F, A=M.
+      /// parent body frame to mobilizer frame
+      public: SimTK::Transform xPA;
+
+      /// \brief child body frame to mobilizer frame
+      public: SimTK::Transform xCB;
+
+      /// \brief default mobilizer pose
+      public: SimTK::Transform defxAB;
+
+      /// \brief: Spring force element for enforcing joint stiffness.
+      /// The element is assigned when constructing Simbody model in
+      /// SimbodyPhysics::AddDynamicModelToSimbodySystem.
+      /// \TODO: Also, consider moving this into individual joint type subclass
+      /// so we can specify custom springs for special joints like ball joints.
+      public: SimTK::Force::MobilityLinearSpring spring[MAX_JOINT_AXIS];
+
+      /// \brief: for enforcing joint damping forces.
+      /// Set when we build the Simbody model.
+      /// \TODO: Also, consider moving this into individual joint type subclass
+      /// so we can specify custom dampers for special joints like ball joints.
+      public: SimTK::Force::MobilityLinearDamper damper[MAX_JOINT_AXIS];
+
+      /// \brief: for enforcing joint stops
+      /// Set when we build the Simbody model.
+      /// \TODO: Also, consider moving this into individual joint type subclass
+      /// so we can specify custom dampers for special joints like ball joints.
+      /// Assuming this is not used for BallJoints it's ok here for now.
+      public: SimTK::Force::MobilityLinearStop limitForce[MAX_JOINT_AXIS];
+
+      /// \brief Use isValid() if we used a mobilizer
+      /// Set when we build the Simbody model.
+      /// How this joint was modeled in the Simbody System. We used either a
+      /// mobilizer or a constraint, but not both. The type of either one is
+      /// the same as the joint type above.
+      public: SimTK::MobilizedBody mobod;
+
+      /// \brief: if mobilizer, did it reverse parent&child?
+      /// Set when we build the Simbody model.
+      public: bool isReversed;
+
+      /// \brief: isValid() if we used a constraint to model this joint.
+      /// Set when we build the Simbody model.
+      /// How this joint was modeled in the Simbody System. We used either a
+      /// mobilizer or a constraint, but not both. The type of either one is the
+      /// same as the joint type above.
+      public: SimTK::Constraint constraint;
+
+      // Keeps track if simbody physics has been initialized
+      public: bool physicsInitialized;
+
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                                       const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                                      const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
+
+      /// \brief Simbody Multibody System
+      protected: SimTK::MultibodySystem *world;
+
+      /// \brief keep a pointer to the simbody physics engine for convenience
+      protected: SimbodyPhysicsPtr simbodyPhysics;
+
+      /// \brief Save force applied by user
+      /// This plus the joint feedback (joint contstraint forces) is the
+      /// equivalent of simulated force torque sensor reading
+      /// Allocate a 2 vector in case hinge2 joint is used.
+      /// This is used by Bullet to store external force applied by the user.
+      /// \TODO: Also, consider moving this into individual joint type subclass
+      /// so we can specify custom dampers for special joints like ball joints.
+      /// Assuming this is not used for BallJoints it's ok here for now.
+      private: double forceApplied[MAX_JOINT_AXIS];
+
+      /// \brief Save time at which force is applied by user
+      /// This will let us know if it's time to clean up forceApplied.
+      private: common::Time forceAppliedTime;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyLink.cc b/gazebo/physics/simbody/SimbodyLink.cc
new file mode 100644
index 0000000..14ba1a5
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyLink.cc
@@ -0,0 +1,600 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/* Desc: Link class
+ * Author: Nate Koenig
+ * Date: 13 Feb 2006
+ */
+
+#include <boost/thread.hpp>
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/World.hh"
+
+#include "gazebo/physics/simbody/SimbodyCollision.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyLink::SimbodyLink(EntityPtr _parent)
+    : Link(_parent)
+{
+  this->mustBeBaseLink = false;
+  this->physicsInitialized = false;
+  this->gravityMode = false;
+  this->staticLinkDirty = false;
+  this->staticLink = false;
+  this->simbodyPhysics.reset();
+  this->gravityModeDirty = false;
+}
+
+//////////////////////////////////////////////////
+SimbodyLink::~SimbodyLink()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::Load(sdf::ElementPtr _sdf)
+{
+  this->simbodyPhysics = boost::dynamic_pointer_cast<SimbodyPhysics>(
+      this->GetWorld()->GetPhysicsEngine());
+
+  if (this->simbodyPhysics == NULL)
+    gzthrow("Not using the simbody physics engine");
+
+  if (_sdf->HasElement("must_be_base_link"))
+    this->mustBeBaseLink = _sdf->Get<bool>("must_be_base_link");
+
+  this->SetKinematic(_sdf->Get<bool>("kinematic"));
+  this->SetGravityMode(_sdf->Get<bool>("gravity"));
+
+  Link::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::Init()
+{
+  /// \TODO: implement following
+  // this->SetLinearDamping(this->GetLinearDamping());
+  // this->SetAngularDamping(this->GetAngularDamping());
+
+  Link::Init();
+
+  math::Vector3 cogVec = this->inertial->GetCoG();
+
+  // Set the initial pose of the body
+
+  for (Base_V::iterator iter = this->children.begin();
+       iter != this->children.end(); ++iter)
+  {
+    if ((*iter)->HasType(Base::COLLISION))
+    {
+      SimbodyCollisionPtr collision;
+      collision = boost::static_pointer_cast<SimbodyCollision>(*iter);
+
+      math::Pose relativePose = collision->GetRelativePose();
+      relativePose.pos -= cogVec;
+    }
+  }
+
+  // Create a construction info object
+  // Create the new rigid body
+
+  // change link's gravity mode if requested by user
+  this->gravityModeConnection = event::Events::ConnectWorldUpdateBegin(
+    boost::bind(&SimbodyLink::ProcessSetGravityMode, this));
+
+  // lock or unlock the link if requested by user
+  this->staticLinkConnection = event::Events::ConnectWorldUpdateEnd(
+    boost::bind(&SimbodyLink::ProcessSetLinkStatic, this));
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::Fini()
+{
+  event::Events::DisconnectWorldUpdateEnd(this->staticLinkConnection);
+  Link::Fini();
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetGravityMode(bool _mode)
+{
+  if (!this->gravityModeDirty)
+  {
+    this->gravityModeDirty = true;
+    this->gravityMode = _mode;
+  }
+  else
+    gzerr << "Trying to SetGravityMode for link [" << this->GetScopedName()
+          << "] before last setting is processed.\n";
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::ProcessSetGravityMode()
+{
+  if (this->gravityModeDirty)
+  {
+    if (this->physicsInitialized)
+    {
+      this->sdf->GetElement("gravity")->Set(this->gravityMode);
+      this->simbodyPhysics->gravity.setBodyIsExcluded(
+        this->simbodyPhysics->integ->updAdvancedState(),
+        this->masterMobod, !this->gravityMode);
+      // realize system after changing gravity mode
+      this->simbodyPhysics->system.realize(
+        this->simbodyPhysics->integ->getState(), SimTK::Stage::Velocity);
+      this->gravityModeDirty = false;
+    }
+    else
+    {
+      gzlog << "SetGravityMode [" << this->gravityMode
+            << "], but physics not initialized, caching\n";
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+bool SimbodyLink::GetGravityMode() const
+{
+  if (this->physicsInitialized)
+  {
+    return this->simbodyPhysics->gravity.getBodyIsExcluded(
+      this->simbodyPhysics->integ->getState(), this->masterMobod);
+  }
+  else
+  {
+    gzlog << "GetGravityMode [" << this->gravityMode
+          << "], but physics not initialized, returning cached value\n";
+    return this->gravityMode;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetSelfCollide(bool /*_collide*/)
+{
+}
+
+//////////////////////////////////////////////////
+/*void SimbodyLink::AttachCollision(Collision *_collision)
+{
+  Link::AttachCollision(_collision);
+
+  SimbodyCollision *bcollision = dynamic_cast<SimbodyCollision*>(_collision);
+
+  if (_collision == NULL)
+    gzthrow("requires SimbodyCollision");
+
+  math::Pose relativePose = _collision->GetRelativePose();
+}
+  */
+
+//////////////////////////////////////////////////
+/// changed
+void SimbodyLink::OnPoseChange()
+{
+  Link::OnPoseChange();
+
+  if (!this->simbodyPhysics->simbodyPhysicsInitialized)
+    return;
+
+  if (this->masterMobod.isEmptyHandle())
+    return;
+
+  // debug
+  // gzerr << "original: [" << SimbodyPhysics::Transform2Pose(
+  //   this->masterMobod.getBodyTransform(
+  //   this->simbodyPhysics->integ->updAdvancedState()))
+  //       << "]\n";
+
+  if (!this->masterMobod.isGround())
+  {
+    if (this->masterMobod.getParentMobilizedBody().isGround())
+    {
+      /// If parent is ground:
+      /// Setting 6 dof pose of a link works in simbody only if
+      /// the inboard joint is a free joint to the ground for now.
+      this->masterMobod.setQToFitTransform(
+         this->simbodyPhysics->integ->updAdvancedState(),
+         SimbodyPhysics::Pose2Transform(this->GetWorldPose()));
+    }
+    else
+    {
+      gzerr << "SetWorldPose (OnPoseChange) for child links need testing.\n";
+      /*
+      /// If the inboard joint is not free, simbody tries to project
+      /// target pose into available DOF's.
+      /// But first convert to relative pose to parent mobod.
+      math::Pose parentPose = SimbodyPhysics::Transform2Pose(
+        this->masterMobod.getBodyTransform(
+        this->simbodyPhysics->integ->updAdvancedState()));
+      math::Pose relPose = this->GetWorldPose() - parentPose;
+      this->masterMobod.setQToFitTransform(
+         this->simbodyPhysics->integ->updAdvancedState(),
+         SimbodyPhysics::Pose2Transform(relPose));
+      */
+    }
+    // realize system after updating Q's
+    this->simbodyPhysics->system.realize(
+      this->simbodyPhysics->integ->getState(), SimTK::Stage::Position);
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SaveSimbodyState(const SimTK::State &_state)
+{
+  // skip if not a free joint, state is saved in SimbodyJoint::mobod
+  if (!this->masterMobod.isEmptyHandle() &&
+      SimTK::MobilizedBody::Free::isInstanceOf(this->masterMobod))
+  {
+    if (this->simbodyQ.empty())
+      this->simbodyQ.resize(this->masterMobod.getNumQ(_state));
+
+    if (this->simbodyU.empty())
+      this->simbodyU.resize(this->masterMobod.getNumU(_state));
+
+    for (unsigned int i = 0; i < this->simbodyQ.size(); ++i)
+      this->simbodyQ[i] = this->masterMobod.getOneQ(_state, i);
+
+    for (unsigned int i = 0; i < this->simbodyU.size(); ++i)
+      this->simbodyU[i] = this->masterMobod.getOneU(_state, i);
+  }
+  else
+  {
+    // gzerr << "debug: joint name: " << this->GetScopedName() << "\n";
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::RestoreSimbodyState(SimTK::State &_state)
+{
+  // skip if not a free joint, state is restored by SimbodyJoint::mobod
+  if (!this->masterMobod.isEmptyHandle() &&
+      SimTK::MobilizedBody::Free::isInstanceOf(this->masterMobod))
+  {
+    for (unsigned int i = 0; i < this->simbodyQ.size(); ++i)
+      this->masterMobod.setOneQ(_state, i, this->simbodyQ[i]);
+
+    for (unsigned int i = 0; i < this->simbodyU.size(); ++i)
+      this->masterMobod.setOneU(_state, i, this->simbodyU[i]);
+  }
+  else
+  {
+    // gzerr << "debug: joint name: " << this->GetScopedName() << "\n";
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetLinkStatic(bool _static)
+{
+  if (!this->staticLinkDirty)
+  {
+    this->staticLinkDirty = true;
+    this->staticLink = _static;
+  }
+  else
+    gzerr << "Trying to SetLinkStatic before last setting is processed.\n";
+}
+
+
+//////////////////////////////////////////////////
+void SimbodyLink::ProcessSetLinkStatic()
+{
+  if (this->masterMobod.isEmptyHandle())
+    return;
+
+  // check if inboard body is ground
+  if (this->staticLinkDirty &&
+      this->masterMobod.getParentMobilizedBody().isGround())
+  {
+    if (this->staticLink)
+      this->masterMobod.lock(
+       this->simbodyPhysics->integ->updAdvancedState());
+    else
+      this->masterMobod.unlock(
+       this->simbodyPhysics->integ->updAdvancedState());
+
+    // re-realize
+    this->simbodyPhysics->system.realize(
+      this->simbodyPhysics->integ->getAdvancedState(), SimTK::Stage::Velocity);
+  }
+  else
+  {
+    // gzerr << "debug: joint name: " << this->GetScopedName() << "\n";
+  }
+
+  this->staticLinkDirty = false;
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetEnabled(bool /*_enable*/) const
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetLinearVel(const math::Vector3 & /*_vel*/)
+{
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyLink::GetWorldLinearVel(
+  const math::Vector3& _offset) const
+{
+  SimTK::Vec3 station = SimbodyPhysics::Vector3ToVec3(_offset);
+  math::Vector3 v;
+
+  if (this->simbodyPhysics->simbodyPhysicsInitialized)
+  {
+    // lock physics update mutex to ensure thread safety
+    boost::recursive_mutex::scoped_lock lock(
+      *this->world->GetPhysicsEngine()->GetPhysicsUpdateMutex());
+    v = SimbodyPhysics::Vec3ToVector3(
+      this->masterMobod.findStationVelocityInGround(
+      this->simbodyPhysics->integ->getState(), station));
+  }
+  else
+    gzwarn << "SimbodyLink::GetWorldLinearVel: simbody physics"
+           << " not yet initialized\n";
+
+  return v;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyLink::GetWorldLinearVel(
+  const math::Vector3 &_offset,
+  const math::Quaternion &_q) const
+{
+  math::Vector3 v;
+
+  if (this->simbodyPhysics->simbodyPhysicsInitialized)
+  {
+    SimTK::Rotation R_WF(SimbodyPhysics::QuadToQuad(_q));
+    SimTK::Vec3 p_F(SimbodyPhysics::Vector3ToVec3(_offset));
+    SimTK::Vec3 p_W(R_WF * p_F);
+
+    // lock physics update mutex to ensure thread safety
+    boost::recursive_mutex::scoped_lock lock(
+      *this->world->GetPhysicsEngine()->GetPhysicsUpdateMutex());
+
+    const SimTK::Rotation &R_WL = this->masterMobod.getBodyRotation(
+      this->simbodyPhysics->integ->getState());
+    SimTK::Vec3 p_B(~R_WL * p_W);
+    v = SimbodyPhysics::Vec3ToVector3(
+      this->masterMobod.findStationVelocityInGround(
+      this->simbodyPhysics->integ->getState(), p_B));
+  }
+  else
+    gzwarn << "SimbodyLink::GetWorldLinearVel: simbody physics"
+           << " not yet initialized\n";
+
+  return v;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyLink::GetWorldCoGLinearVel() const
+{
+  math::Vector3 v;
+
+  if (this->simbodyPhysics->simbodyPhysicsInitialized)
+  {
+    // lock physics update mutex to ensure thread safety
+    boost::recursive_mutex::scoped_lock lock(
+      *this->world->GetPhysicsEngine()->GetPhysicsUpdateMutex());
+    SimTK::Vec3 station = this->masterMobod.getBodyMassCenterStation(
+       this->simbodyPhysics->integ->getState());
+    v = SimbodyPhysics::Vec3ToVector3(
+      this->masterMobod.findStationVelocityInGround(
+      this->simbodyPhysics->integ->getState(), station));
+  }
+  else
+    gzwarn << "SimbodyLink::GetWorldCoGLinearVel: simbody physics"
+           << " not yet initialized\n";
+
+  return v;
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetAngularVel(const math::Vector3 &/*_vel*/)
+{
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyLink::GetWorldAngularVel() const
+{
+  // lock physics update mutex to ensure thread safety
+  boost::recursive_mutex::scoped_lock lock(
+    *this->world->GetPhysicsEngine()->GetPhysicsUpdateMutex());
+  SimTK::Vec3 w =
+    this->masterMobod.getBodyAngularVelocity(
+    this->simbodyPhysics->integ->getState());
+  return SimbodyPhysics::Vec3ToVector3(w);
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetForce(const math::Vector3 &_force)
+{
+  SimTK::Vec3 f(SimbodyPhysics::Vector3ToVec3(_force));
+
+  this->simbodyPhysics->discreteForces.setOneBodyForce(
+    this->simbodyPhysics->integ->updAdvancedState(),
+    this->masterMobod, SimTK::SpatialVec(SimTK::Vec3(0), f));
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyLink::GetWorldForce() const
+{
+  SimTK::SpatialVec sv = this->simbodyPhysics->discreteForces.getOneBodyForce(
+    this->simbodyPhysics->integ->getState(), this->masterMobod);
+
+  // get translational component
+  SimTK::Vec3 f = sv[1];
+
+  return SimbodyPhysics::Vec3ToVector3(f);
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetTorque(const math::Vector3 &_torque)
+{
+  SimTK::Vec3 t(SimbodyPhysics::Vector3ToVec3(_torque));
+
+  this->simbodyPhysics->discreteForces.setOneBodyForce(
+    this->simbodyPhysics->integ->updAdvancedState(),
+    this->masterMobod, SimTK::SpatialVec(t, SimTK::Vec3(0)));
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyLink::GetWorldTorque() const
+{
+  SimTK::SpatialVec sv = this->simbodyPhysics->discreteForces.getOneBodyForce(
+    this->simbodyPhysics->integ->getState(), this->masterMobod);
+
+  // get rotational component
+  SimTK::Vec3 t = sv[0];
+
+  return SimbodyPhysics::Vec3ToVector3(t);
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetLinearDamping(double /*_damping*/)
+{
+  gzerr << "Not implemented.\n";
+}
+
+//////////////////////////////////////////////////
+void SimbodyLink::SetAngularDamping(double /*_damping*/)
+{
+  gzerr << "Not implemented.\n";
+}
+
+/////////////////////////////////////////////////
+void SimbodyLink::AddForce(const math::Vector3 &_force)
+{
+  SimTK::Vec3 f(SimbodyPhysics::Vector3ToVec3(_force));
+
+  this->simbodyPhysics->discreteForces.addForceToBodyPoint(
+    this->simbodyPhysics->integ->updAdvancedState(),
+    this->masterMobod,
+    SimTK::Vec3(0), f);
+}
+
+/////////////////////////////////////////////////
+void SimbodyLink::AddRelativeForce(const math::Vector3 &/*_force*/)
+{
+  gzerr << "Not implemented.\n";
+}
+
+/////////////////////////////////////////////////
+void SimbodyLink::AddForceAtWorldPosition(const math::Vector3 &/*_force*/,
+                                         const math::Vector3 &/*_pos*/)
+{
+  gzerr << "Not implemented.\n";
+}
+
+/////////////////////////////////////////////////
+void SimbodyLink::AddForceAtRelativePosition(const math::Vector3 &/*_force*/,
+                  const math::Vector3 &/*_relpos*/)
+{
+  gzerr << "Not implemented.\n";
+}
+
+/////////////////////////////////////////////////
+void SimbodyLink::AddTorque(const math::Vector3 &/*_torque*/)
+{
+  gzerr << "Not implemented.\n";
+}
+
+/////////////////////////////////////////////////
+void SimbodyLink::AddRelativeTorque(const math::Vector3 &/*_torque*/)
+{
+  gzerr << "Not implemented.\n";
+}
+
+/////////////////////////////////////////////////
+void SimbodyLink::SetAutoDisable(bool /*_disable*/)
+{
+  gzerr << "Not implemented.\n";
+}
+
+/////////////////////////////////////////////////
+SimTK::MassProperties SimbodyLink::GetMassProperties() const
+{
+  gzlog << "SimbodyLink::GetMassProperties for ["
+        << this->GetScopedName() << "]\n";
+
+  if (!this->IsStatic())
+  {
+    const SimTK::Real mass = this->inertial->GetMass();
+    SimTK::Transform X_LI = physics::SimbodyPhysics::Pose2Transform(
+      this->inertial->GetPose());
+    const SimTK::Vec3 &com_L = X_LI.p();  // vector from Lo to com, exp. in L
+
+    if (math::equal(mass, 0.0))
+      return SimTK::MassProperties(mass, com_L, SimTK::UnitInertia(1, 1, 1));
+
+    // Get mass-weighted central inertia, expressed in I frame.
+    SimTK::Inertia Ic_I(this->inertial->GetIXX(),
+                 this->inertial->GetIYY(),
+                 this->inertial->GetIZZ(),
+                 this->inertial->GetIXY(),
+                 this->inertial->GetIXZ(),
+                 this->inertial->GetIYZ());
+    // Re-express the central inertia from the I frame to the L frame.
+    SimTK::Inertia Ic_L = Ic_I.reexpress(~X_LI.R());  // Ic_L=R_LI*Ic_I*R_IL
+    // Shift to L frame origin.
+    SimTK::Inertia Io_L = Ic_L.shiftFromMassCenter(-com_L, mass);
+    return SimTK::MassProperties(mass, com_L, Io_L);  // convert to unit inertia
+  }
+  else
+  {
+    gzerr << "inertial block no specified, using unit mass properties\n";
+    return SimTK::MassProperties(1, SimTK::Vec3(0),
+      SimTK::UnitInertia(0.1, 0.1, 0.1));
+  }
+}
+
+/////////////////////////////////////////////////
+// When a link is broken into several fragments (master and slaves), they
+// share the mass equally. Given the number of fragments, this returns the
+// appropriate mass properties to use for each fragment. Per Simbody's
+// convention, COM is measured from, and inertia taken about, the link
+// origin and both are expressed in the link frame.
+SimTK::MassProperties SimbodyLink::GetEffectiveMassProps(
+  int _numFragments) const
+{
+    SimTK::MassProperties massProps = this->GetMassProperties();
+    GZ_ASSERT(_numFragments > 0,
+              "_numFragments must be at least 1 for the master");
+    return SimTK::MassProperties(massProps.getMass()/_numFragments,
+                          massProps.getMassCenter(),
+                          massProps.getUnitInertia());
+}
+
+/////////////////////////////////////////////////
+bool SimbodyLink::GetEnabled() const
+{
+  return true;
+}
+
+/////////////////////////////////////////////////
+void SimbodyLink::SetDirtyPose(const math::Pose &_pose)
+{
+  this->dirtyPose = _pose;
+}
diff --git a/gazebo/physics/simbody/SimbodyLink.hh b/gazebo/physics/simbody/SimbodyLink.hh
new file mode 100644
index 0000000..a6bc074
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyLink.hh
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_LINK_HH_
+#define _SIMBODY_LINK_HH_
+
+#include <vector>
+
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/Link.hh"
+
+#include "gazebo/physics/simbody/simbody_inc.h"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \brief simbody physics engine wrapper
+    /// \{
+
+    /// \brief Simbody Link class
+    class GAZEBO_VISIBLE SimbodyLink : public Link
+    {
+      /// \brief Constructor
+      public: SimbodyLink(EntityPtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyLink();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _ptr);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited.
+      public: virtual void Fini();
+
+      // Documentation inherited.
+      public: virtual void OnPoseChange();
+
+      // Documentation inherited.
+      public: virtual void SetEnabled(bool enable) const;
+
+      // Documentation inherited.
+      public: virtual bool GetEnabled() const;
+
+      // Documentation inherited.
+      public: virtual void SetLinearVel(const math::Vector3 &_vel);
+
+      // Documentation inherited.
+      public: virtual void SetAngularVel(const math::Vector3 &_vel);
+
+      // Documentation inherited.
+      public: virtual void SetForce(const math::Vector3 &_force);
+
+      // Documentation inherited.
+      public: virtual void SetTorque(const math::Vector3 &_force);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetWorldLinearVel(
+        const math::Vector3& _vector3) const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetWorldLinearVel(
+          const math::Vector3 &_offset,
+          const math::Quaternion &_q) const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetWorldCoGLinearVel() const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetWorldAngularVel() const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetWorldForce() const;
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetWorldTorque() const;
+
+      // Documentation inherited.
+      public: virtual void SetGravityMode(bool _mode);
+
+      // Documentation inherited.
+      public: virtual bool GetGravityMode() const;
+
+      // Documentation inherited.
+      public: virtual void SetSelfCollide(bool _collide);
+
+      // Documentation inherited.
+      public: virtual void SetLinearDamping(double _damping);
+
+      // Documentation inherited.
+      public: virtual void SetAngularDamping(double _damping);
+
+      // Documentation inherited.
+      public: virtual void AddForce(const math::Vector3 &_force);
+
+      // Documentation inherited.
+      public: virtual void AddRelativeForce(const math::Vector3 &_force);
+
+      // Documentation inherited.
+      public: virtual void AddForceAtWorldPosition(const math::Vector3 &_force,
+                                                   const math::Vector3 &_pos);
+
+      // Documentation inherited.
+      public: virtual void AddForceAtRelativePosition(
+                  const math::Vector3 &_force,
+                  const math::Vector3 &_relpos);
+
+      // Documentation inherited.
+      public: virtual void AddTorque(const math::Vector3 &_torque);
+
+      // Documentation inherited.
+      public: virtual void AddRelativeTorque(const math::Vector3 &_torque);
+
+      // Documentation inherited.
+      public: virtual void SetAutoDisable(bool _disable);
+
+      // Documentation inherited.
+      public: virtual void SaveSimbodyState(const SimTK::State &_state);
+
+      // Documentation inherited.
+      public: virtual void RestoreSimbodyState(SimTK::State &_state);
+
+      /// \brief If the inboard body of this link is ground, simply
+      /// lock the inboard joint to freeze it to ground.  Otherwise,
+      /// add a weld constraint to simulate freeze to ground effect.
+      /// \param[in] _static if true, freeze link to ground.  Otherwise
+      /// unfreeze link.
+      public: virtual void SetLinkStatic(bool _static);
+
+      /// \brief Convert Gazebo Inertia to Simbody MassProperties
+      /// Where Simbody MassProperties contains mass,
+      /// center of mass location, and unit inertia about body origin.
+      public: SimTK::MassProperties GetMassProperties() const;
+
+      public: SimTK::MassProperties GetEffectiveMassProps(
+        int _numFragments) const;
+
+      public: void SetDirtyPose(const math::Pose &_pose);
+
+      /// \brief Internal call to change effect of gravity on Link
+      /// based on gravityMode if gravityModeDirty is true.
+      private: void ProcessSetGravityMode();
+
+      /// \brief Internal call to set link static
+      /// based on staticLink if staticLinkDirty is true.
+      private: void ProcessSetLinkStatic();
+
+      /// \brief: Force this link to be a base body, where its inboard
+      /// body is the world with 6DOF.
+      public: bool mustBeBaseLink;
+
+      // Below to be filled in after everything is loaded
+      // Which MobilizedBody corresponds to the master instance of this link.
+      public: SimTK::MobilizedBody masterMobod;
+
+      // Keeps track if physics has been initialized
+      public: bool physicsInitialized;
+
+      // If this link got split into a master and slaves, these are the
+      // MobilizedBodies used to mobilize the slaves.
+      public: std::vector<SimTK::MobilizedBody> slaveMobods;
+
+      // And these are the Weld constraints used to attach slaves to master.
+      public: std::vector<SimTK::Constraint::Weld> slaveWelds;
+
+      /// \brief store gravity mode given link might not be around
+      private: bool gravityMode;
+
+      /// \brief Trigger setting of link according to staticLink.
+      private: bool staticLinkDirty;
+
+      /// \brief Trigger setting of link gravity mode
+      private: bool gravityModeDirty;
+
+      /// \brief If true, freeze link to world (inertial) frame.
+      private: bool staticLink;
+
+      /// \brief Event connection for SetLinkStatic
+      private: event::ConnectionPtr staticLinkConnection;
+
+      /// \brief Event connection for SetGravityMode
+      private: event::ConnectionPtr gravityModeConnection;
+
+      /// \brief save simbody free state for reconstructing simbody model graph
+      private: std::vector<double> simbodyQ;
+
+      /// \brief save simbody free state for reconstructing simbody model graph
+      private: std::vector<double> simbodyU;
+
+      /// \brief keep a pointer to the simbody physics engine for convenience
+      private: SimbodyPhysicsPtr simbodyPhysics;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyMeshShape.cc b/gazebo/physics/simbody/SimbodyMeshShape.cc
new file mode 100644
index 0000000..3ae8c3d
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyMeshShape.cc
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Mesh.hh"
+
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyCollision.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/simbody/SimbodyMeshShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyMeshShape::SimbodyMeshShape(CollisionPtr _parent)
+  : MeshShape(_parent)
+{
+}
+
+
+//////////////////////////////////////////////////
+SimbodyMeshShape::~SimbodyMeshShape()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyMeshShape::Load(sdf::ElementPtr _sdf)
+{
+  MeshShape::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void SimbodyMeshShape::Init()
+{
+  MeshShape::Init();
+
+  SimbodyCollisionPtr bParent =
+    boost::static_pointer_cast<SimbodyCollision>(this->collisionParent);
+}
diff --git a/gazebo/physics/simbody/SimbodyMeshShape.hh b/gazebo/physics/simbody/SimbodyMeshShape.hh
new file mode 100644
index 0000000..aa5e851
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyMeshShape.hh
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_MESHSHAPE_HH_
+#define _SIMBODY_MESHSHAPE_HH_
+
+#include "gazebo/physics/MeshShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Triangle mesh collision
+    class GAZEBO_VISIBLE SimbodyMeshShape : public MeshShape
+    {
+      /// \brief Constructor
+      public: SimbodyMeshShape(CollisionPtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyMeshShape();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      protected: virtual void Init();
+    };
+    /// \}
+  }
+}
+#endif
+
diff --git a/gazebo/physics/simbody/SimbodyModel.cc b/gazebo/physics/simbody/SimbodyModel.cc
new file mode 100644
index 0000000..d7c52cc
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyModel.cc
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Link.hh"
+#include "gazebo/physics/Gripper.hh"
+#include "gazebo/transport/Publisher.hh"
+#include "gazebo/physics/simbody/SimbodyModel.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyModel::SimbodyModel(BasePtr _parent)
+  : Model(_parent)
+{
+}
+
+//////////////////////////////////////////////////
+SimbodyModel::~SimbodyModel()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyModel::Load(sdf::ElementPtr _sdf)
+{
+  Model::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void SimbodyModel::Init()
+{
+  // Record the model's initial pose (for reseting)
+  this->SetInitialRelativePose(this->GetWorldPose());
+
+  this->SetRelativePose(this->GetWorldPose());
+
+  // Initialize the bodies before the joints
+  for (Base_V::iterator iter = this->children.begin();
+       iter!= this->children.end(); ++iter)
+  {
+    if ((*iter)->HasType(Base::LINK))
+      boost::static_pointer_cast<Link>(*iter)->Init();
+    else if ((*iter)->HasType(Base::MODEL))
+      boost::static_pointer_cast<SimbodyModel>(*iter)->Init();
+  }
+
+  for (unsigned int i = 0; i < this->GetGripperCount(); ++i)
+  {
+    this->GetGripper(i)->Init();
+  }
+
+  // rebuild simbody state
+  // this needs to happen before this->joints are used
+  physics::SimbodyPhysicsPtr simbodyPhysics =
+    boost::dynamic_pointer_cast<physics::SimbodyPhysics>(
+      this->GetWorld()->GetPhysicsEngine());
+  if (simbodyPhysics)
+    simbodyPhysics->InitModel(
+        boost::static_pointer_cast<Model>(shared_from_this()));
+
+  // Initialize the joints last.
+  Joint_V myJoints = this->GetJoints();
+  for (Joint_V::iterator iter = myJoints.begin();
+       iter != myJoints.end(); ++iter)
+  {
+    try
+    {
+      (*iter)->Init();
+    }
+    catch(...)
+    {
+      gzerr << "Init failed for joint ["
+            << (*iter)->GetScopedName() << "]"
+            << std::endl;
+      return;
+    }
+  }
+
+  // Initialize the joints messages for visualizer
+  for (Joint_V::iterator iter = myJoints.begin();
+       iter != myJoints.end(); ++iter)
+  {
+    // The following message used to be filled and sent in Model::LoadJoint
+    // It is moved here, after Joint::Init, so that the joint properties
+    // can be included in the message.
+    msgs::Joint msg;
+    (*iter)->FillMsg(msg);
+    this->jointPub->Publish(msg);
+  }
+}
+
+//////////////////////////////////////////////////
+// void SimbodyModel::FillMsg(msgs::Model &_msg)
+// {
+//   // rebuild simbody state
+//   // this needs to happen before this->joints are used
+//   physics::SimbodyPhysicsPtr simbodyPhysics =
+//     boost::dynamic_pointer_cast<physics::SimbodyPhysics>(
+//       this->GetWorld()->GetPhysicsEngine());
+//   if (simbodyPhysics)
+//     simbodyPhysics->InitModel(this);
+//
+//   Model::FillMsg(_msg);
+// }
diff --git a/gazebo/physics/simbody/SimbodyModel.hh b/gazebo/physics/simbody/SimbodyModel.hh
new file mode 100644
index 0000000..17df70d
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyModel.hh
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_MODEL_HH_
+#define _SIMBODY_MODEL_HH_
+
+#include "gazebo/physics/Model.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \addtogroup gazebo_physics
+    /// \{
+
+    /// \class SimbodyModel SimbodyModel.hh physics/physics.hh
+    /// \brief A model is a collection of links, joints, and plugins.
+    class GAZEBO_VISIBLE SimbodyModel : public Model
+    {
+      /// \brief Constructor.
+      /// \param[in] _parent Parent object.
+      public: explicit SimbodyModel(BasePtr _parent);
+
+      /// \brief Destructor.
+      public: virtual ~SimbodyModel();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      public: virtual void Init();
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyMultiRayShape.cc b/gazebo/physics/simbody/SimbodyMultiRayShape.cc
new file mode 100644
index 0000000..72f16d2
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyMultiRayShape.cc
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyCollision.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/simbody/SimbodyRayShape.hh"
+#include "gazebo/physics/simbody/SimbodyMultiRayShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyMultiRayShape::SimbodyMultiRayShape(CollisionPtr _parent)
+: MultiRayShape(_parent)
+{
+  this->SetName("Simbody Multiray Shape");
+  this->physicsEngine = boost::static_pointer_cast<SimbodyPhysics>(
+      this->collisionParent->GetWorld()->GetPhysicsEngine());
+}
+
+//////////////////////////////////////////////////
+SimbodyMultiRayShape::~SimbodyMultiRayShape()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyMultiRayShape::UpdateRays()
+{
+  std::vector< RayShapePtr >::iterator iter;
+  for (iter = this->rays.begin(); iter != this->rays.end(); ++iter)
+  {
+    (*iter)->Update();
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyMultiRayShape::AddRay(const math::Vector3 &_start,
+    const math::Vector3 &_end)
+{
+  MultiRayShape::AddRay(_start, _end);
+  SimbodyRayShapePtr ray(new SimbodyRayShape(this->physicsEngine));
+  ray->SetPoints(_start, _end);
+
+  this->rays.push_back(ray);
+}
diff --git a/gazebo/physics/simbody/SimbodyMultiRayShape.hh b/gazebo/physics/simbody/SimbodyMultiRayShape.hh
new file mode 100644
index 0000000..18ad733
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyMultiRayShape.hh
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_MULTIRAYSHAPE_HH_
+#define _SIMBODY_MULTIRAYSHAPE_HH_
+
+#include "gazebo/physics/MultiRayShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Simbody specific version of MultiRayShape
+    class GAZEBO_VISIBLE SimbodyMultiRayShape : public MultiRayShape
+    {
+      /// \brief Constructor
+      public: SimbodyMultiRayShape(CollisionPtr parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyMultiRayShape();
+
+      // Documentation inherited.
+      public: virtual void UpdateRays();
+
+      // Documentation inherited.
+      protected: virtual void AddRay(const math::Vector3 &_start,
+                             const math::Vector3 &_end);
+
+      /// \brief Pointer to the physics engine.
+      private: SimbodyPhysicsPtr physicsEngine;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyPhysics.cc b/gazebo/physics/simbody/SimbodyPhysics.cc
new file mode 100644
index 0000000..ce8f92c
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyPhysics.cc
@@ -0,0 +1,1410 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <string>
+
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyModel.hh"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyJoint.hh"
+#include "gazebo/physics/simbody/SimbodyCollision.hh"
+
+#include "gazebo/physics/simbody/SimbodyPlaneShape.hh"
+#include "gazebo/physics/simbody/SimbodySphereShape.hh"
+#include "gazebo/physics/simbody/SimbodyHeightmapShape.hh"
+#include "gazebo/physics/simbody/SimbodyMultiRayShape.hh"
+#include "gazebo/physics/simbody/SimbodyBoxShape.hh"
+#include "gazebo/physics/simbody/SimbodyCylinderShape.hh"
+#include "gazebo/physics/simbody/SimbodyMeshShape.hh"
+#include "gazebo/physics/simbody/SimbodyRayShape.hh"
+
+#include "gazebo/physics/simbody/SimbodyHingeJoint.hh"
+#include "gazebo/physics/simbody/SimbodyUniversalJoint.hh"
+#include "gazebo/physics/simbody/SimbodyBallJoint.hh"
+#include "gazebo/physics/simbody/SimbodySliderJoint.hh"
+#include "gazebo/physics/simbody/SimbodyHinge2Joint.hh"
+#include "gazebo/physics/simbody/SimbodyScrewJoint.hh"
+
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/physics/PhysicsFactory.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Entity.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/SurfaceParams.hh"
+#include "gazebo/physics/MapShape.hh"
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/math/Vector3.hh"
+
+#include "gazebo/transport/Publisher.hh"
+
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+
+typedef boost::shared_ptr<gazebo::physics::SimbodyJoint> SimbodyJointPtr;
+
+using namespace gazebo;
+using namespace physics;
+using namespace SimTK;
+
+GZ_REGISTER_PHYSICS_ENGINE("simbody", SimbodyPhysics)
+
+//////////////////////////////////////////////////
+SimbodyPhysics::SimbodyPhysics(WorldPtr _world)
+    : PhysicsEngine(_world), system(), matter(system), forces(system),
+      gravity(forces, matter, -SimTK::ZAxis, 0),
+      discreteForces(forces, matter),
+      tracker(system), contact(system, tracker),  integ(NULL)
+      , contactMaterialStiffness(0.0)
+      , contactMaterialDissipation(0.0)
+      , contactMaterialPlasticCoefRestitution(0.0)
+      , contactMaterialPlasticImpactVelocity(0.0)
+      , contactMaterialStaticFriction(0.0)
+      , contactMaterialDynamicFriction(0.0)
+      , contactMaterialViscousFriction(0.0)
+      , contactImpactCaptureVelocity(0.0)
+      , contactStictionTransitionVelocity(0.0)
+      , dynamicsWorld(NULL)
+      , stepTimeDouble(0.0)
+{
+  // Instantiate the Multibody System
+  // Instantiate the Simbody Matter Subsystem
+  // Instantiate the Simbody General Force Subsystem
+
+  this->simbodyPhysicsInitialized = false;
+  this->simbodyPhysicsStepped = false;
+}
+
+//////////////////////////////////////////////////
+SimbodyPhysics::~SimbodyPhysics()
+{
+}
+
+//////////////////////////////////////////////////
+ModelPtr SimbodyPhysics::CreateModel(BasePtr _parent)
+{
+  // set physics as uninitialized
+  this->simbodyPhysicsInitialized = false;
+
+  SimbodyModelPtr model(new SimbodyModel(_parent));
+
+  return model;
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::Load(sdf::ElementPtr _sdf)
+{
+  PhysicsEngine::Load(_sdf);
+
+  // Create an integrator
+  /// \TODO: get from sdf for simbody physics
+  /// \TODO: use this when pgs rigid body solver is implemented
+  this->solverType = "elastic_foundation";
+
+  /// \TODO: get from sdf for simbody physics
+  this->integratorType = "semi_explicit_euler";
+
+  if (this->integratorType == "rk_merson")
+    this->integ = new SimTK::RungeKuttaMersonIntegrator(system);
+  else if (this->integratorType == "rk3")
+    this->integ = new SimTK::RungeKutta3Integrator(system);
+  else if (this->integratorType == "rk2")
+    this->integ = new SimTK::RungeKutta2Integrator(system);
+  else if (this->integratorType == "semi_explicit_euler")
+    this->integ = new SimTK::SemiExplicitEuler2Integrator(system);
+  else
+  {
+    gzerr << "type not specified, using SemiExplicitEuler2Integrator.\n";
+    this->integ = new SimTK::SemiExplicitEuler2Integrator(system);
+  }
+
+  this->stepTimeDouble = this->GetMaxStepSize();
+
+  sdf::ElementPtr simbodyElem = this->sdf->GetElement("simbody");
+
+  // Set integrator accuracy (measured with Richardson Extrapolation)
+  this->integ->setAccuracy(
+    simbodyElem->Get<double>("accuracy"));
+
+  // Set stiction max slip velocity to make it less stiff.
+  this->contact.setTransitionVelocity(
+    simbodyElem->Get<double>("max_transient_velocity"));
+
+  sdf::ElementPtr simbodyContactElem = simbodyElem->GetElement("contact");
+
+  // system wide contact properties, assigned in AddCollisionsToLink()
+  this->contactMaterialStiffness =
+    simbodyContactElem->Get<double>("stiffness");
+  this->contactMaterialDissipation =
+    simbodyContactElem->Get<double>("dissipation");
+  this->contactMaterialStaticFriction =
+    simbodyContactElem->Get<double>("static_friction");
+  this->contactMaterialDynamicFriction =
+    simbodyContactElem->Get<double>("dynamic_friction");
+  this->contactMaterialViscousFriction =
+    simbodyContactElem->Get<double>("viscous_friction");
+
+  // below are not used yet, but should work it into the system
+  this->contactMaterialViscousFriction =
+    simbodyContactElem->Get<double>("plastic_coef_restitution");
+  this->contactMaterialPlasticCoefRestitution =
+    simbodyContactElem->Get<double>("plastic_impact_velocity");
+  this->contactMaterialPlasticImpactVelocity =
+    simbodyContactElem->Get<double>("override_impact_capture_velocity");
+  this->contactImpactCaptureVelocity =
+    simbodyContactElem->Get<double>("override_stiction_transition_velocity");
+}
+
+/////////////////////////////////////////////////
+void SimbodyPhysics::OnRequest(ConstRequestPtr &_msg)
+{
+  msgs::Response response;
+  response.set_id(_msg->id());
+  response.set_request(_msg->request());
+  response.set_response("success");
+  std::string *serializedData = response.mutable_serialized_data();
+
+  if (_msg->request() == "physics_info")
+  {
+    msgs::Physics physicsMsg;
+    physicsMsg.set_type(msgs::Physics::SIMBODY);
+    // min_step_size is defined but not yet used
+    physicsMsg.set_min_step_size(this->GetMaxStepSize());
+    physicsMsg.set_enable_physics(this->world->GetEnablePhysicsEngine());
+
+    physicsMsg.mutable_gravity()->CopyFrom(msgs::Convert(this->GetGravity()));
+    physicsMsg.set_real_time_update_rate(this->realTimeUpdateRate);
+    physicsMsg.set_real_time_factor(this->targetRealTimeFactor);
+    physicsMsg.set_max_step_size(this->maxStepSize);
+
+    response.set_type(physicsMsg.GetTypeName());
+    physicsMsg.SerializeToString(serializedData);
+    this->responsePub->Publish(response);
+  }
+}
+
+/////////////////////////////////////////////////
+void SimbodyPhysics::OnPhysicsMsg(ConstPhysicsPtr &_msg)
+{
+  if (_msg->has_enable_physics())
+    this->world->EnablePhysicsEngine(_msg->enable_physics());
+
+  if (_msg->has_gravity())
+    this->SetGravity(msgs::Convert(_msg->gravity()));
+
+  if (_msg->has_real_time_factor())
+    this->SetTargetRealTimeFactor(_msg->real_time_factor());
+
+  if (_msg->has_real_time_update_rate())
+    this->SetRealTimeUpdateRate(_msg->real_time_update_rate());
+
+  if (_msg->has_max_step_size())
+    this->SetMaxStepSize(_msg->max_step_size());
+
+  /* below will set accuracy for simbody if the messages exist
+  // Set integrator accuracy (measured with Richardson Extrapolation)
+  if (_msg->has_accuracy())
+  {
+    this->integ->setAccuracy(_msg->simbody().accuracy());
+  }
+
+  // Set stiction max slip velocity to make it less stiff.
+  if (_msg->has_max_transient_velocity())
+  {
+    this->contact.setTransitionVelocity(
+    _msg->simbody().max_transient_velocity());
+  }
+  */
+
+  /// Make sure all models get at least on update cycle.
+  this->world->EnableAllModels();
+
+  // Parent class handles many generic parameters
+  PhysicsEngine::OnPhysicsMsg(_msg);
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::Reset()
+{
+  this->integ->initialize(this->system.getDefaultState());
+
+  // restore potentially user run-time modified gravity
+  this->SetGravity(this->GetGravity());
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::Init()
+{
+  this->simbodyPhysicsInitialized = true;
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::InitModel(const physics::ModelPtr _model)
+{
+  // Before building a new system, transfer all joints in existing
+  // models, save Simbody joint states in Gazebo Model.
+  const SimTK::State& currentState = this->integ->getState();
+  double stateTime = 0;
+  bool simbodyStateSaved = false;
+
+  if (currentState.getSystemStage() != SimTK::Stage::Empty)
+  {
+    stateTime = currentState.getTime();
+    physics::Model_V models = this->world->GetModels();
+    for (physics::Model_V::iterator mi = models.begin();
+         mi != models.end(); ++mi)
+    {
+      if ((*mi) != _model)
+      {
+        physics::Joint_V joints = (*mi)->GetJoints();
+        for (physics::Joint_V::iterator jx = joints.begin();
+             jx != joints.end(); ++jx)
+        {
+          SimbodyJointPtr simbodyJoint =
+            boost::dynamic_pointer_cast<physics::SimbodyJoint>(*jx);
+          simbodyJoint->SaveSimbodyState(currentState);
+        }
+
+        physics::Link_V links = (*mi)->GetLinks();
+        for (physics::Link_V::iterator lx = links.begin();
+             lx != links.end(); ++lx)
+        {
+          SimbodyLinkPtr simbodyLink =
+            boost::dynamic_pointer_cast<physics::SimbodyLink>(*lx);
+          simbodyLink->SaveSimbodyState(currentState);
+        }
+      }
+    }
+    simbodyStateSaved = true;
+  }
+
+  try
+  {
+    //------------------------ CREATE SIMBODY SYSTEM ---------------------------
+    // Add to Simbody System and populate it with new links and joints
+    if (_model->IsStatic())
+    {
+      SimbodyPhysics::AddStaticModelToSimbodySystem(_model);
+    }
+    else
+    {
+      //---------------------- GENERATE MULTIBODY GRAPH ------------------------
+      MultibodyGraphMaker mbgraph;
+      this->CreateMultibodyGraph(mbgraph, _model);
+      // Optional: dump the graph to stdout for debugging or curiosity.
+      // mbgraph.dumpGraph(gzdbg);
+
+      SimbodyPhysics::AddDynamicModelToSimbodySystem(mbgraph, _model);
+    }
+  }
+  catch(const std::exception& e)
+  {
+    gzthrow(std::string("Simbody build EXCEPTION: ") + e.what());
+  }
+
+  try
+  {
+    //------------------------ CREATE SIMBODY SYSTEM ---------------------------
+    // Create a Simbody System and populate it with Subsystems we'll need.
+    SimbodyPhysics::InitSimbodySystem();
+  }
+  catch(const std::exception& e)
+  {
+    gzthrow(std::string("Simbody init EXCEPTION: ") + e.what());
+  }
+
+  SimTK::State state = this->system.realizeTopology();
+
+  // Restore Gazebo saved Joint states
+  // back into Simbody state.
+  if (simbodyStateSaved)
+  {
+    // set/retsore state time.
+    state.setTime(stateTime);
+
+    physics::Model_V models = this->world->GetModels();
+    for (physics::Model_V::iterator mi = models.begin();
+         mi != models.end(); ++mi)
+    {
+      physics::Joint_V joints = (*mi)->GetJoints();
+      for (physics::Joint_V::iterator jx = joints.begin();
+           jx != joints.end(); ++jx)
+      {
+        SimbodyJointPtr simbodyJoint =
+          boost::dynamic_pointer_cast<physics::SimbodyJoint>(*jx);
+        simbodyJoint->RestoreSimbodyState(state);
+      }
+      physics::Link_V links = (*mi)->GetLinks();
+      for (physics::Link_V::iterator lx = links.begin();
+           lx != links.end(); ++lx)
+      {
+        SimbodyLinkPtr simbodyLink =
+          boost::dynamic_pointer_cast<physics::SimbodyLink>(*lx);
+        simbodyLink->RestoreSimbodyState(state);
+      }
+    }
+  }
+
+  // initialize integrator from state
+  this->integ->initialize(state);
+
+  // mark links as initialized
+  Link_V links = _model->GetLinks();
+  for (Link_V::iterator li = links.begin(); li != links.end(); ++li)
+  {
+    physics::SimbodyLinkPtr simbodyLink =
+      boost::dynamic_pointer_cast<physics::SimbodyLink>(*li);
+    if (simbodyLink)
+      simbodyLink->physicsInitialized = true;
+    else
+      gzerr << "failed to cast link [" << (*li)->GetName()
+            << "] as simbody link\n";
+  }
+
+  // mark joints as initialized
+  physics::Joint_V joints = _model->GetJoints();
+  for (physics::Joint_V::iterator ji = joints.begin();
+       ji != joints.end(); ++ji)
+  {
+    SimbodyJointPtr simbodyJoint =
+      boost::dynamic_pointer_cast<SimbodyJoint>(*ji);
+    if (simbodyJoint)
+      simbodyJoint->physicsInitialized = true;
+    else
+      gzerr << "simbodyJoint [" << (*ji)->GetName()
+            << "]is not a SimbodyJointPtr\n";
+  }
+
+  this->simbodyPhysicsInitialized = true;
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::InitForThread()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::UpdateCollision()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::UpdatePhysics()
+{
+  // need to lock, otherwise might conflict with world resetting
+  boost::recursive_mutex::scoped_lock lock(*this->physicsUpdateMutex);
+
+  common::Time currTime =  this->world->GetRealTime();
+
+
+  bool trying = true;
+  while (trying && integ->getTime() < this->world->GetSimTime().Double())
+  {
+    try
+    {
+      this->integ->stepTo(this->world->GetSimTime().Double(),
+                         this->world->GetSimTime().Double());
+    }
+    catch(const std::exception& e)
+    {
+      gzerr << "simbody stepTo() failed with message:\n"
+            << e.what() << "\nWill stop trying now.\n";
+      trying = false;
+    }
+  }
+
+  this->simbodyPhysicsStepped = true;
+  const SimTK::State &s = this->integ->getState();
+
+  // debug
+  // gzerr << "time [" << s.getTime()
+  //       << "] q [" << s.getQ()
+  //       << "] u [" << s.getU()
+  //       << "] dt [" << this->stepTimeDouble
+  //       << "] t [" << this->world->GetSimTime().Double()
+  //       << "]\n";
+  // this->lastUpdateTime = currTime;
+
+  // pushing new entity pose into dirtyPoses for visualization
+  physics::Model_V models = this->world->GetModels();
+  for (physics::Model_V::iterator mi = models.begin();
+       mi != models.end(); ++mi)
+  {
+    physics::Link_V links = (*mi)->GetLinks();
+    for (physics::Link_V::iterator lx = links.begin();
+         lx != links.end(); ++lx)
+    {
+      physics::SimbodyLinkPtr simbodyLink =
+        boost::dynamic_pointer_cast<physics::SimbodyLink>(*lx);
+      math::Pose pose = SimbodyPhysics::Transform2Pose(
+        simbodyLink->masterMobod.getBodyTransform(s));
+      simbodyLink->SetDirtyPose(pose);
+      this->world->dirtyPoses.push_back(
+        boost::static_pointer_cast<Entity>(*lx).get());
+    }
+
+    physics::Joint_V joints = (*mi)->GetJoints();
+    for (physics::Joint_V::iterator jx = joints.begin();
+         jx != joints.end(); ++jx)
+    {
+      SimbodyJointPtr simbodyJoint =
+        boost::dynamic_pointer_cast<physics::SimbodyJoint>(*jx);
+      simbodyJoint->CacheForceTorque();
+    }
+  }
+
+  // FIXME:  this needs to happen before forces are applied for the next step
+  // FIXME:  but after we've gotten everything from current state
+  this->discreteForces.clearAllForces(this->integ->updAdvancedState());
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::Fini()
+{
+}
+
+//////////////////////////////////////////////////
+LinkPtr SimbodyPhysics::CreateLink(ModelPtr _parent)
+{
+  if (_parent == NULL)
+    gzthrow("Link must have a parent\n");
+
+  SimbodyLinkPtr link(new SimbodyLink(_parent));
+  link->SetWorld(_parent->GetWorld());
+
+  return link;
+}
+
+//////////////////////////////////////////////////
+CollisionPtr SimbodyPhysics::CreateCollision(const std::string &_type,
+                                            LinkPtr _parent)
+{
+  SimbodyCollisionPtr collision(new SimbodyCollision(_parent));
+  ShapePtr shape = this->CreateShape(_type, collision);
+  collision->SetShape(shape);
+  shape->SetWorld(_parent->GetWorld());
+  return collision;
+}
+
+//////////////////////////////////////////////////
+ShapePtr SimbodyPhysics::CreateShape(const std::string &_type,
+                                    CollisionPtr _collision)
+{
+  ShapePtr shape;
+  SimbodyCollisionPtr collision =
+    boost::dynamic_pointer_cast<SimbodyCollision>(_collision);
+
+  if (_type == "plane")
+    shape.reset(new SimbodyPlaneShape(collision));
+  else if (_type == "sphere")
+    shape.reset(new SimbodySphereShape(collision));
+  else if (_type == "box")
+    shape.reset(new SimbodyBoxShape(collision));
+  else if (_type == "cylinder")
+    shape.reset(new SimbodyCylinderShape(collision));
+  else if (_type == "mesh" || _type == "trimesh")
+    shape.reset(new SimbodyMeshShape(collision));
+  else if (_type == "heightmap")
+    shape.reset(new SimbodyHeightmapShape(collision));
+  else if (_type == "multiray")
+    shape.reset(new SimbodyMultiRayShape(collision));
+  else if (_type == "ray")
+    if (_collision)
+      shape.reset(new SimbodyRayShape(_collision));
+    else
+      shape.reset(new SimbodyRayShape(this->world->GetPhysicsEngine()));
+  else
+    gzerr << "Unable to create collision of type[" << _type << "]\n";
+
+  // else if (_type == "map" || _type == "image")
+  //   shape.reset(new MapShape(collision));
+  return shape;
+}
+
+//////////////////////////////////////////////////
+JointPtr SimbodyPhysics::CreateJoint(const std::string &_type,
+                                     ModelPtr _parent)
+{
+  JointPtr joint;
+  if (_type == "revolute")
+    joint.reset(new SimbodyHingeJoint(this->dynamicsWorld, _parent));
+  else if (_type == "universal")
+    joint.reset(new SimbodyUniversalJoint(this->dynamicsWorld, _parent));
+  else if (_type == "ball")
+    joint.reset(new SimbodyBallJoint(this->dynamicsWorld, _parent));
+  else if (_type == "prismatic")
+    joint.reset(new SimbodySliderJoint(this->dynamicsWorld, _parent));
+  else if (_type == "revolute2")
+    joint.reset(new SimbodyHinge2Joint(this->dynamicsWorld, _parent));
+  else if (_type == "screw")
+    joint.reset(new SimbodyScrewJoint(this->dynamicsWorld, _parent));
+  else
+    gzthrow("Unable to create joint of type[" << _type << "]");
+
+  return joint;
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::SetGravity(const gazebo::math::Vector3 &_gravity)
+{
+  this->sdf->GetElement("gravity")->Set(_gravity);
+
+  {
+    boost::recursive_mutex::scoped_lock lock(*this->physicsUpdateMutex);
+    if (this->simbodyPhysicsInitialized && this->world->GetModelCount() > 0)
+      this->gravity.setGravityVector(this->integ->updAdvancedState(),
+         SimbodyPhysics::Vector3ToVec3(_gravity));
+    else
+      this->gravity.setDefaultGravityVector(
+        SimbodyPhysics::Vector3ToVec3(_gravity));
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::DebugPrint() const
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::CreateMultibodyGraph(
+  SimTK::MultibodyGraphMaker &_mbgraph, const physics::ModelPtr _model)
+{
+  // Step 1: Tell MultibodyGraphMaker about joints it should know about.
+  // Note: "weld" and "free" are always predefined at 0 and 6 dofs, resp.
+  //                  Gazebo name  #dofs     Simbody equivalent
+  _mbgraph.addJointType(GetTypeString(physics::Base::HINGE_JOINT),  1);
+  _mbgraph.addJointType(GetTypeString(physics::Base::HINGE2_JOINT), 2);
+  _mbgraph.addJointType(GetTypeString(physics::Base::SLIDER_JOINT), 1);
+  _mbgraph.addJointType(GetTypeString(physics::Base::UNIVERSAL_JOINT), 2);
+  _mbgraph.addJointType(GetTypeString(physics::Base::SCREW_JOINT), 1);
+
+  // Simbody has a Ball constraint that is a good choice if you need to
+  // break a loop at a ball joint.
+  // _mbgraph.addJointType(GetTypeString(physics::Base::BALL_JOINT), 3, true);
+  // skip loop joints for now
+  _mbgraph.addJointType(GetTypeString(physics::Base::BALL_JOINT), 3, false);
+
+  // Step 2: Tell it about all the links we read from the input file,
+  // starting with world, and provide a reference pointer.
+  _mbgraph.addBody("world", SimTK::Infinity,
+                  false);
+
+  physics::Link_V links = _model->GetLinks();
+  for (physics::Link_V::iterator li = links.begin();
+       li != links.end(); ++li)
+  {
+    SimbodyLinkPtr simbodyLink = boost::dynamic_pointer_cast<SimbodyLink>(*li);
+
+    // gzerr << "debug : " << (*li)->GetName() << "\n";
+
+    if (simbodyLink)
+      _mbgraph.addBody((*li)->GetName(), (*li)->GetInertial()->GetMass(),
+                      simbodyLink->mustBeBaseLink, (*li).get());
+    else
+      gzerr << "simbodyLink [" << (*li)->GetName()
+            << "]is not a SimbodyLinkPtr\n";
+  }
+
+  // Step 3: Tell it about all the joints we read from the input file,
+  // and provide a reference pointer.
+  physics::Joint_V joints = _model->GetJoints();
+  for (physics::Joint_V::iterator ji = joints.begin();
+       ji != joints.end(); ++ji)
+  {
+    SimbodyJointPtr simbodyJoint =
+      boost::dynamic_pointer_cast<SimbodyJoint>(*ji);
+    if (simbodyJoint)
+      if ((*ji)->GetParent() && (*ji)->GetChild())
+        _mbgraph.addJoint((*ji)->GetName(), GetTypeString((*ji)->GetType()),
+           (*ji)->GetParent()->GetName(), (*ji)->GetChild()->GetName(),
+                            simbodyJoint->mustBreakLoopHere, (*ji).get());
+      else if ((*ji)->GetChild())
+        _mbgraph.addJoint((*ji)->GetName(), GetTypeString((*ji)->GetType()),
+           "world", (*ji)->GetChild()->GetName(),
+                            simbodyJoint->mustBreakLoopHere, (*ji).get());
+      else
+        gzerr << "simbodyJoint [" << (*ji)->GetName()
+              << "] does not have a valid child link, which is required\n";
+    else
+      gzerr << "simbodyJoint [" << (*ji)->GetName()
+            << "]is not a SimbodyJointPtr\n";
+  }
+
+  // Setp 4. Generate the multibody graph.
+  _mbgraph.generateGraph();
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::InitSimbodySystem()
+{
+  // Set stiction max slip velocity to make it less stiff.
+  // this->contact.setTransitionVelocity(0.01);  // now done in Load using sdf
+
+  // Specify gravity (read in above from world).
+  if (!math::equal(this->GetGravity().GetLength(), 0.0))
+    this->gravity.setDefaultGravityVector(
+      SimbodyPhysics::Vector3ToVec3(this->GetGravity()));
+  else
+    this->gravity.setDefaultMagnitude(0.0);
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::AddStaticModelToSimbodySystem(
+    const physics::ModelPtr _model)
+{
+  physics::Link_V links = _model->GetLinks();
+  for (physics::Link_V::iterator li = links.begin();
+       li != links.end(); ++li)
+  {
+    SimbodyLinkPtr simbodyLink = boost::dynamic_pointer_cast<SimbodyLink>(*li);
+    if (simbodyLink)
+    {
+      this->AddCollisionsToLink(simbodyLink.get(), this->matter.updGround(),
+        ContactCliqueId());
+      simbodyLink->masterMobod = this->matter.updGround();
+    }
+    else
+      gzerr << "simbodyLink [" << (*li)->GetName()
+            << "]is not a SimbodyLinkPtr\n";
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyPhysics::AddDynamicModelToSimbodySystem(
+  const SimTK::MultibodyGraphMaker &_mbgraph,
+  const physics::ModelPtr /*_model*/)
+{
+  // Generate a contact clique we can put collision geometry in to prevent
+  // self-collisions.
+  // \TODO: put this in a gazebo::physics::SimbodyModel class
+  ContactCliqueId modelClique = ContactSurface::createNewContactClique();
+
+  // Will specify explicitly when needed
+  // Record the MobilizedBody for the World link.
+  // model.links.updLink(0).masterMobod = this->matter.Ground();
+
+  // Run through all the mobilizers in the multibody graph, adding a Simbody
+  // MobilizedBody for each one. Also add visual and collision geometry to the
+  // bodies when they are mobilized.
+  for (int mobNum = 0; mobNum < _mbgraph.getNumMobilizers(); ++mobNum)
+  {
+    // Get a mobilizer from the graph, then extract its corresponding
+    // joint and bodies. Note that these don't necessarily have equivalents
+    // in the GazeboLink and GazeboJoint inputs.
+    const MultibodyGraphMaker::Mobilizer& mob = _mbgraph.getMobilizer(mobNum);
+    const std::string& type = mob.getJointTypeName();
+
+    // The inboard body always corresponds to one of the input links,
+    // because a slave link is always the outboard body of a mobilizer.
+    // The outboard body may be slave, but its master body is one of the
+    // Gazebo input links.
+    const bool isSlave = mob.isSlaveMobilizer();
+    // note: do not use boost shared pointer here, on scope out the
+    // original pointer get scrambled
+    SimbodyLink* gzInb = static_cast<SimbodyLink*>(mob.getInboardBodyRef());
+    SimbodyLink* gzOutb =
+      static_cast<SimbodyLink*>(mob.getOutboardMasterBodyRef());
+
+    const MassProperties massProps =
+        gzOutb->GetEffectiveMassProps(mob.getNumFragments());
+
+    // debug
+    // if (gzInb)
+    //   gzerr << "debug: Inb: " << gzInb->GetName() << "\n";
+    // if (gzOutb)
+    //   gzerr << "debug: Outb: " << gzOutb->GetName()
+    //         << " mass: " << gzOutb->GetInertial()->GetMass()
+    //         << " efm: " << massProps
+    //         << "\n";
+
+    // This will reference the new mobilized body once we create it.
+    MobilizedBody mobod;
+
+    MobilizedBody parentMobod =
+      gzInb == NULL ? this->matter.Ground() : gzInb->masterMobod;
+
+    if (mob.isAddedBaseMobilizer())
+    {
+      // There is no corresponding Gazebo joint for this mobilizer.
+      // Create the joint and set its default position to be the default
+      // pose of the base link relative to the Ground frame.
+      // Currently only `free` is allowed, we may add more types later
+      GZ_ASSERT(type == "free", "type is not 'free', not allowed.");
+      if (type == "free")
+      {
+        MobilizedBody::Free freeJoint(
+            parentMobod,  Transform(),
+            massProps,    Transform());
+
+        SimTK::Transform inboard_X_ML;
+        if (gzInb == NULL)
+        {
+          // GZ_ASSERT(gzOutb, "must be here");
+          physics::ModelPtr model = gzOutb->GetParentModel();
+          inboard_X_ML =
+            ~SimbodyPhysics::Pose2Transform(model->GetWorldPose());
+        }
+        else
+          inboard_X_ML =
+            SimbodyPhysics::Pose2Transform(gzInb->GetRelativePose());
+
+        SimTK::Transform outboard_X_ML =
+          SimbodyPhysics::Pose2Transform(gzOutb->GetRelativePose());
+
+        // defX_ML link frame specified in model frame
+        freeJoint.setDefaultTransform(~inboard_X_ML*outboard_X_ML);
+        mobod = freeJoint;
+      }
+    }
+    else
+    {
+      // This mobilizer does correspond to one of the input joints.
+      // note: do not use boost shared pointer here, on scope out the
+      // original pointer get scrambled
+      SimbodyJoint* gzJoint = static_cast<SimbodyJoint*>(mob.getJointRef());
+      const bool isReversed = mob.isReversedFromJoint();
+
+      // Find inboard and outboard frames for the mobilizer; these are
+      // parent and child frames or the reverse.
+
+      const Transform& X_IF0 = isReversed ? gzJoint->xCB : gzJoint->xPA;
+      const Transform& X_OM0 = isReversed ? gzJoint->xPA : gzJoint->xCB;
+
+      const MobilizedBody::Direction direction =
+          isReversed ? MobilizedBody::Reverse : MobilizedBody::Forward;
+
+      if (type == "free")
+      {
+        MobilizedBody::Free freeJoint(
+            parentMobod,  X_IF0,
+            massProps,          X_OM0,
+            direction);
+        Transform defX_FM = isReversed ? Transform(~gzJoint->defxAB)
+                                       : gzJoint->defxAB;
+        freeJoint.setDefaultTransform(defX_FM);
+        mobod = freeJoint;
+      }
+      else if (type == "screw")
+      {
+        UnitVec3 axis(
+          SimbodyPhysics::Vector3ToVec3(gzJoint->GetLocalAxis(0)));
+
+        double pitch =
+          dynamic_cast<physics::SimbodyScrewJoint*>(gzJoint)->GetThreadPitch(0);
+
+        if (math::equal(pitch, 0.0))
+        {
+          gzerr << "thread pitch should not be zero (joint is a slider?)"
+                << " using pitch = 1.0e6\n";
+          pitch = 1.0e6;
+        }
+
+        // Simbody's screw joint axis (both rotation and translation) is along Z
+        Rotation R_JZ(axis, ZAxis);
+        Transform X_IF(X_IF0.R()*R_JZ, X_IF0.p());
+        Transform X_OM(X_OM0.R()*R_JZ, X_OM0.p());
+        MobilizedBody::Screw screwJoint(
+            parentMobod,      X_IF,
+            massProps,        X_OM,
+            -1.0/pitch,
+            direction);
+        mobod = screwJoint;
+
+        gzdbg << "Setting limitForce[0] for [" << gzJoint->GetName() << "]\n";
+
+        double low = gzJoint->GetLowerLimit(0u).Radian();
+        double high = gzJoint->GetUpperLimit(0u).Radian();
+
+        // initialize stop stiffness and dissipation from joint parameters
+        gzJoint->limitForce[0] =
+          Force::MobilityLinearStop(this->forces, mobod,
+          SimTK::MobilizerQIndex(0), gzJoint->GetStopStiffness(0),
+          gzJoint->GetStopDissipation(0), low, high);
+
+        // gzdbg << "SimbodyPhysics SetDamping ("
+        //       << gzJoint->GetDampingCoefficient()
+        //       << ")\n";
+        // Create a damper for every joint even if damping coefficient
+        // is zero.  This will allow user to change damping coefficients
+        // on the fly.
+        gzJoint->damper[0] =
+          Force::MobilityLinearDamper(this->forces, mobod, 0,
+                                   gzJoint->GetDamping(0));
+
+        // add spring (stiffness proportional to mass)
+        gzJoint->spring[0] =
+          Force::MobilityLinearSpring(this->forces, mobod, 0,
+            gzJoint->GetStiffness(0),
+            gzJoint->GetSpringReferencePosition(0));
+      }
+      else if (type == "universal")
+      {
+        UnitVec3 axis1(SimbodyPhysics::Vector3ToVec3(
+          gzJoint->GetLocalAxis(UniversalJoint<Joint>::AXIS_PARENT)));
+        UnitVec3 axis2(SimbodyPhysics::Vector3ToVec3(
+          gzJoint->GetLocalAxis(UniversalJoint<Joint>::AXIS_CHILD)));
+
+        // Simbody's univeral joint is along axis1=Y and axis2=X
+        // note X and Y are reversed because Simbody defines universal joint
+        // rotation in body-fixed frames, whereas Gazebo/ODE uses space-fixed
+        // frames.
+        Rotation R_JF(axis1, XAxis, axis2, YAxis);
+        Transform X_IF(X_IF0.R()*R_JF, X_IF0.p());
+        Transform X_OM(X_OM0.R()*R_JF, X_OM0.p());
+        MobilizedBody::Universal uJoint(
+            parentMobod,      X_IF,
+            massProps,        X_OM,
+            direction);
+        mobod = uJoint;
+
+        for (unsigned int nj = 0; nj < 2; ++nj)
+        {
+          double low = gzJoint->GetLowerLimit(nj).Radian();
+          double high = gzJoint->GetUpperLimit(nj).Radian();
+
+          // initialize stop stiffness and dissipation from joint parameters
+          gzJoint->limitForce[nj] =
+            Force::MobilityLinearStop(this->forces, mobod,
+            SimTK::MobilizerQIndex(nj), gzJoint->GetStopStiffness(nj),
+            gzJoint->GetStopDissipation(nj), low, high);
+
+          // gzdbg << "stop stiffness [" << gzJoint->GetStopStiffness(nj)
+          //       << "] low [" << low
+          //       << "] high [" << high
+          //       << "]\n";
+
+          // gzdbg << "SimbodyPhysics SetDamping ("
+          //       << gzJoint->GetDampingCoefficient()
+          //       << ")\n";
+          // Create a damper for every joint even if damping coefficient
+          // is zero.  This will allow user to change damping coefficients
+          // on the fly.
+          gzJoint->damper[nj] =
+            Force::MobilityLinearDamper(this->forces, mobod, nj,
+                                     gzJoint->GetDamping(nj));
+          // add spring (stiffness proportional to mass)
+          gzJoint->spring[nj] =
+            Force::MobilityLinearSpring(this->forces, mobod, nj,
+              gzJoint->GetStiffness(nj),
+              gzJoint->GetSpringReferencePosition(nj));
+        }
+      }
+      else if (type == "revolute")
+      {
+        UnitVec3 axis(
+          SimbodyPhysics::Vector3ToVec3(gzJoint->GetLocalAxis(0)));
+
+        // Simbody's pin is along Z
+        Rotation R_JZ(axis, ZAxis);
+        Transform X_IF(X_IF0.R()*R_JZ, X_IF0.p());
+        Transform X_OM(X_OM0.R()*R_JZ, X_OM0.p());
+        MobilizedBody::Pin pinJoint(
+            parentMobod,      X_IF,
+            massProps,              X_OM,
+            direction);
+        mobod = pinJoint;
+
+        double low = gzJoint->GetLowerLimit(0u).Radian();
+        double high = gzJoint->GetUpperLimit(0u).Radian();
+
+        // initialize stop stiffness and dissipation from joint parameters
+        gzJoint->limitForce[0] =
+          Force::MobilityLinearStop(this->forces, mobod,
+          SimTK::MobilizerQIndex(0), gzJoint->GetStopStiffness(0),
+          gzJoint->GetStopDissipation(0), low, high);
+
+        // gzdbg << "SimbodyPhysics SetDamping ("
+        //       << gzJoint->GetDampingCoefficient()
+        //       << ")\n";
+        // Create a damper for every joint even if damping coefficient
+        // is zero.  This will allow user to change damping coefficients
+        // on the fly.
+        gzJoint->damper[0] =
+          Force::MobilityLinearDamper(this->forces, mobod, 0,
+                                   gzJoint->GetDamping(0));
+
+        // add spring (stiffness proportional to mass)
+        gzJoint->spring[0] =
+          Force::MobilityLinearSpring(this->forces, mobod, 0,
+            gzJoint->GetStiffness(0),
+            gzJoint->GetSpringReferencePosition(0));
+      }
+      else if (type == "prismatic")
+      {
+        UnitVec3 axis(
+          SimbodyPhysics::Vector3ToVec3(gzJoint->GetLocalAxis(0)));
+
+        // Simbody's slider is along X
+        Rotation R_JX(axis, XAxis);
+        Transform X_IF(X_IF0.R()*R_JX, X_IF0.p());
+        Transform X_OM(X_OM0.R()*R_JX, X_OM0.p());
+        MobilizedBody::Slider sliderJoint(
+            parentMobod,      X_IF,
+            massProps,              X_OM,
+            direction);
+        mobod = sliderJoint;
+
+        double low = gzJoint->GetLowerLimit(0u).Radian();
+        double high = gzJoint->GetUpperLimit(0u).Radian();
+
+        // initialize stop stiffness and dissipation from joint parameters
+        gzJoint->limitForce[0] =
+          Force::MobilityLinearStop(this->forces, mobod,
+          SimTK::MobilizerQIndex(0), gzJoint->GetStopStiffness(0),
+          gzJoint->GetStopDissipation(0), low, high);
+
+        // Create a damper for every joint even if damping coefficient
+        // is zero.  This will allow user to change damping coefficients
+        // on the fly.
+        gzJoint->damper[0] =
+          Force::MobilityLinearDamper(this->forces, mobod, 0,
+                                   gzJoint->GetDamping(0));
+
+        // add spring (stiffness proportional to mass)
+        gzJoint->spring[0] =
+          Force::MobilityLinearSpring(this->forces, mobod, 0,
+            gzJoint->GetStiffness(0),
+            gzJoint->GetSpringReferencePosition(0));
+      }
+      else if (type == "ball")
+      {
+        MobilizedBody::Ball ballJoint(
+            parentMobod,  X_IF0,
+            massProps,          X_OM0,
+            direction);
+        Rotation defR_FM = isReversed
+            ? Rotation(~gzJoint->defxAB.R())
+            : gzJoint->defxAB.R();
+        ballJoint.setDefaultRotation(defR_FM);
+        mobod = ballJoint;
+      }
+      else
+      {
+        gzerr << "Simbody joint type [" << type << "] not implemented.\n";
+      }
+
+      // Created a mobilizer that corresponds to gzJoint. Keep track.
+      gzJoint->mobod = mobod;
+      gzJoint->isReversed = isReversed;
+    }
+
+    // Link gzOutb has been mobilized; keep track for later.
+    if (isSlave)
+      gzOutb->slaveMobods.push_back(mobod);
+    else
+      gzOutb->masterMobod = mobod;
+
+    // A mobilizer has been created; now add the collision
+    // geometry for the new mobilized body.
+    this->AddCollisionsToLink(gzOutb, mobod, modelClique);
+  }
+
+  // Weld the slaves to their masters.
+  physics::Model_V models = this->world->GetModels();
+  for (physics::Model_V::iterator mi = models.begin();
+       mi != models.end(); ++mi)
+  {
+    physics::Link_V links = (*mi)->GetLinks();
+    for (physics::Link_V::iterator lx = links.begin();
+         lx != links.end(); ++lx)
+    {
+      physics::SimbodyLinkPtr link =
+        boost::dynamic_pointer_cast<physics::SimbodyLink>(*lx);
+      if (link->slaveMobods.empty()) continue;
+      for (unsigned i = 0; i < link->slaveMobods.size(); ++i)
+      {
+        Constraint::Weld weld(link->masterMobod, link->slaveMobods[i]);
+
+        // in case we want to know later
+        link->slaveWelds.push_back(weld);
+      }
+    }
+  }
+
+  //   leave out optimization
+  // // Add the loop joints if any.
+  // for (int lcx=0; lcx < _mbgraph.getNumLoopConstraints(); ++lcx) {
+  //     const MultibodyGraphMaker::LoopConstraint& loop =
+  //         _mbgraph.getLoopConstraint(lcx);
+
+  //     SimbodyJointPtr joint(loop.getJointRef());
+  //     SimbodyLinkPtr  parent(loop.getParentBodyRef());
+  //     SimbodyLinkPtr  child(loop.getChildBodyRef());
+
+  //     if (joint.type == "weld") {
+  //         Constraint::Weld weld(parent.masterMobod, joint.xPA,
+  //                               child.masterMobod,  joint.xCB);
+  //         joint.constraint = weld;
+  //     } else if (joint.type == "ball") {
+  //         Constraint::Ball ball(parent.masterMobod, joint.xPA.p(),
+  //                               child.masterMobod,  joint.xCB.p());
+  //         joint.constraint = ball;
+  //     } else if (joint.type == "free") {
+  //         // A "free" loop constraint is no constraint at all so we can
+  //         // just ignore it. It might be more convenient if there were
+  //         // a 0-constraint Constraint::Free, just as there is a 0-mobility
+  //         // MobilizedBody::Weld.
+  //     } else
+  //         throw std::runtime_error(
+  //             "Unrecognized loop constraint type '" + joint.type + "'.");
+  // }
+}
+
+std::string SimbodyPhysics::GetTypeString(physics::Base::EntityType _type)
+{
+  // switch (_type)
+  // {
+  //   case physics::Base::BALL_JOINT:
+  //     gzerr << "here\n";
+  //     return "ball";
+  //     break;
+  //   case physics::Base::HINGE2_JOINT:
+  //     return "revolute2";
+  //     break;
+  //   case physics::Base::HINGE_JOINT:
+  //     return "revolute";
+  //     break;
+  //   case physics::Base::SLIDER_JOINT:
+  //     return "prismatic";
+  //     break;
+  //   case physics::Base::SCREW_JOINT:
+  //     return "screw";
+  //     break;
+  //   case physics::Base::UNIVERSAL_JOINT:
+  //     return "universal";
+  //     break;
+  //   default:
+  //     gzerr << "Unrecognized joint type\n";
+  //     return "UNRECOGNIZED";
+  // }
+
+  if (_type & physics::Base::BALL_JOINT)
+    return "ball";
+  else if (_type & physics::Base::HINGE2_JOINT)
+      return "revolute2";
+  else if (_type & physics::Base::HINGE_JOINT)
+      return "revolute";
+  else if (_type & physics::Base::SLIDER_JOINT)
+      return "prismatic";
+  else if (_type & physics::Base::SCREW_JOINT)
+      return "screw";
+  else if (_type & physics::Base::UNIVERSAL_JOINT)
+      return "universal";
+
+  gzerr << "Unrecognized joint type\n";
+  return "UNRECOGNIZED";
+}
+
+/////////////////////////////////////////////////
+void SimbodyPhysics::SetSeed(uint32_t /*_seed*/)
+{
+  gzerr << "SimbodyPhysics::SetSeed not implemented\n";
+}
+
+/////////////////////////////////////////////////
+void SimbodyPhysics::AddCollisionsToLink(const physics::SimbodyLink *_link,
+  MobilizedBody &_mobod, ContactCliqueId _modelClique)
+{
+  // TODO: Edit physics::Surface class to support these properties
+  // Define a material to use for contact. This is not very stiff.
+  // use stiffness of 1e8 and dissipation of 1000.0 to approximate inelastic
+  // collision. but 1e6 and 10 seems sufficient when TransitionVelocity is
+  // reduced from 0.1 to 0.01
+  SimTK::ContactMaterial material(this->contactMaterialStiffness,
+                                  this->contactMaterialDissipation,
+                                  this->contactMaterialStaticFriction,
+                                  this->contactMaterialDynamicFriction,
+                                  this->contactMaterialViscousFriction);
+  // Debug: works for SpawnDrop
+  // SimTK::ContactMaterial material(1e6,   // stiffness
+  //                                 10.0,  // dissipation
+  //                                 0.7,   // mu_static
+  //                                 0.5,   // mu_dynamic
+  //                                 0.5);  // mu_viscous
+
+  bool addModelClique = _modelClique.isValid() && !_link->GetSelfCollide();
+
+  // COLLISION
+  Collision_V collisions =  _link->GetCollisions();
+  for (Collision_V::iterator ci =  collisions.begin();
+                             ci !=  collisions.end(); ++ci)
+  {
+    Transform X_LC =
+      SimbodyPhysics::Pose2Transform((*ci)->GetRelativePose());
+
+    switch ((*ci)->GetShapeType() & (~physics::Entity::SHAPE))
+    {
+      case physics::Entity::PLANE_SHAPE:
+      {
+        boost::shared_ptr<physics::PlaneShape> p =
+          boost::dynamic_pointer_cast<physics::PlaneShape>((*ci)->GetShape());
+
+        // Add a contact surface to represent the ground.
+        // Half space normal is -x; must rotate about y to make it +z.
+        this->matter.Ground().updBody().addContactSurface(Rotation(Pi/2, YAxis),
+           ContactSurface(ContactGeometry::HalfSpace(), material));
+
+        Vec3 normal = SimbodyPhysics::Vector3ToVec3(p->GetNormal());
+
+        // by default, simbody HalfSpace normal is in the -X direction
+        // rotate it based on normal vector specified by user
+        // Create a rotation whos x-axis is in the
+        // negative normal vector direction
+        Rotation R_XN(-UnitVec3(normal), XAxis);
+
+        ContactSurface surface(ContactGeometry::HalfSpace(), material);
+
+        if (addModelClique)
+            surface.joinClique(_modelClique);
+
+        _mobod.updBody().addContactSurface(R_XN, surface);
+      }
+      break;
+
+      case physics::Entity::SPHERE_SHAPE:
+      {
+        boost::shared_ptr<physics::SphereShape> s =
+          boost::dynamic_pointer_cast<physics::SphereShape>((*ci)->GetShape());
+        double r = s->GetRadius();
+        ContactSurface surface(ContactGeometry::Sphere(r), material);
+        if (addModelClique)
+            surface.joinClique(_modelClique);
+        _mobod.updBody().addContactSurface(X_LC, surface);
+      }
+      break;
+
+      case physics::Entity::CYLINDER_SHAPE:
+      {
+        boost::shared_ptr<physics::CylinderShape> c =
+          boost::dynamic_pointer_cast<physics::CylinderShape>(
+          (*ci)->GetShape());
+        double r = c->GetRadius();
+        double len = c->GetLength();
+
+        // chunky hexagonal shape
+        const int resolution = 1;
+        const PolygonalMesh mesh = PolygonalMesh::
+            createCylinderMesh(ZAxis, r, len/2, resolution);
+        const ContactGeometry::TriangleMesh triMesh(mesh);
+        ContactSurface surface(triMesh, material, 1 /*Thickness*/);
+
+        // Vec3 esz = Vec3(r, r, len/2);  // Use ellipsoid instead
+        // ContactSurface surface(ContactGeometry::Ellipsoid(esz),
+        //                        material);
+
+        if (addModelClique)
+            surface.joinClique(_modelClique);
+        _mobod.updBody().addContactSurface(X_LC, surface);
+      }
+      break;
+
+      case physics::Entity::BOX_SHAPE:
+      {
+        Vec3 hsz = SimbodyPhysics::Vector3ToVec3(
+          (boost::dynamic_pointer_cast<physics::BoxShape>(
+          (*ci)->GetShape()))->GetSize())/2;
+
+        /// \TODO: harcoded resolution, make collision resolution
+        /// an adjustable parameter (#980)
+        // number times to chop the longest side.
+        const int resolution = 6;
+        // const int resolution = 10 * (int)(max(hsz)/min(hsz) + 0.5);
+        const PolygonalMesh mesh = PolygonalMesh::
+            createBrickMesh(hsz, resolution);
+        const ContactGeometry::TriangleMesh triMesh(mesh);
+        ContactSurface surface(triMesh, material, 1 /*Thickness*/);
+
+        // ContactSurface surface(ContactGeometry::Ellipsoid(hsz),
+        //                        material);
+
+        if (addModelClique)
+            surface.joinClique(_modelClique);
+        _mobod.updBody().addContactSurface(X_LC, surface);
+      }
+      break;
+      default:
+        gzerr << "Collision type [" << (*ci)->GetShapeType()
+              << "] unimplemented\n";
+        break;
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+std::string SimbodyPhysics::GetType() const
+{
+  return "simbody";
+}
+
+/////////////////////////////////////////////////
+SimTK::MultibodySystem *SimbodyPhysics::GetDynamicsWorld() const
+{
+  return this->dynamicsWorld;
+}
+
+/////////////////////////////////////////////////
+SimTK::Quaternion SimbodyPhysics::QuadToQuad(const math::Quaternion &_q)
+{
+  return SimTK::Quaternion(_q.w, _q.x, _q.y, _q.z);
+}
+
+/////////////////////////////////////////////////
+math::Quaternion SimbodyPhysics::QuadToQuad(const SimTK::Quaternion &_q)
+{
+  return math::Quaternion(_q[0], _q[1], _q[2], _q[3]);
+}
+
+/////////////////////////////////////////////////
+SimTK::Vec3 SimbodyPhysics::Vector3ToVec3(const math::Vector3 &_v)
+{
+  return SimTK::Vec3(_v.x, _v.y, _v.z);
+}
+
+/////////////////////////////////////////////////
+math::Vector3 SimbodyPhysics::Vec3ToVector3(const SimTK::Vec3 &_v)
+{
+  return math::Vector3(_v[0], _v[1], _v[2]);
+}
+
+/////////////////////////////////////////////////
+SimTK::Transform SimbodyPhysics::Pose2Transform(const math::Pose &_pose)
+{
+  SimTK::Quaternion q(_pose.rot.w, _pose.rot.x, _pose.rot.y,
+                   _pose.rot.z);
+  SimTK::Vec3 v(_pose.pos.x, _pose.pos.y, _pose.pos.z);
+  SimTK::Transform frame(SimTK::Rotation(q), v);
+  return frame;
+}
+
+/////////////////////////////////////////////////
+math::Pose SimbodyPhysics::Transform2Pose(const SimTK::Transform &_xAB)
+{
+  SimTK::Quaternion q(_xAB.R());
+  const SimTK::Vec4 &qv = q.asVec4();
+  return math::Pose(math::Vector3(_xAB.p()[0], _xAB.p()[1], _xAB.p()[2]),
+    math::Quaternion(qv[0], qv[1], qv[2], qv[3]));
+}
+
+/////////////////////////////////////////////////
+SimTK::Transform SimbodyPhysics::GetPose(sdf::ElementPtr _element)
+{
+  const math::Pose pose = _element->Get<math::Pose>("pose");
+  return Pose2Transform(pose);
+}
+
+/////////////////////////////////////////////////
+std::string SimbodyPhysics::GetTypeString(unsigned int _type)
+{
+  return GetTypeString(physics::Base::EntityType(_type));
+}
+
+//////////////////////////////////////////////////
+boost::any SimbodyPhysics::GetParam(const std::string &_key) const
+{
+  if (_key == "type")
+  {
+    gzwarn << "Please use keyword `solver_typ` in the future.\n";
+    return this->GetParam("solver_type");
+  }
+  else if (_key == "solver_type")
+  {
+    return "Spatial Algebra and Elastic Foundation";
+  }
+  else if (_key == "integrator_type")
+  {
+    return this->integratorType;
+  }
+  else if (_key == "accuracy")
+  {
+    if (this->integ)
+      return this->integ->getAccuracyInUse();
+    else
+      return 0.0f;
+  }
+  else if (_key == "max_transient_velocity")
+  {
+    return this->contact.getTransitionVelocity();
+  }
+  else
+  {
+    gzwarn << "key [" << _key
+           << "] not supported, returning (int)0." << std::endl;
+    return 0;
+  }
+}
+
+//////////////////////////////////////////////////
+bool SimbodyPhysics::SetParam(const std::string &_key, const boost::any &_value)
+{
+  /// \TODO fill this out, see issue #1116
+  if (_key == "accuracy")
+  {
+    int value;
+    try
+    {
+      value = boost::any_cast<int>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    gzerr << "Setting [" << _key << "] in Simbody to [" << value
+          << "] not yet supported.\n";
+    return false;
+  }
+  else if (_key == "max_transient_velocity")
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    gzerr << "Setting [" << _key << "] in Simbody to [" << value
+          << "] not yet supported.\n";
+    return false;
+  }
+  else if (_key == "max_step_size")
+  {
+    double value;
+    try
+    {
+      value = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+    gzerr << "Setting [" << _key << "] in Simbody to [" << value
+          << "] not yet supported.\n";
+    return false;
+  }
+  else
+  {
+    gzwarn << _key << " is not supported in Simbody" << std::endl;
+    return false;
+  }
+  // should never get here
+  return false;
+}
diff --git a/gazebo/physics/simbody/SimbodyPhysics.hh b/gazebo/physics/simbody/SimbodyPhysics.hh
new file mode 100644
index 0000000..dc43786
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyPhysics.hh
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_PHYSICS_HH
+#define _SIMBODY_PHYSICS_HH
+#include <string>
+
+#include <boost/thread/thread.hpp>
+#include <boost/thread/mutex.hpp>
+
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/Shape.hh"
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+
+#include "gazebo/physics/simbody/simbody_inc.h"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Simbody physics engine
+    class GAZEBO_VISIBLE SimbodyPhysics : public PhysicsEngine
+    {
+      /// \brief Constructor
+      public: SimbodyPhysics(WorldPtr _world);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyPhysics();
+
+      // Documentation inherited
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual void Reset();
+
+      /// \brief Add a Model to the Simbody system.
+      /// \param[in] _model Pointer to the model to add into Simbody.
+      public: void InitModel(const physics::ModelPtr _model);
+
+      // Documentation inherited
+      public: virtual void InitForThread();
+
+      // Documentation inherited
+      public: virtual void UpdateCollision();
+
+      // Documentation inherited
+      public: virtual void UpdatePhysics();
+
+      // Documentation inherited
+      public: virtual void Fini();
+
+      // Documentation inherited
+      public: virtual std::string GetType() const;
+
+      // Documentation inherited
+      public: virtual LinkPtr CreateLink(ModelPtr _parent);
+
+      // Documentation inherited
+      public: virtual CollisionPtr CreateCollision(const std::string &_type,
+                                                   LinkPtr _body);
+
+      // Documentation inherited
+      public: virtual JointPtr CreateJoint(const std::string &_type,
+                                           ModelPtr _parent);
+
+      // Documentation inherited
+      public: virtual ShapePtr CreateShape(const std::string &_shapeType,
+                                           CollisionPtr _collision);
+
+      /// \brief Register a joint with the dynamics world
+      public: SimTK::MultibodySystem *GetDynamicsWorld() const;
+
+      // Documentation inherited
+      public: virtual void SetGravity(const gazebo::math::Vector3 &_gravity);
+
+      // Documentation inherited
+      public: virtual void DebugPrint() const;
+
+      // Documentation inherited
+      public: virtual void SetSeed(uint32_t _seed);
+
+      // Documentation inherited
+      public: virtual ModelPtr CreateModel(BasePtr _parent);
+
+      /// \brief Convert gazebo::math::Quaternion to SimTK::Quaternion
+      /// \param[in] _q Gazeb's math::Quaternion object
+      /// \return Simbody's SimTK::Quaternion object
+      public: static SimTK::Quaternion QuadToQuad(const math::Quaternion &_q);
+
+      /// \brief Convert SimTK::Quaternion to gazebo::math::Quaternion
+      /// \param[in] _q Simbody's SimTK::Quaternion object
+      /// \return Gazeb's math::Quaternion object
+      public: static math::Quaternion QuadToQuad(const SimTK::Quaternion &_q);
+
+      /// \brief Convert gazebo::math::Vector3 to SimTK::Vec3
+      /// \param[in] _v Gazeb's math::Vector3 object
+      /// \return Simbody's SimTK::Vec3 object
+      public: static SimTK::Vec3 Vector3ToVec3(const math::Vector3 &_v);
+
+      /// \brief Convert SimTK::Vec3 to gazebo::math::Vector3
+      /// \param[in] _v Simbody's SimTK::Vec3 object
+      /// \return Gazeb's math::Vector3 object
+      public: static math::Vector3 Vec3ToVector3(const SimTK::Vec3 &_v);
+
+      /// \brief Convert the given pose in x,y,z,thetax,thetay,thetaz format to
+      /// a Simbody Transform. The rotation angles are interpreted as a
+      /// body-fixed sequence, meaning we rotation about x, then about
+      /// the new y, then about the now twice-rotated z.
+      /// \param[in] _pose Gazeb's math::Pose object
+      /// \return Simbody's SimTK::Transform object
+      public: static SimTK::Transform Pose2Transform(const math::Pose &_pose);
+
+      /// \brief Convert a Simbody transform to a pose in x,y,z,
+      /// thetax,thetay,thetaz format.
+      /// \param[in] _xAB Simbody's SimTK::Transform object
+      /// \return Gazeb's math::Pose object
+      public: static math::Pose Transform2Pose(const SimTK::Transform &_xAB);
+
+      /// \brief If the given element contains a <pose> element, return it as a
+      /// Transform. Otherwise return the identity Transform. If there
+      /// is more than one <pose> element, only the first one is processed.
+      public: static SimTK::Transform GetPose(sdf::ElementPtr _element);
+
+      /// \brief Convert Base::GetType() to string,
+      /// this is needed by the MultibodyGraphMaker.
+      /// \param[in] _type Joint type returned by Joint::GetType().
+      /// \return a hard-coded string needed by the MultibodyGraphMaker.
+      public: static std::string GetTypeString(unsigned int _type);
+
+      /// \brief Convert Base::GetType() to string,
+      /// this is needed by the MultibodyGraphMaker.
+      /// \param[in] _type Joint type returned by Joint::GetType().
+      /// \return a hard-coded string needed by the MultibodyGraphMaker.
+      public: static std::string GetTypeString(physics::Base::EntityType _type);
+
+      // Documentation inherited
+      protected: virtual void OnRequest(ConstRequestPtr &_msg);
+
+      // Documentation inherited
+      protected: virtual void OnPhysicsMsg(ConstPhysicsPtr &_msg);
+
+      /// \brief CREATE MULTIBODY GRAPH
+      /// Define Gazebo joint types, then use links and joints in the
+      /// given model to construct a reasonable spanning-tree-plus-constraints
+      /// multibody graph to represent that model. An exception will be
+      /// thrown if this fails.  Note that this step is not Simbody dependent.
+      /// \param[in] _mbgraph Create a MultibodyGraphMaker that is equivalent
+      /// of incoming physics::Model.
+      /// \param[in] _model Model loaded by Gazebo parsing SDF.
+      private: void CreateMultibodyGraph(
+        SimTK::MultibodyGraphMaker& _mbgraph, const physics::ModelPtr _model);
+
+      /// \brief BUILD SIMBODY SYSTEM
+      /// Given a desired multibody graph, gravity, and the Gazebo model
+      /// that was used to generate the graph, create a Simbody System
+      /// for it. There are many limitations here, especially in the
+      /// handling of contact. Any Gazebo features that we haven't
+      /// modeled are just ignored.  The GazeboModel is updated so that
+      /// its links and joints have references to their corresponding
+      /// Simbody elements.  We set up some visualization here so we
+      /// can see what's happening but this would not be needed in Gazebo
+      /// since it does its own visualization.
+      private: void InitSimbodySystem();
+
+      /// \brief Add a static Model to simbody system, and reinitialize state
+      /// \param[in] _model the incoming static Gazebo physics::Model.
+      private: void AddStaticModelToSimbodySystem(
+                   const physics::ModelPtr _model);
+
+      /// \brief Read from MultibodydGraphMaker and construct a physics::Model.
+      /// \param[in] _mbgraph Contain MultibodyGraphMaker object.
+      /// \param[in] _model Pointer to gazebo model, not used at this time.
+      private: void AddDynamicModelToSimbodySystem(
+        const SimTK::MultibodyGraphMaker &_mbgraph,
+        const physics::ModelPtr _model);
+
+      /// \brief helper function for building SimbodySystem
+      private: void AddCollisionsToLink(const physics::SimbodyLink *_link,
+        SimTK::MobilizedBody &_mobod, SimTK::ContactCliqueId _modelClique);
+
+      public: SimTK::MultibodySystem system;
+      public: SimTK::SimbodyMatterSubsystem matter;
+      public: SimTK::GeneralForceSubsystem forces;
+      public: SimTK::Force::Gravity gravity;
+      public: SimTK::Force::DiscreteForces discreteForces;
+      public: SimTK::ContactTrackerSubsystem tracker;
+      public: SimTK::CompliantContactSubsystem contact;
+      public: SimTK:: Integrator *integ;
+
+      /// \brief true if initialized
+      public: bool simbodyPhysicsInitialized;
+
+      public: bool simbodyPhysicsStepped;
+
+      // Documentation inherited
+      public: virtual boost::any GetParam(const std::string &_key) const;
+
+      // Documentation inherited
+      public: virtual bool SetParam(const std::string &_key,
+                  const boost::any &_value);
+
+      /// \brief contact material stiffness.  See sdf description for details.
+      private: double contactMaterialStiffness;
+
+      /// \brief contact material dissipation.  See sdf description for details.
+      private: double contactMaterialDissipation;
+
+      /// \brief contact material plastic coefficient of restitution.
+      /// See sdf description for details.
+      private: double contactMaterialPlasticCoefRestitution;
+
+      /// \brief contact material plastic impact velocity.
+      /// See sdf description for details.
+      private: double contactMaterialPlasticImpactVelocity;
+
+      /// \brief contact material static friction.
+      /// See sdf description for details.
+      private: double contactMaterialStaticFriction;
+
+      /// \brief contact material dynamic friction.
+      /// See sdf description for details.
+      private: double contactMaterialDynamicFriction;
+
+      /// \brief contact material viscous friction.
+      /// See sdf description for details.
+      private: double contactMaterialViscousFriction;
+
+      /// \brief contact impact capture velocity.
+      /// See sdf description for details.
+      private: double contactImpactCaptureVelocity;
+
+      /// \brief contact stiction transition velocity
+      /// See sdf description for details.
+      private: double contactStictionTransitionVelocity;
+
+      private: SimTK::MultibodySystem *dynamicsWorld;
+
+      private: common::Time lastUpdateTime;
+
+      private: double stepTimeDouble;
+
+      /// \brief The type of the solver.
+      /// Not used, just getting ready for optional pgs rigid contacts.
+      private: std::string solverType;
+
+      /// \brief The type of integrator:
+      ///   SimTK::RungeKuttaMersonIntegrator(system)
+      ///   SimTK::RungeKutta3Integrator(system)
+      ///   SimTK::RungeKutta2Integrator(system)
+      ///   SimTK::SemiExplicitEuler2Integrator(system)
+      private: std::string integratorType;
+    };
+  /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyPlaneShape.cc b/gazebo/physics/simbody/SimbodyPlaneShape.cc
new file mode 100644
index 0000000..cef3bc8
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyPlaneShape.cc
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/simbody/SimbodyPlaneShape.hh"
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyCollision.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+/////////////////////////////////////////////////
+SimbodyPlaneShape::SimbodyPlaneShape(CollisionPtr _parent)
+  : PlaneShape(_parent)
+{
+}
+
+/////////////////////////////////////////////////
+SimbodyPlaneShape::~SimbodyPlaneShape()
+{
+}
+
+/////////////////////////////////////////////////
+void SimbodyPlaneShape::SetAltitude(const math::Vector3 &_pos)
+{
+  PlaneShape::SetAltitude(_pos);
+}
+
+/////////////////////////////////////////////////
+void SimbodyPlaneShape::CreatePlane()
+{
+  PlaneShape::CreatePlane();
+  SimbodyCollisionPtr bParent;
+  bParent = boost::dynamic_pointer_cast<SimbodyCollision>(
+      this->collisionParent);
+
+  math::Vector3 n = this->GetNormal();
+
+  // set collision shape
+}
diff --git a/gazebo/physics/simbody/SimbodyPlaneShape.hh b/gazebo/physics/simbody/SimbodyPlaneShape.hh
new file mode 100644
index 0000000..9ff44c6
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyPlaneShape.hh
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_PLANESHAPE_HH_
+#define _SIMBODY_PLANESHAPE_HH_
+
+#include "gazebo/physics/PlaneShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Simbody collision for an infinite plane.
+    class GAZEBO_VISIBLE SimbodyPlaneShape : public PlaneShape
+    {
+      /// \brief Constructor
+      public: SimbodyPlaneShape(CollisionPtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyPlaneShape();
+
+      // Documentation inherited
+      public: virtual void SetAltitude(const math::Vector3 &_pos);
+
+      // Documentation inherited
+      public: virtual void CreatePlane();
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyRayShape.cc b/gazebo/physics/simbody/SimbodyRayShape.cc
new file mode 100644
index 0000000..da4ef6b
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyRayShape.cc
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyCollision.hh"
+#include "gazebo/physics/simbody/SimbodyRayShape.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyRayShape::SimbodyRayShape(PhysicsEnginePtr _physicsEngine)
+  : RayShape(_physicsEngine)
+{
+  this->SetName("Simbody Ray Shape");
+
+  this->physicsEngine =
+    boost::static_pointer_cast<SimbodyPhysics>(_physicsEngine);
+}
+
+//////////////////////////////////////////////////
+SimbodyRayShape::SimbodyRayShape(CollisionPtr _parent)
+    : RayShape(_parent)
+{
+  this->SetName("Simbody Ray Shape");
+  this->physicsEngine = boost::static_pointer_cast<SimbodyPhysics>(
+      this->collisionParent->GetWorld()->GetPhysicsEngine());
+}
+
+//////////////////////////////////////////////////
+SimbodyRayShape::~SimbodyRayShape()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyRayShape::Update()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyRayShape::GetIntersection(double &_dist, std::string &_entity)
+{
+  _dist = 0;
+  _entity = "";
+
+  if (this->physicsEngine)
+  {
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyRayShape::SetPoints(const math::Vector3 &_posStart,
+                                   const math::Vector3 &_posEnd)
+{
+  this->globalStartPos = _posStart;
+  this->globalEndPos = _posEnd;
+}
diff --git a/gazebo/physics/simbody/SimbodyRayShape.hh b/gazebo/physics/simbody/SimbodyRayShape.hh
new file mode 100644
index 0000000..d5d7c53
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyRayShape.hh
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_RAY_SHAPE_HH_
+#define _SIMBODY_RAY_SHAPE_HH_
+
+#include <string>
+#include "gazebo/physics/RayShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Ray shape for simbody
+    class GAZEBO_VISIBLE SimbodyRayShape : public RayShape
+    {
+      /// \brief Constructor.
+      /// \param[in] _physicsEngine Pointer to the physics engine.
+      public: SimbodyRayShape(PhysicsEnginePtr _physicsEngine);
+
+      /// \brief Constructor
+      /// \param[in] _collision Collision the ray is attached to.
+      public: SimbodyRayShape(CollisionPtr _collision);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyRayShape();
+
+      // Documentation inherited
+      public: virtual void Update();
+
+      // Documentation inherited
+      public: virtual void GetIntersection(double &_dist, std::string &_entity);
+
+      // Documentation inherited
+      public: virtual void SetPoints(const math::Vector3 &_posStart,
+                                     const math::Vector3 &_posEnd);
+
+      /// \brief Pointer to the physics engine.
+      private: SimbodyPhysicsPtr physicsEngine;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyScrewJoint.cc b/gazebo/physics/simbody/SimbodyScrewJoint.cc
new file mode 100644
index 0000000..479dfcd
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyScrewJoint.cc
@@ -0,0 +1,523 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <string>
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyScrewJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyScrewJoint::SimbodyScrewJoint(SimTK::MultibodySystem * /*_world*/,
+                                     BasePtr _parent)
+    : ScrewJoint<SimbodyJoint>(_parent)
+{
+  this->physicsInitialized = false;
+}
+
+//////////////////////////////////////////////////
+SimbodyScrewJoint::~SimbodyScrewJoint()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyScrewJoint::Load(sdf::ElementPtr _sdf)
+{
+  ScrewJoint<SimbodyJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+double SimbodyScrewJoint::GetVelocity(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized &&
+        this->simbodyPhysics->simbodyPhysicsInitialized)
+      return this->mobod.getOneU(
+        this->simbodyPhysics->integ->getState(),
+        SimTK::MobilizerUIndex(_index));
+    else
+    {
+      gzdbg << "SimbodyScrewJoint::GetVelocity() simbody not yet initialized, "
+            << "initial velocity should be zero until restart from "
+            << "state has been implemented.\n";
+      return 0.0;
+    }
+  }
+  else
+  {
+    gzerr << "SimbodyScrewJoint::Invalid index for joint, returning NaN\n";
+    return SimTK::NaN;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyScrewJoint::SetVelocity(unsigned int _index, double _rate)
+{
+  if (_index < this->GetAngleCount())
+    this->mobod.setOneU(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      SimTK::MobilizerUIndex(_index), _rate);
+  else
+    gzerr << "SimbodyScrewJoint::SetVelocity _index too large.\n";
+}
+
+//////////////////////////////////////////////////
+void SimbodyScrewJoint::SetAxis(unsigned int /*_index*/,
+    const math::Vector3 &/*_axis*/)
+{
+  // Simbody seems to handle setAxis improperly. It readjust all the pivot
+  // points
+  gzdbg << "SimbodyScrewJoint::SetAxis: setting axis is "
+        << "not yet implemented.  The axis are set during joint construction "
+        << "in SimbodyPhysics.cc for now.\n";
+}
+
+//////////////////////////////////////////////////
+void SimbodyScrewJoint::SetThreadPitch(unsigned int /*_index*/,
+    double _threadPitch)
+{
+  gzdbg << "SimbodyScrewJoint::SetThreadPitch: setting thread pitch is "
+        << "not yet tested.  The pitch are set during joint construction "
+        << "in SimbodyPhysics.cc for now.\n";
+  this->SetThreadPitch(_threadPitch);
+}
+
+//////////////////////////////////////////////////
+void SimbodyScrewJoint::SetThreadPitch(double /*_threadPitch*/)
+{
+  gzerr << "SimbodyScrewJoint::SetThreadPitch: setting thread pitch is "
+        << "not yet tested.  The pitch are set during joint construction "
+        << "in SimbodyPhysics.cc for now.\n";
+  /* need to figure out how to down cast correctly
+  if (this->physicsInitialized &&
+      this->simbodyPhysics->simbodyPhysicsInitialized)
+  {
+    // downcast mobod to screw mobod first
+    // the way pitch is defined in simbody is -1.0 / gazebo thread pitch
+    SimTK::MobilizedBody::Screw screw =
+      static_cast<SimTK::MobilizedBody::Screw>(this->mobod);
+    screw.setDefaultPitch(-1.0/_threadPitch);
+  }
+  else
+  {
+    gzwarn << "SimbodyScrewJoint physics not initialized yet, or failed"
+           << " to initialize. Returning thread pitch from SDF.\n"
+    return this->threadPitch;
+  }
+  */
+}
+
+//////////////////////////////////////////////////
+void SimbodyScrewJoint::SetForceImpl(unsigned int _index, double _torque)
+{
+  if (_index < this->GetAngleCount() &&
+      this->physicsInitialized)
+    this->simbodyPhysics->discreteForces.setOneMobilityForce(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      this->mobod, SimTK::MobilizerUIndex(_index), _torque);
+}
+
+//////////////////////////////////////////////////
+void SimbodyScrewJoint::SetMaxForce(unsigned int /*_index*/, double /*_force*/)
+{
+  gzdbg << "SimbodyScrewJoint::SetMaxForce: doesn't make sense in simbody...\n";
+}
+
+//////////////////////////////////////////////////
+double SimbodyScrewJoint::GetMaxForce(unsigned int /*index*/)
+{
+  gzdbg << "SimbodyScrewJoint::GetMaxForce: doesn't make sense in simbody...\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyScrewJoint::GetGlobalAxis(unsigned int _index) const
+{
+  if (this->simbodyPhysics &&
+      this->simbodyPhysics->simbodyPhysicsStepped &&
+      _index < this->GetAngleCount())
+  {
+    const SimTK::Transform &X_OM = this->mobod.getOutboardFrame(
+      this->simbodyPhysics->integ->getState());
+
+    // express Z-axis of X_OM in world frame
+    SimTK::Vec3 z_W(this->mobod.expressVectorInGroundFrame(
+      this->simbodyPhysics->integ->getState(), X_OM.z()));
+
+    return SimbodyPhysics::Vec3ToVector3(z_W);
+  }
+  else
+  {
+    if (_index >= this->GetAngleCount())
+    {
+      gzerr << "index out of bound\n";
+      return math::Vector3(SimTK::NaN, SimTK::NaN, SimTK::NaN);
+    }
+    else
+    {
+      gzdbg << "SimbodyScrewJoint::GetGlobalAxis() sibmody physics"
+            << " engine not initialized yet, "
+            << "use local axis and initial pose to compute "
+            << "global axis.\n";
+      // if local axis specified in model frame (to be changed)
+      // switch to code below if issue #494 is to be addressed
+      return this->model->GetWorldPose().rot.RotateVector(
+        this->GetLocalAxis(_index));
+
+      // if local axis specified in joint frame (Issue #494)
+      // Remember to remove include of Model.hh when switching.
+      // if (this->childLink)
+      // {
+      //   math::Pose jointPose =
+      //    this->anchorPose + this->childLink->GetWorldPose();
+      //   return jointPose.rot.RotateVector(this->GetLocalAxis(_index));
+      // }
+      // else
+      // {
+      //   gzerr << "Joint [" << this->GetName() << "] missing child link.\n";
+      //   return math::Vector3(SimTK::NaN, SimTK::NaN, SimTK::NaN);
+      // }
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyScrewJoint::GetAngleImpl(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized &&
+        this->simbodyPhysics->simbodyPhysicsInitialized)
+    {
+      return math::Angle(this->mobod.getOneQ(
+        this->simbodyPhysics->integ->getState(), _index));
+    }
+    else
+    {
+      gzdbg << "SimbodyScrewJoint::GetAngleImpl() simbody not yet initialized, "
+            << "initial angle should be zero until <initial_angle> "
+            << "is implemented.\n";
+      return math::Angle(0.0);
+    }
+  }
+  else
+  {
+    gzerr << "index out of bound\n";
+    return math::Angle(SimTK::NaN);
+  }
+}
+
+//////////////////////////////////////////////////
+double SimbodyScrewJoint::GetThreadPitch(unsigned int /*_index*/)
+{
+  return this->GetThreadPitch();
+}
+
+//////////////////////////////////////////////////
+double SimbodyScrewJoint::GetThreadPitch()
+{
+  if (this->physicsInitialized &&
+      this->simbodyPhysics->simbodyPhysicsInitialized)
+  {
+    // downcast mobod to screw mobod first
+    // the way pitch is defined in simbody is -1.0 / gazebo thread pitch
+    return
+      -1.0/SimTK::MobilizedBody::Screw::downcast(this->mobod).getDefaultPitch();
+  }
+  else
+  {
+    gzwarn << "SimbodyScrewJoint physics not initialized yet, or failed"
+           << " to initialize. Returning thread pitch from SDF.\n";
+    return this->threadPitch;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyScrewJoint::SetAttribute(const std::string &_key,
+  unsigned int _index,
+  const boost::any &_value)
+{
+  this->SetParam(_key, _index, _value);
+}
+
+//////////////////////////////////////////////////
+bool SimbodyScrewJoint::SetParam(const std::string &_key,
+  unsigned int _index,
+  const boost::any &_value)
+{
+  if (_key  == "thread_pitch")
+  {
+    try
+    {
+      this->threadPitch = boost::any_cast<double>(_value);
+    }
+    catch(const boost::bad_any_cast &e)
+    {
+      gzerr << "boost any_cast error:" << e.what() << "\n";
+      return false;
+    }
+  }
+  else
+    return SimbodyJoint::SetParam(_key, _index, _value);
+
+  return true;
+}
+
+//////////////////////////////////////////////////
+double SimbodyScrewJoint::GetAttribute(const std::string &_key,
+  unsigned int _index)
+{
+  return this->GetParam(_key, _index);
+}
+
+//////////////////////////////////////////////////
+double SimbodyScrewJoint::GetParam(const std::string &_key,
+  unsigned int _index)
+{
+  if (_key  == "thread_pitch")
+    return this->threadPitch;
+  else
+    return SimbodyJoint::GetParam(_key, _index);
+}
+
+//////////////////////////////////////////////////
+bool SimbodyScrewJoint::SetHighStop(
+  unsigned int _index, const math::Angle &_angle)
+{
+  Joint::SetHighStop(_index, _angle);
+
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized)
+    {
+      if (_index == 0)
+      {
+        // angular limit is specified
+        this->limitForce[0].setBounds(
+          this->simbodyPhysics->integ->updAdvancedState(),
+          this->GetLowStop(_index).Radian(), _angle.Radian());
+      }
+      else if (_index == 1)
+      {
+        double tp = this->GetThreadPitch();
+        if (math::equal(tp, 0.0))
+        {
+          gzerr << "thread pitch should not be zero (joint is a slider?)"
+                << " using thread pitch = 1.0e6\n";
+          tp = 1.0e6;
+        }
+        // onlye angular limiting force element is added for
+        // screw joints in SimbodyPhysics.cc
+        if (tp > 0)
+        {
+          // incoming _angle is the linear dof, which is _angle / thread_pitch.
+          // convert linear limit to angular limit
+          double upper = _angle.Radian() / tp;
+          this->limitForce[0].setBounds(
+            this->simbodyPhysics->integ->updAdvancedState(),
+            this->GetLowStop(_index).Radian(), upper);
+        }
+        else
+        {
+          // incoming _angle is the linear dof, which is _angle / thread_pitch.
+          // convert linear limit to angular limit
+          // tp is negative, this is actually upper linear limit, or the
+          // lower angular limit.
+          double lower = _angle.Radian() / tp;
+          this->limitForce[0].setBounds(
+            this->simbodyPhysics->integ->updAdvancedState(),
+            lower, this->GetHighStop(_index).Radian());
+        }
+      }
+      else
+      {
+        gzerr << "Should never be here. Joint index invalid limit not set.\n";
+        return false;
+      }
+    }
+    else
+    {
+      gzerr << "SetHighStop: State not initialized, SetHighStop failed.\n";
+      return false;
+    }
+  }
+  else
+  {
+    gzerr << "SetHighStop: index out of bounds.\n";
+    return false;
+  }
+  return true;
+}
+
+//////////////////////////////////////////////////
+bool SimbodyScrewJoint::SetLowStop(
+  unsigned int _index, const math::Angle &_angle)
+{
+  Joint::SetLowStop(_index, _angle);
+
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized)
+    {
+      if (_index == 0)
+      {
+        // angular limit is specified
+        this->limitForce[0].setBounds(
+          this->simbodyPhysics->integ->updAdvancedState(),
+          _angle.Radian(),
+          this->GetHighStop(_index).Radian());
+      }
+      else if (_index == 1)
+      {
+        double tp = this->GetThreadPitch();
+        if (math::equal(tp, 0.0))
+        {
+          gzerr << "thread pitch should not be zero (joint is a slider?)"
+                << " using thread pitch = 1.0e6\n";
+          tp = 1.0e6;
+        }
+        // onlye angular limiting force element is added for
+        // screw joints in SimbodyPhysics.cc
+        if (tp > 0)
+        {
+          // incoming _angle is the linear dof, which is _angle / thread_pitch.
+          // convert linear limit to angular limit
+          double lower = _angle.Radian() / tp;
+          this->limitForce[0].setBounds(
+            this->simbodyPhysics->integ->updAdvancedState(),
+            lower, this->GetHighStop(_index).Radian());
+        }
+        else
+        {
+          // incoming _angle is the linear dof, which is _angle / thread_pitch.
+          // convert linear limit to angular limit
+          // tp is negative, this is actually lower linear limit, or the
+          // upper angular limit.
+          double upper = _angle.Radian() / tp;
+          this->limitForce[0].setBounds(
+            this->simbodyPhysics->integ->updAdvancedState(),
+            this->GetHighStop(_index).Radian(), upper);
+        }
+      }
+      else
+      {
+        gzerr << "Should never be here. Joint index invalid limit not set.\n";
+        return false;
+      }
+    }
+    else
+    {
+      gzerr << "SetLowStop: State not initialized, SetLowStop failed.\n";
+      return false;
+    }
+  }
+  else
+  {
+    gzerr << "SetLowStop: index out of bounds.\n";
+    return false;
+  }
+  return true;
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyScrewJoint::GetHighStop(unsigned int _index)
+{
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get high stop\n";
+    /// \TODO: should return NaN
+    return math::Angle(0.0);
+  }
+  else if (_index == 0)
+  {
+    return this->GetUpperLimit(0);
+  }
+  else if (_index == 1)
+  {
+    double tp = this->GetThreadPitch();
+    if (math::equal(tp, 0.0))
+    {
+      gzerr << "thread pitch should not be zero (joint is a slider?)"
+            << " using thread pitch = 1.0e6\n";
+      tp = 1.0e6;
+    }
+    if (tp > 0)
+    {
+      return this->GetUpperLimit(0) / tp;
+    }
+    else
+    {
+      return this->GetLowerLimit(0) / tp;
+    }
+  }
+  else
+  {
+    gzerr << "Should not be here in code, GetAngleCount > 2?\n";
+    /// \TODO: should return NaN
+    return math::Angle(0.0);
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyScrewJoint::GetLowStop(unsigned int _index)
+{
+  if (_index >= this->GetAngleCount())
+  {
+    gzerr << "Invalid joint index [" << _index
+          << "] when trying to get low stop\n";
+    /// \TODO: should return NaN
+    return math::Angle(0.0);
+  }
+  else if (_index == 0)
+  {
+    return this->GetLowerLimit(0);
+  }
+  else if (_index == 1)
+  {
+    double tp = this->GetThreadPitch();
+    if (math::equal(tp, 0.0))
+    {
+      gzerr << "thread pitch should not be zero (joint is a slider?)"
+            << " using thread pitch = 1.0e6\n";
+      tp = 1.0e6;
+    }
+    if (tp > 0)
+    {
+      return this->GetLowerLimit(0) / tp;
+    }
+    else
+    {
+      return this->GetUpperLimit(0) / tp;
+    }
+  }
+  else
+  {
+    gzerr << "Should not be here in code, GetAngleCount > 2?\n";
+    /// \TODO: should return NaN
+    return math::Angle(0.0);
+  }
+}
diff --git a/gazebo/physics/simbody/SimbodyScrewJoint.hh b/gazebo/physics/simbody/SimbodyScrewJoint.hh
new file mode 100644
index 0000000..095bca7
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyScrewJoint.hh
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_SCREWJOINT_HH_
+#define _SIMBODY_SCREWJOINT_HH_
+
+#include <string>
+#include "gazebo/physics/simbody/SimbodyJoint.hh"
+#include "gazebo/physics/ScrewJoint.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief A screw joint
+    class GAZEBO_VISIBLE SimbodyScrewJoint : public ScrewJoint<SimbodyJoint>
+    {
+      /// \brief Constructor
+      /// \param[in] _world Pointer to the Simbody world.
+      /// \param[in] _parent Parent of the screw joint.
+      public: SimbodyScrewJoint(SimTK::MultibodySystem *_world,
+                  BasePtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodyScrewJoint();
+
+      // Documentation inherited.
+      protected: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited.
+      public: virtual bool SetHighStop(unsigned int _index,
+                                       const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual bool SetLowStop(unsigned int _index,
+                                      const math::Angle &_angle);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetHighStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Angle GetLowStop(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual void SetThreadPitch(unsigned int _index,
+                  double _threadPitch);
+
+      // Documentation inherited.
+      public: virtual void SetThreadPitch(double _threadPitch);
+
+      // Documentation inherited.
+      public: virtual double GetThreadPitch(unsigned int /*_index*/);
+
+      // Documentation inherited.
+      public: virtual double GetThreadPitch();
+
+      // Documentation inherited.
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _angle);
+
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
+
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual bool SetParam(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value);
+
+      // Documentation inherited.
+      public: virtual void SetAttribute(const std::string &_key,
+                                        unsigned int _index,
+                                        const boost::any &_value)
+                                        GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      public: virtual double GetParam(const std::string &_key,
+                                                unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual double GetAttribute(const std::string &_key,
+                unsigned int _index) GAZEBO_DEPRECATED(3.0);
+
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _force);
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodySliderJoint.cc b/gazebo/physics/simbody/SimbodySliderJoint.cc
new file mode 100644
index 0000000..2ef1c24
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodySliderJoint.cc
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/simbody/simbody_inc.h"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/physics/simbody/SimbodySliderJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodySliderJoint::SimbodySliderJoint(SimTK::MultibodySystem * /*_world*/,
+                                     BasePtr _parent)
+    : SliderJoint<SimbodyJoint>(_parent)
+{
+  this->physicsInitialized = false;
+}
+
+//////////////////////////////////////////////////
+SimbodySliderJoint::~SimbodySliderJoint()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodySliderJoint::Load(sdf::ElementPtr _sdf)
+{
+  SliderJoint<SimbodyJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void SimbodySliderJoint::SetAxis(unsigned int /*_index*/,
+    const math::Vector3 &/*_axis*/)
+{
+  // Simbody seems to handle setAxis improperly. It readjust all the pivot
+  // points
+  gzdbg << "SetAxis Not implemented...\n";
+}
+
+//////////////////////////////////////////////////
+void SimbodySliderJoint::SetVelocity(unsigned int _index, double _rate)
+{
+  if (_index < this->GetAngleCount())
+    this->mobod.setOneU(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      SimTK::MobilizerUIndex(_index), _rate);
+  else
+    gzerr << "SetVelocity _index too large.\n";
+}
+
+//////////////////////////////////////////////////
+double SimbodySliderJoint::GetVelocity(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+  {
+    if (this->simbodyPhysics->simbodyPhysicsInitialized)
+      return this->mobod.getOneU(
+        this->simbodyPhysics->integ->getState(),
+        SimTK::MobilizerUIndex(_index));
+    else
+    {
+      gzdbg << "Simbody::GetVelocity() simbody not yet initialized, "
+            << "initial velocity should be zero until restart from "
+            << "state has been implemented.\n";
+      return 0.0;
+    }
+  }
+  else
+  {
+    gzerr << "Invalid index for joint, returning NaN\n";
+    return SimTK::NaN;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodySliderJoint::SetMaxForce(unsigned int /*_index*/, double /*_t*/)
+{
+  gzdbg << "SetMaxForce doesn't make sense in simbody...\n";
+}
+
+//////////////////////////////////////////////////
+double SimbodySliderJoint::GetMaxForce(unsigned int /*_index*/)
+{
+  gzdbg << "GetMaxForce doesn't make sense in simbody...\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+void SimbodySliderJoint::SetForceImpl(unsigned int _index, double _torque)
+{
+  if (_index < this->GetAngleCount())
+    this->simbodyPhysics->discreteForces.setOneMobilityForce(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      this->mobod, SimTK::MobilizerUIndex(_index), _torque);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodySliderJoint::GetGlobalAxis(unsigned int _index) const
+{
+  if (this->simbodyPhysics->simbodyPhysicsStepped &&
+      _index < this->GetAngleCount())
+  {
+    const SimTK::Transform &X_OM = this->mobod.getOutboardFrame(
+      this->simbodyPhysics->integ->getState());
+
+    // express Z-axis of X_OM in world frame
+    SimTK::Vec3 z_W(this->mobod.expressVectorInGroundFrame(
+      this->simbodyPhysics->integ->getState(), X_OM.z()));
+
+    return SimbodyPhysics::Vec3ToVector3(z_W);
+  }
+  else
+  {
+    if (_index >= this->GetAngleCount())
+    {
+      gzerr << "index out of bound\n";
+      return math::Vector3(SimTK::NaN, SimTK::NaN, SimTK::NaN);
+    }
+    else
+    {
+      gzdbg << "Simbody::GetGlobalAxis() sibmody physics"
+            << " engine not initialized yet, "
+            << "use local axis and initial pose to compute "
+            << "global axis.\n";
+
+      // if local axis specified in model frame (to be changed)
+      // switch to code below if issue #494 is to be addressed
+      return this->model->GetWorldPose().rot.RotateVector(
+        this->GetLocalAxis(_index));
+
+      // if local axis specified in joint frame (Issue #494)
+      // if (this->childLink)
+      // {
+      //   math::Pose jointPose =
+      //    this->anchorPose + this->childLink->GetWorldPose();
+      //   return jointPose.rot.RotateVector(this->GetLocalAxis(_index));
+      // }
+      // else
+      // {
+      //   gzerr << "Joint [" << this->GetName() << "] missing child link.\n";
+      //   return math::Vector3(SimTK::NaN, SimTK::NaN, SimTK::NaN);
+      // }
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodySliderJoint::GetAngleImpl(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+  {
+    if (this->simbodyPhysics->simbodyPhysicsInitialized)
+      return math::Angle(this->mobod.getOneQ(
+        this->simbodyPhysics->integ->getState(), _index));
+    else
+    {
+      gzdbg << "Simbody::GetAngleImpl() simbody not yet initialized, "
+            << "initial angle should be zero until <initial_angle> "
+            << "is implemented.\n";
+      return math::Angle(0.0);
+    }
+  }
+  else
+  {
+    gzerr << "index out of bound\n";
+    return math::Angle(SimTK::NaN);
+  }
+}
diff --git a/gazebo/physics/simbody/SimbodySliderJoint.hh b/gazebo/physics/simbody/SimbodySliderJoint.hh
new file mode 100644
index 0000000..f0be9f4
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodySliderJoint.hh
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_SLIDERJOINT_HH_
+#define _SIMBODY_SLIDERJOINT_HH_
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/physics/simbody/SimbodyJoint.hh"
+#include "gazebo/physics/SliderJoint.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief A slider joint
+    class GAZEBO_VISIBLE SimbodySliderJoint : public SliderJoint<SimbodyJoint>
+    {
+      /// \brief Constructor
+      /// \param[in] _world Pointer to the Simbody world.
+      /// \param[in] _parent Parent of the screw joint.
+      public: SimbodySliderJoint(SimTK::MultibodySystem *world,
+                                 BasePtr _parent);
+
+      /// \brief Destructor
+      public: virtual ~SimbodySliderJoint();
+
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _rate);
+
+      // Documentation inherited.
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
+
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited.
+      protected: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _force);
+    };
+
+  /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodySphereShape.hh b/gazebo/physics/simbody/SimbodySphereShape.hh
new file mode 100644
index 0000000..cf0b76f
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodySphereShape.hh
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_SPHERE_SHAPE_HH_
+#define _SIMBODY_SPHERE_SHAPE_HH_
+
+#include "gazebo/physics/SphereShape.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief Simbody sphere collision
+    class GAZEBO_VISIBLE SimbodySphereShape : public SphereShape
+    {
+      /// \brief Constructor
+      /// \param[in] _parent Collision parent pointer
+      public: SimbodySphereShape(CollisionPtr _parent) : SphereShape(_parent) {}
+
+      /// \brief Destructor
+      public: virtual ~SimbodySphereShape() {}
+
+      // Documentation inherited.
+      public: virtual void SetRadius(double _radius)
+              {
+                if (_radius < 0)
+                {
+                  gzerr << "Sphere shape does not support negative radius\n";
+                  return;
+                }
+                if (math::equal(_radius, 0.0))
+                {
+                  // Warn user, but still create shape with very small value
+                  // otherwise later resize operations using setLocalScaling
+                  // will not be possible
+                  gzwarn << "Setting sphere shape's radius to zero \n";
+                  _radius = 1e-4;
+                }
+
+                SphereShape::SetRadius(_radius);
+                SimbodyCollisionPtr bParent;
+                bParent = boost::dynamic_pointer_cast<SimbodyCollision>(
+                    this->collisionParent);
+
+                // set collision shape
+              }
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/SimbodyTypes.hh b/gazebo/physics/simbody/SimbodyTypes.hh
new file mode 100644
index 0000000..840816d
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyTypes.hh
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/shared_ptr.hpp>
+#include "gazebo/util/system.hh"
+
+/// \file
+/// \ingroup gazebo_physics
+/// \ingroup gazebo_physics_simbody
+/// \brief Simbody wrapper forward declarations and typedefs
+namespace gazebo
+{
+  namespace physics
+  {
+    class SimbodyCollision;
+    class SimbodyLink;
+    class SimbodyModel;
+    class SimbodyPhysics;
+    class SimbodyRayShape;
+
+    /// \def SimbodyPhysicsPtr
+    /// \brief Boost shared point to SimbodyPhysics
+    typedef boost::shared_ptr<SimbodyPhysics> SimbodyPhysicsPtr;
+
+    /// \def SimbodyCollisionPtr
+    /// \brief Boost shared point to SimbodyCollision
+    typedef boost::shared_ptr<SimbodyCollision> SimbodyCollisionPtr;
+
+    /// \def SimbodyLinkPtr
+    /// \brief Boost shared point to SimbodyLink
+    typedef boost::shared_ptr<SimbodyLink> SimbodyLinkPtr;
+
+    /// \def SimbodyModelPtr
+    /// \brief Boost shared point to SimbodyModel
+    typedef boost::shared_ptr<SimbodyModel> SimbodyModelPtr;
+
+    /// \def SimbodyRayShapePtr
+    /// \brief Boost shared point to SimbodyRayShape
+    typedef boost::shared_ptr<SimbodyRayShape> SimbodyRayShapePtr;
+  }
+}
diff --git a/gazebo/physics/simbody/SimbodyUniversalJoint.cc b/gazebo/physics/simbody/SimbodyUniversalJoint.cc
new file mode 100644
index 0000000..ce9c707
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyUniversalJoint.cc
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/simbody/SimbodyLink.hh"
+#include "gazebo/physics/simbody/SimbodyTypes.hh"
+#include "gazebo/physics/simbody/SimbodyUniversalJoint.hh"
+
+using namespace gazebo;
+using namespace physics;
+
+//////////////////////////////////////////////////
+SimbodyUniversalJoint::SimbodyUniversalJoint(SimTK::MultibodySystem* /*_world*/,
+  BasePtr _parent) : UniversalJoint<SimbodyJoint>(_parent)
+{
+  this->physicsInitialized = false;
+}
+
+//////////////////////////////////////////////////
+SimbodyUniversalJoint::~SimbodyUniversalJoint()
+{
+}
+
+//////////////////////////////////////////////////
+void SimbodyUniversalJoint::Load(sdf::ElementPtr _sdf)
+{
+  UniversalJoint<SimbodyJoint>::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyUniversalJoint::GetAnchor(unsigned int /*_index*/) const
+{
+  return this->anchorPos;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyUniversalJoint::GetAxis(unsigned int /*_index*/) const
+{
+  return math::Vector3();
+}
+
+//////////////////////////////////////////////////
+void SimbodyUniversalJoint::SetAxis(unsigned int /*_index*/,
+                                   const math::Vector3 &/*_axis*/)
+{
+  /// Universal Joint are built in SimbodyPhysics.cc, so this init block
+  /// actually does nothing.
+  gzdbg << "SetAxis: setting axis is not yet implemented. The axes are set "
+        << "during joint construction in SimbodyPhyiscs.cc for now.\n";
+}
+
+
+//////////////////////////////////////////////////
+double SimbodyUniversalJoint::GetVelocity(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized &&
+        this->simbodyPhysics->simbodyPhysicsInitialized)
+    {
+      return this->mobod.getOneU(
+        this->simbodyPhysics->integ->getState(),
+        SimTK::MobilizerUIndex(_index));
+    }
+    else
+    {
+      gzdbg << "GetVelocity() simbody not yet initialized, "
+            << "initial velocity should be zero until restart from "
+            << "state has been implemented.\n";
+      return 0.0;
+    }
+  }
+  else
+  {
+    gzerr << "Invalid index for joint, returning NaN\n";
+    return SimTK::NaN;
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyUniversalJoint::SetVelocity(unsigned int _index,
+    double _rate)
+{
+  if (_index < this->GetAngleCount())
+  {
+    this->mobod.setOneU(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      SimTK::MobilizerUIndex(_index), _rate);
+  }
+  else
+  {
+    gzerr << "SetVelocity _index too large.\n";
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyUniversalJoint::SetForceImpl(unsigned int _index,
+    double _torque)
+{
+  if (_index < this->GetAngleCount() && this->physicsInitialized)
+  {
+    this->simbodyPhysics->discreteForces.setOneMobilityForce(
+      this->simbodyPhysics->integ->updAdvancedState(),
+      this->mobod, SimTK::MobilizerUIndex(_index), _torque);
+  }
+}
+
+//////////////////////////////////////////////////
+void SimbodyUniversalJoint::SetMaxForce(unsigned int /*_index*/, double /*_t*/)
+{
+  gzerr << "Not implemented\n";
+}
+
+//////////////////////////////////////////////////
+double SimbodyUniversalJoint::GetMaxForce(unsigned int /*_index*/)
+{
+  gzerr << "Not implemented\n";
+  return 0;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 SimbodyUniversalJoint::GetGlobalAxis(
+    unsigned int _index) const
+{
+  if (this->simbodyPhysics &&
+      this->simbodyPhysics->simbodyPhysicsStepped &&
+      _index < this->GetAngleCount())
+  {
+    if (_index == UniversalJoint::AXIS_PARENT)
+    {
+      // express X-axis of X_IF in world frame
+      const SimTK::Transform &X_IF = this->mobod.getInboardFrame(
+        this->simbodyPhysics->integ->getState());
+
+      SimTK::Vec3 x_W(
+        this->mobod.getParentMobilizedBody().expressVectorInGroundFrame(
+        this->simbodyPhysics->integ->getState(), X_IF.x()));
+
+      return SimbodyPhysics::Vec3ToVector3(x_W);
+    }
+    else if (_index == UniversalJoint::AXIS_CHILD)
+    {
+      // express Y-axis of X_OM in world frame
+      const SimTK::Transform &X_OM = this->mobod.getOutboardFrame(
+        this->simbodyPhysics->integ->getState());
+
+      SimTK::Vec3 y_W(
+        this->mobod.expressVectorInGroundFrame(
+        this->simbodyPhysics->integ->getState(), X_OM.y()));
+
+      return SimbodyPhysics::Vec3ToVector3(y_W);
+    }
+    else
+    {
+      gzerr << "GetGlobalAxis: internal error, GetAngleCount < 0.\n";
+      return math::Vector3(SimTK::NaN, SimTK::NaN, SimTK::NaN);
+    }
+  }
+  else
+  {
+    if (_index >= this->GetAngleCount())
+    {
+      gzerr << "index out of bound\n";
+      return math::Vector3(SimTK::NaN, SimTK::NaN, SimTK::NaN);
+    }
+    else
+    {
+      gzdbg << "GetGlobalAxis() sibmody physics engine not yet initialized, "
+            << "use local axis and initial pose to compute "
+            << "global axis.\n";
+      // if local axis specified in model frame (to be changed)
+      // switch to code below if issue #494 is to be addressed
+      return this->model->GetWorldPose().rot.RotateVector(
+        this->GetLocalAxis(_index));
+
+      // if local axis specified in joint frame (Issue #494)
+      // Remember to remove include of Model.hh when switching.
+      // if (this->childLink)
+      // {
+      //   math::Pose jointPose =
+      //    this->anchorPose + this->childLink->GetWorldPose();
+      //   return jointPose.rot.RotateVector(this->GetLocalAxis(_index));
+      // }
+      // else
+      // {
+      //   gzerr << "Joint [" << this->GetName() << "] missing child link.\n";
+      //   return math::Vector3(SimTK::NaN, SimTK::NaN, SimTK::NaN);
+      // }
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+math::Angle SimbodyUniversalJoint::GetAngleImpl(unsigned int _index) const
+{
+  if (_index < this->GetAngleCount())
+  {
+    if (this->physicsInitialized &&
+        this->simbodyPhysics->simbodyPhysicsInitialized)
+      return math::Angle(this->mobod.getOneQ(
+        this->simbodyPhysics->integ->getState(), _index));
+    else
+    {
+      gzdbg << "GetAngleImpl(): simbody not yet initialized, "
+            << "initial angle should be zero until <initial_angle> "
+            << "is implemented.\n";
+      return math::Angle(0.0);
+    }
+  }
+  else
+  {
+    gzerr << "index out of bound\n";
+    return math::Angle(SimTK::NaN);
+  }
+}
diff --git a/gazebo/physics/simbody/SimbodyUniversalJoint.hh b/gazebo/physics/simbody/SimbodyUniversalJoint.hh
new file mode 100644
index 0000000..729c952
--- /dev/null
+++ b/gazebo/physics/simbody/SimbodyUniversalJoint.hh
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_UNIVERSAL_JOINT_HH_
+#define _SIMBODY_UNIVERSAL_JOINT_HH_
+
+#include "gazebo/physics/UniversalJoint.hh"
+#include "gazebo/physics/simbody/SimbodyJoint.hh"
+#include "gazebo/physics/simbody/SimbodyPhysics.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace physics
+  {
+    /// \ingroup gazebo_physics
+    /// \addtogroup gazebo_physics_simbody Simbody Physics
+    /// \{
+
+    /// \brief A simbody universal joint class
+    class GAZEBO_VISIBLE SimbodyUniversalJoint
+      : public UniversalJoint<SimbodyJoint>
+    {
+      /// \brief Constructor
+      /// \param[in] _world Pointer to the Simbody world.
+      /// \param[in] _parent Parent of the screw joint.
+      public: SimbodyUniversalJoint(SimTK::MultibodySystem *_world,
+                                    BasePtr _parent);
+
+      /// \brief Destuctor
+      public: virtual ~SimbodyUniversalJoint();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAnchor(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetAxis(unsigned int _index,
+                  const math::Vector3 &_axis);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetAxis(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetVelocity(unsigned int _index, double _rate);
+
+      // Documentation inherited.
+      public: virtual double GetVelocity(unsigned int _index) const;
+
+      // Documentation inherited.
+      public: virtual void SetMaxForce(unsigned int _index, double _t);
+
+      // Documentation inherited.
+      public: virtual double GetMaxForce(unsigned int _index);
+
+      // Documentation inherited.
+      public: virtual math::Vector3 GetGlobalAxis(unsigned int _index) const;
+
+      // Documentation inherited.
+      protected: virtual math::Angle GetAngleImpl(unsigned int _index) const;
+
+      // Documentation inherited.
+      protected: virtual void SetForceImpl(unsigned int _index, double _torque);
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/physics/simbody/simbody_inc.h b/gazebo/physics/simbody/simbody_inc.h
new file mode 100644
index 0000000..ad26053
--- /dev/null
+++ b/gazebo/physics/simbody/simbody_inc.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SIMBODY_INC_H_
+#define _SIMBODY_INC_H_
+
+#pragma GCC system_header
+#include <Simbody.h>
+// #include <SimTKcommon.h>
+// #include <SimTKsimbody.h>
+// #include <SimTKmath.h>
+// using namespace SimTK;
+
+#endif
diff --git a/gazebo/rendering/ArrowVisual.cc b/gazebo/rendering/ArrowVisual.cc
index ebdba4e..e6d930c 100644
--- a/gazebo/rendering/ArrowVisual.cc
+++ b/gazebo/rendering/ArrowVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,22 +18,26 @@
  * Author: Nate Koenig
  */
 
-#include "common/MeshManager.hh"
+#include "gazebo/common/MeshManager.hh"
 
-#include "rendering/ogre_gazebo.h"
-#include "rendering/Scene.hh"
-#include "rendering/ArrowVisual.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/ArrowVisualPrivate.hh"
+#include "gazebo/rendering/ArrowVisual.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
 /////////////////////////////////////////////////
 ArrowVisual::ArrowVisual(const std::string &_name, VisualPtr _vis)
-  : Visual(_name, _vis, false)
+  : Visual(*new ArrowVisualPrivate, _name, _vis, false)
 {
-  this->headNode = NULL;
-  this->shaftNode = NULL;
-  this->rotationNode = NULL;
+  ArrowVisualPrivate *dPtr =
+      reinterpret_cast<ArrowVisualPrivate *>(this->dataPtr);
+
+  dPtr->headNode = NULL;
+  dPtr->shaftNode = NULL;
+  dPtr->rotationNode = NULL;
 }
 
 /////////////////////////////////////////////////
@@ -46,27 +50,32 @@ void ArrowVisual::Load()
 {
   Visual::Load();
 
+  ArrowVisualPrivate *dPtr =
+      reinterpret_cast<ArrowVisualPrivate *>(this->dataPtr);
+
   // Make sure the meshes are in Ogre
   this->InsertMesh("axis_shaft");
   this->InsertMesh("axis_head");
 
   Ogre::MovableObject *shaftObj =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
+    (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
           this->GetName()+"__SHAFT__", "axis_shaft"));
 
   Ogre::MovableObject *headObj =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
+    (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
           this->GetName()+"__HEAD__", "axis_head"));
 
-  this->shaftNode =
-    this->sceneNode->createChildSceneNode(this->GetName() + "_SHAFT");
-  this->shaftNode->attachObject(shaftObj);
-  this->shaftNode->setPosition(0, 0, 0.1);
+  dPtr->shaftNode =
+      dPtr->sceneNode->createChildSceneNode(
+      this->GetName() + "_SHAFT");
+  dPtr->shaftNode->attachObject(shaftObj);
+  dPtr->shaftNode->setPosition(0, 0, 0.1);
 
-  this->headNode =
-    this->sceneNode->createChildSceneNode(this->GetName() + "_HEAD");
-  this->headNode->attachObject(headObj);
-  this->headNode->setPosition(0, 0, 0.24);
+  dPtr->headNode =
+      dPtr->sceneNode->createChildSceneNode(
+      this->GetName() + "_HEAD");
+  dPtr->headNode->attachObject(headObj);
+  dPtr->headNode->setPosition(0, 0, 0.24);
 
   this->SetVisibilityFlags(GZ_VISIBILITY_GUI);
 }
@@ -74,19 +83,23 @@ void ArrowVisual::Load()
 /////////////////////////////////////////////////
 void ArrowVisual::ShowRotation()
 {
+  ArrowVisualPrivate *dPtr =
+      reinterpret_cast<ArrowVisualPrivate *>(this->dataPtr);
+
   common::MeshManager::Instance()->CreateTube("rotation_tube",
       0.035, 0.04, 0.01, 1, 32);
   this->InsertMesh("rotation_tube");
 
   Ogre::MovableObject *rotationObj =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
+    (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
           this->GetName()+"__ROTATION__", "rotation_tube"));
   rotationObj->setVisibilityFlags(GZ_VISIBILITY_GUI);
   ((Ogre::Entity*)rotationObj)->setMaterialName(this->GetMaterialName());
 
-  this->rotationNode =
-    this->sceneNode->createChildSceneNode(this->GetName() + "_ROTATION");
-  this->rotationNode->attachObject(rotationObj);
-  this->rotationNode->setPosition(0, 0, 0.24);
-  this->rotationNode->setVisible(this->GetVisible());
+  dPtr->rotationNode =
+      dPtr->sceneNode->createChildSceneNode(
+      this->GetName() + "_ROTATION");
+  dPtr->rotationNode->attachObject(rotationObj);
+  dPtr->rotationNode->setPosition(0, 0, 0.24);
+  dPtr->rotationNode->setVisible(this->GetVisible());
 }
diff --git a/gazebo/rendering/ArrowVisual.hh b/gazebo/rendering/ArrowVisual.hh
index 57f6107..6750f18 100644
--- a/gazebo/rendering/ArrowVisual.hh
+++ b/gazebo/rendering/ArrowVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,20 +14,13 @@
  * limitations under the License.
  *
 */
-/* Desc: Arrow Visualization Class
- * Author: Nate Koenig
- */
 
 #ifndef _ARROWVISUAL_HH_
 #define _ARROWVISUAL_HH_
 
 #include <string>
-#include "rendering/Visual.hh"
-
-namespace ogre
-{
-  class SceneNode;
-}
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -38,7 +31,7 @@ namespace gazebo
 
     /// \class ArrowVisual ArrowVisual.hh rendering/rendering.hh
     /// \brief Basic arrow visualization
-    class ArrowVisual : public Visual
+    class GAZEBO_VISIBLE ArrowVisual : public Visual
     {
       /// \brief Constructor
       /// \param[in] _name Name of the arrow visual
@@ -53,10 +46,6 @@ namespace gazebo
 
       /// \brief Show the rotation of the visual
       public: void ShowRotation();
-
-      private: Ogre::SceneNode *headNode;
-      private: Ogre::SceneNode *shaftNode;
-      private: Ogre::SceneNode *rotationNode;
     };
     /// \}
   }
diff --git a/gazebo/rendering/ArrowVisualPrivate.hh b/gazebo/rendering/ArrowVisualPrivate.hh
new file mode 100644
index 0000000..a5ff815
--- /dev/null
+++ b/gazebo/rendering/ArrowVisualPrivate.hh
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _ARROWVISUAL_PRIVATE_HH_
+#define _ARROWVISUAL_PRIVATE_HH_
+
+#include <string>
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace ogre
+{
+  class SceneNode;
+}
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the Arrow Visual class
+    class ArrowVisualPrivate : public VisualPrivate
+    {
+      public: Ogre::SceneNode *headNode;
+      public: Ogre::SceneNode *shaftNode;
+      public: Ogre::SceneNode *rotationNode;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/AxisVisual.cc b/gazebo/rendering/AxisVisual.cc
index 0965b7c..92da749 100644
--- a/gazebo/rendering/AxisVisual.cc
+++ b/gazebo/rendering/AxisVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,54 +18,61 @@
  * Author: Nate Koenig
  */
 
-#include "common/MeshManager.hh"
+#include "gazebo/common/MeshManager.hh"
 
-#include "rendering/ogre_gazebo.h"
-#include "rendering/Scene.hh"
-#include "rendering/ArrowVisual.hh"
-#include "rendering/AxisVisual.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/ArrowVisual.hh"
+#include "gazebo/rendering/AxisVisualPrivate.hh"
+#include "gazebo/rendering/AxisVisual.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
 /////////////////////////////////////////////////
 AxisVisual::AxisVisual(const std::string &_name, VisualPtr _vis)
-  : Visual(_name, _vis, false)
+  : Visual(*new AxisVisualPrivate, _name, _vis, false)
 {
 }
 
 /////////////////////////////////////////////////
 AxisVisual::~AxisVisual()
 {
-  this->xAxis.reset();
-  this->yAxis.reset();
-  this->zAxis.reset();
+  AxisVisualPrivate *dPtr =
+      reinterpret_cast<AxisVisualPrivate *>(this->dataPtr);
+
+  dPtr->xAxis.reset();
+  dPtr->yAxis.reset();
+  dPtr->zAxis.reset();
 }
 
 /////////////////////////////////////////////////
 void AxisVisual::Load()
 {
+  AxisVisualPrivate *dPtr =
+      reinterpret_cast<AxisVisualPrivate *>(this->dataPtr);
+
   Visual::Load();
 
-  this->xAxis.reset(new ArrowVisual(this->GetName() +
+  dPtr->xAxis.reset(new ArrowVisual(this->GetName() +
       "_X_AXIS", shared_from_this()));
-  this->xAxis->Load();
-  this->xAxis->SetMaterial("__GAZEBO_TRANS_RED_MATERIAL__");
+  dPtr->xAxis->Load();
+  dPtr->xAxis->SetMaterial("__GAZEBO_TRANS_RED_MATERIAL__");
 
-  this->yAxis.reset(new ArrowVisual(this->GetName() +
+  dPtr->yAxis.reset(new ArrowVisual(this->GetName() +
       "_Y_AXIS", shared_from_this()));
-  this->yAxis->Load();
-  this->yAxis->SetMaterial("__GAZEBO_TRANS_GREEN_MATERIAL__");
+  dPtr->yAxis->Load();
+  dPtr->yAxis->SetMaterial("__GAZEBO_TRANS_GREEN_MATERIAL__");
 
-  this->zAxis.reset(new ArrowVisual(this->GetName() +
+  dPtr->zAxis.reset(new ArrowVisual(this->GetName() +
       "_Z_AXIS", shared_from_this()));
-  this->zAxis->Load();
-  this->zAxis->SetMaterial("__GAZEBO_TRANS_BLUE_MATERIAL__");
+  dPtr->zAxis->Load();
+  dPtr->zAxis->SetMaterial("__GAZEBO_TRANS_BLUE_MATERIAL__");
 
-  this->xAxis->SetRotation(
+  dPtr->xAxis->SetRotation(
       math::Quaternion(math::Vector3(0, 1, 0), GZ_DTOR(90)));
 
-  this->yAxis->SetRotation(
+  dPtr->yAxis->SetRotation(
       math::Quaternion(math::Vector3(1, 0, 0), GZ_DTOR(-90)));
 
   this->SetVisibilityFlags(GZ_VISIBILITY_GUI);
@@ -74,35 +81,47 @@ void AxisVisual::Load()
 /////////////////////////////////////////////////
 void AxisVisual::ScaleXAxis(const math::Vector3 &_scale)
 {
-  this->xAxis->SetScale(_scale);
+  AxisVisualPrivate *dPtr =
+      reinterpret_cast<AxisVisualPrivate *>(this->dataPtr);
+
+  dPtr->xAxis->SetScale(_scale);
 }
 
 /////////////////////////////////////////////////
 void AxisVisual::ScaleYAxis(const math::Vector3 &_scale)
 {
-  this->yAxis->SetScale(_scale);
+  AxisVisualPrivate *dPtr =
+      reinterpret_cast<AxisVisualPrivate *>(this->dataPtr);
+
+  dPtr->yAxis->SetScale(_scale);
 }
 
 /////////////////////////////////////////////////
 void AxisVisual::ScaleZAxis(const math::Vector3 &_scale)
 {
-  this->zAxis->SetScale(_scale);
+  AxisVisualPrivate *dPtr =
+      reinterpret_cast<AxisVisualPrivate *>(this->dataPtr);
+
+  dPtr->zAxis->SetScale(_scale);
 }
 
 /////////////////////////////////////////////////
 void AxisVisual::SetAxisMaterial(unsigned int _axis,
                                  const std::string &_material)
 {
+  AxisVisualPrivate *dPtr =
+      reinterpret_cast<AxisVisualPrivate *>(this->dataPtr);
+
   switch (_axis)
   {
     case 0:
-      this->xAxis->SetMaterial(_material);
+      dPtr->xAxis->SetMaterial(_material);
       break;
     case 1:
-      this->yAxis->SetMaterial(_material);
+      dPtr->yAxis->SetMaterial(_material);
       break;
     case 2:
-      this->zAxis->SetMaterial(_material);
+      dPtr->zAxis->SetMaterial(_material);
       break;
     default:
       gzerr << "Invlid axis index[" << _axis << "]\n";
@@ -113,16 +132,19 @@ void AxisVisual::SetAxisMaterial(unsigned int _axis,
 /////////////////////////////////////////////////
 void AxisVisual::ShowRotation(unsigned int _axis)
 {
+  AxisVisualPrivate *dPtr =
+      reinterpret_cast<AxisVisualPrivate *>(this->dataPtr);
+
   switch (_axis)
   {
     case 0:
-      this->xAxis->ShowRotation();
+      dPtr->xAxis->ShowRotation();
       break;
     case 1:
-      this->yAxis->ShowRotation();
+      dPtr->yAxis->ShowRotation();
       break;
     case 2:
-      this->zAxis->ShowRotation();
+      dPtr->zAxis->ShowRotation();
       break;
     default:
       gzerr << "Invlid axis index[" << _axis << "]\n";
diff --git a/gazebo/rendering/AxisVisual.hh b/gazebo/rendering/AxisVisual.hh
index fc34178..1492944 100644
--- a/gazebo/rendering/AxisVisual.hh
+++ b/gazebo/rendering/AxisVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,16 +14,15 @@
  * limitations under the License.
  *
 */
-/* Desc: 3D Axis Visualization Class
- * Author: Nate Koenig
- */
 
 #ifndef _AXISVISUAL_HH_
 #define _AXISVISUAL_HH_
 
 #include <string>
 
-#include "rendering/Visual.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +33,7 @@ namespace gazebo
 
     /// \class AxisVisual AxisVisual.hh rendering/rendering.hh
     /// \brief Basic axis visualization
-    class AxisVisual : public Visual
+    class GAZEBO_VISIBLE AxisVisual : public Visual
     {
       /// \brief Constructor
       /// \param[in] _name Name of the AxisVisual
@@ -67,10 +66,6 @@ namespace gazebo
       /// \param[in] _material The name of the material to apply to the axis
       public: void SetAxisMaterial(unsigned int _axis,
                                    const std::string &_material);
-
-      private: ArrowVisualPtr xAxis;
-      private: ArrowVisualPtr yAxis;
-      private: ArrowVisualPtr zAxis;
     };
     /// \}
   }
diff --git a/gazebo/rendering/AxisVisualPrivate.hh b/gazebo/rendering/AxisVisualPrivate.hh
new file mode 100644
index 0000000..d717084
--- /dev/null
+++ b/gazebo/rendering/AxisVisualPrivate.hh
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _AXISVISUAL_PRIVATE_HH_
+#define _AXISVISUAL_PRIVATE_HH_
+
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the Axis Visual class.
+    class AxisVisualPrivate : public VisualPrivate
+    {
+      /// \brief Pointer to the x-axis visual.
+      public: ArrowVisualPtr xAxis;
+
+      /// \brief Pointer to the y-axis visual.
+      public: ArrowVisualPtr yAxis;
+
+      /// \brief Pointer to the z-axis visual.
+      public: ArrowVisualPtr zAxis;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/CMakeLists.txt b/gazebo/rendering/CMakeLists.txt
index 07828b5..77bd75b 100644
--- a/gazebo/rendering/CMakeLists.txt
+++ b/gazebo/rendering/CMakeLists.txt
@@ -25,11 +25,13 @@ set (sources
   DynamicLines.cc
   DynamicRenderable.cc
   FPSViewController.cc
+  GpuLaser.cc
   Grid.cc
   GUIOverlay.cc
   Heightmap.cc
   JointVisual.cc
   LaserVisual.cc
+  SonarVisual.cc
   Light.cc
   Material.cc
   MovableText.cc
@@ -37,18 +39,21 @@ set (sources
   Projector.cc
   RenderEngine.cc
   RenderEvents.cc
-  Rendering.cc
+  RenderingIface.cc
   Road2d.cc
   RFIDVisual.cc
   RFIDTagVisual.cc
   RTShaderSystem.cc
   Scene.cc
+  SelectionObj.cc
+  TransmitterVisual.cc
   UserCamera.cc
   VideoVisual.cc
   ViewController.cc
   Visual.cc
   WireBox.cc
   WindowManager.cc
+  WrenchVisual.cc
 )
 
 set (headers
@@ -63,11 +68,13 @@ set (headers
   DynamicLines.hh
   DynamicRenderable.hh
   FPSViewController.hh
+  GpuLaser.hh
   Grid.hh
   GUIOverlay.hh
   Heightmap.hh
   JointVisual.hh
   LaserVisual.hh
+  SonarVisual.hh
   Light.hh
   Material.hh
   MovableText.hh
@@ -75,48 +82,67 @@ set (headers
   Projector.hh
   RenderEngine.hh
   RenderEvents.hh
-  Rendering.hh
+  RenderingIface.hh
   RenderTypes.hh
   Road2d.hh
   RFIDVisual.hh
   RFIDTagVisual.hh
   RTShaderSystem.hh
   Scene.hh
+  SelectionObj.hh
+  TransmitterVisual.hh
   UserCamera.hh
   VideoVisual.hh
   ViewController.hh
   Visual.hh
   WireBox.hh
   WindowManager.hh
+  WrenchVisual.hh
   ogre_gazebo.h
   cegui.h
 )
 
+set (gtest_sources
+)
+
+gz_build_tests(${gtest_sources})
+
+set (gtest_sources_dri
+  GpuLaser_TEST.cc
+  Heightmap_TEST.cc
+)
+
+gz_build_dri_tests(${gtest_sources_dri})
+
 set (rendering_headers "" CACHE INTERNAL "rendering headers" FORCE)
 foreach (hdr ${headers})
   APPEND_TO_CACHED_STRING(rendering_headers
-                          "Rendering Headers" "#include \"rendering/${hdr}\"\n")
+    "Rendering Headers" "#include \"gazebo/rendering/${hdr}\"\n")
 endforeach()
 configure_file (${CMAKE_CURRENT_SOURCE_DIR}/rendering.hh.in
                 ${CMAKE_CURRENT_BINARY_DIR}/rendering.hh)
 
-link_directories(  
+link_directories(
   ${ogre_library_dirs}
 )
 
 gz_add_library(gazebo_rendering ${sources})
 
 target_link_libraries( gazebo_rendering
-  gazebo_common 
-  gazebo_sdf_interface
+  gazebo_common
+  gazebo_msgs
   gazebo_skyx
   gazebo_selection_buffer
-  ${ogre_libraries} 
-  ${OPENGL_LIBRARIES} 
+  gazebo_transport
+  ${ogre_libraries}
+  ${OPENGL_LIBRARIES}
   ${CEGUI_LIBRARIES}
-  X11 
 )
 
+if (NOT APPLE)
+  target_link_libraries(gazebo_rendering X11)
+endif()
+
 if (${OGRE_VERSION} GREATER 1.7.4)
   target_link_libraries(gazebo_rendering gazebo_rendering_deferred)
 endif()
diff --git a/gazebo/rendering/COMVisual.cc b/gazebo/rendering/COMVisual.cc
index 95a057f..6786173 100644
--- a/gazebo/rendering/COMVisual.cc
+++ b/gazebo/rendering/COMVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,22 +18,23 @@
  * Author: Nate Koenig
  */
 
-#include "common/MeshManager.hh"
-#include "math/Vector3.hh"
-#include "math/Quaternion.hh"
-#include "math/Pose.hh"
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/math/Pose.hh"
 
-#include "rendering/DynamicLines.hh"
-#include "rendering/ogre_gazebo.h"
-#include "rendering/Scene.hh"
-#include "rendering/COMVisual.hh"
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/COMVisualPrivate.hh"
+#include "gazebo/rendering/COMVisual.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
 /////////////////////////////////////////////////
 COMVisual::COMVisual(const std::string &_name, VisualPtr _vis)
-  : Visual(_name, _vis, false)
+  : Visual(*new COMVisualPrivate, _name, _vis, false)
 {
 }
 
@@ -46,7 +47,7 @@ COMVisual::~COMVisual()
 void COMVisual::Load(sdf::ElementPtr _elem)
 {
   Visual::Load();
-  math::Pose pose = _elem->GetValuePose("origin");
+  math::Pose pose = _elem->Get<math::Pose>("origin");
   this->Load(pose);
 }
 
@@ -63,18 +64,47 @@ void COMVisual::Load(ConstLinkPtr &_msg)
                      _msg->inertial().pose().orientation().y(),
                      _msg->inertial().pose().orientation().z());
 
-  this->Load(math::Pose(xyz, q));
+  // Use principal moments of inertia to scale COM visual
+  // \todo: rotate COM to match principal axes when product terms are nonzero
+  // This can be done with Eigen, or with code from the following paper:
+  // A Method for Fast Diagonalization of a 2x2 or 3x3 Real Symmetric Matrix
+  // http://arxiv.org/abs/1306.6291v3
+  double mass = _msg->inertial().mass();
+  double Ixx = _msg->inertial().ixx();
+  double Iyy = _msg->inertial().iyy();
+  double Izz = _msg->inertial().izz();
+  math::Vector3 boxScale;
+  if (mass < 0 || Ixx < 0 || Iyy < 0 || Izz < 0 ||
+      Ixx + Iyy < Izz || Iyy + Izz < Ixx || Izz + Ixx < Iyy)
+  {
+    // Unrealistic inertia, load with default scale
+    gzlog << "The link " << _msg->name() << " has unrealistic inertia, "
+          << "unable to visualize box of equivalent inertia." << std::endl;
+    this->Load(math::Pose(xyz, q));
+  }
+  else
+  {
+    // Compute dimensions of box with uniform density and equivalent inertia.
+    boxScale.x = sqrt(6*(Izz + Iyy - Ixx) / mass);
+    boxScale.y = sqrt(6*(Izz + Ixx - Iyy) / mass);
+    boxScale.z = sqrt(6*(Ixx + Iyy - Izz) / mass);
+    this->Load(math::Pose(xyz, q), boxScale);
+  }
 }
 
 /////////////////////////////////////////////////
-void COMVisual::Load(const math::Pose &_pose)
+void COMVisual::Load(const math::Pose &_pose,
+                     const math::Vector3 &_scale)
 {
-  math::Vector3 p1(0, 0, -0.04);
-  math::Vector3 p2(0, 0, 00.04);
-  math::Vector3 p3(0, -0.04, 0);
-  math::Vector3 p4(0, 00.04, 0);
-  math::Vector3 p5(-0.04, 0, 0);
-  math::Vector3 p6(00.04, 0, 0);
+  COMVisualPrivate *dPtr =
+      reinterpret_cast<COMVisualPrivate *>(this->dataPtr);
+
+  math::Vector3 p1(0, 0, -2*_scale.z);
+  math::Vector3 p2(0, 0,  2*_scale.z);
+  math::Vector3 p3(0, -2*_scale.y, 0);
+  math::Vector3 p4(0,  2*_scale.y, 0);
+  math::Vector3 p5(-2*_scale.x, 0, 0);
+  math::Vector3 p6(2*_scale.x,  0, 0);
   p1 += _pose.pos;
   p2 += _pose.pos;
   p3 += _pose.pos;
@@ -88,30 +118,30 @@ void COMVisual::Load(const math::Pose &_pose)
   p5 = _pose.rot.RotateVector(p5);
   p6 = _pose.rot.RotateVector(p6);
 
-  this->crossLines = this->CreateDynamicLine(rendering::RENDERING_LINE_LIST);
-  this->crossLines->setMaterial("Gazebo/Green");
-  this->crossLines->AddPoint(p1);
-  this->crossLines->AddPoint(p2);
-  this->crossLines->AddPoint(p3);
-  this->crossLines->AddPoint(p4);
-  this->crossLines->AddPoint(p5);
-  this->crossLines->AddPoint(p6);
+  dPtr->crossLines = this->CreateDynamicLine(rendering::RENDERING_LINE_LIST);
+  dPtr->crossLines->setMaterial("Gazebo/Green");
+  dPtr->crossLines->AddPoint(p1);
+  dPtr->crossLines->AddPoint(p2);
+  dPtr->crossLines->AddPoint(p3);
+  dPtr->crossLines->AddPoint(p4);
+  dPtr->crossLines->AddPoint(p5);
+  dPtr->crossLines->AddPoint(p6);
 
   this->InsertMesh("unit_box");
 
   Ogre::MovableObject *boxObj =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
+    (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
           this->GetName()+"__BOX__", "unit_box"));
   boxObj->setVisibilityFlags(GZ_VISIBILITY_GUI);
   ((Ogre::Entity*)boxObj)->setMaterialName("__GAZEBO_TRANS_PURPLE_MATERIAL__");
 
-  this->boxNode =
-    this->sceneNode->createChildSceneNode(this->GetName() + "_BOX");
+  dPtr->boxNode =
+      dPtr->sceneNode->createChildSceneNode(this->GetName() + "_BOX");
 
-  this->boxNode->attachObject(boxObj);
-  this->boxNode->setScale(0.02, 0.02, 0.02);
-  this->boxNode->setPosition(_pose.pos.x, _pose.pos.y, _pose.pos.z);
-  this->boxNode->setOrientation(Ogre::Quaternion(_pose.rot.w, _pose.rot.x,
+  dPtr->boxNode->attachObject(boxObj);
+  dPtr->boxNode->setScale(_scale.x, _scale.y, _scale.z);
+  dPtr->boxNode->setPosition(_pose.pos.x, _pose.pos.y, _pose.pos.z);
+  dPtr->boxNode->setOrientation(Ogre::Quaternion(_pose.rot.w, _pose.rot.x,
                                                  _pose.rot.y, _pose.rot.z));
 
   this->SetVisibilityFlags(GZ_VISIBILITY_GUI);
diff --git a/gazebo/rendering/COMVisual.hh b/gazebo/rendering/COMVisual.hh
index fdf182f..0c16870 100644
--- a/gazebo/rendering/COMVisual.hh
+++ b/gazebo/rendering/COMVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,22 +14,19 @@
  * limitations under the License.
  *
 */
-/* Desc: Center of Mass Visualization Class
- * Author: Nate Koenig
- */
 
 #ifndef _COMVISUAL_HH_
 #define _COMVISUAL_HH_
 
 #include <string>
 
-#include "rendering/Visual.hh"
-#include "msgs/msgs.hh"
+#include <sdf/sdf.hh>
 
-namespace ogre
-{
-  class SceneNode;
-}
+#include "gazebo/math/Pose.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -38,11 +35,9 @@ namespace gazebo
     /// \addtogroup gazebo_rendering Rendering
     /// \{
 
-    class DynamicLines;
-
     /// \class COMVisual COMVisual.hh rendering/rendering.hh
     /// \brief Basic Center of Mass visualization
-    class COMVisual : public Visual
+    class GAZEBO_VISIBLE COMVisual : public Visual
     {
       /// \brief Constructor
       /// \param[in] _name Name of the Visual
@@ -55,6 +50,7 @@ namespace gazebo
       /// \brief Load the Visual from an SDF pointer
       /// \param[in] _elem SDF Element pointer
       public: virtual void Load(sdf::ElementPtr _elem);
+      using Visual::Load;
 
       /// \brief Load from a message
       /// \param[in] _msg Pointer to the message
@@ -62,13 +58,9 @@ namespace gazebo
 
       /// \brief Load based on a math::Pose
       /// \param[in] _pose Pose of the COM visual
-      private: void Load(const math::Pose &_pose);
-
-      /// \brief Lines that make the cross marking the center of mass
-      private: DynamicLines *crossLines;
-
-      /// \brief Box that make the cross marking the center of mass
-      private: Ogre::SceneNode *boxNode;
+      /// \param[in] _scale Scale factor for the COM visual.
+      private: void Load(const math::Pose &_pose,
+               const math::Vector3 &_scale = math::Vector3(0.02, 0.02, 0.02));
     };
     /// \}
   }
diff --git a/gazebo/rendering/COMVisualPrivate.hh b/gazebo/rendering/COMVisualPrivate.hh
new file mode 100644
index 0000000..d9d6f95
--- /dev/null
+++ b/gazebo/rendering/COMVisualPrivate.hh
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _COMVISUAL_PRIVATE_HH_
+#define _COMVISUAL_PRIVATE_HH_
+
+#include <string>
+
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace ogre
+{
+  class SceneNode;
+}
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    class DynamicLines;
+
+    /// \brief Private data for the COM Visual class
+    class COMVisualPrivate : public VisualPrivate
+    {
+      /// \brief Lines that make the cross marking the center of mass
+      public: DynamicLines *crossLines;
+
+      /// \brief Box that make the cross marking the center of mass
+      public: Ogre::SceneNode *boxNode;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/Camera.cc b/gazebo/rendering/Camera.cc
index 7b79ea0..f3af3fd 100644
--- a/gazebo/rendering/Camera.cc
+++ b/gazebo/rendering/Camera.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,16 +15,13 @@
  *
 */
 
-/* Desc: A camera sensor using OpenGL
- * Author: Nate Koenig
- * Date: 15 July 2003
- */
-
 #include <dirent.h>
 #include <sstream>
 #include <boost/filesystem.hpp>
+#include <sdf/sdf.hh>
 
-#include "gazebo/sdf/sdf.hh"
+// Moved to top to avoid osx compilation errors
+#include "gazebo/math/Rand.hh"
 
 #include "gazebo/rendering/skyx/include/SkyX.h"
 
@@ -33,7 +30,6 @@
 #include "gazebo/common/Console.hh"
 #include "gazebo/common/Exception.hh"
 #include "gazebo/math/Pose.hh"
-#include "gazebo/math/Rand.hh"
 
 #include "gazebo/rendering/ogre_gazebo.h"
 #include "gazebo/rendering/RTShaderSystem.hh"
@@ -41,67 +37,19 @@
 #include "gazebo/rendering/Visual.hh"
 #include "gazebo/rendering/Conversions.hh"
 #include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/CameraPrivate.hh"
 #include "gazebo/rendering/Camera.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
 
-unsigned int Camera::cameraCounter = 0;
-
-namespace gazebo
-{
-namespace rendering
-{
-// We'll create an instance of this class for each camera, to be used to inject
-// random values on each render call.
-class GaussianNoiseCompositorListener
-  : public Ogre::CompositorInstance::Listener
-{
-  /// \brief Constructor, setting mean and standard deviation.
-  public: GaussianNoiseCompositorListener(double _mean, double _stddev):
-      mean(_mean), stddev(_stddev) {}
-
-  /// \brief Callback that OGRE will invoke for us on each render call
-  public: virtual void notifyMaterialRender(unsigned int _pass_id,
-                                            Ogre::MaterialPtr & _mat)
-  {
-    // modify material here (wont alter the base material!), called for
-    // every drawn geometry instance (i.e. compositor render_quad)
-
-    // Sample three values within the range [0,1.0] and set them for use in
-    // the fragment shader, which will interpret them as offsets from (0,0)
-    // to use when computing pseudo-random values.
-    Ogre::Vector3 offsets(math::Rand::GetDblUniform(0.0, 1.0),
-                          math::Rand::GetDblUniform(0.0, 1.0),
-                          math::Rand::GetDblUniform(0.0, 1.0));
-    // These calls are setting parameters that are declared in two places:
-    // 1. media/materials/scripts/gazebo.material, in
-    //    fragment_program Gazebo/GaussianCameraNoiseFS
-    // 2. media/materials/scripts/camera_noise_gaussian_fs.glsl
-    _mat->getTechnique(0)->getPass(_pass_id)->
-      getFragmentProgramParameters()->
-      setNamedConstant("offsets", offsets);
-    _mat->getTechnique(0)->getPass(_pass_id)->
-      getFragmentProgramParameters()->
-      setNamedConstant("mean", (Ogre::Real)this->mean);
-    _mat->getTechnique(0)->getPass(_pass_id)->
-      getFragmentProgramParameters()->
-      setNamedConstant("stddev", (Ogre::Real)this->stddev);
-  }
-
-  /// \brief Mean that we'll pass down to the GLSL fragment shader.
-  private: double mean;
-  /// \brief Standard deviation that we'll pass down to the GLSL fragment
-  /// shader.
-  private: double stddev;
-};
-}  // namespace rendering
-}  // namespace gazebo
+unsigned int CameraPrivate::cameraCounter = 0;
 
 //////////////////////////////////////////////////
-Camera::Camera(const std::string &_namePrefix, ScenePtr _scene,
+Camera::Camera(const std::string &_name, ScenePtr _scene,
                bool _autoRender)
+  : dataPtr(new CameraPrivate)
 {
   this->initialized = false;
   this->sdf.reset(new sdf::Element);
@@ -119,9 +67,10 @@ Camera::Camera(const std::string &_namePrefix, ScenePtr _scene,
   this->saveCount = 0;
   this->bayerFrameBuffer = NULL;
 
-  std::ostringstream stream;
-  stream << _namePrefix << "(" << this->cameraCounter++ << ")";
-  this->name = stream.str();
+  this->name = _name;
+  this->scopedName = this->scene->GetName() + "::" + _name;
+  this->scopedUniqueName = this->scopedName + "(" +
+    boost::lexical_cast<std::string>(++this->dataPtr->cameraCounter) + ")";
 
   this->renderTarget = NULL;
   this->renderTexture = NULL;
@@ -132,7 +81,6 @@ Camera::Camera(const std::string &_namePrefix, ScenePtr _scene,
   this->camera = NULL;
   this->viewport = NULL;
 
-  this->pitchNode = NULL;
   this->sceneNode = NULL;
 
   this->screenshotPath = getenv("HOME");
@@ -144,8 +92,8 @@ Camera::Camera(const std::string &_namePrefix, ScenePtr _scene,
 
   if (_autoRender)
   {
-    this->connections.push_back(
-        event::Events::ConnectRender(boost::bind(&Camera::Render, this)));
+    this->connections.push_back(event::Events::ConnectRender(
+          boost::bind(&Camera::Render, this, false)));
     this->connections.push_back(
         event::Events::ConnectPostRender(
           boost::bind(&Camera::PostRender, this)));
@@ -155,6 +103,9 @@ Camera::Camera(const std::string &_namePrefix, ScenePtr _scene,
 
   // Set default render rate to unlimited
   this->SetRenderRate(0.0);
+
+  this->dataPtr->node = transport::NodePtr(new transport::Node());
+  this->dataPtr->node->Init();
 }
 
 //////////////////////////////////////////////////
@@ -163,23 +114,26 @@ Camera::~Camera()
   delete [] this->saveFrameBuffer;
   delete [] this->bayerFrameBuffer;
 
-  this->pitchNode = NULL;
   this->sceneNode = NULL;
 
-  if (this->renderTexture)
+  if (this->renderTexture && this->scene->GetInitialized())
     Ogre::TextureManager::getSingleton().remove(this->renderTexture->getName());
+  this->renderTexture = NULL;
+  this->renderTarget = NULL;
 
-  if (this->camera)
+  if (this->camera && this->scene && this->scene->GetManager())
   {
-    this->scene->GetManager()->destroyCamera(this->name);
+    this->scene->GetManager()->destroyCamera(this->scopedUniqueName);
     this->camera = NULL;
   }
 
   this->connections.clear();
 
   this->sdf->Reset();
-  this->imageElem.reset();
   this->sdf.reset();
+
+  delete this->dataPtr;
+  this->dataPtr = NULL;
 }
 
 //////////////////////////////////////////////////
@@ -195,22 +149,22 @@ void Camera::Load()
   sdf::ElementPtr imgElem = this->sdf->GetElement("image");
   if (imgElem)
   {
-    this->imageWidth = imgElem->GetValueInt("width");
-    this->imageHeight = imgElem->GetValueInt("height");
+    this->imageWidth = imgElem->Get<int>("width");
+    this->imageHeight = imgElem->Get<int>("height");
     this->imageFormat = this->GetOgrePixelFormat(
-        imgElem->GetValueString("format"));
+        imgElem->Get<std::string>("format"));
   }
   else
     gzthrow("Camera has no <image> tag.");
 
   // Create the directory to store frames
   if (this->sdf->HasElement("save") &&
-      this->sdf->GetElement("save")->GetValueBool("enabled"))
+      this->sdf->GetElement("save")->Get<bool>("enabled"))
   {
     sdf::ElementPtr elem = this->sdf->GetElement("save");
     std::string command;
 
-    command = "mkdir " + elem->GetValueString("path")+ " 2>>/dev/null";
+    command = "mkdir " + elem->Get<std::string>("path")+ " 2>>/dev/null";
     if (system(command.c_str()) < 0)
       gzerr << "Error making directory\n";
   }
@@ -218,34 +172,20 @@ void Camera::Load()
   if (this->sdf->HasElement("horizontal_fov"))
   {
     sdf::ElementPtr elem = this->sdf->GetElement("horizontal_fov");
-    double angle = elem->GetValueDouble();
+    double angle = elem->Get<double>();
     if (angle < 0.01 || angle > M_PI)
     {
-      gzthrow("Camera horizontal field of veiw invalid.");
+      gzthrow("Camera horizontal field of view invalid.");
     }
     this->SetHFOV(angle);
   }
 
-  // Handle noise model settings.
-  this->noiseActive = false;
-  if (this->sdf->HasElement("noise"))
+  // Only create a command subscription for real cameras. Ignore camera's
+  // created for visualization purposes.
+  if (this->name.find("_GUIONLY_") == std::string::npos)
   {
-    sdf::ElementPtr noiseElem = this->sdf->GetElement("noise");
-    std::string type = noiseElem->GetValueString("type");
-    if (type == "gaussian")
-    {
-      this->noiseType = GAUSSIAN;
-      this->noiseMean = noiseElem->GetValueDouble("mean");
-      this->noiseStdDev = noiseElem->GetValueDouble("stddev");
-      this->noiseActive = true;
-      this->gaussianNoiseCompositorListener.reset(new
-        GaussianNoiseCompositorListener(this->noiseMean, this->noiseStdDev));
-      gzlog << "applying Gaussian noise model with mean " << this->noiseMean <<
-        " and stddev " << this->noiseStdDev << std::endl;
-    }
-    else
-      gzwarn << "ignoring unknown noise model type \"" << type << "\"" <<
-        std::endl;
+    this->dataPtr->cmdSub = this->dataPtr->node->Subscribe(
+        "~/" + this->GetName() + "/cmd", &Camera::OnCmdMsg, this, true);
   }
 }
 
@@ -254,20 +194,14 @@ void Camera::Init()
 {
   this->SetSceneNode(
       this->scene->GetManager()->getRootSceneNode()->createChildSceneNode(
-        this->GetName() + "_SceneNode"));
+        this->scopedUniqueName + "_SceneNode"));
 
   this->CreateCamera();
 
-  // Create a scene node to control pitch motion
-  this->pitchNode =
-    this->sceneNode->createChildSceneNode(this->name + "PitchNode");
-  this->pitchNode->pitch(Ogre::Degree(0));
-
-  this->pitchNode->attachObject(this->camera);
+  this->sceneNode->attachObject(this->camera);
   this->camera->setAutoAspectRatio(true);
 
   this->sceneNode->setInheritScale(false);
-  this->pitchNode->setInheritScale(false);
 
   this->saveCount = 0;
 
@@ -277,11 +211,18 @@ void Camera::Init()
 //////////////////////////////////////////////////
 void Camera::Fini()
 {
-  if (this->gaussianNoiseCompositorListener)
-    this->gaussianNoiseInstance->removeListener(
-      this->gaussianNoiseCompositorListener.get());
+  this->initialized = false;
+  this->connections.clear();
+  this->dataPtr->node.reset();
+
   RTShaderSystem::DetachViewport(this->viewport, this->scene);
-  this->renderTarget->removeAllViewports();
+
+  if (this->renderTarget && this->scene->GetInitialized())
+    this->renderTarget->removeAllViewports();
+
+  this->viewport = NULL;
+  this->renderTarget = NULL;
+
   this->connections.clear();
 }
 
@@ -306,21 +247,41 @@ void Camera::SetScene(ScenePtr _scene)
 //////////////////////////////////////////////////
 void Camera::Update()
 {
+  boost::mutex::scoped_lock lock(this->dataPtr->receiveMutex);
+
+  // Process all the command messages.
+  for (CameraPrivate::CameraCmdMsgs_L::iterator iter =
+      this->dataPtr->commandMsgs.begin();
+      iter != this->dataPtr->commandMsgs.end(); ++iter)
+  {
+    if ((*iter)->has_follow_model())
+      this->TrackVisual((*iter)->follow_model());
+  }
+  this->dataPtr->commandMsgs.clear();
+
   std::list<msgs::Request>::iterator iter = this->requests.begin();
   while (iter != this->requests.end())
   {
     bool erase = false;
     if ((*iter).request() == "track_visual")
     {
-      if (this->TrackVisualImpl((*iter).data()))
+      if (!this->TrackVisualImpl((*iter).data()))
         erase = true;
     }
     else if ((*iter).request() == "attach_visual")
     {
       msgs::TrackVisual msg;
       msg.ParseFromString((*iter).data());
-      if (this->AttachToVisualImpl(msg.name(), msg.inherit_orientation(),
-                                    msg.min_dist(), msg.max_dist()))
+      bool result = false;
+
+      if (msg.id() < GZ_UINT32_MAX)
+        result = this->AttachToVisualImpl(msg.id(),
+            msg.inherit_orientation(), msg.min_dist(), msg.max_dist());
+      else
+        result = this->AttachToVisualImpl(msg.name(),
+            msg.inherit_orientation(), msg.min_dist(), msg.max_dist());
+
+      if (result)
         erase = true;
     }
 
@@ -354,30 +315,70 @@ void Camera::Update()
       if (this->onAnimationComplete)
         this->onAnimationComplete();
 
-      if (this->moveToPositionQueue.size() > 0)
+      if (!this->dataPtr->moveToPositionQueue.empty())
       {
-        this->MoveToPosition(this->moveToPositionQueue[0].first,
-                             this->moveToPositionQueue[0].second);
-        this->moveToPositionQueue.pop_front();
+        this->MoveToPosition(this->dataPtr->moveToPositionQueue[0].first,
+                             this->dataPtr->moveToPositionQueue[0].second);
+        this->dataPtr->moveToPositionQueue.pop_front();
       }
     }
   }
-
-  // TODO: this doesn't work properly
-  /*if (this->trackedVisual)
+  else if (this->dataPtr->trackedVisual)
   {
-    math::Pose displacement = this->trackedVisual->GetWorldPose() -
-      this->GetWorldPose();
-    this->sceneNode->translate(Conversions::Convert(displacement.pos));
-  }*/
-}
+    math::Vector3 direction = this->dataPtr->trackedVisual->GetWorldPose().pos -
+                              this->GetWorldPose().pos;
+
+    double yaw = atan2(direction.y, direction.x);
+    double pitch = atan2(-direction.z,
+                         sqrt(pow(direction.x, 2) + pow(direction.y, 2)));
+
+    double currPitch = this->GetWorldRotation().GetAsEuler().y;
+    double currYaw = this->GetWorldRotation().GetAsEuler().z;
+
+    double pitchError = currPitch - pitch;
+
+    double yawError = currYaw - yaw;
+    if (yawError > M_PI)
+      yawError -= M_PI*2;
+    if (yawError < -M_PI)
+      yawError += M_PI*2;
 
+    double pitchAdj = this->dataPtr->trackVisualPitchPID.Update(
+        pitchError, 0.01);
+    double yawAdj = this->dataPtr->trackVisualYawPID.Update(
+        yawError, 0.01);
+
+    this->SetWorldRotation(math::Quaternion(0, currPitch + pitchAdj,
+          currYaw + yawAdj));
+
+    double origDistance = 8.0;
+    double distance = direction.GetLength();
+    double error = origDistance - distance;
+
+    double scaling = this->dataPtr->trackVisualPID.Update(error, 0.3);
+
+    math::Vector3 displacement = direction;
+    displacement.Normalize();
+    displacement *= scaling;
+
+    math::Vector3 pos = this->GetWorldPosition() + displacement;
+
+    this->SetWorldPosition(pos);
+  }
+}
 
 //////////////////////////////////////////////////
 void Camera::Render()
 {
-  if (common::Time::GetWallTime() - this->lastRenderWallTime >=
-      this->renderPeriod)
+  this->Render(false);
+}
+
+//////////////////////////////////////////////////
+void Camera::Render(bool _force)
+{
+  if (this->initialized && (_force ||
+       common::Time::GetWallTime() - this->lastRenderWallTime >=
+        this->dataPtr->renderPeriod))
   {
     this->newData = true;
     this->RenderImpl();
@@ -389,22 +390,13 @@ void Camera::RenderImpl()
 {
   if (this->renderTarget)
   {
-    this->renderTarget->update(false);
-    this->lastRenderWallTime = common::Time::GetWallTime();
+    this->renderTarget->update();
   }
 }
 
 //////////////////////////////////////////////////
-common::Time Camera::GetLastRenderWallTime()
-{
-  return this->lastRenderWallTime;
-}
-
-//////////////////////////////////////////////////
-void Camera::PostRender()
+void Camera::ReadPixelBuffer()
 {
-  this->renderTarget->swapBuffers();
-
   if (this->newData && (this->captureData || this->captureDataOnce))
   {
     size_t size;
@@ -425,8 +417,67 @@ void Camera::PostRender()
         static_cast<Ogre::PixelFormat>(this->imageFormat),
         this->saveFrameBuffer);
 
+#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR < 8
+    // Case for UserCamera where there is no RenderTexture but
+    // a RenderTarget (RenderWindow) exists. We can not call SetRenderTarget
+    // because that overrides the this->renderTarget variable
+    if (this->renderTarget && !this->renderTexture)
+    {
+      // Create the render texture
+      this->renderTexture = (Ogre::TextureManager::getSingleton().createManual(
+        this->renderTarget->getName() + "_tex",
+        "General",
+        Ogre::TEX_TYPE_2D,
+        this->GetImageWidth(),
+        this->GetImageHeight(),
+        0,
+        (Ogre::PixelFormat)this->imageFormat,
+        Ogre::TU_RENDERTARGET)).getPointer();
+        Ogre::RenderTexture *rtt
+            = this->renderTexture->getBuffer()->getRenderTarget();
+
+      // Setup the viewport to use the texture
+      Ogre::Viewport *vp = rtt->addViewport(this->camera);
+      vp->setClearEveryFrame(true);
+      vp->setShadowsEnabled(true);
+      vp->setOverlaysEnabled(false);
+    }
+
+    // This update is only needed for client side data captures
+    if (this->renderTexture->getBuffer()->getRenderTarget()
+        != this->renderTarget)
+      this->renderTexture->getBuffer()->getRenderTarget()->update();
+
+    // The code below is equivalent to
+    // this->viewport->getTarget()->copyContentsToMemory(box);
+    // which causes problems on some machines if running ogre-1.7.4
+    Ogre::HardwarePixelBufferSharedPtr pixelBuffer;
+    pixelBuffer = this->renderTexture->getBuffer();
+    pixelBuffer->blitToMemory(box);
+#else
+    // There is a fix in ogre-1.8 for a buffer overrun problem in
+    // OgreGLXWindow.cpp's copyContentsToMemory(). It fixes reading
+    // pixels from buffer into memory.
     this->viewport->getTarget()->copyContentsToMemory(box);
+#endif
+  }
+}
+
+//////////////////////////////////////////////////
+common::Time Camera::GetLastRenderWallTime()
+{
+  return this->lastRenderWallTime;
+}
 
+//////////////////////////////////////////////////
+void Camera::PostRender()
+{
+  this->ReadPixelBuffer();
+
+  this->lastRenderWallTime = common::Time::GetWallTime();
+
+  if (this->newData && (this->captureData || this->captureDataOnce))
+  {
     if (this->captureDataOnce)
     {
       this->SaveFrame(this->GetFrameFilename());
@@ -434,11 +485,13 @@ void Camera::PostRender()
     }
 
     if (this->sdf->HasElement("save") &&
-        this->sdf->GetElement("save")->GetValueBool("enabled"))
+        this->sdf->GetElement("save")->Get<bool>("enabled"))
     {
       this->SaveFrame(this->GetFrameFilename());
     }
 
+    unsigned int width = this->GetImageWidth();
+    unsigned int height = this->GetImageHeight();
     const unsigned char *buffer = this->saveFrameBuffer;
 
     // do last minute conversion if Bayer pattern is requested, go from R8G8B8
@@ -465,25 +518,16 @@ void Camera::PostRender()
 }
 
 //////////////////////////////////////////////////
-math::Pose Camera::GetWorldPose()
-{
-  return math::Pose(this->GetWorldPosition(), this->GetWorldRotation());
-}
-
-//////////////////////////////////////////////////
 math::Vector3 Camera::GetWorldPosition() const
 {
   return Conversions::Convert(this->sceneNode->_getDerivedPosition());
 }
 
+//////////////////////////////////////////////////
 math::Quaternion Camera::GetWorldRotation() const
 {
-  math::Vector3 sRot, pRot;
-
-  sRot = Conversions::Convert(this->sceneNode->getOrientation()).GetAsEuler();
-  pRot = Conversions::Convert(this->pitchNode->getOrientation()).GetAsEuler();
-
-  return math::Quaternion(sRot.x, pRot.y, sRot.z);
+  Ogre::Quaternion rot = this->sceneNode->getOrientation();
+  return math::Quaternion(rot.w, rot.x, rot.y, rot.z);
 }
 
 //////////////////////////////////////////////////
@@ -494,12 +538,19 @@ void Camera::SetWorldPose(const math::Pose &_pose)
 }
 
 //////////////////////////////////////////////////
+math::Pose Camera::GetWorldPose() const
+{
+  return math::Pose(this->GetWorldPosition(), this->GetWorldRotation());
+}
+
+//////////////////////////////////////////////////
 void Camera::SetWorldPosition(const math::Vector3 &_pos)
 {
   if (this->animState)
     return;
 
   this->sceneNode->setPosition(Ogre::Vector3(_pos.x, _pos.y, _pos.z));
+  this->sceneNode->needUpdate();
 }
 
 //////////////////////////////////////////////////
@@ -508,16 +559,15 @@ void Camera::SetWorldRotation(const math::Quaternion &_quant)
   if (this->animState)
     return;
 
-  math::Quaternion p, s;
   math::Vector3 rpy = _quant.GetAsEuler();
-  p.SetFromEuler(math::Vector3(0, rpy.y, 0));
-  s.SetFromEuler(math::Vector3(rpy.x, 0, rpy.z));
+
+  // Set the roll and yaw for sceneNode
+  math::Quaternion s(rpy.x, rpy.y, rpy.z);
 
   this->sceneNode->setOrientation(
       Ogre::Quaternion(s.w, s.x, s.y, s.z));
 
-  this->pitchNode->setOrientation(
-      Ogre::Quaternion(p.w, p.x, p.y, p.z));
+  this->sceneNode->needUpdate();
 }
 
 //////////////////////////////////////////////////
@@ -526,7 +576,7 @@ void Camera::Translate(const math::Vector3 &direction)
   Ogre::Vector3 vec(direction.x, direction.y, direction.z);
 
   this->sceneNode->translate(this->sceneNode->getOrientation() *
-      this->pitchNode->getOrientation() * vec);
+      this->sceneNode->getOrientation() * vec);
 }
 
 //////////////////////////////////////////////////
@@ -538,7 +588,7 @@ void Camera::RotateYaw(math::Angle _angle)
 //////////////////////////////////////////////////
 void Camera::RotatePitch(math::Angle _angle)
 {
-  this->pitchNode->yaw(Ogre::Radian(_angle.Radian()));
+  this->sceneNode->yaw(Ogre::Radian(_angle.Radian()));
 }
 
 
@@ -551,9 +601,9 @@ void Camera::SetClipDist()
 
   if (this->camera)
   {
-    this->camera->setNearClipDistance(clipElem->GetValueDouble("near"));
-    this->camera->setFarClipDistance(clipElem->GetValueDouble("far"));
-    this->camera->setRenderingDistance(clipElem->GetValueDouble("far"));
+    this->camera->setNearClipDistance(clipElem->Get<double>("near"));
+    this->camera->setFarClipDistance(clipElem->Get<double>("far"));
+    this->camera->setRenderingDistance(clipElem->Get<double>("far"));
   }
   else
     gzerr << "Setting clip distances failed -- no camera yet\n";
@@ -579,7 +629,7 @@ void Camera::SetHFOV(math::Angle _angle)
 //////////////////////////////////////////////////
 math::Angle Camera::GetHFOV() const
 {
-  return math::Angle(this->sdf->GetValueDouble("horizontal_fov"));
+  return math::Angle(this->sdf->Get<double>("horizontal_fov"));
 }
 
 //////////////////////////////////////////////////
@@ -620,7 +670,7 @@ unsigned int Camera::GetImageWidth() const
   else
   {
     sdf::ElementPtr elem = this->sdf->GetElement("image");
-    width = elem->GetValueInt("width");
+    width = elem->Get<int>("width");
   }
   return width;
 }
@@ -636,7 +686,7 @@ unsigned int Camera::GetImageHeight() const
   else
   {
     sdf::ElementPtr elem = this->sdf->GetElement("image");
-    height = elem->GetValueInt("height");
+    height = elem->Get<int>("height");
   }
   return height;
 }
@@ -645,7 +695,7 @@ unsigned int Camera::GetImageHeight() const
 unsigned int Camera::GetImageDepth() const
 {
   sdf::ElementPtr imgElem = this->sdf->GetElement("image");
-  std::string imgFmt = imgElem->GetValueString("format");
+  std::string imgFmt = imgElem->Get<std::string>("format");
 
   if (imgFmt == "L8" || imgFmt == "L_INT8")
     return 1;
@@ -668,7 +718,7 @@ unsigned int Camera::GetImageDepth() const
 std::string Camera::GetImageFormat() const
 {
   sdf::ElementPtr imgElem = this->sdf->GetElement("image");
-  return imgElem->GetValueString("format");
+  return imgElem->Get<std::string>("format");
 }
 
 //////////////////////////////////////////////////
@@ -688,8 +738,8 @@ unsigned int Camera::GetTextureHeight() const
 size_t Camera::GetImageByteSize() const
 {
   sdf::ElementPtr elem = this->sdf->GetElement("image");
-  return this->GetImageByteSize(elem->GetValueInt("width"),
-                                elem->GetValueInt("height"),
+  return this->GetImageByteSize(elem->Get<int>("width"),
+                                elem->Get<int>("height"),
                                 this->GetImageFormat());
 }
 
@@ -737,11 +787,17 @@ int Camera::GetOgrePixelFormat(const std::string &_format)
 }
 
 //////////////////////////////////////////////////
-void Camera::EnableSaveFrame(bool enable)
+void Camera::EnableSaveFrame(bool _enable)
 {
   sdf::ElementPtr elem = this->sdf->GetElement("save");
-  elem->GetAttribute("enabled")->Set(enable);
-  this->captureData = true;
+  elem->GetAttribute("enabled")->Set(_enable);
+  this->captureData = _enable;
+}
+
+//////////////////////////////////////////////////
+bool Camera::GetCaptureData() const
+{
+  return this->captureData;
 }
 
 //////////////////////////////////////////////////
@@ -751,7 +807,7 @@ void Camera::SetSaveFramePathname(const std::string &_pathname)
   elem->GetElement("path")->Set(_pathname);
 
   // Create the directory to store frames
-  if (elem->GetValueBool("enabled"))
+  if (elem->Get<bool>("enabled"))
   {
     std::string command;
     command = "mkdir -p " + _pathname + " 2>>/dev/null";
@@ -839,9 +895,9 @@ math::Vector3 Camera::GetRight()
 }
 
 //////////////////////////////////////////////////
-void Camera::SetSceneNode(Ogre::SceneNode *node)
+void Camera::SetSceneNode(Ogre::SceneNode *_node)
 {
-  this->sceneNode = node;
+  this->sceneNode = _node;
 }
 
 //////////////////////////////////////////////////
@@ -853,7 +909,9 @@ Ogre::SceneNode *Camera::GetSceneNode() const
 //////////////////////////////////////////////////
 Ogre::SceneNode *Camera::GetPitchNode() const
 {
-  return this->pitchNode;
+  gzerr << "Camera::GetPitchNode() is deprecated, will return NULL."
+        << " Use GetSceneNode() instead.\n";
+  return NULL;
 }
 
 //////////////////////////////////////////////////
@@ -881,6 +939,12 @@ std::string Camera::GetName() const
 }
 
 //////////////////////////////////////////////////
+std::string Camera::GetScopedName() const
+{
+  return this->scopedName;
+}
+
+//////////////////////////////////////////////////
 bool Camera::SaveFrame(const std::string &_filename)
 {
   return Camera::SaveFrame(this->saveFrameBuffer, this->GetImageWidth(),
@@ -893,10 +957,10 @@ std::string Camera::GetFrameFilename()
 {
   sdf::ElementPtr saveElem = this->sdf->GetElement("save");
 
-  std::string path = saveElem->GetValueString("path");
+  std::string path = saveElem->Get<std::string>("path");
   boost::filesystem::path pathToFile;
 
-  std::string friendlyName = this->GetName();
+  std::string friendlyName = this->scopedUniqueName;
 
   boost::replace_all(friendlyName, "::", "_");
 
@@ -970,8 +1034,13 @@ bool Camera::SaveFrame(const unsigned char *_image,
 
   // Write out
   Ogre::Codec::CodecDataPtr codecDataPtr(imgData);
-  pCodec->codeToFile(stream, filename, codecDataPtr);
 
+  // OGRE 1.9 renames codeToFile to encodeToFile
+  #if (OGRE_VERSION < ((1 << 16) | (9 << 8) | 0))
+  pCodec->codeToFile(stream, filename, codecDataPtr);
+  #else
+  pCodec->encodeToFile(stream, filename, codecDataPtr);
+  #endif
   return true;
 }
 
@@ -1136,20 +1205,31 @@ void Camera::SetCaptureDataOnce()
 }
 
 //////////////////////////////////////////////////
-void Camera::CreateRenderTexture(const std::string &textureName)
+void Camera::CreateRenderTexture(const std::string &_textureName)
 {
+  int fsaa = 4;
+
+  // Full-screen anti-aliasing only works correctly in 1.8 and above
+#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR < 8
+  fsaa = 0;
+#endif
+
   // Create the render texture
   this->renderTexture = (Ogre::TextureManager::getSingleton().createManual(
-      textureName,
+      _textureName,
       "General",
       Ogre::TEX_TYPE_2D,
       this->GetImageWidth(),
       this->GetImageHeight(),
       0,
       (Ogre::PixelFormat)this->imageFormat,
-      Ogre::TU_RENDERTARGET)).getPointer();
+      Ogre::TU_RENDERTARGET,
+      0,
+      false,
+      fsaa)).getPointer();
 
   this->SetRenderTarget(this->renderTexture->getBuffer()->getRenderTarget());
+
   this->initialized = true;
 }
 
@@ -1162,15 +1242,12 @@ ScenePtr Camera::GetScene() const
 //////////////////////////////////////////////////
 void Camera::CreateCamera()
 {
-  this->camera = this->scene->GetManager()->createCamera(this->name);
-
-  // Use X/Y as horizon, Z up
-  this->camera->pitch(Ogre::Degree(90));
+  this->camera = this->scene->GetManager()->createCamera(
+      this->scopedUniqueName);
 
-  // Don't yaw along variable axis, causes leaning
-  this->camera->setFixedYawAxis(true, Ogre::Vector3::UNIT_Z);
-
-  this->camera->setDirection(1, 0, 0);
+  this->camera->setFixedYawAxis(false);
+  this->camera->yaw(Ogre::Degree(-90.0));
+  this->camera->roll(Ogre::Degree(-90.0));
 }
 
 //////////////////////////////////////////////////
@@ -1195,9 +1272,9 @@ bool Camera::GetWorldPointOnPlane(int _x, int _y,
 }
 
 //////////////////////////////////////////////////
-void Camera::SetRenderTarget(Ogre::RenderTarget *target)
+void Camera::SetRenderTarget(Ogre::RenderTarget *_target)
 {
-  this->renderTarget = target;
+  this->renderTarget = _target;
 
   if (this->renderTarget)
   {
@@ -1205,12 +1282,14 @@ void Camera::SetRenderTarget(Ogre::RenderTarget *target)
     this->viewport = this->renderTarget->addViewport(this->camera);
     this->viewport->setClearEveryFrame(true);
     this->viewport->setShadowsEnabled(true);
+    this->viewport->setOverlaysEnabled(false);
 
     RTShaderSystem::AttachViewport(this->viewport, this->GetScene());
 
     this->viewport->setBackgroundColour(
         Conversions::Convert(this->scene->GetBackgroundColor()));
-    this->viewport->setVisibilityMask(GZ_VISIBILITY_ALL & ~GZ_VISIBILITY_GUI);
+    this->viewport->setVisibilityMask(GZ_VISIBILITY_ALL &
+        ~(GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE));
 
     double ratio = static_cast<double>(this->viewport->getActualWidth()) /
                    static_cast<double>(this->viewport->getActualHeight());
@@ -1224,58 +1303,39 @@ void Camera::SetRenderTarget(Ogre::RenderTarget *target)
     if (RenderEngine::Instance()->GetRenderPathType() == RenderEngine::DEFERRED)
     {
       // Deferred shading GBuffer compositor
-      this->dsGBufferInstance =
+      this->dataPtr->dsGBufferInstance =
         Ogre::CompositorManager::getSingleton().addCompositor(this->viewport,
             "DeferredShading/GBuffer");
 
       // Deferred lighting GBuffer compositor
-      this->dlGBufferInstance =
+      this->dataPtr->dlGBufferInstance =
         Ogre::CompositorManager::getSingleton().addCompositor(this->viewport,
             "DeferredLighting/GBuffer");
 
       // Deferred shading: Merging compositor
-      this->dsMergeInstance =
+      this->dataPtr->dsMergeInstance =
         Ogre::CompositorManager::getSingleton().addCompositor(this->viewport,
             "DeferredShading/ShowLit");
 
       // Deferred lighting: Merging compositor
-      this->dlMergeInstance =
+      this->dataPtr->dlMergeInstance =
         Ogre::CompositorManager::getSingleton().addCompositor(this->viewport,
             "DeferredLighting/ShowLit");
 
-
       // Screen space ambient occlusion
-      // this->ssaoInstance =
+      // this->dataPtr->this->ssaoInstance =
       //  Ogre::CompositorManager::getSingleton().addCompositor(this->viewport,
       //      "DeferredShading/SSAO");
 
-      this->dsGBufferInstance->setEnabled(false);
-      this->dsMergeInstance->setEnabled(false);
+      this->dataPtr->dsGBufferInstance->setEnabled(false);
+      this->dataPtr->dsMergeInstance->setEnabled(false);
 
-      this->dlGBufferInstance->setEnabled(true);
-      this->dlMergeInstance->setEnabled(true);
+      this->dataPtr->dlGBufferInstance->setEnabled(true);
+      this->dataPtr->dlMergeInstance->setEnabled(true);
 
-      // this->ssaoInstance->setEnabled(false);
+      // this->dataPtr->this->ssaoInstance->setEnabled(false);
     }
 
-    // Noise
-    if (this->noiseActive)
-    {
-      switch (this->noiseType)
-      {
-        case GAUSSIAN:
-          this->gaussianNoiseInstance =
-            Ogre::CompositorManager::getSingleton().addCompositor(
-              this->viewport, "CameraNoise/Gaussian");
-          this->gaussianNoiseInstance->setEnabled(true);
-          // gaussianNoiseCompositorListener was allocated in Load()
-          this->gaussianNoiseInstance->addListener(
-            this->gaussianNoiseCompositorListener.get());
-          break;
-        default:
-          GZ_ASSERT(false, "Invalid noise model type");
-      }
-    }
 
     if (this->GetScene()->skyx != NULL)
       this->renderTarget->addListener(this->GetScene()->skyx);
@@ -1283,6 +1343,28 @@ void Camera::SetRenderTarget(Ogre::RenderTarget *target)
 }
 
 //////////////////////////////////////////////////
+void Camera::AttachToVisual(uint32_t _visualId,
+                            bool _inheritOrientation,
+                            double _minDist, double _maxDist)
+{
+  msgs::Request request;
+  msgs::TrackVisual track;
+
+  track.set_name(this->GetName() + "_attach_to_visual_track");
+  track.set_id(_visualId);
+  track.set_min_dist(_minDist);
+  track.set_max_dist(_maxDist);
+  track.set_inherit_orientation(_inheritOrientation);
+
+  std::string *serializedData = request.mutable_data();
+  track.SerializeToString(serializedData);
+
+  request.set_request("attach_visual");
+  request.set_id(_visualId);
+  this->requests.push_back(request);
+}
+
+//////////////////////////////////////////////////
 void Camera::AttachToVisual(const std::string &_visualName,
                             bool _inheritOrientation,
                             double _minDist, double _maxDist)
@@ -1290,6 +1372,13 @@ void Camera::AttachToVisual(const std::string &_visualName,
   msgs::Request request;
   msgs::TrackVisual track;
 
+  VisualPtr visual = this->scene->GetVisual(_visualName);
+
+  if (visual)
+    track.set_id(visual->GetId());
+  else
+    track.set_id(GZ_UINT32_MAX);
+
   track.set_name(_visualName);
   track.set_min_dist(_minDist);
   track.set_max_dist(_maxDist);
@@ -1314,6 +1403,15 @@ void Camera::TrackVisual(const std::string &_name)
 }
 
 //////////////////////////////////////////////////
+bool Camera::AttachToVisualImpl(uint32_t _id,
+    bool _inheritOrientation, double _minDist, double _maxDist)
+{
+  VisualPtr visual = this->scene->GetVisual(_id);
+  return this->AttachToVisualImpl(visual, _inheritOrientation,
+                                  _minDist, _maxDist);
+}
+
+//////////////////////////////////////////////////
 bool Camera::AttachToVisualImpl(const std::string &_name,
     bool _inheritOrientation, double _minDist, double _maxDist)
 {
@@ -1348,10 +1446,7 @@ bool Camera::TrackVisualImpl(const std::string &_name)
   if (visual)
     return this->TrackVisualImpl(visual);
   else
-  {
-    this->trackedVisual.reset();
-    this->camera->setAutoTracking(false, NULL);
-  }
+    this->dataPtr->trackedVisual.reset();
 
   return false;
 }
@@ -1359,33 +1454,40 @@ bool Camera::TrackVisualImpl(const std::string &_name)
 //////////////////////////////////////////////////
 bool Camera::TrackVisualImpl(VisualPtr _visual)
 {
-  this->sceneNode->getParent()->removeChild(this->sceneNode);
+  // if (this->sceneNode->getParent())
+  //  this->sceneNode->getParent()->removeChild(this->sceneNode);
 
+  bool result = false;
   if (_visual)
   {
-    this->camera->setAutoTracking(true, _visual->GetSceneNode());
-    this->trackedVisual = _visual;
+    this->dataPtr->trackVisualPID.Init(0.25, 0, 0, 0, 0, 1.0, 0.0);
+    this->dataPtr->trackVisualPitchPID.Init(0.05, 0, 0, 0, 0, 1.0, 0.0);
+    this->dataPtr->trackVisualYawPID.Init(0.05, 0, 0, 0, 0, 1.0, 0.0);
+
+    this->dataPtr->trackedVisual = _visual;
+    result = true;
   }
   else
   {
-    this->trackedVisual.reset();
-    this->camera->setAutoTracking(false, NULL);
-    // this->camera->setPosition(Ogre::Vector3(0, 0, 0));
-    // this->camera->setOrientation(Ogre::Quaternion(-.5, -.5, .5, .5));
+    this->dataPtr->trackedVisual.reset();
   }
-  return true;
+
+  return result;
 }
 
+//////////////////////////////////////////////////
 Ogre::Texture *Camera::GetRenderTexture() const
 {
   return this->renderTexture;
 }
 
+/////////////////////////////////////////////////
 math::Vector3 Camera::GetDirection() const
 {
   return Conversions::Convert(this->camera->getDerivedDirection());
 }
 
+/////////////////////////////////////////////////
 bool Camera::IsVisible(VisualPtr _visual)
 {
   if (this->camera && _visual)
@@ -1395,6 +1497,7 @@ bool Camera::IsVisible(VisualPtr _visual)
     box.setMinimum(bbox.min.x, bbox.min.y, bbox.min.z);
     box.setMaximum(bbox.max.x, bbox.max.y, bbox.max.z);
 
+    box.transformAffine(_visual->GetSceneNode()->_getFullTransform());
     return this->camera->isVisible(box);
   }
 
@@ -1418,7 +1521,7 @@ bool Camera::MoveToPosition(const math::Pose &_pose, double _time)
 {
   if (this->animState)
   {
-    this->moveToPositionQueue.push_back(std::make_pair(_pose, _time));
+    this->dataPtr->moveToPositionQueue.push_back(std::make_pair(_pose, _time));
     return false;
   }
 
@@ -1433,8 +1536,9 @@ bool Camera::MoveToPosition(const math::Pose &_pose, double _time)
   else if (dyaw < -M_PI)
     rpy.z -= 2*M_PI;
 
-  Ogre::Quaternion yawFinal(Ogre::Radian(rpy.z), Ogre::Vector3(0, 0, 1));
-  Ogre::Quaternion pitchFinal(Ogre::Radian(rpy.y), Ogre::Vector3(0, 1, 0));
+  math::Quaternion pitchYawOnly(0, rpy.y, rpy.z);
+  Ogre::Quaternion pitchYawFinal(pitchYawOnly.w, pitchYawOnly.x,
+    pitchYawOnly.y, pitchYawOnly.z);
 
   std::string trackName = "cameratrack";
   int i = 0;
@@ -1450,21 +1554,15 @@ bool Camera::MoveToPosition(const math::Pose &_pose, double _time)
   anim->setInterpolationMode(Ogre::Animation::IM_SPLINE);
 
   Ogre::NodeAnimationTrack *strack = anim->createNodeTrack(0, this->sceneNode);
-  Ogre::NodeAnimationTrack *ptrack = anim->createNodeTrack(1, this->pitchNode);
 
   key = strack->createNodeKeyFrame(0);
   key->setTranslate(Ogre::Vector3(start.x, start.y, start.z));
   key->setRotation(this->sceneNode->getOrientation());
 
-  key = ptrack->createNodeKeyFrame(0);
-  key->setRotation(this->pitchNode->getOrientation());
-
   key = strack->createNodeKeyFrame(_time);
   key->setTranslate(Ogre::Vector3(_pose.pos.x, _pose.pos.y, _pose.pos.z));
-  key->setRotation(yawFinal);
+  key->setRotation(pitchYawFinal);
 
-  key = ptrack->createNodeKeyFrame(_time);
-  key->setRotation(pitchFinal);
 
   this->animState =
     this->scene->GetManager()->createAnimationState(trackName);
@@ -1503,15 +1601,11 @@ bool Camera::MoveToPositions(const std::vector<math::Pose> &_pts,
   anim->setInterpolationMode(Ogre::Animation::IM_SPLINE);
 
   Ogre::NodeAnimationTrack *strack = anim->createNodeTrack(0, this->sceneNode);
-  Ogre::NodeAnimationTrack *ptrack = anim->createNodeTrack(1, this->pitchNode);
 
   key = strack->createNodeKeyFrame(0);
   key->setTranslate(Ogre::Vector3(start.x, start.y, start.z));
   key->setRotation(this->sceneNode->getOrientation());
 
-  key = ptrack->createNodeKeyFrame(0);
-  key->setRotation(this->pitchNode->getOrientation());
-
   double dt = _time / (_pts.size()-1);
   double tt = 0;
 
@@ -1528,15 +1622,14 @@ bool Camera::MoveToPositions(const std::vector<math::Pose> &_pts,
       rpy.z -= 2*M_PI;
 
     prevYaw = rpy.z;
-    Ogre::Quaternion yawFinal(Ogre::Radian(rpy.z), Ogre::Vector3(0, 0, 1));
-    Ogre::Quaternion pitchFinal(Ogre::Radian(rpy.y), Ogre::Vector3(0, 1, 0));
+
+    math::Quaternion pitchYawOnly(0, rpy.y, rpy.z);
+    Ogre::Quaternion pitchYawFinal(pitchYawOnly.w, pitchYawOnly.x,
+      pitchYawOnly.y, pitchYawOnly.z);
 
     key = strack->createNodeKeyFrame(tt);
     key->setTranslate(Ogre::Vector3(pos.x, pos.y, pos.z));
-    key->setRotation(yawFinal);
-
-    key = ptrack->createNodeKeyFrame(tt);
-    key->setRotation(pitchFinal);
+    key->setRotation(pitchYawFinal);
 
     tt += dt;
   }
@@ -1555,15 +1648,15 @@ bool Camera::MoveToPositions(const std::vector<math::Pose> &_pts,
 void Camera::SetRenderRate(double _hz)
 {
   if (_hz > 0.0)
-    this->renderPeriod = 1.0 / _hz;
+    this->dataPtr->renderPeriod = 1.0 / _hz;
   else
-    this->renderPeriod = 0.0;
+    this->dataPtr->renderPeriod = 0.0;
 }
 
 //////////////////////////////////////////////////
 double Camera::GetRenderRate() const
 {
-  return 1.0 / this->renderPeriod.Double();
+  return 1.0 / this->dataPtr->renderPeriod.Double();
 }
 
 //////////////////////////////////////////////////
@@ -1572,13 +1665,14 @@ void Camera::AnimationComplete()
 }
 
 //////////////////////////////////////////////////
-bool Camera::IsInitialized() const
+bool Camera::GetInitialized() const
 {
-  return this->GetInitialized();
+  return this->initialized && this->scene->GetInitialized();
 }
 
 //////////////////////////////////////////////////
-bool Camera::GetInitialized() const
+void Camera::OnCmdMsg(ConstCameraCmdPtr &_msg)
 {
-  return this->initialized && this->scene->GetInitialized();
+  boost::mutex::scoped_lock lock(this->dataPtr->receiveMutex);
+  this->dataPtr->commandMsgs.push_back(_msg);
 }
diff --git a/gazebo/rendering/Camera.hh b/gazebo/rendering/Camera.hh
index b1e7620..b23e33f 100644
--- a/gazebo/rendering/Camera.hh
+++ b/gazebo/rendering/Camera.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,13 +14,9 @@
  * limitations under the License.
  *
 */
-/* Desc: A persepective OGRE Camera
- * Author: Nate Koenig
- * Date: 15 July 2003
- */
 
-#ifndef _RENDERING_CAMERA_HH_
-#define _RENDERING_CAMERA_HH_
+#ifndef _GAZEBO_RENDERING_CAMERA_HH_
+#define _GAZEBO_RENDERING_CAMERA_HH_
 
 #include <boost/enable_shared_from_this.hpp>
 #include <string>
@@ -28,18 +24,25 @@
 #include <list>
 #include <vector>
 #include <deque>
+#include <sdf/sdf.hh>
 
-#include "common/Event.hh"
-#include "common/Time.hh"
+#include "gazebo/msgs/msgs.hh"
 
-#include "math/Angle.hh"
-#include "math/Pose.hh"
-#include "math/Plane.hh"
-#include "math/Vector2i.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Subscriber.hh"
 
-#include "msgs/MessageTypes.hh"
-#include "rendering/RenderTypes.hh"
-#include "sdf/sdf.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/common/PID.hh"
+#include "gazebo/common/Time.hh"
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/math/Plane.hh"
+#include "gazebo/math/Vector2i.hh"
+
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 // Forward Declarations
 namespace Ogre
@@ -50,7 +53,6 @@ namespace Ogre
   class Viewport;
   class SceneNode;
   class AnimationState;
-  class CompositorInstance;
 }
 
 namespace gazebo
@@ -62,7 +64,7 @@ namespace gazebo
     class MouseEvent;
     class ViewController;
     class Scene;
-    class GaussianNoiseCompositorListener;
+    class CameraPrivate;
 
     /// \addtogroup gazebo_rendering Rendering
     /// \brief A set of rendering related class, functions, and definitions
@@ -72,7 +74,7 @@ namespace gazebo
     /// \brief Basic camera sensor
     ///
     /// This is the base class for all cameras.
-    class Camera : public boost::enable_shared_from_this<Camera>
+    class GAZEBO_VISIBLE Camera : public boost::enable_shared_from_this<Camera>
     {
       /// \brief Constructor
       /// \param[in] _namePrefix Unique prefix name for the camera.
@@ -102,12 +104,20 @@ namespace gazebo
       /// \return The Hz rate
       public: double GetRenderRate() const;
 
-      /// \brief Render the camera
-      ///
+      /// \brief Render the camera.
       /// Called after the pre-render signal. This function will generate
-      /// camera images
+      /// camera images.
+      // \todo Deprecated in Gazebo 2.1. In Gazebo 3.0 remove this function,
+      // and change Render(bool _force) to have a default value of false.
       public: void Render();
 
+      /// \brief Render the camera.
+      /// Called after the pre-render signal. This function will generate
+      /// camera images.
+      /// \param[in] _force Force camera to render. Ignore camera update
+      /// rate.
+      public: void Render(bool _force);
+
       /// \brief Post render
       ///
       /// Called afer the render signal.
@@ -125,10 +135,6 @@ namespace gazebo
       /// This function is called before the camera is destructed
       public: virtual void Fini();
 
-      /// Deprecated.
-      /// \sa GetInitialized
-      public: inline bool IsInitialized() const GAZEBO_DEPRECATED(1.5);
-
       /// \brief Return true if the camera has been initialized
       /// \return True if initialized was successful
       public: bool GetInitialized() const;
@@ -146,10 +152,6 @@ namespace gazebo
       /// \param[in] _scene Pointer to the scene
       public: void SetScene(ScenePtr _scene);
 
-      /// \brief Get the global pose of the camera
-      /// \return Pose of the camera in the world coordinate frame
-      public: math::Pose GetWorldPose();
-
       /// \brief Get the camera position in the world
       /// \return The world position of the camera
       public: math::Vector3 GetWorldPosition() const;
@@ -162,6 +164,10 @@ namespace gazebo
       /// \param[in] _pose The new math::Pose of the camera
       public: virtual void SetWorldPose(const math::Pose &_pose);
 
+      /// \brief Get the world pose.
+      /// \return The pose of the camera in the world coordinate frame.
+      public: math::Pose GetWorldPose() const;
+
       /// \brief Set the world position
       /// \param[in] _pos The new position of the camera
       public: void SetWorldPosition(const math::Vector3 &_pos);
@@ -268,6 +274,10 @@ namespace gazebo
       /// \param[in] _enable Set to True to enable saving of frames
       public: void EnableSaveFrame(bool _enable);
 
+      /// \brief Return the value of this->captureData.
+      /// \return True if the camera is set to capture data.
+      public: bool GetCaptureData() const;
+
       /// \brief Set the save frame pathname
       /// \param[in] _pathname Directory in which to store saved image frames
       public: void SetSaveFramePathname(const std::string &_pathname);
@@ -303,11 +313,11 @@ namespace gazebo
 
       /// \brief Get the average FPS
       /// \return The average frames per second
-      public: virtual float GetAvgFPS() {return 0;}
+      public: virtual float GetAvgFPS() const {return 0;}
 
       /// \brief Get the triangle count
       /// \return The current triangle count
-      public: virtual unsigned int GetTriangleCount() {return 0;}
+      public: virtual unsigned int GetTriangleCount() const {return 0;}
 
       /// \brief Set the aspect ratio
       /// \param[in] _ratio The aspect ratio (width / height) in pixels
@@ -325,9 +335,9 @@ namespace gazebo
       /// \return The scene node the camera is attached to
       public: Ogre::SceneNode *GetSceneNode() const;
 
-      /// \brief Get the camera's pitch scene node
-      /// \return The pitch node the camera is attached to
-      public: Ogre::SceneNode *GetPitchNode() const;
+      /// \brief Deprecated: Get the camera's pitch scene node
+      /// \return NULL. Use GetSceheNode() instead.
+      public: Ogre::SceneNode *GetPitchNode() const GAZEBO_DEPRECATED(3.0);
 
       /// \brief Get a pointer to the image data
       ///
@@ -336,10 +346,14 @@ namespace gazebo
       /// \return Pointer to the raw data, null if data is not available.
       public: virtual const unsigned char *GetImageData(unsigned int i = 0);
 
-      /// \brief Get the camera's name
+      /// \brief Get the camera's unscoped name
       /// \return The name of the camera
       public: std::string GetName() const;
 
+      /// \brief Get the camera's scoped name (scene_name::camera_name)
+      /// \return The name of the camera
+      public: std::string GetScopedName() const;
+
       /// \brief Set the camera's name
       /// \param[in] _name New name for the camera
       public: void SetName(const std::string &_name);
@@ -402,6 +416,18 @@ namespace gazebo
                   bool _inheritOrientation,
                   double _minDist = 0.0, double _maxDist = 0.0);
 
+      /// \brief Attach the camera to a scene node
+      /// \param[in] _id ID of the visual to attach the camera to
+      /// \param[in] _inheritOrientation True means camera acquires the visual's
+      /// orientation
+      /// \param[in] _minDist Minimum distance the camera is allowed to get to
+      /// the visual
+      /// \param[in] _maxDist Maximum distance the camera is allowd to get from
+      /// the visual
+      public: void AttachToVisual(uint32_t _id,
+                  bool _inheritOrientation,
+                  double _minDist = 0.0, double _maxDist = 0.0);
+
       /// \brief Set the camera to track a scene node
       /// \param[in] _visualName Name of the visual to track
       public: void TrackVisual(const std::string &_visualName);
@@ -485,6 +511,9 @@ namespace gazebo
       /// \brief Implementation of the render call
       protected: virtual void RenderImpl();
 
+      /// \brief Read image data from pixel buffer
+      protected: void ReadPixelBuffer();
+
       /// \brief Implementation of the Camera::TrackVisual call
       /// \param[in] _visualName Name of the visual to track
       /// \return True if able to track the visual
@@ -508,6 +537,19 @@ namespace gazebo
                      bool _inheritOrientation,
                      double _minDist = 0, double _maxDist = 0);
 
+      /// \brief Attach the camera to a scene node
+      /// \param[in] _id ID of the visual to attach the camera to
+      /// \param[in] _inheritOrientation True means camera acquires the visual's
+      /// orientation
+      /// \param[in] _minDist Minimum distance the camera is allowed to get to
+      /// the visual
+      /// \param[in] _maxDist Maximum distance the camera is allowd to get from
+      /// the visual
+      /// \return True on success
+      protected: virtual bool AttachToVisualImpl(uint32_t _id,
+                     bool _inheritOrientation,
+                     double _minDist = 0, double _maxDist = 0);
+
       /// \brief Attach the camera to a visual
       /// \param[in] _visual The visual to attach the camera to
       /// \param[in] _inheritOrientation True means camera acquires the visual's
@@ -547,6 +589,9 @@ namespace gazebo
       /// \return Integer representation of the Ogre image format
       private: static int GetOgrePixelFormat(const std::string &_format);
 
+      /// \brief Receive command message.
+      /// \param[in] _msg Camera Command message.
+      private: void OnCmdMsg(ConstCameraCmdPtr &_msg);
 
       /// \brief Create the ogre camera.
       private: void CreateCamera();
@@ -554,6 +599,12 @@ namespace gazebo
       /// \brief Name of the camera.
       protected: std::string name;
 
+      /// \brief Scene scoped name of the camera.
+      protected: std::string scopedName;
+
+      /// \brief Scene scoped name of the camera with a unique ID.
+      protected: std::string scopedUniqueName;
+
       /// \brief Camera's SDF values.
       protected: sdf::ElementPtr sdf;
 
@@ -572,12 +623,9 @@ namespace gazebo
       /// \brief Viewport the ogre camera uses.
       protected: Ogre::Viewport *viewport;
 
-      /// \brief Scene node that controls camera position.
+      /// \brief Scene node that controls camera position and orientation.
       protected: Ogre::SceneNode *sceneNode;
 
-      /// \brief Scene nod that controls camera pitch.
-      protected: Ogre::SceneNode *pitchNode;
-
       // \brief Buffer for a single image frame.
       protected: unsigned char *saveFrameBuffer;
 
@@ -643,64 +691,9 @@ namespace gazebo
       /// \brief User callback for when an animation completes.
       protected: boost::function<void()> onAnimationComplete;
 
-      /// \brief Pointer to image SDF element.
-      private: sdf::ElementPtr imageElem;
-
-      /// \brief Visual that the camera is tracking.
-      private: VisualPtr trackedVisual;
-
-      /// \brief Counter used to create unique camera names.
-      private: static unsigned int cameraCounter;
-
-      /// \brief Deferred shading geometry buffer.
-      private: Ogre::CompositorInstance *dsGBufferInstance;
-
-      /// \brief Deferred shading merge compositor.
-      private: Ogre::CompositorInstance *dsMergeInstance;
-
-      /// \brief Deferred lighting geometry buffer.
-      private: Ogre::CompositorInstance *dlGBufferInstance;
-
-      /// \brief Deferred lighting merge compositor.
-      private: Ogre::CompositorInstance *dlMergeInstance;
-
-      /// \brief Screen space ambient occlusion compositor.
-      private: Ogre::CompositorInstance *ssaoInstance;
-
-      /// \brief Gaussian noise compositor
-      private: Ogre::CompositorInstance *gaussianNoiseInstance;
-
-      /// \brief Gaussian noise compositor listener
-      private: boost::shared_ptr<GaussianNoiseCompositorListener>
-        gaussianNoiseCompositorListener;
-
-      /// \brief Queue of move positions.
-      private: std::deque<std::pair<math::Pose, double> > moveToPositionQueue;
-
-      /// \brief Render period.
-      private: common::Time renderPeriod;
-
-      /// \brief Which noise type we support
-      private: enum NoiseModelType
-      {
-        NONE,
-        GAUSSIAN
-      };
-
-      /// \brief If true, apply the noise model specified by other
-      /// noise parameters
-      private: bool noiseActive;
-
-      /// \brief Which type of noise we're applying
-      private: enum NoiseModelType noiseType;
-
-      /// \brief If noiseType==GAUSSIAN, noiseMean is the mean of the
-      /// distibution from which we sample
-      private: double noiseMean;
-
-      /// \brief If noiseType==GAUSSIAN, noiseStdDev is the standard
-      /// devation of the distibution from which we sample
-      private: double noiseStdDev;
+      /// \internal
+      /// \brief Pointer to private data.
+      private: CameraPrivate *dataPtr;
     };
     /// \}
   }
diff --git a/gazebo/rendering/CameraPrivate.hh b/gazebo/rendering/CameraPrivate.hh
new file mode 100644
index 0000000..1982c55
--- /dev/null
+++ b/gazebo/rendering/CameraPrivate.hh
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2012-2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_RENDERING_CAMERA_PRIVATE_HH_
+#define _GAZEBO_RENDERING_CAMERA_PRIVATE_HH_
+
+#include <deque>
+#include <utility>
+#include <list>
+
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/util/system.hh"
+
+namespace Ogre
+{
+  class CompositorInstance;
+}
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the Camera class
+    class GAZEBO_VISIBLE CameraPrivate
+    {
+      /// \brief Visual that the camera is tracking.
+      public: VisualPtr trackedVisual;
+
+      /// \brief Counter used to create unique camera names.
+      public: static unsigned int cameraCounter;
+
+      /// \brief Deferred shading geometry buffer.
+      public: Ogre::CompositorInstance *dsGBufferInstance;
+
+      /// \brief Deferred shading merge compositor.
+      public: Ogre::CompositorInstance *dsMergeInstance;
+
+      /// \brief Deferred lighting geometry buffer.
+      public: Ogre::CompositorInstance *dlGBufferInstance;
+
+      /// \brief Deferred lighting merge compositor.
+      public: Ogre::CompositorInstance *dlMergeInstance;
+
+      /// \brief Screen space ambient occlusion compositor.
+      public: Ogre::CompositorInstance *ssaoInstance;
+
+      /// \brief Queue of move positions.
+      public: std::deque<std::pair<math::Pose, double> > moveToPositionQueue;
+
+      /// \brief Render period.
+      public: common::Time renderPeriod;
+
+      /// \brief Position PID used to track a visual smoothly.
+      public: common::PID trackVisualPID;
+
+      /// \brief Pitch PID used to track a visual smoothly.
+      public: common::PID trackVisualPitchPID;
+
+      /// \brief Yaw PID used to track a visual smoothly.
+      public: common::PID trackVisualYawPID;
+
+      /// \brief Communication Node
+      public: transport::NodePtr node;
+
+      /// \brief Subscribe to camera command topic
+      public: transport::SubscriberPtr cmdSub;
+
+      /// \def CameraCmdMsgs_L
+      /// \brief List for holding camera command messages.
+      typedef std::list<boost::shared_ptr<msgs::CameraCmd const> >
+        CameraCmdMsgs_L;
+
+      /// \brief List of camera cmd messages.
+      public: CameraCmdMsgs_L commandMsgs;
+
+      /// \brief Mutex to lock the various message buffers.
+      public: boost::mutex receiveMutex;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/CameraVisual.cc b/gazebo/rendering/CameraVisual.cc
index d251dc6..1d345c3 100644
--- a/gazebo/rendering/CameraVisual.cc
+++ b/gazebo/rendering/CameraVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,36 +18,48 @@
  * Author: Nate Koenig
  */
 
-#include "rendering/ogre_gazebo.h"
-#include "rendering/DynamicLines.hh"
-#include "rendering/Scene.hh"
-#include "rendering/Camera.hh"
-#include "rendering/CameraVisual.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/rendering/CameraVisualPrivate.hh"
+#include "gazebo/rendering/CameraVisual.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
-/// \brief Constructor
+/////////////////////////////////////////////////
 CameraVisual::CameraVisual(const std::string &_name, VisualPtr _vis)
-: Visual(_name, _vis)
+: Visual(*new CameraVisualPrivate, _name, _vis)
 {
 }
 
+/////////////////////////////////////////////////
 CameraVisual::~CameraVisual()
 {
-  this->camera.reset();
+  CameraVisualPrivate *dPtr =
+      reinterpret_cast<CameraVisualPrivate *>(this->dataPtr);
+
+  if (dPtr->scene)
+    dPtr->scene->RemoveCamera(dPtr->camera->GetName());
+
+  dPtr->camera.reset();
 }
 
+/////////////////////////////////////////////////
 void CameraVisual::Load(unsigned int _width, unsigned int _height)
 {
+  CameraVisualPrivate *dPtr =
+      reinterpret_cast<CameraVisualPrivate *>(this->dataPtr);
+
   double dist = 2.0;
   double width = 1.0;
   double height = _height / static_cast<double>(_width);
 
-  this->camera = this->scene->CreateCamera(this->GetName(), true);
-  this->camera->Load();
-  this->camera->Init();
-  this->camera->CreateRenderTexture(this->GetName() + "_RTT");
+  dPtr->camera = dPtr->scene->CreateCamera(this->GetName(), false);
+  dPtr->camera->Load();
+  dPtr->camera->Init();
+  dPtr->camera->CreateRenderTexture(this->GetName() + "_RTT");
 
   Ogre::MaterialPtr material =
     Ogre::MaterialManager::getSingleton().create(
@@ -71,7 +83,7 @@ void CameraVisual::Load(unsigned int _width, unsigned int _height)
       Ogre::Vector3::UNIT_Z);
 
   Ogre::Entity* planeEnt =
-    this->scene->GetManager()->createEntity(this->GetName() + "__plane",
+    dPtr->scene->GetManager()->createEntity(this->GetName() + "__plane",
         this->GetName() + "__floor");
   planeEnt->setMaterialName(this->GetName()+"_RTT_material");
   planeEnt->setCastShadows(false);
@@ -95,7 +107,26 @@ void CameraVisual::Load(unsigned int _width, unsigned int _height)
   line->setVisibilityFlags(GZ_VISIBILITY_GUI);
 
   this->AttachObject(planeEnt);
-  this->camera->AttachToVisual(this->GetName(), true);
+  dPtr->camera->AttachToVisual(this->GetId(), true);
 
   this->SetVisibilityFlags(GZ_VISIBILITY_GUI);
+
+  if (dPtr->parent)
+    dPtr->parent->AttachVisual(shared_from_this());
+
+  dPtr->connections.push_back(
+      event::Events::ConnectRender(
+      boost::bind(&CameraVisual::Update, this)));
+}
+
+/////////////////////////////////////////////////
+void CameraVisual::Update()
+{
+  CameraVisualPrivate *dPtr =
+      reinterpret_cast<CameraVisualPrivate *>(this->dataPtr);
+
+  if (!dPtr->camera)
+    return;
+
+  dPtr->camera->Render();
 }
diff --git a/gazebo/rendering/CameraVisual.hh b/gazebo/rendering/CameraVisual.hh
index 7f5c839..6b6f3c7 100644
--- a/gazebo/rendering/CameraVisual.hh
+++ b/gazebo/rendering/CameraVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,16 +14,15 @@
  * limitations under the License.
  *
 */
-/* Desc: Camera Visualization Class
- * Author: Nate Koenig
- */
 
-#ifndef CAMERAVISUAL_HH
-#define CAMERAVISUAL_HH
+#ifndef _CAMERAVISUAL_HH_
+#define _CAMERAVISUAL_HH_
 
 #include <string>
 
-#include "rendering/Visual.hh"
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -40,7 +39,7 @@ namespace gazebo
     /// This class is used to visualize a camera image generated from
     /// a CameraSensor. The sensor's image is drawn on a billboard in the 3D
     /// environment.
-    class CameraVisual : public Visual
+    class GAZEBO_VISIBLE CameraVisual : public Visual
     {
       /// \brief Constructor
       /// \param[in] _name Name of the Visual
@@ -54,8 +53,10 @@ namespace gazebo
       /// \param[in] _width Width of the Camera image
       /// \param[in] _height Height of the Camera image
       public: void Load(unsigned int _width, unsigned int _height);
+      using Visual::Load;
 
-      private: CameraPtr camera;
+      /// \brief Update the visual
+      private: void Update();
     };
     /// \}
   }
diff --git a/gazebo/rendering/CameraVisualPrivate.hh b/gazebo/rendering/CameraVisualPrivate.hh
new file mode 100644
index 0000000..4cf716b
--- /dev/null
+++ b/gazebo/rendering/CameraVisualPrivate.hh
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef CAMERAVISUAL_PRIVATE_HH
+#define CAMERAVISUAL_PRIVATE_HH
+
+#include <vector>
+
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    class Camera;
+    class VisualPrivate;
+
+    class CameraVisualPrivate : public VisualPrivate
+    {
+      /// \brief Event connections.
+      public: std::vector<event::ConnectionPtr> connections;
+
+      /// \brief Pointer to the camera.
+      public: CameraPtr camera;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/ContactVisual.cc b/gazebo/rendering/ContactVisual.cc
index 0edf455..978e220 100644
--- a/gazebo/rendering/ContactVisual.cc
+++ b/gazebo/rendering/ContactVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
 #include "gazebo/rendering/Conversions.hh"
 #include "gazebo/rendering/Scene.hh"
 #include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/ContactVisualPrivate.hh"
 #include "gazebo/rendering/ContactVisual.hh"
 
 using namespace gazebo;
@@ -35,21 +36,24 @@ using namespace rendering;
 /////////////////////////////////////////////////
 ContactVisual::ContactVisual(const std::string &_name, VisualPtr _vis,
                              const std::string &_topicName)
-: Visual(_name, _vis)
+: Visual(*new ContactVisualPrivate, _name, _vis)
 {
-  this->receivedMsg = false;
+  ContactVisualPrivate *dPtr =
+      reinterpret_cast<ContactVisualPrivate *>(this->dataPtr);
 
-  this->node = transport::NodePtr(new transport::Node());
-  this->node->Init(this->scene->GetName());
+  dPtr->receivedMsg = false;
 
-  this->topicName = _topicName;
-  this->contactsSub = this->node->Subscribe(this->topicName,
+  dPtr->node = transport::NodePtr(new transport::Node());
+  dPtr->node->Init(dPtr->scene->GetName());
+
+  dPtr->topicName = _topicName;
+  dPtr->contactsSub = dPtr->node->Subscribe(dPtr->topicName,
       &ContactVisual::OnContact, this);
 
   common::MeshManager::Instance()->CreateSphere("contact_sphere", 0.02, 10, 10);
 
   // Add the mesh into OGRE
-  if (!this->sceneNode->getCreator()->hasEntity("contact_sphere") &&
+  if (!dPtr->sceneNode->getCreator()->hasEntity("contact_sphere") &&
       common::MeshManager::Instance()->HasMesh("contact_sphere"))
   {
     const common::Mesh *mesh =
@@ -57,7 +61,7 @@ ContactVisual::ContactVisual(const std::string &_name, VisualPtr _vis,
     this->InsertMesh(mesh);
   }
 
-  this->connections.push_back(
+  dPtr->connections.push_back(
       event::Events::ConnectPreRender(
         boost::bind(&ContactVisual::Update, this)));
 }
@@ -70,9 +74,12 @@ ContactVisual::~ContactVisual()
 /////////////////////////////////////////////////
 void ContactVisual::Update()
 {
-  boost::mutex::scoped_lock lock(this->mutex);
+  ContactVisualPrivate *dPtr =
+      reinterpret_cast<ContactVisualPrivate *>(this->dataPtr);
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
 
-  if (!this->contactsMsg || !this->receivedMsg)
+  if (!dPtr->contactsMsg || !dPtr->receivedMsg)
     return;
 
   // The following values are used to calculate normal scaling factor based
@@ -84,18 +91,18 @@ void ContactVisual::Update()
   double offset = vRange - vMin;
 
   unsigned int c = 0;
-  for (int i = 0; i < this->contactsMsg->contact_size(); i++)
+  for (int i = 0; i < dPtr->contactsMsg->contact_size(); i++)
   {
-    for (int j = 0; j < this->contactsMsg->contact(i).position_size(); j++)
+    for (int j = 0; j < dPtr->contactsMsg->contact(i).position_size(); j++)
     {
       math::Vector3 pos = msgs::Convert(
-          this->contactsMsg->contact(i).position(j));
+          dPtr->contactsMsg->contact(i).position(j));
       math::Vector3 normal = msgs::Convert(
-          this->contactsMsg->contact(i).normal(j));
-      double depth = this->contactsMsg->contact(i).depth(j);
+          dPtr->contactsMsg->contact(i).normal(j));
+      double depth = dPtr->contactsMsg->contact(i).depth(j);
 
       math::Vector3 force = msgs::Convert(
-          this->contactsMsg->contact(i).wrench(j).body_1_force());
+          dPtr->contactsMsg->contact(i).wrench(j).body_1_wrench().force());
 
       // Scaling factor for the normal line.
       // Eq in the family of Y = 1/(1+exp(-(x^2)))
@@ -103,59 +110,66 @@ void ContactVisual::Update()
           (-force.GetSquaredLength() / magScale)) - offset;
 
       // Create a new contact visualization point if necessary
-      if (c >= this->points.size())
+      if (c >= dPtr->points.size())
         this->CreateNewPoint();
 
-      this->points[c]->sceneNode->setVisible(true);
-      this->points[c]->sceneNode->setPosition(Conversions::Convert(pos));
+      dPtr->points[c]->sceneNode->setVisible(true);
+      dPtr->points[c]->sceneNode->setPosition(Conversions::Convert(pos));
 
-      this->points[c]->normal->SetPoint(1, normal*normalScale);
-      this->points[c]->depth->SetPoint(1, normal*-depth*10);
+      dPtr->points[c]->normal->SetPoint(1, normal*normalScale);
+      dPtr->points[c]->depth->SetPoint(1, normal*-depth*10);
 
-      this->points[c]->normal->setMaterial("Gazebo/LightOn");
-      this->points[c]->depth->setMaterial("Gazebo/LightOff");
-      this->points[c]->depth->Update();
-      this->points[c]->normal->Update();
+      dPtr->points[c]->normal->setMaterial("Gazebo/LightOn");
+      dPtr->points[c]->depth->setMaterial("Gazebo/LightOff");
+      dPtr->points[c]->depth->Update();
+      dPtr->points[c]->normal->Update();
       c++;
     }
   }
 
-  for ( ; c < this->points.size(); c++)
-    this->points[c]->sceneNode->setVisible(false);
+  for ( ; c < dPtr->points.size(); c++)
+    dPtr->points[c]->sceneNode->setVisible(false);
 
-  this->receivedMsg = false;
+  dPtr->receivedMsg = false;
 }
 
 /////////////////////////////////////////////////
 void ContactVisual::OnContact(ConstContactsPtr &_msg)
 {
-  boost::mutex::scoped_lock lock(this->mutex);
-  if (this->enabled)
+  ContactVisualPrivate *dPtr =
+      reinterpret_cast<ContactVisualPrivate *>(this->dataPtr);
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+  if (dPtr->enabled)
   {
-    this->contactsMsg = _msg;
-    this->receivedMsg = true;
+    dPtr->contactsMsg = _msg;
+    dPtr->receivedMsg = true;
   }
 }
 
 /////////////////////////////////////////////////
 void ContactVisual::SetEnabled(bool _enabled)
 {
-  boost::mutex::scoped_lock lock(this->mutex);
-  this->enabled = _enabled;
+  ContactVisualPrivate *dPtr =
+      reinterpret_cast<ContactVisualPrivate *>(this->dataPtr);
 
-  if (!enabled)
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+
+  dPtr->enabled = _enabled;
+
+  if (!dPtr->enabled)
   {
-    this->contactsSub.reset();
+    dPtr->contactsSub.reset();
 
-    this->contactsMsg.reset();
-    this->receivedMsg = false;
+    dPtr->contactsMsg.reset();
+    dPtr->receivedMsg = false;
 
-    for (unsigned int c = 0 ; c < this->points.size(); c++)
-      this->points[c]->sceneNode->setVisible(false);
+    for (unsigned int c = 0 ; c < dPtr->points.size(); c++)
+      dPtr->points[c]->sceneNode->setVisible(false);
   }
-  else if (!this->contactsSub)
+  else if (!dPtr->contactsSub)
   {
-    this->contactsSub = this->node->Subscribe(this->topicName,
+    dPtr->contactsSub = dPtr->node->Subscribe(dPtr->topicName,
         &ContactVisual::OnContact, this);
   }
 }
@@ -163,16 +177,20 @@ void ContactVisual::SetEnabled(bool _enabled)
 /////////////////////////////////////////////////
 void ContactVisual::CreateNewPoint()
 {
+  ContactVisualPrivate *dPtr =
+      reinterpret_cast<ContactVisualPrivate *>(this->dataPtr);
+
   std::string objName = this->GetName() +
-    "_contactpoint_" + boost::lexical_cast<std::string>(this->points.size());
+    "_contactpoint_" + boost::lexical_cast<std::string>(dPtr->points.size());
 
   /// \todo We can improve this by using instanced geometry.
-  Ogre::Entity *obj = this->scene->GetManager()->createEntity(
+  Ogre::Entity *obj = dPtr->scene->GetManager()->createEntity(
                       objName, "contact_sphere");
   obj->setMaterialName("Gazebo/BlueLaser");
 
-  ContactVisual::ContactPoint *cp = new ContactVisual::ContactPoint();
-  cp->sceneNode = this->sceneNode->createChildSceneNode(objName + "_node");
+  ContactVisualPrivate::ContactPoint *cp =
+      new ContactVisualPrivate::ContactPoint();
+  cp->sceneNode = dPtr->sceneNode->createChildSceneNode(objName + "_node");
   cp->sceneNode->attachObject(obj);
 
   cp->normal = new DynamicLines(RENDERING_LINE_LIST);
@@ -192,5 +210,5 @@ void ContactVisual::CreateNewPoint()
   cp->sceneNode->attachObject(cp->normal);
   cp->sceneNode->setVisible(false);
 
-  this->points.push_back(cp);
+  dPtr->points.push_back(cp);
 }
diff --git a/gazebo/rendering/ContactVisual.hh b/gazebo/rendering/ContactVisual.hh
index 0130df3..7daac1d 100644
--- a/gazebo/rendering/ContactVisual.hh
+++ b/gazebo/rendering/ContactVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,25 +14,15 @@
  * limitations under the License.
  *
 */
-/* Desc: Camera Visualization Class
- * Author: Nate Koenig
- */
 
 #ifndef _CONTACTVISUAL_HH_
 #define _CONTACTVISUAL_HH_
 
 #include <string>
-#include <vector>
 
+#include "gazebo/msgs/MessageTypes.hh"
 #include "gazebo/rendering/Visual.hh"
-#include "gazebo/msgs/msgs.hh"
-#include "gazebo/transport/TransportTypes.hh"
-
-namespace Ogre
-{
-  class Entity;
-  class SceneNode;
-}
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -41,14 +31,12 @@ namespace gazebo
     /// \addtogroup gazebo_rendering Rendering
     /// \{
 
-    class DynamicLines;
-
     /// \class ContactVisual ContactVisual.hh rendering/rendering.hh
     /// \brief Contact visualization
     ///
     /// This class visualizes contact points by drawing arrows in the 3D
     /// environment.
-    class ContactVisual : public Visual
+    class GAZEBO_VISIBLE ContactVisual : public Visual
     {
       /// \brief Constructor
       /// \param[in] _name Name of the ContactVisual
@@ -74,42 +62,6 @@ namespace gazebo
 
       /// \brief Create a new contact visualization point.
       private: void CreateNewPoint();
-
-      /// \brief Node for communication.
-      private: transport::NodePtr node;
-
-      /// \brief Subscription to the contact data.
-      private: transport::SubscriberPtr contactsSub;
-
-      /// \brief The current contact message.
-      private: boost::shared_ptr<msgs::Contacts const> contactsMsg;
-
-      /// \brief All the event connections.
-      private: std::vector<event::ConnectionPtr> connections;
-
-      /// \brief A contact point visualization.
-      private: class ContactPoint
-               {
-                 /// \brief The scene node for the contact visualization.
-                 public: Ogre::SceneNode *sceneNode;
-                 /// \brief Normal and depth for the contact point.
-                 public: DynamicLines *normal, *depth;
-               };
-
-      /// \brief All the contact points.
-      private: std::vector<ContactVisual::ContactPoint*> points;
-
-      /// \brief Mutex to protect the contact message.
-      private: boost::mutex mutex;
-
-      /// \brief True if we have received a message.
-      private: bool receivedMsg;
-
-      /// \brief True if this visualization is enabled.
-      private: bool enabled;
-
-      /// \brief Name of the topic contact information is published on
-      private: std::string topicName;
     };
     /// \}
   }
diff --git a/gazebo/rendering/ContactVisualPrivate.hh b/gazebo/rendering/ContactVisualPrivate.hh
new file mode 100644
index 0000000..4e60ba2
--- /dev/null
+++ b/gazebo/rendering/ContactVisualPrivate.hh
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _CONTACTVISUAL_PRIVATE_HH_
+#define _CONTACTVISUAL_PRIVATE_HH_
+
+#include <string>
+#include <vector>
+
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+
+
+namespace Ogre
+{
+  class Entity;
+  class SceneNode;
+}
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    class DynamicLines;
+
+    /// \brief Private data for the Arrow Visual class
+    class ContactVisualPrivate : public VisualPrivate
+    {
+      /// \brief Node for communication.
+      public: transport::NodePtr node;
+
+      /// \brief Subscription to the contact data.
+      public: transport::SubscriberPtr contactsSub;
+
+      /// \brief The current contact message.
+      public: boost::shared_ptr<msgs::Contacts const> contactsMsg;
+
+      /// \brief All the event connections.
+      public: std::vector<event::ConnectionPtr> connections;
+
+      /// \brief A contact point visualization.
+      public: class ContactPoint
+               {
+                 /// \brief The scene node for the contact visualization.
+                 public: Ogre::SceneNode *sceneNode;
+                 /// \brief Normal and depth for the contact point.
+                 public: DynamicLines *normal, *depth;
+               };
+
+      /// \brief All the contact points.
+      public: std::vector<ContactVisualPrivate::ContactPoint *> points;
+
+      /// \brief Mutex to protect the contact message.
+      public: boost::mutex mutex;
+
+      /// \brief True if we have received a message.
+      public: bool receivedMsg;
+
+      /// \brief True if this visualization is enabled.
+      public: bool enabled;
+
+      /// \brief Name of the topic contact information is published on
+      public: std::string topicName;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/Conversions.cc b/gazebo/rendering/Conversions.cc
index e1e97cb..80a0ad0 100644
--- a/gazebo/rendering/Conversions.cc
+++ b/gazebo/rendering/Conversions.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
 */
-#include "rendering/Conversions.hh"
+#include "gazebo/rendering/Conversions.hh"
 
 using namespace gazebo;
 using namespace rendering;
diff --git a/gazebo/rendering/Conversions.hh b/gazebo/rendering/Conversions.hh
index 3d1d4a2..e41cec7 100644
--- a/gazebo/rendering/Conversions.hh
+++ b/gazebo/rendering/Conversions.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,11 +17,12 @@
 #ifndef _CONVERSIONS_HH_
 #define _CONVERSIONS_HH_
 
-#include "rendering/ogre_gazebo.h"
+#include "gazebo/rendering/ogre_gazebo.h"
 
-#include "common/Color.hh"
-#include "math/Vector3.hh"
-#include "math/Quaternion.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,7 +34,7 @@ namespace gazebo
     /// \brief Conversions Conversions.hh rendering/Conversions.hh
     /// \brief A set of utility function to convert between Gazebo and Ogre
     /// data types
-    class Conversions
+    class GAZEBO_VISIBLE Conversions
     {
       /// \brief Return the equivalent ogre color
       /// \param[in] _clr Gazebo color to convert
diff --git a/gazebo/rendering/DepthCamera.cc b/gazebo/rendering/DepthCamera.cc
index 8777cc0..8b75343 100644
--- a/gazebo/rendering/DepthCamera.cc
+++ b/gazebo/rendering/DepthCamera.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,19 +23,18 @@
 #include <dirent.h>
 #include <sstream>
 
-#include "sdf/sdf.hh"
-#include "rendering/ogre_gazebo.h"
-#include "rendering/RTShaderSystem.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/RTShaderSystem.hh"
 
-#include "common/Events.hh"
-#include "common/Console.hh"
-#include "common/Exception.hh"
-#include "math/Pose.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/math/Pose.hh"
 
-#include "rendering/Visual.hh"
-#include "rendering/Conversions.hh"
-#include "rendering/Scene.hh"
-#include "rendering/DepthCamera.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/DepthCamera.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -61,11 +60,11 @@ DepthCamera::~DepthCamera()
 }
 
 //////////////////////////////////////////////////
-void DepthCamera::Load(sdf::ElementPtr &_sdf)
+void DepthCamera::Load(sdf::ElementPtr _sdf)
 {
   Camera::Load(_sdf);
   this->outputPoints =
-    (_sdf->GetElement("depth_camera")->GetValueString("output")
+    (_sdf->GetElement("depth_camera")->Get<std::string>("output")
     == "points");
 }
 
@@ -146,7 +145,7 @@ void DepthCamera::CreateDepthTexture(const std::string &_textureName)
         Conversions::Convert(this->scene->GetBackgroundColor()));
     this->pcdViewport->setOverlaysEnabled(false);
     this->pcdViewport->setVisibilityMask(
-        GZ_VISIBILITY_ALL & ~GZ_VISIBILITY_GUI);
+        GZ_VISIBILITY_ALL & ~(GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE));
 
     this->pcdMaterial = (Ogre::Material*)(
     Ogre::MaterialManager::getSingleton().getByName("Gazebo/XYZPoints").get());
diff --git a/gazebo/rendering/DepthCamera.hh b/gazebo/rendering/DepthCamera.hh
index a7ebdab..d2321c7 100644
--- a/gazebo/rendering/DepthCamera.hh
+++ b/gazebo/rendering/DepthCamera.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,16 +23,17 @@
 #define _RENDERING_DEPTHCAMERA_HH_
 #include <string>
 
-#include "common/Event.hh"
-#include "common/Time.hh"
+#include <sdf/sdf.hh>
 
-#include "math/Angle.hh"
-#include "math/Pose.hh"
-#include "math/Vector2i.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/common/Time.hh"
 
-#include "sdf/sdf.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/math/Vector2i.hh"
 
-#include "rendering/Camera.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/util/system.hh"
 
 namespace Ogre
 {
@@ -53,7 +54,7 @@ namespace gazebo
 
     /// \class DepthCamera DepthCamera.hh rendering/rendering.hh
     /// \brief Depth camera used to render depth data into an image buffer
-    class DepthCamera : public Camera
+    class GAZEBO_VISIBLE DepthCamera : public Camera
     {
       /// \brief Constructor
       /// \param[in] _namePrefix Unique prefix name for the camera.
@@ -67,7 +68,7 @@ namespace gazebo
 
       /// \brief Load the camera with a set of parmeters
       /// \param[in] _sdf The SDF camera info
-      public: void Load(sdf::ElementPtr &_sdf);
+      public: void Load(sdf::ElementPtr _sdf);
 
        /// \brief Load the camera with default parmeters
       public: void Load();
diff --git a/gazebo/rendering/DynamicLines.cc b/gazebo/rendering/DynamicLines.cc
index 218b730..45de07b 100644
--- a/gazebo/rendering/DynamicLines.cc
+++ b/gazebo/rendering/DynamicLines.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,10 +23,10 @@
 
 #include <cmath>
 #include <sstream>
-#include "rendering/ogre_gazebo.h"
+#include "gazebo/rendering/ogre_gazebo.h"
 
-#include "common/Exception.hh"
-#include "rendering/DynamicLines.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/rendering/DynamicLines.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -60,16 +60,19 @@ const Ogre::String &DynamicLines::getMovableType() const
 }
 
 /////////////////////////////////////////////////
-void DynamicLines::AddPoint(const math::Vector3 &pt)
+void DynamicLines::AddPoint(const math::Vector3 &_pt,
+                            const common::Color &_color)
 {
-  this->points.push_back(pt);
+  this->points.push_back(_pt);
+  this->colors.push_back(_color);
   this->dirty = true;
 }
 
 /////////////////////////////////////////////////
-void DynamicLines::AddPoint(double _x, double _y, double _z)
+void DynamicLines::AddPoint(double _x, double _y, double _z,
+                            const common::Color &_color)
 {
-  this->AddPoint(math::Vector3(_x, _y, _z));
+  this->AddPoint(math::Vector3(_x, _y, _z), _color);
 }
 
 /////////////////////////////////////////////////
@@ -89,6 +92,13 @@ void DynamicLines::SetPoint(unsigned int index, const math::Vector3 &value)
 }
 
 /////////////////////////////////////////////////
+void DynamicLines::SetColor(unsigned int _index, const common::Color &_color)
+{
+  this->colors[_index] = _color;
+  this->dirty = true;
+}
+
+/////////////////////////////////////////////////
 const math::Vector3& DynamicLines::GetPoint(unsigned int index) const
 {
   if (index >= this->points.size())
@@ -126,6 +136,7 @@ void DynamicLines::CreateVertexDeclaration()
     this->mRenderOp.vertexData->vertexDeclaration;
 
   decl->addElement(POSITION_BINDING, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
+  decl->addElement(1, 0, Ogre::VET_COLOUR, Ogre::VES_DIFFUSE);
 }
 
 /////////////////////////////////////////////////
@@ -158,6 +169,21 @@ void DynamicLines::FillHardwareBuffers()
   }
   vbuf->unlock();
 
+  // Update the colors
+  Ogre::HardwareVertexBufferSharedPtr cbuf =
+    this->mRenderOp.vertexData->vertexBufferBinding->getBuffer(1);
+
+  Ogre::RGBA *colorArrayBuffer =
+        static_cast<Ogre::RGBA*>(cbuf->lock(Ogre::HardwareBuffer::HBL_DISCARD));
+  Ogre::RenderSystem *renderSystemForVertex =
+        Ogre::Root::getSingleton().getRenderSystem();
+  for (int i = 0; i < size; ++i)
+  {
+    Ogre::ColourValue color = Conversions::Convert(this->colors[i]);
+    renderSystemForVertex->convertColourValue(color, &colorArrayBuffer[i]);
+  }
+  cbuf->unlock();
+
   // need to update after mBox change, otherwise the lines goes in and out
   // of scope based on old mBox
   this->getParentSceneNode()->needUpdate();
diff --git a/gazebo/rendering/DynamicLines.hh b/gazebo/rendering/DynamicLines.hh
index 4d95e89..b8f7fb4 100644
--- a/gazebo/rendering/DynamicLines.hh
+++ b/gazebo/rendering/DynamicLines.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,8 +25,11 @@
 #include <vector>
 #include <string>
 
-#include "math/Vector3.hh"
-#include "rendering/DynamicRenderable.hh"
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/DynamicRenderable.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +40,7 @@ namespace gazebo
 
     /// \class DynamicLines DynamicLines.hh rendering/rendering.hh
     /// \brief Class for drawing lines that can change
-    class DynamicLines : public DynamicRenderable
+    class GAZEBO_VISIBLE DynamicLines : public DynamicRenderable
     {
       /// \brief Constructor
       /// \param[in] _opType The type of Line
@@ -55,20 +58,29 @@ namespace gazebo
       public: virtual const Ogre::String &getMovableType() const;
 
       /// \brief Add a point to the point list
-      /// \param[in] pt math::Vector3 point
-      public: void AddPoint(const math::Vector3 &_pt);
+      /// \param[in] _pt math::Vector3 point
+      /// \param[in] _color common::Color Point color
+      public: void AddPoint(const math::Vector3 &_pt,
+            const common::Color &_color = common::Color::White);
 
       /// \brief Add a point to the point list.
-      /// \param[in] _x X position.
-      /// \param[in] _y Y position.
-      /// \param[in] _z Z position.
-      public: void AddPoint(double _x, double _y, double _z);
+      /// \param[in] _x X position
+      /// \param[in] _y Y position
+      /// \param[in] _z Z position
+      /// \param[in] _color common::Color Point color
+      public: void AddPoint(double _x, double _y, double _z,
+            const common::Color &_color = common::Color::White);
 
       /// \brief Change the location of an existing point in the point list
       /// \param[in] _index Index of the point to set
       /// \param[in] _value math::Vector3 value to set the point to
       public: void SetPoint(unsigned int _index, const math::Vector3 &_value);
 
+      /// \brief Change the color of an existing point in the point list
+      /// \param[in] _index Index of the point to set
+      /// \param[in] _color common::Color Pixelcolor color to set the point to
+      public: void SetColor(unsigned int _index, const common::Color &_color);
+
       /// \brief Return the location of an existing point in the point list
       /// \param[in] _index Number of the point to return
       /// \return math::Vector3 value of the point
@@ -86,17 +98,20 @@ namespace gazebo
 
       /// \brief Implementation DynamicRenderable,
       /// creates a simple vertex-only decl
-      protected: virtual void  CreateVertexDeclaration();
+      private: virtual void  CreateVertexDeclaration();
 
       /// \brief Implementation DynamicRenderable, pushes point
       /// list out to hardware memory
-      protected: virtual void FillHardwareBuffers();
+      private: virtual void FillHardwareBuffers();
 
       /// \brief List of points for the line
       private: std::vector<math::Vector3> points;
 
       /// \brief Used to indicate if the lines require an update
       private: bool dirty;
+
+      /// \brief List of colors
+      private: std::vector<common::Color> colors;
     };
     /// \}
   }
diff --git a/gazebo/rendering/DynamicRenderable.cc b/gazebo/rendering/DynamicRenderable.cc
index 771f662..06a54e9 100644
--- a/gazebo/rendering/DynamicRenderable.cc
+++ b/gazebo/rendering/DynamicRenderable.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,8 +15,8 @@
  *
 */
 
-#include "common/Console.hh"
-#include "rendering/DynamicRenderable.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/rendering/DynamicRenderable.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -165,10 +165,18 @@ void DynamicRenderable::PrepareHardwareBuffers(size_t vertexCount,
         this->vertexBufferCapacity,
         Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY);
 
+    Ogre::HardwareVertexBufferSharedPtr cbuf =
+      Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
+        Ogre::VertexElement::getTypeSize(Ogre::VET_COLOUR),
+        this->vertexBufferCapacity,
+        Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY);
+
     // TODO: Custom HBU_?
 
     // Bind buffer
     this->mRenderOp.vertexData->vertexBufferBinding->setBinding(0, vbuf);
+
+    this->mRenderOp.vertexData->vertexBufferBinding->setBinding(1, cbuf);
   }
 
   // Update vertex count in the render operation
@@ -238,5 +246,8 @@ Ogre::Real DynamicRenderable::getSquaredViewDepth(const Ogre::Camera* cam) const
   return vDist.squaredLength();
 }
 
-
-
+/////////////////////////////////////////////////
+std::string DynamicRenderable::GetMovableType() const
+{
+  return "gazebo::DynamicRenderable";
+}
diff --git a/gazebo/rendering/DynamicRenderable.hh b/gazebo/rendering/DynamicRenderable.hh
index 78142ac..da5ec42 100644
--- a/gazebo/rendering/DynamicRenderable.hh
+++ b/gazebo/rendering/DynamicRenderable.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,8 +17,10 @@
 #ifndef _DYNAMICRENDERABLE_HH_
 #define _DYNAMICRENDERABLE_HH_
 
-#include "rendering/ogre_gazebo.h"
-#include "rendering/RenderTypes.hh"
+#include <string>
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +32,7 @@ namespace gazebo
     /// \class DynamicRenderable DynamicRenderable.hh rendering/rendering.hh
     /// \brief Abstract base class providing mechanisms for dynamically
     /// growing hardware buffers.
-    class DynamicRenderable : public Ogre::SimpleRenderable
+    class GAZEBO_VISIBLE DynamicRenderable : public Ogre::SimpleRenderable
     {
       /// \brief Constructor
       public: DynamicRenderable();
@@ -66,6 +68,10 @@ namespace gazebo
       public: virtual Ogre::Real getSquaredViewDepth(
                   const Ogre::Camera *_cam) const;
 
+      /// \brief Get type of movable
+      /// \return This returns "gazebo::DynamicRenderable"
+      public: std::string GetMovableType() const;
+
       /// \brief Creates the vertex declaration.  @remarks Override and set
       /// mRenderOp.vertexData->vertexDeclaration here.  mRenderOp.vertexData
       /// will be created for you before this method is called.
diff --git a/gazebo/rendering/FPSViewController.cc b/gazebo/rendering/FPSViewController.cc
index 91638e5..623e41c 100644
--- a/gazebo/rendering/FPSViewController.cc
+++ b/gazebo/rendering/FPSViewController.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,11 @@
  * limitations under the License.
  *
 */
-#include "math/Vector2i.hh"
-#include "common/MouseEvent.hh"
+#include "gazebo/math/Vector2i.hh"
+#include "gazebo/common/MouseEvent.hh"
 
-#include "rendering/UserCamera.hh"
-#include "rendering/FPSViewController.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/FPSViewController.hh"
 
 #define TYPE_STRING "fps"
 
diff --git a/gazebo/rendering/FPSViewController.hh b/gazebo/rendering/FPSViewController.hh
index a28665c..8c19e67 100644
--- a/gazebo/rendering/FPSViewController.hh
+++ b/gazebo/rendering/FPSViewController.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,8 @@
 
 #include <string>
 
-#include "rendering/ViewController.hh"
+#include "gazebo/rendering/ViewController.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class FPSViewController FPSViewController.hh rendering/rendering.hh
     /// \brief First Person Shooter style view controller
-    class FPSViewController : public ViewController
+    class GAZEBO_VISIBLE FPSViewController : public ViewController
     {
       /// \brief Constructor
       /// \param[in] Camera to controll
diff --git a/gazebo/rendering/GUIOverlay.cc b/gazebo/rendering/GUIOverlay.cc
index e28f74e..bcfaca2 100644
--- a/gazebo/rendering/GUIOverlay.cc
+++ b/gazebo/rendering/GUIOverlay.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,64 +15,68 @@
  *
 */
 
-#include "rendering/GUIOverlay.hh"
-#include "common/Console.hh"
+#include "gazebo/common/Console.hh"
 
-#include "common/SystemPaths.hh"
-#include "msgs/msgs.hh"
-#include "transport/Transport.hh"
-#include "transport/Node.hh"
-#include "math/Vector2d.hh"
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/math/Vector2d.hh"
 
-#include "rendering/ogre_gazebo.h"
-#include "rendering/RenderTypes.hh"
-#include "rendering/Camera.hh"
-#include "rendering/DepthCamera.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/rendering/DepthCamera.hh"
+#include "gazebo/rendering/GUIOverlayPrivate.hh"
+#include "gazebo/rendering/GUIOverlay.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
 /////////////////////////////////////////////////
 GUIOverlay::GUIOverlay()
+  : dataPtr(new GUIOverlayPrivate)
 {
-  this->initialized = false;
+  this->dataPtr->initialized = false;
 #ifdef HAVE_CEGUI
-  this->guiRenderer = NULL;
+  this->dataPtr->guiRenderer = NULL;
 
-  this->connections.push_back(
+  this->dataPtr->connections.push_back(
       event::Events::ConnectPreRender(
         boost::bind(&GUIOverlay::PreRender, this)));
 #endif
-  this->rttImageSetCount = 0;
+  this->dataPtr->rttImageSetCount = 0;
 }
 
 /////////////////////////////////////////////////
 GUIOverlay::~GUIOverlay()
 {
-  this->initialized = false;
+  this->dataPtr->initialized = false;
 #ifdef HAVE_CEGUI
   CEGUI::OgreRenderer::destroySystem();
 #endif
+  delete this->dataPtr;
+  this->dataPtr = NULL;
 }
 
 /////////////////////////////////////////////////
 #ifdef HAVE_CEGUI
 void GUIOverlay::Init(Ogre::RenderTarget *_renderTarget)
 {
-  if (this->initialized)
+  if (this->dataPtr->initialized)
     return;
 
-  CEGUI::System::getSingletonPtr();
+  CEGUI::System *system = CEGUI::System::getSingletonPtr();
+
+  if (system)
+    return;
 
   std::string logPath = common::SystemPaths::Instance()->GetLogPath();
   logPath += "/cegui.log";
 
-  this->guiRenderer = &CEGUI::OgreRenderer::create(*_renderTarget);
+  this->dataPtr->guiRenderer = &CEGUI::OgreRenderer::create(*_renderTarget);
   CEGUI::OgreResourceProvider &ip =
     CEGUI::OgreRenderer::createOgreResourceProvider();
   CEGUI::OgreImageCodec &ic = CEGUI::OgreRenderer::createOgreImageCodec();
 
-  CEGUI::System::create(*((CEGUI::Renderer*)this->guiRenderer),
+  CEGUI::System::create(*((CEGUI::Renderer*)this->dataPtr->guiRenderer),
       (CEGUI::ResourceProvider*)(&ip),
       static_cast<CEGUI::XMLParser*>(0),
       (CEGUI::ImageCodec*)(&ic),
@@ -91,19 +95,20 @@ void GUIOverlay::Init(Ogre::RenderTarget *_renderTarget)
   CEGUI::FontManager::getSingleton().create("DejaVuSans-10.font");
 
   // clearing this queue actually make sure it's created
-  this->guiRenderer->getDefaultRenderingRoot().clearGeometry(CEGUI::RQ_OVERLAY);
+  this->dataPtr->guiRenderer->getDefaultRenderingRoot().clearGeometry(
+      CEGUI::RQ_OVERLAY);
 
   // Create a root window, and set it as the root window
   CEGUI::Window *rootWindow =
     CEGUI::WindowManager::getSingleton().createWindow("DefaultWindow", "root");
   rootWindow->setMousePassThroughEnabled(true);
   CEGUI::System::getSingleton().setGUISheet(rootWindow);
-  this->initialized = true;
+  this->dataPtr->initialized = true;
 }
 #else
 void GUIOverlay::Init(Ogre::RenderTarget * /*_renderTarget*/)
 {
-  this->initialized = true;
+  this->dataPtr->initialized = true;
 }
 #endif
 
@@ -210,7 +215,6 @@ bool GUIOverlay::HandleMouseEvent(const common::MouseEvent &_evt)
 
   press = false;
   release = false;
-  pos = false;
   scroll = false;
 
   CEGUI::System *system = CEGUI::System::getSingletonPtr();
@@ -263,17 +267,17 @@ bool GUIOverlay::IsInitialized()
 /////////////////////////////////////////////////
 void GUIOverlay::LoadLayout(const std::string &_filename)
 {
-  this->layoutFilename = _filename;
+  this->dataPtr->layoutFilename = _filename;
 }
 
 /////////////////////////////////////////////////
 void GUIOverlay::PreRender()
 {
 #ifdef HAVE_CEGUI
-  if (this->IsInitialized() && !this->layoutFilename.empty())
+  if (this->IsInitialized() && !this->dataPtr->layoutFilename.empty())
   {
-    this->LoadLayoutImpl(this->layoutFilename);
-    this->layoutFilename.clear();
+    this->LoadLayoutImpl(this->dataPtr->layoutFilename);
+    this->dataPtr->layoutFilename.clear();
   }
 #endif
 }
@@ -313,16 +317,19 @@ CEGUI::Window *GUIOverlay::LoadLayoutImpl(const std::string &_filename)
 #ifdef HAVE_CEGUI
 void GUIOverlay::Resize(unsigned int _width, unsigned int _height)
 {
-  if (this->guiRenderer)
+  if (this->dataPtr->guiRenderer)
   {
-    this->guiRenderer->setDisplaySize(CEGUI::Size(_width, _height));
+    this->dataPtr->guiRenderer->setDisplaySize(CEGUI::Size(_width, _height));
 
     CEGUI::WindowManager *windowManager =
       CEGUI::WindowManager::getSingletonPtr();
 
-    CEGUI::Window *rootWindow = windowManager->getWindow("root");
-    rootWindow->setArea(CEGUI::UDim(0, 0), CEGUI::UDim(0, 0),
-                        CEGUI::UDim(1, 0), CEGUI::UDim(1, 0));
+    if (windowManager && windowManager->isWindowPresent("root"))
+    {
+      CEGUI::Window *rootWindow = windowManager->getWindow("root");
+      rootWindow->setArea(CEGUI::UDim(0, 0), CEGUI::UDim(0, 0),
+          CEGUI::UDim(1, 0), CEGUI::UDim(1, 0));
+    }
   }
 }
 #else
@@ -368,12 +375,12 @@ bool GUIOverlay::AttachCameraToImage(CameraPtr &_camera,
   }
 
   Ogre::TexturePtr texPtr(_camera->GetRenderTexture());
-  CEGUI::Texture &guiTex = this->guiRenderer->createTexture(
+  CEGUI::Texture &guiTex = this->dataPtr->guiRenderer->createTexture(
       texPtr);
 
-  this->rttImageSetCount++;
+  this->dataPtr->rttImageSetCount++;
   std::ostringstream stream;
-  stream << "RTTImageset_" << this->rttImageSetCount;
+  stream << "RTTImageset_" << this->dataPtr->rttImageSetCount;
 
   CEGUI::Imageset &imageSet = CEGUI::ImagesetManager::getSingleton().create(
       stream.str().c_str(), guiTex);
diff --git a/gazebo/rendering/GUIOverlay.hh b/gazebo/rendering/GUIOverlay.hh
index f379dc4..2ef831f 100644
--- a/gazebo/rendering/GUIOverlay.hh
+++ b/gazebo/rendering/GUIOverlay.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,17 +20,13 @@
 
 #include <string>
 #include <map>
-#include <vector>
 
-#include "rendering/cegui.h"
-#include "common/MouseEvent.hh"
-#include "common/Events.hh"
+#include "gazebo/common/MouseEvent.hh"
 
-#include "math/MathTypes.hh"
+#include "gazebo/math/Vector2d.hh"
 
-#include "rendering/RenderTypes.hh"
-#include "msgs/MessageTypes.hh"
-#include "transport/TransportTypes.hh"
+#include "gazebo/rendering/cegui.h"
+#include "gazebo/rendering/RenderTypes.hh"
 
 namespace Ogre
 {
@@ -49,6 +45,8 @@ namespace gazebo
 {
   namespace rendering
   {
+    class GUIOverlayPrivate;
+
     /// \addtogroup gazebo_rendering
     /// \{
 
@@ -139,6 +137,28 @@ namespace gazebo
       /// \brief PreRender function callback
       private: void PreRender();
 
+      /// \brief Get the ASCII keyboard code based on a unicode character.
+      /// \param[in] _unicode Unicode character.
+      /// \return ASCII integer
+      private: int GetKeyCode(const std::string  &_unicode);
+
+#ifdef HAVE_CEGUI
+      /// \brief Get a CEGUI::Window pointer to a named window.
+      /// \param[in] _name Name of the window to retrieve.
+      /// \return Pointer to the window.
+      public: CEGUI::Window *GetWindow(const std::string &_name);
+
+      /// \brief Load a CEGUI layout file.
+      /// \param[in] _filename Name of the layout file.
+      /// \return Pointer to the newly created CEGUI window.
+      private: CEGUI::Window *LoadLayoutImpl(const std::string &_filename);
+
+      /// \brief Button click callback.
+      /// \param[in] _e CEGUI button event.
+      /// \return True if handled.
+      private: bool OnButtonClicked(const CEGUI::EventArgs &_e);
+#endif
+
       /// \brief Register a CEGUI button callback.
       ///
       /// Assign a callback to a name button.
@@ -158,49 +178,20 @@ namespace gazebo
                   CEGUI::Event::Subscriber(&GUIOverlay::OnButtonClicked, this));
 
                 this->callbacks[_buttonName] = boost::bind(_fp, _obj);
+#else
+                if (_buttonName && _fp && _obj)
+                {
+                  gzerr << "CEGUI not installed." << std::endl;
+                }
 #endif
               }
 
-#ifdef HAVE_CEGUI
-      /// \brief Get a CEGUI::Window pointer to a named window.
-      /// \param[in] _name Name of the window to retrieve.
-      /// \return Pointer to the window.
-      public: CEGUI::Window *GetWindow(const std::string &_name);
-
-      /// \brief Load a CEGUI layout file.
-      /// \param[in] _filename Name of the layout file.
-      /// \return Pointer to the newly created CEGUI window.
-      private: CEGUI::Window *LoadLayoutImpl(const std::string &_filename);
-
-      /// \brief Button click callback.
-      /// \param[in] _e CEGUI button event.
-      /// \return True if handled.
-      private: bool OnButtonClicked(const CEGUI::EventArgs &_e);
-
-      /// \brief Get the ASCII keyboard code based on a unicode character.
-      /// \param[in] _unicode Unicode character.
-      /// \return ASCII integer
-      private: int GetKeyCode(const std::string  &_unicode);
-
-      /// \brief Pointer to the CEGUI ogre renderer
-      private: CEGUI::OgreRenderer *guiRenderer;
-#endif
-
-      /// \brief All the connections
-      private: std::vector<event::ConnectionPtr> connections;
-
-      /// \brief The layout file used to create gui elements
-      private: std::string layoutFilename;
-
       /// \brief Map of callback functions to names
-      private: std::map<std::string, boost::function<void()> > callbacks;
-
-      /// \brief Used in the AttachCameraToImage function to create unique
-      /// names
-      private: unsigned int rttImageSetCount;
+      public: std::map<std::string, boost::function<void()> > callbacks;
 
-      /// \brief True if initialized
-      private: bool initialized;
+      /// \internal
+      /// \brief Pointer to private data.
+      private: GUIOverlayPrivate *dataPtr;
     };
     /// \}
   }
diff --git a/gazebo/rendering/GUIOverlayPrivate.hh b/gazebo/rendering/GUIOverlayPrivate.hh
new file mode 100644
index 0000000..5986ea8
--- /dev/null
+++ b/gazebo/rendering/GUIOverlayPrivate.hh
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GUI_OVERLAY_PRIVATE_HH_
+#define _GUI_OVERLAY_PRIVATE_HH_
+
+#include <string>
+#include <vector>
+
+#include "gazebo/common/Events.hh"
+#include "gazebo/rendering/cegui.h"
+
+namespace Ogre
+{
+  class RenderTarget;
+}
+
+#ifdef HAVE_CEGUI
+namespace CEGUI
+{
+  class OgreRenderer;
+  class Window;
+}
+#endif
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the GUIOverlay class
+    class GUIOverlayPrivate
+    {
+#ifdef HAVE_CEGUI
+      /// \brief Pointer to the CEGUI ogre renderer
+      public: CEGUI::OgreRenderer *guiRenderer;
+#endif
+
+      /// \brief All the connections
+      public: std::vector<event::ConnectionPtr> connections;
+
+      /// \brief The layout file used to create gui elements
+      public: std::string layoutFilename;
+
+      /// \brief Used in the AttachCameraToImage function to create unique
+      /// names
+      public: unsigned int rttImageSetCount;
+
+      /// \brief True if initialized
+      public: bool initialized;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/rendering/GpuLaser.cc b/gazebo/rendering/GpuLaser.cc
index 39c9bf0..31aa3a0 100644
--- a/gazebo/rendering/GpuLaser.cc
+++ b/gazebo/rendering/GpuLaser.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,23 +23,21 @@
 #include <dirent.h>
 #include <sstream>
 
-#include "sdf/sdf.hh"
-#include "rendering/ogre_gazebo.h"
-#include "rendering/RTShaderSystem.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
 
-#include "common/Events.hh"
-#include "common/Console.hh"
-#include "common/Exception.hh"
-#include "common/Mesh.hh"
-#include "common/MeshManager.hh"
-#include "common/Timer.hh"
-#include "sensors/GpuRaySensor.hh"
-#include "math/Pose.hh"
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/common/Timer.hh"
+#include "gazebo/math/Pose.hh"
 
-#include "rendering/Visual.hh"
-#include "rendering/Conversions.hh"
-#include "rendering/Scene.hh"
-#include "rendering/GpuLaser.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/GpuLaser.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -47,14 +45,18 @@ using namespace rendering;
 int GpuLaser::texCount = 0;
 
 //////////////////////////////////////////////////
-GpuLaser::GpuLaser(const std::string &_namePrefix, Scene *_scene,
-                         bool _autoRender)
+GpuLaser::GpuLaser(const std::string &_namePrefix, ScenePtr _scene,
+                   bool _autoRender)
 : Camera(_namePrefix, _scene, _autoRender)
 {
   this->laserBuffer = NULL;
   this->laserScan = NULL;
-  this->mat_1st_pass = NULL;
-  this->mat_2nd_pass = NULL;
+  this->matFirstPass = NULL;
+  this->matSecondPass = NULL;
+  for (int i = 0; i < 3; ++i)
+    this->firstPassTextures[i] = NULL;
+  this->secondPassTexture = NULL;
+  this->orthoCam = NULL;
   this->w2nd = 0;
   this->h2nd = 0;
   this->visual.reset();
@@ -63,10 +65,33 @@ GpuLaser::GpuLaser(const std::string &_namePrefix, Scene *_scene,
 //////////////////////////////////////////////////
 GpuLaser::~GpuLaser()
 {
+  delete [] this->laserBuffer;
+  delete [] this->laserScan;
+
+  for (unsigned int i = 0; i < this->textureCount; ++i)
+  {
+    if (this->firstPassTextures[i])
+    {
+      Ogre::TextureManager::getSingleton().remove(
+          this->firstPassTextures[i]->getName());
+    }
+  }
+  if (this->secondPassTexture)
+  {
+    Ogre::TextureManager::getSingleton().remove(
+        this->secondPassTexture->getName());
+  }
+
+  if (this->scene && this->orthoCam)
+    this->scene->GetManager()->destroyCamera(this->orthoCam);
+
+  this->visual.reset();
+  this->texIdx.clear();
+  texCount = 0;
 }
 
 //////////////////////////////////////////////////
-void GpuLaser::Load(sdf::ElementPtr &_sdf)
+void GpuLaser::Load(sdf::ElementPtr _sdf)
 {
   Camera::Load(_sdf);
 }
@@ -83,7 +108,7 @@ void GpuLaser::Init()
   Camera::Init();
   this->w2nd = this->GetImageWidth();
   this->h2nd = this->GetImageHeight();
-  this->visual.reset(new Visual(this->GetName()+"_2nd_pass_canvas",
+  this->visual.reset(new Visual(this->GetName()+"second_pass_canvas",
      this->GetScene()->GetWorldVisual()));
 }
 
@@ -96,80 +121,87 @@ void GpuLaser::Fini()
 //////////////////////////////////////////////////
 void GpuLaser::CreateLaserTexture(const std::string &_textureName)
 {
-  this->camera->yaw(Ogre::Radian(this->parent_sensor->GetHAngle()));
-  this->camera->pitch(Ogre::Radian(this->parent_sensor->GetVAngle()));
+  this->camera->yaw(Ogre::Radian(this->horzHalfAngle));
+  this->camera->pitch(Ogre::Radian(this->vertHalfAngle));
 
   this->CreateOrthoCam();
 
-  this->_textureCount = this->parent_sensor->GetCameraCount();
+  this->textureCount = this->cameraCount;
 
-  if (this->_textureCount == 2)
+  if (this->textureCount == 2)
   {
-    cameraYaws[0] = -this->parent_sensor->GetHFOV()/2;
-    cameraYaws[1] = +this->parent_sensor->GetHFOV();
+    cameraYaws[0] = -this->hfov/2;
+    cameraYaws[1] = +this->hfov;
     cameraYaws[2] = 0;
-    cameraYaws[3] = -this->parent_sensor->GetHFOV()/2;
+    cameraYaws[3] = -this->hfov/2;
   }
   else
   {
-    cameraYaws[0] = -this->parent_sensor->GetHFOV();
-    cameraYaws[1] = +this->parent_sensor->GetHFOV();
-    cameraYaws[2] = +this->parent_sensor->GetHFOV();
-    cameraYaws[3] = -this->parent_sensor->GetHFOV();
+    cameraYaws[0] = -this->hfov;
+    cameraYaws[1] = +this->hfov;
+    cameraYaws[2] = +this->hfov;
+    cameraYaws[3] = -this->hfov;
   }
 
-  for (unsigned int i = 0; i < this->_textureCount; i++)
+  for (unsigned int i = 0; i < this->textureCount; ++i)
   {
     std::stringstream texName;
-    texName << _textureName << "_1st_pass_" << i;
-    this->_1stPassTextures[i] =
+    texName << _textureName << "first_pass_" << i;
+    this->firstPassTextures[i] =
       Ogre::TextureManager::getSingleton().createManual(
       texName.str(), "General", Ogre::TEX_TYPE_2D,
       this->GetImageWidth(), this->GetImageHeight(), 0,
       Ogre::PF_FLOAT32_RGB, Ogre::TU_RENDERTARGET).getPointer();
 
     this->Set1stPassTarget(
-        this->_1stPassTextures[i]->getBuffer()->getRenderTarget(), i);
+        this->firstPassTextures[i]->getBuffer()->getRenderTarget(), i);
 
-    RTShaderSystem::AttachViewport(this->_1stPassViewports[i],
-                                   this->GetScene());
-    this->_1stPassTargets[i]->setAutoUpdated(false);
+    this->firstPassTargets[i]->setAutoUpdated(false);
   }
 
-  this->mat_1st_pass = (Ogre::Material*)(
+  this->matFirstPass = (Ogre::Material*)(
   Ogre::MaterialManager::getSingleton().getByName("Gazebo/LaserScan1st").get());
 
-  this->mat_1st_pass->load();
+  this->matFirstPass->load();
 
-  this->_2ndPassTexture = Ogre::TextureManager::getSingleton().createManual(
-      _textureName + "_2nd_pass",
+  this->secondPassTexture = Ogre::TextureManager::getSingleton().createManual(
+      _textureName + "second_pass",
       "General",
       Ogre::TEX_TYPE_2D,
       this->GetImageWidth(), this->GetImageHeight(), 0,
       Ogre::PF_FLOAT32_RGB,
       Ogre::TU_RENDERTARGET).getPointer();
 
-  this->Set2ndPassTarget(this->_2ndPassTexture->getBuffer()->getRenderTarget());
-  RTShaderSystem::AttachViewport(this->_2ndPassViewport, this->GetScene());
-  this->_2ndPassTarget->setAutoUpdated(false);
+  this->Set2ndPassTarget(
+      this->secondPassTexture->getBuffer()->getRenderTarget());
 
-  this->mat_2nd_pass = (Ogre::Material*)(
+  this->secondPassTarget->setAutoUpdated(false);
+
+  this->matSecondPass = (Ogre::Material*)(
   Ogre::MaterialManager::getSingleton().getByName("Gazebo/LaserScan2nd").get());
 
-  this->mat_2nd_pass->load();
+  this->matSecondPass->load();
 
-  Ogre::TextureUnitState *tex_unit;
-  for (unsigned int i = 0; i < this->_textureCount; i++)
+  Ogre::TextureUnitState *texUnit;
+  for (unsigned int i = 0; i < this->textureCount; ++i)
   {
     unsigned int texIndex = texCount++;
-    tex_unit =
-      this->mat_2nd_pass->getTechnique(0)->getPass(0)->createTextureUnitState(
-        this->_1stPassTextures[i]->getName(), texIndex);
+    Ogre::Technique *technique = this->matSecondPass->getTechnique(0);
+    GZ_ASSERT(technique, "GpuLaser material script error: technique not found");
 
-    this->texIdx.push_back(texIndex);
+    Ogre::Pass *pass = technique->getPass(0);
+    GZ_ASSERT(pass, "GpuLaser material script error: pass not found");
 
-    tex_unit->setTextureFiltering(Ogre::TFO_NONE);
-    tex_unit->setTextureAddressingMode(Ogre::TextureUnitState::TAM_MIRROR);
+    if (!pass->getTextureUnitState(this->firstPassTextures[i]->getName()))
+    {
+      texUnit = pass->createTextureUnitState(
+            this->firstPassTextures[i]->getName(), texIndex);
+
+      this->texIdx.push_back(texIndex);
+
+      texUnit->setTextureFiltering(Ogre::TFO_NONE);
+      texUnit->setTextureAddressingMode(Ogre::TextureUnitState::TAM_MIRROR);
+    }
   }
 
   this->CreateCanvas();
@@ -182,20 +214,23 @@ void GpuLaser::PostRender()
 //  postRenderT.Start();
 //  double blitDur = 0.0;
 //  double postRenderDur = 0.0;
-  for (unsigned int i = 0; i < this->_textureCount; i++)
-    this->_1stPassTargets[i]->swapBuffers();
 
-  this->_2ndPassTarget->swapBuffers();
+  for (unsigned int i = 0; i < this->textureCount; ++i)
+  {
+    this->firstPassTargets[i]->swapBuffers();
+  }
+
+  this->secondPassTarget->swapBuffers();
 
   if (this->newData && this->captureData)
   {
     Ogre::HardwarePixelBufferSharedPtr pixelBuffer;
 
-    unsigned int width = this->_2ndPassViewport->getActualWidth();
-    unsigned int height = this->_2ndPassViewport->getActualHeight();
+    unsigned int width = this->secondPassViewport->getActualWidth();
+    unsigned int height = this->secondPassViewport->getActualHeight();
 
     // Get access to the buffer and make an image and write it to file
-    pixelBuffer = this->_2ndPassTexture->getBuffer();
+    pixelBuffer = this->secondPassTexture->getBuffer();
 
     size_t size = Ogre::PixelUtil::getMemorySize(
                     width, height, 1, Ogre::PF_FLOAT32_RGB);
@@ -206,11 +241,11 @@ void GpuLaser::PostRender()
 
     memset(this->laserBuffer, 255, size);
 
-    Ogre::PixelBox dst_box(width, height,
+    Ogre::PixelBox dstBox(width, height,
         1, Ogre::PF_FLOAT32_RGB, this->laserBuffer);
 
 //    blitT.Start();
-    pixelBuffer->blitToMemory(dst_box);
+    pixelBuffer->blitToMemory(dstBox);
 //    blitDur = blitT.GetElapsed().Double();
 
     if (!this->laserScan)
@@ -279,13 +314,13 @@ void GpuLaser::UpdateRenderTarget(Ogre::RenderTarget *_target,
   {
     pass->getFragmentProgramParameters()->setNamedConstant("tex1",
       this->texIdx[0]);
-    if (this->texIdx.size() > 0)
+    if (this->texIdx.size() > 1)
     {
       pass->getFragmentProgramParameters()->setNamedConstant("tex2",
         this->texIdx[1]);
-      if (this->texIdx.size() > 1)
+      if (this->texIdx.size() > 2)
         pass->getFragmentProgramParameters()->setNamedConstant("tex3",
-          this->texIdx[1]);
+          this->texIdx[2]);
     }
   }
 
@@ -293,7 +328,7 @@ void GpuLaser::UpdateRenderTarget(Ogre::RenderTarget *_target,
   if (pass->hasVertexProgram())
   {
     renderSys->bindGpuProgram(
-    pass->getVertexProgram()->_getBindingDelegate());
+        pass->getVertexProgram()->_getBindingDelegate());
 
 #if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR == 6
     renderSys->bindGpuProgramParameters(Ogre::GPT_VERTEX_PROGRAM,
@@ -320,102 +355,103 @@ void GpuLaser::UpdateRenderTarget(Ogre::RenderTarget *_target,
 }
 
 /////////////////////////////////////////////////
-void GpuLaser::notifyRenderSingleObject(Ogre::Renderable *rend,
+void GpuLaser::notifyRenderSingleObject(Ogre::Renderable *_rend,
       const Ogre::Pass* /*pass*/, const Ogre::AutoParamDataSource* /*source*/,
       const Ogre::LightList* /*lights*/, bool /*supp*/)
 {
   Ogre::Vector4 retro = Ogre::Vector4(0, 0, 0, 0);
   try
   {
-    retro = rend->getCustomParameter(1);
+    retro = _rend->getCustomParameter(1);
   }
   catch(Ogre::ItemIdentityException& e)
   {
-    rend->setCustomParameter(1, Ogre::Vector4(0, 0, 0, 0));
+    _rend->setCustomParameter(1, Ogre::Vector4(0, 0, 0, 0));
   }
 
-  Ogre::Pass *my_pass = this->current_mat->getBestTechnique()->getPass(0);
+  Ogre::Pass *pass = this->currentMat->getBestTechnique()->getPass(0);
   Ogre::RenderSystem *renderSys =
                   this->scene->GetManager()->getDestinationRenderSystem();
 
   Ogre::AutoParamDataSource autoParamDataSource;
 
-  Ogre::Viewport *vp = this->current_target->getViewport(0);
+  Ogre::Viewport *vp = this->currentTarget->getViewport(0);
 
   renderSys->_setViewport(vp);
-  autoParamDataSource.setCurrentRenderable(rend);
-  autoParamDataSource.setCurrentPass(my_pass);
+  autoParamDataSource.setCurrentRenderable(_rend);
+  autoParamDataSource.setCurrentPass(pass);
   autoParamDataSource.setCurrentViewport(vp);
-  autoParamDataSource.setCurrentRenderTarget(this->current_target);
+  autoParamDataSource.setCurrentRenderTarget(this->currentTarget);
   autoParamDataSource.setCurrentSceneManager(this->scene->GetManager());
   autoParamDataSource.setCurrentCamera(this->camera, true);
 
-  my_pass->_updateAutoParams(&autoParamDataSource,
-            Ogre::GPV_GLOBAL || Ogre::GPV_PER_OBJECT);
-  my_pass->getFragmentProgramParameters()->setNamedConstant("retro", retro[0]);
+  pass->_updateAutoParams(&autoParamDataSource,
+      Ogre::GPV_GLOBAL || Ogre::GPV_PER_OBJECT);
+  pass->getFragmentProgramParameters()->setNamedConstant("retro", retro[0]);
   renderSys->bindGpuProgram(
-    my_pass->getVertexProgram()->_getBindingDelegate());
+      pass->getVertexProgram()->_getBindingDelegate());
 
   renderSys->bindGpuProgramParameters(Ogre::GPT_VERTEX_PROGRAM,
-    my_pass->getVertexProgramParameters(),
-    Ogre::GPV_GLOBAL || Ogre::GPV_PER_OBJECT);
+      pass->getVertexProgramParameters(),
+      Ogre::GPV_GLOBAL || Ogre::GPV_PER_OBJECT);
 
   renderSys->bindGpuProgram(
-  my_pass->getFragmentProgram()->_getBindingDelegate());
+      pass->getFragmentProgram()->_getBindingDelegate());
 
   renderSys->bindGpuProgramParameters(Ogre::GPT_FRAGMENT_PROGRAM,
-  my_pass->getFragmentProgramParameters(),
-    Ogre::GPV_GLOBAL || Ogre::GPV_PER_OBJECT);
+      pass->getFragmentProgramParameters(),
+      Ogre::GPV_GLOBAL || Ogre::GPV_PER_OBJECT);
 }
 
 //////////////////////////////////////////////////
 void GpuLaser::RenderImpl()
 {
-  common::Timer _1stPassTimer, _2ndPassTimer;
+  common::Timer firstPassTimer, secondPassTimer;
 
-  _1stPassTimer.Start();
+  firstPassTimer.Start();
 
   Ogre::SceneManager *sceneMgr = this->scene->GetManager();
 
-  sceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_NONE);
   sceneMgr->_suppressRenderStateChanges(true);
-
   sceneMgr->addRenderObjectListener(this);
 
-  for (unsigned int i = 0; i < this->_textureCount; i++)
+  for (unsigned int i = 0; i < this->textureCount; ++i)
   {
-    if (this->_textureCount>1)
-      this->RotateYaw(this->cameraYaws[i]);
+    if (this->textureCount > 1)
+    {
+      // Cannot call Camera::RotateYaw because it rotates in world frame,
+      // but we need rotation in camera local frame
+      this->sceneNode->roll(Ogre::Radian(this->cameraYaws[i]));
+    }
 
-    this->current_mat = this->mat_1st_pass;
-    this->current_target = this->_1stPassTargets[i];
+    this->currentMat = this->matFirstPass;
+    this->currentTarget = this->firstPassTargets[i];
 
-    this->UpdateRenderTarget(this->_1stPassTargets[i],
-                  this->mat_1st_pass, this->camera);
-    this->_1stPassTargets[i]->update(false);
+    this->UpdateRenderTarget(this->firstPassTargets[i],
+                  this->matFirstPass, this->camera);
+    this->firstPassTargets[i]->update(false);
   }
 
-  if (this->_textureCount > 1)
-    this->RotateYaw(this->cameraYaws[3]);
+  if (this->textureCount > 1)
+      this->sceneNode->roll(Ogre::Radian(this->cameraYaws[3]));
 
   sceneMgr->removeRenderObjectListener(this);
 
-  double _1stPassDur = _1stPassTimer.GetElapsed().Double();
-  _2ndPassTimer.Start();
+  double firstPassDur = firstPassTimer.GetElapsed().Double();
+  secondPassTimer.Start();
 
   this->visual->SetVisible(true);
 
-  this->UpdateRenderTarget(this->_2ndPassTarget,
-                this->mat_2nd_pass, this->orthoCam, true);
-  this->_2ndPassTarget->update(false);
+  this->UpdateRenderTarget(this->secondPassTarget,
+                this->matSecondPass, this->orthoCam, true);
+  this->secondPassTarget->update(false);
 
   this->visual->SetVisible(false);
 
   sceneMgr->_suppressRenderStateChanges(false);
-  sceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_TEXTURE_MODULATIVE_INTEGRATED);
 
-  double _2ndPassDur = _2ndPassTimer.GetElapsed().Double();
-  this->lastRenderDuration = _1stPassDur + _2ndPassDur;
+  double secondPassDur = secondPassTimer.GetElapsed().Double();
+  this->lastRenderDuration = firstPassDur + secondPassDur;
 }
 
 //////////////////////////////////////////////////
@@ -438,11 +474,11 @@ void GpuLaser::CreateOrthoCam()
 
   this->orthoCam->setDirection(1, 0, 0);
 
-  this->pitchNode_ortho =
+  this->pitchNodeOrtho =
     this->GetScene()->GetWorldVisual()->GetSceneNode()->createChildSceneNode(
       this->GetName()+"OrthoPitchNode");
 
-  this->pitchNode_ortho->attachObject(this->orthoCam);
+  this->pitchNodeOrtho->attachObject(this->orthoCam);
   this->orthoCam->setAutoAspectRatio(true);
 
   if (this->orthoCam)
@@ -456,62 +492,70 @@ void GpuLaser::CreateOrthoCam()
 }
 
 /////////////////////////////////////////////////
-Ogre::Matrix4 GpuLaser::BuildScaledOrthoMatrix(float left, float right,
-           float bottom, float top, float near, float far)
+Ogre::Matrix4 GpuLaser::BuildScaledOrthoMatrix(float _left, float _right,
+           float _bottom, float _top, float _near, float _far)
 {
-  float invw = 1 / (right - left);
-  float invh = 1 / (top - bottom);
-  float invd = 1 / (far - near);
+  float invw = 1 / (_right - _left);
+  float invh = 1 / (_top - _bottom);
+  float invd = 1 / (_far - _near);
 
   Ogre::Matrix4 proj = Ogre::Matrix4::ZERO;
   proj[0][0] = 2 * invw;
-  proj[0][3] = -(right + left) * invw;
+  proj[0][3] = -(_right + _left) * invw;
   proj[1][1] = 2 * invh;
-  proj[1][3] = -(top + bottom) * invh;
+  proj[1][3] = -(_top + _bottom) * invh;
   proj[2][2] = -2 * invd;
-  proj[2][3] = -(far + near) * invd;
+  proj[2][3] = -(_far + _near) * invd;
   proj[3][3] = 1;
 
   return proj;
 }
 
 //////////////////////////////////////////////////
-void GpuLaser::Set1stPassTarget(Ogre::RenderTarget *target, unsigned int index)
+void GpuLaser::Set1stPassTarget(Ogre::RenderTarget *_target,
+                                unsigned int _index)
 {
-  this->_1stPassTargets[index] = target;
+  this->firstPassTargets[_index] = _target;
 
-  if (this->_1stPassTargets[index])
+  if (this->firstPassTargets[_index])
   {
     // Setup the viewport to use the texture
-    this->_1stPassViewports[index] =
-      this->_1stPassTargets[index]->addViewport(this->camera);
-    this->_1stPassViewports[index]->setClearEveryFrame(true);
-    this->_1stPassViewports[index]->setBackgroundColour(
-        Ogre::ColourValue(0.0, 0.0, 1.0));
-    this->_1stPassViewports[index]->setVisibilityMask(
-        GZ_VISIBILITY_ALL & ~GZ_VISIBILITY_GUI);
+    this->firstPassViewports[_index] =
+      this->firstPassTargets[_index]->addViewport(this->camera);
+    this->firstPassViewports[_index]->setClearEveryFrame(true);
+    this->firstPassViewports[_index]->setOverlaysEnabled(false);
+    this->firstPassViewports[_index]->setShadowsEnabled(false);
+    this->firstPassViewports[_index]->setSkiesEnabled(false);
+    this->firstPassViewports[_index]->setBackgroundColour(
+        Ogre::ColourValue(this->far, 0.0, 1.0));
+    this->firstPassViewports[_index]->setVisibilityMask(
+        GZ_VISIBILITY_ALL & ~(GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE));
   }
-  if (index == 0)
+  if (_index == 0)
   {
-    this->camera->setAspectRatio(this->parent_sensor->Get1stRatio());
-    this->camera->setFOVy(Ogre::Radian(this->parent_sensor->GetVFOV()));
+    this->camera->setAspectRatio(this->rayCountRatio);
+    this->camera->setFOVy(Ogre::Radian(this->vfov));
   }
 }
 
 //////////////////////////////////////////////////
-void GpuLaser::Set2ndPassTarget(Ogre::RenderTarget *target)
+void GpuLaser::Set2ndPassTarget(Ogre::RenderTarget *_target)
 {
-  this->_2ndPassTarget = target;
+  this->secondPassTarget = _target;
 
-  if (this->_2ndPassTarget)
+  if (this->secondPassTarget)
   {
     // Setup the viewport to use the texture
-    this->_2ndPassViewport = this->_2ndPassTarget->addViewport(this->orthoCam);
-    this->_2ndPassViewport->setClearEveryFrame(true);
-    this->_2ndPassViewport->setBackgroundColour(
+    this->secondPassViewport =
+        this->secondPassTarget->addViewport(this->orthoCam);
+    this->secondPassViewport->setClearEveryFrame(true);
+    this->secondPassViewport->setOverlaysEnabled(false);
+    this->secondPassViewport->setShadowsEnabled(false);
+    this->secondPassViewport->setSkiesEnabled(false);
+    this->secondPassViewport->setBackgroundColour(
         Ogre::ColourValue(0.0, 1.0, 0.0));
-    this->_2ndPassViewport->setVisibilityMask(
-        GZ_VISIBILITY_ALL & ~GZ_VISIBILITY_GUI);
+    this->secondPassViewport->setVisibilityMask(
+        GZ_VISIBILITY_ALL & ~(GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE));
   }
   Ogre::Matrix4 p = this->BuildScaledOrthoMatrix(
       0, static_cast<float>(this->GetImageWidth() / 10.0),
@@ -529,12 +573,6 @@ void GpuLaser::SetRangeCount(unsigned int _w, unsigned int _h)
 }
 
 /////////////////////////////////////////////////
-void GpuLaser::SetParentSensor(sensors::GpuRaySensor *parent)
-{
-  this->parent_sensor = parent;
-}
-
-/////////////////////////////////////////////////
 void GpuLaser::CreateMesh()
 {
   std::string meshName = this->GetName() + "_undistortion_mesh";
@@ -547,7 +585,7 @@ void GpuLaser::CreateMesh()
   double dx, dy;
   submesh->SetPrimitiveType(common::SubMesh::POINTS);
 
-  double view_height = this->GetImageHeight()/10.0;
+  double viewHeight = this->GetImageHeight()/10.0;
 
   if (h2nd == 1)
     dy = 0;
@@ -556,76 +594,74 @@ void GpuLaser::CreateMesh()
 
   dx = 0.1;
 
-  double start_x = dx;
-  double start_y = view_height;
+  double startX = dx;
+  double startY = viewHeight;
 
-  double phi = this->parent_sensor->GetVFOV() / 2;
+  double phi = this->vfov / 2;
 
-  double v_ang_min = -phi;
+  double vAngMin = -phi;
 
   if (this->GetImageHeight() == 1)
     phi = 0;
 
-  unsigned int pts_on_line = 0;
-
-  for (unsigned int j = 0; j < this->h2nd; j++)
+  unsigned int ptsOnLine = 0;
+  for (unsigned int j = 0; j < this->h2nd; ++j)
   {
     double gamma = 0;
     if (this->h2nd != 1)
-      gamma = ((2 * phi / (this->h2nd - 1)) * j) + v_ang_min;
-    for (unsigned int i = 0; i < this->w2nd; i++)
+      gamma = ((2 * phi / (this->h2nd - 1)) * j) + vAngMin;
+    for (unsigned int i = 0; i < this->w2nd; ++i)
     {
-      double hfov = this->_textureCount * this->parent_sensor->GetHFOV();
-      double theta = this->parent_sensor->GetHFOV() / 2;
-      double delta = ((hfov / (this->w2nd - 1)) * i);
+      double thfov = this->textureCount * this->hfov;
+      double theta = this->hfov / 2;
+      double delta = ((thfov / (this->w2nd - 1)) * i);
 
       unsigned int texture = delta / (theta*2);
 
-      if (texture > this->_textureCount-1)
+      if (texture > this->textureCount-1)
       {
         texture -= 1;
-        delta -= (hfov / (this->w2nd - 1));
+        delta -= (thfov / (this->w2nd - 1));
       }
 
       delta = delta - (texture * (theta*2));
 
       delta = delta - theta;
 
-      start_x -= dx;
-      if (pts_on_line == this->GetImageWidth())
+      startX -= dx;
+      if (ptsOnLine == this->GetImageWidth())
       {
-        pts_on_line = 0;
-        start_x = 0;
-        start_y -= dy;
+        ptsOnLine = 0;
+        startX = 0;
+        startY -= dy;
       }
-      pts_on_line++;
-      submesh->AddVertex(texture/1000.0, start_x, start_y);
+      ptsOnLine++;
+      submesh->AddVertex(texture/1000.0, startX, startY);
 
       double u, v;
-      if (this->parent_sensor->IsHorizontal())
+      if (this->isHorizontal)
       {
         u = -(cos(phi) * tan(delta))/(2 * tan(theta) * cos(gamma)) + 0.5;
-        v = -tan(gamma)/(2 * tan(phi)) + 0.5;
+        v = math::equal(phi, 0.0) ? -tan(gamma)/(2 * tan(phi)) + 0.5 : 0.5;
       }
       else
       {
         v = -(cos(theta) * tan(gamma))/(2 * tan(phi) * cos(delta)) + 0.5;
-        u = -tan(delta)/(2 * tan(theta)) + 0.5;
+        u = math::equal(theta, 0.0) ? -tan(delta)/(2 * tan(theta)) + 0.5 : 0.5;
       }
-
       submesh->AddTexCoord(u, v);
     }
   }
 
-  for (unsigned int j = 0; j < (this->h2nd ); j++)
-    for (unsigned int i = 0; i < (this->w2nd ); i++)
+  for (unsigned int j = 0; j < (this->h2nd ); ++j)
+    for (unsigned int i = 0; i < (this->w2nd ); ++i)
       submesh->AddIndex(this->w2nd * j + i);
 
   mesh->AddSubMesh(submesh);
 
-  this->undist_mesh = mesh;
+  this->undistMesh = mesh;
 
-  common::MeshManager::Instance()->AddMesh(this->undist_mesh);
+  common::MeshManager::Instance()->AddMesh(this->undistMesh);
 }
 
 /////////////////////////////////////////////////
@@ -636,12 +672,12 @@ void GpuLaser::CreateCanvas()
   Ogre::Node *parent = this->visual->GetSceneNode()->getParent();
   parent->removeChild(this->visual->GetSceneNode());
 
-  this->pitchNode_ortho->addChild(this->visual->GetSceneNode());
+  this->pitchNodeOrtho->addChild(this->visual->GetSceneNode());
 
-  this->visual->InsertMesh(this->undist_mesh);
+  this->visual->InsertMesh(this->undistMesh);
 
   std::ostringstream stream;
-  std::string meshName = this->undist_mesh->GetName();
+  std::string meshName = this->undistMesh->GetName();
   stream << this->visual->GetSceneNode()->getName() << "_ENTITY_" << meshName;
 
   this->object = (Ogre::MovableObject*)
@@ -649,7 +685,8 @@ void GpuLaser::CreateCanvas()
         meshName));
 
   this->visual->AttachObject(this->object);
-  this->object->setVisibilityFlags(GZ_VISIBILITY_ALL);
+  this->object->setVisibilityFlags(GZ_VISIBILITY_ALL
+      & ~GZ_VISIBILITY_SELECTABLE);
 
   math::Pose pose;
   pose.pos = math::Vector3(0.01, 0, 0);
@@ -662,3 +699,134 @@ void GpuLaser::CreateCanvas()
   this->visual->SetVisible(true);
   this->scene->AddVisual(this->visual);
 }
+
+//////////////////////////////////////////////////
+void GpuLaser::SetHorzHalfAngle(double _angle)
+{
+  this->horzHalfAngle = _angle;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetVertHalfAngle(double _angle)
+{
+  this->vertHalfAngle = _angle;
+}
+
+//////////////////////////////////////////////////
+double GpuLaser::GetHorzHalfAngle() const
+{
+  return this->horzHalfAngle;
+}
+
+//////////////////////////////////////////////////
+double GpuLaser::GetVertHalfAngle() const
+{
+  return this->vertHalfAngle;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetIsHorizontal(bool _horizontal)
+{
+  this->isHorizontal = _horizontal;
+}
+
+//////////////////////////////////////////////////
+bool GpuLaser::IsHorizontal() const
+{
+  return this->isHorizontal;
+}
+
+//////////////////////////////////////////////////
+double GpuLaser::GetHorzFOV() const
+{
+  return this->hfov;
+}
+
+//////////////////////////////////////////////////
+double GpuLaser::GetVertFOV() const
+{
+  return this->vfov;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetHorzFOV(double _hfov)
+{
+  this->hfov = _hfov;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetVertFOV(double _vfov)
+{
+  this->vfov = _vfov;
+}
+
+//////////////////////////////////////////////////
+double GpuLaser::GetCosHorzFOV() const
+{
+  return this->chfov;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetCosHorzFOV(double _chfov)
+{
+  this->chfov = _chfov;
+}
+
+//////////////////////////////////////////////////
+double GpuLaser::GetCosVertFOV() const
+{
+  return this->cvfov;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetCosVertFOV(double _cvfov)
+{
+  this->cvfov = _cvfov;
+}
+
+//////////////////////////////////////////////////
+double GpuLaser::GetNearClip() const
+{
+  return this->near;
+}
+
+//////////////////////////////////////////////////
+double GpuLaser::GetFarClip() const
+{
+  return this->far;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetNearClip(double _near)
+{
+  this->near = _near;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetFarClip(double _far)
+{
+  this->far = _far;
+}
+
+//////////////////////////////////////////////////
+double GpuLaser::GetCameraCount() const
+{
+  return this->cameraCount;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetCameraCount(double _cameraCount)
+{
+  this->cameraCount = _cameraCount;
+}
+//////////////////////////////////////////////////
+double GpuLaser::GetRayCountRatio() const
+{
+  return this->rayCountRatio;
+}
+
+//////////////////////////////////////////////////
+void GpuLaser::SetRayCountRatio(double _rayCountRatio)
+{
+  this->rayCountRatio = _rayCountRatio;
+}
diff --git a/gazebo/rendering/GpuLaser.hh b/gazebo/rendering/GpuLaser.hh
index cda3eb2..e3e2da5 100644
--- a/gazebo/rendering/GpuLaser.hh
+++ b/gazebo/rendering/GpuLaser.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,9 +25,11 @@
 #include <string>
 #include <vector>
 
+#include <sdf/sdf.hh>
+
 #include "gazebo/rendering/ogre_gazebo.h"
 #include "gazebo/rendering/Camera.hh"
-#include "gazebo/sensors/SensorTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
 
 #include "gazebo/common/Event.hh"
 #include "gazebo/common/Time.hh"
@@ -35,8 +37,7 @@
 #include "gazebo/math/Angle.hh"
 #include "gazebo/math/Pose.hh"
 #include "gazebo/math/Vector2i.hh"
-
-#include "gazebo/sdf/sdf.hh"
+#include "gazebo/util/system.hh"
 
 namespace Ogre
 {
@@ -64,20 +65,21 @@ namespace gazebo
 
     /// \class GpuLaser GpuLaser.hh rendering/rendering.hh
     /// \brief GPU based laser distance sensor
-    class GpuLaser : public Camera, public Ogre::RenderObjectListener
+    class GAZEBO_VISIBLE GpuLaser
+      : public Camera, public Ogre::RenderObjectListener
     {
       /// \brief Constructor
       /// \param[in] _namePrefix Unique prefix name for the camera.
       /// \param[in] _scene Scene that will contain the camera
       /// \param[in] _autoRender Almost everyone should leave this as true.
       public: GpuLaser(const std::string &_namePrefix,
-                          Scene *_scene, bool _autoRender = true);
+                          ScenePtr _scene, bool _autoRender = true);
 
       /// \brief Destructor
       public: virtual ~GpuLaser();
 
       // Documentation inherited
-      public: virtual void Load(sdf::ElementPtr &_sdf);
+      public: virtual void Load(sdf::ElementPtr _sdf);
 
       // Documentation inherited
       public: virtual void Load();
@@ -117,16 +119,101 @@ namespace gazebo
       /// \param[in] _h Number of samples in the vertical sweep
       public: void SetRangeCount(unsigned int _w, unsigned int _h = 1);
 
-      /// \brief Set the parent sensor
-      /// \param[in] _parent Pointer to a sensors::GpuRaySensor
-      public: void SetParentSensor(sensors::GpuRaySensor *_parent);
-
       /// \internal
       /// \brief Implementation of Ogre::RenderObjectListener
       public: virtual void notifyRenderSingleObject(Ogre::Renderable *_rend,
               const Ogre::Pass *_p, const Ogre::AutoParamDataSource *_s,
               const Ogre::LightList *_ll, bool _supp);
 
+      /// \brief Get (horizontal_max_angle + horizontal_min_angle) * 0.5
+      /// \return (horizontal_max_angle + horizontal_min_angle) * 0.5
+      public: double GetHorzHalfAngle() const;
+
+      /// \brief Get (vertical_max_angle + vertical_min_angle) * 0.5
+      /// \return (vertical_max_angle + vertical_min_angle) * 0.5
+      public: double GetVertHalfAngle() const;
+
+      /// \brief Set the horizontal half angle
+      /// \param[in] _angle horizontal half angle
+      public: void SetHorzHalfAngle(double _angle);
+
+      /// \brief Set the vertical half angle
+      /// \param[in] _angle vertical half angle
+      public: void SetVertHalfAngle(double _angle);
+
+      /// \brief Set sensor horizontal or vertical
+      /// \param[in] _horizontal True if horizontal, false if not
+      public: void SetIsHorizontal(bool _horizontal);
+
+      /// \brief Gets if sensor is horizontal
+      /// \return True if horizontal, false if not
+      public: bool IsHorizontal() const;
+
+      /// \brief Get the horizontal field of view of the laser sensor.
+      /// \return The horizontal field of view of the laser sensor.
+      public: double GetHorzFOV() const;
+
+      /// \brief Get Cos Horz field-of-view
+      /// \return 2 * atan(tan(this->hfov/2) / cos(this->vfov/2))
+      public: double GetCosHorzFOV() const;
+
+      /// \brief Set the Cos Horz FOV
+      /// \param[in] _chfov Cos Horz FOV
+      public: void SetCosHorzFOV(double _chfov);
+
+      /// \brief Get the vertical field-of-view.
+      /// \return The vertical field of view of the laser sensor.
+      public: double GetVertFOV() const;
+
+      /// \brief Get Cos Vert field-of-view
+      /// \return 2 * atan(tan(this->vfov/2) / cos(this->hfov/2))
+      public: double GetCosVertFOV() const;
+
+      /// \brief Set the Cos Horz FOV
+      /// \param[in] _cvfov Cos Horz FOV
+      public: void SetCosVertFOV(double _cvfov);
+
+      /// \brief Get near clip
+      /// \return near clip distance
+      public: double GetNearClip() const;
+
+      /// \brief Get far clip
+      /// \return far clip distance
+      public: double GetFarClip() const;
+
+      /// \brief Set the near clip distance
+      /// \param[in] _near near clip distance
+      public: void SetNearClip(double _near);
+
+      /// \brief Set the far clip distance
+      /// \param[in] _far far clip distance
+      public: void SetFarClip(double _far);
+
+      /// \brief Set the horizontal fov
+      /// \param[in] _hfov horizontal fov
+      public: void SetHorzFOV(double _hfov);
+
+      /// \brief Set the vertical fov
+      /// \param[in] _vfov vertical fov
+      public: void SetVertFOV(double _vfov);
+
+      /// \brief Get the number of cameras required
+      /// \return Number of cameras needed to generate the rays
+      public: double GetCameraCount() const;
+
+      /// \brief Set the number of cameras required
+      /// \param[in] _cameraCount The number of cameras required to generate
+      /// the rays
+      public: void SetCameraCount(double _cameraCount);
+
+      /// \brief Get the ray count ratio (equivalent to aspect ratio)
+      /// \return The ray count ratio (equivalent to aspect ratio)
+      public: double GetRayCountRatio() const;
+
+      /// \brief Sets the ray count ratio (equivalen to aspect ratio)
+      /// \param[in] _rayCountRatio ray count ratio (equivalent to aspect ratio)
+      public: void SetRayCountRatio(double _rayCountRatio);
+
       // Documentation inherited.
       private: virtual void RenderImpl();
 
@@ -170,45 +257,122 @@ namespace gazebo
       /// \param[in] _target Render target for the second pass.
       private: virtual void Set2ndPassTarget(Ogre::RenderTarget *_target);
 
-      private: event::EventT<void(const float *, unsigned int, unsigned int,
-                   unsigned int, const std::string &)> newLaserFrame;
+      /// \brief Horizontal half angle.
+      protected: double horzHalfAngle;
+
+      /// \brief Vertical half angle.
+      protected: double vertHalfAngle;
+
+      /// \brief Ray count ratio.
+      protected: double rayCountRatio;
+
+      /// \brief Horizontal field-of-view.
+      protected: double hfov;
+
+      /// \brief Vertical field-of-view.
+      protected: double vfov;
+
+      /// \brief Cos horizontal field-of-view.
+      protected: double chfov;
+
+      /// \brief Cos vertical field-of-view.
+      protected: double cvfov;
+
+      /// \brief Near clip plane.
+      protected: double near;
+
+      /// \brief Far clip plane.
+      protected: double far;
+
+      /// \brief True if the sensor is horizontal only.
+      protected: bool isHorizontal;
+
+      /// \brief Number of cameras needed to generate the rays.
+      protected: unsigned int cameraCount;
+
+      /// \brief Event triggered when new laser range data are available.
+      /// \param[in] _frame New frame containing raw laser data.
+      /// \param[in] _width Width of frame.
+      /// \param[in] _height Height of frame.
+      /// \param[in] _depth Depth of frame.
+      /// \param[in] _format Format of frame.
+      private: event::EventT<void(const float *_frame, unsigned int _width,
+                   unsigned int _height, unsigned int _depth,
+                   const std::string &_format)> newLaserFrame;
 
+      /// \brief Raw buffer of laser data.
       private: float *laserBuffer;
+
+      /// \brief Outgoing laser data, used by newLaserFrame event.
       private: float *laserScan;
-      private: Ogre::Material *mat_1st_pass;
-      private: Ogre::Material *mat_2nd_pass;
 
-      private: Ogre::Texture *_1stPassTextures[3];
-      private: Ogre::Texture *_2ndPassTexture;
-      private: Ogre::RenderTarget *_1stPassTargets[3];
-      private: Ogre::RenderTarget *_2ndPassTarget;
-      private: Ogre::Viewport *_1stPassViewports[3];
-      private: Ogre::Viewport *_2ndPassViewport;
+      /// \brief Pointer to Ogre material for the first rendering pass.
+      private: Ogre::Material *matFirstPass;
+
+      /// \brief Pointer to Ogre material for the sencod rendering pass.
+      private: Ogre::Material *matSecondPass;
+
+      /// \brief An array of first pass textures.
+      private: Ogre::Texture *firstPassTextures[3];
+
+      /// \brief Second pass texture.
+      private: Ogre::Texture *secondPassTexture;
+
+      /// \brief First pass render targets.
+      private: Ogre::RenderTarget *firstPassTargets[3];
+
+      /// \brief Second pass render target.
+      private: Ogre::RenderTarget *secondPassTarget;
 
-      private: unsigned int _textureCount;
+      /// \brief First pass viewports.
+      private: Ogre::Viewport *firstPassViewports[3];
+
+      /// \brief Second pass viewport
+      private: Ogre::Viewport *secondPassViewport;
+
+      /// \brief Number of first pass textures.
+      private: unsigned int textureCount;
+
+      /// \brief A list of camera angles for first pass rendering.
       private: double cameraYaws[4];
 
-      private: Ogre::RenderTarget *current_target;
-      private: Ogre::Material *current_mat;
+      /// \brief Temporary pointer to the current render target.
+      private: Ogre::RenderTarget *currentTarget;
 
+      /// \brief Temporary pointer to the current material.
+      private: Ogre::Material *currentMat;
+
+      /// \brief Ogre orthorgraphic camera used in the second pass for
+      /// undistortion.
       private: Ogre::Camera *orthoCam;
 
-      private: Ogre::SceneNode *origParentNode_ortho;
-      private: Ogre::SceneNode *pitchNode_ortho;
+      /// \brief Ogre scenenode where the orthorgraphic camera is attached to.
+      private: Ogre::SceneNode *pitchNodeOrtho;
 
-      private: common::Mesh *undist_mesh;
+      /// \brief Ogre mesh used to create a canvas for undistorting range values
+      /// in the second rendering pass.
+      private: common::Mesh *undistMesh;
 
+      /// \brief Ogre movable object created from the canvas mesh.
       private: Ogre::MovableObject *object;
 
+      /// \brief Pointer to visual that holds the canvas.
       private: VisualPtr visual;
 
+      /// \brief Image width.
       private: unsigned int w2nd;
+
+      /// \brief Image height.
       private: unsigned int h2nd;
 
-      private: sensors::GpuRaySensor *parent_sensor;
+      /// \brief Time taken to complete the two rendering passes.
       private: double lastRenderDuration;
 
+      /// \brief List of texture unit indices used during the second
+      /// rendering pass.
       private: std::vector<int> texIdx;
+
+      /// Number of second pass texture units created.
       private: static int texCount;
     };
     /// \}
diff --git a/gazebo/rendering/GpuLaser_TEST.cc b/gazebo/rendering/GpuLaser_TEST.cc
new file mode 100644
index 0000000..a729b9d
--- /dev/null
+++ b/gazebo/rendering/GpuLaser_TEST.cc
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/math/Rand.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/GpuLaser.hh"
+#include "test/ServerFixture.hh"
+
+class GpuLaser_TEST : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+//                                             //
+//  bring up a GpuLaser and exercise API       //
+//                                             //
+/////////////////////////////////////////////////
+TEST_F(GpuLaser_TEST, BasicGpuLaserAPITest)
+{
+  Load("worlds/empty.world");
+
+  gazebo::rendering::ScenePtr scene = gazebo::rendering::get_scene("default");
+
+  if (!scene)
+      scene = gazebo::rendering::create_scene("default", false);
+
+  EXPECT_TRUE(scene != NULL);
+
+  gazebo::rendering::GpuLaserPtr laserCam =
+    scene->CreateGpuLaser("test_laser", false);
+
+  EXPECT_TRUE(laserCam != NULL);
+
+  // The following tests all the getters and setters
+  {
+    laserCam->SetNearClip(0.1);
+    EXPECT_NEAR(laserCam->GetNearClip(), 0.1, 1e-6);
+
+    laserCam->SetFarClip(100.0);
+    EXPECT_NEAR(laserCam->GetFarClip(), 100, 1e-6);
+
+    laserCam->SetHorzHalfAngle(1.2);
+    EXPECT_NEAR(laserCam->GetHorzHalfAngle(), 1.2, 1e-6);
+
+    laserCam->SetVertHalfAngle(0.5);
+    EXPECT_NEAR(laserCam->GetVertHalfAngle(), 0.5, 1e-6);
+
+    laserCam->SetIsHorizontal(false);
+    EXPECT_FALSE(laserCam->IsHorizontal());
+
+    laserCam->SetHorzFOV(2.4);
+    EXPECT_NEAR(laserCam->GetHorzFOV(), 2.4, 1e-6);
+
+    laserCam->SetVertFOV(1.0);
+    EXPECT_NEAR(laserCam->GetVertFOV(), 1.0, 1e-6);
+
+    laserCam->SetCosHorzFOV(0.2);
+    EXPECT_NEAR(laserCam->GetCosHorzFOV(), 0.2, 1e-6);
+
+    laserCam->SetCosVertFOV(0.1);
+    EXPECT_NEAR(laserCam->GetCosVertFOV(), 0.1, 1e-6);
+
+    laserCam->SetRayCountRatio(0.344);
+    EXPECT_NEAR(laserCam->GetRayCountRatio(), 0.344, 1e-6);
+
+    laserCam->SetCameraCount(4);
+    EXPECT_EQ(static_cast<int>(laserCam->GetCameraCount()), 4);
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/rendering/Grid.cc b/gazebo/rendering/Grid.cc
index 6002248..44a2c63 100644
--- a/gazebo/rendering/Grid.cc
+++ b/gazebo/rendering/Grid.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,11 +17,11 @@
 
 #include <sstream>
 
-#include "rendering/ogre_gazebo.h"
+#include "gazebo/rendering/ogre_gazebo.h"
 
-#include "rendering/Conversions.hh"
-#include "rendering/Scene.hh"
-#include "rendering/Grid.hh"
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/Grid.hh"
 
 using namespace gazebo;
 using namespace rendering;
diff --git a/gazebo/rendering/Grid.hh b/gazebo/rendering/Grid.hh
index 2b72957..cfcb3a9 100644
--- a/gazebo/rendering/Grid.hh
+++ b/gazebo/rendering/Grid.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,9 +24,10 @@
 #include <string>
 
 // TODO: remove this line
-#include "rendering/ogre_gazebo.h"
+#include "gazebo/rendering/ogre_gazebo.h"
 
-#include "common/Color.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/util/system.hh"
 
 namespace Ogre
 {
@@ -49,7 +50,7 @@ namespace gazebo
     ///
     ///  Displays a grid of cells, drawn with lines.  A grid with an
     ///  identity orientation is drawn along the XY plane.
-    class Grid
+    class GAZEBO_VISIBLE Grid
     {
       /// \brief Constructor
       ///
diff --git a/gazebo/rendering/Heightmap.cc b/gazebo/rendering/Heightmap.cc
index 3743ef6..9804a2c 100644
--- a/gazebo/rendering/Heightmap.cc
+++ b/gazebo/rendering/Heightmap.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,37 +23,73 @@
 #include <math.h>
 
 #include "gazebo/common/Assert.hh"
-#include "gazebo/common/Common.hh"
+#include "gazebo/common/CommonIface.hh"
 #include "gazebo/common/Exception.hh"
-
+#include "gazebo/common/SystemPaths.hh"
 #include "gazebo/math/Helpers.hh"
-
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/rendering/RTShaderSystem.hh"
 #include "gazebo/rendering/Scene.hh"
 #include "gazebo/rendering/Light.hh"
 #include "gazebo/rendering/Conversions.hh"
 #include "gazebo/rendering/Heightmap.hh"
+#include "gazebo/rendering/UserCamera.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
+const unsigned int Heightmap::numTerrainSubdivisions = 16;
+const double Heightmap::loadRadiusFactor = 1.0;
+const double Heightmap::holdRadiusFactor = 1.15;
+const boost::filesystem::path Heightmap::pagingDirname = "paging";
+const boost::filesystem::path Heightmap::hashFilename = "gzterrain.SHA1";
+
 //////////////////////////////////////////////////
 Heightmap::Heightmap(ScenePtr _scene)
 {
   this->scene = _scene;
   this->terrainGlobals = NULL;
+  this->terrainPaging = NULL;
+  this->pageManager = NULL;
+
+  this->terrainIdx = 0;
+  this->useTerrainPaging = false;
+
+  this->pageManager = NULL;
+  this->terrainPaging = NULL;
+  this->terrainHashChanged = true;
+  this->terrainsImported = true;
+
+  this->gzPagingDir =
+      common::SystemPaths::Instance()->GetLogPath() / this->pagingDirname;
 }
 
 //////////////////////////////////////////////////
 Heightmap::~Heightmap()
 {
   this->scene.reset();
+
+  if (this->terrainPaging)
+  {
+    OGRE_DELETE this->terrainPaging;
+    pageManager->destroyWorld(this->world);
+    OGRE_DELETE this->pageManager;
+  }
+  else
+  {
+    this->terrainGroup->removeAllTerrains();
+
+    OGRE_DELETE this->terrainGroup;
+    this->terrainGroup = NULL;
+  }
+
+  OGRE_DELETE this->terrainGlobals;
+  this->terrainGlobals = NULL;
 }
 
 //////////////////////////////////////////////////
 void Heightmap::LoadFromMsg(ConstVisualPtr &_msg)
 {
-  msgs::Set(this->heightImage, _msg->geometry().heightmap().image());
   this->terrainSize = msgs::Convert(_msg->geometry().heightmap().size());
   this->terrainOrigin = msgs::Convert(_msg->geometry().heightmap().origin());
 
@@ -75,6 +111,11 @@ void Heightmap::LoadFromMsg(ConstVisualPtr &_msg)
         _msg->geometry().heightmap().blend(i).fade_dist());
   }
 
+  if (_msg->geometry().heightmap().has_use_terrain_paging())
+  {
+    this->useTerrainPaging = _msg->geometry().heightmap().use_terrain_paging();
+  }
+
   this->Load();
 }
 
@@ -85,24 +126,238 @@ Ogre::TerrainGroup *Heightmap::GetOgreTerrain() const
 }
 
 //////////////////////////////////////////////////
+common::Image Heightmap::GetImage() const
+{
+  common::Image result;
+
+  double height = 0.0;
+  unsigned char *imageData = NULL;
+
+  /// \todo Support multiple terrain objects
+  Ogre::Terrain *terrain = this->terrainGroup->getTerrain(0, 0);
+
+  GZ_ASSERT(terrain != NULL, "Unable to get a valid terrain pointer");
+
+  double minHeight = terrain->getMinHeight();
+  double maxHeight = terrain->getMaxHeight() - minHeight;
+
+  // Get the number of vertices along one side of the terrain
+  uint16_t size = terrain->getSize();
+
+  // Create the image data buffer
+  imageData = new unsigned char[size * size];
+
+  // Get height data from all vertices
+  for (uint16_t y = 0; y < size; ++y)
+  {
+    for (uint16_t x = 0; x < size; ++x)
+    {
+      // Normalize height value
+      height = (terrain->getHeightAtPoint(x, y) - minHeight) / maxHeight;
+
+      GZ_ASSERT(height <= 1.0, "Normalized terrain height > 1.0");
+      GZ_ASSERT(height >= 0.0, "Normalized terrain height < 0.0");
+
+      // Scale height to a value between 0 and 255
+      imageData[(size - y - 1)*size+x] =
+        static_cast<unsigned char>(height * 255.0);
+    }
+  }
+
+  result.SetFromData(imageData, size, size, common::Image::L_INT8);
+
+  delete [] imageData;
+  return result;
+}
+
+//////////////////////////////////////////////////
+void Heightmap::SplitHeights(const std::vector<float> &_heightmap, int _n,
+    std::vector<std::vector<float> > &_v)
+{
+  // We support splitting the terrain in 4 or 16 pieces
+  GZ_ASSERT(_n == 4 || _n == 16,
+      "Invalid number of terrain divisions (it should be 4 or 16)");
+
+  int count = 0;
+  int width = sqrt(_heightmap.size());
+  int newWidth = 1 + (width - 1) / sqrt(_n);
+
+  // Memory allocation
+  _v.resize(_n);
+
+  for (int tileR = 0; tileR < sqrt(_n); ++tileR)
+  {
+    int tileIndex = tileR * sqrt(_n);
+    for (int row = 0; row < newWidth - 1; ++row)
+    {
+      for (int tileC = 0; tileC < sqrt(_n); ++tileC)
+      {
+        for (int col = 0; col < newWidth - 1; ++col)
+        {
+          _v[tileIndex].push_back(_heightmap[count]);
+          ++count;
+        }
+        // Copy last value into the last column
+        _v[tileIndex].push_back(_v[tileIndex].back());
+
+        tileIndex = tileR * sqrt(_n) +
+            (tileIndex + 1) % static_cast<int>(sqrt(_n));
+      }
+      ++count;
+    }
+    // Copy the last row
+    for (int i = 0; i < sqrt(_n); ++i)
+    {
+      tileIndex = tileR * sqrt(_n) + i;
+      std::vector<float> lastRow(_v[tileIndex].end() - newWidth,
+          _v[tileIndex].end());
+      _v[tileIndex].insert(_v[tileIndex].end(),
+          lastRow.begin(), lastRow.end());
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+void Heightmap::UpdateTerrainHash(const std::string &_hash,
+    const boost::filesystem::path &_terrainDir)
+{
+  std::ofstream terrainHashFile;
+  boost::filesystem::path terrainHashFullPath;
+
+  // Create the subdirectories if they do not exist
+  boost::filesystem::create_directories(_terrainDir);
+
+  terrainHashFullPath = _terrainDir / this->hashFilename;
+
+  // Update the terrain hash
+  terrainHashFile.open(terrainHashFullPath.string().c_str());
+
+  // Throw an error if we couldn't open the file for writing.
+  if (terrainHashFile.is_open())
+  {
+    terrainHashFile << _hash;
+    terrainHashFile.close();
+  }
+  else
+  {
+    gzerr << "Unable to open file for creating a terrain hash: [" +
+        terrainHashFullPath.string() + "]\n";
+  }
+}
+
+//////////////////////////////////////////////////
+bool Heightmap::PrepareTerrainPaging(
+    const boost::filesystem::path &_terrainDirPath)
+{
+  std::string heightmapHash;
+  boost::filesystem::path terrainHashFullPath;
+  bool updateHash = true;
+
+  // Compute the original heightmap's image.
+  heightmapHash = common::get_sha1<std::vector<float> >(this->heights);
+
+  // Check if the terrain hash exists
+  terrainHashFullPath = _terrainDirPath / this->hashFilename;
+  if (boost::filesystem::exists(terrainHashFullPath))
+  {
+    try
+    {
+      // Read the terrain hash
+      std::ifstream in(terrainHashFullPath.string().c_str());
+      std::stringstream buffer;
+      buffer << in.rdbuf();
+      std::string terrainHash(buffer.str());
+      updateHash = terrainHash != heightmapHash;
+    }
+    catch(std::ifstream::failure &e)
+    {
+      gzerr << "Terrain paging error: Unable to read terrain hash\n";
+    }
+  }
+
+  // Update the terrain hash and split the terrain into small pieces
+  if (updateHash)
+  {
+    this->UpdateTerrainHash(heightmapHash, _terrainDirPath);
+  }
+
+  return updateHash;
+}
+
+//////////////////////////////////////////////////
 void Heightmap::Load()
 {
   if (this->terrainGlobals != NULL)
     return;
 
+  // The terraingGroup is composed by a number of terrains (1 by default)
+  int nTerrains = 1;
+
   this->terrainGlobals = new Ogre::TerrainGlobalOptions();
 
-  if (this->heightImage.GetWidth() != this->heightImage.GetHeight() ||
-      !math::isPowerOfTwo(this->heightImage.GetWidth() - 1))
+#if (OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 8) || \
+    OGRE_VERSION_MAJOR > 1
+  // Vertex compression breaks anything, e.g. Gpu laser, that tries to build
+  // a depth map.
+  this->terrainGlobals->setUseVertexCompressionWhenAvailable(false);
+#endif
+
+  msgs::Geometry geomMsg;
+  boost::filesystem::path imgPath;
+  boost::filesystem::path terrainName;
+  boost::filesystem::path terrainDirPath;
+  boost::filesystem::path prefix;
+  boost::shared_ptr<msgs::Response> response = transport::request(
+     this->scene->GetName(), "heightmap_data");
+
+  if (response->response() != "error" &&
+      response->type() == geomMsg.GetTypeName())
   {
-    gzthrow("Heightmap image size must be square, with a size of 2^n+1\n");
+    geomMsg.ParseFromString(response->serialized_data());
+
+    // Copy the height data.
+    this->terrainSize = msgs::Convert(geomMsg.heightmap().size());
+    this->heights.resize(geomMsg.heightmap().heights().size());
+    memcpy(&this->heights[0], geomMsg.heightmap().heights().data(),
+        sizeof(this->heights[0])*geomMsg.heightmap().heights().size());
+
+    this->dataSize = geomMsg.heightmap().width();
+
+    if (geomMsg.heightmap().has_filename())
+    {
+      // Get the full path of the image heightmap
+      imgPath = geomMsg.heightmap().filename();
+      terrainName = imgPath.filename().stem();
+      terrainDirPath = this->gzPagingDir / terrainName;
+
+      // Add the top level terrain paging directory to the OGRE
+      // ResourceGroupManager
+      if (!Ogre::ResourceGroupManager::getSingleton().resourceLocationExists(
+            this->gzPagingDir.string(), "General"))
+      {
+        Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
+            this->gzPagingDir.string(), "FileSystem", "General", true);
+        Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup(
+            "General");
+      }
+    }
   }
 
-  this->imageSize = this->heightImage.GetWidth();
-  this->maxPixel = this->heightImage.GetMaxColor().r;
+  if (!math::isPowerOfTwo(this->dataSize - 1))
+    gzthrow("Heightmap image size must be square, with a size of 2^n+1\n");
 
-  if (math::equal(this->maxPixel, 0.0))
-    this->maxPixel = 1.0;
+  // If the paging is enabled we modify the number of subterrains
+  if (this->useTerrainPaging)
+  {
+    nTerrains = this->numTerrainSubdivisions;
+    prefix = terrainDirPath / "gazebo_terrain_cache";
+  }
+  else
+  {
+    prefix = terrainDirPath / "gazebo_terrain_nocache";
+  }
+
+  double sqrtN = sqrt(nTerrains);
 
   // Create terrain group, which holds all the individual terrain instances.
   // Param 1: Pointer to the scene manager
@@ -110,24 +365,85 @@ void Heightmap::Load()
   // Param 3: Number of vertices along one edge of the terrain (2^n+1).
   //          Terrains must be square, with each side a power of 2 in size
   // Param 4: World size of each terrain instance, in meters.
+
   this->terrainGroup = new Ogre::TerrainGroup(
       this->scene->GetManager(), Ogre::Terrain::ALIGN_X_Y,
-      this->imageSize, this->terrainSize.x);
+      1 + ((this->dataSize - 1) / sqrtN),
+      this->terrainSize.x / (sqrtN));
 
   this->terrainGroup->setFilenameConvention(
-      Ogre::String("gazebo_terrain"), Ogre::String("dat"));
+    Ogre::String(prefix.string()), Ogre::String("dat"));
 
-  this->terrainGroup->setOrigin(Conversions::Convert(this->terrainOrigin));
+  Ogre::Vector3 orig = Conversions::Convert(this->terrainOrigin);
+  math::Vector3 origin(
+      orig.x -0.5 * this->terrainSize.x + 0.5 * this->terrainSize.x / sqrtN,
+      orig.y -0.5 * this->terrainSize.x + 0.5 * this->terrainSize.x / sqrtN,
+      orig.z);
 
+  this->terrainGroup->setOrigin(Conversions::Convert(origin));
   this->ConfigureTerrainDefaults();
-
   this->SetupShadows(true);
 
-  for (int x = 0; x <= 0; ++x)
-    for (int y = 0; y <= 0; ++y)
+  if (!this->heights.empty())
+  {
+    UserCameraPtr userCam = this->scene->GetUserCamera(0);
+
+    // Move the camera above the terrain only if the user did not modify the
+    // camera position in the world file
+    if (userCam && !userCam->IsCameraSetInWorldFile())
+    {
+      double h = *std::max_element(
+        &this->heights[0], &this->heights[0] + this->heights.size());
+
+      math::Vector3 camPos(5, -5, h + 200);
+      math::Vector3 lookAt(0, 0, h);
+      math::Vector3 delta = lookAt - camPos;
+
+      double yaw = atan2(delta.y, delta.x);
+      double pitch = atan2(-delta.z,
+                           sqrt(delta.x * delta.x + delta.y * delta.y));
+
+      userCam->SetWorldPose(math::Pose(camPos, math::Vector3(0, pitch, yaw)));
+    }
+  }
+
+  if (this->useTerrainPaging)
+  {
+    this->terrainHashChanged = this->PrepareTerrainPaging(terrainDirPath);
+
+    if (this->terrainHashChanged)
+    {
+      // Split the terrain. Every subterrain will be saved on disk and paged
+      this->SplitHeights(this->heights, nTerrains, this->subTerrains);
+    }
+
+    this->pageManager = OGRE_NEW Ogre::PageManager();
+    this->pageManager->setPageProvider(&this->dummyPageProvider);
+
+    // Add cameras
+    for (unsigned int i = 0; i < this->scene->GetCameraCount(); ++i)
+    {
+      this->pageManager->addCamera(this->scene->GetCamera(i)->GetOgreCamera());
+    }
+    for (unsigned int i = 0; i < this->scene->GetUserCameraCount(); ++i)
+    {
+      this->pageManager->addCamera(
+          this->scene->GetUserCamera(i)->GetOgreCamera());
+    }
+
+    this->terrainPaging = OGRE_NEW Ogre::TerrainPaging(this->pageManager);
+    this->world = pageManager->createWorld();
+    this->terrainPaging->createWorldSection(world, this->terrainGroup,
+        this->loadRadiusFactor * this->terrainSize.x,
+        this->holdRadiusFactor * this->terrainSize.x,
+        0, 0, sqrtN - 1, sqrtN - 1);
+  }
+
+  for (int y = 0; y <= sqrtN - 1; ++y)
+    for (int x = 0; x <= sqrtN - 1; ++x)
       this->DefineTerrain(x, y);
 
-  // sync load since we want everything in place when we start
+  // Sync load since we want everything in place when we start
   this->terrainGroup->loadAllTerrains(true);
 
   // Calculate blend maps
@@ -140,6 +456,11 @@ void Heightmap::Load()
       Ogre::Terrain *t = ti.getNext()->instance;
       this->InitBlendMaps(t);
     }
+    if (this->terrainHashChanged)
+    {
+      // Save all subterrains using files.
+      this->terrainGroup->saveAllTerrains(true);
+    }
   }
 
   this->terrainGroup->freeTemporaryResources();
@@ -153,11 +474,18 @@ void Heightmap::ConfigureTerrainDefaults()
   // MaxPixelError: Decides how precise our terrain is going to be.
   // A lower number will mean a more accurate terrain, at the cost of
   // performance (because of more vertices)
-  this->terrainGlobals->setMaxPixelError(2);
+  this->terrainGlobals->setMaxPixelError(0);
 
   // CompositeMapDistance: decides how far the Ogre terrain will render
   // the lightmapped terrain.
-  this->terrainGlobals->setCompositeMapDistance(1000);
+  this->terrainGlobals->setCompositeMapDistance(2000);
+
+#if (OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 8) || \
+    OGRE_VERSION_MAJOR > 1
+  // Vertex compression breaks anything, e.g. Gpu laser, that tries to build
+  // a depth map.
+  this->terrainGlobals->setUseVertexCompressionWhenAvailable(false);
+#endif
 
   // Get the first directional light
   LightPtr directionalLight;
@@ -195,12 +523,12 @@ void Heightmap::ConfigureTerrainDefaults()
   Ogre::Terrain::ImportData &defaultimp =
     this->terrainGroup->getDefaultImportSettings();
 
-  defaultimp.terrainSize = this->imageSize;
+  defaultimp.terrainSize = this->dataSize;
   defaultimp.worldSize = this->terrainSize.x;
 
-  defaultimp.inputScale = this->terrainSize.z / this->maxPixel;
+  defaultimp.inputScale = 1.0;
 
-  defaultimp.minBatchSize = 33;
+  defaultimp.minBatchSize = 17;
   defaultimp.maxBatchSize = 65;
 
   // textures. The default material generator takes two materials per layer.
@@ -223,55 +551,54 @@ void Heightmap::ConfigureTerrainDefaults()
 }
 
 /////////////////////////////////////////////////
-void Heightmap::DefineTerrain(int x, int y)
+void Heightmap::SetWireframe(bool _show)
 {
-  Ogre::String filename = this->terrainGroup->generateFilename(x, y);
+  Ogre::Terrain *terrain = this->terrainGroup->getTerrain(0, 0);
+  GZ_ASSERT(terrain != NULL, "Unable to get a valid terrain pointer");
 
-  if (Ogre::ResourceGroupManager::getSingleton().resourceExists(
-        this->terrainGroup->getResourceGroup(), filename))
-  {
-    this->terrainGroup->defineTerrain(x, y);
-  }
-  else
-  {
-    Ogre::Image img;
-    bool flipX = x % 2 != 0;
-    bool flipY = y % 2 != 0;
+  Ogre::Material *material = terrain->getMaterial().get();
 
-    unsigned char *data = NULL;
-    unsigned int count = 0;
-    this->heightImage.GetData(&data, count);
+  unsigned int techniqueCount, passCount;
+  Ogre::Technique *technique;
+  Ogre::Pass *pass;
 
-    if (this->heightImage.GetPixelFormat() == common::Image::L_INT8)
-    {
-      img.loadDynamicImage(data, this->heightImage.GetWidth(),
-          this->heightImage.GetHeight(), Ogre::PF_L8);
-    }
-    else if (this->heightImage.GetPixelFormat() == common::Image::RGBA_INT8)
-    {
-      img.loadDynamicImage(data, this->heightImage.GetWidth(),
-          this->heightImage.GetHeight(), Ogre::PF_R8G8B8A8);
-    }
-    else if (this->heightImage.GetPixelFormat() == common::Image::RGB_INT8)
-    {
-      img.loadDynamicImage(data, this->heightImage.GetWidth(),
-          this->heightImage.GetHeight(), Ogre::PF_R8G8B8);
-    }
-    else
+  for (techniqueCount = 0; techniqueCount < material->getNumTechniques();
+      techniqueCount++)
+  {
+    technique = material->getTechnique(techniqueCount);
+
+    for (passCount = 0; passCount < technique->getNumPasses(); passCount++)
     {
-      gzerr << "Unable to handle image format["
-            << this->heightImage.GetPixelFormat() << "]\n";
+      pass = technique->getPass(passCount);
+      if (_show)
+        pass->setPolygonMode(Ogre::PM_WIREFRAME);
+      else
+        pass->setPolygonMode(Ogre::PM_SOLID);
     }
+  }
+}
 
-    if (flipX)
-      img.flipAroundY();
-    if (flipY)
-      img.flipAroundX();
-
-    this->terrainGroup->defineTerrain(x, y, &img);
-    this->terrainsImported = true;
+/////////////////////////////////////////////////
+void Heightmap::DefineTerrain(int _x, int _y)
+{
+  Ogre::String filename = this->terrainGroup->generateFilename(_x, _y);
 
-    delete [] data;
+  if (!this->useTerrainPaging)
+  {
+    this->terrainGroup->defineTerrain(_x, _y, &this->heights[0]);
+  }
+  else if ((Ogre::ResourceGroupManager::getSingleton().resourceExists(
+             this->terrainGroup->getResourceGroup(), filename)) &&
+          (!this->terrainHashChanged))
+  {
+    this->terrainGroup->defineTerrain(_x, _y);
+    this->terrainsImported = false;
+  }
+  else
+  {
+      this->terrainGroup->defineTerrain(_x, _y,
+          &this->subTerrains[this->terrainIdx][0]);
+      ++terrainIdx;
   }
 }
 
@@ -280,7 +607,7 @@ bool Heightmap::InitBlendMaps(Ogre::Terrain *_terrain)
 {
   if (!_terrain)
   {
-    std::cerr << "Invalid  terrain\n";
+    std::cerr << "Invalid terrain\n";
     return false;
   }
 
@@ -337,18 +664,218 @@ double Heightmap::GetHeight(double _x, double _y, double _z)
   if (result.hit)
     return result.position.z;
   else
+  {
     return 0;
+  }
+}
+
+/////////////////////////////////////////////////
+Ogre::TerrainGroup::RayResult Heightmap::GetMouseHit(CameraPtr _camera,
+    math::Vector2i _mousePos)
+{
+  Ogre::Ray mouseRay = _camera->GetOgreCamera()->getCameraToViewportRay(
+      static_cast<float>(_mousePos.x) /
+      _camera->GetViewport()->getActualWidth(),
+      static_cast<float>(_mousePos.y) /
+      _camera->GetViewport()->getActualHeight());
+
+  // The terrain uses a special ray intersection test.
+  return this->terrainGroup->rayIntersects(mouseRay);
+}
+
+/////////////////////////////////////////////////
+bool Heightmap::Smooth(CameraPtr _camera, math::Vector2i _mousePos,
+                         double _outsideRadius, double _insideRadius,
+                         double _weight)
+{
+  Ogre::TerrainGroup::RayResult terrainResult =
+    this->GetMouseHit(_camera, _mousePos);
+
+  if (terrainResult.hit)
+    this->ModifyTerrain(terrainResult.position, _outsideRadius, _insideRadius,
+        _weight, "smooth");
+
+  return terrainResult.hit;
+}
+
+/////////////////////////////////////////////////
+bool Heightmap::Flatten(CameraPtr _camera, math::Vector2i _mousePos,
+                         double _outsideRadius, double _insideRadius,
+                         double _weight)
+{
+  Ogre::TerrainGroup::RayResult terrainResult =
+    this->GetMouseHit(_camera, _mousePos);
+
+  if (terrainResult.hit)
+    this->ModifyTerrain(terrainResult.position, _outsideRadius,
+        _insideRadius, _weight, "flatten");
+
+  return terrainResult.hit;
+}
+
+/////////////////////////////////////////////////
+bool Heightmap::Raise(CameraPtr _camera, math::Vector2i _mousePos,
+    double _outsideRadius, double _insideRadius, double _weight)
+{
+  // The terrain uses a special ray intersection test.
+  Ogre::TerrainGroup::RayResult terrainResult =
+    this->GetMouseHit(_camera, _mousePos);
+
+  if (terrainResult.hit)
+    this->ModifyTerrain(terrainResult.position, _outsideRadius,
+       _insideRadius, _weight, "raise");
+
+  return terrainResult.hit;
+}
+
+/////////////////////////////////////////////////
+bool Heightmap::Lower(CameraPtr _camera, math::Vector2i _mousePos,
+    double _outsideRadius, double _insideRadius, double _weight)
+{
+  // The terrain uses a special ray intersection test.
+  Ogre::TerrainGroup::RayResult terrainResult =
+    this->GetMouseHit(_camera, _mousePos);
+
+  if (terrainResult.hit)
+    this->ModifyTerrain(terrainResult.position, _outsideRadius,
+        _insideRadius, _weight, "lower");
+
+  return terrainResult.hit;
+}
+
+/////////////////////////////////////////////////
+double Heightmap::GetAvgHeight(Ogre::Vector3 _pos, double _radius)
+{
+  GZ_ASSERT(this->terrainGroup, "TerrainGroup pointer is NULL");
+  Ogre::Terrain *terrain = this->terrainGroup->getTerrain(0, 0);
+
+  if (!terrain)
+  {
+    gzerr << "Invalid heightmap position [" << _pos << "]\n";
+    return 0.0;
+  }
+
+  int size = static_cast<int>(terrain->getSize());
+
+  Ogre::Vector3 pos;
+  terrain->getTerrainPosition(_pos, &pos);
+
+  int startx = (pos.x - _radius) * size;
+  int starty = (pos.y - _radius) * size;
+  int endx = (pos.x + _radius) * size;
+  int endy = (pos.y + _radius) * size;
+
+  startx = std::max(startx, 0);
+  starty = std::max(starty, 0);
+
+  endx = std::min(endx, size);
+  endy = std::min(endy, size);
+
+  double sum = 0.0;
+  int count = 0;
+  for (int y = starty; y <= endy; ++y)
+  {
+    for (int x = startx; x <= endx; ++x)
+    {
+      sum += terrain->getHeightAtPoint(x, y);
+      count++;
+    }
+  }
+
+  return sum / count;
+}
+
+/////////////////////////////////////////////////
+void Heightmap::ModifyTerrain(Ogre::Vector3 _pos, double _outsideRadius,
+    double _insideRadius, double _weight, const std::string &_op)
+{
+  GZ_ASSERT(this->terrainGroup, "TerrainGroup pointer is NULL");
+  Ogre::Terrain *terrain = this->terrainGroup->getTerrain(0, 0);
+
+  if (!terrain)
+  {
+    gzerr << "Invalid heightmap position [" << _pos << "]\n";
+    return;
+  }
+
+  int size = static_cast<int>(terrain->getSize());
+
+  Ogre::Vector3 pos;
+  terrain->getTerrainPosition(_pos, &pos);
+
+  int startx = (pos.x - _outsideRadius) * size;
+  int starty = (pos.y - _outsideRadius) * size;
+  int endx = (pos.x + _outsideRadius) * size;
+  int endy = (pos.y + _outsideRadius) * size;
+
+  startx = std::max(startx, 0);
+  starty = std::max(starty, 0);
+
+  endx = std::min(endx, size);
+  endy = std::min(endy, size);
+
+  double avgHeight = 0;
+
+  if (_op == "flatten" || _op == "smooth")
+    avgHeight = this->GetAvgHeight(pos, _outsideRadius);
+
+  for (int y = starty; y <= endy; ++y)
+  {
+    for (int x = startx; x <= endx; ++x)
+    {
+      double tsXdist = (x / static_cast<double>(size)) - pos.x;
+      double tsYdist = (y / static_cast<double>(size))  - pos.y;
+
+      double weight = 1.0;
+      double dist = sqrt(tsYdist * tsYdist + tsXdist * tsXdist);
+
+      if (dist > _insideRadius)
+      {
+        weight = math::clamp(dist / _outsideRadius, 0.0, 1.0);
+        weight = 1.0 - (weight * weight);
+      }
+
+      float addedHeight = weight * _weight;
+      float newHeight = terrain->getHeightAtPoint(x, y);
+
+      if (_op == "raise")
+        newHeight += addedHeight;
+      else if (_op == "lower")
+        newHeight -= addedHeight;
+      else if (_op == "flatten")
+      {
+        if (newHeight < avgHeight)
+          newHeight += addedHeight;
+        else
+          newHeight -= addedHeight;
+      }
+      else if (_op == "smooth")
+      {
+        if (newHeight < avgHeight)
+          newHeight += addedHeight;
+        else
+          newHeight -= addedHeight;
+      }
+      else
+        gzerr << "Unknown terrain operation[" << _op << "]\n";
+
+      terrain->setHeightAtPoint(x, y, newHeight);
+    }
+  }
+  terrain->dirty();
+  terrain->update();
 }
 
 /////////////////////////////////////////////////
 void Heightmap::SetupShadows(bool _enableShadows)
 {
+  this->gzMatGen = new GzTerrainMatGen();
+
   // Assume we get a shader model 2 material profile
   Ogre::TerrainMaterialGeneratorA::SM2Profile *matProfile;
 
   // RTSS PSSM shadows compatible terrain material
-  Ogre::TerrainMaterialGenerator *matGen =
-    new GzTerrainMatGen();
+  Ogre::TerrainMaterialGenerator *matGen = this->gzMatGen;
 
   Ogre::TerrainMaterialGeneratorPtr ptr = Ogre::TerrainMaterialGeneratorPtr();
   ptr.bind(matGen);
@@ -359,6 +886,8 @@ void Heightmap::SetupShadows(bool _enableShadows)
   if (!matProfile)
     gzerr << "Invalid mat profile\n";
 
+  matProfile->setLayerParallaxMappingEnabled(false);
+
   if (_enableShadows)
   {
     // Make sure PSSM is already setup
@@ -375,6 +904,12 @@ void Heightmap::SetupShadows(bool _enableShadows)
 }
 
 /////////////////////////////////////////////////
+unsigned int Heightmap::GetTerrainSubdivisionCount() const
+{
+  return this->numTerrainSubdivisions;
+}
+
+/////////////////////////////////////////////////
 /////////////////////////////////////////////////
 // GzTerrainMatGen
 /////////////////////////////////////////////////
@@ -411,13 +946,15 @@ GzTerrainMatGen::SM2Profile::SM2Profile(
     const Ogre::String &_desc)
 : TerrainMaterialGeneratorA::SM2Profile::SM2Profile(_parent, _name, _desc)
 {
+  this->mShaderGen = NULL;
 }
 
 /////////////////////////////////////////////////
 GzTerrainMatGen::SM2Profile::~SM2Profile()
 {
   // Because the base SM2Profile has no virtual destructor:
-  OGRE_DELETE this->mShaderGen;
+  delete this->mShaderGen;
+  this->mShaderGen = NULL;
 }
 
 /////////////////////////////////////////////////
@@ -1654,11 +2191,12 @@ GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadowsHelpers(
       // The following line used to be:
       // "      float depth = tex2d(shadowMap, newUV.xy, 1.0, 1.0).x;\n"
       "      float depth = textureGrad(shadowMap, newUV.xy, "
-      "vec2(1.0, 1.0), vec2(1.0, 1.0)).x;\n"
-      "      if (depth >= 1.0 || depth >= uv.z)\n"
+      " vec2(1.0, 1.0), vec2(1.0, 1.0)).x;\n"
+      // "      if (depth >= 1.0 || depth >= uv.z)\n"
+      "      if (depth >= 1.0 || depth >= newUV.z)\n"
       "        shadow += 1.0;\n"
       "    }\n"
-      "  shadow /= (SHADOW_SAMPLES);\n"
+      "  shadow /= (SHADOW_SAMPLES); \n"
       "  return shadow;\n"
       "}\n";
   }
@@ -1705,7 +2243,7 @@ GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadowsHelpers(
     _outStream << "\n"
       "  vec4 pssmSplitPoints, float camDepth)\n"
       "{\n"
-      "  float shadow;\n"
+      "  float shadow = 1.0;\n"
       "  // calculate shadow\n";
 
     for (Ogre::uint i = 0; i < numTextures; ++i)
@@ -1713,12 +2251,12 @@ GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadowsHelpers(
       if (!i)
       {
         _outStream << "  if (camDepth <= pssmSplitPoints."
-                   << this->GetChannel(i) << ")\n";
+          << this->GetChannel(i) << ")\n";
       }
-      else if (i < numTextures - 1)
+      else if (i < numTextures-1)
       {
         _outStream << "  else if (camDepth <= pssmSplitPoints."
-                   << this->GetChannel(i) << ")\n";
+          << this->GetChannel(i) << ")\n";
       }
       else
         _outStream << "  else\n";
@@ -1728,12 +2266,12 @@ GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadowsHelpers(
       if (_prof->getReceiveDynamicShadowsDepth())
       {
         _outStream << "    shadow = calcDepthShadow(shadowMap" << i
-                   << ", lsPos" << i << ", invShadowmapSize" << i << ");\n";
+          << ", lsPos" << i << ", invShadowmapSize" << i << ");\n";
       }
       else
       {
         _outStream << "    shadow = calcSimpleShadow(shadowMap" << i
-                   << ", lsPos" << i << ");\n";
+          << ", lsPos" << i << ");\n";
       }
       _outStream << "  }\n";
     }
@@ -1797,7 +2335,7 @@ void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadows(
     }
   }
 
-  _outStream << "  shadow = min(shadow, rtshadow);\n";
+  _outStream << "  shadow = rtshadow;//min(shadow, rtshadow);\n";
 }
 
 /////////////////////////////////////////////////
diff --git a/gazebo/rendering/Heightmap.hh b/gazebo/rendering/Heightmap.hh
index ce911fb..687dbbf 100644
--- a/gazebo/rendering/Heightmap.hh
+++ b/gazebo/rendering/Heightmap.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,13 +24,14 @@
 
 #include <string>
 #include <vector>
+#include <boost/filesystem.hpp>
 
 #include "gazebo/rendering/ogre_gazebo.h"
-
-#include "common/Image.hh"
-#include "math/Vector3.hh"
-#include "math/Vector2d.hh"
-#include "rendering/Scene.hh"
+#include "gazebo/common/Image.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Vector2d.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/util/system.hh"
 
 namespace Ogre
 {
@@ -43,12 +44,48 @@ namespace gazebo
 {
   namespace rendering
   {
+    class GzTerrainMatGen;
+
+    /// \class DummyPageProvider Heightmap.hh rendering/rendering.hh
+    /// \brief Pretends to provide procedural page content to avoid page loading
+    class GAZEBO_VISIBLE DummyPageProvider : public Ogre::PageProvider
+    {
+      /// \brief Give a provider the opportunity to prepare page content
+      /// procedurally. The parameters are not used.
+      public: bool prepareProceduralPage(Ogre::Page*, Ogre::PagedWorldSection*)
+      {
+        return true;
+      }
+
+      /// \brief Give a provider the opportunity to load page content
+      /// procedurally. The parameters are not used.
+      public: bool loadProceduralPage(Ogre::Page*, Ogre::PagedWorldSection*)
+      {
+        return true;
+      }
+
+      /// \brief Give a provider the opportunity to unload page content
+      /// procedurally. The parameters are not used.
+      public: bool unloadProceduralPage(Ogre::Page*, Ogre::PagedWorldSection*)
+      {
+        return true;
+      }
+
+      /// \brief Give a provider the opportunity to unprepare page content
+      /// procedurally. The parameters are not used.
+      public:
+          bool unprepareProceduralPage(Ogre::Page*, Ogre::PagedWorldSection*)
+      {
+        return true;
+      }
+    };
+
     /// \addtogroup gazebo_rendering
     /// \{
 
     /// \class Heightmap Heightmap.hh rendering/rendering.hh
     /// \brief Rendering a terrain using heightmap information
-    class Heightmap
+    class GAZEBO_VISIBLE Heightmap
     {
       /// \brief Constructor
       /// \param[in] _scene Pointer to the scene that will contain the heightmap
@@ -71,10 +108,106 @@ namespace gazebo
       /// \return The height at the specified location
       public: double GetHeight(double _x, double _y, double _z = 1000);
 
+      /// \brief Flatten the terrain based on a mouse press.
+      /// \param[in] _camera Camera associated with the mouse press.
+      /// \param[in] _mousePos Position of the mouse in viewport
+      /// coordinates.
+      /// \param[in] _outsideRadius Controls the radius of effect.
+      /// \param[in] _insideRadius Controls the size of the radius with the
+      /// maximum effect (value between 0 and 1).
+      /// \param[in] _weight Controls modification magnitude.
+      /// \return True if the terrain was modified
+      public: bool Flatten(CameraPtr _camera, math::Vector2i _mousePos,
+                         double _outsideRadius, double _insideRadius,
+                         double _weight = 0.1);
+
+      /// \brief Smooth the terrain based on a mouse press.
+      /// \param[in] _camera Camera associated with the mouse press.
+      /// \param[in] _mousePos Position of the mouse in viewport
+      /// coordinates.
+      /// \param[in] _outsideRadius Controls the radius of effect.
+      /// \param[in] _insideRadius Controls the size of the radius with the
+      /// maximum effect (value between 0 and 1).
+      /// \param[in] _weight Controls modification magnitude.
+      /// \return True if the terrain was modified
+      public: bool Smooth(CameraPtr _camera, math::Vector2i _mousePos,
+                         double _outsideRadius, double _insideRadius,
+                         double _weight = 0.1);
+
+      /// \brief Raise the terrain based on a mouse press.
+      /// \param[in] _camera Camera associated with the mouse press.
+      /// \param[in] _mousePos Position of the mouse in viewport
+      /// coordinates.
+      /// \param[in] _outsideRadius Controls the radius of effect.
+      /// \param[in] _insideRadius Controls the size of the radius with the
+      /// maximum effect (value between 0 and 1).
+      /// \param[in] _weight Controls modification magnitude.
+      /// \return True if the terrain was modified
+      public: bool Raise(CameraPtr _camera, math::Vector2i _mousePos,
+                         double _outsideRadius, double _insideRadius,
+                         double _weight = 0.1);
+
+      /// \brief Lower the terrain based on a mouse press.
+      /// \param[in] _camera Camera associated with the mouse press.
+      /// \param[in] _mousePos Position of the mouse in viewport
+      /// coordinates.
+      /// \param[in] _outsideRadius Controls the radius of effect.
+      /// \param[in] _insideRadius Controls the size of the radius with the
+      /// maximum effect (value between 0 and 1).
+      /// \param[in] _weight Controls modification magnitude.
+      /// \return True if the terrain was modified
+      public: bool Lower(CameraPtr _camera, math::Vector2i _mousePos,
+                         double _outsideRadius, double _insideRadius,
+                         double _weight = 0.1);
+
+      /// \brief Get the average height around a point.
+      /// \param[in] _pos Position in world coordinates.
+      /// \param[in] _brushSize Controls the radius of effect.
+      public: double GetAvgHeight(Ogre::Vector3 _pos, double _brushSize);
+
+      /// \brief Set the heightmap to render in wireframe mode.
+      /// \param[in] _show True to render wireframe, false to render solid.
+      public: void SetWireframe(bool _show);
+
       /// \brief Get a pointer to the OGRE terrain group object.
       /// \return Pointer to the OGRE terrain.
       public: Ogre::TerrainGroup *GetOgreTerrain() const;
 
+      /// \brief Get the heightmap as an image
+      /// \return An image that contains the terrain data.
+      public: common::Image GetImage() const;
+
+      /// \brief Calculate a mouse ray hit on the terrain.
+      /// \param[in] _camera Camera associated with the mouse press.
+      /// \param[in] _mousePos Position of the mouse in viewport
+      /// coordinates.
+      /// \return The result of the mouse ray hit.
+      public: Ogre::TerrainGroup::RayResult GetMouseHit(CameraPtr _camera,
+                  math::Vector2i _mousePos);
+
+      /// \brief Split a terrain into subterrains
+      /// \param[in] _heightmap Source vector of floats with the heights.
+      /// \param[in] _n Number of subterrains.
+      /// \param[out] _v Destination vector with the subterrains.
+      public: void SplitHeights(const std::vector<float> &_heightmap, int _n,
+                  std::vector<std::vector<float> > &_v);
+
+      /// \brief Get the number of subdivision the terrain will be split
+      /// into.
+      /// \return Number of terrain subdivisions
+      public: unsigned int GetTerrainSubdivisionCount() const;
+
+      /// \brief Modify the height at a specific point.
+      /// \param[in] _pos Position in world coordinates.
+      /// \param[in] _outsideRadius Controls the radius of effect.
+      /// \param[in] _insideRadius Controls the size of the radius with the
+      /// maximum effect (value between 0 and 1).
+      /// \param[in] _weight Controls modification magnitude.
+      /// \param[in] _op Type of operation to perform.
+      private: void ModifyTerrain(Ogre::Vector3 _pos, double _outsideRadius,
+                   double _insideRadius, double _weight,
+                   const std::string &_op);
+
       /// \brief Initialize all the blend material maps.
       /// \param[in] _terrain The terrain to initialize the blend maps.
       private: bool InitBlendMaps(Ogre::Terrain *_terrain);
@@ -91,6 +224,54 @@ namespace gazebo
       /// \param[in] _enabled True to enable shadows.
       private: void SetupShadows(bool _enabled);
 
+      /// \brief Update the hash of a terrain file. The hash will be written in
+      /// a file called gzterrain.SHA1 . This method will be used when the
+      /// paging is enabled and the terrain is loaded for the first time or if
+      /// the heightmap's image has been modified.
+      /// \param[in] _hash New hash value
+      /// \param[in] _terrainDir Directory where the terrain hash and the
+      /// terrain pages are stored. Ex: $TMP/gazebo-paging/heigthmap_bowl
+      private: void UpdateTerrainHash(const std::string &_hash,
+          const boost::filesystem::path &_terrainDir);
+
+      /// \brief It checks if the terrain was previously loaded. In negative
+      /// case, it splits the original terrain into pieces and creates a hash
+      /// file.
+      /// \param[in] _terrainDirPath Path to the directory containing the
+      /// terrain pages and hash.
+      /// \return True if the terrain requires to regenerate the terrain files.
+      private: bool PrepareTerrainPaging(
+        const boost::filesystem::path &_terrainDirPath);
+
+      /// \brief Number of pieces in which a terrain is subdivided for paging.
+      private: static const unsigned int numTerrainSubdivisions;
+
+      /// \brief The terrain pages are loaded if the distance from the camera is
+      /// within the loadRadius. See Ogre::TerrainPaging::createWorldSection().
+      /// LoadRadiusFactor is a multiplier applied to the terrain size to create
+      /// a load radius that depends on the terrain size.
+      private: static const double loadRadiusFactor;
+
+      /// \brief The terrain pages are held in memory but not loaded if they
+      /// are not ready when the camera is within holdRadius distance. See
+      /// Ogre::TerrainPaging::createWorldSection(). HoldRadiusFactor is a
+      /// multiplier applied to the terrain size to create a hold radius that
+      /// depends on the terrain size.
+      private: static const double holdRadiusFactor;
+
+      /// \brief Hash file name that should be present for every terrain file
+      /// loaded using paging.
+      private: static const boost::filesystem::path hashFilename;
+
+      /// \brief Name of the top level directory where all the paging info is
+      /// stored
+      private: static const boost::filesystem::path pagingDirname;
+
+      /// \brief When the terrain paging is enabled, the terrain information
+      /// for every piece of terrain is stored in disk. This is the path of
+      /// the top level directory where these files are located.
+      private: boost::filesystem::path gzPagingDir;
+
       /// \brief The scene.
       private: ScenePtr scene;
 
@@ -100,11 +281,8 @@ namespace gazebo
       /// \brief Size of the terrain.
       private: math::Vector3 terrainSize;
 
-      /// \brief Size of the image.
-      private: unsigned int imageSize;
-
-      /// \brief Max pixel value.
-      private: double maxPixel;
+      /// \brief Size of the heightmap data.
+      private: unsigned int dataSize;
 
       /// \brief Origin of the terrain.
       private: math::Vector3 terrainOrigin;
@@ -132,12 +310,44 @@ namespace gazebo
 
       /// \brief Material blend fade distances.
       private: std::vector<double> blendFade;
+
+      /// \brief The raw height values received from physics.
+      private: std::vector<float> heights;
+
+      /// \brief Pointer to the terrain material generator.
+      private: GzTerrainMatGen *gzMatGen;
+
+      /// \brief A page provider is needed to use the paging system.
+      private: DummyPageProvider dummyPageProvider;
+
+      /// \brief Central registration point for extension classes,
+      /// such as the PageStrategy, PageContentFactory.
+      private: Ogre::PageManager *pageManager;
+
+      /// \brief Type of paging applied
+      private: Ogre::TerrainPaging *terrainPaging;
+
+      /// \brief Collection of world content
+      private: Ogre::PagedWorld *world;
+
+      /// \brief Collection of terrains. Every terrain might be paged.
+      private: std::vector<std::vector<float> > subTerrains;
+
+      /// \brief Used to iterate over all the terrains
+      private: int terrainIdx;
+
+      /// \brief Flag that enables/disables the terrain paging
+      private: bool useTerrainPaging;
+
+      /// \brief True if the terrain's hash does not match the image's hash
+      private: bool terrainHashChanged;
     };
     /// \}
 
     /// \internal
     /// \brief Custom terrain material generator for GLSL terrains.
-    class GzTerrainMatGen : public Ogre::TerrainMaterialGeneratorA
+    class GAZEBO_VISIBLE GzTerrainMatGen
+      : public Ogre::TerrainMaterialGeneratorA
     {
       /// \brief Constructor
       public: GzTerrainMatGen();
@@ -170,6 +380,10 @@ namespace gazebo
         protected: virtual void addTechnique(const Ogre::MaterialPtr &_mat,
                        const Ogre::Terrain *_terrain, TechniqueType _tt);
 
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Woverloaded-virtual"
+#endif  // ifdef __clang__
         /// \brief Utility class to help with generating shaders for GLSL.
         protected: class ShaderHelperGLSL :
             public Ogre::TerrainMaterialGeneratorA::SM2Profile::ShaderHelperGLSL
@@ -297,6 +511,9 @@ namespace gazebo
                          TechniqueType _tt,
                          Ogre::StringUtil::StrStreamType &_outStream);
         };
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif  // ifdef __clang__
       };
     };
   }
diff --git a/gazebo/rendering/Heightmap_TEST.cc b/gazebo/rendering/Heightmap_TEST.cc
new file mode 100644
index 0000000..a2fba8b
--- /dev/null
+++ b/gazebo/rendering/Heightmap_TEST.cc
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <boost/assign/list_of.hpp>
+#include "test/ServerFixture.hh"
+
+using namespace gazebo;
+class Heightmap_TEST : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+/// \brief Test Split a terrain in a number of subterrains
+TEST_F(Heightmap_TEST, splitTerrain)
+{
+  Load("worlds/empty.world");
+
+  gazebo::rendering::ScenePtr scene = gazebo::rendering::get_scene("default");
+
+  scene = gazebo::rendering::create_scene("default", false);
+
+  // Make sure that the scene is created
+  ASSERT_TRUE(scene != NULL);
+
+  gazebo::rendering::Heightmap *heightmap =
+      new gazebo::rendering::Heightmap(scene);
+
+  // Check that the heightmap is created
+  EXPECT_TRUE(heightmap != NULL);
+
+  std::vector<float> heights;
+  std::vector<std::vector<float> > heightsSplit;
+  std::vector<std::vector<float> > slices;
+
+  // Initialize a 9 x 9 terrain with known values
+  int N = 9;
+  heights.resize(N * N);
+  for (int i = 0; i < N * N; ++i)
+  {
+    heights[i] = i + 1;
+  }
+
+  heightmap->SplitHeights(heights, heightmap->GetTerrainSubdivisionCount(),
+      heightsSplit);
+
+  ASSERT_TRUE(heightsSplit.size() == heightmap->GetTerrainSubdivisionCount());
+
+  // Precomputed subterrains for a known 9 x 9 terrain starting from 1 and with
+  // consecutive values
+  slices.resize(16);
+  slices[0] = boost::assign::list_of(1)(2)(2)(10)(11)(11)(10)(11)(11);
+  slices[1] = boost::assign::list_of(3)(4)(4)(12)(13)(13)(12)(13)(13);
+  slices[2] = boost::assign::list_of(5)(6)(6)(14)(15)(15)(14)(15)(15);
+  slices[3] = boost::assign::list_of(7)(8)(8)(16)(17)(17)(16)(17)(17);
+  slices[4] = boost::assign::list_of(19)(20)(20)(28)(29)(29)(28)(29)(29);
+  slices[5] = boost::assign::list_of(21)(22)(22)(30)(31)(31)(30)(31)(31);
+  slices[6] = boost::assign::list_of(23)(24)(24)(32)(33)(33)(32)(33)(33);
+  slices[7] = boost::assign::list_of(25)(26)(26)(34)(35)(35)(34)(35)(35);
+  slices[8] = boost::assign::list_of(37)(38)(38)(46)(47)(47)(46)(47)(47);
+  slices[9] = boost::assign::list_of(39)(40)(40)(48)(49)(49)(48)(49)(49);
+  slices[10] = boost::assign::list_of(41)(42)(42)(50)(51)(51)(50)(51)(51);
+  slices[11] = boost::assign::list_of(43)(44)(44)(52)(53)(53)(52)(53)(53);
+  slices[12] = boost::assign::list_of(55)(56)(56)(64)(65)(65)(64)(65)(65);
+  slices[13] = boost::assign::list_of(57)(58)(58)(66)(67)(67)(66)(67)(67);
+  slices[14] = boost::assign::list_of(59)(60)(60)(68)(69)(69)(68)(69)(69);
+  slices[15] = boost::assign::list_of(61)(62)(62)(70)(71)(71)(70)(71)(71);
+
+  // Make sure that the subterrain heights matches the precomputed slices
+  for (unsigned int i = 0; i < heightmap->GetTerrainSubdivisionCount(); ++i)
+  {
+    EXPECT_TRUE(std::equal(heightsSplit[i].begin(), heightsSplit[i].end(),
+          slices[i].begin()));
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/rendering/JointVisual.cc b/gazebo/rendering/JointVisual.cc
index 9e76c9f..3c1ca7f 100644
--- a/gazebo/rendering/JointVisual.cc
+++ b/gazebo/rendering/JointVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,45 +18,62 @@
  * Author: Nate Koenig
  */
 
-#include "rendering/ogre_gazebo.h"
-#include "rendering/DynamicLines.hh"
-#include "rendering/Scene.hh"
-#include "rendering/AxisVisual.hh"
-#include "rendering/JointVisual.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/AxisVisual.hh"
+#include "gazebo/rendering/JointVisualPrivate.hh"
+#include "gazebo/rendering/JointVisual.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
 /////////////////////////////////////////////////
 JointVisual::JointVisual(const std::string &_name, VisualPtr _vis)
-  : Visual(_name, _vis, false)
+  : Visual(*new JointVisualPrivate, _name, _vis, false)
 {
 }
 
 /////////////////////////////////////////////////
 JointVisual::~JointVisual()
 {
-  this->axisVisual.reset();
+  JointVisualPrivate *dPtr =
+      reinterpret_cast<JointVisualPrivate *>(this->dataPtr);
+
+  dPtr->axisVisual.reset();
 }
 
 /////////////////////////////////////////////////
 void JointVisual::Load(ConstJointPtr &_msg)
 {
+  JointVisualPrivate *dPtr =
+      reinterpret_cast<JointVisualPrivate *>(this->dataPtr);
+
   Visual::Load();
 
-  this->axisVisual.reset(
+  // joint axis is in the model frame so set up the scene node to be
+  // the same orientation as the model then apply rotations later.
+  VisualPtr model = this->GetRootVisual();
+  if (model)
+  {
+    math::Quaternion quat = model->GetRotation();
+    this->GetSceneNode()->_setDerivedOrientation(Conversions::Convert(quat));
+  }
+
+  dPtr->axisVisual.reset(
       new AxisVisual(this->GetName() + "_AXIS", shared_from_this()));
-  this->axisVisual->Load();
+  dPtr->axisVisual->Load();
 
   this->SetPosition(msgs::Convert(_msg->pose().position()));
-  this->SetRotation(msgs::Convert(_msg->pose().orientation()));
+  this->SetRotation(this->GetRotation() *
+      msgs::Convert(_msg->pose().orientation()));
 
   if (math::equal(_msg->axis1().xyz().x(), 1.0))
-    this->axisVisual->ShowRotation(0);
+    dPtr->axisVisual->ShowRotation(0);
 
   if (math::equal(_msg->axis1().xyz().y(), 1.0))
-    this->axisVisual->ShowRotation(1);
+    dPtr->axisVisual->ShowRotation(1);
 
   if (math::equal(_msg->axis1().xyz().z(), 1.0))
-    this->axisVisual->ShowRotation(2);
+    dPtr->axisVisual->ShowRotation(2);
 }
diff --git a/gazebo/rendering/JointVisual.hh b/gazebo/rendering/JointVisual.hh
index 6d0db9e..d61dc85 100644
--- a/gazebo/rendering/JointVisual.hh
+++ b/gazebo/rendering/JointVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,15 @@
  * limitations under the License.
  *
 */
-/* Desc: Joint Visualization Class
- * Author: Nate Koenig
- */
 
 #ifndef _JOINTVISUAL_HH_
 #define _JOINTVISUAL_HH_
 
 #include <string>
-#include "rendering/Visual.hh"
+
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,7 +33,7 @@ namespace gazebo
 
     /// \class JointVisual JointVisual.hh rendering/rendering.hh
     /// \brief Visualization for joints
-    class JointVisual : public Visual
+    class GAZEBO_VISIBLE JointVisual : public Visual
     {
       /// \brief Constructor
       /// \param[in] _name Name of the visual
@@ -46,9 +46,7 @@ namespace gazebo
       /// \brief Load the visual based on a message
       /// \param[in] _msg Joint message
       public: void Load(ConstJointPtr &_msg);
-
-      /// \brief The visual used to draw the joint.
-      private: AxisVisualPtr axisVisual;
+      using Visual::Load;
     };
     /// \}
   }
diff --git a/gazebo/rendering/JointVisualPrivate.hh b/gazebo/rendering/JointVisualPrivate.hh
new file mode 100644
index 0000000..aaa37b2
--- /dev/null
+++ b/gazebo/rendering/JointVisualPrivate.hh
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _JOINTVISUAL_PRIVATE_HH_
+#define _JOINTVISUAL_PRIVATE_HH_
+
+#include <string>
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the Joint Visual class.
+    class JointVisualPrivate : public VisualPrivate
+    {
+      /// \brief The visual used to draw the joint.
+      public: AxisVisualPtr axisVisual;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/LaserVisual.cc b/gazebo/rendering/LaserVisual.cc
index 67e129b..b453d76 100644
--- a/gazebo/rendering/LaserVisual.cc
+++ b/gazebo/rendering/LaserVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,14 @@
  * Date: 14 Dec 2007
  */
 
-#include "transport/transport.hh"
-#include "rendering/Scene.hh"
-#include "rendering/DynamicLines.hh"
-#include "rendering/LaserVisual.hh"
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/transport/transport.hh"
+
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/LaserVisualPrivate.hh"
+#include "gazebo/rendering/LaserVisual.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -30,60 +34,110 @@ using namespace rendering;
 /////////////////////////////////////////////////
 LaserVisual::LaserVisual(const std::string &_name, VisualPtr _vis,
                          const std::string &_topicName)
-: Visual(_name, _vis)
+: Visual(*new LaserVisualPrivate, _name, _vis)
 {
-  this->node = transport::NodePtr(new transport::Node());
-  this->node->Init(this->scene->GetName());
+  LaserVisualPrivate *dPtr =
+      reinterpret_cast<LaserVisualPrivate *>(this->dataPtr);
 
-  this->laserScanSub = this->node->Subscribe(_topicName,
-      &LaserVisual::OnScan, this);
+  dPtr->receivedMsg = false;
+
+  dPtr->node = transport::NodePtr(new transport::Node());
+  dPtr->node->Init(dPtr->scene->GetName());
 
-  this->rayFan = this->CreateDynamicLine(rendering::RENDERING_TRIANGLE_FAN);
+  dPtr->laserScanSub = dPtr->node->Subscribe(_topicName,
+      &LaserVisual::OnScan, this);
 
-  this->rayFan->setMaterial("Gazebo/BlueLaser");
-  this->rayFan->AddPoint(math::Vector3(0, 0, 0));
-  this->SetVisibilityFlags(GZ_VISIBILITY_GUI);
+  dPtr->connection = event::Events::ConnectPreRender(
+        boost::bind(&LaserVisual::Update, this));
 }
 
 /////////////////////////////////////////////////
 LaserVisual::~LaserVisual()
 {
-  delete this->rayFan;
-  this->rayFan = NULL;
+  LaserVisualPrivate *dPtr =
+      reinterpret_cast<LaserVisualPrivate *>(this->dataPtr);
+
+  for (unsigned int i = 0; i < dPtr->rayFans.size(); ++i)
+  {
+    this->DeleteDynamicLine(dPtr->rayFans[i]);
+    dPtr->rayFans[i] = NULL;
+  }
+  dPtr->rayFans.clear();
 }
 
 /////////////////////////////////////////////////
 void LaserVisual::OnScan(ConstLaserScanStampedPtr &_msg)
 {
+  LaserVisualPrivate *dPtr =
+      reinterpret_cast<LaserVisualPrivate *>(this->dataPtr);
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+  dPtr->laserMsg = _msg;
+  dPtr->receivedMsg = true;
+}
+
+/////////////////////////////////////////////////
+void LaserVisual::Update()
+{
+  LaserVisualPrivate *dPtr =
+      reinterpret_cast<LaserVisualPrivate *>(this->dataPtr);
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+
   // Skip the update if the user is moving the laser.
-  if (this->GetScene()->GetSelectedVisual() &&
+  if ((this->GetScene()->GetSelectedVisual() &&
       this->GetRootVisual()->GetName() ==
-      this->GetScene()->GetSelectedVisual()->GetName())
+      this->GetScene()->GetSelectedVisual()->GetName()))
   {
     return;
   }
 
-  double angle = _msg->scan().angle_min();
+  if (!dPtr->laserMsg || !dPtr->receivedMsg)
+    return;
+
+  dPtr->receivedMsg = false;
+
+  double angle = dPtr->laserMsg->scan().angle_min();
+  double verticalAngle = dPtr->laserMsg->scan().vertical_angle_min();
   double r;
   math::Vector3 pt;
-  math::Pose offset = msgs::Convert(_msg->scan().world_pose()) -
+  math::Pose offset = msgs::Convert(dPtr->laserMsg->scan().world_pose()) -
                       this->GetWorldPose();
 
-  this->rayFan->SetPoint(0, offset.pos);
-  for (int i = 0; i < _msg->scan().ranges_size(); i++)
+  unsigned int vertCount = dPtr->laserMsg->scan().has_vertical_count() ?
+      dPtr->laserMsg->scan().vertical_count() : 1u;
+
+  math::Quaternion ray;
+  math::Vector3 axis;
+  for (unsigned int j = 0; j < vertCount; ++j)
   {
-    r = _msg->scan().ranges(i) + _msg->scan().range_min();
-    pt.x = 0 + r * cos(angle);
-    pt.y = 0 + r * sin(angle);
-    pt.z = 0;
-    pt += offset.pos;
-
-    if (i+1 >= static_cast<int>(this->rayFan->GetPointCount()))
-      this->rayFan->AddPoint(pt);
-    else
-      this->rayFan->SetPoint(i+1, pt);
-
-    angle += _msg->scan().angle_step();
+    if (j+1 > dPtr->rayFans.size())
+    {
+      dPtr->rayFans.push_back(
+          this->CreateDynamicLine(rendering::RENDERING_TRIANGLE_FAN));
+      dPtr->rayFans[j]->setMaterial("Gazebo/BlueLaser");
+      dPtr->rayFans[j]->AddPoint(math::Vector3(0, 0, 0));
+      this->SetVisibilityFlags(GZ_VISIBILITY_GUI);
+    }
+    dPtr->rayFans[j]->SetPoint(0, offset.pos);
+
+    angle = dPtr->laserMsg->scan().angle_min();
+    unsigned int count = dPtr->laserMsg->scan().count();
+    for (unsigned int i = 0; i < count; ++i)
+    {
+      r = dPtr->laserMsg->scan().ranges(j*count + i);
+      ray.SetFromEuler(math::Vector3(0.0, -verticalAngle, angle));
+      axis = offset.rot * ray * math::Vector3(1.0, 0.0, 0.0);
+      pt = (axis * r) + offset.pos;
+
+      if (i+1 >= dPtr->rayFans[j]->GetPointCount())
+        dPtr->rayFans[j]->AddPoint(pt);
+      else
+        dPtr->rayFans[j]->SetPoint(i+1, pt);
+
+      angle += dPtr->laserMsg->scan().angle_step();
+    }
+    verticalAngle += dPtr->laserMsg->scan().vertical_angle_step();
   }
 }
 
diff --git a/gazebo/rendering/LaserVisual.hh b/gazebo/rendering/LaserVisual.hh
index d5b5729..92ca765 100644
--- a/gazebo/rendering/LaserVisual.hh
+++ b/gazebo/rendering/LaserVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,19 +14,16 @@
  * limitations under the License.
  *
 */
-/* Desc: Laser Visualization Class
- * Author: Nate Koenig
- * Date: 14 Dec 2007
- */
 
 #ifndef _LASERVISUAL_HH_
 #define _LASERVISUAL_HH_
 
 #include <string>
 
-#include "rendering/Visual.hh"
-#include "msgs/MessageTypes.hh"
-#include "transport/TransportTypes.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,11 +32,9 @@ namespace gazebo
     /// \addtogroup gazebo_rendering
     /// \{
 
-    class DynamicLines;
-
     /// \class LaserVisual LaserVisual.hh rendering/rendering.hh
     /// \brief Visualization for laser data.
-    class LaserVisual : public Visual
+    class GAZEBO_VISIBLE LaserVisual : public Visual
     {
       /// \brief Constructor.
       /// \param[in] _name Name of the visual.
@@ -57,14 +52,8 @@ namespace gazebo
       /// \brief Callback when laser data is received.
       private: void OnScan(ConstLaserScanStampedPtr &_msg);
 
-      /// \brief Pointer to a node that handles communication.
-      private: transport::NodePtr node;
-
-      /// \brief Subscription to the laser data.
-      private: transport::SubscriberPtr laserScanSub;
-
-      /// \brief Renders the laser data.
-      private: DynamicLines *rayFan;
+      /// \brief Update the Visual
+      private: void Update();
     };
     /// \}
   }
diff --git a/gazebo/rendering/LaserVisualPrivate.hh b/gazebo/rendering/LaserVisualPrivate.hh
new file mode 100644
index 0000000..4b5fa84
--- /dev/null
+++ b/gazebo/rendering/LaserVisualPrivate.hh
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _LASERVISUAL_PRIVATE_HH_
+#define _LASERVISUAL_PRIVATE_HH_
+
+#include <vector>
+
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    class DynamicLines;
+
+    /// \brief Private data for the Laser Visual class.
+    class LaserVisualPrivate : public VisualPrivate
+    {
+      /// \brief Pointer to a node that handles communication.
+      public: transport::NodePtr node;
+
+      /// \brief Subscription to the laser data.
+      public: transport::SubscriberPtr laserScanSub;
+
+      /// \brief Renders the laser data.
+      public: std::vector<DynamicLines *> rayFans;
+
+      /// \brief Mutex to protect the contact message.
+      public: boost::mutex mutex;
+
+      /// \brief True if we have received a message.
+      public: bool receivedMsg;
+
+      /// \brief The current contact message.
+      public: boost::shared_ptr<msgs::LaserScanStamped const> laserMsg;
+
+      /// \brief Pre render connection.
+      public: event::ConnectionPtr connection;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/Light.cc b/gazebo/rendering/Light.cc
index 6f5d2d0..1bc6172 100644
--- a/gazebo/rendering/Light.cc
+++ b/gazebo/rendering/Light.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,26 +15,20 @@
  *
 */
 
-/* Desc: A Light
- * Author: Nate Koenig
- * Date: 15 July 2003
- */
-
 #include <boost/bind.hpp>
 
-#include "rendering/ogre_gazebo.h"
+#include "gazebo/rendering/ogre_gazebo.h"
 
-#include "sdf/sdf.hh"
-#include "msgs/msgs.hh"
+#include "gazebo/msgs/msgs.hh"
 
-#include "common/Events.hh"
-#include "common/Exception.hh"
-#include "common/Console.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
 
-#include "rendering/Scene.hh"
-#include "rendering/DynamicLines.hh"
-#include "rendering/Visual.hh"
-#include "rendering/Light.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/Light.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -60,7 +54,6 @@ Light::~Light()
     this->scene->GetManager()->destroyLight(this->GetName());
 
   this->visual->DeleteDynamicLine(this->line);
-  delete this->line;
   this->scene->RemoveVisual(this->visual);
   this->visual.reset();
 
@@ -105,115 +98,115 @@ void Light::Load()
 //////////////////////////////////////////////////
 void Light::Update()
 {
-  this->SetCastShadows(this->sdf->GetValueBool("cast_shadows"));
+  this->SetCastShadows(this->sdf->Get<bool>("cast_shadows"));
 
-  this->SetLightType(this->sdf->GetValueString("type"));
+  this->SetLightType(this->sdf->Get<std::string>("type"));
   this->SetDiffuseColor(
-      this->sdf->GetElement("diffuse")->GetValueColor());
+      this->sdf->GetElement("diffuse")->Get<common::Color>());
   this->SetSpecularColor(
-      this->sdf->GetElement("specular")->GetValueColor());
+      this->sdf->GetElement("specular")->Get<common::Color>());
   this->SetDirection(
-      this->sdf->GetValueVector3("direction"));
+      this->sdf->Get<math::Vector3>("direction"));
 
   if (this->sdf->HasElement("attenuation"))
   {
     sdf::ElementPtr elem = this->sdf->GetElement("attenuation");
 
-    this->SetAttenuation(elem->GetValueDouble("constant"),
-                         elem->GetValueDouble("linear"),
-                         elem->GetValueDouble("quadratic"));
-    this->SetRange(elem->GetValueDouble("range"));
+    this->SetAttenuation(elem->Get<double>("constant"),
+                         elem->Get<double>("linear"),
+                         elem->Get<double>("quadratic"));
+    this->SetRange(elem->Get<double>("range"));
   }
 
   if (this->sdf->HasElement("spot"))
   {
     sdf::ElementPtr elem = this->sdf->GetElement("spot");
-    this->SetSpotInnerAngle(elem->GetValueDouble("inner_angle"));
-    this->SetSpotOuterAngle(elem->GetValueDouble("outer_angle"));
-    this->SetSpotFalloff(elem->GetValueDouble("falloff"));
+    this->SetSpotInnerAngle(elem->Get<double>("inner_angle"));
+    this->SetSpotOuterAngle(elem->Get<double>("outer_angle"));
+    this->SetSpotFalloff(elem->Get<double>("falloff"));
   }
 }
 
 //////////////////////////////////////////////////
-void Light::UpdateSDFFromMsg(ConstLightPtr &_msg)
+void Light::UpdateSDFFromMsg(const msgs::Light &_msg)
 {
-  this->sdf->GetAttribute("name")->Set(_msg->name());
+  this->sdf->GetAttribute("name")->Set(_msg.name());
 
-  if (_msg->has_type() && _msg->type() == msgs::Light::POINT)
+  if (_msg.has_type() && _msg.type() == msgs::Light::POINT)
     this->sdf->GetAttribute("type")->Set("point");
-  else if (_msg->has_type() && _msg->type() == msgs::Light::SPOT)
+  else if (_msg.has_type() && _msg.type() == msgs::Light::SPOT)
     this->sdf->GetAttribute("type")->Set("spot");
-  else if (_msg->has_type() && _msg->type() == msgs::Light::DIRECTIONAL)
+  else if (_msg.has_type() && _msg.type() == msgs::Light::DIRECTIONAL)
     this->sdf->GetAttribute("type")->Set("directional");
 
-  if (_msg->has_diffuse())
+  if (_msg.has_diffuse())
   {
     this->sdf->GetElement("diffuse")->Set(
-        msgs::Convert(_msg->diffuse()));
+        msgs::Convert(_msg.diffuse()));
   }
 
-  if (_msg->has_specular())
+  if (_msg.has_specular())
   {
     this->sdf->GetElement("specular")->Set(
-        msgs::Convert(_msg->specular()));
+        msgs::Convert(_msg.specular()));
   }
 
-  if (_msg->has_direction())
+  if (_msg.has_direction())
   {
     this->sdf->GetElement("direction")->Set(
-        msgs::Convert(_msg->direction()));
+        msgs::Convert(_msg.direction()));
   }
 
-  if (_msg->has_attenuation_constant())
+  if (_msg.has_attenuation_constant())
   {
     sdf::ElementPtr elem = this->sdf->GetElement("attenuation");
-    elem->GetElement("constant")->Set(_msg->attenuation_constant());
+    elem->GetElement("constant")->Set(_msg.attenuation_constant());
   }
 
-  if (_msg->has_attenuation_linear())
+  if (_msg.has_attenuation_linear())
   {
     sdf::ElementPtr elem = this->sdf->GetElement("attenuation");
-    elem->GetElement("linear")->Set(_msg->attenuation_linear());
+    elem->GetElement("linear")->Set(_msg.attenuation_linear());
   }
 
-  if (_msg->has_attenuation_quadratic())
+  if (_msg.has_attenuation_quadratic())
   {
     sdf::ElementPtr elem = this->sdf->GetElement("attenuation");
-    elem->GetElement("quadratic")->Set(_msg->attenuation_quadratic());
+    elem->GetElement("quadratic")->Set(_msg.attenuation_quadratic());
   }
 
-  if (_msg->has_range())
+  if (_msg.has_range())
   {
     sdf::ElementPtr elem = this->sdf->GetElement("attenuation");
-    elem->GetElement("range")->Set(_msg->range());
+    elem->GetElement("range")->Set(_msg.range());
   }
 
-  if (_msg->has_cast_shadows())
-    this->sdf->GetElement("cast_shadows")->Set(_msg->cast_shadows());
+  if (_msg.has_cast_shadows())
+    this->sdf->GetElement("cast_shadows")->Set(_msg.cast_shadows());
 
-  if (_msg->has_spot_inner_angle())
+  if (_msg.has_spot_inner_angle())
   {
     sdf::ElementPtr elem = this->sdf->GetElement("spot");
-    elem->GetElement("inner_angle")->Set(_msg->spot_inner_angle());
+    elem->GetElement("inner_angle")->Set(_msg.spot_inner_angle());
   }
 
-  if (_msg->has_spot_outer_angle())
+  if (_msg.has_spot_outer_angle())
   {
     sdf::ElementPtr elem = this->sdf->GetElement("spot");
-    elem->GetElement("outer_angle")->Set(_msg->spot_outer_angle());
+    elem->GetElement("outer_angle")->Set(_msg.spot_outer_angle());
   }
 
-  if (_msg->has_spot_falloff())
+  if (_msg.has_spot_falloff())
   {
     sdf::ElementPtr elem = this->sdf->GetElement("spot");
-    elem->GetElement("falloff")->Set(_msg->spot_falloff());
+    elem->GetElement("falloff")->Set(_msg.spot_falloff());
   }
 }
 
 //////////////////////////////////////////////////
 void Light::UpdateFromMsg(ConstLightPtr &_msg)
 {
-  this->UpdateSDFFromMsg(_msg);
+  this->UpdateSDFFromMsg(*_msg);
 
   this->Update();
 
@@ -222,14 +215,20 @@ void Light::UpdateFromMsg(ConstLightPtr &_msg)
 }
 
 //////////////////////////////////////////////////
-void Light::LoadFromMsg(ConstLightPtr &_msg)
+void Light::LoadFromMsg(const msgs::Light &_msg)
 {
   this->UpdateSDFFromMsg(_msg);
 
   this->Load();
 
-  if (_msg->has_pose())
-    this->SetPosition(msgs::Convert(_msg->pose().position()));
+  if (_msg.has_pose())
+    this->SetPosition(msgs::Convert(_msg.pose().position()));
+}
+
+//////////////////////////////////////////////////
+void Light::LoadFromMsg(ConstLightPtr &_msg)
+{
+  this->LoadFromMsg(*_msg);
 }
 
 //////////////////////////////////////////////////
@@ -241,13 +240,13 @@ void Light::SetName(const std::string &_name)
 //////////////////////////////////////////////////
 std::string Light::GetName() const
 {
-  return this->sdf->GetValueString("name");
+  return this->sdf->Get<std::string>("name");
 }
 
 //////////////////////////////////////////////////
 std::string Light::GetType() const
 {
-  return this->sdf->GetValueString("type");
+  return this->sdf->Get<std::string>("type");
 }
 
 //////////////////////////////////////////////////
@@ -296,7 +295,7 @@ void Light::CreateVisual()
     visSceneNode->setScale(0.25, 0.25, 0.25);
   }
 
-  std::string lightType = this->sdf->GetValueString("type");
+  std::string lightType = this->sdf->Get<std::string>("type");
 
   if (lightType == "directional")
   {
@@ -440,6 +439,12 @@ void Light::ShowVisual(bool _s)
 }
 
 //////////////////////////////////////////////////
+bool Light::GetVisible() const
+{
+  return this->visual->GetVisible();
+}
+
+//////////////////////////////////////////////////
 void Light::SetLightType(const std::string &_type)
 {
   // Set the light _type
@@ -454,7 +459,7 @@ void Light::SetLightType(const std::string &_type)
     gzerr << "Unknown light type[" << _type << "]\n";
   }
 
-  if (this->sdf->GetValueString("type") != _type)
+  if (this->sdf->Get<std::string>("type") != _type)
     this->sdf->GetAttribute("type")->Set(_type);
 
   this->CreateVisual();
@@ -465,7 +470,7 @@ void Light::SetDiffuseColor(const common::Color &_color)
 {
   sdf::ElementPtr elem = this->sdf->GetElement("diffuse");
 
-  if (elem->GetValueColor() != _color)
+  if (_color != elem->Get<common::Color>())
     elem->Set(_color);
 
   this->light->setDiffuseColour(_color.r, _color.g, _color.b);
@@ -474,13 +479,13 @@ void Light::SetDiffuseColor(const common::Color &_color)
 //////////////////////////////////////////////////
 common::Color Light::GetDiffuseColor() const
 {
-  return this->sdf->GetElement("diffuse")->GetValueColor();
+  return this->sdf->GetElement("diffuse")->Get<common::Color>();
 }
 
 //////////////////////////////////////////////////
 common::Color Light::GetSpecularColor() const
 {
-  return this->sdf->GetElement("specular")->GetValueColor();
+  return this->sdf->GetElement("specular")->Get<common::Color>();
 }
 
 //////////////////////////////////////////////////
@@ -488,7 +493,7 @@ void Light::SetSpecularColor(const common::Color &_color)
 {
   sdf::ElementPtr elem = this->sdf->GetElement("specular");
 
-  if (elem->GetValueColor() != _color)
+  if (elem->Get<common::Color>() != _color)
     elem->Set(_color);
 
   this->light->setSpecularColour(_color.r, _color.g, _color.b);
@@ -501,7 +506,7 @@ void Light::SetDirection(const math::Vector3 &_dir)
   math::Vector3 vec = _dir;
   vec.Normalize();
 
-  if (this->sdf->GetValueVector3("direction") != vec)
+  if (vec != this->sdf->Get<math::Vector3>("direction"))
     this->sdf->GetElement("direction")->Set(vec);
 
   this->light->setDirection(vec.x, vec.y, vec.z);
@@ -510,7 +515,7 @@ void Light::SetDirection(const math::Vector3 &_dir)
 //////////////////////////////////////////////////
 math::Vector3 Light::GetDirection() const
 {
-  return this->sdf->GetValueVector3("direction");
+  return this->sdf->Get<math::Vector3>("direction");
 }
 
 //////////////////////////////////////////////////
@@ -534,7 +539,7 @@ void Light::SetAttenuation(double constant, double linear, double quadratic)
   elem->GetElement("quadratic")->Set(quadratic);
 
   // Set attenuation
-  this->light->setAttenuation(elem->GetValueDouble("range"),
+  this->light->setAttenuation(elem->Get<double>("range"),
                               constant, linear, quadratic);
 }
 
@@ -546,10 +551,10 @@ void Light::SetRange(const double &_range)
 
   elem->GetElement("range")->Set(_range);
 
-  this->light->setAttenuation(elem->GetValueDouble("range"),
-                              elem->GetValueDouble("constant"),
-                              elem->GetValueDouble("linear"),
-                              elem->GetValueDouble("quadratic"));
+  this->light->setAttenuation(elem->Get<double>("range"),
+                              elem->Get<double>("constant"),
+                              elem->Get<double>("linear"),
+                              elem->Get<double>("quadratic"));
 }
 
 //////////////////////////////////////////////////
@@ -576,9 +581,9 @@ void Light::SetSpotInnerAngle(const double &_angle)
   if (this->light->getType() == Ogre::Light::LT_SPOTLIGHT)
   {
     this->light->setSpotlightRange(
-        Ogre::Radian(elem->GetValueDouble("inner_angle")),
-        Ogre::Radian(elem->GetValueDouble("outer_angle")),
-        elem->GetValueDouble("falloff"));
+        Ogre::Radian(elem->Get<double>("inner_angle")),
+        Ogre::Radian(elem->Get<double>("outer_angle")),
+        elem->Get<double>("falloff"));
   }
 }
 
@@ -591,9 +596,9 @@ void Light::SetSpotOuterAngle(const double &_angle)
   if (this->light->getType() == Ogre::Light::LT_SPOTLIGHT)
   {
     this->light->setSpotlightRange(
-        Ogre::Radian(elem->GetValueDouble("inner_angle")),
-        Ogre::Radian(elem->GetValueDouble("outer_angle")),
-        elem->GetValueDouble("falloff"));
+        Ogre::Radian(elem->Get<double>("inner_angle")),
+        Ogre::Radian(elem->Get<double>("outer_angle")),
+        elem->Get<double>("falloff"));
   }
 }
 
@@ -606,16 +611,16 @@ void Light::SetSpotFalloff(const double &_angle)
   if (this->light->getType() == Ogre::Light::LT_SPOTLIGHT)
   {
     this->light->setSpotlightRange(
-        Ogre::Radian(elem->GetValueDouble("inner_angle")),
-        Ogre::Radian(elem->GetValueDouble("outer_angle")),
-        elem->GetValueDouble("falloff"));
+        Ogre::Radian(elem->Get<double>("inner_angle")),
+        Ogre::Radian(elem->Get<double>("outer_angle")),
+        elem->Get<double>("falloff"));
   }
 }
 
 //////////////////////////////////////////////////
 void Light::FillMsg(msgs::Light &_msg) const
 {
-  std::string lightType = this->sdf->GetValueString("type");
+  std::string lightType = this->sdf->Get<std::string>("type");
 
   _msg.set_name(this->GetName());
 
@@ -635,16 +640,16 @@ void Light::FillMsg(msgs::Light &_msg) const
   _msg.set_cast_shadows(this->light->getCastShadows());
 
   sdf::ElementPtr elem = this->sdf->GetElement("attenuation");
-  _msg.set_attenuation_constant(elem->GetValueDouble("constant"));
-  _msg.set_attenuation_linear(elem->GetValueDouble("linear"));
-  _msg.set_attenuation_quadratic(elem->GetValueDouble("quadratic"));
-  _msg.set_range(elem->GetValueDouble("range"));
+  _msg.set_attenuation_constant(elem->Get<double>("constant"));
+  _msg.set_attenuation_linear(elem->Get<double>("linear"));
+  _msg.set_attenuation_quadratic(elem->Get<double>("quadratic"));
+  _msg.set_range(elem->Get<double>("range"));
 
   if (lightType == "spot")
   {
     elem = this->sdf->GetElement("spot");
-    _msg.set_spot_inner_angle(elem->GetValueDouble("inner_angle"));
-    _msg.set_spot_outer_angle(elem->GetValueDouble("outer_angle"));
-    _msg.set_spot_falloff(elem->GetValueDouble("falloff"));
+    _msg.set_spot_inner_angle(elem->Get<double>("inner_angle"));
+    _msg.set_spot_outer_angle(elem->Get<double>("outer_angle"));
+    _msg.set_spot_falloff(elem->Get<double>("falloff"));
   }
 }
diff --git a/gazebo/rendering/Light.hh b/gazebo/rendering/Light.hh
index 8e1da5a..1495d1a 100644
--- a/gazebo/rendering/Light.hh
+++ b/gazebo/rendering/Light.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,24 +14,18 @@
  * limitations under the License.
  *
 */
-
-/* Desc: A Light
- * Author: Nate Koenig
- * Date: 15 July 2003
- */
-
 #ifndef _LIGHT_HH_
 #define _LIGHT_HH_
 
 #include <string>
 #include <iostream>
+#include <sdf/sdf.hh>
 
-#include "msgs/msgs.hh"
-#include "rendering/RenderTypes.hh"
-#include "common/Event.hh"
-#include "common/Color.hh"
-
-#include "sdf/sdf.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/util/system.hh"
 
 namespace Ogre
 {
@@ -55,7 +49,7 @@ namespace gazebo
     /// class encapsulates all three. Point lights are light light bulbs,
     /// spot lights project a cone of light, and directional lights are light
     /// sun light.
-    class Light
+    class GAZEBO_VISIBLE Light
     {
       /// \brief Constructor.
       /// \param[in] _scene Pointer to the scene that contains the Light.
@@ -76,6 +70,10 @@ namespace gazebo
       /// \param[in] _msg Containing the light information.
       public: void LoadFromMsg(ConstLightPtr &_msg);
 
+      /// \brief Load from a light message.
+      /// \param[in] _msg Message containing the light information.
+      public: void LoadFromMsg(const msgs::Light &_msg);
+
       /// \brief Set the name of the visual.
       /// \param[in] _name Name of the light source.
       public: void SetName(const std::string &_name);
@@ -108,6 +106,10 @@ namespace gazebo
       /// \param[in] _s Set to true to draw a representation of the light.
       public: void ShowVisual(bool _s);
 
+      /// \brief Get whether the light is visible.
+      /// \return True if the light is visible.
+      public: bool GetVisible() const;
+
       /// \brief Set the light type.
       /// \param[in] _type The light type: "point", "spot", "directional"
       public: void SetLightType(const std::string &_type);
@@ -183,7 +185,7 @@ namespace gazebo
 
       /// \brief Update SDF value based on a message.
       /// \param[in] _msg The light message to update from.
-      private: void UpdateSDFFromMsg(ConstLightPtr &_msg);
+      private: void UpdateSDFFromMsg(const msgs::Light &_msg);
 
       /// \brief The ogre light source
       private: Ogre::Light *light;
diff --git a/gazebo/rendering/Material.cc b/gazebo/rendering/Material.cc
index ced51c4..b590389 100644
--- a/gazebo/rendering/Material.cc
+++ b/gazebo/rendering/Material.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use _mat file except in compliance with the License.
@@ -14,10 +14,10 @@
  * limitations under the License.
  *
 */
-#include "common/Color.hh"
-#include "rendering/ogre_gazebo.h"
-#include "common/Console.hh"
-#include "rendering/Material.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/common/Console.hh"
+#include "gazebo/rendering/Material.hh"
 
 using namespace gazebo;
 using namespace rendering;
diff --git a/gazebo/rendering/Material.hh b/gazebo/rendering/Material.hh
index da21f0d..9319ce0 100644
--- a/gazebo/rendering/Material.hh
+++ b/gazebo/rendering/Material.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _RENDERING_MATERIAL_HH_
 
 #include "gazebo/common/Material.hh"
+#include "gazebo/util/system.hh"
 
 /// \cond
 namespace gazebo
@@ -26,7 +27,7 @@ namespace gazebo
   {
     /// \class Material Material.hh rendering/rendering.hh
     /// \brief An internal class used by Visuals to add materials to Ogre.
-    class Material
+    class GAZEBO_VISIBLE Material
     {
       /// \brief Create all the default materials
       public: static void CreateMaterials();
diff --git a/gazebo/rendering/MovableText.cc b/gazebo/rendering/MovableText.cc
index b5ca99f..4732df2 100644
--- a/gazebo/rendering/MovableText.cc
+++ b/gazebo/rendering/MovableText.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,9 +26,10 @@
 
 #include <boost/thread/recursive_mutex.hpp>
 
-#include "common/common.hh"
-#include "math/gzmath.hh"
-#include "rendering/MovableText.hh"
+#include "gazebo/common/common.hh"
+#include "gazebo/common/Assert.hh"
+#include "gazebo/math/gzmath.hh"
+#include "gazebo/rendering/MovableText.hh"
 
 #define POS_TEX_BINDING    0
 #define COLOUR_BINDING     1
@@ -271,8 +272,8 @@ void MovableText::_setupGeometry()
 {
   boost::recursive_mutex::scoped_lock lock(*this->mutex);
 
-  assert(this->font);
-  assert(!this->material.isNull());
+  GZ_ASSERT(this->font, "font class member is null");
+  GZ_ASSERT(!this->material.isNull(), "material class member is null");
 
   Ogre::VertexDeclaration *decl = NULL;
   Ogre::VertexBufferBinding *bind = NULL;
@@ -606,8 +607,8 @@ void MovableText::_updateColors(void)
   Ogre::RGBA *pDest = NULL;
   unsigned int i;
 
-  assert(this->font);
-  assert(!this->material.isNull());
+  GZ_ASSERT(this->font, "font class member is null");
+  GZ_ASSERT(!this->material.isNull(), "material class member is null");
 
   // Convert to system-specific
   Ogre::ColourValue cv(this->color.r, this->color.g,
@@ -633,7 +634,7 @@ void MovableText::_updateColors(void)
 const Ogre::Quaternion & MovableText::getWorldOrientation(void) const
 {
   boost::recursive_mutex::scoped_lock lock(*this->mutex);
-  assert(this->camera);
+  GZ_ASSERT(this->camera, "camera class member is null");
   return const_cast<Ogre::Quaternion&>(this->camera->getDerivedOrientation());
   // return mParentNode->_getDerivedOrientation();
 }
@@ -642,7 +643,7 @@ const Ogre::Quaternion & MovableText::getWorldOrientation(void) const
 const Ogre::Vector3 & MovableText::getWorldPosition(void) const
 {
   boost::recursive_mutex::scoped_lock lock(*this->mutex);
-  assert(mParentNode);
+  GZ_ASSERT(mParentNode, "mParentNode class member is null");
   return mParentNode->_getDerivedPosition();
 }
 
@@ -721,7 +722,7 @@ void MovableText::getRenderOperation(Ogre::RenderOperation & op)
 const Ogre::MaterialPtr &MovableText::getMaterial(void) const
 {
   boost::recursive_mutex::scoped_lock lock(*this->mutex);
-  assert(!this->material.isNull());
+  GZ_ASSERT(!this->material.isNull(), "material class member is null");
   return this->material;
 }
 
diff --git a/gazebo/rendering/MovableText.hh b/gazebo/rendering/MovableText.hh
index bde838c..1f34817 100644
--- a/gazebo/rendering/MovableText.hh
+++ b/gazebo/rendering/MovableText.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,11 +25,12 @@
 #include <string>
 
 // TODO: remove this line
-#include "rendering/ogre_gazebo.h"
+#include "gazebo/rendering/ogre_gazebo.h"
 
-#include "common/CommonTypes.hh"
-#include "common/Color.hh"
-#include "math/MathTypes.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/math/MathTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
@@ -45,7 +46,8 @@ namespace gazebo
 
     /// \class MovableText MovableText.hh rendering/rendering.hh
     /// \brief Movable text
-    class MovableText : public Ogre::MovableObject, public Ogre::Renderable
+    class GAZEBO_VISIBLE MovableText
+      : public Ogre::MovableObject, public Ogre::Renderable
     {
       /// \enum HorizAlign
       /// \brief Horizontal alignment
diff --git a/gazebo/rendering/OrbitViewController.cc b/gazebo/rendering/OrbitViewController.cc
index 181423c..733dc06 100644
--- a/gazebo/rendering/OrbitViewController.cc
+++ b/gazebo/rendering/OrbitViewController.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -178,8 +178,10 @@ void OrbitViewController::HandleMouseEvent(const common::MouseEvent &_event)
   // Turn on the reference visual.
   this->refVisual->SetVisible(true);
 
-  // Middle mouse button is used to Orbit.
-  if (_event.buttons & common::MouseEvent::MIDDLE && _event.dragging)
+  // Middle mouse button or Shift + Left button is used to Orbit.
+  if (_event.dragging &&
+      (_event.buttons & common::MouseEvent::MIDDLE ||
+      (_event.buttons & common::MouseEvent::LEFT && _event.shift)))
   {
     // Compute the delta yaw and pitch.
     double dy = this->NormalizeYaw(drag.x * _event.moveScale * -0.4);
@@ -376,7 +378,6 @@ void OrbitViewController::UpdateRefVisual()
 void OrbitViewController::Orbit(double _dy, double _dp)
 {
   Ogre::SceneNode *cameraNode = this->camera->GetSceneNode();
-  Ogre::SceneNode *pitchNode = this->camera->GetPitchNode();
   Ogre::Node *parentNode = cameraNode->getParent();
   Ogre::Vector3 pos = cameraNode->_getDerivedPosition();
 
@@ -394,7 +395,6 @@ void OrbitViewController::Orbit(double _dy, double _dp)
   // reference visual, which in turns rotates the camera.
   cameraNode->_setDerivedPosition(pos);
   cameraNode->setOrientation(Ogre::Quaternion());
-  pitchNode->setOrientation(Ogre::Quaternion());
 
   // Rotate and update the reference visual.
   this->yaw = this->NormalizeYaw(this->yaw + _dy);
@@ -407,7 +407,7 @@ void OrbitViewController::Orbit(double _dy, double _dp)
     pos = cameraNode->_getDerivedPosition();
 
   // Store the new location of the camera
-  Ogre::Quaternion rot = pitchNode->_getDerivedOrientation();
+  Ogre::Quaternion rot = cameraNode->_getDerivedOrientation();
 
   // Detach the camera from the reference visual.
   this->refVisual->GetSceneNode()->removeChild(cameraNode);
diff --git a/gazebo/rendering/OrbitViewController.hh b/gazebo/rendering/OrbitViewController.hh
index bcaf65e..bd2c987 100644
--- a/gazebo/rendering/OrbitViewController.hh
+++ b/gazebo/rendering/OrbitViewController.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include "gazebo/rendering/Visual.hh"
 #include "gazebo/rendering/ViewController.hh"
 #include "gazebo/math/Vector3.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -32,7 +33,7 @@ namespace gazebo
 
     /// \class OrbitViewController OrbitVeiwController.hh rendering/rendering.hh
     /// \brief Orbit view controller
-    class OrbitViewController : public ViewController
+    class GAZEBO_VISIBLE OrbitViewController : public ViewController
     {
       /// \brief Constructor.
       /// \param[in] _camera Pointer to the camera to control.
@@ -108,10 +109,10 @@ namespace gazebo
       private: void Orbit(double _dy, double _dp);
 
       /// \brief Yaw value.
-      private: float yaw, initYaw;
+      private: float yaw;
 
       /// \brief Pitch value.
-      private: float pitch, initPitch;
+      private: float pitch;
 
       /// \brief Distance to the focal point.
       private: float distance;
diff --git a/gazebo/rendering/Projector.cc b/gazebo/rendering/Projector.cc
index 1c74845..7e699fc 100644
--- a/gazebo/rendering/Projector.cc
+++ b/gazebo/rendering/Projector.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,12 +19,12 @@
  * Author: Jared Duke, John Hsu, Nate Koenig
  */
 
-#include "rendering/RTShaderSystem.hh"
+#include "gazebo/rendering/RTShaderSystem.hh"
 
-#include "rendering/Conversions.hh"
-#include "rendering/Visual.hh"
-#include "rendering/Scene.hh"
-#include "rendering/Projector.hh"
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/Projector.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -76,9 +76,6 @@ void Projector::Load(const std::string &_name,
     // set the projector pose relative to body
     this->projector.SetPose(_pose);
 
-    // Add the projector as an Ogre frame listener
-    Ogre::Root::getSingletonPtr()->addFrameListener(&this->projector);
-
     if (!this->projector.initialized)
     {
       gzwarn << "starting projector failed, retrying in 1 sec.\n";
@@ -87,6 +84,9 @@ void Projector::Load(const std::string &_name,
     }
   }
 
+  // Add the projector as an Ogre frame listener
+  Ogre::Root::getSingletonPtr()->addFrameListener(&this->projector);
+
   this->projector.SetEnabled(true);
 
   // Start projector
@@ -105,21 +105,21 @@ void Projector::Load(sdf::ElementPtr _sdf)
   double fov = M_PI * 0.25;
 
   if (_sdf->HasElement("pose"))
-    pose = _sdf->GetValuePose("pose");
+    pose = _sdf->Get<math::Pose>("pose");
 
   if (_sdf->HasElement("texture_name"))
-    textureName = _sdf->GetValueString("texture_name");
+    textureName = _sdf->Get<std::string>("texture_name");
 
   if (_sdf->HasElement("near_clip"))
-    nearClip = _sdf->GetValueDouble("near_clip");
+    nearClip = _sdf->Get<double>("near_clip");
 
   if (_sdf->HasElement("far_clip"))
-    farClip = _sdf->GetValueDouble("far_clip");
+    farClip = _sdf->Get<double>("far_clip");
 
   if (_sdf->HasElement("fov"))
-    fov = _sdf->GetValueDouble("fov");
+    fov = _sdf->Get<double>("fov");
 
-  this->Load(_sdf->GetValueString("name"), pose, textureName,
+  this->Load(_sdf->Get<std::string>("name"), pose, textureName,
              nearClip, farClip, fov);
 }
 
@@ -219,6 +219,8 @@ Projector::ProjectorFrameListener::~ProjectorFrameListener()
 
   delete this->frustum;
   delete this->filterFrustum;
+  this->frustum = NULL;
+  this->filterFrustum = NULL;
 
   if (this->projectorQuery)
     this->sceneMgr->destroyQuery(this->projectorQuery);
@@ -400,7 +402,7 @@ void Projector::ProjectorFrameListener::AddPassToVisibleMaterials()
   Ogre::SceneQueryResultMovableList::iterator it;
   for (it = result.movables.begin(); it != result.movables.end(); ++it)
   {
-    Ogre::Entity* entity = dynamic_cast<Ogre::Entity*>(*it);
+    Ogre::Entity *entity = dynamic_cast<Ogre::Entity*>(*it);
     if (entity && entity->getName().find("visual") != std::string::npos)
     {
       for (unsigned int i = 0; i < entity->getNumSubEntities(); i++)
diff --git a/gazebo/rendering/Projector.hh b/gazebo/rendering/Projector.hh
index 0720e4e..529d813 100644
--- a/gazebo/rendering/Projector.hh
+++ b/gazebo/rendering/Projector.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,13 +25,14 @@
 #include <string>
 #include <map>
 #include <list>
+#include <sdf/sdf.hh>
 
-#include "rendering/ogre_gazebo.h"
+#include "gazebo/rendering/ogre_gazebo.h"
 
-#include "msgs/msgs.hh"
-#include "sdf/sdf.hh"
-#include "transport/transport.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/transport.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -42,7 +43,7 @@ namespace gazebo
 
     /// \class Projector Projector.hh rendering/rendering.hh
     /// \brief Projects a material onto surface, light a light projector.
-    class Projector
+    class GAZEBO_VISIBLE Projector
     {
       /// \brief Constructor.
       /// \param[in] _parent Name of the parent visual.
@@ -81,7 +82,7 @@ namespace gazebo
       public: void Toggle();
 
       /// \brief Get the parent visual.
-      /// \return Pointer ot the parent visual.
+      /// \return Pointer to the parent visual.
       public: VisualPtr GetParent();
 
       /// \brief Set whether the projector is enabled or disabled.
diff --git a/gazebo/rendering/RFIDTagVisual.cc b/gazebo/rendering/RFIDTagVisual.cc
index 0500c6f..15f9e73 100644
--- a/gazebo/rendering/RFIDTagVisual.cc
+++ b/gazebo/rendering/RFIDTagVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,11 +19,12 @@
  * Date: 6th December 2011
  */
 
-#include "transport/transport.hh"
-#include "rendering/Conversions.hh"
-#include "rendering/Scene.hh"
-#include "common/MeshManager.hh"
-#include "rendering/RFIDTagVisual.hh"
+#include "gazebo/transport/transport.hh"
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/rendering/RFIDTagVisualPrivate.hh"
+#include "gazebo/rendering/RFIDTagVisual.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -31,12 +32,15 @@ using namespace rendering;
 /////////////////////////////////////////////////
 RFIDTagVisual::RFIDTagVisual(const std::string &_name, VisualPtr _vis,
                              const std::string &_topicName)
-  : Visual(_name, _vis)
+  : Visual(*new RFIDTagVisualPrivate, _name, _vis)
 {
-  this->node = transport::NodePtr(new transport::Node());
-  this->node->Init(this->scene->GetName());
+  RFIDTagVisualPrivate *dPtr =
+      reinterpret_cast<RFIDTagVisualPrivate *>(this->dataPtr);
 
-  this->rfidSub = this->node->Subscribe(_topicName,
+  dPtr->node = transport::NodePtr(new transport::Node());
+  dPtr->node->Init(dPtr->scene->GetName());
+
+  dPtr->rfidSub = dPtr->node->Subscribe(_topicName,
       &RFIDTagVisual::OnScan, this);
 
   common::MeshManager::Instance()->CreateSphere("contact_sphere", .2, 10, 10);
diff --git a/gazebo/rendering/RFIDTagVisual.hh b/gazebo/rendering/RFIDTagVisual.hh
index 27c57ee..315708a 100644
--- a/gazebo/rendering/RFIDTagVisual.hh
+++ b/gazebo/rendering/RFIDTagVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,19 +14,15 @@
  * limitations under the License.
  *
 */
-/* Desc:
- * Author: Jonas Mellin & Zakiruz Zaman
- * Date: 6th December 2011
- */
 
 #ifndef _RFIDTAGVISUAL_HH_
 #define _RFIDTAGVISUAL_HH_
 
 #include <string>
 
-#include "rendering/Visual.hh"
-#include "msgs/MessageTypes.hh"
-#include "transport/TransportTypes.hh"
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +33,7 @@ namespace gazebo
 
     /// \class RFIDTagVisual RFIDTagVisual.hh rendering/rendering.hh
     /// \brief Visualization for RFID tags sensor
-    class RFIDTagVisual : public Visual
+    class GAZEBO_VISIBLE RFIDTagVisual : public Visual
     {
       /// \brief Constructor
       /// \param[in] _name Name of the visual.
@@ -53,12 +49,6 @@ namespace gazebo
       /// \brief Callback triggered when new RFID data is received.
       /// \param[in] _msg Message containing RFID pose data
       private: void OnScan(ConstPosePtr &_msg);
-
-      /// \brief Node that handles communication.
-      private: transport::NodePtr node;
-
-      /// \brief Subscriber that receives RFID data.
-      private: transport::SubscriberPtr rfidSub;
     };
     /// \}
   }
diff --git a/gazebo/rendering/RFIDTagVisualPrivate.hh b/gazebo/rendering/RFIDTagVisualPrivate.hh
new file mode 100644
index 0000000..5c6260f
--- /dev/null
+++ b/gazebo/rendering/RFIDTagVisualPrivate.hh
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _RFIDTAGVISUAL_PRIVATE_HH_
+#define _RFIDTAGVISUAL_PRIVATE_HH_
+
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the RFID Tag Visual class.
+    class RFIDTagVisualPrivate : public VisualPrivate
+    {
+      /// \brief Node that handles communication.
+      public: transport::NodePtr node;
+
+      /// \brief Subscriber that receives RFID data.
+      public: transport::SubscriberPtr rfidSub;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/RFIDVisual.cc b/gazebo/rendering/RFIDVisual.cc
index 91c2dd4..c798753 100644
--- a/gazebo/rendering/RFIDVisual.cc
+++ b/gazebo/rendering/RFIDVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,15 +16,16 @@
 */
 /* Desc: RFID Sensor Visualization Class
  * Author:
- * Date: 
+ * Date:
  */
 
-#include "transport/transport.hh"
-#include "rendering/Conversions.hh"
-#include "rendering/Scene.hh"
-#include "common/MeshManager.hh"
+#include "gazebo/transport/transport.hh"
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/common/MeshManager.hh"
 
-#include "rendering/RFIDVisual.hh"
+#include "gazebo/rendering/RFIDVisualPrivate.hh"
+#include "gazebo/rendering/RFIDVisual.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -32,12 +33,15 @@ using namespace rendering;
 /////////////////////////////////////////////////
 RFIDVisual::RFIDVisual(const std::string &_name, VisualPtr _vis,
                        const std::string &_topicName)
-: Visual(_name, _vis)
+  : Visual(*new RFIDVisualPrivate, _name, _vis)
 {
-  this->node = transport::NodePtr(new transport::Node());
-  this->node->Init(this->scene->GetName());
+  RFIDVisualPrivate *dPtr =
+      reinterpret_cast<RFIDVisualPrivate *>(this->dataPtr);
 
-  this->rfidSub = this->node->Subscribe(_topicName, &RFIDVisual::OnScan, this);
+  dPtr->node = transport::NodePtr(new transport::Node());
+  dPtr->node->Init(dPtr->scene->GetName());
+
+  dPtr->rfidSub = dPtr->node->Subscribe(_topicName, &RFIDVisual::OnScan, this);
 
   common::MeshManager::Instance()->CreateSphere("rfid_sphere", 5.0, 20, 20);
   this->AttachMesh("rfid_sphere");
diff --git a/gazebo/rendering/RFIDVisual.hh b/gazebo/rendering/RFIDVisual.hh
index ff67117..c03afef 100644
--- a/gazebo/rendering/RFIDVisual.hh
+++ b/gazebo/rendering/RFIDVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,31 +14,26 @@
  * limitations under the License.
  *
  */
-/* Desc:
- * Author: Jonas Mellin & Zakiruz Zaman
- * Date: 6th December 2011
- */
 
 #ifndef _RFIDVISUAL_HH_
 #define _RFIDVISUAL_HH_
 
 #include <string>
 
-#include "rendering/Visual.hh"
-#include "msgs/MessageTypes.hh"
-#include "transport/TransportTypes.hh"
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace rendering
   {
-    class DynamicLines;
     /// \addtogroup gazebo_rendering
     /// \{
 
     /// \class RFIDVisual RFIDVisual.hh rendering/rendering.hh
     /// \brief Visualization for RFID sensor.
-    class RFIDVisual : public Visual
+    class GAZEBO_VISIBLE RFIDVisual : public Visual
     {
       /// \brief Constructor.
       /// \param[in] _name Name of the Visual.
@@ -53,12 +48,6 @@ namespace gazebo
       /// \brief Callback for the RFID sensor data.
       /// \param[in] _msg Message containing RFID data
       private: void OnScan(ConstPosePtr &_msg);
-
-      /// \brief Pointer to the transport::Node for communication
-      private: transport::NodePtr node;
-
-      /// \brief Pointer to the transport::Subscriber for recieving data
-      private: transport::SubscriberPtr rfidSub;
     };
     /// \}
   }
diff --git a/gazebo/rendering/RFIDVisualPrivate.hh b/gazebo/rendering/RFIDVisualPrivate.hh
new file mode 100644
index 0000000..4576ed9
--- /dev/null
+++ b/gazebo/rendering/RFIDVisualPrivate.hh
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef _RFIDVISUAL_PRIVATE_HH_
+#define _RFIDVISUAL_PRIVATE_HH_
+
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the RFID Visual class.
+    class RFIDVisualPrivate : public VisualPrivate
+    {
+      /// \brief Pointer to the transport::Node for communication
+      public: transport::NodePtr node;
+
+      /// \brief Pointer to the transport::Subscriber for recieving data
+      public: transport::SubscriberPtr rfidSub;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/RTShaderSystem.cc b/gazebo/rendering/RTShaderSystem.cc
index dc0b154..c740747 100644
--- a/gazebo/rendering/RTShaderSystem.cc
+++ b/gazebo/rendering/RTShaderSystem.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,16 +14,13 @@
  * limitations under the License.
  *
 */
-/* Desc: Wrapper around the OGRE RTShader system
- * Author: Nate Koenig
- */
 
 #include <sys/stat.h>
 #include <boost/bind.hpp>
 
-#include "gazebo/common/Exception.hh"
 #include "gazebo/common/Console.hh"
-
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/SystemPaths.hh"
 #include "gazebo/rendering/RenderEngine.hh"
 #include "gazebo/rendering/Scene.hh"
 #include "gazebo/rendering/Visual.hh"
@@ -39,6 +36,7 @@ RTShaderSystem::RTShaderSystem()
   this->entityMutex = new boost::mutex();
   this->initialized = false;
   this->shadowsApplied = false;
+  this->pssmSetup.setNull();
 }
 
 //////////////////////////////////////////////////
@@ -96,10 +94,15 @@ void RTShaderSystem::Fini()
   // Finalize RTShader system.
   if (this->shaderGenerator != NULL)
   {
+#if (OGRE_VERSION < ((1 << 16) | (9 << 8) | 0))
     Ogre::RTShader::ShaderGenerator::finalize();
+#else
+    Ogre::RTShader::ShaderGenerator::destroy();
+#endif
     this->shaderGenerator = NULL;
   }
 
+  this->pssmSetup.setNull();
   this->entities.clear();
   this->scenes.clear();
   this->initialized = false;
@@ -190,7 +193,8 @@ void RTShaderSystem::AttachViewport(Ogre::Viewport *_viewport, ScenePtr _scene)
 void RTShaderSystem::DetachViewport(Ogre::Viewport *_viewport, ScenePtr _scene)
 {
 #if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
-  _viewport->setMaterialScheme(_scene->GetName());
+  if (_viewport && _scene && _scene->GetInitialized())
+    _viewport->setMaterialScheme(_scene->GetName());
 #endif
 }
 
@@ -371,7 +375,10 @@ bool RTShaderSystem::GetPaths(std::string &coreLibsPath, std::string &cachePath)
           // Get the tmp dir
           tmpdir = getenv("TMP");
           if (!tmpdir)
-            tmpdir = const_cast<char*>("/tmp");
+          {
+            common::SystemPaths *paths = common::SystemPaths::Instance();
+            tmpdir = const_cast<char*>(paths->GetTmpPath().c_str());
+          }
           // Get the user
           user = getenv("USER");
           if (!user)
@@ -473,25 +480,32 @@ void RTShaderSystem::ApplyShadows(ScenePtr _scene)
   // pssmCasterPass->setFog(true);
 
   // shadow camera setup
-  this->pssmSetup = new Ogre::PSSMShadowCameraSetup();
+  if (this->pssmSetup.isNull())
+  {
+    this->pssmSetup =
+        Ogre::ShadowCameraSetupPtr(new Ogre::PSSMShadowCameraSetup());
+  }
 
-  double shadowFarDistance = 200;
+  double shadowFarDistance = 500;
   double cameraNearClip = 0.1;
   sceneMgr->setShadowFarDistance(shadowFarDistance);
 
-  this->pssmSetup->calculateSplitPoints(3, cameraNearClip, shadowFarDistance);
-  this->pssmSetup->setSplitPadding(4);
-  this->pssmSetup->setOptimalAdjustFactor(0, 2);
-  this->pssmSetup->setOptimalAdjustFactor(1, 1);
-  this->pssmSetup->setOptimalAdjustFactor(2, .5);
+  Ogre::PSSMShadowCameraSetup *cameraSetup =
+      dynamic_cast<Ogre::PSSMShadowCameraSetup*>(this->pssmSetup.get());
 
-  sceneMgr->setShadowCameraSetup(Ogre::ShadowCameraSetupPtr(this->pssmSetup));
+  cameraSetup->calculateSplitPoints(3, cameraNearClip, shadowFarDistance);
+  cameraSetup->setSplitPadding(4);
+  cameraSetup->setOptimalAdjustFactor(0, 2);
+  cameraSetup->setOptimalAdjustFactor(1, 1);
+  cameraSetup->setOptimalAdjustFactor(2, .5);
+
+  sceneMgr->setShadowCameraSetup(this->pssmSetup);
 
   // These values do not seem to help at all. Leaving here until I have time
   // to properly fix shadow z-fighting.
-  // this->pssmSetup->setOptimalAdjustFactor(0, 4);
-  // this->pssmSetup->setOptimalAdjustFactor(1, 1);
-  // this->pssmSetup->setOptimalAdjustFactor(2, 0.5);
+  // cameraSetup->setOptimalAdjustFactor(0, 4);
+  // cameraSetup->setOptimalAdjustFactor(1, 1);
+  // cameraSetup->setOptimalAdjustFactor(2, 0.5);
 
   this->shadowRenderState = this->shaderGenerator->createSubRenderState(
       Ogre::RTShader::IntegratedPSSM3::Type);
@@ -499,7 +513,8 @@ void RTShaderSystem::ApplyShadows(ScenePtr _scene)
     static_cast<Ogre::RTShader::IntegratedPSSM3*>(this->shadowRenderState);
 
   const Ogre::PSSMShadowCameraSetup::SplitPointList &srcSplitPoints =
-    this->pssmSetup->getSplitPoints();
+    cameraSetup->getSplitPoints();
+
   Ogre::RTShader::IntegratedPSSM3::SplitPointList dstSplitPoints;
 
   for (unsigned int i = 0; i < srcSplitPoints.size(); ++i)
@@ -521,5 +536,5 @@ void RTShaderSystem::ApplyShadows(ScenePtr _scene)
 /////////////////////////////////////////////////
 Ogre::PSSMShadowCameraSetup *RTShaderSystem::GetPSSMShadowCameraSetup() const
 {
-  return this->pssmSetup;
+  return dynamic_cast<Ogre::PSSMShadowCameraSetup *>(this->pssmSetup.get());
 }
diff --git a/gazebo/rendering/RTShaderSystem.hh b/gazebo/rendering/RTShaderSystem.hh
index 002be91..d3a0d73 100644
--- a/gazebo/rendering/RTShaderSystem.hh
+++ b/gazebo/rendering/RTShaderSystem.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,11 +26,12 @@
 #include <string>
 #include <vector>
 
-#include "rendering/ogre_gazebo.h"
-#include "gazebo_config.h"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/gazebo_config.h"
 
-#include "rendering/Camera.hh"
-#include "common/SingletonT.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/common/SingletonT.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -47,7 +48,7 @@ namespace gazebo
     ///
     /// This class allows Gazebo to generate per-pixel shaders for every
     /// material at run-time.
-    class RTShaderSystem : public SingletonT<RTShaderSystem>
+    class GAZEBO_VISIBLE RTShaderSystem : public SingletonT<RTShaderSystem>
     {
       /// \enum LightingModel.
       /// \brief The type of lighting.
@@ -161,7 +162,8 @@ namespace gazebo
       /// \brief Mutex used to protext the entities list.
       private: boost::mutex *entityMutex;
 
-      private: Ogre::PSSMShadowCameraSetup *pssmSetup;
+      /// \brief Parallel Split Shadow Map (PSSM) camera setup
+      private: Ogre::ShadowCameraSetupPtr pssmSetup;
 
       /// \brief Make the RTShader system a singleton.
       private: friend class SingletonT<RTShaderSystem>;
diff --git a/gazebo/rendering/RenderEngine.cc b/gazebo/rendering/RenderEngine.cc
index e9e1f4b..b363845 100644
--- a/gazebo/rendering/RenderEngine.cc
+++ b/gazebo/rendering/RenderEngine.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,14 +14,16 @@
  * limitations under the License.
  *
 */
-/* Desc: Middleman between OGRE and Gazebo
- * Author: Nate Koenig
- * Date: 13 Feb 2006
- */
 
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <GL/glx.h>
+#ifdef  __APPLE__
+# include <QtCore/qglobal.h>
+#endif
+
+#ifndef Q_OS_MAC  // Not Apple
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+# include <GL/glx.h>
+#endif
 
 #include <sys/types.h>
 #include <dirent.h>
@@ -30,35 +32,34 @@
 
 #include <boost/filesystem.hpp>
 
-#include "rendering/ogre_gazebo.h"
+#include "gazebo/rendering/ogre_gazebo.h"
 
-#include "gazebo_config.h"
+#include "gazebo/gazebo_config.h"
 
-#include "transport/Transport.hh"
-#include "transport/Node.hh"
-#include "transport/Subscriber.hh"
+#include "gazebo/transport/TransportIface.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Subscriber.hh"
 
-#include "common/Common.hh"
-#include "common/Color.hh"
-#include "common/Events.hh"
-#include "common/Exception.hh"
-#include "common/Console.hh"
-#include "common/SystemPaths.hh"
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/SystemPaths.hh"
 
-#include "rendering/Material.hh"
-#include "rendering/RenderEvents.hh"
-#include "rendering/RTShaderSystem.hh"
-#include "rendering/WindowManager.hh"
-#include "rendering/Scene.hh"
-#include "rendering/Grid.hh"
-#include "rendering/Visual.hh"
-#include "rendering/UserCamera.hh"
-#include "rendering/RenderEngine.hh"
+#include "gazebo/rendering/Material.hh"
+#include "gazebo/rendering/RenderEvents.hh"
+#include "gazebo/rendering/RTShaderSystem.hh"
+#include "gazebo/rendering/WindowManager.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/Grid.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/RenderEngine.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
-
 //////////////////////////////////////////////////
 RenderEngine::RenderEngine()
 {
@@ -70,9 +71,9 @@ RenderEngine::RenderEngine()
   this->initialized = false;
 
   this->renderPathType = NONE;
+  this->windowManager.reset(new WindowManager);
 }
 
-
 //////////////////////////////////////////////////
 RenderEngine::~RenderEngine()
 {
@@ -88,71 +89,109 @@ void RenderEngine::Load()
     return;
   }
 
-  this->connections.push_back(event::Events::ConnectPreRender(
-        boost::bind(&RenderEngine::PreRender, this)));
-  this->connections.push_back(event::Events::ConnectRender(
-        boost::bind(&RenderEngine::Render, this)));
-  this->connections.push_back(event::Events::ConnectPostRender(
-        boost::bind(&RenderEngine::PostRender, this)));
+  if (!this->root)
+  {
+    this->connections.push_back(event::Events::ConnectPreRender(
+          boost::bind(&RenderEngine::PreRender, this)));
+    this->connections.push_back(event::Events::ConnectRender(
+          boost::bind(&RenderEngine::Render, this)));
+    this->connections.push_back(event::Events::ConnectPostRender(
+          boost::bind(&RenderEngine::PostRender, this)));
 
-  // Create a new log manager and prevent output from going to stdout
-  this->logManager = new Ogre::LogManager();
+    // Create a new log manager and prevent output from going to stdout
+    this->logManager = new Ogre::LogManager();
 
-  std::string logPath = common::SystemPaths::Instance()->GetLogPath();
-  logPath += "/ogre.log";
+    std::string logPath = common::SystemPaths::Instance()->GetLogPath();
+    logPath += "/ogre.log";
 
-  this->logManager->createLog(logPath, true, false, false);
+    this->logManager->createLog(logPath, true, false, false);
 
-  if (this->root)
-  {
-    gzerr << "Attempting to load, but root already exist\n";
-    return;
-  }
+    // Make the root
+    try
+    {
+      this->root = new Ogre::Root();
+    }
+    catch(Ogre::Exception &e)
+    {
+      gzthrow("Unable to create an Ogre rendering environment, no Root ");
+    }
 
-  // Make the root
-  try
-  {
-    this->root = new Ogre::Root();
-  }
-  catch(Ogre::Exception &e)
-  {
-    gzthrow("Unable to create an Ogre rendering environment, no Root ");
-  }
+#if OGRE_VERSION_MAJR > 1 || OGRE_VERSION_MINOR >= 9
+    // Must be created after this->root, but before this->root is
+    // initialized.
+    this->overlaySystem = new Ogre::OverlaySystem();
+#endif
 
-  // Load all the plugins
-  this->LoadPlugins();
+    // Load all the plugins
+    this->LoadPlugins();
 
-  // Setup the rendering system, and create the context
-  this->SetupRenderSystem();
+    // Setup the rendering system, and create the context
+    this->SetupRenderSystem();
 
-  // Initialize the root node, and don't create a window
-  this->root->initialise(false);
+    // Initialize the root node, and don't create a window
+    this->root->initialise(false);
 
-  // Setup the available resources
-  this->SetupResources();
+    // Setup the available resources
+    this->SetupResources();
+  }
 
   std::stringstream stream;
   stream << (int32_t)this->dummyWindowId;
 
-  WindowManager::Instance()->CreateWindow(stream.str(), 1, 1);
+  this->windowManager->CreateWindow(stream.str(), 1, 1);
   this->CheckSystemCapabilities();
 }
 
 //////////////////////////////////////////////////
 ScenePtr RenderEngine::CreateScene(const std::string &_name,
-                                   bool _enableVisualizations)
+                                   bool _enableVisualizations,
+                                   bool _isServer)
 {
   if (this->renderPathType == NONE)
     return ScenePtr();
 
-  ScenePtr scene(new Scene(_name, _enableVisualizations));
-  this->scenes.push_back(scene);
+  if (!this->initialized)
+  {
+    gzerr << "RenderEngine is not initialized\n";
+    return ScenePtr();
+  }
 
-  scene->Load();
-  if (this->initialized)
+  ScenePtr scene;
+
+  try
+  {
+    scene.reset(new Scene(_name, _enableVisualizations, _isServer));
+  }
+  catch(...)
+  {
+    gzerr << "Failed to instantiate a scene\n";
+    scene.reset();
+    return scene;
+  }
+
+  try
+  {
+    scene->Load();
+  }
+  catch(...)
+  {
+    gzerr << "Failed to load scene\n";
+    scene.reset();
+    return scene;
+  }
+
+  try
+  {
     scene->Init();
-  else
-    gzerr << "RenderEngine is not initialized\n";
+  }
+  catch(...)
+  {
+    gzerr << "Failed to initialize scene\n";
+    scene.reset();
+    return scene;
+  }
+
+  this->scenes.push_back(scene);
 
   rendering::Events::createScene(_name);
 
@@ -191,7 +230,7 @@ ScenePtr RenderEngine::GetScene(const std::string &_name)
   std::vector<ScenePtr>::iterator iter;
 
   for (iter = this->scenes.begin(); iter != this->scenes.end(); ++iter)
-    if ((*iter)->GetName() == _name)
+    if (_name.empty() || (*iter)->GetName() == _name)
       return (*iter);
 
   return ScenePtr();
@@ -240,8 +279,6 @@ void RenderEngine::Init()
   if (this->renderPathType == NONE)
     return;
 
-  this->node = transport::NodePtr(new transport::Node());
-  this->node->Init();
   this->initialized = false;
 
   Ogre::ColourValue ambient;
@@ -275,16 +312,19 @@ void RenderEngine::Fini()
   if (!this->initialized)
     return;
 
-  this->node->Fini();
   this->connections.clear();
 
   // TODO: this was causing a segfault on shutdown
   // Close all the windows first;
-  WindowManager::Instance()->Fini();
+  this->windowManager->Fini();
 
   RTShaderSystem::Instance()->Fini();
 
-  this->scenes.clear();
+  // Deallocate memory for every scene
+  while (!this->scenes.empty())
+  {
+    this->RemoveScene(this->scenes.front()->GetName());
+  }
 
   // TODO: this was causing a segfault. Need to debug, and put back in
   if (this->root)
@@ -306,13 +346,19 @@ void RenderEngine::Fini()
       delete this->root;
     }
     catch(...)
-    { }
+    {
+    }
   }
   this->root = NULL;
 
   delete this->logManager;
   this->logManager = NULL;
 
+  for (unsigned int i = 0; i < this->scenes.size(); ++i)
+    this->scenes[i].reset();
+  this->scenes.clear();
+
+#ifndef Q_OS_MAC
   if (this->dummyDisplay)
   {
     glXDestroyContext(static_cast<Display*>(this->dummyDisplay),
@@ -322,6 +368,7 @@ void RenderEngine::Fini()
     XCloseDisplay(static_cast<Display*>(this->dummyDisplay));
     this->dummyDisplay = NULL;
   }
+#endif
 
   this->initialized = false;
 }
@@ -334,7 +381,7 @@ void RenderEngine::LoadPlugins()
     common::SystemPaths::Instance()->GetOgrePaths();
 
   for (iter = ogrePaths.begin();
-       iter!= ogrePaths.end(); ++iter)
+       iter != ogrePaths.end(); ++iter)
   {
     std::string path(*iter);
     DIR *dir = opendir(path.c_str());
@@ -348,24 +395,32 @@ void RenderEngine::LoadPlugins()
     std::vector<std::string> plugins;
     std::vector<std::string>::iterator piter;
 
-    plugins.push_back(path+"/RenderSystem_GL");
-    plugins.push_back(path+"/Plugin_ParticleFX");
-    plugins.push_back(path+"/Plugin_BSPSceneManager");
-    plugins.push_back(path+"/Plugin_OctreeSceneManager");
+#ifdef __APPLE__
+    std::string prefix = "lib";
+    std::string extension = ".dylib";
+#else
+    std::string prefix = "";
+    std::string extension = ".so";
+#endif
+
+    plugins.push_back(path+"/"+prefix+"RenderSystem_GL");
+    plugins.push_back(path+"/"+prefix+"Plugin_ParticleFX");
+    plugins.push_back(path+"/"+prefix+"Plugin_BSPSceneManager");
+    plugins.push_back(path+"/"+prefix+"Plugin_OctreeSceneManager");
 
-    for (piter = plugins.begin(); piter!= plugins.end(); ++piter)
+    for (piter = plugins.begin(); piter != plugins.end(); ++piter)
     {
       try
       {
         // Load the plugin into OGRE
-        this->root->loadPlugin(*piter+".so");
+        this->root->loadPlugin(*piter+extension);
       }
       catch(Ogre::Exception &e)
       {
         try
         {
           // Load the debug plugin into OGRE
-          this->root->loadPlugin(*piter+"_d.so");
+          this->root->loadPlugin(*piter+"_d"+extension);
         }
         catch(Ogre::Exception &ed)
         {
@@ -407,7 +462,6 @@ void RenderEngine::AddResourcePath(const std::string &_uri)
 
       // Parse all material files in the path if any exist
       boost::filesystem::path dir(path);
-      std::list<boost::filesystem::path> resultSet;
 
       if (boost::filesystem::exists(dir) &&
           boost::filesystem::is_directory(dir))
@@ -456,9 +510,9 @@ void RenderEngine::AddResourcePath(const std::string &_uri)
       }
     }
   }
-  catch(Ogre::Exception)
+  catch(Ogre::Exception &/*_e*/)
   {
-    gzthrow(std::string("Unable to load Ogre Resources.\nMake sure the") +
+    gzthrow("Unable to load Ogre Resources.\nMake sure the"
         "resources path in the world file is set correctly.");
   }
 }
@@ -529,17 +583,17 @@ void RenderEngine::SetupResources()
           std::make_pair(prefix + "/gui/animations", "Animations"));
     }
 
-    for (aiter = archNames.begin(); aiter!= archNames.end(); ++aiter)
+    for (aiter = archNames.begin(); aiter != archNames.end(); ++aiter)
     {
       try
       {
         Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
             aiter->first, "FileSystem", aiter->second);
       }
-      catch(Ogre::Exception)
+      catch(Ogre::Exception &/*_e*/)
       {
-        gzthrow(std::string("Unable to load Ogre Resources.\n") +
-            "Make sure the resources path in the world file is set correctly.");
+        gzthrow("Unable to load Ogre Resources. Make sure the resources path "
+            "in the world file is set correctly.");
       }
     }
   }
@@ -552,7 +606,7 @@ void RenderEngine::SetupRenderSystem()
   const Ogre::RenderSystemList *rsList;
 
   // Set parameters of render system (window size, etc.)
-#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR == 6
+#if  OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR == 6
   rsList = this->root->getAvailableRenderers();
 #else
   rsList = &(this->root->getAvailableRenderers());
@@ -600,6 +654,9 @@ bool RenderEngine::CreateContext()
 {
   bool result = true;
 
+#ifdef Q_OS_MAC
+  this->dummyDisplay = 0;
+#else
   try
   {
     this->dummyDisplay = XOpenDisplay(0);
@@ -646,7 +703,7 @@ bool RenderEngine::CreateContext()
   {
     result = false;
   }
-
+#endif
 
   return result;
 }
@@ -704,3 +761,17 @@ void RenderEngine::CheckSystemCapabilities()
   // if (hasRenderToVertexBuffer && multiRenderTargetCount >= 8)
   //  this->renderPathType = RenderEngine::DEFERRED;
 }
+
+/////////////////////////////////////////////////
+WindowManagerPtr RenderEngine::GetWindowManager() const
+{
+  return this->windowManager;
+}
+
+#if OGRE_VERSION_MAJR > 1 || OGRE_VERSION_MINOR >= 9
+/////////////////////////////////////////////////
+Ogre::OverlaySystem *RenderEngine::GetOverlaySystem() const
+{
+  return this->overlaySystem;
+}
+#endif
diff --git a/gazebo/rendering/RenderEngine.hh b/gazebo/rendering/RenderEngine.hh
index 6980121..1a555f2 100644
--- a/gazebo/rendering/RenderEngine.hh
+++ b/gazebo/rendering/RenderEngine.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,16 +25,18 @@
 #include <vector>
 #include <string>
 
-#include "msgs/msgs.hh"
-#include "common/SingletonT.hh"
-#include "common/Event.hh"
-#include "transport/TransportTypes.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/common/SingletonT.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace Ogre
 {
   class Root;
   class LogManager;
+  class OverlaySystem;
 }
 
 namespace gazebo
@@ -50,7 +52,7 @@ namespace gazebo
     /// \brief Adaptor to Ogre3d
     ///
     /// Provides the interface to load, initialize the rendering engine.
-    class RenderEngine : public SingletonT<RenderEngine>
+    class GAZEBO_VISIBLE RenderEngine : public SingletonT<RenderEngine>
     {
       /// \enum RenderPathType
       /// \brief The type of rendering path used by the rendering engine.
@@ -89,7 +91,8 @@ namespace gazebo
       /// \param[in] _enableVisualizations True enables visualization
       /// elements such as laser lines.
       public: ScenePtr CreateScene(const std::string &_name,
-                                   bool _enableVisualizations);
+                                   bool _enableVisualizations,
+                                   bool _isServer = false);
 
       /// \brief Remove a scene
       /// \param[in] _name The name of the scene to remove.
@@ -99,7 +102,7 @@ namespace gazebo
       /// \param[in] _name Name of the scene to retreive.
       /// \return A pointer to the Scene, or NULL if the scene doesn't
       /// exist.
-      public: ScenePtr GetScene(const std::string &_name);
+      public: ScenePtr GetScene(const std::string &_name="");
 
       /// \brief Get a scene by index. The index should be between 0 and
       /// GetSceneCount().
@@ -121,6 +124,16 @@ namespace gazebo
       /// \return The RenderPathType
       public: RenderPathType GetRenderPathType() const;
 
+      /// \brief Get a pointer to the window manager.
+      /// \return Pointer to the window manager.
+      public: WindowManagerPtr GetWindowManager() const;
+
+#if OGRE_VERSION_MAJOR > 1 || OGRE_VERSION_MINOR >= 9
+      /// \brief Get a pointer to the Ogre overlay system.
+      /// \return Pointer to the OGRE overlay system.
+      public: Ogre::OverlaySystem *GetOverlaySystem() const;
+#endif
+
       /// \brief Create a render context.
       /// \return True if the context was created.
       private: bool CreateContext();
@@ -174,12 +187,20 @@ namespace gazebo
       /// \brief All the event connections.
       private: std::vector<event::ConnectionPtr> connections;
 
+      /// \brief Remove this in gazebo 3.0.
       /// \brief Node for communications.
       private: transport::NodePtr node;
 
       /// \brief The type of render path used.
       private: RenderPathType renderPathType;
 
+      /// \brief Pointer to the window manager.
+      private: WindowManagerPtr windowManager;
+
+#if OGRE_VERSION_MAJOR > 1 || OGRE_VERSION_MINOR >= 9
+      private: Ogre::OverlaySystem *overlaySystem;
+#endif
+
       /// \brief Makes this class a singleton.
       private: friend class SingletonT<RenderEngine>;
     };
diff --git a/gazebo/rendering/RenderEvents.cc b/gazebo/rendering/RenderEvents.cc
index 85a50c6..c5106ae 100644
--- a/gazebo/rendering/RenderEvents.cc
+++ b/gazebo/rendering/RenderEvents.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  *
 */
 
-#include "rendering/RenderEvents.hh"
+#include "gazebo/rendering/RenderEvents.hh"
 
 using namespace gazebo;
 using namespace rendering;
diff --git a/gazebo/rendering/RenderEvents.hh b/gazebo/rendering/RenderEvents.hh
index 0b992a9..ce1d60c 100644
--- a/gazebo/rendering/RenderEvents.hh
+++ b/gazebo/rendering/RenderEvents.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,8 +18,9 @@
 #define _RENDER_EVENTS_HH_
 
 #include <string>
-#include "common/Event.hh"
-#include "msgs/msgs.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class Events Events.hh rendering/rendering.hh
     /// \brief Base class for rendering events
-    class Events
+    class GAZEBO_VISIBLE Events
     {
       /// \brief Connect to a scene created event.
       /// \param[in] _subscriber Callback to trigger when event occurs.
diff --git a/gazebo/rendering/RenderTypes.hh b/gazebo/rendering/RenderTypes.hh
index 1681740..b757039 100644
--- a/gazebo/rendering/RenderTypes.hh
+++ b/gazebo/rendering/RenderTypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _RENDERTYPES_HH_
 
 #include <boost/shared_ptr.hpp>
+#include "gazebo/util/system.hh"
 
 /// \def GZ_VISIBILITY_ALL
 /// \brief Render everything visibility mask.
@@ -31,9 +32,9 @@
 /// \brief Render GUI visuals mask.
 #define GZ_VISIBILITY_GUI             0x00000001
 
-/// \def GZ_VISIBILITY_NOT_SELECTABLE
-/// \brief Render visuals that are not selectable mask.
-#define GZ_VISIBILITY_NOT_SELECTABLE  0x00000002
+/// \def GZ_VISIBILITY_SELECTABLE
+/// \brief Render visuals that are selectable mask.
+#define GZ_VISIBILITY_SELECTABLE      0x00000002
 
 namespace gazebo
 {
@@ -48,6 +49,8 @@ namespace gazebo
     class DynamicLines;
     class Visual;
     class LaserVisual;
+    class SonarVisual;
+    class WrenchVisual;
     class CameraVisual;
     class JointVisual;
     class AxisVisual;
@@ -56,6 +59,8 @@ namespace gazebo
     class COMVisual;
     class RFIDVisual;
     class RFIDTagVisual;
+    class WindowManager;
+    class SelectionObj;
 
     /// \def ScenePtr
     /// \brief Shared pointer to Scene
@@ -93,6 +98,14 @@ namespace gazebo
     /// \brief Shared pointer to LaserVisual
     typedef boost::shared_ptr<LaserVisual> LaserVisualPtr;
 
+    /// \def SonarVisualPtr
+    /// \brief Shared pointer to SonarVisual
+    typedef boost::shared_ptr<SonarVisual> SonarVisualPtr;
+
+    /// \def WrenchVisualPtr
+    /// \brief Shared pointer to WrenchVisual
+    typedef boost::shared_ptr<WrenchVisual> WrenchVisualPtr;
+
     /// \def CameraVisualPtr
     /// \brief Shared pointer to CameraVisual
     typedef boost::shared_ptr<CameraVisual> CameraVisualPtr;
@@ -125,6 +138,14 @@ namespace gazebo
     /// \brief Shared pointer to RFIDTagVisual
     typedef boost::shared_ptr<RFIDTagVisual> RFIDTagVisualPtr;
 
+    /// \def WindowManager
+    /// \brief Shared pointer to WindowManager
+    typedef boost::shared_ptr<WindowManager> WindowManagerPtr;
+
+    /// \def ContactVisualPtr
+    /// \brief Shared pointer to SelectionObj
+    typedef boost::shared_ptr<SelectionObj> SelectionObjPtr;
+
     /// \enum RenderOpType
     /// \brief Type of render operation for a drawable
     enum RenderOpType
diff --git a/gazebo/rendering/Rendering.cc b/gazebo/rendering/Rendering.cc
deleted file mode 100644
index 5630ad1..0000000
--- a/gazebo/rendering/Rendering.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <boost/thread.hpp>
-#include "common/Exception.hh"
-#include "common/Console.hh"
-
-#include "rendering/RenderEngine.hh"
-#include "Rendering.hh"
-
-using namespace gazebo;
-
-bool rendering::load()
-{
-  bool result = true;
-
-  try
-  {
-    rendering::RenderEngine::Instance()->Load();
-  }
-  catch(common::Exception &e)
-  {
-    result = false;
-    gzerr << "Failed to load the Rendering engine subsystem\n" << e;
-  }
-
-  return result;
-}
-
-bool rendering::init()
-{
-  bool result = true;
-
-  // Initialize RenderEngine
-  try
-  {
-    rendering::RenderEngine::Instance()->Init();
-  }
-  catch(common::Exception &e)
-  {
-    result = false;
-    gzerr << "Failed to Initialize the Rendering engine subsystem\n" << e;
-  }
-
-  return result;
-}
-
-bool rendering::fini()
-{
-  rendering::RenderEngine::Instance()->Fini();
-  return true;
-}
-
-rendering::ScenePtr rendering::get_scene(const std::string &_name)
-{
-  return rendering::RenderEngine::Instance()->GetScene(_name);
-}
-
-rendering::ScenePtr rendering::create_scene(const std::string &_name,
-                                            bool _enableVisualizations)
-{
-  ScenePtr scene;
-
-  // Create a default scene for the gui
-  try
-  {
-    scene = rendering::RenderEngine::Instance()->CreateScene(_name,
-        _enableVisualizations);
-  }
-  catch(common::Exception &e)
-  {
-    gzerr << "Failed to create a scene in the Rendering engine" << e;
-  }
-
-  return scene;
-}
-
-void rendering::remove_scene(const std::string &_name)
-{
-  rendering::RenderEngine::Instance()->RemoveScene(_name);
-}
-
-
-
diff --git a/gazebo/rendering/Rendering.hh b/gazebo/rendering/Rendering.hh
deleted file mode 100644
index 2fe526d..0000000
--- a/gazebo/rendering/Rendering.hh
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef _RENDERING_HH_
-#define _RENDERING_HH_
-
-#include <string>
-#include "RenderTypes.hh"
-
-namespace gazebo
-{
-  namespace rendering
-  {
-    /// \addtogroup gazebo_rendering
-    /// \{
-
-    /// \brief load rendering engine.
-    bool load();
-
-    /// \brief init rendering engine.
-    bool init();
-
-    /// \brief teardown rendering engine.
-    bool fini();
-
-    /// \brief get pointer to rendering::Scene by name.
-    /// \param[in] _name Name of the scene to retreive.
-    rendering::ScenePtr get_scene(const std::string &_name);
-
-    /// \brief create rendering::Scene by name.
-    /// \param[in] _name Name of the scene to create.
-    /// \param[in] _enableVisualizations True enables visualization
-    /// elements such as laser lines.
-    rendering::ScenePtr create_scene(const std::string &_name,
-                                     bool _enableVisualizations);
-
-    /// \brief remove a rendering::Scene by name
-    /// \param[in] _name The name of the scene to remove.
-    void remove_scene(const std::string &_name);
-
-    /// \}
-  }
-}
-#endif
diff --git a/gazebo/rendering/RenderingIface.cc b/gazebo/rendering/RenderingIface.cc
new file mode 100644
index 0000000..b93b493
--- /dev/null
+++ b/gazebo/rendering/RenderingIface.cc
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <boost/thread.hpp>
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/rendering/RenderEngine.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+
+using namespace gazebo;
+
+//////////////////////////////////////////////////
+bool rendering::load()
+{
+  bool result = true;
+
+  try
+  {
+    rendering::RenderEngine::Instance()->Load();
+  }
+  catch(common::Exception &e)
+  {
+    result = false;
+    gzerr << "Failed to load the Rendering engine subsystem\n" << e;
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+bool rendering::init()
+{
+  bool result = true;
+
+  // Initialize RenderEngine
+  try
+  {
+    rendering::RenderEngine::Instance()->Init();
+  }
+  catch(common::Exception &e)
+  {
+    result = false;
+    gzerr << "Failed to Initialize the Rendering engine subsystem\n" << e;
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+bool rendering::fini()
+{
+  rendering::RenderEngine::Instance()->Fini();
+  return true;
+}
+
+//////////////////////////////////////////////////
+rendering::ScenePtr rendering::get_scene(const std::string &_name)
+{
+  return rendering::RenderEngine::Instance()->GetScene(_name);
+}
+
+//////////////////////////////////////////////////
+rendering::ScenePtr rendering::create_scene(const std::string &_name,
+                                            bool _enableVisualizations,
+                                            bool _isServer)
+{
+  ScenePtr scene = get_scene(_name);
+
+  if (!scene)
+  {
+    // Create a default scene for the gui
+    try
+    {
+      scene = rendering::RenderEngine::Instance()->CreateScene(_name,
+          _enableVisualizations, _isServer);
+    }
+    catch(common::Exception &e)
+    {
+      gzerr << "Failed to create a scene in the Rendering engine"
+        << e << std::endl;
+    }
+    catch(...)
+    {
+      gzerr << "Faild to create a scene\n";
+    }
+  }
+
+  return scene;
+}
+
+//////////////////////////////////////////////////
+void rendering::remove_scene(const std::string &_name)
+{
+  rendering::RenderEngine::Instance()->RemoveScene(_name);
+}
diff --git a/gazebo/rendering/RenderingIface.hh b/gazebo/rendering/RenderingIface.hh
new file mode 100644
index 0000000..d7f797e
--- /dev/null
+++ b/gazebo/rendering/RenderingIface.hh
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _RENDERINGIFACE_HH_
+#define _RENDERINGIFACE_HH_
+
+#include <string>
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \addtogroup gazebo_rendering
+    /// \{
+
+    /// \brief load rendering engine.
+    GAZEBO_VISIBLE
+    bool load();
+
+    /// \brief init rendering engine.
+    GAZEBO_VISIBLE
+    bool init();
+
+    /// \brief teardown rendering engine.
+    GAZEBO_VISIBLE
+    bool fini();
+
+    /// \brief get pointer to rendering::Scene by name.
+    /// \param[in] _name Name of the scene to retreive.
+    GAZEBO_VISIBLE
+    rendering::ScenePtr get_scene(const std::string &_name = "");
+
+    /// \brief create rendering::Scene by name.
+    /// \param[in] _name Name of the scene to create.
+    /// \param[in] _enableVisualizations True enables visualization
+    /// elements such as laser lines.
+    GAZEBO_VISIBLE
+    rendering::ScenePtr create_scene(const std::string &_name,
+                                     bool _enableVisualizations,
+                                     bool _isServer = false);
+
+    /// \brief remove a rendering::Scene by name
+    /// \param[in] _name The name of the scene to remove.
+    GAZEBO_VISIBLE
+    void remove_scene(const std::string &_name);
+
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/rendering/Road2d.cc b/gazebo/rendering/Road2d.cc
index 15d55b4..5ad9e7d 100644
--- a/gazebo/rendering/Road2d.cc
+++ b/gazebo/rendering/Road2d.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@ using namespace rendering;
 Road2d::Road2d()
 {
   this->node = transport::NodePtr(new transport::Node());
-  this->node->Init("default");
+  this->node->Init();
   this->sub = this->node->Subscribe("~/roads", &Road2d::OnRoadMsg, this, true);
 
   this->connections.push_back(
@@ -247,15 +247,11 @@ void Road2d::Segment::Load(msgs::Road _msg)
       vBuf->lock(Ogre::HardwareBuffer::HBL_DISCARD));
 
   math::Vector3 pA, pB, tangent;
-  double factor = 1.0;
-  double theta = 0.0;
 
   math::Box bounds;
   bounds.min.Set(GZ_DBL_MAX, GZ_DBL_MAX, GZ_DBL_MAX);
   bounds.max.Set(GZ_DBL_MIN, GZ_DBL_MIN, GZ_DBL_MIN);
 
-  float texCoord = 0.0;
-
   // length for each texture tile, same as road width as texture is square
   // (if texture size should change or made custom in a future version
   // there needs to be code to handle this)
@@ -267,7 +263,7 @@ void Road2d::Segment::Load(msgs::Road _msg)
   // Generate the triangles for the road
   for (unsigned int i = 0; i < this->points.size(); ++i)
   {
-    factor = 1.0;
+    double factor = 1.0;
 
     // update current road length
     if (i > 0)
@@ -277,7 +273,7 @@ void Road2d::Segment::Load(msgs::Road _msg)
 
     // assign texture coordinate as percentage of texture tile size
     // and let ogre/opengl handle the texture wrapping
-    texCoord = curLen/texMaxLen;
+    float texCoord = curLen/texMaxLen;
 
     // Start point is a special case
     if (i == 0)
@@ -307,7 +303,7 @@ void Road2d::Segment::Load(msgs::Road _msg)
 
     // The tangent is used to calculate the two verteces to either side of
     // the point. The vertices define the triangle mesh of the road
-    theta = atan2(tangent.x, -tangent.y);
+    double theta = atan2(tangent.x, -tangent.y);
 
     pA = pB = this->points[i];
     double w = (this->width * factor) * 0.5;
diff --git a/gazebo/rendering/Road2d.hh b/gazebo/rendering/Road2d.hh
index 988fc63..60138cd 100644
--- a/gazebo/rendering/Road2d.hh
+++ b/gazebo/rendering/Road2d.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@
 #include "gazebo/math/Vector3.hh"
 #include "gazebo/math/Spline.hh"
 #include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -39,7 +40,7 @@ namespace gazebo
 
     /// \class Road Road.hh rendering/rendering.hh
     /// \brief Used to render a strip of road.
-    class Road2d
+    class GAZEBO_VISIBLE Road2d
     {
       /// \brief Constructor
       public: Road2d();
diff --git a/gazebo/rendering/Scene.cc b/gazebo/rendering/Scene.cc
index d7ef769..9e5ba81 100644
--- a/gazebo/rendering/Scene.cc
+++ b/gazebo/rendering/Scene.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,6 @@
 #include "gazebo/rendering/ogre_gazebo.h"
 
 #include "gazebo/msgs/msgs.hh"
-#include "gazebo/sdf/sdf.hh"
 
 #include "gazebo/common/Exception.hh"
 #include "gazebo/common/Assert.hh"
@@ -31,6 +30,8 @@
 #include "gazebo/rendering/Heightmap.hh"
 #include "gazebo/rendering/RenderEvents.hh"
 #include "gazebo/rendering/LaserVisual.hh"
+#include "gazebo/rendering/SonarVisual.hh"
+#include "gazebo/rendering/WrenchVisual.hh"
 #include "gazebo/rendering/CameraVisual.hh"
 #include "gazebo/rendering/JointVisual.hh"
 #include "gazebo/rendering/COMVisual.hh"
@@ -42,12 +43,13 @@
 #include "gazebo/rendering/UserCamera.hh"
 #include "gazebo/rendering/Camera.hh"
 #include "gazebo/rendering/DepthCamera.hh"
-// #include "gazebo/rendering/GpuLaser.hh"
+#include "gazebo/rendering/GpuLaser.hh"
 #include "gazebo/rendering/Grid.hh"
 #include "gazebo/rendering/DynamicLines.hh"
 #include "gazebo/rendering/RFIDVisual.hh"
 #include "gazebo/rendering/RFIDTagVisual.hh"
 #include "gazebo/rendering/VideoVisual.hh"
+#include "gazebo/rendering/TransmitterVisual.hh"
 
 #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8
 #include "gazebo/rendering/deferred_shading/SSAOLogic.hh"
@@ -57,11 +59,11 @@
 #include "gazebo/rendering/deferred_shading/DeferredLightCP.hh"
 #endif
 
-#include "rendering/RTShaderSystem.hh"
-#include "transport/Transport.hh"
-#include "transport/Node.hh"
+#include "gazebo/rendering/RTShaderSystem.hh"
+#include "gazebo/transport/TransportIface.hh"
+#include "gazebo/transport/Node.hh"
 
-#include "rendering/Scene.hh"
+#include "gazebo/rendering/Scene.hh"
 
 using namespace gazebo;
 using namespace rendering;
@@ -79,8 +81,14 @@ struct VisualMessageLess {
 
 
 //////////////////////////////////////////////////
-Scene::Scene(const std::string &_name, bool _enableVisualizations)
+Scene::Scene(const std::string &_name, bool _enableVisualizations,
+    bool _isServer)
 {
+  // \todo: This is a hack. There is no guarantee (other than the
+  // improbability of creating an extreme number of visuals), that
+  // this contactVisId is unique.
+  this->contactVisId = GZ_UINT32_MAX;
+
   this->initialized = false;
   this->showCOMs = false;
   this->showCollisions = false;
@@ -113,7 +121,17 @@ Scene::Scene(const std::string &_name, bool _enableVisualizations)
 
   this->lightSub = this->node->Subscribe("~/light", &Scene::OnLightMsg, this);
 
-  this->poseSub = this->node->Subscribe("~/pose/info", &Scene::OnPoseMsg, this);
+  if (_isServer)
+  {
+    this->poseSub = this->node->Subscribe("~/pose/local/info",
+        &Scene::OnPoseMsg, this);
+  }
+  else
+  {
+    this->poseSub = this->node->Subscribe("~/pose/info",
+        &Scene::OnPoseMsg, this);
+  }
+
   this->jointSub = this->node->Subscribe("~/joint", &Scene::OnJointMsg, this);
   this->skeletonPoseSub = this->node->Subscribe("~/skeleton_pose/info",
           &Scene::OnSkeletonPoseMsg, this);
@@ -132,15 +150,17 @@ Scene::Scene(const std::string &_name, bool _enableVisualizations)
   // scene_info
   // this->responsePub = this->node->Advertise<msgs::Response>("~/response");
   this->responseSub = this->node->Subscribe("~/response",
-      &Scene::OnResponse, this);
+      &Scene::OnResponse, this, true);
   this->sceneSub = this->node->Subscribe("~/scene", &Scene::OnScene, this);
 
-
   this->sdf.reset(new sdf::Element);
   sdf::initFile("scene.sdf", this->sdf);
 
   this->terrain = NULL;
   this->selectedVis.reset();
+
+  this->sceneSimTimePosesApplied = common::Time();
+  this->sceneSimTimePosesReceived = common::Time();
 }
 
 //////////////////////////////////////////////////
@@ -152,14 +172,21 @@ void Scene::Clear()
   this->poseMsgs.clear();
   this->sceneMsgs.clear();
   this->jointMsgs.clear();
+  this->joints.clear();
   this->linkMsgs.clear();
   this->cameras.clear();
   this->userCameras.clear();
   this->lights.clear();
 
+  delete this->terrain;
+  this->terrain = NULL;
+
+  // Erase the world visual
+  this->visuals.erase(this->visuals.begin());
 
-  while (this->visuals.size() > 0)
-    this->RemoveVisual(this->visuals.begin()->second);
+  while (!this->visuals.empty())
+    if (this->visuals.begin()->second)
+      this->RemoveVisual(this->visuals.begin()->second);
   this->visuals.clear();
 
   for (uint32_t i = 0; i < this->grids.size(); i++)
@@ -168,6 +195,8 @@ void Scene::Clear()
 
   this->sensorMsgs.clear();
   RTShaderSystem::Instance()->Clear();
+
+  this->initialized = false;
 }
 
 //////////////////////////////////////////////////
@@ -189,6 +218,7 @@ Scene::~Scene()
   Visual_M::iterator iter;
   this->visuals.clear();
   this->jointMsgs.clear();
+  this->joints.clear();
   this->linkMsgs.clear();
   this->sceneMsgs.clear();
   this->poseMsgs.clear();
@@ -206,7 +236,12 @@ Scene::~Scene()
     delete this->grids[i];
   this->grids.clear();
 
+  for (unsigned int i = 0; i < this->cameras.size(); ++i)
+    this->cameras[i].reset();
   this->cameras.clear();
+
+  for (unsigned int i = 0; i < this->userCameras.size(); ++i)
+    this->userCameras[i].reset();
   this->userCameras.clear();
 
   if (this->manager)
@@ -238,6 +273,11 @@ void Scene::Load()
 
   this->manager = root->createSceneManager(Ogre::ST_GENERIC);
   this->manager->setAmbientLight(Ogre::ColourValue(0.1, 0.1, 0.1, 0.1));
+
+#if OGRE_VERSION_MAJOR > 1 || OGRE_VERSION_MINOR >= 9
+  this->manager->addRenderQueueListener(
+      RenderEngine::Instance()->GetOverlaySystem());
+#endif
 }
 
 //////////////////////////////////////////////////
@@ -250,6 +290,8 @@ VisualPtr Scene::GetWorldVisual() const
 void Scene::Init()
 {
   this->worldVisual.reset(new Visual("__world_node__", shared_from_this()));
+  this->worldVisual->SetId(0);
+  this->visuals[0] = this->worldVisual;
 
   // RTShader system self-enables if the render path type is FORWARD,
   RTShaderSystem::Instance()->AddScene(shared_from_this());
@@ -261,17 +303,26 @@ void Scene::Init()
   for (uint32_t i = 0; i < this->grids.size(); i++)
     this->grids[i]->Init();
 
-  this->SetSky();
+  // Create Sky. This initializes SkyX, and makes it invisible. A Sky
+  // message must be received (via a scene message or on the ~/sky topic).
+  try
+  {
+    this->SetSky();
+  }
+  catch(...)
+  {
+    gzerr << "Failed to create the sky\n";
+  }
 
   // Create Fog
   if (this->sdf->HasElement("fog"))
   {
     boost::shared_ptr<sdf::Element> fogElem = this->sdf->GetElement("fog");
-    this->SetFog(fogElem->GetValueString("type"),
-                 fogElem->GetValueColor("color"),
-                 fogElem->GetValueDouble("density"),
-                 fogElem->GetValueDouble("start"),
-                 fogElem->GetValueDouble("end"));
+    this->SetFog(fogElem->Get<std::string>("type"),
+                 fogElem->Get<common::Color>("color"),
+                 fogElem->Get<double>("density"),
+                 fogElem->Get<double>("start"),
+                 fogElem->Get<double>("end"));
   }
 
   // Create ray scene query
@@ -282,13 +333,12 @@ void Scene::Init()
   // Force shadows on.
   this->SetShadowsEnabled(true);
 
+  this->requestPub->WaitForConnection();
   this->requestMsg = msgs::CreateRequest("scene_info");
   this->requestPub->Publish(*this->requestMsg);
 
   Road2d *road = new Road2d();
   road->Load(this->worldVisual);
-
-  this->initialized = true;
 }
 
 //////////////////////////////////////////////////
@@ -300,7 +350,7 @@ bool Scene::GetInitialized() const
 //////////////////////////////////////////////////
 void Scene::InitDeferredShading()
 {
-#if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8
+#if OGRE_VERSION_MAJOR > 1 || OGRE_VERSION_MINOR >= 8
   Ogre::CompositorManager &compMgr = Ogre::CompositorManager::getSingleton();
 
   // Deferred Shading scheme handler
@@ -386,7 +436,7 @@ void Scene::SetAmbientColor(const common::Color &_color)
 //////////////////////////////////////////////////
 common::Color Scene::GetAmbientColor() const
 {
-  return this->sdf->GetValueColor("ambient");
+  return this->sdf->Get<common::Color>("ambient");
 }
 
 //////////////////////////////////////////////////
@@ -418,7 +468,7 @@ void Scene::SetBackgroundColor(const common::Color &_color)
 //////////////////////////////////////////////////
 common::Color Scene::GetBackgroundColor() const
 {
-  return this->sdf->GetValueColor("background");
+  return this->sdf->Get<common::Color>("background");
 }
 
 //////////////////////////////////////////////////
@@ -454,8 +504,7 @@ uint32_t Scene::GetGridCount() const
 //////////////////////////////////////////////////
 CameraPtr Scene::CreateCamera(const std::string &_name, bool _autoRender)
 {
-  CameraPtr camera(new Camera(this->name + "::" + _name,
-        shared_from_this(), _autoRender));
+  CameraPtr camera(new Camera(_name, shared_from_this(), _autoRender));
   this->cameras.push_back(camera);
 
   return camera;
@@ -473,15 +522,15 @@ DepthCameraPtr Scene::CreateDepthCamera(const std::string &_name,
 }
 
 //////////////////////////////////////////////////
-/*GpuLaserPtr Scene::CreateGpuLaser(const std::string &_name,
+GpuLaserPtr Scene::CreateGpuLaser(const std::string &_name,
                                         bool _autoRender)
 {
   GpuLaserPtr camera(new GpuLaser(this->name + "::" + _name,
-        this, _autoRender));
+        shared_from_this(), _autoRender));
   this->cameras.push_back(camera);
 
   return camera;
-}*/
+}
 
 //////////////////////////////////////////////////
 uint32_t Scene::GetCameraCount() const
@@ -515,10 +564,9 @@ CameraPtr Scene::GetCamera(const std::string &_name) const
 }
 
 //////////////////////////////////////////////////
-UserCameraPtr Scene::CreateUserCamera(const std::string &name_)
+UserCameraPtr Scene::CreateUserCamera(const std::string &_name)
 {
-  UserCameraPtr camera(new UserCamera(this->GetName() + "::" + name_,
-                       shared_from_this()));
+  UserCameraPtr camera(new UserCamera(_name, shared_from_this()));
   camera->Load();
   camera->Init();
   this->userCameras.push_back(camera);
@@ -544,6 +592,22 @@ UserCameraPtr Scene::GetUserCamera(uint32_t index) const
 }
 
 //////////////////////////////////////////////////
+void Scene::RemoveCamera(const std::string &_name)
+{
+  std::vector<CameraPtr>::iterator iter;
+  for (iter = this->cameras.begin(); iter != this->cameras.end(); ++iter)
+  {
+    if ((*iter)->GetName() == _name)
+    {
+      (*iter)->Fini();
+      (*iter).reset();
+      this->cameras.erase(iter);
+      break;
+    }
+  }
+}
+
+//////////////////////////////////////////////////
 LightPtr Scene::GetLight(const std::string &_name) const
 {
   LightPtr result;
@@ -580,15 +644,33 @@ LightPtr Scene::GetLight(uint32_t _index) const
 }
 
 //////////////////////////////////////////////////
+VisualPtr Scene::GetVisual(uint32_t _id) const
+{
+  Visual_M::const_iterator iter = this->visuals.find(_id);
+  if (iter != this->visuals.end())
+    return iter->second;
+  return VisualPtr();
+}
+
+//////////////////////////////////////////////////
 VisualPtr Scene::GetVisual(const std::string &_name) const
 {
   VisualPtr result;
-  Visual_M::const_iterator iter = this->visuals.find(_name);
+
+  Visual_M::const_iterator iter;
+  for (iter = this->visuals.begin(); iter != this->visuals.end(); ++iter)
+    if (iter->second->GetName() == _name)
+      break;
+
   if (iter != this->visuals.end())
     result = iter->second;
   else
   {
-    iter = this->visuals.find(this->GetName() + "::" + _name);
+    std::string otherName = this->GetName() + "::" + _name;
+    for (iter = this->visuals.begin(); iter != this->visuals.end(); ++iter)
+      if (iter->second->GetName() == otherName)
+        break;
+
     if (iter != this->visuals.end())
       result = iter->second;
   }
@@ -597,6 +679,12 @@ VisualPtr Scene::GetVisual(const std::string &_name) const
 }
 
 //////////////////////////////////////////////////
+uint32_t Scene::GetVisualCount() const
+{
+  return this->visuals.size();
+}
+
+//////////////////////////////////////////////////
 void Scene::SelectVisual(const std::string &_name, const std::string &_mode)
 {
   this->selectedVis = this->GetVisual(_name);
@@ -776,13 +864,13 @@ void Scene::GetVisualsBelowPoint(const math::Vector3 &_pt,
       if (iter->movable->getName().substr(0, 15) == "__SELECTION_OBJ")
         continue;
 
-      Ogre::Entity *pentity = static_cast<Ogre::Entity*>(iter->movable);
-      if (pentity)
+      Ogre::Entity *ogreEntity = static_cast<Ogre::Entity*>(iter->movable);
+      if (ogreEntity)
       {
         try
         {
           VisualPtr v = this->GetVisual(Ogre::any_cast<std::string>(
-                                        pentity->getUserAny()));
+                                        ogreEntity->getUserAny()));
           if (v)
             _visuals.push_back(v);
         }
@@ -853,7 +941,7 @@ Ogre::Entity *Scene::GetOgreEntityAt(CameraPtr _camera,
           iter->movable->getName().substr(0, 15) == "__SELECTION_OBJ")
         continue;
 
-      Ogre::Entity *pentity = static_cast<Ogre::Entity*>(iter->movable);
+      Ogre::Entity *ogreEntity = static_cast<Ogre::Entity*>(iter->movable);
 
       // mesh data to retrieve
       size_t vertex_count;
@@ -862,11 +950,11 @@ Ogre::Entity *Scene::GetOgreEntityAt(CameraPtr _camera,
       uint64_t *indices;
 
       // Get the mesh information
-      this->GetMeshInformation(pentity->getMesh().get(), vertex_count,
+      this->GetMeshInformation(ogreEntity->getMesh().get(), vertex_count,
           vertices, index_count, indices,
-          pentity->getParentNode()->_getDerivedPosition(),
-          pentity->getParentNode()->_getDerivedOrientation(),
-          pentity->getParentNode()->_getDerivedScale());
+          ogreEntity->getParentNode()->_getDerivedPosition(),
+          ogreEntity->getParentNode()->_getDerivedOrientation(),
+          ogreEntity->getParentNode()->_getDerivedScale());
 
       bool new_closest_found = false;
       for (int i = 0; i < static_cast<int>(index_count); i += 3)
@@ -899,7 +987,7 @@ Ogre::Entity *Scene::GetOgreEntityAt(CameraPtr _camera,
 
       if (new_closest_found)
       {
-        closestEntity = pentity;
+        closestEntity = ogreEntity;
         // break;
       }
     }
@@ -941,13 +1029,14 @@ bool Scene::GetFirstContact(CameraPtr _camera,
     if (iter->distance <= 0.0)
       continue;
 
-    // Only accept a hit if there is a movable object, and it's and Entity.
+    unsigned int flags = iter->movable->getVisibilityFlags();
+
+    // Only accept a hit if there is an entity and not a gui visual
     if (iter->movable &&
         iter->movable->getMovableType().compare("Entity") == 0 &&
-        iter->movable->getName().find("OrbitViewController")
-        == std::string::npos)
+        !(flags != GZ_VISIBILITY_ALL && flags & GZ_VISIBILITY_GUI))
     {
-      Ogre::Entity *pentity = static_cast<Ogre::Entity*>(iter->movable);
+      Ogre::Entity *ogreEntity = static_cast<Ogre::Entity*>(iter->movable);
 
       // mesh data to retrieve
       size_t vertexCount;
@@ -956,11 +1045,11 @@ bool Scene::GetFirstContact(CameraPtr _camera,
       uint64_t *indices;
 
       // Get the mesh information
-      this->GetMeshInformation(pentity->getMesh().get(), vertexCount,
+      this->GetMeshInformation(ogreEntity->getMesh().get(), vertexCount,
           vertices, indexCount, indices,
-          pentity->getParentNode()->_getDerivedPosition(),
-          pentity->getParentNode()->_getDerivedOrientation(),
-          pentity->getParentNode()->_getDerivedScale());
+          ogreEntity->getParentNode()->_getDerivedPosition(),
+          ogreEntity->getParentNode()->_getDerivedOrientation(),
+          ogreEntity->getParentNode()->_getDerivedScale());
 
       for (int i = 0; i < static_cast<int>(indexCount); i += 3)
       {
@@ -1268,14 +1357,24 @@ void Scene::GetMeshInformation(const Ogre::Mesh *mesh,
 }
 
 /////////////////////////////////////////////////
-void Scene::ProcessSceneMsg(ConstScenePtr &_msg)
+bool Scene::ProcessSceneMsg(ConstScenePtr &_msg)
 {
-  for (int i = 0; i < _msg->model_size(); i++)
   {
-    this->poseMsgs.push_front(_msg->model(i).pose());
-    this->poseMsgs.front().set_name(_msg->model(i).name());
+    boost::recursive_mutex::scoped_lock lock(this->poseMsgMutex);
+    for (int i = 0; i < _msg->model_size(); i++)
+    {
+      PoseMsgs_M::iterator iter = this->poseMsgs.find(_msg->model(i).id());
+      if (iter != this->poseMsgs.end())
+        iter->second.CopyFrom(_msg->model(i).pose());
+      else
+        this->poseMsgs.insert(
+            std::make_pair(_msg->model(i).id(), _msg->model(i).pose()));
 
-    this->ProcessModelMsg(_msg->model(i));
+      this->poseMsgs[_msg->model(i).id()].set_name(_msg->model(i).name());
+      this->poseMsgs[_msg->model(i).id()].set_id(_msg->model(i).id());
+
+      this->ProcessModelMsg(_msg->model(i));
+    }
   }
 
   for (int i = 0; i < _msg->light_size(); i++)
@@ -1302,6 +1401,13 @@ void Scene::ProcessSceneMsg(ConstScenePtr &_msg)
   if (_msg->has_grid())
     this->SetGrid(_msg->grid());
 
+  // Process the sky message.
+  if (_msg->has_sky())
+  {
+    boost::shared_ptr<msgs::Sky> sm(new msgs::Sky(_msg->sky()));
+    this->OnSkyMsg(sm);
+  }
+
   if (_msg->has_fog())
   {
     sdf::ElementPtr elem = this->sdf->GetElement("fog");
@@ -1334,12 +1440,14 @@ void Scene::ProcessSceneMsg(ConstScenePtr &_msg)
       elem->GetElement("type")->Set(type);
     }
 
-    this->SetFog(elem->GetValueString("type"),
-                 elem->GetValueColor("color"),
-                 elem->GetValueDouble("density"),
-                 elem->GetValueDouble("start"),
-                 elem->GetValueDouble("end"));
+    this->SetFog(elem->Get<std::string>("type"),
+                 elem->Get<common::Color>("color"),
+                 elem->Get<double>("density"),
+                 elem->Get<double>("start"),
+                 elem->Get<double>("end"));
   }
+
+  return true;
 }
 
 //////////////////////////////////////////////////
@@ -1355,18 +1463,54 @@ bool Scene::ProcessModelMsg(const msgs::Model &_msg)
     this->visualMsgs.push_back(vm);
   }
 
+  // Set the scale of the model visual
+  if (_msg.has_scale())
+  {
+    // update scale using a visual msg
+    boost::shared_ptr<msgs::Visual> vm(new msgs::Visual);
+    if (_msg.has_id())
+      vm->set_id(_msg.id());
+    if (_msg.has_name())
+      vm->set_name(_msg.name());
+    vm->mutable_scale()->set_x(_msg.scale().x());
+    vm->mutable_scale()->set_y(_msg.scale().y());
+    vm->mutable_scale()->set_z(_msg.scale().z());
+    this->visualMsgs.push_back(vm);
+  }
+
   for (int j = 0; j < _msg.joint_size(); j++)
   {
     boost::shared_ptr<msgs::Joint> jm(new msgs::Joint(
           _msg.joint(j)));
     this->jointMsgs.push_back(jm);
+
+    for (int k = 0; k < _msg.joint(j).sensor_size(); k++)
+    {
+      boost::shared_ptr<msgs::Sensor> sm(new msgs::Sensor(
+            _msg.joint(j).sensor(k)));
+      this->sensorMsgs.push_back(sm);
+    }
   }
 
   for (int j = 0; j < _msg.link_size(); j++)
   {
     linkName = modelName + _msg.link(j).name();
-    this->poseMsgs.push_front(_msg.link(j).pose());
-    this->poseMsgs.front().set_name(linkName);
+
+    {
+      boost::recursive_mutex::scoped_lock lock(this->poseMsgMutex);
+      if (_msg.link(j).has_pose())
+      {
+        PoseMsgs_M::iterator iter = this->poseMsgs.find(_msg.link(j).id());
+        if (iter != this->poseMsgs.end())
+          iter->second.CopyFrom(_msg.link(j).pose());
+        else
+          this->poseMsgs.insert(
+              std::make_pair(_msg.link(j).id(), _msg.link(j).pose()));
+
+        this->poseMsgs[_msg.link(j).id()].set_name(linkName);
+        this->poseMsgs[_msg.link(j).id()].set_id(_msg.link(j).id());
+      }
+    }
 
     if (_msg.link(j).has_inertial())
     {
@@ -1461,153 +1605,229 @@ void Scene::PreRender()
   else
     first = false;
   */
-  boost::mutex::scoped_lock lock(*this->receiveMutex);
 
   static RequestMsgs_L::iterator rIter;
   static SceneMsgs_L::iterator sIter;
   static ModelMsgs_L::iterator modelIter;
-  static VisualMsgs_L::iterator vIter;
-  static LightMsgs_L::iterator lIter;
-  static PoseMsgs_L::iterator pIter;
+  static VisualMsgs_L::iterator visualIter;
+  static LightMsgs_L::iterator lightIter;
+  static PoseMsgs_M::iterator pIter;
   static SkeletonPoseMsgs_L::iterator spIter;
-  static JointMsgs_L::iterator jIter;
+  static JointMsgs_L::iterator jointIter;
   static SensorMsgs_L::iterator sensorIter;
   static LinkMsgs_L::iterator linkIter;
 
+  SceneMsgs_L sceneMsgsCopy;
+  ModelMsgs_L modelMsgsCopy;
+  SensorMsgs_L sensorMsgsCopy;
+  LightMsgs_L lightMsgsCopy;
+  VisualMsgs_L visualMsgsCopy;
+  JointMsgs_L jointMsgsCopy;
+  LinkMsgs_L linkMsgsCopy;
+
+  {
+    boost::mutex::scoped_lock lock(*this->receiveMutex);
+
+    std::copy(this->sceneMsgs.begin(), this->sceneMsgs.end(),
+              std::back_inserter(sceneMsgsCopy));
+    this->sceneMsgs.clear();
+
+    std::copy(this->modelMsgs.begin(), this->modelMsgs.end(),
+              std::back_inserter(modelMsgsCopy));
+    this->modelMsgs.clear();
+
+    std::copy(this->sensorMsgs.begin(), this->sensorMsgs.end(),
+              std::back_inserter(sensorMsgsCopy));
+    this->sensorMsgs.clear();
+
+    std::copy(this->lightMsgs.begin(), this->lightMsgs.end(),
+              std::back_inserter(lightMsgsCopy));
+    this->lightMsgs.clear();
+
+    this->visualMsgs.sort(VisualMessageLessOp);
+    std::copy(this->visualMsgs.begin(), this->visualMsgs.end(),
+              std::back_inserter(visualMsgsCopy));
+    this->visualMsgs.clear();
+
+    std::copy(this->jointMsgs.begin(), this->jointMsgs.end(),
+              std::back_inserter(jointMsgsCopy));
+    this->jointMsgs.clear();
+
+    std::copy(this->linkMsgs.begin(), this->linkMsgs.end(),
+              std::back_inserter(linkMsgsCopy));
+    this->linkMsgs.clear();
+  }
+
   // Process the scene messages. DO THIS FIRST
-  for (sIter = this->sceneMsgs.begin();
-       sIter != this->sceneMsgs.end(); ++sIter)
+  for (sIter = sceneMsgsCopy.begin(); sIter != sceneMsgsCopy.end();)
   {
-    this->ProcessSceneMsg(*sIter);
+    if (this->ProcessSceneMsg(*sIter))
+    {
+      if (!this->initialized)
+        RTShaderSystem::Instance()->UpdateShaders();
+      this->initialized = true;
+      sceneMsgsCopy.erase(sIter++);
+    }
+    else
+      ++sIter;
   }
-  this->sceneMsgs.clear();
 
-  modelIter = this->modelMsgs.begin();
-  while (modelIter != this->modelMsgs.end())
+  // Process the model messages.
+  for (modelIter = modelMsgsCopy.begin(); modelIter != modelMsgsCopy.end();)
   {
     if (this->ProcessModelMsg(**modelIter))
-      this->modelMsgs.erase(modelIter++);
+      modelMsgsCopy.erase(modelIter++);
     else
       ++modelIter;
   }
 
-  sensorIter = this->sensorMsgs.begin();
-  while (sensorIter != this->sensorMsgs.end())
+  // Process the sensor messages.
+  for (sensorIter = sensorMsgsCopy.begin(); sensorIter != sensorMsgsCopy.end();)
   {
     if (this->ProcessSensorMsg(*sensorIter))
-      this->sensorMsgs.erase(sensorIter++);
+      sensorMsgsCopy.erase(sensorIter++);
     else
       ++sensorIter;
   }
 
-  // Process the light messages
-  for (lIter =  this->lightMsgs.begin();
-       lIter != this->lightMsgs.end(); ++lIter)
+  // Process the light messages.
+  for (lightIter = lightMsgsCopy.begin(); lightIter != lightMsgsCopy.end();)
   {
-    this->ProcessLightMsg(*lIter);
+    if (this->ProcessLightMsg(*lightIter))
+      lightMsgsCopy.erase(lightIter++);
+    else
+      ++lightIter;
   }
-  this->lightMsgs.clear();
 
-  // Process the visual messages
-  this->visualMsgs.sort(VisualMessageLessOp);
-  vIter = this->visualMsgs.begin();
-  while (vIter != this->visualMsgs.end())
+  // Process the visual messages.
+  for (visualIter = visualMsgsCopy.begin(); visualIter != visualMsgsCopy.end();)
   {
-    if (this->ProcessVisualMsg(*vIter))
-      this->visualMsgs.erase(vIter++);
+    if (this->ProcessVisualMsg(*visualIter))
+      visualMsgsCopy.erase(visualIter++);
     else
-      ++vIter;
+      ++visualIter;
   }
 
-  // Process all the model messages last. Remove pose message from the list
-  // only when a corresponding visual exits. We may receive pose updates
-  // over the wire before  we recieve the visual
-  pIter = this->poseMsgs.begin();
-  while (pIter != this->poseMsgs.end())
+  // Process the joint messages.
+  for (jointIter = jointMsgsCopy.begin(); jointIter != jointMsgsCopy.end();)
   {
-    Visual_M::iterator iter = this->visuals.find((*pIter).name());
-    if (iter != this->visuals.end() && iter->second)
-    {
-      // If an object is selected, don't let the physics engine move it.
-      if (!this->selectedVis || this->selectionMode != "move" ||
-          iter->first.find(this->selectedVis->GetName()) == std::string::npos)
-      {
-        math::Pose pose = msgs::Convert(*pIter);
-        GZ_ASSERT(iter->second, "Visual pointer is NULL");
-        iter->second->SetPose(pose);
-        PoseMsgs_L::iterator prev = pIter++;
-        this->poseMsgs.erase(prev);
-      }
-      else
-        ++pIter;
-    }
+    if (this->ProcessJointMsg(*jointIter))
+      jointMsgsCopy.erase(jointIter++);
     else
-      ++pIter;
+      ++jointIter;
   }
 
-  // process skeleton pose msgs
-  spIter = this->skeletonPoseMsgs.begin();
-  while (spIter != this->skeletonPoseMsgs.end())
+  // Process the link messages.
+  for (linkIter = linkMsgsCopy.begin(); linkIter != linkMsgsCopy.end();)
   {
-    Visual_M::iterator iter = this->visuals.find((*spIter)->model_name());
-    for (int i = 0; i < (*spIter)->pose_size(); i++)
-    {
-      const msgs::Pose& pose_msg = (*spIter)->pose(i);
-      Visual_M::iterator iter2 = this->visuals.find(pose_msg.name());
-      if (iter2 != this->visuals.end())
-      {
-        // If an object is selected, don't let the physics engine move it.
-        if (!this->selectedVis || this->selectionMode != "move" ||
-          iter->first.find(this->selectedVis->GetName()) == std::string::npos)
-        {
-          math::Pose pose = msgs::Convert(pose_msg);
-          iter2->second->SetPose(pose);
-        }
-      }
-    }
-
-    if (iter != this->visuals.end())
-    {
-      iter->second->SetSkeletonPose(*(*spIter).get());
-      SkeletonPoseMsgs_L::iterator prev = spIter++;
-      this->skeletonPoseMsgs.erase(prev);
-    }
+    if (this->ProcessLinkMsg(*linkIter))
+      linkMsgsCopy.erase(linkIter++);
     else
-      ++spIter;
+      ++linkIter;
   }
 
   // Process the request messages
   for (rIter =  this->requestMsgs.begin();
-       rIter != this->requestMsgs.end(); ++rIter)
+      rIter != this->requestMsgs.end(); ++rIter)
   {
     this->ProcessRequestMsg(*rIter);
   }
   this->requestMsgs.clear();
 
-  // Process the joint messages
-  jIter = this->jointMsgs.begin();
-  while (jIter != this->jointMsgs.end())
-  {
-    if (this->ProcessJointMsg(*jIter))
-      this->jointMsgs.erase(jIter++);
-    else
-      ++jIter;
-  }
 
-  // Process the link messages
-  linkIter = this->linkMsgs.begin();
-  while (linkIter != this->linkMsgs.end())
   {
-    if (this->ProcessLinkMsg(*linkIter))
-      this->linkMsgs.erase(linkIter++);
-    else
-      ++linkIter;
+    boost::mutex::scoped_lock lock(*this->receiveMutex);
+
+    std::copy(sceneMsgsCopy.begin(), sceneMsgsCopy.end(),
+        std::front_inserter(this->sceneMsgs));
+
+    std::copy(modelMsgsCopy.begin(), modelMsgsCopy.end(),
+        std::front_inserter(this->modelMsgs));
+
+    std::copy(sensorMsgsCopy.begin(), sensorMsgsCopy.end(),
+        std::front_inserter(this->sensorMsgs));
+
+    std::copy(lightMsgsCopy.begin(), lightMsgsCopy.end(),
+        std::front_inserter(this->lightMsgs));
+
+    std::copy(visualMsgsCopy.begin(), visualMsgsCopy.end(),
+        std::front_inserter(this->visualMsgs));
+
+    std::copy(jointMsgsCopy.begin(), jointMsgsCopy.end(),
+        std::front_inserter(this->jointMsgs));
+
+    std::copy(linkMsgsCopy.begin(), linkMsgsCopy.end(),
+        std::front_inserter(this->linkMsgs));
   }
 
-  if (this->selectionMsg)
   {
-    this->SelectVisual(this->selectionMsg->name(), "normal");
-    this->selectionMsg.reset();
+    boost::recursive_mutex::scoped_lock lock(this->poseMsgMutex);
+
+    // Process all the model messages last. Remove pose message from the list
+    // only when a corresponding visual exits. We may receive pose updates
+    // over the wire before  we recieve the visual
+    pIter = this->poseMsgs.begin();
+    while (pIter != this->poseMsgs.end())
+    {
+      Visual_M::iterator iter = this->visuals.find(pIter->first);
+      if (iter != this->visuals.end() && iter->second)
+      {
+        // If an object is selected, don't let the physics engine move it.
+        if (!this->selectedVis || this->selectionMode != "move" ||
+            iter->first != this->selectedVis->GetId())
+        {
+          math::Pose pose = msgs::Convert(pIter->second);
+          GZ_ASSERT(iter->second, "Visual pointer is NULL");
+          iter->second->SetPose(pose);
+          PoseMsgs_M::iterator prev = pIter++;
+          this->poseMsgs.erase(prev);
+        }
+        else
+          ++pIter;
+      }
+      else
+        ++pIter;
+    }
+
+    // process skeleton pose msgs
+    spIter = this->skeletonPoseMsgs.begin();
+    while (spIter != this->skeletonPoseMsgs.end())
+    {
+      Visual_M::iterator iter = this->visuals.find((*spIter)->model_id());
+      for (int i = 0; i < (*spIter)->pose_size(); i++)
+      {
+        const msgs::Pose& pose_msg = (*spIter)->pose(i);
+        Visual_M::iterator iter2 = this->visuals.find(pose_msg.id());
+        if (iter2 != this->visuals.end())
+        {
+          // If an object is selected, don't let the physics engine move it.
+          if (!this->selectedVis || this->selectionMode != "move" ||
+              iter->first != this->selectedVis->GetId())
+          {
+            math::Pose pose = msgs::Convert(pose_msg);
+            iter2->second->SetPose(pose);
+          }
+        }
+      }
+
+      if (iter != this->visuals.end())
+      {
+        iter->second->SetSkeletonPose(*(*spIter).get());
+        SkeletonPoseMsgs_L::iterator prev = spIter++;
+        this->skeletonPoseMsgs.erase(prev);
+      }
+      else
+        ++spIter;
+    }
+
+    // official time stamp of approval
+    this->sceneSimTimePosesApplied = this->sceneSimTimePosesReceived;
+
+    if (this->selectionMsg)
+    {
+      this->SelectVisual(this->selectionMsg->name(), "normal");
+      this->selectionMsg.reset();
+    }
   }
 }
 
@@ -1624,24 +1844,67 @@ bool Scene::ProcessSensorMsg(ConstSensorPtr &_msg)
   if (!this->enableVisualizations)
     return true;
 
-  if (_msg->type() == "ray" && _msg->visualize() && !_msg->topic().empty())
+  if ((_msg->type() == "ray" || _msg->type() == "gpu_ray") && _msg->visualize()
+      && !_msg->topic().empty())
   {
     std::string rayVisualName = _msg->parent() + "::" + _msg->name();
-    if (!this->visuals[rayVisualName+"_laser_vis"])
+    if (this->visuals.find(_msg->id()) == this->visuals.end())
     {
-      VisualPtr parentVis = this->GetVisual(_msg->parent());
+      VisualPtr parentVis = this->GetVisual(_msg->parent_id());
       if (!parentVis)
         return false;
 
       LaserVisualPtr laserVis(new LaserVisual(
             rayVisualName+"_GUIONLY_laser_vis", parentVis, _msg->topic()));
       laserVis->Load();
-      this->visuals[rayVisualName+"_laser_vis"] = laserVis;
+      laserVis->SetId(_msg->id());
+      this->visuals[_msg->id()] = laserVis;
+    }
+  }
+  else if ((_msg->type() == "sonar") && _msg->visualize()
+      && !_msg->topic().empty())
+  {
+    std::string sonarVisualName = _msg->parent() + "::" + _msg->name();
+    if (this->visuals.find(_msg->id()) == this->visuals.end())
+    {
+      VisualPtr parentVis = this->GetVisual(_msg->parent());
+      if (!parentVis)
+        return false;
+
+      SonarVisualPtr sonarVis(new SonarVisual(
+            sonarVisualName+"_GUIONLY_sonar_vis", parentVis, _msg->topic()));
+      sonarVis->Load();
+      sonarVis->SetId(_msg->id());
+      this->visuals[_msg->id()] = sonarVis;
+    }
+  }
+  else if ((_msg->type() == "force_torque") && _msg->visualize()
+      && !_msg->topic().empty())
+  {
+    std::string wrenchVisualName = _msg->parent() + "::" + _msg->name();
+    if (this->visuals.find(_msg->id()) == this->visuals.end())
+    {
+      ConstJointPtr jointMsg = this->joints[_msg->parent()];
+
+      if (!jointMsg)
+        return false;
+
+      VisualPtr parentVis = this->GetVisual(jointMsg->child());
+
+      if (!parentVis)
+        return false;
+
+      WrenchVisualPtr wrenchVis(new WrenchVisual(
+            wrenchVisualName+"_GUIONLY_wrench_vis", parentVis,
+            _msg->topic()));
+      wrenchVis->Load(jointMsg);
+      wrenchVis->SetId(_msg->id());
+      this->visuals[_msg->id()] = wrenchVis;
     }
   }
   else if (_msg->type() == "camera" && _msg->visualize())
   {
-    VisualPtr parentVis = this->GetVisual(_msg->parent());
+    VisualPtr parentVis = this->GetVisual(_msg->parent_id());
     if (!parentVis)
       return false;
 
@@ -1649,25 +1912,36 @@ bool Scene::ProcessSensorMsg(ConstSensorPtr &_msg)
     if (_msg->camera().image_size().x() > 0 &&
         _msg->camera().image_size().y() > 0)
     {
-      CameraVisualPtr cameraVis(new CameraVisual(
-            _msg->name()+"_GUIONLY_camera_vis", parentVis));
+      Visual_M::iterator iter = this->visuals.find(_msg->id());
+      if (iter == this->visuals.end())
+      {
+        CameraVisualPtr cameraVis(new CameraVisual(
+              _msg->name()+"_GUIONLY_camera_vis", parentVis));
+
+        // need to call AttachVisual in order for cameraVis to be added to
+        // parentVis' children list so that it can be properly deleted.
+        parentVis->AttachVisual(cameraVis);
 
-      cameraVis->SetPose(msgs::Convert(_msg->pose()));
+        cameraVis->SetPose(msgs::Convert(_msg->pose()));
 
-      cameraVis->Load(_msg->camera().image_size().x(),
-                      _msg->camera().image_size().y());
+        cameraVis->SetId(_msg->id());
+        cameraVis->Load(_msg->camera().image_size().x(),
+            _msg->camera().image_size().y());
 
-      this->visuals[cameraVis->GetName()] = cameraVis;
+        this->visuals[cameraVis->GetId()] = cameraVis;
+      }
     }
   }
   else if (_msg->type() == "contact" && _msg->visualize() &&
            !_msg->topic().empty())
   {
     ContactVisualPtr contactVis(new ContactVisual(
-          _msg->name()+"_GUIONLY_contact_vis",
+          _msg->name()+"__GUIONLY_CONTACT_VISUAL__",
           this->worldVisual, _msg->topic()));
+    contactVis->SetId(_msg->id());
 
-    this->visuals[contactVis->GetName()] = contactVis;
+    this->contactVisId = _msg->id();
+    this->visuals[contactVis->GetId()] = contactVis;
   }
   else if (_msg->type() == "rfidtag" && _msg->visualize() &&
            !_msg->topic().empty())
@@ -1678,8 +1952,9 @@ bool Scene::ProcessSensorMsg(ConstSensorPtr &_msg)
 
     RFIDTagVisualPtr rfidVis(new RFIDTagVisual(
           _msg->name() + "_GUIONLY_rfidtag_vis", parentVis, _msg->topic()));
+    rfidVis->SetId(_msg->id());
 
-    this->visuals[rfidVis->GetName()] = rfidVis;
+    this->visuals[rfidVis->GetId()] = rfidVis;
   }
   else if (_msg->type() == "rfid" && _msg->visualize() &&
            !_msg->topic().empty())
@@ -1690,7 +1965,20 @@ bool Scene::ProcessSensorMsg(ConstSensorPtr &_msg)
 
     RFIDVisualPtr rfidVis(new RFIDVisual(
           _msg->name() + "_GUIONLY_rfid_vis", parentVis, _msg->topic()));
-    this->visuals[rfidVis->GetName()] = rfidVis;
+    rfidVis->SetId(_msg->id());
+    this->visuals[rfidVis->GetId()] = rfidVis;
+  }
+  else if (_msg->type() == "wireless_transmitter" && _msg->visualize() &&
+           !_msg->topic().empty())
+  {
+    VisualPtr parentVis = this->GetVisual(_msg->parent());
+    if (!parentVis)
+      return false;
+
+    VisualPtr transmitterVis(new TransmitterVisual(
+          _msg->name() + "_GUIONLY_transmitter_vis", parentVis, _msg->topic()));
+    this->visuals[transmitterVis->GetId()] = transmitterVis;
+    transmitterVis->Load();
   }
 
   return true;
@@ -1699,15 +1987,21 @@ bool Scene::ProcessSensorMsg(ConstSensorPtr &_msg)
 /////////////////////////////////////////////////
 bool Scene::ProcessLinkMsg(ConstLinkPtr &_msg)
 {
-  VisualPtr linkVis = this->GetVisual(_msg->name());
+  VisualPtr linkVis;
+
+  if (_msg->has_id())
+    linkVis = this->GetVisual(_msg->id());
+  else
+    linkVis = this->GetVisual(_msg->name());
 
   if (!linkVis)
   {
-    gzerr << "No link visual\n";
+    gzerr << "No link visual with id[" << _msg->id() << "] and name["
+      << _msg->name() << "]\n";
     return false;
   }
 
-  if (this->visuals.find(_msg->name() + "_COM_VISUAL__") == this->visuals.end())
+  if (!this->GetVisual(_msg->name() + "_COM_VISUAL__"))
   {
     this->CreateCOMVisual(_msg, linkVis);
   }
@@ -1731,28 +2025,25 @@ bool Scene::ProcessLinkMsg(ConstLinkPtr &_msg)
 /////////////////////////////////////////////////
 bool Scene::ProcessJointMsg(ConstJointPtr &_msg)
 {
-  Visual_M::iterator iter;
-  iter = this->visuals.find(_msg->name() + "_JOINT_VISUAL__");
+  VisualPtr childVis;
 
-  if (iter == this->visuals.end())
-  {
-    VisualPtr childVis;
+  if (_msg->has_child() && _msg->child() == "world")
+    childVis = this->worldVisual;
+  else if (_msg->has_child_id())
+    childVis = this->GetVisual(_msg->child_id());
 
-    if (_msg->child() == "world")
-      childVis = this->worldVisual;
-    else
-      childVis = this->GetVisual(_msg->child());
+  if (!childVis)
+    return false;
 
-    if (!childVis)
-      return false;
+  JointVisualPtr jointVis(new JointVisual(
+        _msg->name() + "_JOINT_VISUAL__", childVis));
+  jointVis->Load(_msg);
+  jointVis->SetVisible(this->showJoints);
+  if (_msg->has_id())
+    jointVis->SetId(_msg->id());
 
-    JointVisualPtr jointVis(new JointVisual(
-            _msg->name() + "_JOINT_VISUAL__", childVis));
-    jointVis->Load(_msg);
-    jointVis->SetVisible(this->showJoints);
+  this->visuals[jointVis->GetId()] = jointVis;
 
-    this->visuals[jointVis->GetName()] = jointVis;
-  }
   return true;
 }
 
@@ -1822,10 +2113,19 @@ void Scene::ProcessRequestMsg(ConstRequestPtr &_msg)
     // Otherwise delete a visual
     else
     {
-      Visual_M::iterator iter;
-      iter = this->visuals.find(_msg->data());
-      if (iter != this->visuals.end())
-        this->RemoveVisual(iter->second);
+      VisualPtr visPtr;
+      try
+      {
+        Visual_M::iterator iter;
+        iter = this->visuals.find(boost::lexical_cast<uint32_t>(_msg->data()));
+        visPtr = iter->second;
+      } catch(...)
+      {
+        visPtr = this->GetVisual(_msg->data());
+      }
+
+      if (visPtr)
+        this->RemoveVisual(visPtr);
     }
   }
   else if (_msg->request() == "show_contact")
@@ -1965,8 +2265,15 @@ void Scene::ProcessRequestMsg(ConstRequestPtr &_msg)
 bool Scene::ProcessVisualMsg(ConstVisualPtr &_msg)
 {
   bool result = false;
-  Visual_M::iterator iter;
-  iter = this->visuals.find(_msg->name());
+  Visual_M::iterator iter = this->visuals.end();
+
+  if (_msg->has_id())
+    iter = this->visuals.find(_msg->id());
+  else
+  {
+    VisualPtr vis = this->GetVisual(_msg->name());
+    iter = vis ? this->visuals.find(vis->GetId()) : this->visuals.end();
+  }
 
   if (_msg->has_delete_me() && _msg->delete_me())
   {
@@ -2013,29 +2320,40 @@ bool Scene::ProcessVisualMsg(ConstVisualPtr &_msg)
     // If the visual has a parent which is not the name of the scene...
     if (_msg->has_parent_name() && _msg->parent_name() != this->GetName())
     {
-      iter = this->visuals.find(_msg->name());
+      if (_msg->has_id())
+        iter = this->visuals.find(_msg->id());
+      else
+      {
+        VisualPtr vis = this->GetVisual(_msg->name());
+        iter = vis ? this->visuals.find(vis->GetId()) : this->visuals.end();
+      }
+
       if (iter != this->visuals.end())
         gzerr << "Visual already exists. This shouldn't happen.\n";
 
       // Make sure the parent visual exists before trying to add a child
       // visual
-      iter = this->visuals.find(_msg->parent_name());
+      iter = this->visuals.find(_msg->parent_id());
       if (iter != this->visuals.end())
       {
         visual.reset(new Visual(_msg->name(), iter->second));
+        if (_msg->has_id())
+          visual->SetId(_msg->id());
       }
     }
     else
     {
       // Add a visual that is attached to the scene root
       visual.reset(new Visual(_msg->name(), this->worldVisual));
+      if (_msg->has_id())
+        visual->SetId(_msg->id());
     }
 
     if (visual)
     {
       result = true;
       visual->LoadFromMsg(_msg);
-      this->visuals[_msg->name()] = visual;
+      this->visuals[visual->GetId()] = visual;
       if (visual->GetName().find("__COLLISION_VISUAL__") != std::string::npos ||
           visual->GetName().find("__SKELETON_VISUAL__") != std::string::npos)
       {
@@ -2048,6 +2366,8 @@ bool Scene::ProcessVisualMsg(ConstVisualPtr &_msg)
       visual->ShowJoints(this->showJoints);
       visual->SetTransparency(this->transparent ? 0.5 : 0.0);
       visual->SetWireframe(this->wireframe);
+
+      visual->UpdateFromMsg(_msg);
     }
   }
 
@@ -2055,24 +2375,27 @@ bool Scene::ProcessVisualMsg(ConstVisualPtr &_msg)
 }
 
 /////////////////////////////////////////////////
-void Scene::OnPoseMsg(ConstPose_VPtr &_msg)
+common::Time Scene::GetSimTime() const
 {
   boost::mutex::scoped_lock lock(*this->receiveMutex);
-  PoseMsgs_L::iterator iter;
+  return this->sceneSimTimePosesApplied;
+}
+
+/////////////////////////////////////////////////
+void Scene::OnPoseMsg(ConstPosesStampedPtr &_msg)
+{
+  boost::recursive_mutex::scoped_lock lock(this->poseMsgMutex);
+  this->sceneSimTimePosesReceived =
+    common::Time(_msg->time().sec(), _msg->time().nsec());
 
   for (int i = 0; i < _msg->pose_size(); ++i)
   {
-    // Find an old model message, and remove them
-    for (iter = this->poseMsgs.begin(); iter != this->poseMsgs.end(); ++iter)
-    {
-      if ((*iter).name() == _msg->pose(i).name())
-      {
-        this->poseMsgs.erase(iter);
-        break;
-      }
-    }
-
-    this->poseMsgs.push_back(_msg->pose(i));
+    PoseMsgs_M::iterator iter = this->poseMsgs.find(_msg->pose(i).id());
+    if (iter != this->poseMsgs.end())
+      iter->second.CopyFrom(_msg->pose(i));
+    else
+      this->poseMsgs.insert(
+          std::make_pair(_msg->pose(i).id(), _msg->pose(i)));
   }
 }
 
@@ -2105,7 +2428,7 @@ void Scene::OnLightMsg(ConstLightPtr &_msg)
 }
 
 /////////////////////////////////////////////////
-void Scene::ProcessLightMsg(ConstLightPtr &_msg)
+bool Scene::ProcessLightMsg(ConstLightPtr &_msg)
 {
   Light_M::iterator iter;
   iter = this->lights.find(_msg->name());
@@ -2123,6 +2446,8 @@ void Scene::ProcessLightMsg(ConstLightPtr &_msg)
     iter->second->UpdateFromMsg(_msg);
     RTShaderSystem::Instance()->UpdateShaders();
   }
+
+  return true;
 }
 
 /////////////////////////////////////////////////
@@ -2141,6 +2466,11 @@ void Scene::OnModelMsg(ConstModelPtr &_msg)
 /////////////////////////////////////////////////
 void Scene::OnSkyMsg(ConstSkyPtr &_msg)
 {
+  if (!this->skyx)
+    return;
+
+  this->skyx->setVisible(true);
+
   SkyX::VClouds::VClouds *vclouds =
     this->skyx->getVCloudsManager()->getVClouds();
 
@@ -2266,18 +2596,18 @@ void Scene::SetSky()
     }
   }
 
-  /*vclouds->getLightningManager()->setEnabled(preset.vcLightnings);
-  vclouds->getLightningManager()->setAverageLightningApparitionTime(
-      preset.vcLightningsAT);
-  vclouds->getLightningManager()->setLightningColor(
-      preset.vcLightningsColor);
-  vclouds->getLightningManager()->setLightningTimeMultiplier(
-      preset.vcLightningsTM);
-      */
+  // vclouds->getLightningManager()->setEnabled(preset.vcLightnings);
+  // vclouds->getLightningManager()->setAverageLightningApparitionTime(
+  //     preset.vcLightningsAT);
+  // vclouds->getLightningManager()->setLightningColor(
+  //     preset.vcLightningsColor);
+  // vclouds->getLightningManager()->setLightningTimeMultiplier(
+  //    preset.vcLightningsTM);
 
   Ogre::Root::getSingletonPtr()->addFrameListener(this->skyx);
 
   this->skyx->update(0);
+  this->skyx->setVisible(false);
 }
 
 /////////////////////////////////////////////////
@@ -2329,16 +2659,16 @@ void Scene::SetShadowsEnabled(bool _value)
 /////////////////////////////////////////////////
 bool Scene::GetShadowsEnabled() const
 {
-  return this->sdf->GetValueBool("shadows");
+  return this->sdf->Get<bool>("shadows");
 }
 
 /////////////////////////////////////////////////
 void Scene::AddVisual(VisualPtr _vis)
 {
-  if (this->visuals.find(_vis->GetName()) != this->visuals.end())
+  if (this->visuals.find(_vis->GetId()) != this->visuals.end())
     gzerr << "Duplicate visuals detected[" << _vis->GetName() << "]\n";
 
-  this->visuals[_vis->GetName()] = _vis;
+  this->visuals[_vis->GetId()] = _vis;
 }
 
 /////////////////////////////////////////////////
@@ -2364,14 +2694,14 @@ void Scene::RemoveVisual(VisualPtr _vis)
     }
 
     // Delete the visual
-    Visual_M::iterator iter = this->visuals.find(_vis->GetName());
+    Visual_M::iterator iter = this->visuals.find(_vis->GetId());
     if (iter != this->visuals.end())
     {
       iter->second->Fini();
       this->visuals.erase(iter);
     }
 
-    if (this->selectedVis && this->selectedVis->GetName() == _vis->GetName())
+    if (this->selectedVis && this->selectedVis->GetId() == _vis->GetId())
       this->selectedVis.reset();
   }
 }
@@ -2379,7 +2709,7 @@ void Scene::RemoveVisual(VisualPtr _vis)
 /////////////////////////////////////////////////
 void Scene::SetGrid(bool _enabled)
 {
-  if (_enabled && this->grids.size() == 0)
+  if (_enabled && this->grids.empty())
   {
     Grid *grid = new Grid(this, 20, 1, 10, common::Color(0.3, 0.3, 0.3, 0.5));
     grid->Init();
@@ -2420,8 +2750,8 @@ void Scene::CreateCOMVisual(ConstLinkPtr &_msg, VisualPtr _linkVisual)
   COMVisualPtr comVis(new COMVisual(_msg->name() + "_COM_VISUAL__",
                                     _linkVisual));
   comVis->Load(_msg);
-  comVis->SetVisible(false);
-  this->visuals[comVis->GetName()] = comVis;
+  comVis->SetVisible(this->showCOMs);
+  this->visuals[comVis->GetId()] = comVis;
 }
 
 /////////////////////////////////////////////////
@@ -2431,21 +2761,14 @@ void Scene::CreateCOMVisual(sdf::ElementPtr _elem, VisualPtr _linkVisual)
                                     _linkVisual));
   comVis->Load(_elem);
   comVis->SetVisible(false);
-  this->visuals[comVis->GetName()] = comVis;
+  this->visuals[comVis->GetId()] = comVis;
 }
 
 /////////////////////////////////////////////////
-VisualPtr Scene::CloneVisual(const std::string &_visualName,
-                             const std::string &_newName)
+VisualPtr Scene::CloneVisual(const std::string & /*_visualName*/,
+                             const std::string & /*_newName*/)
 {
-  VisualPtr result;
-  VisualPtr vis = this->GetVisual(_visualName);
-  if (vis)
-  {
-    result = vis->Clone(_newName, this->worldVisual);
-    this->visuals[_newName] = result;
-  }
-  return result;
+  return VisualPtr();
 }
 
 /////////////////////////////////////////////////
@@ -2457,6 +2780,9 @@ void Scene::SetWireframe(bool _show)
   {
     iter->second->SetWireframe(_show);
   }
+
+  if (this->terrain)
+    this->terrain->SetWireframe(_show);
 }
 
 /////////////////////////////////////////////////
@@ -2506,19 +2832,88 @@ void Scene::ShowJoints(bool _show)
 /////////////////////////////////////////////////
 void Scene::ShowContacts(bool _show)
 {
-  ContactVisualPtr vis = boost::dynamic_pointer_cast<ContactVisual>(
-      this->visuals["__GUIONLY_CONTACT_VISUAL__"]);
+  ContactVisualPtr vis;
 
-  if (!vis && _show)
+  if (this->contactVisId == GZ_UINT32_MAX && _show)
   {
     vis.reset(new ContactVisual("__GUIONLY_CONTACT_VISUAL__",
               this->worldVisual, "~/physics/contacts"));
     vis->SetEnabled(_show);
-    this->visuals[vis->GetName()] = vis;
+    this->contactVisId = vis->GetId();
+    this->visuals[this->contactVisId] = vis;
   }
+  else
+    vis = boost::dynamic_pointer_cast<ContactVisual>(
+        this->visuals[this->contactVisId]);
 
   if (vis)
     vis->SetEnabled(_show);
   else
     gzerr << "Unable to get contact visualization. This should never happen.\n";
 }
+
+/////////////////////////////////////////////////
+void Scene::ShowClouds(bool _show)
+{
+  if (!this->skyx)
+    return;
+
+  SkyX::VCloudsManager *mgr = this->skyx->getVCloudsManager();
+  if (mgr)
+  {
+    SkyX::VClouds::VClouds *vclouds =
+        this->skyx->getVCloudsManager()->getVClouds();
+    if (vclouds)
+      vclouds->setVisible(_show);
+  }
+}
+
+/////////////////////////////////////////////////
+bool Scene::GetShowClouds() const
+{
+  if (!this->skyx)
+    return false;
+
+  SkyX::VCloudsManager *mgr = this->skyx->getVCloudsManager();
+  if (mgr)
+  {
+    SkyX::VClouds::VClouds *vclouds =
+        this->skyx->getVCloudsManager()->getVClouds();
+    if (vclouds)
+      return vclouds->isVisible();
+  }
+
+  return false;
+}
+
+/////////////////////////////////////////////////
+void Scene::SetSkyXMode(unsigned int _mode)
+{
+  /// \todo This function is currently called on initialization of rendering
+  /// based sensors to disable clouds and moon. More testing is required to
+  /// make sure it functions correctly when called during a render update,
+  /// issue #693.
+
+  if (!this->skyx)
+    return;
+
+  bool enabled = _mode != GZ_SKYX_NONE;
+  this->skyx->setEnabled(enabled);
+
+  if (!enabled)
+    return;
+
+  this->skyx->setCloudsEnabled(_mode & GZ_SKYX_CLOUDS);
+  this->skyx->setMoonEnabled(_mode & GZ_SKYX_MOON);
+}
+
+/////////////////////////////////////////////////
+void Scene::RemoveProjectors()
+{
+  for (std::map<std::string, Projector *>::iterator iter =
+      this->projectors.begin(); iter != this->projectors.end(); ++iter)
+  {
+    delete iter->second;
+  }
+  this->projectors.clear();
+}
diff --git a/gazebo/rendering/Scene.hh b/gazebo/rendering/Scene.hh
index dff790a..8b3b963 100644
--- a/gazebo/rendering/Scene.hh
+++ b/gazebo/rendering/Scene.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,16 +23,20 @@
 #include <list>
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/shared_ptr.hpp>
+#include <boost/unordered/unordered_map.hpp>
+#include <boost/thread/recursive_mutex.hpp>
 
-#include "sdf/sdf.hh"
-#include "msgs/msgs.hh"
+#include <sdf/sdf.hh>
 
-#include "rendering/RenderTypes.hh"
+#include "gazebo/msgs/msgs.hh"
 
-#include "transport/TransportTypes.hh"
-#include "common/Events.hh"
-#include "common/Color.hh"
-#include "math/Vector2i.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/math/Vector2i.hh"
+#include "gazebo/util/system.hh"
 
 namespace SkyX
 {
@@ -73,8 +77,15 @@ namespace gazebo
     /// \brief Representation of an entire scene graph.
     ///
     /// Maintains all the Visuals, Lights, and Cameras for a World.
-    class Scene : public boost::enable_shared_from_this<Scene>
+    class GAZEBO_VISIBLE Scene : public boost::enable_shared_from_this<Scene>
     {
+      public: enum SkyXMode {
+        GZ_SKYX_ALL = 0x0FFFFFFF,
+        GZ_SKYX_CLOUDS = 0x0000001,
+        GZ_SKYX_MOON = 0x0000002,
+        GZ_SKYX_NONE = 0
+      };
+
       /// \brief Constructor.
       private: Scene() {}
 
@@ -84,7 +95,8 @@ namespace gazebo
       /// this should be set to true for user interfaces, and false for
       /// sensor generation.
       public: Scene(const std::string &_name,
-                    bool _enableVisualizations = false);
+                    bool _enableVisualizations = false,
+                    bool _isServer = false);
 
       /// \brief Destructor
       public: virtual ~Scene();
@@ -156,7 +168,7 @@ namespace gazebo
       /// \param[in] _autoRender True to allow Gazebo to automatically
       /// render the camera. This should almost always be true.
       /// \return Pointer to the new camera.
-     public: DepthCameraPtr CreateDepthCamera(const std::string &_name,
+      public: DepthCameraPtr CreateDepthCamera(const std::string &_name,
                                                bool _autoRender = true);
 
       /// \brief Create laser that generates data from rendering.
@@ -164,8 +176,8 @@ namespace gazebo
       /// \param[in] _autoRender True to allow Gazebo to automatically
       /// render the camera. This should almost always be true.
       /// \return Pointer to the new laser.
-      // public: GpuLaserPtr CreateGpuLaser(const std::string &_name,
-      //                                   bool _autoRender = true);
+      public: GpuLaserPtr CreateGpuLaser(const std::string &_name,
+                                         bool _autoRender = true);
 
       /// \brief Get the number of cameras in this scene
       /// \return Number of lasers.
@@ -200,6 +212,10 @@ namespace gazebo
       /// invalid.
       public: UserCameraPtr GetUserCamera(uint32_t _index) const;
 
+      /// \brief Remove a camera from the scene
+      /// \param[in] _name Name of the camera.
+      public: void RemoveCamera(const std::string &_name);
+
       /// \brief Get a light by name.
       /// \param[in] _name Name of the light to get.
       /// \return Pointer to the light, or NULL if the light was not found.
@@ -215,9 +231,16 @@ namespace gazebo
       /// \return Pointer to the Light or NULL if index was invalid.
       public: LightPtr GetLight(uint32_t _index) const;
 
-      /// \brief Get a visual by name
+      /// \brief Get a visual by name.
+      /// \param[in] _name Name of the visual to retrieve.
+      /// \return Pointer to the visual, NULL if not found.
       public: VisualPtr GetVisual(const std::string &_name) const;
 
+      /// \brief Get a visual by id.
+      /// \param[in] _id ID of the visual to retrieve.
+      /// \return Pointer to the visual, NULL if not found.
+      public: VisualPtr GetVisual(uint32_t _id) const;
+
       /// \brief Select a visual by name.
       /// \param[in] _name Name of the visual to select.
       /// \param[in] _mode Selection mode (normal, or move).
@@ -355,12 +378,9 @@ namespace gazebo
       /// \brief Clear rendering::Scene
       public: void Clear();
 
-      /// \brief Clone a visual.
-      /// \param[in] _visualName Name of the visual to clone.
-      /// \param[in] _newName New name of the visual.
-      /// \return Pointer to the cloned visual.
+      /// \brief Deprecated.
       public: VisualPtr CloneVisual(const std::string &_visualName,
-                                    const std::string &_newName);
+                  const std::string &_newName) GAZEBO_DEPRECATED(2.0);
 
       /// \brief Get the currently selected visual.
       /// \return Pointer to the currently selected visual, or NULL if
@@ -391,9 +411,38 @@ namespace gazebo
       /// \param[in] _show True to enable contact visualization.
       public: void ShowContacts(bool _show);
 
+      /// \brief Display clouds in the sky.
+      /// \param[in] _show True to display clouds.
+      public: void ShowClouds(bool _show);
+
+      /// \brief Get whether or not clouds are displayed.
+      /// \return True if clouds are displayed.
+      public: bool GetShowClouds() const;
+
+
+      /// \brief Set SkyX mode to enable/disable skyx components such as
+      /// clouds and moon.
+      /// \param[in] _mode SkyX mode bitmask.
+      /// \sa Scene::SkyXMode
+      public: void SetSkyXMode(unsigned int _mode);
+
       /// \brief Return true if the Scene has been initialized.
       public: bool GetInitialized() const;
 
+      /// \brief Get the scene simulation time.
+      /// Note this is different from World::GetSimTime() because
+      /// there is a lag between the time new poses are sent out by World
+      /// and when they are received and applied by the Scene.
+      /// \return The current simulation time in Scene
+      public: common::Time GetSimTime() const;
+
+      /// \brief Get the number of visuals.
+      /// \return The number of visuals in the Scene.
+      public: uint32_t GetVisualCount() const;
+
+      /// \brief Remove all projectors.
+      public: void RemoveProjectors();
+
       /// \brief Helper function to setup the sky.
       private: void SetSky();
 
@@ -466,7 +515,7 @@ namespace gazebo
 
       /// \brief Proces a scene message.
       /// \param[in] _msg The message data.
-      private: void ProcessSceneMsg(ConstScenePtr &_msg);
+      private: bool ProcessSceneMsg(ConstScenePtr &_msg);
 
       /// \brief Process a model message.
       /// \param[in] _msg The message data.
@@ -490,7 +539,7 @@ namespace gazebo
 
       /// \brief Process a light message.
       /// \param[in] _msg The message data.
-      private: void ProcessLightMsg(ConstLightPtr &_msg);
+      private: bool ProcessLightMsg(ConstLightPtr &_msg);
 
       /// \brief Process a request message.
       /// \param[in] _msg The message data.
@@ -510,7 +559,7 @@ namespace gazebo
 
       /// \brief Pose message callback.
       /// \param[in] _msg The message data.
-      private: void OnPoseMsg(ConstPose_VPtr &_msg);
+      private: void OnPoseMsg(ConstPosesStampedPtr &_msg);
 
       /// \brief Skeleton animation callback.
       /// \param[in] _msg The message data.
@@ -573,10 +622,10 @@ namespace gazebo
 
       /// \def PoseMsgs_L.
       /// \brief List of messages.
-      typedef std::list<msgs::Pose> PoseMsgs_L;
+      typedef std::map<uint32_t, msgs::Pose> PoseMsgs_M;
 
       /// \brief List of pose message to process.
-      private: PoseMsgs_L poseMsgs;
+      private: PoseMsgs_M poseMsgs;
 
       /// \def SceneMsgs_L
       /// \brief List of scene messages.
@@ -620,7 +669,7 @@ namespace gazebo
 
       /// \def Visual_M
       /// \brief Map of visuals and their names.
-      typedef std::map<std::string, VisualPtr> Visual_M;
+      typedef std::map<uint32_t, VisualPtr> Visual_M;
 
       /// \brief Map of all the visuals in this scene.
       private: Visual_M visuals;
@@ -645,6 +694,9 @@ namespace gazebo
       /// \brief Mutex to lock the various message buffers.
       private: boost::mutex *receiveMutex;
 
+      /// \brief Mutex to lock the pose message buffers.
+      private: boost::recursive_mutex poseMsgMutex;
+
       /// \brief Communication Node
       private: transport::NodePtr node;
 
@@ -744,6 +796,25 @@ namespace gazebo
 
       /// \brief Initialized.
       private: bool initialized;
+
+      /// \brief SimTime of this Scene, as we receive PosesStamped from
+      /// the world, we update this time accordingly.
+      private: common::Time sceneSimTimePosesReceived;
+
+      /// \brief SimTime of this Scene, after applying PosesStamped to
+      /// scene, we update this time accordingly.
+      private: common::Time sceneSimTimePosesApplied;
+
+      /// \brief Keeps track of the visual ID for contact visualization.
+      private: uint32_t contactVisId;
+
+      /// \def JointMsgs_M
+      /// \brief Map of joint names to joint messages.
+      typedef boost::unordered_map<std::string,
+          boost::shared_ptr<msgs::Joint const> > JointMsgs_M;
+
+      /// \brief Keep track of data of joints.
+      private: JointMsgs_M joints;
     };
     /// \}
   }
diff --git a/gazebo/rendering/SelectionObj.cc b/gazebo/rendering/SelectionObj.cc
index 837e693..1a5a45c 100644
--- a/gazebo/rendering/SelectionObj.cc
+++ b/gazebo/rendering/SelectionObj.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,257 +14,620 @@
  * limitations under the License.
  *
 */
-#include <boost/lexical_cast.hpp>
 
-#include "rendering/ogre_gazebo.h"
-#include "rendering/Visual.hh"
-#include "rendering/Conversions.hh"
-#include "rendering/Scene.hh"
-#include "common/MeshManager.hh"
-#include "rendering/SelectionObj.hh"
+#include "gazebo/common/MeshManager.hh"
+
+#include "gazebo/gui/GuiIface.hh"
+
+#include "gazebo/rendering/UserCamera.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/SelectionObjPrivate.hh"
+#include "gazebo/rendering/SelectionObj.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
-
-//////////////////////////////////////////////////
-SelectionObj::SelectionObj(Scene *scene_)
-  : scene(scene_)
+/////////////////////////////////////////////////
+SelectionObj::SelectionObj(const std::string &_name, VisualPtr _vis)
+  : Visual(*new SelectionObjPrivate, _name, _vis, false)
 {
-  this->active = false;
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  dPtr->state = SELECTION_NONE;
+  dPtr->mode = SELECTION_NONE;
+
+  dPtr->maxScale = 3.0;
+  dPtr->minScale = 0.5;
+
+  dPtr->xAxisMatOverlay = "Gazebo/RedTransparentOverlay";
+  dPtr->yAxisMatOverlay = "Gazebo/GreenTransparentOverlay";
+  dPtr->zAxisMatOverlay = "Gazebo/BlueTransparentOverlay";
+
+  dPtr->xAxisMat = "Gazebo/RedTransparent";
+  dPtr->yAxisMat = "Gazebo/GreenTransparent";
+  dPtr->zAxisMat = "Gazebo/BlueTransparent";
 }
 
-//////////////////////////////////////////////////
+/////////////////////////////////////////////////
 SelectionObj::~SelectionObj()
 {
-  this->node.reset();
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+  dPtr->parent.reset();
 }
 
-//////////////////////////////////////////////////
-void SelectionObj::Init()
+/////////////////////////////////////////////////
+void SelectionObj::Load()
 {
-  this->node.reset(new Visual("selection_obj_visual",
-                              this->scene->GetWorldVisual()));
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
 
-  Visual::InsertMesh(common::MeshManager::Instance()->GetMesh("unit_box"));
+  Visual::Load();
 
- /* Ogre::SceneNode *transNode =
-    this->node->GetSceneNode()->createChildSceneNode("trans_node");
+  this->CreateRotateVisual();
+  this->CreateTranslateVisual();
+  this->CreateScaleVisual();
 
-  transNode->setInheritOrientation(false);
+  this->SetVisibilityFlags(GZ_VISIBILITY_GUI);
 
-  Ogre::SceneNode *xBox[2], *yBox[2], *zBox[2];
+  dPtr->transVisual->SetVisible(false);
+  dPtr->rotVisual->SetVisible(false);
+  dPtr->scaleVisual->SetVisible(false);
 
-  for (int i = 0; i < 2; i++)
-  {
-    xBox[i] = transNode->createChildSceneNode(
-        "selection_transX" + boost::lexical_cast<std::string>(i));
-    xBox[i]->setInheritScale(true);
+  this->GetSceneNode()->setInheritScale(false);
+}
 
-    yBox[i] = transNode->createChildSceneNode(
-        "selection_transY" + boost::lexical_cast<std::string>(i));
-    yBox[i]->setInheritScale(true);
+/////////////////////////////////////////////////
+void SelectionObj::Attach(rendering::VisualPtr _vis)
+{
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
 
-    zBox[i] = transNode->createChildSceneNode(
-        "selection_transZ" + boost::lexical_cast<std::string>(i));
-    zBox[i]->setInheritScale(true);
+  if (dPtr->parent)
+  {
+    if (dPtr->parent == _vis)
+      return;
+    dPtr->parent->DetachVisual(shared_from_this());
   }
 
-  Ogre::MovableObject *boxObjX1 =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
-          "__SELECTION_OBJX1__", "unit_box"));
-  boxObjX1->setCastShadows(false);
-  boxObjX1->setUserAny(Ogre::Any(std::string("transx")));
-  ((Ogre::Entity*)boxObjX1)->setMaterialName(
-    "__GAZEBO_TRANS_RED_MATERIAL__");
-  boxObjX1->setVisibilityFlags(GZ_VISIBILITY_GUI);
-
-  Ogre::MovableObject *boxObjX2 =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
-          "__SELECTION_OBJX2__", "unit_box"));
-  boxObjX2->setCastShadows(false);
-  boxObjX2->setUserAny(Ogre::Any(std::string("transx")));
-  ((Ogre::Entity*)boxObjX2)->setMaterialName(
-    "__GAZEBO_TRANS_RED_MATERIAL__");
-  boxObjX2->setVisibilityFlags(GZ_VISIBILITY_GUI);
-
-
-  Ogre::MovableObject *boxObjY1 =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
-          "__SELECTION_OBJY1__", "unit_box"));
-  boxObjY1->setCastShadows(false);
-  boxObjY1->setUserAny(Ogre::Any(std::string("transy")));
-  ((Ogre::Entity*)boxObjY1)->setMaterialName(
-    "__GAZEBO_TRANS_GREEN_MATERIAL__");
-  boxObjY1->setVisibilityFlags(GZ_VISIBILITY_GUI);
-
-  Ogre::MovableObject *boxObjY2 =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
-          "__SELECTION_OBJY2__", "unit_box"));
-  boxObjY2->setCastShadows(false);
-  boxObjY2->setUserAny(Ogre::Any(std::string("transy")));
-  ((Ogre::Entity*)boxObjY2)->setMaterialName(
-    "__GAZEBO_TRANS_GREEN_MATERIAL__");
-  boxObjY2->setVisibilityFlags(GZ_VISIBILITY_GUI);
-
-
-  Ogre::MovableObject *boxObjZ1 =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
-          "__SELECTION_OBJZ1__", "unit_box"));
-  boxObjZ1->setCastShadows(false);
-  boxObjZ1->setUserAny(Ogre::Any(std::string("transz")));
-  ((Ogre::Entity*)boxObjZ1)->setMaterialName(
-    "__GAZEBO_TRANS_BLUE_MATERIAL__");
-  boxObjZ1->setVisibilityFlags(GZ_VISIBILITY_GUI);
-
-  Ogre::MovableObject *boxObjZ2 =
-    (Ogre::MovableObject*)(this->scene->GetManager()->createEntity(
-          "__SELECTION_OBJZ2__", "unit_box"));
-  boxObjZ2->setCastShadows(false);
-  boxObjZ2->setUserAny(Ogre::Any(std::string("transz")));
-  ((Ogre::Entity*)boxObjZ2)->setMaterialName(
-    "__GAZEBO_TRANS_BLUE_MATERIAL__");
-  boxObjZ2->setVisibilityFlags(GZ_VISIBILITY_GUI);
-
-  this->boxSize = 0.2;
-
-  xBox[0]->attachObject(boxObjX1);
-  xBox[0]->setInheritOrientation(false);
-  xBox[0]->setScale(this->boxSize, this->boxSize, this->boxSize);
-  xBox[0]->setPosition(1.5, 0, 0);
-
-  xBox[1]->attachObject(boxObjX2);
-  xBox[1]->setInheritOrientation(false);
-  xBox[1]->setScale(this->boxSize, this->boxSize, this->boxSize);
-  xBox[1]->setPosition(-1.5, 0, 0);
-
-  yBox[0]->attachObject(boxObjY1);
-  yBox[0]->setInheritOrientation(false);
-  yBox[0]->setScale(this->boxSize, this->boxSize, this->boxSize);
-  yBox[0]->setPosition(0, 1.5, 0);
-
-  yBox[1]->attachObject(boxObjY2);
-  yBox[1]->setInheritOrientation(false);
-  yBox[1]->setScale(this->boxSize, this->boxSize, this->boxSize);
-  yBox[1]->setPosition(0, -1.5, 0);
-
-
-  zBox[0]->attachObject(boxObjZ1);
-  zBox[0]->setInheritOrientation(false);
-  zBox[0]->setScale(this->boxSize, this->boxSize, this->boxSize);
-  zBox[0]->setPosition(0, 0, 1.5);
-
-  zBox[1]->attachObject(boxObjZ2);
-  zBox[1]->setInheritOrientation(false);
-  zBox[1]->setScale(this->boxSize, this->boxSize, this->boxSize);
-  zBox[1]->setPosition(0, 0, -1.5);
-  */
-
-  this->node->SetVisible(false);
+  dPtr->parent = _vis;
+  dPtr->parent->AttachVisual(shared_from_this());
+  this->SetPosition(math::Vector3(0, 0, 0));
+
+  this->UpdateSize();
 }
 
-//////////////////////////////////////////////////
-void SelectionObj::Attach(VisualPtr _visual)
+/////////////////////////////////////////////////
+void SelectionObj::UpdateSize()
 {
-  this->Clear();
-  if (_visual)
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  VisualPtr vis = dPtr->parent;
+
+  // don't include the selection obj itself when calculating the size.
+  this->Detach();
+  math::Vector3 bboxSize = vis->GetBoundingBox().GetSize()
+      * vis->GetScale();
+  dPtr->parent = vis;
+  dPtr->parent->AttachVisual(shared_from_this());
+
+  double max = std::max(std::max(bboxSize.x, bboxSize.y), bboxSize.z);
+
+  max = std::min(std::max(dPtr->minScale, max), dPtr->maxScale);
+
+  // Handle special case for rotation visuals. Only set the visuals to be
+  // overlays for big objects.
+  if (math::equal(max, dPtr->maxScale))
   {
-  /*  Ogre::Node *transNode;
-
-    math::Box box = _visual->GetBoundingBox();
-    _visual->AttachVisual(this->node);
-
-    box = box - _visual->GetPose().pos;
-
-    transNode = this->node->GetSceneNode()->getChild("trans_node");
-    transNode->getChild("selection_transX0")->setPosition(
-        -box.GetXLength()*0.5 - this->boxSize, 0,
-        box.GetZLength()*0.5 + box.min.z);
-    transNode->getChild("selection_transX1")->setPosition(
-        box.GetXLength()*0.5 + this->boxSize, 0,
-        box.GetZLength()*0.5 + box.min.z);
-
-    transNode->getChild("selection_transY0")->setPosition(0,
-        -box.GetYLength()*0.5 - this->boxSize,
-        box.GetZLength()*0.5 + box.min.z);
-    transNode->getChild("selection_transY1")->setPosition(0,
-        box.GetYLength()*0.5 + this->boxSize,
-        box.GetZLength()*0.5 + box.min.z);
-
-    transNode->getChild("selection_transZ0")->setPosition(0, 0,
-        box.min.z - this->boxSize);
-    transNode->getChild("selection_transZ1")->setPosition(0, 0,
-        box.max.z + this->boxSize);
-    this->node->SetVisible(true);
-*/
-    this->visualName = _visual->GetName();
+    dPtr->rotXVisual->SetMaterial(dPtr->xAxisMatOverlay, false);
+    dPtr->rotYVisual->SetMaterial(dPtr->yAxisMatOverlay, false);
+    dPtr->rotZVisual->SetMaterial(dPtr->zAxisMatOverlay, false);
   }
   else
-    this->visualName.clear();
+  {
+    dPtr->rotXVisual->SetMaterial(dPtr->xAxisMat, false);
+    dPtr->rotYVisual->SetMaterial(dPtr->yAxisMat, false);
+    dPtr->rotZVisual->SetMaterial(dPtr->zAxisMat, false);
+  }
+  this->SetScale(math::Vector3(max, max, max));
 }
 
-//////////////////////////////////////////////////
-void SelectionObj::Clear()
+/////////////////////////////////////////////////
+void SelectionObj::Detach()
 {
-  /*if (this->node->GetSceneNode()->getParentSceneNode())
-  {
-    this->node->GetSceneNode()->getParentSceneNode()->removeChild(
-        this->node->GetSceneNode());
-  }
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
 
-  this->node->SetVisible(false);
-  */
+  if (dPtr->parent)
+    dPtr->parent->DetachVisual(shared_from_this());
+  dPtr->parent.reset();
 }
 
-//////////////////////////////////////////////////
-std::string SelectionObj::GetVisualName() const
+/////////////////////////////////////////////////
+void SelectionObj::SetMode(const std::string &_mode)
 {
-  return this->visualName;
+  SelectionMode tmpMode = SELECTION_NONE;
+
+  if (_mode == "translate")
+    tmpMode = TRANS;
+  else if (_mode == "rotate")
+    tmpMode = ROT;
+  else if (_mode == "scale")
+    tmpMode = SCALE;
+
+  this->SetMode(tmpMode);
 }
 
-//////////////////////////////////////////////////
-bool SelectionObj::IsActive() const
+/////////////////////////////////////////////////
+void SelectionObj::SetMode(SelectionMode _mode)
 {
-  return this->active;
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  if (_mode == dPtr->mode)
+    return;
+
+  dPtr->mode = _mode;
+
+  dPtr->transVisual->SetVisible(false);
+  dPtr->rotVisual->SetVisible(false);
+  dPtr->scaleVisual->SetVisible(false);
+
+  if (dPtr->mode == TRANS)
+    dPtr->transVisual->SetVisible(true);
+  else if (dPtr->mode == ROT)
+    dPtr->rotVisual->SetVisible(true);
+  else if (dPtr->mode == SCALE)
+    dPtr->scaleVisual->SetVisible(true);
 }
 
-//////////////////////////////////////////////////
-void SelectionObj::SetActive(bool _active)
+/////////////////////////////////////////////////
+SelectionObj::SelectionMode SelectionObj::GetMode()
 {
-  this->active = _active;
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  return dPtr->mode;
 }
 
-//////////////////////////////////////////////////
-void SelectionObj::SetHighlight(const std::string &_mod)
+/////////////////////////////////////////////////
+void SelectionObj::SetState(const std::string &_state)
 {
-  Ogre::ColourValue color;
+  SelectionMode tmpState = SELECTION_NONE;
 
-  std::map<std::string, std::string> matNames;
-  matNames["transx"] = "__GAZEBO_TRANS_RED_MATERIAL__";
-  matNames["transy"] = "__GAZEBO_TRANS_GREEN_MATERIAL__";
-  matNames["transz"] = "__GAZEBO_TRANS_BLUE_MATERIAL__";
+  if (_state == "trans_x")
+  {
+    tmpState = TRANS_X;
+  }
+  else if (_state == "trans_y")
+  {
+    tmpState = TRANS_Y;
+  }
+  else if (_state == "trans_z")
+  {
+    tmpState = TRANS_Z;
+  }
+  else if (_state == "rot_x")
+  {
+    tmpState = ROT_X;
+  }
+  else if (_state == "rot_y")
+  {
+    tmpState = ROT_Y;
+  }
+  else if (_state == "rot_z")
+  {
+    tmpState = ROT_Z;
+  }
+  else if (_state == "scale_x")
+  {
+    tmpState = SCALE_X;
+  }
+  else if (_state == "scale_y")
+  {
+    tmpState = SCALE_Y;
+  }
+  else if (_state == "scale_z")
+  {
+    tmpState = SCALE_Z;
+  }
+  this->SetState(tmpState);
+}
+
+/////////////////////////////////////////////////
+void SelectionObj::SetState(SelectionMode _state)
+{
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  if (dPtr->state == _state)
+    return;
+
+  dPtr->state = _state;
+
+  if (dPtr->selectedVis)
+  {
+    Ogre::MaterialPtr mat =
+      Ogre::MaterialManager::getSingleton().getByName(
+      dPtr->selectedVis->GetMaterialName());
+    mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setAlphaOperation(
+      Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, 0.5);
+    dPtr->selectedVis.reset();
+  }
 
-  std::map<std::string, std::string >::iterator iter;
-  for (iter = matNames.begin(); iter != matNames.end(); ++iter)
+  if (dPtr->state == TRANS_X)
+    dPtr->selectedVis = dPtr->transXVisual;
+  else if (dPtr->state == TRANS_Y)
+    dPtr->selectedVis = dPtr->transYVisual;
+  else if (dPtr->state == TRANS_Z)
+    dPtr->selectedVis = dPtr->transZVisual;
+  else if (dPtr->state == ROT_X)
+    dPtr->selectedVis = dPtr->rotXVisual;
+  else if (dPtr->state == ROT_Y)
+    dPtr->selectedVis = dPtr->rotYVisual;
+  else if (dPtr->state == ROT_Z)
+    dPtr->selectedVis = dPtr->rotZVisual;
+  else if (dPtr->state == SCALE_X)
+    dPtr->selectedVis = dPtr->scaleXVisual;
+  else if (dPtr->state == SCALE_Y)
+    dPtr->selectedVis = dPtr->scaleYVisual;
+  else if (dPtr->state == SCALE_Z)
+    dPtr->selectedVis = dPtr->scaleZVisual;
+
+  if (dPtr->selectedVis)
   {
     Ogre::MaterialPtr mat =
-      Ogre::MaterialManager::getSingleton().getByName(iter->second);
-
-    if (!mat.isNull())
-    {
-      Ogre::Technique *technique = mat->getTechnique(0);
-      Ogre::Pass *pass = technique->getPass(0);
-
-      if (iter->first != _mod)
-      {
-        pass->setDepthWriteEnabled(false);
-        pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
-      }
-      else
-      {
-        pass->setDepthWriteEnabled(true);
-        pass->setSceneBlending(Ogre::SBT_REPLACE);
-      }
-    }
+      Ogre::MaterialManager::getSingleton().getByName(
+      dPtr->selectedVis->GetMaterialName());
+    mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setAlphaOperation(
+      Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, 0.7);
   }
 }
+
+/////////////////////////////////////////////////
+void SelectionObj::SetGlobal(bool _global)
+{
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  dPtr->transVisual->GetSceneNode()->setInheritOrientation(!_global);
+  dPtr->rotVisual->GetSceneNode()->setInheritOrientation(!_global);
+}
+
+/////////////////////////////////////////////////
+SelectionObj::SelectionMode SelectionObj::GetState()
+{
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  return dPtr->state;
+}
+
+/////////////////////////////////////////////////
+void SelectionObj::CreateTranslateVisual()
+{
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  // Translation mainipulation tool
+  dPtr->transVisual.reset(new rendering::Visual(
+      this->GetName() + "__SELECTION_OBJ_TRANS__",
+      shared_from_this()));
+
+  dPtr->transXVisual.reset(
+      new rendering::Visual(
+      "__SELECTION_OBJ_TRANS_X__" + this->GetName(), dPtr->transVisual));
+  dPtr->transYVisual.reset(
+      new rendering::Visual(
+      "__SELECTION_OBJ_TRANS_Y__" + this->GetName(), dPtr->transVisual));
+  dPtr->transZVisual.reset(
+      new rendering::Visual(
+      "__SELECTION_OBJ_TRANS_Z__" + this->GetName(), dPtr->transVisual));
+
+  dPtr->transXVisual->Load();
+  dPtr->transYVisual->Load();
+  dPtr->transZVisual->Load();
+
+  this->InsertMesh("axis_shaft");
+  this->InsertMesh("axis_head");
+
+  Ogre::MovableObject *shaftXObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_TRANS_SHAFT_X__" + this->GetName(), "axis_shaft"));
+  Ogre::MovableObject *headXObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_TRANS_HEAD_X__" + this->GetName(), "axis_head"));
+  Ogre::SceneNode *transShaftXNode =
+      dPtr->transXVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ__TRANS_SHAFT_NODE_X__"  + this->GetName());
+  Ogre::SceneNode *transHeadXNode =
+      dPtr->transXVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ__TRANS_HEAD_NODE_X__"  + this->GetName());
+  transShaftXNode->attachObject(shaftXObj);
+  transShaftXNode->setScale(0.5, 0.5, 1.0);
+  transShaftXNode->setPosition(0, 0, 0.1);
+  transHeadXNode->attachObject(headXObj);
+  transHeadXNode->setScale(0.5, 0.5, 0.5);
+  transHeadXNode->setPosition(0, 0, 0.22);
+  shaftXObj->setUserAny(Ogre::Any(std::string("trans_x")));
+  headXObj->setUserAny(Ogre::Any(std::string("trans_x")));
+  shaftXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+  headXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+
+  Ogre::MovableObject *shaftYObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_TRANS_SHAFT_Y__" + this->GetName(), "axis_shaft"));
+  Ogre::MovableObject *headYObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_TRANS_HEAD_Y__" + this->GetName(), "axis_head"));
+  Ogre::SceneNode *transShaftYNode =
+      dPtr->transYVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ_TRANS_SHAFT_NODE_Y__"  + this->GetName());
+  Ogre::SceneNode *transHeadYNode =
+      dPtr->transYVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ_TRANS_HEAD_NODE_Y__"  + this->GetName());
+  transShaftYNode->attachObject(shaftYObj);
+  transShaftYNode->setScale(0.5, 0.5, 1.0);
+  transShaftYNode->setPosition(0, 0, 0.1);
+  transHeadYNode->attachObject(headYObj);
+  transHeadYNode->setScale(0.5, 0.5, 0.5);
+  transHeadYNode->setPosition(0, 0, 0.22);
+  shaftYObj->setUserAny(Ogre::Any(std::string("trans_y")));
+  headYObj->setUserAny(Ogre::Any(std::string("trans_y")));
+  shaftYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+  headYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+
+  Ogre::MovableObject *shaftZObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_TRANS_SHAFT_Z__" + this->GetName(), "axis_shaft"));
+  Ogre::MovableObject *headZObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_TRANS_HEAD_Z__" + this->GetName(), "axis_head"));
+  Ogre::SceneNode *transShaftZNode =
+      dPtr->transZVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ_TRANS_SHAFT_NODE_Z__"  + this->GetName());
+  Ogre::SceneNode *transHeadZNode =
+      dPtr->transZVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ_TRANS_HEAD_NODE_Z__"  + this->GetName());
+  transShaftZNode->attachObject(shaftZObj);
+  transShaftZNode->setScale(0.5, 0.5, 1.0);
+  transShaftZNode->setPosition(0, 0, 0.1);
+  transHeadZNode->attachObject(headZObj);
+  transHeadZNode->setScale(0.5, 0.5, 0.5);
+  transHeadZNode->setPosition(0, 0, 0.22);
+  shaftZObj->setUserAny(Ogre::Any(std::string("trans_z")));
+  headZObj->setUserAny(Ogre::Any(std::string("trans_z")));
+  shaftZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+  headZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+
+  dPtr->transXVisual->SetRotation(
+      math::Quaternion(math::Vector3(0, 1, 0), GZ_DTOR(90)));
+  dPtr->transYVisual->SetRotation(
+      math::Quaternion(math::Vector3(1, 0, 0), GZ_DTOR(-90)));
+
+  dPtr->transXVisual->SetMaterial(dPtr->xAxisMatOverlay);
+  dPtr->transYVisual->SetMaterial(dPtr->yAxisMatOverlay);
+  dPtr->transZVisual->SetMaterial(dPtr->zAxisMatOverlay);
+
+  dPtr->transVisual->SetScale(math::Vector3(5.0, 5.0, 5.0));
+
+  dPtr->transXVisual->SetVisibilityFlags(
+      GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
+  dPtr->transYVisual->SetVisibilityFlags(
+      GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
+  dPtr->transZVisual->SetVisibilityFlags(
+      GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
+
+  // Add to scene so they are selectable by the mouse
+  dPtr->scene->AddVisual(dPtr->transXVisual);
+  dPtr->scene->AddVisual(dPtr->transYVisual);
+  dPtr->scene->AddVisual(dPtr->transZVisual);
+}
+
+/////////////////////////////////////////////////
+void SelectionObj::CreateRotateVisual()
+{
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  // Rotation mainipulation tool
+  dPtr->rotVisual.reset(new rendering::Visual(
+      this->GetName() + "__SELECTION_OBJ_ROT__",
+      shared_from_this()));
+
+  dPtr->rotXVisual.reset(
+      new rendering::Visual(
+      this->GetName() + "__SELECTION_OBJ_ROT_X__", dPtr->rotVisual));
+  dPtr->rotYVisual.reset(
+      new rendering::Visual(
+      this->GetName() + "__SELECTION_OBJ_ROT_Y__", dPtr->rotVisual));
+  dPtr->rotZVisual.reset(
+      new rendering::Visual(
+      this->GetName() + "__SELECTION_OBJ_ROT_Z__", dPtr->rotVisual));
+
+  dPtr->rotVisual->InsertMesh("selection_tube");
+
+  Ogre::MovableObject *rotXObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_ROT_X__" + this->GetName(), "selection_tube"));
+  Ogre::SceneNode *xNode =
+      dPtr->rotXVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ__ROT_NODE_X__"  + this->GetName());
+  xNode->attachObject(rotXObj);
+  rotXObj->setUserAny(Ogre::Any(std::string("rot_x")));
+  rotXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+
+  Ogre::MovableObject *rotYObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_ROT_Y__" + this->GetName(), "selection_tube"));
+  Ogre::SceneNode *yNode =
+      dPtr->rotYVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ__ROT_NODE_Y__"  + this->GetName());
+  yNode->attachObject(rotYObj);
+  rotYObj->setUserAny(Ogre::Any(std::string("rot_y")));
+  rotYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+
+  Ogre::MovableObject *rotZObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_ROT_Z__" + this->GetName(), "selection_tube"));
+  Ogre::SceneNode *zNode =
+      dPtr->rotZVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ__ROT_NODE_Z__"  + this->GetName());
+  zNode->attachObject(rotZObj);
+  rotZObj->setUserAny(Ogre::Any(std::string("rot_z")));
+  rotZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+
+  dPtr->rotXVisual->Load();
+  dPtr->rotYVisual->Load();
+  dPtr->rotZVisual->Load();
+
+  dPtr->rotXVisual->SetRotation(
+      math::Quaternion(math::Vector3(0, 1, 0), GZ_DTOR(90)));
+  dPtr->rotYVisual->SetRotation(
+      math::Quaternion(math::Vector3(1, 0, 0), GZ_DTOR(-90)));
+
+  // By default the visuals are not overlays like translation or scale visuals.
+  // This is so that the rings does not block the object it's attached too,
+  // and also gives with better depth perception.
+  dPtr->rotXVisual->SetMaterial(dPtr->xAxisMat);
+  dPtr->rotYVisual->SetMaterial(dPtr->yAxisMat);
+  dPtr->rotZVisual->SetMaterial(dPtr->zAxisMat);
+
+  dPtr->rotVisual->SetScale(math::Vector3(1.0, 1.0, 1.0));
+
+  dPtr->rotXVisual->SetVisibilityFlags(
+      GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
+  dPtr->rotYVisual->SetVisibilityFlags(
+      GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
+  dPtr->rotZVisual->SetVisibilityFlags(
+      GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
+
+  // Add to scene so they are selectable by the mouse
+  dPtr->scene->AddVisual(dPtr->rotXVisual);
+  dPtr->scene->AddVisual(dPtr->rotYVisual);
+  dPtr->scene->AddVisual(dPtr->rotZVisual);
+}
+
+/////////////////////////////////////////////////
+void SelectionObj::CreateScaleVisual()
+{
+  SelectionObjPrivate *dPtr =
+      reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
+
+  // Scale mainipulation tool
+  dPtr->scaleVisual.reset(new rendering::Visual(
+      this->GetName() + "__SELECTION_OBJ_SCALE__",
+      shared_from_this()));
+
+  dPtr->scaleXVisual.reset(
+      new rendering::Visual(
+      "__SELECTION_OBJ_SCALE_X__" + this->GetName(), dPtr->scaleVisual));
+  dPtr->scaleYVisual.reset(
+      new rendering::Visual(
+      "__SELECTION_OBJ_SCALE_Y__" + this->GetName(), dPtr->scaleVisual));
+  dPtr->scaleZVisual.reset(
+      new rendering::Visual(
+      "__SELECTION_OBJ_SCALE_Z__" + this->GetName(), dPtr->scaleVisual));
+
+  dPtr->scaleXVisual->Load();
+  dPtr->scaleYVisual->Load();
+  dPtr->scaleZVisual->Load();
+
+  this->InsertMesh("unit_box");
+
+  Ogre::MovableObject *scaleShaftXObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_SCALE_SHAFT_X__" + this->GetName(), "axis_shaft"));
+  Ogre::MovableObject *scaleHeadXObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_SCALE_HEAD_X__" + this->GetName(), "unit_box"));
+  Ogre::SceneNode *scaleShaftXNode =
+      dPtr->scaleXVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ__SCALE_SHAFT_NODE_X__"  + this->GetName());
+  Ogre::SceneNode *scaleHeadXNode =
+      dPtr->scaleXVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ__SCALE_HEAD_NODE_X__"  + this->GetName());
+  scaleShaftXNode->attachObject(scaleShaftXObj);
+  scaleShaftXNode->setScale(0.5, 0.5, 1.0);
+  scaleShaftXNode->setPosition(0, 0, 0.1);
+  scaleHeadXNode->attachObject(scaleHeadXObj);
+  scaleHeadXNode->setScale(0.02, 0.02, 0.02);
+  scaleHeadXNode->setPosition(0, 0, 0.21);
+  scaleShaftXObj->setUserAny(Ogre::Any(std::string("scale_x")));
+  scaleHeadXObj->setUserAny(Ogre::Any(std::string("scale_x")));
+  scaleShaftXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+  scaleHeadXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+
+  Ogre::MovableObject *scaleShaftYObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_SCALE_SHAFT_Y__" + this->GetName(), "axis_shaft"));
+  Ogre::MovableObject *scaleHeadYObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_SCALE_HEAD_Y__" + this->GetName(), "unit_box"));
+  Ogre::SceneNode *scaleShaftYNode =
+      dPtr->scaleYVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ_SCALE_SHAFT_NODE_Y__"  + this->GetName());
+  Ogre::SceneNode *scaleHeadYNode =
+      dPtr->scaleYVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ_SCALE_HEAD_NODE_Y__"  + this->GetName());
+  scaleShaftYNode->attachObject(scaleShaftYObj);
+  scaleShaftYNode->setScale(0.5, 0.5, 1.0);
+  scaleShaftYNode->setPosition(0, 0, 0.1);
+  scaleHeadYNode->attachObject(scaleHeadYObj);
+  scaleHeadYNode->setScale(0.02, 0.02, 0.02);
+  scaleHeadYNode->setPosition(0, 0, 0.21);
+  scaleShaftYObj->setUserAny(Ogre::Any(std::string("scale_y")));
+  scaleHeadYObj->setUserAny(Ogre::Any(std::string("scale_y")));
+  scaleShaftYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+  scaleHeadYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+
+  Ogre::MovableObject *scaleShaftZObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_SCALE_SHAFT_Z__" + this->GetName(), "axis_shaft"));
+  Ogre::MovableObject *scaleHeadZObj =
+      (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+      "__SELECTION_OBJ_SCALE_HEAD_Z__" + this->GetName(), "unit_box"));
+  Ogre::SceneNode *scaleShaftZNode =
+      dPtr->scaleZVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ_SCALE_SHAFT_NODE_Z__"  + this->GetName());
+  Ogre::SceneNode *scaleHeadZNode =
+      dPtr->scaleZVisual->GetSceneNode()->createChildSceneNode(
+      "__SELECTION_OBJ_SCALE_HEAD_NODE_Z__"  + this->GetName());
+  scaleShaftZNode->attachObject(scaleShaftZObj);
+  scaleShaftZNode->setScale(0.5, 0.5, 1.0);
+  scaleShaftZNode->setPosition(0, 0, 0.1);
+  scaleHeadZNode->attachObject(scaleHeadZObj);
+  scaleHeadZNode->setScale(0.02, 0.02, 0.02);
+  scaleHeadZNode->setPosition(0, 0, 0.21);
+  scaleShaftZObj->setUserAny(Ogre::Any(std::string("scale_z")));
+  scaleHeadZObj->setUserAny(Ogre::Any(std::string("scale_z")));
+  scaleShaftZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+  scaleHeadZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
+
+  dPtr->scaleXVisual->SetRotation(
+      math::Quaternion(math::Vector3(0, 1, 0), GZ_DTOR(90)));
+  dPtr->scaleYVisual->SetRotation(
+      math::Quaternion(math::Vector3(1, 0, 0), GZ_DTOR(-90)));
+
+  dPtr->scaleXVisual->SetMaterial(dPtr->xAxisMatOverlay);
+  dPtr->scaleYVisual->SetMaterial(dPtr->yAxisMatOverlay);
+  dPtr->scaleZVisual->SetMaterial(dPtr->zAxisMatOverlay);
+
+  dPtr->scaleVisual->SetScale(math::Vector3(5.0, 5.0, 5.0));
+
+  dPtr->scaleXVisual->SetVisibilityFlags(
+      GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
+  dPtr->scaleYVisual->SetVisibilityFlags(
+      GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
+  dPtr->scaleZVisual->SetVisibilityFlags(
+      GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
+
+  // Add to scene so they are selectable by the mouse
+  dPtr->scene->AddVisual(dPtr->scaleXVisual);
+  dPtr->scene->AddVisual(dPtr->scaleYVisual);
+  dPtr->scene->AddVisual(dPtr->scaleZVisual);
+}
diff --git a/gazebo/rendering/SelectionObj.hh b/gazebo/rendering/SelectionObj.hh
index c845c8a..11a698d 100644
--- a/gazebo/rendering/SelectionObj.hh
+++ b/gazebo/rendering/SelectionObj.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,81 +14,120 @@
  * limitations under the License.
  *
 */
-#ifndef _SELECTION_OBJ_
-#define _SELECTION_OBJ_
+#ifndef _SELECTIONOBJ_HH_
+#define _SELECTIONOBJ_HH_
 
 #include <string>
 
-#include "math/Vector3.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace rendering
   {
-    class Scene;
-
     /// \addtogroup gazebo_rendering
     /// \{
 
-    /// \class SelectionObj SelectionObj.hh rendering/rendering.hh
-    /// \brief A graphical selection object
-    ///
-    /// Used to draw a visual around a selected object.
-    class SelectionObj
+    /// \class SelectionObj SelectionObj.hh
+    /// \brief Interactive selection object for models and links
+    class GAZEBO_VISIBLE SelectionObj : public Visual
     {
+      /// \enum Manipulation modes
+      /// \brief Unique identifiers for manipulation modes.
+      public: enum SelectionMode
+      {
+        /// \brief Translation in x
+        SELECTION_NONE = 0,
+        /// \brief Translation mode
+        TRANS,
+        /// \brief Rotation mode
+        ROT,
+        /// \brief Scale mode
+        SCALE,
+        /// \brief Translation in x
+        TRANS_X,
+        /// \brief Translation in y
+        TRANS_Y,
+        /// \brief Translation in z
+        TRANS_Z,
+        /// \brief Rotation in x
+        ROT_X,
+        /// \brief Rotation in y
+        ROT_Y,
+        /// \brief Rotation in z
+        ROT_Z,
+        /// \brief Scale in x
+        SCALE_X,
+        /// \brief Scale in y
+        SCALE_Y,
+        /// \brief Scale in z
+        SCALE_Z
+      };
+
       /// \brief Constructor
-      /// \param[in] _scene Scene to use.
-      public: SelectionObj(Scene *_scene);
+      /// \param[in] _name Name of selection object.
+      /// \param[in] _vis Parent visual that the selection object is
+      /// attached to.
+      public: SelectionObj(const std::string &_name, VisualPtr _vis);
 
-      /// \brief Destructor
+      /// \brief Deconstructor
       public: virtual ~SelectionObj();
 
-      /// \brief Initialize the rendering::SelectionObj object
-      public: void Init();
+      /// \brief Load
+      public: void Load();
 
-      /// \brief Set the position of the node
-      /// \param[in] This draws the selection object around the passed in
-      /// visual.
-      public: void Attach(VisualPtr _visual);
+      /// \brief Attach the selection object to the given visual
+      /// \param[in] _vis Pointer to visual to which the selection object
+      /// will be attached.
+      public: void Attach(rendering::VisualPtr _vis);
+
+      /// \brief Detach the selection object from the current visual.
+      public: void Detach();
 
-      /// \brief Clear the rendering::SelectionObj object
-      public: void Clear();
+      /// \brief Set the manipulation mode.
+      /// \param[in] _mode Manipulation mode in string: translate rotate, scale.
+      public: void SetMode(const std::string &_mode);
 
-      /// \brief Return true if the user is move the selection obj
-      /// \return True if something is selected.
-      public: bool IsActive() const;
+      /// \brief Set the selection mode.
+      /// \_name Selection mode: TRANS, ROT, SCALE.
+      public: void SetMode(SelectionMode _mode);
 
-      /// \brief Set true if the user is moving the selection obj
-      /// \param[in] _active True if the user is interacting with the
-      /// selection object.
-      public: void SetActive(bool _active);
+      /// \brief Set state by highlighting the corresponding selection object
+      /// visual.
+      /// \param[in] _state Selection state in string format.
+      public: void SetState(const std::string &_state);
+
+      /// \brief Set state by highlighting the corresponding selection object
+      /// visual.
+      /// \param[in] _state Selection state.
+      /// \sa SelectionMode
+      public: void SetState(SelectionMode _state);
 
-      /// \brief Get the name of the visual the selection obj is attached to
-      /// \return Name of the selected visual.
-      public: std::string GetVisualName() const;
+      /// \brief Get the current selection state.
+      public: SelectionMode GetState();
 
-      /// \brief Highlight the selection object based on a modifier
-      /// \param[in] _mod Modifier used when highlighting the selection
-      /// object.
-      public: void SetHighlight(const std::string &_mod);
+      /// \brief Get the current selection mode.
+      public: SelectionMode GetMode();
 
-      /// \brief The visual node for the selection object
-      private: VisualPtr node;
+      /// \brief Set selection object to ignore local transforms.
+      /// \param[in] _global True to set the visuals to be in global frame.
+      public: void SetGlobal(bool _global);
 
-      /// \brief Pointer to the scene
-      private: Scene *scene;
+      /// \brief Update selection object size to match the parent visual.
+      public: void UpdateSize();
 
-      /// \brief Name of the visual selected.
-      private: std::string visualName;
+      /// \brief Helper function to create scale visuals.
+      private: void CreateScaleVisual();
 
-      /// \brief True if a user is interacting with the selection object.
-      private: bool active;
+      /// \brief Helper function to create rotate visuals.
+      private: void CreateRotateVisual();
 
-      /// \brief Size of the selection object box.
-      private: double boxSize;
+      /// \brief Helper function to create translate visuals.
+      private: void CreateTranslateVisual();
     };
     /// \}
   }
 }
+
 #endif
diff --git a/gazebo/rendering/SelectionObjPrivate.hh b/gazebo/rendering/SelectionObjPrivate.hh
new file mode 100644
index 0000000..c3398c9
--- /dev/null
+++ b/gazebo/rendering/SelectionObjPrivate.hh
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _SELECTIONOBJ_PRIVATE_HH_
+#define _SELECTIONOBJ_PRIVATE_HH_
+
+#include <string>
+
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+#include "gazebo/rendering/SelectionObj.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the Selection Obj class.
+    class SelectionObjPrivate : public VisualPrivate
+    {
+      /// \brief Translation visual.
+      public: VisualPtr transVisual;
+
+      /// \brief X translation visual.
+      public: VisualPtr transXVisual;
+
+      /// \brief Y translation visual.
+      public: VisualPtr transYVisual;
+
+      /// \brief Z translation visual.
+      public: VisualPtr transZVisual;
+
+      /// \brief Scale visual.
+      public: VisualPtr scaleVisual;
+
+      /// \brief X scale visual.
+      public: VisualPtr scaleXVisual;
+
+      /// \brief Y Scale visual.
+      public: VisualPtr scaleYVisual;
+
+      /// \brief Z scale visual.
+      public: VisualPtr scaleZVisual;
+
+      /// \brief Rotation visual.
+      public: VisualPtr rotVisual;
+
+      /// \brief X rotation visual.
+      public: VisualPtr rotXVisual;
+
+      /// \brief Y rotation visual.
+      public: VisualPtr rotYVisual;
+
+      /// \brief Z rotation visual.
+      public: VisualPtr rotZVisual;
+
+      /// \brief Current manipulation mode.
+      public: SelectionObj::SelectionMode mode;
+
+      /// \brief Current selection state.
+      public: SelectionObj::SelectionMode state;
+
+      /// \brief Pointer to visual that is currently selected.
+      public: VisualPtr selectedVis;
+
+      /// \brief Minimum scale of the selection object visual.
+      public: double minScale;
+
+      /// \brief Maximum scale of the selection object visual.
+      public: double maxScale;
+
+      /// \brief Material name for the x axis.
+      public: std::string xAxisMat;
+
+      /// \brief Material name for the y axis.
+      public: std::string yAxisMat;
+
+      /// \brief Material name for the z axis.
+      public: std::string zAxisMat;
+
+      /// \brief Overlay material name for the x axis.
+      public: std::string xAxisMatOverlay;
+
+      /// \brief Overlay material name for the y axis.
+      public: std::string yAxisMatOverlay;
+
+      /// \brief Overlay material name for the z axis.
+      public: std::string zAxisMatOverlay;
+    };
+  }
+}
+
+#endif
diff --git a/gazebo/rendering/SonarVisual.cc b/gazebo/rendering/SonarVisual.cc
new file mode 100644
index 0000000..70ca766
--- /dev/null
+++ b/gazebo/rendering/SonarVisual.cc
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/transport/transport.hh"
+
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/SonarVisualPrivate.hh"
+#include "gazebo/rendering/SonarVisual.hh"
+
+using namespace gazebo;
+using namespace rendering;
+
+/////////////////////////////////////////////////
+SonarVisual::SonarVisual(const std::string &_name, VisualPtr _vis,
+                         const std::string &_topicName)
+  : Visual(*new SonarVisualPrivate, _name, _vis)
+{
+  SonarVisualPrivate *dPtr =
+      reinterpret_cast<SonarVisualPrivate *>(this->dataPtr);
+
+  dPtr->receivedMsg = false;
+
+  dPtr->node = transport::NodePtr(new transport::Node());
+  dPtr->node->Init(dPtr->scene->GetName());
+
+  dPtr->sonarSub = dPtr->node->Subscribe(_topicName,
+      &SonarVisual::OnMsg, this, true);
+
+  dPtr->sonarRay = this->CreateDynamicLine(rendering::RENDERING_LINE_LIST);
+  dPtr->sonarRay->setMaterial("Gazebo/RedGlow");
+  dPtr->sonarRay->AddPoint(0, 0, 0);
+  dPtr->sonarRay->AddPoint(0, 0, 0);
+
+  // Make sure the meshes are in Ogre
+  this->InsertMesh("unit_cone");
+  Ogre::MovableObject *coneObj =
+    (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+          this->GetName()+"__SONAR_CONE__", "unit_cone"));
+  ((Ogre::Entity*)coneObj)->setMaterialName("Gazebo/BlueLaser");
+
+  dPtr->coneNode =
+      dPtr->sceneNode->createChildSceneNode(this->GetName() + "_SONAR_CONE");
+  dPtr->coneNode->attachObject(coneObj);
+  dPtr->coneNode->setPosition(0, 0, 0);
+
+  dPtr->connections.push_back(
+      event::Events::ConnectPreRender(
+        boost::bind(&SonarVisual::Update, this)));
+}
+
+/////////////////////////////////////////////////
+SonarVisual::~SonarVisual()
+{
+  SonarVisualPrivate *dPtr =
+      reinterpret_cast<SonarVisualPrivate *>(this->dataPtr);
+
+  delete dPtr->sonarRay;
+  dPtr->sonarRay = NULL;
+}
+
+/////////////////////////////////////////////////
+void SonarVisual::Load()
+{
+  Visual::Load();
+  this->SetVisibilityFlags(GZ_VISIBILITY_GUI);
+  this->SetCastShadows(false);
+}
+
+/////////////////////////////////////////////////
+void SonarVisual::OnMsg(ConstSonarStampedPtr &_msg)
+{
+  SonarVisualPrivate *dPtr =
+      reinterpret_cast<SonarVisualPrivate *>(this->dataPtr);
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+  dPtr->sonarMsg = _msg;
+  dPtr->receivedMsg = true;
+}
+
+/////////////////////////////////////////////////
+void SonarVisual::Update()
+{
+  SonarVisualPrivate *dPtr =
+      reinterpret_cast<SonarVisualPrivate *>(this->dataPtr);
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+
+  if (!dPtr->sonarMsg || !dPtr->receivedMsg)
+    return;
+
+  // Skip the update if the user is moving the sonar.
+  if (this->GetScene()->GetSelectedVisual() &&
+      this->GetRootVisual()->GetName() ==
+      this->GetScene()->GetSelectedVisual()->GetName())
+  {
+    return;
+  }
+
+  float rangeDelta = dPtr->sonarMsg->sonar().range_max()
+      - dPtr->sonarMsg->sonar().range_min();
+  float radiusScale = dPtr->sonarMsg->sonar().radius()*2.0;
+
+  if (!math::equal(dPtr->coneNode->getScale().z, rangeDelta) ||
+      !math::equal(dPtr->coneNode->getScale().x, radiusScale))
+  {
+    dPtr->coneNode->setScale(radiusScale, radiusScale, rangeDelta);
+    dPtr->sonarRay->SetPoint(0, math::Vector3(0, 0, rangeDelta * 0.5));
+  }
+
+  math::Pose pose = msgs::Convert(dPtr->sonarMsg->sonar().world_pose());
+  this->SetPose(pose);
+
+  if (dPtr->sonarMsg->sonar().has_contact())
+  {
+    math::Vector3 pos = msgs::Convert(dPtr->sonarMsg->sonar().contact());
+    dPtr->sonarRay->SetPoint(1, pos);
+  }
+  else
+  {
+    dPtr->sonarRay->SetPoint(1, math::Vector3(0, 0,
+          (rangeDelta * 0.5) - dPtr->sonarMsg->sonar().range()));
+  }
+  dPtr->receivedMsg = false;
+}
diff --git a/gazebo/rendering/SonarVisual.hh b/gazebo/rendering/SonarVisual.hh
new file mode 100644
index 0000000..205cc8f
--- /dev/null
+++ b/gazebo/rendering/SonarVisual.hh
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SONARVISUAL_HH_
+#define _SONARVISUAL_HH_
+
+#include <string>
+
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \addtogroup gazebo_rendering
+    /// \{
+
+    /// \class SonarVisual SonarVisual.hh rendering/rendering.hh
+    /// \brief Visualization for sonar data.
+    class GAZEBO_VISIBLE SonarVisual : public Visual
+    {
+      /// \brief Constructor.
+      /// \param[in] _name Name of the visual.
+      /// \param[in] _vis Pointer to the parent Visual.
+      /// \param[in] _topicName Name of the topic that has sonar data.
+      public: SonarVisual(const std::string &_name, VisualPtr _vis,
+                          const std::string &_topicName);
+
+      /// \brief Destructor.
+      public: virtual ~SonarVisual();
+
+      // Documentation inherited
+      public: virtual void Load();
+
+      /// \brief Update the Visual
+      private: void Update();
+
+      /// \brief Callback when sonar data is received.
+      private: void OnMsg(ConstSonarStampedPtr &_msg);
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/rendering/SonarVisualPrivate.hh b/gazebo/rendering/SonarVisualPrivate.hh
new file mode 100644
index 0000000..561da07
--- /dev/null
+++ b/gazebo/rendering/SonarVisualPrivate.hh
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SONARVISUAL_PRIVATE_HH_
+#define _SONARVISUAL_PRIVATE_HH_
+
+#include <vector>
+
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    class DynamicLines;
+
+    /// \brief Private data for the Sonar Visual class.
+    class SonarVisualPrivate : public VisualPrivate
+    {
+      /// \brief Pointer to a node that handles communication.
+      public: transport::NodePtr node;
+
+      /// \brief Subscription to the sonar data.
+      public: transport::SubscriberPtr sonarSub;
+
+      /// \brief Renders the sonar data reading.
+      public: DynamicLines *sonarRay;
+
+      /// \brief Renders the sonar cone.
+      public: Ogre::SceneNode *coneNode;
+
+      /// \brief The current sonar message.
+      public: boost::shared_ptr<msgs::SonarStamped const> sonarMsg;
+
+      /// \brief All the event connections.
+      public: std::vector<event::ConnectionPtr> connections;
+
+      /// \brief Mutex to protect the contact message.
+      public: boost::mutex mutex;
+
+      /// \brief True if we have received a message.
+      public: bool receivedMsg;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/TransmitterVisual.cc b/gazebo/rendering/TransmitterVisual.cc
new file mode 100644
index 0000000..8601447
--- /dev/null
+++ b/gazebo/rendering/TransmitterVisual.cc
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/transport/transport.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/TransmitterVisualPrivate.hh"
+#include "gazebo/rendering/TransmitterVisual.hh"
+
+using namespace gazebo;
+using namespace rendering;
+
+/////////////////////////////////////////////////
+TransmitterVisual::TransmitterVisual(const std::string &_name, VisualPtr _vis,
+    const std::string &_topicName)
+    : Visual(*new TransmitterVisualPrivate, _name, _vis)
+{
+  TransmitterVisualPrivate *dPtr =
+      reinterpret_cast<TransmitterVisualPrivate *>(this->dataPtr);
+
+  dPtr->isFirst = true;
+  dPtr->receivedMsg = false;
+
+  dPtr->node = transport::NodePtr(new transport::Node());
+  dPtr->node->Init(dPtr->scene->GetName());
+
+  dPtr->signalPropagationSub = dPtr->node->Subscribe(_topicName,
+      &TransmitterVisual::OnNewPropagationGrid, this);
+
+  dPtr->connections.push_back(
+      event::Events::ConnectPreRender(
+        boost::bind(&TransmitterVisual::Update, this)));
+
+  dPtr->points = this->CreateDynamicLine(rendering::RENDERING_POINT_LIST);
+  dPtr->points->setMaterial("Gazebo/PointCloud");
+}
+
+/////////////////////////////////////////////////
+TransmitterVisual::~TransmitterVisual()
+{
+  TransmitterVisualPrivate *dPtr =
+      reinterpret_cast<TransmitterVisualPrivate *>(this->dataPtr);
+
+  DeleteDynamicLine(dPtr->points);
+  dPtr->signalPropagationSub.reset();
+}
+
+/////////////////////////////////////////////////
+void TransmitterVisual::Load()
+{
+  Visual::Load();
+}
+
+/////////////////////////////////////////////////
+void TransmitterVisual::OnNewPropagationGrid(ConstPropagationGridPtr &_msg)
+{
+  TransmitterVisualPrivate *dPtr =
+      reinterpret_cast<TransmitterVisualPrivate *>(this->dataPtr);
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+
+  // Just copy the received data but do not update the UI
+  dPtr->gridMsg = _msg;
+  dPtr->receivedMsg = true;
+}
+
+////////////////////////////////////////////////
+void TransmitterVisual::Update()
+{
+  TransmitterVisualPrivate *dPtr =
+      reinterpret_cast<TransmitterVisualPrivate *>(this->dataPtr);
+
+  gazebo::msgs::PropagationParticle p;
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+
+  if (!dPtr->gridMsg || !dPtr->receivedMsg)
+    return;
+
+  // Update the visualization of the last propagation grid received
+  dPtr->receivedMsg = false;
+
+  if (dPtr->isFirst)
+  {
+    for (int i = 0; i < dPtr->gridMsg->particle_size(); ++i)
+    {
+      p = dPtr->gridMsg->particle(i);
+      dPtr->points->AddPoint(p.x(), p.y(), 0.0);
+    }
+    dPtr->isFirst = false;
+  }
+
+  // Update the list of visual elements
+  for (int i = 0; i < dPtr->gridMsg->particle_size(); ++i)
+  {
+    p = dPtr->gridMsg->particle(i);
+    dPtr->points->SetPoint(i, math::Vector3(p.x(), p.y(), 0));
+
+    // Crop the signal strength between 0 and 255
+    double strength = std::min(std::max(0.0, -p.signal_level()), 255.0);
+    // Normalize
+    strength = 1.0 - (strength / 255.0);
+
+    // Set the color in gray scale
+    common::Color color(strength, strength, strength);
+    dPtr->points->SetColor(i, color);
+  }
+}
diff --git a/gazebo/rendering/TransmitterVisual.hh b/gazebo/rendering/TransmitterVisual.hh
new file mode 100644
index 0000000..99e83fc
--- /dev/null
+++ b/gazebo/rendering/TransmitterVisual.hh
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _TRANSMITTERVISUAL_HH_
+#define _TRANSMITTERVISUAL_HH_
+
+#include <string>
+
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/Visual.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \addtogroup gazebo_rendering
+    /// \{
+
+    /// \class TransmitterVisual TransmitterVisual.hh rendering/rendering.hh
+    /// \brief Visualization for the wireless propagation data.
+    class GAZEBO_VISIBLE TransmitterVisual : public Visual
+    {
+      /// \brief Constructor.
+      /// \param[in] _name Name of the visual.
+      /// \param[in] _vis Pointer to the parent Visual.
+      /// \param[in] _topicName Name of the topic that has laser data.
+      public: TransmitterVisual(const std::string &_name, VisualPtr _vis,
+                                const std::string &_topicName);
+
+      /// \brief Destructor.
+      public: virtual ~TransmitterVisual();
+
+      /// Documentation inherited from parent.
+      public: virtual void Load();
+
+      /// \brief Function that runs on the OGRE thread to refresh the UI.
+      public: virtual void Update();
+
+      /// \brief Callback when a new propagation grid is received
+      /// \brief[in] _msg New transmitter propagation grid received
+      private: void OnNewPropagationGrid(ConstPropagationGridPtr &_msg);
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/rendering/TransmitterVisualPrivate.hh b/gazebo/rendering/TransmitterVisualPrivate.hh
new file mode 100644
index 0000000..8de9de9
--- /dev/null
+++ b/gazebo/rendering/TransmitterVisualPrivate.hh
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _TRANSMITTERVISUAL_PRIVATE_HH_
+#define _TRANSMITTERVISUAL_PRIVATE_HH_
+
+#include <vector>
+
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the Transmitter Visual class.
+    class TransmitterVisualPrivate : public VisualPrivate
+    {
+      /// \brief Pointer to a node that handles communication.
+      public: transport::NodePtr node;
+
+      /// \brief Subscription to the propagation data.
+      public: transport::SubscriberPtr signalPropagationSub;
+
+      /// \brief Renders the points representing the signal strength.
+      public: DynamicLines *points;
+
+      /// \brief Use for allocate the visuals for the grid only the first time
+      /// you receive the grid. The next times there are just updates.
+      public: bool isFirst;
+
+      /// \brief Store the list of visuals
+      public: std::vector<rendering::VisualPtr> vectorLink;
+
+       /// \brief All the event connections.
+      public: std::vector<event::ConnectionPtr> connections;
+
+      /// \brief Mutex to protect the contact message.
+      public: boost::mutex mutex;
+
+      /// \brief The current contact message.
+      public: boost::shared_ptr<msgs::PropagationGrid const> gridMsg;
+
+      /// \brief True if we have received a message.
+      public: bool receivedMsg;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/UserCamera.cc b/gazebo/rendering/UserCamera.cc
index be59f8d..fca5db6 100644
--- a/gazebo/rendering/UserCamera.cc
+++ b/gazebo/rendering/UserCamera.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,28 +19,21 @@
  * Date: 19 Jun 2008
  */
 
-#include <sstream>
-
 #include "gazebo/rendering/ogre_gazebo.h"
 
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Console.hh"
-#include "gazebo/common/Exception.hh"
 #include "gazebo/common/Events.hh"
 
 #include "gazebo/rendering/selection_buffer/SelectionBuffer.hh"
 #include "gazebo/rendering/RenderEngine.hh"
 #include "gazebo/rendering/GUIOverlay.hh"
-#include "gazebo/rendering/Conversions.hh"
 #include "gazebo/rendering/WindowManager.hh"
 #include "gazebo/rendering/FPSViewController.hh"
 #include "gazebo/rendering/OrbitViewController.hh"
 #include "gazebo/rendering/RenderTypes.hh"
 #include "gazebo/rendering/Scene.hh"
-#include "gazebo/rendering/RTShaderSystem.hh"
-#include "gazebo/rendering/Camera.hh"
-#include "gazebo/rendering/Visual.hh"
-#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/UserCameraPrivate.hh"
 #include "gazebo/rendering/UserCamera.hh"
 
 using namespace gazebo;
@@ -48,31 +41,36 @@ using namespace rendering;
 
 //////////////////////////////////////////////////
 UserCamera::UserCamera(const std::string &_name, ScenePtr _scene)
-  : Camera(_name, _scene)
+  : Camera(_name, _scene),
+    dataPtr(new UserCameraPrivate)
 {
-  std::stringstream stream;
+  this->dataPtr->gui = new GUIOverlay();
 
-  this->gui = new GUIOverlay();
+  this->dataPtr->orbitViewController = NULL;
+  this->dataPtr->fpsViewController = NULL;
+  this->dataPtr->viewController = NULL;
 
-  this->orbitViewController = NULL;
-  this->fpsViewController = NULL;
-  this->viewController = NULL;
+  this->dataPtr->selectionBuffer = NULL;
 
-  this->selectionBuffer = NULL;
   // Set default UserCamera render rate to 30Hz
   this->SetRenderRate(30.0);
+
+  this->SetUseSDFPose(false);
 }
 
 //////////////////////////////////////////////////
 UserCamera::~UserCamera()
 {
-  delete this->orbitViewController;
-  delete this->fpsViewController;
+  delete this->dataPtr->orbitViewController;
+  delete this->dataPtr->fpsViewController;
 
-  delete this->gui;
-  this->gui = NULL;
+  delete this->dataPtr->gui;
+  this->dataPtr->gui = NULL;
 
   this->connections.clear();
+
+  delete this->dataPtr;
+  this->dataPtr = NULL;
 }
 
 //////////////////////////////////////////////////
@@ -90,13 +88,18 @@ void UserCamera::Load()
 //////////////////////////////////////////////////
 void UserCamera::Init()
 {
-  this->orbitViewController = new OrbitViewController(
+  this->dataPtr->orbitViewController = new OrbitViewController(
       boost::dynamic_pointer_cast<UserCamera>(shared_from_this()));
-  this->fpsViewController = new FPSViewController(
+  this->dataPtr->fpsViewController = new FPSViewController(
       boost::dynamic_pointer_cast<UserCamera>(shared_from_this()));
-  this->viewController = this->orbitViewController;
+  this->dataPtr->viewController = this->dataPtr->orbitViewController;
 
   Camera::Init();
+
+  // Don't yaw along variable axis, causes leaning
+  this->camera->setFixedYawAxis(true, Ogre::Vector3::UNIT_Z);
+  this->camera->setDirection(1, 0, 0);
+
   this->SetHFOV(GZ_DTOR(60));
 
   // Careful when setting this value.
@@ -124,7 +127,7 @@ void UserCamera::Init()
   // window is resized
   /*
   this->axisNode =
-    this->pitchNode->createChildSceneNode(this->name + "AxisNode");
+    this->sceneNode->createChildSceneNode(this->name + "AxisNode");
 
   const Ogre::Vector3 *corners =
     this->camera->getWorldSpaceCorners();
@@ -171,7 +174,7 @@ void UserCamera::Init()
 void UserCamera::SetWorldPose(const math::Pose &_pose)
 {
   Camera::SetWorldPose(_pose);
-  this->viewController->Init();
+  this->dataPtr->viewController->Init();
 }
 
 //////////////////////////////////////////////////
@@ -179,14 +182,14 @@ void UserCamera::Update()
 {
   Camera::Update();
 
-  if (this->gui)
-    this->gui->Update();
+  if (this->dataPtr->gui)
+    this->dataPtr->gui->Update();
 }
 
 //////////////////////////////////////////////////
 void UserCamera::AnimationComplete()
 {
-  this->viewController->Init();
+  this->dataPtr->viewController->Init();
 }
 
 //////////////////////////////////////////////////
@@ -204,33 +207,45 @@ void UserCamera::Fini()
 //////////////////////////////////////////////////
 void UserCamera::HandleMouseEvent(const common::MouseEvent &_evt)
 {
-  if (!this->gui || !this->gui->HandleMouseEvent(_evt))
+  if (!this->dataPtr->gui || !this->dataPtr->gui->HandleMouseEvent(_evt))
   {
-    if (this->selectionBuffer)
-      this->selectionBuffer->Update();
+    if (this->dataPtr->selectionBuffer)
+      this->dataPtr->selectionBuffer->Update();
 
-    // DEBUG: this->selectionBuffer->ShowOverlay(true);
+    // DEBUG: this->dataPtr->selectionBuffer->ShowOverlay(true);
 
     // Don't update the camera if it's being animated.
     if (!this->animState)
-      this->viewController->HandleMouseEvent(_evt);
+      this->dataPtr->viewController->HandleMouseEvent(_evt);
   }
 }
 
 /////////////////////////////////////////////////
 void UserCamera::HandleKeyPressEvent(const std::string &_key)
 {
-  if (this->gui)
-    this->gui->HandleKeyPressEvent(_key);
-  this->viewController->HandleKeyPressEvent(_key);
+  if (this->dataPtr->gui)
+    this->dataPtr->gui->HandleKeyPressEvent(_key);
+  this->dataPtr->viewController->HandleKeyPressEvent(_key);
 }
 
 /////////////////////////////////////////////////
 void UserCamera::HandleKeyReleaseEvent(const std::string &_key)
 {
-  if (this->gui)
-    this->gui->HandleKeyReleaseEvent(_key);
-  this->viewController->HandleKeyReleaseEvent(_key);
+  if (this->dataPtr->gui)
+    this->dataPtr->gui->HandleKeyReleaseEvent(_key);
+  this->dataPtr->viewController->HandleKeyReleaseEvent(_key);
+}
+
+/////////////////////////////////////////////////
+bool UserCamera::IsCameraSetInWorldFile()
+{
+  return this->dataPtr->isCameraSetInWorldFile;
+}
+
+//////////////////////////////////////////////////
+void UserCamera::SetUseSDFPose(bool _value)
+{
+  this->dataPtr->isCameraSetInWorldFile = _value;
 }
 
 /////////////////////////////////////////////////
@@ -241,9 +256,7 @@ bool UserCamera::AttachToVisualImpl(VisualPtr _visual, bool _inheritOrientation,
   if (_visual)
   {
     math::Pose origPose = this->GetWorldPose();
-    double yaw = atan2(origPose.pos.x - _visual->GetWorldPose().pos.x,
-                       origPose.pos.y - _visual->GetWorldPose().pos.y);
-    yaw = _visual->GetWorldPose().rot.GetAsEuler().z;
+    double yaw = _visual->GetWorldPose().rot.GetAsEuler().z;
 
     double zDiff = origPose.pos.z - _visual->GetWorldPose().pos.z;
     double pitch = 0;
@@ -274,10 +287,11 @@ bool UserCamera::AttachToVisualImpl(VisualPtr _visual, bool _inheritOrientation,
 bool UserCamera::TrackVisualImpl(VisualPtr _visual)
 {
   Camera::TrackVisualImpl(_visual);
-  if (_visual)
+  /*if (_visual)
     this->SetViewController(OrbitViewController::GetTypeString());
   else
     this->SetViewController(FPSViewController::GetTypeString());
+    */
 
   return true;
 }
@@ -285,34 +299,34 @@ bool UserCamera::TrackVisualImpl(VisualPtr _visual)
 //////////////////////////////////////////////////
 void UserCamera::SetViewController(const std::string &type)
 {
-  if (this->viewController->GetTypeString() == type)
+  if (this->dataPtr->viewController->GetTypeString() == type)
     return;
 
   if (type == OrbitViewController::GetTypeString())
-    this->viewController = this->orbitViewController;
+    this->dataPtr->viewController = this->dataPtr->orbitViewController;
   else if (type == FPSViewController::GetTypeString())
-    this->viewController = this->fpsViewController;
+    this->dataPtr->viewController = this->dataPtr->fpsViewController;
   else
     gzthrow("Invalid view controller type: " + type);
 
-  this->viewController->Init();
+  this->dataPtr->viewController->Init();
 }
 
 //////////////////////////////////////////////////
 void UserCamera::SetViewController(const std::string &type,
                                     const math::Vector3 &_pos)
 {
-  if (this->viewController->GetTypeString() == type)
+  if (this->dataPtr->viewController->GetTypeString() == type)
     return;
 
   if (type == OrbitViewController::GetTypeString())
-    this->viewController = this->orbitViewController;
+    this->dataPtr->viewController = this->dataPtr->orbitViewController;
   else if (type == FPSViewController::GetTypeString())
-    this->viewController = this->fpsViewController;
+    this->dataPtr->viewController = this->dataPtr->fpsViewController;
   else
     gzthrow("Invalid view controller type: " + type);
 
-  this->viewController->Init(_pos);
+  this->dataPtr->viewController->Init(_pos);
 }
 
 //////////////////////////////////////////////////
@@ -337,14 +351,14 @@ void UserCamera::Resize(unsigned int /*_w*/, unsigned int /*_h*/)
                    static_cast<double>(this->viewport->getActualHeight());
 
     double hfov =
-      this->sdf->GetValueDouble("horizontal_fov");
+      this->sdf->Get<double>("horizontal_fov");
     double vfov = 2.0 * atan(tan(hfov / 2.0) / ratio);
     this->camera->setAspectRatio(ratio);
     this->camera->setFOVy(Ogre::Radian(vfov));
 
-    if (this->gui)
+    if (this->dataPtr->gui)
     {
-      this->gui->Resize(this->viewport->getActualWidth(),
+      this->dataPtr->gui->Resize(this->viewport->getActualWidth(),
                         this->viewport->getActualHeight());
     }
 
@@ -363,13 +377,15 @@ void UserCamera::SetViewportDimensions(float /*x_*/, float /*y_*/,
 //////////////////////////////////////////////////
 float UserCamera::GetAvgFPS() const
 {
-  return WindowManager::Instance()->GetAvgFPS(this->windowId);
+  return RenderEngine::Instance()->GetWindowManager()->GetAvgFPS(
+      this->windowId);
 }
 
 //////////////////////////////////////////////////
-float UserCamera::GetTriangleCount() const
+unsigned int UserCamera::GetTriangleCount() const
 {
-  return WindowManager::Instance()->GetTriangleCount(this->windowId);
+  return RenderEngine::Instance()->GetWindowManager()->GetTriangleCount(
+      this->windowId);
 }
 
 //////////////////////////////////////////////////
@@ -435,8 +451,9 @@ void UserCamera::MoveToVisual(VisualPtr _visual)
 
   double yawAngle = atan2(dir.y, dir.x);
   double pitchAngle = atan2(-dir.z, sqrt(dir.x*dir.x + dir.y*dir.y));
-  Ogre::Quaternion yawFinal(Ogre::Radian(yawAngle), Ogre::Vector3(0, 0, 1));
-  Ogre::Quaternion pitchFinal(Ogre::Radian(pitchAngle), Ogre::Vector3(0, 1, 0));
+  math::Quaternion pitchYawOnly(0, pitchAngle, yawAngle);
+  Ogre::Quaternion pitchYawFinal(pitchYawOnly.w, pitchYawOnly.x,
+    pitchYawOnly.y, pitchYawOnly.z);
 
   dir.Normalize();
 
@@ -444,7 +461,7 @@ void UserCamera::MoveToVisual(VisualPtr _visual)
 
   end = mid + dir*(dist - scale);
 
-  dist = start.Distance(end);
+  // dist = start.Distance(end);
   // double vel = 5.0;
   double time = 0.5;  // dist / vel;
 
@@ -453,7 +470,6 @@ void UserCamera::MoveToVisual(VisualPtr _visual)
   anim->setInterpolationMode(Ogre::Animation::IM_SPLINE);
 
   Ogre::NodeAnimationTrack *strack = anim->createNodeTrack(0, this->sceneNode);
-  Ogre::NodeAnimationTrack *ptrack = anim->createNodeTrack(1, this->pitchNode);
 
 
   Ogre::TransformKeyFrame *key;
@@ -462,23 +478,14 @@ void UserCamera::MoveToVisual(VisualPtr _visual)
   key->setTranslate(Ogre::Vector3(start.x, start.y, start.z));
   key->setRotation(this->sceneNode->getOrientation());
 
-  key = ptrack->createNodeKeyFrame(0);
-  key->setRotation(this->pitchNode->getOrientation());
-
   /*key = strack->createNodeKeyFrame(time * 0.5);
   key->setTranslate(Ogre::Vector3(mid.x, mid.y, mid.z));
-  key->setRotation(yawFinal);
-
-  key = ptrack->createNodeKeyFrame(time * 0.5);
-  key->setRotation(pitchFinal);
+  key->setRotation(pitchYawFinal);
   */
 
   key = strack->createNodeKeyFrame(time);
   key->setTranslate(Ogre::Vector3(end.x, end.y, end.z));
-  key->setRotation(yawFinal);
-
-  key = ptrack->createNodeKeyFrame(time);
-  key->setRotation(pitchFinal);
+  key->setRotation(pitchYawFinal);
 
   this->animState =
     this->scene->GetManager()->createAnimationState("cameratrack");
@@ -488,7 +495,8 @@ void UserCamera::MoveToVisual(VisualPtr _visual)
   this->animState->setLoop(false);
   this->prevAnimTime = common::Time::GetWallTime();
 
-  // this->orbitViewController->SetFocalPoint(_visual->GetWorldPose().pos);
+  // this->dataPtr->orbitViewController->SetFocalPoint(
+  //    _visual->GetWorldPose().pos);
   this->onAnimationComplete =
     boost::bind(&UserCamera::OnMoveToVisualComplete, this);
 }
@@ -496,8 +504,9 @@ void UserCamera::MoveToVisual(VisualPtr _visual)
 /////////////////////////////////////////////////
 void UserCamera::OnMoveToVisualComplete()
 {
-  this->orbitViewController->SetDistance(this->GetWorldPose().pos.Distance(
-        this->orbitViewController->GetFocalPoint()));
+  this->dataPtr->orbitViewController->SetDistance(
+      this->GetWorldPose().pos.Distance(
+      this->dataPtr->orbitViewController->GetFocalPoint()));
 }
 
 //////////////////////////////////////////////////
@@ -506,23 +515,26 @@ void UserCamera::SetRenderTarget(Ogre::RenderTarget *_target)
   Camera::SetRenderTarget(_target);
 
   this->viewport->setVisibilityMask(GZ_VISIBILITY_ALL);
-  this->gui->Init(this->renderTarget);
+
+  if (this->dataPtr->gui)
+    this->dataPtr->gui->Init(this->renderTarget);
+
   this->initialized = true;
 
-  this->selectionBuffer = new SelectionBuffer(this->name,
+  this->dataPtr->selectionBuffer = new SelectionBuffer(this->scopedUniqueName,
       this->scene->GetManager(), this->renderTarget);
 }
 
 //////////////////////////////////////////////////
 GUIOverlay *UserCamera::GetGUIOverlay()
 {
-  return this->gui;
+  return this->dataPtr->gui;
 }
 
 //////////////////////////////////////////////////
 void UserCamera::EnableViewController(bool _value) const
 {
-  this->viewController->SetEnabled(_value);
+  this->dataPtr->viewController->SetEnabled(_value);
 }
 
 //////////////////////////////////////////////////
@@ -530,14 +542,15 @@ VisualPtr UserCamera::GetVisual(const math::Vector2i &_mousePos,
                                 std::string &_mod)
 {
   VisualPtr result;
-  if (!this->selectionBuffer)
+
+  if (!this->dataPtr->selectionBuffer)
     return result;
 
   // Update the selection buffer
-  this->selectionBuffer->Update();
+  this->dataPtr->selectionBuffer->Update();
 
   Ogre::Entity *entity =
-    this->selectionBuffer->OnSelectionClick(_mousePos.x, _mousePos.y);
+    this->dataPtr->selectionBuffer->OnSelectionClick(_mousePos.x, _mousePos.y);
 
   _mod = "";
   if (entity)
@@ -579,7 +592,7 @@ VisualPtr UserCamera::GetVisual(const math::Vector2i &_mousePos,
 //////////////////////////////////////////////////
 void UserCamera::SetFocalPoint(const math::Vector3 &_pt)
 {
-  this->orbitViewController->SetFocalPoint(_pt);
+  this->dataPtr->orbitViewController->SetFocalPoint(_pt);
 }
 
 //////////////////////////////////////////////////
@@ -588,7 +601,7 @@ VisualPtr UserCamera::GetVisual(const math::Vector2i &_mousePos) const
   VisualPtr result;
 
   Ogre::Entity *entity =
-    this->selectionBuffer->OnSelectionClick(_mousePos.x, _mousePos.y);
+    this->dataPtr->selectionBuffer->OnSelectionClick(_mousePos.x, _mousePos.y);
 
   if (entity && !entity->getUserAny().isEmpty())
   {
@@ -602,6 +615,6 @@ VisualPtr UserCamera::GetVisual(const math::Vector2i &_mousePos) const
 //////////////////////////////////////////////////
 std::string UserCamera::GetViewControllerTypeString()
 {
-  GZ_ASSERT(this->viewController, "ViewController != NULL");
-  return this->viewController->GetTypeString();
+  GZ_ASSERT(this->dataPtr->viewController, "ViewController != NULL");
+  return this->dataPtr->viewController->GetTypeString();
 }
diff --git a/gazebo/rendering/UserCamera.hh b/gazebo/rendering/UserCamera.hh
index ecbe393..e2109a0 100644
--- a/gazebo/rendering/UserCamera.hh
+++ b/gazebo/rendering/UserCamera.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,26 +25,25 @@
 #include <string>
 #include <vector>
 
-#include "rendering/Camera.hh"
-#include "rendering/RenderTypes.hh"
-#include "common/CommonTypes.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
+  class UserCameraPrivate;
+
   namespace rendering
   {
-    class OrbitViewController;
-    class FPSViewController;
-    class Visual;
     class GUIOverlay;
-    class SelectionBuffer;
 
     /// \addtogroup gazebo_rendering
     /// \{
 
     /// \class UserCamera UserCamera.hh rendering/rendering.hh
     /// \brief A camera used for user visualization of a scene
-    class UserCamera : public Camera
+    class GAZEBO_VISIBLE UserCamera : public Camera
     {
       /// \brief Constructor
       /// \param[in] _name Name of the camera.
@@ -122,7 +121,7 @@ namespace gazebo
 
       /// \brief Get the triangle count.
       /// \return The number of triangles currently being rendered.
-      public: float GetTriangleCount() const;
+      public: unsigned int GetTriangleCount() const;
 
       /// \brief Move the camera to focus on a visual.
       /// \param[in] _visual Visual to move the camera to.
@@ -177,6 +176,14 @@ namespace gazebo
       // Documentation inherited
       public: virtual unsigned int GetImageHeight() const;
 
+      /// brief Show if the user camera pose has changed in the world file.
+      /// return true if the camera pose changed in the world file.
+      public: bool IsCameraSetInWorldFile();
+
+      /// brief Set if the user camera pose has changed in the world file.
+      /// \param[in] _value True if the camera pose changed in the world file.
+      public: void SetUseSDFPose(bool _value);
+
       /// \brief Set the camera to be attached to a visual.
       ///
       /// This causes the camera to move in relation to the specified visual.
@@ -215,26 +222,9 @@ namespace gazebo
       /// a visual.
       private: void OnMoveToVisualComplete();
 
-      /// \brief The visual used to render the camera's appearance.
-      private: Visual *visual;
-
-      /// \brief The currently active view controller.
-      private: ViewController *viewController;
-
-      /// \brief An orbit view controller.
-      private: OrbitViewController *orbitViewController;
-
-      /// \brief A FPS view controller.
-      private: FPSViewController *fpsViewController;
-
-      /// \brief The GUI overlay.
-      private: GUIOverlay *gui;
-
-      /// \brief Draws a 3D axis in the viewport.
-      // private: Ogre::SceneNode *axisNode;
-
-      /// \brief Used to select objects from mouse clicks.
-      private: SelectionBuffer *selectionBuffer;
+      /// \internal
+      /// \brief Pointer to private data.
+      private: UserCameraPrivate *dataPtr;
     };
     /// \}
   }
diff --git a/gazebo/rendering/UserCameraPrivate.hh b/gazebo/rendering/UserCameraPrivate.hh
new file mode 100644
index 0000000..8c14fa3
--- /dev/null
+++ b/gazebo/rendering/UserCameraPrivate.hh
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _USERCAMERA_PRIVATE_HH_
+#define _USERCAMERA_PRIVATE_HH_
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the UserCamera class
+    class UserCameraPrivate
+    {
+      /// \brief The currently active view controller.
+      public: ViewController *viewController;
+
+      /// \brief An orbit view controller.
+      public: OrbitViewController *orbitViewController;
+
+      /// \brief A FPS view controller.
+      public: FPSViewController *fpsViewController;
+
+      /// \brief The GUI overlay.
+      public: GUIOverlay *gui;
+
+      /// \brief Draws a 3D axis in the viewport.
+      // public: Ogre::SceneNode *axisNode;
+
+      /// \brief Used to select objects from mouse clicks.
+      public: SelectionBuffer *selectionBuffer;
+
+      /// \brief Flag to detect if the user changed the camera pose in the
+      /// world file.
+      public: bool isCameraSetInWorldFile;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/VideoVisual.cc b/gazebo/rendering/VideoVisual.cc
index f440ab1..d5ceb92 100644
--- a/gazebo/rendering/VideoVisual.cc
+++ b/gazebo/rendering/VideoVisual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,36 +15,41 @@
  *
 */
 
-#include "gazebo/rendering/ogre_gazebo.h"
 #include "gazebo/common/Video.hh"
-#include "gazebo/rendering/VideoVisual.hh"
 #include "gazebo/common/Events.hh"
 
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/VideoVisualPrivate.hh"
+#include "gazebo/rendering/VideoVisual.hh"
+
 using namespace gazebo;
 using namespace rendering;
 
 /////////////////////////////////////////////////
 VideoVisual::VideoVisual(const std::string &_name, VisualPtr _parent)
-  : Visual(_name, _parent)
+  : Visual(*new VideoVisualPrivate, _name, _parent)
 {
-  this->video = new common::Video();
-  this->video->Load("/home/nkoenig/Videos/pr2_risotto/risotto_robot.mp4");
+  VideoVisualPrivate *dPtr =
+      reinterpret_cast<VideoVisualPrivate *>(this->dataPtr);
 
-  this->width = this->video->GetWidth();
-  this->height = this->video->GetHeight();
-  double ratio = this->width / static_cast<double>(this->height);
+  dPtr->video = new common::Video();
+  dPtr->video->Load("/home/nkoenig/Videos/pr2_risotto/risotto_robot.mp4");
 
-  this->imageBuffer = new unsigned char[this->height * this->width * 3];
+  dPtr->width = dPtr->video->GetWidth();
+  dPtr->height = dPtr->video->GetHeight();
+  double ratio = dPtr->width / static_cast<double>(dPtr->height);
 
-  this->connections.push_back(event::Events::ConnectPreRender(
+  dPtr->imageBuffer = new unsigned char[dPtr->height * dPtr->width * 3];
+
+  dPtr->connections.push_back(event::Events::ConnectPreRender(
         boost::bind(&VideoVisual::PreRender, this)));
 
   // Create the texture
-  this->texture = Ogre::TextureManager::getSingleton().createManual(
+  dPtr->texture = Ogre::TextureManager::getSingleton().createManual(
     _name + "__VideoTexture__",
     Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
     Ogre::TEX_TYPE_2D,
-    this->width, this->height,
+    dPtr->width, dPtr->height,
     0,
     Ogre::PF_BYTE_BGR,
     Ogre::TU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
@@ -81,7 +86,7 @@ VideoVisual::VideoVisual(const std::string &_name, VisualPtr _parent)
   mo.convertToMesh(_name + "__VideoMesh__");
 
   Ogre::MovableObject *obj = (Ogre::MovableObject*)
-    this->sceneNode->getCreator()->createEntity(_name + "__VideoEntity__",
+    dPtr->sceneNode->getCreator()->createEntity(_name + "__VideoEntity__",
                                                 _name + "__VideoMesh__");
   obj->setCastShadows(false);
   this->AttachObject(obj);
@@ -90,17 +95,26 @@ VideoVisual::VideoVisual(const std::string &_name, VisualPtr _parent)
 /////////////////////////////////////////////////
 VideoVisual::~VideoVisual()
 {
-  delete this->video;
-  delete this->imageBuffer;
+  VideoVisualPrivate *dPtr =
+      reinterpret_cast<VideoVisualPrivate *>(this->dataPtr);
+
+  delete dPtr->video;
+  dPtr->video = NULL;
+
+  delete [] dPtr->imageBuffer;
+  dPtr->imageBuffer = NULL;
 }
 
 /////////////////////////////////////////////////
 void VideoVisual::PreRender()
 {
-  this->video->GetNextFrame(&this->imageBuffer);
+  VideoVisualPrivate *dPtr =
+      reinterpret_cast<VideoVisualPrivate *>(this->dataPtr);
+
+  dPtr->video->GetNextFrame(&dPtr->imageBuffer);
 
   // Get the pixel buffer
-  Ogre::HardwarePixelBufferSharedPtr pixelBuffer = this->texture->getBuffer();
+  Ogre::HardwarePixelBufferSharedPtr pixelBuffer = dPtr->texture->getBuffer();
 
   // Lock the pixel buffer and get a pixel box
   pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
@@ -111,25 +125,25 @@ void VideoVisual::PreRender()
   // The request pixel format of the texture is not always the one that OGRE
   // creates.
   bool unusedAlpha = Ogre::PixelUtil::getNumElemBytes(
-      this->texture->getFormat()) > 3 ? true : false;
+      dPtr->texture->getFormat()) > 3 ? true : false;
 
   // If OGRE actually created a texture with no alpha channel, then we
   // can use memcpy
   if (!unusedAlpha)
   {
-    memcpy(pDest, this->imageBuffer, this->height*this->width*3);
+    memcpy(pDest, dPtr->imageBuffer, dPtr->height*dPtr->width*3);
   }
   else
   {
     int index;
-    for (int j = 0; j < this->height; ++j)
+    for (int j = 0; j < dPtr->height; ++j)
     {
-      for (int i = 0; i < this->width; ++i)
+      for (int i = 0; i < dPtr->width; ++i)
       {
-        index = j*(this->width*3) + (i*3);
-        *pDest++ = this->imageBuffer[index + 2];  // B
-        *pDest++ = this->imageBuffer[index + 1];  // G
-        *pDest++ = this->imageBuffer[index + 0];  // R
+        index = j*(dPtr->width*3) + (i*3);
+        *pDest++ = dPtr->imageBuffer[index + 2];  // B
+        *pDest++ = dPtr->imageBuffer[index + 1];  // G
+        *pDest++ = dPtr->imageBuffer[index + 0];  // R
         *pDest++ = 255;  // Alpha
       }
     }
diff --git a/gazebo/rendering/VideoVisual.hh b/gazebo/rendering/VideoVisual.hh
index 96193b3..1fb5e12 100644
--- a/gazebo/rendering/VideoVisual.hh
+++ b/gazebo/rendering/VideoVisual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,24 +14,16 @@
  * limitations under the License.
  *
 */
-/* Desc: Video Visualization Class
- * Author: Nate Koenig
- */
 
 #ifndef _VIDEO_VISUAL_HH_
 #define _VIDEO_VISUAL_HH_
 
 #include <string>
-#include <vector>
 #include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  namespace common
-  {
-    class Video;
-  }
-
   namespace rendering
   {
     /// \addtogroup gazebo_rendering
@@ -39,7 +31,7 @@ namespace gazebo
 
     /// \class VideoVisual VideoVisual.hh rendering/rendering.hh
     /// \brief A visual element that displays a video as a texture
-    class VideoVisual : public Visual
+    class GAZEBO_VISIBLE VideoVisual : public Visual
     {
       /// \brief Constructor
       /// \param[in] _name Name of the video visual.
@@ -51,21 +43,6 @@ namespace gazebo
 
       /// \brief PreRender event callback.
       private: void PreRender();
-
-      /// \brief Load a video
-      private: common::Video *video;
-
-      /// \brief All the event connections.
-      private: std::vector<event::ConnectionPtr> connections;
-
-      /// \brief Texture to draw the video onto.
-      private: Ogre::TexturePtr texture;
-
-      /// \brief One frame of the viedeo.
-      private: unsigned char *imageBuffer;
-
-      /// \brief Width and height of the video.
-      private: int width, height;
     };
     /// \}
   }
diff --git a/gazebo/rendering/VideoVisualPrivate.hh b/gazebo/rendering/VideoVisualPrivate.hh
new file mode 100644
index 0000000..e353f4e
--- /dev/null
+++ b/gazebo/rendering/VideoVisualPrivate.hh
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _VIDEO_VISUAL_PRIVATE_HH_
+#define _VIDEO_VISUAL_PRIVATE_HH_
+
+#include <string>
+#include <vector>
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace common
+  {
+    class Video;
+  }
+
+  namespace rendering
+  {
+    /// \brief Private data for the Video Visual class.
+    class VideoVisualPrivate : public VisualPrivate
+    {
+      /// \brief Load a video
+      public: common::Video *video;
+
+      /// \brief All the event connections.
+      public: std::vector<event::ConnectionPtr> connections;
+
+      /// \brief Texture to draw the video onto.
+      public: Ogre::TexturePtr texture;
+
+      /// \brief One frame of the viedeo.
+      public: unsigned char *imageBuffer;
+
+      /// \brief Width of the video.
+      public: int width;
+
+      /// \brief Height of the video.
+      public: int height;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/ViewController.cc b/gazebo/rendering/ViewController.cc
index d714679..3a5fbfb 100644
--- a/gazebo/rendering/ViewController.cc
+++ b/gazebo/rendering/ViewController.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,8 @@
  * limitations under the License.
  *
 */
-#include "rendering/Camera.hh"
-#include "rendering/ViewController.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/rendering/ViewController.hh"
 
 using namespace gazebo;
 using namespace rendering;
diff --git a/gazebo/rendering/ViewController.hh b/gazebo/rendering/ViewController.hh
index 3abf78b..7b8998a 100644
--- a/gazebo/rendering/ViewController.hh
+++ b/gazebo/rendering/ViewController.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,8 +18,9 @@
 #define _VIEWCONTROLLER_HH_
 
 #include <string>
-#include "common/CommonTypes.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
 
     /// \class ViewController ViewController.hh rendering/rendering.hh
     /// \brief Base class for view controllers.
-    class ViewController
+    class GAZEBO_VISIBLE ViewController
     {
       /// \brief Constructor
       /// \param[in] _camera The user camera to controll.
diff --git a/gazebo/rendering/Visual.cc b/gazebo/rendering/Visual.cc
index d99cfca..f949571 100644
--- a/gazebo/rendering/Visual.cc
+++ b/gazebo/rendering/Visual.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,111 +14,145 @@
  * limitations under the License.
  *
 */
-/* Desc: Ogre Visual Class
- * Author: Nate Koenig
- * Date: 14 Dec 2007
- */
-
 #include "gazebo/rendering/ogre_gazebo.h"
-#include "gazebo/sdf/sdf.hh"
 
 #include "gazebo/msgs/msgs.hh"
+#include "gazebo/math/Vector2d.hh"
 #include "gazebo/common/Assert.hh"
+#include "gazebo/common/Event.hh"
 #include "gazebo/common/Events.hh"
-#include "gazebo/common/Common.hh"
-
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/common/Skeleton.hh"
 #include "gazebo/rendering/WireBox.hh"
 #include "gazebo/rendering/Conversions.hh"
 #include "gazebo/rendering/DynamicLines.hh"
 #include "gazebo/rendering/Scene.hh"
 #include "gazebo/rendering/RTShaderSystem.hh"
 #include "gazebo/rendering/RenderEngine.hh"
-#include "gazebo/common/MeshManager.hh"
-#include "gazebo/common/Console.hh"
-#include "gazebo/common/Exception.hh"
-#include "gazebo/common/Mesh.hh"
-#include "gazebo/common/Skeleton.hh"
 #include "gazebo/rendering/Material.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
 #include "gazebo/rendering/Visual.hh"
-#include "gazebo/common/Plugin.hh"
 
 using namespace gazebo;
 using namespace rendering;
 
+// Note: The value of GZ_UINT32_MAX is reserved as a flag.
+uint32_t VisualPrivate::visualIdCount = GZ_UINT32_MAX - 1;
 
 //////////////////////////////////////////////////
 Visual::Visual(const std::string &_name, VisualPtr _parent, bool _useRTShader)
+  : dataPtr(new VisualPrivate)
 {
-  this->boundingBox = NULL;
-  this->useRTShader = _useRTShader;
+  this->Init(_name, _parent, _useRTShader);
+}
 
-  this->sdf.reset(new sdf::Element);
-  sdf::initFile("visual.sdf", this->sdf);
+//////////////////////////////////////////////////
+Visual::Visual(const std::string &_name, ScenePtr _scene, bool _useRTShader)
+  : dataPtr(new VisualPrivate)
+{
+  this->Init(_name, _scene, _useRTShader);
+}
 
-  this->SetName(_name);
-  this->sceneNode = NULL;
-  this->animState = NULL;
-  this->initialized = false;
+//////////////////////////////////////////////////
+Visual::Visual(VisualPrivate &_dataPtr, const std::string &_name,
+    VisualPtr _parent, bool _useRTShader)
+    : dataPtr(&_dataPtr)
+{
+  this->Init(_name, _parent, _useRTShader);
+}
 
-  Ogre::SceneNode *pnode = NULL;
-  if (_parent)
-    pnode = _parent->GetSceneNode();
-  else
-  {
-    gzerr << "Create a visual, invalid parent!!!\n";
-    return;
-  }
+//////////////////////////////////////////////////
+Visual::Visual(VisualPrivate &_dataPtr, const std::string &_name,
+    ScenePtr _scene,  bool _useRTShader)
+    : dataPtr(&_dataPtr)
+{
+  this->Init(_name, _scene, _useRTShader);
+}
 
-  if (!pnode)
-  {
-    gzerr << "Unable to get parent scene node\n";
-    return;
-  }
+//////////////////////////////////////////////////
+void Visual::Init(const std::string &_name, ScenePtr _scene,
+    bool _useRTShader)
+{
+  this->dataPtr->id = this->dataPtr->visualIdCount--;
+  this->dataPtr->boundingBox = NULL;
+  this->dataPtr->useRTShader = _useRTShader;
+
+  this->dataPtr->sdf.reset(new sdf::Element);
+  sdf::initFile("visual.sdf", this->dataPtr->sdf);
+
+  this->SetName(_name);
+  this->dataPtr->sceneNode = NULL;
+  this->dataPtr->animState = NULL;
+  this->dataPtr->skeleton = NULL;
+  this->dataPtr->initialized = false;
 
   std::string uniqueName = this->GetName();
   int index = 0;
-  while (pnode->getCreator()->hasSceneNode(uniqueName))
+  while (_scene->GetManager()->hasSceneNode(uniqueName))
+  {
     uniqueName = this->GetName() + "_" +
                  boost::lexical_cast<std::string>(index++);
+  }
 
+  this->dataPtr->scene = _scene;
   this->SetName(uniqueName);
+  this->dataPtr->sceneNode =
+    this->dataPtr->scene->GetManager()->getRootSceneNode()->
+        createChildSceneNode(this->GetName());
 
-  this->sceneNode = pnode->createChildSceneNode(this->GetName());
-
-  this->parent = _parent;
-  this->scene = this->parent->GetScene();
   this->Init();
 }
 
 //////////////////////////////////////////////////
-Visual::Visual(const std::string &_name, ScenePtr _scene, bool _useRTShader)
+void Visual::Init(const std::string &_name, VisualPtr _parent,
+    bool _useRTShader)
 {
-  this->boundingBox = NULL;
-  this->useRTShader = _useRTShader;
+  this->dataPtr->id = this->dataPtr->visualIdCount--;
+  this->dataPtr->boundingBox = NULL;
+  this->dataPtr->useRTShader = _useRTShader;
+  this->dataPtr->scale = math::Vector3::One;
 
-  this->sdf.reset(new sdf::Element);
-  sdf::initFile("visual.sdf", this->sdf);
+  this->dataPtr->sdf.reset(new sdf::Element);
+  sdf::initFile("visual.sdf", this->dataPtr->sdf);
 
   this->SetName(_name);
-  this->sceneNode = NULL;
-  this->animState = NULL;
-  this->skeleton = NULL;
-  this->initialized = false;
+  this->dataPtr->sceneNode = NULL;
+  this->dataPtr->animState = NULL;
+  this->dataPtr->initialized = false;
+  this->dataPtr->lighting = true;
+
+  Ogre::SceneNode *pnode = NULL;
+  if (_parent)
+    pnode = _parent->GetSceneNode();
+  else
+  {
+    gzerr << "Create a visual, invalid parent!!!\n";
+    return;
+  }
+
+  if (!pnode)
+  {
+    gzerr << "Unable to get parent scene node\n";
+    return;
+  }
 
   std::string uniqueName = this->GetName();
   int index = 0;
-  while (_scene->GetManager()->hasSceneNode(uniqueName))
-  {
+  while (pnode->getCreator()->hasSceneNode(uniqueName))
     uniqueName = this->GetName() + "_" +
                  boost::lexical_cast<std::string>(index++);
-  }
 
-  this->scene = _scene;
   this->SetName(uniqueName);
-  this->sceneNode =
-    this->scene->GetManager()->getRootSceneNode()->createChildSceneNode(
-        this->GetName());
 
+  this->dataPtr->sceneNode = pnode->createChildSceneNode(this->GetName());
+
+  this->dataPtr->parent = _parent;
+  this->dataPtr->scene = this->dataPtr->parent->GetScene();
   this->Init();
 }
 
@@ -127,58 +161,67 @@ Visual::~Visual()
 {
   RTShaderSystem::Instance()->DetachEntity(this);
 
-  if (this->preRenderConnection)
-    event::Events::DisconnectPreRender(this->preRenderConnection);
+  if (this->dataPtr->preRenderConnection)
+    event::Events::DisconnectPreRender(this->dataPtr->preRenderConnection);
 
-  delete this->boundingBox;
+  delete this->dataPtr->boundingBox;
 
   // delete instance from lines vector
-  /*for (std::list<DynamicLines*>::iterator iter = this->lines.begin();
-       iter!= this->lines.end(); ++iter)
+  /*for (std::list<DynamicLines*>::iterator iter = this->dataPtr->lines.begin();
+       iter != this->dataPtr->lines.end(); ++iter)
     delete *iter;
     */
-  this->lines.clear();
-
+  this->dataPtr->lines.clear();
 
-  if (this->sceneNode != NULL)
+  if (this->dataPtr->sceneNode != NULL)
   {
-    this->DestroyAllAttachedMovableObjects(this->sceneNode);
-    this->sceneNode->removeAndDestroyAllChildren();
-    this->scene->GetManager()->destroySceneNode(this->sceneNode->getName());
-    this->sceneNode = NULL;
+    this->DestroyAllAttachedMovableObjects(this->dataPtr->sceneNode);
+    this->dataPtr->sceneNode->removeAndDestroyAllChildren();
+    this->dataPtr->scene->GetManager()->destroySceneNode(
+        this->dataPtr->sceneNode->getName());
+    this->dataPtr->sceneNode = NULL;
   }
 
-  this->sdf->Reset();
-  this->sdf.reset();
-  this->parent.reset();
-  this->children.clear();
+  this->dataPtr->scene.reset();
+  this->dataPtr->sdf->Reset();
+  this->dataPtr->sdf.reset();
+  this->dataPtr->parent.reset();
+  this->dataPtr->children.clear();
+
+  delete this->dataPtr;
+  this->dataPtr = 0;
 }
 
 /////////////////////////////////////////////////
 void Visual::Fini()
 {
-  this->plugins.clear();
+  this->dataPtr->plugins.clear();
+
   // Detach from the parent
-  if (this->parent)
-    this->parent->DetachVisual(this->GetName());
+  if (this->dataPtr->parent)
+    this->dataPtr->parent->DetachVisual(this->GetName());
 
   // Detach all children
   std::vector<VisualPtr>::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
-    this->sceneNode->removeChild((*iter)->GetSceneNode());
-    (*iter)->parent.reset();
+    this->dataPtr->sceneNode->removeChild((*iter)->GetSceneNode());
+    (*iter)->dataPtr->parent.reset();
+    (*iter).reset();
   }
-  this->children.clear();
 
-  if (this->sceneNode != NULL)
+  this->dataPtr->children.clear();
+
+  if (this->dataPtr->sceneNode != NULL)
   {
-    this->DestroyAllAttachedMovableObjects(this->sceneNode);
-    this->sceneNode->removeAndDestroyAllChildren();
-    this->sceneNode->detachAllObjects();
+    this->DestroyAllAttachedMovableObjects(this->dataPtr->sceneNode);
+    this->dataPtr->sceneNode->removeAndDestroyAllChildren();
+    this->dataPtr->sceneNode->detachAllObjects();
 
-    this->scene->GetManager()->destroySceneNode(this->sceneNode);
-    this->sceneNode = NULL;
+    this->dataPtr->scene->GetManager()->destroySceneNode(
+        this->dataPtr->sceneNode);
+    this->dataPtr->sceneNode = NULL;
   }
 
   RTShaderSystem::Instance()->DetachEntity(this);
@@ -188,12 +231,14 @@ void Visual::Fini()
 VisualPtr Visual::Clone(const std::string &_name, VisualPtr _newParent)
 {
   VisualPtr result(new Visual(_name, _newParent));
-  result->Load(this->sdf);
+  result->Load(this->dataPtr->sdf);
 
   std::vector<VisualPtr>::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
-    result->children.push_back((*iter)->Clone((*iter)->GetName(), result));
+    result->dataPtr->children.push_back(
+        (*iter)->Clone((*iter)->GetName(), result));
   }
 
   result->SetWorldPose(this->GetWorldPose());
@@ -203,7 +248,7 @@ VisualPtr Visual::Clone(const std::string &_name, VisualPtr _newParent)
 }
 
 /////////////////////////////////////////////////
-void Visual::DestroyAllAttachedMovableObjects(Ogre::SceneNode* _sceneNode)
+void Visual::DestroyAllAttachedMovableObjects(Ogre::SceneNode *_sceneNode)
 {
   if (!_sceneNode)
     return;
@@ -216,7 +261,7 @@ void Visual::DestroyAllAttachedMovableObjects(Ogre::SceneNode* _sceneNode)
   {
     Ogre::Entity *ent = static_cast<Ogre::Entity*>(itObject.getNext());
     if (ent->getMovableType() != DynamicLines::GetMovableType())
-      this->scene->GetManager()->destroyEntity(ent);
+      this->dataPtr->scene->GetManager()->destroyEntity(ent);
     else
       delete ent;
   }
@@ -227,7 +272,7 @@ void Visual::DestroyAllAttachedMovableObjects(Ogre::SceneNode* _sceneNode)
   while (itChild.hasMoreElements())
   {
     Ogre::SceneNode* pChildNode =
-      static_cast<Ogre::SceneNode*>(itChild.getNext());
+        static_cast<Ogre::SceneNode*>(itChild.getNext());
     this->DestroyAllAttachedMovableObjects(pChildNode);
   }
 }
@@ -235,21 +280,22 @@ void Visual::DestroyAllAttachedMovableObjects(Ogre::SceneNode* _sceneNode)
 //////////////////////////////////////////////////
 void Visual::Init()
 {
-  this->transparency = 0.0;
-  this->isStatic = false;
-  this->visible = true;
-  this->ribbonTrail = NULL;
-  this->staticGeom = NULL;
+  this->dataPtr->transparency = 0.0;
+  this->dataPtr->isStatic = false;
+  this->dataPtr->visible = true;
+  this->dataPtr->ribbonTrail = NULL;
+  this->dataPtr->staticGeom = NULL;
 
-  if (this->useRTShader)
+  if (this->dataPtr->useRTShader)
     RTShaderSystem::Instance()->AttachEntity(this);
-  this->initialized = true;
+
+  this->dataPtr->initialized = true;
 }
 
 //////////////////////////////////////////////////
 void Visual::LoadFromMsg(const boost::shared_ptr< msgs::Visual const> &_msg)
 {
-  sdf::ElementPtr geomElem = this->sdf->GetElement("geometry");
+  sdf::ElementPtr geomElem = this->dataPtr->sdf->GetElement("geometry");
   geomElem->ClearElements();
 
   if (_msg->has_geometry())
@@ -299,7 +345,7 @@ void Visual::LoadFromMsg(const boost::shared_ptr< msgs::Visual const> &_msg)
 
   if (_msg->has_pose())
   {
-    sdf::ElementPtr elem = this->sdf->GetElement("pose");
+    sdf::ElementPtr elem = this->dataPtr->sdf->GetElement("pose");
     math::Pose p(msgs::Convert(_msg->pose().position()),
                   msgs::Convert(_msg->pose().orientation()));
 
@@ -311,7 +357,7 @@ void Visual::LoadFromMsg(const boost::shared_ptr< msgs::Visual const> &_msg)
     if (_msg->material().has_script())
     {
       sdf::ElementPtr elem =
-        this->sdf->GetElement("material")->GetElement("script");
+        this->dataPtr->sdf->GetElement("material")->GetElement("script");
       elem->GetElement("name")->Set(_msg->material().script().name());
       for (int i = 0; i < _msg->material().script().uri_size(); ++i)
       {
@@ -322,46 +368,58 @@ void Visual::LoadFromMsg(const boost::shared_ptr< msgs::Visual const> &_msg)
 
     if (_msg->material().has_ambient())
     {
-      sdf::ElementPtr elem = this->sdf->GetElement("material");
+      sdf::ElementPtr elem = this->dataPtr->sdf->GetElement("material");
       elem->GetElement("ambient")->Set(
           msgs::Convert(_msg->material().ambient()));
     }
 
     if (_msg->material().has_diffuse())
     {
-      sdf::ElementPtr elem = this->sdf->GetElement("material");
+      sdf::ElementPtr elem = this->dataPtr->sdf->GetElement("material");
       elem->GetElement("diffuse")->Set(
           msgs::Convert(_msg->material().diffuse()));
     }
 
     if (_msg->material().has_specular())
     {
-      sdf::ElementPtr elem = this->sdf->GetElement("material");
+      sdf::ElementPtr elem = this->dataPtr->sdf->GetElement("material");
       elem->GetElement("specular")->Set(
           msgs::Convert(_msg->material().specular()));
     }
 
     if (_msg->material().has_emissive())
     {
-      sdf::ElementPtr elem = this->sdf->GetElement("material");
+      sdf::ElementPtr elem = this->dataPtr->sdf->GetElement("material");
       elem->GetElement("emissive")->Set(
           msgs::Convert(_msg->material().emissive()));
     }
+
+    if (_msg->material().has_lighting())
+    {
+      sdf::ElementPtr elem = this->dataPtr->sdf->GetElement("material");
+      elem->GetElement("lighting")->Set(_msg->material().lighting());
+    }
   }
 
   if (_msg->has_cast_shadows())
-    this->sdf->GetElement("cast_shadows")->Set(_msg->cast_shadows());
+    this->dataPtr->sdf->GetElement("cast_shadows")->Set(_msg->cast_shadows());
 
   if (_msg->has_laser_retro())
-    this->sdf->GetElement("laser_retro")->Set(_msg->laser_retro());
+    this->dataPtr->sdf->GetElement("laser_retro")->Set(_msg->laser_retro());
 
   if (_msg->has_plugin())
   {
-    sdf::ElementPtr elem = this->sdf->GetElement("plugin");
+    sdf::ElementPtr elem = this->dataPtr->sdf->GetElement("plugin");
     if (_msg->plugin().has_name())
       elem->GetAttribute("name")->Set(_msg->plugin().name());
     if (_msg->plugin().has_filename())
       elem->GetAttribute("filename")->Set(_msg->plugin().filename());
+    if (_msg->plugin().has_innerxml())
+    {
+      TiXmlDocument innerXML;
+      innerXML.Parse(_msg->plugin().innerxml().c_str());
+      sdf::copyChildren(elem, innerXML.RootElement());
+    }
   }
 
   this->Load();
@@ -371,9 +429,9 @@ void Visual::LoadFromMsg(const boost::shared_ptr< msgs::Visual const> &_msg)
 //////////////////////////////////////////////////
 void Visual::Load(sdf::ElementPtr _sdf)
 {
-  this->sdf->Copy(_sdf);
+  this->dataPtr->sdf->Copy(_sdf);
   this->Load();
-  this->scene->AddVisual(shared_from_this());
+  this->dataPtr->scene->AddVisual(shared_from_this());
 }
 
 //////////////////////////////////////////////////
@@ -384,11 +442,11 @@ void Visual::Load()
   Ogre::Vector3 meshSize(1, 1, 1);
   Ogre::MovableObject *obj = NULL;
 
-  if (this->parent)
-    this->parent->AttachVisual(shared_from_this());
+  if (this->dataPtr->parent)
+    this->dataPtr->parent->AttachVisual(shared_from_this());
 
   // Read the desired position and rotation of the mesh
-  pose = this->sdf->GetValuePose("pose");
+  pose = this->dataPtr->sdf->Get<math::Pose>("pose");
 
   std::string meshName = this->GetMeshName();
   std::string subMeshName = this->GetSubMeshName();
@@ -399,14 +457,15 @@ void Visual::Load()
     try
     {
       // Create the visual
-      stream << "VISUAL_" << this->sceneNode->getName();
+      stream << "VISUAL_" << this->dataPtr->sceneNode->getName();
       obj = this->AttachMesh(meshName, subMeshName, centerSubMesh,
           stream.str());
     }
     catch(Ogre::Exception &e)
     {
       gzerr << "Ogre Error:" << e.getFullDescription() << "\n";
-      gzthrow("Unable to create a mesh from " + meshName);
+      gzerr << "Unable to create a mesh from " <<  meshName << "\n";
+      return;
     }
   }
 
@@ -414,12 +473,12 @@ void Visual::Load()
   if (ent)
   {
     if (ent->hasSkeleton())
-      this->skeleton = ent->getSkeleton();
+      this->dataPtr->skeleton = ent->getSkeleton();
 
     for (unsigned int i = 0; i < ent->getNumSubEntities(); i++)
     {
       ent->getSubEntity(i)->setCustomParameter(1, Ogre::Vector4(
-          this->sdf->GetValueDouble("laser_retro"), 0.0, 0.0, 0.0));
+          this->dataPtr->sdf->Get<double>("laser_retro"), 0.0, 0.0, 0.0));
     }
   }
 
@@ -430,13 +489,47 @@ void Visual::Load()
   if (obj)
     meshSize = obj->getBoundingBox().getSize();
 
-  math::Vector3 scale = this->GetScale();
-  this->sceneNode->setScale(scale.x, scale.y, scale.z);
+  if (this->dataPtr->sdf->HasElement("geometry"))
+  {
+    sdf::ElementPtr geomElem = this->dataPtr->sdf->GetElement("geometry");
+
+    if (geomElem->HasElement("box"))
+    {
+      this->dataPtr->scale =
+          geomElem->GetElement("box")->Get<math::Vector3>("size");
+    }
+    else if (geomElem->HasElement("sphere"))
+    {
+      double r = geomElem->GetElement("sphere")->Get<double>("radius");
+      this->dataPtr->scale.Set(r * 2.0, r * 2.0, r * 2.0);
+    }
+    else if (geomElem->HasElement("cylinder"))
+    {
+      double r = geomElem->GetElement("cylinder")->Get<double>("radius");
+      double l = geomElem->GetElement("cylinder")->Get<double>("length");
+      this->dataPtr->scale.Set(r * 2.0, r * 2.0, l);
+    }
+    else if (geomElem->HasElement("plane"))
+    {
+      math::Vector2d size =
+        geomElem->GetElement("plane")->Get<math::Vector2d>("size");
+      this->dataPtr->scale.Set(size.x, size.y, 1);
+    }
+    else if (geomElem->HasElement("mesh"))
+    {
+      this->dataPtr->scale =
+          geomElem->GetElement("mesh")->Get<math::Vector3>("scale");
+    }
+  }
+
+  this->dataPtr->sceneNode->setScale(this->dataPtr->scale.x,
+      this->dataPtr->scale.y, this->dataPtr->scale.z);
 
   // Set the material of the mesh
-  if (this->sdf->HasElement("material"))
+  if (this->dataPtr->sdf->HasElement("material"))
   {
-    sdf::ElementPtr matElem = this->sdf->GetElement("material");
+    sdf::ElementPtr matElem =
+        this->dataPtr->sdf->GetElement("material");
     if (matElem->HasElement("script"))
     {
       sdf::ElementPtr scriptElem = matElem->GetElement("script");
@@ -445,65 +538,74 @@ void Visual::Load()
       // Add all the URI paths to the render engine
       while (uriElem)
       {
-        std::string matUri = uriElem->GetValueString();
+        std::string matUri = uriElem->Get<std::string>();
         if (!matUri.empty())
           RenderEngine::Instance()->AddResourcePath(matUri);
         uriElem = uriElem->GetNextElement("uri");
       }
 
-      std::string matName = scriptElem->GetValueString("name");
+      std::string matName = scriptElem->Get<std::string>("name");
 
       if (!matName.empty())
         this->SetMaterial(matName);
     }
-    else if (matElem->HasElement("ambient"))
-      this->SetAmbient(matElem->GetValueColor("ambient"));
-    else if (matElem->HasElement("diffuse"))
-      this->SetDiffuse(matElem->GetValueColor("diffuse"));
-    else if (matElem->HasElement("specular"))
-      this->SetSpecular(matElem->GetValueColor("specular"));
-    else if (matElem->HasElement("emissive"))
-      this->SetEmissive(matElem->GetValueColor("emissive"));
+
+    if (matElem->HasElement("lighting"))
+    {
+      this->SetLighting(matElem->Get<bool>("lighting"));
+    }
+
+    if (matElem->HasElement("ambient"))
+      this->SetAmbient(matElem->Get<common::Color>("ambient"));
+    if (matElem->HasElement("diffuse"))
+      this->SetDiffuse(matElem->Get<common::Color>("diffuse"));
+    if (matElem->HasElement("specular"))
+      this->SetSpecular(matElem->Get<common::Color>("specular"));
+    if (matElem->HasElement("emissive"))
+      this->SetEmissive(matElem->Get<common::Color>("emissive"));
   }
 
   // Allow the mesh to cast shadows
-  this->SetCastShadows(this->sdf->GetValueBool("cast_shadows"));
+  this->SetCastShadows(this->dataPtr->sdf->Get<bool>("cast_shadows"));
   this->LoadPlugins();
 }
 
 //////////////////////////////////////////////////
 void Visual::Update()
 {
-  if (!this->visible)
+  if (!this->dataPtr->visible)
     return;
 
   std::list<DynamicLines*>::iterator iter;
 
   // Update the lines
-  for (iter = this->lines.begin(); iter != this->lines.end(); ++iter)
+  for (iter = this->dataPtr->lines.begin(); iter != this->dataPtr->lines.end();
+      ++iter)
+  {
     (*iter)->Update();
+  }
 
   std::list< std::pair<DynamicLines*, unsigned int> >::iterator liter;
-  for (liter = this->lineVertices.begin();
-       liter != this->lineVertices.end(); ++liter)
+  for (liter = this->dataPtr->lineVertices.begin();
+       liter != this->dataPtr->lineVertices.end(); ++liter)
   {
     liter->first->SetPoint(liter->second,
-        Conversions::Convert(this->sceneNode->_getDerivedPosition()));
+        Conversions::Convert(this->dataPtr->sceneNode->_getDerivedPosition()));
     liter->first->Update();
   }
 
-  if (this->animState)
+  if (this->dataPtr->animState)
   {
-    this->animState->addTime(
-        (common::Time::GetWallTime() - this->prevAnimTime).Double());
-    this->prevAnimTime = common::Time::GetWallTime();
-    if (this->animState->hasEnded())
+    this->dataPtr->animState->addTime(
+        (common::Time::GetWallTime() - this->dataPtr->prevAnimTime).Double());
+    this->dataPtr->prevAnimTime = common::Time::GetWallTime();
+    if (this->dataPtr->animState->hasEnded())
     {
-      this->animState = NULL;
-      this->sceneNode->getCreator()->destroyAnimation(
+      this->dataPtr->animState = NULL;
+      this->dataPtr->sceneNode->getCreator()->destroyAnimation(
           this->GetName() + "_animation");
-      if (this->onAnimationComplete)
-        this->onAnimationComplete();
+      if (this->dataPtr->onAnimationComplete)
+        this->dataPtr->onAnimationComplete();
       // event::Events::DisconnectPreRender(this->preRenderConnection);
     }
   }
@@ -512,14 +614,14 @@ void Visual::Update()
 //////////////////////////////////////////////////
 void Visual::SetName(const std::string &_name)
 {
-  this->name = _name;
-  this->sdf->GetAttribute("name")->Set(_name);
+  this->dataPtr->name = _name;
+  this->dataPtr->sdf->GetAttribute("name")->Set(_name);
 }
 
 //////////////////////////////////////////////////
 std::string Visual::GetName() const
 {
-  return this->name;
+  return this->dataPtr->name;
 }
 
 //////////////////////////////////////////////////
@@ -534,9 +636,9 @@ void Visual::AttachVisual(VisualPtr _vis)
       _vis->GetSceneNode()->getParentSceneNode()->removeChild(
           _vis->GetSceneNode());
     }
-    this->sceneNode->addChild(_vis->GetSceneNode());
-    this->children.push_back(_vis);
-    _vis->parent = shared_from_this();
+    this->dataPtr->sceneNode->addChild(_vis->GetSceneNode());
+    this->dataPtr->children.push_back(_vis);
+    _vis->dataPtr->parent = shared_from_this();
   }
 }
 
@@ -550,13 +652,14 @@ void Visual::DetachVisual(VisualPtr _vis)
 void Visual::DetachVisual(const std::string &_name)
 {
   std::vector<VisualPtr>::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
     if ((*iter)->GetName() == _name)
     {
-      this->sceneNode->removeChild((*iter)->GetSceneNode());
-      (*iter)->parent.reset();
-      this->children.erase(iter);
+      this->dataPtr->sceneNode->removeChild((*iter)->GetSceneNode());
+      (*iter)->dataPtr->parent.reset();
+      this->dataPtr->children.erase(iter);
       break;
     }
   }
@@ -567,30 +670,34 @@ void Visual::AttachObject(Ogre::MovableObject *_obj)
 {
   // This code makes plane render before grids. This allows grids to overlay
   // planes, and then other elements to overlay both planes and grids.
-  // if (this->sdf->HasElement("geometry"))
-  // if (this->sdf->GetElement("geometry")->HasElement("plane"))
+  // if (this->dataPtr->sdf->HasElement("geometry"))
+  // if (this->dataPtr->sdf->GetElement("geometry")->HasElement("plane"))
   // _obj->setRenderQueueGroup(Ogre::RENDER_QUEUE_SKIES_EARLY+1);
 
   if (!this->HasAttachedObject(_obj->getName()))
   {
-    this->sceneNode->attachObject(_obj);
-    if (this->useRTShader)
+    this->dataPtr->sceneNode->attachObject(_obj);
+    if (this->dataPtr->useRTShader && this->dataPtr->scene->GetInitialized() &&
+      _obj->getName().find("__COLLISION_VISUAL__") == std::string::npos)
+    {
       RTShaderSystem::Instance()->UpdateShaders();
+    }
     _obj->setUserAny(Ogre::Any(this->GetName()));
   }
   else
     gzerr << "Visual[" << this->GetName() << "] already has object["
           << _obj->getName() << "] attached.";
 
-  _obj->setVisibilityFlags(GZ_VISIBILITY_ALL & ~GZ_VISIBILITY_NOT_SELECTABLE);
+  _obj->setVisibilityFlags(GZ_VISIBILITY_ALL);
 }
 
 //////////////////////////////////////////////////
 bool Visual::HasAttachedObject(const std::string &_name)
 {
-  for (unsigned int i = 0; i < this->sceneNode->numAttachedObjects(); ++i)
+  for (unsigned int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects();
+      ++i)
   {
-    if (this->sceneNode->getAttachedObject(i)->getName() == _name)
+    if (this->dataPtr->sceneNode->getAttachedObject(i)->getName() == _name)
       return true;
   }
 
@@ -600,26 +707,26 @@ bool Visual::HasAttachedObject(const std::string &_name)
 //////////////////////////////////////////////////
 unsigned int Visual::GetAttachedObjectCount() const
 {
-  return this->sceneNode->numAttachedObjects();
+  return this->dataPtr->sceneNode->numAttachedObjects();
 }
 
 //////////////////////////////////////////////////
 void Visual::DetachObjects()
 {
-  this->sceneNode->detachAllObjects();
+  this->dataPtr->sceneNode->detachAllObjects();
 }
 
 //////////////////////////////////////////////////
 unsigned int Visual::GetChildCount()
 {
-  return this->children.size();
+  return this->dataPtr->children.size();
 }
 
 //////////////////////////////////////////////////
 VisualPtr Visual::GetChild(unsigned int _num)
 {
-  if (_num < this->children.size())
-    return this->children[_num];
+  if (_num < this->dataPtr->children.size())
+    return this->dataPtr->children[_num];
   return VisualPtr();
 }
 
@@ -628,18 +735,18 @@ void Visual::MakeStatic()
 {
   /*if (!this->staticGeom)
     this->staticGeom =
-    this->sceneNode->getCreator()->createStaticGeometry(
-    this->sceneNode->getName() + "_Static");
+    this->dataPtr->sceneNode->getCreator()->createStaticGeometry(
+    this->dataPtr->sceneNode->getName() + "_Static");
 
   // Add the scene node to the static geometry
-  this->staticGeom->addSceneNode(this->sceneNode);
+  this->staticGeom->addSceneNode(this->dataPtr->sceneNode);
 
   // Build the static geometry
   this->staticGeom->build();
 
   // Prevent double rendering
-  this->sceneNode->setVisible(false);
-  this->sceneNode->detachAllObjects();
+  this->dataPtr->sceneNode->setVisible(false);
+  this->dataPtr->sceneNode->detachAllObjects();
   */
 }
 
@@ -658,12 +765,12 @@ Ogre::MovableObject *Visual::AttachMesh(const std::string &_meshName,
   meshName += _subMesh.empty() ? "" : "::" + _subMesh;
 
   if (objName.empty())
-    objName = this->sceneNode->getName() + "_ENTITY_" + meshName;
+    objName = this->dataPtr->sceneNode->getName() + "_ENTITY_" + meshName;
 
   this->InsertMesh(_meshName, _subMesh, _centerSubmesh);
 
   obj = (Ogre::MovableObject*)
-    (this->sceneNode->getCreator()->createEntity(objName, meshName));
+    (this->dataPtr->sceneNode->getCreator()->createEntity(objName, meshName));
 
   this->AttachObject(obj);
   return obj;
@@ -672,59 +779,143 @@ Ogre::MovableObject *Visual::AttachMesh(const std::string &_meshName,
 //////////////////////////////////////////////////
 void Visual::SetScale(const math::Vector3 &_scale)
 {
-  sdf::ElementPtr geomElem = this->sdf->GetElement("geometry");
+  if (this->dataPtr->scale == _scale)
+    return;
+
+  math::Vector3 tmpScale = this->dataPtr->scale;
+  this->dataPtr->scale = _scale;
+
+  sdf::ElementPtr geomElem = this->dataPtr->sdf->GetElement("geometry");
 
   if (geomElem->HasElement("box"))
     geomElem->GetElement("box")->GetElement("size")->Set(_scale);
   else if (geomElem->HasElement("sphere"))
+  {
     geomElem->GetElement("sphere")->GetElement("radius")->Set(_scale.x/2.0);
+  }
   else if (geomElem->HasElement("cylinder"))
   {
-    geomElem->GetElement("cylinder")->GetElement("radius")->Set(_scale.x/2.0);
+    geomElem->GetElement("cylinder")->GetElement("radius")
+        ->Set(_scale.x/2.0);
     geomElem->GetElement("cylinder")->GetElement("length")->Set(_scale.z);
   }
   else if (geomElem->HasElement("mesh"))
     geomElem->GetElement("mesh")->GetElement("scale")->Set(_scale);
 
-  this->sceneNode->setScale(Conversions::Convert(_scale));
+  this->dataPtr->sceneNode->setScale(
+      Conversions::Convert(this->dataPtr->scale));
 }
 
 //////////////////////////////////////////////////
 math::Vector3 Visual::GetScale()
 {
-  math::Vector3 result(1, 1, 1);
-  if (this->sdf->HasElement("geometry"))
+  return this->dataPtr->scale;
+  /*math::Vector3 result(1, 1, 1);
+  if (this->dataPtr->sdf->HasElement("geometry"))
   {
-    sdf::ElementPtr geomElem = this->sdf->GetElement("geometry");
+    sdf::ElementPtr geomElem = this->dataPtr->sdf->GetElement("geometry");
 
     if (geomElem->HasElement("box"))
     {
-      result = geomElem->GetElement("box")->GetValueVector3("size");
+      result = geomElem->GetElement("box")->Get<math::Vector3>("size");
     }
     else if (geomElem->HasElement("sphere"))
     {
-      double r = geomElem->GetElement("sphere")->GetValueDouble("radius");
+      double r = geomElem->GetElement("sphere")->Get<double>("radius");
       result.Set(r * 2.0, r * 2.0, r * 2.0);
     }
     else if (geomElem->HasElement("cylinder"))
     {
-      double r = geomElem->GetElement("cylinder")->GetValueDouble("radius");
-      double l = geomElem->GetElement("cylinder")->GetValueDouble("length");
+      double r = geomElem->GetElement("cylinder")->Get<double>("radius");
+      double l = geomElem->GetElement("cylinder")->Get<double>("length");
       result.Set(r * 2.0, r * 2.0, l);
     }
     else if (geomElem->HasElement("plane"))
     {
       math::Vector2d size =
-        geomElem->GetElement("plane")->GetValueVector2d("size");
+        geomElem->GetElement("plane")->Get<math::Vector2d>("size");
       result.Set(size.x, size.y, 1);
     }
     else if (geomElem->HasElement("mesh"))
     {
-      result = geomElem->GetElement("mesh")->GetValueVector3("scale");
+      result = geomElem->GetElement("mesh")->Get<math::Vector3>("scale");
     }
   }
 
-  return result;
+  return result;*/
+}
+
+//////////////////////////////////////////////////
+void Visual::SetLighting(bool _lighting)
+{
+  if (this->dataPtr->lighting == _lighting)
+    return;
+
+  this->dataPtr->lighting = _lighting;
+
+  if (this->dataPtr->useRTShader)
+  {
+    // Detach from RTShaderSystem otherwise setting lighting here will have
+    // no effect if shaders are used.
+    RTShaderSystem::Instance()->DetachEntity(this);
+  }
+
+  try
+  {
+    for (int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects(); ++i)
+    {
+      Ogre::MovableObject *obj = this->dataPtr->sceneNode->getAttachedObject(i);
+
+      Ogre::Entity *entity = dynamic_cast<Ogre::Entity*>(obj);
+      if (entity)
+      {
+        for (unsigned j = 0; j < entity->getNumSubEntities(); ++j)
+        {
+          Ogre::MaterialPtr mat = entity->getSubEntity(j)->getMaterial();
+          if (!mat.isNull())
+          {
+            mat->setLightingEnabled(this->dataPtr->lighting);
+          }
+        }
+      }
+    }
+
+    // Apply lighting to all child scene nodes
+    for (unsigned int i = 0; i < this->dataPtr->sceneNode->numChildren(); ++i)
+    {
+      Ogre::SceneNode *sn = dynamic_cast<Ogre::SceneNode *>(
+          this->dataPtr->sceneNode->getChild(i));
+      for (int j = 0; j < sn->numAttachedObjects(); j++)
+      {
+        Ogre::MovableObject *obj = sn->getAttachedObject(j);
+
+        Ogre::Entity *entity = dynamic_cast<Ogre::Entity*>(obj);
+        if (entity)
+        {
+          for (unsigned k = 0; k < entity->getNumSubEntities(); ++k)
+          {
+            Ogre::MaterialPtr mat = entity->getSubEntity(k)->getMaterial();
+            if (!mat.isNull())
+            {
+              mat->setLightingEnabled(this->dataPtr->lighting);
+            }
+          }
+        }
+      }
+    }
+  }
+  catch(Ogre::Exception &e)
+  {
+    gzwarn << "Unable to set lighting to Geometry["
+           << this->dataPtr->sceneNode->getName() << ".\n";
+  }
+
+  // Apply lighting to all child visuals
+  for (std::vector<VisualPtr>::iterator iter = this->dataPtr->children.begin();
+       iter != this->dataPtr->children.end(); ++iter)
+  {
+    (*iter)->SetLighting(this->dataPtr->lighting);
+  }
 }
 
 
@@ -738,17 +929,18 @@ void Visual::SetMaterial(const std::string &_materialName, bool _unique)
   {
     // Create a custom material name
     std::string newMaterialName;
-    newMaterialName = this->sceneNode->getName() + "_MATERIAL_" + _materialName;
+    newMaterialName = this->dataPtr->sceneNode->getName() + "_MATERIAL_" +
+        _materialName;
 
     if (this->GetMaterialName() == newMaterialName)
       return;
 
-    this->myMaterialName = newMaterialName;
+    this->dataPtr->myMaterialName = newMaterialName;
 
     Ogre::MaterialPtr origMaterial;
     try
     {
-      this->origMaterialName = _materialName;
+      this->dataPtr->origMaterialName = _materialName;
       // Get the original material
       origMaterial =
         Ogre::MaterialManager::getSingleton().getByName(_materialName);
@@ -756,14 +948,16 @@ void Visual::SetMaterial(const std::string &_materialName, bool _unique)
     catch(Ogre::Exception &e)
     {
       gzwarn << "Unable to get Material[" << _materialName << "] for Geometry["
-        << this->sceneNode->getName() << ". Object will appear white.\n";
+          << this->dataPtr->sceneNode->getName()
+          << ". Object will appear white.\n";
       return;
     }
 
     if (origMaterial.isNull())
     {
       gzwarn << "Unable to get Material[" << _materialName << "] for Geometry["
-        << this->sceneNode->getName() << ". Object will appear white\n";
+        << this->dataPtr->sceneNode->getName()
+        << ". Object will appear white\n";
       return;
     }
 
@@ -772,86 +966,104 @@ void Visual::SetMaterial(const std::string &_materialName, bool _unique)
     // Clone the material. This will allow us to change the look of each geom
     // individually.
     if (Ogre::MaterialManager::getSingleton().resourceExists(
-          this->myMaterialName))
+          this->dataPtr->myMaterialName))
     {
       myMaterial =
         (Ogre::MaterialPtr)(Ogre::MaterialManager::getSingleton().getByName(
-              this->myMaterialName));
+              this->dataPtr->myMaterialName));
     }
     else
     {
-      myMaterial = origMaterial->clone(this->myMaterialName);
+      myMaterial = origMaterial->clone(this->dataPtr->myMaterialName);
     }
   }
   else
   {
-    this->myMaterialName = _materialName;
+    if ( this->dataPtr->myMaterialName == _materialName)
+      return;
+    this->dataPtr->myMaterialName = _materialName;
   }
 
   try
   {
-    for (int i = 0; i < this->sceneNode->numAttachedObjects(); i++)
+    for (int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects(); i++)
     {
-      Ogre::MovableObject *obj = this->sceneNode->getAttachedObject(i);
+      Ogre::MovableObject *obj = this->dataPtr->sceneNode->getAttachedObject(i);
 
       if (dynamic_cast<Ogre::Entity*>(obj))
-        ((Ogre::Entity*)obj)->setMaterialName(this->myMaterialName);
+        ((Ogre::Entity*)obj)->setMaterialName(this->dataPtr->myMaterialName);
       else if (dynamic_cast<Ogre::SimpleRenderable*>(obj))
-        ((Ogre::SimpleRenderable*)obj)->setMaterial(this->myMaterialName);
+      {
+        ((Ogre::SimpleRenderable*)obj)->setMaterial(
+            this->dataPtr->myMaterialName);
+      }
     }
 
     // Apply material to all child scene nodes
-    for (unsigned int i = 0; i < this->sceneNode->numChildren(); ++i)
+    for (unsigned int i = 0; i < this->dataPtr->sceneNode->numChildren(); ++i)
     {
-      Ogre::SceneNode *sn = (Ogre::SceneNode*)(this->sceneNode->getChild(i));
+      Ogre::SceneNode *sn = dynamic_cast<Ogre::SceneNode*>(
+          this->dataPtr->sceneNode->getChild(i));
       for (int j = 0; j < sn->numAttachedObjects(); j++)
       {
         Ogre::MovableObject *obj = sn->getAttachedObject(j);
 
         if (dynamic_cast<Ogre::Entity*>(obj))
-          ((Ogre::Entity*)obj)->setMaterialName(this->myMaterialName);
+          ((Ogre::Entity*)obj)->setMaterialName(this->dataPtr->myMaterialName);
         else
-          ((Ogre::SimpleRenderable*)obj)->setMaterial(this->myMaterialName);
+        {
+          ((Ogre::SimpleRenderable*)obj)->setMaterial(
+              this->dataPtr->myMaterialName);
+        }
       }
     }
   }
   catch(Ogre::Exception &e)
   {
-    gzwarn << "Unable to set Material[" << this->myMaterialName
+    gzwarn << "Unable to set Material[" << this->dataPtr->myMaterialName
            << "] to Geometry["
-           << this->sceneNode->getName() << ". Object will appear white.\n";
+           << this->dataPtr->sceneNode->getName()
+           << ". Object will appear white.\n";
   }
 
   // Apply material to all child visuals
-  for (std::vector<VisualPtr>::iterator iter = this->children.begin();
-       iter != this->children.end(); ++iter)
+  for (std::vector<VisualPtr>::iterator iter = this->dataPtr->children.begin();
+       iter != this->dataPtr->children.end(); ++iter)
   {
     (*iter)->SetMaterial(_materialName, _unique);
   }
 
-  if (this->useRTShader)
+  if (this->dataPtr->useRTShader && this->dataPtr->scene->GetInitialized()
+      && !this->dataPtr->lighting &&
+      this->GetName().find("__COLLISION_VISUAL__") == std::string::npos)
+  {
     RTShaderSystem::Instance()->UpdateShaders();
+  }
 }
 
 /////////////////////////////////////////////////
 void Visual::SetAmbient(const common::Color &_color)
 {
-  if (this->myMaterialName.empty())
+  if (!this->dataPtr->lighting)
+    return;
+
+  if (this->dataPtr->myMaterialName.empty())
   {
     std::string matName = this->GetName() + "_MATERIAL_";
     Ogre::MaterialManager::getSingleton().create(matName, "General");
     this->SetMaterial(matName);
   }
 
-  for (unsigned int i = 0; i < this->children.size(); ++i)
+  for (unsigned int i = 0; i < this->dataPtr->children.size(); ++i)
   {
-    this->children[i]->SetAmbient(_color);
+    this->dataPtr->children[i]->SetAmbient(_color);
   }
 
-  for (unsigned int i = 0; i < this->sceneNode->numAttachedObjects(); ++i)
+  for (unsigned int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects();
+      ++i)
   {
     Ogre::Entity *entity = NULL;
-    Ogre::MovableObject *obj = this->sceneNode->getAttachedObject(i);
+    Ogre::MovableObject *obj = this->dataPtr->sceneNode->getAttachedObject(i);
 
     entity = dynamic_cast<Ogre::Entity*>(obj);
 
@@ -884,26 +1096,30 @@ void Visual::SetAmbient(const common::Color &_color)
     }
   }
 
-  for (unsigned int i = 0; i < this->children.size(); ++i)
+  for (unsigned int i = 0; i < this->dataPtr->children.size(); ++i)
   {
-    this->children[i]->SetSpecular(_color);
+    this->dataPtr->children[i]->SetSpecular(_color);
   }
 }
 
 /// Set the diffuse color of the visual
 void Visual::SetDiffuse(const common::Color &_color)
 {
-  if (this->myMaterialName.empty())
+  if (!this->dataPtr->lighting)
+    return;
+
+  if (this->dataPtr->myMaterialName.empty())
   {
     std::string matName = this->GetName() + "_MATERIAL_";
     Ogre::MaterialManager::getSingleton().create(matName, "General");
     this->SetMaterial(matName);
   }
 
-  for (unsigned int i = 0; i < this->sceneNode->numAttachedObjects(); i++)
+  for (unsigned int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects();
+      i++)
   {
     Ogre::Entity *entity = NULL;
-    Ogre::MovableObject *obj = this->sceneNode->getAttachedObject(i);
+    Ogre::MovableObject *obj = this->dataPtr->sceneNode->getAttachedObject(i);
 
     entity = dynamic_cast<Ogre::Entity*>(obj);
 
@@ -938,26 +1154,30 @@ void Visual::SetDiffuse(const common::Color &_color)
     }
   }
 
-  for (unsigned int i = 0; i < this->children.size(); ++i)
+  for (unsigned int i = 0; i < this->dataPtr->children.size(); ++i)
   {
-    this->children[i]->SetDiffuse(_color);
+    this->dataPtr->children[i]->SetDiffuse(_color);
   }
 }
 
 /// Set the specular color of the visual
 void Visual::SetSpecular(const common::Color &_color)
 {
-  if (this->myMaterialName.empty())
+  if (!this->dataPtr->lighting)
+    return;
+
+  if (this->dataPtr->myMaterialName.empty())
   {
     std::string matName = this->GetName() + "_MATERIAL_";
     Ogre::MaterialManager::getSingleton().create(matName, "General");
     this->SetMaterial(matName);
   }
 
-  for (unsigned int i = 0; i < this->sceneNode->numAttachedObjects(); i++)
+  for (unsigned int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects();
+      i++)
   {
     Ogre::Entity *entity = NULL;
-    Ogre::MovableObject *obj = this->sceneNode->getAttachedObject(i);
+    Ogre::MovableObject *obj = this->dataPtr->sceneNode->getAttachedObject(i);
 
     entity = dynamic_cast<Ogre::Entity*>(obj);
 
@@ -990,9 +1210,9 @@ void Visual::SetSpecular(const common::Color &_color)
     }
   }
 
-  for (unsigned int i = 0; i < this->children.size(); ++i)
+  for (unsigned int i = 0; i < this->dataPtr->children.size(); ++i)
   {
-    this->children[i]->SetSpecular(_color);
+    this->dataPtr->children[i]->SetSpecular(_color);
   }
 }
 
@@ -1001,12 +1221,13 @@ void Visual::AttachAxes()
 {
   std::ostringstream nodeName;
 
-  nodeName << this->sceneNode->getName() << "_AXES_NODE";
+  nodeName << this->dataPtr->sceneNode->getName() << "_AXES_NODE";
 
-  if (!this->sceneNode->getCreator()->hasEntity("axis_cylinder"))
+  if (!this->dataPtr->sceneNode->getCreator()->hasEntity("axis_cylinder"))
     this->InsertMesh(common::MeshManager::Instance()->GetMesh("axis_cylinder"));
 
-  Ogre::SceneNode *node = this->sceneNode->createChildSceneNode(nodeName.str());
+  Ogre::SceneNode *node = this->dataPtr->sceneNode->createChildSceneNode(
+      nodeName.str());
   Ogre::SceneNode *x, *y, *z;
 
   x = node->createChildSceneNode(nodeName.str() + "_axisX");
@@ -1050,15 +1271,17 @@ void Visual::AttachAxes()
 void Visual::SetWireframe(bool _show)
 {
   std::vector<VisualPtr>::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
     (*iter)->SetWireframe(_show);
   }
 
-  for (unsigned int i = 0; i < this->sceneNode->numAttachedObjects(); i++)
+  for (unsigned int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects();
+      i++)
   {
     Ogre::Entity *entity = NULL;
-    Ogre::MovableObject *obj = this->sceneNode->getAttachedObject(i);
+    Ogre::MovableObject *obj = this->dataPtr->sceneNode->getAttachedObject(i);
 
     entity = dynamic_cast<Ogre::Entity*>(obj);
 
@@ -1070,13 +1293,15 @@ void Visual::SetWireframe(bool _show)
     {
       Ogre::SubEntity *subEntity = entity->getSubEntity(j);
       Ogre::MaterialPtr material = subEntity->getMaterial();
+      if (material.isNull())
+        continue;
 
       unsigned int techniqueCount, passCount;
       Ogre::Technique *technique;
       Ogre::Pass *pass;
 
       for (techniqueCount = 0; techniqueCount < material->getNumTechniques();
-           techniqueCount++)
+           ++techniqueCount)
       {
         technique = material->getTechnique(techniqueCount);
 
@@ -1096,21 +1321,23 @@ void Visual::SetWireframe(bool _show)
 //////////////////////////////////////////////////
 void Visual::SetTransparency(float _trans)
 {
-  if (math::equal(_trans, this->transparency))
+  if (math::equal(_trans, this->dataPtr->transparency))
     return;
 
-  this->transparency = std::min(
+  this->dataPtr->transparency = std::min(
       std::max(_trans, static_cast<float>(0.0)), static_cast<float>(1.0));
   std::vector<VisualPtr>::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
     (*iter)->SetTransparency(_trans);
   }
 
-  for (unsigned int i = 0; i < this->sceneNode->numAttachedObjects(); i++)
+  for (unsigned int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects();
+      i++)
   {
     Ogre::Entity *entity = NULL;
-    Ogre::MovableObject *obj = this->sceneNode->getAttachedObject(i);
+    Ogre::MovableObject *obj = this->dataPtr->sceneNode->getAttachedObject(i);
 
     entity = dynamic_cast<Ogre::Entity*>(obj);
 
@@ -1143,7 +1370,7 @@ void Visual::SetTransparency(float _trans)
             pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
           }
 
-          if (this->transparency > 0.0)
+          if (this->dataPtr->transparency > 0.0)
           {
             pass->setDepthWriteEnabled(false);
             pass->setDepthCheckEnabled(true);
@@ -1156,14 +1383,14 @@ void Visual::SetTransparency(float _trans)
 
 
           dc = pass->getDiffuse();
-          dc.a =(1.0f - this->transparency);
+          dc.a =(1.0f - this->dataPtr->transparency);
           pass->setDiffuse(dc);
         }
       }
     }
   }
 
-  if (this->useRTShader)
+  if (this->dataPtr->useRTShader && this->dataPtr->scene->GetInitialized())
     RTShaderSystem::Instance()->UpdateShaders();
 }
 
@@ -1173,27 +1400,38 @@ void Visual::SetHighlighted(bool _highlighted)
   if (_highlighted)
   {
     // Create the bounding box if it's not already created.
-    if (!this->boundingBox)
+    if (!this->dataPtr->boundingBox)
     {
-      this->boundingBox = new WireBox(shared_from_this(),
+      this->dataPtr->boundingBox = new WireBox(shared_from_this(),
                                       this->GetBoundingBox());
     }
 
-    this->boundingBox->SetVisible(true);
+    this->dataPtr->boundingBox->SetVisible(true);
+  }
+  else if (this->dataPtr->boundingBox)
+  {
+    this->dataPtr->boundingBox->SetVisible(false);
   }
-  else if (this->boundingBox)
+}
+
+//////////////////////////////////////////////////
+bool Visual::GetHighlighted() const
+{
+  if (this->dataPtr->boundingBox)
   {
-    this->boundingBox->SetVisible(false);
+    return this->dataPtr->boundingBox->GetVisible();
   }
+  return false;
 }
 
 //////////////////////////////////////////////////
 void Visual::SetEmissive(const common::Color &_color)
 {
-  for (unsigned int i = 0; i < this->sceneNode->numAttachedObjects(); i++)
+  for (unsigned int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects();
+      i++)
   {
     Ogre::Entity *entity = NULL;
-    Ogre::MovableObject *obj = this->sceneNode->getAttachedObject(i);
+    Ogre::MovableObject *obj = this->dataPtr->sceneNode->getAttachedObject(i);
 
     entity = dynamic_cast<Ogre::Entity*>(obj);
 
@@ -1226,44 +1464,44 @@ void Visual::SetEmissive(const common::Color &_color)
     }
   }
 
-  for (unsigned int i = 0; i < this->children.size(); ++i)
+  for (unsigned int i = 0; i < this->dataPtr->children.size(); ++i)
   {
-    this->children[i]->SetEmissive(_color);
+    this->dataPtr->children[i]->SetEmissive(_color);
   }
 }
 
 //////////////////////////////////////////////////
 float Visual::GetTransparency()
 {
-  return this->transparency;
+  return this->dataPtr->transparency;
 }
 
 //////////////////////////////////////////////////
 void Visual::SetCastShadows(bool shadows)
 {
-  for (int i = 0; i < this->sceneNode->numAttachedObjects(); i++)
+  for (int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects(); i++)
   {
-    Ogre::MovableObject *obj = this->sceneNode->getAttachedObject(i);
+    Ogre::MovableObject *obj = this->dataPtr->sceneNode->getAttachedObject(i);
     obj->setCastShadows(shadows);
   }
 
-  if (this->IsStatic() && this->staticGeom)
-    this->staticGeom->setCastShadows(shadows);
+  if (this->IsStatic() && this->dataPtr->staticGeom)
+    this->dataPtr->staticGeom->setCastShadows(shadows);
 }
 
 //////////////////////////////////////////////////
 void Visual::SetVisible(bool _visible, bool _cascade)
 {
-  this->sceneNode->setVisible(_visible, _cascade);
-  this->visible = _visible;
+  this->dataPtr->sceneNode->setVisible(_visible, _cascade);
+  this->dataPtr->visible = _visible;
 }
 
 //////////////////////////////////////////////////
 uint32_t Visual::GetVisibilityFlags()
 {
-  if (this->sceneNode->numAttachedObjects() > 0)
+  if (this->dataPtr->sceneNode->numAttachedObjects() > 0)
   {
-    return this->sceneNode->getAttachedObject(0)->getVisibilityFlags();
+    return this->dataPtr->sceneNode->getAttachedObject(0)->getVisibilityFlags();
   }
 
   return GZ_VISIBILITY_ALL;
@@ -1278,7 +1516,7 @@ void Visual::ToggleVisible()
 //////////////////////////////////////////////////
 bool Visual::GetVisible() const
 {
-  return this->visible;
+  return this->dataPtr->visible;
 }
 
 //////////////////////////////////////////////////
@@ -1291,15 +1529,15 @@ void Visual::SetPosition(const math::Vector3 &_pos)
     this->staticGeom = NULL;
     // this->staticGeom->setOrigin(Ogre::Vector3(pos.x, pos.y, pos.z));
   }*/
-  GZ_ASSERT(this->sceneNode, "Visual SceneNode is NULL");
-  this->sceneNode->setPosition(_pos.x, _pos.y, _pos.z);
+  GZ_ASSERT(this->dataPtr->sceneNode, "Visual SceneNode is NULL");
+  this->dataPtr->sceneNode->setPosition(_pos.x, _pos.y, _pos.z);
 }
 
 //////////////////////////////////////////////////
 void Visual::SetRotation(const math::Quaternion &_rot)
 {
-  GZ_ASSERT(this->sceneNode, "Visual SceneNode is NULL");
-  this->sceneNode->setOrientation(
+  GZ_ASSERT(this->dataPtr->sceneNode, "Visual SceneNode is NULL");
+  this->dataPtr->sceneNode->setOrientation(
       Ogre::Quaternion(_rot.w, _rot.x, _rot.y, _rot.z));
 }
 
@@ -1313,13 +1551,13 @@ void Visual::SetPose(const math::Pose &_pose)
 //////////////////////////////////////////////////
 math::Vector3 Visual::GetPosition() const
 {
-  return Conversions::Convert(this->sceneNode->getPosition());
+  return Conversions::Convert(this->dataPtr->sceneNode->getPosition());
 }
 
 //////////////////////////////////////////////////
 math::Quaternion Visual::GetRotation() const
 {
-  return Conversions::Convert(this->sceneNode->getOrientation());
+  return Conversions::Convert(this->dataPtr->sceneNode->getOrientation());
 }
 
 //////////////////////////////////////////////////
@@ -1332,7 +1570,7 @@ math::Pose Visual::GetPose() const
 }
 
 //////////////////////////////////////////////////
-void Visual::SetWorldPose(const math::Pose _pose)
+void Visual::SetWorldPose(const math::Pose &_pose)
 {
   this->SetWorldPosition(_pose.pos);
   this->SetWorldRotation(_pose.rot);
@@ -1341,13 +1579,13 @@ void Visual::SetWorldPose(const math::Pose _pose)
 //////////////////////////////////////////////////
 void Visual::SetWorldPosition(const math::Vector3 &_pos)
 {
-  this->sceneNode->_setDerivedPosition(Conversions::Convert(_pos));
+  this->dataPtr->sceneNode->_setDerivedPosition(Conversions::Convert(_pos));
 }
 
 //////////////////////////////////////////////////
 void Visual::SetWorldRotation(const math::Quaternion &_q)
 {
-  this->sceneNode->_setDerivedOrientation(Conversions::Convert(_q));
+  this->dataPtr->sceneNode->_setDerivedOrientation(Conversions::Convert(_q));
 }
 
 //////////////////////////////////////////////////
@@ -1358,12 +1596,12 @@ math::Pose Visual::GetWorldPose() const
   Ogre::Vector3 vpos;
   Ogre::Quaternion vquatern;
 
-  vpos = this->sceneNode->_getDerivedPosition();
+  vpos = this->dataPtr->sceneNode->_getDerivedPosition();
   pose.pos.x = vpos.x;
   pose.pos.y = vpos.y;
   pose.pos.z = vpos.z;
 
-  vquatern = this->sceneNode->getOrientation();
+  vquatern = this->dataPtr->sceneNode->_getDerivedOrientation();
   pose.rot.w = vquatern.w;
   pose.rot.x = vquatern.x;
   pose.rot.y = vquatern.y;
@@ -1376,57 +1614,63 @@ math::Pose Visual::GetWorldPose() const
 //////////////////////////////////////////////////
 Ogre::SceneNode * Visual::GetSceneNode() const
 {
-  return this->sceneNode;
+  return this->dataPtr->sceneNode;
 }
 
 
 //////////////////////////////////////////////////
 bool Visual::IsStatic() const
 {
-  return this->isStatic;
+  return this->dataPtr->isStatic;
 }
 
 //////////////////////////////////////////////////
 void Visual::EnableTrackVisual(VisualPtr _vis)
 {
-  this->sceneNode->setAutoTracking(true, _vis->GetSceneNode());
+  this->dataPtr->sceneNode->setAutoTracking(true, _vis->GetSceneNode());
 }
 
 //////////////////////////////////////////////////
 void Visual::DisableTrackVisual()
 {
-  this->sceneNode->setAutoTracking(false);
+  this->dataPtr->sceneNode->setAutoTracking(false);
 }
 
 //////////////////////////////////////////////////
 std::string Visual::GetNormalMap() const
 {
-  return this->sdf->GetElement("material")->GetElement(
-      "shader")->GetElement("normal_map")->GetValueString();
+  std::string file = this->dataPtr->sdf->GetElement("material")->GetElement(
+      "shader")->GetElement("normal_map")->Get<std::string>();
+
+  std::string uriFile = common::find_file(file);
+  if (!uriFile.empty())
+    file = uriFile;
+
+  return file;
 }
 
 //////////////////////////////////////////////////
 void Visual::SetNormalMap(const std::string &_nmap)
 {
-  this->sdf->GetElement("material")->GetElement(
+  this->dataPtr->sdf->GetElement("material")->GetElement(
       "shader")->GetElement("normal_map")->GetValue()->Set(_nmap);
-  if (this->useRTShader)
+  if (this->dataPtr->useRTShader && this->dataPtr->scene->GetInitialized())
     RTShaderSystem::Instance()->UpdateShaders();
 }
 
 //////////////////////////////////////////////////
 std::string Visual::GetShaderType() const
 {
-  return this->sdf->GetElement("material")->GetElement(
-      "shader")->GetValueString("type");
+  return this->dataPtr->sdf->GetElement("material")->GetElement(
+      "shader")->Get<std::string>("type");
 }
 
 //////////////////////////////////////////////////
 void Visual::SetShaderType(const std::string &_type)
 {
-  this->sdf->GetElement("material")->GetElement(
+  this->dataPtr->sdf->GetElement("material")->GetElement(
       "shader")->GetAttribute("type")->Set(_type);
-  if (this->useRTShader)
+  if (this->dataPtr->useRTShader && this->dataPtr->scene->GetInitialized())
     RTShaderSystem::Instance()->UpdateShaders();
 }
 
@@ -1435,31 +1679,32 @@ void Visual::SetShaderType(const std::string &_type)
 void Visual::SetRibbonTrail(bool _value, const common::Color &_initialColor,
                             const common::Color &_changeColor)
 {
-  if (this->ribbonTrail == NULL)
+  if (this->dataPtr->ribbonTrail == NULL)
   {
-    this->ribbonTrail =
-      this->scene->GetManager()->createRibbonTrail(this->GetName() +
-                                                   "_RibbonTrail");
-    this->ribbonTrail->setMaterialName("Gazebo/RibbonTrail");
-    // this->ribbonTrail->setTrailLength(100);
-    this->ribbonTrail->setMaxChainElements(10000);
-    // this->ribbonTrail->setNumberOfChains(1);
-    this->ribbonTrail->setVisible(false);
-    this->ribbonTrail->setCastShadows(false);
-    this->ribbonTrail->setInitialWidth(0, 0.05);
-    this->scene->GetManager()->getRootSceneNode()->attachObject(
-        this->ribbonTrail);
+    this->dataPtr->ribbonTrail =
+        this->dataPtr->scene->GetManager()->createRibbonTrail(
+        this->GetName() + "_RibbonTrail");
+    this->dataPtr->ribbonTrail->setMaterialName("Gazebo/RibbonTrail");
+    // this->dataPtr->ribbonTrail->setTrailLength(100);
+    this->dataPtr->ribbonTrail->setMaxChainElements(10000);
+    // this->dataPtr->ribbonTrail->setNumberOfChains(1);
+    this->dataPtr->ribbonTrail->setVisible(false);
+    this->dataPtr->ribbonTrail->setCastShadows(false);
+    this->dataPtr->ribbonTrail->setInitialWidth(0, 0.05);
+    this->dataPtr->scene->GetManager()->getRootSceneNode()->attachObject(
+        this->dataPtr->ribbonTrail);
 
-    this->ribbonTrail->setInitialColour(0, Conversions::Convert(_initialColor));
-    this->ribbonTrail->setColourChange(0, Conversions::Convert(_changeColor));
+    this->dataPtr->ribbonTrail->setInitialColour(0,
+        Conversions::Convert(_initialColor));
+    this->dataPtr->ribbonTrail->setColourChange(0,
+        Conversions::Convert(_changeColor));
   }
 
-
   if (_value)
   {
     try
     {
-      this->ribbonTrail->addNode(this->sceneNode);
+      this->dataPtr->ribbonTrail->addNode(this->dataPtr->sceneNode);
     }
     catch(...)
     {
@@ -1468,20 +1713,20 @@ void Visual::SetRibbonTrail(bool _value, const common::Color &_initialColor,
   }
   else
   {
-    this->ribbonTrail->removeNode(this->sceneNode);
-    this->ribbonTrail->clearChain(0);
+    this->dataPtr->ribbonTrail->removeNode(this->dataPtr->sceneNode);
+    this->dataPtr->ribbonTrail->clearChain(0);
   }
-  this->ribbonTrail->setVisible(_value);
+  this->dataPtr->ribbonTrail->setVisible(_value);
 }
 
 //////////////////////////////////////////////////
-DynamicLines *Visual::CreateDynamicLine(RenderOpType type)
+DynamicLines *Visual::CreateDynamicLine(RenderOpType _type)
 {
-  this->preRenderConnection = event::Events::ConnectPreRender(
+  this->dataPtr->preRenderConnection = event::Events::ConnectPreRender(
       boost::bind(&Visual::Update, this));
 
-  DynamicLines *line = new DynamicLines(type);
-  this->lines.push_back(line);
+  DynamicLines *line = new DynamicLines(_type);
+  this->dataPtr->lines.push_back(line);
   this->AttachObject(line);
   return line;
 }
@@ -1490,12 +1735,13 @@ DynamicLines *Visual::CreateDynamicLine(RenderOpType type)
 void Visual::DeleteDynamicLine(DynamicLines *_line)
 {
   // delete instance from lines vector
-  for (std::list<DynamicLines*>::iterator iter = this->lines.begin();
-       iter!= this->lines.end(); ++iter)
+  for (std::list<DynamicLines*>::iterator iter = this->dataPtr->lines.begin();
+       iter != this->dataPtr->lines.end(); ++iter)
   {
     if (*iter == _line)
     {
-      this->lines.erase(iter);
+      delete *iter;
+      this->dataPtr->lines.erase(iter);
       break;
     }
   }
@@ -1504,14 +1750,14 @@ void Visual::DeleteDynamicLine(DynamicLines *_line)
 //////////////////////////////////////////////////
 void Visual::AttachLineVertex(DynamicLines *_line, unsigned int _index)
 {
-  this->lineVertices.push_back(std::make_pair(_line, _index));
+  this->dataPtr->lineVertices.push_back(std::make_pair(_line, _index));
   _line->SetPoint(_index, this->GetWorldPose().pos);
 }
 
 //////////////////////////////////////////////////
 std::string Visual::GetMaterialName() const
 {
-  return this->myMaterialName;
+  return this->dataPtr->myMaterialName;
 }
 
 //////////////////////////////////////////////////
@@ -1593,7 +1839,10 @@ void Visual::InsertMesh(const std::string &_meshName,
   {
     mesh = common::MeshManager::Instance()->Load(_meshName);
     if (!mesh)
-      gzthrow("Unable to create a mesh from " + _meshName);
+    {
+      gzerr << "Unable to create a mesh from " << _meshName << "\n";
+      return;
+    }
   }
   else
   {
@@ -1603,7 +1852,7 @@ void Visual::InsertMesh(const std::string &_meshName,
   this->InsertMesh(mesh, _subMesh, _centerSubmesh);
 
   // Add the mesh into OGRE
-  /*if (!this->sceneNode->getCreator()->hasEntity(_meshName) &&
+  /*if (!this->dataPtr->sceneNode->getCreator()->hasEntity(_meshName) &&
       common::MeshManager::Instance()->HasMesh(_meshName))
   {
     const common::Mesh *mesh =
@@ -1883,6 +2132,11 @@ void Visual::UpdateFromMsg(const boost::shared_ptr< msgs::Visual const> &_msg)
 
   if (_msg->has_material())
   {
+    if (_msg->material().has_lighting())
+    {
+      this->SetLighting(_msg->material().lighting());
+    }
+
     if (_msg->material().has_script())
     {
       for (int i = 0; i < _msg->material().script().uri_size(); ++i)
@@ -1931,50 +2185,59 @@ void Visual::UpdateFromMsg(const boost::shared_ptr< msgs::Visual const> &_msg)
     }
   }
 
+  if (_msg->has_scale())
+    this->SetScale(msgs::Convert(_msg->scale()));
+
   // TODO: Make sure this isn't necessary
   if (_msg->has_geometry() && _msg->geometry().has_type())
   {
-    math::Vector3 scale(1, 1, 1);
+    math::Vector3 geomScale(1, 1, 1);
 
     if (_msg->geometry().type() == msgs::Geometry::BOX)
     {
-      scale = msgs::Convert(_msg->geometry().box().size());
+      geomScale = msgs::Convert(_msg->geometry().box().size());
     }
     else if (_msg->geometry().type() == msgs::Geometry::CYLINDER)
     {
-      scale.x = _msg->geometry().cylinder().radius() * 2.0;
-      scale.y = _msg->geometry().cylinder().radius() * 2.0;
-      scale.z = _msg->geometry().cylinder().length();
+      geomScale.x = _msg->geometry().cylinder().radius() * 2.0;
+      geomScale.y = _msg->geometry().cylinder().radius() * 2.0;
+      geomScale.z = _msg->geometry().cylinder().length();
     }
     else if (_msg->geometry().type() == msgs::Geometry::SPHERE)
-      scale.x = scale.y = scale.z = _msg->geometry().sphere().radius() * 2.0;
+    {
+      geomScale.x = geomScale.y = geomScale.z
+          = _msg->geometry().sphere().radius() * 2.0;
+    }
     else if (_msg->geometry().type() == msgs::Geometry::PLANE)
     {
-      scale.x = scale.y = 1.0;
+      geomScale.x = geomScale.y = 1.0;
       if (_msg->geometry().plane().has_size())
       {
-        scale.x = _msg->geometry().plane().size().x();
-        scale.y = _msg->geometry().plane().size().y();
+        geomScale.x = _msg->geometry().plane().size().x();
+        geomScale.y = _msg->geometry().plane().size().y();
       }
-      scale.z = 1.0;
+      geomScale.z = 1.0;
     }
     else if (_msg->geometry().type() == msgs::Geometry::IMAGE)
-      scale.x = scale.y = scale.z = _msg->geometry().image().scale();
+    {
+      geomScale.x = geomScale.y = geomScale.z
+          = _msg->geometry().image().scale();
+    }
     else if (_msg->geometry().type() == msgs::Geometry::HEIGHTMAP)
-      scale = msgs::Convert(_msg->geometry().heightmap().size());
+      geomScale = msgs::Convert(_msg->geometry().heightmap().size());
     else if (_msg->geometry().type() == msgs::Geometry::MESH)
     {
       if (_msg->geometry().mesh().has_scale())
-        scale = msgs::Convert(_msg->geometry().mesh().scale());
+        geomScale = msgs::Convert(_msg->geometry().mesh().scale());
       else
-        scale.x = scale.y = scale.z = 1.0;
+        geomScale.x = geomScale.y = geomScale.z = 1.0;
     }
     else if (_msg->geometry().type() == msgs::Geometry::EMPTY)
-      scale.x = scale.y = scale.z = 1.0;
+      geomScale.x = geomScale.y = geomScale.z = 1.0;
     else
       gzerr << "Unknown geometry type[" << _msg->geometry().type() << "]\n";
 
-    this->SetScale(scale);
+    this->SetScale(geomScale);
   }
 
   /*if (msg->points.size() > 0)
@@ -1989,7 +2252,7 @@ void Visual::UpdateFromMsg(const boost::shared_ptr< msgs::Visual const> &_msg)
 //////////////////////////////////////////////////
 VisualPtr Visual::GetParent() const
 {
-  return this->parent;
+  return this->dataPtr->parent;
 }
 
 //////////////////////////////////////////////////
@@ -2005,15 +2268,16 @@ VisualPtr Visual::GetRootVisual()
 //////////////////////////////////////////////////
 bool Visual::IsPlane() const
 {
-  if (this->sdf->HasElement("geometry"))
+  if (this->dataPtr->sdf->HasElement("geometry"))
   {
-    sdf::ElementPtr geomElem = this->sdf->GetElement("geometry");
+    sdf::ElementPtr geomElem = this->dataPtr->sdf->GetElement("geometry");
     if (geomElem->HasElement("plane"))
       return true;
   }
 
   std::vector<VisualPtr>::const_iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
     if ((*iter)->IsPlane())
       return true;
@@ -2025,9 +2289,9 @@ bool Visual::IsPlane() const
 //////////////////////////////////////////////////
 std::string Visual::GetMeshName() const
 {
-  if (this->sdf->HasElement("geometry"))
+  if (this->dataPtr->sdf->HasElement("geometry"))
   {
-    sdf::ElementPtr geomElem = this->sdf->GetElement("geometry");
+    sdf::ElementPtr geomElem = this->dataPtr->sdf->GetElement("geometry");
     if (geomElem->HasElement("box"))
       return "unit_box";
     else if (geomElem->HasElement("sphere"))
@@ -2041,12 +2305,10 @@ std::string Visual::GetMeshName() const
       sdf::ElementPtr tmpElem = geomElem->GetElement("mesh");
       std::string filename;
 
-      std::string uri = tmpElem->GetValueString("uri");
+      std::string uri = tmpElem->Get<std::string>("uri");
       if (uri.empty())
       {
         gzerr << "<uri> element missing for geometry element:\n";
-        geomElem->PrintValues("  ");
-
         return std::string();
       }
 
@@ -2067,14 +2329,14 @@ std::string Visual::GetSubMeshName() const
 {
   std::string result;
 
-  if (this->sdf->HasElement("geometry"))
+  if (this->dataPtr->sdf->HasElement("geometry"))
   {
-    sdf::ElementPtr geomElem = this->sdf->GetElement("geometry");
+    sdf::ElementPtr geomElem = this->dataPtr->sdf->GetElement("geometry");
     if (geomElem->HasElement("mesh"))
     {
       sdf::ElementPtr tmpElem = geomElem->GetElement("mesh");
       if (tmpElem->HasElement("submesh"))
-        result = tmpElem->GetElement("submesh")->GetValueString("name");
+        result = tmpElem->GetElement("submesh")->Get<std::string>("name");
     }
   }
 
@@ -2086,14 +2348,14 @@ bool Visual::GetCenterSubMesh() const
 {
   bool result = false;
 
-  if (this->sdf->HasElement("geometry"))
+  if (this->dataPtr->sdf->HasElement("geometry"))
   {
-    sdf::ElementPtr geomElem = this->sdf->GetElement("geometry");
+    sdf::ElementPtr geomElem = this->dataPtr->sdf->GetElement("geometry");
     if (geomElem->HasElement("mesh"))
     {
       sdf::ElementPtr tmpElem = geomElem->GetElement("mesh");
       if (tmpElem->HasElement("submesh"))
-        result = tmpElem->GetElement("submesh")->GetValueBool("center");
+        result = tmpElem->GetElement("submesh")->Get<bool>("center");
     }
   }
 
@@ -2108,19 +2370,20 @@ void Visual::MoveToPositions(const std::vector<math::Pose> &_pts,
   Ogre::TransformKeyFrame *key;
   math::Vector3 start = this->GetWorldPose().pos;
 
-  this->onAnimationComplete = _onComplete;
+  this->dataPtr->onAnimationComplete = _onComplete;
 
   std::string animName = this->GetName() + "_animation";
 
   Ogre::Animation *anim =
-    this->sceneNode->getCreator()->createAnimation(animName, _time);
+    this->dataPtr->sceneNode->getCreator()->createAnimation(animName, _time);
   anim->setInterpolationMode(Ogre::Animation::IM_SPLINE);
 
-  Ogre::NodeAnimationTrack *strack = anim->createNodeTrack(0, this->sceneNode);
+  Ogre::NodeAnimationTrack *strack = anim->createNodeTrack(0,
+      this->dataPtr->sceneNode);
 
   key = strack->createNodeKeyFrame(0);
   key->setTranslate(Ogre::Vector3(start.x, start.y, start.z));
-  key->setRotation(this->sceneNode->getOrientation());
+  key->setRotation(this->dataPtr->sceneNode->getOrientation());
 
   double dt = _time / (_pts.size()-1);
   double tt = 0;
@@ -2134,16 +2397,16 @@ void Visual::MoveToPositions(const std::vector<math::Pose> &_pts,
     tt += dt;
   }
 
-  this->animState =
-    this->sceneNode->getCreator()->createAnimationState(animName);
+  this->dataPtr->animState =
+    this->dataPtr->sceneNode->getCreator()->createAnimationState(animName);
 
-  this->animState->setTimePosition(0);
-  this->animState->setEnabled(true);
-  this->animState->setLoop(false);
-  this->prevAnimTime = common::Time::GetWallTime();
+  this->dataPtr->animState->setTimePosition(0);
+  this->dataPtr->animState->setEnabled(true);
+  this->dataPtr->animState->setLoop(false);
+  this->dataPtr->prevAnimTime = common::Time::GetWallTime();
 
-  if (!this->preRenderConnection)
-    this->preRenderConnection =
+  if (!this->dataPtr->preRenderConnection)
+    this->dataPtr->preRenderConnection =
       event::Events::ConnectPreRender(boost::bind(&Visual::Update, this));
 }
 
@@ -2159,47 +2422,48 @@ void Visual::MoveToPosition(const math::Pose &_pose, double _time)
   std::string animName = this->GetName() + "_animation";
 
   Ogre::Animation *anim =
-    this->sceneNode->getCreator()->createAnimation(animName, _time);
+    this->dataPtr->sceneNode->getCreator()->createAnimation(animName, _time);
   anim->setInterpolationMode(Ogre::Animation::IM_SPLINE);
 
-  Ogre::NodeAnimationTrack *strack = anim->createNodeTrack(0, this->sceneNode);
+  Ogre::NodeAnimationTrack *strack =
+      anim->createNodeTrack(0, this->dataPtr->sceneNode);
 
   key = strack->createNodeKeyFrame(0);
   key->setTranslate(Ogre::Vector3(start.x, start.y, start.z));
-  key->setRotation(this->sceneNode->getOrientation());
+  key->setRotation(this->dataPtr->sceneNode->getOrientation());
 
   key = strack->createNodeKeyFrame(_time);
   key->setTranslate(Ogre::Vector3(_pose.pos.x, _pose.pos.y, _pose.pos.z));
   key->setRotation(Conversions::Convert(rotFinal));
 
-  this->animState =
-    this->sceneNode->getCreator()->createAnimationState(animName);
+  this->dataPtr->animState =
+    this->dataPtr->sceneNode->getCreator()->createAnimationState(animName);
 
-  this->animState->setTimePosition(0);
-  this->animState->setEnabled(true);
-  this->animState->setLoop(false);
-  this->prevAnimTime = common::Time::GetWallTime();
+  this->dataPtr->animState->setTimePosition(0);
+  this->dataPtr->animState->setEnabled(true);
+  this->dataPtr->animState->setLoop(false);
+  this->dataPtr->prevAnimTime = common::Time::GetWallTime();
 
-  this->preRenderConnection =
+  this->dataPtr->preRenderConnection =
     event::Events::ConnectPreRender(boost::bind(&Visual::Update, this));
 }
 
 //////////////////////////////////////////////////
 void Visual::ShowBoundingBox()
 {
-  this->sceneNode->showBoundingBox(true);
+  this->dataPtr->sceneNode->showBoundingBox(true);
 }
 
 //////////////////////////////////////////////////
 void Visual::SetScene(ScenePtr _scene)
 {
-  this->scene = _scene;
+  this->dataPtr->scene = _scene;
 }
 
 //////////////////////////////////////////////////
 ScenePtr Visual::GetScene() const
 {
-  return this->scene;
+  return this->dataPtr->scene;
 }
 
 //////////////////////////////////////////////////
@@ -2209,7 +2473,8 @@ void Visual::ShowCollision(bool _show)
     this->SetVisible(_show);
 
   std::vector<VisualPtr>::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
     (*iter)->ShowCollision(_show);
   }
@@ -2229,7 +2494,8 @@ void Visual::ShowSkeleton(bool _show)
     this->SetVisible(_show);
 
   std::vector<VisualPtr>::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
     (*iter)->ShowSkeleton(_show);
   }
@@ -2238,20 +2504,21 @@ void Visual::ShowSkeleton(bool _show)
 //////////////////////////////////////////////////
 void Visual::SetVisibilityFlags(uint32_t _flags)
 {
-  for (std::vector<VisualPtr>::iterator iter = this->children.begin();
-       iter != this->children.end(); ++iter)
+  for (std::vector<VisualPtr>::iterator iter = this->dataPtr->children.begin();
+       iter != this->dataPtr->children.end(); ++iter)
   {
     (*iter)->SetVisibilityFlags(_flags);
   }
 
-  for (int i = 0; i < this->sceneNode->numAttachedObjects(); ++i)
+  for (int i = 0; i < this->dataPtr->sceneNode->numAttachedObjects(); ++i)
   {
-    this->sceneNode->getAttachedObject(i)->setVisibilityFlags(_flags);
+    this->dataPtr->sceneNode->getAttachedObject(i)->setVisibilityFlags(_flags);
   }
 
-  for (unsigned int i = 0; i < this->sceneNode->numChildren(); ++i)
+  for (unsigned int i = 0; i < this->dataPtr->sceneNode->numChildren(); ++i)
   {
-    Ogre::SceneNode *sn = (Ogre::SceneNode*)(this->sceneNode->getChild(i));
+    Ogre::SceneNode *sn =
+        (Ogre::SceneNode*)(this->dataPtr->sceneNode->getChild(i));
 
     for (int j = 0; j < sn->numAttachedObjects(); ++j)
       sn->getAttachedObject(j)->setVisibilityFlags(_flags);
@@ -2265,7 +2532,8 @@ void Visual::ShowJoints(bool _show)
     this->SetVisible(_show);
 
   std::vector<VisualPtr>::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
     (*iter)->ShowJoints(_show);
   }
@@ -2278,7 +2546,8 @@ void Visual::ShowCOM(bool _show)
     this->SetVisible(_show);
 
   std::vector<VisualPtr>::iterator iter;
-  for (iter = this->children.begin(); iter != this->children.end(); ++iter)
+  for (iter = this->dataPtr->children.begin();
+      iter != this->dataPtr->children.end(); ++iter)
   {
     (*iter)->ShowCOM(_show);
   }
@@ -2287,7 +2556,7 @@ void Visual::ShowCOM(bool _show)
 //////////////////////////////////////////////////
 void Visual::SetSkeletonPose(const msgs::PoseAnimation &_pose)
 {
-  if (!this->skeleton)
+  if (!this->dataPtr->skeleton)
   {
     gzerr << "Visual " << this->GetName() << " has no skeleton.\n";
     return;
@@ -2296,9 +2565,9 @@ void Visual::SetSkeletonPose(const msgs::PoseAnimation &_pose)
   for (int i = 0; i < _pose.pose_size(); i++)
   {
     const msgs::Pose& bonePose = _pose.pose(i);
-    if (!this->skeleton->hasBone(bonePose.name()))
+    if (!this->dataPtr->skeleton->hasBone(bonePose.name()))
       continue;
-    Ogre::Bone *bone = this->skeleton->getBone(bonePose.name());
+    Ogre::Bone *bone = this->dataPtr->skeleton->getBone(bonePose.name());
     Ogre::Vector3 p(bonePose.position().x(),
                     bonePose.position().y(),
                     bonePose.position().z());
@@ -2317,9 +2586,9 @@ void Visual::SetSkeletonPose(const msgs::PoseAnimation &_pose)
 //////////////////////////////////////////////////
 void Visual::LoadPlugins()
 {
-  if (this->sdf->HasElement("plugin"))
+  if (this->dataPtr->sdf->HasElement("plugin"))
   {
-    sdf::ElementPtr pluginElem = this->sdf->GetElement("plugin");
+    sdf::ElementPtr pluginElem = this->dataPtr->sdf->GetElement("plugin");
     while (pluginElem)
     {
       this->LoadPlugin(pluginElem);
@@ -2328,8 +2597,9 @@ void Visual::LoadPlugins()
   }
 
 
-  for (std::vector<VisualPluginPtr>::iterator iter = this->plugins.begin();
-       iter != this->plugins.end(); ++iter)
+  for (std::vector<VisualPluginPtr>::iterator iter =
+      this->dataPtr->plugins.begin();
+      iter != this->dataPtr->plugins.end(); ++iter)
   {
     (*iter)->Init();
   }
@@ -2353,9 +2623,9 @@ void Visual::LoadPlugin(const std::string &_filename,
       return;
     }
     plugin->Load(shared_from_this(), _sdf);
-    this->plugins.push_back(plugin);
+    this->dataPtr->plugins.push_back(plugin);
 
-    if (this->initialized)
+    if (this->dataPtr->initialized)
       plugin->Init();
   }
 }
@@ -2364,11 +2634,12 @@ void Visual::LoadPlugin(const std::string &_filename,
 void Visual::RemovePlugin(const std::string &_name)
 {
   std::vector<VisualPluginPtr>::iterator iter;
-  for (iter = this->plugins.begin(); iter != this->plugins.end(); ++iter)
+  for (iter = this->dataPtr->plugins.begin();
+      iter != this->dataPtr->plugins.end(); ++iter)
   {
     if ((*iter)->GetHandle() == _name)
     {
-      this->plugins.erase(iter);
+      this->dataPtr->plugins.erase(iter);
       break;
     }
   }
@@ -2377,7 +2648,19 @@ void Visual::RemovePlugin(const std::string &_name)
 //////////////////////////////////////////////////
 void Visual::LoadPlugin(sdf::ElementPtr _sdf)
 {
-  std::string pluginName = _sdf->GetValueString("name");
-  std::string filename = _sdf->GetValueString("filename");
+  std::string pluginName = _sdf->Get<std::string>("name");
+  std::string filename = _sdf->Get<std::string>("filename");
   this->LoadPlugin(filename, pluginName, _sdf);
 }
+
+//////////////////////////////////////////////////
+uint32_t Visual::GetId() const
+{
+  return this->dataPtr->id;
+}
+
+//////////////////////////////////////////////////
+void Visual::SetId(uint32_t _id)
+{
+  this->dataPtr->id = _id;
+}
diff --git a/gazebo/rendering/Visual.hh b/gazebo/rendering/Visual.hh
index 0cf5d06..d60febe 100644
--- a/gazebo/rendering/Visual.hh
+++ b/gazebo/rendering/Visual.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,43 +25,41 @@
 #include <boost/enable_shared_from_this.hpp>
 #include <string>
 #include <utility>
-#include <list>
 #include <vector>
 
-#include "gazebo/msgs/msgs.hh"
-#include "gazebo/common/Event.hh"
+#include <sdf/sdf.hh>
+
+#include "gazebo/common/Color.hh"
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/Time.hh"
+
+#include "gazebo/msgs/MessageTypes.hh"
 #include "gazebo/math/Box.hh"
 #include "gazebo/math/Pose.hh"
 #include "gazebo/math/Quaternion.hh"
 #include "gazebo/math/Vector3.hh"
-#include "gazebo/math/Vector2d.hh"
 
-#include "gazebo/sdf/sdf.hh"
 #include "gazebo/rendering/RenderTypes.hh"
-#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace Ogre
 {
   class MovableObject;
   class SceneNode;
-  class StaticGeometry;
-  class RibbonTrail;
-  class AnimationState;
-  class SkeletonInstance;
 }
 
 namespace gazebo
 {
   namespace rendering
   {
-    class WireBox;
+    class VisualPrivate;
 
     /// \addtogroup gazebo_rendering
     /// \{
 
     /// \class Visual Visual.hh rendering/rendering.hh
     /// \brief A renderable object
-    class Visual : public boost::enable_shared_from_this<Visual>
+    class GAZEBO_VISIBLE Visual : public boost::enable_shared_from_this<Visual>
     {
       /// \brief Constructor
       /// \param[in] _name Name of the visual.
@@ -173,6 +171,10 @@ namespace gazebo
       /// \return The scaling factor.
       public: math::Vector3 GetScale();
 
+      /// \brief Set whether or not to enable or disable lighting.
+      /// \param[in] _lighting True to enable lighting.
+      public: void SetLighting(bool _lighting);
+
       /// \brief Set the material.
       /// \param[in] _materialName The name of the material.
       /// \param[in] _unique True to make the material unique, which
@@ -214,6 +216,11 @@ namespace gazebo
       /// \param[in] _highlighted True to enable the highlighting.
       public: void SetHighlighted(bool _highlighted);
 
+      /// \brief Get whether or not the visual is visually highlighted. This is
+      /// most often means that an object is selected by a user via the GUI.
+      /// \return True if the visual is highlighted.
+      public: bool GetHighlighted() const;
+
       /// \brief Set the emissive value.
       /// \param[in] _color The emissive color.
       public: virtual void SetEmissive(const common::Color &_color);
@@ -264,7 +271,7 @@ namespace gazebo
 
       /// \brief Set the world pose of the visual.
       /// \param[in] _pose Pose of the visual in the world coordinate frame.
-      public: void SetWorldPose(const math::Pose _pose);
+      public: void SetWorldPose(const math::Pose &_pose);
 
       /// \brief Set the world linear position of the visual.
       /// \param[in] _pose Position in the world coordinate frame.
@@ -392,14 +399,14 @@ namespace gazebo
       /// \param[in] _flags The visiblity flags.
       /// \sa GZ_VISIBILITY_ALL
       /// \sa GZ_VISIBILITY_GUI
-      /// \sa GZ_VISIBILITY_NOT_SELECTABLE
+      /// \sa GZ_VISIBILITY_SELECTABLE
       public: void SetVisibilityFlags(uint32_t _flags);
 
       /// \brief Get visibility flags for this visual and all children.
       /// \return The visiblity flags.
       /// \sa GZ_VISIBILITY_ALL
       /// \sa GZ_VISIBILITY_GUI
-      /// \sa GZ_VISIBILITY_NOT_SELECTABLE
+      /// \sa GZ_VISIBILITY_SELECTABLE
       public: uint32_t GetVisibilityFlags();
 
       /// \brief Display the bounding box visual.
@@ -446,20 +453,11 @@ namespace gazebo
       /// \param _name The unique name of the plugin to remove
       public: void RemovePlugin(const std::string &_name);
 
-      /// \brief Load all plugins
-      ///
-      /// Load all plugins specified in the SDF for the model.
-      private: void LoadPlugins();
-
-      private: void LoadPlugin(sdf::ElementPtr _sdf);
-
-      private: std::vector<VisualPluginPtr> plugins;
+      /// \brief Get the id associated with this visual
+      public: uint32_t GetId() const;
 
-      /// \brief Helper function to get the bounding box for a visual.
-      /// \param[in] _node Pointer to the Ogre Node to process.
-      /// \param[in] _box Current bounding box information.
-      private: void GetBoundsHelper(Ogre::SceneNode *_node,
-                                    math::Box &_box) const;
+      /// \brief Set the id associated with this visual
+      public: void SetId(uint32_t _id);
 
       /// \brief The name of the mesh set in the visual's SDF.
       /// \return Name of the mesh.
@@ -473,14 +471,57 @@ namespace gazebo
       /// \brief Clear parents.
       public: void ClearParent();
 
-      /// \brief Pointer to the visual's scene.
-      protected: ScenePtr scene;
+      /// \internal
+      /// \brief Constructor used by inherited classes
+      /// \param[in] _dataPtr Pointer to private data.
+      /// \param[in] _name Name of the visual.
+      /// \param[in] _parent Parent of the visual.
+      /// \param[in] _useRTShader True if the visual should use the
+      /// real-time shader system (RTShader).
+      protected: Visual(VisualPrivate &_dataPtr,
+                        const std::string &_name, VisualPtr _parent,
+                        bool _useRTShader = true);
+
+      /// \internal
+      /// \brief Constructor used by inherited classes
+      /// \param[in] _dataPtr Pointer to private data.
+      /// \param[in] _name Name of the visual.
+      /// \param[in] _scene Scene containing the visual.
+      /// \param[in] _useRTShader True if the visual should use the
+      /// real-time shader system (RTShader).
+      protected: Visual(VisualPrivate &_dataPtr,
+                        const std::string &_name, ScenePtr _scene,
+                        bool _useRTShader = true);
 
-      /// \brief Pointer to the visual's scene node in Ogre.
-      protected: Ogre::SceneNode *sceneNode;
+      /// \brief Helper function for initializing the visual with a scene as
+      /// its parent.
+      /// \param[in] _name Name of the visual.
+      /// \param[in] _scene Scene containing the visual.
+      /// \param[in] _useRTShader True if the visual should use the
+      /// real-time shader system (RTShader).
+      private: void Init(const std::string &_name, ScenePtr _scene,
+          bool _useRTShader);
 
-      /// \brief Parent visual.
-      protected: VisualPtr parent;
+      /// \brief Helper function for initializing the visual with a visual as
+      /// its parent.
+      /// \param[in] _name Name of the visual.
+      /// \param[in] _scene Scene containing the visual.
+      /// \param[in] _useRTShader True if the visual should use the
+      /// real-time shader system (RTShader).
+      private: void Init(const std::string &_name, VisualPtr _parent,
+          bool _useRTShader);
+
+      /// \brief Load all plugins
+      /// Load all plugins specified in the SDF for the model.
+      private: void LoadPlugins();
+
+      private: void LoadPlugin(sdf::ElementPtr _sdf);
+
+      /// \brief Helper function to get the bounding box for a visual.
+      /// \param[in] _node Pointer to the Ogre Node to process.
+      /// \param[in] _box Current bounding box information.
+      private: void GetBoundsHelper(Ogre::SceneNode *_node,
+                                    math::Box &_box) const;
 
       /// \brief Return true if the submesh should be centered.
       /// \return True if the submesh should be centered when it's inserted
@@ -492,66 +533,9 @@ namespace gazebo
       private: void DestroyAllAttachedMovableObjects(
                    Ogre::SceneNode *_sceneNode);
 
-      /// \brief The SDF element for the visual.
-      private: sdf::ElementPtr sdf;
-
-      /// \brief The unique name for the visual's material.
-      private: std::string myMaterialName;
-
-      /// \brief The original name for the visual's material.
-      private: std::string origMaterialName;
-
-      /// \brief Transparency value.
-      private: float transparency;
-
-      /// \brief True if the visual is static, which allows Ogre to improve
-      /// performance.
-      private: bool isStatic;
-
-      /// \brief Pointer to the static geometry.
-      private: Ogre::StaticGeometry *staticGeom;
-
-      /// \brief True if rendered.
-      private: bool visible;
-
-      /// \brief The ribbon train created by the visual.
-      private: Ogre::RibbonTrail *ribbonTrail;
-
-      /// \brief The visual's skeleton, used only for person simulation.
-      private: Ogre::SkeletonInstance *skeleton;
-
-      /// \brief Connection for the pre render event.
-      private: event::ConnectionPtr preRenderConnection;
-
-      /// \brief List of all the lines created
-      private: std::list<DynamicLines*> lines;
-
-      /// \brief Lines and their vertices connected to this visual.
-      private: std::list< std::pair<DynamicLines*, unsigned int> > lineVertices;
-
-      /// \brief Name of the visual.
-      private: std::string name;
-
-      /// \brief Children visuals.
-      private: std::vector<VisualPtr> children;
-
-      /// \brief Used to animate the visual.
-      private: Ogre::AnimationState *animState;
-
-      /// \brief Time of the previous animation step.
-      private: common::Time prevAnimTime;
-
-      /// \brief Callback for the animation complete event.
-      private: boost::function<void()> onAnimationComplete;
-
-      /// \brief True to use RT shader system
-      private: bool useRTShader;
-
-      /// \brief True if initialized.
-      private: bool initialized;
-
-      /// \brief A wire frame bounding box.
-      private: WireBox *boundingBox;
+      /// \internal
+      /// \brief Pointer to private data.
+      protected: VisualPrivate *dataPtr;
     };
     /// \}
   }
diff --git a/gazebo/rendering/VisualPrivate.hh b/gazebo/rendering/VisualPrivate.hh
new file mode 100644
index 0000000..d9d3a79
--- /dev/null
+++ b/gazebo/rendering/VisualPrivate.hh
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2012-2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _VISUAL_PRIVATE_HH_
+#define _VISUAL_PRIVATE_HH_
+
+#include <string>
+#include <utility>
+#include <list>
+#include <vector>
+
+#include <sdf/sdf.hh>
+
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/math/Box.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/math/Quaternion.hh"
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Vector2d.hh"
+
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/common/CommonTypes.hh"
+
+namespace Ogre
+{
+  class MovableObject;
+  class SceneNode;
+  class StaticGeometry;
+  class RibbonTrail;
+  class AnimationState;
+  class SkeletonInstance;
+}
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    class WireBox;
+
+    /// \brief Private data for the Visual class
+    class VisualPrivate
+    {
+      /// \brief Pointer to the visual's scene.
+      public: ScenePtr scene;
+
+      /// \brief Pointer to the visual's scene node in Ogre.
+      public: Ogre::SceneNode *sceneNode;
+
+      /// \brief Parent visual.
+      public: VisualPtr parent;
+
+      /// \brief The SDF element for the visual.
+      public: sdf::ElementPtr sdf;
+
+      /// \brief The unique name for the visual's material.
+      public: std::string myMaterialName;
+
+      /// \brief The original name for the visual's material.
+      public: std::string origMaterialName;
+
+      /// \brief Transparency value.
+      public: float transparency;
+
+      /// \brief True if the visual is static, which allows Ogre to improve
+      /// performance.
+      public: bool isStatic;
+
+      /// \brief Pointer to the static geometry.
+      public: Ogre::StaticGeometry *staticGeom;
+
+      /// \brief True if rendered.
+      public: bool visible;
+
+      /// \brief The ribbon train created by the visual.
+      public: Ogre::RibbonTrail *ribbonTrail;
+
+      /// \brief The visual's skeleton, used only for person simulation.
+      public: Ogre::SkeletonInstance *skeleton;
+
+      /// \brief Connection for the pre render event.
+      public: event::ConnectionPtr preRenderConnection;
+
+      /// \brief List of all the lines created.
+      public: std::list<DynamicLines*> lines;
+
+      /// \brief Lines and their vertices connected to this visual.
+      public: std::list< std::pair<DynamicLines*, unsigned int> > lineVertices;
+
+      /// \brief Name of the visual.
+      public: std::string name;
+
+      /// \brief Children visuals.
+      public: std::vector<VisualPtr> children;
+
+      /// \brief Used to animate the visual.
+      public: Ogre::AnimationState *animState;
+
+      /// \brief Time of the previous animation step.
+      public: common::Time prevAnimTime;
+
+      /// \brief Callback for the animation complete event.
+      public: boost::function<void()> onAnimationComplete;
+
+      /// \brief True to use RT shader system.
+      public: bool useRTShader;
+
+      /// \brief True if initialized.
+      public: bool initialized;
+
+      /// \brief A wire frame bounding box.
+      public: WireBox *boundingBox;
+
+      /// \brief Unique id of this visual.
+      public: uint32_t id;
+
+      /// \brief Counter used to create unique ids.
+      public: static uint32_t visualIdCount;
+
+      /// \brief Scale of visual.
+      public: math::Vector3 scale;
+
+      /// \brief True if lighting will be applied to this visual.
+      public: bool lighting;
+
+      /// \brief A list of visual plugins.
+      public: std::vector<VisualPluginPtr> plugins;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/rendering/WindowManager.cc b/gazebo/rendering/WindowManager.cc
index e0aa72d..b3a0395 100644
--- a/gazebo/rendering/WindowManager.cc
+++ b/gazebo/rendering/WindowManager.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,12 +16,16 @@
 */
 #include <math.h>
 
-#include "rendering/ogre_gazebo.h"
+#ifdef  __APPLE__
+# include <QtCore/qglobal.h>
+#endif
 
-#include "common/Events.hh"
-#include "common/Color.hh"
-#include "common/Console.hh"
-#include "common/Exception.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Color.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
 
 #include "gazebo/rendering/Scene.hh"
 #include "gazebo/rendering/RenderEngine.hh"
@@ -76,10 +80,22 @@ int WindowManager::CreateWindow(const std::string &_ogreHandle,
   Ogre::NameValuePairList params;
   Ogre::RenderWindow *window = NULL;
 
+#ifdef Q_OS_MAC
+  params["externalWindowHandle"] = _ogreHandle;
+#else
   params["parentWindowHandle"] = _ogreHandle;
+#endif
   params["externalGLControl"] = true;
   params["FSAA"] = "4";
 
+  // Set the macAPI for Ogre based on the Qt implementation
+#ifdef QT_MAC_USE_COCOA
+  params["macAPI"] = "cocoa";
+  params["macAPICocoaUseNSView"] = "true";
+#else
+  params["macAPI"] = "carbon";
+#endif
+
   std::ostringstream stream;
   stream << "OgreWindow(" << windowCounter++ << ")";
 
diff --git a/gazebo/rendering/WindowManager.hh b/gazebo/rendering/WindowManager.hh
index 85dbfa6..832ae52 100644
--- a/gazebo/rendering/WindowManager.hh
+++ b/gazebo/rendering/WindowManager.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,8 +20,8 @@
 #include <string>
 #include <vector>
 
-#include "common/SingletonT.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace Ogre
 {
@@ -37,13 +37,13 @@ namespace gazebo
 
     /// \class WindowManager WindowManager.hh rendering/rendering.hh
     /// \brief Class to mangage render windows.
-    class WindowManager : public SingletonT<WindowManager>
+    class GAZEBO_VISIBLE WindowManager
     {
       /// \brief Constructor
-      private: WindowManager();
+      public: WindowManager();
 
       /// \brief Destructor
-      private: virtual ~WindowManager();
+      public: virtual ~WindowManager();
 
       /// \brief Shutdown all the windows
       public: void Fini();
@@ -91,9 +91,6 @@ namespace gazebo
 
       /// \brief Used to create unique names for the windows.
       private: static uint32_t windowCounter;
-
-      /// \brief This is a singleton class.
-      private: friend class SingletonT<WindowManager>;
     };
     /// \}
   }
diff --git a/gazebo/rendering/WireBox.cc b/gazebo/rendering/WireBox.cc
index fc3026a..9e44289 100644
--- a/gazebo/rendering/WireBox.cc
+++ b/gazebo/rendering/WireBox.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,10 @@
  *
 */
 
+#include "gazebo/math/Vector3.hh"
+
 #include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/rendering/WireBoxPrivate.hh"
 #include "gazebo/rendering/WireBox.hh"
 
 using namespace gazebo;
@@ -23,12 +26,13 @@ using namespace rendering;
 
 /////////////////////////////////////////////////
 WireBox::WireBox(VisualPtr _parent, const math::Box &_box)
+  : dataPtr(new WireBoxPrivate)
 {
-  this->parent = _parent;
-  this->lines = new DynamicLines(RENDERING_LINE_LIST);
-  this->lines->setMaterial("BaseWhiteNoLighting");
-  this->parent->AttachObject(this->lines);
-  this->lines->setVisibilityFlags(GZ_VISIBILITY_GUI);
+  this->dataPtr->parent = _parent;
+  this->dataPtr->lines = new DynamicLines(RENDERING_LINE_LIST);
+  this->dataPtr->lines->setMaterial("BaseWhiteNoLighting");
+  this->dataPtr->parent->AttachObject(this->dataPtr->lines);
+  this->dataPtr->lines->setVisibilityFlags(GZ_VISIBILITY_GUI);
 
   this->Init(_box);
 }
@@ -36,7 +40,9 @@ WireBox::WireBox(VisualPtr _parent, const math::Box &_box)
 /////////////////////////////////////////////////
 WireBox::~WireBox()
 {
-  delete this->lines;
+  delete this->dataPtr->lines;
+  delete this->dataPtr;
+  this->dataPtr = NULL;
 }
 
 /////////////////////////////////////////////////
@@ -45,61 +51,67 @@ void WireBox::Init(const math::Box &_box)
   math::Vector3 max = _box.max;
   math::Vector3 min = _box.min;
 
-  this->lines->Clear();
+  this->dataPtr->lines->Clear();
 
   // line 0
-  this->lines->AddPoint(min.x, min.y, min.z);
-  this->lines->AddPoint(max.x, min.y, min.z);
+  this->dataPtr->lines->AddPoint(min.x, min.y, min.z);
+  this->dataPtr->lines->AddPoint(max.x, min.y, min.z);
 
   // line 1
-  this->lines->AddPoint(min.x, min.y, min.z);
-  this->lines->AddPoint(min.x, min.y, max.z);
+  this->dataPtr->lines->AddPoint(min.x, min.y, min.z);
+  this->dataPtr->lines->AddPoint(min.x, min.y, max.z);
 
   // line 2
-  this->lines->AddPoint(min.x, min.y, min.z);
-  this->lines->AddPoint(min.x, max.y, min.z);
+  this->dataPtr->lines->AddPoint(min.x, min.y, min.z);
+  this->dataPtr->lines->AddPoint(min.x, max.y, min.z);
 
   // line 3
-  this->lines->AddPoint(min.x, max.y, min.z);
-  this->lines->AddPoint(min.x, max.y, max.z);
+  this->dataPtr->lines->AddPoint(min.x, max.y, min.z);
+  this->dataPtr->lines->AddPoint(min.x, max.y, max.z);
 
   // line 4
-  this->lines->AddPoint(min.x, max.y, min.z);
-  this->lines->AddPoint(max.x, max.y, min.z);
+  this->dataPtr->lines->AddPoint(min.x, max.y, min.z);
+  this->dataPtr->lines->AddPoint(max.x, max.y, min.z);
 
   // line 5
-  this->lines->AddPoint(max.x, min.y, min.z);
-  this->lines->AddPoint(max.x, min.y, max.z);
+  this->dataPtr->lines->AddPoint(max.x, min.y, min.z);
+  this->dataPtr->lines->AddPoint(max.x, min.y, max.z);
 
   // line 6
-  this->lines->AddPoint(max.x, min.y, min.z);
-  this->lines->AddPoint(max.x, max.y, min.z);
+  this->dataPtr->lines->AddPoint(max.x, min.y, min.z);
+  this->dataPtr->lines->AddPoint(max.x, max.y, min.z);
 
   // line 7
-  this->lines->AddPoint(min.x, max.y, max.z);
-  this->lines->AddPoint(max.x, max.y, max.z);
+  this->dataPtr->lines->AddPoint(min.x, max.y, max.z);
+  this->dataPtr->lines->AddPoint(max.x, max.y, max.z);
 
   // line 8
-  this->lines->AddPoint(min.x, max.y, max.z);
-  this->lines->AddPoint(min.x, min.y, max.z);
+  this->dataPtr->lines->AddPoint(min.x, max.y, max.z);
+  this->dataPtr->lines->AddPoint(min.x, min.y, max.z);
 
   // line 9
-  this->lines->AddPoint(max.x, max.y, min.z);
-  this->lines->AddPoint(max.x, max.y, max.z);
+  this->dataPtr->lines->AddPoint(max.x, max.y, min.z);
+  this->dataPtr->lines->AddPoint(max.x, max.y, max.z);
 
   // line 10
-  this->lines->AddPoint(max.x, min.y, max.z);
-  this->lines->AddPoint(max.x, max.y, max.z);
+  this->dataPtr->lines->AddPoint(max.x, min.y, max.z);
+  this->dataPtr->lines->AddPoint(max.x, max.y, max.z);
 
   // line 11
-  this->lines->AddPoint(min.x, min.y, max.z);
-  this->lines->AddPoint(max.x, min.y, max.z);
+  this->dataPtr->lines->AddPoint(min.x, min.y, max.z);
+  this->dataPtr->lines->AddPoint(max.x, min.y, max.z);
 
-  this->lines->Update();
+  this->dataPtr->lines->Update();
 }
 
 /////////////////////////////////////////////////
 void WireBox::SetVisible(bool _visible)
 {
-  this->lines->setVisible(_visible);
+  this->dataPtr->lines->setVisible(_visible);
+}
+
+/////////////////////////////////////////////////
+bool WireBox::GetVisible() const
+{
+  return this->dataPtr->lines->isVisible();
 }
diff --git a/gazebo/rendering/WireBox.hh b/gazebo/rendering/WireBox.hh
index f81330a..83db735 100644
--- a/gazebo/rendering/WireBox.hh
+++ b/gazebo/rendering/WireBox.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,29 +13,31 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
-*/
+ */
+
 #ifndef _WIREBOX_HH_
 #define _WIREBOX_HH_
 
-#include <string>
-
 #include "gazebo/math/Box.hh"
 #include "gazebo/rendering/Visual.hh"
-#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace rendering
   {
+    class WireBoxPrivate;
+
     /// \addtogroup gazebo_rendering
     /// \{
 
     /// \class WireBox WireBox.hh rendering/rendering.hh
     /// \brief Draws a wireframe box.
-    class WireBox
+    class GAZEBO_VISIBLE WireBox
     {
       /// \brief Constructor
-      /// \param[in] _box Dimenision of the box to draw.
+      /// \param[in] _box Dimension of the box to draw.
+      /// \param[in] _parent Parent visual of the box.
       public: explicit WireBox(VisualPtr _parent, const math::Box &_box);
 
       /// \brief Destructor.
@@ -49,11 +51,17 @@ namespace gazebo
       /// \param[in] _visible True to make the box visible, False to hide.
       public: void SetVisible(bool _visible);
 
-      /// \brief The lines which outline the box.
-      private: DynamicLines *lines;
+      /// \brief Get the visibility of the box.
+      /// \return True if the box is visual.
+      public: bool GetVisible() const;
+
+      /// \brief Get the wireframe box.
+      /// \return The wireframe box.
+      public: math::Box GetBox() const;
 
-      /// \brief The visual which this box is attached to.
-      private: VisualPtr parent;
+      /// \internal
+      /// \brief Pointer to private data.
+      private: WireBoxPrivate *dataPtr;
     };
     /// \}
   }
diff --git a/gazebo/rendering/WireBoxPrivate.hh b/gazebo/rendering/WireBoxPrivate.hh
new file mode 100644
index 0000000..db7ed89
--- /dev/null
+++ b/gazebo/rendering/WireBoxPrivate.hh
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _WIREBOX_PRIVATE_HH_
+#define _WIREBOX_PRIVATE_HH_
+
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/rendering/DynamicLines.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \brief Private data for the WireBox class
+    class WireBoxPrivate
+    {
+      /// \brief The lines which outline the box.
+      public: DynamicLines *lines;
+
+      /// \brief The visual which this box is attached to.
+      public: VisualPtr parent;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/WrenchVisual.cc b/gazebo/rendering/WrenchVisual.cc
new file mode 100644
index 0000000..45f941e
--- /dev/null
+++ b/gazebo/rendering/WrenchVisual.cc
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/transport/transport.hh"
+
+#include "gazebo/rendering/Conversions.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/DynamicLines.hh"
+#include "gazebo/rendering/WrenchVisualPrivate.hh"
+#include "gazebo/rendering/WrenchVisual.hh"
+
+using namespace gazebo;
+using namespace rendering;
+
+/////////////////////////////////////////////////
+WrenchVisual::WrenchVisual(const std::string &_name, VisualPtr _vis,
+    const std::string &_topicName)
+  : Visual(*new WrenchVisualPrivate, _name, _vis)
+{
+  WrenchVisualPrivate *dPtr =
+      reinterpret_cast<WrenchVisualPrivate *>(this->dataPtr);
+
+  dPtr->enabled = true;
+  dPtr->receivedMsg = false;
+
+  dPtr->node = transport::NodePtr(new transport::Node());
+  dPtr->node->Init(dPtr->scene->GetName());
+
+  dPtr->wrenchSub = dPtr->node->Subscribe(_topicName,
+      &WrenchVisual::OnMsg, this, true);
+
+  // Make sure the meshes are in Ogre
+  this->InsertMesh("unit_cone");
+  Ogre::MovableObject *coneXObj =
+    (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+          this->GetName()+"__WRENCH_X_CONE__", "unit_cone"));
+  ((Ogre::Entity*)coneXObj)->setMaterialName("__GAZEBO_TRANS_RED_MATERIAL__");
+
+  Ogre::MovableObject *coneYObj =
+    (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+          this->GetName()+"__WRENCH_Y_CONE__", "unit_cone"));
+  ((Ogre::Entity*)coneYObj)->setMaterialName("__GAZEBO_TRANS_GREEN_MATERIAL__");
+
+  Ogre::MovableObject *coneZObj =
+    (Ogre::MovableObject*)(dPtr->scene->GetManager()->createEntity(
+          this->GetName()+"__WRENCH_Z_CONE__", "unit_cone"));
+  ((Ogre::Entity*)coneZObj)->setMaterialName("__GAZEBO_TRANS_BLUE_MATERIAL__");
+
+  math::Quaternion q;
+
+  dPtr->coneXNode =
+      dPtr->sceneNode->createChildSceneNode(this->GetName() + "_WRENCH_X_CONE");
+  dPtr->coneXNode->attachObject(coneXObj);
+  q.SetFromAxis(0, 1, 0, GZ_DTOR(-90));
+  dPtr->coneXNode->setOrientation(q.w, q.x, q.y, q.z);
+  dPtr->coneXNode->setScale(0.02, 0.02, 0.02);
+
+  dPtr->coneYNode =
+      dPtr->sceneNode->createChildSceneNode(this->GetName() + "_WRENCH_Y_CONE");
+  dPtr->coneYNode->attachObject(coneYObj);
+  q.SetFromAxis(1, 0, 0, GZ_DTOR(90));
+  dPtr->coneYNode->setOrientation(q.w, q.x, q.y, q.z);
+  dPtr->coneYNode->setScale(0.02, 0.02, 0.02);
+
+  dPtr->coneZNode =
+    dPtr->sceneNode->createChildSceneNode(this->GetName() + "_WRENCH_Z_CONE");
+  dPtr->coneZNode->attachObject(coneZObj);
+  q.SetFromAxis(1, 0, 0, GZ_DTOR(180));
+  dPtr->coneZNode->setOrientation(q.w, q.x, q.y, q.z);
+  dPtr->coneZNode->setScale(0.02, 0.02, 0.02);
+
+  dPtr->forceLine = new DynamicLines(RENDERING_LINE_LIST);
+  dPtr->forceLine->AddPoint(math::Vector3(0, 0, 0));
+  dPtr->forceLine->AddPoint(math::Vector3(0, 0, 0));
+  dPtr->forceLine->setMaterial("__GAZEBO_TRANS_PURPLE_MATERIAL__");
+
+  dPtr->forceNode = dPtr->sceneNode->createChildSceneNode(this->GetName() +
+      "_WRENCH_FORCE_NODE_");
+  dPtr->forceNode->attachObject(dPtr->forceLine);
+
+  this->SetVisibilityFlags(GZ_VISIBILITY_GUI);
+
+  dPtr->connections.push_back(
+      event::Events::ConnectPreRender(
+        boost::bind(&WrenchVisual::Update, this)));
+}
+
+/////////////////////////////////////////////////
+WrenchVisual::~WrenchVisual()
+{
+  WrenchVisualPrivate *dPtr =
+      reinterpret_cast<WrenchVisualPrivate *>(this->dataPtr);
+
+  dPtr->node.reset();
+  dPtr->connections.clear();
+
+  delete dPtr->forceLine;
+  dPtr->forceLine = NULL;
+
+  delete dPtr->forceNode;
+  dPtr->forceNode = NULL;
+}
+
+/////////////////////////////////////////////////
+void WrenchVisual::Load(ConstJointPtr &_msg)
+{
+  Visual::Load();
+  this->SetPosition(msgs::Convert(_msg->pose().position()));
+  this->SetRotation(msgs::Convert(_msg->pose().orientation()));
+}
+
+/////////////////////////////////////////////////
+void WrenchVisual::Update()
+{
+  WrenchVisualPrivate *dPtr =
+      reinterpret_cast<WrenchVisualPrivate *>(this->dataPtr);
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+
+  if (!dPtr->wrenchMsg || !dPtr->receivedMsg)
+    return;
+
+  double magScale = 100;
+  double vMax = 0.5;
+  double vMin = 0.1;
+  double vRange = vMax - vMin;
+  double offset = vRange - vMin;
+
+  // Scaling factor.
+  double xScale = (2.0 * vRange) / (1 +
+      exp(-dPtr->wrenchMsg->wrench().torque().x() / magScale)) - offset;
+
+  double yScale = (2.0 * vRange) / (1 +
+      exp(-dPtr->wrenchMsg->wrench().torque().y() / magScale)) - offset;
+
+  double zScale = (2.0 * vRange) / (1 +
+      exp(-dPtr->wrenchMsg->wrench().torque().z() / magScale)) - offset;
+
+  magScale = 50000;
+  math::Vector3 force = msgs::Convert(dPtr->wrenchMsg->wrench().force());
+  double forceScale = (2.0 * vRange) / (1 +
+      exp(force.GetSquaredLength() / magScale)) - offset;
+
+  dPtr->forceLine->SetPoint(1, force*forceScale);
+  dPtr->forceLine->Update();
+
+  dPtr->coneXNode->setScale(0.02, 0.02, xScale);
+  dPtr->coneXNode->setPosition(xScale * 0.5, 0, 0);
+
+  dPtr->coneYNode->setScale(0.02, 0.02, yScale);
+  dPtr->coneYNode->setPosition(0, yScale * 0.5, 0);
+
+  dPtr->coneZNode->setScale(0.02, 0.02, zScale);
+  dPtr->coneZNode->setPosition(0, 0, zScale * 0.5);
+}
+
+/////////////////////////////////////////////////
+void WrenchVisual::OnMsg(ConstWrenchStampedPtr &_msg)
+{
+  WrenchVisualPrivate *dPtr =
+      reinterpret_cast<WrenchVisualPrivate *>(this->dataPtr);
+
+  boost::mutex::scoped_lock lock(dPtr->mutex);
+  if (dPtr->enabled)
+  {
+    dPtr->wrenchMsg = _msg;
+    dPtr->receivedMsg = true;
+  }
+}
diff --git a/gazebo/rendering/WrenchVisual.hh b/gazebo/rendering/WrenchVisual.hh
new file mode 100644
index 0000000..85fe6c6
--- /dev/null
+++ b/gazebo/rendering/WrenchVisual.hh
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _WRENCHVISUAL_HH_
+#define _WRENCHVISUAL_HH_
+
+#include <string>
+
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/Visual.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    /// \addtogroup gazebo_rendering
+    /// \{
+
+    /// \class WrenchVisual WrenchVisual.hh rendering/rendering.hh
+    /// \brief Visualization for sonar data.
+    class GAZEBO_VISIBLE WrenchVisual : public Visual
+    {
+      /// \brief Constructor.
+      /// \param[in] _name Name of the visual.
+      /// \param[in] _vis Pointer to the parent Visual.
+      /// \param[in] _topicName Name of the topic that has sonar data.
+      public: WrenchVisual(const std::string &_name, VisualPtr _vis,
+                          const std::string &_topicName);
+
+      /// \brief Destructor.
+      public: virtual ~WrenchVisual();
+
+      /// \brief Load the visual based on a message
+      /// \param[in] _msg Joint message
+      public: void Load(ConstJointPtr &_msg);
+      using Visual::Load;
+
+      /// \brief Set to true to enable wrench visualization.
+      /// \param[in] _enabled True to show wrenches, false to hide.
+      public: void SetEnabled(bool _enabled);
+
+      /// \brief Callback when sonar data is received.
+      private: void OnMsg(ConstWrenchStampedPtr &_msg);
+
+      /// \brief Update the wrench visual.
+      private: void Update();
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/rendering/WrenchVisualPrivate.hh b/gazebo/rendering/WrenchVisualPrivate.hh
new file mode 100644
index 0000000..dedaab0
--- /dev/null
+++ b/gazebo/rendering/WrenchVisualPrivate.hh
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _WRENCHVISUAL_PRIVATE_HH_
+#define _WRENCHVISUAL_PRIVATE_HH_
+
+#include <vector>
+
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/VisualPrivate.hh"
+
+namespace gazebo
+{
+  namespace rendering
+  {
+    class DynamicLines;
+
+    /// \brief Private data for the Wrench Visual class.
+    class WrenchVisualPrivate : public VisualPrivate
+    {
+      /// \brief Pointer to a node that handles communication.
+      public: transport::NodePtr node;
+
+      /// \brief Subscription to the sonar data.
+      public: transport::SubscriberPtr wrenchSub;
+
+      /// \brief Scene node for X torque visualization.
+      public: Ogre::SceneNode *coneXNode;
+
+      /// \brief Scene node for Y torque visualization.
+      public: Ogre::SceneNode *coneYNode;
+
+      /// \brief Scene node for Z torque visualization.
+      public: Ogre::SceneNode *coneZNode;
+
+      /// \brief Scene node for force visualization.
+      public: Ogre::SceneNode *forceNode;
+
+      /// \brief Line to visualize force
+      public: DynamicLines *forceLine;
+
+      /// \brief The current wrench message.
+      public: boost::shared_ptr<msgs::WrenchStamped const> wrenchMsg;
+
+      /// \brief True if we have received a message.
+      public: bool receivedMsg;
+
+      /// \brief True if this visualization is enabled.
+      public: bool enabled;
+
+      /// \brief Mutex to protect the contact message.
+      public: boost::mutex mutex;
+
+      /// \brief All the event connections.
+      public: std::vector<event::ConnectionPtr> connections;
+    };
+  }
+}
+#endif
diff --git a/gazebo/rendering/cegui.h b/gazebo/rendering/cegui.h
index 873f6b0..f755001 100644
--- a/gazebo/rendering/cegui.h
+++ b/gazebo/rendering/cegui.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
 // This disables warning messages
 #pragma GCC system_header
 
-#include "gazebo_config.h"
+#include "gazebo/gazebo_config.h"
 
 #ifdef HAVE_CEGUI
 #include <CEGUI/CEGUI.h>
diff --git a/gazebo/rendering/deferred_shading/AmbientLight.hh b/gazebo/rendering/deferred_shading/AmbientLight.hh
index 0497767..9aa2170 100644
--- a/gazebo/rendering/deferred_shading/AmbientLight.hh
+++ b/gazebo/rendering/deferred_shading/AmbientLight.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 #include <OgreSimpleRenderable.h>
 
 #include "gazebo/rendering/deferred_shading/GeomUtils.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,8 @@ namespace gazebo
     // XXX Could make this a singleton/make it private to the
     // DeferredShadingSystem e.g.
     template<class techniquePolicy>
-    class AmbientLight : public Ogre::SimpleRenderable, public techniquePolicy
+    class GAZEBO_VISIBLE AmbientLight
+      : public Ogre::SimpleRenderable, public techniquePolicy
     {
       /// \brief Constructor
       public: AmbientLight()
diff --git a/gazebo/rendering/deferred_shading/DeferredLight.cc b/gazebo/rendering/deferred_shading/DeferredLight.cc
index e9815ac..5ebeba0 100644
--- a/gazebo/rendering/deferred_shading/DeferredLight.cc
+++ b/gazebo/rendering/deferred_shading/DeferredLight.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -237,7 +237,7 @@ void DeferredLight::CreateCone(float _radius, float _height,
         Ogre::Vector3(-_radius, 0, -_radius),
         Ogre::Vector3(_radius, _height, _radius)));
 
-  this->radius = radius;
+  this->radius = _radius;
   this->ignoreWorld = false;
 }
 
diff --git a/gazebo/rendering/deferred_shading/DeferredLight.hh b/gazebo/rendering/deferred_shading/DeferredLight.hh
index 2fd622f..a25d930 100644
--- a/gazebo/rendering/deferred_shading/DeferredLight.hh
+++ b/gazebo/rendering/deferred_shading/DeferredLight.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include <OgreTechnique.h>
 
 #include "gazebo/rendering/deferred_shading/MaterialGenerator.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -30,7 +31,7 @@ namespace gazebo
     /// Deferred light geometry. Each instance matches a normal light.
     /// Should not be created by the user.
     /// XXX support other types of light other than point lights.
-    class DeferredLight: public Ogre::SimpleRenderable
+    class GAZEBO_VISIBLE DeferredLight: public Ogre::SimpleRenderable
     {
       /// \brief Constructor
       public: DeferredLight(MaterialGenerator *_gen, Ogre::Light *_parentLight,
diff --git a/gazebo/rendering/deferred_shading/DeferredLightCP.hh b/gazebo/rendering/deferred_shading/DeferredLightCP.hh
index 39cc61e..a345e32 100644
--- a/gazebo/rendering/deferred_shading/DeferredLightCP.hh
+++ b/gazebo/rendering/deferred_shading/DeferredLightCP.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@
 #include "gazebo/rendering/deferred_shading/DeferredLight.hh"
 #include "gazebo/rendering/deferred_shading/MaterialGenerator.hh"
 #include "gazebo/rendering/deferred_shading/AmbientLight.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -38,7 +39,7 @@ namespace gazebo
     /// calls of the spheres (point lights), cones (spotlights) and quads
     /// (directional lights) after the GBuffer has been constructed
     template<typename techniquePolicy>
-    class DeferredLightRenderOperation
+    class GAZEBO_VISIBLE DeferredLightRenderOperation
       : public Ogre::CompositorInstance::RenderSystemOperation,
         public techniquePolicy
     {
@@ -232,8 +233,8 @@ namespace gazebo
     /// \brief The custom composition pass that is used for rendering the light
     /// geometry. This class needs to be registered with the CompositorManager
     template<typename techniquePolicy>
-    class DeferredLightCompositionPass : public Ogre::CustomCompositionPass,
-                                         public techniquePolicy
+    class GAZEBO_VISIBLE DeferredLightCompositionPass
+      : public Ogre::CustomCompositionPass, public techniquePolicy
     {
       /// @copydoc CustomCompositionPass::createOperation
       public: virtual Ogre::CompositorInstance::RenderSystemOperation
diff --git a/gazebo/rendering/deferred_shading/GBufferMaterialGenerator.cc b/gazebo/rendering/deferred_shading/GBufferMaterialGenerator.cc
index 8080838..f20bff0 100644
--- a/gazebo/rendering/deferred_shading/GBufferMaterialGenerator.cc
+++ b/gazebo/rendering/deferred_shading/GBufferMaterialGenerator.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/rendering/deferred_shading/GBufferMaterialGenerator.hh b/gazebo/rendering/deferred_shading/GBufferMaterialGenerator.hh
index 497b189..5538f08 100644
--- a/gazebo/rendering/deferred_shading/GBufferMaterialGenerator.hh
+++ b/gazebo/rendering/deferred_shading/GBufferMaterialGenerator.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _GBUFFER_MATERIAL_GENERATOR_HH_
 
 #include "gazebo/rendering/deferred_shading/MaterialGenerator.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,7 @@ namespace gazebo
     /// there. in order to support more, either expand this class or make sure
     /// that objects that will not get treated correctly will not have
     /// materials generated for them.
-    class GBufferMaterialGenerator : public MaterialGenerator
+    class GAZEBO_VISIBLE GBufferMaterialGenerator : public MaterialGenerator
     {
       /// \brief The types of g buffers
       public: enum GBufferType
diff --git a/gazebo/rendering/deferred_shading/GBufferSchemeHandler.cc b/gazebo/rendering/deferred_shading/GBufferSchemeHandler.cc
index db7ffa3..b4f9593 100644
--- a/gazebo/rendering/deferred_shading/GBufferSchemeHandler.cc
+++ b/gazebo/rendering/deferred_shading/GBufferSchemeHandler.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/rendering/deferred_shading/GBufferSchemeHandler.hh b/gazebo/rendering/deferred_shading/GBufferSchemeHandler.hh
index 9206675..059a085 100644
--- a/gazebo/rendering/deferred_shading/GBufferSchemeHandler.hh
+++ b/gazebo/rendering/deferred_shading/GBufferSchemeHandler.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include <string>
 
 #include "gazebo/rendering/deferred_shading/GBufferMaterialGenerator.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,8 @@ namespace gazebo
     /// @note This does not support all the possible rendering techniques
     /// out there. in order to support more, either expand this class or
     /// specify the techniques in the materials.
-    class GBufferSchemeHandler : public Ogre::MaterialManager::Listener
+    class GAZEBO_VISIBLE GBufferSchemeHandler :
+      public Ogre::MaterialManager::Listener
     {
       public: GBufferSchemeHandler(GBufferMaterialGenerator::GBufferType _type)
               : type(_type), materialGenerator(_type) {}
diff --git a/gazebo/rendering/deferred_shading/GeomUtils.cc b/gazebo/rendering/deferred_shading/GeomUtils.cc
index 59b4b52..60840a5 100644
--- a/gazebo/rendering/deferred_shading/GeomUtils.cc
+++ b/gazebo/rendering/deferred_shading/GeomUtils.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/rendering/deferred_shading/GeomUtils.hh b/gazebo/rendering/deferred_shading/GeomUtils.hh
index 5bce655..e080c17 100644
--- a/gazebo/rendering/deferred_shading/GeomUtils.hh
+++ b/gazebo/rendering/deferred_shading/GeomUtils.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,12 +19,13 @@
 
 #include <OgreString.h>
 #include <OgreVertexIndexData.h>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace rendering
   {
-    class GeomUtils
+    class GAZEBO_VISIBLE GeomUtils
     {
       /// \brief Create a sphere Mesh with a given name, radius, number of
       /// rings and number of segments
diff --git a/gazebo/rendering/deferred_shading/LightMaterialGenerator.hh b/gazebo/rendering/deferred_shading/LightMaterialGenerator.hh
index 4e89cef..3087c85 100644
--- a/gazebo/rendering/deferred_shading/LightMaterialGenerator.hh
+++ b/gazebo/rendering/deferred_shading/LightMaterialGenerator.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@
 #include "gazebo/common/Exception.hh"
 #include "gazebo/rendering/deferred_shading/TechniqueDefinitions.hh"
 #include "gazebo/rendering/deferred_shading/MaterialGenerator.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -41,7 +42,8 @@ namespace gazebo
     class LightMaterialGeneratorGLSL;
 
     template<typename techniquePolicy>
-    class LightMaterialGenerator: public MaterialGenerator, techniquePolicy
+    class GAZEBO_VISIBLE LightMaterialGenerator :
+      public MaterialGenerator, techniquePolicy
     {
       /// Permutation of light materials
       public: enum MaterialID
@@ -72,8 +74,8 @@ namespace gazebo
     };
 
     template<typename techniquePolicy>
-    class LightMaterialGeneratorGLSL : public MaterialGenerator::Impl,
-                                       public techniquePolicy
+    class GAZEBO_VISIBLE LightMaterialGeneratorGLSL :
+      public MaterialGenerator::Impl, public techniquePolicy
     {
       public: typedef MaterialGenerator::Perm Perm;
 
diff --git a/gazebo/rendering/deferred_shading/ListenerFactoryLogic.hh b/gazebo/rendering/deferred_shading/ListenerFactoryLogic.hh
index 9a89a30..4436c77 100644
--- a/gazebo/rendering/deferred_shading/ListenerFactoryLogic.hh
+++ b/gazebo/rendering/deferred_shading/ListenerFactoryLogic.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 #include <OgreCompositorInstance.h>
 #include <OgreCompositorLogic.h>
 #include <map>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -27,7 +28,7 @@ namespace gazebo
   {
     /// The simple types of compositor logics will all do the same thing -
     /// Attach a listener to the created compositor
-    class ListenerFactoryLogic : public Ogre::CompositorLogic
+    class GAZEBO_VISIBLE ListenerFactoryLogic : public Ogre::CompositorLogic
     {
       //// @copydoc CompositorLogic::compositorInstanceCreated
       public: virtual void compositorInstanceCreated(
diff --git a/gazebo/rendering/deferred_shading/MaterialGenerator.cc b/gazebo/rendering/deferred_shading/MaterialGenerator.cc
index 0eb2736..8137a52 100644
--- a/gazebo/rendering/deferred_shading/MaterialGenerator.cc
+++ b/gazebo/rendering/deferred_shading/MaterialGenerator.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/rendering/deferred_shading/MaterialGenerator.hh b/gazebo/rendering/deferred_shading/MaterialGenerator.hh
index bcd3cb2..50c808b 100644
--- a/gazebo/rendering/deferred_shading/MaterialGenerator.hh
+++ b/gazebo/rendering/deferred_shading/MaterialGenerator.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include <map>
 
 #include <string>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
     /// all these out is a tedious job. Of course it is possible to always use
     /// the material with all features, but that might result in large, slow
     /// shader programs. This class provides an efficient solution to that.
-    class MaterialGenerator
+    class GAZEBO_VISIBLE MaterialGenerator
     {
       /// Bitfield used to signify a material permutations
       public: typedef uint32_t Perm;
diff --git a/gazebo/rendering/deferred_shading/MergeCP.hh b/gazebo/rendering/deferred_shading/MergeCP.hh
index 3790723..97cea1e 100644
--- a/gazebo/rendering/deferred_shading/MergeCP.hh
+++ b/gazebo/rendering/deferred_shading/MergeCP.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 
 #include <OgreCompositorInstance.h>
 #include <OgreCustomCompositionPass.h>
+#include "gazebo/util/system.hh"
 
 
 namespace gazebo
@@ -29,7 +30,7 @@ namespace gazebo
     // composition pass. This is the class that will send the actual render
     // calls of the spheres (point lights), cones (spotlights) and quads
     // (directional lights) after the GBuffer has been constructed
-    class MergeRenderOperation :
+    class GAZEBO_VISIBLE MergeRenderOperation :
       public Ogre::CompositorInstance::RenderSystemOperation
     {
       public: MergeRenderOperation(Ogre::CompositorInstance *_instance,
@@ -44,7 +45,8 @@ namespace gazebo
 
     /// The custom composition pass that is used for rendering the light
     /// geometry. This class needs to be registered with the CompositorManager
-    class MergeCompositionPass : public Ogre::CustomCompositionPass
+    class GAZEBO_VISIBLE MergeCompositionPass :
+      public Ogre::CustomCompositionPass
     {
       /// @copydoc CustomCompositionPass::createOperation
       public: virtual Ogre::CompositorInstance::RenderSystemOperation *
diff --git a/gazebo/rendering/deferred_shading/MergeMaterialGenerator.cc b/gazebo/rendering/deferred_shading/MergeMaterialGenerator.cc
index dc8f285..6f66666 100644
--- a/gazebo/rendering/deferred_shading/MergeMaterialGenerator.cc
+++ b/gazebo/rendering/deferred_shading/MergeMaterialGenerator.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -392,65 +392,65 @@ Ogre::MaterialPtr MergeMaterialGeneratorImpl::GenerateTemplateMaterial(
    Ogre::StringStream ss;
 
    ss << "void MergeVP(" << std::endl;
-   ss << "	float4 iPosition : POSITION," << std::endl;
+   ss << "  float4 iPosition : POSITION," << std::endl;
 //Get the normal, although this isn't 100% necesarry, it is cheaper to use the normal from the input
 //geometry than fetching it from the GBuffer
-ss << "	float3 iNormal   : NORMAL," << std::endl;
+ss << "  float3 iNormal   : NORMAL," << std::endl;
 
 Ogre::uint32 numTexCoords = (permutation & MergeMaterialGenerator::MP_TEXCOORD_MASK) >> 8;
-for (Ogre::uint32 i=0; i<numTexCoords; i++)
+for (Ogre::uint32 i = 0; i < numTexCoords; i++)
 {
-ss << "	float2 iUV" << i << " : TEXCOORD" << i << ',' << std::endl;
+ss << "  float2 iUV" << i << " : TEXCOORD" << i << ',' << std::endl;
 }
 
 if (permutation & MergeMaterialGenerator::MP_NORMAL_MAP)
 {
-ss << "	float3 iTangent : TANGENT0," << std::endl;
+ss << "  float3 iTangent : TANGENT0," << std::endl;
 }
 
 //TODO : Skinning inputs
 ss << std::endl;
 
-ss << "	out float4 oPosition : POSITION," << std::endl;
+ss << "  out float4 oPosition : POSITION," << std::endl;
 
 int texCoordNum=0;
-ss << "	out half3 oNormal : TEXCOORD" <<texCoordNum++<<","<<std::endl;
+ss << "  out half3 oNormal : TEXCOORD" <<texCoordNum++<<","<<std::endl;
 
 if ((permutation & MergeMaterialGenerator::MP_NORMAL_MAP) )
 {
-ss << "	out half3 oTangent : TEXCOORD" << texCoordNum++ << ',' << std::endl;
-ss << "	out half3 oBiNormal : TEXCOORD" << texCoordNum++ << ',' << std::endl;
+ss << "  out half3 oTangent : TEXCOORD" << texCoordNum++ << ',' << std::endl;
+ss << "  out half3 oBiNormal : TEXCOORD" << texCoordNum++ << ',' << std::endl;
 }
-for (Ogre::uint32 i=0; i<numTexCoords; i++)
+for (Ogre::uint32 i = 0; i<numTexCoords; i++)
 {
-ss << "	out half2 oUV" << i << " : TEXCOORD" << texCoordNum++ << ',' << std::endl;
+ss << "  out half2 oUV" << i << " : TEXCOORD" << texCoordNum++ << ',' << std::endl;
 }
 if(this->useDSF){
-ss << "	out float3 oViewPos : TEXCOORD"<<texCoordNum++<<"," << std::endl;
+ss << "  out float3 oViewPos : TEXCOORD"<<texCoordNum++<<"," << std::endl;
 }
 ss << std::endl;
 
-ss << "	uniform float4x4 cWorldViewProj," << std::endl;
-ss << "	uniform float4x4 cWorldView" << std::endl;
+ss << "  uniform float4x4 cWorldViewProj," << std::endl;
+ss << "  uniform float4x4 cWorldView" << std::endl;
 
-ss << "	)" << std::endl;
+ss << "  )" << std::endl;
 
 
 ss << "{" << std::endl;
-ss << "	oPosition = mul(cWorldViewProj, iPosition);" << std::endl;
-ss << "	oNormal = mul(cWorldView, float4(iNormal,0)).xyz;" << std::endl;
+ss << "  oPosition = mul(cWorldViewProj, iPosition);" << std::endl;
+ss << "  oNormal = mul(cWorldView, float4(iNormal,0)).xyz;" << std::endl;
 
 if (permutation & MergeMaterialGenerator::MP_NORMAL_MAP)
 {
-ss << "	oTangent = mul(cWorldView, float4(iTangent,0)).xyz;" << std::endl;
-ss << "	oBiNormal = cross(oNormal, oTangent);" << std::endl;
+ss << "  oTangent = mul(cWorldView, float4(iTangent,0)).xyz;" << std::endl;
+ss << "  oBiNormal = cross(oNormal, oTangent);" << std::endl;
 }
 
-for (Ogre::uint32 i=0; i<numTexCoords; i++) {
-ss << "	oUV" << i << " = iUV" << i << ';' << std::endl;
+for (Ogre::uint32 i = 0; i < numTexCoords; i++) {
+ss << "  oUV" << i << " = iUV" << i << ';' << std::endl;
 }
 if(this->useDSF){
-ss << "	oViewPos = mul(cWorldView, iPosition).xyz;" << std::endl;
+ss << "  oViewPos = mul(cWorldView, iPosition).xyz;" << std::endl;
 }
 ss << "}" << std::endl;
 
@@ -498,97 +498,97 @@ Ogre::GpuProgramPtr MergeMaterialGeneratorImpl::GenerateFragmentShader(
     ss << "#define normal_epsilon 0.2" << std::endl;
   }
   ss << "void MergeFP(" << std::endl;
-  ss << "	half3 iNormal : TEXCOORD0," <<std::endl;
+  ss << "  half3 iNormal : TEXCOORD0," <<std::endl;
   //use the pixel position to index the LBuffer; this is more precise than
   //computing tex coords based on the view matrix(it's slightly more expensive
   //as well).
-  ss << "	float2 pixpos: WPOS";
+  ss << "  float2 pixpos: WPOS";
   if(this->useDSF){
-    ss<< ","<<std::endl<<"	uniform float cFarDistance";
-    ss<< ","<<std::endl<<"	uniform half cObjectId";
+    ss<< ","<<std::endl<<"  uniform float cFarDistance";
+    ss<< ","<<std::endl<<"  uniform half cObjectId";
   }
   int texCoordNum = 1;
   if (permutation & MergeMaterialGenerator::MP_NORMAL_MAP )
   {
-    ss << ',' << std::endl << "	half3 iTangent : TEXCOORD" << texCoordNum++ ;
-    ss << ',' << std::endl << "	half3 iBiNormal : TEXCOORD" << texCoordNum++ ;
+    ss << ',' << std::endl << "  half3 iTangent : TEXCOORD" << texCoordNum++ ;
+    ss << ',' << std::endl << "  half3 iBiNormal : TEXCOORD" << texCoordNum++ ;
   }
 
   Ogre::uint32 numTexCoords = (permutation & MergeMaterialGenerator::MP_TEXCOORD_MASK) >> 8;
-  for (Ogre::uint32 i=0; i<numTexCoords; i++)
+  for (Ogre::uint32 i = 0; i < numTexCoords; i++)
   {
-    ss << ',' << std::endl<< "	half2 iUV" << i << " : TEXCOORD" << texCoordNum++ ;
+    ss << ',' << std::endl<< "  half2 iUV" << i << " : TEXCOORD" << texCoordNum++ ;
   }
   if(this->useDSF)
-    ss << ',' << std::endl<< "	float3 iViewPos: TEXCOORD" << texCoordNum++ ;
+    ss << ',' << std::endl<< "  float3 iViewPos: TEXCOORD" << texCoordNum++ ;
 
-  ss << ',' << std::endl<< "	out half4 oColor0 : COLOR0" ;
+  ss << ',' << std::endl<< "  out half4 oColor0 : COLOR0" ;
 
   int samplerNum = 0;
 
   if (permutation & MergeMaterialGenerator::MP_NORMAL_MAP)
   {
-    ss << "," << std::endl << "	uniform sampler sNormalMap : register(s" << samplerNum++ << ")";
+    ss << "," << std::endl << "  uniform sampler sNormalMap : register(s" << samplerNum++ << ")";
   }
 
   Ogre::uint32 numTextures = permutation & MergeMaterialGenerator::MP_TEXTURE_MASK;
 
 
-  for (Ogre::uint32 i=0; i<numTextures; i++) {
-    ss << "," <<std::endl << "	uniform sampler sTex" << i << " : register(s" << samplerNum++ << ")";
+  for (Ogre::uint32 i = 0; i<numTextures; i++) {
+    ss << "," <<std::endl << "  uniform sampler sTex" << i << " : register(s" << samplerNum++ << ")";
   }
-  ss << "," <<std::endl<<"	uniform sampler LBuffer : register(s"<< samplerNum++ <<")";
+  ss << "," <<std::endl<<"  uniform sampler LBuffer : register(s"<< samplerNum++ <<")";
   if(this->useDSF){
-    ss << "," <<std::endl<<"	uniform sampler DSFBuffer : register(s"<< samplerNum++ <<")";
+    ss << "," <<std::endl<<"  uniform sampler DSFBuffer : register(s"<< samplerNum++ <<")";
   }
   if (numTextures == 0 || permutation & MergeMaterialGenerator::MP_HAS_DIFFUSE_COLOUR)
   {
-    ss<<","<< std::endl << "	uniform half4 cDiffuseColour" ;
+    ss<<","<< std::endl << "  uniform half4 cDiffuseColour" ;
   }
-  ss <<","<<std::endl<< "	uniform half cSpecularity" ;
-  ss <<","<<std::endl<< "	uniform half cHeight";
-  ss <<","<<std::endl<< "	uniform half cWidth";
-  ss <<","<<std::endl<< "	uniform half cFlip";
-  ss << "	)" << std::endl;
+  ss <<","<<std::endl<< "  uniform half cSpecularity" ;
+  ss <<","<<std::endl<< "  uniform half cHeight";
+  ss <<","<<std::endl<< "  uniform half cWidth";
+  ss <<","<<std::endl<< "  uniform half cFlip";
+  ss << "  )" << std::endl;
 
 
   ss << "{" << std::endl;
   ss << " pixpos = fixUV(pixpos,cFlip);"<<std::endl;
   if(this->useDSF)
-    ss <<"	float2 LBuffpos_frac = frac(pixpos*0.75);"<<std::endl;
+    ss <<"  float2 LBuffpos_frac = frac(pixpos*0.75);"<<std::endl;
   //ss <<"  pixpos+=float2(0.5/0.75,0.5/0.75);"<<std::endl;
-  ss <<"	pixpos.x/=cWidth;"<<std::endl;
-  ss <<"	pixpos.y/=cHeight;"<<std::endl;
+  ss <<"  pixpos.x/=cWidth;"<<std::endl;
+  ss <<"  pixpos.y/=cHeight;"<<std::endl;
   if(this->useDSF){
     //calculate sample positions in order to reconstruct bilinear filtering
     ss <<"  float depth = length(iViewPos) / cFarDistance;"<<std::endl;
     ss <<"  float2 sample0 = float2(1/cWidth,- 1/cHeight) /(2*0.75);"<<std::endl;
-    ss <<"	float2 sample1 = float2(-1/cWidth,- 1/cHeight) /(2*0.75);"<<std::endl;
-    ss <<"	float2 sample2 = float2(1/cWidth ,+ 1/cHeight )/(2*0.75);"<<std::endl;
-    ss <<"	float2 sample3 = float2(-1/cWidth,+ 1/cHeight) /(2*0.75);"<<std::endl;
+    ss <<"  float2 sample1 = float2(-1/cWidth,- 1/cHeight) /(2*0.75);"<<std::endl;
+    ss <<"  float2 sample2 = float2(1/cWidth ,+ 1/cHeight )/(2*0.75);"<<std::endl;
+    ss <<"  float2 sample3 = float2(-1/cWidth,+ 1/cHeight) /(2*0.75);"<<std::endl;
 
 
     //get the values of the Discontinuity Sensible Filter
-    ss <<"	float4 DSF0 = tex2D(DSFBuffer,pixpos + sample0);"<<std::endl;
-    ss <<"	float4 DSF1 = tex2D(DSFBuffer,pixpos + sample1);"<<std::endl;
-    ss <<"	float4 DSF2 = tex2D(DSFBuffer,pixpos + sample2);"<<std::endl;
-    ss <<"	float4 DSF3 = tex2D(DSFBuffer,pixpos + sample3);"<<std::endl;
+    ss <<"  float4 DSF0 = tex2D(DSFBuffer,pixpos + sample0);"<<std::endl;
+    ss <<"  float4 DSF1 = tex2D(DSFBuffer,pixpos + sample1);"<<std::endl;
+    ss <<"  float4 DSF2 = tex2D(DSFBuffer,pixpos + sample2);"<<std::endl;
+    ss <<"  float4 DSF3 = tex2D(DSFBuffer,pixpos + sample3);"<<std::endl;
     //normalize the input normal for proper comparison
-    ss <<"	iNormal=normalize(iNormal);"<<std::endl;
+    ss <<"  iNormal=normalize(iNormal);"<<std::endl;
 
     //get the usual bilinear interpolation weights
     ss <<"  float4 w = float4((1-LBuffpos_frac.x)*(1-LBuffpos_frac.y),LBuffpos_frac.x*(1-LBuffpos_frac.y),"<<std::endl
       <<"(1-LBuffpos_frac.x)*LBuffpos_frac.y,LBuffpos_frac.x*LBuffpos_frac.y);"<<std::endl;
 
     //see if each sample is on the same surface or not
-    ss <<"	float w0 = saturate(100*(depth_epsilon - abs(depth-DSF0.r))) *"<<std::endl
-      <<"		saturate((1-1000*abs(DSF0.g - cObjectId)))*saturate(1000*(normal_epsilon - abs(iNormal.x-DSF0.b)))*saturate(1000*(normal_epsilon - abs(iNormal.y-DSF0.a)));"<<std::endl;
-    ss <<"	float w1 = saturate(100*(depth_epsilon - abs(depth-DSF1.r))) *"<<std::endl
-      <<"		saturate((1-1000*abs(DSF1.g - cObjectId)))*saturate(1000*(normal_epsilon - abs(iNormal.x-DSF1.b)))*saturate(1000*(normal_epsilon - abs(iNormal.y-DSF1.a)));"<<std::endl;
-    ss <<"	float w2 = saturate(100*(depth_epsilon - abs(depth-DSF2.r))) *"<<std::endl
-      <<"		saturate((1-1000*abs(DSF2.g - cObjectId)))*saturate(1000*(normal_epsilon - abs(iNormal.x-DSF2.b)))*saturate(1000*(normal_epsilon - abs(iNormal.y-DSF2.a)));"<<std::endl;
-    ss <<"	float w3 = saturate(100*(depth_epsilon - abs(depth-DSF3.r))) *"<<std::endl
-      <<"		saturate((1-1000*abs(DSF3.g - cObjectId)))*saturate(1000*(normal_epsilon - abs(iNormal.x-DSF3.b)))*saturate(1000*(normal_epsilon - abs(iNormal.y-DSF3.a)));"<<std::endl;
+    ss <<"  float w0 = saturate(100*(depth_epsilon - abs(depth-DSF0.r))) *"<<std::endl
+      <<"    saturate((1-1000*abs(DSF0.g - cObjectId)))*saturate(1000*(normal_epsilon - abs(iNormal.x-DSF0.b)))*saturate(1000*(normal_epsilon - abs(iNormal.y-DSF0.a)));"<<std::endl;
+    ss <<"  float w1 = saturate(100*(depth_epsilon - abs(depth-DSF1.r))) *"<<std::endl
+      <<"    saturate((1-1000*abs(DSF1.g - cObjectId)))*saturate(1000*(normal_epsilon - abs(iNormal.x-DSF1.b)))*saturate(1000*(normal_epsilon - abs(iNormal.y-DSF1.a)));"<<std::endl;
+    ss <<"  float w2 = saturate(100*(depth_epsilon - abs(depth-DSF2.r))) *"<<std::endl
+      <<"    saturate((1-1000*abs(DSF2.g - cObjectId)))*saturate(1000*(normal_epsilon - abs(iNormal.x-DSF2.b)))*saturate(1000*(normal_epsilon - abs(iNormal.y-DSF2.a)));"<<std::endl;
+    ss <<"  float w3 = saturate(100*(depth_epsilon - abs(depth-DSF3.r))) *"<<std::endl
+      <<"    saturate((1-1000*abs(DSF3.g - cObjectId)))*saturate(1000*(normal_epsilon - abs(iNormal.x-DSF3.b)))*saturate(1000*(normal_epsilon - abs(iNormal.y-DSF3.a)));"<<std::endl;
     //TODO: find a better way to check if at least a sample is on the surface
     ss <<" if(w0+w1+w2+w3 > 0)"<<std::endl;
     //bias bilinear filtering
@@ -597,29 +597,29 @@ Ogre::GpuProgramPtr MergeMaterialGeneratorImpl::GenerateFragmentShader(
     ss <<"half4 lightVal = (w.x * tex2D(LBuffer,pixpos+sample0) + w.y * tex2D(LBuffer,pixpos + sample1) +w.z * tex2D(LBuffer,pixpos + sample2)+w.w * tex2D(LBuffer,pixpos + sample3))/(w.x+w.y+w.z+w.w);"<<std::endl;
   }
   else{
-    ss <<"	half4 lightVal = tex2D(LBuffer,pixpos);"<<std::endl;
+    ss <<"  half4 lightVal = tex2D(LBuffer,pixpos);"<<std::endl;
   }
 
-  ss << "	half3 diffuseCol;"<<std::endl;
+  ss << "  half3 diffuseCol;"<<std::endl;
   if (numTexCoords > 0 && numTextures > 0 )
   {
-    ss << "	diffuseCol = tex2D(sTex0, iUV0);" << std::endl;
+    ss << "  diffuseCol = tex2D(sTex0, iUV0);" << std::endl;
     if (permutation & MergeMaterialGenerator::MP_HAS_DIFFUSE_COLOUR)
     {
-      ss << "	diffuseCol *= cDiffuseColour.rgb;" << std::endl;
+      ss << "  diffuseCol *= cDiffuseColour.rgb;" << std::endl;
     }
   }
   else
   {
-    ss << "	diffuseCol = cDiffuseColour.rgb;" << std::endl;
+    ss << "  diffuseCol = cDiffuseColour.rgb;" << std::endl;
   }
   //use the luminance as an aproximation of the intensity of the NL*attenuation term
   ss <<"  half luminance = dot(lightVal.rgb, float3(0.2126, 0.7152, 0.0722));"<<std::endl;
   //reconstruct HV^n_light based on that, and get the specular term
   ss <<"  half3 specular = diffuseCol*max(0,pow(lightVal.a/luminance,1.0+cSpecularity));"<<std::endl;
   //get the final lighting value
-  ss <<"	half4 color = float4(lightVal.rgb*(diffuseCol + specular),1);"<<std::endl;
-  ss <<"	oColor0 = color;"<<std::endl;
+  ss <<"  half4 color = float4(lightVal.rgb*(diffuseCol + specular),1);"<<std::endl;
+  ss <<"  oColor0 = color;"<<std::endl;
   ss << "}" << std::endl;
 
   Ogre::String programSource = ss.str();
diff --git a/gazebo/rendering/deferred_shading/MergeMaterialGenerator.hh b/gazebo/rendering/deferred_shading/MergeMaterialGenerator.hh
index 4798d9d..a287176 100644
--- a/gazebo/rendering/deferred_shading/MergeMaterialGenerator.hh
+++ b/gazebo/rendering/deferred_shading/MergeMaterialGenerator.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _MERGEMATERIALGENERATOR_HH_
 
 #include "gazebo/rendering/deferred_shading/MaterialGenerator.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,7 @@ namespace gazebo
     /// there.  In order to support more, either expand this class or make sure
     /// that objects that will not get treated correctly will not have materials
     /// generated for them.
-    class MergeMaterialGenerator : public MaterialGenerator
+    class GAZEBO_VISIBLE MergeMaterialGenerator : public MaterialGenerator
     {
       /// The relevant options for materials
       public: enum MaterialPermutations
diff --git a/gazebo/rendering/deferred_shading/MergeSchemeHandler.cc b/gazebo/rendering/deferred_shading/MergeSchemeHandler.cc
index ba38917..b1481b8 100644
--- a/gazebo/rendering/deferred_shading/MergeSchemeHandler.cc
+++ b/gazebo/rendering/deferred_shading/MergeSchemeHandler.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/rendering/deferred_shading/MergeSchemeHandler.hh b/gazebo/rendering/deferred_shading/MergeSchemeHandler.hh
index 6127b76..c5e2341 100644
--- a/gazebo/rendering/deferred_shading/MergeSchemeHandler.hh
+++ b/gazebo/rendering/deferred_shading/MergeSchemeHandler.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include <vector>
 
 #include "gazebo/rendering/deferred_shading/MergeMaterialGenerator.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,8 @@ namespace gazebo
   {
     /// Class for handling materials who did not specify techniques for the
     /// merging step of deferred/inferred lighting.
-    class MergeSchemeHandler : public Ogre::MaterialManager::Listener
+    class GAZEBO_VISIBLE MergeSchemeHandler :
+      public Ogre::MaterialManager::Listener
     {
       public: MergeSchemeHandler(bool _useDSF) : useDSF(_useDSF)
       {
diff --git a/gazebo/rendering/deferred_shading/NullSchemeHandler.hh b/gazebo/rendering/deferred_shading/NullSchemeHandler.hh
index 0e77e15..3119ac7 100644
--- a/gazebo/rendering/deferred_shading/NullSchemeHandler.hh
+++ b/gazebo/rendering/deferred_shading/NullSchemeHandler.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,13 +18,15 @@
 #define _NULLSCHEMEHANDLER_HH_
 
 #include <OgreMaterialManager.h>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace rendering
   {
     /// \brief Class for skipping materials which do not have the scheme defined
-    class NullSchemeHandler : public Ogre::MaterialManager::Listener
+    class GAZEBO_VISIBLE NullSchemeHandler :
+      public Ogre::MaterialManager::Listener
     {
       /** @copydoc MaterialManager::Listener::handleSchemeNotFound */
       public: virtual Ogre::Technique *handleSchemeNotFound(
diff --git a/gazebo/rendering/deferred_shading/SSAOLogic.cc b/gazebo/rendering/deferred_shading/SSAOLogic.cc
index e91e6fa..e45c542 100644
--- a/gazebo/rendering/deferred_shading/SSAOLogic.cc
+++ b/gazebo/rendering/deferred_shading/SSAOLogic.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/rendering/deferred_shading/SSAOLogic.hh b/gazebo/rendering/deferred_shading/SSAOLogic.hh
index cca4ba1..088dd7e 100644
--- a/gazebo/rendering/deferred_shading/SSAOLogic.hh
+++ b/gazebo/rendering/deferred_shading/SSAOLogic.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,12 +22,13 @@
 #include <map>
 
 #include "gazebo/rendering/deferred_shading/ListenerFactoryLogic.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace rendering
   {
-    class SSAOLogic : public ListenerFactoryLogic
+    class GAZEBO_VISIBLE SSAOLogic : public ListenerFactoryLogic
     {
       /// @copydoc ListenerFactoryLogic::createListener
       protected: virtual Ogre::CompositorInstance::Listener *createListener(
diff --git a/gazebo/rendering/deferred_shading/TechniqueDefinitions.hh b/gazebo/rendering/deferred_shading/TechniqueDefinitions.hh
index 955fc9f..b2b08f6 100644
--- a/gazebo/rendering/deferred_shading/TechniqueDefinitions.hh
+++ b/gazebo/rendering/deferred_shading/TechniqueDefinitions.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,12 +18,13 @@
 #define _TECHNIQUEDEFINITIONS_HH_
 
 #include <string>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   namespace rendering
   {
-    class NullTechnique
+    class GAZEBO_VISIBLE NullTechnique
     {
       protected: std::string GetMaterialPrefix() const
                  {return "NullTechnique";}
@@ -32,7 +33,7 @@ namespace gazebo
       protected: bool UseMaterialProperties() const
                  {return true;}
     };
-    class DeferredShading
+    class GAZEBO_VISIBLE DeferredShading
     {
       protected: std::string GetMaterialPrefix() const
                  {return "DeferredShading";}
@@ -41,7 +42,7 @@ namespace gazebo
       protected: bool UseMaterialProperties() const
                  {return true;}
     };
-    class DeferredLighting
+    class GAZEBO_VISIBLE DeferredLighting
     {
       protected: std::string GetMaterialPrefix() const
                  {return "DeferredLighting";}
@@ -50,7 +51,7 @@ namespace gazebo
       protected: bool UseMaterialProperties() const
                  {return false;}
     };
-    class InferredLighting
+    class GAZEBO_VISIBLE InferredLighting
     {
       protected: std::string GetMaterialPrefix() const
                  {return "InferredLighting";}
diff --git a/gazebo/rendering/ogre_gazebo.h b/gazebo/rendering/ogre_gazebo.h
index 81d596d..cfac740 100644
--- a/gazebo/rendering/ogre_gazebo.h
+++ b/gazebo/rendering/ogre_gazebo.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,14 +19,18 @@
 
 // This disables warning messages for OGRE
 #pragma GCC system_header
-#include <Ogre.h>
-#include <OgreImageCodec.h>
+
+// This prevents some deprecation #warning messages on OSX 10.9
+#pragma clang diagnostic ignored "-W#warnings"
+
+#include <OGRE/Ogre.h>
+#include <OGRE/OgreImageCodec.h>
 #include <OGRE/OgreMovableObject.h>
 #include <OGRE/OgreRenderable.h>
-#include <OgrePlugin.h>
-#include <OgreDataStream.h>
-#include <OgreLogManager.h>
-#include <OgreWindowEventUtilities.h>
+#include <OGRE/OgrePlugin.h>
+#include <OGRE/OgreDataStream.h>
+#include <OGRE/OgreLogManager.h>
+#include <OGRE/OgreWindowEventUtilities.h>
 #include <OGRE/OgreSceneQuery.h>
 #include <OGRE/OgreRoot.h>
 #include <OGRE/OgreSceneManager.h>
@@ -37,7 +41,6 @@
 #include <OGRE/OgreColourValue.h>
 #include <OGRE/OgreQuaternion.h>
 #include <OGRE/OgreMesh.h>
-#include <OGRE/OgreFontManager.h>
 #include <OGRE/OgreHardwareBufferManager.h>
 #include <OGRE/OgreCamera.h>
 #include <OGRE/OgreNode.h>
@@ -45,10 +48,6 @@
 #include <OGRE/OgreFrameListener.h>
 #include <OGRE/OgreTexture.h>
 #include <OGRE/OgreRenderObjectListener.h>
-
-#include <OGRE/Terrain/OgreTerrainMaterialGeneratorA.h>
-#include <OGRE/Terrain/OgreTerrain.h>
-#include <OGRE/Terrain/OgreTerrainGroup.h>
 #include <OGRE/OgreTechnique.h>
 #include <OGRE/OgrePass.h>
 #include <OGRE/OgreTextureUnitState.h>
@@ -56,9 +55,25 @@
 #include <OGRE/OgreHighLevelGpuProgramManager.h>
 #include <OGRE/OgreHardwarePixelBuffer.h>
 #include <OGRE/OgreShadowCameraSetupPSSM.h>
+#include <OGRE/Paging/OgrePageManager.h>
+#include <OGRE/Paging/OgrePagedWorld.h>
+#include <OGRE/Terrain/OgreTerrainPaging.h>
+#include <OGRE/Terrain/OgreTerrainMaterialGeneratorA.h>
+#include <OGRE/Terrain/OgreTerrain.h>
+#include <OGRE/Terrain/OgreTerrainGroup.h>
 
-#if OGRE_VERSION_MAJOR == 1 && OGRE_VERSION_MINOR >= 7
-#include <RTShaderSystem/OgreRTShaderSystem.h>
+#if OGRE_VERSION_MAJOR > 1 || OGRE_VERSION_MINOR >= 7
+#include <OGRE/RTShaderSystem/OgreRTShaderSystem.h>
+#endif
+
+#if OGRE_VERSION_MAJOR > 1 || OGRE_VERSION_MINOR >= 9
+#include <OGRE/Overlay/OgreOverlayManager.h>
+#include <OGRE/Overlay/OgreOverlayElement.h>
+#include <OGRE/Overlay/OgreOverlayContainer.h>
+#include <OGRE/Overlay/OgreFontManager.h>
+#include <OGRE/Overlay/OgreOverlaySystem.h>
+#else
+#include <OGRE/OgreFontManager.h>
 #endif
 
 #endif
diff --git a/gazebo/rendering/selection_buffer/MaterialSwitcher.cc b/gazebo/rendering/selection_buffer/MaterialSwitcher.cc
index fa1bfc5..1704f06 100644
--- a/gazebo/rendering/selection_buffer/MaterialSwitcher.cc
+++ b/gazebo/rendering/selection_buffer/MaterialSwitcher.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -37,7 +37,7 @@ MaterialSwitcher::~MaterialSwitcher()
 /////////////////////////////////////////////////
 Ogre::Technique *MaterialSwitcher::handleSchemeNotFound(
     uint16_t /*_schemeIndex*/, const Ogre::String & /*_schemeName*/,
-    Ogre::Material * /*_originalMaterial*/, uint16_t /*_lodIndex*/,
+    Ogre::Material *_originalMaterial, uint16_t /*_lodIndex*/,
     const Ogre::Renderable *_rend)
 {
   if (_rend)
@@ -47,8 +47,8 @@ Ogre::Technique *MaterialSwitcher::handleSchemeNotFound(
       const Ogre::SubEntity *subEntity =
         static_cast<const Ogre::SubEntity *>(_rend);
 
-      if (subEntity->getParent()->getVisibilityFlags() &
-          GZ_VISIBILITY_NOT_SELECTABLE)
+      if (!(subEntity->getParent()->getVisibilityFlags() &
+          GZ_VISIBILITY_SELECTABLE))
       {
         const_cast<Ogre::SubEntity *>(subEntity)->setCustomParameter(1,
             Ogre::Vector4(0, 0, 0, 0));
@@ -67,8 +67,31 @@ Ogre::Technique *MaterialSwitcher::handleSchemeNotFound(
           Ogre::MaterialManager::getSingleton().load("gazebo/plain_color",
               Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
 
-        this->lastTechnique =
-          static_cast<Ogre::MaterialPtr>(res)->getTechnique(0);
+        // OGRE 1.9 changes the shared pointer definition
+        #if (OGRE_VERSION < ((1 << 16) | (9 << 8) | 0))
+        // Make sure we keep the same depth properties so that
+        // certain overlay objects can be picked by the mouse.
+        Ogre::Technique *newTechnique =
+            static_cast<Ogre::MaterialPtr>(res)->getTechnique(0);
+        #else
+        Ogre::Technique *newTechnique =
+            res.staticCast<Ogre::Material>()->getTechnique(0);
+        #endif
+
+        Ogre::Technique *originalTechnique = _originalMaterial->getTechnique(0);
+        if (originalTechnique)
+        {
+          Ogre::Pass *originalPass = originalTechnique->getPass(0);
+          Ogre::Pass *newPass = newTechnique->getPass(0);
+          if (originalPass && newPass)
+          {
+            newPass->setDepthCheckEnabled(originalPass->getDepthCheckEnabled());
+            newPass->setDepthWriteEnabled(originalPass->getDepthWriteEnabled());
+            newPass->setLightingEnabled(originalPass->getLightingEnabled());
+          }
+        }
+
+        this->lastTechnique = newTechnique;
 
         this->GetNextColor();
 
diff --git a/gazebo/rendering/selection_buffer/MaterialSwitcher.hh b/gazebo/rendering/selection_buffer/MaterialSwitcher.hh
index c45c0df..42ce207 100644
--- a/gazebo/rendering/selection_buffer/MaterialSwitcher.hh
+++ b/gazebo/rendering/selection_buffer/MaterialSwitcher.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include <string>
 #include "gazebo/rendering/ogre_gazebo.h"
 #include "gazebo/common/Color.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -36,7 +37,8 @@ namespace gazebo
     };*/
 
     class SelectionBuffer;
-    class MaterialSwitcher : public Ogre::MaterialManager::Listener
+    class GAZEBO_VISIBLE MaterialSwitcher :
+      public Ogre::MaterialManager::Listener
     {
       /// \brief Constructor
       public: MaterialSwitcher();
diff --git a/gazebo/rendering/selection_buffer/SelectionBuffer.cc b/gazebo/rendering/selection_buffer/SelectionBuffer.cc
index 6c8a69d..5018902 100644
--- a/gazebo/rendering/selection_buffer/SelectionBuffer.cc
+++ b/gazebo/rendering/selection_buffer/SelectionBuffer.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,6 +14,8 @@
  * limitations under the License.
  *
 */
+
+#include "gazebo/common/Console.hh"
 #include "gazebo/rendering/RenderTypes.hh"
 #include "gazebo/rendering/selection_buffer/SelectionRenderListener.hh"
 #include "gazebo/rendering/selection_buffer/MaterialSwitcher.hh"
@@ -25,7 +27,7 @@ using namespace rendering;
 /////////////////////////////////////////////////
 SelectionBuffer::SelectionBuffer(const std::string &_cameraName,
     Ogre::SceneManager *_mgr, Ogre::RenderTarget *_renderTarget)
-: sceneMgr(_mgr), renderTarget(_renderTarget), texture(0),
+: sceneMgr(_mgr), renderTarget(_renderTarget),
   buffer(0), pixelBox(0)
 {
   this->camera = this->sceneMgr->getCamera(_cameraName);
@@ -47,8 +49,12 @@ SelectionBuffer::~SelectionBuffer()
 /////////////////////////////////////////////////
 void SelectionBuffer::Update()
 {
+  if (!this->renderTexture)
+    return;
+
   this->UpdateBufferSize();
   this->materialSwitchListener->Reset();
+
   // FIXME: added try-catch block to prevent crash in deferred rendering mode.
   // RTT does not like VPL.material as it references a texture in the compositor
   // pipeline. A possible workaround is to add the deferred rendering
@@ -82,11 +88,20 @@ void SelectionBuffer::CreateRTTBuffer()
   unsigned int width = this->renderTarget->getWidth();
   unsigned int height = this->renderTarget->getHeight();
 
-  this->texture = Ogre::TextureManager::getSingleton().createManual(
+  try
+  {
+    this->texture = Ogre::TextureManager::getSingleton().createManual(
         "SelectionPassTex",
         Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
         Ogre::TEX_TYPE_2D, width, height, 0, Ogre::PF_R8G8B8,
         Ogre::TU_RENDERTARGET);
+  }
+  catch(...)
+  {
+    this->renderTexture = NULL;
+    gzerr << "Unable to create selection buffer.\n";
+    return;
+  }
 
   this->renderTexture = this->texture->getBuffer()->getRenderTarget();
   this->renderTexture->setAutoUpdated(false);
@@ -97,7 +112,7 @@ void SelectionBuffer::CreateRTTBuffer()
   this->renderTexture->addListener(this->selectionTargetListener);
   this->renderTexture->getViewport(0)->setMaterialScheme("aa");
   this->renderTexture->getViewport(0)->setVisibilityMask(
-      ~GZ_VISIBILITY_NOT_SELECTABLE);
+      GZ_VISIBILITY_SELECTABLE);
   Ogre::HardwarePixelBufferSharedPtr pixelBuffer = this->texture->getBuffer();
   size_t bufferSize = pixelBuffer->getSizeInBytes();
 
@@ -110,6 +125,9 @@ void SelectionBuffer::CreateRTTBuffer()
 /////////////////////////////////////////////////
 void SelectionBuffer::UpdateBufferSize()
 {
+  if (!this->renderTexture)
+    return;
+
   unsigned int width = this->renderTarget->getWidth();
   unsigned int height = this->renderTarget->getHeight();
 
@@ -124,6 +142,9 @@ void SelectionBuffer::UpdateBufferSize()
 /////////////////////////////////////////////////
 Ogre::Entity *SelectionBuffer::OnSelectionClick(int _x, int _y)
 {
+  if (!this->renderTexture)
+    return NULL;
+
   if (_x < 0 || _y < 0
       || _x >= static_cast<int>(this->renderTarget->getWidth())
       || _y >= static_cast<int>(this->renderTarget->getHeight()))
@@ -151,7 +172,7 @@ void SelectionBuffer::CreateRTTOverlays()
 {
   Ogre::OverlayManager *mgr = Ogre::OverlayManager::getSingletonPtr();
 
-  if (mgr->getByName("SelectionDebugOverlay"))
+  if (mgr && mgr->getByName("SelectionDebugOverlay"))
     return;
 
   Ogre::MaterialPtr baseWhite =
@@ -170,12 +191,21 @@ void SelectionBuffer::CreateRTTOverlays()
     static_cast<Ogre::OverlayContainer *>(
         mgr->createOverlayElement("Panel", "SelectionDebugPanel"));
 
-  panel->setMetricsMode(Ogre::GMM_PIXELS);
-  panel->setPosition(10, 10);
-  panel->setDimensions(400, 280);
-  panel->setMaterialName("SelectionDebugMaterial");
-  this->selectionDebugOverlay->add2D(panel);
-  this->selectionDebugOverlay->hide();
+  if (panel)
+  {
+    panel->setMetricsMode(Ogre::GMM_PIXELS);
+    panel->setPosition(10, 10);
+    panel->setDimensions(400, 280);
+    panel->setMaterialName("SelectionDebugMaterial");
+    this->selectionDebugOverlay->add2D(panel);
+    this->selectionDebugOverlay->hide();
+  }
+  else
+  {
+    gzlog << "Unable to create selection buffer overlay. "
+      "This will not effect Gazebo unless you're trying to debug "
+      "the selection buffer.\n";
+  }
 }
 
 /////////////////////////////////////////////////
diff --git a/gazebo/rendering/selection_buffer/SelectionBuffer.hh b/gazebo/rendering/selection_buffer/SelectionBuffer.hh
index 0474100..c6f2bcd 100644
--- a/gazebo/rendering/selection_buffer/SelectionBuffer.hh
+++ b/gazebo/rendering/selection_buffer/SelectionBuffer.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _SELECTIONBUFFER_HH_
 
 #include <string>
+#include "gazebo/util/system.hh"
 
 namespace Ogre
 {
@@ -37,7 +38,7 @@ namespace gazebo
     class SelectionRenderListener;
     class Scene;
 
-    class SelectionBuffer
+    class GAZEBO_VISIBLE SelectionBuffer
     {
       /// \brief Constructor
       /// \param[in] _camera Name of the camera to generate a selection
diff --git a/gazebo/rendering/selection_buffer/SelectionRenderListener.cc b/gazebo/rendering/selection_buffer/SelectionRenderListener.cc
index 122952f..0720724 100644
--- a/gazebo/rendering/selection_buffer/SelectionRenderListener.cc
+++ b/gazebo/rendering/selection_buffer/SelectionRenderListener.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/rendering/selection_buffer/SelectionRenderListener.hh b/gazebo/rendering/selection_buffer/SelectionRenderListener.hh
index 463b520..b36e7d6 100644
--- a/gazebo/rendering/selection_buffer/SelectionRenderListener.hh
+++ b/gazebo/rendering/selection_buffer/SelectionRenderListener.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _SELECTIONRENDERLISTENER_HH_
 
 #include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -28,7 +29,8 @@ namespace gazebo
     // the compositor MaterialManager.Listener should NOT be running all the
     // time - rather only when we're specifically rendering the target that
     // needs it
-    class SelectionRenderListener : public Ogre::RenderTargetListener
+    class GAZEBO_VISIBLE SelectionRenderListener :
+      public Ogre::RenderTargetListener
     {
       /// \brief Constructor
       public: SelectionRenderListener(MaterialSwitcher *_switcher);
diff --git a/gazebo/rendering/skyx/include/MoonManager.h b/gazebo/rendering/skyx/include/MoonManager.h
index 618b86c..a1d0a6b 100644
--- a/gazebo/rendering/skyx/include/MoonManager.h
+++ b/gazebo/rendering/skyx/include/MoonManager.h
@@ -132,6 +132,18 @@ namespace SkyX
       return mCreated;
     }
 
+    void setVisible(bool _visible)
+    {
+      this->mVisible = _visible;
+      this->mMoonSceneNode->setVisible(_visible);
+    }
+
+    void setEnabled(bool _enabled)
+    {
+      bool visible = _enabled ? mVisible : false;
+      this->mMoonSceneNode->setVisible(visible);
+    }
+
   private:
     /** Update moon bounds
         @param c Camera
@@ -158,6 +170,9 @@ namespace SkyX
 
     /// Moon material
     Ogre::MaterialPtr mMoonMaterial;
+
+    /// True if visible
+    bool mVisible;
   };
 }
 
diff --git a/gazebo/rendering/skyx/include/Prerequisites.h b/gazebo/rendering/skyx/include/Prerequisites.h
index 414c743..38285c3 100644
--- a/gazebo/rendering/skyx/include/Prerequisites.h
+++ b/gazebo/rendering/skyx/include/Prerequisites.h
@@ -23,6 +23,9 @@ http://www.gnu.org/copyleft/lesser.txt.
 
 #ifndef _SkyX_Prerequisites_H_
 #define _SkyX_Prerequisites_H_
+#ifdef __clang__
+#pragma clang diagnostic ignored "-W#warnings"
+#endif  // ifdef __clang__
 
 #ifdef _MSC_VER
   // conversion from 'xxx' to 'yyy', possible loss of data
diff --git a/gazebo/rendering/skyx/include/SkyX.h b/gazebo/rendering/skyx/include/SkyX.h
index 560c621..ac732c7 100644
--- a/gazebo/rendering/skyx/include/SkyX.h
+++ b/gazebo/rendering/skyx/include/SkyX.h
@@ -352,7 +352,48 @@ namespace SkyX
       return mTimeOffset;
     }
 
+    void setEnabled(bool _enabled)
+    {
+      this->mEnabled = _enabled;
+      this->setMoonEnabled(_enabled);
+      this->setCloudsEnabled(_enabled);
+    }
+
+    inline bool getEnabled()
+    {
+      return this->mEnabled;
+    }
+
+    void setMoonEnabled(bool _enabled)
+    {
+      this->mMoonEnabled = _enabled;
+      this->mMoonManager->setEnabled(_enabled);
+    }
+
+    inline bool getMoonEnabled()
+    {
+      return this->mMoonEnabled;
+    }
+
+    void setCloudsEnabled(bool _enabled)
+    {
+      this->mCloudsEnabled = _enabled;
+      this->mVCloudsManager->getVClouds()->setEnabled(_enabled);
+    }
+
+    inline bool getCloudsEnabled()
+    {
+      return this->mCloudsEnabled;
+    }
+
   private:
+
+    /// Enable starfield?
+    bool mStarfield;
+
+    /// Lighting mode
+    LightingMode mLightingMode;
+
     /// Scene manager
     Ogre::SceneManager *mSceneManager;
 
@@ -390,11 +431,6 @@ namespace SkyX
     /// Is SkyX visible?
     bool mVisible;
 
-    /// Lighting mode
-    LightingMode mLightingMode;
-    /// Enable starfield?
-    bool mStarfield;
-
     /// Time multiplier
     Ogre::Real mTimeMultiplier;
     /// Time offset
@@ -402,6 +438,15 @@ namespace SkyX
 
     /// Volumetric clouds manager
     VCloudsManager* mVCloudsManager;
+
+    /// True if moon is enabled
+    bool mMoonEnabled;
+
+    /// True if clouds are enabled
+    bool mCloudsEnabled;
+
+    /// True if skyx is enabled
+    bool mEnabled;
   };
 }
 
diff --git a/gazebo/rendering/skyx/include/VClouds/VClouds.h b/gazebo/rendering/skyx/include/VClouds/VClouds.h
index 1fef477..5a5cd0c 100644
--- a/gazebo/rendering/skyx/include/VClouds/VClouds.h
+++ b/gazebo/rendering/skyx/include/VClouds/VClouds.h
@@ -465,6 +465,11 @@ namespace SkyX { namespace VClouds {
      */
     void setVisible(const bool& visible);
 
+    /** Set enable
+        @param _enabled true to set VClouds to be enabled, false to hide it
+     */
+    void setEnabled(bool _enabled);
+
     /** Is VClouds visible?
         @return true if VClouds is visible, false otherwise
      */
diff --git a/gazebo/rendering/skyx/src/MeshManager.cpp b/gazebo/rendering/skyx/src/MeshManager.cpp
index ea61d72..87abe55 100644
--- a/gazebo/rendering/skyx/src/MeshManager.cpp
+++ b/gazebo/rendering/skyx/src/MeshManager.cpp
@@ -30,7 +30,6 @@ namespace SkyX
   MeshManager::MeshManager(SkyX *s)
     : mSkyX(s)
       , mCreated(false)
-      , mMesh(0)
       , mSubMesh(0)
       , mEntity(0)
       , mVertexBuffer(0)
diff --git a/gazebo/rendering/skyx/src/MoonManager.cpp b/gazebo/rendering/skyx/src/MoonManager.cpp
index 29decad..b73c2ea 100644
--- a/gazebo/rendering/skyx/src/MoonManager.cpp
+++ b/gazebo/rendering/skyx/src/MoonManager.cpp
@@ -36,6 +36,7 @@ namespace SkyX
       , mMoonHaloIntensity(0.4f)
       , mMoonHaloStrength(0.9f)
       , mMoonMaterial(Ogre::MaterialPtr())
+      , mVisible(true)
   {
   }
 
diff --git a/gazebo/rendering/skyx/src/SkyX.cpp b/gazebo/rendering/skyx/src/SkyX.cpp
index e879227..53c918d 100644
--- a/gazebo/rendering/skyx/src/SkyX.cpp
+++ b/gazebo/rendering/skyx/src/SkyX.cpp
@@ -32,6 +32,8 @@ namespace SkyX
   SkyX::SkyX(Ogre::SceneManager* sm, Controller* c)
     : Ogre::FrameListener()
       , Ogre::RenderTargetListener()
+      , mStarfield(true)
+      , mLightingMode(LM_LDR)
       , mSceneManager(sm)
       , mController(c)
       , mCamera(0)
@@ -48,10 +50,11 @@ namespace SkyX
       , mLastCameraFarClipDistance(-1)
       , mInfiniteCameraFarClipDistance(100000)
       , mVisible(true)
-      , mLightingMode(LM_LDR)
-      , mStarfield(true)
       , mTimeMultiplier(0.1f)
       , mTimeOffset(0.0f)
+      , mMoonEnabled(true)
+      , mCloudsEnabled(true)
+      , mEnabled(true)
   {
     // Need to be instanced here, when SkyX::mSceneManager is valid
     mVCloudsManager = new VCloudsManager(this);
@@ -113,6 +116,10 @@ namespace SkyX
     mLastCameraPosition = Ogre::Vector3(0, 0, 0);
     mLastCameraFarClipDistance = -1;
 
+    // FIXME: Disable mMoonManager otherwise gpu range values get clipped.
+    // issue #678
+    mMoonManager->getMoonSceneNode()->setVisible(false);
+
     mCreated = true;
   }
 
@@ -135,7 +142,7 @@ namespace SkyX
 
   void SkyX::update(const Ogre::Real& timeSinceLastFrame)
   {
-    if (!mCreated)
+    if (!mCreated || !this->mEnabled)
     {
       return;
     }
@@ -167,14 +174,18 @@ namespace SkyX
     mGPUManager->setGpuProgramParameter(
         GPUManager::GPUP_FRAGMENT, "uLightDir", sunDir);
 
-    mMoonManager->updateMoonPhase(mController->getMoonPhase());
-    mCloudsManager->update();
-    mVCloudsManager->update(timeSinceLastFrame);
+    if (this->mMoonEnabled)
+      mMoonManager->updateMoonPhase(mController->getMoonPhase());
+    if (this->mCloudsEnabled)
+    {
+      mCloudsManager->update();
+      mVCloudsManager->update(timeSinceLastFrame);
+    }
   }
 
   void SkyX::notifyCameraRender(Ogre::Camera* c)
   {
-    if (!mCreated)
+    if (!mCreated || !this->mEnabled || !c)
     {
       return;
     }
@@ -195,9 +206,12 @@ namespace SkyX
       mLastCameraFarClipDistance = mCamera->getFarClipDistance();
     }
 
-    mMoonManager->updateGeometry(c);
-
-    mVCloudsManager->notifyCameraRender(c);
+    if (this->mMoonEnabled)
+      mMoonManager->updateGeometry(c);
+    if (this->mCloudsEnabled)
+    {
+      mVCloudsManager->notifyCameraRender(c);
+    }
   }
 
   void SkyX::setVisible(const bool& visible)
@@ -210,7 +224,9 @@ namespace SkyX
     }
 
     mMeshManager->getSceneNode()->setVisible(mVisible);
-    mMoonManager->getMoonSceneNode()->setVisible(mVisible);
+
+    // Disable moon manager as it clips gpu laser range values
+    // mMoonManager->getMoonSceneNode()->setVisible(mVisible);
 
     if (mVCloudsManager->isCreated())
     {
diff --git a/gazebo/rendering/skyx/src/VClouds/DataManager.cpp b/gazebo/rendering/skyx/src/VClouds/DataManager.cpp
index 7d79e87..2372fb2 100644
--- a/gazebo/rendering/skyx/src/VClouds/DataManager.cpp
+++ b/gazebo/rendering/skyx/src/VClouds/DataManager.cpp
@@ -445,32 +445,40 @@ namespace SkyX { namespace VClouds
       const Ogre::Vector3& d, const float& att) const
   {
     Ogre::Real step = 1, factor = 1;
-    Ogre::Vector3 pos = Ogre::Vector3(x, y, z);
+    Ogre::Vector3 negD = -d;
+    int xLocal = x;
+    int yLocal = y;
+    int zLocal = z;
     bool outOfBounds = false;
     int u, v, uu, vv,
         current_iteration = 0, max_iterations = 8;
 
     while (!outOfBounds)
     {
-      if (static_cast<int>(pos.z) >= nz ||
-          static_cast<int>(pos.z) < 0 || factor <= 0 ||
+      if (zLocal >= nz || zLocal < 0 || factor <= 0 ||
           current_iteration >= max_iterations)
       {
         outOfBounds = true;
       }
       else
       {
-        u = static_cast<int>(pos.x);
-        v = static_cast<int>(pos.y);
+        u = xLocal;
+        v = yLocal;
 
         uu = (u < 0) ? (u + nx) : u;
-        if (u >= nx) { uu -= nx; }
+        if (u >= nx)
+          uu -= nx;
+
         vv = (v < 0) ? (v + ny) : v;
-        if (v >= ny) { vv -= ny; }
+        if (v >= ny)
+          vv -= ny;
 
-        factor -= c[uu][vv][static_cast<int>(pos.z)].dens*att*(1 -
+        factor -= c[uu][vv][zLocal].dens * att * (1 -
             static_cast<float>(current_iteration)/max_iterations);
-        pos += step*(-d);
+
+        xLocal += step * negD.x;
+        yLocal += step * negD.y;
+        zLocal += step * negD.z;
 
         current_iteration++;
       }
diff --git a/gazebo/rendering/skyx/src/VClouds/VClouds.cpp b/gazebo/rendering/skyx/src/VClouds/VClouds.cpp
index 8977877..e122bac 100644
--- a/gazebo/rendering/skyx/src/VClouds/VClouds.cpp
+++ b/gazebo/rendering/skyx/src/VClouds/VClouds.cpp
@@ -53,8 +53,6 @@ VClouds::VClouds(Ogre::SceneManager *sm)
     , mGeometryManager(new GeometryManager(this))
     , mLightningManager(new LightningManager(this))
     , mCamerasData(std::vector<CameraData>())
-    , mVolCloudsMaterial(Ogre::MeshPtr())
-    , mVolCloudsLightningMaterial(Ogre::MeshPtr())
 {
 }
 
@@ -252,6 +250,18 @@ void VClouds::setVisible(const bool& visible)
   mLightningManager->_setVisible(mVisible);
 }
 
+void VClouds::setEnabled(bool _enabled)
+{
+  if (!mCreated)
+  {
+    return;
+  }
+
+  bool visible = _enabled ? mVisible : false;
+  mGeometryManager->getSceneNode()->setVisible(visible);
+  mLightningManager->_setVisible(visible);
+}
+
 void VClouds::setRenderQueueGroups(const RenderQueueGroups& rqg)
 {
   mRenderQueueGroups = rqg;
diff --git a/gazebo/sdf/1.0/CMakeLists.txt b/gazebo/sdf/1.0/CMakeLists.txt
deleted file mode 100644
index 7e4ca92..0000000
--- a/gazebo/sdf/1.0/CMakeLists.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-set (sdfs
-  actor.sdf 
-  camera.sdf
-  collision.sdf 
-  contact.sdf
-  gazebo.sdf 
-  geometry.sdf 
-  gripper.sdf
-  gui.sdf
-  inertial.sdf 
-  joint.sdf 
-  light.sdf 
-  link.sdf 
-  model.sdf 
-  physics.sdf 
-  plugin.sdf 
-  projector.sdf
-  ray.sdf
-  rfidtag.sdf
-  rfid.sdf
-  road.sdf
-  scene.sdf 
-  sensor.sdf 
-  state.sdf
-  surface.sdf 
-  visual.sdf 
-  world.sdf
-)
-
-install(FILES ${sdfs} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/sdf/1.0)
diff --git a/gazebo/sdf/1.0/actor.sdf b/gazebo/sdf/1.0/actor.sdf
deleted file mode 100644
index 6f76da4..0000000
--- a/gazebo/sdf/1.0/actor.sdf
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- Actor -->
-<element name="actor" required="*">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <attribute name="static" type="bool" default="false" required="0"/>
-
-  <element name="origin" required="0">
-    <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-  </element> <!-- End Origin -->
-
-  <element name="skin" required="1">
-    <attribute name="filename" type="string" default="__default__" required="1"/>
-    <attribute name="scale" type="double" default="1.0" required="0"/> 
-  </element> <!-- End Skin -->
-
-  <element name="animation" required="+">
-    <attribute name="name" type="string" default="__default__" required="1"/>
-    <attribute name="filename" type="string" default="__default__" required="1"/>
-    <attribute name="scale" type="double" default="1.0" required="0"/>
-    <attribute name="interpolate_x" type="bool" default="false" required="0"/>
-  </element> <!-- End Animation -->
-
-  <element name="script" required="1">
-    <attribute name="loop" type="bool" default="true" required="0"/>
-    <attribute name="delay_start" type="double" default="0.0" required="0"/>
-    <attribute name="auto_start" type="bool" default="true" required="0"/>
-    <element name="trajectory" required="*">
-      <attribute name="id" type="int" default="0" required="1"/>
-      <attribute name="type" type="string" default="__default__" required="1"/>
-      <element name="waypoint" required="*">
-        <attribute name="time" type="double" default="0.0" required="1"/>
-        <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-      </element> <!-- End Waypoint -->
-    </element> <!-- End Action -->
-  </element> <!-- End Script -->
-  
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-
-</element> <!-- End Actor -->
diff --git a/gazebo/sdf/1.0/camera.sdf b/gazebo/sdf/1.0/camera.sdf
deleted file mode 100644
index d369d97..0000000
--- a/gazebo/sdf/1.0/camera.sdf
+++ /dev/null
@@ -1,21 +0,0 @@
-<element name="camera" required="0">
-  <element name="horizontal_fov" required="1">
-   <attribute name="angle" type="double" default="1.047" required="1"/>
-  </element> <!-- End Horizontal_FOV -->
-  <element name="image" required="1">
-    <attribute name="width" type="int" default="320" required="1"/>
-    <attribute name="height" type="int" default="240" required="1"/>
-    <attribute name="format" type="string" default="R8G8B8" required="0"/>
-  </element> <!-- End Image -->
-  <element name="clip" required="1">
-    <attribute name="near" type="double" default=".1" required="1"/>
-    <attribute name="far" type="double" default="100" required="1"/>
-  </element> <!-- End Clip -->
-  <element name="save" required="0">
-    <attribute name="enabled" type="bool" default="false" required="1"/>
-    <attribute name="path" type="string" default="__default__" required="1"/>
-  </element> <!-- End Save -->
-  <element name="depth_camera" required="0">
-    <attribute name="output" type="string" default="depths" required="1"/>
-  </element> <!-- End Save -->
-</element> <!-- End Camera -->
diff --git a/gazebo/sdf/1.0/collision.sdf b/gazebo/sdf/1.0/collision.sdf
deleted file mode 100644
index 37bc58b..0000000
--- a/gazebo/sdf/1.0/collision.sdf
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- Collision -->
-<element name="collision" required="*">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <attribute name="laser_retro" type="double" default="0" required="0"/>
-
-  <element name="max_contacts" type="int" default="10" required="0"/>
-  <element name="mass" type="double" default="0" required="0"/>
-
-  <element name="origin" required="0">
-    <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-  </element> <!-- End Origin -->
-
-  <include filename="geometry.sdf" required="1"/>
-  <include filename="surface.sdf" required="0"/>
-
-</element> <!-- End Collision -->
diff --git a/gazebo/sdf/1.0/contact.sdf b/gazebo/sdf/1.0/contact.sdf
deleted file mode 100644
index 5446e31..0000000
--- a/gazebo/sdf/1.0/contact.sdf
+++ /dev/null
@@ -1,6 +0,0 @@
-<element name="contact" required="0">
-  <element name="collision" required="1">
-    <attribute name="name" type="string" default="__default__" required="1"/>
-  </element> <!-- End Collision -->
-  <element name="topic" type="string" default="__default_topic__" required="1"/>
-</element> <!-- End Contact -->
diff --git a/gazebo/sdf/1.0/gazebo.sdf b/gazebo/sdf/1.0/gazebo.sdf
deleted file mode 100644
index bec9cc5..0000000
--- a/gazebo/sdf/1.0/gazebo.sdf
+++ /dev/null
@@ -1,9 +0,0 @@
-<element name="gazebo" required="1">
-  <attribute name="version" type="string" default="1.0" required="1"/>
-
-  <include filename="world.sdf" required="*"/>
-  <include filename="model.sdf" required="*"/>
-  <include filename="actor.sdf" required="*"/>
-  <include filename="light.sdf" required="*"/>
-
-</element> <!-- End Gazebo -->
diff --git a/gazebo/sdf/1.0/geometry.sdf b/gazebo/sdf/1.0/geometry.sdf
deleted file mode 100644
index f4d376f..0000000
--- a/gazebo/sdf/1.0/geometry.sdf
+++ /dev/null
@@ -1,43 +0,0 @@
-<!-- Geometry -->
-<element name="geometry" required="1">
-  <element name="box" required="0">
-    <attribute name="size" type="vector3" default="1 1 1" required="1"/>
-  </element> <!-- End Box -->
-  <element name="sphere" required="0">
-    <attribute name="radius" type="double" default="1" required="1"/>
-  </element> <!-- End Sphere -->
-  <element name="cylinder" required="0">
-    <attribute name="radius" type="double" default="1" required="1"/>
-    <attribute name="length" type="double" default="1" required="1"/>
-  </element> <!-- End Cylinder -->
-  <element name="mesh" required="0">
-    <attribute name="filename" type="string" default="__default__" required="1"/>
-    <attribute name="scale" type="vector3" default="1 1 1" required="0"/>
-  </element> <!-- End Mesh -->
-  <element name="plane" required="0">
-    <attribute name="normal" type="vector3" default="0 0 1" required="1"/>
-  </element> <!-- End Plane -->
-  <element name="image" required="0">
-    <attribute name="filename" type="string" default="__default__" required="1"/>
-    <attribute name="scale" type="double" default="1" required="1"/>
-    <attribute name="threshold" type="int" default="200" required="1"/>
-    <attribute name="height" type="double" default="1" required="1"/>
-    <attribute name="granularity" type="int" default="1" required="1"/>
-  </element> <!-- End Image -->
-
-  <element name="heightmap" required="0">
-    <attribute name="filename" type="string" default="__default__" required="1"/>
-    <attribute name="size" type="vector3" default="1 1 1" required="1"/>
-    <attribute name="origin" type="vector3" default="0 0 0" required="0"/>
-
-    <element name="texture" required="*">
-      <element name="size" type="double" default="10" required="1"/>
-      <element name="diffuse" type="string" default="__default__" required="1"/>
-      <element name="normal" type="string" default="__default__" required="1"/>
-    </element>
-    <element name="blend" required="*">
-      <element name="min_height" type="double" default="0" required="1"/>
-      <element name="fade_dist" type="double" default="0" required="1"/>
-    </element>
-  </element> <!-- End Heightmap -->
-</element><!-- End Geometry -->
diff --git a/gazebo/sdf/1.0/gripper.sdf b/gazebo/sdf/1.0/gripper.sdf
deleted file mode 100644
index e000759..0000000
--- a/gazebo/sdf/1.0/gripper.sdf
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Gripper -->
-<element name="gripper" required="*">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <element name="grasp_check" required="0">
-    <attribute name="detach_steps" type="int" default="40" required="0"/>
-    <attribute name="attach_steps" type="int" default="20" required="0"/>
-    <attribute name="min_contact_count" type="unsigned int" default="2" required="0"/>
-  </element>
-  <element name="gripper_link" type="string" default="__default__" required="+"/>
-  <element name="palm_link" type="string" default="__default__" required="1"/>
-</element>
diff --git a/gazebo/sdf/1.0/gui.sdf b/gazebo/sdf/1.0/gui.sdf
deleted file mode 100644
index c99d556..0000000
--- a/gazebo/sdf/1.0/gui.sdf
+++ /dev/null
@@ -1,21 +0,0 @@
-<!-- gui -->
-<element name="gui" required="0">
-  <attribute name="fullscreen" type="bool" default="false" required="0"/>
-
-  <element name="camera" required="0">
-    <attribute name="name" type="string" default="user_camera" required="1"/>
-
-    <element name="view_controller" type="string" default="oribit" required="0"/>
-
-    <element name="origin" required="0">
-      <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-    </element>
-
-    <element name="track_visual" required="0">
-      <element name="name" type="string" default="__default__" required="1"/>
-      <element name="min_dist" type="double" default="0" required="0"/>
-      <element name="max_dist" type="double" default="0" required="0"/>
-    </element>
-
-  </element>
-</element>
diff --git a/gazebo/sdf/1.0/inertial.sdf b/gazebo/sdf/1.0/inertial.sdf
deleted file mode 100644
index ff424c9..0000000
--- a/gazebo/sdf/1.0/inertial.sdf
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- Inertial -->
-<element name="inertial" required="0">
-  <attribute name="mass" type="double" default="1.0" required="0"/>
-  <attribute name="density" type="double" default="1.0" required="0"/>
-
-  <element name="origin" required="0">
-    <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-  </element> <!-- End Origin -->
-  <element name="inertia" required="0">
-    <attribute name="ixx" type="double" default="0.0" required="1"/>
-    <attribute name="ixy" type="double" default="0.0" required="1"/>
-    <attribute name="ixz" type="double" default="0.0" required="1"/>
-    <attribute name="iyy" type="double" default="0.0" required="1"/>
-    <attribute name="iyz" type="double" default="0.0" required="1"/>
-    <attribute name="izz" type="double" default="0.0" required="1"/>
-  </element> <!-- End Inertia -->
-</element> <!-- End Inertial -->
diff --git a/gazebo/sdf/1.0/joint.sdf b/gazebo/sdf/1.0/joint.sdf
deleted file mode 100644
index 5dcc7d5..0000000
--- a/gazebo/sdf/1.0/joint.sdf
+++ /dev/null
@@ -1,63 +0,0 @@
-<!-- Joint -->
-<element name="joint" required="*">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <attribute name="type" type="string" default="__default__" required="1"/>
-  <element name="parent" required="1">
-    <attribute name="link" type="string" default="__default__" required="1"/>
-  </element> <!-- End Parent -->
-  <element name="child" required="1">
-    <attribute name="link" type="string" default="__default__" required="1"/>
-  </element> <!-- End Child -->
-  <element name="origin" required="0">
-    <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-  </element> <!-- End Origin -->
-
-  <element name="thread_pitch" type="double" default="1.0" required="0"/>
-
-  <element name="axis" required="1">
-    <attribute name="xyz" type="vector3" default="0 0 1" required="1"/>
-    <element name="dynamics" required="0">
-      <attribute name="damping" type="double" default="0" required="0"/>
-      <attribute name="friction" type="double" default="0" required="0"/>
-    </element> <!-- End Dynamics -->
-    <element name="limit" required="1">
-      <attribute name="lower" type="double" default="-1e16" required="1"/>
-      <attribute name="upper" type="double" default="1e16" required="1"/>
-      <attribute name="effort" type="double" default="0" required="0"/>
-      <attribute name="velocity" type="double" default="0" required="0"/>
-    </element> <!-- End Limit -->
-  </element> <!-- End Axis -->
-
-  <element name="axis2" required="0">
-    <attribute name="xyz" type="vector3" default="0 0 1" required="1"/>
-    <element name="dynamics" required="0">
-      <attribute name="damping" type="double" default="0" required="0"/>
-      <attribute name="friction" type="double" default="0" required="0"/>
-    </element> <!-- End Dynamics -->
-    <element name="limit" required="0">
-      <attribute name="lower" type="double" default="-1e16" required="0"/>
-      <attribute name="upper" type="double" default="1e16" required="0"/>
-      <attribute name="effort" type="double" default="0" required="0"/>
-      <attribute name="velocity" type="double" default="0" required="0"/>
-    </element> <!-- End Limit -->
-  </element> <!-- End Axis2 -->
-
-  <element name="physics" required="0">
-    <element name="ode" required="0">
-      <element name="fudge_factor" type="double" default="0" required="0"/>
-      <element name="cfm" type="double" default="0" required="0"/>
-      <element name="bounce" type="double" default="0" required="0"/>
-      <element name="max_force" type="double" default="0" required="0"/>
-      <element name="velocity" type="double" default="0" required="0"/>
-
-      <element name="limit" required="0">
-        <attribute name="cfm" type="double" default="0.0" required="1"/>
-        <attribute name="erp" type="double" default="0.2" required="1"/>
-      </element>
-      <element name="suspension" required="0">
-        <attribute name="cfm" type="double" default="0.0" required="1"/>
-        <attribute name="erp" type="double" default="0.2" required="1"/>
-      </element>
-    </element>
-  </element> <!-- End Physics -->
-</element> <!-- End Joint -->
diff --git a/gazebo/sdf/1.0/light.sdf b/gazebo/sdf/1.0/light.sdf
deleted file mode 100644
index 7e48c52..0000000
--- a/gazebo/sdf/1.0/light.sdf
+++ /dev/null
@@ -1,37 +0,0 @@
-<!-- Light -->
-<element name="light" required="*">
-  <attribute name="name" type="string" default="__default__" required="0"/>
-  <attribute name="type" type="string" default="point" required="1"/>
-  <attribute name="cast_shadows" type="bool" default="false" required="0"/>
-  <element name="origin" required="0">
-    <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-  </element> <!-- End Origin -->
-
-  <element name="diffuse" required="1">
-    <attribute name="rgba" type="color" default="1 1 1 1" required="1"/>
-  </element> <!-- End Diffuse -->
-
-  <element name="specular" required="1">
-    <attribute name="rgba" type="color" default=".1 .1 .1 1" required="1"/>
-  </element> <!-- End Specular -->
-
-  <element name="attenuation" required="0">
-    <attribute name="range" type="double" default="10" required="1"/>
-    <attribute name="linear" type="double" default="1" required="0"/>
-    <attribute name="constant" type="double" default="1" required="0"/>
-    <attribute name="quadratic" type="double" default="0" required="0"/>
-  </element> <!-- End Attenuation -->
-
-  <element name="direction" required="1">
-    <attribute name="xyz" type="vector3" default="0 0 -1" required="1"/>
-  </element><!-- End Directional -->
-
-  <element name="spot" required="0">
-    <attribute name="inner_angle" type="double" default="0" required="1"/>
-    <attribute name="outer_angle" type="double" default="0" required="1"/>
-    <attribute name="falloff" type="double" default="0" required="1"/>
-  </element> <!-- End Spot -->
-
-</element> <!-- End Light -->
-
-
diff --git a/gazebo/sdf/1.0/link.sdf b/gazebo/sdf/1.0/link.sdf
deleted file mode 100644
index c07ffe9..0000000
--- a/gazebo/sdf/1.0/link.sdf
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Link -->
-<element name="link" required="+">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <attribute name="gravity" type="bool" default="true" required="0"/>
-  <attribute name="self_collide" type="bool" default="false" required="0"/>
-  <attribute name="kinematic" type="bool" default="false" required="0"/>
-
-  <element name="origin" required="0">
-    <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-  </element> <!-- End Origin -->
-
-  <element name="damping" required="1">
-    <element name="linear" type="double" default="0.0" required="1"/>
-    <element name="angular" type="double" default="0.0" required="1"/>
-  </element> <!-- End damping -->
-
-  <include filename="inertial.sdf" required="0"/>
-  <include filename="collision.sdf" required="*"/>
-  <include filename="visual.sdf" required="*"/>
-  <include filename="sensor.sdf" required="*"/>
-  <include filename="projector.sdf" required="*"/>
-
-</element> <!-- End Link -->
diff --git a/gazebo/sdf/1.0/model.sdf b/gazebo/sdf/1.0/model.sdf
deleted file mode 100644
index f6ef09b..0000000
--- a/gazebo/sdf/1.0/model.sdf
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Model -->
-<element name="model" required="*">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <attribute name="static" type="bool" default="false" required="0"/>
-
-  <element name="origin" required="0">
-    <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-  </element> <!-- End Origin -->
-
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="gripper.sdf" required="*"/>
-
-</element> <!-- End Model -->
diff --git a/gazebo/sdf/1.0/physics.sdf b/gazebo/sdf/1.0/physics.sdf
deleted file mode 100644
index 4dba912..0000000
--- a/gazebo/sdf/1.0/physics.sdf
+++ /dev/null
@@ -1,33 +0,0 @@
-<!-- Physics -->
-<element name="physics" required="1">
-  <attribute name="type" type="string" default="ode" required="1"/>
-  <attribute name="update_rate" type="double" default="0" required="0"/>
-
-  <element name="max_contacts" type="int" default="20" required="0"/>
-
-  <element name="gravity" required="1">
-      <attribute name="xyz" type="vector3" default="0 0 -9.8" required="1"/>
-  </element> <!-- End Gravity -->
-
-  <element name="bullet" required="0">
-    <element name="dt" type="double" default="0.003" required="1"/>
-  </element>
-
-  <element name="ode" required="0">
-    <element name="solver" required="1">
-      <attribute name="type" type="string" default="quick" required="1"/>
-      <attribute name="dt" type="double" default="0.001" required="1"/>
-      <attribute name="iters" type="int" default="50" required="1"/>
-      <attribute name="precon_iters" type="int" default="0" required="0"/>
-      <attribute name="sor" type="double" default="1.3" required="1"/>
-    </element> <!-- End Solver -->
-
-    <element name="constraints" required="1">
-      <attribute name="cfm" type="double" default="0" required="1"/>
-      <attribute name="erp" type="double" default="0.2" required="1"/>
-      <attribute name="contact_max_correcting_vel" type="double" default="100.0" required="1"/>
-      <attribute name="contact_surface_layer" type="double" default="0.001" required="1"/>
-    </element> <!-- End Constraints -->
-  </element> <!-- ODE -->
-
-</element> <!-- Physics -->
diff --git a/gazebo/sdf/1.0/plugin.sdf b/gazebo/sdf/1.0/plugin.sdf
deleted file mode 100644
index f2c835d..0000000
--- a/gazebo/sdf/1.0/plugin.sdf
+++ /dev/null
@@ -1,6 +0,0 @@
-<!-- Plugin -->
-<element name="plugin" required="*">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <attribute name="filename" type="string" default="__default__" required="1"/>
-  <element copy_data="true" required="*"/>
-</element> <!-- End Plugin -->
diff --git a/gazebo/sdf/1.0/projector.sdf b/gazebo/sdf/1.0/projector.sdf
deleted file mode 100644
index e951f5a..0000000
--- a/gazebo/sdf/1.0/projector.sdf
+++ /dev/null
@@ -1,10 +0,0 @@
-<!-- Projector -->
-<element name="projector" required="0">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <element name="texture" type="string" default="__default__" required="1"/>
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0"/>
-  <element name="fov" type="double" default="0.785" required="0"/>
-  <element name="near_clip" type="double" default="0.1" required="0"/>
-  <element name="far_clip" type="double" default="10.0" required="0"/>
-  <include filename="plugin.sdf" required="*"/>
-</element>
diff --git a/gazebo/sdf/1.0/ray.sdf b/gazebo/sdf/1.0/ray.sdf
deleted file mode 100644
index 10475e2..0000000
--- a/gazebo/sdf/1.0/ray.sdf
+++ /dev/null
@@ -1,21 +0,0 @@
-<element name="ray" required="0">
-  <element name="scan" required="1">
-    <element name="horizontal" required="1">
-      <attribute name="samples" type="unsigned int" default="1" required="1"/>
-      <attribute name="resolution" type="double" default="1" required="0"/>
-      <attribute name="min_angle" type="double" default="0" required="1"/>
-      <attribute name="max_angle" type="double" default="0" required="1"/>
-    </element> <!-- End Horizontal -->
-    <element name="vertical" required="0">
-      <attribute name="samples" type="unsigned int" default="1" required="1"/>
-      <attribute name="resolution" type="double" default="1" required="0"/>
-      <attribute name="min_angle" type="double" default="0" required="1"/>
-      <attribute name="max_angle" type="double" default="0" required="1"/>
-    </element> <!-- End Vertical -->
-  </element> <!-- End Scan -->
-  <element name="range" required="1">
-    <attribute name="min" type="double" default="0" required="1"/>
-    <attribute name="max" type="double" default="0" required="1"/>
-    <attribute name="resolution" type="double" default="0" required="0"/>
-  </element> <!-- End Range -->
-</element> <!-- End Ray -->
diff --git a/gazebo/sdf/1.0/rfid.sdf b/gazebo/sdf/1.0/rfid.sdf
deleted file mode 100644
index 61351dd..0000000
--- a/gazebo/sdf/1.0/rfid.sdf
+++ /dev/null
@@ -1,2 +0,0 @@
-<element name="rfidtag" required="0">
-</element> <!-- End rfidtag -->
diff --git a/gazebo/sdf/1.0/rfidtag.sdf b/gazebo/sdf/1.0/rfidtag.sdf
deleted file mode 100644
index 55699dc..0000000
--- a/gazebo/sdf/1.0/rfidtag.sdf
+++ /dev/null
@@ -1,2 +0,0 @@
-<element name="rfid" required="0">
-</element> <!-- End RFID -->
diff --git a/gazebo/sdf/1.0/road.sdf b/gazebo/sdf/1.0/road.sdf
deleted file mode 100644
index 877c43c..0000000
--- a/gazebo/sdf/1.0/road.sdf
+++ /dev/null
@@ -1,6 +0,0 @@
-<!-- Model -->
-<element name="road" required="*">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <element name="width" type="double" default="1.0" required="1"/>
-  <element name="point" type="vector3" default="0 0 0" required="+"/>
-</element>
diff --git a/gazebo/sdf/1.0/scene.sdf b/gazebo/sdf/1.0/scene.sdf
deleted file mode 100644
index 1e921a2..0000000
--- a/gazebo/sdf/1.0/scene.sdf
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Scene -->
-<element name="scene" required="1">
-  <element name="ambient" required="0">
-    <attribute name="rgba" type="color" default="0.0 0.0 0.0 1.0" required="1"/>
-  </element>
-  <element name="background" required="0">
-    <attribute name="rgba" type="color" default=".7 .7 .7 1" required="1"/>
-    <element name="sky" required="0">
-      <attribute name="material" type="string" default="Gazebo/CloudySky" required="1"/>
-    </element>
-  </element>
-
-  <element name="shadows" required="0">
-    <attribute name="enabled" type="bool" default="true" required="1"/>
-  </element>
-
-  <element name="fog" required="0">
-    <attribute name="rgba" type="color" default="1 1 1 1" required="0"/>
-    <attribute name="type" type="string" default="linear" required="0"/>
-    <attribute name="start" type="double" default="1.0" required="0"/>
-    <attribute name="end" type="double" default="100.0" required="0"/>
-    <attribute name="density" type="double" default="1.0" required="0"/>
-  </element>
-  <element name="grid" required="0">
-    <attribute name="enabled" type="bool" default="true" required="1"/>
-  </element>
-</element> <!-- End Scene -->
-
-
diff --git a/gazebo/sdf/1.0/sensor.sdf b/gazebo/sdf/1.0/sensor.sdf
deleted file mode 100644
index f30fa55..0000000
--- a/gazebo/sdf/1.0/sensor.sdf
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Sensor -->
-<element name="sensor" required="0">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-  <attribute name="type" type="string" default="__default__" required="1"/>
-  <attribute name="always_on" type="bool" default="false" required="0"/>
-  <attribute name="update_rate" type="double" default="0" required="0"/>
-  <attribute name="visualize" type="bool" default="false" required="0"/>
-
-  <element name="origin" required="0">
-    <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-  </element> <!-- End Origin -->
-
-  <element name="topic" type="string" default="__default" required="0"/>
-
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="camera.sdf" required="0"/>
-  <include filename="ray.sdf" required="0"/>
-  <include filename="contact.sdf" required="0"/>
-  <include filename="rfid.sdf" required="0"/>
-  <include filename="rfidtag.sdf" required="0"/>
-
-</element> <!-- End Sensor -->
diff --git a/gazebo/sdf/1.0/state.sdf b/gazebo/sdf/1.0/state.sdf
deleted file mode 100644
index b2145a4..0000000
--- a/gazebo/sdf/1.0/state.sdf
+++ /dev/null
@@ -1,28 +0,0 @@
-<!-- State Info -->
-<element name="state" required="*">
-  <!-- Name of the world this state applies to -->
-  <attribute name="world_name" type="string" default="__default__" required="1"/>
-
-  <!-- Time stamp of the state [seconds nanoseconds] -->
-  <attribute name="time" type="time" default="0 0" required="0"/>
-
-  <!-- State information for a model -->
-  <element name="model" required="+">
-    <attribute name="name" type="string" default="__default__" required="1"/>
-    <element name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-
-    <!-- State information for a link -->
-    <element name="link" required="*">
-      <attribute name="name" type="string" default="__default__" required="1"/>
-      <element name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-      <element name="velocity" type="pose" default="0 0 0 0 0 0" required="0"/>
-
-      <!-- Zero or more wrenches -->
-      <element name="wrench" required="*">
-        <element name="pos" type="vector3" default="0 0 0" required="0"/>
-        <element name="mag" type="pose" default="0 0 0 0 0 0" required="1"/>
-      </element>
-
-    </element> <!-- End Link -->
-  </element> <!-- End Model -->
-</element> <!-- End State -->
diff --git a/gazebo/sdf/1.0/surface.sdf b/gazebo/sdf/1.0/surface.sdf
deleted file mode 100644
index 256443c..0000000
--- a/gazebo/sdf/1.0/surface.sdf
+++ /dev/null
@@ -1,27 +0,0 @@
-<element name="surface" required="0">
-  <element name="bounce" required="0">
-    <attribute name="restitution_coefficient" type="double" default="0" required="0"/>
-    <attribute name="threshold" type="double" default="100000" required="0"/>
-  </element> <!-- End Bounce -->
-
-  <element name="friction" required="0">
-    <element name="ode" required="0">
-      <attribute name="mu" type="double" default="-1" required="0"/>
-      <attribute name="mu2" type="double" default="-1" required="0"/>
-      <attribute name="fdir1" type="vector3" default="0 0 0" required="0"/>
-      <attribute name="slip1" type="double" default="0.0" required="0"/>
-      <attribute name="slip2" type="double" default="0.0" required="0"/>
-    </element> <!-- End ODE -->
-  </element> <!-- End Friction -->
-
-  <element name="contact" required="0">
-    <element name="ode" required="0">
-      <attribute name="soft_cfm" type="double" default="0" required="0"/>
-      <attribute name="soft_erp" type="double" default="0.2" required="0"/>
-      <attribute name="kp" type="double" default="1000000000000.0" required="0"/>
-      <attribute name="kd" type="double" default="1.0" required="0"/>
-      <attribute name="max_vel" type="double" default="0.01" required="0"/>
-      <attribute name="min_depth" type="double" default="0" required="0"/>
-    </element> <!-- End ODE -->
-  </element> <!-- End Contact -->
-</element> <!-- End Surface -->
diff --git a/gazebo/sdf/1.0/visual.sdf b/gazebo/sdf/1.0/visual.sdf
deleted file mode 100644
index 502c9f6..0000000
--- a/gazebo/sdf/1.0/visual.sdf
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- Visual -->
-<element name="visual" required="*">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-
-  <attribute name="cast_shadows" type="bool" default="true" required="0"/>
-  <attribute name="laser_retro" type="double" default="0.0" required="0"/>
-  <attribute name="transparency" type="double" default="0.0" required="0"/>
-  
-  <element name="origin" required="0">
-    <attribute name="pose" type="pose" default="0 0 0 0 0 0" required="1"/>
-  </element> <!-- End Origin -->
-
-  <element name="material" required="0">
-    <attribute name="script" type="string" default="__default__" required="0"/>
-
-    <element name="shader" required="0">
-      <attribute name="type" type="string" default="pixel" required="1"/>
-      <element name="normal_map" type="string" default="__default__" required="0"/>
-    </element>
-    <element name="ambient" required="0">
-      <attribute name="rgba" type="color" default="0 0 0 1" required="1"/>
-    </element>
-    <element name="diffuse" required="0">
-      <attribute name="rgba" type="color" default="0 0 0 1" required="1"/>
-    </element>
-    <element name="specular" required="0">
-      <attribute name="rgba" type="color" default="0 0 0 1" required="1"/>
-    </element>
-    <element name="emissive" required="0">
-      <attribute name="rgba" type="color" default="0 0 0 1" required="1"/>
-    </element>
-  </element> <!-- End Material -->
-
-  <include filename="geometry.sdf" required="1"/>
-</element> <!-- End Visual -->
diff --git a/gazebo/sdf/1.0/world.sdf b/gazebo/sdf/1.0/world.sdf
deleted file mode 100644
index 1605acb..0000000
--- a/gazebo/sdf/1.0/world.sdf
+++ /dev/null
@@ -1,16 +0,0 @@
-<element name="world" required="*">
-  <attribute name="name" type="string" default="__default__" required="1"/>
-
-  <include filename="gui.sdf" required="0"/>
-  <include filename="physics.sdf" required="1"/>
-  <include filename="scene.sdf" required="1"/>
-  <include filename="light.sdf" required="*"/>
-
-  <include filename="model.sdf" required="*"/>
-  <include filename="actor.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="road.sdf" required="*"/>
-
-  <include filename="state.sdf" required="*"/>
-</element> <!-- End World -->
diff --git a/gazebo/sdf/1.2/1_0.convert b/gazebo/sdf/1.2/1_0.convert
deleted file mode 100644
index 6bc4cff..0000000
--- a/gazebo/sdf/1.2/1_0.convert
+++ /dev/null
@@ -1,1462 +0,0 @@
-<convert name="gazebo">
-  <convert name="world">
-    <convert name="state">
-      <rename>
-        <from attribute="time"/>
-        <to element="time"/>
-      </rename>
-    </convert>
-
-    <convert name="physics">
-      <rename>
-        <from attribute="update_rate"/>
-        <to element="update_rate"/>
-      </rename>
-      <rename>
-        <from element="gravity" attribute="xyz"/>
-        <to element="gravity"/>
-      </rename>
-
-      <convert name="ode">
-        <convert name="solver">
-          <rename>
-            <from attribute="type"/>
-            <to element="type"/>
-          </rename>
-          <rename>
-            <from attribute="dt"/>
-            <to element="dt"/>
-          </rename>
-          <rename>
-            <from attribute="iters"/>
-            <to element="iters"/>
-          </rename>
-          <rename>
-            <from attribute="precon_iters"/>
-            <to element="precon_iters"/>
-          </rename>
-          <rename>
-            <from attribute="sor"/>
-            <to element="sor"/>
-          </rename>
-        </convert> <!-- End solver -->
-
-        <convert name="constraints">
-          <rename>
-            <from attribute="cfm"/>
-            <to element="cfm"/>
-          </rename>
-          <rename>
-            <from attribute="erp"/>
-            <to element="erp"/>
-          </rename>
-          <rename>
-            <from attribute="contact_max_correcting_vel"/>
-            <to element="contact_max_correcting_vel"/>
-          </rename>
-          <rename>
-            <from attribute="contact_surface_layer"/>
-            <to element="contact_surface_layer"/>
-          </rename>
-        </convert> <!-- End constraints -->
-      </convert> <!-- End ode -->
-    </convert> <!-- End physics -->
-
-    <convert name="gui">
-      <convert name="camera">
-        <rename>
-          <from element="origin" attribute="pose"/>
-          <to element="pose"/>
-        </rename>
-      </convert> <!-- End camera -->
-    </convert> <!-- End gui -->
-
-    <convert name="scene">
-      <rename>
-        <from element="ambient" attribute="rgba"/>
-        <to element="ambient"/>
-      </rename>
-
-      <rename>
-        <from element="background" attribute="rgba"/>
-        <to element="background"/>
-      </rename>
-
-      <rename>
-        <from element="shadows" attribute="enabled"/>
-        <to element="shadows"/>
-      </rename>
-
-      <rename>
-        <from element="grid" attribute="enabled"/>
-        <to element="grid"/>
-      </rename>
-
-      <convert name="fog">
-        <rename>
-          <from attribute="rgba"/>
-          <to element="color"/>
-        </rename>
-
-        <rename>
-          <from attribute="type"/>
-          <to element="type"/>
-        </rename>
-
-        <rename>
-          <from attribute="start"/>
-          <to element="start"/>
-        </rename>
-
-        <rename>
-          <from attribute="end"/>
-          <to element="end"/>
-        </rename>
-
-        <rename>
-          <from attribute="density"/>
-          <to element="density"/>
-        </rename>
-      </convert>
-   
-      <deprecated>background/sky/rgba</deprecated>
-      <deprecated>background/sky/material</deprecated>
-    </convert>
-
-    <convert name="actor">
-      <rename>
-        <from element="origin" attribute="pose"/>
-        <to element="pose"/>
-      </rename>
-
-      <convert name="skin">
-        <rename>
-          <from attribute="filename"/>
-          <to element="filename"/>
-        </rename>
-
-        <rename>
-          <from attribute="scale"/>
-          <to element="scale"/>
-        </rename>
-      </convert> <!-- End skin -->
-
-      <convert name="animation">
-        <rename>
-          <from attribute="filename"/>
-          <to element="filename"/>
-        </rename>
-
-        <rename>
-          <from attribute="scale"/>
-          <to element="scale"/>
-        </rename>
-
-        <rename>
-          <from attribute="interpolate_x"/>
-          <to element="interpolate_x"/>
-        </rename>
-      </convert> <!-- End animation -->
-
-      <convert name="script">
-        <rename>
-          <from attribute="loop"/>
-          <to element="loop"/>
-        </rename>
-        <rename>
-          <from attribute="delay_start"/>
-          <to element="delay_start"/>
-        </rename>
-        <rename>
-          <from attribute="auto_start"/>
-          <to element="auto_start"/>
-        </rename>
-
-        <convert name="trajectory">
-          <convert name="waypoint">
-            <rename>
-              <from attribute="time"/>
-              <to element="time"/>
-            </rename>
-            <rename>
-              <from attribute="pose"/>
-              <to element="pose"/>
-            </rename>
-          </convert> <!-- End waypoint -->
-        </convert> <!-- End trajectory -->
-      </convert> <!-- End script-->
-    </convert> <!-- End actor -->
-
-    <convert name="light">
-      <rename>
-        <from element="origin" attribute="pose"/>
-        <to element="pose"/>
-      </rename>
-
-      <rename>
-        <from attribute="cast_shadows"/>
-        <to element="cast_shadows"/>
-      </rename>
-
-      <rename>
-        <from element="diffuse" attribute="rgba"/>
-        <to element="diffuse"/>
-      </rename>
-      <rename>
-        <from element="specular" attribute="rgba"/>
-        <to element="specular"/>
-      </rename>
-      <rename>
-        <from element="direction" attribute="xyz"/>
-        <to element="direction"/>
-      </rename>
-
-      <convert name="spot">
-        <rename>
-          <from attribute="inner_angle"/>
-          <to element="inner_angle"/>
-        </rename>
-        <rename>
-          <from attribute="outer_angle"/>
-          <to element="outer_angle"/>
-        </rename>
-        <rename>
-          <from attribute="falloff"/>
-          <to element="falloff"/>
-        </rename>
-      </convert> <!-- End spot -->
-
-      <convert name="attenuation">
-        <rename>
-          <from attribute="range"/>
-          <to element="range"/>
-        </rename>
-        <rename>
-          <from attribute="linear"/>
-          <to element="linear"/>
-        </rename>
-        <rename>
-          <from attribute="constant"/>
-          <to element="constant"/>
-        </rename>
-        <rename>
-          <from attribute="quadratic"/>
-          <to element="quadratic"/>
-        </rename>
-      </convert> <!-- End attenuation -->
-    </convert> <!-- End light -->
-
-    <convert name="model">
-      <rename>
-        <from element="origin" attribute="pose"/>
-        <to element="pose"/>
-      </rename>
-      <rename>
-        <from attribute="static"/>
-        <to element="static"/>
-      </rename>
-
-
-      <convert name="gripper">
-        <convert name="grasp_check">
-          <rename>
-            <from attribute="detach_steps"/>
-            <to element="detach_steps"/>
-          </rename>
-          <rename>
-            <from attribute="attach_steps"/>
-            <to element="attach_steps"/>
-          </rename>
-          <rename>
-            <from attribute="min_contact_count"/>
-            <to element="min_contact_count"/>
-          </rename>
-        </convert> <!-- End grasp_check -->
-      </convert> <!-- End gripper -->
-
-
-      <convert name="link">
-        <rename>
-          <from attribute="gravity"/>
-          <to element="gravity"/>
-        </rename>
-        <rename>
-          <from element="origin" attribute="pose"/>
-          <to element="pose"/>
-        </rename>
-        <rename>
-          <from attribute="self_collide"/>
-          <to element="self_collide"/>
-        </rename>
-        <rename>
-          <from attribute="kinematic"/>
-          <to element="kinematic"/>
-        </rename>
-
-        <convert name="inertial">
-          <rename>
-            <from element="origin" attribute="pose"/>
-            <to element="pose"/>
-          </rename>
-          <rename>
-            <from attribute="mass"/>
-            <to element="mass"/>
-          </rename>
-          <rename>
-            <from attribute="density"/>
-            <to element="density"/>
-          </rename>
-          <convert name="inertia">
-            <rename>
-              <from attribute="ixx"/>
-              <to element="ixx"/>
-            </rename>
-            <rename>
-              <from attribute="ixy"/>
-              <to element="ixy"/>
-            </rename>
-            <rename>
-              <from attribute="ixz"/>
-              <to element="ixz"/>
-            </rename>
-            <rename>
-              <from attribute="iyy"/>
-              <to element="iyy"/>
-            </rename>
-            <rename>
-              <from attribute="iyz"/>
-              <to element="iyz"/>
-            </rename>
-            <rename>
-              <from attribute="izz"/>
-              <to element="izz"/>
-            </rename>
-          </convert> <!-- End inertia -->
-        </convert> <!-- End inertial -->
-
-        <convert name="sensor">
-          <rename>
-            <from element="origin" attribute="pose"/>
-            <to element="pose"/>
-          </rename>
-
-          <rename>
-            <from attribute="always_on"/>
-            <to element="always_on"/>
-          </rename>
-          <rename>
-            <from attribute="update_rate"/>
-            <to element="update_rate"/>
-          </rename>
-          <rename>
-            <from attribute="visualize"/>
-            <to element="visualize"/>
-          </rename>
-
-          <convert name="ray">
-            <convert name="scan">
-              <convert name="horizontal">
-                <rename>
-                  <from attribute="samples"/>
-                  <to element="samples"/>
-                </rename>
-                <rename>
-                  <from attribute="resolution"/>
-                  <to element="resolution"/>
-                </rename>
-                <rename>
-                  <from attribute="min_angle"/>
-                  <to element="min_angle"/>
-                </rename>
-                <rename>
-                  <from attribute="max_angle"/>
-                  <to element="max_angle"/>
-                </rename>
-              </convert> <!-- End horizontal -->
-              <convert name="vertical">
-                <rename>
-                  <from attribute="samples"/>
-                  <to element="samples"/>
-                </rename>
-                <rename>
-                  <from attribute="resolution"/>
-                  <to element="resolution"/>
-                </rename>
-                <rename>
-                  <from attribute="min_angle"/>
-                  <to element="min_angle"/>
-                </rename>
-                <rename>
-                  <from attribute="max_angle"/>
-                  <to element="max_angle"/>
-                </rename>
-              </convert> <!-- End vertical -->
-            </convert> <!-- End scan -->
-            <convert name="range">
-              <rename>
-                <from attribute="min"/>
-                <to element="min"/>
-              </rename>
-              <rename>
-                <from attribute="max"/>
-                <to element="max"/>
-              </rename>
-              <rename>
-                <from attribute="resolution"/>
-                <to element="resolution"/>
-              </rename>
-            </convert> <!-- End range -->
-          </convert> <!-- End ray -->
-          <convert name="camera">
-            <rename>
-              <from element="horizontal_fov" attribute="angle"/>
-              <to element="horizontal_fov"/>
-            </rename>
-            <convert name="image">
-              <rename>
-                <from attribute="width"/>
-                <to element="width"/>
-              </rename>
-              <rename>
-                <from attribute="height"/>
-                <to element="height"/>
-              </rename>
-              <rename>
-                <from attribute="format"/>
-                <to element="format"/>
-              </rename>
-            </convert> <!-- End image -->
-          </convert> <!-- End camera -->
-
-          <convert name="clip">
-            <rename>
-              <from attribute="near"/>
-              <to element="near"/>
-            </rename>
-            <rename>
-              <from attribute="far"/>
-              <to element="far"/>
-            </rename>
-          </convert> <!-- End clip -->
-
-          <convert name="save">
-            <rename>
-              <rename>
-                <from attribute="path"/>
-                <to element="path"/>
-              </rename>
-            </rename>
-          </convert> <!-- End save -->
-          <convert name="depth_camera">
-            <rename>
-              <from attribute="output"/>
-              <to element="output"/>
-            </rename>
-          </convert> <!-- End depth_camera -->
-        </convert> <!-- End sensor -->
-
-        <convert name="collision">
-          <rename>
-            <from element="origin" attribute="pose"/>
-            <to element="pose"/>
-          </rename>
-
-          <rename>
-            <from attribute="laser_retro"/>
-            <to element="laser_retro"/>
-          </rename>
-
-
-          <convert name="surface">
-            <convert name="bounce">
-              <rename>
-                <from attribute="restitution_coefficient"/>
-                <to element="restitution_coefficient"/>
-              </rename>
-              <rename>
-                <from attribute="threshold"/>
-                <to element="threshold"/>
-              </rename>
-            </convert> <!-- End bounce -->
-            <convert name="friction">
-              <convert name="ode">
-                <rename>
-                  <from attribute="mu"/>
-                  <to element="mu"/>
-                </rename>
-                <rename>
-                  <from attribute="mu2"/>
-                  <to element="mu2"/>
-                </rename>
-                <rename>
-                  <from attribute="fdir1"/>
-                  <to element="fdir1"/>
-                </rename>
-                <rename>
-                  <from attribute="slip1"/>
-                  <to element="slip1"/>
-                </rename>
-                <rename>
-                  <from attribute="slip2"/>
-                  <to element="slip2"/>
-                </rename>
-              </convert> <!-- End ode -->
-            </convert> <!-- End friction -->
-
-            <convert name="contact">
-              <convert name="ode">
-                <rename>
-                  <from attribute="soft_cfm"/>
-                  <to element="soft_cfm"/>
-                </rename>
-                <rename>
-                  <from attribute="soft_erp"/>
-                  <to element="soft_erp"/>
-                </rename>
-                <rename>
-                  <from attribute="kp"/>
-                  <to element="kp"/>
-                </rename>
-                <rename>
-                  <from attribute="kd"/>
-                  <to element="kd"/>
-                </rename>
-                <rename>
-                  <from attribute="max_vel"/>
-                  <to element="max_vel"/>
-                </rename>
-                <rename>
-                  <from attribute="min_depth"/>
-                  <to element="min_depth"/>
-                </rename>
-              </convert> <!-- End ode -->
-            </convert> <!-- End contact -->
-          </convert> <!-- End surface -->
-
-          <convert name="geometry">
-            <convert name="box">
-              <rename>
-                <from attribute="size"/>
-                <to element="size"/>
-              </rename>
-            </convert> <!-- End box -->
-            <convert name="sphere">
-              <rename>
-                <from attribute="radius"/>
-                <to element="radius"/>
-              </rename>
-            </convert> <!-- End sphere -->
-            <convert name="cylinder">
-              <rename>
-                <from attribute="radius"/>
-                <to element="radius"/>
-              </rename>
-              <rename>
-                <from attribute="length"/>
-                <to element="length"/>
-              </rename>
-            </convert> <!-- End cylinder -->
-            <convert name="mesh">
-              <rename>
-                <from attribute="filename"/>
-                <to element="filename"/>
-              </rename>
-              <rename>
-                <from attribute="scale"/>
-                <to element="scale"/>
-              </rename>
-            </convert> <!-- End mesh -->
-            <convert name="image">
-              <rename>
-                <from attribute="filename"/>
-                <to element="filename"/>
-              </rename>
-              <rename>
-                <from attribute="scale"/>
-                <to element="scale"/>
-              </rename>
-              <rename>
-                <from attribute="threshold"/>
-                <to element="threshold"/>
-              </rename>
-              <rename>
-                <from attribute="height"/>
-                <to element="height"/>
-              </rename>
-              <rename>
-                <from attribute="granularity"/>
-                <to element="granularity"/>
-              </rename>
-            </convert> <!-- End image -->
-
-            <convert name="heightmap">
-              <rename>
-                <from attribute="filename"/>
-                <to element="filename"/>
-              </rename>
-              <rename>
-                <from attribute="size"/>
-                <to element="size"/>
-              </rename>
-              <rename>
-                <from attribute="origin"/>
-                <to element="pos"/>
-              </rename>
-            </convert> <!-- End heightmap -->
-
-
-            <convert name="plane">
-              <rename>
-                <from attribute="normal"/>
-                <to element="normal"/>
-              </rename>
-            </convert>
-          </convert> <!-- End geometry -->
-        </convert> <!-- End collision -->
-
-        <convert name="visual">
-          <rename>
-            <from element="origin" attribute="pose"/>
-            <to element="pose"/>
-          </rename>
-          <rename>
-            <from attribute="cast_shadows"/>
-            <to element="cast_shadows"/>
-          </rename>
-          <rename>
-            <from attribute="laser_retro"/>
-            <to element="laser_retro"/>
-          </rename>
-          <rename>
-            <from attribute="transparency"/>
-            <to element="transparency"/>
-          </rename>
-
-          <convert name="geometry">
-            <convert name="box">
-              <rename>
-                <from attribute="size"/>
-                <to element="size"/>
-              </rename>
-            </convert> <!-- End box -->
-            <convert name="sphere">
-              <rename>
-                <from attribute="radius"/>
-                <to element="radius"/>
-              </rename>
-            </convert> <!-- End sphere -->
-            <convert name="cylinder">
-              <rename>
-                <from attribute="radius"/>
-                <to element="radius"/>
-              </rename>
-              <rename>
-                <from attribute="length"/>
-                <to element="length"/>
-              </rename>
-            </convert> <!-- End cylinder -->
-            <convert name="mesh">
-              <rename>
-                <from attribute="filename"/>
-                <to element="filename"/>
-              </rename>
-              <rename>
-                <from attribute="scale"/>
-                <to element="scale"/>
-              </rename>
-            </convert> <!-- End mesh -->
-            <convert name="image">
-              <rename>
-                <from attribute="filename"/>
-                <to element="filename"/>
-              </rename>
-              <rename>
-                <from attribute="scale"/>
-                <to element="scale"/>
-              </rename>
-              <rename>
-                <from attribute="threshold"/>
-                <to element="threshold"/>
-              </rename>
-              <rename>
-                <from attribute="height"/>
-                <to element="height"/>
-              </rename>
-              <rename>
-                <from attribute="granularity"/>
-                <to element="granularity"/>
-              </rename>
-            </convert> <!-- End image -->
-
-            <convert name="heightmap">
-              <rename>
-                <from attribute="filename"/>
-                <to element="filename"/>
-              </rename>
-              <rename>
-                <from attribute="size"/>
-                <to element="size"/>
-              </rename>
-              <rename>
-                <from attribute="origin"/>
-                <to element="pos"/>
-              </rename>
-            </convert> <!-- End heightmap -->
-
-            <convert name="plane">
-              <rename>
-                <from attribute="normal"/>
-                <to element="normal"/>
-              </rename>
-            </convert>
-          </convert> <!-- End geometry -->
-
-          <convert name="material">
-            <rename>
-              <from attribute="script"/>
-              <to element="script"/>
-            </rename>
-            <rename>
-              <from element="ambient" attribute="rgba"/>
-              <to element="ambient"/>
-            </rename>
-            <rename>
-              <from element="specular" attribute="rgba"/>
-              <to element="specular"/>
-            </rename>
-            <rename>
-              <from element="diffuse" attribute="rgba"/>
-              <to element="diffuse"/>
-            </rename>
-            <rename>
-              <from element="emissive" attribute="rgba"/>
-              <to element="emissive"/>
-            </rename>
-          </convert> <!-- End material -->
-        </convert> <!-- End visual -->
-      </convert> <!-- End link -->
-
-      <convert name="joint">
-        <rename>
-          <from element="origin" attribute="pose"/>
-          <to element="pose"/>
-        </rename>
-        <rename>
-          <from element="parent" attribute="link"/>
-          <to element="parent"/>
-        </rename>
-        <rename>
-          <from element="child" attribute="link"/>
-          <to element="child"/>
-        </rename>
-        <convert name="axis">
-          <rename>
-            <from attribute="xyz"/>
-            <to element="xyz"/>
-          </rename>
-
-          <convert name="dynamics">
-            <rename>
-              <from attribute="damping"/>
-              <to element="damping"/>
-            </rename>
-            <rename>
-              <from attribute="friction"/>
-              <to element="friction"/>
-            </rename>
-          </convert> <!-- End dynamics -->
-          <convert name="limit">
-            <rename>
-              <from attribute="lower"/>
-              <to element="lower"/>
-            </rename>
-            <rename>
-              <from attribute="upper"/>
-              <to element="upper"/>
-            </rename>
-            <rename>
-              <from attribute="effort"/>
-              <to element="effort"/>
-            </rename>
-            <rename>
-              <from attribute="velocity"/>
-              <to element="velocity"/>
-            </rename>
-          </convert> <!-- End limit -->
-        </convert> <!-- End axis -->
-
-        <convert name="axis2">
-          <rename>
-            <from attribute="xyz"/>
-            <to element="xyz"/>
-          </rename>
-
-          <convert name="dynamics">
-            <rename>
-              <from attribute="damping"/>
-              <to element="damping"/>
-            </rename>
-            <rename>
-              <from attribute="friction"/>
-              <to element="friction"/>
-            </rename>
-          </convert> <!-- End dynamics -->
-          <convert name="limit">
-            <rename>
-              <from attribute="lower"/>
-              <to element="lower"/>
-            </rename>
-            <rename>
-              <from attribute="upper"/>
-              <to element="upper"/>
-            </rename>
-            <rename>
-              <from attribute="effort"/>
-              <to element="effort"/>
-            </rename>
-            <rename>
-              <from attribute="velocity"/>
-              <to element="velocity"/>
-            </rename>
-          </convert> <!-- End limit -->
-        </convert> <!-- End axis2 -->
-
-        <convert name="physics">
-          <convert name="limit">
-            <rename>
-              <from attribute="cfm"/>
-              <to element="cfm"/>
-            </rename>
-            <rename>
-              <from attribute="erp"/>
-              <to element="erp"/>
-            </rename>
-          </convert> <!-- End limit -->
-          <convert name="suspension">
-            <rename>
-              <from attribute="cfm"/>
-              <to element="cfm"/>
-            </rename>
-            <rename>
-              <from attribute="erp"/>
-              <to element="erp"/>
-            </rename>
-          </convert> <!-- End suspension -->
-        </convert> <!-- End physics -->
-      </convert> <!-- End joint -->
-    </convert> <!-- End model -->
-  </convert> <!-- End world -->
-
-
-
-  <convert name="model">
-    <rename>
-      <from element="origin" attribute="pose"/>
-      <to element="pose"/>
-    </rename>
-    <rename>
-      <from attribute="static"/>
-      <to element="static"/>
-    </rename>
-
-
-    <convert name="gripper">
-      <convert name="grasp_check">
-        <rename>
-          <from attribute="detach_steps"/>
-          <to element="detach_steps"/>
-        </rename>
-        <rename>
-          <from attribute="attach_steps"/>
-          <to element="attach_steps"/>
-        </rename>
-        <rename>
-          <from attribute="min_contact_count"/>
-          <to element="min_contact_count"/>
-        </rename>
-      </convert> <!-- End grasp_check -->
-    </convert> <!-- End gripper -->
-
-
-    <convert name="link">
-      <rename>
-        <from attribute="gravity"/>
-        <to element="gravity"/>
-      </rename>
-      <rename>
-        <from attribute="self_collide"/>
-        <to element="self_collide"/>
-      </rename>
-      <rename>
-        <from attribute="kinematic"/>
-        <to element="kinematic"/>
-      </rename>
-
-      <rename>
-        <from element="damping"/>
-        <to element="velocity_decay"/>
-      </rename>
-
-      <convert name="inertial">
-        <rename>
-          <from attribute="mass"/>
-          <to element="mass"/>
-        </rename>
-        <rename>
-          <from attribute="density"/>
-          <to element="density"/>
-        </rename>
-        <convert name="inertia">
-          <rename>
-            <from attribute="ixx"/>
-            <to element="ixx"/>
-          </rename>
-          <rename>
-            <from attribute="ixy"/>
-            <to element="ixy"/>
-          </rename>
-          <rename>
-            <from attribute="ixz"/>
-            <to element="ixz"/>
-          </rename>
-          <rename>
-            <from attribute="iyy"/>
-            <to element="iyy"/>
-          </rename>
-          <rename>
-            <from attribute="iyz"/>
-            <to element="iyz"/>
-          </rename>
-          <rename>
-            <from attribute="izz"/>
-            <to element="izz"/>
-          </rename>
-        </convert> <!-- End inertia -->
-      </convert> <!-- End inertial -->
-
-      <convert name="sensor">
-        <rename>
-          <from attribute="always_on"/>
-          <to element="always_on"/>
-        </rename>
-        <rename>
-          <from attribute="update_rate"/>
-          <to element="update_rate"/>
-        </rename>
-        <rename>
-          <from attribute="visualize"/>
-          <to element="visualize"/>
-        </rename>
-
-        <convert name="ray">
-          <convert name="scan">
-            <convert name="horizontal">
-              <rename>
-                <from attribute="samples"/>
-                <to element="samples"/>
-              </rename>
-              <rename>
-                <from attribute="resolution"/>
-                <to element="resolution"/>
-              </rename>
-              <rename>
-                <from attribute="min_angle"/>
-                <to element="min_angle"/>
-              </rename>
-              <rename>
-                <from attribute="max_angle"/>
-                <to element="max_angle"/>
-              </rename>
-            </convert> <!-- End horizontal -->
-            <convert name="vertical">
-              <rename>
-                <from attribute="samples"/>
-                <to element="samples"/>
-              </rename>
-              <rename>
-                <from attribute="resolution"/>
-                <to element="resolution"/>
-              </rename>
-              <rename>
-                <from attribute="min_angle"/>
-                <to element="min_angle"/>
-              </rename>
-              <rename>
-                <from attribute="max_angle"/>
-                <to element="max_angle"/>
-              </rename>
-            </convert> <!-- End vertical -->
-          </convert> <!-- End scan -->
-          <convert name="range">
-            <rename>
-              <from attribute="min"/>
-              <to element="min"/>
-            </rename>
-            <rename>
-              <from attribute="max"/>
-              <to element="max"/>
-            </rename>
-            <rename>
-              <from attribute="resolution"/>
-              <to element="resolution"/>
-            </rename>
-          </convert> <!-- End range -->
-        </convert> <!-- End ray -->
-        <convert name="camera">
-          <rename>
-            <from element="horizontal_fov" attribute="angle"/>
-            <to element="horizontal_fov"/>
-          </rename>
-          <convert name="image">
-            <rename>
-              <from attribute="width"/>
-              <to element="width"/>
-            </rename>
-            <rename>
-              <from attribute="height"/>
-              <to element="height"/>
-            </rename>
-            <rename>
-              <from attribute="format"/>
-              <to element="format"/>
-            </rename>
-          </convert> <!-- End image -->
-        </convert> <!-- End camera -->
-
-        <convert name="clip">
-          <rename>
-            <from attribute="near"/>
-            <to element="near"/>
-          </rename>
-          <rename>
-            <from attribute="far"/>
-            <to element="far"/>
-          </rename>
-        </convert> <!-- End clip -->
-
-        <convert name="save">
-          <rename>
-            <rename>
-              <from attribute="path"/>
-              <to element="path"/>
-            </rename>
-          </rename>
-        </convert> <!-- End save -->
-        <convert name="depth_camera">
-          <rename>
-            <from attribute="output"/>
-            <to element="output"/>
-          </rename>
-        </convert> <!-- End depth_camera -->
-      </convert> <!-- End sensor -->
-
-      <rename>
-        <from element="origin" attribute="pose"/>
-        <to element="pose"/>
-      </rename>
-
-      <convert name="sensor">
-        <rename>
-          <from element="origin" attribute="pose"/>
-          <to element="pose"/>
-        </rename>
-      </convert>
-
-      <convert name="inertial">
-        <rename>
-          <from element="origin" attribute="pose"/>
-          <to element="pose"/>
-        </rename>
-      </convert> <!-- End inertial-->
-
-      <convert name="collision">
-        <rename>
-          <from element="origin" attribute="pose"/>
-          <to element="pose"/>
-        </rename>
-
-        <rename>
-          <from attribute="laser_retro"/>
-          <to element="laser_retro"/>
-        </rename>
-
-
-        <convert name="surface">
-          <convert name="bounce">
-            <rename>
-              <from attribute="restitution_coefficient"/>
-              <to element="restitution_coefficient"/>
-            </rename>
-            <rename>
-              <from attribute="threshold"/>
-              <to element="threshold"/>
-            </rename>
-          </convert> <!-- End bounce -->
-          <convert name="friction">
-            <convert name="ode">
-              <rename>
-                <from attribute="mu"/>
-                <to element="mu"/>
-              </rename>
-              <rename>
-                <from attribute="mu2"/>
-                <to element="mu2"/>
-              </rename>
-              <rename>
-                <from attribute="fdir1"/>
-                <to element="fdir1"/>
-              </rename>
-              <rename>
-                <from attribute="slip1"/>
-                <to element="slip1"/>
-              </rename>
-              <rename>
-                <from attribute="slip2"/>
-                <to element="slip2"/>
-              </rename>
-            </convert> <!-- End ode -->
-          </convert> <!-- End friction -->
-
-          <convert name="contact">
-            <convert name="ode">
-              <rename>
-                <from attribute="soft_cfm"/>
-                <to element="soft_cfm"/>
-              </rename>
-              <rename>
-                <from attribute="soft_erp"/>
-                <to element="soft_erp"/>
-              </rename>
-              <rename>
-                <from attribute="kp"/>
-                <to element="kp"/>
-              </rename>
-              <rename>
-                <from attribute="kd"/>
-                <to element="kd"/>
-              </rename>
-              <rename>
-                <from attribute="max_vel"/>
-                <to element="max_vel"/>
-              </rename>
-              <rename>
-                <from attribute="min_depth"/>
-                <to element="min_depth"/>
-              </rename>
-            </convert> <!-- End ode -->
-          </convert> <!-- End contact -->
-        </convert> <!-- End surface -->
-
-        <convert name="geometry">
-          <convert name="box">
-            <rename>
-              <from attribute="size"/>
-              <to element="size"/>
-            </rename>
-          </convert> <!-- End box -->
-          <convert name="sphere">
-            <rename>
-              <from attribute="radius"/>
-              <to element="radius"/>
-            </rename>
-          </convert> <!-- End sphere -->
-          <convert name="cylinder">
-            <rename>
-              <from attribute="radius"/>
-              <to element="radius"/>
-            </rename>
-            <rename>
-              <from attribute="length"/>
-              <to element="length"/>
-            </rename>
-          </convert> <!-- End cylinder -->
-          <convert name="mesh">
-            <rename>
-              <from attribute="filename"/>
-              <to element="filename"/>
-            </rename>
-            <rename>
-              <from attribute="scale"/>
-              <to element="scale"/>
-            </rename>
-          </convert> <!-- End mesh -->
-          <convert name="image">
-            <rename>
-              <from attribute="filename"/>
-              <to element="filename"/>
-            </rename>
-            <rename>
-              <from attribute="scale"/>
-              <to element="scale"/>
-            </rename>
-            <rename>
-              <from attribute="threshold"/>
-              <to element="threshold"/>
-            </rename>
-            <rename>
-              <from attribute="height"/>
-              <to element="height"/>
-            </rename>
-            <rename>
-              <from attribute="granularity"/>
-              <to element="granularity"/>
-            </rename>
-          </convert> <!-- End image -->
-
-          <convert name="heightmap">
-            <rename>
-              <from attribute="filename"/>
-              <to element="filename"/>
-            </rename>
-            <rename>
-              <from attribute="size"/>
-              <to element="size"/>
-            </rename>
-            <rename>
-              <from attribute="origin"/>
-              <to element="pos"/>
-            </rename>
-          </convert> <!-- End heightmap -->
-
-
-          <convert name="plane">
-            <rename>
-              <from attribute="normal"/>
-              <to element="normal"/>
-            </rename>
-          </convert>
-        </convert> <!-- End geometry -->
-      </convert> <!-- End collision -->
-
-      <convert name="visual">
-        <rename>
-          <from element="origin" attribute="pose"/>
-          <to element="pose"/>
-        </rename>
-        <rename>
-          <from attribute="cast_shadows"/>
-          <to element="cast_shadows"/>
-        </rename>
-        <rename>
-          <from attribute="laser_retro"/>
-          <to element="laser_retro"/>
-        </rename>
-        <rename>
-          <from attribute="transparency"/>
-          <to element="transparency"/>
-        </rename>
-
-        <convert name="geometry">
-          <convert name="box">
-            <rename>
-              <from attribute="size"/>
-              <to element="size"/>
-            </rename>
-          </convert> <!-- End box -->
-          <convert name="sphere">
-            <rename>
-              <from attribute="radius"/>
-              <to element="radius"/>
-            </rename>
-          </convert> <!-- End sphere -->
-          <convert name="cylinder">
-            <rename>
-              <from attribute="radius"/>
-              <to element="radius"/>
-            </rename>
-            <rename>
-              <from attribute="length"/>
-              <to element="length"/>
-            </rename>
-          </convert> <!-- End cylinder -->
-          <convert name="mesh">
-            <rename>
-              <from attribute="filename"/>
-              <to element="filename"/>
-            </rename>
-            <rename>
-              <from attribute="scale"/>
-              <to element="scale"/>
-            </rename>
-          </convert> <!-- End mesh -->
-          <convert name="image">
-            <rename>
-              <from attribute="filename"/>
-              <to element="filename"/>
-            </rename>
-            <rename>
-              <from attribute="scale"/>
-              <to element="scale"/>
-            </rename>
-            <rename>
-              <from attribute="threshold"/>
-              <to element="threshold"/>
-            </rename>
-            <rename>
-              <from attribute="height"/>
-              <to element="height"/>
-            </rename>
-            <rename>
-              <from attribute="granularity"/>
-              <to element="granularity"/>
-            </rename>
-          </convert> <!-- End image -->
-
-          <convert name="heightmap">
-            <rename>
-              <from attribute="filename"/>
-              <to element="filename"/>
-            </rename>
-            <rename>
-              <from attribute="size"/>
-              <to element="size"/>
-            </rename>
-            <rename>
-              <from attribute="origin"/>
-              <to element="pos"/>
-            </rename>
-          </convert> <!-- End heightmap -->
-
-          <convert name="plane">
-            <rename>
-              <from attribute="normal"/>
-              <to element="normal"/>
-            </rename>
-          </convert>
-        </convert> <!-- End geometry -->
-
-        <convert name="material">
-          <rename>
-            <from attribute="script"/>
-            <to element="script"/>
-          </rename>
-          <rename>
-            <from element="ambient" attribute="rgba"/>
-            <to element="ambient"/>
-          </rename>
-          <rename>
-            <from element="specular" attribute="rgba"/>
-            <to element="specular"/>
-          </rename>
-          <rename>
-            <from element="diffuse" attribute="rgba"/>
-            <to element="diffuse"/>
-          </rename>
-          <rename>
-            <from element="emissive" attribute="rgba"/>
-            <to element="emissive"/>
-          </rename>
-        </convert> <!-- End material -->
-      </convert> <!-- End visual -->
-    </convert> <!-- End link -->
-
-    <convert name="joint">
-      <rename>
-        <from element="origin" attribute="pose"/>
-        <to element="pose"/>
-      </rename>
-      <rename>
-        <from element="parent" attribute="link"/>
-        <to element="parent"/>
-      </rename>
-      <rename>
-        <from element="child" attribute="link"/>
-        <to element="child"/>
-      </rename>
-      <convert name="axis">
-        <rename>
-          <from attribute="xyz"/>
-          <to element="xyz"/>
-        </rename>
-
-        <convert name="dynamics">
-          <rename>
-            <from attribute="damping"/>
-            <to element="damping"/>
-          </rename>
-          <rename>
-            <from attribute="friction"/>
-            <to element="friction"/>
-          </rename>
-        </convert> <!-- End dynamics -->
-        <convert name="limit">
-          <rename>
-            <from attribute="lower"/>
-            <to element="lower"/>
-          </rename>
-          <rename>
-            <from attribute="upper"/>
-            <to element="upper"/>
-          </rename>
-          <rename>
-            <from attribute="effort"/>
-            <to element="effort"/>
-          </rename>
-          <rename>
-            <from attribute="velocity"/>
-            <to element="velocity"/>
-          </rename>
-        </convert> <!-- End limit -->
-      </convert> <!-- End axis -->
-      <convert name="axis2">
-        <rename>
-          <from attribute="xyz"/>
-          <to element="xyz"/>
-        </rename>
-
-        <convert name="dynamics">
-          <rename>
-            <from attribute="damping"/>
-            <to element="damping"/>
-          </rename>
-          <rename>
-            <from attribute="friction"/>
-            <to element="friction"/>
-          </rename>
-        </convert> <!-- End dynamics -->
-        <convert name="limit">
-          <rename>
-            <from attribute="lower"/>
-            <to element="lower"/>
-          </rename>
-          <rename>
-            <from attribute="upper"/>
-            <to element="upper"/>
-          </rename>
-          <rename>
-            <from attribute="effort"/>
-            <to element="effort"/>
-          </rename>
-          <rename>
-            <from attribute="velocity"/>
-            <to element="velocity"/>
-          </rename>
-        </convert> <!-- End limit -->
-      </convert> <!-- End axis2 -->
-
-      <convert name="physics">
-        <convert name="limit">
-          <rename>
-            <from attribute="cfm"/>
-            <to element="cfm"/>
-          </rename>
-          <rename>
-            <from attribute="erp"/>
-            <to element="erp"/>
-          </rename>
-        </convert> <!-- End limit -->
-        <convert name="suspension">
-          <rename>
-            <from attribute="cfm"/>
-            <to element="cfm"/>
-          </rename>
-          <rename>
-            <from attribute="erp"/>
-            <to element="erp"/>
-          </rename>
-        </convert> <!-- End suspension -->
-      </convert> <!-- End physics -->
-    </convert> <!-- End joint -->
-  </convert> <!-- End model -->
-
-</convert> <!-- End gazebo -->
diff --git a/gazebo/sdf/1.2/CMakeLists.txt b/gazebo/sdf/1.2/CMakeLists.txt
deleted file mode 100644
index 17bbe67..0000000
--- a/gazebo/sdf/1.2/CMakeLists.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-set (sdfs
-  1_0.convert
-  actor.sdf 
-  camera.sdf
-  collision.sdf 
-  contact.sdf
-  gazebo.sdf 
-  geometry.sdf 
-  gripper.sdf
-  gui.sdf
-  inertial.sdf 
-  joint.sdf 
-  light.sdf 
-  link.sdf 
-  model.sdf 
-  physics.sdf 
-  plugin.sdf 
-  projector.sdf
-  ray.sdf
-  rfidtag.sdf
-  rfid.sdf
-  road.sdf
-  scene.sdf 
-  sensor.sdf 
-  state.sdf
-  surface.sdf 
-  visual.sdf 
-  world.sdf
-)
-
-install(FILES ${sdfs} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/sdf/1.2)
diff --git a/gazebo/sdf/1.2/actor.sdf b/gazebo/sdf/1.2/actor.sdf
deleted file mode 100644
index d90c523..0000000
--- a/gazebo/sdf/1.2/actor.sdf
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- Actor -->
-<element name="actor" required="*">
-  <description></description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description></description>
-  </attribute>
-
-  <attribute name="static" type="bool" default="false" required="0">
-    <description></description>
-  </attribute>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>Origin of the actor</description>
-  </element>
-
-  <element name="skin" required="1">
-    <description></description>
-
-    <element name="filename" type="string" default="__default__" required="1">
-      <description></description>
-    </element>
-
-    <element name="scale" type="double" default="1.0" required="0"> 
-      <description></description>
-    </element>
-  </element> <!-- End Skin -->
-
-  <element name="animation" required="+">
-    <description></description>
-
-    <attribute name="name" type="string" default="__default__" required="1">
-      <description></description>
-    </attribute>
-
-    <element name="filename" type="string" default="__default__" required="1">
-      <description></description>
-    </element>
-    <element name="scale" type="double" default="1.0" required="0">
-      <description></description>
-    </element>
-    <element name="interpolate_x" type="bool" default="false" required="0">
-      <description></description>
-    </element>
-  </element> <!-- End Animation -->
-
-  <element name="script" required="1">
-    <description></description>
-
-    <element name="loop" type="bool" default="true" required="0">
-      <description></description>
-    </element>
-
-    <element name="delay_start" type="double" default="0.0" required="0">
-      <description></description>
-    </element>
-
-    <element name="auto_start" type="bool" default="true" required="0">
-      <description></description>
-    </element>
-
-    <element name="trajectory" required="*">
-      <description></description>
-      <attribute name="id" type="int" default="0" required="1">
-        <description></description>
-      </attribute>
-
-      <attribute name="type" type="string" default="__default__" required="1">
-        <description></description>
-      </attribute>
-
-      <element name="waypoint" required="*">
-        <description></description>
-        <element name="time" type="double" default="0.0" required="1">
-          <description></description>
-        </element>
-        <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-          <description></description>
-        </element>
-      </element> <!-- End Waypoint -->
-    </element> <!-- End Action -->
-  </element> <!-- End Script -->
-  
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-
-</element> <!-- End Actor -->
diff --git a/gazebo/sdf/1.2/camera.sdf b/gazebo/sdf/1.2/camera.sdf
deleted file mode 100644
index 0de2b24..0000000
--- a/gazebo/sdf/1.2/camera.sdf
+++ /dev/null
@@ -1,50 +0,0 @@
-<element name="camera" required="0">
-  <description>These elements are specific to camera sensors.</description>
-
-  <element name="horizontal_fov" type="double" default="1.047" min="0.1" max="1.5708" required="1">
-    <description>Horizontal field of view</description>
-  </element> <!-- End Horizontal_FOV -->
-
-  <element name="image" required="1">
-    <description>The image size in pixels and format.</description>
-    <element name="width" type="int" default="320" required="1">
-      <description>Width in pixels</description>
-    </element>
-    <element name="height" type="int" default="240" required="1">
-      <description>Height in pixels </description>
-    </element>
-    <element name="format" type="string" default="R8G8B8" required="0">
-      <description>(L8|R8G8B8|B8G8R8|BAYER_RGGB8|BAYER_BGGR8|BAYER_GBRG8|BAYER_GRBG8)</description>
-    </element>
-  </element> <!-- End Image -->
-
-  <element name="clip" required="1">
-    <description>The near and far clip planes. Objects closer or farther than these planes are not rendered.</description>
-
-    <element name="near" type="double" default=".1" min="0.0" required="1">
-      <description>Near clipping plane</description>
-    </element>
-
-    <element name="far" type="double" default="100" min="10.0" required="1">
-      <description>Far clipping plane</description>
-    </element>
-  </element> <!-- End Clip -->
-
-  <element name="save" required="0">
-    <description>Enable or disable saving of camera frames.</description>
-    <attribute name="enabled" type="bool" default="false" required="1">
-      <description>True = saving enabled</description>
-    </attribute>
-    <element name="path" type="string" default="__default__" required="1">
-      <description>The path name which will hold the frame data. If path name is relative, then directory is relative to current working directory.</description>
-    </element>
-  </element> <!-- End Save -->
-
-  <element name="depth_camera" required="0">
-    <description>Depth camera parameters</description>
-    <element name="output" type="string" default="depths" required="1">
-      <description>Type of output</description>
-    </element>
-  </element> <!-- End depth_camera -->
-
-</element> <!-- End Camera -->
diff --git a/gazebo/sdf/1.2/collision.sdf b/gazebo/sdf/1.2/collision.sdf
deleted file mode 100644
index 051732d..0000000
--- a/gazebo/sdf/1.2/collision.sdf
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Collision -->
-<element name="collision" required="*">
-  <description>The collision properties of a link. Note that this can be different from the visual properties of a link, for example, simpler collision models are often used to reduce computation time.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Unique name for the collision element within the scope of the parent link.</description>
-  </attribute>
-
-  <element name="laser_retro" type="double" default="0" required="0">
-    <description>intensity value returned by laser sensor.</description>
-  </element>
-
-  <element name="max_contacts" type="int" default="10" required="0">
-    <description>Maximum number of contacts allowed between two entities. This value overrides the max_contacts element defined in physics.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>The reference frame of the collision element, relative to the reference frame of the link.</description>
-  </element>
-
-  <include filename="geometry.sdf" required="1"/>
-  <include filename="surface.sdf" required="0"/>
-
-</element> <!-- End Collision -->
diff --git a/gazebo/sdf/1.2/contact.sdf b/gazebo/sdf/1.2/contact.sdf
deleted file mode 100644
index d1cde50..0000000
--- a/gazebo/sdf/1.2/contact.sdf
+++ /dev/null
@@ -1,12 +0,0 @@
-<element name="contact" required="0">
-  <description>These elements are specific to the contact sensor.</description>
-
-  <element name="collision" type="string" default="__default__" required="1">
-    <description>name of the collision element within a link that acts as the contact sensor.</description>
-  </element> <!-- End Collision -->
-
-  <element name="topic" type="string" default="__default_topic__" required="1">
-    <description>Topic on which contact data is published.</description>
-  </element>
-
-</element> <!-- End Contact -->
diff --git a/gazebo/sdf/1.2/gazebo.sdf b/gazebo/sdf/1.2/gazebo.sdf
deleted file mode 100644
index b4a7b71..0000000
--- a/gazebo/sdf/1.2/gazebo.sdf
+++ /dev/null
@@ -1,13 +0,0 @@
-<element name="gazebo" required="1">
-  <description>Gazebo SDF base element.</description>
-
-  <attribute name="version" type="string" default="1.2" required="1">
-    <description>Version number of the SDF format.</description>
-  </attribute>
-
-  <include filename="world.sdf" required="*"/>
-  <include filename="model.sdf" required="*"/>
-  <include filename="actor.sdf" required="*"/>
-  <include filename="light.sdf" required="*"/>
-
-</element> <!-- End Gazebo -->
diff --git a/gazebo/sdf/1.2/geometry.sdf b/gazebo/sdf/1.2/geometry.sdf
deleted file mode 100644
index 5097d4c..0000000
--- a/gazebo/sdf/1.2/geometry.sdf
+++ /dev/null
@@ -1,108 +0,0 @@
-<!-- Geometry -->
-<element name="geometry" required="1">
-  <description>The shape of the visual or collision object.</description>
-
-  <element name="box" required="0">
-    <description>Box shape</description>
-    <element name="size" type="vector3" default="1 1 1" required="1">
-      <description>The three side lengths of the box. The origin of the box is in its geometric center (inside the center of the box).</description>
-    </element>
-  </element> <!-- End Box -->
-
-  <element name="sphere" required="0">
-    <description>Sphere shape</description>
-    <element name="radius" type="double" default="1" required="1">
-      <description>radius of the sphere</description>
-    </element>
-  </element> <!-- End Sphere -->
-
-  <element name="cylinder" required="0">
-    <description>Cylinder shape</description>
-    <element name="radius" type="double" default="1" required="1">
-      <description>Radius of the cylinder</description>
-    </element>
-    <element name="length" type="double" default="1" required="1">
-      <description>Length of the cylinder</description>
-    </element>
-  </element> <!-- End Cylinder -->
-
-  <element name="mesh" required="0">
-    <description>Mesh shape</description>
-    <element name="filename" type="string" default="__default__" required="0">
-      <description>Mesh filename. DEPRECATED</description>
-    </element>
-    <element name="uri" type="string" default="__default__" required="1">
-      <description>Mesh uri</description>
-    </element>
-    <element name="scale" type="vector3" default="1 1 1" required="0">
-      <description>Scaling factor applied to the mesh</description>
-    </element>
-  </element> <!-- End Mesh -->
-
-  <element name="plane" required="0">
-    <description>Plane shape</description>
-    <element name="normal" type="vector3" default="0 0 1" required="1">
-      <description>Normal direction for the plane</description>
-    </element>
-    <element name="size" type="vector2d" default="1 1" min="0 0" required="1">
-      <description>Length of each side of the plane</description> 
-    </element>
-  </element> <!-- End Plane -->
-
-  <element name="image" required="0">
-    <description>Extrude a set of boxes from a grayscale image.</description>
-    <element name="uri" type="string" default="__default__" required="1">
-      <description>URI of the grayscale image file</description>
-    </element>
-    <element name="scale" type="double" default="1" required="1">
-      <description>Scaling factor applied to the image</description>
-    </element>
-    <element name="threshold" type="int" default="200" required="1">
-      <description>Grayscale threshold</description>
-    </element>
-    <element name="height" type="double" default="1" required="1">
-      <description>Height of the extruded boxes</description>
-    </element>
-    <element name="granularity" type="int" default="1" required="1">
-      <description>The amount of error in the model</description>
-    </element>
-  </element> <!-- End Image -->
-
-  <element name="heightmap" required="0">
-    <description>A heightmap based on a 2d grayscale image.</description>
-    <element name="uri" type="string" default="__default__" required="1">
-      <description>URI to a grayscale image file</description>
-    </element>
-    <element name="size" type="vector3" default="1 1 1" required="1">
-      <description>The size of the heightmap in world units</description>
-    </element>
-    <element name="pos" type="vector3" default="0 0 0" required="0">
-      <description>A position offset.</description>
-    </element>
-
-    <element name="texture" required="*">
-      <description>The heightmap can contain multiple textures. The order of the texture matters. The first texture will appear at the lowest height, and the last texture at the highest hieght. Use blend to control the hieight thresholds and fade between textures.</description>
-      <element name="size" type="double" default="10" required="1">
-        <description>Size of the applied texture in meters.</description>
-      </element>
-      <element name="diffuse" type="string" default="__default__" required="1">
-        <description>Diffuse texture image filename</description>
-      </element>
-      <element name="normal" type="string" default="__default__" required="1">
-        <description>Normalmap texture image filename</description>
-      </element>
-    </element>
-    <element name="blend" required="*">
-      <description>The blend tag controls how two adjacent textures are mixed. The number of blend elements should equal one less than the number of textures.</description>
-      <element name="min_height" type="double" default="0" required="1">
-        <description>Min height of a blend layer</description>
-      </element>
-      <element name="fade_dist" type="double" default="0" required="1">
-        <description>Distance over which the blend occurs</description>
-      </element>
-    </element>
-  </element> <!-- End Heightmap -->
-  <element name="empty" required="0">
-    <description>You can use the empty tag to make empty geometries.</description>
-  </element> <!-- End empty -->
-</element><!-- End Geometry -->
diff --git a/gazebo/sdf/1.2/gripper.sdf b/gazebo/sdf/1.2/gripper.sdf
deleted file mode 100644
index 12fd0b3..0000000
--- a/gazebo/sdf/1.2/gripper.sdf
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Gripper -->
-<element name="gripper" required="*">
-  <description></description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description></description>
-  </attribute>
-
-  <element name="grasp_check" required="0">
-    <description></description>
-    <element name="detach_steps" type="int" default="40" required="0">
-      <description></description>
-    </element>
-    <element name="attach_steps" type="int" default="20" required="0">
-      <description></description>
-    </element>
-    <element name="min_contact_count" type="unsigned int" default="2" required="0">
-      <description></description>
-    </element>
-  </element>
-
-  <element name="gripper_link" type="string" default="__default__" required="+">
-    <description></description>
-  </element>
-
-  <element name="palm_link" type="string" default="__default__" required="1">
-    <description></description>
-  </element>
-
-</element>
diff --git a/gazebo/sdf/1.2/gui.sdf b/gazebo/sdf/1.2/gui.sdf
deleted file mode 100644
index 8300090..0000000
--- a/gazebo/sdf/1.2/gui.sdf
+++ /dev/null
@@ -1,39 +0,0 @@
-<!-- gui -->
-<element name="gui" required="0">
-  <attribute name="fullscreen" type="bool" default="false" required="0">
-    <description></description>
-  </attribute>
-
-  <element name="camera" required="0">
-    <description> </description>
-
-    <attribute name="name" type="string" default="user_camera" required="1">
-      <description></description>
-    </attribute>
-
-
-    <element name="view_controller" type="string" default="orbit" required="0">
-      <description></description>
-    </element>
-
-    <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-      <description></description>
-    </element>
-
-    <element name="track_visual" required="0">
-      <description></description>
-
-      <element name="name" type="string" default="__default__" required="1">
-        <description></description>
-      </element>
-
-      <element name="min_dist" type="double" default="0" required="0">
-        <description></description>
-      </element>
-
-      <element name="max_dist" type="double" default="0" required="0">
-        <description></description>
-      </element>
-    </element>
-  </element>
-</element>
diff --git a/gazebo/sdf/1.2/inertial.sdf b/gazebo/sdf/1.2/inertial.sdf
deleted file mode 100644
index 417489f..0000000
--- a/gazebo/sdf/1.2/inertial.sdf
+++ /dev/null
@@ -1,34 +0,0 @@
-<!-- Inertial -->
-<element name="inertial" required="0">
-  <description>The inertial properties of the link.</description>
-
-  <element name="mass" type="double" default="1.0" required="0">
-    <description>The mass of the link.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>This is the pose of the inertial reference frame, relative to the link reference frame. The origin of the inertial reference frame needs to be at the center of gravity. The axes of the inertial reference frame do not need to be aligned with the principal axes of the inertia.</description>
-  </element>
-
-  <element name="inertia" required="0">
-    <description>The 3x3 rotational inertia matrix. Because the rotational inertia matrix is symmetric, only 6 above-diagonal elements of this matrix are specified here, using the attributes ixx, ixy, ixz, iyy, iyz, izz.</description>
-    <element name="ixx" type="double" default="1.0" required="1">
-      <description></description>
-    </element>
-    <element name="ixy" type="double" default="0.0" required="1">
-      <description></description>
-    </element>
-    <element name="ixz" type="double" default="0.0" required="1">
-      <description></description>
-    </element>
-    <element name="iyy" type="double" default="1.0" required="1">
-      <description></description>
-    </element>
-    <element name="iyz" type="double" default="0.0" required="1">
-      <description></description>
-    </element>
-    <element name="izz" type="double" default="1.0" required="1">
-      <description></description>
-    </element>
-  </element> <!-- End Inertia -->
-</element> <!-- End Inertial -->
diff --git a/gazebo/sdf/1.2/joint.sdf b/gazebo/sdf/1.2/joint.sdf
deleted file mode 100644
index 8caedcb..0000000
--- a/gazebo/sdf/1.2/joint.sdf
+++ /dev/null
@@ -1,133 +0,0 @@
-<!-- Joint -->
-<element name="joint" required="*">
-  <description>A joint connections two links with kinematic and dynamic properties.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the joint within the scope of the model.</description>
-  </attribute>
-
-  <attribute name="type" type="string" default="__default__" required="1">
-    <description>The type of joint, which must be one of the following: (revolute) a hinge joint that rotates on a single axis with either a fixed or continuous range of motion, (revolute2) same as two revolute joints connected in series, (prismatic) a sliding joint that slides along an axis with a limited range specified by upper and lower limits, (ball) a ball and socket joint, (universal), like a ball joint, but constrains one degree of freedom, (piston) similar to a Slider joint exce [...]
-  </attribute>
-
-  <element name="parent" type="string" default="__default__" required="1">
-    <description>Name of the parent link</description>
-  </element> <!-- End Parent -->
-
-  <element name="child" type="string" default="__default__" required="1">
-    <description>Name of the child link</description>
-  </element> <!-- End Child -->
-
-  <element name="pose"  type="pose" default="0 0 0 0 0 0" required="0">
-    <description>offset from child link origin in child link frame.</description>
-  </element>
-
-  <element name="thread_pitch" type="double" default="1.0" required="0">
-    <description></description>
-  </element>
-
-  <element name="axis" required="1">
-    <description>The joint axis specified in the model frame. This is the axis of rotation for revolute joints, the axis of translation for prismatic joints. The axis is currently specified in the model frame of reference, but this will be changed to the joint frame in future version of sdf (see gazebo issue #494).</description>
-    <element name="xyz" type="vector3" default="0 0 1" required="1">
-      <description>Represents the x,y,z components of a vector. The vector should be normalized.</description>
-    </element>
-    <element name="dynamics" required="0">
-      <description>An element specifying physical properties of the joint. These values are used to specify modeling properties of the joint, particularly useful for simulation.</description>
-      <element name="damping" type="double" default="0" required="0">
-        <description>The physical velocity dependent viscous damping coefficient of the joint.</description>
-      </element>
-      <element name="friction" type="double" default="0" required="0">
-        <description>The physical static friction value of the joint.</description>
-      </element>
-    </element> <!-- End Dynamics -->
-    <element name="limit" required="1">
-      <description>specifies the limits of this joint</description>
-      <element name="lower" type="double" default="-1e16" required="1">
-        <description>An attribute specifying the lower joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="upper" type="double" default="1e16" required="1">
-        <description>An attribute specifying the upper joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="effort" type="double" default="0" required="0">
-        <description>(not implemented) An attribute for enforcing the maximum joint effort.</description>
-      </element>
-      <element name="velocity" type="double" default="0" required="0">
-        <description>(not implemented) An attribute for enforcing the maximum joint velocity.</description>
-      </element>
-    </element> <!-- End Limit -->
-  </element> <!-- End Axis -->
-
-  <element name="axis2" required="0">
-    <description>The second joint axis specified in the model frame. This is the second axis of rotation for revolute2 joints and universal joints. The axis is currently specified in the model frame of reference, but this will be changed to the joint frame in future version of sdf (see gazebo issue #494).</description>
-    <element name="xyz" type="vector3" default="0 0 1" required="1">
-      <description>Represents the x,y,z components of a vector. The vector should be normalized.</description>
-    </element>
-    <element name="dynamics" required="0">
-      <description>An element specifying physical properties of the joint. These values are used to specify modeling properties of the joint, particularly useful for simulation.</description>
-      <element name="damping" type="double" default="0" required="0">
-        <description>The physical velocity dependent viscous damping coefficient of the joint.</description>
-      </element>
-      <element name="friction" type="double" default="0" required="0">
-        <description>The physical static friction value of the joint.</description>
-      </element>
-    </element> <!-- End Dynamics -->
-
-    <element name="limit" required="0">
-      <description></description>
-      <element name="lower" type="double" default="-1e16" required="0">
-        <description>An attribute specifying the lower joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="upper" type="double" default="1e16" required="0">
-        <description>An attribute specifying the upper joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="effort" type="double" default="0" required="0">
-        <description>(not implemented) An attribute for enforcing the maximum joint effort.</description>
-      </element>
-      <element name="velocity" type="double" default="0" required="0">
-        <description>(not implemented) An attribute for enforcing the maximum joint velocity.</description>
-      </element>
-    </element> <!-- End Limit -->
-  </element> <!-- End Axis2 -->
-
-  <element name="physics" required="0">
-    <description>Parameters that are specific to a certain physics engine.</description>
-    <element name="ode" required="0">
-      <description>ODE specific parameters</description>
-      <element name="fudge_factor" type="double" default="0" required="0">
-        <description>Scale the excess for in a joint motor at joint limits. Should be between zero and one.</description>
-      </element>
-      <element name="cfm" type="double" default="0" required="0">
-        <description>Constraint force mixing used when not at a stop</description>
-      </element>
-      <element name="bounce" type="double" default="0" required="0">
-        <description>Bounciness of the limits</description>
-      </element>
-      <element name="max_force" type="double" default="0" required="0">
-        <description>Maximum force or torque used to reach the desired velocity.</description>
-      </element>
-      <element name="velocity" type="double" default="0" required="0">
-        <description>The desired velocity of the joint. Should only be set if you want the joint to move on load.</description>
-      </element>
-
-      <element name="limit" required="0">
-        <description></description>
-        <element name="cfm" type="double" default="0.0" required="1">
-          <description>Constraint force mixing parameter used by the joint stop</description>
-        </element>
-        <element name="erp" type="double" default="0.2" required="1">
-          <description>Error reduction parameter used by the joint stop</description>
-        </element>
-      </element>
-
-      <element name="suspension" required="0">
-        <description></description>
-        <element name="cfm" type="double" default="0.0" required="1">
-          <description>Suspension constraint force mixing parameter</description>
-        </element>
-        <element name="erp" type="double" default="0.2" required="1">
-          <description>Suspension error reduction parameter</description>
-        </element>
-      </element>
-    </element>
-  </element> <!-- End Physics -->
-</element> <!-- End Joint -->
diff --git a/gazebo/sdf/1.2/light.sdf b/gazebo/sdf/1.2/light.sdf
deleted file mode 100644
index 745308c..0000000
--- a/gazebo/sdf/1.2/light.sdf
+++ /dev/null
@@ -1,61 +0,0 @@
-<!-- Light -->
-<element name="light" required="*">
-  <description>The light element describes a light source.</description>
-
-  <attribute name="name" type="string" default="__default__" required="0">
-    <description>A unique name for the light.</description>
-  </attribute>
-
-  <attribute name="type" type="string" default="point" required="1">
-    <description>The light type: point, directional, spot.</description>
-  </attribute>
-
-  <element name="cast_shadows" type="bool" default="false" required="0">
-    <description>When true, the light will cast shadows.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the global coordinate frame for the light.</description>
-  </element>
-
-  <element name="diffuse" type="color" default="1 1 1 1" required="1">
-    <description>Diffuse light color</description>
-  </element>
-  <element name="specular" type="color" default=".1 .1 .1 1" required="1">
-    <description>Specular light color</description>
-  </element>
-
-  <element name="attenuation" required="0">
-    <description>Light attenuation</description>
-    <element name="range" type="double" default="10" required="1">
-      <description>Range of the light</description>
-    </element>
-    <element name="linear" type="double" default="1" required="0">
-      <description>The linear attenuation factor: 1 means attenuate evenly over the distance.</description>
-    </element>
-    <element name="constant" type="double" default="1" required="0">
-      <description>The constant attenuation factor: 1.0 means never attenuate, 0.0 is complete attenutation.</description>
-    </element>
-    <element name="quadratic" type="double" default="0" required="0">
-      <description>The quadratic attenuation factor: adds a curvature to the attenuation.</description>
-    </element>
-  </element> <!-- End Attenuation -->
-
-  <element name="direction" type="vector3" default="0 0 -1" required="1">
-    <description>Direction of the light, only applicable for spot and directional lights.</description>
-  </element><!-- End Directional -->
-
-  <element name="spot" required="0">
-    <description>Spot light parameters</description>
-    <element name="inner_angle" type="double" default="0" required="1">
-      <description>Angle covered by the bright inner cone</description>
-    </element>
-    <element name="outer_angle" type="double" default="0" required="1">
-      <description>Angle covered by the outer cone</description>
-    </element>
-    <element name="falloff" type="double" default="0" required="1">
-      <description>The rate of falloff between the inner and outer cones. 1.0 means a linear falloff, less means slower falloff, higher means faster falloff.</description>
-    </element>
-  </element> <!-- End Spot -->
-
-</element> <!-- End Light -->
diff --git a/gazebo/sdf/1.2/link.sdf b/gazebo/sdf/1.2/link.sdf
deleted file mode 100644
index 24f7a3c..0000000
--- a/gazebo/sdf/1.2/link.sdf
+++ /dev/null
@@ -1,41 +0,0 @@
-<!-- Link -->
-<element name="link" required="+">
-  <description>A physical link with inertia, collision, and visual properties. A link must be a child of a model, and any number of links may exist in a model.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the link within the scope of the model.</description>
-  </attribute>
-
-  <element name="gravity" type="bool" default="true" required="0">
-    <description>If true, the link is affected by gravity.</description>
-  </element>
-
-  <element name="self_collide" type="bool" default="false" required="0">
-    <description>If true, the link can collide with other links in the model.</description>
-  </element>
-
-  <element name="kinematic" type="bool" default="false" required="0">
-    <description>If true, the link is kinematic only</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>This is the pose of the link reference frame, relative to the model reference frame.</description>
-  </element>
-
-  <element name="velocity_decay" required="1">
-    <description>Exponential damping of the link's velocity.</description>
-    <element name="linear" type="double" default="0.0" required="1">
-      <description>Linear damping</description>
-    </element>
-    <element name="angular" type="double" default="0.0" required="1">
-      <description>Angular damping</description>
-    </element>
-  </element> <!-- End velocity decay -->
-
-  <include filename="inertial.sdf" required="0"/>
-  <include filename="collision.sdf" required="*"/>
-  <include filename="visual.sdf" required="*"/>
-  <include filename="sensor.sdf" required="*"/>
-  <include filename="projector.sdf" required="*"/>
-
-</element> <!-- End Link -->
diff --git a/gazebo/sdf/1.2/model.sdf b/gazebo/sdf/1.2/model.sdf
deleted file mode 100644
index 2ec8b59..0000000
--- a/gazebo/sdf/1.2/model.sdf
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Model -->
-<element name="model" required="*">
-  <description>The model element defines a complete robot or any other physical object.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the model. This name must not match another model in the world.</description>
-  </attribute>
-
-  <element name="static" type="bool" default="false" required="0">
-    <description>If set to true, the model is immovable. Otherwise the model is simulated in the dynamics engine.</description>
-  </element>
-
-  <element name="allow_auto_disable" type="bool" default="true" required="0">
-    <description>Allows a model to auto-disable, which is means the physics engine can skip updating the model when the model is at rest. This parameter is only used by models with no joints.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the global coordinate frame for the model. Position(x,y,z) and rotation (roll, pitch yaw) in the global coordinate frame.</description>
-  </element>
-
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="gripper.sdf" required="*"/>
-
-</element> <!-- End Model -->
diff --git a/gazebo/sdf/1.2/physics.sdf b/gazebo/sdf/1.2/physics.sdf
deleted file mode 100644
index 5db00e7..0000000
--- a/gazebo/sdf/1.2/physics.sdf
+++ /dev/null
@@ -1,65 +0,0 @@
-<!-- Physics -->
-<element name="physics" required="1">
-  <description>The physics tag specifies the type and properties of the dynamics engine.</description>
-
-  <attribute name="type" type="string" default="ode" required="1">
-    <description>The type of the dynamics engine. Currently must be set to ode</description>
-  </attribute>
-
-  <element name="update_rate" type="double" default="1000" required="1">
-    <description>Rate at which to update the physics engine</description>
-  </element>
-
-  <element name="max_contacts" type="int" default="20" required="0">
-    <description>Maximum number of contacts allowed between two entities. This value can be over ridden by a max_contacts element in a collision element.</description>
-  </element>
-
-  <element name="gravity" type="vector3" default="0 0 -9.8" required="1">
-    <description>The gravity vector</description>
-  </element> <!-- End Gravity -->
-
-  <element name="bullet" required="0">
-    <description>Bullet specific physics properties</description>
-    <element name="dt" type="double" default="0.003" required="1">
-      <description>Time step</description>
-    </element>
-  </element>
-
-  <element name="ode" required="0">
-    <description>ODE specific physics properties</description>
-    <element name="solver" required="1">
-      <description></description>
-      <element name="type" type="string" default="quick" required="1">
-        <description>One of the following types: world, quick</description>
-      </element>
-      <element name="dt" type="double" default="0.001" required="1">
-        <description>The time duration which advances with each iteration of the dynamics engine.</description>
-      </element>
-      <element name="iters" type="int" default="50" required="1">
-        <description>Number of iterations for each step. A higher number produces greater accuracy at a performance cost.</description>
-      </element>
-      <element name="precon_iters" type="int" default="0" required="0">
-        <description></description>
-      </element>
-      <element name="sor" type="double" default="1.3" required="1">
-        <description>Set the successive over-relaxation parameter.</description>
-      </element>
-    </element> <!-- End Solver -->
-
-    <element name="constraints" required="1">
-      <description></description>
-      <element name="cfm" type="double" default="0" required="1">
-        <description>Constraint force mixing parameter. See the ODE page for more information.</description>
-      </element>
-      <element name="erp" type="double" default="0.2" required="1">
-        <description>Error reduction parameter. See the ODE page for more information.</description>
-      </element>
-      <element name="contact_max_correcting_vel" type="double" default="100.0" required="1">
-        <description>The maximum correcting velocities allowed when resolving contacts.</description>
-      </element>
-      <element name="contact_surface_layer" type="double" default="0.001" required="1">
-        <description>The depth of the surface layer around all geometry objects. Contacts are allowed to sink into the surface layer up to the given depth before coming to rest. The default value is zero. Increasing this to some small value (e.g. 0.001) can help prevent jittering problems due to contacts being repeatedly made and broken.</description>
-      </element>
-    </element> <!-- End Constraints -->
-  </element> <!-- ODE -->
-</element> <!-- Physics -->
diff --git a/gazebo/sdf/1.2/plugin.sdf b/gazebo/sdf/1.2/plugin.sdf
deleted file mode 100644
index 26405ff..0000000
--- a/gazebo/sdf/1.2/plugin.sdf
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- Plugin -->
-<element name="plugin" required="*">
-  <description>A plugin is a dynamically loaded chunk of code. It can exist as a child of world, model, and sensor.</description>
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the plugin, scoped to its parent.</description>
-  </attribute>
-  <attribute name="filename" type="string" default="__default__" required="1">
-    <description>Name of the shared library to load. If the filename is not a full path name, the file will be searched for in the configuration paths.</description>
-  </attribute>
-  <element copy_data="true" required="*">
-    <description>This is a special element that should not be specified in an SDF file. It automatically copies child elements into the SDF element so that a plugin can access the data.</description>
-  </element>
-</element> <!-- End Plugin -->
diff --git a/gazebo/sdf/1.2/projector.sdf b/gazebo/sdf/1.2/projector.sdf
deleted file mode 100644
index 9eabca9..0000000
--- a/gazebo/sdf/1.2/projector.sdf
+++ /dev/null
@@ -1,32 +0,0 @@
-<!-- Projector -->
-<element name="projector" required="0">
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Name of the projector</description>
-  </attribute>
-
-  <element name="texture" type="string" default="__default__" required="1">
-    <description>Texture name</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>Pose of the projector</description>
-  </element>
-
-
-  <element name="fov" type="double" default="0.785" required="0">
-    <description>Field of view</description>
-  </element>
-
-
-  <element name="near_clip" type="double" default="0.1" required="0">
-    <description>Near clip distance</description>
-  </element>
-
-
-  <element name="far_clip" type="double" default="10.0" required="0">
-    <description>far clip distance</description>
-  </element>
-
-
-  <include filename="plugin.sdf" required="*"/>
-</element>
diff --git a/gazebo/sdf/1.2/ray.sdf b/gazebo/sdf/1.2/ray.sdf
deleted file mode 100644
index c56c993..0000000
--- a/gazebo/sdf/1.2/ray.sdf
+++ /dev/null
@@ -1,60 +0,0 @@
-<element name="ray" required="0">
-  <description>These elements are specific to the ray (laser) sensor.</description>
-
-  <element name="scan" required="1">
-    <description></description>
-    <element name="horizontal" required="1">
-      <description></description>
-
-      <element name="samples" type="unsigned int" default="640" required="1">
-        <description>The number of simulated rays to generate per complete laser sweep cycle.</description>
-      </element>
-
-      <element name="resolution" type="double" default="1" required="1">
-        <description>This number is multiplied by samples to determine the number of range data points returned. If resolution is less than one, range data is interpolated. If resolution is greater than one, range data is averaged.</description>
-      </element>
-
-      <element name="min_angle" type="double" default="0" required="1">
-        <description></description>
-      </element>
-
-      <element name="max_angle" type="double" default="0" required="1">
-        <description>Must be greater or equal to min_angle</description>
-      </element>
-
-    </element> <!-- End Horizontal -->
-
-    <element name="vertical" required="0">
-      <description></description>
-      <element name="samples" type="unsigned int" default="1" required="1">
-        <description>The number of simulated rays to generate per complete laser sweep cycle.</description>
-      </element>
-
-      <element name="resolution" type="double" default="1" required="0">
-        <description>This number is multiplied by samples to determine the number of range data points returned. If resolution is less than one, range data is interpolated. If resolution is greater than one, range data is averaged.</description>
-      </element>
-
-      <element name="min_angle" type="double" default="0" required="1">
-        <description></description>
-      </element>
-
-      <element name="max_angle" type="double" default="0" required="1">
-        <description>Must be greater or equal to min_angle</description>
-      </element>
-
-    </element> <!-- End Vertical -->
-  </element> <!-- End Scan -->
-
-  <element name="range" required="1">
-    <description>specifies range properties of each simulated ray</description>
-    <element name="min" type="double" default="0" required="1">
-      <description>The minimum distance for each ray.</description>
-    </element>
-    <element name="max" type="double" default="0" required="1">
-      <description>The maximum distance for each ray.</description>
-    </element>
-    <element name="resolution" type="double" default="0" required="0">
-      <description>Linear resolution of each ray.</description>
-    </element>
-  </element> <!-- End Range -->
-</element> <!-- End Ray -->
diff --git a/gazebo/sdf/1.2/rfid.sdf b/gazebo/sdf/1.2/rfid.sdf
deleted file mode 100644
index 61351dd..0000000
--- a/gazebo/sdf/1.2/rfid.sdf
+++ /dev/null
@@ -1,2 +0,0 @@
-<element name="rfidtag" required="0">
-</element> <!-- End rfidtag -->
diff --git a/gazebo/sdf/1.2/rfidtag.sdf b/gazebo/sdf/1.2/rfidtag.sdf
deleted file mode 100644
index 55699dc..0000000
--- a/gazebo/sdf/1.2/rfidtag.sdf
+++ /dev/null
@@ -1,2 +0,0 @@
-<element name="rfid" required="0">
-</element> <!-- End RFID -->
diff --git a/gazebo/sdf/1.2/road.sdf b/gazebo/sdf/1.2/road.sdf
deleted file mode 100644
index 3549b24..0000000
--- a/gazebo/sdf/1.2/road.sdf
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Model -->
-<element name="road" required="*">
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Name of the road</description>
-  </attribute>
-
-  <element name="width" type="double" default="1.0" required="1">
-    <description>Width of the road</description>
-  </element>
-
-  <element name="point" type="vector3" default="0 0 0" required="+">
-    <description>A series of points define the path of the road.</description>
-  </element>
-
-</element>
diff --git a/gazebo/sdf/1.2/scene.sdf b/gazebo/sdf/1.2/scene.sdf
deleted file mode 100644
index 7fc76ec..0000000
--- a/gazebo/sdf/1.2/scene.sdf
+++ /dev/null
@@ -1,78 +0,0 @@
-<!-- Scene -->
-<element name="scene" required="1">
-  <description>Specifies the look of the environment.</description>
-
-  <element name="ambient" type="color" default="0.0 0.0 0.0 1.0" required="1">
-    <description>Color of the ambient light.</description>
-  </element>
-
-  <element name="background" type="color" default=".7 .7 .7 1" required="1">
-    <description>Color of the background.</description>
-  </element>
-
-  <element name="sky" required="0">
-    <description>Properties for the sky</description>
-    <element name="time" type="double" default="10.0" required="0">
-      <description>Time of day [0..24]</description>
-    </element>
-    <element name="sunrise" type="double" default="6.0" required="0">
-      <description>Sunrise time [0..24]</description>
-    </element>
-    <element name="sunset" type="double" default="20.0" required="0">
-      <description>Sunset time [0..24]</description>
-    </element>
-
-    <element name="clouds" required="0">
-      <description>Sunset time [0..24]</description>
-      <element name="speed" type="double" default="0.6" min="0.0" required="0">
-        <description>Speed of the clouds</description>
-      </element>
-
-      <element name="direction" type="double" default="0.0"
-               min="0.0" max="3.1456" required="0">
-        <description>Direction of the cloud movement</description>
-      </element>
-      <element name="humidity" type="double" default="0.5"
-               min="0" max="1" required="0">
-        <description>Density of clouds</description>
-      </element>
-
-      <element name="mean_size" type="double" default="0.5"
-               min="0" max="1" required="0">
-        <description>Average size of the clouds</description>
-      </element>
-
-      <element name="ambient" type="color" default=".8 .8 .8 1" required="0">
-        <description>Ambient cloud color</description>
-      </element>
-    </element>
-  </element>
-
-  <element name="shadows" type="bool" default="true" required="1">
-    <description>Enable/disable shadows</description>
-   </element>
-
-  <element name="fog" required="0">
-    <description>Controls fog</description>
-    <element name="color" type="color" default="1 1 1 1" required="0">
-      <description>Fog color</description>
-    </element>
-    <element name="type" type="string" default="none" required="0">
-      <description>Fog type: constant, linear, quadratic</description>
-    </element>
-    <element name="start" type="double" default="1.0" min="0.0" required="0">
-      <description>Distance to start of fog</description>
-    </element>
-    <element name="end" type="double" default="100.0" min="0.0" required="0">
-      <description>Distance to end of fog</description>
-    </element>
-    <element name="density" type="double" default="1.0" min="0.0" required="0">
-      <description>Density of fog</description>
-    </element>
-  </element>
-
-  <element name="grid" type="bool" default="true" required="0">
-    <description>Enable/disable the grid</description>
-  </element>
-
-</element> <!-- End Scene -->
diff --git a/gazebo/sdf/1.2/sensor.sdf b/gazebo/sdf/1.2/sensor.sdf
deleted file mode 100644
index 75dafc4..0000000
--- a/gazebo/sdf/1.2/sensor.sdf
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- Sensor -->
-<element name="sensor" required="0">
-  <description>The sensor tag describes the type and properties of a sensor.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the sensor. This name must not match another model in the model.</description>
-  </attribute>
-
-  <attribute name="type" type="string" default="__default__" required="1">
-    <description>The type name of the sensor. By default, gazebo supports types camera, depth, stereocamera, contact, imu, ir and ray.</description>
-  </attribute>
-
-  <element name="always_on" type="bool" default="false" required="0">
-    <description>If true the sensor will always be updated according to the update rate.</description>
-  </element>
-
-  <element name="update_rate" type="double" default="0" required="0">
-    <description>The frequency at which the sensor data is generated. If left unspecified, the sensor will generate data every cycle.</description>
-  </element>
-
-  <element name="visualize" type="bool" default="false" required="0">
-    <description>If true, the sensor is visualized in the GUI</description>
-  </element>
-
-  <element name="pose"  type="pose" default="0 0 0 0 0 0" required="0">
-    <description>This is the pose of the sensor, relative to the parent link reference frame.</description>
-  </element>
-
-  <element name="topic" type="string" default="__default" required="0">
-    <description>Name of the topic on which data is published. This is necessary for visualization</description>
-  </element>
-
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="camera.sdf" required="0"/>
-  <include filename="ray.sdf" required="0"/>
-  <include filename="contact.sdf" required="0"/>
-  <include filename="rfid.sdf" required="0"/>
-  <include filename="rfidtag.sdf" required="0"/>
-
-</element> <!-- End Sensor -->
diff --git a/gazebo/sdf/1.2/state.sdf b/gazebo/sdf/1.2/state.sdf
deleted file mode 100644
index 8bad67f..0000000
--- a/gazebo/sdf/1.2/state.sdf
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- State Info -->
-<element name="state" required="*">
-  <!-- Name of the world this state applies to -->
-  <attribute name="world_name" type="string" default="__default__" required="1">
-    <description>Name of the world this state applies to</description>
-  </attribute>
-
-  <element name="sim_time" type="time" default="0 0" required="0">
-    <description>Simulation time stamp of the state [seconds nanoseconds]</description>
-  </element>
-
-  <element name="wall_time" type="time" default="0 0" required="0">
-    <description>Wall time stamp of the state [seconds nanoseconds]</description>
-  </element>
-
-  <element name="real_time" type="time" default="0 0" required="0">
-    <description>Real time stamp of the state [seconds nanoseconds]</description>
-  </element>
-
-  <!-- State information for a model -->
-  <element name="model" required="+">
-    <description>Model state</description>
-
-    <attribute name="name" type="string" default="__default__" required="1">
-      <description>Name of the model</description>
-    </attribute>
-
-    <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-      <description>Pose of the model</description>
-    </element>
-
-    <element name="joint" required="*">
-      <description>Joint angle</description>
-
-      <attribute name="name" type="string" default="__default__" required="1">
-        <description>Name of the joint</description>
-      </attribute>
-
-      <element name="angle" type="double" default="0" required="+">
-        <attribute name="axis" type="unsigned int" default="0" required="1">
-          <description>Index of the axis.</description>
-        </attribute>
-
-        <description>Angle of an axis</description>
-      </element>
-    </element>
-
-    <!-- State information for a link -->
-    <element name="link" required="*">
-      <description>Link state</description>
-
-      <attribute name="name" type="string" default="__default__" required="1">
-        <description>Name of the link</description>
-      </attribute>
-
-      <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-        <description>Pose of the link relative to the model</description>
-      </element>
-
-      <element name="velocity" type="pose" default="0 0 0 0 0 0" required="0">
-        <description>Velocity of the link</description>
-      </element>
-
-      <element name="acceleration" type="pose"
-              default="0 0 0 0 0 0" required="0">
-        <description>Acceleration of the link</description>
-      </element>
-
-      <element name="wrench" type="pose" default="0 0 0 0 0 0" required="0">
-        <description>Force applied to the link</description>
-      </element>
-
-      <element name="collision" required="*">
-        <description>Collision state</description>
-
-        <attribute name="name" type="string" default="__default__" required="1">
-          <description>Name of the collision</description>
-        </attribute>
-
-        <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-          <description>Pose of the link relative to the model</description>
-        </element>
-      </element>
-
-
-    </element> <!-- End Link -->
-  </element> <!-- End Model -->
-</element> <!-- End State -->
diff --git a/gazebo/sdf/1.2/surface.sdf b/gazebo/sdf/1.2/surface.sdf
deleted file mode 100644
index 7dcbfb0..0000000
--- a/gazebo/sdf/1.2/surface.sdf
+++ /dev/null
@@ -1,59 +0,0 @@
-<element name="surface" required="0">
-  <description>The surface parameters</description>
-  <element name="bounce" required="0">
-    <description></description>
-    <element name="restitution_coefficient" type="double" default="0" min="0.0" max="1.0" required="0">
-      <description>Bounciness coefficient of restitution, from [0...1], where 0=no bounciness.</description>
-    </element>
-    <element name="threshold" type="double" default="100000" required="0">
-      <description>Bounce velocity threshold, below which effective coefficient of restitution is 0.</description>
-    </element>
-  </element> <!-- End Bounce -->
-
-  <element name="friction" required="0">
-    <description></description>
-    <element name="ode" required="0">
-      <description>ODE friction parameters</description>
-      <element name="mu" type="double" default="-1" min="0.0" max="1.0" required="0">
-        <description>Coefficient of friction in the range of [0..1].</description>
-      </element>
-      <element name="mu2" type="double" default="-1" min="0.0" max="1.0" required="0">
-        <description>Second coefficient of friction in the range of [0..1]</description>
-      </element>
-      <element name="fdir1" type="vector3" default="0 0 0" required="0">
-        <description>3-tuple specifying direction of mu1 in the collision local reference frame.</description>
-      </element>
-      <element name="slip1" type="double" default="0.0" min="0.0" max="1.0" required="0">
-        <description>Force dependent slip direction 1 in collision local frame, between the range of [0..1].</description>
-      </element>
-      <element name="slip2" type="double" default="0.0" min="0.0" max="1.0" required="0">
-        <description>Force dependent slip direction 2 in collision local frame, between the range of [0..1].</description>
-      </element>
-    </element> <!-- End ODE -->
-  </element> <!-- End Friction -->
-
-  <element name="contact" required="0">
-    <description></description>
-    <element name="ode" required="0">
-      <description>ODE contact parameters</description>
-      <element name="soft_cfm" type="double" default="0" required="0">
-        <description>Soft constraint force mixing.</description>
-      </element>
-      <element name="soft_erp" type="double" default="0.2" required="0">
-        <description>Soft error reduction parameter</description>
-      </element>
-      <element name="kp" type="double" default="1000000000000.0" required="0">
-        <description>dynamically "stiffness"-equivalent coefficient for contact joints</description>
-      </element>
-      <element name="kd" type="double" default="1.0" required="0">
-        <description>dynamically "damping"-equivalent coefficient for contact joints</description>
-      </element>
-      <element name="max_vel" type="double" default="0.01" required="0">
-        <description>maximum contact correction velocity truncation term.</description>
-      </element>
-      <element name="min_depth" type="double" default="0" required="0">
-        <description>minimum allowable depth before contact correction impulse is applied</description>
-      </element>
-    </element> <!-- End ODE -->
-  </element> <!-- End Contact -->
-</element> <!-- End Surface -->
diff --git a/gazebo/sdf/1.2/urdf.sdf b/gazebo/sdf/1.2/urdf.sdf
deleted file mode 100644
index 6068d5c..0000000
--- a/gazebo/sdf/1.2/urdf.sdf
+++ /dev/null
@@ -1,19 +0,0 @@
-<!-- Robot URDF -->
-<element name="robot" required="*">
-  <description>The robot element defines a complete robot or any other physical object using URDF.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the model. This name must not match another model in the world.</description>
-  </attribute>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the global coordinate frame for the model. Position(x,y,z) and rotation (roll, pitch yaw) in the global coordinate frame.</description>
-  </element>
-
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="gripper.sdf" required="*"/>
-
-</element> <!-- End Model -->
-
diff --git a/gazebo/sdf/1.2/visual.sdf b/gazebo/sdf/1.2/visual.sdf
deleted file mode 100644
index 8577006..0000000
--- a/gazebo/sdf/1.2/visual.sdf
+++ /dev/null
@@ -1,71 +0,0 @@
-<!-- Visual -->
-<element name="visual" required="*">
-  <description>The visual properties of the link. This element specifies the shape of the object (box, cylinder, etc.) for visualization purposes.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Unique name for the visual element within the scope of the parent link.</description>
-  </attribute>
-
-  <element name="cast_shadows" type="bool" default="true" required="0">
-    <description>If true the visual will cast shadows.</description>
-  </element>
-
-  <element name="laser_retro" type="double" default="0.0" required="0">
-    <description>will be implemented in the future release.</description>
-  </element>
-
-  <element name="transparency" type="double" default="0.0" required="0">
-    <description>The amount of transparency( 0=opaque, 1 = fully transparent)</description>
-  </element>
-  
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>Origin of the visual relative to its parent.</description>
-  </element>
-
-  <element name="material" required="0">
-    <description>The material of the visual element.</description>
-
-    <element name="script" required="0">
-      <description>Name of material from an installed script file. This will override the color element if the script exists.</description>
-
-      <element name="uri" type="string" default="__default__" required="0">
-        <description>URI of the material script file</description>
-      </element>
-
-      <element name="name" type="string" default="__default__" required="1">
-        <description>Name of the script within the script file</description>
-      </element>
-    </element>
-
-    <element name="shader" required="0">
-      <description></description>
-
-      <attribute name="type" type="string" default="pixel" required="1">
-        <description>vertex, pixel, normal_map_objectspace, normal_map_tangentspace</description>
-      </attribute>
-
-      <element name="normal_map" type="string" default="__default__" required="0">
-        <description>filename of the normal map</description>
-      </element>
-    </element>
-
-    <element name="ambient" type="color" default="0 0 0 1" required="0">
-      <description>The ambient color of a material specified by set of four numbers representing red/green/blue, each in the range of [0,1].</description>
-    </element>
-
-    <element name="diffuse"  type="color" default="0 0 0 1" required="0">
-      <description>The diffuse color of a material specified by set of four numbers representing red/green/blue/alpha, each in the range of [0,1].</description>
-    </element>
-
-    <element name="specular" type="color" default="0 0 0 1" required="0">
-      <description>The specular color of a material specified by set of four numbers representing red/green/blue/alpha, each in the range of [0,1].</description>
-    </element>
-
-    <element name="emissive" type="color" default="0 0 0 1" required="0">
-      <description>The emissive color of a material specified by set of four numbers representing red/green/blue, each in the range of [0,1].</description>
-    </element>
-  </element> <!-- End Material -->
-
-  <include filename="geometry.sdf" required="1"/>
-  <include filename="plugin.sdf" required="*"/>
-</element> <!-- End Visual -->
diff --git a/gazebo/sdf/1.2/world.sdf b/gazebo/sdf/1.2/world.sdf
deleted file mode 100644
index 30d0990..0000000
--- a/gazebo/sdf/1.2/world.sdf
+++ /dev/null
@@ -1,20 +0,0 @@
-<element name="world" required="*">
-  <description>The world element encapsulates an entire world description including: models, scene, physics, joints, and plugins</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Unique name of the world</description>
-  </attribute>
-
-  <include filename="gui.sdf" required="0"/>
-  <include filename="physics.sdf" required="1"/>
-  <include filename="scene.sdf" required="1"/>
-  <include filename="light.sdf" required="*"/>
-
-  <include filename="model.sdf" required="*"/>
-  <include filename="actor.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="road.sdf" required="*"/>
-
-  <include filename="state.sdf" required="*"/>
-</element> <!-- End World -->
diff --git a/gazebo/sdf/1.3/1_2.convert b/gazebo/sdf/1.3/1_2.convert
deleted file mode 100644
index 7eae5f7..0000000
--- a/gazebo/sdf/1.3/1_2.convert
+++ /dev/null
@@ -1,2 +0,0 @@
-<convert name="gazebo">
-</convert> <!-- End SDF -->
diff --git a/gazebo/sdf/1.3/CMakeLists.txt b/gazebo/sdf/1.3/CMakeLists.txt
deleted file mode 100644
index c0047a4..0000000
--- a/gazebo/sdf/1.3/CMakeLists.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-set (sdfs
-  1_2.convert
-  actor.sdf 
-  camera.sdf
-  collision.sdf 
-  contact.sdf
-  geometry.sdf 
-  gripper.sdf
-  gui.sdf
-  imu.sdf
-  inertial.sdf 
-  joint.sdf 
-  light.sdf 
-  link.sdf 
-  model.sdf 
-  physics.sdf 
-  plugin.sdf 
-  projector.sdf
-  ray.sdf
-  rfidtag.sdf
-  rfid.sdf
-  road.sdf
-  root.sdf 
-  scene.sdf 
-  sensor.sdf 
-  state.sdf
-  surface.sdf 
-  visual.sdf 
-  world.sdf
-)
-
-install(FILES ${sdfs} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/sdf/1.3)
diff --git a/gazebo/sdf/1.3/actor.sdf b/gazebo/sdf/1.3/actor.sdf
deleted file mode 100644
index d90c523..0000000
--- a/gazebo/sdf/1.3/actor.sdf
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- Actor -->
-<element name="actor" required="*">
-  <description></description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description></description>
-  </attribute>
-
-  <attribute name="static" type="bool" default="false" required="0">
-    <description></description>
-  </attribute>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>Origin of the actor</description>
-  </element>
-
-  <element name="skin" required="1">
-    <description></description>
-
-    <element name="filename" type="string" default="__default__" required="1">
-      <description></description>
-    </element>
-
-    <element name="scale" type="double" default="1.0" required="0"> 
-      <description></description>
-    </element>
-  </element> <!-- End Skin -->
-
-  <element name="animation" required="+">
-    <description></description>
-
-    <attribute name="name" type="string" default="__default__" required="1">
-      <description></description>
-    </attribute>
-
-    <element name="filename" type="string" default="__default__" required="1">
-      <description></description>
-    </element>
-    <element name="scale" type="double" default="1.0" required="0">
-      <description></description>
-    </element>
-    <element name="interpolate_x" type="bool" default="false" required="0">
-      <description></description>
-    </element>
-  </element> <!-- End Animation -->
-
-  <element name="script" required="1">
-    <description></description>
-
-    <element name="loop" type="bool" default="true" required="0">
-      <description></description>
-    </element>
-
-    <element name="delay_start" type="double" default="0.0" required="0">
-      <description></description>
-    </element>
-
-    <element name="auto_start" type="bool" default="true" required="0">
-      <description></description>
-    </element>
-
-    <element name="trajectory" required="*">
-      <description></description>
-      <attribute name="id" type="int" default="0" required="1">
-        <description></description>
-      </attribute>
-
-      <attribute name="type" type="string" default="__default__" required="1">
-        <description></description>
-      </attribute>
-
-      <element name="waypoint" required="*">
-        <description></description>
-        <element name="time" type="double" default="0.0" required="1">
-          <description></description>
-        </element>
-        <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-          <description></description>
-        </element>
-      </element> <!-- End Waypoint -->
-    </element> <!-- End Action -->
-  </element> <!-- End Script -->
-  
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-
-</element> <!-- End Actor -->
diff --git a/gazebo/sdf/1.3/camera.sdf b/gazebo/sdf/1.3/camera.sdf
deleted file mode 100644
index 0983c8b..0000000
--- a/gazebo/sdf/1.3/camera.sdf
+++ /dev/null
@@ -1,58 +0,0 @@
-<element name="camera" required="0">
-  <description>These elements are specific to camera sensors.</description>
-
-  <attribute name="name" type="string" default="__default__" required="0">
-    <description>An optional name for the camera.</description>
-  </attribute>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the parent coordinate frame for the camera.</description>
-  </element>
-
-  <element name="horizontal_fov" type="double" default="1.047" min="0.1" max="1.5708" required="1">
-    <description>Horizontal field of view</description>
-  </element> <!-- End Horizontal_FOV -->
-
-  <element name="image" required="1">
-    <description>The image size in pixels and format.</description>
-    <element name="width" type="int" default="320" required="1">
-      <description>Width in pixels</description>
-    </element>
-    <element name="height" type="int" default="240" required="1">
-      <description>Height in pixels </description>
-    </element>
-    <element name="format" type="string" default="R8G8B8" required="0">
-      <description>(L8|R8G8B8|B8G8R8|BAYER_RGGB8|BAYER_BGGR8|BAYER_GBRG8|BAYER_GRBG8)</description>
-    </element>
-  </element> <!-- End Image -->
-
-  <element name="clip" required="1">
-    <description>The near and far clip planes. Objects closer or farther than these planes are not rendered.</description>
-
-    <element name="near" type="double" default=".1" min="0.0" required="1">
-      <description>Near clipping plane</description>
-    </element>
-
-    <element name="far" type="double" default="100" min="10.0" required="1">
-      <description>Far clipping plane</description>
-    </element>
-  </element> <!-- End Clip -->
-
-  <element name="save" required="0">
-    <description>Enable or disable saving of camera frames.</description>
-    <attribute name="enabled" type="bool" default="false" required="1">
-      <description>True = saving enabled</description>
-    </attribute>
-    <element name="path" type="string" default="__default__" required="1">
-      <description>The path name which will hold the frame data. If path name is relative, then directory is relative to current working directory.</description>
-    </element>
-  </element> <!-- End Save -->
-
-  <element name="depth_camera" required="0">
-    <description>Depth camera parameters</description>
-    <element name="output" type="string" default="depths" required="1">
-      <description>Type of output</description>
-    </element>
-  </element> <!-- End depth_camera -->
-
-</element> <!-- End Camera -->
diff --git a/gazebo/sdf/1.3/collision.sdf b/gazebo/sdf/1.3/collision.sdf
deleted file mode 100644
index 051732d..0000000
--- a/gazebo/sdf/1.3/collision.sdf
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Collision -->
-<element name="collision" required="*">
-  <description>The collision properties of a link. Note that this can be different from the visual properties of a link, for example, simpler collision models are often used to reduce computation time.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Unique name for the collision element within the scope of the parent link.</description>
-  </attribute>
-
-  <element name="laser_retro" type="double" default="0" required="0">
-    <description>intensity value returned by laser sensor.</description>
-  </element>
-
-  <element name="max_contacts" type="int" default="10" required="0">
-    <description>Maximum number of contacts allowed between two entities. This value overrides the max_contacts element defined in physics.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>The reference frame of the collision element, relative to the reference frame of the link.</description>
-  </element>
-
-  <include filename="geometry.sdf" required="1"/>
-  <include filename="surface.sdf" required="0"/>
-
-</element> <!-- End Collision -->
diff --git a/gazebo/sdf/1.3/contact.sdf b/gazebo/sdf/1.3/contact.sdf
deleted file mode 100644
index d1cde50..0000000
--- a/gazebo/sdf/1.3/contact.sdf
+++ /dev/null
@@ -1,12 +0,0 @@
-<element name="contact" required="0">
-  <description>These elements are specific to the contact sensor.</description>
-
-  <element name="collision" type="string" default="__default__" required="1">
-    <description>name of the collision element within a link that acts as the contact sensor.</description>
-  </element> <!-- End Collision -->
-
-  <element name="topic" type="string" default="__default_topic__" required="1">
-    <description>Topic on which contact data is published.</description>
-  </element>
-
-</element> <!-- End Contact -->
diff --git a/gazebo/sdf/1.3/geometry.sdf b/gazebo/sdf/1.3/geometry.sdf
deleted file mode 100644
index 2e74e19..0000000
--- a/gazebo/sdf/1.3/geometry.sdf
+++ /dev/null
@@ -1,116 +0,0 @@
-<!-- Geometry -->
-<element name="geometry" required="1">
-  <description>The shape of the visual or collision object.</description>
-
-  <element name="box" required="0">
-    <description>Box shape</description>
-    <element name="size" type="vector3" default="1 1 1" required="1">
-      <description>The three side lengths of the box. The origin of the box is in its geometric center (inside the center of the box).</description>
-    </element>
-  </element> <!-- End Box -->
-
-  <element name="sphere" required="0">
-    <description>Sphere shape</description>
-    <element name="radius" type="double" default="1" required="1">
-      <description>radius of the sphere</description>
-    </element>
-  </element> <!-- End Sphere -->
-
-  <element name="cylinder" required="0">
-    <description>Cylinder shape</description>
-    <element name="radius" type="double" default="1" required="1">
-      <description>Radius of the cylinder</description>
-    </element>
-    <element name="length" type="double" default="1" required="1">
-      <description>Length of the cylinder</description>
-    </element>
-  </element> <!-- End Cylinder -->
-
-  <element name="mesh" required="0">
-    <description>Mesh shape</description>
-    <element name="uri" type="string" default="__default__" required="1">
-      <description>Mesh uri</description>
-    </element>
-
-    <element name="submesh" required="0">
-      <description>Use a named submesh. The submesh must exist in the mesh specified by the uri</description>
-      <element name="name" type="string" default="__default__" required="1">
-        <description>Name of the submesh within the parent mesh</description>
-      </element>
-      <element name="center" type="bool" default="false" required="0">
-        <description>Set to true to center the vertices of the submesh at 0,0,0. This will effectively remove any transformations on the submesh before the poses from parent links and models are applied.</description>
-      </element>
-    </element> <!-- End submesh -->
-
-    <element name="scale" type="vector3" default="1 1 1" required="0">
-      <description>Scaling factor applied to the mesh</description>
-    </element>
-  </element> <!-- End Mesh -->
-
-  <element name="plane" required="0">
-    <description>Plane shape</description>
-    <element name="normal" type="vector3" default="0 0 1" required="1">
-      <description>Normal direction for the plane</description>
-    </element>
-    <element name="size" type="vector2d" default="1 1" min="0 0" required="1">
-      <description>Length of each side of the plane</description> 
-    </element>
-  </element> <!-- End Plane -->
-
-  <element name="image" required="0">
-    <description>Extrude a set of boxes from a grayscale image.</description>
-    <element name="uri" type="string" default="__default__" required="1">
-      <description>URI of the grayscale image file</description>
-    </element>
-    <element name="scale" type="double" default="1" required="1">
-      <description>Scaling factor applied to the image</description>
-    </element>
-    <element name="threshold" type="int" default="200" required="1">
-      <description>Grayscale threshold</description>
-    </element>
-    <element name="height" type="double" default="1" required="1">
-      <description>Height of the extruded boxes</description>
-    </element>
-    <element name="granularity" type="int" default="1" required="1">
-      <description>The amount of error in the model</description>
-    </element>
-  </element> <!-- End Image -->
-
-  <element name="heightmap" required="0">
-    <description>A heightmap based on a 2d grayscale image.</description>
-    <element name="uri" type="string" default="__default__" required="1">
-      <description>URI to a grayscale image file</description>
-    </element>
-    <element name="size" type="vector3" default="1 1 1" required="1">
-      <description>The size of the heightmap in world units</description>
-    </element>
-    <element name="pos" type="vector3" default="0 0 0" required="0">
-      <description>A position offset.</description>
-    </element>
-
-    <element name="texture" required="*">
-      <description>The heightmap can contain multiple textures. The order of the texture matters. The first texture will appear at the lowest height, and the last texture at the highest hieght. Use blend to control the hieight thresholds and fade between textures.</description>
-      <element name="size" type="double" default="10" required="1">
-        <description>Size of the applied texture in meters.</description>
-      </element>
-      <element name="diffuse" type="string" default="__default__" required="1">
-        <description>Diffuse texture image filename</description>
-      </element>
-      <element name="normal" type="string" default="__default__" required="1">
-        <description>Normalmap texture image filename</description>
-      </element>
-    </element>
-    <element name="blend" required="*">
-      <description>The blend tag controls how two adjacent textures are mixed. The number of blend elements should equal one less than the number of textures.</description>
-      <element name="min_height" type="double" default="0" required="1">
-        <description>Min height of a blend layer</description>
-      </element>
-      <element name="fade_dist" type="double" default="0" required="1">
-        <description>Distance over which the blend occurs</description>
-      </element>
-    </element>
-  </element> <!-- End Heightmap -->
-  <element name="empty" required="0">
-    <description>You can use the empty tag to make empty geometries.</description>
-  </element> <!-- End empty -->
-</element><!-- End Geometry -->
diff --git a/gazebo/sdf/1.3/gripper.sdf b/gazebo/sdf/1.3/gripper.sdf
deleted file mode 100644
index 12fd0b3..0000000
--- a/gazebo/sdf/1.3/gripper.sdf
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Gripper -->
-<element name="gripper" required="*">
-  <description></description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description></description>
-  </attribute>
-
-  <element name="grasp_check" required="0">
-    <description></description>
-    <element name="detach_steps" type="int" default="40" required="0">
-      <description></description>
-    </element>
-    <element name="attach_steps" type="int" default="20" required="0">
-      <description></description>
-    </element>
-    <element name="min_contact_count" type="unsigned int" default="2" required="0">
-      <description></description>
-    </element>
-  </element>
-
-  <element name="gripper_link" type="string" default="__default__" required="+">
-    <description></description>
-  </element>
-
-  <element name="palm_link" type="string" default="__default__" required="1">
-    <description></description>
-  </element>
-
-</element>
diff --git a/gazebo/sdf/1.3/gui.sdf b/gazebo/sdf/1.3/gui.sdf
deleted file mode 100644
index 8300090..0000000
--- a/gazebo/sdf/1.3/gui.sdf
+++ /dev/null
@@ -1,39 +0,0 @@
-<!-- gui -->
-<element name="gui" required="0">
-  <attribute name="fullscreen" type="bool" default="false" required="0">
-    <description></description>
-  </attribute>
-
-  <element name="camera" required="0">
-    <description> </description>
-
-    <attribute name="name" type="string" default="user_camera" required="1">
-      <description></description>
-    </attribute>
-
-
-    <element name="view_controller" type="string" default="orbit" required="0">
-      <description></description>
-    </element>
-
-    <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-      <description></description>
-    </element>
-
-    <element name="track_visual" required="0">
-      <description></description>
-
-      <element name="name" type="string" default="__default__" required="1">
-        <description></description>
-      </element>
-
-      <element name="min_dist" type="double" default="0" required="0">
-        <description></description>
-      </element>
-
-      <element name="max_dist" type="double" default="0" required="0">
-        <description></description>
-      </element>
-    </element>
-  </element>
-</element>
diff --git a/gazebo/sdf/1.3/imu.sdf b/gazebo/sdf/1.3/imu.sdf
deleted file mode 100644
index 0f9f507..0000000
--- a/gazebo/sdf/1.3/imu.sdf
+++ /dev/null
@@ -1,8 +0,0 @@
-<element name="imu" required="0">
-  <description>These elements are specific to the IMU sensor.</description>
-
-  <element name="topic" type="string" default="__default_topic__" required="0">
-    <description>Topic on which data is published.</description>
-  </element>
-
-</element>
diff --git a/gazebo/sdf/1.3/inertial.sdf b/gazebo/sdf/1.3/inertial.sdf
deleted file mode 100644
index 417489f..0000000
--- a/gazebo/sdf/1.3/inertial.sdf
+++ /dev/null
@@ -1,34 +0,0 @@
-<!-- Inertial -->
-<element name="inertial" required="0">
-  <description>The inertial properties of the link.</description>
-
-  <element name="mass" type="double" default="1.0" required="0">
-    <description>The mass of the link.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>This is the pose of the inertial reference frame, relative to the link reference frame. The origin of the inertial reference frame needs to be at the center of gravity. The axes of the inertial reference frame do not need to be aligned with the principal axes of the inertia.</description>
-  </element>
-
-  <element name="inertia" required="0">
-    <description>The 3x3 rotational inertia matrix. Because the rotational inertia matrix is symmetric, only 6 above-diagonal elements of this matrix are specified here, using the attributes ixx, ixy, ixz, iyy, iyz, izz.</description>
-    <element name="ixx" type="double" default="1.0" required="1">
-      <description></description>
-    </element>
-    <element name="ixy" type="double" default="0.0" required="1">
-      <description></description>
-    </element>
-    <element name="ixz" type="double" default="0.0" required="1">
-      <description></description>
-    </element>
-    <element name="iyy" type="double" default="1.0" required="1">
-      <description></description>
-    </element>
-    <element name="iyz" type="double" default="0.0" required="1">
-      <description></description>
-    </element>
-    <element name="izz" type="double" default="1.0" required="1">
-      <description></description>
-    </element>
-  </element> <!-- End Inertia -->
-</element> <!-- End Inertial -->
diff --git a/gazebo/sdf/1.3/joint.sdf b/gazebo/sdf/1.3/joint.sdf
deleted file mode 100644
index 64ff831..0000000
--- a/gazebo/sdf/1.3/joint.sdf
+++ /dev/null
@@ -1,141 +0,0 @@
-<!-- Joint -->
-<element name="joint" required="*">
-  <description>A joint connections two links with kinematic and dynamic properties.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the joint within the scope of the model.</description>
-  </attribute>
-
-  <attribute name="type" type="string" default="__default__" required="1">
-    <description>The type of joint, which must be one of the following: (revolute) a hinge joint that rotates on a single axis with either a fixed or continuous range of motion, (revolute2) same as two revolute joints connected in series, (prismatic) a sliding joint that slides along an axis with a limited range specified by upper and lower limits, (ball) a ball and socket joint, (universal), like a ball joint, but constrains one degree of freedom, (piston) similar to a Slider joint exce [...]
-  </attribute>
-
-  <element name="parent" type="string" default="__default__" required="1">
-    <description>Name of the parent link</description>
-  </element> <!-- End Parent -->
-
-  <element name="child" type="string" default="__default__" required="1">
-    <description>Name of the child link</description>
-  </element> <!-- End Child -->
-
-  <element name="pose"  type="pose" default="0 0 0 0 0 0" required="0">
-    <description>offset from child link origin in child link frame.</description>
-  </element>
-
-  <element name="thread_pitch" type="double" default="1.0" required="0">
-    <description></description>
-  </element>
-
-  <element name="axis" required="1">
-    <description>The joint axis specified in the model frame. This is the axis of rotation for revolute joints, the axis of translation for prismatic joints. The axis is currently specified in the model frame of reference, but this will be changed to the joint frame in future version of sdf (see gazebo issue #494).</description>
-    <element name="xyz" type="vector3" default="0 0 1" required="1">
-      <description>Represents the x,y,z components of a vector. The vector should be normalized.</description>
-    </element>
-    <element name="dynamics" required="0">
-      <description>An element specifying physical properties of the joint. These values are used to specify modeling properties of the joint, particularly useful for simulation.</description>
-      <element name="damping" type="double" default="0" required="0">
-        <description>The physical velocity dependent viscous damping coefficient of the joint.</description>
-      </element>
-      <element name="friction" type="double" default="0" required="0">
-        <description>The physical static friction value of the joint.</description>
-      </element>
-    </element> <!-- End Dynamics -->
-    <element name="limit" required="1">
-      <description>specifies the limits of this joint</description>
-      <element name="lower" type="double" default="-1e16" required="1">
-        <description>An attribute specifying the lower joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="upper" type="double" default="1e16" required="1">
-        <description>An attribute specifying the upper joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="effort" type="double" default="-1" required="0">
-        <description>An attribute for enforcing the maximum joint effort applied by Joint::SetForce.  Limit is not enforced if value is negative.</description>
-      </element>
-      <element name="velocity" type="double" default="-1" required="0">
-        <description>(not implemented) An attribute for enforcing the maximum joint velocity.</description>
-      </element>
-    </element> <!-- End Limit -->
-  </element> <!-- End Axis -->
-
-  <element name="axis2" required="0">
-    <description>The second joint axis specified in the model frame. This is the second axis of rotation for revolute2 joints and universal joints. The axis is currently specified in the model frame of reference, but this will be changed to the joint frame in future version of sdf (see gazebo issue #494).</description>
-    <element name="xyz" type="vector3" default="0 0 1" required="1">
-      <description>Represents the x,y,z components of a vector. The vector should be normalized.</description>
-    </element>
-    <element name="dynamics" required="0">
-      <description>An element specifying physical properties of the joint. These values are used to specify modeling properties of the joint, particularly useful for simulation.</description>
-      <element name="damping" type="double" default="0" required="0">
-        <description>The physical velocity dependent viscous damping coefficient of the joint.</description>
-      </element>
-      <element name="friction" type="double" default="0" required="0">
-        <description>The physical static friction value of the joint.</description>
-      </element>
-    </element> <!-- End Dynamics -->
-
-    <element name="limit" required="0">
-      <description></description>
-      <element name="lower" type="double" default="-1e16" required="0">
-        <description>An attribute specifying the lower joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="upper" type="double" default="1e16" required="0">
-        <description>An attribute specifying the upper joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="effort" type="double" default="-1" required="0">
-        <description>An attribute for enforcing the maximum joint effort applied by Joint::SetForce.  Limit is not enforced if value is negative.</description>
-      </element>
-      <element name="velocity" type="double" default="-1" required="0">
-        <description>(not implemented) An attribute for enforcing the maximum joint velocity.</description>
-      </element>
-    </element> <!-- End Limit -->
-  </element> <!-- End Axis2 -->
-
-  <element name="physics" required="0">
-    <description>Parameters that are specific to a certain physics engine.</description>
-    <element name="ode" required="0">
-      <description>ODE specific parameters</description>
-      <element name="provide_feedback" type="bool" default="false" required="0">
-        <description>If provide feedback is set to true, ODE will compute the constraint forces at this joint.</description>
-      </element>
-
-      <element name="cfm_damping" type="bool" default="false" required="0">
-        <description>If cfm damping is set to true, ODE will use CFM to simulate damping, allows for infinite damping, and one additional constraint row (previously used for joint limit) is always active.</description>
-      </element>
-
-      <element name="fudge_factor" type="double" default="0" required="0">
-        <description>Scale the excess for in a joint motor at joint limits. Should be between zero and one.</description>
-      </element>
-      <element name="cfm" type="double" default="0" required="0">
-        <description>Constraint force mixing used when not at a stop</description>
-      </element>
-      <element name="bounce" type="double" default="0" required="0">
-        <description>Bounciness of the limits</description>
-      </element>
-      <element name="max_force" type="double" default="0" required="0">
-        <description>Maximum force or torque used to reach the desired velocity.</description>
-      </element>
-      <element name="velocity" type="double" default="0" required="0">
-        <description>The desired velocity of the joint. Should only be set if you want the joint to move on load.</description>
-      </element>
-
-      <element name="limit" required="0">
-        <description></description>
-        <element name="cfm" type="double" default="0.0" required="1">
-          <description>Constraint force mixing parameter used by the joint stop</description>
-        </element>
-        <element name="erp" type="double" default="0.2" required="1">
-          <description>Error reduction parameter used by the joint stop</description>
-        </element>
-      </element>
-
-      <element name="suspension" required="0">
-        <description></description>
-        <element name="cfm" type="double" default="0.0" required="1">
-          <description>Suspension constraint force mixing parameter</description>
-        </element>
-        <element name="erp" type="double" default="0.2" required="1">
-          <description>Suspension error reduction parameter</description>
-        </element>
-      </element>
-    </element>
-  </element> <!-- End Physics -->
-</element> <!-- End Joint -->
diff --git a/gazebo/sdf/1.3/light.sdf b/gazebo/sdf/1.3/light.sdf
deleted file mode 100644
index 745308c..0000000
--- a/gazebo/sdf/1.3/light.sdf
+++ /dev/null
@@ -1,61 +0,0 @@
-<!-- Light -->
-<element name="light" required="*">
-  <description>The light element describes a light source.</description>
-
-  <attribute name="name" type="string" default="__default__" required="0">
-    <description>A unique name for the light.</description>
-  </attribute>
-
-  <attribute name="type" type="string" default="point" required="1">
-    <description>The light type: point, directional, spot.</description>
-  </attribute>
-
-  <element name="cast_shadows" type="bool" default="false" required="0">
-    <description>When true, the light will cast shadows.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the global coordinate frame for the light.</description>
-  </element>
-
-  <element name="diffuse" type="color" default="1 1 1 1" required="1">
-    <description>Diffuse light color</description>
-  </element>
-  <element name="specular" type="color" default=".1 .1 .1 1" required="1">
-    <description>Specular light color</description>
-  </element>
-
-  <element name="attenuation" required="0">
-    <description>Light attenuation</description>
-    <element name="range" type="double" default="10" required="1">
-      <description>Range of the light</description>
-    </element>
-    <element name="linear" type="double" default="1" required="0">
-      <description>The linear attenuation factor: 1 means attenuate evenly over the distance.</description>
-    </element>
-    <element name="constant" type="double" default="1" required="0">
-      <description>The constant attenuation factor: 1.0 means never attenuate, 0.0 is complete attenutation.</description>
-    </element>
-    <element name="quadratic" type="double" default="0" required="0">
-      <description>The quadratic attenuation factor: adds a curvature to the attenuation.</description>
-    </element>
-  </element> <!-- End Attenuation -->
-
-  <element name="direction" type="vector3" default="0 0 -1" required="1">
-    <description>Direction of the light, only applicable for spot and directional lights.</description>
-  </element><!-- End Directional -->
-
-  <element name="spot" required="0">
-    <description>Spot light parameters</description>
-    <element name="inner_angle" type="double" default="0" required="1">
-      <description>Angle covered by the bright inner cone</description>
-    </element>
-    <element name="outer_angle" type="double" default="0" required="1">
-      <description>Angle covered by the outer cone</description>
-    </element>
-    <element name="falloff" type="double" default="0" required="1">
-      <description>The rate of falloff between the inner and outer cones. 1.0 means a linear falloff, less means slower falloff, higher means faster falloff.</description>
-    </element>
-  </element> <!-- End Spot -->
-
-</element> <!-- End Light -->
diff --git a/gazebo/sdf/1.3/link.sdf b/gazebo/sdf/1.3/link.sdf
deleted file mode 100644
index 24f7a3c..0000000
--- a/gazebo/sdf/1.3/link.sdf
+++ /dev/null
@@ -1,41 +0,0 @@
-<!-- Link -->
-<element name="link" required="+">
-  <description>A physical link with inertia, collision, and visual properties. A link must be a child of a model, and any number of links may exist in a model.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the link within the scope of the model.</description>
-  </attribute>
-
-  <element name="gravity" type="bool" default="true" required="0">
-    <description>If true, the link is affected by gravity.</description>
-  </element>
-
-  <element name="self_collide" type="bool" default="false" required="0">
-    <description>If true, the link can collide with other links in the model.</description>
-  </element>
-
-  <element name="kinematic" type="bool" default="false" required="0">
-    <description>If true, the link is kinematic only</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>This is the pose of the link reference frame, relative to the model reference frame.</description>
-  </element>
-
-  <element name="velocity_decay" required="1">
-    <description>Exponential damping of the link's velocity.</description>
-    <element name="linear" type="double" default="0.0" required="1">
-      <description>Linear damping</description>
-    </element>
-    <element name="angular" type="double" default="0.0" required="1">
-      <description>Angular damping</description>
-    </element>
-  </element> <!-- End velocity decay -->
-
-  <include filename="inertial.sdf" required="0"/>
-  <include filename="collision.sdf" required="*"/>
-  <include filename="visual.sdf" required="*"/>
-  <include filename="sensor.sdf" required="*"/>
-  <include filename="projector.sdf" required="*"/>
-
-</element> <!-- End Link -->
diff --git a/gazebo/sdf/1.3/model.sdf b/gazebo/sdf/1.3/model.sdf
deleted file mode 100644
index 2ec8b59..0000000
--- a/gazebo/sdf/1.3/model.sdf
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Model -->
-<element name="model" required="*">
-  <description>The model element defines a complete robot or any other physical object.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the model. This name must not match another model in the world.</description>
-  </attribute>
-
-  <element name="static" type="bool" default="false" required="0">
-    <description>If set to true, the model is immovable. Otherwise the model is simulated in the dynamics engine.</description>
-  </element>
-
-  <element name="allow_auto_disable" type="bool" default="true" required="0">
-    <description>Allows a model to auto-disable, which is means the physics engine can skip updating the model when the model is at rest. This parameter is only used by models with no joints.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the global coordinate frame for the model. Position(x,y,z) and rotation (roll, pitch yaw) in the global coordinate frame.</description>
-  </element>
-
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="gripper.sdf" required="*"/>
-
-</element> <!-- End Model -->
diff --git a/gazebo/sdf/1.3/physics.sdf b/gazebo/sdf/1.3/physics.sdf
deleted file mode 100644
index 1811a72..0000000
--- a/gazebo/sdf/1.3/physics.sdf
+++ /dev/null
@@ -1,65 +0,0 @@
-<!-- Physics -->
-<element name="physics" required="1">
-  <description>The physics tag specifies the type and properties of the dynamics engine.</description>
-
-  <attribute name="type" type="string" default="ode" required="1">
-    <description>The type of the dynamics engine. Currently must be set to ode</description>
-  </attribute>
-
-  <element name="update_rate" type="double" default="1000" required="1">
-    <description>Rate at which to update the physics engine</description>
-  </element>
-
-  <element name="max_contacts" type="int" default="20" required="0">
-    <description>Maximum number of contacts allowed between two entities. This value can be over ridden by a max_contacts element in a collision element.</description>
-  </element>
-
-  <element name="gravity" type="vector3" default="0 0 -9.8" required="1">
-    <description>The gravity vector</description>
-  </element> <!-- End Gravity -->
-
-  <element name="bullet" required="0">
-    <description>Bullet specific physics properties</description>
-    <element name="dt" type="double" default="0.001" required="1">
-      <description>Time step</description>
-    </element>
-  </element>
-
-  <element name="ode" required="0">
-    <description>ODE specific physics properties</description>
-    <element name="solver" required="1">
-      <description></description>
-      <element name="type" type="string" default="quick" required="1">
-        <description>One of the following types: world, quick</description>
-      </element>
-      <element name="dt" type="double" default="0.001" required="1">
-        <description>The time duration which advances with each iteration of the dynamics engine.</description>
-      </element>
-      <element name="iters" type="int" default="50" required="1">
-        <description>Number of iterations for each step. A higher number produces greater accuracy at a performance cost.</description>
-      </element>
-      <element name="precon_iters" type="int" default="0" required="0">
-        <description></description>
-      </element>
-      <element name="sor" type="double" default="1.3" required="1">
-        <description>Set the successive over-relaxation parameter.</description>
-      </element>
-    </element> <!-- End Solver -->
-
-    <element name="constraints" required="1">
-      <description></description>
-      <element name="cfm" type="double" default="0" required="1">
-        <description>Constraint force mixing parameter. See the ODE page for more information.</description>
-      </element>
-      <element name="erp" type="double" default="0.2" required="1">
-        <description>Error reduction parameter. See the ODE page for more information.</description>
-      </element>
-      <element name="contact_max_correcting_vel" type="double" default="100.0" required="1">
-        <description>The maximum correcting velocities allowed when resolving contacts.</description>
-      </element>
-      <element name="contact_surface_layer" type="double" default="0.001" required="1">
-        <description>The depth of the surface layer around all geometry objects. Contacts are allowed to sink into the surface layer up to the given depth before coming to rest. The default value is zero. Increasing this to some small value (e.g. 0.001) can help prevent jittering problems due to contacts being repeatedly made and broken.</description>
-      </element>
-    </element> <!-- End Constraints -->
-  </element> <!-- ODE -->
-</element> <!-- Physics -->
diff --git a/gazebo/sdf/1.3/plugin.sdf b/gazebo/sdf/1.3/plugin.sdf
deleted file mode 100644
index 26405ff..0000000
--- a/gazebo/sdf/1.3/plugin.sdf
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- Plugin -->
-<element name="plugin" required="*">
-  <description>A plugin is a dynamically loaded chunk of code. It can exist as a child of world, model, and sensor.</description>
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the plugin, scoped to its parent.</description>
-  </attribute>
-  <attribute name="filename" type="string" default="__default__" required="1">
-    <description>Name of the shared library to load. If the filename is not a full path name, the file will be searched for in the configuration paths.</description>
-  </attribute>
-  <element copy_data="true" required="*">
-    <description>This is a special element that should not be specified in an SDF file. It automatically copies child elements into the SDF element so that a plugin can access the data.</description>
-  </element>
-</element> <!-- End Plugin -->
diff --git a/gazebo/sdf/1.3/projector.sdf b/gazebo/sdf/1.3/projector.sdf
deleted file mode 100644
index 9eabca9..0000000
--- a/gazebo/sdf/1.3/projector.sdf
+++ /dev/null
@@ -1,32 +0,0 @@
-<!-- Projector -->
-<element name="projector" required="0">
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Name of the projector</description>
-  </attribute>
-
-  <element name="texture" type="string" default="__default__" required="1">
-    <description>Texture name</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>Pose of the projector</description>
-  </element>
-
-
-  <element name="fov" type="double" default="0.785" required="0">
-    <description>Field of view</description>
-  </element>
-
-
-  <element name="near_clip" type="double" default="0.1" required="0">
-    <description>Near clip distance</description>
-  </element>
-
-
-  <element name="far_clip" type="double" default="10.0" required="0">
-    <description>far clip distance</description>
-  </element>
-
-
-  <include filename="plugin.sdf" required="*"/>
-</element>
diff --git a/gazebo/sdf/1.3/ray.sdf b/gazebo/sdf/1.3/ray.sdf
deleted file mode 100644
index c56c993..0000000
--- a/gazebo/sdf/1.3/ray.sdf
+++ /dev/null
@@ -1,60 +0,0 @@
-<element name="ray" required="0">
-  <description>These elements are specific to the ray (laser) sensor.</description>
-
-  <element name="scan" required="1">
-    <description></description>
-    <element name="horizontal" required="1">
-      <description></description>
-
-      <element name="samples" type="unsigned int" default="640" required="1">
-        <description>The number of simulated rays to generate per complete laser sweep cycle.</description>
-      </element>
-
-      <element name="resolution" type="double" default="1" required="1">
-        <description>This number is multiplied by samples to determine the number of range data points returned. If resolution is less than one, range data is interpolated. If resolution is greater than one, range data is averaged.</description>
-      </element>
-
-      <element name="min_angle" type="double" default="0" required="1">
-        <description></description>
-      </element>
-
-      <element name="max_angle" type="double" default="0" required="1">
-        <description>Must be greater or equal to min_angle</description>
-      </element>
-
-    </element> <!-- End Horizontal -->
-
-    <element name="vertical" required="0">
-      <description></description>
-      <element name="samples" type="unsigned int" default="1" required="1">
-        <description>The number of simulated rays to generate per complete laser sweep cycle.</description>
-      </element>
-
-      <element name="resolution" type="double" default="1" required="0">
-        <description>This number is multiplied by samples to determine the number of range data points returned. If resolution is less than one, range data is interpolated. If resolution is greater than one, range data is averaged.</description>
-      </element>
-
-      <element name="min_angle" type="double" default="0" required="1">
-        <description></description>
-      </element>
-
-      <element name="max_angle" type="double" default="0" required="1">
-        <description>Must be greater or equal to min_angle</description>
-      </element>
-
-    </element> <!-- End Vertical -->
-  </element> <!-- End Scan -->
-
-  <element name="range" required="1">
-    <description>specifies range properties of each simulated ray</description>
-    <element name="min" type="double" default="0" required="1">
-      <description>The minimum distance for each ray.</description>
-    </element>
-    <element name="max" type="double" default="0" required="1">
-      <description>The maximum distance for each ray.</description>
-    </element>
-    <element name="resolution" type="double" default="0" required="0">
-      <description>Linear resolution of each ray.</description>
-    </element>
-  </element> <!-- End Range -->
-</element> <!-- End Ray -->
diff --git a/gazebo/sdf/1.3/rfid.sdf b/gazebo/sdf/1.3/rfid.sdf
deleted file mode 100644
index 61351dd..0000000
--- a/gazebo/sdf/1.3/rfid.sdf
+++ /dev/null
@@ -1,2 +0,0 @@
-<element name="rfidtag" required="0">
-</element> <!-- End rfidtag -->
diff --git a/gazebo/sdf/1.3/rfidtag.sdf b/gazebo/sdf/1.3/rfidtag.sdf
deleted file mode 100644
index 55699dc..0000000
--- a/gazebo/sdf/1.3/rfidtag.sdf
+++ /dev/null
@@ -1,2 +0,0 @@
-<element name="rfid" required="0">
-</element> <!-- End RFID -->
diff --git a/gazebo/sdf/1.3/road.sdf b/gazebo/sdf/1.3/road.sdf
deleted file mode 100644
index 3549b24..0000000
--- a/gazebo/sdf/1.3/road.sdf
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Model -->
-<element name="road" required="*">
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Name of the road</description>
-  </attribute>
-
-  <element name="width" type="double" default="1.0" required="1">
-    <description>Width of the road</description>
-  </element>
-
-  <element name="point" type="vector3" default="0 0 0" required="+">
-    <description>A series of points define the path of the road.</description>
-  </element>
-
-</element>
diff --git a/gazebo/sdf/1.3/root.sdf b/gazebo/sdf/1.3/root.sdf
deleted file mode 100644
index bd9c69f..0000000
--- a/gazebo/sdf/1.3/root.sdf
+++ /dev/null
@@ -1,13 +0,0 @@
-<element name="sdf" required="1">
-  <description>SDF base element.</description>
-
-  <attribute name="version" type="string" default="1.3" required="1">
-    <description>Version number of the SDF format.</description>
-  </attribute>
-
-  <include filename="world.sdf" required="*"/>
-  <include filename="model.sdf" required="*"/>
-  <include filename="actor.sdf" required="*"/>
-  <include filename="light.sdf" required="*"/>
-
-</element> <!-- End SDF -->
diff --git a/gazebo/sdf/1.3/scene.sdf b/gazebo/sdf/1.3/scene.sdf
deleted file mode 100644
index 579ec9e..0000000
--- a/gazebo/sdf/1.3/scene.sdf
+++ /dev/null
@@ -1,78 +0,0 @@
-<!-- Scene -->
-<element name="scene" required="1">
-  <description>Specifies the look of the environment.</description>
-
-  <element name="ambient" type="color" default="0.2 0.2 0.2 1.0" required="1">
-    <description>Color of the ambient light.</description>
-  </element>
-
-  <element name="background" type="color" default=".7 .7 .7 1" required="1">
-    <description>Color of the background.</description>
-  </element>
-
-  <element name="sky" required="0">
-    <description>Properties for the sky</description>
-    <element name="time" type="double" default="10.0" required="0">
-      <description>Time of day [0..24]</description>
-    </element>
-    <element name="sunrise" type="double" default="6.0" required="0">
-      <description>Sunrise time [0..24]</description>
-    </element>
-    <element name="sunset" type="double" default="20.0" required="0">
-      <description>Sunset time [0..24]</description>
-    </element>
-
-    <element name="clouds" required="0">
-      <description>Sunset time [0..24]</description>
-      <element name="speed" type="double" default="0.6" min="0.0" required="0">
-        <description>Speed of the clouds</description>
-      </element>
-
-      <element name="direction" type="double" default="0.0"
-               min="0.0" max="3.1456" required="0">
-        <description>Direction of the cloud movement</description>
-      </element>
-      <element name="humidity" type="double" default="0.5"
-               min="0" max="1" required="0">
-        <description>Density of clouds</description>
-      </element>
-
-      <element name="mean_size" type="double" default="0.5"
-               min="0" max="1" required="0">
-        <description>Average size of the clouds</description>
-      </element>
-
-      <element name="ambient" type="color" default=".8 .8 .8 1" required="0">
-        <description>Ambient cloud color</description>
-      </element>
-    </element>
-  </element>
-
-  <element name="shadows" type="bool" default="true" required="1">
-    <description>Enable/disable shadows</description>
-   </element>
-
-  <element name="fog" required="0">
-    <description>Controls fog</description>
-    <element name="color" type="color" default="1 1 1 1" required="0">
-      <description>Fog color</description>
-    </element>
-    <element name="type" type="string" default="none" required="0">
-      <description>Fog type: constant, linear, quadratic</description>
-    </element>
-    <element name="start" type="double" default="1.0" min="0.0" required="0">
-      <description>Distance to start of fog</description>
-    </element>
-    <element name="end" type="double" default="100.0" min="0.0" required="0">
-      <description>Distance to end of fog</description>
-    </element>
-    <element name="density" type="double" default="1.0" min="0.0" required="0">
-      <description>Density of fog</description>
-    </element>
-  </element>
-
-  <element name="grid" type="bool" default="true" required="0">
-    <description>Enable/disable the grid</description>
-  </element>
-
-</element> <!-- End Scene -->
diff --git a/gazebo/sdf/1.3/sensor.sdf b/gazebo/sdf/1.3/sensor.sdf
deleted file mode 100644
index 36dafe0..0000000
--- a/gazebo/sdf/1.3/sensor.sdf
+++ /dev/null
@@ -1,41 +0,0 @@
-<!-- Sensor -->
-<element name="sensor" required="0">
-  <description>The sensor tag describes the type and properties of a sensor.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the sensor. This name must not match another model in the model.</description>
-  </attribute>
-
-  <attribute name="type" type="string" default="__default__" required="1">
-    <description>The type name of the sensor. By default, SDF supports types camera, depth, multicamera, contact, imu, ir and ray.</description>
-  </attribute>
-
-  <element name="always_on" type="bool" default="false" required="0">
-    <description>If true the sensor will always be updated according to the update rate.</description>
-  </element>
-
-  <element name="update_rate" type="double" default="0" required="0">
-    <description>The frequency at which the sensor data is generated. If left unspecified, the sensor will generate data every cycle.</description>
-  </element>
-
-  <element name="visualize" type="bool" default="false" required="0">
-    <description>If true, the sensor is visualized in the GUI</description>
-  </element>
-
-  <element name="pose"  type="pose" default="0 0 0 0 0 0" required="0">
-    <description>This is the pose of the sensor, relative to the parent link reference frame.</description>
-  </element>
-
-  <element name="topic" type="string" default="__default__" required="0">
-    <description>Name of the topic on which data is published. This is necessary for visualization</description>
-  </element>
-
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="camera.sdf" required="0"/>
-  <include filename="ray.sdf" required="0"/>
-  <include filename="contact.sdf" required="0"/>
-  <include filename="rfid.sdf" required="0"/>
-  <include filename="rfidtag.sdf" required="0"/>
-  <include filename="imu.sdf" required="0"/>
-
-</element> <!-- End Sensor -->
diff --git a/gazebo/sdf/1.3/state.sdf b/gazebo/sdf/1.3/state.sdf
deleted file mode 100644
index 01d3c63..0000000
--- a/gazebo/sdf/1.3/state.sdf
+++ /dev/null
@@ -1,101 +0,0 @@
-<!-- State Info -->
-<element name="state" required="*">
-  <!-- Name of the world this state applies to -->
-  <attribute name="world_name" type="string" default="__default__" required="1">
-    <description>Name of the world this state applies to</description>
-  </attribute>
-
-  <element name="sim_time" type="time" default="0 0" required="0">
-    <description>Simulation time stamp of the state [seconds nanoseconds]</description>
-  </element>
-
-  <element name="wall_time" type="time" default="0 0" required="0">
-    <description>Wall time stamp of the state [seconds nanoseconds]</description>
-  </element>
-
-  <element name="real_time" type="time" default="0 0" required="0">
-    <description>Real time stamp of the state [seconds nanoseconds]</description>
-  </element>
-
-  <element name="insertions" required="0">
-    <description>A list of new model names</description>
-    <include filename="model.sdf" required="+"/>
-  </element>
-
-  <element name="deletions" required="0">
-    <description>A list of deleted model names</description>
-    <element name="name" type="string" default="__default__" required="+">
-      <description>The name of a deleted model</description>
-    </element>
-  </element>
-
-
-  <!-- State information for a model -->
-  <element name="model" required="*">
-    <description>Model state</description>
-
-    <attribute name="name" type="string" default="__default__" required="1">
-      <description>Name of the model</description>
-    </attribute>
-
-    <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-      <description>Pose of the model</description>
-    </element>
-
-    <element name="joint" required="*">
-      <description>Joint angle</description>
-
-      <attribute name="name" type="string" default="__default__" required="1">
-        <description>Name of the joint</description>
-      </attribute>
-
-      <element name="angle" type="double" default="0" required="+">
-        <attribute name="axis" type="unsigned int" default="0" required="1">
-          <description>Index of the axis.</description>
-        </attribute>
-
-        <description>Angle of an axis</description>
-      </element>
-    </element>
-
-    <!-- State information for a link -->
-    <element name="link" required="*">
-      <description>Link state</description>
-
-      <attribute name="name" type="string" default="__default__" required="1">
-        <description>Name of the link</description>
-      </attribute>
-
-      <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-        <description>Pose of the link relative to the model</description>
-      </element>
-
-      <element name="velocity" type="pose" default="0 0 0 0 0 0" required="0">
-        <description>Velocity of the link</description>
-      </element>
-
-      <element name="acceleration" type="pose"
-              default="0 0 0 0 0 0" required="0">
-        <description>Acceleration of the link</description>
-      </element>
-
-      <element name="wrench" type="pose" default="0 0 0 0 0 0" required="0">
-        <description>Force applied to the link</description>
-      </element>
-
-      <element name="collision" required="*">
-        <description>Collision state</description>
-
-        <attribute name="name" type="string" default="__default__" required="1">
-          <description>Name of the collision</description>
-        </attribute>
-
-        <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-          <description>Pose of the link relative to the model</description>
-        </element>
-      </element>
-
-
-    </element> <!-- End Link -->
-  </element> <!-- End Model -->
-</element> <!-- End State -->
diff --git a/gazebo/sdf/1.3/surface.sdf b/gazebo/sdf/1.3/surface.sdf
deleted file mode 100644
index 7dcbfb0..0000000
--- a/gazebo/sdf/1.3/surface.sdf
+++ /dev/null
@@ -1,59 +0,0 @@
-<element name="surface" required="0">
-  <description>The surface parameters</description>
-  <element name="bounce" required="0">
-    <description></description>
-    <element name="restitution_coefficient" type="double" default="0" min="0.0" max="1.0" required="0">
-      <description>Bounciness coefficient of restitution, from [0...1], where 0=no bounciness.</description>
-    </element>
-    <element name="threshold" type="double" default="100000" required="0">
-      <description>Bounce velocity threshold, below which effective coefficient of restitution is 0.</description>
-    </element>
-  </element> <!-- End Bounce -->
-
-  <element name="friction" required="0">
-    <description></description>
-    <element name="ode" required="0">
-      <description>ODE friction parameters</description>
-      <element name="mu" type="double" default="-1" min="0.0" max="1.0" required="0">
-        <description>Coefficient of friction in the range of [0..1].</description>
-      </element>
-      <element name="mu2" type="double" default="-1" min="0.0" max="1.0" required="0">
-        <description>Second coefficient of friction in the range of [0..1]</description>
-      </element>
-      <element name="fdir1" type="vector3" default="0 0 0" required="0">
-        <description>3-tuple specifying direction of mu1 in the collision local reference frame.</description>
-      </element>
-      <element name="slip1" type="double" default="0.0" min="0.0" max="1.0" required="0">
-        <description>Force dependent slip direction 1 in collision local frame, between the range of [0..1].</description>
-      </element>
-      <element name="slip2" type="double" default="0.0" min="0.0" max="1.0" required="0">
-        <description>Force dependent slip direction 2 in collision local frame, between the range of [0..1].</description>
-      </element>
-    </element> <!-- End ODE -->
-  </element> <!-- End Friction -->
-
-  <element name="contact" required="0">
-    <description></description>
-    <element name="ode" required="0">
-      <description>ODE contact parameters</description>
-      <element name="soft_cfm" type="double" default="0" required="0">
-        <description>Soft constraint force mixing.</description>
-      </element>
-      <element name="soft_erp" type="double" default="0.2" required="0">
-        <description>Soft error reduction parameter</description>
-      </element>
-      <element name="kp" type="double" default="1000000000000.0" required="0">
-        <description>dynamically "stiffness"-equivalent coefficient for contact joints</description>
-      </element>
-      <element name="kd" type="double" default="1.0" required="0">
-        <description>dynamically "damping"-equivalent coefficient for contact joints</description>
-      </element>
-      <element name="max_vel" type="double" default="0.01" required="0">
-        <description>maximum contact correction velocity truncation term.</description>
-      </element>
-      <element name="min_depth" type="double" default="0" required="0">
-        <description>minimum allowable depth before contact correction impulse is applied</description>
-      </element>
-    </element> <!-- End ODE -->
-  </element> <!-- End Contact -->
-</element> <!-- End Surface -->
diff --git a/gazebo/sdf/1.3/urdf.sdf b/gazebo/sdf/1.3/urdf.sdf
deleted file mode 100644
index 6068d5c..0000000
--- a/gazebo/sdf/1.3/urdf.sdf
+++ /dev/null
@@ -1,19 +0,0 @@
-<!-- Robot URDF -->
-<element name="robot" required="*">
-  <description>The robot element defines a complete robot or any other physical object using URDF.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the model. This name must not match another model in the world.</description>
-  </attribute>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the global coordinate frame for the model. Position(x,y,z) and rotation (roll, pitch yaw) in the global coordinate frame.</description>
-  </element>
-
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="gripper.sdf" required="*"/>
-
-</element> <!-- End Model -->
-
diff --git a/gazebo/sdf/1.3/visual.sdf b/gazebo/sdf/1.3/visual.sdf
deleted file mode 100644
index d8d924c..0000000
--- a/gazebo/sdf/1.3/visual.sdf
+++ /dev/null
@@ -1,71 +0,0 @@
-<!-- Visual -->
-<element name="visual" required="*">
-  <description>The visual properties of the link. This element specifies the shape of the object (box, cylinder, etc.) for visualization purposes.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Unique name for the visual element within the scope of the parent link.</description>
-  </attribute>
-
-  <element name="cast_shadows" type="bool" default="true" required="0">
-    <description>If true the visual will cast shadows.</description>
-  </element>
-
-  <element name="laser_retro" type="double" default="0.0" required="0">
-    <description>will be implemented in the future release.</description>
-  </element>
-
-  <element name="transparency" type="double" default="0.0" required="0">
-    <description>The amount of transparency( 0=opaque, 1 = fully transparent)</description>
-  </element>
-  
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>Origin of the visual relative to its parent.</description>
-  </element>
-
-  <element name="material" required="0">
-    <description>The material of the visual element.</description>
-
-    <element name="script" required="0">
-      <description>Name of material from an installed script file. This will override the color element if the script exists.</description>
-
-      <element name="uri" type="string" default="__default__" required="+">
-        <description>URI of the material script file</description>
-      </element>
-
-      <element name="name" type="string" default="__default__" required="1">
-        <description>Name of the script within the script file</description>
-      </element>
-    </element>
-
-    <element name="shader" required="0">
-      <description></description>
-
-      <attribute name="type" type="string" default="pixel" required="1">
-        <description>vertex, pixel, normal_map_objectspace, normal_map_tangentspace</description>
-      </attribute>
-
-      <element name="normal_map" type="string" default="__default__" required="0">
-        <description>filename of the normal map</description>
-      </element>
-    </element>
-
-    <element name="ambient" type="color" default="0 0 0 1" required="0">
-      <description>The ambient color of a material specified by set of four numbers representing red/green/blue, each in the range of [0,1].</description>
-    </element>
-
-    <element name="diffuse"  type="color" default="0 0 0 1" required="0">
-      <description>The diffuse color of a material specified by set of four numbers representing red/green/blue/alpha, each in the range of [0,1].</description>
-    </element>
-
-    <element name="specular" type="color" default="0 0 0 1" required="0">
-      <description>The specular color of a material specified by set of four numbers representing red/green/blue/alpha, each in the range of [0,1].</description>
-    </element>
-
-    <element name="emissive" type="color" default="0 0 0 1" required="0">
-      <description>The emissive color of a material specified by set of four numbers representing red/green/blue, each in the range of [0,1].</description>
-    </element>
-  </element> <!-- End Material -->
-
-  <include filename="geometry.sdf" required="1"/>
-  <include filename="plugin.sdf" required="*"/>
-</element> <!-- End Visual -->
diff --git a/gazebo/sdf/1.3/world.sdf b/gazebo/sdf/1.3/world.sdf
deleted file mode 100644
index 30d0990..0000000
--- a/gazebo/sdf/1.3/world.sdf
+++ /dev/null
@@ -1,20 +0,0 @@
-<element name="world" required="*">
-  <description>The world element encapsulates an entire world description including: models, scene, physics, joints, and plugins</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Unique name of the world</description>
-  </attribute>
-
-  <include filename="gui.sdf" required="0"/>
-  <include filename="physics.sdf" required="1"/>
-  <include filename="scene.sdf" required="1"/>
-  <include filename="light.sdf" required="*"/>
-
-  <include filename="model.sdf" required="*"/>
-  <include filename="actor.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="road.sdf" required="*"/>
-
-  <include filename="state.sdf" required="*"/>
-</element> <!-- End World -->
diff --git a/gazebo/sdf/1.4/1_3.convert b/gazebo/sdf/1.4/1_3.convert
deleted file mode 100644
index deb1da8..0000000
--- a/gazebo/sdf/1.4/1_3.convert
+++ /dev/null
@@ -1,52 +0,0 @@
-<convert name="sdf">
-  <convert name="world">
-    <convert name="physics">
-      <move>
-        <from element="update_rate"/>
-        <to element="real_time_update_rate"/>
-      </move>
-      <move>
-        <from element="ode::solver::dt"/>
-        <to element="max_step_size"/>
-      </move>
-      <move>
-        <from element="bullet::dt"/>
-        <to element="max_step_size"/>
-      </move>
-    </convert>
-
-    <!-- See comments joint.sdf about poses in joints -->
-    <!--
-    <convert name="model">
-      <convert name="joint">
-        <move>
-          <from element="parent"/>
-          <to element="parent::link_name"/>
-        </move>
-        <move>
-          <from element="child"/>
-          <to element="child::link_name"/>
-        </move>
-      </convert>
-    </convert>
-    -->
-  </convert>
-  
-  <!-- for model sdfs -->
-  <!-- See comments joint.sdf about poses in joints -->
-  <!--
-  <convert name="model">
-    <convert name="joint">
-      <move>
-        <from element="parent"/>
-        <to element="parent::link_name"/>
-      </move>
-      <move>
-        <from element="child"/>
-        <to element="child::link_name"/>
-      </move>
-    </convert>
-  </convert>
-  -->
-
-</convert> <!-- End SDF -->
diff --git a/gazebo/sdf/1.4/CMakeLists.txt b/gazebo/sdf/1.4/CMakeLists.txt
deleted file mode 100644
index ad41a67..0000000
--- a/gazebo/sdf/1.4/CMakeLists.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-set (sdfs
-  1_3.convert
-  actor.sdf
-  camera.sdf
-  collision.sdf
-  contact.sdf
-  geometry.sdf
-  gripper.sdf
-  gui.sdf
-  imu.sdf
-  inertial.sdf
-  joint.sdf
-  light.sdf
-  link.sdf
-  model.sdf
-  physics.sdf
-  plugin.sdf
-  projector.sdf
-  ray.sdf
-  rfidtag.sdf
-  rfid.sdf
-  road.sdf
-  root.sdf
-  scene.sdf
-  sensor.sdf
-  state.sdf
-  surface.sdf
-  visual.sdf
-  world.sdf
-)
-
-install(FILES ${sdfs} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/sdf/1.4)
diff --git a/gazebo/sdf/1.4/actor.sdf b/gazebo/sdf/1.4/actor.sdf
deleted file mode 100644
index d90c523..0000000
--- a/gazebo/sdf/1.4/actor.sdf
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- Actor -->
-<element name="actor" required="*">
-  <description></description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description></description>
-  </attribute>
-
-  <attribute name="static" type="bool" default="false" required="0">
-    <description></description>
-  </attribute>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>Origin of the actor</description>
-  </element>
-
-  <element name="skin" required="1">
-    <description></description>
-
-    <element name="filename" type="string" default="__default__" required="1">
-      <description></description>
-    </element>
-
-    <element name="scale" type="double" default="1.0" required="0"> 
-      <description></description>
-    </element>
-  </element> <!-- End Skin -->
-
-  <element name="animation" required="+">
-    <description></description>
-
-    <attribute name="name" type="string" default="__default__" required="1">
-      <description></description>
-    </attribute>
-
-    <element name="filename" type="string" default="__default__" required="1">
-      <description></description>
-    </element>
-    <element name="scale" type="double" default="1.0" required="0">
-      <description></description>
-    </element>
-    <element name="interpolate_x" type="bool" default="false" required="0">
-      <description></description>
-    </element>
-  </element> <!-- End Animation -->
-
-  <element name="script" required="1">
-    <description></description>
-
-    <element name="loop" type="bool" default="true" required="0">
-      <description></description>
-    </element>
-
-    <element name="delay_start" type="double" default="0.0" required="0">
-      <description></description>
-    </element>
-
-    <element name="auto_start" type="bool" default="true" required="0">
-      <description></description>
-    </element>
-
-    <element name="trajectory" required="*">
-      <description></description>
-      <attribute name="id" type="int" default="0" required="1">
-        <description></description>
-      </attribute>
-
-      <attribute name="type" type="string" default="__default__" required="1">
-        <description></description>
-      </attribute>
-
-      <element name="waypoint" required="*">
-        <description></description>
-        <element name="time" type="double" default="0.0" required="1">
-          <description></description>
-        </element>
-        <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-          <description></description>
-        </element>
-      </element> <!-- End Waypoint -->
-    </element> <!-- End Action -->
-  </element> <!-- End Script -->
-  
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-
-</element> <!-- End Actor -->
diff --git a/gazebo/sdf/1.4/camera.sdf b/gazebo/sdf/1.4/camera.sdf
deleted file mode 100644
index 5ae23cb..0000000
--- a/gazebo/sdf/1.4/camera.sdf
+++ /dev/null
@@ -1,71 +0,0 @@
-<element name="camera" required="0">
-  <description>These elements are specific to camera sensors.</description>
-
-  <attribute name="name" type="string" default="__default__" required="0">
-    <description>An optional name for the camera.</description>
-  </attribute>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the parent coordinate frame for the camera.</description>
-  </element>
-
-  <element name="horizontal_fov" type="double" default="1.047" min="0.1" max="1.5708" required="1">
-    <description>Horizontal field of view</description>
-  </element> <!-- End Horizontal_FOV -->
-
-  <element name="image" required="1">
-    <description>The image size in pixels and format.</description>
-    <element name="width" type="int" default="320" required="1">
-      <description>Width in pixels</description>
-    </element>
-    <element name="height" type="int" default="240" required="1">
-      <description>Height in pixels </description>
-    </element>
-    <element name="format" type="string" default="R8G8B8" required="0">
-      <description>(L8|R8G8B8|B8G8R8|BAYER_RGGB8|BAYER_BGGR8|BAYER_GBRG8|BAYER_GRBG8)</description>
-    </element>
-  </element> <!-- End Image -->
-
-  <element name="clip" required="1">
-    <description>The near and far clip planes. Objects closer or farther than these planes are not rendered.</description>
-
-    <element name="near" type="double" default=".1" min="0.0" required="1">
-      <description>Near clipping plane</description>
-    </element>
-
-    <element name="far" type="double" default="100" min="10.0" required="1">
-      <description>Far clipping plane</description>
-    </element>
-  </element> <!-- End Clip -->
-
-  <element name="save" required="0">
-    <description>Enable or disable saving of camera frames.</description>
-    <attribute name="enabled" type="bool" default="false" required="1">
-      <description>True = saving enabled</description>
-    </attribute>
-    <element name="path" type="string" default="__default__" required="1">
-      <description>The path name which will hold the frame data. If path name is relative, then directory is relative to current working directory.</description>
-    </element>
-  </element> <!-- End Save -->
-
-  <element name="depth_camera" required="0">
-    <description>Depth camera parameters</description>
-    <element name="output" type="string" default="depths" required="1">
-      <description>Type of output</description>
-    </element>
-  </element> <!-- End depth_camera -->
-
-  <element name="noise" required="0">
-    <description>The properties of the noise model that should be applied to generated images</description>
-    <element name="type" type="string" default="gaussian" required="1">
-      <description>The type of noise.  Currently supported types are: "gaussian" (draw additive noise values independently for each pixel from a Gaussian distribution).</description>
-    </element>
-    <element name="mean" type="double" default="0.0" required="0">
-      <description>For type "gaussian," the mean of the Gaussian distribution from which noise values are drawn.</description>
-    </element>
-    <element name="stddev" type="double" default="0.0" required="0">
-      <description>For type "gaussian," the standard deviation of the Gaussian distribution from which noise values are drawn.</description>
-    </element>
-  </element> <!-- End Noise -->
-
-</element> <!-- End Camera -->
diff --git a/gazebo/sdf/1.4/collision.sdf b/gazebo/sdf/1.4/collision.sdf
deleted file mode 100644
index 051732d..0000000
--- a/gazebo/sdf/1.4/collision.sdf
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Collision -->
-<element name="collision" required="*">
-  <description>The collision properties of a link. Note that this can be different from the visual properties of a link, for example, simpler collision models are often used to reduce computation time.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Unique name for the collision element within the scope of the parent link.</description>
-  </attribute>
-
-  <element name="laser_retro" type="double" default="0" required="0">
-    <description>intensity value returned by laser sensor.</description>
-  </element>
-
-  <element name="max_contacts" type="int" default="10" required="0">
-    <description>Maximum number of contacts allowed between two entities. This value overrides the max_contacts element defined in physics.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>The reference frame of the collision element, relative to the reference frame of the link.</description>
-  </element>
-
-  <include filename="geometry.sdf" required="1"/>
-  <include filename="surface.sdf" required="0"/>
-
-</element> <!-- End Collision -->
diff --git a/gazebo/sdf/1.4/collision_engine.sdf b/gazebo/sdf/1.4/collision_engine.sdf
deleted file mode 100644
index 67dbc70..0000000
--- a/gazebo/sdf/1.4/collision_engine.sdf
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- Collision Engine -->
-<element name="collision_engine" required="1">
-  <description>The collision_engine tag specifies the type and properties of the collision detection engine.</description>
-
-  <element name="ode" required="0">
-    <attribute name="type" type="string" default="__default__" required="0">
-      <description>The type of the collision detection engine. Current default in ODE is OPCODE.</description>
-    </attribute>
-  </element>
-
-  <element name="bullet" required="0">
-    <attribute name="type" type="string" default="__default__" required="0">
-      <description>The type of the collision detection engine.</description>
-    </attribute>
-  </element>
-
-</element> <!-- Collision Engine -->
diff --git a/gazebo/sdf/1.4/contact.sdf b/gazebo/sdf/1.4/contact.sdf
deleted file mode 100644
index d1cde50..0000000
--- a/gazebo/sdf/1.4/contact.sdf
+++ /dev/null
@@ -1,12 +0,0 @@
-<element name="contact" required="0">
-  <description>These elements are specific to the contact sensor.</description>
-
-  <element name="collision" type="string" default="__default__" required="1">
-    <description>name of the collision element within a link that acts as the contact sensor.</description>
-  </element> <!-- End Collision -->
-
-  <element name="topic" type="string" default="__default_topic__" required="1">
-    <description>Topic on which contact data is published.</description>
-  </element>
-
-</element> <!-- End Contact -->
diff --git a/gazebo/sdf/1.4/geometry.sdf b/gazebo/sdf/1.4/geometry.sdf
deleted file mode 100644
index 2e74e19..0000000
--- a/gazebo/sdf/1.4/geometry.sdf
+++ /dev/null
@@ -1,116 +0,0 @@
-<!-- Geometry -->
-<element name="geometry" required="1">
-  <description>The shape of the visual or collision object.</description>
-
-  <element name="box" required="0">
-    <description>Box shape</description>
-    <element name="size" type="vector3" default="1 1 1" required="1">
-      <description>The three side lengths of the box. The origin of the box is in its geometric center (inside the center of the box).</description>
-    </element>
-  </element> <!-- End Box -->
-
-  <element name="sphere" required="0">
-    <description>Sphere shape</description>
-    <element name="radius" type="double" default="1" required="1">
-      <description>radius of the sphere</description>
-    </element>
-  </element> <!-- End Sphere -->
-
-  <element name="cylinder" required="0">
-    <description>Cylinder shape</description>
-    <element name="radius" type="double" default="1" required="1">
-      <description>Radius of the cylinder</description>
-    </element>
-    <element name="length" type="double" default="1" required="1">
-      <description>Length of the cylinder</description>
-    </element>
-  </element> <!-- End Cylinder -->
-
-  <element name="mesh" required="0">
-    <description>Mesh shape</description>
-    <element name="uri" type="string" default="__default__" required="1">
-      <description>Mesh uri</description>
-    </element>
-
-    <element name="submesh" required="0">
-      <description>Use a named submesh. The submesh must exist in the mesh specified by the uri</description>
-      <element name="name" type="string" default="__default__" required="1">
-        <description>Name of the submesh within the parent mesh</description>
-      </element>
-      <element name="center" type="bool" default="false" required="0">
-        <description>Set to true to center the vertices of the submesh at 0,0,0. This will effectively remove any transformations on the submesh before the poses from parent links and models are applied.</description>
-      </element>
-    </element> <!-- End submesh -->
-
-    <element name="scale" type="vector3" default="1 1 1" required="0">
-      <description>Scaling factor applied to the mesh</description>
-    </element>
-  </element> <!-- End Mesh -->
-
-  <element name="plane" required="0">
-    <description>Plane shape</description>
-    <element name="normal" type="vector3" default="0 0 1" required="1">
-      <description>Normal direction for the plane</description>
-    </element>
-    <element name="size" type="vector2d" default="1 1" min="0 0" required="1">
-      <description>Length of each side of the plane</description> 
-    </element>
-  </element> <!-- End Plane -->
-
-  <element name="image" required="0">
-    <description>Extrude a set of boxes from a grayscale image.</description>
-    <element name="uri" type="string" default="__default__" required="1">
-      <description>URI of the grayscale image file</description>
-    </element>
-    <element name="scale" type="double" default="1" required="1">
-      <description>Scaling factor applied to the image</description>
-    </element>
-    <element name="threshold" type="int" default="200" required="1">
-      <description>Grayscale threshold</description>
-    </element>
-    <element name="height" type="double" default="1" required="1">
-      <description>Height of the extruded boxes</description>
-    </element>
-    <element name="granularity" type="int" default="1" required="1">
-      <description>The amount of error in the model</description>
-    </element>
-  </element> <!-- End Image -->
-
-  <element name="heightmap" required="0">
-    <description>A heightmap based on a 2d grayscale image.</description>
-    <element name="uri" type="string" default="__default__" required="1">
-      <description>URI to a grayscale image file</description>
-    </element>
-    <element name="size" type="vector3" default="1 1 1" required="1">
-      <description>The size of the heightmap in world units</description>
-    </element>
-    <element name="pos" type="vector3" default="0 0 0" required="0">
-      <description>A position offset.</description>
-    </element>
-
-    <element name="texture" required="*">
-      <description>The heightmap can contain multiple textures. The order of the texture matters. The first texture will appear at the lowest height, and the last texture at the highest hieght. Use blend to control the hieight thresholds and fade between textures.</description>
-      <element name="size" type="double" default="10" required="1">
-        <description>Size of the applied texture in meters.</description>
-      </element>
-      <element name="diffuse" type="string" default="__default__" required="1">
-        <description>Diffuse texture image filename</description>
-      </element>
-      <element name="normal" type="string" default="__default__" required="1">
-        <description>Normalmap texture image filename</description>
-      </element>
-    </element>
-    <element name="blend" required="*">
-      <description>The blend tag controls how two adjacent textures are mixed. The number of blend elements should equal one less than the number of textures.</description>
-      <element name="min_height" type="double" default="0" required="1">
-        <description>Min height of a blend layer</description>
-      </element>
-      <element name="fade_dist" type="double" default="0" required="1">
-        <description>Distance over which the blend occurs</description>
-      </element>
-    </element>
-  </element> <!-- End Heightmap -->
-  <element name="empty" required="0">
-    <description>You can use the empty tag to make empty geometries.</description>
-  </element> <!-- End empty -->
-</element><!-- End Geometry -->
diff --git a/gazebo/sdf/1.4/gripper.sdf b/gazebo/sdf/1.4/gripper.sdf
deleted file mode 100644
index 12fd0b3..0000000
--- a/gazebo/sdf/1.4/gripper.sdf
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Gripper -->
-<element name="gripper" required="*">
-  <description></description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description></description>
-  </attribute>
-
-  <element name="grasp_check" required="0">
-    <description></description>
-    <element name="detach_steps" type="int" default="40" required="0">
-      <description></description>
-    </element>
-    <element name="attach_steps" type="int" default="20" required="0">
-      <description></description>
-    </element>
-    <element name="min_contact_count" type="unsigned int" default="2" required="0">
-      <description></description>
-    </element>
-  </element>
-
-  <element name="gripper_link" type="string" default="__default__" required="+">
-    <description></description>
-  </element>
-
-  <element name="palm_link" type="string" default="__default__" required="1">
-    <description></description>
-  </element>
-
-</element>
diff --git a/gazebo/sdf/1.4/gui.sdf b/gazebo/sdf/1.4/gui.sdf
deleted file mode 100644
index 8300090..0000000
--- a/gazebo/sdf/1.4/gui.sdf
+++ /dev/null
@@ -1,39 +0,0 @@
-<!-- gui -->
-<element name="gui" required="0">
-  <attribute name="fullscreen" type="bool" default="false" required="0">
-    <description></description>
-  </attribute>
-
-  <element name="camera" required="0">
-    <description> </description>
-
-    <attribute name="name" type="string" default="user_camera" required="1">
-      <description></description>
-    </attribute>
-
-
-    <element name="view_controller" type="string" default="orbit" required="0">
-      <description></description>
-    </element>
-
-    <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-      <description></description>
-    </element>
-
-    <element name="track_visual" required="0">
-      <description></description>
-
-      <element name="name" type="string" default="__default__" required="1">
-        <description></description>
-      </element>
-
-      <element name="min_dist" type="double" default="0" required="0">
-        <description></description>
-      </element>
-
-      <element name="max_dist" type="double" default="0" required="0">
-        <description></description>
-      </element>
-    </element>
-  </element>
-</element>
diff --git a/gazebo/sdf/1.4/imu.sdf b/gazebo/sdf/1.4/imu.sdf
deleted file mode 100644
index dde8db3..0000000
--- a/gazebo/sdf/1.4/imu.sdf
+++ /dev/null
@@ -1,46 +0,0 @@
-<element name="imu" required="0">
-  <description>These elements are specific to the IMU sensor.</description>
-
-  <element name="topic" type="string" default="__default_topic__" required="0">
-    <description>Topic on which data is published.</description>
-  </element>
-
-  <element name="noise" required="0">
-    <description>The properties of the noise model that should be applied to generated data</description>
-    <element name="type" type="string" default="gaussian" required="1">
-      <description>The type of noise.  Currently supported types are: "gaussian" (draw noise values independently for each beam from a Gaussian distribution).</description>
-    </element>
-    <element name="rate" required="1">
-      <description>Noise parameters for angular rates.</description>
-      <element name="mean" type="double" default="0.0" required="0">
-        <description>For type "gaussian," the mean of the Gaussian distribution from which noise values are drawn.</description>
-      </element>
-      <element name="stddev" type="double" default="0.0" required="0">
-        <description>For type "gaussian," the standard deviation of the Gaussian distribution from which noise values are drawn.</description>
-      </element>
-      <element name="bias_mean" type="double" default="0.0" required="0">
-        <description>For type "gaussian," the mean of the Gaussian distribution from which bias values are drawn.</description>
-      </element>
-      <element name="bias_stddev" type="double" default="0.0" required="0">
-        <description>For type "gaussian," the standard deviation of the Gaussian distribution from which bias values are drawn.</description>
-      </element>
-    </element> <!-- End Rate -->
-
-    <element name="accel" required="1">
-      <description>Noise parameters for linear accelerations.</description>
-      <element name="mean" type="double" default="0.0" required="0">
-        <description>For type "gaussian," the mean of the Gaussian distribution from which noise values are drawn.</description>
-      </element>
-      <element name="stddev" type="double" default="0.0" required="0">
-        <description>For type "gaussian," the standard deviation of the Gaussian distribution from which noise values are drawn.</description>
-      </element>
-      <element name="bias_mean" type="double" default="0.0" required="0">
-        <description>For type "gaussian," the mean of the Gaussian distribution from which bias values are drawn.</description>
-      </element>
-      <element name="bias_stddev" type="double" default="0.0" required="0">
-        <description>For type "gaussian," the standard deviation of the Gaussian distribution from which bias values are drawn.</description>
-      </element>
-    </element> <!-- End Accel -->
-  </element> <!-- End Noise -->
-
-</element>
diff --git a/gazebo/sdf/1.4/inertial.sdf b/gazebo/sdf/1.4/inertial.sdf
deleted file mode 100644
index 417489f..0000000
--- a/gazebo/sdf/1.4/inertial.sdf
+++ /dev/null
@@ -1,34 +0,0 @@
-<!-- Inertial -->
-<element name="inertial" required="0">
-  <description>The inertial properties of the link.</description>
-
-  <element name="mass" type="double" default="1.0" required="0">
-    <description>The mass of the link.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>This is the pose of the inertial reference frame, relative to the link reference frame. The origin of the inertial reference frame needs to be at the center of gravity. The axes of the inertial reference frame do not need to be aligned with the principal axes of the inertia.</description>
-  </element>
-
-  <element name="inertia" required="0">
-    <description>The 3x3 rotational inertia matrix. Because the rotational inertia matrix is symmetric, only 6 above-diagonal elements of this matrix are specified here, using the attributes ixx, ixy, ixz, iyy, iyz, izz.</description>
-    <element name="ixx" type="double" default="1.0" required="1">
-      <description></description>
-    </element>
-    <element name="ixy" type="double" default="0.0" required="1">
-      <description></description>
-    </element>
-    <element name="ixz" type="double" default="0.0" required="1">
-      <description></description>
-    </element>
-    <element name="iyy" type="double" default="1.0" required="1">
-      <description></description>
-    </element>
-    <element name="iyz" type="double" default="0.0" required="1">
-      <description></description>
-    </element>
-    <element name="izz" type="double" default="1.0" required="1">
-      <description></description>
-    </element>
-  </element> <!-- End Inertia -->
-</element> <!-- End Inertial -->
diff --git a/gazebo/sdf/1.4/joint.sdf b/gazebo/sdf/1.4/joint.sdf
deleted file mode 100644
index 0834352..0000000
--- a/gazebo/sdf/1.4/joint.sdf
+++ /dev/null
@@ -1,169 +0,0 @@
-<!-- Joint -->
-<element name="joint" required="*">
-  <description>A joint connections two links with kinematic and dynamic properties.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the joint within the scope of the model.</description>
-  </attribute>
-
-  <attribute name="type" type="string" default="__default__" required="1">
-    <description>The type of joint, which must be one of the following: (revolute) a hinge joint that rotates on a single axis with either a fixed or continuous range of motion, (revolute2) same as two revolute joints connected in series, (prismatic) a sliding joint that slides along an axis with a limited range specified by upper and lower limits, (ball) a ball and socket joint, (universal), like a ball joint, but constrains one degree of freedom, (piston) similar to a Slider joint exce [...]
-  </attribute>
-
-  <element name="parent" type="string" default="__default__" required="1">
-    <description>Name of the parent link</description>
-  </element> <!-- End Parent -->
-
-  <element name="child" type="string" default="__default__" required="1">
-    <description>Name of the child link</description>
-  </element> <!-- End Child -->
-
-  <!-- This is new stuff for SimBody support. We need to refactor SDF a bit more to remove link poses when this change is made-->
-  <!--<element name="parent" required="1">
-    <description>Parent link of the joint</description>
-    <element name="link_name" type="string" default="__default__" required="1">
-      <description>Name of the parent link</description>
-    </element>
-    <element name="pose" type="Pose" default="0 0 0 0 0 0" required="0">
-      <description>Experimental:  alternative joint pose specification.</description>
-    </element>
-  </element>
-
-  <element name="child" required="1">
-    <description>Child link of the joint</description>
-    <element name="link_name" type="string" default="__default__" required="1">
-      <description>Name of the child link</description>
-    </element>
-    <element name="pose" type="Pose" default="0 0 0 0 0 0" required="0">
-      <description>Experimental:  alternative joint pose specification.</description>
-    </element>
-  </element>
-  -->
-
-  <element name="pose"  type="pose" default="0 0 0 0 0 0" required="0">
-    <description>offset from child link origin in child link frame.</description>
-  </element>
-
-  <element name="thread_pitch" type="double" default="1.0" required="0">
-    <description></description>
-  </element>
-
-  <element name="axis" required="1">
-    <description>The joint axis specified in the model frame. This is the axis of rotation for revolute joints, the axis of translation for prismatic joints. The axis is currently specified in the model frame of reference, but this will be changed to the joint frame in future version of sdf (see gazebo issue #494).</description>
-    <element name="xyz" type="vector3" default="0 0 1" required="1">
-      <description>Represents the x,y,z components of a vector. The vector should be normalized.</description>
-    </element>
-    <element name="dynamics" required="0">
-      <description>An element specifying physical properties of the joint. These values are used to specify modeling properties of the joint, particularly useful for simulation.</description>
-      <element name="damping" type="double" default="0" required="0">
-        <description>The physical velocity dependent viscous damping coefficient of the joint.</description>
-      </element>
-      <element name="friction" type="double" default="0" required="0">
-        <description>The physical static friction value of the joint.</description>
-      </element>
-    </element> <!-- End Dynamics -->
-    <element name="limit" required="1">
-      <description>specifies the limits of this joint</description>
-      <element name="lower" type="double" default="-1e16" required="1">
-        <description>An attribute specifying the lower joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="upper" type="double" default="1e16" required="1">
-        <description>An attribute specifying the upper joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="effort" type="double" default="-1" required="0">
-        <description>An attribute for enforcing the maximum joint effort applied by Joint::SetForce.  Limit is not enforced if value is negative.</description>
-      </element>
-      <element name="velocity" type="double" default="-1" required="0">
-        <description>(not implemented) An attribute for enforcing the maximum joint velocity.</description>
-      </element>
-    </element> <!-- End Limit -->
-  </element> <!-- End Axis -->
-
-  <element name="axis2" required="0">
-    <description>The second joint axis specified in the model frame. This is the second axis of rotation for revolute2 joints and universal joints. The axis is currently specified in the model frame of reference, but this will be changed to the joint frame in future version of sdf (see gazebo issue #494).</description>
-    <element name="xyz" type="vector3" default="0 0 1" required="1">
-      <description>Represents the x,y,z components of a vector. The vector should be normalized.</description>
-    </element>
-    <element name="dynamics" required="0">
-      <description>An element specifying physical properties of the joint. These values are used to specify modeling properties of the joint, particularly useful for simulation.</description>
-      <element name="damping" type="double" default="0" required="0">
-        <description>The physical velocity dependent viscous damping coefficient of the joint.</description>
-      </element>
-      <element name="friction" type="double" default="0" required="0">
-        <description>The physical static friction value of the joint.</description>
-      </element>
-    </element> <!-- End Dynamics -->
-
-    <element name="limit" required="0">
-      <description></description>
-      <element name="lower" type="double" default="-1e16" required="0">
-        <description>An attribute specifying the lower joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="upper" type="double" default="1e16" required="0">
-        <description>An attribute specifying the upper joint limit (radians for revolute joints, meters for prismatic joints). Omit if joint is continuous.</description>
-      </element>
-      <element name="effort" type="double" default="-1" required="0">
-        <description>An attribute for enforcing the maximum joint effort applied by Joint::SetForce.  Limit is not enforced if value is negative.</description>
-      </element>
-      <element name="velocity" type="double" default="-1" required="0">
-        <description>(not implemented) An attribute for enforcing the maximum joint velocity.</description>
-      </element>
-    </element> <!-- End Limit -->
-  </element> <!-- End Axis2 -->
-
-  <element name="physics" required="0">
-    <description>Parameters that are specific to a certain physics engine.</description>
-    <element name="simbody" required="0">
-      <description>Simbody specific parameters</description>
-      <element name="must_be_loop_joint" type="bool" default="0" required="0">
-        <description>Force cut in the multibody graph at this joint.</description>
-      </element>
-    </element>
-    <element name="ode" required="0">
-      <description>ODE specific parameters</description>
-      <element name="provide_feedback" type="bool" default="false" required="0">
-        <description>If provide feedback is set to true, ODE will compute the constraint forces at this joint.</description>
-      </element>
-
-      <element name="cfm_damping" type="bool" default="false" required="0">
-        <description>If cfm damping is set to true, ODE will use CFM to simulate damping, allows for infinite damping, and one additional constraint row (previously used for joint limit) is always active.</description>
-      </element>
-
-      <element name="fudge_factor" type="double" default="0" required="0">
-        <description>Scale the excess for in a joint motor at joint limits. Should be between zero and one.</description>
-      </element>
-      <element name="cfm" type="double" default="0" required="0">
-        <description>Constraint force mixing used when not at a stop</description>
-      </element>
-      <element name="bounce" type="double" default="0" required="0">
-        <description>Bounciness of the limits</description>
-      </element>
-      <element name="max_force" type="double" default="0" required="0">
-        <description>Maximum force or torque used to reach the desired velocity.</description>
-      </element>
-      <element name="velocity" type="double" default="0" required="0">
-        <description>The desired velocity of the joint. Should only be set if you want the joint to move on load.</description>
-      </element>
-
-      <element name="limit" required="0">
-        <description></description>
-        <element name="cfm" type="double" default="0.0" required="1">
-          <description>Constraint force mixing parameter used by the joint stop</description>
-        </element>
-        <element name="erp" type="double" default="0.2" required="1">
-          <description>Error reduction parameter used by the joint stop</description>
-        </element>
-      </element>
-
-      <element name="suspension" required="0">
-        <description></description>
-        <element name="cfm" type="double" default="0.0" required="1">
-          <description>Suspension constraint force mixing parameter</description>
-        </element>
-        <element name="erp" type="double" default="0.2" required="1">
-          <description>Suspension error reduction parameter</description>
-        </element>
-      </element>
-    </element>
-  </element> <!-- End Physics -->
-</element> <!-- End Joint -->
diff --git a/gazebo/sdf/1.4/light.sdf b/gazebo/sdf/1.4/light.sdf
deleted file mode 100644
index 745308c..0000000
--- a/gazebo/sdf/1.4/light.sdf
+++ /dev/null
@@ -1,61 +0,0 @@
-<!-- Light -->
-<element name="light" required="*">
-  <description>The light element describes a light source.</description>
-
-  <attribute name="name" type="string" default="__default__" required="0">
-    <description>A unique name for the light.</description>
-  </attribute>
-
-  <attribute name="type" type="string" default="point" required="1">
-    <description>The light type: point, directional, spot.</description>
-  </attribute>
-
-  <element name="cast_shadows" type="bool" default="false" required="0">
-    <description>When true, the light will cast shadows.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the global coordinate frame for the light.</description>
-  </element>
-
-  <element name="diffuse" type="color" default="1 1 1 1" required="1">
-    <description>Diffuse light color</description>
-  </element>
-  <element name="specular" type="color" default=".1 .1 .1 1" required="1">
-    <description>Specular light color</description>
-  </element>
-
-  <element name="attenuation" required="0">
-    <description>Light attenuation</description>
-    <element name="range" type="double" default="10" required="1">
-      <description>Range of the light</description>
-    </element>
-    <element name="linear" type="double" default="1" required="0">
-      <description>The linear attenuation factor: 1 means attenuate evenly over the distance.</description>
-    </element>
-    <element name="constant" type="double" default="1" required="0">
-      <description>The constant attenuation factor: 1.0 means never attenuate, 0.0 is complete attenutation.</description>
-    </element>
-    <element name="quadratic" type="double" default="0" required="0">
-      <description>The quadratic attenuation factor: adds a curvature to the attenuation.</description>
-    </element>
-  </element> <!-- End Attenuation -->
-
-  <element name="direction" type="vector3" default="0 0 -1" required="1">
-    <description>Direction of the light, only applicable for spot and directional lights.</description>
-  </element><!-- End Directional -->
-
-  <element name="spot" required="0">
-    <description>Spot light parameters</description>
-    <element name="inner_angle" type="double" default="0" required="1">
-      <description>Angle covered by the bright inner cone</description>
-    </element>
-    <element name="outer_angle" type="double" default="0" required="1">
-      <description>Angle covered by the outer cone</description>
-    </element>
-    <element name="falloff" type="double" default="0" required="1">
-      <description>The rate of falloff between the inner and outer cones. 1.0 means a linear falloff, less means slower falloff, higher means faster falloff.</description>
-    </element>
-  </element> <!-- End Spot -->
-
-</element> <!-- End Light -->
diff --git a/gazebo/sdf/1.4/link.sdf b/gazebo/sdf/1.4/link.sdf
deleted file mode 100644
index 770b2de..0000000
--- a/gazebo/sdf/1.4/link.sdf
+++ /dev/null
@@ -1,45 +0,0 @@
-<!-- Link -->
-<element name="link" required="+">
-  <description>A physical link with inertia, collision, and visual properties. A link must be a child of a model, and any number of links may exist in a model.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the link within the scope of the model.</description>
-  </attribute>
-
-  <element name="gravity" type="bool" default="true" required="0">
-    <description>If true, the link is affected by gravity.</description>
-  </element>
-
-  <element name="self_collide" type="bool" default="false" required="0">
-    <description>If true, the link can collide with other links in the model.</description>
-  </element>
-
-  <element name="kinematic" type="bool" default="false" required="0">
-    <description>If true, the link is kinematic only</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>This is the pose of the link reference frame, relative to the model reference frame.</description>
-  </element>
-
-  <element name="must_be_base_link" type="bool" default="false" required="0">
-    <description>If true, the link will have 6DOF and be a direct child of world.</description>
-  </element>
-
-  <element name="velocity_decay" required="1">
-    <description>Exponential damping of the link's velocity.</description>
-    <element name="linear" type="double" default="0.0" required="1">
-      <description>Linear damping</description>
-    </element>
-    <element name="angular" type="double" default="0.0" required="1">
-      <description>Angular damping</description>
-    </element>
-  </element> <!-- End velocity decay -->
-
-  <include filename="inertial.sdf" required="0"/>
-  <include filename="collision.sdf" required="*"/>
-  <include filename="visual.sdf" required="*"/>
-  <include filename="sensor.sdf" required="*"/>
-  <include filename="projector.sdf" required="*"/>
-
-</element> <!-- End Link -->
diff --git a/gazebo/sdf/1.4/model.sdf b/gazebo/sdf/1.4/model.sdf
deleted file mode 100644
index 2ec8b59..0000000
--- a/gazebo/sdf/1.4/model.sdf
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Model -->
-<element name="model" required="*">
-  <description>The model element defines a complete robot or any other physical object.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the model. This name must not match another model in the world.</description>
-  </attribute>
-
-  <element name="static" type="bool" default="false" required="0">
-    <description>If set to true, the model is immovable. Otherwise the model is simulated in the dynamics engine.</description>
-  </element>
-
-  <element name="allow_auto_disable" type="bool" default="true" required="0">
-    <description>Allows a model to auto-disable, which is means the physics engine can skip updating the model when the model is at rest. This parameter is only used by models with no joints.</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the global coordinate frame for the model. Position(x,y,z) and rotation (roll, pitch yaw) in the global coordinate frame.</description>
-  </element>
-
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="gripper.sdf" required="*"/>
-
-</element> <!-- End Model -->
diff --git a/gazebo/sdf/1.4/physics.sdf b/gazebo/sdf/1.4/physics.sdf
deleted file mode 100644
index 8802ddf..0000000
--- a/gazebo/sdf/1.4/physics.sdf
+++ /dev/null
@@ -1,118 +0,0 @@
-<!-- Physics -->
-<element name="physics" required="1">
-  <description>The physics tag specifies the type and properties of the dynamics engine.</description>
-
-  <attribute name="type" type="string" default="ode" required="1">
-    <description>The type of the dynamics engine. Current options are ode, bullet, simbody and rtql8.  Defaults to ode if left unspecified.</description>
-  </attribute>
-
-  <element name="max_step_size" type="double" default="0.001" required="1">
-    <description>Maximum time step size at which every system in simulation can interact with the states of the world.  (was physics.sdf's dt).</description>
-  </element>
-
-  <!-- real_time_factor (simulation speedup) might be more intuitive to end
-       users than real_time_update_rate -->
-  <element name="real_time_factor" type="double" default="1.0" required="1">
-    <description>target simulation speedup factor, defined by ratio of simulation time to real-time.</description>
-  </element>
-
-  <!-- to be deprecated by real_time_factor -->
-  <element name="real_time_update_rate" type="double" default="1000" required="1">
-    <description>Rate at which to update the physics engine (UpdatePhysics calls per real-time second). (was physics.sdf's update_rate).</description>
-  </element>
-
-  <element name="max_contacts" type="int" default="20" required="0">
-    <description>Maximum number of contacts allowed between two entities. This value can be over ridden by a max_contacts element in a collision element.</description>
-  </element>
-
-  <element name="gravity" type="vector3" default="0 0 -9.8" required="1">
-    <description>The gravity vector</description>
-  </element> <!-- End Gravity -->
-
-  <element name="simbody" required="0">
-    <description>Simbody specific physics properties</description>
-    <element name="min_step_size" type="double" default="0.0001" required="0">
-      <description>TBD</description>
-    </element>
-    <element name="accuracy" type="double" default="0.01" required="0">
-      <description>Roughly the relative error of the system.
-        -LOG(accuracy) is roughly the number of significant digits.</description>
-    </element>
-  </element>
-
-  <element name="bullet" required="0">
-    <description>Bullet specific physics properties</description>
-    <element name="solver" required="1">
-      <description></description>
-      <element name="type" type="string" default="sequential_impulse" required="1">
-        <description>One of the following types: sequential_impulse only.</description>
-      </element>
-      <element name="min_step_size" type="double" default="0.0001" required="0">
-        <description>The time duration which advances with each iteration of the dynamics engine, this has to be no bigger than max_step_size under physics block.  If left unspecified, min_step_size defaults to max_step_size.</description>
-      </element>
-      <element name="iters" type="int" default="50" required="1">
-        <description>Number of iterations for each step. A higher number produces greater accuracy at a performance cost.</description>
-      </element>
-      <element name="sor" type="double" default="1.3" required="1">
-        <description>Set the successive over-relaxation parameter.</description>
-      </element>
-    </element> <!-- End Solver -->
-
-    <element name="constraints" required="1">
-      <description>Bullet constraint parameters.</description>
-      <element name="cfm" type="double" default="0" required="1">
-        <description>Constraint force mixing parameter. See the ODE page for more information.</description>
-      </element>
-      <element name="erp" type="double" default="0.2" required="1">
-        <description>Error reduction parameter. See the ODE page for more information.</description>
-      </element>
-      <element name="contact_surface_layer" type="double" default="0.001" required="1">
-        <description>The depth of the surface layer around all geometry objects. Contacts are allowed to sink into the surface layer up to the given depth before coming to rest. The default value is zero. Increasing this to some small value (e.g. 0.001) can help prevent jittering problems due to contacts being repeatedly made and broken.</description>
-      </element>
-      <element name="split_impulse" type="bool" default="1" required="1">
-        <description>Similar to ODE's max_vel implementation. See http://web.archive.org/web/20120430155635/http://bulletphysics.org/mediawiki-1.5.8/index.php/BtContactSolverInfo#Split_Impulse for more information.</description>
-      </element>
-      <element name="split_impulse_penetration_threshold" type="double" default="-0.01" required="1">
-        <description>Similar to ODE's max_vel implementation.  See http://web.archive.org/web/20120430155635/http://bulletphysics.org/mediawiki-1.5.8/index.php/BtContactSolverInfo#Split_Impulse for more information.</description>
-      </element>
-    </element> <!-- End Constraints -->
-  </element>
-
-  <element name="ode" required="0">
-    <description>ODE specific physics properties</description>
-    <element name="solver" required="1">
-      <description></description>
-      <element name="type" type="string" default="quick" required="1">
-        <description>One of the following types: world, quick</description>
-      </element>
-      <element name="min_step_size" type="double" default="0.0001" required="0">
-        <description>The time duration which advances with each iteration of the dynamics engine, this has to be no bigger than max_step_size under physics block.  If left unspecified, min_step_size defaults to max_step_size.</description>
-      </element>
-      <element name="iters" type="int" default="50" required="1">
-        <description>Number of iterations for each step. A higher number produces greater accuracy at a performance cost.</description>
-      </element>
-      <element name="precon_iters" type="int" default="0" required="0">
-        <description></description>
-      </element>
-      <element name="sor" type="double" default="1.3" required="1">
-        <description>Set the successive over-relaxation parameter.</description>
-      </element>
-    </element> <!-- End Solver -->
-
-    <element name="constraints" required="1">
-      <description>ODE constraint parameters.</description>
-      <element name="cfm" type="double" default="0" required="1">
-        <description>Constraint force mixing parameter. See the ODE page for more information.</description>
-      </element>
-      <element name="erp" type="double" default="0.2" required="1">
-        <description>Error reduction parameter. See the ODE page for more information.</description>
-      </element>
-      <element name="contact_max_correcting_vel" type="double" default="100.0" required="1">
-        <description>The maximum correcting velocities allowed when resolving contacts.</description>
-      </element>
-      <element name="contact_surface_layer" type="double" default="0.001" required="1">
-        <description>The depth of the surface layer around all geometry objects. Contacts are allowed to sink into the surface layer up to the given depth before coming to rest. The default value is zero. Increasing this to some small value (e.g. 0.001) can help prevent jittering problems due to contacts being repeatedly made and broken.</description>
-      </element>
-    </element> <!-- End Constraints -->
-  </element> <!-- ODE -->
-</element> <!-- Physics -->
diff --git a/gazebo/sdf/1.4/plugin.sdf b/gazebo/sdf/1.4/plugin.sdf
deleted file mode 100644
index 26405ff..0000000
--- a/gazebo/sdf/1.4/plugin.sdf
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- Plugin -->
-<element name="plugin" required="*">
-  <description>A plugin is a dynamically loaded chunk of code. It can exist as a child of world, model, and sensor.</description>
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the plugin, scoped to its parent.</description>
-  </attribute>
-  <attribute name="filename" type="string" default="__default__" required="1">
-    <description>Name of the shared library to load. If the filename is not a full path name, the file will be searched for in the configuration paths.</description>
-  </attribute>
-  <element copy_data="true" required="*">
-    <description>This is a special element that should not be specified in an SDF file. It automatically copies child elements into the SDF element so that a plugin can access the data.</description>
-  </element>
-</element> <!-- End Plugin -->
diff --git a/gazebo/sdf/1.4/projector.sdf b/gazebo/sdf/1.4/projector.sdf
deleted file mode 100644
index 9eabca9..0000000
--- a/gazebo/sdf/1.4/projector.sdf
+++ /dev/null
@@ -1,32 +0,0 @@
-<!-- Projector -->
-<element name="projector" required="0">
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Name of the projector</description>
-  </attribute>
-
-  <element name="texture" type="string" default="__default__" required="1">
-    <description>Texture name</description>
-  </element>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>Pose of the projector</description>
-  </element>
-
-
-  <element name="fov" type="double" default="0.785" required="0">
-    <description>Field of view</description>
-  </element>
-
-
-  <element name="near_clip" type="double" default="0.1" required="0">
-    <description>Near clip distance</description>
-  </element>
-
-
-  <element name="far_clip" type="double" default="10.0" required="0">
-    <description>far clip distance</description>
-  </element>
-
-
-  <include filename="plugin.sdf" required="*"/>
-</element>
diff --git a/gazebo/sdf/1.4/ray.sdf b/gazebo/sdf/1.4/ray.sdf
deleted file mode 100644
index 5ffeea3..0000000
--- a/gazebo/sdf/1.4/ray.sdf
+++ /dev/null
@@ -1,73 +0,0 @@
-<element name="ray" required="0">
-  <description>These elements are specific to the ray (laser) sensor.</description>
-
-  <element name="scan" required="1">
-    <description></description>
-    <element name="horizontal" required="1">
-      <description></description>
-
-      <element name="samples" type="unsigned int" default="640" required="1">
-        <description>The number of simulated rays to generate per complete laser sweep cycle.</description>
-      </element>
-
-      <element name="resolution" type="double" default="1" required="1">
-        <description>This number is multiplied by samples to determine the number of range data points returned. If resolution is less than one, range data is interpolated. If resolution is greater than one, range data is averaged.</description>
-      </element>
-
-      <element name="min_angle" type="double" default="0" required="1">
-        <description></description>
-      </element>
-
-      <element name="max_angle" type="double" default="0" required="1">
-        <description>Must be greater or equal to min_angle</description>
-      </element>
-
-    </element> <!-- End Horizontal -->
-
-    <element name="vertical" required="0">
-      <description></description>
-      <element name="samples" type="unsigned int" default="1" required="1">
-        <description>The number of simulated rays to generate per complete laser sweep cycle.</description>
-      </element>
-
-      <element name="resolution" type="double" default="1" required="0">
-        <description>This number is multiplied by samples to determine the number of range data points returned. If resolution is less than one, range data is interpolated. If resolution is greater than one, range data is averaged.</description>
-      </element>
-
-      <element name="min_angle" type="double" default="0" required="1">
-        <description></description>
-      </element>
-
-      <element name="max_angle" type="double" default="0" required="1">
-        <description>Must be greater or equal to min_angle</description>
-      </element>
-
-    </element> <!-- End Vertical -->
-  </element> <!-- End Scan -->
-
-  <element name="range" required="1">
-    <description>specifies range properties of each simulated ray</description>
-    <element name="min" type="double" default="0" required="1">
-      <description>The minimum distance for each ray.</description>
-    </element>
-    <element name="max" type="double" default="0" required="1">
-      <description>The maximum distance for each ray.</description>
-    </element>
-    <element name="resolution" type="double" default="0" required="0">
-      <description>Linear resolution of each ray.</description>
-    </element>
-  </element> <!-- End Range -->
-
-  <element name="noise" required="0">
-    <description>The properties of the noise model that should be applied to generated scans</description>
-    <element name="type" type="string" default="gaussian" required="1">
-      <description>The type of noise.  Currently supported types are: "gaussian" (draw noise values independently for each beam from a Gaussian distribution).</description>
-    </element>
-    <element name="mean" type="double" default="0.0" required="0">
-      <description>For type "gaussian," the mean of the Gaussian distribution from which noise values are drawn.</description>
-    </element>
-    <element name="stddev" type="double" default="0.0" required="0">
-      <description>For type "gaussian," the standard deviation of the Gaussian distribution from which noise values are drawn.</description>
-    </element>
-  </element> <!-- End Noise -->
-</element> <!-- End Ray -->
diff --git a/gazebo/sdf/1.4/rfid.sdf b/gazebo/sdf/1.4/rfid.sdf
deleted file mode 100644
index 61351dd..0000000
--- a/gazebo/sdf/1.4/rfid.sdf
+++ /dev/null
@@ -1,2 +0,0 @@
-<element name="rfidtag" required="0">
-</element> <!-- End rfidtag -->
diff --git a/gazebo/sdf/1.4/rfidtag.sdf b/gazebo/sdf/1.4/rfidtag.sdf
deleted file mode 100644
index 55699dc..0000000
--- a/gazebo/sdf/1.4/rfidtag.sdf
+++ /dev/null
@@ -1,2 +0,0 @@
-<element name="rfid" required="0">
-</element> <!-- End RFID -->
diff --git a/gazebo/sdf/1.4/road.sdf b/gazebo/sdf/1.4/road.sdf
deleted file mode 100644
index 3549b24..0000000
--- a/gazebo/sdf/1.4/road.sdf
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Model -->
-<element name="road" required="*">
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Name of the road</description>
-  </attribute>
-
-  <element name="width" type="double" default="1.0" required="1">
-    <description>Width of the road</description>
-  </element>
-
-  <element name="point" type="vector3" default="0 0 0" required="+">
-    <description>A series of points define the path of the road.</description>
-  </element>
-
-</element>
diff --git a/gazebo/sdf/1.4/root.sdf b/gazebo/sdf/1.4/root.sdf
deleted file mode 100644
index 8dc9d3f..0000000
--- a/gazebo/sdf/1.4/root.sdf
+++ /dev/null
@@ -1,13 +0,0 @@
-<element name="sdf" required="1">
-  <description>SDF base element.</description>
-
-  <attribute name="version" type="string" default="1.4" required="1">
-    <description>Version number of the SDF format.</description>
-  </attribute>
-
-  <include filename="world.sdf" required="*"/>
-  <include filename="model.sdf" required="*"/>
-  <include filename="actor.sdf" required="*"/>
-  <include filename="light.sdf" required="*"/>
-
-</element> <!-- End SDF -->
diff --git a/gazebo/sdf/1.4/scene.sdf b/gazebo/sdf/1.4/scene.sdf
deleted file mode 100644
index 579ec9e..0000000
--- a/gazebo/sdf/1.4/scene.sdf
+++ /dev/null
@@ -1,78 +0,0 @@
-<!-- Scene -->
-<element name="scene" required="1">
-  <description>Specifies the look of the environment.</description>
-
-  <element name="ambient" type="color" default="0.2 0.2 0.2 1.0" required="1">
-    <description>Color of the ambient light.</description>
-  </element>
-
-  <element name="background" type="color" default=".7 .7 .7 1" required="1">
-    <description>Color of the background.</description>
-  </element>
-
-  <element name="sky" required="0">
-    <description>Properties for the sky</description>
-    <element name="time" type="double" default="10.0" required="0">
-      <description>Time of day [0..24]</description>
-    </element>
-    <element name="sunrise" type="double" default="6.0" required="0">
-      <description>Sunrise time [0..24]</description>
-    </element>
-    <element name="sunset" type="double" default="20.0" required="0">
-      <description>Sunset time [0..24]</description>
-    </element>
-
-    <element name="clouds" required="0">
-      <description>Sunset time [0..24]</description>
-      <element name="speed" type="double" default="0.6" min="0.0" required="0">
-        <description>Speed of the clouds</description>
-      </element>
-
-      <element name="direction" type="double" default="0.0"
-               min="0.0" max="3.1456" required="0">
-        <description>Direction of the cloud movement</description>
-      </element>
-      <element name="humidity" type="double" default="0.5"
-               min="0" max="1" required="0">
-        <description>Density of clouds</description>
-      </element>
-
-      <element name="mean_size" type="double" default="0.5"
-               min="0" max="1" required="0">
-        <description>Average size of the clouds</description>
-      </element>
-
-      <element name="ambient" type="color" default=".8 .8 .8 1" required="0">
-        <description>Ambient cloud color</description>
-      </element>
-    </element>
-  </element>
-
-  <element name="shadows" type="bool" default="true" required="1">
-    <description>Enable/disable shadows</description>
-   </element>
-
-  <element name="fog" required="0">
-    <description>Controls fog</description>
-    <element name="color" type="color" default="1 1 1 1" required="0">
-      <description>Fog color</description>
-    </element>
-    <element name="type" type="string" default="none" required="0">
-      <description>Fog type: constant, linear, quadratic</description>
-    </element>
-    <element name="start" type="double" default="1.0" min="0.0" required="0">
-      <description>Distance to start of fog</description>
-    </element>
-    <element name="end" type="double" default="100.0" min="0.0" required="0">
-      <description>Distance to end of fog</description>
-    </element>
-    <element name="density" type="double" default="1.0" min="0.0" required="0">
-      <description>Density of fog</description>
-    </element>
-  </element>
-
-  <element name="grid" type="bool" default="true" required="0">
-    <description>Enable/disable the grid</description>
-  </element>
-
-</element> <!-- End Scene -->
diff --git a/gazebo/sdf/1.4/sensor.sdf b/gazebo/sdf/1.4/sensor.sdf
deleted file mode 100644
index 36dafe0..0000000
--- a/gazebo/sdf/1.4/sensor.sdf
+++ /dev/null
@@ -1,41 +0,0 @@
-<!-- Sensor -->
-<element name="sensor" required="0">
-  <description>The sensor tag describes the type and properties of a sensor.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the sensor. This name must not match another model in the model.</description>
-  </attribute>
-
-  <attribute name="type" type="string" default="__default__" required="1">
-    <description>The type name of the sensor. By default, SDF supports types camera, depth, multicamera, contact, imu, ir and ray.</description>
-  </attribute>
-
-  <element name="always_on" type="bool" default="false" required="0">
-    <description>If true the sensor will always be updated according to the update rate.</description>
-  </element>
-
-  <element name="update_rate" type="double" default="0" required="0">
-    <description>The frequency at which the sensor data is generated. If left unspecified, the sensor will generate data every cycle.</description>
-  </element>
-
-  <element name="visualize" type="bool" default="false" required="0">
-    <description>If true, the sensor is visualized in the GUI</description>
-  </element>
-
-  <element name="pose"  type="pose" default="0 0 0 0 0 0" required="0">
-    <description>This is the pose of the sensor, relative to the parent link reference frame.</description>
-  </element>
-
-  <element name="topic" type="string" default="__default__" required="0">
-    <description>Name of the topic on which data is published. This is necessary for visualization</description>
-  </element>
-
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="camera.sdf" required="0"/>
-  <include filename="ray.sdf" required="0"/>
-  <include filename="contact.sdf" required="0"/>
-  <include filename="rfid.sdf" required="0"/>
-  <include filename="rfidtag.sdf" required="0"/>
-  <include filename="imu.sdf" required="0"/>
-
-</element> <!-- End Sensor -->
diff --git a/gazebo/sdf/1.4/state.sdf b/gazebo/sdf/1.4/state.sdf
deleted file mode 100644
index 01d3c63..0000000
--- a/gazebo/sdf/1.4/state.sdf
+++ /dev/null
@@ -1,101 +0,0 @@
-<!-- State Info -->
-<element name="state" required="*">
-  <!-- Name of the world this state applies to -->
-  <attribute name="world_name" type="string" default="__default__" required="1">
-    <description>Name of the world this state applies to</description>
-  </attribute>
-
-  <element name="sim_time" type="time" default="0 0" required="0">
-    <description>Simulation time stamp of the state [seconds nanoseconds]</description>
-  </element>
-
-  <element name="wall_time" type="time" default="0 0" required="0">
-    <description>Wall time stamp of the state [seconds nanoseconds]</description>
-  </element>
-
-  <element name="real_time" type="time" default="0 0" required="0">
-    <description>Real time stamp of the state [seconds nanoseconds]</description>
-  </element>
-
-  <element name="insertions" required="0">
-    <description>A list of new model names</description>
-    <include filename="model.sdf" required="+"/>
-  </element>
-
-  <element name="deletions" required="0">
-    <description>A list of deleted model names</description>
-    <element name="name" type="string" default="__default__" required="+">
-      <description>The name of a deleted model</description>
-    </element>
-  </element>
-
-
-  <!-- State information for a model -->
-  <element name="model" required="*">
-    <description>Model state</description>
-
-    <attribute name="name" type="string" default="__default__" required="1">
-      <description>Name of the model</description>
-    </attribute>
-
-    <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-      <description>Pose of the model</description>
-    </element>
-
-    <element name="joint" required="*">
-      <description>Joint angle</description>
-
-      <attribute name="name" type="string" default="__default__" required="1">
-        <description>Name of the joint</description>
-      </attribute>
-
-      <element name="angle" type="double" default="0" required="+">
-        <attribute name="axis" type="unsigned int" default="0" required="1">
-          <description>Index of the axis.</description>
-        </attribute>
-
-        <description>Angle of an axis</description>
-      </element>
-    </element>
-
-    <!-- State information for a link -->
-    <element name="link" required="*">
-      <description>Link state</description>
-
-      <attribute name="name" type="string" default="__default__" required="1">
-        <description>Name of the link</description>
-      </attribute>
-
-      <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-        <description>Pose of the link relative to the model</description>
-      </element>
-
-      <element name="velocity" type="pose" default="0 0 0 0 0 0" required="0">
-        <description>Velocity of the link</description>
-      </element>
-
-      <element name="acceleration" type="pose"
-              default="0 0 0 0 0 0" required="0">
-        <description>Acceleration of the link</description>
-      </element>
-
-      <element name="wrench" type="pose" default="0 0 0 0 0 0" required="0">
-        <description>Force applied to the link</description>
-      </element>
-
-      <element name="collision" required="*">
-        <description>Collision state</description>
-
-        <attribute name="name" type="string" default="__default__" required="1">
-          <description>Name of the collision</description>
-        </attribute>
-
-        <element name="pose" type="pose" default="0 0 0 0 0 0" required="1">
-          <description>Pose of the link relative to the model</description>
-        </element>
-      </element>
-
-
-    </element> <!-- End Link -->
-  </element> <!-- End Model -->
-</element> <!-- End State -->
diff --git a/gazebo/sdf/1.4/surface.sdf b/gazebo/sdf/1.4/surface.sdf
deleted file mode 100644
index 91f7b68..0000000
--- a/gazebo/sdf/1.4/surface.sdf
+++ /dev/null
@@ -1,94 +0,0 @@
-<element name="surface" required="0">
-  <description>The surface parameters</description>
-  <element name="bounce" required="0">
-    <description></description>
-    <element name="restitution_coefficient" type="double" default="0" min="0.0" max="1.0" required="0">
-      <description>Bounciness coefficient of restitution, from [0...1], where 0=no bounciness.</description>
-    </element>
-    <element name="threshold" type="double" default="100000" required="0">
-      <description>Bounce capture velocity, below which effective coefficient of restitution is 0.</description>
-    </element>
-  </element> <!-- End Bounce -->
-
-  <element name="friction" required="0">
-    <description></description>
-    <element name="ode" required="0">
-      <description>ODE friction parameters</description>
-      <element name="mu" type="double" default="-1" min="0.0" max="1.0" required="0">
-        <description>Coefficient of friction in the range of [0..1].</description>
-      </element>
-      <element name="mu2" type="double" default="-1" min="0.0" max="1.0" required="0">
-        <description>Second coefficient of friction in the range of [0..1]</description>
-      </element>
-      <element name="fdir1" type="vector3" default="0 0 0" required="0">
-        <description>3-tuple specifying direction of mu1 in the collision local reference frame.</description>
-      </element>
-      <element name="slip1" type="double" default="0.0" min="0.0" max="1.0" required="0">
-        <description>Force dependent slip direction 1 in collision local frame, between the range of [0..1].</description>
-      </element>
-      <element name="slip2" type="double" default="0.0" min="0.0" max="1.0" required="0">
-        <description>Force dependent slip direction 2 in collision local frame, between the range of [0..1].</description>
-      </element>
-    </element> <!-- End ODE -->
-    <element name="bullet" required="0">
-      <element name="friction" type="double" default="-1" min="0.0" max="1.0" required="0">
-        <description>Coefficient of friction in the range of [0..1].</description>
-      </element>
-      <element name="friction2" type="double" default="-1" min="0.0" max="1.0" required="0">
-        <description>Coefficient of friction in the range of [0..1].</description>
-      </element>
-      <element name="fdir1" type="vector3" default="0 0 0" required="0">
-        <description>3-tuple specifying direction of mu1 in the collision local reference frame.</description>
-      </element>
-      <element name="rolling_friction" type="double" default="-1" min="0.0" max="1.0" required="0">
-        <description> coefficient of friction in the range of [0..1]</description>
-      </element>
-    </element> <!-- End Bullet -->
-  </element> <!-- End Friction -->
-
-  <element name="contact" required="0">
-    <description></description>
-    <element name="ode" required="0">
-      <description>ODE contact parameters</description>
-      <element name="soft_cfm" type="double" default="0" required="0">
-        <description>Soft constraint force mixing.</description>
-      </element>
-      <element name="soft_erp" type="double" default="0.2" required="0">
-        <description>Soft error reduction parameter</description>
-      </element>
-      <element name="kp" type="double" default="1000000000000.0" required="0">
-        <description>dynamically "stiffness"-equivalent coefficient for contact joints</description>
-      </element>
-      <element name="kd" type="double" default="1.0" required="0">
-        <description>dynamically "damping"-equivalent coefficient for contact joints</description>
-      </element>
-      <element name="max_vel" type="double" default="0.01" required="0">
-        <description>maximum contact correction velocity truncation term.</description>
-      </element>
-      <element name="min_depth" type="double" default="0" required="0">
-        <description>minimum allowable depth before contact correction impulse is applied</description>
-      </element>
-    </element> <!-- End ODE -->
-    <element name="bullet" required="0">
-      <description>Bullet contact parameters</description>
-      <element name="soft_cfm" type="double" default="0" required="0">
-        <description>Soft constraint force mixing.</description>
-      </element>
-      <element name="soft_erp" type="double" default="0.2" required="0">
-        <description>Soft error reduction parameter</description>
-      </element>
-      <element name="kp" type="double" default="1000000000000.0" required="0">
-        <description>dynamically "stiffness"-equivalent coefficient for contact joints</description>
-      </element>
-      <element name="kd" type="double" default="1.0" required="0">
-        <description>dynamically "damping"-equivalent coefficient for contact joints</description>
-      </element>
-      <element name="split_impulse" type="bool" default="1" required="1">
-        <description>Similar to ODE's max_vel implementation.  See http://bulletphysics.org/mediawiki-1.5.8/index.php/BtContactSolverInfo#Split_Impulse for more information.</description>
-      </element>
-      <element name="split_impulse_penetration_threshold" type="double" default="-0.01" required="1">
-        <description>Similar to ODE's max_vel implementation.  See http://bulletphysics.org/mediawiki-1.5.8/index.php/BtContactSolverInfo#Split_Impulse for more information.</description>
-      </element>
-    </element> <!-- End Bullet -->
-  </element> <!-- End Contact -->
-</element> <!-- End Surface -->
diff --git a/gazebo/sdf/1.4/urdf.sdf b/gazebo/sdf/1.4/urdf.sdf
deleted file mode 100644
index 6068d5c..0000000
--- a/gazebo/sdf/1.4/urdf.sdf
+++ /dev/null
@@ -1,19 +0,0 @@
-<!-- Robot URDF -->
-<element name="robot" required="*">
-  <description>The robot element defines a complete robot or any other physical object using URDF.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>A unique name for the model. This name must not match another model in the world.</description>
-  </attribute>
-
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>A position and orientation in the global coordinate frame for the model. Position(x,y,z) and rotation (roll, pitch yaw) in the global coordinate frame.</description>
-  </element>
-
-  <include filename="link.sdf" required="+"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="gripper.sdf" required="*"/>
-
-</element> <!-- End Model -->
-
diff --git a/gazebo/sdf/1.4/visual.sdf b/gazebo/sdf/1.4/visual.sdf
deleted file mode 100644
index d8d924c..0000000
--- a/gazebo/sdf/1.4/visual.sdf
+++ /dev/null
@@ -1,71 +0,0 @@
-<!-- Visual -->
-<element name="visual" required="*">
-  <description>The visual properties of the link. This element specifies the shape of the object (box, cylinder, etc.) for visualization purposes.</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Unique name for the visual element within the scope of the parent link.</description>
-  </attribute>
-
-  <element name="cast_shadows" type="bool" default="true" required="0">
-    <description>If true the visual will cast shadows.</description>
-  </element>
-
-  <element name="laser_retro" type="double" default="0.0" required="0">
-    <description>will be implemented in the future release.</description>
-  </element>
-
-  <element name="transparency" type="double" default="0.0" required="0">
-    <description>The amount of transparency( 0=opaque, 1 = fully transparent)</description>
-  </element>
-  
-  <element name="pose" type="pose" default="0 0 0 0 0 0" required="0">
-    <description>Origin of the visual relative to its parent.</description>
-  </element>
-
-  <element name="material" required="0">
-    <description>The material of the visual element.</description>
-
-    <element name="script" required="0">
-      <description>Name of material from an installed script file. This will override the color element if the script exists.</description>
-
-      <element name="uri" type="string" default="__default__" required="+">
-        <description>URI of the material script file</description>
-      </element>
-
-      <element name="name" type="string" default="__default__" required="1">
-        <description>Name of the script within the script file</description>
-      </element>
-    </element>
-
-    <element name="shader" required="0">
-      <description></description>
-
-      <attribute name="type" type="string" default="pixel" required="1">
-        <description>vertex, pixel, normal_map_objectspace, normal_map_tangentspace</description>
-      </attribute>
-
-      <element name="normal_map" type="string" default="__default__" required="0">
-        <description>filename of the normal map</description>
-      </element>
-    </element>
-
-    <element name="ambient" type="color" default="0 0 0 1" required="0">
-      <description>The ambient color of a material specified by set of four numbers representing red/green/blue, each in the range of [0,1].</description>
-    </element>
-
-    <element name="diffuse"  type="color" default="0 0 0 1" required="0">
-      <description>The diffuse color of a material specified by set of four numbers representing red/green/blue/alpha, each in the range of [0,1].</description>
-    </element>
-
-    <element name="specular" type="color" default="0 0 0 1" required="0">
-      <description>The specular color of a material specified by set of four numbers representing red/green/blue/alpha, each in the range of [0,1].</description>
-    </element>
-
-    <element name="emissive" type="color" default="0 0 0 1" required="0">
-      <description>The emissive color of a material specified by set of four numbers representing red/green/blue, each in the range of [0,1].</description>
-    </element>
-  </element> <!-- End Material -->
-
-  <include filename="geometry.sdf" required="1"/>
-  <include filename="plugin.sdf" required="*"/>
-</element> <!-- End Visual -->
diff --git a/gazebo/sdf/1.4/world.sdf b/gazebo/sdf/1.4/world.sdf
deleted file mode 100644
index 30d0990..0000000
--- a/gazebo/sdf/1.4/world.sdf
+++ /dev/null
@@ -1,20 +0,0 @@
-<element name="world" required="*">
-  <description>The world element encapsulates an entire world description including: models, scene, physics, joints, and plugins</description>
-
-  <attribute name="name" type="string" default="__default__" required="1">
-    <description>Unique name of the world</description>
-  </attribute>
-
-  <include filename="gui.sdf" required="0"/>
-  <include filename="physics.sdf" required="1"/>
-  <include filename="scene.sdf" required="1"/>
-  <include filename="light.sdf" required="*"/>
-
-  <include filename="model.sdf" required="*"/>
-  <include filename="actor.sdf" required="*"/>
-  <include filename="plugin.sdf" required="*"/>
-  <include filename="joint.sdf" required="*"/>
-  <include filename="road.sdf" required="*"/>
-
-  <include filename="state.sdf" required="*"/>
-</element> <!-- End World -->
diff --git a/gazebo/sdf/CMakeLists.txt b/gazebo/sdf/CMakeLists.txt
deleted file mode 100644
index a908b5a..0000000
--- a/gazebo/sdf/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-add_subdirectory(interface)
-add_subdirectory(1.0)
-add_subdirectory(1.2)
-add_subdirectory(1.3)
-add_subdirectory(1.4)
-
-set (headers sdf.hh)
-
-gz_install_includes("sdf" ${headers})
diff --git a/gazebo/sdf/interface/CMakeLists.txt b/gazebo/sdf/interface/CMakeLists.txt
deleted file mode 100644
index f1f11ca..0000000
--- a/gazebo/sdf/interface/CMakeLists.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-include (${gazebo_cmake_dir}/GazeboUtils.cmake)
-
-set (sources Param.cc SDF.cc parser.cc Converter.cc)
-set (headers SDF.hh Param.hh parser.hh Converter.hh)
-set (gtest_sources
-  SDF_TEST.cc
-  Converter_TEST.cc
-)
-
-if (HAVE_URDFDOM AND HAVE_URDFDOM_HEADERS)
-  include_directories(SYSTEM ${urdfdom_INCLUDE_DIRS}
-                             ${urdfdom_headers_INCLUDE_DIRS}
-                             ${console_bridge_INCLUDE_DIRS}
-                             ${CMAKE_SOURCE_DIR}/deps/opende/include)
-
-  set (sources ${sources} parser_urdf.cc)
-  set (headers ${headers} parser_urdf.hh)
-  # add_definitions(${urdfdom_LDFLAGS}
-  # ${urdfdom_headers_LDFLAGS} ${console_bridge_LDFLAGS})
-endif(HAVE_URDFDOM AND HAVE_URDFDOM_HEADERS)
-
-gz_build_tests(${gtest_sources})
-
-gz_add_library(gazebo_sdf_interface ${sources})
-
-if (HAVE_URDFDOM AND HAVE_URDFDOM_HEADERS)
-  target_link_libraries(gazebo_sdf_interface
-    gazebo_common
-    ${tinyxml_libraries}
-    ${Boost_LIBRARIES}
-    gazebo_ode
-    ${urdfdom_headers_LIBRARIES}
-    ${urdfdom_LIBRARIES}
-    ${console_bridge_LIBRARIES})
-else(HAVE_URDFDOM AND HAVE_URDFDOM_HEADERS)
-  target_link_libraries(gazebo_sdf_interface
-    gazebo_common ${tinyxml_libraries} ${Boost_LIBRARIES})
-endif(HAVE_URDFDOM AND HAVE_URDFDOM_HEADERS)
-
-gz_install_library(gazebo_sdf_interface)
-gz_install_includes("sdf/interface" ${headers})
diff --git a/gazebo/sdf/interface/Converter.cc b/gazebo/sdf/interface/Converter.cc
deleted file mode 100644
index c34c2b7..0000000
--- a/gazebo/sdf/interface/Converter.cc
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <vector>
-#include <set>
-#include <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/regex.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/filesystem.hpp>
-
-#include "gazebo/common/Common.hh"
-#include "gazebo/common/Console.hh"
-#include "gazebo/common/Assert.hh"
-#include "gazebo/sdf/interface/Converter.hh"
-
-
-using namespace sdf;
-
-/////////////////////////////////////////////////
-bool Converter::Convert(TiXmlDocument *_doc, const std::string &_toVersion,
-                        bool _quiet)
-{
-  TiXmlElement *elem = _doc->FirstChildElement("gazebo");
-
-  // Replace <gazebo> with <sdf>
-  if (elem && boost::lexical_cast<double>(_toVersion) >= 1.3)
-  {
-    elem->SetValue("sdf");
-    std::cout << "Set SDF value\n";
-  }
-  else if (!elem)
-    elem = _doc->FirstChildElement("sdf");
-
-  if (!elem || !elem->Attribute("version"))
-  {
-    gzerr << "  Unable to determine original SDF version\n";
-    return false;
-  }
-
-  std::string origVersion = elem->Attribute("version");
-
-  if (origVersion == _toVersion)
-    return true;
-
-  if (!_quiet)
-  {
-    gzwarn << "  Version[" << origVersion << "] to Version[" << _toVersion
-           << "]\n"
-           << "  Please use the gzsdf tool to update your SDF files.\n"
-           << "    $ gzsdf convert [sdf_file]\n";
-  }
-
-  elem->SetAttribute("version", _toVersion);
-
-  std::string origVersionStr = origVersion;
-  boost::replace_all(origVersion, ".", "_");
-
-  std::string filename = gazebo::common::find_file(
-      std::string("sdf/") + _toVersion + "/" + origVersion + ".convert");
-
-  // Use convert file in the current sdf version folder for conversion. If file
-  // does not exist, then find intermediate convert files and iteratively
-  // convert the sdf elem. Ideally, users should use gzsdf convert so that the
-  // latest sdf versioned file is written and no subsequent conversions are
-  // necessary.
-  TiXmlDocument xmlDoc;
-  if (!xmlDoc.LoadFile(filename))
-  {
-    // find all sdf version dirs in gazebo resource path
-    std::string sdfPath = gazebo::common::find_file(std::string("sdf/"), false);
-    boost::filesystem::directory_iterator endIter;
-    std::set<boost::filesystem::path> sdfDirs;
-    if (boost::filesystem::exists(sdfPath)
-        && boost::filesystem::is_directory(sdfPath))
-    {
-      for (boost::filesystem::directory_iterator dirIter(sdfPath);
-          dirIter != endIter ; ++dirIter)
-      {
-        if (boost::filesystem::is_directory(dirIter->status()))
-        {
-          if (boost::algorithm::ilexicographical_compare(
-              origVersionStr, (*dirIter).path().filename().string()))
-          {
-            sdfDirs.insert((*dirIter));
-          }
-        }
-      }
-    }
-
-    // loop through sdf dirs and do the intermediate conversions
-    for (std::set<boost::filesystem::path>::iterator it = sdfDirs.begin();
-        it != sdfDirs.end(); ++it)
-    {
-      boost::filesystem::path convertFile
-         = boost::filesystem::operator/((*it).string(), origVersion+".convert");
-      if (boost::filesystem::exists(convertFile))
-      {
-        if (!xmlDoc.LoadFile(convertFile.string()))
-        {
-            gzerr << "Unable to load file[" << convertFile << "]\n";
-            return false;
-        }
-        ConvertImpl(elem, xmlDoc.FirstChildElement("convert"));
-        if ((*it).filename() == _toVersion)
-          return true;
-
-        origVersion = (*it).filename().string();
-        boost::replace_all(origVersion, ".", "_");
-      }
-      else
-      {
-        continue;
-      }
-    }
-    gzerr << "Unable to convert from SDF version " << origVersionStr
-        << " to " << _toVersion << "\n";
-    return false;
-  }
-
-  ConvertImpl(elem, xmlDoc.FirstChildElement("convert"));
-
-  return true;
-}
-
-/////////////////////////////////////////////////
-void Converter::Convert(TiXmlDocument *_doc, TiXmlDocument *_convertDoc)
-{
-  GZ_ASSERT(_doc != NULL, "SDF XML doc is NULL");
-  GZ_ASSERT(_convertDoc != NULL, "Convert XML doc is NULL");
-
-  ConvertImpl(_doc->FirstChildElement(), _convertDoc->FirstChildElement());
-}
-
-/////////////////////////////////////////////////
-void Converter::ConvertImpl(TiXmlElement *_elem, TiXmlElement *_convert)
-{
-  GZ_ASSERT(_elem != NULL, "SDF element is NULL");
-  GZ_ASSERT(_convert != NULL, "Convert element is NULL");
-
-  CheckDeprecation(_elem, _convert);
-
-  for (TiXmlElement *convertElem = _convert->FirstChildElement("convert");
-       convertElem; convertElem = convertElem->NextSiblingElement("convert"))
-  {
-    TiXmlElement *elem = NULL;
-    elem = _elem->FirstChildElement(convertElem->Attribute("name"));
-    while (elem)
-    {
-      ConvertImpl(elem, convertElem);
-      elem = elem->NextSiblingElement(convertElem->Attribute("name"));
-    }
-  }
-
-  for (TiXmlElement *renameElem = _convert->FirstChildElement("rename");
-       renameElem; renameElem = renameElem->NextSiblingElement("rename"))
-  {
-    Rename(_elem, renameElem);
-  }
-
-  for (TiXmlElement *moveElem = _convert->FirstChildElement("move");
-     moveElem; moveElem = moveElem->NextSiblingElement("move"))
-  {
-    Move(_elem, moveElem);
-  }
-}
-
-/////////////////////////////////////////////////
-void Converter::Rename(TiXmlElement *_elem, TiXmlElement *_renameElem)
-{
-  GZ_ASSERT(_elem != NULL, "SDF element is NULL");
-  GZ_ASSERT(_renameElem != NULL, "Rename element is NULL");
-
-  TiXmlElement *fromConvertElem = _renameElem->FirstChildElement("from");
-  TiXmlElement *toConvertElem = _renameElem->FirstChildElement("to");
-
-  const char *fromElemName = fromConvertElem->Attribute("element");
-  const char *fromAttrName = fromConvertElem->Attribute("attribute");
-
-  const char *toElemName = toConvertElem->Attribute("element");
-  const char *toAttrName = toConvertElem->Attribute("attribute");
-
-  const char *value = GetValue(fromElemName, fromAttrName, _elem);
-  if (!value)
-    return;
-
-  if (!toElemName)
-  {
-    gzerr << "No 'to' element name specified\n";
-    return;
-  }
-
-  TiXmlElement *replaceTo = new TiXmlElement(toElemName);
-  if (toAttrName)
-    replaceTo->SetAttribute(toAttrName, value);
-  else
-  {
-    TiXmlText *text = new TiXmlText(value);
-    replaceTo->LinkEndChild(text);
-  }
-
-  if (fromElemName)
-  {
-    TiXmlElement *replaceFrom = _elem->FirstChildElement(fromElemName);
-    _elem->ReplaceChild(replaceFrom, *replaceTo);
-  }
-  else if (fromAttrName)
-  {
-    _elem->RemoveAttribute(fromAttrName);
-    _elem->LinkEndChild(replaceTo);
-  }
-}
-
-/////////////////////////////////////////////////
-void Converter::Move(TiXmlElement *_elem, TiXmlElement *_moveElem)
-{
-  GZ_ASSERT(_elem != NULL, "SDF element is NULL");
-  GZ_ASSERT(_moveElem != NULL, "Move element is NULL");
-
-  TiXmlElement *fromConvertElem = _moveElem->FirstChildElement("from");
-  TiXmlElement *toConvertElem = _moveElem->FirstChildElement("to");
-
-  const char *fromElemStr = fromConvertElem->Attribute("element");
-  const char *fromAttrStr = fromConvertElem->Attribute("attribute");
-
-  const char *toElemStr = toConvertElem->Attribute("element");
-  const char *toAttrStr = toConvertElem->Attribute("attribute");
-
-  // tokenize 'from' and 'to' strs
-  std::string fromStr = "";
-  if (fromElemStr)
-    fromStr = fromElemStr;
-  else if (fromAttrStr)
-    fromStr = fromAttrStr;
-  std::string toStr = "";
-  if (toElemStr)
-    toStr = toElemStr;
-  else if (toAttrStr)
-    toStr = toAttrStr;
-  std::vector<std::string> fromTokens;
-  std::vector<std::string> toTokens;
-  boost::algorithm::split_regex(fromTokens, fromStr, boost::regex("::"));
-  boost::algorithm::split_regex(toTokens, toStr, boost::regex("::"));
-
-  if (fromTokens.empty())
-  {
-    gzerr << "Incorrect 'from' string format\n";
-    return;
-  }
-
-  if (toTokens.empty())
-  {
-    gzerr << "Incorrect 'to' string format\n";
-    return;
-  }
-
-  // get value of the 'from' element/attribute
-  TiXmlElement *fromElem = _elem;
-  for (unsigned int i = 0; i < fromTokens.size()-1; ++i)
-  {
-    fromElem = fromElem->FirstChildElement(fromTokens[i]);
-    if (!fromElem)
-      return;
-  }
-
-  const char *fromName = fromTokens[fromTokens.size()-1].c_str();
-  const char *value = NULL;
-
-  // Get value, or return if no element/attribute found as they don't have to
-  // be specified in the sdf.
-  if (fromElemStr)
-    value = GetValue(fromName, NULL, fromElem);
-  else if (fromAttrStr)
-    value = GetValue(NULL, fromName, fromElem);
-  if (!value)
-    return;
-
-  std::string valueStr = value;
-  // move by creating a new element/attribute and deleting the old one
-  if (fromElemStr)
-  {
-    TiXmlElement *moveFrom =
-        fromElem->FirstChildElement(fromName);
-    fromElem->RemoveChild(moveFrom);
-  }
-  else if (fromAttrStr)
-  {
-    fromElem->RemoveAttribute(fromName);
-  }
-
-  unsigned int newDirIndex = 0;
-  // get the new element/attribute name
-  const char *toName = toTokens[toTokens.size()-1].c_str();
-  TiXmlElement *toElem = _elem;
-  TiXmlElement *childElem = NULL;
-  for (unsigned int i = 0; i < toTokens.size()-1; ++i)
-  {
-    childElem = toElem->FirstChildElement(toTokens[i]);
-    if (!childElem)
-    {
-      newDirIndex = i;
-      break;
-    }
-    toElem = childElem;
-  }
-
-  // found elements in 'to' string that is not present, so create new
-  // elements
-  if (!childElem)
-  {
-    while (newDirIndex < (toTokens.size() - 1))
-    {
-      TiXmlElement *newElem = new TiXmlElement(toTokens[newDirIndex]);
-      toElem->LinkEndChild(newElem);
-      toElem = newElem;
-      newDirIndex++;
-    }
-  }
-
-  if (toElemStr)
-  {
-    TiXmlElement *moveTo = new TiXmlElement(toName);
-    TiXmlText *text = new TiXmlText(valueStr);
-    moveTo->LinkEndChild(text);
-    toElem->LinkEndChild(moveTo);
-  }
-  else if (toAttrStr)
-  {
-    toElem->SetAttribute(toName, valueStr);
-  }
-}
-
-/////////////////////////////////////////////////
-const char *Converter::GetValue(const char *_valueElem, const char *_valueAttr,
-                                TiXmlElement *_elem)
-{
-  if (_valueElem)
-  {
-    // Check to see if the element that is being converted has the value
-    if (!_elem->FirstChildElement(_valueElem))
-      return NULL;
-
-    if (_valueAttr)
-      return _elem->FirstChildElement(_valueElem)->Attribute(_valueAttr);
-    else
-      return _elem->FirstChildElement(_valueElem)->GetText();
-  }
-  else if (_valueAttr)
-  {
-    return _elem->Attribute(_valueAttr);
-  }
-
-  return NULL;
-}
-
-/////////////////////////////////////////////////
-void Converter::CheckDeprecation(TiXmlElement *_elem, TiXmlElement *_convert)
-{
-  // Process deprecated elements
-  for (TiXmlElement *deprecatedElem = _convert->FirstChildElement("deprecated");
-      deprecatedElem;
-      deprecatedElem = deprecatedElem->NextSiblingElement("deprecated"))
-  {
-    std::string value = deprecatedElem->GetText();
-    std::vector<std::string> valueSplit;
-    boost::split(valueSplit, value, boost::is_any_of("/"));
-
-    bool found = false;
-    TiXmlElement *e = _elem;
-    std::ostringstream stream;
-
-    std::string prefix = "";
-    for (unsigned int i = 0; i < valueSplit.size() && !found; ++i)
-    {
-      if (e->FirstChildElement(valueSplit[i]))
-      {
-        if (stream.str().size() != 0)
-        {
-          stream << ">\n";
-          prefix += "  ";
-        }
-
-        stream << prefix << "<" << valueSplit[i];
-        e = e->FirstChildElement(valueSplit[i]);
-      }
-      else if (e->Attribute(valueSplit[i]))
-      {
-        stream << " " << valueSplit[i] << "='"
-               << e->Attribute(valueSplit[i].c_str()) << "'";
-        found = true;
-      }
-    }
-
-    gzwarn << "Deprecated SDF Values in original file:\n"
-           << stream.str() << "\n\n";
-  }
-}
diff --git a/gazebo/sdf/interface/Converter.hh b/gazebo/sdf/interface/Converter.hh
deleted file mode 100644
index 59d4286..0000000
--- a/gazebo/sdf/interface/Converter.hh
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef _SDF_CONVERTER_HH_
-#define _SDF_CONVERTER_HH_
-
-#include <tinyxml.h>
-#include <string>
-
-namespace sdf
-{
-  /// \brief Convert from one version of SDF to another
-  class Converter
-  {
-    /// \brief Convert SDF to the specified version.
-    /// \param[in] _doc SDF xml doc
-    /// \param[in] _toVersion Version number in string format
-    /// \param[in] _quiet False to be more verbose
-    public: static bool Convert(TiXmlDocument *_doc,
-                                const std::string &_toVersion,
-                                bool _quiet = false);
-
-    /// \cond
-    /// This is an internal function.
-    /// \brief Generic convert function that converts the SDF based on the
-    /// given Convert file.
-    /// \param[in] _doc SDF xml doc
-    /// \param[in] _convertDoc Convert xml doc
-    public: static void Convert(TiXmlDocument *_doc,
-        TiXmlDocument *_convertDoc);
-    /// \endcond
-
-    private: static void ConvertImpl(TiXmlElement *_elem,
-                                     TiXmlElement *_convert);
-
-    /// \brief Rename an element or attribute.
-    /// \param[in] _elem The element to be renamed, or the element which
-    /// has the attribute to be renamed.
-    /// \param[in] _renameElem A 'convert' element that describes the rename
-    /// operation.
-    private: static void Rename(TiXmlElement *_elem,
-                                     TiXmlElement *_renameElem);
-
-    /// \brief Move an element or attribute within a common ancestor element.
-    /// \param[in] _elem Ancestor element of the element or attribute to
-    /// be moved.
-    /// \param[in] _moveElem A 'convert' element that describes the move
-    /// operation.
-    private: static void Move(TiXmlElement *_elem,
-                                     TiXmlElement *_moveElem);
-
-    private: static const char *GetValue(const char *_valueElem,
-                                         const char *_valueAttr,
-                                         TiXmlElement *_elem);
-
-    private: static void CheckDeprecation(TiXmlElement *_elem,
-                                          TiXmlElement *_convert);
-  };
-}
-#endif
diff --git a/gazebo/sdf/interface/Converter_TEST.cc b/gazebo/sdf/interface/Converter_TEST.cc
deleted file mode 100644
index 52d6768..0000000
--- a/gazebo/sdf/interface/Converter_TEST.cc
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <gtest/gtest.h>
-#include "gazebo/sdf/interface/Converter.hh"
-
-////////////////////////////////////////////////////
-/// Ensure that Converter::Move function is working
-TEST(Converter, Move)
-{
-  // Set up an xml file for testing
-  std::stringstream stream;
-  stream << "<elemA attrA='A'>"
-         << "  <elemB attrB='B'>"
-         << "    <elemC attrC='C'>"
-         << "      <elemD>D</elemD>"
-         << "    </elemC>"
-         << "  </elemB>"
-         << "</elemA>";
-
-  // Verify the xml
-  TiXmlDocument xmlDoc;
-  xmlDoc.Parse(stream.str().c_str());
-  TiXmlElement *childElem =  xmlDoc.FirstChildElement();
-  EXPECT_TRUE(childElem);
-  EXPECT_EQ(childElem->ValueStr(), "elemA");
-  childElem =  childElem->FirstChildElement();
-  EXPECT_TRUE(childElem);
-  EXPECT_EQ(childElem->ValueStr(), "elemB");
-  childElem =  childElem->FirstChildElement();
-  EXPECT_TRUE(childElem);
-  EXPECT_EQ(childElem->ValueStr(), "elemC");
-  childElem =  childElem->FirstChildElement();
-  EXPECT_TRUE(childElem);
-  EXPECT_EQ(childElem->ValueStr(), "elemD");
-
-  // Test moving from elem to elem
-  // Set up a convert file
-  std::stringstream convertStream;
-  convertStream << "<convert name='elemA'>"
-                << "  <convert name='elemB'>"
-                << "    <move>"
-                << "     <from element='elemC::elemD'/>"
-                << "     <to element='elemE'/>"
-                << "   </move>"
-                << " </convert>"
-                << "</convert>";
-  TiXmlDocument convertXmlDoc;
-  convertXmlDoc.Parse(convertStream.str().c_str());
-  sdf::Converter::Convert(&xmlDoc, &convertXmlDoc);
-
-  TiXmlElement *convertedElem =  xmlDoc.FirstChildElement();
-  EXPECT_EQ(convertedElem->ValueStr(), "elemA");
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemB");
-  EXPECT_TRUE(convertedElem->FirstChildElement("elemC"));
-  EXPECT_TRUE(convertedElem->FirstChildElement("elemE"));
-  std::string elemValue = convertedElem->FirstChildElement("elemE")->GetText();
-  EXPECT_EQ(elemValue, "D");
-  convertedElem =  convertedElem->FirstChildElement("elemC");
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_FALSE(convertedElem->FirstChildElement("elemD"));
-
-  // Test moving from elem to attr
-  TiXmlDocument xmlDoc2;
-  xmlDoc2.Parse(stream.str().c_str());
-  convertStream.str("");
-  convertStream << "<convert name='elemA'>"
-                << "  <convert name='elemB'>"
-                << "    <move>"
-                << "     <from element='elemC::elemD'/>"
-                << "     <to attribute='attrE'/>"
-                << "   </move>"
-                << " </convert>"
-                << "</convert>";
-  TiXmlDocument convertXmlDoc2;
-  convertXmlDoc2.Parse(convertStream.str().c_str());
-  sdf::Converter::Convert(&xmlDoc2, &convertXmlDoc2);
-
-  convertedElem =  xmlDoc2.FirstChildElement();
-  EXPECT_EQ(convertedElem->ValueStr(), "elemA");
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemB");
-  EXPECT_TRUE(convertedElem->Attribute("attrE"));
-  std::string attrValue = convertedElem->Attribute("attrE");
-  EXPECT_EQ(attrValue, "D");
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemC");
-  EXPECT_FALSE(convertedElem->FirstChildElement("elemD"));
-
-  // Test moving from attr to attr
-  TiXmlDocument xmlDoc3;
-  xmlDoc3.Parse(stream.str().c_str());
-  convertStream.str("");
-  convertStream << "<convert name='elemA'>"
-                << "  <convert name='elemB'>"
-                << "    <move>"
-                << "     <from attribute='elemC::attrC'/>"
-                << "     <to attribute='attrE'/>"
-                << "   </move>"
-                << " </convert>"
-                << "</convert>";
-  TiXmlDocument convertXmlDoc3;
-  convertXmlDoc3.Parse(convertStream.str().c_str());
-  sdf::Converter::Convert(&xmlDoc3, &convertXmlDoc3);
-
-  convertedElem =  xmlDoc3.FirstChildElement();
-  EXPECT_EQ(convertedElem->ValueStr(), "elemA");
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemB");
-  EXPECT_TRUE(convertedElem->Attribute("attrE"));
-  attrValue = convertedElem->Attribute("attrE");
-  EXPECT_EQ(attrValue, "C");
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemC");
-  EXPECT_FALSE(convertedElem->Attribute("attrC"));
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemD");
-
-  // Test moving from attr to elem
-  TiXmlDocument xmlDoc4;
-  xmlDoc4.Parse(stream.str().c_str());
-  convertStream.str("");
-  convertStream << "<convert name='elemA'>"
-                << "  <convert name='elemB'>"
-                << "    <move>"
-                << "     <from attribute='elemC::attrC'/>"
-                << "     <to element='elemE'/>"
-                << "   </move>"
-                << " </convert>"
-                << "</convert>";
-  TiXmlDocument convertXmlDoc4;
-  convertXmlDoc4.Parse(convertStream.str().c_str());
-  sdf::Converter::Convert(&xmlDoc4, &convertXmlDoc4);
-
-  convertedElem =  xmlDoc4.FirstChildElement();
-  EXPECT_EQ(convertedElem->ValueStr(), "elemA");
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemB");
-  EXPECT_TRUE(convertedElem->FirstChildElement("elemE"));
-  elemValue = convertedElem->FirstChildElement("elemE")->GetText();
-  EXPECT_EQ(elemValue, "C");
-  EXPECT_TRUE(convertedElem->FirstChildElement("elemC"));
-  convertedElem =  convertedElem->FirstChildElement("elemC");
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_FALSE(convertedElem->Attribute("attrC"));
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemD");
-
-  // Test moving from elem to elem across multiple levels
-  TiXmlDocument xmlDoc5;
-  xmlDoc5.Parse(stream.str().c_str());
-  convertStream.str("");
-  convertStream << "<convert name='elemA'>"
-                << "  <move>"
-                << "   <from element='elemB::elemC::elemD'/>"
-                << "   <to element='elemE'/>"
-                << "  </move>"
-                << "</convert>";
-  TiXmlDocument convertXmlDoc5;
-  convertXmlDoc5.Parse(convertStream.str().c_str());
-  sdf::Converter::Convert(&xmlDoc5, &convertXmlDoc5);
-
-  convertedElem =  xmlDoc5.FirstChildElement();
-  EXPECT_EQ(convertedElem->ValueStr(), "elemA");
-  EXPECT_TRUE(convertedElem->FirstChildElement("elemE"));
-  elemValue = convertedElem->FirstChildElement("elemE")->GetText();
-  EXPECT_EQ(elemValue, "D");
-  convertedElem =  convertedElem->FirstChildElement("elemB");
-  ASSERT_TRUE(convertedElem != NULL);
-  convertedElem = convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemC");
-  EXPECT_FALSE(convertedElem->FirstChildElement("elemD"));
-
-  // Test moving from attr to attr across multiple levels
-  TiXmlDocument xmlDoc6;
-  xmlDoc6.Parse(stream.str().c_str());
-  convertStream.str("");
-  convertStream << "<convert name='elemA'>"
-                << "  <move>"
-                << "   <from attribute='elemB::elemC::attrC'/>"
-                << "   <to attribute='attrE'/>"
-                << "  </move>"
-                << "</convert>";
-  TiXmlDocument convertXmlDoc6;
-  convertXmlDoc6.Parse(convertStream.str().c_str());
-  sdf::Converter::Convert(&xmlDoc6, &convertXmlDoc6);
-
-  convertedElem =  xmlDoc6.FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemA");
-  attrValue = convertedElem->Attribute("attrE");
-  EXPECT_EQ(attrValue, "C");
-  convertedElem = convertedElem->FirstChildElement("elemB");
-  ASSERT_TRUE(convertedElem != NULL);
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemC");
-  EXPECT_FALSE(convertedElem->Attribute("attrC"));
-  convertedElem = convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemD");
-
-  // Test moving from elem to attr across multiple levels
-  TiXmlDocument xmlDoc7;
-  xmlDoc7.Parse(stream.str().c_str());
-  convertStream.str("");
-  convertStream << "<convert name='elemA'>"
-                << "  <move>"
-                << "   <from element='elemB::elemC::elemD'/>"
-                << "   <to attribute='attrE'/>"
-                << "  </move>"
-                << "</convert>";
-  TiXmlDocument convertXmlDoc7;
-  convertXmlDoc7.Parse(convertStream.str().c_str());
-  sdf::Converter::Convert(&xmlDoc7, &convertXmlDoc7);
-
-  convertedElem =  xmlDoc7.FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemA");
-  attrValue = convertedElem->Attribute("attrE");
-  EXPECT_EQ(attrValue, "D");
-  convertedElem = convertedElem->FirstChildElement("elemB");
-  ASSERT_TRUE(convertedElem != NULL);
-  convertedElem =  convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemC");
-  EXPECT_FALSE(convertedElem->FirstChildElement("elemD"));
-
-    // Test moving from attr to elem across multiple levels
-  TiXmlDocument xmlDoc8;
-  xmlDoc8.Parse(stream.str().c_str());
-  convertStream.str("");
-  convertStream << "<convert name='elemA'>"
-                << "  <move>"
-                << "   <from attribute='elemB::elemC::attrC'/>"
-                << "   <to element='elemE'/>"
-                << "  </move>"
-                << "</convert>";
-  TiXmlDocument convertXmlDoc8;
-  convertXmlDoc8.Parse(convertStream.str().c_str());
-  sdf::Converter::Convert(&xmlDoc8, &convertXmlDoc8);
-
-  convertedElem =  xmlDoc8.FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemA");
-  EXPECT_TRUE(convertedElem->FirstChildElement("elemE"));
-  elemValue = convertedElem->FirstChildElement("elemE")->GetText();
-  EXPECT_EQ(elemValue, "C");
-  convertedElem =  convertedElem->FirstChildElement("elemB");
-  ASSERT_TRUE(convertedElem != NULL);
-  convertedElem = convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemC");
-  EXPECT_FALSE(convertedElem->Attribute("attrC"));
-  convertedElem = convertedElem->FirstChildElement();
-  ASSERT_TRUE(convertedElem != NULL);
-  EXPECT_EQ(convertedElem->ValueStr(), "elemD");
-}
-
-/////////////////////////////////////////////////
-/// Main
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/gazebo/sdf/interface/Param.cc b/gazebo/sdf/interface/Param.cc
deleted file mode 100644
index 6a56f30..0000000
--- a/gazebo/sdf/interface/Param.cc
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: Parameter class
- * Author: Nate Koenig
- * Date: 14 Aug 2008
- */
-
-#include <math.h>
-#include "gazebo/common/Exception.hh"
-#include "gazebo/sdf/interface/Param.hh"
-
-using namespace sdf;
-
-std::vector<Param*> *Param::params = NULL;
-
-//////////////////////////////////////////////////
-Param::Param(Param *_newParam)
-  : key(""), required(false), set(false), typeName("")
-{
-  /*if (params == NULL)
-    gzthrow("Param vector is NULL\n");
-    */
-  if (params)
-    params->push_back(_newParam);
-}
-
-//////////////////////////////////////////////////
-Param::~Param()
-{
-}
-
-//////////////////////////////////////////////////
-std::string Param::GetTypeName() const
-{
-  return this->typeName;
-}
-
-//////////////////////////////////////////////////
-bool Param::IsBool() const
-{
-  return this->GetTypeName() == "bool";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsInt() const
-{
-  return this->GetTypeName() == "int";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsUInt() const
-{
-  return this->GetTypeName() == "unsigned int";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsFloat() const
-{
-  return this->GetTypeName() == "float";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsDouble() const
-{
-  return this->GetTypeName() == "double";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsChar() const
-{
-  return this->GetTypeName() == "char";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsStr() const
-{
-  return this->GetTypeName() == "string";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsVector3() const
-{
-  return this->GetTypeName() == "vector3";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsVector2i() const
-{
-  return this->GetTypeName() == "vector2i";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsVector2d() const
-{
-  return this->GetTypeName() == "vector2d";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsQuaternion() const
-{
-  return this->GetTypeName() == "quaternion";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsPose() const
-{
-  return this->GetTypeName() == "pose";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsColor() const
-{
-  return this->GetTypeName() == "color";
-}
-
-//////////////////////////////////////////////////
-bool Param::IsTime() const
-{
-  return this->GetTypeName() == "time";
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const bool &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const int &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const unsigned int &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const float &_value)
-{
-  if (std::isfinite(_value))
-    return this->SetFromString(boost::lexical_cast<std::string>(_value));
-  else
-    return this->SetFromString("0");
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const double &_value)
-{
-  if (std::isfinite(_value))
-    return this->SetFromString(boost::lexical_cast<std::string>(_value));
-  else
-    return this->SetFromString("0");
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const char &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const std::string &_value)
-{
-  return this->SetFromString(_value);
-}
-
-/////////////////////////////////////////////////
-bool Param::Set(const char *_value)
-{
-  return this->SetFromString(std::string(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const gazebo::math::Vector3 &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const gazebo::math::Vector2i &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const gazebo::math::Vector2d &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const gazebo::math::Quaternion &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const gazebo::math::Pose &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const gazebo::common::Color &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Set(const gazebo::common::Time &_value)
-{
-  return this->SetFromString(boost::lexical_cast<std::string>(_value));
-}
-
-//////////////////////////////////////////////////
-bool Param::Get(bool &_value)
-{
-  if (this->IsBool())
-  {
-    _value = ((ParamT<bool>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is not a bool\n";
-    return false;
-  }
-}
-
-//////////////////////////////////////////////////
-bool Param::Get(double &_value)
-{
-  if (this->IsDouble())
-  {
-    _value = ((ParamT<double>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is a ["
-          << this->typeName << "], attempting to get as a double.\n";
-    return false;
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(float &_value)
-{
-  if (this->IsFloat())
-  {
-    _value = ((ParamT<float>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is not a float\n";
-    return false;
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(gazebo::common::Color &_value)
-{
-  if (this->IsColor())
-  {
-    _value = ((ParamT<gazebo::common::Color>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is not a color\n";
-    return false;
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(gazebo::common::Time &_value)
-{
-  if (this->IsTime())
-  {
-    _value = ((ParamT<gazebo::common::Time>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is not a time\n";
-    return false;
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(gazebo::math::Pose &_value)
-{
-  if (this->IsPose())
-  {
-    _value = ((ParamT<gazebo::math::Pose>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    // used by plugin parameters, they are all labeled string, but
-    // nice to be able to get them as something else.
-    std::string val_str = this->GetAsString();
-    std::vector<double> elements;
-    std::vector<std::string> pieces;
-    boost::split(pieces, val_str, boost::is_any_of(" "));
-    if (pieces.size() != 6)
-    {
-      gzerr <<
-        "string does not have 6 pieces to parse into Pose, using 0s\n";
-      return false;
-    }
-    else
-    {
-      for (unsigned int i = 0; i < pieces.size(); ++i)
-      {
-        if (pieces[i] != "")
-        {
-          try
-          {
-            elements.push_back(boost::lexical_cast<double>(pieces[i].c_str()));
-          }
-          catch(boost::bad_lexical_cast &e)
-          {
-            gzerr << "value ["
-                  << pieces[i]
-                  << "] is not a valid double for Pose[" << i << "]\n";
-            return false;
-          }
-        }
-      }
-      _value.pos.x = elements[0];
-      _value.pos.y = elements[1];
-      _value.pos.z = elements[2];
-      gazebo::math::Quaternion rpy(elements[3], elements[4], elements[5]);
-      _value.rot = rpy;
-      return true;
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(gazebo::math::Vector3 &_value)
-{
-  if (this->IsVector3())
-  {
-    _value = ((ParamT<gazebo::math::Vector3>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    // gzwarn << "Parameter [" << this->key
-    //        << "] is not a vector3, parse as string\n";
-    std::string val_str = this->GetAsString();
-    std::vector<double> elements;
-    std::vector<std::string> pieces;
-    boost::split(pieces, val_str, boost::is_any_of(" "));
-    if (pieces.size() != 3)
-    {
-      gzerr <<
-        "string does not have 3 pieces to parse into Vector3, using 0s\n";
-      return false;
-    }
-    else
-    {
-      for (unsigned int i = 0; i < pieces.size(); ++i)
-      {
-        if (pieces[i] != "")
-        {
-          try
-          {
-            elements.push_back(boost::lexical_cast<double>(pieces[i].c_str()));
-          }
-          catch(boost::bad_lexical_cast &e)
-          {
-            gzerr << "value ["
-                  << pieces[i]
-                  << "] is not a valid double for Vector3[" << i << "]\n";
-            return false;
-          }
-        }
-      }
-      _value.x = elements[0];
-      _value.y = elements[1];
-      _value.z = elements[2];
-      return true;
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(gazebo::math::Vector2i &_value)
-{
-  if (this->IsVector2i())
-  {
-    _value = ((ParamT<gazebo::math::Vector2i>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    // gzwarn << "Parameter [" << this->key
-    //        << "] is not a vector2i,parse as string\n";
-    std::string val_str = this->GetAsString();
-    std::vector<int> elements;
-    std::vector<std::string> pieces;
-    boost::split(pieces, val_str, boost::is_any_of(" "));
-    if (pieces.size() != 2)
-    {
-      gzerr <<
-        "string does not have 2 parts to parse into Vector2i, using 0s\n";
-      return false;
-    }
-    else
-    {
-      for (unsigned int i = 0; i < pieces.size(); ++i)
-      {
-        if (pieces[i] != "")
-        {
-          try
-          {
-            elements.push_back(boost::lexical_cast<int>(pieces[i].c_str()));
-          }
-          catch(boost::bad_lexical_cast &e)
-          {
-            gzerr << "value ["
-                  << pieces[i]
-                  << "] is not a valid double for Vector2i[" << i << "]\n";
-            return false;
-          }
-        }
-      }
-      _value.x = elements[0];
-      _value.y = elements[1];
-      return true;
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(gazebo::math::Vector2d &_value)
-{
-  if (this->IsVector2d())
-  {
-    _value = ((ParamT<gazebo::math::Vector2d>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    // gzwarn << "Parameter [" << this->key
-    //        << "] is not vector2d, parse as string\n";
-    std::string val_str = this->GetAsString();
-    std::vector<double> elements;
-    std::vector<std::string> pieces;
-    boost::split(pieces, val_str, boost::is_any_of(" "));
-    if (pieces.size() != 2)
-    {
-      gzerr <<
-        "string does not have 2 pieces to parse into Vector2d, using 0s\n";
-      return false;
-    }
-    else
-    {
-      for (unsigned int i = 0; i < pieces.size(); ++i)
-      {
-        if (pieces[i] != "")
-        {
-          try
-          {
-            elements.push_back(boost::lexical_cast<double>(pieces[i].c_str()));
-          }
-          catch(boost::bad_lexical_cast &e)
-          {
-            gzerr << "value ["
-                  << pieces[i]
-                  << "] is not a valid double for Vector2d[" << i << "]\n";
-            return false;
-          }
-        }
-      }
-      _value.x = elements[0];
-      _value.y = elements[1];
-      return true;
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(int &_value)
-{
-  if (this->IsInt())
-  {
-    _value = ((ParamT<int>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is not an int\n";
-    return false;
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(unsigned int &_value)
-{
-  if (this->IsUInt())
-  {
-    _value = ((ParamT<unsigned int>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is not an unsigned int\n";
-    return false;
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(char &_value)
-{
-  if (this->IsChar())
-  {
-    _value = ((ParamT<char>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is not an unsigned int\n";
-    return false;
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(std::string &_value)
-{
-  if (this->IsStr())
-  {
-    _value = ((ParamT<std::string>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is not a string\n";
-    return false;
-  }
-}
-
-/////////////////////////////////////////////////
-bool Param::Get(gazebo::math::Quaternion &_value)
-{
-  if (this->IsQuaternion())
-  {
-    _value = ((ParamT<gazebo::math::Quaternion>*)this)->GetValue();
-    return true;
-  }
-  else
-  {
-    gzerr << "Parameter [" << this->key << "] is not a quaternion\n";
-    return false;
-  }
-}
-
-/////////////////////////////////////////////////
-void Param::SetDescription(const std::string &_desc)
-{
-  this->description = _desc;
-}
-
-/////////////////////////////////////////////////
-std::string Param::GetDescription() const
-{
-  return this->description;
-}
diff --git a/gazebo/sdf/interface/Param.hh b/gazebo/sdf/interface/Param.hh
deleted file mode 100644
index 0ac3d28..0000000
--- a/gazebo/sdf/interface/Param.hh
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: A parameter
- * Author: Nate Koenig
- * Date: 14 Aug 2008
- */
-
-#ifndef SDF_PARAM_HH
-#define SDF_PARAM_HH
-
-#include <boost/lexical_cast.hpp>
-#include <boost/bind.hpp>
-#include <boost/algorithm/string.hpp>
-#include <boost/any.hpp>
-#include <boost/function.hpp>
-#include <typeinfo>
-#include <string>
-#include <vector>
-
-#include "common/Console.hh"
-#include "common/Color.hh"
-#include "common/Time.hh"
-#include "math/Vector3.hh"
-#include "math/Vector2i.hh"
-#include "math/Vector2d.hh"
-#include "math/Pose.hh"
-#include "math/Quaternion.hh"
-
-namespace sdf
-{
-  class Param;
-  typedef boost::shared_ptr< Param > ParamPtr;
-  typedef std::vector< ParamPtr > Param_V;
-
-  /// \brief A parameter class
-  class Param
-  {
-    /// \brief Constructor
-    public: Param(Param *_newParam);
-
-    /// \brief Destructor
-    public: virtual  ~Param();
-
-    /// \brief Get the type
-    public: virtual std::string GetAsString() const
-            {return std::string();}
-    public: virtual std::string GetDefaultAsString() const
-            {return std::string();}
-
-    /// \brief Set the parameter value from a string
-    public: virtual bool SetFromString(const std::string &)
-            {return true;}
-    /// \brief Reset the parameter
-    public: virtual void Reset() = 0;
-
-    public: const std::string &GetKey() const {return this->key;}
-    public: std::string GetTypeName() const;
-    public: bool GetRequired() const { return this->required; }
-    /// \brief Return true if the parameter has been set
-    public: bool GetSet() const { return this->set; }
-    public: virtual boost::shared_ptr<Param> Clone() const = 0;
-
-    /// \brief Update function
-    public: template<typename T> void SetUpdateFunc(T _updateFunc)
-            { this->updateFunc = _updateFunc; }
-    public: virtual void Update() = 0;
-
-    public: bool IsBool() const;
-    public: bool IsInt() const;
-    public: bool IsUInt() const;
-    public: bool IsFloat() const;
-    public: bool IsDouble() const;
-    public: bool IsChar() const;
-    public: bool IsStr() const;
-    public: bool IsVector3() const;
-    public: bool IsVector2i() const;
-    public: bool IsVector2d() const;
-    public: bool IsQuaternion() const;
-    public: bool IsPose() const;
-    public: bool IsColor() const;
-    public: bool IsTime() const;
-
-    public: bool Set(const bool &_value);
-    public: bool Set(const int &_value);
-    public: bool Set(const unsigned int &_value);
-    public: bool Set(const float &_value);
-    public: bool Set(const double &_value);
-    public: bool Set(const char &_value);
-    public: bool Set(const std::string &_value);
-    public: bool Set(const char *_value);
-    public: bool Set(const gazebo::math::Vector3 &_value);
-    public: bool Set(const gazebo::math::Vector2i &_value);
-    public: bool Set(const gazebo::math::Vector2d &_value);
-    public: bool Set(const gazebo::math::Quaternion &_value);
-    public: bool Set(const gazebo::math::Pose &_value);
-    public: bool Set(const gazebo::common::Color &_value);
-    public: bool Set(const gazebo::common::Time &_value);
-
-    public: bool Get(bool &_value);
-    public: bool Get(int &_value);
-    public: bool Get(unsigned int &_value);
-    public: bool Get(float &_value);
-    public: bool Get(double &_value);
-    public: bool Get(char &_value);
-    public: bool Get(std::string &_value);
-    public: bool Get(gazebo::math::Vector3 &_value);
-    public: bool Get(gazebo::math::Vector2i &_value);
-    public: bool Get(gazebo::math::Vector2d &_value);
-    public: bool Get(gazebo::math::Quaternion &_value);
-    public: bool Get(gazebo::math::Pose &_value);
-    public: bool Get(gazebo::common::Color &_value);
-    public: bool Get(gazebo::common::Time &_value);
-
-    /// \brief Set the description of the parameter
-    public: void SetDescription(const std::string &_desc);
-
-    /// \brief Get the description of the parameter
-    public: std::string GetDescription() const;
-
-    /// List of created parameters
-    private: static std::vector<Param*> *params;
-
-    protected: std::string key;
-    protected: bool required;
-    protected: bool set;
-    protected: std::string typeName;
-    protected: std::string description;
-
-    protected: boost::function<boost::any ()> updateFunc;
-  };
-
-
-  /// \brief Templatized parameter class
-  template< typename T>
-  class ParamT : public Param
-  {
-    /// \brief Constructor
-    public: ParamT(const std::string &_key, const std::string &_default,
-                   bool _required, const std::string &_typeName = "",
-                   const std::string &_description = "")
-            : Param(this)
-    {
-      this->key = _key;
-      this->required = _required;
-      if (_typeName.empty())
-        this->typeName = typeid(T).name();
-      else
-        this->typeName = _typeName;
-      this->description = _description;
-
-      this->Set(_default);
-      this->defaultValue = this->value;
-      this->set = false;
-    }
-
-    /// \brief Destructor
-    public: virtual ~ParamT() {}
-
-    /// \brief Update param value
-    public: virtual void Update()
-            {
-              if (this->updateFunc)
-              {
-                try
-                {
-                  const T v = boost::any_cast<T>(this->updateFunc());
-                  Param::Set(v);
-                }
-                catch(boost::bad_any_cast &e)
-                {
-                  gzerr << "boost any_cast error:" << e.what() << "\n";
-                }
-              }
-            }
-
-    /// \brief Get the parameter value as a string
-    public: virtual std::string GetAsString() const
-    {
-      std::ostringstream stream;
-      stream << std::fixed << this->value;
-      return stream.str();
-    }
-
-    /// \brief Set the parameter value from a string
-    public: virtual bool SetFromString(const std::string &_value)
-    { return this->Set(_value); }
-
-    public: virtual std::string GetDefaultAsString() const
-    {
-      return boost::lexical_cast<std::string>(this->defaultValue);
-    }
-
-    /// \brief Set the parameter value from a string
-    public: virtual bool Set(const std::string &_str)
-    {
-      std::string str = _str;
-      boost::trim(str);
-      if (str.empty() && this->required)
-      {
-        gzerr << "Empty string used when setting a required parameter. Key["
-              << this->GetKey() << "]\n";
-        return false;
-      }
-      else if (str.empty())
-      {
-        this->value = this->defaultValue;
-        return true;
-      }
-
-      std::string tmp(str);
-      std::string lowerTmp(str);
-      boost::to_lower(lowerTmp);
-
-      // "true" and "false" doesn't work properly
-      if (lowerTmp == "true")
-        tmp = "1";
-      else if (lowerTmp == "false")
-        tmp = "0";
-
-      try
-      {
-        this->value = boost::lexical_cast<T>(tmp);
-      }
-      catch(boost::bad_lexical_cast &e)
-      {
-        if (str == "inf" || str == "-inf")
-        {
-          // in this case, the parser complains, but seems to assign the
-          // right values
-          gzmsg << "INFO [sdf::Param]: boost throws when lexical casting "
-            << "inf's, but the values are usually passed through correctly\n";
-        }
-        else
-        {
-          gzerr << "Unable to set value [" <<  str
-                << "] for key[" << this->key << "]\n";
-          return false;
-        }
-      }
-
-      this->set = true;
-      return this->set;
-    }
-
-    /// \brief Get the value
-    public: T GetValue() const
-    {
-      return this->value;
-    }
-
-    /// \brief Get the value
-    public: T GetDefaultValue() const
-    {
-      return this->defaultValue;
-    }
-
-    /// \brief Set the value of the parameter
-    public: void SetValue(const T &_value)
-    {
-      this->value = _value;
-      this->set = true;
-    }
-
-    /// \brief Reset to default value
-    public: virtual void Reset()
-    {
-      this->value = this->defaultValue;
-      this->set = false;
-    }
-
-    public: virtual boost::shared_ptr<Param> Clone() const
-            {
-              boost::shared_ptr<ParamT<T> > clone(
-                  new ParamT<T>(this->GetKey(), this->GetAsString(),
-                                this->required, this->typeName,
-                                this->description));
-              return clone;
-            }
-
-    public: inline T operator*() const {return value;}
-    public: friend std::ostream &operator<<(std::ostream &_out,
-                                             const ParamT<T> &_p)
-            {
-              _out << _p.value;
-              return _out;
-            }
-
-    protected: T value;
-    protected: T defaultValue;
-  };
-}
-#endif
diff --git a/gazebo/sdf/interface/Plugin.hh b/gazebo/sdf/interface/Plugin.hh
deleted file mode 100644
index 01c5b0b..0000000
--- a/gazebo/sdf/interface/Plugin.hh
+++ /dev/null
@@ -1,63 +0,0 @@
-
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Author: Nate Koenig, John Hsu */
-
-#ifndef SDF_PLUGIN_HH
-#define SDF_PLUGIN_HH
-
-#include <string>
-#include <vector>
-
-#include "sdf/interface/SDFBase.hh"
-
-namespace sdf
-{
-  class Plugin : public SDFBase
-  {
-    public: Plugin() :
-            name("name", "", true),
-            filename("filename", "", true)
-            {
-              Param::End();
-              this->xmlTree = "{plugin:name, filename}";
-            }
-
-    public: ParamT<std::string> name;
-    public: ParamT<std::string> filename;
-    public: std::vector<ParamT<std::string> > data;
-
-    public: void Clear()
-    {
-      SDFBase::Clear();
-      std::vector<ParamT<std::string> >::iterator iter;
-      for (iter = this->data.begin(); iter != this->data.end(); iter++)
-        iter->Reset();
-      this->data.clear();
-    }
-
-    public: void Print(const std::string &prefix)
-            {
-              std::cout << prefix  << "Plugin: Name[" << this->name
-                        << "] File[" << this->filename << "]\n";
-            }
-  };
-}
-
-#endif
-
-
diff --git a/gazebo/sdf/interface/SDF.cc b/gazebo/sdf/interface/SDF.cc
deleted file mode 100644
index ffa8e47..0000000
--- a/gazebo/sdf/interface/SDF.cc
+++ /dev/null
@@ -1,1642 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-#include "common/Color.hh"
-#include "common/Assert.hh"
-#include "math/Pose.hh"
-#include "math/Vector3.hh"
-#include "math/Vector2d.hh"
-
-#include "sdf/interface/parser.hh"
-#include "sdf/interface/SDF.hh"
-
-using namespace sdf;
-
-std::string SDF::version = SDF_VERSION;
-
-/////////////////////////////////////////////////
-Element::Element()
-{
-  this->copyChildren = false;
-}
-
-/////////////////////////////////////////////////
-Element::~Element()
-{
-  for (Param_V::iterator iter = this->attributes.begin();
-      iter != this->attributes.end(); ++iter)
-  {
-    (*iter).reset();
-  }
-  this->attributes.clear();
-
-  for (ElementPtr_V::iterator iter = this->elements.begin();
-      iter != this->elements.end(); ++iter)
-  {
-    (*iter).reset();
-  }
-
-  for (ElementPtr_V::iterator iter = this->elementDescriptions.begin();
-      iter != this->elementDescriptions.end(); ++iter)
-  {
-    (*iter).reset();
-  }
-  this->elements.clear();
-  this->elementDescriptions.clear();
-
-  this->value.reset();
-
-  this->parent.reset();
-  // this->Reset();
-}
-
-/////////////////////////////////////////////////
-ElementPtr Element::GetParent() const
-{
-  return this->parent;
-}
-
-/////////////////////////////////////////////////
-void Element::SetParent(const ElementPtr _parent)
-{
-  this->parent = _parent;
-}
-
-/////////////////////////////////////////////////
-void Element::SetName(const std::string &_name)
-{
-  this->name = _name;
-}
-
-/////////////////////////////////////////////////
-const std::string &Element::GetName() const
-{
-  return this->name;
-}
-
-/////////////////////////////////////////////////
-void Element::SetRequired(const std::string &_req)
-{
-  this->required = _req;
-}
-
-/////////////////////////////////////////////////
-const std::string &Element::GetRequired() const
-{
-  return this->required;
-}
-
-/////////////////////////////////////////////////
-void Element::SetCopyChildren(bool _value)
-{
-  this->copyChildren = _value;
-}
-
-/////////////////////////////////////////////////
-bool Element::GetCopyChildren() const
-{
-  return this->copyChildren;
-}
-
-/////////////////////////////////////////////////
-void Element::AddValue(const std::string &_type,
-    const std::string &_defaultValue, bool _required,
-    const std::string &_description)
-{
-  this->value = this->CreateParam(this->name, _type, _defaultValue, _required,
-      _description);
-}
-
-/////////////////////////////////////////////////
-boost::shared_ptr<Param> Element::CreateParam(const std::string &_key,
-    const std::string &_type, const std::string &_defaultValue, bool _required,
-    const std::string &_description)
-{
-  if (_type == "char")
-  {
-    boost::shared_ptr<ParamT<char> > param(
-        new ParamT<char>(_key, _defaultValue, _required, _type,
-                           _description));
-    return param;
-  }
-  if (_type == "double")
-  {
-    boost::shared_ptr<ParamT<double> > param(
-        new ParamT<double>(_key, _defaultValue, _required, _type,
-                           _description));
-    return param;
-  }
-  else if (_type == "int")
-  {
-    boost::shared_ptr<ParamT<int> > param(
-        new ParamT<int>(_key, _defaultValue, _required, _type, _description));
-    return param;
-  }
-  else if (_type == "unsigned int")
-  {
-    boost::shared_ptr<ParamT<unsigned int> > param(
-        new ParamT<unsigned int>(_key, _defaultValue, _required, _type,
-                                 _description));
-    return param;
-  }
-  else if (_type == "float")
-  {
-    boost::shared_ptr<ParamT<float> > param(
-        new ParamT<float>(_key, _defaultValue, _required, _type, _description));
-    return param;
-  }
-  else if (_type == "bool")
-  {
-    boost::shared_ptr<ParamT<bool> > param(
-        new ParamT<bool>(_key, _defaultValue, _required, _type, _description));
-    return param;
-  }
-  else if (_type == "string")
-  {
-    boost::shared_ptr<ParamT<std::string> > param(
-        new ParamT<std::string>(_key, _defaultValue, _required, _type,
-                                _description));
-    return param;
-  }
-  else if (_type == "color")
-  {
-    boost::shared_ptr<ParamT<gazebo::common::Color> > param(
-        new ParamT<gazebo::common::Color>(_key, _defaultValue, _required,
-                                          _type, _description));
-    return param;
-  }
-  else if (_type == "vector3")
-  {
-    boost::shared_ptr<ParamT<gazebo::math::Vector3> > param(
-        new ParamT<gazebo::math::Vector3>(_key, _defaultValue, _required,
-                                          _type, _description));
-    return param;
-  }
-  else if (_type == "vector2i")
-  {
-    boost::shared_ptr<ParamT<gazebo::math::Vector2i> > param(
-        new ParamT<gazebo::math::Vector2i>(_key, _defaultValue, _required,
-                                           _type, _description));
-    return param;
-  }
-  else if (_type == "vector2d")
-  {
-    boost::shared_ptr<ParamT<gazebo::math::Vector2d> > param(
-        new ParamT<gazebo::math::Vector2d>(_key, _defaultValue, _required,
-                                           _type, _description));
-    return param;
-  }
-  else if (_type == "pose")
-  {
-    boost::shared_ptr<ParamT<gazebo::math::Pose> > param(
-        new ParamT<gazebo::math::Pose>(_key, _defaultValue, _required,
-                                       _type, _description));
-    return param;
-  }
-  else if (_type == "quaternion")
-  {
-    boost::shared_ptr<ParamT<gazebo::math::Quaternion> > param(
-        new ParamT<gazebo::math::Quaternion>(_key, _defaultValue, _required,
-                                       _type, _description));
-    return param;
-  }
-  else if (_type == "time")
-  {
-    boost::shared_ptr<ParamT<gazebo::common::Time> > param(
-        new ParamT<gazebo::common::Time>(_key, _defaultValue, _required,
-                                         _type, _description));
-    return param;
-  }
-  else
-  {
-    return boost::shared_ptr<Param>();
-  }
-}
-
-/////////////////////////////////////////////////
-void Element::AddAttribute(const std::string &_key, const std::string &_type,
-    const std::string &_defaultValue, bool _required,
-    const std::string &_description)
-{
-  this->attributes.push_back(
-      this->CreateParam(_key, _type, _defaultValue, _required, _description));
-}
-
-/////////////////////////////////////////////////
-ElementPtr Element::Clone() const
-{
-  ElementPtr clone(new Element);
-  clone->description = this->description;
-  clone->name = this->name;
-  clone->required = this->required;
-  // clone->parent = this->parent;
-  clone->copyChildren = this->copyChildren;
-  clone->includeFilename = this->includeFilename;
-
-  Param_V::const_iterator aiter;
-  for (aiter = this->attributes.begin();
-      aiter != this->attributes.end(); ++aiter)
-  {
-    clone->attributes.push_back((*aiter)->Clone());
-  }
-
-  ElementPtr_V::const_iterator eiter;
-  for (eiter = this->elementDescriptions.begin();
-      eiter != this->elementDescriptions.end(); ++eiter)
-  {
-    clone->elementDescriptions.push_back((*eiter)->Clone());
-  }
-
-  for (eiter = this->elements.begin(); eiter != this->elements.end(); ++eiter)
-  {
-    clone->elements.push_back((*eiter)->Clone());
-    clone->elements.back()->parent = clone;
-  }
-
-  if (this->value)
-    clone->value = this->value->Clone();
-
-  return clone;
-}
-
-/////////////////////////////////////////////////
-void Element::Copy(const ElementPtr _elem)
-{
-  this->name = _elem->GetName();
-  this->description = _elem->GetDescription();
-  this->required = _elem->GetRequired();
-  this->copyChildren = _elem->GetCopyChildren();
-  this->includeFilename = _elem->includeFilename;
-
-  for (Param_V::iterator iter = _elem->attributes.begin();
-       iter != _elem->attributes.end(); ++iter)
-  {
-    if (!this->HasAttribute((*iter)->GetKey()))
-      this->attributes.push_back((*iter)->Clone());
-    ParamPtr param = this->GetAttribute((*iter)->GetKey());
-    param->SetFromString((*iter)->GetAsString());
-  }
-
-  if (_elem->GetValue())
-  {
-    if (!this->value)
-      this->value = _elem->GetValue()->Clone();
-    else
-      this->value->SetFromString(_elem->GetValue()->GetAsString());
-  }
-
-  this->elementDescriptions.clear();
-  for (ElementPtr_V::const_iterator iter = _elem->elementDescriptions.begin();
-       iter != _elem->elementDescriptions.end(); ++iter)
-  {
-    this->elementDescriptions.push_back((*iter)->Clone());
-  }
-
-  this->elements.clear();
-  for (ElementPtr_V::iterator iter = _elem->elements.begin();
-       iter != _elem->elements.end(); ++iter)
-  {
-    ElementPtr elem = (*iter)->Clone();
-    elem->Copy(*iter);
-    elem->parent = shared_from_this();
-    this->elements.push_back(elem);
-  }
-}
-
-/////////////////////////////////////////////////
-void Element::PrintDescription(std::string _prefix)
-{
-  std::cout << _prefix << "<element name ='" << this->name
-            << "' required ='" << this->required << "'>\n";
-
-  std::cout << _prefix << "  <description>" << this->description
-            << "</description>\n";
-
-  Param_V::iterator aiter;
-  for (aiter = this->attributes.begin();
-      aiter != this->attributes.end(); ++aiter)
-  {
-    std::cout << _prefix << "  <attribute name ='"
-              << (*aiter)->GetKey() << "' type ='" << (*aiter)->GetTypeName()
-              << "' default ='" << (*aiter)->GetDefaultAsString()
-              << "' required ='" << (*aiter)->GetRequired() << "'/>\n";
-  }
-
-  if (this->GetCopyChildren())
-    std::cout << _prefix << "  <element copy_data ='true' required ='*'/>\n";
-
-  ElementPtr_V::iterator eiter;
-  for (eiter = this->elementDescriptions.begin();
-      eiter != this->elementDescriptions.end(); ++eiter)
-  {
-    (*eiter)->PrintDescription(_prefix + "  ");
-  }
-
-  std::cout << _prefix << "</element>\n";
-}
-
-/////////////////////////////////////////////////
-void Element::PrintDocRightPane(std::string &_html, int _spacing, int &_index)
-{
-  std::ostringstream stream;
-  ElementPtr_V::iterator eiter;
-
-  int start = _index++;
-
-  std::string childHTML;
-  for (eiter = this->elementDescriptions.begin();
-      eiter != this->elementDescriptions.end(); ++eiter)
-  {
-    (*eiter)->PrintDocRightPane(childHTML, _spacing + 4, _index);
-  }
-
-  stream << "<a name=\"" << this->name << start
-         << "\">&lt" << this->name << "&gt</a>";
-
-  stream << "<div style='padding-left:" << _spacing << "px;'>\n";
-
-  stream << "<div style='background-color: #ffffff'>\n";
-
-  stream << "<font style='font-weight:bold'>Description: </font>";
-  if (!this->description.empty())
-    stream << this->description << "<br>\n";
-  else
-    stream << "none<br>\n";
-
-  stream << "<font style='font-weight:bold'>Required: </font>"
-         << this->required << "   \n";
-
-  stream << "<font style='font-weight:bold'>Type: </font>";
-  if (this->value)
-  {
-    stream << this->value->GetTypeName()
-           << "   \n"
-           << "<font style='font-weight:bold'>Default: </font>"
-           << this->value->GetDefaultAsString() << '\n';
-  }
-  else
-    stream << "n/a\n";
-
-  stream << "</div>";
-
-  if (this->attributes.size() > 0)
-  {
-    stream << "<div style='background-color: #dedede; padding-left:10px; "
-           << "display:inline-block;'>\n";
-    stream << "<font style='font-weight:bold'>Attributes</font><br>";
-
-    Param_V::iterator aiter;
-    for (aiter = this->attributes.begin();
-        aiter != this->attributes.end(); ++aiter)
-    {
-      stream << "<div style='display: inline-block;padding-bottom: 4px;'>\n";
-
-      stream << "<div style='float:left; width: 80px;'>\n";
-      stream << "<font style='font-style: italic;'>" << (*aiter)->GetKey()
-        << "</font>: ";
-      stream << "</div>\n";
-
-      stream << "<div style='float:left; padding-left: 4px; width: 300px;'>\n";
-
-      if (!(*aiter)->GetDescription().empty())
-          stream << (*aiter)->GetDescription() << "<br>\n";
-      else
-          stream << "no description<br>\n";
-
-      stream << "<font style='font-weight:bold'>Type: </font>"
-             << (*aiter)->GetTypeName() << "   "
-        << "<font style='font-weight:bold'>Default: </font>"
-        << (*aiter)->GetDefaultAsString() << "<br>";
-      stream << "</div>\n";
-
-      stream << "</div>\n";
-    }
-    stream << "</div>\n";
-    stream << "<br>\n";
-  }
-
-  _html += stream.str();
-  _html += childHTML;
-  _html += "</div>\n";
-}
-
-/////////////////////////////////////////////////
-void Element::PrintDocLeftPane(std::string &_html, int _spacing, int &_index)
-{
-  std::ostringstream stream;
-  ElementPtr_V::iterator eiter;
-
-  int start = _index++;
-
-  std::string childHTML;
-  for (eiter = this->elementDescriptions.begin();
-      eiter != this->elementDescriptions.end(); ++eiter)
-  {
-    (*eiter)->PrintDocLeftPane(childHTML, _spacing + 4, _index);
-  }
-
-  stream << "<a id='" << start << "' onclick='highlight(" << start
-         << ");' href=\"#" << this->name << start
-         << "\">&lt" << this->name << "&gt</a>";
-
-  stream << "<div style='padding-left:" << _spacing << "px;'>\n";
-
-  _html += stream.str();
-  _html += childHTML;
-  _html += "</div>\n";
-}
-
-/////////////////////////////////////////////////
-void Element::PrintValues(std::string _prefix)
-{
-  std::cout << _prefix << "<" << this->name;
-
-  Param_V::iterator aiter;
-  for (aiter = this->attributes.begin();
-       aiter != this->attributes.end(); ++aiter)
-  {
-    std::cout << " " << (*aiter)->GetKey() << "='"
-      << (*aiter)->GetAsString() << "'";
-  }
-
-  if (this->elements.size() > 0)
-  {
-    std::cout << ">\n";
-    ElementPtr_V::iterator eiter;
-    for (eiter = this->elements.begin();
-        eiter != this->elements.end(); ++eiter)
-    {
-      (*eiter)->PrintValues(_prefix + "  ");
-    }
-    std::cout << _prefix << "</" << this->name << ">\n";
-  }
-  else
-  {
-    if (this->value)
-    {
-      std::cout << ">" << this->value->GetAsString()
-        << "</" << this->name << ">\n";
-    }
-    else
-    {
-      std::cout << "/>\n";
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-std::string Element::ToString(const std::string &_prefix) const
-{
-  std::ostringstream out;
-  this->ToString(_prefix, out);
-  return out.str();
-}
-
-/////////////////////////////////////////////////
-void Element::ToString(const std::string &_prefix,
-                       std::ostringstream &_out) const
-{
-  if (this->includeFilename.empty())
-  {
-    _out << _prefix << "<" << this->name;
-
-    Param_V::const_iterator aiter;
-    for (aiter = this->attributes.begin();
-        aiter != this->attributes.end(); ++aiter)
-    {
-      _out << " " << (*aiter)->GetKey() << "='"
-           << (*aiter)->GetAsString() << "'";
-    }
-
-    if (this->elements.size() > 0)
-    {
-      _out << ">\n";
-      ElementPtr_V::const_iterator eiter;
-      for (eiter = this->elements.begin();
-          eiter != this->elements.end(); ++eiter)
-      {
-        (*eiter)->ToString(_prefix + "  ", _out);
-      }
-      _out << _prefix << "</" << this->name << ">\n";
-    }
-    else
-    {
-      if (this->value)
-      {
-        _out << ">" << this->value->GetAsString()
-             << "</" << this->name << ">\n";
-      }
-      else
-      {
-        _out << "/>\n";
-      }
-    }
-  }
-  else
-  {
-    _out << _prefix << "<include filename='"
-         << this->includeFilename << "'/>\n";
-  }
-}
-
-/////////////////////////////////////////////////
-bool Element::HasAttribute(const std::string &_key)
-{
-  return this->GetAttribute(_key) != NULL;
-}
-
-/////////////////////////////////////////////////
-bool Element::GetAttributeSet(const std::string &_key)
-{
-  bool result = false;
-  ParamPtr p = this->GetAttribute(_key);
-  if (p)
-    result = p->GetSet();
-
-  return result;
-}
-
-/////////////////////////////////////////////////
-ParamPtr Element::GetAttribute(const std::string &_key)
-{
-  Param_V::const_iterator iter;
-  for (iter = this->attributes.begin();
-      iter != this->attributes.end(); ++iter)
-  {
-    if ((*iter)->GetKey() == _key)
-      return (*iter);
-  }
-  return ParamPtr();
-}
-
-/////////////////////////////////////////////////
-unsigned int Element::GetAttributeCount() const
-{
-  return this->attributes.size();
-}
-
-/////////////////////////////////////////////////
-ParamPtr Element::GetAttribute(unsigned int _index) const
-{
-  ParamPtr result;
-  if (_index < this->attributes.size())
-    result = this->attributes[_index];
-
-  return result;
-}
-
-/////////////////////////////////////////////////
-unsigned int Element::GetElementDescriptionCount() const
-{
-  return this->elementDescriptions.size();
-}
-
-/////////////////////////////////////////////////
-ElementPtr Element::GetElementDescription(unsigned int _index) const
-{
-  ElementPtr result;
-  if (_index < this->elementDescriptions.size())
-    result = this->elementDescriptions[_index];
-  return result;
-}
-
-/////////////////////////////////////////////////
-ElementPtr Element::GetElementDescription(const std::string &_key) const
-{
-  ElementPtr_V::const_iterator iter;
-  for (iter = this->elementDescriptions.begin();
-       iter != this->elementDescriptions.end(); ++iter)
-  {
-    if ((*iter)->GetName() == _key)
-      return (*iter);
-  }
-
-  return ElementPtr();
-}
-
-/////////////////////////////////////////////////
-ParamPtr Element::GetValue()
-{
-  return this->value;
-}
-
-/////////////////////////////////////////////////
-bool Element::HasElement(const std::string &_name) const
-{
-  ElementPtr_V::const_iterator iter;
-  for (iter = this->elements.begin(); iter != this->elements.end(); ++iter)
-  {
-    if ((*iter)->GetName() == _name)
-      return true;
-  }
-
-  return false;
-}
-
-/////////////////////////////////////////////////
-ElementPtr Element::GetElementImpl(const std::string &_name) const
-{
-  ElementPtr_V::const_iterator iter;
-  for (iter = this->elements.begin(); iter != this->elements.end(); ++iter)
-  {
-    if ((*iter)->GetName() == _name)
-      return (*iter);
-  }
-
-  // gzdbg << "Unable to find element [" << _name << "] return empty\n";
-  return ElementPtr();
-}
-
-/////////////////////////////////////////////////
-ElementPtr Element::GetFirstElement() const
-{
-  if (this->elements.empty())
-    return ElementPtr();
-  else
-    return this->elements.front();
-}
-
-/////////////////////////////////////////////////
-ElementPtr Element::GetNextElement(const std::string &_name) const
-{
-  if (this->parent)
-  {
-    ElementPtr_V::const_iterator iter;
-    iter = std::find(this->parent->elements.begin(),
-        this->parent->elements.end(), shared_from_this());
-
-    if (iter == this->parent->elements.end())
-    {
-      return ElementPtr();
-    }
-
-    ++iter;
-    if (iter == this->parent->elements.end())
-      return ElementPtr();
-    else if (_name.empty())
-      return *(iter);
-    else
-    {
-      for (; iter != this->parent->elements.end(); ++iter)
-      {
-        if ((*iter)->GetName() == _name)
-          return (*iter);
-      }
-    }
-  }
-
-  return ElementPtr();
-}
-
-/////////////////////////////////////////////////
-ElementPtr Element::GetElement(const std::string &_name)
-{
-  if (this->HasElement(_name))
-    return this->GetElementImpl(_name);
-  else
-    return this->AddElement(_name);
-}
-
-/////////////////////////////////////////////////
-void Element::InsertElement(ElementPtr _elem)
-{
-  this->elements.push_back(_elem);
-}
-
-/////////////////////////////////////////////////
-bool Element::HasElementDescription(const std::string &_name)
-{
-  bool result = false;
-  ElementPtr_V::const_iterator iter;
-  for (iter = this->elementDescriptions.begin();
-       iter != this->elementDescriptions.end(); ++iter)
-  {
-    if ((*iter)->name == _name)
-    {
-      result = true;
-      break;
-    }
-  }
-
-  return result;
-}
-
-/////////////////////////////////////////////////
-ElementPtr Element::AddElement(const std::string &_name)
-{
-  ElementPtr_V::const_iterator iter, iter2;
-  for (iter = this->elementDescriptions.begin();
-      iter != this->elementDescriptions.end(); ++iter)
-  {
-    if ((*iter)->name == _name)
-    {
-      ElementPtr elem = (*iter)->Clone();
-      elem->SetParent(shared_from_this());
-      this->elements.push_back(elem);
-
-      // Add all child elements.
-      for (iter2 = elem->elementDescriptions.begin();
-           iter2 != elem->elementDescriptions.end(); ++iter2)
-      {
-        if ((*iter2)->GetRequired() == "1")
-          elem->AddElement((*iter2)->name);
-      }
-
-      return this->elements.back();
-    }
-  }
-  gzerr << "Missing element description for [" << _name << "]\n";
-  return ElementPtr();
-}
-
-/////////////////////////////////////////////////
-bool Element::GetValueBool(const std::string &_key)
-{
-  bool result = false;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a bool.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueBool();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueBool();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-
-  return result;
-}
-
-/////////////////////////////////////////////////
-int Element::GetValueInt(const std::string &_key)
-{
-  int result = 0;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as an int.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueInt();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueInt();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-float Element::GetValueFloat(const std::string &_key)
-{
-  float result = 0.0;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a float.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueFloat();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueFloat();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-double Element::GetValueDouble(const std::string &_key)
-{
-  double result = 0.0;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      if (this->value->IsStr())
-        result = boost::lexical_cast<double>(this->value->GetAsString());
-      else
-        this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a double.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueDouble();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueDouble();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-unsigned int Element::GetValueUInt(const std::string &_key)
-{
-  unsigned int result = 0;
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      if (this->value->IsStr())
-        result = boost::lexical_cast<unsigned int>(this->value->GetAsString());
-      else
-        this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as an unsigned int.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueUInt();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueUInt();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-char Element::GetValueChar(const std::string &_key)
-{
-  char result = '\0';
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      if (this->value->IsStr())
-        result = boost::lexical_cast<char>(this->value->GetAsString());
-      else
-        this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a char.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueChar();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueChar();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-std::string Element::GetValueString(const std::string &_key)
-{
-  std::string result = "";
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value, returning empty string.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueString();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueString();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-gazebo::math::Vector3 Element::GetValueVector3(const std::string &_key)
-{
-  gazebo::math::Vector3 result;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a vector3.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueVector3();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueVector3();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-gazebo::math::Vector2d Element::GetValueVector2d(const std::string &_key)
-{
-  gazebo::math::Vector2d result;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a vector2d.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueVector2d();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueVector2d();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-gazebo::math::Quaternion Element::GetValueQuaternion(const std::string &_key)
-{
-  gazebo::math::Quaternion result;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a quaternion.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueQuaternion();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueQuaternion();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-gazebo::math::Pose Element::GetValuePose(const std::string &_key)
-{
-  gazebo::math::Pose result;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a pose.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValuePose();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValuePose();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-gazebo::common::Color Element::GetValueColor(const std::string &_key)
-{
-  gazebo::common::Color result;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a color.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueColor();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueColor();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-gazebo::common::Time Element::GetValueTime(const std::string &_key)
-{
-  gazebo::common::Time result;
-
-  if (_key.empty())
-  {
-    if (this->value)
-    {
-      this->value->Get(result);
-    }
-    else
-    {
-      gzwarn << "Parameter [" << this->GetName()
-             << "] has no value when attempting to get as a time.\n";
-    }
-  }
-  else
-  {
-    ParamPtr param = this->GetAttribute(_key);
-    if (param)
-      param->Get(result);
-    else if (this->HasElement(_key))
-      result = this->GetElementImpl(_key)->GetValueTime();
-    else if (this->HasElementDescription(_key))
-      result = this->GetElementDescription(_key)->GetValueTime();
-    else
-      gzerr << "Unable to find value for key[" << _key << "]\n";
-  }
-  return result;
-}
-
-/////////////////////////////////////////////////
-void Element::RemoveFromParent()
-{
-  if (this->parent)
-  {
-    ElementPtr_V::iterator iter;
-    iter = std::find(this->parent->elements.begin(),
-        this->parent->elements.end(), shared_from_this());
-
-    if (iter != this->parent->elements.end())
-    {
-      this->parent->elements.erase(iter);
-      this->parent.reset();
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-void Element::RemoveChild(ElementPtr _child)
-{
-  GZ_ASSERT(_child, "Cannot remove a NULL child pointer");
-
-  ElementPtr_V::iterator iter;
-  iter = std::find(this->elements.begin(),
-                   this->elements.end(), _child);
-
-  if (iter != this->elements.end())
-  {
-    _child->SetParent(ElementPtr());
-    this->elements.erase(iter);
-  }
-}
-
-/////////////////////////////////////////////////
-void Element::ClearElements()
-{
-  this->elements.clear();
-}
-
-/////////////////////////////////////////////////
-void Element::Update()
-{
-  for (sdf::Param_V::iterator iter = this->attributes.begin();
-      iter != this->attributes.end(); ++iter)
-  {
-    (*iter)->Update();
-  }
-
-  for (sdf::ElementPtr_V::iterator iter = this->elements.begin();
-      iter != this->elements.end(); ++iter)
-  {
-    (*iter)->Update();
-  }
-
-  if (this->value)
-    this->value->Update();
-}
-
-/////////////////////////////////////////////////
-void Element::Reset()
-{
-  for (ElementPtr_V::iterator iter = this->elements.begin();
-      iter != this->elements.end(); ++iter)
-  {
-    (*iter)->Reset();
-    (*iter).reset();
-  }
-
-  for (ElementPtr_V::iterator iter = this->elementDescriptions.begin();
-      iter != this->elementDescriptions.end(); ++iter)
-  {
-    (*iter)->Reset();
-    (*iter).reset();
-  }
-  this->elements.clear();
-  this->elementDescriptions.clear();
-
-  this->value.reset();
-
-  this->parent.reset();
-}
-
-/////////////////////////////////////////////////
-void Element::AddElementDescription(ElementPtr _elem)
-{
-  this->elementDescriptions.push_back(_elem);
-}
-
-/////////////////////////////////////////////////
-void Element::SetInclude(const std::string &_filename)
-{
-  this->includeFilename = _filename;
-}
-
-/////////////////////////////////////////////////
-std::string Element::GetInclude() const
-{
-  return this->includeFilename;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const bool &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const int &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const unsigned int &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const float &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const double &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const char &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const std::string &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const char *_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const gazebo::math::Vector3 &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const gazebo::math::Vector2i &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const gazebo::math::Vector2d &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const gazebo::math::Quaternion &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const gazebo::math::Pose &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const gazebo::common::Color &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-bool Element::Set(const gazebo::common::Time &_value)
-{
-  if (this->value)
-  {
-    this->value->Set(_value);
-    return true;
-  }
-  return false;
-}
-
-/////////////////////////////////////////////////
-std::string Element::GetDescription() const
-{
-  return this->description;
-}
-
-/////////////////////////////////////////////////
-void Element::SetDescription(const std::string &_desc)
-{
-  this->description = _desc;
-}
-
-
-
-
-/////////////////////////////////////////////////
-SDF::SDF()
-: root(new Element)
-{
-}
-
-/////////////////////////////////////////////////
-void SDF::PrintDescription()
-{
-  this->root->PrintDescription("");
-}
-
-/////////////////////////////////////////////////
-void SDF::PrintValues()
-{
-  this->root->PrintValues("");
-}
-
-/////////////////////////////////////////////////
-void SDF::PrintDoc()
-{
-  std::string html, html2;
-  int index = 0;
-  this->root->PrintDocLeftPane(html, 10, index);
-
-  index = 0;
-  this->root->PrintDocRightPane(html2, 10, index);
-
-  std::cout << "<!DOCTYPE HTML>\n"
-  << "<html>\n"
-  << "<head>\n"
-  << "  <link href='style.css' rel='stylesheet' type='text/css'>\n"
-  << "  <script type='text/javascript' src='jquery.js'></script>\n"
-  << "  <script type='text/javascript' src='splitter-152.js'></script>\n"
-  << "  <script type='text/javascript'>\n"
-  << "    var prevId = 0;\n"
-  << "  function highlight(id) {\n"
-  << "    var elem = document.getElementById(prevId);\n"
-  << "    elem.style.background = '#ffffff';\n"
-  << "    elem.style.color = '#da7800';\n"
-  << "    elem = document.getElementById(id);\n"
-  << "    elem.style.background = '#da7800';\n"
-  << "    elem.style.color = '#ffffff';\n"
-  << "    prevId = id;\n"
-  << "  }\n"
-  << "  $().ready(function() {\n"
-  << "    $('#my_splitter').splitter({\n"
-  << "      splitVertical: true,\n"
-  << "      outline: true,\n"
-  << "      sizeLeft: true,\n"
-  << "      resizeTo: window,\n"
-  << "      accessKey: 'I'\n"
-  << "    });\n"
-  << "  });\n"
-  << "  </script>\n"
-  << "  <style type='text/css' media='all'>\n"
-  << "  #my_splitter {\n"
-  << "      height: 500px;\n"
-  << "      width: 100%;\n"
-  << "      border: 1px solid #aaa;\n"
-  << "  }\n"
-  << "  #left_pane {\n"
-  << "    min-width:320px;\n"
-  << "  }\n"
-  << "  #right_pane {\n"
-  << "    min-width:500px;\n"
-  << "  }\n"
-  << "  </style>\n"
-  << "</head>\n<body>\n";
-
-  std::cout << "<div style='padding:4px'>\n"
-            << "<h1>SDF " << SDF::version << "</h1>\n";
-
-  std::cout << "<p>The Simulation Description Format (SDF) is an XML file "
-            << "format used to describe all the elements in a simulation "
-            << "environment.\n</p>";
-  std::cout << "<h3>Usage</h3>\n";
-  std::cout << "<blockquote>";
-  std::cout << "<ul><li><b>Left Panel:</b> List of all the SDF elements.</li>";
-  std::cout << "<li><b>Right Panel:</b> Descriptions of all the SDF "
-            << "elements.</li>";
-  std::cout << "<li><b>Selection:</b> Clicking an element in the Left Panel "
-            << "moves the corresponding description to the top of the Right "
-            << "Panel.</li>";
-  std::cout << "<li><b>Search:</b> Use your web-browser's built in 'Find' "
-            << "function to locate a specific element."
-            << "</li></ul>";
-  std::cout << "</blockquote>";
-
-  std::cout << "</br>\n";
-
-  std::cout << "<h3>Meta-Tags</h3>\n";
-  std::cout << "<blockquote>";
-  std::cout << "Meta-tags are processed by the parser before the final "
-            << "SDF file is generated.";
-  std::cout << "<ul>";
-
-  std::cout << "<li><b>&ltinclude&gt</b>: Include an SDF model file "
-            << "within the current SDF file."
-            << "<ul style='margin-left:12px'>"
-            << "<li><b><uri></b>: URI of SDF model file to include.</li>"
-            << "<li><b><name></b>: Name of the included SDF model.</li>"
-            << "<li><b><pose></b>: Pose of the included SDF model, "
-            << "specified as <pose>x y z roll pitch yaw</pose>, "
-            << "with x, y, and z representing a position in meters, and roll, "
-            << "pitch, and yaw representing Euler angles in radians.</li>"
-            << "</ul>"
-            << "</li>";
-
-  std::cout << "</ul>";
-  std::cout << "</blockquote>";
-
-
-  std::cout << "</div>\n";
-
-  std::cout << "<div id='my_splitter'>\n";
-
-  std::cout << "<div id='left_pane'>\n";
-  std::cout << html;
-  std::cout << "</div>\n";
-
-  std::cout << "<div id='right_pane'>\n";
-  std::cout << html2;
-  std::cout << "</div>\n";
-
-  std::cout << "</div>\n";
-
-  std::cout << "\
-    </body>\
-    </html>\n";
-}
-
-/////////////////////////////////////////////////
-void SDF::Write(const std::string &_filename)
-{
-  std::string string = this->root->ToString("");
-
-  std::ofstream out(_filename.c_str(), std::ios::out);
-
-  if (!out)
-  {
-    gzerr << "Unable to open file[" << _filename << "] for writing\n";
-    return;
-  }
-  out << string;
-  out.close();
-}
-
-/////////////////////////////////////////////////
-std::string SDF::ToString() const
-{
-  std::ostringstream stream;
-
-  if (this->root->GetName() != "sdf")
-    stream << "<sdf version='" << SDF::version << "'>\n";
-
-  stream << this->root->ToString("");
-
-  if (this->root->GetName() != "sdf")
-    stream << "</sdf>";
-
-  return stream.str();
-}
-
-/////////////////////////////////////////////////
-void SDF::SetFromString(const std::string &_sdfData)
-{
-  sdf::initFile("root.sdf", this->root);
-  if (!sdf::readString(_sdfData, this->root))
-  {
-    gzerr << "Unable to parse sdf string[" << _sdfData << "]\n";
-  }
-}
diff --git a/gazebo/sdf/interface/SDF.hh b/gazebo/sdf/interface/SDF.hh
deleted file mode 100644
index 43368e2..0000000
--- a/gazebo/sdf/interface/SDF.hh
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef SDF_HH
-#define SDF_HH
-
-#include <vector>
-#include <string>
-#include <boost/shared_ptr.hpp>
-#include <boost/enable_shared_from_this.hpp>
-
-#include "sdf/interface/Param.hh"
-
-#define SDF_VERSION "1.4"
-
-/// \ingroup gazebo_parser
-/// \brief namespace for Simulation Description Format parser
-namespace sdf
-{
-  class SDF;
-  class Element;
-  typedef boost::shared_ptr<SDF> SDFPtr;
-  typedef boost::shared_ptr<Element> ElementPtr;
-  typedef std::vector< ElementPtr > ElementPtr_V;
-
-  /// \addtogroup gazebo_parser
-  /// \{
-
-  /// \brief SDF Element class
-  class Element : public boost::enable_shared_from_this<Element>
-  {
-    public: Element();
-    public: virtual ~Element();
-
-    public: boost::shared_ptr<Element> Clone() const;
-
-    /// \brief Copy values from an Element
-    public: void Copy(const ElementPtr _elem);
-
-    public: ElementPtr GetParent() const;
-    public: void SetParent(const ElementPtr _parent);
-
-    public: void SetName(const std::string &_name);
-    public: const std::string &GetName() const;
-
-    public: void SetRequired(const std::string &_req);
-    public: const std::string &GetRequired() const;
-
-    public: void SetCopyChildren(bool _value);
-    public: bool GetCopyChildren() const;
-
-    public: void PrintDescription(std::string _prefix);
-    public: void PrintValues(std::string _prefix);
-    public: void PrintWiki(std::string _prefix);
-
-    /// \brief Helper function for SDF::PrintDoc
-    ///
-    /// This generates the SDF html documentation.
-    /// \param[out] _html Accumulated HTML for output.
-    /// \param[in] _spacing Amount of spacing for this element.
-    /// \param[in] _index Unique index for this element.
-    public: void PrintDocLeftPane(std::string &_html,
-                                  int _spacing, int &_index);
-
-    /// \brief Helper function for SDF::PrintDoc
-    ///
-    /// This generates the SDF html documentation.
-    /// \param[out] _html Accumulated HTML for output
-    /// \param[in] _spacing Amount of spacing for this element.
-    public: void PrintDocRightPane(std::string &_html,
-                                  int _spacing, int &_index);
-
-    private: void ToString(const std::string &_prefix,
-                           std::ostringstream &_out) const;
-    public: std::string ToString(const std::string &_prefix) const;
-
-    public: void AddAttribute(const std::string &_key,
-                              const std::string &_type,
-                              const std::string &_defaultvalue,
-                              bool _required,
-                              const std::string &_description="");
-
-    public: void AddValue(const std::string &_type,
-                          const std::string &_defaultValue, bool _required,
-                          const std::string &_description="");
-
-    /// \brief Get the param of an attribute.
-    /// \param _key the name of the attribute
-    public: ParamPtr GetAttribute(const std::string &_key);
-
-    /// \brief Get the number of attributes
-    public: unsigned int GetAttributeCount() const;
-
-    /// \brief Get an attribute using an index
-    public: ParamPtr GetAttribute(unsigned int _index) const;
-
-    /// \brief Get the number of element descriptions
-    public: unsigned int GetElementDescriptionCount() const;
-
-    /// \brief Get an element description using an index
-    public: ElementPtr GetElementDescription(unsigned int _index) const;
-
-    /// \brief Get an element descriptio using a key
-    public: ElementPtr GetElementDescription(const std::string &_key) const;
-
-    /// \brief Return true if an element description exists
-    public: bool HasElementDescription(const std::string &_name);
-
-    public: bool HasAttribute(const std::string &_key);
-
-    /// \brief Return true if the attribute was set (i.e. not default value)
-    public: bool GetAttributeSet(const std::string &_key);
-
-    /// \brief Get the param of the elements value
-    public: ParamPtr GetValue();
-
-    public: bool GetValueBool(const std::string &_key = "");
-    public: int GetValueInt(const std::string &_key = "");
-    public: float GetValueFloat(const std::string &_key = "");
-    public: double GetValueDouble(const std::string &_key = "");
-    public: unsigned int GetValueUInt(const std::string &_key = "");
-    public: char GetValueChar(const std::string &_key = "");
-    public: std::string GetValueString(const std::string &_key = "");
-    public: gazebo::math::Vector3 GetValueVector3(const std::string &_key = "");
-    public: gazebo::math::Vector2d GetValueVector2d(
-                const std::string &_key = "");
-    public: gazebo::math::Quaternion GetValueQuaternion(
-                const std::string &_key = "");
-    public: gazebo::math::Pose GetValuePose(const std::string &_key = "");
-    public: gazebo::common::Color GetValueColor(const std::string &_key = "");
-    public: gazebo::common::Time GetValueTime(const std::string &_key = "");
-
-    public: bool Set(const bool &_value);
-    public: bool Set(const int &_value);
-    public: bool Set(const unsigned int &_value);
-    public: bool Set(const float &_value);
-    public: bool Set(const double &_value);
-    public: bool Set(const char &_value);
-    public: bool Set(const std::string &_value);
-    public: bool Set(const char *_value);
-    public: bool Set(const gazebo::math::Vector3 &_value);
-    public: bool Set(const gazebo::math::Vector2i &_value);
-    public: bool Set(const gazebo::math::Vector2d &_value);
-    public: bool Set(const gazebo::math::Quaternion &_value);
-    public: bool Set(const gazebo::math::Pose &_value);
-    public: bool Set(const gazebo::common::Color &_value);
-    public: bool Set(const gazebo::common::Time &_value);
-
-    public: bool HasElement(const std::string &_name) const;
-
-    public: ElementPtr GetElement(const std::string &_name) const;
-    public: ElementPtr GetFirstElement() const;
-
-    public: ElementPtr GetNextElement(const std::string &_name = "") const;
-
-    public: ElementPtr GetElement(const std::string &_name);
-    public: ElementPtr AddElement(const std::string &_name);
-    public: void InsertElement(ElementPtr _elem);
-
-    /// \brief Remove this element from its parent.
-    public: void RemoveFromParent();
-
-    /// \brief Remove a child element.
-    /// \param[in] _child Pointer to the child to remove.
-    public: void RemoveChild(ElementPtr _child);
-
-    /// \brief Remove all child elements.
-    public: void ClearElements();
-
-    public: void Update();
-    public: void Reset();
-
-    public: void SetInclude(const std::string &_filename);
-    public: std::string GetInclude() const;
-
-    /// \brief Get a text description of the element
-    public: std::string GetDescription() const;
-
-    /// \brief Set a text description for the element
-    public: void SetDescription(const std::string &_desc);
-
-    /// \brief Add a new element description
-    public: void AddElementDescription(ElementPtr _elem);
-
-    private: boost::shared_ptr<Param> CreateParam(const std::string &_key,
-                 const std::string &_type, const std::string &_defaultValue,
-                 bool _required, const std::string &_description="");
-
-    public: ElementPtr GetElementImpl(const std::string &_name) const;
-
-    private: std::string name;
-    private: std::string required;
-    private: std::string description;
-    private: bool copyChildren;
-
-    private: ElementPtr parent;
-
-    // Attributes of this element
-    private: Param_V attributes;
-
-    // Value of this element
-    private: ParamPtr value;
-
-    // The existing child elements
-    private: ElementPtr_V elements;
-
-    // The possible child elements
-    private: ElementPtr_V elementDescriptions;
-
-    /// name of the include file that was used to create this element
-    private: std::string includeFilename;
-  };
-
-
-  /// \brief Base SDF class
-  class SDF
-  {
-    public: SDF();
-    public: void PrintDescription();
-    public: void PrintValues();
-    public: void PrintWiki();
-    public: void PrintDoc();
-    public: void Write(const std::string &_filename);
-    public: std::string ToString() const;
-
-    /// \brief Set SDF values from a string
-    public: void SetFromString(const std::string &_sdfData);
-
-    public: ElementPtr root;
-
-    public: static std::string version;
-  };
-  /// \}
-}
-#endif
diff --git a/gazebo/sdf/interface/SDF_TEST.cc b/gazebo/sdf/interface/SDF_TEST.cc
deleted file mode 100644
index e3cd390..0000000
--- a/gazebo/sdf/interface/SDF_TEST.cc
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <gtest/gtest.h>
-
-#include "gazebo/sdf/sdf.hh"
-#include "gazebo/common/common.hh"
-#include "gazebo/math/gzmath.hh"
-
-class SdfUpdateFixture
-{
-  public:  std::string GetName() const {return this->name;}
-  public:  bool GetFlag() const {return this->flag;}
-  public:  gazebo::math::Pose GetPose() const {return this->pose;}
-  public:  std::string name;
-  public:  bool flag;
-  public:  gazebo::math::Pose pose;
-};
-
-////////////////////////////////////////////////////
-/// Ensure that SDF::Update is working for attributes
-TEST(SdfUpdate, UpdateAttribute)
-{
-  // Set up a simple sdf model file
-  std::ostringstream stream;
-  stream << "<sdf version='1.3'>"
-         << "<model name='test_model'>"
-         << "  <pose>0 1 2  0 0 0</pose>"
-         << "  <static>false</static>"
-         << "</model>"
-         << "</sdf>";
-  sdf::SDF sdfParsed;
-  sdfParsed.SetFromString(stream.str());
-
-  // Verify correct parsing
-  EXPECT_TRUE(sdfParsed.root->HasElement("model"));
-  sdf::ElementPtr modelElem = sdfParsed.root->GetElement("model");
-
-  // Read name attribute value
-  EXPECT_TRUE(modelElem->HasAttribute("name"));
-  sdf::ParamPtr nameParam = modelElem->GetAttribute("name");
-  EXPECT_TRUE(nameParam->IsStr());
-
-  // Set test class variables based on sdf values
-  // Set parameter update functions to test class accessors
-  SdfUpdateFixture fixture;
-  nameParam->Get(fixture.name);
-  nameParam->SetUpdateFunc(boost::bind(&SdfUpdateFixture::GetName, &fixture));
-
-  std::string nameCheck;
-  int i;
-  for (i = 0; i < 4; i++)
-  {
-    // Update test class variables
-    fixture.name[0] = 'd' + i;
-
-    // Update root sdf element
-    sdfParsed.root->Update();
-
-    // Expect sdf values to match test class variables
-    nameParam->Get(nameCheck);
-    EXPECT_EQ(nameCheck, fixture.name);
-  }
-}
-
-////////////////////////////////////////////////////
-/// Ensure that SDF::Update is working for elements
-TEST(SdfUpdate, UpdateElement)
-{
-  // Set up a simple sdf model file
-  std::ostringstream stream;
-  stream << "<sdf version='1.3'>"
-         << "<model name='test_model'>"
-         << "  <pose>0 1 2  0 0 0</pose>"
-         << "  <static>false</static>"
-         << "</model>"
-         << "</sdf>";
-  sdf::SDF sdfParsed;
-  sdfParsed.SetFromString(stream.str());
-
-  // Verify correct parsing
-  EXPECT_TRUE(sdfParsed.root->HasElement("model"));
-  sdf::ElementPtr modelElem = sdfParsed.root->GetElement("model");
-
-  // Read static element value
-  EXPECT_TRUE(modelElem->HasElement("static"));
-  sdf::ParamPtr staticParam = modelElem->GetElement("static")->GetValue();
-  EXPECT_TRUE(staticParam->IsBool());
-
-  // Read pose element value
-  EXPECT_TRUE(modelElem->HasElement("pose"));
-  sdf::ParamPtr poseParam = modelElem->GetElement("pose")->GetValue();
-  EXPECT_TRUE(poseParam->IsPose());
-
-  // Set test class variables based on sdf values
-  // Set parameter update functions to test class accessors
-  SdfUpdateFixture fixture;
-  staticParam->Get(fixture.flag);
-  staticParam->SetUpdateFunc(boost::bind(&SdfUpdateFixture::GetFlag, &fixture));
-  poseParam->Get(fixture.pose);
-  poseParam->SetUpdateFunc(boost::bind(&SdfUpdateFixture::GetPose, &fixture));
-
-  bool flagCheck;
-  gazebo::math::Pose poseCheck;
-  int i;
-  for (i = 0; i < 4; i++)
-  {
-    // Update test class variables
-    fixture.flag = !fixture.flag;
-    fixture.pose.pos.x = i;
-    fixture.pose.pos.y = i+10;
-    fixture.pose.pos.z = -i*i*i;
-
-    // Update root sdf element
-    sdfParsed.root->Update();
-
-    // Expect sdf values to match test class variables
-    staticParam->Get(flagCheck);
-    EXPECT_EQ(flagCheck, fixture.flag);
-    poseParam->Get(poseCheck);
-    EXPECT_EQ(poseCheck, fixture.pose);
-  }
-}
-
-////////////////////////////////////////////////////
-/// Ensure that SDF::Element::RemoveFromParent is working
-TEST(SdfUpdate, ElementRemoveFromParent)
-{
-  // Set up a simple sdf model file
-  std::ostringstream stream;
-  stream << "<sdf version='1.3'>"
-         << "<model name='model1'>"
-         << "  <pose>0 1 2  0 0 0</pose>"
-         << "  <static>false</static>"
-         << "</model>"
-         << "<model name='model2'>"
-         << "  <pose>0 1 2  0 0 0</pose>"
-         << "  <static>false</static>"
-         << "</model>"
-         << "<model name='model3'>"
-         << "  <pose>0 1 2  0 0 0</pose>"
-         << "  <static>false</static>"
-         << "</model>"
-         << "</sdf>";
-  sdf::SDF sdfParsed;
-  sdfParsed.SetFromString(stream.str());
-
-  sdf::ElementPtr elem;
-
-  // Verify correct parsing
-  EXPECT_TRUE(sdfParsed.root->HasElement("model"));
-  elem = sdfParsed.root->GetElement("model");
-
-  // Select the second model named 'model2'
-  elem = elem->GetNextElement("model");
-  EXPECT_TRUE(elem);
-  EXPECT_TRUE(elem->HasAttribute("name"));
-  EXPECT_EQ(elem->GetValueString("name"), "model2");
-
-  // Remove model2
-  elem->RemoveFromParent();
-
-  // Get first model element again
-  elem = sdfParsed.root->GetElement("model");
-  // Check name == model1
-  EXPECT_TRUE(elem->HasAttribute("name"));
-  EXPECT_EQ(elem->GetValueString("name"), "model1");
-
-  // Get next model element
-  elem = elem->GetNextElement("model");
-  // Check name == model3
-  EXPECT_TRUE(elem->HasAttribute("name"));
-  EXPECT_EQ(elem->GetValueString("name"), "model3");
-
-  // Try to get another model element
-  elem = elem->GetNextElement("model");
-  EXPECT_FALSE(elem);
-}
-
-////////////////////////////////////////////////////
-/// Ensure that SDF::Element::RemoveChild is working
-TEST(SdfUpdate, ElementRemoveChild)
-{
-  // Set up a simple sdf model file
-  std::ostringstream stream;
-  stream << "<sdf version='1.3'>"
-         << "<model name='model1'>"
-         << "  <pose>0 1 2  0 0 0</pose>"
-         << "  <static>false</static>"
-         << "</model>"
-         << "<model name='model2'>"
-         << "  <pose>0 1 2  0 0 0</pose>"
-         << "  <static>false</static>"
-         << "</model>"
-         << "<model name='model3'>"
-         << "  <pose>0 1 2  0 0 0</pose>"
-         << "  <static>false</static>"
-         << "</model>"
-         << "</sdf>";
-  sdf::SDF sdfParsed;
-  sdfParsed.SetFromString(stream.str());
-
-  sdf::ElementPtr elem, elem2;
-
-  // Verify correct parsing
-  EXPECT_TRUE(sdfParsed.root->HasElement("model"));
-  elem = sdfParsed.root->GetElement("model");
-
-  // Select the static element in model1
-  elem2 = elem->GetElement("static");
-  EXPECT_TRUE(elem2);
-  EXPECT_FALSE(elem2->GetValueBool());
-  elem->RemoveChild(elem2);
-
-  // Get first model element again
-  elem = sdfParsed.root->GetElement("model");
-  // Check name == model1
-  EXPECT_TRUE(elem->HasAttribute("name"));
-  EXPECT_EQ(elem->GetValueString("name"), "model1");
-
-  // Check that we have deleted the static element in model1
-  EXPECT_FALSE(elem->HasElement("static"));
-
-  // Get model2
-  elem2 = elem->GetNextElement("model");
-
-  // Remove model2
-  sdfParsed.root->RemoveChild(elem2);
-
-  // Get first model element again
-  elem = sdfParsed.root->GetElement("model");
-  // Check name == model1
-  EXPECT_TRUE(elem->HasAttribute("name"));
-  EXPECT_EQ(elem->GetValueString("name"), "model1");
-
-  // Get next model element
-  elem = elem->GetNextElement("model");
-  // Check name == model3
-  EXPECT_TRUE(elem->HasAttribute("name"));
-  EXPECT_EQ(elem->GetValueString("name"), "model3");
-
-  // Try to get another model element
-  elem = elem->GetNextElement("model");
-  EXPECT_FALSE(elem);
-}
-
-////////////////////////////////////////////////////
-/// Ensure that getting empty values with empty keys returns correct values.
-TEST(SdfUpdate, EmptyValues)
-{
-  std::string emptyString;
-  sdf::ElementPtr elem;
-
-  elem.reset(new sdf::Element());
-  EXPECT_FALSE(elem->GetValueBool(emptyString));
-  elem->AddValue("bool", "true", "0", "description");
-  EXPECT_TRUE(elem->GetValueBool(emptyString));
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValueInt(emptyString), 0);
-  elem->AddValue("int", "12", "0", "description");
-  EXPECT_EQ(elem->GetValueInt(emptyString), 12);
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValueUInt(emptyString), static_cast<unsigned int>(0));
-  elem->AddValue("unsigned int", "123", "0", "description");
-  EXPECT_EQ(elem->GetValueUInt(emptyString), static_cast<unsigned int>(123));
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValueChar(emptyString), '\0');
-  elem->AddValue("char", "a", "0", "description");
-  EXPECT_EQ(elem->GetValueChar(emptyString), 'a');
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValueString(emptyString), "");
-  elem->AddValue("string", "hello", "0", "description");
-  EXPECT_EQ(elem->GetValueString(emptyString), "hello");
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValueVector2d(emptyString), gazebo::math::Vector2d());
-  elem->AddValue("vector2d", "1 2", "0", "description");
-  EXPECT_EQ(elem->GetValueVector2d(emptyString), gazebo::math::Vector2d(1, 2));
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValueVector3(emptyString), gazebo::math::Vector3());
-  elem->AddValue("vector3", "1 2 3", "0", "description");
-  EXPECT_EQ(elem->GetValueVector3(emptyString), gazebo::math::Vector3(1, 2, 3));
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValueQuaternion(emptyString), gazebo::math::Quaternion());
-  elem->AddValue("quaternion", "1 2 3", "0", "description");
-  EXPECT_EQ(elem->GetValueQuaternion(emptyString),
-            gazebo::math::Quaternion(-2.14159, 1.14159, -0.141593));
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValuePose(emptyString), gazebo::math::Pose());
-  elem->AddValue("pose", "1 2 3 4 5 6", "0", "description");
-  EXPECT_EQ(elem->GetValuePose(emptyString),
-            gazebo::math::Pose(1, 2, 3, 4, 5, 6));
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValueColor(emptyString), gazebo::common::Color());
-  elem->AddValue("color", ".1 .2 .3 1.0", "0", "description");
-  EXPECT_EQ(elem->GetValueColor(emptyString),
-            gazebo::common::Color(.1, .2, .3, 1.0));
-
-  elem.reset(new sdf::Element());
-  EXPECT_EQ(elem->GetValueTime(emptyString), gazebo::common::Time());
-  elem->AddValue("time", "1 2", "0", "description");
-  EXPECT_EQ(elem->GetValueTime(emptyString), gazebo::common::Time(1, 2));
-
-  elem.reset(new sdf::Element());
-  EXPECT_NEAR(elem->GetValueFloat(emptyString), 0.0, 1e-6);
-  elem->AddValue("float", "12.34", "0", "description");
-  EXPECT_NEAR(elem->GetValueFloat(emptyString), 12.34, 1e-6);
-
-  elem.reset(new sdf::Element());
-  EXPECT_NEAR(elem->GetValueDouble(emptyString), 0.0, 1e-6);
-  elem->AddValue("double", "12.34", "0", "description");
-  EXPECT_NEAR(elem->GetValueDouble(emptyString), 12.34, 1e-6);
-}
-/////////////////////////////////////////////////
-/// Main
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/gazebo/sdf/interface/parser.cc b/gazebo/sdf/interface/parser.cc
deleted file mode 100644
index fa602b9..0000000
--- a/gazebo/sdf/interface/parser.cc
+++ /dev/null
@@ -1,874 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <boost/filesystem.hpp>
-
-#include "gazebo/sdf/interface/Converter.hh"
-#include "gazebo/sdf/interface/SDF.hh"
-#include "gazebo/sdf/interface/Param.hh"
-#include "gazebo/sdf/interface/parser.hh"
-#include "gazebo_config.h"
-#ifdef HAVE_URDFDOM
-  #include "gazebo/sdf/interface/parser_urdf.hh"
-#endif
-
-#include "gazebo/common/Console.hh"
-#include "gazebo/common/ModelDatabase.hh"
-#include "gazebo/math/Vector3.hh"
-#include "gazebo/math/Pose.hh"
-#include "gazebo/common/Common.hh"
-
-namespace sdf
-{
-std::string find_file(const std::string &_filename)
-{
-  std::string result = _filename;
-
-  if (_filename[0] == '/')
-    result = gazebo::common::find_file(_filename, false);
-  else
-  {
-    std::string tmp = std::string("sdf/") + SDF::version + "/" + _filename;
-    result = gazebo::common::find_file(tmp, false);
-  }
-
-  return result;
-}
-
-//////////////////////////////////////////////////
-bool init(SDFPtr _sdf)
-{
-  bool result = false;
-
-  std::string filename;
-  filename = find_file("root.sdf");
-
-  FILE *ftest = fopen(filename.c_str(), "r");
-  if (ftest && initFile(filename, _sdf))
-  {
-    result = true;
-    fclose(ftest);
-  }
-  else
-    gzerr << "Unable to find or open SDF file[" << filename << "]\n";
-
-  return result;
-}
-
-//////////////////////////////////////////////////
-bool initFile(const std::string &_filename, SDFPtr _sdf)
-{
-  std::string filename = find_file(_filename);
-
-  TiXmlDocument xmlDoc;
-  if (xmlDoc.LoadFile(filename))
-  {
-    return initDoc(&xmlDoc, _sdf);
-  }
-  else
-    gzerr << "Unable to load file[" << _filename << "]\n";
-
-  return false;
-}
-
-//////////////////////////////////////////////////
-bool initFile(const std::string &_filename, ElementPtr _sdf)
-{
-  std::string filename = find_file(_filename);
-
-  TiXmlDocument xmlDoc;
-  if (xmlDoc.LoadFile(filename))
-    return initDoc(&xmlDoc, _sdf);
-  else
-    gzerr << "Unable to load file[" << filename << "]\n";
-
-  return false;
-}
-
-//////////////////////////////////////////////////
-bool initString(const std::string &_xmlString, SDFPtr _sdf)
-{
-  TiXmlDocument xmlDoc;
-  xmlDoc.Parse(_xmlString.c_str());
-
-  return initDoc(&xmlDoc, _sdf);
-}
-
-//////////////////////////////////////////////////
-bool initDoc(TiXmlDocument *_xmlDoc, SDFPtr _sdf)
-{
-  if (!_xmlDoc)
-  {
-    gzerr << "Could not parse the xml\n";
-    return false;
-  }
-
-  TiXmlElement *xml = _xmlDoc->FirstChildElement("element");
-  if (!xml)
-  {
-    gzerr << "Could not find the 'element' element in the xml file\n";
-    return false;
-  }
-
-  return initXml(xml, _sdf->root);
-}
-
-//////////////////////////////////////////////////
-bool initDoc(TiXmlDocument *_xmlDoc, ElementPtr _sdf)
-{
-  if (!_xmlDoc)
-  {
-    gzerr << "Could not parse the xml\n";
-    return false;
-  }
-
-  TiXmlElement *xml = _xmlDoc->FirstChildElement("element");
-  if (!xml)
-  {
-    gzerr << "Could not find the 'element' element in the xml file\n";
-    return false;
-  }
-
-  return initXml(xml, _sdf);
-}
-
-//////////////////////////////////////////////////
-bool initXml(TiXmlElement *_xml, ElementPtr _sdf)
-{
-  const char *nameString = _xml->Attribute("name");
-  if (!nameString)
-  {
-    gzerr << "Element is missing the name attribute\n";
-    return false;
-  }
-  _sdf->SetName(std::string(nameString));
-
-  const char *requiredString = _xml->Attribute("required");
-  if (!requiredString)
-  {
-    gzerr << "Element is missing the required attributed\n";
-    return false;
-  }
-  _sdf->SetRequired(requiredString);
-
-  const char *elemTypeString = _xml->Attribute("type");
-  if (elemTypeString)
-  {
-    bool required = std::string(requiredString) == "1" ? true : false;
-    const char *elemDefaultValue = _xml->Attribute("default");
-    std::string description;
-    TiXmlElement *descChild = _xml->FirstChildElement("description");
-    if (descChild && descChild->GetText())
-      description = descChild->GetText();
-
-    _sdf->AddValue(elemTypeString, elemDefaultValue, required, description);
-  }
-
-  // Get all attributes
-  for (TiXmlElement *child = _xml->FirstChildElement("attribute");
-      child; child = child->NextSiblingElement("attribute"))
-  {
-    TiXmlElement *descriptionChild = child->FirstChildElement("description");
-    const char *name = child->Attribute("name");
-    const char *type = child->Attribute("type");
-    const char *defaultValue = child->Attribute("default");
-
-    requiredString = child->Attribute("required");
-
-    if (!name)
-    {
-      gzerr << "Attribute is missing a name\n";
-      return false;
-    }
-    if (!type)
-    {
-      gzerr << "Attribute is missing a type\n";
-      return false;
-    }
-    if (!defaultValue)
-    {
-      gzerr << "Attribute[" << name << "] is missing a default\n";
-      return false;
-    }
-    if (!requiredString)
-    {
-      gzerr << "Attribute is missing a required string\n";
-      return false;
-    }
-    std::string requiredStr = requiredString;
-    boost::trim(requiredStr);
-    bool required = requiredStr == "1" ? true : false;
-    std::string description;
-
-    if (descriptionChild && descriptionChild->GetText())
-      description = descriptionChild->GetText();
-
-    _sdf->AddAttribute(name, type, defaultValue, required, description);
-  }
-
-  // Read the element description
-  TiXmlElement *descChild = _xml->FirstChildElement("description");
-  if (descChild && descChild->GetText())
-  {
-    _sdf->SetDescription(descChild->GetText());
-  }
-
-  // Get all child elements
-  for (TiXmlElement *child = _xml->FirstChildElement("element");
-      child; child = child->NextSiblingElement("element"))
-  {
-    const char *copyDataString = child->Attribute("copy_data");
-    if (copyDataString &&
-        (std::string(copyDataString) == "true" ||
-         std::string(copyDataString) == "1"))
-    {
-      _sdf->SetCopyChildren(true);
-    }
-    else
-    {
-      ElementPtr element(new Element);
-      initXml(child, element);
-      _sdf->AddElementDescription(element);
-    }
-  }
-
-  // Get all include elements
-  for (TiXmlElement *child = _xml->FirstChildElement("include");
-      child; child = child->NextSiblingElement("include"))
-  {
-    std::string filename = child->Attribute("filename");
-
-    ElementPtr element(new Element);
-
-    initFile(filename, element);
-    _sdf->AddElementDescription(element);
-  }
-
-  return true;
-}
-
-
-//////////////////////////////////////////////////
-bool readFile(const std::string &_filename, SDFPtr _sdf)
-{
-  TiXmlDocument xmlDoc;
-  std::string filename = gazebo::common::find_file(_filename, true);
-
-  if (filename.empty())
-    return false;
-
-  xmlDoc.LoadFile(filename);
-  if (readDoc(&xmlDoc, _sdf, filename))
-    return true;
-  else
-  {
-#ifdef HAVE_URDFDOM
-    urdf2gazebo::URDF2Gazebo u2g;
-    TiXmlDocument doc = u2g.InitModelFile(filename);
-    if (sdf::readDoc(&doc, _sdf, "urdf file"))
-    {
-      gzwarn << "parse from urdf file [" << filename << "].\n";
-      return true;
-    }
-    else
-    {
-      gzerr << "parse as old deprecated model file failed.\n";
-      return false;
-    }
-#endif
-  }
-
-  return false;
-}
-
-//////////////////////////////////////////////////
-bool readString(const std::string &_xmlString, SDFPtr _sdf)
-{
-  TiXmlDocument xmlDoc;
-  xmlDoc.Parse(_xmlString.c_str());
-  if (readDoc(&xmlDoc, _sdf, "data-string"))
-    return true;
-  else
-  {
-#ifdef HAVE_URDFDOM
-    urdf2gazebo::URDF2Gazebo u2g;
-    TiXmlDocument doc = u2g.InitModelString(_xmlString);
-    if (sdf::readDoc(&doc, _sdf, "urdf string"))
-    {
-      gzwarn << "parse from urdf.\n";
-      return true;
-    }
-    else
-    {
-      gzerr << "parse as old deprecated model file failed.\n";
-      return false;
-    }
-#endif
-  }
-
-  return false;
-}
-
-//////////////////////////////////////////////////
-bool readString(const std::string &_xmlString, ElementPtr _sdf)
-{
-  TiXmlDocument xmlDoc;
-  xmlDoc.Parse(_xmlString.c_str());
-  if (readDoc(&xmlDoc, _sdf, "data-string"))
-    return true;
-  else
-  {
-    gzerr << "parse as sdf version " << SDF::version << " failed, "
-          << "should try to parse as old deprecated format\n";
-    return false;
-  }
-}
-
-//////////////////////////////////////////////////
-bool readDoc(TiXmlDocument *_xmlDoc, SDFPtr _sdf, const std::string &_source)
-{
-  if (!_xmlDoc)
-  {
-    gzwarn << "Could not parse the xml from source[" << _source << "]\n";
-    return false;
-  }
-
-  /* check sdf version, use old parser if necessary */
-  TiXmlElement *gazeboNode = _xmlDoc->FirstChildElement("sdf");
-  if (!gazeboNode)
-    gazeboNode = _xmlDoc->FirstChildElement("gazebo");
-
-  if (gazeboNode && gazeboNode->Attribute("version"))
-  {
-    if (strcmp(gazeboNode->Attribute("version"), SDF::version.c_str()) != 0)
-    {
-      gzwarn << "Converting a deprecated SDF source[" << _source << "].\n";
-      Converter::Convert(_xmlDoc, SDF::version);
-    }
-
-    /* parse new sdf xml */
-    TiXmlElement *elemXml = _xmlDoc->FirstChildElement(_sdf->root->GetName());
-    if (!readXml(elemXml, _sdf->root))
-    {
-      gzerr << "Unable to read element <" << _sdf->root->GetName() << ">\n";
-      return false;
-    }
-  }
-  else
-  {
-    // try to use the old deprecated parser
-    if (!gazeboNode)
-      gzwarn << "SDF has no <sdf> element in file["
-             << _source << "]\n";
-    else if (!gazeboNode->Attribute("version"))
-      gzwarn << "SDF element has no version in file["
-             << _source << "]\n";
-    else if (strcmp(gazeboNode->Attribute("version"),
-                    SDF::version.c_str()) != 0)
-      gzwarn << "SDF version ["
-            << gazeboNode->Attribute("version")
-            << "] is not " << SDF::version << "\n";
-    return false;
-  }
-
-  return true;
-}
-
-//////////////////////////////////////////////////
-bool readDoc(TiXmlDocument *_xmlDoc, ElementPtr _sdf,
-             const std::string &_source)
-{
-  if (!_xmlDoc)
-  {
-    gzwarn << "Could not parse the xml\n";
-    return false;
-  }
-
-  /* check gazebo version, use old parser if necessary */
-  TiXmlElement *gazeboNode = _xmlDoc->FirstChildElement("sdf");
-  if (!gazeboNode)
-    gazeboNode = _xmlDoc->FirstChildElement("gazebo");
-
-  if (gazeboNode && gazeboNode->Attribute("version"))
-  {
-    if (strcmp(gazeboNode->Attribute("version"),
-               SDF::version.c_str()) != 0)
-    {
-      gzwarn << "Converting a deprecated SDF source[" << _source << "].\n";
-      Converter::Convert(_xmlDoc, SDF::version);
-    }
-
-    TiXmlElement* elemXml = gazeboNode;
-    if (gazeboNode->Value() != _sdf->GetName() &&
-        gazeboNode->FirstChildElement(_sdf->GetName()))
-    {
-      elemXml = gazeboNode->FirstChildElement(_sdf->GetName());
-    }
-
-    /* parse new sdf xml */
-    if (!readXml(elemXml, _sdf))
-    {
-      gzwarn << "Unable to parse sdf element[" << _sdf->GetName() << "]\n";
-      return false;
-    }
-  }
-  else
-  {
-    // try to use the old deprecated parser
-    if (!gazeboNode)
-      gzwarn << "x SDF has no <sdf> element\n";
-    else if (!gazeboNode->Attribute("version"))
-      gzwarn << "<sdf> element has no version\n";
-    else if (strcmp(gazeboNode->Attribute("version"),
-                    SDF::version.c_str()) != 0)
-      gzwarn << "SDF version ["
-            << gazeboNode->Attribute("version")
-            << "] is not " << SDF::version << "\n";
-    return false;
-  }
-
-  return true;
-}
-
-//////////////////////////////////////////////////
-bool readXml(TiXmlElement *_xml, ElementPtr _sdf)
-{
-  if (_sdf->GetRequired() == "-1")
-  {
-    gzwarn << "SDF Element[" << _sdf->GetName() << "] is deprecated\n";
-    return true;
-  }
-
-  if (!_xml)
-  {
-    if (_sdf->GetRequired() == "1" || _sdf->GetRequired() =="+")
-    {
-      gzerr << "SDF Element[" << _sdf->GetName() << "] is missing\n";
-      return false;
-    }
-    else
-      return true;
-  }
-
-  if (_xml->GetText() != NULL && _sdf->GetValue())
-  {
-    _sdf->GetValue()->SetFromString(_xml->GetText());
-  }
-
-  TiXmlAttribute *attribute = _xml->FirstAttribute();
-
-  unsigned int i = 0;
-
-  // Iterate over all the attributes defined in the give XML element
-  while (attribute)
-  {
-    // Find the matching attribute in SDF
-    for (i = 0; i < _sdf->GetAttributeCount(); ++i)
-    {
-      ParamPtr p = _sdf->GetAttribute(i);
-      if (p->GetKey() == attribute->Name())
-      {
-        // Set the value of the SDF attribute
-        if (!p->SetFromString(attribute->ValueStr()))
-        {
-          gzerr << "Unable to read attribute[" << p->GetKey() << "]\n";
-          return false;
-        }
-        break;
-      }
-    }
-
-    if (i == _sdf->GetAttributeCount())
-    {
-      gzwarn << "XML Attribute[" << attribute->Name()
-             << "] in element[" << _xml->Value()
-             << "] not defined in SDF, ignoring.\n";
-    }
-
-    attribute = attribute->Next();
-  }
-
-  // Check that all required attributes have been set
-  for (i = 0; i < _sdf->GetAttributeCount(); ++i)
-  {
-    ParamPtr p = _sdf->GetAttribute(i);
-    if (p->GetRequired() && !p->GetSet())
-    {
-      gzerr << "Required attribute[" << p->GetKey()
-        << "] in element[" << _xml->Value() << "] is not specified in SDF.\n";
-      return false;
-    }
-  }
-
-  if (_sdf->GetCopyChildren())
-  {
-    copyChildren(_sdf, _xml);
-  }
-  else
-  {
-    std::string filename;
-
-    // Iterate over all the child elements
-    TiXmlElement* elemXml = NULL;
-    for (elemXml = _xml->FirstChildElement(); elemXml;
-         elemXml = elemXml->NextSiblingElement())
-    {
-      if (std::string("include") == elemXml->Value())
-      {
-        std::string modelPath;
-
-        if (elemXml->FirstChildElement("uri"))
-        {
-          modelPath = gazebo::common::ModelDatabase::Instance()->GetModelPath(
-              elemXml->FirstChildElement("uri")->GetText());
-
-          // Test the model path
-          if (modelPath.empty())
-          {
-            gzerr << "Unable to find uri["
-              << elemXml->FirstChildElement("uri")->GetText() << "]\n";
-
-            std::string uri = elemXml->FirstChildElement("uri")->GetText();
-            size_t beginning = 0;
-            if (uri.find("model://") != beginning)
-            {
-              gzerr << "Invalid uri[" << uri << "]. Should be model://"
-                    << uri << "\n";
-            }
-            continue;
-          }
-          else
-          {
-            boost::filesystem::path dir(modelPath);
-            if (!boost::filesystem::exists(dir) ||
-                !boost::filesystem::is_directory(dir))
-            {
-              gzerr << "Directory doesn't exist[" << modelPath << "]\n";
-              continue;
-            }
-          }
-
-          boost::filesystem::path manifestPath = modelPath;
-
-          // First try to get the GZ_MODEL_MANIFEST_FILENAME.
-          // If that file doesn't exist, try to get the deprecated version.
-          if (boost::filesystem::exists(
-                manifestPath / GZ_MODEL_MANIFEST_FILENAME))
-          {
-            manifestPath /= GZ_MODEL_MANIFEST_FILENAME;
-          }
-          else
-          {
-            gzwarn << "The manifest.xml for a Gazebo model is deprecated. "
-                   << "Please rename manifest.xml to "
-                   << GZ_MODEL_MANIFEST_FILENAME << ".\n";
-
-            manifestPath /= "manifest.xml";
-          }
-
-          TiXmlDocument manifestDoc;
-          if (manifestDoc.LoadFile(manifestPath.string()))
-          {
-            TiXmlElement *modelXML = manifestDoc.FirstChildElement("model");
-            if (!modelXML)
-              gzerr << "No <model> element in manifest["
-                    << manifestPath << "]\n";
-            else
-            {
-              TiXmlElement *sdfXML = modelXML->FirstChildElement("sdf");
-              TiXmlElement *sdfSearch = sdfXML;
-
-              // Find the SDF element that matches our current SDF version.
-              while (sdfSearch)
-              {
-                if (sdfSearch->Attribute("version") &&
-                    std::string(sdfSearch->Attribute("version")) == SDF_VERSION)
-                {
-                  sdfXML = sdfSearch;
-                  break;
-                }
-
-                sdfSearch = sdfSearch->NextSiblingElement("sdf");
-              }
-
-              filename = modelPath + "/" + sdfXML->GetText();
-            }
-          }
-        }
-        else
-        {
-          if (elemXml->Attribute("filename"))
-          {
-            gzerr << "<include filename='...'/> is deprecated. Should be "
-                  << "<include><uri>...</uri></include\n";
-
-            filename = gazebo::common::find_file(
-                elemXml->Attribute("filename"), false);
-          }
-          else
-          {
-            gzerr << "<include> element missing 'uri' attribute\n";
-            continue;
-          }
-        }
-
-        SDFPtr includeSDF(new SDF);
-        init(includeSDF);
-
-        if (!readFile(filename, includeSDF))
-        {
-          gzerr << "Unable to read file[" << filename << "]\n";
-          return false;
-        }
-
-        if (elemXml->FirstChildElement("name"))
-        {
-          includeSDF->root->GetElement("model")->GetAttribute(
-              "name")->SetFromString(
-                elemXml->FirstChildElement("name")->GetText());
-        }
-
-        if (elemXml->FirstChildElement("pose"))
-        {
-          includeSDF->root->GetElement("model")->GetElement(
-              "pose")->GetValue()->SetFromString(
-                elemXml->FirstChildElement("pose")->GetText());
-        }
-
-        if (elemXml->FirstChildElement("static"))
-        {
-          includeSDF->root->GetElement("model")->GetElement(
-              "static")->GetValue()->SetFromString(
-                elemXml->FirstChildElement("static")->GetText());
-        }
-
-        for (TiXmlElement *childElemXml = elemXml->FirstChildElement();
-             childElemXml; childElemXml = childElemXml->NextSiblingElement())
-        {
-          if (std::string("plugin") == childElemXml->Value())
-          {
-            sdf::ElementPtr pluginElem;
-            pluginElem = includeSDF->root->GetElement(
-                "model")->AddElement("plugin");
-
-            pluginElem->GetAttribute("filename")->SetFromString(
-                childElemXml->Attribute("filename"));
-            pluginElem->GetAttribute("name")->SetFromString(
-                childElemXml->Attribute("name"));
-          }
-        }
-
-        if (_sdf->GetName() == "model")
-        {
-          addNestedModel(_sdf, includeSDF->root);
-        }
-        else
-        {
-          includeSDF->root->GetFirstElement()->SetParent(_sdf);
-          _sdf->InsertElement(includeSDF->root->GetFirstElement());
-          // TODO: This was used to store the included filename so that when
-          // a world is saved, the included model's SDF is not stored in the
-          // world file. This highlights the need to make model inclusion
-          // a core feature of SDF, and not a hack that that parser handles
-          // includeSDF->root->GetFirstElement()->SetInclude(elemXml->Attribute(
-          //      "filename"));
-        }
-
-        continue;
-      }
-
-      // Find the matching element in SDF
-      unsigned int descCounter = 0;
-      for (descCounter = 0;
-           descCounter != _sdf->GetElementDescriptionCount(); ++descCounter)
-      {
-        ElementPtr elemDesc = _sdf->GetElementDescription(descCounter);
-        if (elemDesc->GetName() == elemXml->Value())
-        {
-          ElementPtr element = elemDesc->Clone();
-          element->SetParent(_sdf);
-          if (readXml(elemXml, element))
-            _sdf->InsertElement(element);
-          else
-          {
-            gzerr << "Error reading element <" << elemXml->Value() << ">\n";
-            return false;
-          }
-          break;
-        }
-      }
-
-      if (descCounter == _sdf->GetElementDescriptionCount())
-      {
-        gzerr << "XML Element[" << elemXml->Value()
-          << "], child of element[" << _xml->Value()
-          << "] not defined in SDF. Ignoring.[" << _sdf->GetName() << "]\n";
-        return false;
-      }
-    }
-
-    // Chek that all required elements have been set
-    unsigned int descCounter = 0;
-    for (descCounter = 0;
-         descCounter != _sdf->GetElementDescriptionCount(); ++descCounter)
-    {
-      ElementPtr elemDesc = _sdf->GetElementDescription(descCounter);
-
-      if (elemDesc->GetRequired() == "1" || elemDesc->GetRequired() == "+")
-      {
-        if (!_sdf->HasElement(elemDesc->GetName()))
-        {
-          if (_sdf->GetName() == "joint" &&
-              _sdf->GetValueString("type") != "ball")
-          {
-            gzerr << "XML Missing required element[" << elemDesc->GetName()
-              << "], child of element[" << _sdf->GetName() << "]\n";
-            return false;
-          }
-          else
-          {
-            // Add default element
-            _sdf->AddElement(elemDesc->GetName());
-          }
-        }
-      }
-    }
-  }
-
-  return true;
-}
-
-/////////////////////////////////////////////////
-void copyChildren(ElementPtr _sdf, TiXmlElement *_xml)
-{
-  // Iterate over all the child elements
-  TiXmlElement* elemXml = NULL;
-  for (elemXml = _xml->FirstChildElement(); elemXml;
-       elemXml = elemXml->NextSiblingElement())
-  {
-    std::string elem_name = elemXml->ValueStr();
-
-    if (_sdf->HasElementDescription(elem_name))
-    {
-      sdf::ElementPtr element = _sdf->AddElement(elem_name);
-
-      // FIXME: copy attributes
-      for (TiXmlAttribute *attribute = elemXml->FirstAttribute();
-           attribute; attribute = attribute->Next())
-      {
-        element->GetAttribute(attribute->Name())->SetFromString(
-          attribute->ValueStr());
-      }
-
-      // copy value
-      std::string value = elemXml->GetText();
-      if (!value.empty())
-          element->GetValue()->SetFromString(value);
-      copyChildren(element, elemXml);
-    }
-    else
-    {
-      ElementPtr element(new Element);
-      element->SetParent(_sdf);
-      element->SetName(elem_name);
-      if (elemXml->GetText() != NULL)
-        element->AddValue("string", elemXml->GetText(), "1");
-
-      copyChildren(element, elemXml);
-      _sdf->InsertElement(element);
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-void addNestedModel(ElementPtr _sdf, ElementPtr _includeSDF)
-{
-  ElementPtr modelPtr = _includeSDF->GetElement("model");
-  ElementPtr elem = modelPtr->GetFirstElement();
-  std::map<std::string, std::string> replace;
-
-  gazebo::math::Pose modelPose =
-    modelPtr->GetValuePose("pose");
-
-  std::string modelName = modelPtr->GetValueString("name");
-  while (elem)
-  {
-    if (elem->GetName() == "link")
-    {
-      std::string elemName = elem->GetValueString("name");
-      std::string newName =  modelName + "::" + elemName;
-      replace[elemName] = newName;
-      if (elem->HasElementDescription("pose"))
-      {
-        gazebo::math::Pose newPose = gazebo::math::Pose(
-          modelPose.pos +
-            modelPose.rot.RotateVector(elem->GetValuePose("pose").pos),
-            modelPose.rot * elem->GetValuePose("pose").rot);
-        elem->GetElement("pose")->Set(newPose);
-      }
-    }
-    else if (elem->GetName() == "joint")
-    {
-      // for joints, we need to
-      //   prefix name like we did with links, and
-      std::string elemName = elem->GetValueString("name");
-      std::string newName =  modelName + "::" + elemName;
-      replace[elemName] = newName;
-      //   rotate the joint axis because they are model-global
-      if (elem->HasElement("axis"))
-      {
-        ElementPtr axisElem = elem->GetElement("axis");
-        gazebo::math::Vector3 newAxis =  modelPose.rot.RotateVector(
-          axisElem->GetValueVector3("xyz"));
-        axisElem->GetElement("xyz")->Set(newAxis);
-      }
-    }
-    elem = elem->GetNextElement();
-  }
-
-  std::string str = _includeSDF->ToString("");
-  for (std::map<std::string, std::string>::iterator iter = replace.begin();
-       iter != replace.end(); ++iter)
-  {
-    boost::replace_all(str, std::string("\"")+iter->first + "\"",
-                       std::string("\"") + iter->second + "\"");
-    boost::replace_all(str, std::string("'")+iter->first + "'",
-                       std::string("'") + iter->second + "'");
-    boost::replace_all(str, std::string(">")+iter->first + "<",
-                       std::string(">") + iter->second + "<");
-  }
-
-  _includeSDF->ClearElements();
-  readString(str, _includeSDF);
-
-  elem = _includeSDF->GetElement("model")->GetFirstElement();
-  ElementPtr nextElem;
-  while (elem)
-  {
-    nextElem = elem->GetNextElement();
-
-    if (elem->GetName() != "pose")
-    {
-      elem->SetParent(_sdf);
-      _sdf->InsertElement(elem);
-    }
-    elem = nextElem;
-  }
-}
-}
diff --git a/gazebo/sdf/interface/parser.hh b/gazebo/sdf/interface/parser.hh
deleted file mode 100644
index 718f75b..0000000
--- a/gazebo/sdf/interface/parser.hh
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef _SDF_PARSER_HH_
-#define _SDF_PARSER_HH_
-
-#include <tinyxml.h>
-#include <string>
-
-#include "sdf/interface/SDF.hh"
-
-/// \ingroup gazebo_parser
-/// \brief namespace for Simulation Description Format parser
-namespace sdf
-{
-  /// \brief Init based on the installed sdf_format.xml file
-  bool init(SDFPtr _sdf);
-
-  // \brief Initialize the SDF interface using a file
-  bool initFile(const std::string &_filename, SDFPtr _sdf);
-
-  // \brief Initialize and SDFElement interface using a file
-  bool initFile(const std::string &_filename, ElementPtr _sdf);
-
-  // \brief Initialize the SDF interface using a string
-  bool initString(const std::string &_xmlString, SDFPtr _sdf);
-
-  // \brief Initialize the SDF interface using a TinyXML document
-  bool initDoc(TiXmlDocument *_xmlDoc, SDFPtr _sdf);
-
-  // \brief Initialize and SDF Element using a TinyXML document
-  bool initDoc(TiXmlDocument *_xmlDoc, ElementPtr _sdf);
-
-  // \brief For internal use only. Do not use this function.
-  bool initXml(TiXmlElement *_xml, ElementPtr _sdf);
-
-  /// \brief Populate the SDF values from a file
-  bool readFile(const std::string &_filename, SDFPtr _sdf);
-
-  /// \brief Populate the SDF values from a string
-  bool readString(const std::string &_xmlString, SDFPtr _sdf);
-
-  bool readString(const std::string &_xmlString, ElementPtr _sdf);
-
-  /// \brief Populate the SDF values from a TinyXML document
-  bool readDoc(TiXmlDocument *_xmlDoc, SDFPtr _sdf, const std::string &_source);
-
-  bool readDoc(TiXmlDocument *_xmlDoc, ElementPtr _sdf,
-               const std::string &_source);
-
-  // \brief For internal use only. Do not use this function.
-  bool readXml(TiXmlElement *_xml, ElementPtr _sdf);
-
-  void copyChildren(ElementPtr _sdf, TiXmlElement *_xml);
-
-  void addNestedModel(ElementPtr _sdf, ElementPtr _includeSDF);
-}
-
-#endif
-
diff --git a/gazebo/sdf/interface/parser_urdf.cc b/gazebo/sdf/interface/parser_urdf.cc
deleted file mode 100644
index 882b9af..0000000
--- a/gazebo/sdf/interface/parser_urdf.cc
+++ /dev/null
@@ -1,2333 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <urdf_parser/urdf_parser.h>
-#include <sdf/interface/parser_urdf.hh>
-#include <sdf/sdf.hh>
-
-#include <fstream>
-#include <sstream>
-#include <algorithm>
-#include <string>
-
-#include "gazebo/common/SystemPaths.hh"
-
-namespace urdf2gazebo
-{
-////////////////////////////////////////////////////////////////////////////////
-std::string lowerStr(std::string str)
-{
-  std::string out = str;
-  std::transform(out.begin(), out.end(), out.begin(), ::tolower);
-  return out;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-URDF2Gazebo::URDF2Gazebo()
-{
-    // default options
-    this->enforceLimits = true;
-    this->reduceFixedJoints = true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-URDF2Gazebo::~URDF2Gazebo()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-urdf::Vector3 URDF2Gazebo::ParseVector3(TiXmlNode* _key, double _scale)
-{
-  if (_key != NULL)
-  {
-    std::string str = _key->Value();
-    std::vector<std::string> pieces;
-    std::vector<double> vals;
-
-    boost::split(pieces, str, boost::is_any_of(" "));
-    for (unsigned int i = 0; i < pieces.size(); ++i)
-    {
-      if (pieces[i] != "")
-      {
-        try
-        {
-          vals.push_back(_scale
-                         * boost::lexical_cast<double>(pieces[i].c_str()));
-        }
-        catch(boost::bad_lexical_cast &e)
-        {
-          gzerr << "xml key [" << str
-                << "][" << i << "] value [" << pieces[i]
-                << "] is not a valid double from a 3-tuple\n";
-          return urdf::Vector3(0, 0, 0);
-        }
-      }
-    }
-    return urdf::Vector3(vals[0], vals[1], vals[3]);
-  }
-  else
-    return urdf::Vector3(0, 0, 0);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceVisualToParent(UrdfLinkPtr _link,
-       const std::string &_groupName, UrdfVisualPtr _visual)
-{
-  boost::shared_ptr<std::vector<UrdfVisualPtr> > viss
-    = _link->getVisuals(_groupName);
-  if (!viss)
-  {
-    // group does not exist, create one and add to map
-    viss.reset(new std::vector<UrdfVisualPtr>);
-    // new group name, create vector, add vector to map and
-    //   add Visual to the vector
-    _link->visual_groups.insert(make_pair(_groupName, viss));
-    // gzdbg << "successfully added a new visual group name ["
-    //       << _groupName << "]\n";
-  }
-
-  // group exists, add Visual to the vector in the map if it's not there
-  std::vector<UrdfVisualPtr>::iterator visIt
-    = find(viss->begin(), viss->end(), _visual);
-  if (visIt != viss->end())
-    gzwarn << "attempted to add visual to link ["
-           << _link->name
-           << "], but it already exists under group ["
-           << _groupName << "]\n";
-  else
-    viss->push_back(_visual);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceCollisionToParent(UrdfLinkPtr _link,
-      const std::string &_groupName, UrdfCollisionPtr _collision)
-{
-  boost::shared_ptr<std::vector<UrdfCollisionPtr> >
-    cols = _link->getCollisions(_groupName);
-  if (!cols)
-  {
-    // group does not exist, create one and add to map
-    cols.reset(new std::vector<UrdfCollisionPtr>);
-    // new group name, create add vector to map and add Collision to the vector
-    _link->collision_groups.insert(make_pair(_groupName, cols));
-  }
-
-  // group exists, add Collision to the vector in the map
-  std::vector<UrdfCollisionPtr>::iterator colIt =
-    find(cols->begin(), cols->end(), _collision);
-  if (colIt != cols->end())
-    gzwarn << "attempted to add collision to link ["
-           << _link->name
-           << "], but it already exists under group ["
-           << _groupName << "]\n";
-  else
-    cols->push_back(_collision);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string URDF2Gazebo::Vector32Str(const urdf::Vector3 _vector)
-{
-  std::stringstream ss;
-  ss << _vector.x;
-  ss << " ";
-  ss << _vector.y;
-  ss << " ";
-  ss << _vector.z;
-  return ss.str();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string URDF2Gazebo::Values2str(unsigned int _count, const double *_values)
-{
-  std::stringstream ss;
-  for (unsigned int i = 0 ; i < _count ; ++i)
-  {
-      if (i > 0)
-          ss << " ";
-      ss << _values[i];
-  }
-  return ss.str();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::AddKeyValue(TiXmlElement *_elem, const std::string &_key,
-  const std::string &_value)
-{
-  TiXmlElement* childElem = _elem->FirstChildElement(_key);
-  if (childElem)
-  {
-    std::string oldValue = this->GetKeyValueAsString(childElem);
-    if (oldValue != _value)
-      gzwarn << "multiple inconsistent <" << _key
-             << "> exists due to fixed joint reduction"
-             << " overwriting previous value [" << oldValue
-             << "] with [" << _value << "].\n";
-    // else
-    //   gzdbg << "multiple consistent <" << _key
-    //          << "> exists with [" << _value
-    //          << "] due to fixed joint reduction.\n";
-    _elem->RemoveChild(childElem);  // remove old _elem
-  }
-
-  TiXmlElement *ekey      = new TiXmlElement(_key);
-  TiXmlText    *textEkey = new TiXmlText(_value);
-  ekey->LinkEndChild(textEkey);
-  _elem->LinkEndChild(ekey);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::AddTransform(TiXmlElement *_elem,
-  const::gazebo::math::Pose& _transform)
-{
-  gazebo::math::Vector3 e = _transform.rot.GetAsEuler();
-  double cpose[6] = { _transform.pos.x, _transform.pos.y,
-                      _transform.pos.z, e.x, e.y, e.z };
-
-  /* set geometry transform */
-  this->AddKeyValue(_elem, "pose", this->Values2str(6, cpose));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string URDF2Gazebo::GetKeyValueAsString(TiXmlElement* _elem)
-{
-  std::string valueStr;
-  if (_elem->Attribute("value"))
-  {
-    valueStr = _elem->Attribute("value");
-  }
-  else if (_elem->FirstChild())
-  /// @todo: FIXME: comment out check for now, different tinyxml
-  /// versions fails to compile:
-  //  && _elem->FirstChild()->Type() == TiXmlNode::TINYXML_TEXT)
-  {
-    valueStr = _elem->FirstChild()->ValueStr();
-  }
-  return valueStr;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ParseGazeboExtension(TiXmlDocument &_urdfXml)
-{
-  TiXmlElement* robotXml = _urdfXml.FirstChildElement("robot");
-
-  // Get all Gazebo extension elements, put everything in
-  //   this->extensions map, containing a key string
-  //   (link/joint name) and values
-  for (TiXmlElement* gazeboXml = robotXml->FirstChildElement("gazebo");
-       gazeboXml; gazeboXml = gazeboXml->NextSiblingElement("gazebo"))
-  {
-    const char* ref = gazeboXml->Attribute("reference");
-    std::string refStr;
-    if (!ref)
-    {
-      // copy extensions for robot (outside of link/joint)
-      refStr.clear();
-    }
-    else
-    {
-      // copy extensions for link/joint
-      refStr = std::string(ref);
-    }
-
-    if (this->extensions.find(refStr) ==
-        this->extensions.end())
-    {
-        // create extension map for reference
-        std::vector<GazeboExtension*> ge;
-        this->extensions.insert(std::make_pair(refStr, ge));
-    }
-
-    // create and insert a new GazeboExtension into the map
-    GazeboExtension* gazebo = new GazeboExtension();
-
-    // begin parsing xml node
-    for (TiXmlElement *childElem = gazeboXml->FirstChildElement();
-         childElem; childElem = childElem->NextSiblingElement())
-    {
-      gazebo->oldLinkName = refStr;
-
-      // go through all elements of the extension,
-      //   extract what we know, and save the rest in blobs
-      // @todo:  somehow use sdf definitions here instead of hard coded
-      //         objects
-
-      // material
-      if (childElem->ValueStr() == "material")
-      {
-          gazebo->material = this->GetKeyValueAsString(childElem);
-      }
-      else if (childElem->ValueStr() == "static")
-      {
-        std::string valueStr = this->GetKeyValueAsString(childElem);
-
-        // default of setting static flag is false
-        if (lowerStr(valueStr) == "true" || lowerStr(valueStr) == "yes" ||
-            valueStr == "1")
-          gazebo->setStaticFlag = true;
-        else
-          gazebo->setStaticFlag = false;
-      }
-      else if (childElem->ValueStr() == "gravity")
-      {
-        std::string valueStr = this->GetKeyValueAsString(childElem);
-
-        // default of gravity is true
-        if (lowerStr(valueStr) == "false" || lowerStr(valueStr) == "no" ||
-            valueStr == "0")
-          gazebo->gravity = false;
-        else
-          gazebo->gravity = true;
-      }
-      else if (childElem->ValueStr() == "dampingFactor")
-      {
-          gazebo->isDampingFactor = true;
-          gazebo->dampingFactor = boost::lexical_cast<double>(
-              this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "maxVel")
-      {
-          gazebo->isMaxVel = true;
-          gazebo->maxVel = boost::lexical_cast<double>(
-              this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "minDepth")
-      {
-          gazebo->isMinDepth = true;
-          gazebo->minDepth = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "mu1")
-      {
-          gazebo->isMu1 = true;
-          gazebo->mu1 = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "mu2")
-      {
-          gazebo->isMu2 = true;
-          gazebo->mu2 = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "fdir1")
-      {
-          gazebo->fdir1 = this->GetKeyValueAsString(childElem);
-      }
-      else if (childElem->ValueStr() == "kp")
-      {
-          gazebo->isKp = true;
-          gazebo->kp = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "kd")
-      {
-          gazebo->isKd = true;
-          gazebo->kd = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "selfCollide")
-      {
-        std::string valueStr = this->GetKeyValueAsString(childElem);
-
-        // default of selfCollide is false
-        if (lowerStr(valueStr) == "true" || lowerStr(valueStr) == "yes" ||
-            valueStr == "1")
-          gazebo->selfCollide = true;
-        else
-          gazebo->selfCollide = false;
-      }
-      else if (childElem->ValueStr() == "laserRetro")
-      {
-          gazebo->isLaserRetro = true;
-          gazebo->laserRetro = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "stopCfm")
-      {
-          gazebo->isStopCfm = true;
-          gazebo->stopCfm = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "stopErp")
-      {
-          gazebo->isStopErp = true;
-          gazebo->stopErp = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "initialJointPosition")
-      {
-          gazebo->isInitialJointPosition = true;
-          gazebo->initialJointPosition = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "fudgeFactor")
-      {
-          gazebo->isFudgeFactor = true;
-          gazebo->fudgeFactor = boost::lexical_cast<double>(
-            this->GetKeyValueAsString(childElem).c_str());
-      }
-      else if (childElem->ValueStr() == "provideFeedback")
-      {
-          std::string valueStr = this->GetKeyValueAsString(childElem);
-
-          if (lowerStr(valueStr) == "true" || lowerStr(valueStr) == "yes" ||
-              valueStr == "1")
-            gazebo->provideFeedback = true;
-          else
-            gazebo->provideFeedback = false;
-      }
-      else if (childElem->ValueStr() == "cfmDamping")
-      {
-          std::string valueStr = this->GetKeyValueAsString(childElem);
-
-          if (lowerStr(valueStr) == "true" || lowerStr(valueStr) == "yes" ||
-              valueStr == "1")
-            gazebo->cfmDamping = true;
-          else
-            gazebo->cfmDamping = false;
-      }
-      else
-      {
-          std::ostringstream stream;
-          stream << *childElem;
-          // save all unknown stuff in a vector of blobs
-          TiXmlElement *blob = new TiXmlElement(*childElem);
-          gazebo->blobs.push_back(blob);
-      }
-    }
-
-    // insert into my map
-    (this->extensions.find(refStr))->second.push_back(gazebo);
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::InsertGazeboExtensionCollision(TiXmlElement *_elem,
-  const std::string &_linkName)
-{
-  for (std::map<std::string, std::vector<GazeboExtension*> >::iterator
-       gazeboIt = this->extensions.begin();
-       gazeboIt != this->extensions.end(); ++gazeboIt)
-  {
-    for (std::vector<GazeboExtension*>::iterator ge = gazeboIt->second.begin();
-         ge != gazeboIt->second.end(); ++ge)
-    {
-      if ((*ge)->oldLinkName == _linkName)
-      {
-        TiXmlElement *surface = new TiXmlElement("surface");
-        TiXmlElement *friction = new TiXmlElement("friction");
-        TiXmlElement *frictionOde = new TiXmlElement("ode");
-        TiXmlElement *contact = new TiXmlElement("contact");
-        TiXmlElement *contactOde = new TiXmlElement("ode");
-
-        // insert mu1, mu2, kp, kd for collision
-        if ((*ge)->isMu1)
-          this->AddKeyValue(frictionOde, "mu",
-                            this->Values2str(1, &(*ge)->mu1));
-        if ((*ge)->isMu2)
-          this->AddKeyValue(frictionOde, "mu2",
-                            this->Values2str(1, &(*ge)->mu2));
-        if (!(*ge)->fdir1.empty())
-          this->AddKeyValue(frictionOde, "fdir1", (*ge)->fdir1);
-        if ((*ge)->isKp)
-          this->AddKeyValue(contactOde, "kp", this->Values2str(1, &(*ge)->kp));
-        if ((*ge)->isKd)
-          this->AddKeyValue(contactOde, "kd", this->Values2str(1, &(*ge)->kd));
-        // max contact interpenetration correction velocity
-        if ((*ge)->isMaxVel)
-          this->AddKeyValue(contactOde, "max_vel",
-                      this->Values2str(1, &(*ge)->maxVel));
-        // contact interpenetration margin tolerance
-        if ((*ge)->isMinDepth)
-          this->AddKeyValue(contactOde, "min_depth",
-                      this->Values2str(1, &(*ge)->minDepth));
-        if ((*ge)->isLaserRetro)
-          this->AddKeyValue(_elem, "laser_retro",
-                      this->Values2str(1, &(*ge)->laserRetro));
-
-        contact->LinkEndChild(contactOde);
-        surface->LinkEndChild(contact);
-        friction->LinkEndChild(frictionOde);
-        surface->LinkEndChild(friction);
-        _elem->LinkEndChild(surface);
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::InsertGazeboExtensionVisual(TiXmlElement *_elem,
-  const std::string &_linkName)
-{
-  for (std::map<std::string, std::vector<GazeboExtension*> >::iterator
-       gazeboIt = this->extensions.begin();
-       gazeboIt != this->extensions.end(); ++gazeboIt)
-  {
-    for (std::vector<GazeboExtension*>::iterator ge = gazeboIt->second.begin();
-         ge != gazeboIt->second.end(); ++ge)
-    {
-      if ((*ge)->oldLinkName == _linkName)
-      {
-        // insert material block
-        if (!(*ge)->material.empty())
-            this->AddKeyValue(_elem, "material", (*ge)->material);
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::InsertGazeboExtensionLink(TiXmlElement *_elem,
-  const std::string &_linkName)
-{
-    for (std::map<std::string, std::vector<GazeboExtension*> >::iterator
-         gazeboIt = this->extensions.begin();
-         gazeboIt != this->extensions.end(); ++gazeboIt)
-    {
-      if (gazeboIt->first == _linkName)
-      {
-        // gzdbg << "inserting extension with reference ["
-        //       << _linkName << "] into link.\n";
-        for (std::vector<GazeboExtension*>::iterator ge =
-             gazeboIt->second.begin(); ge != gazeboIt->second.end(); ++ge)
-        {
-          // insert gravity
-          if ((*ge)->gravity)
-              this->AddKeyValue(_elem, "gravity", "true");
-          else
-              this->AddKeyValue(_elem, "gravity", "false");
-
-          // damping factor
-          TiXmlElement *velocityDecay = new TiXmlElement("velocity_decay");
-          if ((*ge)->isDampingFactor)
-          {
-            /// @todo separate linear and angular velocity decay
-            this->AddKeyValue(velocityDecay, "linear",
-                        this->Values2str(1, &(*ge)->dampingFactor));
-            this->AddKeyValue(velocityDecay, "angular",
-                        this->Values2str(1, &(*ge)->dampingFactor));
-          }
-          _elem->LinkEndChild(velocityDecay);
-          // selfCollide tag
-          if ((*ge)->selfCollide)
-              this->AddKeyValue(_elem, "self_collide", "true");
-          else
-              this->AddKeyValue(_elem, "self_collide", "false");
-          // insert blobs into body
-          for (std::vector<TiXmlElement*>::iterator
-               blobIt = (*ge)->blobs.begin();
-               blobIt != (*ge)->blobs.end(); ++blobIt)
-          {
-              _elem->LinkEndChild((*blobIt)->Clone());
-          }
-        }
-      }
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::InsertGazeboExtensionJoint(TiXmlElement *_elem,
-  const std::string &_jointName)
-{
-  for (std::map<std::string, std::vector<GazeboExtension*> >::iterator
-       gazeboIt = this->extensions.begin();
-       gazeboIt != this->extensions.end(); ++gazeboIt)
-  {
-    if (gazeboIt->first == _jointName)
-    {
-      for (std::vector<GazeboExtension*>::iterator
-           ge = gazeboIt->second.begin();
-           ge != gazeboIt->second.end(); ++ge)
-      {
-        TiXmlElement *physics     = new TiXmlElement("physics");
-        TiXmlElement *physicsOde = new TiXmlElement("ode");
-        TiXmlElement *limit       = new TiXmlElement("limit");
-        // insert stopCfm, stopErp, fudgeFactor
-        if ((*ge)->isStopCfm)
-        {
-          this->AddKeyValue(limit, "erp", this->Values2str(1, &(*ge)->stopCfm));
-        }
-        if ((*ge)->isStopErp)
-        {
-          this->AddKeyValue(limit, "cfm", this->Values2str(1, &(*ge)->stopErp));
-        }
-        /* gone
-        if ((*ge)->isInitialJointPosition)
-            this->AddKeyValue(_elem, "initialJointPosition",
-              this->Values2str(1, &(*ge)->initialJointPosition));
-        */
-
-        // insert provideFeedback
-        if ((*ge)->provideFeedback)
-            this->AddKeyValue(physicsOde, "provide_feedback", "true");
-        else
-            this->AddKeyValue(physicsOde, "provide_feedback", "false");
-
-        // insert cfmDamping
-        if ((*ge)->cfmDamping)
-            this->AddKeyValue(physicsOde, "cfm_damping", "true");
-        else
-            this->AddKeyValue(physicsOde, "cfm_damping", "false");
-
-        // insert fudgeFactor
-        if ((*ge)->isFudgeFactor)
-          this->AddKeyValue(physicsOde, "fudge_factor",
-                      this->Values2str(1, &(*ge)->fudgeFactor));
-
-        physics->LinkEndChild(physicsOde);
-        physicsOde->LinkEndChild(limit);
-        _elem->LinkEndChild(physics);
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::InsertGazeboExtensionRobot(TiXmlElement *_elem)
-{
-  for (std::map<std::string, std::vector<GazeboExtension*> >::iterator
-       gazeboIt = this->extensions.begin();
-       gazeboIt != this->extensions.end(); ++gazeboIt)
-  {
-    if (gazeboIt->first.empty())
-    {
-      // no reference specified
-      for (std::vector<GazeboExtension*>::iterator
-        ge = gazeboIt->second.begin(); ge != gazeboIt->second.end(); ++ge)
-      {
-        // insert static flag
-        if ((*ge)->setStaticFlag)
-            this->AddKeyValue(_elem, "static", "true");
-        else
-            this->AddKeyValue(_elem, "static", "false");
-
-        // copy extension containing blobs and without reference
-        for (std::vector<TiXmlElement*>::iterator
-             blobIt = (*ge)->blobs.begin();
-             blobIt != (*ge)->blobs.end(); ++blobIt)
-        {
-            std::ostringstream streamIn;
-            streamIn << *(*blobIt);
-            _elem->LinkEndChild((*blobIt)->Clone());
-        }
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::CreateGeometry(TiXmlElement* _elem,
-  boost::shared_ptr<urdf::Geometry> _geom)
-{
-  int sizeCount;
-  double sizeVals[3];
-
-  TiXmlElement *gazeboGeometry = new TiXmlElement("geometry");
-
-  std::string type;
-  TiXmlElement *geometryType = NULL;
-
-  switch (_geom->type)
-  {
-  case urdf::Geometry::BOX:
-    type = "box";
-    sizeCount = 3;
-    {
-      boost::shared_ptr<const urdf::Box> box;
-      box = boost::dynamic_pointer_cast< const urdf::Box >(_geom);
-      sizeVals[0] = box->dim.x;
-      sizeVals[1] = box->dim.y;
-      sizeVals[2] = box->dim.z;
-      geometryType = new TiXmlElement(type);
-      this->AddKeyValue(geometryType, "size",
-                        this->Values2str(sizeCount, sizeVals));
-    }
-    break;
-  case urdf::Geometry::CYLINDER:
-    type = "cylinder";
-    sizeCount = 2;
-    {
-      boost::shared_ptr<const urdf::Cylinder> cylinder;
-      cylinder = boost::dynamic_pointer_cast<const urdf::Cylinder >(_geom);
-      geometryType = new TiXmlElement(type);
-      this->AddKeyValue(geometryType, "length",
-                  this->Values2str(1, &cylinder->length));
-      this->AddKeyValue(geometryType, "radius",
-                  this->Values2str(1, &cylinder->radius));
-    }
-    break;
-  case urdf::Geometry::SPHERE:
-    type = "sphere";
-    sizeCount = 1;
-    {
-      boost::shared_ptr<const urdf::Sphere> sphere;
-      sphere = boost::dynamic_pointer_cast<const urdf::Sphere >(_geom);
-      geometryType = new TiXmlElement(type);
-      this->AddKeyValue(geometryType, "radius",
-                  this->Values2str(1, &sphere->radius));
-    }
-    break;
-  case urdf::Geometry::MESH:
-    type = "mesh";
-    sizeCount = 3;
-    {
-      boost::shared_ptr<const urdf::Mesh> mesh;
-      mesh = boost::dynamic_pointer_cast<const urdf::Mesh >(_geom);
-      sizeVals[0] = mesh->scale.x;
-      sizeVals[1] = mesh->scale.y;
-      sizeVals[2] = mesh->scale.z;
-      geometryType = new TiXmlElement(type);
-      this->AddKeyValue(geometryType, "scale", this->Vector32Str(mesh->scale));
-      // do something more to meshes
-      {
-        /* set mesh file */
-        if (mesh->filename.empty())
-        {
-            gzerr << "urdf2gazebo: mesh geometry with no filename given.\n";
-        }
-
-        // give some warning if file does not exist.
-        // disabled while switching to uri
-        // @todo: re-enable check
-        // std::ifstream fin;
-        // fin.open(mesh->filename.c_str(), std::ios::in);
-        // fin.close();
-        // if (fin.fail())
-        //   gzwarn << "filename referred by mesh ["
-        //          << mesh->filename << "] does not appear to exist.\n";
-
-        // Convert package:// to model://,
-        // in ROS, this will work if
-        // the model package is in ROS_PACKAGE_PATH and has a manifest.xml
-        // as a typical ros package does.
-        std::string modelFilename = mesh->filename;
-        std::string packagePrefix("package://");
-        std::string modelPrefix("model://");
-        size_t pos1 = modelFilename.find(packagePrefix, 0);
-        if (pos1 != std::string::npos)
-        {
-          size_t repLen = packagePrefix.size();
-          modelFilename.replace(pos1, repLen, modelPrefix);
-          // gzwarn << "ros style uri [package://] is"
-          //   << "automatically converted: [" << modelFilename
-          //   << "], make sure your ros package is in GAZEBO_MODEL_PATH"
-          //   << " and switch your manifest to conform to gazebo's"
-          //   << " model database format.  See ["
-          //   << "http://gazebosim.org/wiki/Model_database#Model_Manifest_XML"
-          //   << "] for more info.\n";
-        }
-
-        // add mesh filename
-        this->AddKeyValue(geometryType, "uri", modelFilename);
-      }
-    }
-    break;
-  default:
-    sizeCount = 0;
-    gzwarn << "Unknown body type: [" << _geom->type
-           << "] skipped in geometry\n";
-    break;
-  }
-
-  if (geometryType)
-  {
-    gazeboGeometry->LinkEndChild(geometryType);
-    _elem->LinkEndChild(gazeboGeometry);
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string URDF2Gazebo::GetGeometryBoundingBox(
-  boost::shared_ptr<urdf::Geometry> _geom, double *_sizeVals)
-{
-  std::string type;
-
-  switch (_geom->type)
-  {
-  case urdf::Geometry::BOX:
-      type = "box";
-      {
-        boost::shared_ptr<const urdf::Box> box;
-        box = boost::dynamic_pointer_cast<const urdf::Box >(_geom);
-        _sizeVals[0] = box->dim.x;
-        _sizeVals[1] = box->dim.y;
-        _sizeVals[2] = box->dim.z;
-      }
-      break;
-  case urdf::Geometry::CYLINDER:
-      type = "cylinder";
-      {
-        boost::shared_ptr<const urdf::Cylinder> cylinder;
-        cylinder = boost::dynamic_pointer_cast<const urdf::Cylinder >(_geom);
-        _sizeVals[0] = cylinder->radius * 2;
-        _sizeVals[1] = cylinder->radius * 2;
-        _sizeVals[2] = cylinder->length;
-      }
-      break;
-  case urdf::Geometry::SPHERE:
-      type = "sphere";
-      {
-        boost::shared_ptr<const urdf::Sphere> sphere;
-        sphere = boost::dynamic_pointer_cast<const urdf::Sphere >(_geom);
-        _sizeVals[0] = _sizeVals[1] = _sizeVals[2] = sphere->radius * 2;
-      }
-      break;
-  case urdf::Geometry::MESH:
-      type = "trimesh";
-      {
-        boost::shared_ptr<const urdf::Mesh> mesh;
-        mesh = boost::dynamic_pointer_cast<const urdf::Mesh >(_geom);
-        _sizeVals[0] = mesh->scale.x;
-        _sizeVals[1] = mesh->scale.y;
-        _sizeVals[2] = mesh->scale.z;
-      }
-      break;
-  default:
-      _sizeVals[0] = _sizeVals[1] = _sizeVals[2] = 0;
-      gzwarn << "Unknown body type: [" << _geom->type
-             << "] skipped in geometry\n";
-      break;
-  }
-
-  return type;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::PrintMass(const std::string &_linkName, dMass _mass)
-{
-  gzdbg << "LINK NAME: [" << _linkName << "] from dMass\n";
-  gzdbg << "     MASS: [" << _mass.mass << "]\n";
-  gzdbg << "       CG: [" << _mass.c[0] << ", " << _mass.c[1] << ", "
-        << _mass.c[2] << "]\n";
-  gzdbg << "        I: [" << _mass.I[0] << ", " << _mass.I[1] << ", "
-        << _mass.I[2] << "]\n";
-  gzdbg << "           [" << _mass.I[4] << ", " << _mass.I[5] << ", "
-        << _mass.I[6] << "]\n";
-  gzdbg << "           [" << _mass.I[8] << ", " << _mass.I[9] << ", "
-        << _mass.I[10] << "]\n";
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::PrintMass(UrdfLinkPtr _link)
-{
-  gzdbg << "LINK NAME: [" << _link->name << "] from dMass\n";
-  gzdbg << "     MASS: [" << _link->inertial->mass << "]\n";
-  gzdbg << "       CG: [" << _link->inertial->origin.position.x << ", "
-                          << _link->inertial->origin.position.y << ", "
-                          << _link->inertial->origin.position.z << "]\n";
-  gzdbg << "        I: [" << _link->inertial->ixx << ", "
-                          << _link->inertial->ixy << ", "
-                          << _link->inertial->ixz << "]\n";
-  gzdbg << "           [" << _link->inertial->ixy << ", "
-                          << _link->inertial->iyy << ", "
-                          << _link->inertial->iyz << "]\n";
-  gzdbg << "           [" << _link->inertial->ixz << ", "
-                          << _link->inertial->iyz << ", "
-                          << _link->inertial->izz << "]\n";
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceFixedJoints(TiXmlElement *_root, UrdfLinkPtr _link)
-{
-  // if child is attached to self by fixed _link first go up the tree,
-  //   check it's children recursively
-  for (unsigned int i = 0 ; i < _link->child_links.size() ; ++i)
-    if (_link->child_links[i]->parent_joint->type == urdf::Joint::FIXED)
-      this->ReduceFixedJoints(_root, _link->child_links[i]);
-
-  // reduce this _link's stuff up the tree to parent but skip first joint
-  //   if it's the world
-  if (_link->getParent() && _link->getParent()->name != "world" &&
-      _link->parent_joint && _link->parent_joint->type == urdf::Joint::FIXED)
-  {
-    // gzdbg << "Fixed Joint Reduction: extension lumping from ["
-    //       << _link->name << "] to [" << _link->getParent()->name << "]\n";
-
-    // lump gazebo extensions to parent, (give them new reference _link names)
-    ReduceGazeboExtensionToParent(_link);
-
-    // reduce _link elements to parent
-    this->ReduceInertialToParent(_link);
-    this->ReduceVisualsToParent(_link);
-    this->ReduceCollisionsToParent(_link);
-    this->ReduceJointsToParent(_link);
-  }
-
-  // continue down the tree for non-fixed joints
-  for (unsigned int i = 0 ; i < _link->child_links.size() ; ++i)
-    if (_link->child_links[i]->parent_joint->type != urdf::Joint::FIXED)
-      this->ReduceFixedJoints(_root, _link->child_links[i]);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::PrintCollisionGroups(UrdfLinkPtr _link)
-{
-  gzdbg << "COLLISION LUMPING: link: [" << _link->name << "] contains ["
-        << static_cast<int>(_link->collision_groups.size())
-        << "] collisions.\n";
-  for (std::map<std::string,
-    boost::shared_ptr<std::vector<UrdfCollisionPtr > > >::iterator
-    colsIt = _link->collision_groups.begin();
-    colsIt != _link->collision_groups.end(); ++colsIt)
-  {
-    gzdbg << "    collision_groups: [" << colsIt->first << "] has ["
-          << static_cast<int>(colsIt->second->size())
-          << "] Collision objects\n";
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-urdf::Pose  URDF2Gazebo::TransformToParentFrame(
-  urdf::Pose _transformInLinkFrame, urdf::Pose _parentToLinkTransform)
-{
-  // transform to gazebo::math::Pose then call TransformToParentFrame
-  gazebo::math::Pose p1 = URDF2Gazebo::CopyPose(_transformInLinkFrame);
-  gazebo::math::Pose p2 = URDF2Gazebo::CopyPose(_parentToLinkTransform);
-  return URDF2Gazebo::CopyPose(this->TransformToParentFrame(p1, p2));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-gazebo::math::Pose  URDF2Gazebo::TransformToParentFrame(
-  gazebo::math::Pose _transformInLinkFrame,
-  urdf::Pose _parentToLinkTransform)
-{
-  // transform to gazebo::math::Pose then call TransformToParentFrame
-  gazebo::math::Pose p2 = URDF2Gazebo::CopyPose(_parentToLinkTransform);
-  return this->TransformToParentFrame(_transformInLinkFrame, p2);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-gazebo::math::Pose  URDF2Gazebo::TransformToParentFrame(
-  gazebo::math::Pose _transformInLinkFrame,
-  gazebo::math::Pose _parentToLinkTransform)
-{
-  gazebo::math::Pose transformInParentLinkFrame;
-  // rotate link pose to parentLink frame
-  transformInParentLinkFrame.pos =
-    _parentToLinkTransform.rot * _transformInLinkFrame.pos;
-  transformInParentLinkFrame.rot =
-    _parentToLinkTransform.rot * _transformInLinkFrame.rot;
-  // translate link to parentLink frame
-  transformInParentLinkFrame.pos =
-    _parentToLinkTransform.pos + transformInParentLinkFrame.pos;
-
-  return transformInParentLinkFrame;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-gazebo::math::Pose  URDF2Gazebo::inverseTransformToParentFrame(
-  gazebo::math::Pose _transformInLinkFrame,
-  urdf::Pose _parentToLinkTransform)
-{
-  gazebo::math::Pose transformInParentLinkFrame;
-  //   rotate link pose to parentLink frame
-  urdf::Rotation ri = _parentToLinkTransform.rotation.GetInverse();
-  gazebo::math::Quaternion q1(ri.w, ri.x, ri.y, ri.z);
-  transformInParentLinkFrame.pos = q1 * _transformInLinkFrame.pos;
-  urdf::Rotation r2 = _parentToLinkTransform.rotation.GetInverse();
-  gazebo::math::Quaternion q3(r2.w, r2.x, r2.y, r2.z);
-  transformInParentLinkFrame.rot = q3 * _transformInLinkFrame.rot;
-  //   translate link to parentLink frame
-  transformInParentLinkFrame.pos.x = transformInParentLinkFrame.pos.x
-    - _parentToLinkTransform.position.x;
-  transformInParentLinkFrame.pos.y = transformInParentLinkFrame.pos.y
-    - _parentToLinkTransform.position.y;
-  transformInParentLinkFrame.pos.z = transformInParentLinkFrame.pos.z
-    - _parentToLinkTransform.position.z;
-
-  return transformInParentLinkFrame;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionToParent(UrdfLinkPtr _link)
-{
-  /// @todo: this is a very complicated module that updates the plugins
-  /// based on fixed joint reduction really wish this could be a lot cleaner
-
-  std::string linkName = _link->name;
-
-  // update extension map with references to linkName
-  // this->ListGazeboExtensions();
-  std::map<std::string, std::vector<GazeboExtension*> >::iterator ext =
-    this->extensions.find(linkName);
-  if (ext != this->extensions.end())
-  {
-    // gzdbg << "  REDUCE EXTENSION: moving reference from ["
-    //       << linkName << "] to [" << _link->getParent()->name << "]\n";
-
-    // update reduction transform (for rays, cameras for now).
-    //   FIXME: contact frames too?
-    for (std::vector<GazeboExtension*>::iterator ge = ext->second.begin();
-         ge != ext->second.end(); ++ge)
-    {
-      (*ge)->reductionTransform = this->TransformToParentFrame(
-        (*ge)->reductionTransform,
-        _link->parent_joint->parent_to_joint_origin_transform);
-      // for sensor and projector blocks only
-      ReduceGazeboExtensionsTransform((*ge));
-    }
-
-    // find pointer to the existing extension with the new _link reference
-    std::string newLinkName = _link->getParent()->name;
-    std::map<std::string, std::vector<GazeboExtension*> >::iterator
-      newExt = this->extensions.find(newLinkName);
-
-    // if none exist, create new extension with newLinkName
-    if (newExt == this->extensions.end())
-    {
-      std::vector<GazeboExtension*> ge;
-      this->extensions.insert(std::make_pair(
-        newLinkName, ge));
-      newExt = this->extensions.find(newLinkName);
-    }
-
-    // move gazebo extensions from _link into the parent _link's extensions
-    for (std::vector<GazeboExtension*>::iterator ge = ext->second.begin();
-         ge != ext->second.end(); ++ge)
-      newExt->second.push_back(*ge);
-    ext->second.clear();
-  }
-
-  // for extensions with empty reference, search and replace
-  // _link name patterns within the plugin with new _link name
-  // and assign the proper reduction transform for the _link name pattern
-  for (std::map<std::string, std::vector<GazeboExtension*> >::iterator
-       gazeboIt = this->extensions.begin();
-       gazeboIt != this->extensions.end(); ++gazeboIt)
-    {
-      // update reduction transform (for contacts, rays, cameras for now).
-      for (std::vector<GazeboExtension*>::iterator
-        ge = gazeboIt->second.begin(); ge != gazeboIt->second.end(); ++ge)
-        ReduceGazeboExtensionFrameReplace(*ge, _link);
-    }
-
-  // this->ListGazeboExtensions();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionFrameReplace(GazeboExtension* _ge,
-                                                    UrdfLinkPtr _link)
-{
-  // std::string linkName = _link->name;
-  // std::string newLinkName = _link->getParent()->name;
-
-  // HACK: need to do this more generally, but we also need to replace
-  //       all instances of _link name with new link name
-  //       e.g. contact sensor refers to
-  //         <collision>base_link_collision</collision>
-  //         and it needs to be reparented to
-  //         <collision>base_footprint_collision</collision>
-  // gzdbg << "  STRING REPLACE: instances of _link name ["
-  //       << linkName << "] with [" << newLinkName << "]\n";
-  for (std::vector<TiXmlElement*>::iterator blobIt = _ge->blobs.begin();
-       blobIt != _ge->blobs.end(); ++blobIt)
-  {
-    std::ostringstream debugStreamIn;
-    debugStreamIn << *(*blobIt);
-    // std::string debugBlob = debugStreamIn.str();
-    // gzdbg << "        INITIAL STRING link ["
-    //       << linkName << "]-->[" << newLinkName << "]: ["
-    //       << debugBlob << "]\n";
-
-    this->ReduceGazeboExtensionContactSensorFrameReplace(blobIt, _link);
-    this->ReduceGazeboExtensionPluginFrameReplace(blobIt, _link,
-      "plugin", "bodyName", _ge->reductionTransform);
-    this->ReduceGazeboExtensionPluginFrameReplace(blobIt, _link,
-      "plugin", "frameName", _ge->reductionTransform);
-    this->ReduceGazeboExtensionProjectorFrameReplace(blobIt, _link);
-    this->ReduceGazeboExtensionGripperFrameReplace(blobIt, _link);
-    this->ReduceGazeboExtensionJointFrameReplace(blobIt, _link);
-
-    std::ostringstream debugStreamOut;
-    debugStreamOut << *(*blobIt);
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionsTransform(GazeboExtension* _ge)
-{
-  for (std::vector<TiXmlElement*>::iterator blobIt = _ge->blobs.begin();
-       blobIt != _ge->blobs.end(); ++blobIt)
-  {
-    /// @todo make sure we are not missing any additional transform reductions
-    this->ReduceGazeboExtensionSensorTransformReduction(blobIt,
-      _ge->reductionTransform);
-    this->ReduceGazeboExtensionProjectorTransformReduction(blobIt,
-      _ge->reductionTransform);
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ListGazeboExtensions()
-{
-  gzdbg << "================================================================\n";
-  for (std::map<std::string, std::vector<GazeboExtension*> >::iterator
-       gazeboIt = this->extensions.begin();
-       gazeboIt != this->extensions.end(); ++gazeboIt)
-  {
-    int extCount = 0;
-    for (std::vector<GazeboExtension*>::iterator ge = gazeboIt->second.begin();
-         ge != gazeboIt->second.end(); ++ge)
-    {
-      if ((*ge)->blobs.size() > 0)
-      {
-        gzdbg <<  "  PRINTING [" << static_cast<int>((*ge)->blobs.size())
-              << "] BLOBS for extension [" << ++extCount
-              << "] referencing [" << gazeboIt->first << "]\n";
-        for (std::vector<TiXmlElement*>::iterator
-          blobIt = (*ge)->blobs.begin();
-          blobIt != (*ge)->blobs.end(); ++blobIt)
-        {
-          std::ostringstream streamIn;
-          streamIn << *(*blobIt);
-          gzdbg << "    BLOB: [" << streamIn.str() << "]\n";
-        }
-      }
-    }
-  }
-  gzdbg << "================================================================\n";
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ListGazeboExtensions(const std::string &_reference)
-{
-  gzdbg << "================================================================\n";
-  for (std::map<std::string, std::vector<GazeboExtension*> >::iterator
-       gazeboIt = this->extensions.begin();
-       gazeboIt != this->extensions.end(); ++gazeboIt)
-  {
-    if (gazeboIt->first == _reference)
-    {
-        gzdbg <<  "  PRINTING [" << static_cast<int>(gazeboIt->second.size())
-              << "] extensions referencing [" << _reference << "]\n";
-      for (std::vector<GazeboExtension*>::iterator
-           ge = gazeboIt->second.begin(); ge != gazeboIt->second.end(); ++ge)
-      {
-        for (std::vector<TiXmlElement*>::iterator
-          blobIt = (*ge)->blobs.begin();
-          blobIt != (*ge)->blobs.end(); ++blobIt)
-        {
-          std::ostringstream streamIn;
-          streamIn << *(*blobIt);
-          gzdbg << "    BLOB: [" << streamIn.str() << "]\n";
-        }
-      }
-    }
-  }
-  gzdbg << "================================================================\n";
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::CreateSDF(TiXmlElement *_root,
-  ConstUrdfLinkPtr _link,
-  const gazebo::math::Pose &_transform)
-{
-    gazebo::math::Pose _currentTransform = _transform;
-
-    // must have an <inertial> block and cannot have zero mass.
-    //  allow det(I) == zero, in the case of point mass geoms.
-    // @todo:  keyword "world" should be a constant defined somewhere else
-    if (_link->name != "world" &&
-      ((!_link->inertial) || gazebo::math::equal(_link->inertial->mass, 0.0)))
-    {
-      if (!_link->child_links.empty())
-        gzwarn << "urdf2gazebo: link[" << _link->name
-               << "] has no inertia, ["
-               << static_cast<int>(_link->child_links.size())
-               << "] children links ignored\n.";
-
-      if (!_link->child_joints.empty())
-        gzwarn << "urdf2gazebo: link[" << _link->name
-               << "] has no inertia, ["
-               << static_cast<int>(_link->child_links.size())
-               << "] children joints ignored\n.";
-
-      if (_link->parent_joint)
-        gzwarn << "urdf2gazebo: link[" << _link->name
-               << "] has no inertia, "
-               << "parent joint [" << _link->parent_joint->name
-               << "] ignored\n.";
-
-        gzwarn << "urdf2gazebo: link[" << _link->name
-               << "] has no inertia, not modeled in gazebo\n";
-      return;
-    }
-
-    /* create <body:...> block for non fixed joint attached bodies */
-    if ((_link->getParent() && _link->getParent()->name == "world") ||
-        !this->reduceFixedJoints ||
-        (!_link->parent_joint ||
-         _link->parent_joint->type != urdf::Joint::FIXED))
-      CreateLink(_root, _link, _currentTransform);
-
-    // recurse into children
-    for (unsigned int i = 0 ; i < _link->child_links.size() ; ++i)
-        CreateSDF(_root, _link->child_links[i], _currentTransform);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-gazebo::math::Pose  URDF2Gazebo::CopyPose(urdf::Pose _pose)
-{
-  gazebo::math::Pose p;
-  p.pos.x = _pose.position.x;
-  p.pos.y = _pose.position.y;
-  p.pos.z = _pose.position.z;
-  p.rot.x = _pose.rotation.x;
-  p.rot.y = _pose.rotation.y;
-  p.rot.z = _pose.rotation.z;
-  p.rot.w = _pose.rotation.w;
-  return p;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-urdf::Pose  URDF2Gazebo::CopyPose(gazebo::math::Pose _pose)
-{
-  urdf::Pose p;
-  p.position.x = _pose.pos.x;
-  p.position.y = _pose.pos.y;
-  p.position.z = _pose.pos.z;
-  p.rotation.x = _pose.rot.x;
-  p.rotation.y = _pose.rot.y;
-  p.rotation.z = _pose.rot.z;
-  p.rotation.w = _pose.rot.w;
-  return p;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::CreateLink(TiXmlElement *_root,
-  ConstUrdfLinkPtr _link,
-  gazebo::math::Pose &_currentTransform)
-{
-  /* create new body */
-  TiXmlElement *elem     = new TiXmlElement("link");
-
-  /* set body name */
-  elem->SetAttribute("name", _link->name);
-
-  /* compute global transform */
-  gazebo::math::Pose localTransform;
-  // this is the transform from parent link to current _link
-  // this transform does not exist for the root link
-  if (_link->parent_joint)
-  {
-    localTransform = URDF2Gazebo::CopyPose(
-      _link->parent_joint->parent_to_joint_origin_transform);
-    _currentTransform = localTransform * _currentTransform;
-  }
-  else
-    gzdbg << "[" << _link->name << "] has no parent joint\n";
-
-  // create origin tag for this element
-  this->AddTransform(elem, _currentTransform);
-
-  /* create new inerial block */
-  this->CreateInertial(elem, _link);
-
-  /* create new collision block */
-  this->CreateCollisions(elem, _link);
-
-  /* create new visual block */
-  this->CreateVisuals(elem, _link);
-
-  /* copy gazebo extensions data */
-  this->InsertGazeboExtensionLink(elem, _link->name);
-
-  /* add body to document */
-  _root->LinkEndChild(elem);
-
-  /* make a <joint:...> block */
-  this->CreateJoint(_root, _link, _currentTransform);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::CreateCollisions(TiXmlElement* _elem,
-  ConstUrdfLinkPtr _link)
-{
-  // loop through all collision groups. as well as additional collision from
-  //   lumped meshes (fixed joint reduction)
-  for (std::map<std::string,
-    boost::shared_ptr<std::vector<UrdfCollisionPtr> > >::const_iterator
-    collisionsIt = _link->collision_groups.begin();
-    collisionsIt != _link->collision_groups.end(); ++collisionsIt)
-  {
-    unsigned int defaultMeshCount = 0;
-    unsigned int groupMeshCount = 0;
-    unsigned int lumpMeshCount = 0;
-    // loop through collisions in each group
-    for (std::vector<UrdfCollisionPtr>::iterator
-         collision = collisionsIt->second->begin();
-         collision != collisionsIt->second->end();
-         ++collision)
-    {
-      if (collisionsIt->first == "default")
-      {
-        // gzdbg << "creating default collision for link [" << _link->name
-        //       << "]";
-
-        std::string collisionPrefix = _link->name;
-
-        if (defaultMeshCount > 0)
-        {
-          // append _[meshCount] to link name for additional collisions
-          std::ostringstream collisionNameStream;
-          collisionNameStream << collisionPrefix << "_" << defaultMeshCount;
-          collisionPrefix = collisionNameStream.str();
-        }
-
-        /* make a <collision> block */
-        this->CreateCollision(_elem, _link, *collision, collisionPrefix);
-
-        // only 1 default mesh
-        ++defaultMeshCount;
-      }
-      else if (collisionsIt->first.find(std::string("lump::")) == 0)
-      {
-        // if collision name starts with "lump::", pass through
-        //   original parent link name
-        // gzdbg << "creating lump collision [" << collisionsIt->first
-        //       << "] for link [" << _link->name << "].\n";
-        /// collisionPrefix is the original name before lumping
-        std::string collisionPrefix = collisionsIt->first.substr(6);
-
-        if (lumpMeshCount > 0)
-        {
-          // append _[meshCount] to link name for additional collisions
-          std::ostringstream collisionNameStream;
-          collisionNameStream << collisionPrefix << "_" << lumpMeshCount;
-          collisionPrefix = collisionNameStream.str();
-        }
-
-        this->CreateCollision(_elem, _link, *collision, collisionPrefix);
-        ++lumpMeshCount;
-      }
-      else
-      {
-        // gzdbg << "adding collisions from collision group ["
-        //      << collisionsIt->first << "]\n";
-
-        std::string collisionPrefix = _link->name + std::string("_") +
-                                      collisionsIt->first;
-
-        if (groupMeshCount > 0)
-        {
-          // append _[meshCount] to _link name for additional collisions
-          std::ostringstream collisionNameStream;
-          collisionNameStream << collisionPrefix << "_" << groupMeshCount;
-          collisionPrefix = collisionNameStream.str();
-        }
-
-        this->CreateCollision(_elem, _link, *collision, collisionPrefix);
-        ++groupMeshCount;
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::CreateVisuals(TiXmlElement* _elem,
-  ConstUrdfLinkPtr _link)
-{
-  // loop through all visual groups. as well as additional visuals from
-  //   lumped meshes (fixed joint reduction)
-  for (std::map<std::string,
-    boost::shared_ptr<std::vector<UrdfVisualPtr> > >::const_iterator
-    visualsIt = _link->visual_groups.begin();
-    visualsIt != _link->visual_groups.end(); ++visualsIt)
-  {
-    unsigned int defaultMeshCount = 0;
-    unsigned int groupMeshCount = 0;
-    unsigned int lumpMeshCount = 0;
-    // loop through all visuals in this group
-    for (std::vector<UrdfVisualPtr>::iterator
-         visual = visualsIt->second->begin();
-         visual != visualsIt->second->end();
-         ++visual)
-    {
-      if (visualsIt->first == "default")
-      {
-        // gzdbg << "creating default visual for link [" << _link->name
-        //       << "]";
-
-        std::string visualPrefix = _link->name;
-
-        if (defaultMeshCount > 0)
-        {
-          // append _[meshCount] to _link name for additional visuals
-          std::ostringstream visualNameStream;
-          visualNameStream << visualPrefix << "_" << defaultMeshCount;
-          visualPrefix = visualNameStream.str();
-        }
-
-        // create a <visual> block
-        this->CreateVisual(_elem, _link, *visual, visualPrefix);
-
-        // only 1 default mesh
-        ++defaultMeshCount;
-      }
-      else if (visualsIt->first.find(std::string("lump::")) == 0)
-      {
-        // if visual name starts with "lump::", pass through
-        //   original parent link name
-        // gzdbg << "creating lump visual [" << visualsIt->first
-        //       << "] for link [" << _link->name << "].\n";
-        /// visualPrefix is the original name before lumping
-        std::string visualPrefix = visualsIt->first.substr(6);
-
-        if (lumpMeshCount > 0)
-        {
-          // append _[meshCount] to _link name for additional visuals
-          std::ostringstream visualNameStream;
-          visualNameStream << visualPrefix << "_" << lumpMeshCount;
-          visualPrefix = visualNameStream.str();
-        }
-
-        this->CreateVisual(_elem, _link, *visual, visualPrefix);
-        ++lumpMeshCount;
-      }
-      else
-      {
-        // gzdbg << "adding visuals from visual group ["
-        //      << visualsIt->first << "]\n";
-
-        std::string visualPrefix = _link->name + std::string("_") +
-                                      visualsIt->first;
-
-        if (groupMeshCount > 0)
-        {
-          // append _[meshCount] to _link name for additional visuals
-          std::ostringstream visualNameStream;
-          visualNameStream << visualPrefix << "_" << groupMeshCount;
-          visualPrefix = visualNameStream.str();
-        }
-
-        this->CreateVisual(_elem, _link, *visual, visualPrefix);
-        ++groupMeshCount;
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::CreateInertial(TiXmlElement *_elem,
-  ConstUrdfLinkPtr _link)
-{
-  TiXmlElement *inertial = new TiXmlElement("inertial");
-
-  /* set mass properties */
-  // check and print a warning message
-  double roll, pitch, yaw;
-  _link->inertial->origin.rotation.getRPY(roll, pitch, yaw);
-  if (!gazebo::math::equal(roll, 0.0) ||
-    !gazebo::math::equal(pitch, 0.0) || !gazebo::math::equal(yaw, 0.0))
-      gzerr << "rotation of inertial frame in link ["
-            << _link->name << "] is not supported\n";
-
-  /// add pose
-  gazebo::math::Pose pose = URDF2Gazebo::CopyPose(_link->inertial->origin);
-  this->AddTransform(inertial, pose);
-
-  // add mass
-  this->AddKeyValue(inertial, "mass",
-                  this->Values2str(1, &_link->inertial->mass));
-
-  // add inertia (ixx, ixy, ixz, iyy, iyz, izz)
-  TiXmlElement *inertia = new TiXmlElement("inertia");
-  this->AddKeyValue(inertia, "ixx",
-                  this->Values2str(1, &_link->inertial->ixx));
-  this->AddKeyValue(inertia, "ixy",
-                  this->Values2str(1, &_link->inertial->ixy));
-  this->AddKeyValue(inertia, "ixz",
-                  this->Values2str(1, &_link->inertial->ixz));
-  this->AddKeyValue(inertia, "iyy",
-                  this->Values2str(1, &_link->inertial->iyy));
-  this->AddKeyValue(inertia, "iyz",
-                  this->Values2str(1, &_link->inertial->iyz));
-  this->AddKeyValue(inertia, "izz",
-                  this->Values2str(1, &_link->inertial->izz));
-  inertial->LinkEndChild(inertia);
-
-  _elem->LinkEndChild(inertial);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::CreateJoint(TiXmlElement *_root,
-  ConstUrdfLinkPtr _link,
-  gazebo::math::Pose &_currentTransform)
-{
-    /* compute the joint tag */
-    std::string jtype;
-    jtype.clear();
-    if (_link->parent_joint != NULL)
-    {
-      switch (_link->parent_joint->type)
-      {
-        case urdf::Joint::CONTINUOUS:
-        case urdf::Joint::REVOLUTE:
-            jtype = "revolute";
-            break;
-        case urdf::Joint::PRISMATIC:
-            jtype = "prismatic";
-            break;
-        case urdf::Joint::FLOATING:
-        case urdf::Joint::PLANAR:
-            break;
-        case urdf::Joint::FIXED:
-            jtype = "fixed";
-            break;
-        default:
-            gzwarn << "Unknown joint type: [" << _link->parent_joint->type
-                   << "] in link [" << _link->name << "]\n";
-            break;
-      }
-    }
-
-    // skip if joint type is fixed and we are not faking it with a hinge,
-    //   skip/return with the exception of root link being world,
-    //   because there's no lumping there
-    if (_link->getParent() && _link->getParent()->name != "world"
-        && jtype == "fixed" && this->reduceFixedJoints) return;
-
-    if (!jtype.empty())
-    {
-        TiXmlElement *joint = new TiXmlElement("joint");
-        if (jtype == "fixed")
-          joint->SetAttribute("type", "revolute");
-        else
-          joint->SetAttribute("type", jtype);
-        joint->SetAttribute("name", _link->parent_joint->name);
-        this->AddKeyValue(joint, "child", _link->name);
-        this->AddKeyValue(joint, "parent", _link->getParent()->name);
-
-        TiXmlElement *jointAxis = new TiXmlElement("axis");
-        TiXmlElement *jointAxisLimit = new TiXmlElement("limit");
-        TiXmlElement *jointAxisDynamics = new TiXmlElement("dynamics");
-        if (jtype == "fixed")
-        {
-          this->AddKeyValue(jointAxisLimit, "lower", "0");
-          this->AddKeyValue(jointAxisLimit, "upper", "0");
-          this->AddKeyValue(jointAxisDynamics, "damping", "0");
-        }
-        else
-        {
-          gazebo::math::Vector3 rotatedJointAxis =
-            _currentTransform.rot.RotateVector(
-            gazebo::math::Vector3(_link->parent_joint->axis.x,
-                                  _link->parent_joint->axis.y,
-                                  _link->parent_joint->axis.z));
-          double rotatedJointAxisArray[3] =
-            { rotatedJointAxis.x, rotatedJointAxis.y, rotatedJointAxis.z };
-          this->AddKeyValue(jointAxis, "xyz",
-                  this->Values2str(3, rotatedJointAxisArray));
-          if (_link->parent_joint->dynamics)
-            this->AddKeyValue(jointAxisDynamics, "damping",
-              this->Values2str(1, &_link->parent_joint->dynamics->damping));
-
-          if (this->enforceLimits && _link->parent_joint->limits)
-          {
-            if (jtype == "slider")
-            {
-              this->AddKeyValue(jointAxisLimit, "lower",
-                this->Values2str(1, &_link->parent_joint->limits->lower));
-              this->AddKeyValue(jointAxisLimit, "upper",
-                this->Values2str(1, &_link->parent_joint->limits->upper));
-              this->AddKeyValue(jointAxisLimit, "effort",
-                this->Values2str(1, &_link->parent_joint->limits->effort));
-              this->AddKeyValue(jointAxisLimit, "velocity",
-                this->Values2str(1, &_link->parent_joint->limits->velocity));
-            }
-            else if (_link->parent_joint->type != urdf::Joint::CONTINUOUS)
-            {
-              double *lowstop  = &_link->parent_joint->limits->lower;
-              double *highstop = &_link->parent_joint->limits->upper;
-              // enforce ode bounds, this will need to be fixed
-              if (*lowstop > *highstop)
-              {
-                gzwarn << "urdf2gazebo: revolute joint ["
-                       << _link->parent_joint->name
-                       << "] with limits: lowStop[" << *lowstop
-                       << "] > highStop[" << highstop
-                       << "], switching the two.\n";
-                double tmp = *lowstop;
-                *lowstop = *highstop;
-                *highstop = tmp;
-              }
-              this->AddKeyValue(jointAxisLimit, "lower",
-                this->Values2str(1, &_link->parent_joint->limits->lower));
-              this->AddKeyValue(jointAxisLimit, "upper",
-                this->Values2str(1, &_link->parent_joint->limits->upper));
-              this->AddKeyValue(jointAxisLimit, "effort",
-                this->Values2str(1, &_link->parent_joint->limits->effort));
-              this->AddKeyValue(jointAxisLimit, "velocity",
-                this->Values2str(1, &_link->parent_joint->limits->velocity));
-            }
-          }
-        }
-        jointAxis->LinkEndChild(jointAxisLimit);
-        jointAxis->LinkEndChild(jointAxisDynamics);
-        joint->LinkEndChild(jointAxis);
-
-        /* copy gazebo extensions data */
-        this->InsertGazeboExtensionJoint(joint, _link->parent_joint->name);
-
-        /* add joint to document */
-        _root->LinkEndChild(joint);
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::CreateCollision(TiXmlElement* _elem, ConstUrdfLinkPtr _link,
-  UrdfCollisionPtr _collision, const std::string &_oldLinkName)
-{
-    /* begin create geometry node, skip if no collision specified */
-    TiXmlElement *gazeboCollision = new TiXmlElement("collision");
-
-    /* set its name, if lumped, add original link name */
-    if (_oldLinkName == _link->name)
-      gazeboCollision->SetAttribute("name",
-        _link->name + std::string("_collision"));
-    else
-      gazeboCollision->SetAttribute("name",
-        _link->name + std::string("_collision_") + _oldLinkName);
-
-    /* set transform */
-    double pose[6];
-    pose[0] = _collision->origin.position.x;
-    pose[1] = _collision->origin.position.y;
-    pose[2] = _collision->origin.position.z;
-    _collision->origin.rotation.getRPY(pose[3], pose[4], pose[5]);
-    this->AddKeyValue(gazeboCollision, "pose", this->Values2str(6, pose));
-
-
-    /* add geometry block */
-    if (!_collision || !_collision->geometry)
-    {
-      // gzdbg << "urdf2gazebo: collision of link [" << _link->name
-      //       << "] has no <geometry>.\n";
-    }
-    else
-    {
-      CreateGeometry(gazeboCollision, _collision->geometry);
-    }
-
-    /* set additional data from extensions */
-    this->InsertGazeboExtensionCollision(gazeboCollision, _oldLinkName);
-
-    /* add geometry to body */
-    _elem->LinkEndChild(gazeboCollision);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::CreateVisual(TiXmlElement *_elem, ConstUrdfLinkPtr _link,
-  UrdfVisualPtr _visual, const std::string &_oldLinkName)
-{
-    /* begin create gazebo visual node */
-    TiXmlElement *gazeboVisual = new TiXmlElement("visual");
-
-    /* set its name */
-    // gzdbg << "original link name [" << _oldLinkName
-    //       << "] new link name [" << _link->name << "]\n";
-    if (_oldLinkName == _link->name)
-      gazeboVisual->SetAttribute("name", _link->name + std::string("_vis"));
-    else
-      gazeboVisual->SetAttribute("name", _link->name + std::string("_vis_")
-        + _oldLinkName);
-
-    /* add the visualisation transfrom */
-    double pose[6];
-    pose[0] = _visual->origin.position.x;
-    pose[1] = _visual->origin.position.y;
-    pose[2] = _visual->origin.position.z;
-    _visual->origin.rotation.getRPY(pose[3], pose[4], pose[5]);
-    this->AddKeyValue(gazeboVisual, "pose", this->Values2str(6, pose));
-
-    /* insert geometry */
-    if (!_visual || !_visual->geometry)
-    {
-      // gzdbg << "urdf2gazebo: visual of link [" << _link->name
-      //       << "] has no <geometry>\n.";
-    }
-    else
-      CreateGeometry(gazeboVisual, _visual->geometry);
-
-    /* set additional data from extensions */
-    this->InsertGazeboExtensionVisual(gazeboVisual, _oldLinkName);
-
-    /* end create _visual node */
-    _elem->LinkEndChild(gazeboVisual);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-TiXmlDocument URDF2Gazebo::InitModelString(const std::string &_urdfStr,
-  bool _enforceLimits)
-{
-    this->enforceLimits = _enforceLimits;
-
-    /* Create a RobotModel from string */
-    boost::shared_ptr<urdf::ModelInterface> robotModel =
-      urdf::parseURDF(_urdfStr.c_str());
-
-    // an xml object to hold the xml result
-    TiXmlDocument gazeboXmlOut;
-
-    if (!robotModel)
-    {
-        gzerr << "Unable to call parseURDF on robot model\n";
-        return gazeboXmlOut;
-    }
-
-    /* create root element and define needed namespaces */
-    TiXmlElement *robot = new TiXmlElement("model");
-
-    // set model name to urdf robot name if not specified
-    robot->SetAttribute("name", robotModel->getName());
-
-    /* initialize transform for the model, urdf is recursive,
-       while sdf defines all links relative to model frame */
-    gazebo::math::Pose transform;
-
-    /* parse gazebo extension */
-    TiXmlDocument urdfXml;
-    urdfXml.Parse(_urdfStr.c_str());
-    this->ParseGazeboExtension(urdfXml);
-
-    ConstUrdfLinkPtr rootLink = robotModel->getRoot();
-
-    /* Fixed Joint Reduction */
-    /* if link connects to parent via fixed joint, lump down and remove link */
-    /* set reduceFixedJoints to false will replace fixed joints with
-       zero limit revolute joints, otherwise, we reduce it down to its
-       parent link recursively */
-    if (this->reduceFixedJoints)
-      this->ReduceFixedJoints(robot,
-        (boost::const_pointer_cast< urdf::Link >(rootLink)));
-
-    if (rootLink->name == "world")
-    {
-      /* convert all children link */
-      for (std::vector<UrdfLinkPtr>::const_iterator
-        child = rootLink->child_links.begin();
-        child != rootLink->child_links.end(); ++child)
-          CreateSDF(robot, (*child), transform);
-    }
-    else
-    {
-      /* convert, starting from root link */
-      CreateSDF(robot, rootLink, transform);
-    }
-
-    /* insert the extensions without reference into <robot> root level */
-    this->InsertGazeboExtensionRobot(robot);
-
-    // add robot to gazeboXmlOut
-    TiXmlElement *gazeboSdf = new TiXmlElement("sdf");
-    // Until the URDF parser is updated to SDF 1.4, mark the SDF's as 1.3
-    // and rely on the sdf convert functions for compatibility.
-    gazeboSdf->SetAttribute("version", "1.3");  // SDF_VERSION);
-    gazeboSdf->LinkEndChild(robot);
-    gazeboXmlOut.LinkEndChild(gazeboSdf);
-
-    // debug
-    // gazeboXmlOut.Print();
-
-    return gazeboXmlOut;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-TiXmlDocument URDF2Gazebo::InitModelDoc(TiXmlDocument* _xmlDoc)
-{
-    std::ostringstream stream;
-    stream << *_xmlDoc;
-    std::string urdfStr = stream.str();
-    return InitModelString(urdfStr);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-TiXmlDocument URDF2Gazebo::InitModelFile(const std::string &_filename)
-{
-  TiXmlDocument xmlDoc;
-  if (xmlDoc.LoadFile(_filename))
-  {
-    return this->InitModelDoc(&xmlDoc);
-  }
-  else
-    gzerr << "Unable to load file[" << _filename << "].\n";
-
-    return xmlDoc;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceInertialToParent(UrdfLinkPtr _link)
-{
-    // gzdbg << "TREE:   mass lumping from [" << link->name
-    //      << "] to [" << _link->getParent()->name << "]\n.";
-    /* now lump all contents of this _link to parent */
-    if (_link->inertial)
-    {
-      // get parent mass (in parent link frame)
-      dMass parentMass;
-      if (!_link->getParent()->inertial)
-        _link->getParent()->inertial.reset(new urdf::Inertial);
-      dMassSetParameters(&parentMass, _link->getParent()->inertial->mass,
-        _link->getParent()->inertial->origin.position.x,
-        _link->getParent()->inertial->origin.position.y,
-        _link->getParent()->inertial->origin.position.z,
-        _link->getParent()->inertial->ixx, _link->getParent()->inertial->iyy,
-        _link->getParent()->inertial->izz, _link->getParent()->inertial->ixy,
-         _link->getParent()->inertial->ixz, _link->getParent()->inertial->iyz);
-      // PrintMass(_link->getParent()->name, parentMass);
-      // PrintMass(_link->getParent());
-      // set _link mass (in _link frame)
-      dMass linkMass;
-      dMassSetParameters(&linkMass, _link->inertial->mass,
-        _link->inertial->origin.position.x,
-        _link->inertial->origin.position.y,
-        _link->inertial->origin.position.z,
-        _link->inertial->ixx, _link->inertial->iyy, _link->inertial->izz,
-        _link->inertial->ixy, _link->inertial->ixz, _link->inertial->iyz);
-      // PrintMass(_link->name, linkMass);
-      // PrintMass(_link);
-      // un-rotate _link mass into parent link frame
-      dMatrix3 R;
-      double phi, theta, psi;
-      _link->parent_joint->parent_to_joint_origin_transform.rotation.getRPY(
-        phi, theta, psi);
-      dRFromEulerAngles(R, phi, theta, psi);
-      dMassRotate(&linkMass, R);
-      // PrintMass(_link->name, linkMass);
-      // un-translate _link mass into parent link frame
-      dMassTranslate(&linkMass,
-        _link->parent_joint->parent_to_joint_origin_transform.position.x,
-        _link->parent_joint->parent_to_joint_origin_transform.position.y,
-        _link->parent_joint->parent_to_joint_origin_transform.position.z);
-      // PrintMass(_link->name, linkMass);
-      // now linkMass is in the parent frame, add linkMass to parentMass
-      dMassAdd(&parentMass, &linkMass);
-      // PrintMass(_link->getParent()->name, parentMass);
-      // update parent mass
-      _link->getParent()->inertial->mass = parentMass.mass;
-      _link->getParent()->inertial->ixx  = parentMass.I[0+4*0];
-      _link->getParent()->inertial->iyy  = parentMass.I[1+4*1];
-      _link->getParent()->inertial->izz  = parentMass.I[2+4*2];
-      _link->getParent()->inertial->ixy  = parentMass.I[0+4*1];
-      _link->getParent()->inertial->ixz  = parentMass.I[0+4*2];
-      _link->getParent()->inertial->iyz  = parentMass.I[1+4*2];
-      _link->getParent()->inertial->origin.position.x  = parentMass.c[0];
-      _link->getParent()->inertial->origin.position.y  = parentMass.c[1];
-      _link->getParent()->inertial->origin.position.z  = parentMass.c[2];
-      // PrintMass(_link->getParent());
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceVisualsToParent(UrdfLinkPtr _link)
-{
-  // lump visual to parent
-  // lump all visual to parent, assign group name
-  // "lump::"+group name+"::'+_link name
-  // lump but keep the _link name in(/as) the group name,
-  // so we can correlate visuals to visuals somehow.
-  for (std::map<std::string,
-    boost::shared_ptr<std::vector<UrdfVisualPtr> > >::iterator
-    visualsIt = _link->visual_groups.begin();
-    visualsIt != _link->visual_groups.end(); ++visualsIt)
-  {
-    if (visualsIt->first.find(std::string("lump::")) == 0)
-    {
-      // it's a previously lumped mesh, re-lump under same _groupName
-      std::string lumpGroupName = visualsIt->first;
-      // gzdbg << "re-lumping group name [" << lumpGroupName
-      //       << "] to link [" << _link->getParent()->name << "]\n";
-      for (std::vector<UrdfVisualPtr>::iterator
-           visualIt = visualsIt->second->begin();
-           visualIt != visualsIt->second->end(); ++visualIt)
-      {
-        // transform visual origin from _link frame to parent link
-        // frame before adding to parent
-        (*visualIt)->origin = this->TransformToParentFrame((*visualIt)->origin,
-          _link->parent_joint->parent_to_joint_origin_transform);
-        // add the modified visual to parent
-        this->ReduceVisualToParent(_link->getParent(), lumpGroupName,
-          *visualIt);
-      }
-    }
-    else
-    {
-      // default and any other groups meshes
-      std::string lumpGroupName = std::string("lump::")+_link->name;
-      // gzdbg << "adding modified lump group name [" << lumpGroupName
-      //       << "] to link [" << _link->getParent()->name << "]\n.";
-      for (std::vector<UrdfVisualPtr>::iterator
-        visualIt = visualsIt->second->begin();
-        visualIt != visualsIt->second->end(); ++visualIt)
-      {
-        // transform visual origin from _link frame to
-        // parent link frame before adding to parent
-        (*visualIt)->origin = this->TransformToParentFrame((*visualIt)->origin,
-          _link->parent_joint->parent_to_joint_origin_transform);
-        // add the modified visual to parent
-        this->ReduceVisualToParent(_link->getParent(), lumpGroupName,
-          *visualIt);
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceCollisionsToParent(UrdfLinkPtr _link)
-{
-    // lump collision parent
-    // lump all collision to parent, assign group name
-    // "lump::"+group name+"::'+_link name
-    // lump but keep the _link name in(/as) the group name,
-    // so we can correlate visuals to collisions somehow.
-    for (std::map<std::string,
-      boost::shared_ptr<std::vector<UrdfCollisionPtr> > >::iterator
-      collisionsIt = _link->collision_groups.begin();
-      collisionsIt != _link->collision_groups.end(); ++collisionsIt)
-    {
-      if (collisionsIt->first.find(std::string("lump::")) == 0)
-      {
-        // if it's a previously lumped mesh, relump under same _groupName
-        std::string lumpGroupName = collisionsIt->first;
-        // gzdbg << "re-lumping collision [" << collisionsIt->first
-        //       << "] for link [" << _link->name
-        //       << "] to parent [" << _link->getParent()->name
-        //       << "] with group name [" << lumpGroupName << "]\n";
-        for (std::vector<UrdfCollisionPtr>::iterator
-          collisionIt = collisionsIt->second->begin();
-          collisionIt != collisionsIt->second->end(); ++collisionIt)
-        {
-          // transform collision origin from _link frame to
-          // parent link frame before adding to parent
-          (*collisionIt)->origin = this->TransformToParentFrame(
-            (*collisionIt)->origin,
-            _link->parent_joint->parent_to_joint_origin_transform);
-          // add the modified collision to parent
-          this->ReduceCollisionToParent(_link->getParent(), lumpGroupName,
-            *collisionIt);
-        }
-      }
-      else
-      {
-        // default and any other group meshes
-        std::string lumpGroupName = std::string("lump::")+_link->name;
-        // gzdbg << "lumping collision [" << collisionsIt->first
-        //       << "] for link [" << _link->name
-        //       << "] to parent [" << _link->getParent()->name
-        //       << "] with group name [" << lumpGroupName << "]\n";
-        for (std::vector<UrdfCollisionPtr>::iterator
-          collisionIt = collisionsIt->second->begin();
-          collisionIt != collisionsIt->second->end(); ++collisionIt)
-        {
-          // transform collision origin from _link frame to
-          // parent link frame before adding to parent
-          (*collisionIt)->origin = this->TransformToParentFrame(
-            (*collisionIt)->origin,
-            _link->parent_joint->parent_to_joint_origin_transform);
-
-          // add the modified collision to parent
-          this->ReduceCollisionToParent(_link->getParent(), lumpGroupName,
-            *collisionIt);
-        }
-      }
-    }
-    // this->PrintCollisionGroups(_link->getParent());
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceJointsToParent(UrdfLinkPtr _link)
-{
-    // set child link's parentJoint's parent link to
-    // a parent link up stream that does not have a fixed parentJoint
-    for (unsigned int i = 0 ; i < _link->child_links.size() ; ++i)
-    {
-      boost::shared_ptr<urdf::Joint> parentJoint =
-        _link->child_links[i]->parent_joint;
-      if (parentJoint->type != urdf::Joint::FIXED)
-      {
-        // go down the tree until we hit a parent joint that is not fixed
-        UrdfLinkPtr newParentLink = _link;
-        gazebo::math::Pose jointAnchorTransform;
-        while (newParentLink->parent_joint &&
-              newParentLink->getParent()->name != "world" &&
-              newParentLink->parent_joint->type == urdf::Joint::FIXED)
-        {
-          jointAnchorTransform = jointAnchorTransform * jointAnchorTransform;
-          parentJoint->parent_to_joint_origin_transform =
-            this->TransformToParentFrame(
-            parentJoint->parent_to_joint_origin_transform,
-            newParentLink->parent_joint->parent_to_joint_origin_transform);
-          newParentLink = newParentLink->getParent();
-        }
-        // now set the _link->child_links[i]->parent_joint's parent link to
-        // the newParentLink
-        _link->child_links[i]->setParent(newParentLink);
-        parentJoint->parent_link_name = newParentLink->name;
-        // and set the _link->child_links[i]->parent_joint's
-        // parent_to_joint_origin_transform as the aggregated anchor transform?
-      }
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionSensorTransformReduction(
-  std::vector<TiXmlElement*>::iterator _blobIt,
-  gazebo::math::Pose _reductionTransform)
-{
-    // overwrite <xyz> and <rpy> if they exist
-    if ((*_blobIt)->ValueStr() == "sensor")
-    {
-      // parse it and add/replace the reduction transform
-      // find first instance of xyz and rpy, replace with reduction transform
-
-      // debug print
-      // for (TiXmlNode* elIt = (*_blobIt)->FirstChild();
-      //      elIt; elIt = elIt->NextSibling())
-      // {
-      //   std::ostringstream streamIn;
-      //   streamIn << *elIt;
-      //   gzdbg << "    " << streamIn << "\n";
-      // }
-
-      {
-        TiXmlNode* oldPoseKey = (*_blobIt)->FirstChild("pose");
-        /// @todo: FIXME:  we should read xyz, rpy and aggregate it to
-        /// reductionTransform instead of just throwing the info away.
-        if (oldPoseKey)
-          (*_blobIt)->RemoveChild(oldPoseKey);
-      }
-
-      // convert reductionTransform to values
-      urdf::Vector3 reductionXyz(_reductionTransform.pos.x,
-                                  _reductionTransform.pos.y,
-                                  _reductionTransform.pos.z);
-      urdf::Rotation reductionQ(_reductionTransform.rot.x,
-                                 _reductionTransform.rot.y,
-                                 _reductionTransform.rot.z,
-                                 _reductionTransform.rot.w);
-
-      urdf::Vector3 reductionRpy;
-      reductionQ.getRPY(reductionRpy.x, reductionRpy.y, reductionRpy.z);
-
-      // output updated pose to text
-      std::ostringstream poseStream;
-      poseStream << reductionXyz.x << " " << reductionXyz.y
-                  << " " << reductionXyz.z << " " << reductionRpy.x
-                  << " " << reductionRpy.y << " " << reductionRpy.z;
-      TiXmlText* poseTxt = new TiXmlText(poseStream.str());
-
-      TiXmlElement* poseKey = new TiXmlElement("pose");
-      poseKey->LinkEndChild(poseTxt);
-
-      (*_blobIt)->LinkEndChild(poseKey);
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionProjectorTransformReduction(
-  std::vector<TiXmlElement*>::iterator _blobIt,
-  gazebo::math::Pose _reductionTransform)
-{
-    // overwrite <pose> (xyz/rpy) if it exists
-    if ((*_blobIt)->ValueStr() == "projector")
-    {
-      /*
-      // parse it and add/replace the reduction transform
-      // find first instance of xyz and rpy, replace with reduction transform
-      for (TiXmlNode* elIt = (*_blobIt)->FirstChild();
-        elIt; elIt = elIt->NextSibling())
-      {
-        std::ostringstream streamIn;
-        streamIn << *elIt;
-        gzdbg << "    " << streamIn << "\n";
-      }
-      */
-
-      /* should read <pose>...</pose> and agregate reductionTransform */
-      TiXmlNode* poseKey = (*_blobIt)->FirstChild("pose");
-      // read pose and save it
-
-      // remove the tag for now
-      if (poseKey) (*_blobIt)->RemoveChild(poseKey);
-
-      // convert reductionTransform to values
-      urdf::Vector3 reductionXyz(_reductionTransform.pos.x,
-                                  _reductionTransform.pos.y,
-                                  _reductionTransform.pos.z);
-      urdf::Rotation reductionQ(_reductionTransform.rot.x,
-                                 _reductionTransform.rot.y,
-                                 _reductionTransform.rot.z,
-                                 _reductionTransform.rot.w);
-
-      urdf::Vector3 reductionRpy;
-      reductionQ.getRPY(reductionRpy.x, reductionRpy.y, reductionRpy.z);
-
-      // output updated pose to text
-      std::ostringstream poseStream;
-      poseStream << reductionXyz.x << " " << reductionXyz.y
-                  << " " << reductionXyz.z << " " << reductionRpy.x
-                  << " " << reductionRpy.y << " " << reductionRpy.z;
-      TiXmlText* poseTxt = new TiXmlText(poseStream.str());
-
-      poseKey = new TiXmlElement("pose");
-      poseKey->LinkEndChild(poseTxt);
-
-      (*_blobIt)->LinkEndChild(poseKey);
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionContactSensorFrameReplace(
-  std::vector<TiXmlElement*>::iterator _blobIt, UrdfLinkPtr _link)
-{
-  std::string linkName = _link->name;
-  std::string newLinkName = _link->getParent()->name;
-  if ((*_blobIt)->ValueStr() == "sensor")
-  {
-    // parse it and add/replace the reduction transform
-    // find first instance of xyz and rpy, replace with reduction transform
-    TiXmlNode* contact = (*_blobIt)->FirstChild("contact");
-    if (contact)
-    {
-      TiXmlNode* collision = contact->FirstChild("collision");
-      if (collision)
-      {
-        if (this->GetKeyValueAsString(collision->ToElement()) ==
-          linkName + std::string("_collision"))
-        {
-          contact->RemoveChild(collision);
-          TiXmlElement* collisionNameKey = new TiXmlElement("collision");
-          std::ostringstream collisionNameStream;
-          collisionNameStream << newLinkName << "_collision_" << linkName;
-          TiXmlText* collisionNameTxt = new TiXmlText(
-            collisionNameStream.str());
-          collisionNameKey->LinkEndChild(collisionNameTxt);
-          contact->LinkEndChild(collisionNameKey);
-        }
-        // @todo: FIXME: chagning contact sensor's contact collision
-        //   should trigger a update in sensor offset as well.
-        //   But first we need to implement offsets in contact sensors
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionPluginFrameReplace(
-  std::vector<TiXmlElement*>::iterator _blobIt, UrdfLinkPtr _link,
-  const std::string &_pluginName, const std::string &_elementName,
-  gazebo::math::Pose _reductionTransform)
-{
-  std::string linkName = _link->name;
-  std::string newLinkName = _link->getParent()->name;
-  if ((*_blobIt)->ValueStr() == _pluginName)
-  {
-    // replace element containing _link names to parent link names
-    // find first instance of xyz and rpy, replace with reduction transform
-    TiXmlNode* elementNode = (*_blobIt)->FirstChild(_elementName);
-    if (elementNode)
-    {
-      if (this->GetKeyValueAsString(elementNode->ToElement()) == linkName)
-      {
-        (*_blobIt)->RemoveChild(elementNode);
-        TiXmlElement* bodyNameKey = new TiXmlElement(_elementName);
-        std::ostringstream bodyNameStream;
-        bodyNameStream << newLinkName;
-        TiXmlText* bodyNameTxt = new TiXmlText(bodyNameStream.str());
-        bodyNameKey->LinkEndChild(bodyNameTxt);
-        (*_blobIt)->LinkEndChild(bodyNameKey);
-        /// @todo update transforms for this gazebo plugin too
-
-        // look for offset transforms, add reduction transform
-        TiXmlNode* xyzKey = (*_blobIt)->FirstChild("xyzOffset");
-        if (xyzKey)
-        {
-          urdf::Vector3 v1 = this->ParseVector3(xyzKey);
-          _reductionTransform.pos = gazebo::math::Vector3(v1.x, v1.y, v1.z);
-          // remove xyzOffset and rpyOffset
-          (*_blobIt)->RemoveChild(xyzKey);
-        }
-        TiXmlNode* rpyKey = (*_blobIt)->FirstChild("rpyOffset");
-        if (rpyKey)
-        {
-          urdf::Vector3 rpy = this->ParseVector3(rpyKey, M_PI/180.0);
-          _reductionTransform.rot =
-            gazebo::math::Quaternion::EulerToQuaternion(rpy.x, rpy.y, rpy.z);
-          // remove xyzOffset and rpyOffset
-          (*_blobIt)->RemoveChild(rpyKey);
-        }
-
-        // pass through the parent transform from fixed joint reduction
-        _reductionTransform = inverseTransformToParentFrame(_reductionTransform,
-          _link->parent_joint->parent_to_joint_origin_transform);
-
-        // create new offset xml blocks
-        xyzKey = new TiXmlElement("xyzOffset");
-        rpyKey = new TiXmlElement("rpyOffset");
-
-        // create new offset xml blocks
-        urdf::Vector3 reductionXyz(_reductionTransform.pos.x,
-          _reductionTransform.pos.y,
-          _reductionTransform.pos.z);
-        urdf::Rotation reductionQ(_reductionTransform.rot.x,
-          _reductionTransform.rot.y, _reductionTransform.rot.z,
-          _reductionTransform.rot.w);
-
-        std::ostringstream xyzStream, rpyStream;
-        xyzStream << reductionXyz.x << " " << reductionXyz.y << " "
-                   << reductionXyz.z;
-        urdf::Vector3 reductionRpy;
-        reductionQ.getRPY(reductionRpy.x, reductionRpy.y, reductionRpy.z);
-        rpyStream << reductionRpy.x << " " << reductionRpy.y << " "
-                   << reductionRpy.z;
-
-        TiXmlText* xyzTxt = new TiXmlText(xyzStream.str());
-        TiXmlText* rpyTxt = new TiXmlText(rpyStream.str());
-
-        xyzKey->LinkEndChild(xyzTxt);
-        rpyKey->LinkEndChild(rpyTxt);
-
-        (*_blobIt)->LinkEndChild(xyzKey);
-        (*_blobIt)->LinkEndChild(rpyKey);
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionProjectorFrameReplace(
-  std::vector<TiXmlElement*>::iterator _blobIt, UrdfLinkPtr _link)
-{
-  std::string linkName = _link->name;
-  std::string newLinkName = _link->getParent()->name;
-
-  // updates _link reference for <projector> inside of
-  // projector plugins
-  // update from <projector>MyLinkName/MyProjectorName</projector>
-  // to <projector>NewLinkName/MyProjectorName</projector>
-  TiXmlNode* projectorElem = (*_blobIt)->FirstChild("projector");
-  {
-    if (projectorElem)
-    {
-      std::string projectorName =  this->GetKeyValueAsString(
-        projectorElem->ToElement());
-      // extract projector _link name and projector name
-      size_t pos = projectorName.find("/");
-      if (pos == std::string::npos)
-        gzerr << "no slash in projector reference tag [" << projectorName
-              << "], expecting linkName/projector_name.\n";
-      std::string projectorLinkName = projectorName.substr(0, pos);
-
-      if (projectorLinkName == linkName)
-      {
-        // do the replacement
-        projectorName = newLinkName + "/" +
-          projectorName.substr(pos+1, projectorName.size());
-
-        (*_blobIt)->RemoveChild(projectorElem);
-        TiXmlElement* bodyNameKey = new TiXmlElement("projector");
-        std::ostringstream bodyNameStream;
-        bodyNameStream << projectorName;
-        TiXmlText* bodyNameTxt = new TiXmlText(bodyNameStream.str());
-        bodyNameKey->LinkEndChild(bodyNameTxt);
-        (*_blobIt)->LinkEndChild(bodyNameKey);
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionGripperFrameReplace(
-  std::vector<TiXmlElement*>::iterator _blobIt, UrdfLinkPtr _link)
-{
-  std::string linkName = _link->name;
-  std::string newLinkName = _link->getParent()->name;
-
-  if ((*_blobIt)->ValueStr() == "gripper")
-  {
-    TiXmlNode* gripperLink = (*_blobIt)->FirstChild("gripper_link");
-    if (gripperLink)
-    {
-      if (this->GetKeyValueAsString(gripperLink->ToElement()) == linkName)
-      {
-        (*_blobIt)->RemoveChild(gripperLink);
-        TiXmlElement* bodyNameKey = new TiXmlElement("gripper_link");
-        std::ostringstream bodyNameStream;
-        bodyNameStream << newLinkName;
-        TiXmlText* bodyNameTxt = new TiXmlText(bodyNameStream.str());
-        bodyNameKey->LinkEndChild(bodyNameTxt);
-        (*_blobIt)->LinkEndChild(bodyNameKey);
-      }
-    }
-    TiXmlNode* palmLink = (*_blobIt)->FirstChild("palm_link");
-    if (palmLink)
-    {
-      if (this->GetKeyValueAsString(palmLink->ToElement()) == linkName)
-      {
-        (*_blobIt)->RemoveChild(palmLink);
-        TiXmlElement* bodyNameKey = new TiXmlElement("palm_link");
-        std::ostringstream bodyNameStream;
-        bodyNameStream << newLinkName;
-        TiXmlText* bodyNameTxt = new TiXmlText(bodyNameStream.str());
-        bodyNameKey->LinkEndChild(bodyNameTxt);
-        (*_blobIt)->LinkEndChild(bodyNameKey);
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URDF2Gazebo::ReduceGazeboExtensionJointFrameReplace(
-  std::vector<TiXmlElement*>::iterator _blobIt, UrdfLinkPtr _link)
-{
-  std::string linkName = _link->name;
-  std::string newLinkName = _link->getParent()->name;
-
-  if ((*_blobIt)->ValueStr() == "joint")
-  {
-    // parse it and add/replace the reduction transform
-    // find first instance of xyz and rpy, replace with reduction transform
-    TiXmlNode* parent = (*_blobIt)->FirstChild("parent");
-    if (parent)
-    {
-      if (this->GetKeyValueAsString(parent->ToElement()) == linkName)
-      {
-        (*_blobIt)->RemoveChild(parent);
-        TiXmlElement* parentNameKey = new TiXmlElement("parent");
-        std::ostringstream parentNameStream;
-        parentNameStream << newLinkName;
-        TiXmlText* parentNameTxt = new TiXmlText(parentNameStream.str());
-        parentNameKey->LinkEndChild(parentNameTxt);
-        (*_blobIt)->LinkEndChild(parentNameKey);
-      }
-    }
-    TiXmlNode* child = (*_blobIt)->FirstChild("child");
-    if (child)
-    {
-      if (this->GetKeyValueAsString(child->ToElement()) == linkName)
-      {
-        (*_blobIt)->RemoveChild(child);
-        TiXmlElement* childNameKey = new TiXmlElement("child");
-        std::ostringstream childNameStream;
-        childNameStream << newLinkName;
-        TiXmlText* childNameTxt = new TiXmlText(childNameStream.str());
-        childNameKey->LinkEndChild(childNameTxt);
-        (*_blobIt)->LinkEndChild(childNameKey);
-      }
-    }
-    /// @todo add anchor offsets if parent link changes location!
-  }
-}
-}
diff --git a/gazebo/sdf/interface/parser_urdf.hh b/gazebo/sdf/interface/parser_urdf.hh
deleted file mode 100644
index bdf7c54..0000000
--- a/gazebo/sdf/interface/parser_urdf.hh
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef URDF2GAZEBO_HH
-#define URDF2GAZEBO_HH
-
-#include <urdf_model/model.h>
-#include <urdf_model/link.h>
-#include <tinyxml.h>
-
-#include <cstdio>
-#include <cstdlib>
-#include <cmath>
-#include <vector>
-#include <string>
-#include <sstream>
-#include <map>
-
-#include "ode/mass.h"
-#include "ode/rotation.h"
-
-#include "gazebo/math/Pose.hh"
-#include "gazebo/common/Console.hh"
-
-/// \ingroup gazebo_parser
-/// \brief namespace for URDF to SDF parser
-namespace urdf2gazebo
-{
-  /// \addtogroup gazebo_parser
-  /// \{
-
-  typedef boost::shared_ptr<urdf::Collision> UrdfCollisionPtr;
-  typedef boost::shared_ptr<urdf::Visual> UrdfVisualPtr;
-  typedef boost::shared_ptr<urdf::Link> UrdfLinkPtr;
-  typedef boost::shared_ptr<const urdf::Link> ConstUrdfLinkPtr;
-
-  /// \class A class for holding gazebo extension elements in urdf
-  class GazeboExtension
-  {
-    private: GazeboExtension()
-    {
-      material.clear();
-      setStaticFlag = false;
-      gravity = true;
-      isDampingFactor = false;
-      isMaxVel = false;
-      isMinDepth = false;
-      fdir1.clear();
-      isMu1 = false;
-      isMu2 = false;
-      isKp = false;
-      isKd = false;
-      selfCollide = false;
-      isLaserRetro = false;
-      isStopCfm = false;
-      isStopErp = false;
-      isInitialJointPosition = false;
-      isFudgeFactor = false;
-      provideFeedback = false;
-      cfmDamping = false;
-      blobs.clear();
-
-      dampingFactor = 0;
-      maxVel = 0;
-      minDepth = 0;
-      mu1 = 0;
-      mu2 = 0;
-      kp = 100000000;
-      kd = 1;
-      laserRetro = 101;
-      stopCfm = 0;
-      stopErp = 0.1;
-      initialJointPosition = 0;
-      fudgeFactor = 1;
-    };
-
-    private: GazeboExtension(const GazeboExtension &ge)
-             : material(ge.material), fdir1(ge.fdir1),
-             oldLinkName(ge.oldLinkName),
-             reductionTransform(ge.reductionTransform),
-             blobs(ge.blobs)
-    {
-      setStaticFlag = ge.setStaticFlag;
-      gravity = ge.gravity;
-      isDampingFactor = ge.isDampingFactor;
-      isMaxVel = ge.isMaxVel;
-      isMinDepth = ge.isMinDepth;
-      isMu1 = ge.isMu1;
-      isMu2 = ge.isMu2;
-      isKp = ge.isKp;
-      isKd = ge.isKd;
-      selfCollide = ge.selfCollide;
-      isLaserRetro = ge.isLaserRetro;
-      isStopCfm = ge.isStopCfm;
-      isStopErp = ge.isStopErp;
-      isInitialJointPosition = ge.isInitialJointPosition;
-      isFudgeFactor = ge.isFudgeFactor;
-      provideFeedback = ge.provideFeedback;
-      cfmDamping = ge.cfmDamping;
-      dampingFactor = ge.dampingFactor;
-      maxVel = ge.maxVel;
-      minDepth = ge.minDepth;
-      mu1 = ge.mu1;
-      mu2 = ge.mu2;
-      kp = ge.kp;
-      kd = ge.kd;
-      laserRetro = ge.laserRetro;
-      stopCfm = ge.stopCfm;
-      stopErp = ge.stopErp;
-      initialJointPosition = ge.initialJointPosition;
-      fudgeFactor = ge.fudgeFactor;
-    };
-
-    // visual
-    private: std::string material;
-
-    private: std::string fdir1;
-
-    // for reducing fixed joints and removing links
-    private: std::string oldLinkName;
-    private: gazebo::math::Pose reductionTransform;
-
-    // blobs into body or robot
-    private: std::vector<TiXmlElement*> blobs;
-
-    // body, default off
-    private: bool setStaticFlag;
-    private: bool gravity;
-    private: bool isDampingFactor;
-    private: double dampingFactor;
-    private: bool isMaxVel;
-    private: double maxVel;
-    private: bool isMinDepth;
-    private: double minDepth;
-    private: bool selfCollide;
-
-    // geom, contact dynamics
-    private: bool isMu1, isMu2, isKp, isKd;
-    private: double mu1, mu2, kp, kd;
-    private: bool isLaserRetro;
-    private: double laserRetro;
-
-    // joint, joint limit dynamics
-    private: bool isStopCfm, isStopErp, isInitialJointPosition, isFudgeFactor;
-    private: double stopCfm, stopErp, initialJointPosition, fudgeFactor;
-    private: bool provideFeedback;
-    private: bool cfmDamping;
-
-    friend class URDF2Gazebo;
-  };
-
-  class URDF2Gazebo
-  {
-    /// \brief constructor
-    public: URDF2Gazebo();
-
-    /// \brief destructor
-    public: ~URDF2Gazebo();
-
-    /// \brief convert urdf xml document string to sdf xml document
-    /// \param[in] _xmlDoc a tinyxml document containing the urdf model
-    /// \return a tinyxml document containing sdf of the model
-    public: TiXmlDocument InitModelDoc(TiXmlDocument* _xmlDoc);
-
-    /// \brief convert urdf file to sdf xml document
-    /// \param[in] _urdfStr a string containing filename of the urdf model
-    /// \return a tinyxml document containing sdf of the model
-    public: TiXmlDocument InitModelFile(const std::string &_filename);
-
-    /// \brief convert urdf string to sdf xml document, with option to enforce
-    /// limits.
-    /// \param[in] _urdfStr a string containing model urdf
-    /// \param[in] _enforceLimits option to enforce joint limits
-    /// \return a tinyxml document containing sdf of the model
-    public: TiXmlDocument InitModelString(const std::string &_urdfStr,
-                                          bool _enforceLimits = true);
-
-    /// \brief parser xml string into urdf::Vector3
-    /// \param[in] _key XML key where vector3 value might be
-    /// \param[in] _scale scalar scale for the vector3
-    /// \return a urdf::Vector3
-    private: urdf::Vector3 ParseVector3(TiXmlNode* _key, double _scale = 1.0);
-
-    /// \brief convert values to string
-    /// \param[in] _count number of values in _values array
-    /// \param[in] _values array of double values
-    /// \return a string
-    private: std::string Values2str(unsigned int _count, const double *_values);
-
-    /// \brief convert Vector3 to string
-    /// \param[in] _vector a urdf::Vector3
-    /// \return a string
-    private: std::string Vector32Str(const urdf::Vector3 _vector);
-
-    /// \brief append key value pair to the end of the xml element
-    /// \param[in] _elem pointer to xml element
-    /// \param[in] _key string containing key to add to xml element
-    /// \param[in] _value string containing value for the key added
-    private: void AddKeyValue(TiXmlElement *_elem, const std::string &_key,
-                     const std::string &_value);
-
-    /// append transform (pose) to the end of the xml element
-    private: void AddTransform(TiXmlElement *_elem,
-                      const::gazebo::math::Pose& _transform);
-
-    /// print mass for link for debugging
-    private: void PrintMass(UrdfLinkPtr _link);
-
-    /// print mass for link for debugging
-    private: void PrintMass(const std::string &_linkName, dMass _mass);
-
-    /// get value from <key value="..."/> pair and return it as string
-    private: std::string GetKeyValueAsString(TiXmlElement* _elem);
-
-    /// things that do not belong in urdf but should be mapped into sdf
-    /// @todo: do this using sdf definitions, not hard coded stuff
-    private: void ParseGazeboExtension(TiXmlDocument &_urdfXml);
-
-    /// insert extensions into collision geoms
-    private: void InsertGazeboExtensionCollision(TiXmlElement *_elem,
-                                        const std::string &_linkName);
-
-    /// insert extensions into visuals
-    private: void InsertGazeboExtensionVisual(TiXmlElement *_elem,
-                                     const std::string &_linkName);
-
-    /// insert extensions into links
-    private: void InsertGazeboExtensionLink(TiXmlElement *_elem,
-                                   const std::string &_linkName);
-
-    /// insert extensions into joints
-    private: void InsertGazeboExtensionJoint(TiXmlElement *_elem,
-                                    const std::string &_jointName);
-
-    /// insert extensions into model
-    private: void InsertGazeboExtensionRobot(TiXmlElement *_elem);
-
-    /// list extensions for debugging
-    private: void ListGazeboExtensions();
-
-    /// list extensions for debugging
-    private: void ListGazeboExtensions(const std::string &_reference);
-
-    /// reduce fixed joints by lumping inertial, visual and
-    // collision elements of the child link into the parent link
-    private: void ReduceFixedJoints(TiXmlElement *_root, UrdfLinkPtr _link);
-
-    /// reduce fixed joints:  lump inertial to parent link
-    private: void ReduceInertialToParent(UrdfLinkPtr _link);
-
-    /// reduce fixed joints:  lump visuals to parent link
-    private: void ReduceVisualsToParent(UrdfLinkPtr _link);
-
-    /// reduce fixed joints:  lump collisions to parent link
-    private: void ReduceCollisionsToParent(UrdfLinkPtr _link);
-
-    /// reduce fixed joints:  lump joints to parent link
-    private: void ReduceJointsToParent(UrdfLinkPtr _link);
-
-    /// reduce fixed joints:  lump visuals when reducing fixed joints
-    private: void ReduceVisualToParent(UrdfLinkPtr _link,
-                              const std::string &_groupName,
-                              UrdfVisualPtr _visual);
-
-    /// reduce fixed joints:  lump collision when reducing fixed joints
-    private: void ReduceCollisionToParent(UrdfLinkPtr _link,
-                         const std::string &_groupName,
-                         UrdfCollisionPtr _collision);
-
-    /// \brief reduced fixed joints:  apply appropriate updates to urdf
-    ///   extensions when doing fixed joint reduction
-    ///
-    /// Take the link's existing list of gazebo extensions, transfer them
-    /// into parent link.  Along the way, update local transforms by adding
-    /// the additional transform to parent.  Also, look through all
-    /// referenced link names with plugins and update references to current
-    /// link to the parent link. (ReduceGazeboExtensionFrameReplace())
-    ///
-    /// \param[in] _link pointer to urdf link, its extensions will be reduced
-    private: void ReduceGazeboExtensionToParent(UrdfLinkPtr _link);
-
-    /// reduced fixed joints:  apply appropriate frame updates
-    ///   in urdf extensions when doing fixed joint reduction
-    private: void ReduceGazeboExtensionFrameReplace(GazeboExtension* _ge,
-                                           UrdfLinkPtr _link);
-
-    /// reduced fixed joints:  apply appropriate frame updates in plugins
-    ///   inside urdf extensions when doing fixed joint reduction
-    private: void ReduceGazeboExtensionPluginFrameReplace(
-      std::vector<TiXmlElement*>::iterator _blobIt,
-      UrdfLinkPtr _link, const std::string &_pluginName,
-      const std::string &_elementName, gazebo::math::Pose _reductionTransform);
-
-    /// reduced fixed joints:  apply appropriate frame updates in projector
-    ///  inside urdf extensions when doing fixed joint reduction
-    private: void ReduceGazeboExtensionProjectorFrameReplace(
-      std::vector<TiXmlElement*>::iterator _blobIt,
-      UrdfLinkPtr _link);
-
-    /// reduced fixed joints:  apply appropriate frame updates in gripper
-    ///   inside urdf extensions when doing fixed joint reduction
-    private: void ReduceGazeboExtensionGripperFrameReplace(
-      std::vector<TiXmlElement*>::iterator _blobIt,
-       UrdfLinkPtr _link);
-
-    /// reduced fixed joints:  apply appropriate frame updates in joint
-    ///   inside urdf extensions when doing fixed joint reduction
-    private: void ReduceGazeboExtensionJointFrameReplace(
-      std::vector<TiXmlElement*>::iterator _blobIt,
-       UrdfLinkPtr _link);
-
-    /// reduced fixed joints:  apply appropriate frame updates in urdf
-    ///   extensions when doing fixed joint reduction
-    private: void ReduceGazeboExtensionContactSensorFrameReplace(
-      std::vector<TiXmlElement*>::iterator _blobIt,
-       UrdfLinkPtr _link);
-
-    /// reduced fixed joints:  apply transform reduction to extensions
-    ///   when doing fixed joint reduction
-    private: void ReduceGazeboExtensionsTransform(GazeboExtension* _ge);
-
-    /// reduced fixed joints:  apply transform reduction for ray sensors
-    ///   in extensions when doing fixed joint reduction
-    private: void ReduceGazeboExtensionSensorTransformReduction(
-      std::vector<TiXmlElement*>::iterator _blobIt,
-      gazebo::math::Pose _reductionTransform);
-
-    /// reduced fixed joints:  apply transform reduction for projectors in
-    ///   extensions when doing fixed joint reduction
-    private: void ReduceGazeboExtensionProjectorTransformReduction(
-      std::vector<TiXmlElement*>::iterator _blobIt,
-      gazebo::math::Pose _reductionTransform);
-
-    /// reduced fixed joints: transform to parent frame
-    private: urdf::Pose  TransformToParentFrame(
-      urdf::Pose _transformInLinkFrame,
-      urdf::Pose _parentToLinkTransform);
-    /// reduced fixed joints: transform to parent frame
-    private: gazebo::math::Pose  TransformToParentFrame(
-      gazebo::math::Pose _transformInLinkFrame,
-      urdf::Pose _parentToLinkTransform);
-    /// reduced fixed joints: transform to parent frame
-    private: gazebo::math::Pose  TransformToParentFrame(
-      gazebo::math::Pose _transformInLinkFrame,
-      gazebo::math::Pose _parentToLinkTransform);
-    /// reduced fixed joints: transform to parent frame
-    private: gazebo::math::Pose  inverseTransformToParentFrame(
-      gazebo::math::Pose _transformInLinkFrame,
-      urdf::Pose _parentToLinkTransform);
-    /// reduced fixed joints: utility to copy between urdf::Pose and
-    ///   math::Pose
-    private: gazebo::math::Pose  CopyPose(urdf::Pose _pose);
-    /// reduced fixed joints: utility to copy between urdf::Pose and
-    ///   math::Pose
-    private: urdf::Pose  CopyPose(gazebo::math::Pose _pose);
-
-    private: std::string GetGeometryBoundingBox(
-      boost::shared_ptr<urdf::Geometry> _geometry, double *_sizeVals);
-
-
-    /// print collision groups for debugging purposes
-    private: void PrintCollisionGroups(UrdfLinkPtr _link);
-
-    /// create SDF from URDF link
-    private: void CreateSDF(TiXmlElement *_root,
-      ConstUrdfLinkPtr _link,
-      const gazebo::math::Pose &_transform);
-
-    /// create SDF Link block based on URDF
-    private: void CreateLink(TiXmlElement *_root,
-      ConstUrdfLinkPtr _link,
-      gazebo::math::Pose &_currentTransform);
-
-    /// create collision blocks from urdf collisions
-    private: void CreateCollisions(TiXmlElement* _elem,
-      ConstUrdfLinkPtr _link);
-
-    /// create visual blocks from urdf visuals
-    private: void CreateVisuals(TiXmlElement* _elem,
-      ConstUrdfLinkPtr _link);
-
-    /// create SDF Inertial block based on URDF
-    private: void CreateInertial(TiXmlElement *_elem,
-      ConstUrdfLinkPtr _link);
-
-    /// create SDF Collision block based on URDF
-    private: void CreateCollision(TiXmlElement* _elem,
-      ConstUrdfLinkPtr _link,
-      UrdfCollisionPtr _collision,
-      const std::string &_oldLinkName = std::string(""));
-
-    /// create SDF Visual block based on URDF
-    private: void CreateVisual(TiXmlElement *_elem,
-      ConstUrdfLinkPtr _link,
-      UrdfVisualPtr _visual,
-      const std::string &_oldLinkName = std::string(""));
-
-    /// create SDF Joint block based on URDF
-    private: void CreateJoint(TiXmlElement *_root,
-      ConstUrdfLinkPtr _link,
-      gazebo::math::Pose &_currentTransform);
-
-    /// create SDF geometry block based on URDF
-    private: void CreateGeometry(TiXmlElement* _elem,
-      boost::shared_ptr<urdf::Geometry> _geometry);
-
-    private: std::map<std::string, std::vector<GazeboExtension*> > extensions;
-
-    private: bool enforceLimits;
-    private: bool reduceFixedJoints;
-  };
-  /// \}
-}
-
-#endif
diff --git a/gazebo/sdf/sdf.hh b/gazebo/sdf/sdf.hh
deleted file mode 100644
index ff4e802..0000000
--- a/gazebo/sdf/sdf.hh
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#ifndef _SDF_HH_
-#define _SDF_HH_
-
-#include "sdf/interface/SDF.hh"
-#include "sdf/interface/Param.hh"
-#include "sdf/interface/parser.hh"
-#include "sdf/interface/Converter.hh"
-
-#endif
diff --git a/gazebo/sensors/CMakeLists.txt b/gazebo/sensors/CMakeLists.txt
index 79d66cd..40b0f8f 100644
--- a/gazebo/sensors/CMakeLists.txt
+++ b/gazebo/sensors/CMakeLists.txt
@@ -1,45 +1,70 @@
 include (${gazebo_cmake_dir}/GazeboUtils.cmake)
 
-set (sources 
+set (sources
   CameraSensor.cc
   ContactSensor.cc
   DepthCameraSensor.cc
+  ForceTorqueSensor.cc
+  GaussianNoiseModel.cc
+  GpsSensor.cc
+  GpuRaySensor.cc
   ImuSensor.cc
   MultiCameraSensor.cc
+  Noise.cc
   RaySensor.cc
   RFIDSensor.cc
   RFIDTag.cc
-  Sensors.cc
+  SensorsIface.cc
   Sensor.cc
   SensorFactory.cc
   SensorManager.cc
-) 
+  SonarSensor.cc
+  WirelessReceiver.cc
+  WirelessTransceiver.cc
+  WirelessTransmitter.cc
+)
 
 set (headers
   CameraSensor.hh
   ContactSensor.hh
   DepthCameraSensor.hh
+  ForceTorqueSensor.hh
+  GaussianNoiseModel.hh
+  GpsSensor.hh
+  GpuRaySensor.hh
   ImuSensor.hh
   MultiCameraSensor.hh
+  Noise.hh
   RaySensor.hh
   RFIDSensor.hh
   RFIDTag.hh
-  Sensors.hh
+  SensorsIface.hh
   Sensor.hh
   SensorTypes.hh
   SensorFactory.hh
   SensorManager.hh
+  SonarSensor.hh
+  WirelessReceiver.hh
+  WirelessTransceiver.hh
+  WirelessTransmitter.hh
 )
 
 set (gtest_sources
-  RaySensor_TEST.cc
+  ForceTorqueSensor_TEST.cc
+  GpsSensor_TEST.cc
   ImuSensor_TEST.cc
+  Noise_TEST.cc
+  RaySensor_TEST.cc
   Sensor_TEST.cc
+  SonarSensor_TEST.cc
+  WirelessReceiver_TEST.cc
+  WirelessTransmitter_TEST.cc
 )
 
 gz_build_tests(${gtest_sources})
 
 set (gtest_sources_dri
+  GpuRaySensor_TEST.cc
   SensorManager_TEST.cc
 )
 
@@ -48,29 +73,21 @@ gz_build_dri_tests(${gtest_sources_dri})
 set (sensors_headers "" CACHE INTERNAL "sensors headers" FORCE)
 foreach (hdr ${headers})
   APPEND_TO_CACHED_STRING(sensors_headers "sensors headers"
-    "#include \"sensors/${hdr}\"\n")
+    "#include \"gazebo/sensors/${hdr}\"\n")
 endforeach()
 configure_file (${CMAKE_CURRENT_SOURCE_DIR}/sensors.hh.in ${CMAKE_CURRENT_BINARY_DIR}/sensors.hh)
 
 
 add_library(gazebo_sensors SHARED ${sources})
 
-target_link_libraries(gazebo_sensors gazebo_common 
-                                     gazebo_rendering
-                                     gazebo_physics
-                                     ${libtool_library} 
-                                     ${Boost_LIBRARIES}
-                                     ${ogre_ldflags}
-                                     )
-
-add_executable(gzsensor server.cc ../gazebo.cc)
-target_link_libraries( gzsensor gazebo_common
-                                gazebo_transport
-                                gazebo_sensors
-                                gazebo_rendering
-                                gazebo_msgs
-                                pthread)
+target_link_libraries(gazebo_sensors
+  gazebo_common
+  gazebo_rendering
+  gazebo_physics
+  ${libtool_library}
+  ${Boost_LIBRARIES}
+  ${ogre_ldflags}
+  )
 
-gz_install_executable( gzsensor )
 gz_install_library(gazebo_sensors)
 gz_install_includes("sensors" ${headers} ${CMAKE_CURRENT_BINARY_DIR}/sensors.hh)
diff --git a/gazebo/sensors/CameraSensor.cc b/gazebo/sensors/CameraSensor.cc
index 77da295..07d101b 100644
--- a/gazebo/sensors/CameraSensor.cc
+++ b/gazebo/sensors/CameraSensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -31,10 +31,12 @@
 #include "gazebo/rendering/RenderEngine.hh"
 #include "gazebo/rendering/Camera.hh"
 #include "gazebo/rendering/Scene.hh"
-#include "gazebo/rendering/Rendering.hh"
+#include "gazebo/rendering/RenderingIface.hh"
 
 #include "gazebo/sensors/SensorFactory.hh"
 #include "gazebo/sensors/CameraSensor.hh"
+#include "gazebo/sensors/Noise.hh"
+
 
 using namespace gazebo;
 using namespace sensors;
@@ -45,6 +47,10 @@ GZ_REGISTER_STATIC_SENSOR("camera", CameraSensor)
 CameraSensor::CameraSensor()
     : Sensor(sensors::IMAGE)
 {
+  this->rendered = false;
+  this->connections.push_back(
+      event::Events::ConnectRender(
+        boost::bind(&CameraSensor::Render, this)));
 }
 
 //////////////////////////////////////////////////
@@ -53,12 +59,6 @@ CameraSensor::~CameraSensor()
 }
 
 //////////////////////////////////////////////////
-void CameraSensor::SetParent(const std::string &_name)
-{
-  Sensor::SetParent(_name);
-}
-
-//////////////////////////////////////////////////
 void CameraSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
 {
   Sensor::Load(_worldName, _sdf);
@@ -78,7 +78,8 @@ std::string CameraSensor::GetTopic() const
 void CameraSensor::Load(const std::string &_worldName)
 {
   Sensor::Load(_worldName);
-  this->imagePub = this->node->Advertise<msgs::ImageStamped>(this->GetTopic());
+  this->imagePub = this->node->Advertise<msgs::ImageStamped>(
+      this->GetTopic(), 50);
 }
 
 //////////////////////////////////////////////////
@@ -98,7 +99,7 @@ void CameraSensor::Init()
     this->scene = rendering::get_scene(worldName);
     if (!this->scene)
     {
-      this->scene = rendering::create_scene(worldName, false);
+      this->scene = rendering::create_scene(worldName, false, true);
 
       // This usually means rendering is not available
       if (!this->scene)
@@ -109,7 +110,7 @@ void CameraSensor::Init()
     }
 
     this->camera = this->scene->CreateCamera(
-        this->sdf->GetValueString("name"), false);
+        this->sdf->Get<std::string>("name"), false);
 
     if (!this->camera)
     {
@@ -132,52 +133,88 @@ void CameraSensor::Init()
     this->camera->CreateRenderTexture(this->GetName() + "_RttTex");
     math::Pose cameraPose = this->pose;
     if (cameraSdf->HasElement("pose"))
-      cameraPose = cameraSdf->GetValuePose("pose") + cameraPose;
+      cameraPose = cameraSdf->Get<math::Pose>("pose") + cameraPose;
+
     this->camera->SetWorldPose(cameraPose);
-    this->camera->AttachToVisual(this->parentName, true);
+    this->camera->AttachToVisual(this->parentId, true);
+
+    if (cameraSdf->HasElement("noise"))
+    {
+      NoisePtr noise =
+          NoiseFactory::NewNoiseModel(cameraSdf->GetElement("noise"),
+        this->GetType());
+      this->noises.push_back(noise);
+      noise->SetCamera(this->camera);
+    }
   }
   else
     gzerr << "No world name\n";
 
+  // Disable clouds and moon on server side until fixed and also to improve
+  // performance
+  this->scene->SetSkyXMode(rendering::Scene::GZ_SKYX_ALL &
+      ~rendering::Scene::GZ_SKYX_CLOUDS &
+      ~rendering::Scene::GZ_SKYX_MOON);
+
   Sensor::Init();
 }
 
 //////////////////////////////////////////////////
 void CameraSensor::Fini()
 {
+  this->imagePub.reset();
   Sensor::Fini();
+
   if (this->camera)
-    this->camera->Fini();
+  {
+    this->scene->RemoveCamera(this->camera->GetName());
+  }
+
   this->camera.reset();
   this->scene.reset();
 }
 
 //////////////////////////////////////////////////
-void CameraSensor::UpdateImpl(bool /*_force*/)
+void CameraSensor::Render()
 {
-  if (this->camera)
-  {
-    this->camera->Render();
-    this->camera->PostRender();
-    this->lastMeasurementTime = this->world->GetSimTime();
+  if (!this->camera || !this->IsActive() || !this->NeedsUpdate())
+    return;
 
-    if (this->imagePub->HasConnections())
-    {
-      msgs::ImageStamped msg;
-      msgs::Set(msg.mutable_time(), this->world->GetSimTime());
-      msg.mutable_image()->set_width(this->camera->GetImageWidth());
-      msg.mutable_image()->set_height(this->camera->GetImageHeight());
-      msg.mutable_image()->set_pixel_format(common::Image::ConvertPixelFormat(
-            this->camera->GetImageFormat()));
-
-      msg.mutable_image()->set_step(this->camera->GetImageWidth() *
-          this->camera->GetImageDepth());
-      msg.mutable_image()->set_data(this->camera->GetImageData(),
-          msg.image().width() * this->camera->GetImageDepth() *
-          msg.image().height());
-      this->imagePub->Publish(msg);
-    }
+  // Update all the cameras
+  this->camera->Render();
+
+  this->rendered = true;
+  this->lastMeasurementTime = this->scene->GetSimTime();
+}
+
+//////////////////////////////////////////////////
+bool CameraSensor::UpdateImpl(bool /*_force*/)
+{
+  if (!this->rendered)
+    return false;
+
+  this->camera->PostRender();
+
+  if (this->imagePub && this->imagePub->HasConnections())
+  {
+    msgs::ImageStamped msg;
+    msgs::Set(msg.mutable_time(), this->scene->GetSimTime());
+    msg.mutable_image()->set_width(this->camera->GetImageWidth());
+    msg.mutable_image()->set_height(this->camera->GetImageHeight());
+    msg.mutable_image()->set_pixel_format(common::Image::ConvertPixelFormat(
+          this->camera->GetImageFormat()));
+
+    msg.mutable_image()->set_step(this->camera->GetImageWidth() *
+        this->camera->GetImageDepth());
+    msg.mutable_image()->set_data(this->camera->GetImageData(),
+        msg.image().width() * this->camera->GetImageDepth() *
+        msg.image().height());
+
+    this->imagePub->Publish(msg);
   }
+
+  this->rendered = false;
+  return true;
 }
 
 //////////////////////////////////////////////////
@@ -212,5 +249,6 @@ bool CameraSensor::SaveFrame(const std::string &_filename)
 //////////////////////////////////////////////////
 bool CameraSensor::IsActive()
 {
-  return Sensor::IsActive() || this->imagePub->HasConnections();
+  return Sensor::IsActive() ||
+    (this->imagePub && this->imagePub->HasConnections());
 }
diff --git a/gazebo/sensors/CameraSensor.hh b/gazebo/sensors/CameraSensor.hh
index 57a55bc..4e2b1f9 100644
--- a/gazebo/sensors/CameraSensor.hh
+++ b/gazebo/sensors/CameraSensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,10 +24,11 @@
 
 #include <string>
 
-#include "sensors/Sensor.hh"
-#include "msgs/MessageTypes.hh"
-#include "transport/TransportTypes.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -40,7 +41,7 @@ namespace gazebo
     /// \brief Basic camera sensor
     ///
     /// This sensor is used for simulating standard monocular cameras
-    class CameraSensor : public Sensor
+    class GAZEBO_VISIBLE CameraSensor : public Sensor
     {
       /// \brief Constructor
       public: CameraSensor();
@@ -48,10 +49,6 @@ namespace gazebo
       /// \brief Destructor
       public: virtual ~CameraSensor();
 
-      /// \brief Set the parent of the sensor
-      /// \param _name The name of the parent
-      public: virtual void SetParent(const std::string &_name);
-
       /// \brief Load the sensor with SDF parameters
       /// \param[in] _sdf SDF Sensor parameters
       /// \param[in] _worldName Name of world to load from
@@ -70,9 +67,8 @@ namespace gazebo
       /// @todo to be implemented
       public: virtual std::string GetTopic() const;
 
-      /// \brief Update the sensor information
-      /// \param[in] _force True if update is forced, false if not
-      protected: virtual void UpdateImpl(bool _force);
+      // Documentation inherited
+      protected: virtual bool UpdateImpl(bool _force);
 
       /// \brief Finalize the camera
       protected: virtual void Fini();
@@ -102,10 +98,17 @@ namespace gazebo
       // Documentation inherited
       public: virtual bool IsActive();
 
+      /// \brief Handle the render event.
+      private: void Render();
+
+      /// \brief Pointer to the camera.
       private: rendering::CameraPtr camera;
-      private: rendering::ScenePtr scene;
 
+      /// \brief Publisher of image messages.
       private: transport::PublisherPtr imagePub;
+
+      /// \brief True if the sensor was rendered.
+      private: bool rendered;
     };
     /// \}
   }
diff --git a/gazebo/sensors/ContactSensor.cc b/gazebo/sensors/ContactSensor.cc
index c6721f9..25596cb 100644
--- a/gazebo/sensors/ContactSensor.cc
+++ b/gazebo/sensors/ContactSensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,10 +25,12 @@
 
 #include "gazebo/transport/Node.hh"
 
-#include "gazebo/physics/Physics.hh"
+#include "gazebo/physics/PhysicsIface.hh"
 #include "gazebo/physics/Contact.hh"
 #include "gazebo/physics/World.hh"
 #include "gazebo/physics/Collision.hh"
+#include "gazebo/physics/ContactManager.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
 
 #include "gazebo/sensors/SensorFactory.hh"
 #include "gazebo/sensors/ContactSensor.hh"
@@ -58,12 +60,12 @@ void ContactSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
   // Create a publisher for the contact information.
   if (this->sdf->HasElement("contact") &&
       this->sdf->GetElement("contact")->HasElement("topic") &&
-      this->sdf->GetElement("contact")->GetValueString("topic")
+      this->sdf->GetElement("contact")->Get<std::string>("topic")
       != "__default_topic__")
   {
     // This will create a topic based on the name specified in SDF.
     this->contactsPub = this->node->Advertise<msgs::Contacts>(
-      this->sdf->GetElement("contact")->GetValueString("topic"));
+      this->sdf->GetElement("contact")->Get<std::string>("topic"), 100);
   }
   else
   {
@@ -73,7 +75,7 @@ void ContactSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
     topicName += this->parentName + "/" + this->GetName();
     boost::replace_all(topicName, "::", "/");
 
-    this->contactsPub = this->node->Advertise<msgs::Contacts>(topicName);
+    this->contactsPub = this->node->Advertise<msgs::Contacts>(topicName, 100);
   }
 }
 
@@ -82,31 +84,41 @@ void ContactSensor::Load(const std::string &_worldName)
 {
   Sensor::Load(_worldName);
 
-  if (!this->contactSub)
-  {
-    this->contactSub = this->node->Subscribe("~/physics/contacts",
-        &ContactSensor::OnContacts, this);
-  }
-
   std::string collisionName;
   std::string collisionScopedName;
 
   sdf::ElementPtr collisionElem =
     this->sdf->GetElement("contact")->GetElement("collision");
 
+  std::string entityName =
+      this->world->GetEntity(this->parentName)->GetScopedName();
+
   // Get all the collision elements
   while (collisionElem)
   {
     // get collision name
-    collisionName = collisionElem->GetValueString();
-    collisionScopedName =
-      this->world->GetEntity(this->parentName)->GetScopedName();
+    collisionName = collisionElem->Get<std::string>();
+    collisionScopedName = entityName;
     collisionScopedName += "::" + collisionName;
 
     this->collisions.push_back(collisionScopedName);
 
     collisionElem = collisionElem->GetNextElement("collision");
   }
+
+  if (!this->collisions.empty())
+  {
+    // request the contact manager to publish messages to a custom topic for
+    // this sensor
+    physics::ContactManager *mgr =
+        this->world->GetPhysicsEngine()->GetContactManager();
+    std::string topic = mgr->CreateFilter(entityName, this->collisions);
+    if (!this->contactSub)
+    {
+      this->contactSub = this->node->Subscribe(topic,
+          &ContactSensor::OnContacts, this);
+    }
+  }
 }
 
 //////////////////////////////////////////////////
@@ -116,15 +128,16 @@ void ContactSensor::Init()
 }
 
 //////////////////////////////////////////////////
-void ContactSensor::UpdateImpl(bool /*_force*/)
+bool ContactSensor::UpdateImpl(bool /*_force*/)
 {
   boost::mutex::scoped_lock lock(this->mutex);
-  std::vector<std::string>::iterator collIter;
-  std::string collision1;
 
   // Don't do anything if there is no new data to process.
-  if (this->incomingContacts.size() == 0)
-    return;
+  if (this->incomingContacts.empty())
+    return false;
+
+  std::vector<std::string>::iterator collIter;
+  std::string collision1;
 
   // Clear the outgoing contact message.
   this->contactsMsg.clear_contact();
@@ -183,11 +196,25 @@ void ContactSensor::UpdateImpl(bool /*_force*/)
     msgs::Set(this->contactsMsg.mutable_time(), this->lastMeasurementTime);
     this->contactsPub->Publish(this->contactsMsg);
   }
+
+  return true;
 }
 
 //////////////////////////////////////////////////
 void ContactSensor::Fini()
 {
+  if (this->world && this->world->GetRunning())
+  {
+    std::string entityName =
+        this->world->GetEntity(this->parentName)->GetScopedName();
+
+    physics::ContactManager *mgr =
+        this->world->GetPhysicsEngine()->GetContactManager();
+    mgr->RemoveFilter(entityName);
+  }
+
+  this->contactSub.reset();
+  this->contactsPub.reset();
   Sensor::Fini();
 }
 
diff --git a/gazebo/sensors/ContactSensor.hh b/gazebo/sensors/ContactSensor.hh
index 278ea28..9af9438 100644
--- a/gazebo/sensors/ContactSensor.hh
+++ b/gazebo/sensors/ContactSensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@
 #include "gazebo/math/Angle.hh"
 #include "gazebo/sensors/Sensor.hh"
 #include "gazebo/physics/Contact.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -45,7 +46,7 @@ namespace gazebo
     /// \class ContactSensor ContactSensor.hh sensors/sensors.hh
     /// \brief Contact sensor. This sensor detects and reports contacts between
     ///  objects
-    class ContactSensor: public Sensor
+    class GAZEBO_VISIBLE ContactSensor: public Sensor
     {
       /// \brief Constructor.
       public: ContactSensor();
@@ -66,9 +67,8 @@ namespace gazebo
       /// \brief Initialize the sensor.
       public: virtual void Init();
 
-      /// \brief Update the sensor information.
-      /// \param[in] _force True if update is forced, false if not.
-      protected: virtual void UpdateImpl(bool _force);
+      // Documentation inherited
+      protected: virtual bool UpdateImpl(bool _force);
 
       /// \brief Finalize the sensor.
       protected: virtual void Fini();
diff --git a/gazebo/sensors/DepthCameraSensor.cc b/gazebo/sensors/DepthCameraSensor.cc
index 9d5087a..c47965b 100644
--- a/gazebo/sensors/DepthCameraSensor.cc
+++ b/gazebo/sensors/DepthCameraSensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,19 +21,20 @@
 
 #include <sstream>
 
-#include "physics/World.hh"
+#include "gazebo/physics/World.hh"
 
-#include "common/Events.hh"
-#include "common/Exception.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Exception.hh"
 
-#include "transport/transport.hh"
+#include "gazebo/transport/transport.hh"
 
-#include "rendering/DepthCamera.hh"
-#include "rendering/Scene.hh"
-#include "rendering/Rendering.hh"
+#include "gazebo/rendering/DepthCamera.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/rendering/RenderEngine.hh"
 
-#include "sensors/SensorFactory.hh"
-#include "sensors/DepthCameraSensor.hh"
+#include "gazebo/sensors/SensorFactory.hh"
+#include "gazebo/sensors/DepthCameraSensor.hh"
 
 using namespace gazebo;
 using namespace sensors;
@@ -44,6 +45,10 @@ GZ_REGISTER_STATIC_SENSOR("depth", DepthCameraSensor)
 DepthCameraSensor::DepthCameraSensor()
     : Sensor(sensors::IMAGE)
 {
+  this->rendered = false;
+  this->connections.push_back(
+      event::Events::ConnectRender(
+        boost::bind(&DepthCameraSensor::Render, this)));
 }
 
 //////////////////////////////////////////////////
@@ -52,14 +57,8 @@ DepthCameraSensor::~DepthCameraSensor()
 }
 
 //////////////////////////////////////////////////
-void DepthCameraSensor::SetParent(const std::string &_name)
-{
-  Sensor::SetParent(_name);
-}
-
-//////////////////////////////////////////////////
 void DepthCameraSensor::Load(const std::string &_worldName,
-                                   sdf::ElementPtr &_sdf)
+                                   sdf::ElementPtr _sdf)
 {
   Sensor::Load(_worldName, _sdf);
 }
@@ -73,6 +72,13 @@ void DepthCameraSensor::Load(const std::string &_worldName)
 //////////////////////////////////////////////////
 void DepthCameraSensor::Init()
 {
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "Unable to create DepthCameraSensor. Rendering is disabled.\n";
+    return;
+  }
+
   std::string worldName = this->world->GetName();
 
   if (!worldName.empty())
@@ -80,10 +86,10 @@ void DepthCameraSensor::Init()
     this->scene = rendering::get_scene(worldName);
 
     if (!this->scene)
-      this->scene = rendering::create_scene(worldName, false);
+      this->scene = rendering::create_scene(worldName, false, true);
 
     this->camera = this->scene->CreateDepthCamera(
-        this->sdf->GetValueString("name"), false);
+        this->sdf->Get<std::string>("name"), false);
 
     if (!this->camera)
     {
@@ -106,11 +112,17 @@ void DepthCameraSensor::Init()
     this->camera->CreateRenderTexture(this->GetName() + "_RttTex_Image");
     this->camera->CreateDepthTexture(this->GetName() + "_RttTex_Depth");
     this->camera->SetWorldPose(this->pose);
-    this->camera->AttachToVisual(this->parentName, true);
+    this->camera->AttachToVisual(this->parentId, true);
   }
   else
     gzerr << "No world name\n";
 
+  // Disable clouds and moon on server side until fixed and also to improve
+  // performance
+  this->scene->SetSkyXMode(rendering::Scene::GZ_SKYX_ALL &
+      ~rendering::Scene::GZ_SKYX_CLOUDS &
+      ~rendering::Scene::GZ_SKYX_MOON);
+
   Sensor::Init();
 }
 
@@ -118,7 +130,7 @@ void DepthCameraSensor::Init()
 void DepthCameraSensor::Fini()
 {
   Sensor::Fini();
-  this->camera->Fini();
+  this->scene->RemoveCamera(this->camera->GetName());
   this->camera.reset();
   this->scene.reset();
 }
@@ -130,15 +142,28 @@ void DepthCameraSensor::SetActive(bool value)
 }
 
 //////////////////////////////////////////////////
-void DepthCameraSensor::UpdateImpl(bool /*_force*/)
+void DepthCameraSensor::Render()
+{
+  if (!this->camera || !this->IsActive() || !this->NeedsUpdate())
+    return;
+
+  this->camera->Render();
+
+  this->rendered = true;
+  this->lastMeasurementTime = this->scene->GetSimTime();
+}
+
+//////////////////////////////////////////////////
+bool DepthCameraSensor::UpdateImpl(bool /*_force*/)
 {
   // Sensor::Update(force);
-  if (this->camera)
-  {
-    this->camera->Render();
-    this->camera->PostRender();
-    this->lastMeasurementTime = this->world->GetSimTime();
-  }
+  if (!this->rendered)
+    return false;
+
+  this->camera->PostRender();
+
+  this->rendered = false;
+  return true;
 }
 
 //////////////////////////////////////////////////
@@ -147,4 +172,3 @@ bool DepthCameraSensor::SaveFrame(const std::string &_filename)
   this->SetActive(true);
   return this->camera->SaveFrame(_filename);
 }
-
diff --git a/gazebo/sensors/DepthCameraSensor.hh b/gazebo/sensors/DepthCameraSensor.hh
index 8d5edc4..1f4c11d 100644
--- a/gazebo/sensors/DepthCameraSensor.hh
+++ b/gazebo/sensors/DepthCameraSensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,9 +24,10 @@
 
 #include <string>
 
-#include "sensors/Sensor.hh"
-#include "msgs/MessageTypes.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/msgs/MessageTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -40,7 +41,7 @@ namespace gazebo
     /// \{
     /// \brief Depth camera sensor
     /// This sensor is used for simulating standard monocular cameras
-    class DepthCameraSensor : public Sensor
+    class GAZEBO_VISIBLE DepthCameraSensor : public Sensor
     {
       /// \brief Constructor
       public: DepthCameraSensor();
@@ -48,15 +49,11 @@ namespace gazebo
       /// \brief Destructor
       public: virtual ~DepthCameraSensor();
 
-      /// \brief Set the parent of the sensor
-      /// \param[in] _name Name of parent
-      public: virtual void SetParent(const std::string &_name);
-
       /// \brief Load the sensor with SDF parameters
       /// \param[in] _sdf SDF Sensor parameters
       /// \param[in] _worldName Name of world to load from
       protected: virtual void Load(const std::string &_worldName,
-                                   sdf::ElementPtr &_sdf);
+                                   sdf::ElementPtr _sdf);
 
       /// \brief Load the sensor with default parameters
       /// \param[in] _worldName Name of world to load from
@@ -65,9 +62,8 @@ namespace gazebo
       /// \brief Initialize the camera
       protected: virtual void Init();
 
-      /// \brief Update the sensor information
-      /// \param[in] _force True if update is forced, false if not
-      protected: virtual void UpdateImpl(bool _force);
+      // Documentation inherited
+      protected: virtual bool UpdateImpl(bool _force);
 
       /// Finalize the camera
       protected: virtual void Fini();
@@ -86,13 +82,16 @@ namespace gazebo
       /// \return True if saved, false if not
       public: bool SaveFrame(const std::string &_filename);
 
+      /// \brief Handle the render event.
+      private: void Render();
+
+      /// \brief Pointer to the camera.
       private: rendering::DepthCameraPtr camera;
 
-      private: rendering::ScenePtr scene;
+      /// \brief True if the sensor was rendered.
+      private: bool rendered;
     };
     /// \}
   }
 }
 #endif
-
-
diff --git a/gazebo/sensors/ForceTorqueSensor.cc b/gazebo/sensors/ForceTorqueSensor.cc
new file mode 100644
index 0000000..863d6a2
--- /dev/null
+++ b/gazebo/sensors/ForceTorqueSensor.cc
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/Joint.hh"
+
+#include "gazebo/common/Assert.hh"
+
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
+#include "gazebo/msgs/msgs.hh"
+
+#include "gazebo/sensors/SensorFactory.hh"
+#include "gazebo/sensors/ForceTorqueSensor.hh"
+
+using namespace gazebo;
+using namespace sensors;
+
+GZ_REGISTER_STATIC_SENSOR("force_torque", ForceTorqueSensor)
+
+//////////////////////////////////////////////////
+ForceTorqueSensor::ForceTorqueSensor()
+: Sensor(sensors::OTHER)
+{
+}
+
+//////////////////////////////////////////////////
+ForceTorqueSensor::~ForceTorqueSensor()
+{
+}
+
+//////////////////////////////////////////////////
+std::string ForceTorqueSensor::GetTopic() const
+{
+  std::string topicName = "~/";
+  topicName += this->parentName + "/" + this->GetName() + "/wrench";
+  boost::replace_all(topicName, "::", "/");
+
+  return topicName;
+}
+
+//////////////////////////////////////////////////
+void ForceTorqueSensor::Load(const std::string &_worldName)
+{
+  Sensor::Load(_worldName);
+  GZ_ASSERT(this->world != NULL,
+      "SonarSensor did not get a valid World pointer");
+
+  this->parentJoint = boost::dynamic_pointer_cast<physics::Joint>(
+      this->world->GetByName(this->parentName));
+
+  if (!this->parentJoint)
+  {
+    gzerr << "Parent of a force torque sensor[" << this->GetName()
+          << "] Must be a joint\n";
+    return;
+  }
+
+  this->wrenchPub = this->node->Advertise<msgs::WrenchStamped>(
+      this->GetTopic());
+}
+
+//////////////////////////////////////////////////
+void ForceTorqueSensor::Init()
+{
+  Sensor::Init();
+  this->parentJoint->SetProvideFeedback(true);
+}
+
+//////////////////////////////////////////////////
+void ForceTorqueSensor::Fini()
+{
+  this->wrenchPub.reset();
+  Sensor::Fini();
+}
+
+//////////////////////////////////////////////////
+physics::JointPtr ForceTorqueSensor::GetJoint() const
+{
+  return this->parentJoint;
+}
+
+//////////////////////////////////////////////////
+math::Vector3 ForceTorqueSensor::GetForce() const
+{
+  return msgs::Convert(this->wrenchMsg.wrench().force());
+}
+
+//////////////////////////////////////////////////
+math::Vector3 ForceTorqueSensor::GetTorque() const
+{
+  return msgs::Convert(this->wrenchMsg.wrench().torque());
+}
+
+//////////////////////////////////////////////////
+bool ForceTorqueSensor::UpdateImpl(bool /*_force*/)
+{
+  boost::mutex::scoped_lock lock(this->mutex);
+
+  this->lastMeasurementTime = this->world->GetSimTime();
+  msgs::Set(this->wrenchMsg.mutable_time(), this->lastMeasurementTime);
+
+  physics::JointWrench wrench = this->parentJoint->GetForceTorque(0u);
+
+  // Get the force and torque in the parent frame.
+  msgs::Set(this->wrenchMsg.mutable_wrench()->mutable_force(),
+      wrench.body2Force);
+  msgs::Set(this->wrenchMsg.mutable_wrench()->mutable_torque(),
+      wrench.body2Torque);
+
+  this->update(this->wrenchMsg);
+
+  if (this->wrenchPub)
+    this->wrenchPub->Publish(this->wrenchMsg);
+
+  return true;
+}
+
+//////////////////////////////////////////////////
+bool ForceTorqueSensor::IsActive()
+{
+  return Sensor::IsActive() || this->wrenchPub->HasConnections();
+}
diff --git a/gazebo/sensors/ForceTorqueSensor.hh b/gazebo/sensors/ForceTorqueSensor.hh
new file mode 100644
index 0000000..ea98151
--- /dev/null
+++ b/gazebo/sensors/ForceTorqueSensor.hh
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _FORCETORQUESENSOR_HH_
+#define _FORCETORQUESENSOR_HH_
+
+#include <string>
+
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  /// \ingroup gazebo_sensors
+  /// \brief Sensors namespace
+  namespace sensors
+  {
+    /// \addtogroup gazebo_sensors
+    /// \{
+
+    /// \class ForceTorqueSensor ForceTorqueSensor.hh sensors/sensors.hh
+    /// \brief Sensor for measure force and torque on a joint.
+    class GAZEBO_VISIBLE ForceTorqueSensor: public Sensor
+    {
+      /// \brief Constructor.
+      public: ForceTorqueSensor();
+
+      /// \brief Destructor.
+      public: virtual ~ForceTorqueSensor();
+
+      // Documentation inherited.
+      public: virtual void Load(const std::string &_worldName);
+
+      // Documentation inherited.
+      public: virtual void Init();
+
+      // Documentation inherited.
+      public: virtual std::string GetTopic() const;
+
+      /// \brief Get the current joint torque.
+      /// \return The latested measured torque.
+      public: math::Vector3 GetTorque() const;
+
+      /// \brief Get the current joint force.
+      /// \return The latested measured force.
+      public: math::Vector3 GetForce() const;
+
+      /// \brief Get Parent Joint
+      /// \return Pointer to the joint containing this sensor
+      public: physics::JointPtr GetJoint() const;
+
+      // Documentation inherited.
+      public: virtual bool IsActive();
+
+      /// \brief Connect a to the  update signal.
+      /// \param[in] _subscriber Callback function.
+      /// \return The connection, which must be kept in scope.
+      public: template<typename T>
+              event::ConnectionPtr ConnectUpdate(T _subscriber)
+              {return update.Connect(_subscriber);}
+
+      /// \brief Disconnect from the update signal.
+      /// \param[in] _conn Connection to remove.
+      public: void DisconnectUpdate(event::ConnectionPtr &_conn)
+              {update.Disconnect(_conn);}
+
+      // Documentation inherited.
+      protected: virtual bool UpdateImpl(bool _force);
+
+      // Documentation inherited.
+      protected: virtual void Fini();
+
+      /// \brief Update event.
+      protected: event::EventT<void(msgs::WrenchStamped)> update;
+
+      /// \brief Parent joint, from which we get force torque info.
+      private: physics::JointPtr parentJoint;
+
+      /// \brief Publishes the wrenchMsg.
+      private: transport::PublisherPtr wrenchPub;
+
+      /// \brief Message the store the current force torque info.
+      private: msgs::WrenchStamped wrenchMsg;
+
+      /// \brief Mutex to protect the wrench message
+      private: boost::mutex mutex;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/sensors/ForceTorqueSensor_TEST.cc b/gazebo/sensors/ForceTorqueSensor_TEST.cc
new file mode 100644
index 0000000..97a9e83
--- /dev/null
+++ b/gazebo/sensors/ForceTorqueSensor_TEST.cc
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "test/ServerFixture.hh"
+
+using namespace gazebo;
+class ForceTorqueSensor_TEST : public ServerFixture
+{
+};
+
+static std::string forceTorqueSensorString =
+"<sdf version='1.4'>"
+"  <sensor name='force_torque' type='force_torque'>"
+"    <update_rate>30</update_rate>"
+"    <always_on>true</always_on>"
+"  </sensor>"
+"</sdf>";
+
+/////////////////////////////////////////////////
+/// \brief Test Creation of a ForceTorque sensor
+TEST_F(ForceTorqueSensor_TEST, CreateForceTorque)
+{
+  Load("worlds/pioneer2dx.world", true);
+
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+
+  sdf::ElementPtr sdf(new sdf::Element);
+  sdf::initFile("sensor.sdf", sdf);
+  sdf::readString(forceTorqueSensorString, sdf);
+
+  physics::WorldPtr world = physics::get_world("default");
+  physics::ModelPtr model = world->GetModel("pioneer2dx");
+  physics::JointPtr joint = model->GetJoint("left_wheel_hinge");
+
+  // Create the force torque sensor
+  std::string sensorName = mgr->CreateSensor(sdf, "default",
+      "pioneer2dx::left_wheel_hinge", joint->GetId());
+
+  // Make sure the returned sensor name is correct
+  EXPECT_EQ(sensorName,
+      std::string("default::pioneer2dx::left_wheel_hinge::force_torque"));
+
+  // Update the sensor manager so that it can process new sensors.
+  mgr->Update();
+
+  // Get a pointer to the force torque sensor
+  sensors::ForceTorqueSensorPtr sensor =
+    boost::dynamic_pointer_cast<sensors::ForceTorqueSensor>(
+        mgr->GetSensor(sensorName));
+
+  // Make sure the above dynamic cast worked.
+  EXPECT_TRUE(sensor != NULL);
+
+  EXPECT_EQ(sensor->GetTorque(), math::Vector3(0, 0, 0));
+  EXPECT_EQ(sensor->GetForce(), math::Vector3(0, 0, 0));
+
+  EXPECT_TRUE(sensor->IsActive());
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/sensors/GaussianNoiseModel.cc b/gazebo/sensors/GaussianNoiseModel.cc
new file mode 100644
index 0000000..ebaf002
--- /dev/null
+++ b/gazebo/sensors/GaussianNoiseModel.cc
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/math/special_functions/round.hpp>
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/math/Rand.hh"
+#include "gazebo/rendering/ogre_gazebo.h"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/sensors/GaussianNoiseModel.hh"
+
+namespace gazebo
+{
+  // We'll create an instance of this class for each camera, to be used to
+  // inject random values on each render call.
+  class GaussianNoiseCompositorListener
+    : public Ogre::CompositorInstance::Listener
+  {
+    /// \brief Constructor, setting mean and standard deviation.
+    public: GaussianNoiseCompositorListener(double _mean, double _stddev):
+        mean(_mean), stddev(_stddev) {}
+
+    /// \brief Callback that OGRE will invoke for us on each render call
+    /// \param[in] _passID OGRE material pass ID.
+    /// \param[in] _mat Pointer to OGRE material.
+    public: virtual void notifyMaterialRender(unsigned int _passId,
+                                              Ogre::MaterialPtr &_mat)
+    {
+      GZ_ASSERT(!_mat.isNull(), "Null OGRE material");
+      // modify material here (wont alter the base material!), called for
+      // every drawn geometry instance (i.e. compositor render_quad)
+
+      // Sample three values within the range [0,1.0] and set them for use in
+      // the fragment shader, which will interpret them as offsets from (0,0)
+      // to use when computing pseudo-random values.
+      Ogre::Vector3 offsets(math::Rand::GetDblUniform(0.0, 1.0),
+                            math::Rand::GetDblUniform(0.0, 1.0),
+                            math::Rand::GetDblUniform(0.0, 1.0));
+      // These calls are setting parameters that are declared in two places:
+      // 1. media/materials/scripts/gazebo.material, in
+      //    fragment_program Gazebo/GaussianCameraNoiseFS
+      // 2. media/materials/scripts/camera_noise_gaussian_fs.glsl
+      Ogre::Technique *technique = _mat->getTechnique(0);
+      GZ_ASSERT(technique, "Null OGRE material technique");
+      Ogre::Pass *pass = technique->getPass(_passId);
+      GZ_ASSERT(pass, "Null OGRE material pass");
+      Ogre::GpuProgramParametersSharedPtr params =
+          pass->getFragmentProgramParameters();
+      GZ_ASSERT(!params.isNull(), "Null OGRE material GPU parameters");
+
+      params->setNamedConstant("offsets", offsets);
+      params->setNamedConstant("mean", static_cast<Ogre::Real>(this->mean));
+      params->setNamedConstant("stddev", static_cast<Ogre::Real>(this->stddev));
+    }
+
+    /// \brief Mean that we'll pass down to the GLSL fragment shader.
+    private: double mean;
+    /// \brief Standard deviation that we'll pass down to the GLSL fragment
+    /// shader.
+    private: double stddev;
+  };
+}  // namespace gazebo
+
+using namespace gazebo;
+using namespace sensors;
+
+//////////////////////////////////////////////////
+GaussianNoiseModel::GaussianNoiseModel()
+  : Noise(Noise::GAUSSIAN),
+    mean(0.0),
+    stdDev(0.0),
+    bias(0.0),
+    precision(0.0),
+    quantized(false)
+{
+}
+
+//////////////////////////////////////////////////
+GaussianNoiseModel::~GaussianNoiseModel()
+{
+}
+
+//////////////////////////////////////////////////
+void GaussianNoiseModel::Load(sdf::ElementPtr _sdf)
+{
+  Noise::Load(_sdf);
+
+  this->mean = _sdf->Get<double>("mean");
+  this->stdDev = _sdf->Get<double>("stddev");
+  // Sample the bias
+  double biasMean = 0;
+  double biasStdDev = 0;
+  if (_sdf->HasElement("bias_mean"))
+    biasMean = _sdf->Get<double>("bias_mean");
+  if (_sdf->HasElement("bias_stddev"))
+    biasStdDev = _sdf->Get<double>("bias_stddev");
+  this->bias = math::Rand::GetDblNormal(biasMean, biasStdDev);
+  // With equal probability, we pick a negative bias (by convention,
+  // rateBiasMean should be positive, though it would work fine if
+  // negative).
+  if (math::Rand::GetDblUniform() < 0.5)
+    this->bias = -this->bias;
+  gzlog << "applying Gaussian noise model with mean " << this->mean
+    << ", stddev " << this->stdDev
+    << ", bias " << this->bias << std::endl;
+
+  if (_sdf->HasElement("precision"))
+  {
+    this->precision = _sdf->Get<double>("precision");
+    if (this->precision < 0)
+    {
+      gzerr << "Noise precision cannot be less than 0" << std::endl;
+    }
+    else if (!math::equal(this->precision, 0.0, 1e-6))
+    {
+      this->quantized = true;
+    }
+  }
+}
+
+//////////////////////////////////////////////////
+void GaussianNoiseModel::Fini()
+{
+  Noise::Fini();
+}
+
+//////////////////////////////////////////////////
+double GaussianNoiseModel::ApplyImpl(double _in)
+{
+  // Add independent (uncorrelated) Gaussian noise to each input value.
+  double whiteNoise = math::Rand::GetDblNormal(this->mean, this->stdDev);
+  double output = _in + this->bias + whiteNoise;
+  if (this->quantized)
+  {
+    // Apply this->precision
+    if (!math::equal(this->precision, 0.0, 1e-6))
+    {
+      output = boost::math::round(output / this->precision) * this->precision;
+    }
+  }
+  return output;
+}
+
+//////////////////////////////////////////////////
+double GaussianNoiseModel::GetMean() const
+{
+  return this->mean;
+}
+
+//////////////////////////////////////////////////
+double GaussianNoiseModel::GetStdDev() const
+{
+  return this->stdDev;
+}
+
+//////////////////////////////////////////////////
+double GaussianNoiseModel::GetBias() const
+{
+  return this->bias;
+}
+
+//////////////////////////////////////////////////
+ImageGaussianNoiseModel::ImageGaussianNoiseModel()
+  : GaussianNoiseModel()
+{
+}
+
+//////////////////////////////////////////////////
+ImageGaussianNoiseModel::~ImageGaussianNoiseModel()
+{
+}
+
+//////////////////////////////////////////////////
+void ImageGaussianNoiseModel::Load(sdf::ElementPtr _sdf)
+{
+  GaussianNoiseModel::Load(_sdf);
+}
+
+//////////////////////////////////////////////////
+void ImageGaussianNoiseModel::SetCamera(rendering::CameraPtr _camera)
+{
+  GZ_ASSERT(_camera, "Unable to apply gaussian noise, camera is NULL");
+
+  this->gaussianNoiseCompositorListener.reset(new
+        GaussianNoiseCompositorListener(this->mean, this->stdDev));
+
+  this->gaussianNoiseInstance =
+    Ogre::CompositorManager::getSingleton().addCompositor(
+      _camera->GetViewport(), "CameraNoise/Gaussian");
+  this->gaussianNoiseInstance->setEnabled(true);
+  this->gaussianNoiseInstance->addListener(
+    this->gaussianNoiseCompositorListener.get());
+}
+
+//////////////////////////////////////////////////
+void ImageGaussianNoiseModel::Fini()
+{
+  GaussianNoiseModel::Fini();
+  if (this->gaussianNoiseCompositorListener)
+  {
+    this->gaussianNoiseInstance->removeListener(
+      this->gaussianNoiseCompositorListener.get());
+  }
+}
diff --git a/gazebo/sensors/GaussianNoiseModel.hh b/gazebo/sensors/GaussianNoiseModel.hh
new file mode 100644
index 0000000..5aff811
--- /dev/null
+++ b/gazebo/sensors/GaussianNoiseModel.hh
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_GAUSSIAN_NOISE_MODEL_HH_
+#define _GAZEBO_GAUSSIAN_NOISE_MODEL_HH_
+
+#include <vector>
+#include <string>
+
+#include <sdf/sdf.hh>
+
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/sensors/Noise.hh"
+#include "gazebo/util/system.hh"
+
+namespace Ogre
+{
+  class CompositorInstance;
+}
+
+namespace gazebo
+{
+  class GaussianNoiseCompositorListener;
+
+  namespace sensors
+  {
+    /// \class GaussianNoiseModel
+    /// \brief Gaussian noise class
+    class GAZEBO_VISIBLE GaussianNoiseModel : public Noise
+    {
+        /// \brief Constructor.
+        public: GaussianNoiseModel();
+
+        /// \brief Destructor.
+        public: virtual ~GaussianNoiseModel();
+
+        // Documentation inherited.
+        public: virtual void Load(sdf::ElementPtr _sdf);
+
+        // Documentation inherited.
+        public: virtual void Fini();
+
+        // Documentation inherited.
+        public: double ApplyImpl(double _in);
+
+        /// \brief Accessor for mean.
+        /// \return Mean of Gaussian noise.
+        public: double GetMean() const;
+
+        /// \brief Accessor for stddev.
+        /// \return Standard deviation of Gaussian noise.
+        public: double GetStdDev() const;
+
+        /// \brief Accessor for bias.
+        /// \return Bias on output.
+        public: double GetBias() const;
+
+        /// \brief If type starts with GAUSSIAN, the mean of the distribution
+        /// from which we sample when adding noise.
+        protected: double mean;
+
+        /// \brief If type starts with GAUSSIAN, the standard deviation of the
+        /// distribution from which we sample when adding noise.
+        protected: double stdDev;
+
+        /// \brief If type starts with GAUSSIAN, the bias we'll add.
+        protected: double bias;
+
+        /// \brief If type==GAUSSIAN_QUANTIZED, the precision to which
+        /// the output signal is rounded.
+        protected: double precision;
+
+        /// \brief True if the type is GAUSSIAN_QUANTIZED
+        protected: bool quantized;
+    };
+
+    /// \class GaussianNoiseModel
+    /// \brief Gaussian noise class for image sensors
+    class GAZEBO_VISIBLE ImageGaussianNoiseModel : public GaussianNoiseModel
+    {
+      /// \brief Constructor.
+      public: ImageGaussianNoiseModel();
+
+      /// \brief Destructor.
+      public: virtual ~ImageGaussianNoiseModel();
+
+      // Documentation inherited.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      // Documentation inherited.
+      public: virtual void Fini();
+
+      // Documentation inherited.
+      public: virtual void SetCamera(rendering::CameraPtr _camera);
+
+      /// \brief Gaussian noise compositor.
+      public: Ogre::CompositorInstance *gaussianNoiseInstance;
+
+      /// \brief Gaussian noise compositor listener
+      public: boost::shared_ptr<GaussianNoiseCompositorListener>
+        gaussianNoiseCompositorListener;
+    };
+    /// \}
+  }
+}
+
+#endif
diff --git a/gazebo/sensors/GpsSensor.cc b/gazebo/sensors/GpsSensor.cc
new file mode 100644
index 0000000..4941530
--- /dev/null
+++ b/gazebo/sensors/GpsSensor.cc
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/sensors/SensorFactory.hh"
+
+#include "gazebo/common/common.hh"
+#include "gazebo/math/gzmath.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/Noise.hh"
+#include "gazebo/transport/transport.hh"
+
+#include "gazebo/sensors/GpsSensor.hh"
+
+using namespace gazebo;
+using namespace sensors;
+
+GZ_REGISTER_STATIC_SENSOR("gps", GpsSensor)
+
+/////////////////////////////////////////////////
+GpsSensor::GpsSensor()
+: Sensor(sensors::OTHER)
+{
+}
+
+/////////////////////////////////////////////////
+GpsSensor::~GpsSensor()
+{
+  this->horizontalPositionNoise.reset();
+  this->verticalPositionNoise.reset();
+  this->horizontalVelocityNoise.reset();
+  this->verticalVelocityNoise.reset();
+}
+
+/////////////////////////////////////////////////
+void GpsSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
+{
+  Sensor::Load(_worldName, _sdf);
+}
+
+/////////////////////////////////////////////////
+void GpsSensor::Load(const std::string &_worldName)
+{
+  Sensor::Load(_worldName);
+
+  physics::EntityPtr parentEntity = this->world->GetEntity(this->parentName);
+  this->parentLink = boost::dynamic_pointer_cast<physics::Link>(parentEntity);
+
+  this->lastGpsMsg.set_link_name(this->parentName);
+
+  this->topicName = "~/" + this->parentName + '/' + this->GetName();
+  if (this->sdf->HasElement("topic"))
+    this->topicName += '/' + this->sdf->Get<std::string>("topic");
+  boost::replace_all(this->topicName, "::", "/");
+
+  this->gpsPub = this->node->Advertise<msgs::GPS>(this->topicName, 50);
+
+  // Parse sdf noise parameters
+  sdf::ElementPtr gpsElem = this->sdf->GetElement("gps");
+
+  // Load position noise parameters
+  {
+    sdf::ElementPtr posElem = gpsElem->GetElement("position_sensing");
+    this->horizontalPositionNoise = NoiseFactory::NewNoiseModel(
+      posElem->GetElement("horizontal")->GetElement("noise"));
+    this->verticalPositionNoise = NoiseFactory::NewNoiseModel(
+      posElem->GetElement("vertical")->GetElement("noise"));
+  }
+
+  // Load velocity noise parameters
+  {
+    sdf::ElementPtr velElem = gpsElem->GetElement("velocity_sensing");
+    this->horizontalVelocityNoise = NoiseFactory::NewNoiseModel(
+      velElem->GetElement("horizontal")->GetElement("noise"));
+    this->verticalVelocityNoise = NoiseFactory::NewNoiseModel(
+      velElem->GetElement("vertical")->GetElement("noise"));
+  }
+}
+
+/////////////////////////////////////////////////
+void GpsSensor::Fini()
+{
+  Sensor::Fini();
+  this->parentLink.reset();
+  this->sphericalCoordinates.reset();
+}
+
+//////////////////////////////////////////////////
+void GpsSensor::Init()
+{
+  Sensor::Init();
+
+  this->sphericalCoordinates = this->world->GetSphericalCoordinates();
+}
+
+//////////////////////////////////////////////////
+bool GpsSensor::UpdateImpl(bool /*_force*/)
+{
+  // Get latest pose information
+  if (this->parentLink)
+  {
+    // Measure position and apply noise
+    {
+      // Get postion in Cartesian gazebo frame
+      math::Pose gpsPose = this->pose + this->parentLink->GetWorldPose();
+
+      // Apply position noise before converting to global frame
+      gpsPose.pos.x = this->horizontalPositionNoise->Apply(gpsPose.pos.x);
+      gpsPose.pos.y = this->horizontalPositionNoise->Apply(gpsPose.pos.y);
+      gpsPose.pos.z = this->verticalPositionNoise->Apply(gpsPose.pos.z);
+
+      // Convert to global frames
+      math::Vector3 spherical = this->sphericalCoordinates->
+        SphericalFromLocal(gpsPose.pos);
+      this->lastGpsMsg.set_latitude_deg(spherical.x);
+      this->lastGpsMsg.set_longitude_deg(spherical.y);
+      this->lastGpsMsg.set_altitude(spherical.z);
+    }
+
+    // Measure velocity and apply noise
+    {
+      math::Vector3 gpsVelocity =
+        this->parentLink->GetWorldLinearVel(this->pose.pos);
+
+      // Convert to global frame
+      gpsVelocity = this->sphericalCoordinates->GlobalFromLocal(gpsVelocity);
+
+      // Apply noise after converting to global frame
+      gpsVelocity.x = this->horizontalVelocityNoise->Apply(gpsVelocity.x);
+      gpsVelocity.y = this->horizontalVelocityNoise->Apply(gpsVelocity.y);
+      gpsVelocity.z = this->verticalVelocityNoise->Apply(gpsVelocity.z);
+
+      this->lastGpsMsg.set_velocity_east(gpsVelocity.x);
+      this->lastGpsMsg.set_velocity_north(gpsVelocity.y);
+      this->lastGpsMsg.set_velocity_up(gpsVelocity.z);
+    }
+  }
+  this->lastMeasurementTime = this->world->GetSimTime();
+  msgs::Set(this->lastGpsMsg.mutable_time(), this->lastMeasurementTime);
+
+  if (this->gpsPub)
+    this->gpsPub->Publish(this->lastGpsMsg);
+
+  return true;
+}
+
+//////////////////////////////////////////////////
+math::Angle GpsSensor::GetLongitude() const
+{
+  math::Angle angle;
+  angle.SetFromDegree(this->lastGpsMsg.longitude_deg());
+  return angle;
+}
+
+//////////////////////////////////////////////////
+math::Angle GpsSensor::GetLatitude() const
+{
+  math::Angle angle;
+  angle.SetFromDegree(this->lastGpsMsg.latitude_deg());
+  return angle;
+}
+
+//////////////////////////////////////////////////
+double GpsSensor::GetAltitude() const
+{
+  return this->lastGpsMsg.altitude();
+}
diff --git a/gazebo/sensors/GpsSensor.hh b/gazebo/sensors/GpsSensor.hh
new file mode 100644
index 0000000..fe714cc
--- /dev/null
+++ b/gazebo/sensors/GpsSensor.hh
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GPSSENSOR_HH_
+#define _GPSSENSOR_HH_
+
+#include <string>
+
+#include <sdf/sdf.hh>
+
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/sensors/SensorTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace sensors
+  {
+    /// \addtogroup gazebo_sensors
+    /// \{
+
+    /// \class GpsSensor GpsSensor.hh sensors/sensors.hh
+    /// \brief GpsSensor to provide position measurement.
+    class GAZEBO_VISIBLE GpsSensor: public Sensor
+    {
+      /// \brief Constructor.
+      public: GpsSensor();
+
+      /// \brief Destructor.
+      public: virtual ~GpsSensor();
+
+      // Documentation inherited
+      public: virtual void Load(const std::string & _worldName,
+                                sdf::ElementPtr _sdf);
+
+      // Documentation inherited
+      public: virtual void Load(const std::string & _worldName);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      // Documentation inherited
+      protected: virtual bool UpdateImpl(bool _force);
+
+      // Documentation inherited
+      public: virtual void Fini();
+
+      /// \brief Accessor for current longitude angle
+      /// \return Current longitude angle.
+      public: math::Angle GetLongitude() const;
+
+      /// \brief Accessor for current latitude angle
+      /// \return Current latitude angle.
+      public: math::Angle GetLatitude() const;
+
+      /// \brief Accessor for current altitude
+      /// \return Current altitude above sea level.
+      public: double GetAltitude() const;
+
+      /// \brief Noise attributes for horizontal position measurement.
+      private: NoisePtr horizontalPositionNoise;
+
+      /// \brief Noise attributes for vertical position measurement.
+      private: NoisePtr verticalPositionNoise;
+
+      /// \brief Noise attributes for horizontal velocity measurement.
+      private: NoisePtr horizontalVelocityNoise;
+
+      /// \brief Noise attributes for vertical velocity measurement.
+      private: NoisePtr verticalVelocityNoise;
+
+      /// \brief GPS data publisher.
+      private: transport::PublisherPtr gpsPub;
+
+      /// \brief Topic name for GPS data publisher.
+      private: std::string topicName;
+
+      /// \brief Parent link of this sensor.
+      private: physics::LinkPtr parentLink;
+
+      /// \brief Pointer to SphericalCoordinates converter.
+      private: common::SphericalCoordinatesPtr sphericalCoordinates;
+
+      /// \brief Stores most recent GPS sensor data.
+      private: msgs::GPS lastGpsMsg;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/sensors/GpsSensor_TEST.cc b/gazebo/sensors/GpsSensor_TEST.cc
new file mode 100644
index 0000000..37dc627
--- /dev/null
+++ b/gazebo/sensors/GpsSensor_TEST.cc
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "test/ServerFixture.hh"
+
+using namespace gazebo;
+class GpsSensor_TEST : public ServerFixture
+{
+};
+
+static std::string gpsSensorString =
+"<sdf version='1.4'>"
+"  <sensor name='gps' type='gps'>"
+"    <always_on>1</always_on>"
+"    <update_rate>10.000000</update_rate>"
+"    <gps>"
+"      <position_sensing>"
+"        <horizontal>"
+"          <noise type='gaussian_quantized'>"
+"            <mean>0</mean>"
+"            <stddev>1</stddev>"
+"            <bias_mean>3</bias_mean>"
+"            <bias_stddev>1</bias_stddev>"
+"            <precision>0.5</precision>"
+"          </noise>"
+"        </horizontal>"
+"        <vertical>"
+"          <noise type='gaussian_quantized'>"
+"            <mean>0</mean>"
+"            <stddev>1</stddev>"
+"            <bias_mean>3</bias_mean>"
+"            <bias_stddev>1</bias_stddev>"
+"            <precision>1.0</precision>"
+"          </noise>"
+"        </vertical>"
+"      </position_sensing>"
+"      <velocity_sensing>"
+"        <horizontal>"
+"          <noise type='gaussian_quantized'>"
+"            <mean>0</mean>"
+"            <stddev>0.1</stddev>"
+"            <bias_mean>0.1</bias_mean>"
+"            <bias_stddev>0.1</bias_stddev>"
+"            <precision>0.1</precision>"
+"          </noise>"
+"        </horizontal>"
+"        <vertical>"
+"          <noise type='gaussian_quantized'>"
+"            <mean>0</mean>"
+"            <stddev>0.2</stddev>"
+"            <bias_mean>0.2</bias_mean>"
+"            <bias_stddev>0.2</bias_stddev>"
+"            <precision>0.2</precision>"
+"          </noise>"
+"        </vertical>"
+"      </velocity_sensing>"
+"    </gps>"
+"  </sensor>"
+"</sdf>";
+
+/////////////////////////////////////////////////
+/// \brief Test Creation of a Gps sensor
+TEST_F(GpsSensor_TEST, CreateGps)
+{
+  Load("worlds/empty.world");
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+
+  sdf::ElementPtr sdf(new sdf::Element);
+  sdf::initFile("sensor.sdf", sdf);
+  sdf::readString(gpsSensorString, sdf);
+
+  // Create the Ray sensor
+  std::string sensorName = mgr->CreateSensor(sdf, "default",
+      "ground_plane::link", 0);
+
+  // Make sure the returned sensor name is correct
+  EXPECT_EQ(sensorName, std::string("default::ground_plane::link::gps"));
+
+  // Update the sensor manager so that it can process new sensors.
+  mgr->Update();
+
+  // Get a pointer to the gps sensor
+  sensors::GpsSensorPtr sensor =
+    boost::dynamic_pointer_cast<sensors::GpsSensor>(
+        mgr->GetSensor(sensorName));
+
+  // Make sure the above dynamic cast worked.
+  EXPECT_TRUE(sensor != NULL);
+
+  EXPECT_DOUBLE_EQ(sensor->GetLatitude().Radian(), 0.0);
+  EXPECT_DOUBLE_EQ(sensor->GetLongitude().Radian(), 0.0);
+  EXPECT_DOUBLE_EQ(sensor->GetAltitude(), 0.0);
+
+  EXPECT_TRUE(sensor->IsActive());
+
+  physics::WorldPtr world = physics::get_world();
+  ASSERT_TRUE(world != NULL);
+  world->Step(100);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/sensors/GpuRaySensor.cc b/gazebo/sensors/GpuRaySensor.cc
index 8c49292..19b9bf2 100644
--- a/gazebo/sensors/GpuRaySensor.cc
+++ b/gazebo/sensors/GpuRaySensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,19 +19,25 @@
  * Date: 29 March 2012
 */
 
-#include "physics/World.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Entity.hh"
+#include "gazebo/physics/Model.hh"
 
-#include "common/Exception.hh"
-#include "common/Events.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Events.hh"
 
-#include "transport/transport.hh"
+#include "gazebo/math/Rand.hh"
 
-#include "rendering/Scene.hh"
-#include "rendering/Rendering.hh"
+#include "gazebo/transport/transport.hh"
 
-#include "sensors/SensorFactory.hh"
-#include "sensors/GpuRaySensor.hh"
-#include "rendering/GpuLaser.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/rendering/RenderEngine.hh"
+#include "gazebo/rendering/GpuLaser.hh"
+
+#include "gazebo/sensors/Noise.hh"
+#include "gazebo/sensors/SensorFactory.hh"
+#include "gazebo/sensors/GpuRaySensor.hh"
 
 using namespace gazebo;
 using namespace sensors;
@@ -42,7 +48,11 @@ GZ_REGISTER_STATIC_SENSOR("gpu_ray", GpuRaySensor)
 GpuRaySensor::GpuRaySensor()
     : Sensor(sensors::IMAGE)
 {
+  this->rendered = false;
   this->active = false;
+  this->connections.push_back(
+      event::Events::ConnectRender(
+        boost::bind(&GpuRaySensor::Render, this)));
 }
 
 //////////////////////////////////////////////////
@@ -51,7 +61,17 @@ GpuRaySensor::~GpuRaySensor()
 }
 
 //////////////////////////////////////////////////
-void GpuRaySensor::Load(const std::string &_worldName, sdf::ElementPtr &_sdf)
+std::string GpuRaySensor::GetTopic() const
+{
+  std::string topicName = "~/";
+  topicName += this->parentName + "/" + this->GetName() + "/scan";
+  boost::replace_all(topicName, "::", "/");
+
+  return topicName;
+}
+
+//////////////////////////////////////////////////
+void GpuRaySensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
 {
   Sensor::Load(_worldName, _sdf);
 }
@@ -61,6 +81,9 @@ void GpuRaySensor::Load(const std::string &_worldName)
 {
   Sensor::Load(_worldName);
 
+  this->scanPub = this->node->Advertise<msgs::LaserScanStamped>(
+      this->GetTopic(), 50);
+
   sdf::ElementPtr rayElem = this->sdf->GetElement("ray");
   this->scanElem = rayElem->GetElement("scan");
   this->horzElem = this->scanElem->GetElement("horizontal");
@@ -80,150 +103,193 @@ void GpuRaySensor::Load(const std::string &_worldName)
   this->horzRangeCount = this->GetRangeCount();
   this->vertRangeCount = this->GetVerticalRangeCount();
 
-  if (this->vertRayCount == 1)
+  // Handle noise model settings.
+  if (rayElem->HasElement("noise"))
   {
-    this->vertRangeCount = 1;
-    this->isHorizontal = true;
+    this->noises.push_back(
+        NoiseFactory::NewNoiseModel(rayElem->GetElement("noise"),
+        this->GetType()));
   }
-  else
-    this->isHorizontal = false;
 
-  this->rangeCountRatio = this->horzRangeCount / this->vertRangeCount;
+  this->parentEntity = this->world->GetEntity(this->parentName);
 
-  this->near = this->GetRangeMin();
-  this->far = this->GetRangeMax();
+  GZ_ASSERT(this->parentEntity != NULL,
+      "Unable to get the parent entity.");
+}
 
-  this->hfov = (this->GetAngleMax() - this->GetAngleMin()).Radian();
-  this->vfov = (this->GetVerticalAngleMax()
-          - this->GetVerticalAngleMin()).Radian();
+//////////////////////////////////////////////////
+void GpuRaySensor::Init()
+{
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "Unable to create GpuRaySensor. Rendering is disabled.\n";
+    return;
+  }
 
-  this->horzHalfAngle =
-    (this->GetAngleMax() + this->GetAngleMin()).Radian() / 2.0;
+  std::string worldName = this->world->GetName();
 
-  this->vertHalfAngle = (this->GetVerticalAngleMax()
-          + this->GetVerticalAngleMin()).Radian() / 2.0;
+  if (!worldName.empty())
+  {
+    this->scene = rendering::get_scene(worldName);
 
-  if (this->hfov > 2 * M_PI)
-    this->hfov = 2*M_PI;
+    if (!this->scene)
+      this->scene = rendering::create_scene(worldName, false, true);
 
-  this->cameraCount = 1;
+    this->laserCam = this->scene->CreateGpuLaser(
+        this->sdf->Get<std::string>("name"), false);
 
-  if (this->hfov > 2.8)
-  {
-    if (this->hfov > 5.6)
-      this->cameraCount = 3;
+    if (!this->laserCam)
+    {
+      gzerr << "Unable to create gpu laser sensor\n";
+      return;
+    }
+    this->laserCam->SetCaptureData(true);
+
+    // initialize GpuLaser from sdf
+    if (this->vertRayCount == 1)
+    {
+      this->vertRangeCount = 1;
+      this->laserCam->SetIsHorizontal(true);
+    }
     else
-      this->cameraCount = 2;
-  }
+      this->laserCam->SetIsHorizontal(false);
 
-  this->hfov /= this->cameraCount;
-  this->horzRayCount /= this->cameraCount;
+    this->rangeCountRatio = this->horzRangeCount / this->vertRangeCount;
 
-  if (this->vfov > M_PI / 2)
-  {
-    gzwarn << "Vertical FOV for block GPU laser is capped at 90 degrees.\n";
-    this->vfov = M_PI / 2;
-    this->SetVerticalAngleMin(this->vertHalfAngle - (this->vfov / 2));
-    this->SetVerticalAngleMax(this->vertHalfAngle + (this->vfov / 2));
-  }
+    this->laserCam->SetNearClip(this->GetRangeMin());
+    this->laserCam->SetFarClip(this->GetRangeMax());
 
-  if ((this->horzRayCount * this->vertRayCount) <
-      (this->horzRangeCount * this->vertRangeCount))
-  {
-    this->horzRayCount = std::max(this->horzRayCount, this->horzRangeCount);
-    this->vertRayCount = std::max(this->vertRayCount, this->vertRangeCount);
-  }
+    this->laserCam->SetHorzFOV(
+      (this->GetAngleMax() - this->GetAngleMin()).Radian());
+    this->laserCam->SetVertFOV((this->GetVerticalAngleMax()
+            - this->GetVerticalAngleMin()).Radian());
 
-  if (this->isHorizontal)
-  {
-    if (this->vertRayCount > 1)
-    {
-      this->chfov = 2 * atan(tan(this->hfov/2) / cos(this->vfov/2));
-      this->cvfov = this->vfov;
-      this->rayCountRatio = tan(this->chfov/2.0) / tan(this->vfov/2.0);
+    this->laserCam->SetHorzHalfAngle(
+      (this->GetAngleMax() + this->GetAngleMin()).Radian() / 2.0);
+
+    this->laserCam->SetVertHalfAngle((this->GetVerticalAngleMax()
+            + this->GetVerticalAngleMin()).Radian() / 2.0);
+
+    if (this->GetHorzFOV() > 2 * M_PI)
+      this->laserCam->SetHorzFOV(2*M_PI);
 
-      if ((this->horzRayCount / this->rayCountRatio) > this->vertRayCount)
-        this->vertRayCount = this->horzRayCount / this->rayCountRatio;
+    this->laserCam->SetCameraCount(1);
+
+    if (this->GetHorzFOV() > 2.8)
+    {
+      if (this->GetHorzFOV() > 5.6)
+        this->laserCam->SetCameraCount(3);
       else
-        this->horzRayCount = this->vertRayCount * this->rayCountRatio;
+        this->laserCam->SetCameraCount(2);
     }
-    else
+
+    this->laserCam->SetHorzFOV(this->GetHorzFOV() / this->GetCameraCount());
+    this->horzRayCount /= this->GetCameraCount();
+
+    if (this->GetVertFOV() > M_PI / 2)
     {
-      this->chfov = this->hfov;
-      this->cvfov = this->vfov;
+      gzwarn << "Vertical FOV for block GPU laser is capped at 90 degrees.\n";
+      this->laserCam->SetVertFOV(M_PI / 2);
+      this->SetVerticalAngleMin(this->laserCam->GetVertHalfAngle() -
+                                (this->GetVertFOV() / 2));
+      this->SetVerticalAngleMax(this->laserCam->GetVertHalfAngle() +
+                                (this->GetVertFOV() / 2));
     }
-  }
-  else
-  {
-    if (this->horzRayCount > 1)
+
+    if ((this->horzRayCount * this->vertRayCount) <
+        (this->horzRangeCount * this->vertRangeCount))
     {
-      this->chfov = this->hfov;
-      this->cvfov = 2 * atan(tan(this->vfov/2) / cos(this->hfov/2));
-      this->rayCountRatio = tan(this->hfov/2.0) / tan(this->cvfov/2.0);
+      this->horzRayCount = std::max(this->horzRayCount, this->horzRangeCount);
+      this->vertRayCount = std::max(this->vertRayCount, this->vertRangeCount);
+    }
 
-      if ((this->horzRayCount / this->rayCountRatio) > this->vertRayCount)
-        this->vertRayCount = this->horzRayCount / this->rayCountRatio;
+    if (this->laserCam->IsHorizontal())
+    {
+      if (this->vertRayCount > 1)
+      {
+        this->laserCam->SetCosHorzFOV(
+          2 * atan(tan(this->GetHorzFOV()/2) / cos(this->GetVertFOV()/2)));
+        this->laserCam->SetCosVertFOV(this->GetVertFOV());
+        this->laserCam->SetRayCountRatio(
+          tan(this->GetCosHorzFOV()/2.0) / tan(this->GetVertFOV()/2.0));
+
+        if ((this->horzRayCount / this->GetRayCountRatio()) >
+            this->vertRayCount)
+          this->vertRayCount = this->horzRayCount / this->GetRayCountRatio();
+        else
+          this->horzRayCount = this->vertRayCount * this->GetRayCountRatio();
+      }
       else
-        this->horzRayCount = this->vertRayCount * this->rayCountRatio;
+      {
+        this->laserCam->SetCosHorzFOV(this->GetHorzFOV());
+        this->laserCam->SetCosVertFOV(this->GetVertFOV());
+      }
     }
     else
     {
-      this->chfov = this->hfov;
-      this->cvfov = this->vfov;
+      if (this->horzRayCount > 1)
+      {
+        this->laserCam->SetCosHorzFOV(this->GetHorzFOV());
+        this->laserCam->SetCosVertFOV(
+          2 * atan(tan(this->GetVertFOV()/2) / cos(this->GetHorzFOV()/2)));
+        this->laserCam->SetRayCountRatio(
+          tan(this->GetHorzFOV()/2.0) / tan(this->GetCosVertFOV()/2.0));
+
+        if ((this->horzRayCount / this->GetRayCountRatio()) >
+            this->vertRayCount)
+          this->vertRayCount = this->horzRayCount / this->GetRayCountRatio();
+        else
+          this->horzRayCount = this->vertRayCount * this->GetRayCountRatio();
+      }
+      else
+      {
+        this->laserCam->SetCosHorzFOV(this->GetHorzFOV());
+        this->laserCam->SetCosVertFOV(this->GetVertFOV());
+      }
     }
-  }
 
-  this->cameraElem.reset(new sdf::Element);
-  sdf::initFile("camera.sdf", this->cameraElem);
+    // Initialize camera sdf for GpuLaser
+    this->cameraElem.reset(new sdf::Element);
+    sdf::initFile("camera.sdf", this->cameraElem);
 
-  this->cameraElem->GetElement("horizontal_fov")->Set(this->chfov);
+    this->cameraElem->GetElement("horizontal_fov")->Set(this->GetCosHorzFOV());
 
-  sdf::ElementPtr ptr = this->cameraElem->GetElement("image");
-  ptr->GetElement("width")->Set(this->horzRayCount);
-  ptr->GetElement("height")->Set(this->vertRayCount);
-  ptr->GetElement("format")->Set("R8G8B8");
+    sdf::ElementPtr ptr = this->cameraElem->GetElement("image");
+    ptr->GetElement("width")->Set(this->horzRayCount);
+    ptr->GetElement("height")->Set(this->vertRayCount);
+    ptr->GetElement("format")->Set("R8G8B8");
 
-  ptr = this->cameraElem->GetElement("clip");
-  ptr->GetElement("near")->Set(this->near);
-  ptr->GetElement("far")->Set(this->far);
-}
-
-//////////////////////////////////////////////////
-void GpuRaySensor::Init()
-{
-  std::string worldName = this->world->GetName();
-
-  if (!worldName.empty())
-  {
-    this->scene = rendering::get_scene(worldName);
-
-    if (!this->scene)
-      this->scene = rendering::create_scene(worldName, false);
-
-    this->laserCam = this->scene->CreateGpuLaser(
-        this->sdf->GetValueString("name"), false);
-
-    if (!this->laserCam)
-    {
-      gzerr << "Unable to create gpu laser sensor\n";
-      return;
-    }
-    this->laserCam->SetCaptureData(true);
+    ptr = this->cameraElem->GetElement("clip");
+    ptr->GetElement("near")->Set(this->laserCam->GetNearClip());
+    ptr->GetElement("far")->Set(this->laserCam->GetFarClip());
 
+    // Load camera sdf for GpuLaser
     this->laserCam->Load(this->cameraElem);
 
+
+    // initialize GpuLaser
     this->laserCam->Init();
     this->laserCam->SetRangeCount(this->horzRangeCount, this->vertRangeCount);
     this->laserCam->SetClipDist(this->GetRangeMin(), this->GetRangeMax());
-    this->laserCam->SetParentSensor(this);
-    this->laserCam->CreateLaserTexture(this->GetName() + "_RttTex_Laser");
-    this->laserCam->CreateRenderTexture(this->GetName() + "_RttTex_Image");
+    this->laserCam->CreateLaserTexture(
+        this->GetScopedName() + "_RttTex_Laser");
+    this->laserCam->CreateRenderTexture(
+        this->GetScopedName() + "_RttTex_Image");
     this->laserCam->SetWorldPose(this->pose);
-    this->laserCam->AttachToVisual(this->parentName, true);
+    this->laserCam->AttachToVisual(this->parentId, true);
+
+    this->laserMsg.mutable_scan()->set_frame(this->parentName);
   }
   else
     gzerr << "No world name\n";
 
+  // Disable clouds and moon on server side until fixed and also to improve
+  // performance
+  this->scene->SetSkyXMode(rendering::Scene::GZ_SKYX_ALL &
+      ~rendering::Scene::GZ_SKYX_CLOUDS &
+      ~rendering::Scene::GZ_SKYX_MOON);
+
   Sensor::Init();
 }
 
@@ -231,7 +297,7 @@ void GpuRaySensor::Init()
 void GpuRaySensor::Fini()
 {
   Sensor::Fini();
-  this->laserCam->Fini();
+  this->scene->RemoveCamera(this->laserCam->GetName());
   this->laserCam.reset();
   this->scene.reset();
 }
@@ -253,43 +319,55 @@ void GpuRaySensor::DisconnectNewLaserFrame(event::ConnectionPtr &_conn)
 //////////////////////////////////////////////////
 unsigned int GpuRaySensor::GetCameraCount() const
 {
-  return this->cameraCount;
+  return this->laserCam->GetCameraCount();
 }
 
 //////////////////////////////////////////////////
 bool GpuRaySensor::IsHorizontal() const
 {
-  return this->isHorizontal;
+  return this->laserCam->IsHorizontal();
+}
+
+//////////////////////////////////////////////////
+double GpuRaySensor::GetHorzHalfAngle() const
+{
+  return this->laserCam->GetHorzHalfAngle();
+}
+
+//////////////////////////////////////////////////
+double GpuRaySensor::GetVertHalfAngle() const
+{
+  return this->laserCam->GetVertHalfAngle();
 }
 
 //////////////////////////////////////////////////
 double GpuRaySensor::GetHorzFOV() const
 {
-  return this->hfov;
+  return this->laserCam->GetHorzFOV();
 }
 
 //////////////////////////////////////////////////
 double GpuRaySensor::GetCosHorzFOV() const
 {
-  return this->chfov;
+  return this->laserCam->GetCosHorzFOV();
 }
 
 //////////////////////////////////////////////////
 double GpuRaySensor::GetVertFOV() const
 {
-  return this->vfov;
+  return this->laserCam->GetVertFOV();
 }
 
 //////////////////////////////////////////////////
 double GpuRaySensor::GetCosVertFOV() const
 {
-  return this->cvfov;
+  return this->laserCam->GetCosVertFOV();
 }
 
 //////////////////////////////////////////////////
 double GpuRaySensor::GetRayCountRatio() const
 {
-  return this->rayCountRatio;
+  return this->laserCam->GetRayCountRatio();
 }
 
 //////////////////////////////////////////////////
@@ -301,7 +379,7 @@ double GpuRaySensor::GetRangeCountRatio() const
 //////////////////////////////////////////////////
 math::Angle GpuRaySensor::GetAngleMin() const
 {
-  return this->horzElem->GetValueDouble("min_angle");
+  return this->horzElem->Get<double>("min_angle");
 }
 
 //////////////////////////////////////////////////
@@ -313,7 +391,7 @@ void GpuRaySensor::SetAngleMin(double _angle)
 //////////////////////////////////////////////////
 math::Angle GpuRaySensor::GetAngleMax() const
 {
-  return this->horzElem->GetValueDouble("max_angle");
+  return this->horzElem->Get<double>("max_angle");
 }
 
 //////////////////////////////////////////////////
@@ -325,13 +403,13 @@ void GpuRaySensor::SetAngleMax(double _angle)
 //////////////////////////////////////////////////
 double GpuRaySensor::GetRangeMin() const
 {
-  return this->rangeElem->GetValueDouble("min");
+  return this->rangeElem->Get<double>("min");
 }
 
 //////////////////////////////////////////////////
 double GpuRaySensor::GetRangeMax() const
 {
-  return this->rangeElem->GetValueDouble("max");
+  return this->rangeElem->Get<double>("max");
 }
 
 /////////////////////////////////////////////////
@@ -344,27 +422,27 @@ double GpuRaySensor::GetAngleResolution() const
 //////////////////////////////////////////////////
 double GpuRaySensor::GetRangeResolution() const
 {
-  return this->rangeElem->GetValueDouble("resolution");
+  return this->rangeElem->Get<double>("resolution");
 }
 
 //////////////////////////////////////////////////
 int GpuRaySensor::GetRayCount() const
 {
-  return this->horzElem->GetValueUInt("samples");
+  return this->horzElem->Get<unsigned int>("samples");
 }
 
 //////////////////////////////////////////////////
 int GpuRaySensor::GetRangeCount() const
 {
   return this->GetRayCount() *
-        this->horzElem->GetValueDouble("resolution");
+        this->horzElem->Get<double>("resolution");
 }
 
 //////////////////////////////////////////////////
 int GpuRaySensor::GetVerticalRayCount() const
 {
   if (this->scanElem->HasElement("vertical"))
-    return this->vertElem->GetValueUInt("samples");
+    return this->vertElem->Get<unsigned int>("samples");
   else
     return 1;
 }
@@ -375,7 +453,7 @@ int GpuRaySensor::GetVerticalRangeCount() const
   if (this->scanElem->HasElement("vertical"))
   {
     int rows =  (this->GetVerticalRayCount() *
-          this->vertElem->GetValueDouble("resolution"));
+          this->vertElem->Get<double>("resolution"));
     if (rows > 1)
       return rows;
     else
@@ -389,7 +467,7 @@ int GpuRaySensor::GetVerticalRangeCount() const
 math::Angle GpuRaySensor::GetVerticalAngleMin() const
 {
   if (this->scanElem->HasElement("vertical"))
-    return this->vertElem->GetValueDouble("min_angle");
+    return this->vertElem->Get<double>("min_angle");
   else
     return math::Angle(0);
 }
@@ -405,12 +483,19 @@ void GpuRaySensor::SetVerticalAngleMin(double _angle)
 math::Angle GpuRaySensor::GetVerticalAngleMax() const
 {
   if (this->scanElem->HasElement("vertical"))
-    return this->vertElem->GetValueDouble("max_angle");
+    return this->vertElem->Get<double>("max_angle");
   else
     return math::Angle(0);
 }
 
 //////////////////////////////////////////////////
+double GpuRaySensor::GetVerticalAngleResolution() const
+{
+  return (this->GetVerticalAngleMax() - this->GetVerticalAngleMin()).Radian() /
+    (this->GetVerticalRangeCount()-1);
+}
+
+//////////////////////////////////////////////////
 void GpuRaySensor::SetVerticalAngleMax(double _angle)
 {
   if (this->scanElem->HasElement("vertical"))
@@ -418,25 +503,31 @@ void GpuRaySensor::SetVerticalAngleMax(double _angle)
 }
 
 //////////////////////////////////////////////////
-void GpuRaySensor::GetRanges(std::vector<double> &/*_ranges*/) const
+void GpuRaySensor::GetRanges(std::vector<double> &_ranges)
 {
-  /*boost::mutex::scoped_lock(this->mutex);
-  _ranges.resize(this->laserMsg.ranges_size());
-  memcpy(&_ranges[0], this->laserMsg.ranges().data(),
-         sizeof(_ranges[0]) * this->laserMsg.ranges_size());*/
+  boost::mutex::scoped_lock lock(this->mutex);
+
+  _ranges.resize(this->laserMsg.scan().ranges_size());
+  memcpy(&_ranges[0], this->laserMsg.scan().ranges().data(),
+         sizeof(_ranges[0]) * this->laserMsg.scan().ranges_size());
 }
 
 //////////////////////////////////////////////////
 double GpuRaySensor::GetRange(int _index)
 {
-  if (_index < 0 || _index > this->laserMsg.ranges_size())
+  boost::mutex::scoped_lock lock(this->mutex);
+  if (this->laserMsg.scan().ranges_size() == 0)
+  {
+    gzwarn << "ranges not constructed yet (zero sized)\n";
+    return 0.0;
+  }
+  if (_index < 0 || _index > this->laserMsg.scan().ranges_size())
   {
     gzerr << "Invalid range index[" << _index << "]\n";
     return 0.0;
   }
 
-  boost::mutex::scoped_lock lock(this->mutex);
-  return this->laserMsg.ranges(_index);
+  return this->laserMsg.scan().ranges(_index);
 }
 
 //////////////////////////////////////////////////
@@ -448,16 +539,94 @@ double GpuRaySensor::GetRetro(int /*_index*/) const
 //////////////////////////////////////////////////
 int GpuRaySensor::GetFiducial(int /*_index*/) const
 {
-  return 0;
+  return -1;
 }
 
 //////////////////////////////////////////////////
-void GpuRaySensor::UpdateImpl(bool /*_force*/)
+void GpuRaySensor::Render()
 {
-  if (this->laserCam)
+  if (!this->laserCam || !this->IsActive() || !this->NeedsUpdate())
+    return;
+
+  this->lastMeasurementTime = this->scene->GetSimTime();
+
+  this->laserCam->Render();
+  this->rendered = true;
+}
+
+//////////////////////////////////////////////////
+bool GpuRaySensor::UpdateImpl(bool /*_force*/)
+{
+  if (!this->rendered)
+    return false;
+
+  this->laserCam->PostRender();
+
+  boost::mutex::scoped_lock lock(this->mutex);
+
+  msgs::Set(this->laserMsg.mutable_time(), this->lastMeasurementTime);
+
+  msgs::LaserScan *scan = this->laserMsg.mutable_scan();
+
+  // Store the latest laser scans into laserMsg
+  msgs::Set(scan->mutable_world_pose(),
+      this->pose + this->parentEntity->GetWorldPose());
+  scan->set_angle_min(this->GetAngleMin().Radian());
+  scan->set_angle_max(this->GetAngleMax().Radian());
+  scan->set_angle_step(this->GetAngleResolution());
+  scan->set_count(this->GetRayCount());
+
+  scan->set_vertical_angle_min(this->GetVerticalAngleMin().Radian());
+  scan->set_vertical_angle_max(this->GetVerticalAngleMax().Radian());
+  scan->set_vertical_angle_step(this->GetVerticalAngleResolution());
+  scan->set_vertical_count(this->GetVerticalRayCount());
+
+  scan->set_range_min(this->GetRangeMin());
+  scan->set_range_max(this->GetRangeMax());
+
+  bool add = scan->ranges_size() == 0;
+
+  // todo: add loop for vertical range count
+  for (int j = 0; j < this->GetVerticalRayCount(); ++j)
   {
-    this->laserCam->Render();
-    this->laserCam->PostRender();
-    this->lastMeasurementTime = this->world->GetSimTime();
+    for (int i = 0; i < this->GetRayCount(); ++i)
+    {
+      int index = j * this->GetRayCount() + i;
+      double range = this->laserCam->GetLaserData()[index * 3];
+
+      if (!this->noises.empty())
+      {
+        range = this->noises[0]->Apply(range);
+        range = math::clamp(range, this->GetRangeMin(), this->GetRangeMax());
+      }
+
+      range = math::isnan(range) ? this->GetRangeMax() : range;
+
+      if (add)
+      {
+        scan->add_ranges(range);
+        scan->add_intensities(this->laserCam->GetLaserData()[index * 3 + 1]);
+      }
+      else
+      {
+        scan->set_ranges(index, range);
+        scan->set_intensities(index,
+            this->laserCam->GetLaserData()[index * 3 + 1]);
+      }
+    }
   }
+
+  if (this->scanPub && this->scanPub->HasConnections())
+    this->scanPub->Publish(this->laserMsg);
+
+  this->rendered = false;
+
+  return true;
+}
+
+//////////////////////////////////////////////////
+bool GpuRaySensor::IsActive()
+{
+  return Sensor::IsActive() ||
+    (this->scanPub && this->scanPub->HasConnections());
 }
diff --git a/gazebo/sensors/GpuRaySensor.hh b/gazebo/sensors/GpuRaySensor.hh
index 27a67d0..d0163e9 100644
--- a/gazebo/sensors/GpuRaySensor.hh
+++ b/gazebo/sensors/GpuRaySensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,11 +26,12 @@
 #include <string>
 #include <boost/thread/mutex.hpp>
 
-#include "math/Angle.hh"
-#include "math/Pose.hh"
-#include "transport/TransportTypes.hh"
-#include "sensors/Sensor.hh"
-#include "rendering/RenderTypes.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -46,7 +47,7 @@ namespace gazebo
     /// This sensor cast rays into the world, tests for intersections, and
     /// reports the range to the nearest object.  It is used by ranging
     /// sensor models (e.g., sonars and scanning laser range finders).
-    class GpuRaySensor: public Sensor
+    class GAZEBO_VISIBLE GpuRaySensor: public Sensor
     {
       /// \brief Constructor
       public: GpuRaySensor();
@@ -58,7 +59,7 @@ namespace gazebo
       /// \param[in] _sdf SDF Sensor parameters
       /// \param[in] _worldName Name of world to load from
       public: virtual void Load(const std::string &_worldName,
-                                sdf::ElementPtr &_sdf);
+                                sdf::ElementPtr _sdf);
 
       /// \brief Load the sensor with default parameters
       /// \param[in] _worldName Name of world to load from
@@ -67,13 +68,15 @@ namespace gazebo
       /// \brief Initialize the ray
       public: virtual void Init();
 
-      /// \brief Update the sensor information
-      /// \param[in] _force True if update is forced, false if not
-      protected: virtual void UpdateImpl(bool _force);
+      // Documentation inherited
+      protected: virtual bool UpdateImpl(bool _force);
 
       /// \brief Finalize the ray
       protected: virtual void Fini();
 
+      // Documentation inherited
+      public: virtual std::string GetTopic() const;
+
       /// \brief Returns a pointer to the internally kept rendering::GpuLaser
       /// \return Pointer to GpuLaser
       public: rendering::GpuLaserPtr GetLaserCamera() const
@@ -147,6 +150,10 @@ namespace gazebo
       /// \param[in] _angle The Maximum angle of the scan block
       public: void SetVerticalAngleMax(double _angle);
 
+      /// \brief Get the vertical angle in radians between each range
+      /// \return Resolution of the angle
+      public: double GetVerticalAngleResolution() const;
+
       /// \brief Get detected range for a ray.
       ///         Warning: If you are accessing all the ray data in a loop
       ///         it's possible that the Ray will update in the middle of
@@ -160,7 +167,7 @@ namespace gazebo
 
       /// \brief Get all the ranges
       /// \param[out] _range A vector that will contain all the range data
-      public: void GetRanges(std::vector<double> &_ranges) const;
+      public: void GetRanges(std::vector<double> &_ranges);
 
       /// \brief Get detected retro (intensity) value for a ray.
       ///         Warning: If you are accessing all the ray data in a loop
@@ -241,6 +248,12 @@ namespace gazebo
       /// \param[in,out] _conn Connection pointer to disconnect.
       public: void DisconnectNewLaserFrame(event::ConnectionPtr &_conn);
 
+      // Documentation inherited
+      public: virtual bool IsActive();
+
+      /// brief Render the camera.
+      private: void Render();
+
       /// \brief Scan SDF elementz.
       protected: sdf::ElementPtr scanElem;
 
@@ -256,33 +269,6 @@ namespace gazebo
       /// \brief Camera SDF element.
       protected: sdf::ElementPtr cameraElem;
 
-      /// \brief Number of cameras.
-      protected: unsigned int cameraCount;
-
-      /// \brief Horizontal field-of-view.
-      protected: double hfov;
-
-      /// \brief Vertical field-of-view.
-      protected: double vfov;
-
-      /// \brief Cos horizontal field-of-view.
-      protected: double chfov;
-
-      /// \brief Cos vertical field-of-view.
-      protected: double cvfov;
-
-      /// \brief Horizontal half angle.
-      protected: double horzHalfAngle;
-
-      /// \brief Vertical half angle.
-      protected: double vertHalfAngle;
-
-      /// \brief Near clip plane.
-      protected: double near;
-
-      /// \brief Far clip plane.
-      protected: double far;
-
       /// \brief Horizontal ray count.
       protected: unsigned int horzRayCount;
 
@@ -295,26 +281,26 @@ namespace gazebo
       /// \brief Vertical range count.
       protected: unsigned int vertRangeCount;
 
-      /// \brief Ray count ratio.
-      protected: double rayCountRatio;
-
       /// \brief Range count ratio.
       protected: double rangeCountRatio;
 
-      /// \brief True if the sensor is horizontal only.
-      protected: bool isHorizontal;
-
       /// \brief GPU laser rendering.
       private: rendering::GpuLaserPtr laserCam;
 
-      /// \brief Pointer to the scene.
-      private: rendering::ScenePtr scene;
-
       /// \brief Mutex to protect getting ranges.
       private: boost::mutex mutex;
 
       /// \brief Laser message to publish data.
-      private: msgs::LaserScan laserMsg;
+      private: msgs::LaserScanStamped laserMsg;
+
+      /// \brief Parent entity of gpu ray sensor
+      private: physics::EntityPtr parentEntity;
+
+      /// \brief Publisher to publish ray sensor data
+      private: transport::PublisherPtr scanPub;
+
+      /// \brief True if the sensor was rendered.
+      private: bool rendered;
     };
     /// \}
   }
diff --git a/gazebo/sensors/GpuRaySensor_TEST.cc b/gazebo/sensors/GpuRaySensor_TEST.cc
new file mode 100644
index 0000000..571b321
--- /dev/null
+++ b/gazebo/sensors/GpuRaySensor_TEST.cc
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/math/Angle.hh"
+#include "test/ServerFixture.hh"
+
+using namespace gazebo;
+class GPURaySensor_TEST : public ServerFixture
+{
+};
+
+void OnNewLaserFrame(int *_scanCounter, float *_scanDest,
+                  const float *_scan,
+                  unsigned int _width, unsigned int _height,
+                  unsigned int _depth,
+                  const std::string &/*_format*/)
+{
+  memcpy(_scanDest, _scan, _width * _height * _depth);
+  *_scanCounter += 1;
+}
+
+/////////////////////////////////////////////////
+/// \brief Test Creation of a Ray sensor
+TEST_F(GPURaySensor_TEST, CreateLaser)
+{
+  Load("worlds/gpu_laser2.world");
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+
+  // Create the Ray sensor
+  std::string sensorName = "default::model_1::link_1::laser_sensor";
+
+  // Get a pointer to the Ray sensor
+  sensors::GpuRaySensorPtr sensor =
+     boost::dynamic_pointer_cast<sensors::GpuRaySensor>
+     (mgr->GetSensor(sensorName));
+
+  // Make sure the above dynamic cast worked.
+  EXPECT_TRUE(sensor != NULL);
+
+  double angleRes = (sensor->GetAngleMax() - sensor->GetAngleMin()).Radian() /
+                    sensor->GetRayCount();
+  EXPECT_EQ(sensor->GetAngleMin(), math::Angle(-1.396263));
+  EXPECT_EQ(sensor->GetAngleMax(), math::Angle(1.396263));
+  EXPECT_NEAR(sensor->GetRangeMin(), 0.08, 1e-6);
+  EXPECT_NEAR(sensor->GetRangeMax(), 10.0, 1e-6);
+  EXPECT_NEAR(sensor->GetAngleResolution(), angleRes, 1e-3);
+  EXPECT_NEAR(sensor->GetRangeResolution(), 0.01, 1e-3);
+  EXPECT_EQ(sensor->GetRayCount(), 640);
+  EXPECT_EQ(sensor->GetRangeCount(), 640);
+
+  EXPECT_EQ(sensor->GetVerticalRayCount(), 1);
+  EXPECT_EQ(sensor->GetVerticalRangeCount(), 1);
+  EXPECT_EQ(sensor->GetVerticalAngleMin(), 0.0);
+  EXPECT_EQ(sensor->GetVerticalAngleMax(), 0.0);
+
+  EXPECT_TRUE(sensor->IsActive());
+  EXPECT_TRUE(sensor->IsHorizontal());
+
+  // listen to new laser frames
+  float *scan = new float[sensor->GetRayCount()
+      * sensor->GetVerticalRayCount() * 3];
+  int scanCount = 0;
+  event::ConnectionPtr c =
+    sensor->ConnectNewLaserFrame(
+        boost::bind(&::OnNewLaserFrame, &scanCount, scan,
+          _1, _2, _3, _4, _5));
+
+  // wait for a few laser scans
+  int i = 0;
+  while (scanCount < 10 && i < 300)
+  {
+    common::Time::MSleep(10);
+    mgr->Update();
+    i++;
+  }
+  EXPECT_LT(i, 300);
+
+  // Get all the range values
+  std::vector<double> ranges;
+  sensor->GetRanges(ranges);
+  EXPECT_EQ(ranges.size(), static_cast<size_t>(640));
+
+  // Check that all the range values
+  for (unsigned int i = 0; i < ranges.size(); ++i)
+  {
+    EXPECT_NEAR(ranges[i], sensor->GetRangeMax(), 1e-6);
+    EXPECT_NEAR(sensor->GetRange(i), ranges[i], 1e-6);
+    EXPECT_NEAR(sensor->GetRetro(i), 0, 1e-6);
+    EXPECT_EQ(sensor->GetFiducial(i), -1);
+  }
+
+  delete [] scan;
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/sensors/ImuSensor.cc b/gazebo/sensors/ImuSensor.cc
index e11a75e..cab858b 100644
--- a/gazebo/sensors/ImuSensor.cc
+++ b/gazebo/sensors/ImuSensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -43,6 +43,10 @@ GZ_REGISTER_STATIC_SENSOR("imu", ImuSensor)
 ImuSensor::ImuSensor()
   : Sensor(sensors::OTHER)
 {
+  this->dataIndex = 0;
+  this->dataDirty = false;
+  this->incomingLinkData[0].reset();
+  this->incomingLinkData[1].reset();
 }
 
 //////////////////////////////////////////////////
@@ -57,11 +61,11 @@ void ImuSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
 
   if (this->sdf->HasElement("imu") &&
       this->sdf->GetElement("imu")->HasElement("topic") &&
-      this->sdf->GetElement("imu")->GetValueString("topic")
+      this->sdf->GetElement("imu")->Get<std::string>("topic")
       != "__default_topic__")
   {
     this->pub = this->node->Advertise<msgs::IMU>(
-        this->sdf->GetElement("imu")->GetValueString("topic"));
+        this->sdf->GetElement("imu")->Get<std::string>("topic"), 500);
   }
   else
   {
@@ -69,7 +73,7 @@ void ImuSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
     topicName += this->parentName + "/" + this->GetName() + "/imu";
     boost::replace_all(topicName, "::", "/");
 
-    this->pub = this->node->Advertise<msgs::IMU>(topicName);
+    this->pub = this->node->Advertise<msgs::IMU>(topicName, 500);
   }
 
   // Handle noise model settings.
@@ -78,7 +82,7 @@ void ImuSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
   if (imuElem->HasElement("noise"))
   {
     sdf::ElementPtr noiseElem = imuElem->GetElement("noise");
-    std::string type = noiseElem->GetValueString("type");
+    std::string type = noiseElem->Get<std::string>("type");
     if (type == "gaussian")
     {
       this->noiseActive = true;
@@ -92,10 +96,10 @@ void ImuSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
       if (noiseElem->HasElement("rate"))
       {
         sdf::ElementPtr rateElem = noiseElem->GetElement("rate");
-        this->rateNoiseMean = rateElem->GetValueDouble("mean");
-        this->rateNoiseStdDev = rateElem->GetValueDouble("stddev");
-        double rateBiasMean = rateElem->GetValueDouble("bias_mean");
-        double rateBiasStddev = rateElem->GetValueDouble("bias_stddev");
+        this->rateNoiseMean = rateElem->Get<double>("mean");
+        this->rateNoiseStdDev = rateElem->Get<double>("stddev");
+        double rateBiasMean = rateElem->Get<double>("bias_mean");
+        double rateBiasStddev = rateElem->Get<double>("bias_stddev");
         // Sample the bias that we'll use later
         this->rateBias = math::Rand::GetDblNormal(rateBiasMean, rateBiasStddev);
         // With equal probability, we pick a negative bias (by convention,
@@ -110,10 +114,10 @@ void ImuSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
       if (noiseElem->HasElement("accel"))
       {
         sdf::ElementPtr accelElem = noiseElem->GetElement("accel");
-        this->accelNoiseMean = accelElem->GetValueDouble("mean");
-        this->accelNoiseStdDev = accelElem->GetValueDouble("stddev");
-        double accelBiasMean = accelElem->GetValueDouble("bias_mean");
-        double accelBiasStddev = accelElem->GetValueDouble("bias_stddev");
+        this->accelNoiseMean = accelElem->Get<double>("mean");
+        this->accelNoiseStdDev = accelElem->Get<double>("stddev");
+        double accelBiasMean = accelElem->Get<double>("bias_mean");
+        double accelBiasStddev = accelElem->Get<double>("bias_stddev");
         // Sample the bias that we'll use later
         this->accelBias = math::Rand::GetDblNormal(accelBiasMean,
                                                    accelBiasStddev);
@@ -131,6 +135,12 @@ void ImuSensor::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
       gzwarn << "ignoring unknown noise model type \"" << type << "\"" <<
         std::endl;
   }
+
+  this->parentEntity->SetPublishData(true);
+
+  std::string topic = "~/" + this->parentEntity->GetScopedName();
+  this->linkDataSub = this->node->Subscribe(topic,
+    &ImuSensor::OnLinkData, this);
 }
 
 //////////////////////////////////////////////////
@@ -160,6 +170,9 @@ void ImuSensor::Init()
 //////////////////////////////////////////////////
 void ImuSensor::Fini()
 {
+  this->parentEntity->SetPublishData(false);
+  this->pub.reset();
+  Sensor::Fini();
 }
 
 //////////////////////////////////////////////////
@@ -170,6 +183,15 @@ msgs::IMU ImuSensor::GetImuMessage() const
 }
 
 //////////////////////////////////////////////////
+void ImuSensor::OnLinkData(ConstLinkDataPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(this->mutex);
+  // Store the contacts message for processing in UpdateImpl
+  this->incomingLinkData[this->dataIndex] = _msg;
+  this->dataDirty = true;
+}
+
+//////////////////////////////////////////////////
 math::Vector3 ImuSensor::GetAngularVelocity() const
 {
   boost::mutex::scoped_lock lock(this->mutex);
@@ -197,49 +219,72 @@ void ImuSensor::SetReferencePose()
 }
 
 //////////////////////////////////////////////////
-void ImuSensor::UpdateImpl(bool /*_force*/)
+bool ImuSensor::UpdateImpl(bool /*_force*/)
 {
-  double dt= (this->world->GetSimTime() - this->lastMeasurementTime).Double();
+  msgs::LinkData msg;
+  int readIndex = 0;
+
   {
     boost::mutex::scoped_lock lock(this->mutex);
 
-    this->lastMeasurementTime = this->world->GetSimTime();
+    // Don't do anything if there is no new data to process.
+    if (!this->dataDirty)
+      return false;
+
+    readIndex = this->dataIndex;
+    this->dataIndex ^= 1;
+    this->dataDirty = false;
+  }
+
+  // toggle the index
+  msg.CopyFrom(*this->incomingLinkData[readIndex].get());
+
+  common::Time timestamp = msgs::Convert(msg.time());
+
+  double dt = (timestamp - this->lastMeasurementTime).Double();
+
+  if (dt > 0.0)
+  {
+    boost::mutex::scoped_lock lock(this->mutex);
 
     this->imuMsg.set_entity_name(this->parentName);
 
-    // Set the time stamp
-    msgs::Set(this->imuMsg.mutable_stamp(), this->world->GetSimTime());
+    this->gravity = this->world->GetPhysicsEngine()->GetGravity();
+
+    msgs::Set(this->imuMsg.mutable_stamp(), timestamp);
 
     math::Pose parentEntityPose = this->parentEntity->GetWorldPose();
     math::Pose imuPose = this->pose + parentEntityPose;
 
-    // Set the IMU orientation
-    msgs::Set(this->imuMsg.mutable_orientation(),
-              imuPose.rot * this->referencePose.rot.GetInverse());
-
     // Set the IMU angular velocity
+    math::Vector3 imuWorldAngularVel
+        = msgs::Convert(msg.angular_velocity());
+
     msgs::Set(this->imuMsg.mutable_angular_velocity(),
               imuPose.rot.GetInverse().RotateVector(
-              this->parentEntity->GetWorldAngularVel()));
-
-    // get linear velocity in world frame
-    math::Vector3 imuWorldLinearVel =
-      this->parentEntity->GetWorldLinearVel(this->pose.pos);
+              imuWorldAngularVel));
 
     // Compute and set the IMU linear acceleration
-    if (dt > 0.0)
-    {
-      this->linearAcc = imuPose.rot.GetInverse().RotateVector(
-        (imuWorldLinearVel - this->lastLinearVel) / dt);
-      this->lastLinearVel = imuWorldLinearVel;
-    }
+    math::Vector3 imuWorldLinearVel
+        = msgs::Convert(msg.linear_velocity());
+    // Get the correct vel for imu's that are at an offset from parent link
+    imuWorldLinearVel +=
+        imuWorldAngularVel.Cross(parentEntityPose.pos - imuPose.pos);
+    this->linearAcc = imuPose.rot.GetInverse().RotateVector(
+      (imuWorldLinearVel - this->lastLinearVel) / dt);
 
     // Add contribution from gravity
-    this->gravity = this->world->GetPhysicsEngine()->GetGravity();
     this->linearAcc -= imuPose.rot.GetInverse().RotateVector(this->gravity);
-
     msgs::Set(this->imuMsg.mutable_linear_acceleration(), this->linearAcc);
 
+    // Set the IMU orientation
+    msgs::Set(this->imuMsg.mutable_orientation(),
+              (imuPose - this->referencePose).rot);
+
+    this->lastLinearVel = imuWorldLinearVel;
+
+    this->lastMeasurementTime = timestamp;
+
     if (this->noiseActive)
     {
       switch (this->noiseType)
@@ -248,13 +293,16 @@ void ImuSensor::UpdateImpl(bool /*_force*/)
           // Add Gaussian noise + fixed bias to each rate
           this->imuMsg.mutable_angular_velocity()->set_x(
             this->imuMsg.angular_velocity().x() + this->rateBias +
-            math::Rand::GetDblNormal(this->rateNoiseMean, this->rateNoiseStdDev));
+            math::Rand::GetDblNormal(this->rateNoiseMean,
+              this->rateNoiseStdDev));
           this->imuMsg.mutable_angular_velocity()->set_y(
             this->imuMsg.angular_velocity().y() + this->rateBias +
-            math::Rand::GetDblNormal(this->rateNoiseMean, this->rateNoiseStdDev));
+            math::Rand::GetDblNormal(this->rateNoiseMean,
+              this->rateNoiseStdDev));
           this->imuMsg.mutable_angular_velocity()->set_z(
             this->imuMsg.angular_velocity().z() + this->rateBias +
-            math::Rand::GetDblNormal(this->rateNoiseMean, this->rateNoiseStdDev));
+            math::Rand::GetDblNormal(this->rateNoiseMean,
+              this->rateNoiseStdDev));
 
           // Add Gaussian noise + fixed bias to each acceleration
           this->imuMsg.mutable_linear_acceleration()->set_x(
@@ -276,8 +324,17 @@ void ImuSensor::UpdateImpl(bool /*_force*/)
           GZ_ASSERT(false, "Invalid noise model type");
       }
     }
+
+    if (this->pub)
+      this->pub->Publish(this->imuMsg);
   }
 
-  if (this->pub)
-    this->pub->Publish(this->imuMsg);
+  return true;
+}
+
+//////////////////////////////////////////////////
+bool ImuSensor::IsActive()
+{
+  return this->active ||
+         (this->pub && this->pub->HasConnections());
 }
diff --git a/gazebo/sensors/ImuSensor.hh b/gazebo/sensors/ImuSensor.hh
index df9d0c4..22bd339 100644
--- a/gazebo/sensors/ImuSensor.hh
+++ b/gazebo/sensors/ImuSensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/sensors/Sensor.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -33,7 +34,7 @@ namespace gazebo
 
     /// \class ImuSensor ImuSensor.hh sensors/sensors.hh
     /// \brief An IMU sensor.
-    class ImuSensor: public Sensor
+    class GAZEBO_VISIBLE ImuSensor: public Sensor
     {
       /// \brief Constructor.
       public: ImuSensor();
@@ -51,7 +52,7 @@ namespace gazebo
       public: virtual void Init();
 
       // Documentation inherited
-      protected: virtual void UpdateImpl(bool _force);
+      protected: virtual bool UpdateImpl(bool _force);
 
       // Documentation inherited
       protected: virtual void Fini();
@@ -76,6 +77,13 @@ namespace gazebo
       /// \brief Sets the current pose as the IMU reference pose
       public: void SetReferencePose();
 
+      // Documentation inherited.
+      public: virtual bool IsActive();
+
+      /// \brief Callback when link data is received
+      /// \param[in] _msg Message containing link data
+      private: void OnLinkData(ConstLinkDataPtr &_msg);
+
       /// \brief Imu reference pose
       private: math::Pose referencePose;
 
@@ -88,10 +96,30 @@ namespace gazebo
       /// \brief store gravity vector to be added to the imu output.
       private: math::Vector3 gravity;
 
+      /// \brief Imu data publisher
       private: transport::PublisherPtr pub;
+
+      /// \brief Subscriber to link data published by parent entity
+      private: transport::SubscriberPtr linkDataSub;
+
+      /// \brief Parent entity which the IMU is attached to
       private: physics::LinkPtr parentEntity;
+
+      /// \brief Imu message
       private: msgs::IMU imuMsg;
 
+      /// \brief Mutex to protect reads and writes.
+      private: mutable boost::mutex mutex;
+
+      /// \brief Buffer for storing link data
+      private: boost::shared_ptr<msgs::LinkData const> incomingLinkData[2];
+
+      /// \brief Index for accessing element in the link data array
+      private: unsigned int dataIndex;
+
+      /// \brief True if new link data is received
+      private: bool dataDirty;
+
       /// \brief Which noise type we support
       private: enum NoiseModelType
       {
@@ -127,9 +155,6 @@ namespace gazebo
 
       /// \brief If noiseType==GAUSSIAN, the bias we'll add to rates
       private: double rateBias;
-
-      /// \brief Prevent imuMsg update race condition when
-      private: mutable boost::mutex mutex;
     };
     /// \}
   }
diff --git a/gazebo/sensors/ImuSensor_TEST.cc b/gazebo/sensors/ImuSensor_TEST.cc
index 1b73b4e..92ab4a8 100644
--- a/gazebo/sensors/ImuSensor_TEST.cc
+++ b/gazebo/sensors/ImuSensor_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,9 +21,13 @@
 #include "test/ServerFixture.hh"
 #include "gazebo/sensors/ImuSensor.hh"
 
+#define TOL 1e-4
+
 using namespace gazebo;
 class ImuSensor_TEST : public ServerFixture
 {
+  public: void BasicImuSensorCheck(const std::string &_physicsEngine);
+  public: void LinearAccelerationTest(const std::string &_physicsEngine);
 };
 
 static std::string imuSensorString =
@@ -37,9 +41,9 @@ static std::string imuSensorString =
 "  </sensor>"
 "</sdf>";
 
-TEST_F(ImuSensor_TEST, BasicImuSensorCheck)
+void ImuSensor_TEST::BasicImuSensorCheck(const std::string &_physicsEngine)
 {
-  Load("worlds/empty.world");
+  Load("worlds/empty.world", false, _physicsEngine);
   sensors::SensorManager *mgr = sensors::SensorManager::Instance();
 
   sdf::ElementPtr sdf(new sdf::Element);
@@ -48,7 +52,7 @@ TEST_F(ImuSensor_TEST, BasicImuSensorCheck)
 
   // Create the IMU sensor
   std::string sensorName = mgr->CreateSensor(sdf, "default",
-      "ground_plane::link");
+      "ground_plane::link", 0);
 
   // Make sure the returned sensor name is correct
   EXPECT_EQ(sensorName, std::string("default::ground_plane::link::imu"));
@@ -68,6 +72,109 @@ TEST_F(ImuSensor_TEST, BasicImuSensorCheck)
   EXPECT_EQ(sensor->GetOrientation(), math::Quaternion(0, 0, 0, 0));
 }
 
+TEST_F(ImuSensor_TEST, BasicImuSensorCheckODE)
+{
+  BasicImuSensorCheck("ode");
+}
+
+#ifdef HAVE_BULLET
+TEST_F(ImuSensor_TEST, BasicImuSensorCheckBullet)
+{
+  BasicImuSensorCheck("bullet");
+}
+#endif
+
+#ifdef HAVE_DART
+TEST_F(ImuSensor_TEST, BasicImuSensorCheckDART)
+{
+  BasicImuSensorCheck("dart");
+}
+#endif
+
+// Drop a model with imu sensor and measure its linear acceleration
+void ImuSensor_TEST::LinearAccelerationTest(const std::string &_physicsEngine)
+{
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  double z = 3;
+  double gravityZ = physics->GetGravity().z;
+  double stepSize = physics->GetMaxStepSize();
+
+  std::string modelName = "imuModel";
+  std::string imuSensorName = "imuSensor";
+  math::Pose modelPose(0, 0, z, 0, 0, 0);
+
+  std::string topic = "~/" + imuSensorName + "_" + _physicsEngine;
+  // spawn imu sensor
+  SpawnUnitImuSensor(modelName, imuSensorName,
+      "box", topic, modelPose.pos, modelPose.rot.GetAsEuler());
+
+  sensors::SensorPtr sensor = sensors::get_sensor(imuSensorName);
+  sensors::ImuSensorPtr imuSensor =
+      boost::dynamic_pointer_cast<sensors::ImuSensor>(sensor);
+
+  ASSERT_TRUE(imuSensor);
+
+  sensors::SensorManager::Instance()->Init();
+  imuSensor->SetActive(true);
+
+  EXPECT_EQ(imuSensor->GetAngularVelocity(), math::Vector3::Zero);
+  EXPECT_EQ(imuSensor->GetLinearAcceleration(), math::Vector3::Zero);
+  EXPECT_EQ(imuSensor->GetOrientation(), math::Quaternion(0, 0, 0, 0));
+
+  // step world and verify imu's linear acceleration is zero on free fall
+  world->Step(200);
+  EXPECT_NEAR(imuSensor->GetLinearAcceleration().x, 0, TOL);
+  EXPECT_NEAR(imuSensor->GetLinearAcceleration().y, 0, TOL);
+  EXPECT_NEAR(imuSensor->GetLinearAcceleration().z, 0, TOL);
+  world->Step(1);
+  EXPECT_NEAR(imuSensor->GetLinearAcceleration().x, 0, TOL);
+  EXPECT_NEAR(imuSensor->GetLinearAcceleration().y, 0, TOL);
+  EXPECT_NEAR(imuSensor->GetLinearAcceleration().z, 0, TOL);
+
+  // Predict time of contact with ground plane.
+  double tHit = sqrt((z-0.5) / (-gravityZ));
+  // Time to advance, allow 0.5 s settling time.
+  // This assumes inelastic collisions with the ground.
+  double dtHit = tHit+0.5 - world->GetSimTime().Double();
+  double steps = ceil(dtHit / stepSize);
+  EXPECT_GT(steps, 0);
+  world->Step(steps);
+
+  // Issue #848
+  if (_physicsEngine == "bullet" && LIBBULLET_VERSION < 2.82)
+    EXPECT_NEAR(imuSensor->GetLinearAcceleration().x, 0, 1e-1);
+  else
+    EXPECT_NEAR(imuSensor->GetLinearAcceleration().x, 0, TOL);
+  EXPECT_NEAR(imuSensor->GetLinearAcceleration().y, 0, TOL);
+  EXPECT_NEAR(imuSensor->GetLinearAcceleration().z, -gravityZ, TOL);
+}
+
+TEST_F(ImuSensor_TEST, LinearAccelerationTestODE)
+{
+  LinearAccelerationTest("ode");
+}
+
+#ifdef HAVE_BULLET
+TEST_F(ImuSensor_TEST, LinearAccelerationTestBullet)
+{
+  LinearAccelerationTest("bullet");
+}
+#endif
+
+#ifdef HAVE_DART
+TEST_F(ImuSensor_TEST, LinearAccelerationTestDART)
+{
+  LinearAccelerationTest("dart");
+}
+#endif
 
 /////////////////////////////////////////////////
 int main(int argc, char **argv)
diff --git a/gazebo/sensors/MultiCameraSensor.cc b/gazebo/sensors/MultiCameraSensor.cc
index db76085..e97276b 100644
--- a/gazebo/sensors/MultiCameraSensor.cc
+++ b/gazebo/sensors/MultiCameraSensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,8 +26,9 @@
 #include "gazebo/rendering/RenderEngine.hh"
 #include "gazebo/rendering/Camera.hh"
 #include "gazebo/rendering/Scene.hh"
-#include "gazebo/rendering/Rendering.hh"
+#include "gazebo/rendering/RenderingIface.hh"
 
+#include "gazebo/sensors/Noise.hh"
 #include "gazebo/sensors/SensorFactory.hh"
 #include "gazebo/sensors/MultiCameraSensor.hh"
 
@@ -40,6 +41,10 @@ GZ_REGISTER_STATIC_SENSOR("multicamera", MultiCameraSensor)
 MultiCameraSensor::MultiCameraSensor()
     : Sensor(sensors::IMAGE)
 {
+  this->rendered = false;
+  this->connections.push_back(
+      event::Events::ConnectRender(
+        boost::bind(&MultiCameraSensor::Render, this)));
 }
 
 //////////////////////////////////////////////////
@@ -69,7 +74,8 @@ void MultiCameraSensor::Load(const std::string &_worldName)
   Sensor::Load(_worldName);
 
   // Create the publisher of image data.
-  this->imagePub = this->node->Advertise<msgs::ImagesStamped>(this->GetTopic());
+  this->imagePub = this->node->Advertise<msgs::ImagesStamped>(
+      this->GetTopic(), 50);
 }
 
 //////////////////////////////////////////////////
@@ -90,14 +96,14 @@ void MultiCameraSensor::Init()
     return;
   }
 
-  rendering::ScenePtr scene = rendering::get_scene(worldName);
+  this->scene = rendering::get_scene(worldName);
 
-  if (!scene)
+  if (!this->scene)
   {
-    scene = rendering::create_scene(worldName, false);
+    this->scene = rendering::create_scene(worldName, false, true);
 
     // This usually means rendering is not available
-    if (!scene)
+    if (!this->scene)
     {
       gzerr << "Unable to create MultiCameraSensor.\n";
       return;
@@ -109,12 +115,12 @@ void MultiCameraSensor::Init()
   while (cameraSdf)
   {
     rendering::CameraPtr camera = scene->CreateCamera(
-          cameraSdf->GetValueString("name"), false);
+          cameraSdf->Get<std::string>("name"), false);
 
     if (!camera)
     {
       gzthrow("Unable to create multicamera sensor[" +
-              cameraSdf->GetValueString("name"));
+              cameraSdf->Get<std::string>("name"));
       return;
     }
 
@@ -130,24 +136,52 @@ void MultiCameraSensor::Init()
 
     math::Pose cameraPose = this->pose;
     if (cameraSdf->HasElement("pose"))
-      cameraPose = cameraSdf->GetValuePose("pose") + cameraPose;
+      cameraPose = cameraSdf->Get<math::Pose>("pose") + cameraPose;
     camera->SetWorldPose(cameraPose);
-    camera->AttachToVisual(this->parentName, true);
+    camera->AttachToVisual(this->parentId, true);
+
+    // Handle noise model settings.
+    if (cameraSdf->HasElement("noise"))
+    {
+      NoisePtr noise =
+          NoiseFactory::NewNoiseModel(cameraSdf->GetElement("noise"),
+          this->GetType());
+      this->noises.push_back(noise);
+      noise->SetCamera(camera);
+    }
+    else
+    {
+      this->noises.push_back(NoisePtr(new Noise(Noise::NONE)));
+    }
 
     {
       boost::mutex::scoped_lock lock(this->cameraMutex);
       this->cameras.push_back(camera);
     }
 
+    msgs::Image *image = this->msg.add_image();
+    image->set_width(camera->GetImageWidth());
+    image->set_height(camera->GetImageHeight());
+    image->set_pixel_format(common::Image::ConvertPixelFormat(
+          camera->GetImageFormat()));
+    image->set_step(camera->GetImageWidth() * camera->GetImageDepth());
+
     cameraSdf = cameraSdf->GetNextElement("camera");
   }
 
+  // Disable clouds and moon on server side until fixed and also to improve
+  // performance
+  this->scene->SetSkyXMode(rendering::Scene::GZ_SKYX_ALL &
+      ~rendering::Scene::GZ_SKYX_CLOUDS &
+      ~rendering::Scene::GZ_SKYX_MOON);
+
   Sensor::Init();
 }
 
 //////////////////////////////////////////////////
 void MultiCameraSensor::Fini()
 {
+  this->imagePub.reset();
   Sensor::Fini();
 
   boost::mutex::scoped_lock lock(this->cameraMutex);
@@ -155,9 +189,10 @@ void MultiCameraSensor::Fini()
   for (std::vector<rendering::CameraPtr>::iterator iter =
       this->cameras.begin(); iter != this->cameras.end(); ++iter)
   {
-    (*iter)->Fini();
+    (*iter)->GetScene()->RemoveCamera((*iter)->GetName());
   }
   this->cameras.clear();
+  this->scene.reset();
 }
 
 //////////////////////////////////////////////////
@@ -173,42 +208,53 @@ rendering::CameraPtr MultiCameraSensor::GetCamera(unsigned int _index) const
 }
 
 //////////////////////////////////////////////////
-void MultiCameraSensor::UpdateImpl(bool /*_force*/)
+void MultiCameraSensor::Render()
+{
+  if (this->cameras.empty() || !this->IsActive() || !this->NeedsUpdate())
+    return;
+
+  // Update all the cameras
+  for (std::vector<rendering::CameraPtr>::iterator iter = this->cameras.begin();
+      iter != this->cameras.end(); ++iter)
+  {
+    (*iter)->Render();
+  }
+
+  this->rendered = true;
+  this->lastMeasurementTime = this->scene->GetSimTime();
+}
+
+//////////////////////////////////////////////////
+bool MultiCameraSensor::UpdateImpl(bool /*_force*/)
 {
   boost::mutex::scoped_lock lock(this->cameraMutex);
 
-  if (this->cameras.size() == 0)
-    return;
+  if (!this->rendered)
+    return false;
 
   bool publish = this->imagePub->HasConnections();
 
-  this->lastMeasurementTime = this->world->GetSimTime();
-
-  msgs::ImagesStamped msg;
-  msgs::Set(msg.mutable_time(), this->lastMeasurementTime);
+  msgs::Set(this->msg.mutable_time(), this->lastMeasurementTime);
 
-  // Update all the cameras
+  int index = 0;
   for (std::vector<rendering::CameraPtr>::iterator iter = this->cameras.begin();
-       iter != this->cameras.end(); ++iter)
+       iter != this->cameras.end(); ++iter, ++index)
   {
-    (*iter)->Render();
     (*iter)->PostRender();
 
     if (publish)
     {
-      msgs::Image *image = msg.add_image();
-      image->set_width((*iter)->GetImageWidth());
-      image->set_height((*iter)->GetImageHeight());
-      image->set_pixel_format(common::Image::ConvertPixelFormat(
-            (*iter)->GetImageFormat()));
-      image->set_step((*iter)->GetImageWidth() * (*iter)->GetImageDepth());
+      msgs::Image *image = this->msg.mutable_image(index);
       image->set_data((*iter)->GetImageData(0),
           image->width() * (*iter)->GetImageDepth() * image->height());
     }
   }
 
   if (publish)
-    this->imagePub->Publish(msg);
+    this->imagePub->Publish(this->msg);
+
+  this->rendered = false;
+  return true;
 }
 
 //////////////////////////////////////////////////
@@ -264,5 +310,6 @@ bool MultiCameraSensor::SaveFrame(const std::vector<std::string> &_filenames)
 //////////////////////////////////////////////////
 bool MultiCameraSensor::IsActive()
 {
-  return Sensor::IsActive() || this->imagePub->HasConnections();
+  return Sensor::IsActive() ||
+    (this->imagePub && this->imagePub->HasConnections());
 }
diff --git a/gazebo/sensors/MultiCameraSensor.hh b/gazebo/sensors/MultiCameraSensor.hh
index 6bc125f..a88563a 100644
--- a/gazebo/sensors/MultiCameraSensor.hh
+++ b/gazebo/sensors/MultiCameraSensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
 #include "gazebo/msgs/MessageTypes.hh"
 #include "gazebo/transport/TransportTypes.hh"
 #include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,7 +38,7 @@ namespace gazebo
     /// \class MultiCameraSensor MultiCameraSensor.hh sensors/sensors.hh
     /// \brief Multiple camera sensor. This sensor type can create one or
     /// more synchronized cameras.
-    class MultiCameraSensor : public Sensor
+    class GAZEBO_VISIBLE MultiCameraSensor : public Sensor
     {
       /// \brief Constructor
       public: MultiCameraSensor();
@@ -92,11 +93,14 @@ namespace gazebo
       public: virtual bool IsActive();
 
       // Documentation inherited.
-      protected: virtual void UpdateImpl(bool _force);
+      protected: virtual bool UpdateImpl(bool _force);
 
       // Documentation inherited.
       protected: virtual void Fini();
 
+      /// \brief Handle the render event.
+      private: void Render();
+
       /// \brief All the cameras.
       private: std::vector<rendering::CameraPtr> cameras;
 
@@ -105,6 +109,12 @@ namespace gazebo
 
       /// \brief Publishes messages of type msgs::ImagesStamped.
       private: transport::PublisherPtr imagePub;
+
+      /// \brief The images msg.
+      private: msgs::ImagesStamped msg;
+
+      /// \brief True if the sensor was rendered.
+      private: bool rendered;
     };
     /// \}
   }
diff --git a/gazebo/sensors/Noise.cc b/gazebo/sensors/Noise.cc
new file mode 100644
index 0000000..c57a47a
--- /dev/null
+++ b/gazebo/sensors/Noise.cc
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/sensors/GaussianNoiseModel.hh"
+#include "gazebo/sensors/Noise.hh"
+
+using namespace gazebo;
+using namespace sensors;
+
+//////////////////////////////////////////////////
+NoisePtr NoiseFactory::NewNoiseModel(sdf::ElementPtr _sdf,
+    const std::string &_sensorType)
+{
+  GZ_ASSERT(_sdf != NULL, "noise sdf is NULL");
+  GZ_ASSERT(_sdf->GetName() == "noise", "Not a noise SDF element");
+
+  std::string typeString = _sdf->Get<std::string>("type");
+
+  NoisePtr noise;
+
+  // Check for 'gaussian' noise. The 'gaussian_quantized' type is kept for
+  // backward compatibility.
+  if (typeString == "gaussian" ||
+      typeString == "gaussian_quantized")
+  {
+    if (_sensorType == "camera" || _sensorType == "depth" ||
+      _sensorType == "multicamera")
+    {
+      noise.reset(new ImageGaussianNoiseModel());
+    }
+    else
+      noise.reset(new GaussianNoiseModel());
+
+    GZ_ASSERT(noise->GetNoiseType() == Noise::GAUSSIAN,
+        "Noise type should be 'gaussian'");
+  }
+  else if (typeString == "none" || typeString == "custom")
+  {
+    // Return empty noise if 'none' or 'custom' is specified.
+    // if 'custom', the type will be set once the user calls the
+    // SetCustomNoiseCallback function.
+    noise.reset(new Noise(Noise::NONE));
+    GZ_ASSERT(noise->GetNoiseType() == Noise::NONE,
+        "Noise type should be 'none'");
+  }
+  else
+  {
+    gzerr << "Unrecognized noise type" << std::endl;
+    return NoisePtr();
+  }
+  noise->Load(_sdf);
+
+  return noise;
+}
+
+//////////////////////////////////////////////////
+Noise::Noise(NoiseType _type)
+  : type(_type),
+    customNoiseCallback(NULL)
+{
+}
+
+//////////////////////////////////////////////////
+Noise::~Noise()
+{
+}
+
+//////////////////////////////////////////////////
+void Noise::Load(sdf::ElementPtr _sdf)
+{
+  this->sdf = _sdf;
+  GZ_ASSERT(this->sdf != NULL, "this->sdf is NULL");
+}
+
+//////////////////////////////////////////////////
+void Noise::SetCamera(rendering::CameraPtr /*_camera*/)
+{
+  gzerr << "Ignoring SetCamera: Not attached to an image sensor" << std::endl;
+}
+
+//////////////////////////////////////////////////
+double Noise::Apply(double _in)
+{
+  if (this->type == NONE)
+    return _in;
+  else if (this->type == CUSTOM)
+  {
+    if (this->customNoiseCallback)
+      return this->customNoiseCallback(_in);
+    else
+    {
+      gzerr << "Custom noise callback function not set!"
+          << " Please call SetCustomNoiseCallback within a sensor plugin."
+          << std::endl;
+      return _in;
+    }
+  }
+  else
+    return this->ApplyImpl(_in);
+}
+
+//////////////////////////////////////////////////
+double Noise::ApplyImpl(double _in)
+{
+  return _in;
+}
+
+//////////////////////////////////////////////////
+Noise::NoiseType Noise::GetNoiseType() const
+{
+  return this->type;
+}
+
+//////////////////////////////////////////////////
+void Noise::SetCustomNoiseCallback(boost::function<double (double)> _cb)
+{
+  this->type = CUSTOM;
+  this->customNoiseCallback = _cb;
+}
+
+//////////////////////////////////////////////////
+void Noise::Fini()
+{
+  this->customNoiseCallback = NULL;
+}
diff --git a/gazebo/sensors/Noise.hh b/gazebo/sensors/Noise.hh
new file mode 100644
index 0000000..dab2ca5
--- /dev/null
+++ b/gazebo/sensors/Noise.hh
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_NOISE_HH_
+#define _GAZEBO_NOISE_HH_
+
+#include <vector>
+#include <string>
+
+#include <sdf/sdf.hh>
+
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/sensors/SensorTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace sensors
+  {
+    /// \addtogroup gazebo_sensors
+    /// \{
+
+    /// \class NoiseFactory Noise.hh sensors/sensors.hh
+    /// \brief Use this noise manager for creating and loading noise models.
+    class GAZEBO_VISIBLE NoiseFactory
+    {
+      /// \brief Load a noise model based on the input sdf parameters and
+      /// sensor type.
+      /// \param[in] _sdf Noise sdf parameters.
+      /// \param[in] _sensorType Type of sensor. This is currently used to
+      /// distinguish between image and non image sensors in order to create
+      /// the appropriate noise model.
+      /// \return Pointer to the noise model created.
+      public: static NoisePtr NewNoiseModel(sdf::ElementPtr _sdf,
+          const std::string &_sensorType = "");
+    };
+
+    /// \class Noise Noise.hh
+    /// \brief Noise models for sensor output signals.
+    class GAZEBO_VISIBLE Noise
+    {
+      /// \brief Which noise types we support
+      public: enum NoiseType
+      {
+        NONE,
+        CUSTOM,
+        GAUSSIAN
+      };
+
+      /// \brief Constructor. This should not be called directly unless creating
+      /// an empty noise model. Use NoiseFactory::NewNoiseModel to instantiate
+      /// a new noise model.
+      /// \param[in] _type Type of noise model.
+      /// \sa NoiseFactory::NewNoiseModel
+      public: explicit Noise(NoiseType _type);
+
+      /// \brief Destructor.
+      public: virtual ~Noise();
+
+      /// \brief Load noise parameters from sdf.
+      /// \param[in] _sdf SDF parameters.
+      /// \param[in] _sensor Type of sensor.
+      public: virtual void Load(sdf::ElementPtr _sdf);
+
+      /// \brief Apply noise to input data value.
+      /// \param[in] _in Input data value.
+      /// \return Data with noise applied.
+      public: double Apply(double _in);
+
+      /// \brief Apply noise to input data value. This gets overriden by
+      /// derived classes, and called by Apply.
+      /// \param[in] _in Input data value.
+      /// \return Data with noise applied.
+      public: virtual double ApplyImpl(double _in);
+
+      /// \brief Finalize the noise model
+      public: virtual void Fini();
+
+      /// \brief Accessor for NoiseType.
+      /// \return Type of noise currently in use.
+      public: NoiseType GetNoiseType() const;
+
+      /// \brief Register a custom noise callback.
+      /// \param[in] _cb Callback function for applying a custom noise model.
+      /// This is useful if users want to use their own noise model from a
+      /// sensor plugin.
+      public: virtual void SetCustomNoiseCallback(
+          boost::function<double (double)> _cb);
+
+      /// \brief Set camera needed to create image noise. This is only needed
+      /// for image sensors, i.e. camera/multicamera/depth sensors, which use
+      /// shaders for more efficient noise generation.
+      /// \param[in] _camera Camera associated to an image sensor
+      public: virtual void SetCamera(rendering::CameraPtr _camera);
+
+      /// \brief Which type of noise we're applying
+      private: NoiseType type;
+
+      /// \brief Noise sdf element.
+      private: sdf::ElementPtr sdf;
+
+      /// \brief Callback function for applying custom noise to sensor data.
+      private: boost::function<double (double)> customNoiseCallback;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/sensors/Noise_TEST.cc b/gazebo/sensors/Noise_TEST.cc
new file mode 100644
index 0000000..ce7029d
--- /dev/null
+++ b/gazebo/sensors/Noise_TEST.cc
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+
+#include <boost/accumulators/accumulators.hpp>
+#include <boost/accumulators/statistics/stats.hpp>
+#include <boost/accumulators/statistics/mean.hpp>
+#include <boost/accumulators/statistics/variance.hpp>
+
+#include "gazebo/math/Rand.hh"
+#include "gazebo/sensors/Noise.hh"
+#include "gazebo/sensors/GaussianNoiseModel.hh"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class NoiseTest : public gazebo::testing::AutoLogFixture { };
+
+const unsigned int g_applyCount = 100;
+
+// We will use 5 sigma (4e-5 chance of failure)
+const double g_sigma = 5.0;
+
+////////////////////////////////////////////////////////////////
+// Helper function that constructs sdf strings for noise element
+sdf::ElementPtr NoiseSdf(const std::string &_type, double _mean,
+  double _stddev, double _biasMean, double _biasStddev, double _precision)
+{
+  std::ostringstream noiseStream;
+  noiseStream << "<sdf version='1.4'>"
+              << "  <noise type='" << _type << "'>"
+              << "    <mean>" << _mean << "</mean>"
+              << "    <stddev>" << _stddev << "</stddev>"
+              << "    <bias_mean>" << _biasMean << "</bias_mean>"
+              << "    <bias_stddev>" << _biasStddev << "</bias_stddev>"
+              << "    <precision>" << _precision << "</precision>"
+              << "  </noise>"
+              << "</sdf>";
+
+  sdf::ElementPtr sdf(new sdf::Element);
+  sdf::initFile("noise.sdf", sdf);
+  sdf::readString(noiseStream.str(), sdf);
+
+  return sdf;
+}
+
+//////////////////////////////////////////////////
+// Test constructor
+TEST_F(NoiseTest, Constructor)
+{
+  // Construct and nothing else
+  {
+    sensors::Noise noise(sensors::Noise::NONE);
+  }
+
+  // Construct and initialize
+  {
+    sensors::Noise noise(sensors::Noise::NONE);
+    noise.Load(NoiseSdf("none", 0, 0, 0, 0, 0));
+  }
+}
+
+//////////////////////////////////////////////////
+// Test noise types
+TEST_F(NoiseTest, Types)
+{
+  // NONE type
+  {
+    sensors::NoisePtr noise =
+        sensors::NoiseFactory::NewNoiseModel(NoiseSdf("none", 0, 0, 0, 0, 0));
+    EXPECT_EQ(noise->GetNoiseType(), sensors::Noise::NONE);
+  }
+
+  // GAUSSIAN type
+  {
+    sensors::NoisePtr noise =
+        sensors::NoiseFactory::NewNoiseModel(
+        NoiseSdf("gaussian", 0, 0, 0, 0, 0));
+    EXPECT_EQ(noise->GetNoiseType(), sensors::Noise::GAUSSIAN);
+  }
+
+  // GAUSSIAN_QUANTIZED type
+  {
+    sensors::NoisePtr noise =
+        sensors::NoiseFactory::NewNoiseModel(
+        NoiseSdf("gaussian_quantized", 0, 0, 0, 0, 0));
+    EXPECT_EQ(noise->GetNoiseType(), sensors::Noise::GAUSSIAN);
+  }
+}
+
+//////////////////////////////////////////////////
+// Helper function for testing no noise
+void NoNoise(sensors::NoisePtr _noise, unsigned int _count)
+{
+  // Expect no change in input value
+  for (unsigned int i = 0; i < _count; ++i)
+  {
+    double x = math::Rand::GetDblUniform(-1e6, 1e6);
+    EXPECT_NEAR(x, _noise->Apply(x), 1e-6);
+  }
+}
+
+//////////////////////////////////////////////////
+// Helper function for testing Gaussian noise
+void GaussianNoise(sensors::NoisePtr _noise, unsigned int _count)
+{
+  sensors::GaussianNoiseModelPtr noiseModel =
+      boost::dynamic_pointer_cast<sensors::GaussianNoiseModel>(_noise);
+
+  ASSERT_TRUE(noiseModel);
+
+  // Use constant input and repeatedly add noise to it.
+  double x = 42.0;
+
+  // boost code from http://stackoverflow.com/questions/3534335
+  boost::accumulators::accumulator_set<double,
+    boost::accumulators::stats<boost::accumulators::tag::mean,
+                               boost::accumulators::tag::variance > > acc;
+
+  for (unsigned int i = 0; i < _count; ++i)
+  {
+    double y = _noise->Apply(x);
+    acc(y);
+  }
+
+  // The sample mean should be near x+mean, with standard deviation of
+  // stddev / sqrt(_count)
+  // https://onlinecourses.science.psu.edu/stat414/node/167
+  // We will use 5 sigma (4e-5 chance of failure)
+  double mean = noiseModel->GetMean() + noiseModel->GetBias();
+  double stddev = noiseModel->GetStdDev();
+  double sampleStdDev = g_sigma*stddev / sqrt(_count);
+  EXPECT_NEAR(boost::accumulators::mean(acc), x+mean, sampleStdDev);
+
+  // The sample variance has the following variance:
+  // 2 stddev^4 / (_count - 1)
+  // en.wikipedia.org/wiki/Variance#Distribution_of_the_sample_variance
+  // Again use 5 sigma
+  double variance = stddev*stddev;
+  double sampleVariance2 = 2 * variance*variance / (_count - 1);
+  EXPECT_NEAR(boost::accumulators::variance(acc),
+              variance, g_sigma*sqrt(sampleVariance2));
+}
+
+//////////////////////////////////////////////////
+// Test noise application
+TEST_F(NoiseTest, ApplyNone)
+{
+  sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+      NoiseSdf("none", 0, 0, 0, 0, 0));
+
+  NoNoise(noise, g_applyCount);
+}
+
+TEST_F(NoiseTest, ApplyGaussian)
+{
+  double mean, stddev, biasMean, biasStddev;
+
+  // GAUSSIAN with zero means and standard deviations
+  // should be the same as NONE
+  mean = 0.0;
+  stddev = 0.0;
+  biasMean = 0.0;
+  biasStddev = 0.0;
+  {
+    sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+        NoiseSdf("gaussian", mean, stddev, biasMean, biasStddev, 0));
+    NoNoise(noise, g_applyCount);
+  }
+
+  // GAUSSIAN with non-zero means and standard deviations, but no bias
+  mean = 10.0;
+  stddev = 5.0;
+  biasMean = 0.0;
+  biasStddev = 0.0;
+  {
+    sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+        NoiseSdf("gaussian", mean, stddev, biasMean, biasStddev, 0));
+    sensors::GaussianNoiseModelPtr gaussianNoise =
+      boost::dynamic_pointer_cast<sensors::GaussianNoiseModel>(noise);
+    EXPECT_NEAR(gaussianNoise->GetBias(), 0.0, 1e-6);
+    GaussianNoise(noise, g_applyCount);
+  }
+
+  // GAUSSIAN with non-zero mean, exact bias, and standard deviations
+  mean = 10.0;
+  stddev = 5.0;
+  biasMean = 100.0;
+  biasStddev = 0.0;
+  {
+    sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+        NoiseSdf("gaussian", mean, stddev, biasMean, biasStddev, 0));
+    GaussianNoise(noise, g_applyCount);
+  }
+
+  // Test bias generation
+  mean = 0.0;
+  stddev = 0.0;
+  biasMean = 0.0;
+  biasStddev = 5.0;
+  {
+    boost::accumulators::accumulator_set<double,
+      boost::accumulators::stats<boost::accumulators::tag::mean,
+                                 boost::accumulators::tag::variance > > acc;
+
+    for (unsigned int i = 0; i < g_applyCount; ++i)
+    {
+      sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+          NoiseSdf("gaussian", mean, stddev, biasMean, biasStddev, 0));
+      sensors::GaussianNoiseModelPtr gaussianNoise =
+        boost::dynamic_pointer_cast<sensors::GaussianNoiseModel>(noise);
+      acc(gaussianNoise->GetBias());
+    }
+
+    // See comments in GaussianNoise function to explain these calculations.
+    double sampleStdDev = g_sigma*biasStddev / sqrt(g_applyCount);
+    EXPECT_NEAR(boost::accumulators::mean(acc), 0.0, sampleStdDev);
+
+    double variance = biasStddev*biasStddev;
+    double sampleVariance2 = 2 * variance*variance / (g_applyCount - 1);
+    EXPECT_NEAR(boost::accumulators::variance(acc),
+                variance, g_sigma*sqrt(sampleVariance2));
+  }
+}
+
+TEST_F(NoiseTest, ApplyGaussianQuantized)
+{
+  double mean, stddev, biasMean, biasStddev, precision;
+
+  // GAUSSIAN_QUANTIZED with zero means and standard deviations
+  // should be the same as NONE
+  mean = 0.0;
+  stddev = 0.0;
+  biasMean = 0.0;
+  biasStddev = 0.0;
+  precision = 0.0;
+  {
+    sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+        NoiseSdf("gaussian_quantized", mean, stddev, biasMean,
+        biasStddev, precision));
+
+    NoNoise(noise, g_applyCount);
+  }
+
+  // GAUSSIAN_QUANTIZED with non-zero means and standard deviations,
+  // but no bias or precision
+  mean = 10.0;
+  stddev = 5.0;
+  biasMean = 0.0;
+  biasStddev = 0.0;
+  precision = 0.0;
+  {
+    sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+        NoiseSdf("gaussian_quantized", mean, stddev, biasMean,
+        biasStddev, precision));
+    sensors::GaussianNoiseModelPtr gaussianNoise =
+      boost::dynamic_pointer_cast<sensors::GaussianNoiseModel>(noise);
+    EXPECT_NEAR(gaussianNoise->GetBias(), 0.0, 1e-6);
+
+    GaussianNoise(noise, g_applyCount);
+  }
+
+  // GAUSSIAN with non-zero mean, exact bias, and standard deviations
+  // no precision specified
+  mean = 10.0;
+  stddev = 5.0;
+  biasMean = 100.0;
+  biasStddev = 0.0;
+  precision = 0.0;
+  {
+    sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+        NoiseSdf("gaussian_quantized", mean, stddev, biasMean,
+        biasStddev, precision));
+
+    GaussianNoise(noise, g_applyCount);
+  }
+
+  // Test bias generation
+  mean = 0.0;
+  stddev = 0.0;
+  biasMean = 0.0;
+  biasStddev = 5.0;
+  precision = 0.0;
+  {
+    boost::accumulators::accumulator_set<double,
+      boost::accumulators::stats<boost::accumulators::tag::mean,
+                                 boost::accumulators::tag::variance > > acc;
+
+    for (unsigned int i = 0; i < g_applyCount; ++i)
+    {
+      sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+          NoiseSdf("gaussian_quantized", mean, stddev, biasMean,
+          biasStddev, precision));
+      sensors::GaussianNoiseModelPtr gaussianNoise =
+        boost::dynamic_pointer_cast<sensors::GaussianNoiseModel>(noise);
+      acc(gaussianNoise->GetBias());
+    }
+
+    // See comments in GaussianNoise function to explain these calculations.
+    double sampleStdDev = g_sigma*biasStddev / sqrt(g_applyCount);
+    EXPECT_NEAR(boost::accumulators::mean(acc), 0.0, sampleStdDev);
+
+    double variance = biasStddev*biasStddev;
+    double sampleVariance2 = 2 * variance*variance / (g_applyCount - 1);
+    EXPECT_NEAR(boost::accumulators::variance(acc),
+                variance, g_sigma*sqrt(sampleVariance2));
+  }
+
+  // Test precision
+  mean = 0.0;
+  stddev = 0.0;
+  biasMean = 0.0;
+  biasStddev = 0.0;
+  precision = 0.3;
+  {
+    sensors::NoisePtr noise = sensors::NoiseFactory::NewNoiseModel(
+        NoiseSdf("gaussian_quantized", mean, stddev, biasMean,
+        biasStddev, precision));
+
+    EXPECT_NEAR(noise->Apply(0.32), 0.3, 1e-6);
+    EXPECT_NEAR(noise->Apply(0.31), 0.3, 1e-6);
+    EXPECT_NEAR(noise->Apply(0.30), 0.3, 1e-6);
+    EXPECT_NEAR(noise->Apply(0.29), 0.3, 1e-6);
+    EXPECT_NEAR(noise->Apply(0.28), 0.3, 1e-6);
+
+    EXPECT_NEAR(noise->Apply(-12.92), -12.9, 1e-6);
+    EXPECT_NEAR(noise->Apply(-12.91), -12.9, 1e-6);
+    EXPECT_NEAR(noise->Apply(-12.90), -12.9, 1e-6);
+    EXPECT_NEAR(noise->Apply(-12.89), -12.9, 1e-6);
+    EXPECT_NEAR(noise->Apply(-12.88), -12.9, 1e-6);
+  }
+}
+
+//////////////////////////////////////////////////
+// Callback function for applying custom noise
+double OnApplyCustomNoise(double _in)
+{
+  return _in*2;
+}
+
+TEST_F(NoiseTest, OnApplyNoise)
+{
+  // Verify that the custom callback function is called if noise type is
+  // set to CUSTOM
+  sensors::NoisePtr noise(new sensors::Noise(sensors::Noise::CUSTOM));
+  ASSERT_TRUE(noise);
+  EXPECT_TRUE(noise->GetNoiseType() == sensors::Noise::CUSTOM);
+
+  noise->SetCustomNoiseCallback(
+    boost::bind(&OnApplyCustomNoise, _1));
+
+  for (double i = 0; i < 100; i += 1)
+  {
+    double value = noise->Apply(i);
+    EXPECT_DOUBLE_EQ(value, i*2);
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/sensors/RFIDSensor.cc b/gazebo/sensors/RFIDSensor.cc
index 20c76ee..3c5a0d3 100644
--- a/gazebo/sensors/RFIDSensor.cc
+++ b/gazebo/sensors/RFIDSensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -69,7 +69,7 @@ void RFIDSensor::Load(const std::string &_worldName)
   if (this->sdf->GetElement("topic"))
   {
     this->scanPub = this->node->Advertise<msgs::Pose>(
-        this->sdf->GetElement("topic")->GetValueString());
+        this->sdf->GetElement("topic")->Get<std::string>());
   }
 
   this->entity = this->world->GetEntity(this->parentName);
@@ -123,7 +123,7 @@ void RFIDSensor::Init()
 }
 
 //////////////////////////////////////////////////
-void RFIDSensor::UpdateImpl(bool /*_force*/)
+bool RFIDSensor::UpdateImpl(bool /*_force*/)
 {
   this->EvaluateTags();
   this->lastMeasurementTime = this->world->GetSimTime();
@@ -134,6 +134,8 @@ void RFIDSensor::UpdateImpl(bool /*_force*/)
     msgs::Set(&msg, this->entity->GetWorldPose());
     this->scanPub->Publish(msg);
   }
+
+  return true;
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/sensors/RFIDSensor.hh b/gazebo/sensors/RFIDSensor.hh
index ea93ca0..36db436 100644
--- a/gazebo/sensors/RFIDSensor.hh
+++ b/gazebo/sensors/RFIDSensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@
 #include "gazebo/math/Pose.hh"
 
 #include "gazebo/sensors/Sensor.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -46,7 +47,7 @@ namespace gazebo
 
     /// \class RFIDSensor RFIDSensor.hh sensors/sensors.hh
     /// \brief Sensor class for RFID type of sensor
-    class RFIDSensor: public Sensor
+    class GAZEBO_VISIBLE RFIDSensor: public Sensor
     {
       /// \brief Constructor
       public: RFIDSensor();
@@ -67,7 +68,8 @@ namespace gazebo
       // Documentation inherited
       public: void AddTag(RFIDTag *_tag);
 
-      protected: virtual void UpdateImpl(bool _force);
+      // Documentation inherited.
+      protected: virtual bool UpdateImpl(bool _force);
 
       // Documentation inherited
       public: virtual void Fini();
diff --git a/gazebo/sensors/RFIDTag.cc b/gazebo/sensors/RFIDTag.cc
index 0604b1a..f438734 100644
--- a/gazebo/sensors/RFIDTag.cc
+++ b/gazebo/sensors/RFIDTag.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -48,7 +48,7 @@ RFIDTag::~RFIDTag()
 }
 
 /////////////////////////////////////////////////
-void RFIDTag::Load(const std::string &_worldName, sdf::ElementPtr &_sdf)
+void RFIDTag::Load(const std::string &_worldName, sdf::ElementPtr _sdf)
 {
   Sensor::Load(_worldName, _sdf);
 }
@@ -61,7 +61,7 @@ void RFIDTag::Load(const std::string &_worldName)
   if (this->sdf->GetElement("topic"))
   {
     this->scanPub = this->node->Advertise<msgs::Pose>(
-        this->sdf->GetElement("topic")->GetValueString());
+        this->sdf->GetElement("topic")->Get<std::string>());
   }
 
   this->entity = this->world->GetEntity(this->parentName);
@@ -91,7 +91,7 @@ void RFIDTag::Init()
 }
 
 //////////////////////////////////////////////////
-void RFIDTag::UpdateImpl(bool /*_force*/)
+bool RFIDTag::UpdateImpl(bool /*_force*/)
 {
   if (this->scanPub)
   {
@@ -111,7 +111,7 @@ void RFIDTag::UpdateImpl(bool /*_force*/)
     // msg.set_range_min( this->GetRangeMin() );
     // msg.set_range_max( this->GetRangeMax() );
 
-    // for (unsigned int i=0; i < (unsigned int)this->GetRangeCount(); i++)
+    // for (unsigned int i = 0; i < (unsigned int)this->GetRangeCount(); i++)
     // {
     //   msg.add_ranges(this->laserShape->GetRange(i));
     //   msg.add_intensities(0);
@@ -120,4 +120,6 @@ void RFIDTag::UpdateImpl(bool /*_force*/)
     this->scanPub->Publish(msg);
     // std::cout << "update impl for rfidtag called" << std::endl;
   }
+
+  return true;
 }
diff --git a/gazebo/sensors/RFIDTag.hh b/gazebo/sensors/RFIDTag.hh
index 857fc36..8d70c3a 100644
--- a/gazebo/sensors/RFIDTag.hh
+++ b/gazebo/sensors/RFIDTag.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@
 #include "gazebo/sensors/Sensor.hh"
 #include "gazebo/math/gzmath.hh"
 #include "gazebo/physics/physics.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -39,7 +40,7 @@ namespace gazebo
 
     /// \class RFIDTag RFIDTag.hh sensors/sensors.hh
     /// \brief RFIDTag to interact with RFIDTagSensors
-    class RFIDTag: public Sensor
+    class GAZEBO_VISIBLE RFIDTag: public Sensor
     {
       /// \brief Constructor.
       public: RFIDTag();
@@ -49,7 +50,7 @@ namespace gazebo
 
       // Documentation inherited
       public: virtual void Load(const std::string & _worldName,
-                                sdf::ElementPtr &_sdf);
+                                sdf::ElementPtr _sdf);
 
       // Documentation inherited
       public: virtual void Load(const std::string & _worldName);
@@ -58,7 +59,7 @@ namespace gazebo
       public: virtual void Init();
 
       // Documentation inherited
-      protected: virtual void UpdateImpl(bool _force);
+      protected: virtual bool UpdateImpl(bool _force);
 
       // Documentation inherited
       public: virtual void Fini();
diff --git a/gazebo/sensors/RaySensor.cc b/gazebo/sensors/RaySensor.cc
index 5610fff..ad18dac 100644
--- a/gazebo/sensors/RaySensor.cc
+++ b/gazebo/sensors/RaySensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,9 +22,8 @@
 #include "gazebo/physics/World.hh"
 #include "gazebo/physics/MultiRayShape.hh"
 #include "gazebo/physics/PhysicsEngine.hh"
-#include "gazebo/physics/Physics.hh"
+#include "gazebo/physics/PhysicsIface.hh"
 #include "gazebo/physics/Model.hh"
-#include "gazebo/physics/Link.hh"
 #include "gazebo/physics/Collision.hh"
 
 #include "gazebo/common/Assert.hh"
@@ -39,6 +38,7 @@
 
 #include "gazebo/sensors/SensorFactory.hh"
 #include "gazebo/sensors/RaySensor.hh"
+#include "gazebo/sensors/Noise.hh"
 
 using namespace gazebo;
 using namespace sensors;
@@ -54,11 +54,6 @@ RaySensor::RaySensor()
 //////////////////////////////////////////////////
 RaySensor::~RaySensor()
 {
-  this->laserCollision->Fini();
-  this->laserCollision.reset();
-
-  this->laserShape->Fini();
-  this->laserShape.reset();
 }
 
 //////////////////////////////////////////////////
@@ -76,7 +71,7 @@ void RaySensor::Load(const std::string &_worldName)
 {
   Sensor::Load(_worldName);
   this->scanPub = this->node->Advertise<msgs::LaserScanStamped>(
-      this->GetTopic());
+      this->GetTopic(), 50);
 
   GZ_ASSERT(this->world != NULL,
       "RaySensor did not get a valid World pointer");
@@ -106,24 +101,12 @@ void RaySensor::Load(const std::string &_worldName)
   this->laserShape->Init();
 
   // Handle noise model settings.
-  this->noiseActive = false;
   sdf::ElementPtr rayElem = this->sdf->GetElement("ray");
   if (rayElem->HasElement("noise"))
   {
-    sdf::ElementPtr noiseElem = rayElem->GetElement("noise");
-    std::string type = noiseElem->GetValueString("type");
-    if (type == "gaussian")
-    {
-      this->noiseType = GAUSSIAN;
-      this->noiseMean = noiseElem->GetValueDouble("mean");
-      this->noiseStdDev = noiseElem->GetValueDouble("stddev");
-      this->noiseActive = true;
-      gzlog << "applying Gaussian noise model with mean " << this->noiseMean <<
-        " and stddev " << this->noiseStdDev << std::endl;
-    }
-    else
-      gzwarn << "ignoring unknown noise model type \"" << type << "\"" <<
-        std::endl;
+    this->noises.push_back(
+        NoiseFactory::NewNoiseModel(rayElem->GetElement("noise"),
+        this->GetType()));
   }
 
   this->parentEntity = this->world->GetEntity(this->parentName);
@@ -143,30 +126,56 @@ void RaySensor::Init()
 void RaySensor::Fini()
 {
   Sensor::Fini();
+
+  this->scanPub.reset();
+
+  if (this->laserCollision)
+  {
+    this->laserCollision->Fini();
+    this->laserCollision.reset();
+  }
+
+  if (this->laserShape)
+  {
+    this->laserShape->Fini();
+    this->laserShape.reset();
+  }
 }
 
 //////////////////////////////////////////////////
 math::Angle RaySensor::GetAngleMin() const
 {
-  return this->laserShape->GetMinAngle();
+  if (this->laserShape)
+    return this->laserShape->GetMinAngle();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
 math::Angle RaySensor::GetAngleMax() const
 {
-  return this->laserShape->GetMaxAngle();
+  if (this->laserShape)
+    return this->laserShape->GetMaxAngle();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
 double RaySensor::GetRangeMin() const
 {
-  return this->laserShape->GetMinRange();
+  if (this->laserShape)
+    return this->laserShape->GetMinRange();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
 double RaySensor::GetRangeMax() const
 {
-  return this->laserShape->GetMaxRange();
+  if (this->laserShape)
+    return this->laserShape->GetMaxRange();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
@@ -179,13 +188,19 @@ double RaySensor::GetAngleResolution() const
 //////////////////////////////////////////////////
 double RaySensor::GetRangeResolution() const
 {
-  return this->laserShape->GetResRange();
+  if (this->laserShape)
+    return this->laserShape->GetResRange();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
 int RaySensor::GetRayCount() const
 {
-  return this->laserShape->GetSampleCount();
+  if (this->laserShape)
+    return this->laserShape->GetSampleCount();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
@@ -193,33 +208,55 @@ int RaySensor::GetRangeCount() const
 {
   // TODO: maybe should check against this->laserMsg.ranges_size()
   //       as users use this to loop through GetRange() calls
-  return this->laserShape->GetSampleCount() *
-    this->laserShape->GetScanResolution();
+  if (this->laserShape)
+    return this->laserShape->GetSampleCount() *
+      this->laserShape->GetScanResolution();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
 int RaySensor::GetVerticalRayCount() const
 {
-  return this->laserShape->GetVerticalSampleCount();
+  if (this->laserShape)
+    return this->laserShape->GetVerticalSampleCount();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
 int RaySensor::GetVerticalRangeCount() const
 {
-  return this->laserShape->GetVerticalSampleCount() *
-         this->laserShape->GetVerticalScanResolution();
+  if (this->laserShape)
+    return this->laserShape->GetVerticalSampleCount() *
+      this->laserShape->GetVerticalScanResolution();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
 math::Angle RaySensor::GetVerticalAngleMin() const
 {
-  return this->laserShape->GetVerticalMinAngle();
+  if (this->laserShape)
+    return this->laserShape->GetVerticalMinAngle();
+  else
+    return -1;
 }
 
 //////////////////////////////////////////////////
 math::Angle RaySensor::GetVerticalAngleMax() const
 {
-  return this->laserShape->GetVerticalMaxAngle();
+  if (this->laserShape)
+    return this->laserShape->GetVerticalMaxAngle();
+  else
+    return -1;
+}
+
+//////////////////////////////////////////////////
+double RaySensor::GetVerticalAngleResolution() const
+{
+  return (this->GetVerticalAngleMax() - this->GetVerticalAngleMin()).Radian() /
+    (this->GetVerticalRangeCount()-1);
 }
 
 //////////////////////////////////////////////////
@@ -233,7 +270,7 @@ void RaySensor::GetRanges(std::vector<double> &_ranges)
 }
 
 //////////////////////////////////////////////////
-double RaySensor::GetRange(int _index)
+double RaySensor::GetRange(unsigned int _index)
 {
   boost::mutex::scoped_lock lock(this->mutex);
 
@@ -242,7 +279,7 @@ double RaySensor::GetRange(int _index)
     gzwarn << "ranges not constructed yet (zero sized)\n";
     return 0.0;
   }
-  if (_index < 0 || _index >= this->laserMsg.scan().ranges_size())
+  if (static_cast<int>(_index) >= this->laserMsg.scan().ranges_size())
   {
     gzerr << "Invalid range index[" << _index << "]\n";
     return 0.0;
@@ -252,21 +289,49 @@ double RaySensor::GetRange(int _index)
 }
 
 //////////////////////////////////////////////////
-double RaySensor::GetRetro(int index)
+double RaySensor::GetRetro(unsigned int _index)
 {
   boost::mutex::scoped_lock lock(this->mutex);
-  return this->laserShape->GetRetro(index);
+
+  if (this->laserMsg.scan().intensities_size() == 0)
+  {
+    gzwarn << "Intensities not constructed yet (zero size)\n";
+    return 0.0;
+  }
+  if (static_cast<int>(_index) >= this->laserMsg.scan().intensities_size())
+  {
+    gzerr << "Invalid intensity index[" << _index << "]\n";
+    return 0.0;
+  }
+
+  return this->laserMsg.scan().intensities(_index);
 }
 
 //////////////////////////////////////////////////
-int RaySensor::GetFiducial(int index)
+int RaySensor::GetFiducial(unsigned int _index)
 {
   boost::mutex::scoped_lock lock(this->mutex);
-  return this->laserShape->GetFiducial(index);
+
+  // Convert range index to ray index.
+  // Find vertical/horizontal range indices (vIdx, hIdx) and mulitply
+  // by the ratio of ray count to range count to get the vertical/horizontal
+  // ray indices, which are then used to compute the final index into ray array.
+  int vIdx = _index / this->GetRangeCount();
+  vIdx = vIdx * this->GetVerticalRayCount() / this->GetVerticalRangeCount();
+  int hIdx = _index % this->GetRangeCount();
+  hIdx = hIdx * this->GetRayCount() / this->GetRangeCount();
+  int idx = vIdx * this->GetRayCount()  + hIdx;
+
+  if (idx >=  this->GetRayCount() * this->GetVerticalRayCount())
+  {
+    gzerr << "Invalid fiducial index[" << _index << "]\n";
+    return 0.0;
+  }
+  return this->laserShape->GetFiducial(idx);
 }
 
 //////////////////////////////////////////////////
-void RaySensor::UpdateImpl(bool /*_force*/)
+bool RaySensor::UpdateImpl(bool /*_force*/)
 {
   // do the collision checks
   // this eventually call OnNewScans, so move mutex lock behind it in case
@@ -288,6 +353,12 @@ void RaySensor::UpdateImpl(bool /*_force*/)
   scan->set_angle_min(this->GetAngleMin().Radian());
   scan->set_angle_max(this->GetAngleMax().Radian());
   scan->set_angle_step(this->GetAngleResolution());
+  scan->set_count(this->GetRangeCount());
+
+  scan->set_vertical_angle_min(this->GetVerticalAngleMin().Radian());
+  scan->set_vertical_angle_max(this->GetVerticalAngleMax().Radian());
+  scan->set_vertical_angle_step(this->GetVerticalAngleResolution());
+  scan->set_vertical_count(this->GetVerticalRangeCount());
 
   scan->set_range_min(this->GetRangeMin());
   scan->set_range_max(this->GetRangeMax());
@@ -295,36 +366,124 @@ void RaySensor::UpdateImpl(bool /*_force*/)
   scan->clear_ranges();
   scan->clear_intensities();
 
-  // todo: add loop for vertical range count
-  for (unsigned int j = 0; j < (unsigned int)this->GetVerticalRayCount(); j++)
-  for (unsigned int i = 0; i < (unsigned int)this->GetRayCount(); i++)
+  unsigned int rayCount = this->GetRayCount();
+  unsigned int rangeCount = this->GetRangeCount();
+  unsigned int verticalRayCount = this->GetVerticalRayCount();
+  unsigned int verticalRangeCount = this->GetVerticalRangeCount();
+
+  // Interpolation: for every point in range count, compute interpolated value
+  // using four bounding ray samples.
+  // (vja, hja)   (vja, hjb)
+  //       x---------x
+  //       |         |
+  //       |    o    |
+  //       |         |
+  //       x---------x
+  // (vjb, hja)   (vjb, hjb)
+  // where o: is the range to be interpolated
+  //       x: ray sample
+  //       vja: is the previous index of ray in vertical direction
+  //       vjb: is the next index of ray in vertical direction
+  //       hja: is the previous index of ray in horizontal direction
+  //       hjb: is the next index of ray in horizontal direction
+  unsigned int hja, hjb;
+  unsigned int vja = 0, vjb = 0;
+  // percentage of interpolation between rays
+  double vb = 0, hb;
+  // indices of ray samples
+  int j1, j2, j3, j4;
+  // range values of ray samples
+  double r1, r2, r3, r4;
+
+  // Check for the common case of vertical and horizontal resolution being 1,
+  // which means that ray count == range count and we can do simple lookup
+  // of ranges and intensity data, skipping interpolation.  We could do this
+  // check independently for vertical and horizontal, but that's more
+  // complexity for an unlikely use case.
+  bool interp =
+    ((rayCount != rangeCount) || (verticalRayCount != verticalRangeCount));
+
+  // interpolate in vertical direction
+  for (unsigned int j = 0; j < verticalRangeCount; ++j)
   {
-    double range = this->laserShape->GetRange(j * this->GetRayCount() + i);
-    if (this->noiseActive)
+    if (interp)
     {
-      switch (this->noiseType)
+      vb = (verticalRangeCount == 1) ? 0 :
+          static_cast<double>(j * (verticalRayCount - 1))
+          / (verticalRangeCount - 1);
+      vja = static_cast<int>(floor(vb));
+      vjb = std::min(vja + 1, verticalRayCount - 1);
+      vb = vb - floor(vb);
+
+      GZ_ASSERT(vja < verticalRayCount,
+          "Invalid vertical ray index used for interpolation");
+      GZ_ASSERT(vjb < verticalRayCount,
+          "Invalid vertical ray index used for interpolation");
+    }
+    // interpolate in horizontal direction
+    for (unsigned int i = 0; i < rangeCount; ++i)
+    {
+      double range, intensity;
+      if (interp)
       {
-        case GAUSSIAN:
-          // Add independent (uncorrelated) Gaussian noise to each beam.
-          range += math::Rand::GetDblNormal(this->noiseMean, this->noiseStdDev);
-          // No real laser would return a range outside its stated limits.
-          range = math::clamp(range, this->GetRangeMin(), this->GetRangeMax());
-          break;
-        default:
-          GZ_ASSERT(false, "Invalid noise model type");
+        hb = (rangeCount == 1)? 0 : static_cast<double>(i * (rayCount - 1))
+            / (rangeCount - 1);
+        hja = static_cast<int>(floor(hb));
+        hjb = std::min(hja + 1, rayCount - 1);
+        hb = hb - floor(hb);
+
+        GZ_ASSERT(hja < rayCount,
+            "Invalid horizontal ray index used for interpolation");
+        GZ_ASSERT(hjb < rayCount,
+            "Invalid horizontal ray index used for interpolation");
+
+        // indices of 4 corners
+        j1 = hja + vja * rayCount;
+        j2 = hjb + vja * rayCount;
+        j3 = hja + vjb * rayCount;
+        j4 = hjb + vjb * rayCount;
+
+        // range readings of 4 corners
+        r1 = this->GetLaserShape()->GetRange(j1);
+        r2 = this->GetLaserShape()->GetRange(j2);
+        r3 = this->GetLaserShape()->GetRange(j3);
+        r4 = this->GetLaserShape()->GetRange(j4);
+        range = (1-vb)*((1 - hb) * r1 + hb * r2)
+            + vb *((1 - hb) * r3 + hb * r4);
+
+        // intensity is averaged
+        intensity = 0.25 * (this->GetLaserShape()->GetRetro(j1)
+            + this->GetLaserShape()->GetRetro(j2)
+            + this->GetLaserShape()->GetRetro(j3)
+            + this->GetLaserShape()->GetRetro(j4));
       }
+      else
+      {
+        range = this->laserShape->GetRange(j * this->GetRayCount() + i);
+        intensity = this->laserShape->GetRetro(j * this->GetRayCount() + i);
+      }
+
+      if (!this->noises.empty())
+      {
+        // currently supports only one noise model per laser sensor
+        range = this->noises[0]->Apply(range);
+        range = math::clamp(range, this->GetRangeMin(), this->GetRangeMax());
+      }
+
+      scan->add_ranges(range);
+      scan->add_intensities(intensity);
     }
-    scan->add_ranges(range);
-    scan->add_intensities(
-        this->laserShape->GetRetro(j * this->GetRayCount() + i));
   }
 
-  if (this->scanPub)
+  if (this->scanPub && this->scanPub->HasConnections())
     this->scanPub->Publish(this->laserMsg);
+
+  return true;
 }
 
 //////////////////////////////////////////////////
 bool RaySensor::IsActive()
 {
-  return Sensor::IsActive() || this->scanPub->HasConnections();
+  return Sensor::IsActive() ||
+    (this->scanPub && this->scanPub->HasConnections());
 }
diff --git a/gazebo/sensors/RaySensor.hh b/gazebo/sensors/RaySensor.hh
index 437d2eb..7f330e5 100644
--- a/gazebo/sensors/RaySensor.hh
+++ b/gazebo/sensors/RaySensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,21 +14,17 @@
  * limitations under the License.
  *
 */
-/* Desc: RaySensor proximity sensor
- * Author: Nate Koenig
- * Date: 23 february 2004
-*/
-
 #ifndef _RAYSENSOR_HH_
 #define _RAYSENSOR_HH_
 
 #include <vector>
 #include <string>
 
-#include "math/Angle.hh"
-#include "math/Pose.hh"
-#include "transport/TransportTypes.hh"
-#include "sensors/Sensor.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -49,7 +45,7 @@ namespace gazebo
     /// This sensor cast rays into the world, tests for intersections, and
     /// reports the range to the nearest object.  It is used by ranging
     /// sensor models (e.g., sonars and scanning laser range finders).
-    class RaySensor: public Sensor
+    class GAZEBO_VISIBLE RaySensor: public Sensor
     {
       /// \brief Constructor
       public: RaySensor();
@@ -64,7 +60,7 @@ namespace gazebo
       public: virtual void Init();
 
       // Documentation inherited
-      protected: virtual void UpdateImpl(bool _force);
+      protected: virtual bool UpdateImpl(bool _force);
 
       // Documentation inherited
       protected: virtual void Fini();
@@ -120,6 +116,10 @@ namespace gazebo
       /// \return The Maximum angle of the scan block
       public: math::Angle GetVerticalAngleMax() const;
 
+      /// \brief Get the vertical angle in radians between each range
+      /// \return Resolution of the angle
+      public: double GetVerticalAngleResolution() const;
+
       /// \brief Get detected range for a ray.
       ///         Warning: If you are accessing all the ray data in a loop
       ///         it's possible that the Ray will update in the middle of
@@ -129,7 +129,7 @@ namespace gazebo
       ///         SetActive(true).
       /// \param[in] _index Index of specific ray
       /// \return Returns DBL_MAX for no detection.
-      public: double GetRange(int _index);
+      public: double GetRange(unsigned int _index);
 
       /// \brief Get all the ranges
       /// \param _ranges A vector that will contain all the range data
@@ -144,7 +144,7 @@ namespace gazebo
       ///         SetActive(true).
       /// \param[in] _index Index of specific ray
       /// \return Retro (intensity) value for ray
-      public: double GetRetro(int _index);
+      public: double GetRetro(unsigned int _index);
 
       /// \brief Get detected fiducial value for a ray.
       ///         Warning: If you are accessing all the ray data in a loop
@@ -155,7 +155,7 @@ namespace gazebo
       ///         SetActive(true).
       /// \param[in] _index Index value of specific ray
       /// \return Fiducial value
-      public: int GetFiducial(int _index);
+      public: int GetFiducial(unsigned int _index);
 
       /// \brief Returns a pointer to the internal physics::MultiRayShape
       /// \return Pointer to ray shape
@@ -172,23 +172,6 @@ namespace gazebo
       private: transport::PublisherPtr scanPub;
       private: boost::mutex mutex;
       private: msgs::LaserScanStamped laserMsg;
-
-      // Which noise type we support
-      private: enum NoiseModelType
-      {
-        NONE,
-        GAUSSIAN
-      };
-      // If true, apply the noise model specified by other noise parameters
-      private: bool noiseActive;
-      // Which type of noise we're applying
-      private: enum NoiseModelType noiseType;
-      // If noiseType==GAUSSIAN, noiseMean is the mean of the distibution
-      // from which we sample
-      private: double noiseMean;
-      // If noiseType==GAUSSIAN, noiseStdDev is the standard devation of
-      // the distibution from which we sample
-      private: double noiseStdDev;
     };
     /// \}
   }
diff --git a/gazebo/sensors/RaySensor_TEST.cc b/gazebo/sensors/RaySensor_TEST.cc
index cb04ad6..fe8ea50 100644
--- a/gazebo/sensors/RaySensor_TEST.cc
+++ b/gazebo/sensors/RaySensor_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
 */
 
 #include <gtest/gtest.h>
-#include "gazebo/sdf/sdf.hh"
+#include <sdf/sdf.hh>
 #include "gazebo/math/Angle.hh"
 #include "test/ServerFixture.hh"
 
@@ -49,6 +49,36 @@ static std::string raySensorString =
 "  </sensor>"
 "</sdf>";
 
+static std::string raySensorScanResString =
+"<sdf version='1.3'>"
+"  <sensor name='laser' type='ray'>"
+"    <always_on>1</always_on>"
+"    <visualize>1</visualize>"
+"    <update_rate>20.000000</update_rate>"
+"    <ray>"
+"      <scan>"
+"        <horizontal>"
+"          <samples>120</samples>"
+"          <resolution>2</resolution>"
+"          <min_angle>-2.2689</min_angle>"
+"          <max_angle>2.2689</max_angle>"
+"        </horizontal>"
+"        <vertical>"
+"          <samples>2</samples>"
+"          <resolution>3</resolution>"
+"          <min_angle>-2.2689</min_angle>"
+"          <max_angle>2.2689</max_angle>"
+"        </vertical>"
+"      </scan>"
+"      <range>"
+"        <min>0.08</min>"
+"        <max>10.0</max>"
+"        <resolution>0.01</resolution>"
+"      </range>"
+"    </ray>"
+"  </sensor>"
+"</sdf>";
+
 /////////////////////////////////////////////////
 /// \brief Test Creation of a Ray sensor
 TEST_F(RaySensor_TEST, CreateLaser)
@@ -62,7 +92,7 @@ TEST_F(RaySensor_TEST, CreateLaser)
 
   // Create the Ray sensor
   std::string sensorName = mgr->CreateSensor(sdf, "default",
-      "ground_plane::link");
+      "ground_plane::link", 0);
 
   // Make sure the returned sensor name is correct
   EXPECT_EQ(sensorName, std::string("default::ground_plane::link::laser"));
@@ -114,6 +144,61 @@ TEST_F(RaySensor_TEST, CreateLaser)
 }
 
 /////////////////////////////////////////////////
+/// \brief Test Creation of a Ray sensor with a scan resolution higher than 1
+TEST_F(RaySensor_TEST, LaserScanResolution)
+{
+  Load("worlds/empty.world");
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+
+  sdf::ElementPtr sdf(new sdf::Element);
+  sdf::initFile("sensor.sdf", sdf);
+  sdf::readString(raySensorScanResString, sdf);
+
+  // Create the Ray sensor
+  std::string sensorName = mgr->CreateSensor(sdf, "default",
+      "ground_plane::link", 0);
+
+  // Make sure the returned sensor name is correct
+  EXPECT_EQ(sensorName, std::string("default::ground_plane::link::laser"));
+
+  // Update the sensor manager so that it can process new sensors.
+  mgr->Update();
+
+  // Get a pointer to the Ray sensor
+  sensors::RaySensorPtr sensor = boost::dynamic_pointer_cast<sensors::RaySensor>
+    (mgr->GetSensor(sensorName));
+
+  // Make sure the above dynamic cast worked.
+  EXPECT_TRUE(sensor != NULL);
+
+  // range count = ray count * resolution
+  EXPECT_EQ(sensor->GetRayCount(), 120);
+  EXPECT_EQ(sensor->GetRangeCount(), 240);
+
+  EXPECT_EQ(sensor->GetVerticalRayCount(), 2);
+  EXPECT_EQ(sensor->GetVerticalRangeCount(), 6);
+
+  EXPECT_TRUE(sensor->IsActive());
+
+  // Update the sensor
+  sensor->Update(true);
+
+  // Get all the range values
+  std::vector<double> ranges;
+  sensor->GetRanges(ranges);
+  EXPECT_EQ(ranges.size(), static_cast<size_t>(240 * 6));
+
+  // Check that all the range values
+  for (unsigned int i = 0; i < ranges.size(); ++i)
+  {
+    EXPECT_NEAR(ranges[i], sensor->GetRangeMax(), 1e-6);
+    EXPECT_NEAR(sensor->GetRange(i), ranges[i], 1e-6);
+    EXPECT_NEAR(sensor->GetRetro(i), 0, 1e-6);
+    EXPECT_EQ(sensor->GetFiducial(i), -1);
+  }
+}
+
+/////////////////////////////////////////////////
 int main(int argc, char **argv)
 {
   ::testing::InitGoogleTest(&argc, argv);
diff --git a/gazebo/sensors/Sensor.cc b/gazebo/sensors/Sensor.cc
index 2828d17..89333e9 100644
--- a/gazebo/sensors/Sensor.cc
+++ b/gazebo/sensors/Sensor.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,49 +19,68 @@
  * Date: 25 May 2007
  */
 
-#include "sdf/sdf.hh"
-#include "transport/transport.hh"
+#include <sdf/sdf.hh>
 
-#include "physics/Physics.hh"
-#include "physics/World.hh"
+#include "gazebo/transport/transport.hh"
 
-#include "common/Timer.hh"
-#include "common/Console.hh"
-#include "common/Exception.hh"
-#include "common/Plugin.hh"
+#include "gazebo/physics/PhysicsIface.hh"
+#include "gazebo/physics/World.hh"
 
-#include "sensors/CameraSensor.hh"
+#include "gazebo/common/Timer.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Plugin.hh"
 
-#include "sensors/Sensor.hh"
-#include "sensors/SensorManager.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/rendering/Scene.hh"
+
+#include "gazebo/sensors/CameraSensor.hh"
+#include "gazebo/sensors/Noise.hh"
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/sensors/SensorManager.hh"
 
 using namespace gazebo;
 using namespace sensors;
 
+sdf::ElementPtr Sensor::sdfSensor;
+
 //////////////////////////////////////////////////
 Sensor::Sensor(SensorCategory _cat)
 {
+  if (!this->sdfSensor)
+  {
+    this->sdfSensor.reset(new sdf::Element);
+    sdf::initFile("sensor.sdf", this->sdfSensor);
+  }
+
   this->category = _cat;
 
-  this->sdf.reset(new sdf::Element);
-  sdf::initFile("sensor.sdf", this->sdf);
+  this->sdf = this->sdfSensor->Clone();
 
   this->active = false;
 
   this->node = transport::NodePtr(new transport::Node());
 
+  this->updateDelay = common::Time(0.0);
   this->updatePeriod = common::Time(0.0);
+
+  this->id = physics::getUniqueId();
 }
 
 //////////////////////////////////////////////////
 Sensor::~Sensor()
 {
-  this->node->Fini();
+  if (this->node)
+    this->node->Fini();
   this->node.reset();
 
-  this->sdf->Reset();
+  if (this->sdf)
+    this->sdf->Reset();
   this->sdf.reset();
   this->connections.clear();
+
+  for (unsigned int i = 0; i < this->noises.size(); ++i)
+    this->noises[i].reset();
 }
 
 //////////////////////////////////////////////////
@@ -76,14 +95,17 @@ void Sensor::Load(const std::string &_worldName)
 {
   if (this->sdf->HasElement("pose"))
   {
-    this->pose = this->sdf->GetValuePose("pose");
+    this->pose = this->sdf->Get<math::Pose>("pose");
   }
 
-  if (this->sdf->GetValueBool("always_on"))
+  if (this->sdf->Get<bool>("always_on"))
     this->SetActive(true);
 
   this->world = physics::get_world(_worldName);
 
+  if (this->category == IMAGE)
+    this->scene = rendering::get_scene(_worldName);
+
   // loaded, but not updated
   this->lastUpdateTime = common::Time(0.0);
 
@@ -94,7 +116,7 @@ void Sensor::Load(const std::string &_worldName)
 //////////////////////////////////////////////////
 void Sensor::Init()
 {
-  this->SetUpdateRate(this->sdf->GetValueDouble("update_rate"));
+  this->SetUpdateRate(this->sdf->Get<double>("update_rate"));
 
   // Load the plugins
   if (this->sdf->HasElement("plugin"))
@@ -119,21 +141,91 @@ void Sensor::SetParent(const std::string &_name)
 }
 
 //////////////////////////////////////////////////
+void Sensor::SetParent(const std::string &_name, uint32_t _id)
+{
+  this->parentName = _name;
+  this->parentId = _id;
+}
+
+//////////////////////////////////////////////////
 std::string Sensor::GetParentName() const
 {
   return this->parentName;
 }
 
 //////////////////////////////////////////////////
+uint32_t Sensor::GetId() const
+{
+  return this->id;
+}
+
+//////////////////////////////////////////////////
+uint32_t Sensor::GetParentId() const
+{
+  return this->parentId;
+}
+
+//////////////////////////////////////////////////
+bool Sensor::NeedsUpdate()
+{
+  // Adjust time-to-update period to compensate for delays caused by another
+  // sensor's update in the same thread.
+
+  common::Time simTime;
+  if (this->category == IMAGE && this->scene)
+    simTime = this->scene->GetSimTime();
+  else
+    simTime = this->world->GetSimTime();
+
+  if (simTime <= this->lastMeasurementTime)
+    return false;
+
+  return (simTime - this->lastMeasurementTime +
+      this->updateDelay) >= this->updatePeriod;
+}
+
+//////////////////////////////////////////////////
 void Sensor::Update(bool _force)
 {
   if (this->IsActive() || _force)
   {
-    if (this->world->GetSimTime() - this->lastUpdateTime >= this->updatePeriod
-        || _force)
+    common::Time simTime;
+    if (this->category == IMAGE && this->scene)
+      simTime = this->scene->GetSimTime();
+    else
+      simTime = this->world->GetSimTime();
+
+    {
+      boost::mutex::scoped_lock lock(this->mutexLastUpdateTime);
+
+      if (simTime <= this->lastUpdateTime && !_force)
+        return;
+
+      // Adjust time-to-update period to compensate for delays caused by another
+      // sensor's update in the same thread.
+      // NOTE: If you change this equation, also change the matching equation in
+      // Sensor::NeedsUpdate
+      common::Time adjustedElapsed = simTime - this->lastUpdateTime +
+        this->updateDelay;
+
+      if (adjustedElapsed < this->updatePeriod && !_force)
+        return;
+
+      this->updateDelay = std::max(common::Time::Zero,
+          adjustedElapsed - this->updatePeriod);
+
+      // if delay is more than a full update period, then give up trying
+      // to catch up. This happens normally when the sensor just changed from
+      // an inactive to an active state, or the sensor just cannot hit its
+      // target update rate (worst case).
+      if (this->updateDelay >= this->updatePeriod)
+        this->updateDelay = common::Time::Zero;
+    }
+
+    if (this->UpdateImpl(_force))
     {
-      this->lastUpdateTime = this->world->GetSimTime();
-      this->UpdateImpl(_force);
+      boost::mutex::scoped_lock lock(this->mutexLastUpdateTime);
+      this->lastUpdateTime = simTime;
       this->updated();
     }
   }
@@ -142,13 +234,17 @@ void Sensor::Update(bool _force)
 //////////////////////////////////////////////////
 void Sensor::Fini()
 {
+  for (unsigned int i= 0; i < this->noises.size(); ++i)
+    this->noises[i]->Fini();
+
+  this->active = false;
   this->plugins.clear();
 }
 
 //////////////////////////////////////////////////
 std::string Sensor::GetName() const
 {
-  return this->sdf->GetValueString("name");
+  return this->sdf->Get<std::string>("name");
 }
 
 //////////////////////////////////////////////////
@@ -161,8 +257,8 @@ std::string Sensor::GetScopedName() const
 //////////////////////////////////////////////////
 void Sensor::LoadPlugin(sdf::ElementPtr _sdf)
 {
-  std::string name = _sdf->GetValueString("name");
-  std::string filename = _sdf->GetValueString("filename");
+  std::string name = _sdf->Get<std::string>("name");
+  std::string filename = _sdf->Get<std::string>("filename");
   gazebo::SensorPluginPtr plugin = gazebo::SensorPlugin::Create(filename, name);
 
   if (plugin)
@@ -177,6 +273,7 @@ void Sensor::LoadPlugin(sdf::ElementPtr _sdf)
 
     SensorPtr myself = shared_from_this();
     plugin->Load(myself, _sdf);
+    plugin->Init();
     this->plugins.push_back(plugin);
   }
 }
@@ -232,13 +329,13 @@ common::Time Sensor::GetLastMeasurementTime()
 //////////////////////////////////////////////////
 std::string Sensor::GetType() const
 {
-  return this->sdf->GetValueString("type");
+  return this->sdf->Get<std::string>("type");
 }
 
 //////////////////////////////////////////////////
 bool Sensor::GetVisualize() const
 {
-  return this->sdf->GetValueBool("visualize");
+  return this->sdf->Get<bool>("visualize");
 }
 
 //////////////////////////////////////////////////
@@ -246,8 +343,8 @@ std::string Sensor::GetTopic() const
 {
   std::string result;
   if (this->sdf->HasElement("topic") &&
-      this->sdf->GetValueString("topic") != "__default__")
-    result = this->sdf->GetValueString("topic");
+      this->sdf->Get<std::string>("topic") != "__default__")
+    result = this->sdf->Get<std::string>("topic");
   return result;
 }
 
@@ -255,8 +352,10 @@ std::string Sensor::GetTopic() const
 void Sensor::FillMsg(msgs::Sensor &_msg)
 {
   _msg.set_name(this->GetName());
+  _msg.set_id(this->GetId());
   _msg.set_type(this->GetType());
   _msg.set_parent(this->GetParentName());
+  _msg.set_parent_id(this->GetParentId());
   msgs::Set(_msg.mutable_pose(), this->GetPose());
 
   _msg.set_visualize(this->GetVisualize());
@@ -284,7 +383,19 @@ SensorCategory Sensor::GetCategory() const
 }
 
 //////////////////////////////////////////////////
+NoisePtr Sensor::GetNoise(unsigned int _index) const
+{
+  if (_index >= this->noises.size())
+  {
+    gzerr << "Get noise index out of range" << std::endl;
+    return NoisePtr();
+  }
+  return this->noises[_index];
+}
+
+//////////////////////////////////////////////////
 void Sensor::ResetLastUpdateTime()
 {
+  boost::mutex::scoped_lock lock(this->mutexLastUpdateTime);
   this->lastUpdateTime = 0.0;
 }
diff --git a/gazebo/sensors/Sensor.hh b/gazebo/sensors/Sensor.hh
index a156db9..6cb9619 100644
--- a/gazebo/sensors/Sensor.hh
+++ b/gazebo/sensors/Sensor.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,18 +23,22 @@
 #define _SENSOR_HH_
 
 #include <boost/enable_shared_from_this.hpp>
+#include <boost/thread/mutex.hpp>
 #include <vector>
 #include <string>
 
-#include "gazebo/sdf/sdf.hh"
+#include <sdf/sdf.hh>
 
 #include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/sensors/SensorTypes.hh"
 
 #include "gazebo/msgs/msgs.hh"
 #include "gazebo/common/Events.hh"
 #include "gazebo/common/Time.hh"
 #include "gazebo/math/Pose.hh"
 #include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -65,7 +69,7 @@ namespace gazebo
 
     /// \class Sensor Sensor.hh sensors/sensors.hh
     /// \brief Base class for sensors
-    class Sensor : public boost::enable_shared_from_this<Sensor>
+    class GAZEBO_VISIBLE Sensor : public boost::enable_shared_from_this<Sensor>
     {
       /// \brief Constructor.
       /// \param[in] _class
@@ -89,7 +93,13 @@ namespace gazebo
 
       /// \brief Set the parent of the sensor.
       /// \param[in] _name Name of the parent.
-      public: virtual void SetParent(const std::string &_name);
+      public: virtual void SetParent(const std::string &_name)
+              GAZEBO_DEPRECATED(2.0);
+
+      /// \brief Set the sensor's parent.
+      /// \param[in] _name The sensor's parent's name.
+      /// \param[in] _id The sensor's parent's ID.
+      public: void SetParent(const std::string &_name, uint32_t _id);
 
       /// \brief Returns the name of the sensor parent.  The parent name is
       ///        set by Sensor::SetParent.
@@ -105,7 +115,8 @@ namespace gazebo
       ///        And in turn, Sensor::Update is called by
       ///        SensorManager::Update
       /// \param[in] _force True if update is forced, false if not
-      protected: virtual void UpdateImpl(bool /*_force*/) {}
+      /// \return True if the sensor was updated.
+      protected: virtual bool UpdateImpl(bool /*_force*/) {return false;}
 
       /// \brief Get the update rate of the sensor.
       /// \return _hz update rate of sensor.  Returns 0 if unthrottled.
@@ -123,7 +134,7 @@ namespace gazebo
       public: std::string GetName() const;
 
       /// \brief Get fully scoped name of the sensor.
-      /// \return world_name::parent_name::sensor_name.
+      /// \return world_name::model_name::link_name::sensor_name.
       public: std::string GetScopedName() const;
 
       /// \brief Get the current pose.
@@ -190,6 +201,24 @@ namespace gazebo
       /// \brief Reset the lastUpdateTime to zero.
       public: void ResetLastUpdateTime();
 
+      /// \brief Get the sensor's ID.
+      /// \return The sensor's ID.
+      public: uint32_t GetId() const;
+
+      /// \brief Get the sensor's parent's ID.
+      /// \return The sensor's parent's ID.
+      public: uint32_t GetParentId() const;
+
+      /// \brief Get the sensor's noise model.
+      /// \param[in] _index Index of the noise model. For most sensors this
+      /// will be 0. For a multi camera sensor the index can be >=0.
+      /// \return The sensor's noise model.
+      public: NoisePtr GetNoise(unsigned int _index = 0) const;
+
+      /// \brief Return true if the sensor needs to be updated.
+      /// \return True when sensor should be updated.
+      protected: bool NeedsUpdate();
+
       /// \brief Load a plugin for this sensor.
       /// \param[in] _sdf SDF parameters.
       private: void LoadPlugin(sdf::ElementPtr _sdf);
@@ -215,12 +244,18 @@ namespace gazebo
       /// \brief Name of the parent.
       protected: std::string parentName;
 
+      /// \brief The sensor's parent ID.
+      protected: uint32_t parentId;
+
       /// \brief All the plugins for the sensor.
       protected: std::vector<SensorPluginPtr> plugins;
 
       /// \brief Pointer to the world.
       protected: gazebo::physics::WorldPtr world;
 
+      /// \brief Pointer to the Scene
+      protected: gazebo::rendering::ScenePtr scene;
+
       /// \brief Desired time between updates, set indirectly by
       ///        Sensor::SetUpdateRate.
       protected: common::Time updatePeriod;
@@ -232,6 +267,12 @@ namespace gazebo
       ///        this value must be updated within each sensor's UpdateImpl
       protected: common::Time lastMeasurementTime;
 
+      /// \brief Noise added to sensor data
+      protected: std::vector<NoisePtr> noises;
+
+      /// \brief Mutex to protect resetting lastUpdateTime.
+      private: boost::mutex mutexLastUpdateTime;
+
       /// \brief Event triggered when a sensor is updated.
       private: event::EventT<void()> updated;
 
@@ -243,6 +284,16 @@ namespace gazebo
 
       /// \brief The category of the sensor.
       private: SensorCategory category;
+
+      /// \brief Keep track how much the update has been delayed.
+      private: common::Time updateDelay;
+
+      /// \brief The sensors unique ID.
+      private: uint32_t id;
+
+      /// \brief An SDF pointer that allows us to only read the sensor.sdf
+      /// file once, which in turns limits disk reads.
+      private: static sdf::ElementPtr sdfSensor;
     };
     /// \}
   }
diff --git a/gazebo/sensors/SensorFactory.cc b/gazebo/sensors/SensorFactory.cc
index 443d629..ea84604 100644
--- a/gazebo/sensors/SensorFactory.cc
+++ b/gazebo/sensors/SensorFactory.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,11 +28,16 @@ void RegisterCameraSensor();
 void RegisterContactSensor();
 void RegisterDepthCameraSensor();
 void RegisterMultiCameraSensor();
-// void RegisterGpuRaySensor();
+void RegisterGpsSensor();
+void RegisterGpuRaySensor();
 void RegisterImuSensor();
 void RegisterRaySensor();
 void RegisterRFIDSensor();
 void RegisterRFIDTag();
+void RegisterSonarSensor();
+void RegisterForceTorqueSensor();
+void RegisterWirelessTransmitter();
+void RegisterWirelessReceiver();
 
 using namespace gazebo;
 using namespace sensors;
@@ -46,11 +51,16 @@ void SensorFactory::RegisterAll()
   RegisterContactSensor();
   RegisterDepthCameraSensor();
   RegisterMultiCameraSensor();
-  // RegisterGpuRaySensor();
+  RegisterGpsSensor();
+  RegisterGpuRaySensor();
   RegisterImuSensor();
   RegisterRaySensor();
   RegisterRFIDSensor();
   RegisterRFIDTag();
+  RegisterSonarSensor();
+  RegisterForceTorqueSensor();
+  RegisterWirelessTransmitter();
+  RegisterWirelessReceiver();
 }
 
 /////////////////////////////////////////////////
diff --git a/gazebo/sensors/SensorFactory.hh b/gazebo/sensors/SensorFactory.hh
index 75fa745..fe71908 100644
--- a/gazebo/sensors/SensorFactory.hh
+++ b/gazebo/sensors/SensorFactory.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@
 #include <vector>
 
 #include "gazebo/sensors/SensorTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -43,7 +44,7 @@ namespace gazebo
   /// \{
   /// \class SensorFactor SensorFactory.hh sensors/sensors.hh
   /// \brief The sensor factory; the class is just for namespacing purposes.
-  class SensorFactory
+  class GAZEBO_VISIBLE SensorFactory
   {
     /// \brief Register all known sensors
     ///  \li sensors::CameraSensor
@@ -53,6 +54,8 @@ namespace gazebo
     ///  \li sensors::ContactSensor
     ///  \li sensors::RFIDSensor
     ///  \li sensors::RFIDTag
+    ///  \li sensors::WirelessTransmitter
+    ///  \li sensors::WirelessReceiver
     public: static void RegisterAll();
 
     /// \brief Register a sensor class (called by sensor registration function).
@@ -83,10 +86,11 @@ namespace gazebo
   /// @param name Sensor type name, as it appears in the world file.
   /// @param classname C++ class name for the sensor.
   #define GZ_REGISTER_STATIC_SENSOR(name, classname) \
-  Sensor *New##classname() \
+  GAZEBO_VISIBLE Sensor *New##classname() \
   { \
     return new gazebo::sensors::classname(); \
   } \
+  GAZEBO_VISIBLE \
   void Register##classname() \
   {\
     SensorFactory::RegisterSensor(name, New##classname);\
diff --git a/gazebo/sensors/SensorManager.cc b/gazebo/sensors/SensorManager.cc
index bf1220f..5847829 100644
--- a/gazebo/sensors/SensorManager.cc
+++ b/gazebo/sensors/SensorManager.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,21 +22,24 @@
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Time.hh"
 
-#include "gazebo/physics/Physics.hh"
+#include "gazebo/physics/PhysicsIface.hh"
 #include "gazebo/physics/PhysicsEngine.hh"
 #include "gazebo/physics/World.hh"
 #include "gazebo/sensors/Sensor.hh"
+#include "gazebo/sensors/SensorsIface.hh"
 #include "gazebo/sensors/SensorFactory.hh"
 #include "gazebo/sensors/SensorManager.hh"
 
 using namespace gazebo;
 using namespace sensors;
 
-boost::mutex SensorManager::sensorTimingMutex;
+/// \brief A mutex used by SensorContainer and SimTimeEventHandler
+/// for timing coordination.
+boost::mutex g_sensorTimingMutex;
 
 //////////////////////////////////////////////////
 SensorManager::SensorManager()
-  : initialized(false)
+  : initialized(false), removeAllSensors(false)
 {
   // sensors::IMAGE container
   this->sensorContainers.push_back(new ImageSensorContainer());
@@ -66,12 +69,6 @@ SensorManager::~SensorManager()
 }
 
 //////////////////////////////////////////////////
-void SensorManager::Run()
-{
-  this->RunThreads();
-}
-
-//////////////////////////////////////////////////
 void SensorManager::RunThreads()
 {
   // Start the non-image sensor containers. The first item in the
@@ -101,13 +98,11 @@ void SensorManager::Stop()
 //////////////////////////////////////////////////
 void SensorManager::Update(bool _force)
 {
-  Sensor_V::iterator iter;
-
   {
     boost::recursive_mutex::scoped_lock lock(this->mutex);
 
     // in case things are spawn, sensors length changes
-    for (iter = this->initSensors.begin();
+    for (Sensor_V::iterator iter = this->initSensors.begin();
          iter != this->initSensors.end(); ++iter)
     {
       GZ_ASSERT((*iter) != NULL, "Sensor pointer is NULL");
@@ -121,22 +116,18 @@ void SensorManager::Update(bool _force)
     }
     this->initSensors.clear();
 
-    for (iter = this->removeSensors.begin();
+    for (std::vector<std::string>::iterator iter = this->removeSensors.begin();
          iter != this->removeSensors.end(); ++iter)
     {
-      GZ_ASSERT((*iter) != NULL, "Sensor pointer is NULL");
-      GZ_ASSERT((*iter)->GetCategory() < 0 ||
-          (*iter)->GetCategory() < CATEGORY_COUNT, "Sensor category is empty");
-      GZ_ASSERT(this->sensorContainers[(*iter)->GetCategory()] != NULL,
-                "Sensor container is NULL");
+      GZ_ASSERT(!(*iter).empty(), "Remove sensor name is empty.");
+
       bool removed = false;
-      std::string scopedName = (*iter)->GetScopedName();
       for (SensorContainer_V::iterator iter2 = this->sensorContainers.begin();
            iter2 != this->sensorContainers.end() && !removed; ++iter2)
       {
         GZ_ASSERT((*iter2) != NULL, "SensorContainer is NULL");
 
-        removed = (*iter2)->RemoveSensor(scopedName);
+        removed = (*iter2)->RemoveSensor(*iter);
       }
 
       if (!removed)
@@ -147,6 +138,18 @@ void SensorManager::Update(bool _force)
       }
     }
     this->removeSensors.clear();
+
+    if (this->removeAllSensors)
+    {
+      for (SensorContainer_V::iterator iter2 = this->sensorContainers.begin();
+          iter2 != this->sensorContainers.end(); ++iter2)
+      {
+        GZ_ASSERT((*iter2) != NULL, "SensorContainer is NULL");
+        (*iter2)->RemoveSensors();
+      }
+      this->initSensors.clear();
+      this->removeAllSensors = false;
+    }
   }
 
   // Only update if there are sensors
@@ -179,6 +182,8 @@ void SensorManager::Init()
 {
   boost::recursive_mutex::scoped_lock lock(this->mutex);
 
+  this->simTimeEventHandler = new SimTimeEventHandler();
+
   // Initialize all the sensor containers.
   for (SensorContainer_V::iterator iter = this->sensorContainers.begin();
        iter != this->sensorContainers.end(); ++iter)
@@ -201,8 +206,14 @@ void SensorManager::Fini()
   {
     GZ_ASSERT((*iter) != NULL, "SensorContainer is NULL");
     (*iter)->Fini();
+    (*iter)->Stop();
   }
 
+  this->removeSensors.clear();
+
+  delete this->simTimeEventHandler;
+  this->simTimeEventHandler = NULL;
+
   this->initialized = false;
 }
 
@@ -217,7 +228,20 @@ std::string SensorManager::CreateSensor(sdf::ElementPtr _elem,
                                         const std::string &_worldName,
                                         const std::string &_parentName)
 {
-  std::string type = _elem->GetValueString("type");
+  SensorPtr parentSensor = sensors::get_sensor(_parentName);
+  GZ_ASSERT(parentSensor, "Unable to get parent sensor");
+
+  return this->CreateSensor(_elem, _worldName, _parentName,
+      parentSensor->GetId());
+}
+
+//////////////////////////////////////////////////
+std::string SensorManager::CreateSensor(sdf::ElementPtr _elem,
+                                        const std::string &_worldName,
+                                        const std::string &_parentName,
+                                        uint32_t _parentId)
+{
+  std::string type = _elem->Get<std::string>("type");
   SensorPtr sensor = sensors::SensorFactory::NewSensor(type);
 
   if (!sensor)
@@ -227,7 +251,7 @@ std::string SensorManager::CreateSensor(sdf::ElementPtr _elem,
   }
 
   // Must come before sensor->Load
-  sensor->SetParent(_parentName);
+  sensor->SetParent(_parentName, _parentId);
 
   // Load the sensor
   sensor->Load(_worldName, _elem);
@@ -334,7 +358,7 @@ void SensorManager::RemoveSensor(const std::string &_name)
   {
     // Push it on the list, to be removed by the main sensor thread,
     // to ensure correct access to rendering resources.
-    this->removeSensors.push_back(sensor);
+    this->removeSensors.push_back(sensor->GetScopedName());
   }
 }
 
@@ -342,17 +366,9 @@ void SensorManager::RemoveSensor(const std::string &_name)
 void SensorManager::RemoveSensors()
 {
   boost::recursive_mutex::scoped_lock lock(this->mutex);
-
-  for (SensorContainer_V::iterator iter = this->sensorContainers.begin();
-      iter != this->sensorContainers.end(); ++iter)
-  {
-    GZ_ASSERT((*iter) != NULL, "SensorContainer is NULL");
-    (*iter)->RemoveSensors();
-  }
-  this->initSensors.clear();
+  this->removeAllSensors = true;
 }
 
-
 //////////////////////////////////////////////////
 SensorManager::SensorContainer::SensorContainer()
 {
@@ -444,16 +460,18 @@ void SensorManager::SensorContainer::RunLoop()
   boost::mutex tmpMutex;
   boost::mutex::scoped_lock lock2(tmpMutex);
 
+  // Wait for a sensor to be added.
+  // Use a while loop since world resets will notify the runCondition.
+  while (this->sensors.empty())
   {
-    // Wait for a sensor to be added.
-    if (this->sensors.size() == 0)
-    {
-      this->runCondition.wait(lock2);
-      if (this->stop)
-        return;
-    }
+    this->runCondition.wait(lock2);
+    if (this->stop)
+      return;
+  }
 
+  {
     boost::recursive_mutex::scoped_lock lock(this->mutex);
+
     // Get the minimum update rate from the sensors.
     for (Sensor_V::iterator iter = this->sensors.begin();
         iter != this->sensors.end() && !this->stop; ++iter)
@@ -471,8 +489,14 @@ void SensorManager::SensorContainer::RunLoop()
 
   while (!this->stop)
   {
-    if (this->sensors.size() == 0)
+    // If all the sensors get deleted, wait here.
+    // Use a while loop since world resets will notify the runCondition.
+    while (this->sensors.empty())
+    {
       this->runCondition.wait(lock2);
+      if (this->stop)
+        return;
+    }
 
     // Get the start time of the update.
     startTime = world->GetSimTime();
@@ -494,14 +518,18 @@ void SensorManager::SensorContainer::RunLoop()
     GZ_ASSERT(eventTime >= common::Time::Zero,
         "Time to next sensor update is negative.");
 
-    boost::mutex::scoped_lock timingLock(SensorManager::sensorTimingMutex);
+    boost::mutex::scoped_lock timingLock(g_sensorTimingMutex);
 
     // Add an event to trigger when the appropriate simulation time has been
     // reached.
-    SimTimeEventHandler::Instance()->AddRelativeEvent(eventTime,
-        &this->runCondition);
+    SensorManager::Instance()->simTimeEventHandler->AddRelativeEvent(
+        eventTime, &this->runCondition);
 
-    this->runCondition.wait(timingLock);
+    // This if statement helps prevent deadlock on osx during teardown.
+    if (!this->stop)
+    {
+      this->runCondition.wait(timingLock);
+    }
   }
 }
 
@@ -510,8 +538,8 @@ void SensorManager::SensorContainer::Update(bool _force)
 {
   boost::recursive_mutex::scoped_lock lock(this->mutex);
 
-  if (this->sensors.size() == 0)
-    gzlog << "Updating a sensor containing without any sensors.\n";
+  if (this->sensors.empty())
+    gzlog << "Updating a sensor container without any sensors.\n";
 
   // Update all the sensors in this container.
   for (Sensor_V::iterator iter = this->sensors.begin();
@@ -553,8 +581,11 @@ SensorPtr SensorManager::SensorContainer::GetSensor(const std::string &_name,
 void SensorManager::SensorContainer::AddSensor(SensorPtr _sensor)
 {
   GZ_ASSERT(_sensor != NULL, "Sensor is NULL when passed to ::AddSensor");
-  boost::recursive_mutex::scoped_lock lock(this->mutex);
-  this->sensors.push_back(_sensor);
+
+  {
+    boost::recursive_mutex::scoped_lock lock(this->mutex);
+    this->sensors.push_back(_sensor);
+  }
 
   // Tell the run loop that we have received a sensor
   this->runCondition.notify_one();
@@ -599,11 +630,16 @@ void SensorManager::SensorContainer::ResetLastUpdateTimes()
     GZ_ASSERT((*iter) != NULL, "Sensor is NULL");
     (*iter)->ResetLastUpdateTime();
   }
+
+  // Tell the run loop that world time has been reset.
+  this->runCondition.notify_one();
 }
 
 //////////////////////////////////////////////////
 void SensorManager::SensorContainer::RemoveSensors()
 {
+  boost::recursive_mutex::scoped_lock lock(this->mutex);
+
   Sensor_V::iterator iter;
 
   // Remove all the sensors
@@ -636,9 +672,6 @@ void SensorManager::ImageSensorContainer::Update(bool _force)
 /////////////////////////////////////////////////
 SimTimeEventHandler::SimTimeEventHandler()
 {
-  this->world = physics::get_world();
-  GZ_ASSERT(this->world != NULL, "World pointer is NULL");
-
   this->updateConnection = event::Events::ConnectWorldUpdateBegin(
       boost::bind(&SimTimeEventHandler::OnUpdate, this, _1));
 }
@@ -662,9 +695,12 @@ void SimTimeEventHandler::AddRelativeEvent(const common::Time &_time,
 {
   boost::mutex::scoped_lock lock(this->mutex);
 
+  physics::WorldPtr world = physics::get_world();
+  GZ_ASSERT(world != NULL, "World pointer is NULL");
+
   // Create the new event.
   SimTimeEvent *event = new SimTimeEvent;
-  event->time = this->world->GetSimTime() + _time;
+  event->time = world->GetSimTime() + _time;
   event->condition = _var;
 
   // Add the event to the list.
@@ -674,9 +710,7 @@ void SimTimeEventHandler::AddRelativeEvent(const common::Time &_time,
 /////////////////////////////////////////////////
 void SimTimeEventHandler::OnUpdate(const common::UpdateInfo &_info)
 {
-  GZ_ASSERT(this->world != NULL, "World pointer is NULL");
-
-  boost::mutex::scoped_lock timingLock(SensorManager::sensorTimingMutex);
+  boost::mutex::scoped_lock timingLock(g_sensorTimingMutex);
   boost::mutex::scoped_lock lock(this->mutex);
 
   // Iterate over all the events.
diff --git a/gazebo/sensors/SensorManager.hh b/gazebo/sensors/SensorManager.hh
index 76cd160..4187b77 100644
--- a/gazebo/sensors/SensorManager.hh
+++ b/gazebo/sensors/SensorManager.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,11 +28,13 @@
 #include <vector>
 #include <list>
 
+#include <sdf/sdf.hh>
+
 #include "gazebo/physics/PhysicsTypes.hh"
 #include "gazebo/common/SingletonT.hh"
 #include "gazebo/common/UpdateInfo.hh"
 #include "gazebo/sensors/SensorTypes.hh"
-#include "gazebo/sdf/sdf.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -42,7 +44,7 @@ namespace gazebo
   {
     /// \cond
     /// \brief A simulation time event
-    class SimTimeEvent
+    class GAZEBO_VISIBLE SimTimeEvent
     {
       /// \brief The time at which to trigger the condition.
       public: common::Time time;
@@ -53,7 +55,7 @@ namespace gazebo
 
     /// \brief Monitors simulation time, and notifies conditions when
     /// a specified time has been reached.
-    class SimTimeEventHandler : public SingletonT<SimTimeEventHandler>
+    class GAZEBO_VISIBLE SimTimeEventHandler
     {
       /// \brief Constructor
       public: SimTimeEventHandler();
@@ -79,12 +81,6 @@ namespace gazebo
       /// \brief The list of events to handle.
       private: std::list<SimTimeEvent*> events;
 
-      /// \brief Get sim time from the world.
-      private: physics::WorldPtr world;
-
-      /// \brief This is a singleton class.
-      private: friend class SingletonT<SimTimeEventHandler>;
-
       /// \brief Connect to the World::UpdateBegin event.
       private: event::ConnectionPtr updateConnection;
     };
@@ -94,7 +90,7 @@ namespace gazebo
     /// \{
     /// \class SensorManager SensorManager.hh sensors/sensors.hh
     /// \brief Class to manage and update all sensors
-    class SensorManager : public SingletonT<SensorManager>
+    class GAZEBO_VISIBLE SensorManager : public SingletonT<SensorManager>
     {
       /// \brief This is a singletone class. Use SensorManager::Instance()
       /// to get a pointer to this class.
@@ -113,10 +109,6 @@ namespace gazebo
       /// \brief Init all the sensors
       public: void Init();
 
-      /// \brief Deprecated
-      /// \sa RunThreads
-      public: void Run() GAZEBO_DEPRECATED(1.5);
-
       /// \brief Run sensor updates in separate threads.
       /// This will only run non-image based sensor updates.
       public: void RunThreads();
@@ -131,6 +123,11 @@ namespace gazebo
       /// \param[out] All the sensor types.
       public: void GetSensorTypes(std::vector<std::string> &_types) const;
 
+      /// \brief Deprecated.
+      public: std::string CreateSensor(sdf::ElementPtr _elem,
+                  const std::string &_worldName,
+                  const std::string &_parentName) GAZEBO_DEPRECATED(2.0);
+
       /// \brief Add a sensor from an SDF element. This function will also Load
       /// and Init the sensor.
       /// \param[in] _elem The SDF element that describes the sensor
@@ -140,7 +137,8 @@ namespace gazebo
       /// \return The name of the sensor
       public: std::string CreateSensor(sdf::ElementPtr _elem,
                                        const std::string &_worldName,
-                                       const std::string &_parentName);
+                                       const std::string &_parentName,
+                                       uint32_t _parentId);
 
       /// \brief Get a sensor
       /// \param[in] _name The name of a sensor to find.
@@ -265,6 +263,9 @@ namespace gazebo
       ///        i.e. SensorManager::sensors are initialized.
       private: bool initialized;
 
+      /// \brief True removes all sensors from all sensor containers.
+      private: bool removeAllSensors;
+
       /// \brief Mutex used when adding and removing sensors.
       private: mutable boost::recursive_mutex mutex;
 
@@ -272,7 +273,7 @@ namespace gazebo
       private: Sensor_V initSensors;
 
       /// \brief List of sensors that require initialization.
-      private: Sensor_V removeSensors;
+      private: std::vector<std::string> removeSensors;
 
       /// \brief A vector of SensorContainer pointers.
       private: typedef std::vector<SensorContainer*> SensorContainer_V;
@@ -280,18 +281,14 @@ namespace gazebo
       /// \brief The sensor manager's vector of sensor containers.
       private: SensorContainer_V sensorContainers;
 
-      /// \brief A mutex used by SensorContainer and SimTimeEventHandler
-      /// for timing coordination.
-      private: static boost::mutex sensorTimingMutex;
-
       /// \brief This is a singleton class.
       private: friend class SingletonT<SensorManager>;
 
       /// \brief Allow access to sensorTimeMutex member var.
       private: friend class SensorContainer;
 
-      /// \brief Allow access to sensorTimeMutex member var.
-      private: friend class SimTimeEventHandler;
+      /// \brief Pointer to the sim time event handler.
+      private: SimTimeEventHandler *simTimeEventHandler;
     };
     /// \}
   }
diff --git a/gazebo/sensors/SensorManager_TEST.cc b/gazebo/sensors/SensorManager_TEST.cc
index a56fdc9..a67aded 100644
--- a/gazebo/sensors/SensorManager_TEST.cc
+++ b/gazebo/sensors/SensorManager_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
 */
 
 #include <gtest/gtest.h>
-#include "gazebo/physics/Physics.hh"
+#include "gazebo/physics/PhysicsIface.hh"
 #include "gazebo/common/Time.hh"
 #include "test/ServerFixture.hh"
 
@@ -52,6 +52,19 @@ TEST_F(SensorManager_TEST, Data)
   // Make sure we have the right number of sensors
   size_t sensorCount = 4;
   sensors::Sensor_V sensors = mgr->GetSensors();
+
+  int i = 0;
+  while (sensors.size() != sensorCount && i < 100)
+  {
+    gazebo::common::Time::MSleep(100);
+    sensors.clear();
+    sensors = mgr->GetSensors();
+    gzdbg << "Sensor Count. Actual[" << sensors.size() << "] Expected["
+          << sensorCount << "]\n";
+    ++i;
+  }
+
+  EXPECT_LT(i, 100);
   EXPECT_EQ(sensors.size(), sensorCount);
 
   // Get the current simulation time
@@ -66,19 +79,19 @@ TEST_F(SensorManager_TEST, Data)
   // Get each sensor, and make sure that it has been updated
   {
     sensor = mgr->GetSensor("default::camera_1::link::camera");
-    EXPECT_TRUE(sensor != NULL);
+    ASSERT_TRUE(sensor != NULL);
     EXPECT_TRUE(sensor->GetLastMeasurementTime() > time);
 
     sensor = mgr->GetSensor("default::camera_2::link::camera");
-    EXPECT_TRUE(sensor != NULL);
+    ASSERT_TRUE(sensor != NULL);
     EXPECT_TRUE(sensor->GetLastMeasurementTime() > time);
 
     sensor = mgr->GetSensor("default::laser_1::link::laser");
-    EXPECT_TRUE(sensor != NULL);
+    ASSERT_TRUE(sensor != NULL);
     EXPECT_TRUE(sensor->GetLastMeasurementTime() > time);
 
     sensor = mgr->GetSensor("default::laser_2::link::laser");
-    EXPECT_TRUE(sensor != NULL);
+    ASSERT_TRUE(sensor != NULL);
     EXPECT_TRUE(sensor->GetLastMeasurementTime() > time);
   }
 }
@@ -98,12 +111,31 @@ TEST_F(SensorManager_TEST, InitRemove)
   sensors::Sensor_V sensors = mgr->GetSensors();
   EXPECT_EQ(sensors.size(), sensorCount);
 
-  // Try removing a few senors.
+  std::vector<std::string> sensorNames;
   for (sensors::Sensor_V::iterator iter = sensors.begin();
-       iter != sensors.end() && sensorCount > 10; ++iter)
+       iter != sensors.end(); ++iter)
   {
-    mgr->RemoveSensor((*iter)->GetName());
-    EXPECT_EQ(mgr->GetSensors().size(), --sensorCount);
+    sensorNames.push_back((*iter)->GetName());
+  }
+
+  // Try removing a few senors.
+  for (std::vector<std::string>::iterator iter = sensorNames.begin();
+       iter != sensorNames.end() && sensorCount > 10; ++iter)
+  {
+    mgr->RemoveSensor(*iter);
+
+    --sensorCount;
+
+    int i = 0;
+
+    // Wait for a sensor manager update.
+    while (mgr->GetSensors().size() > sensorCount)
+    {
+      gazebo::common::Time::MSleep(100);
+      ++i;
+    }
+
+    EXPECT_LT(i, 100);
   }
 
   // Make sure the proper number of sensors have been removed
@@ -112,8 +144,19 @@ TEST_F(SensorManager_TEST, InitRemove)
   // Remove the rest of the sensors
   mgr->RemoveSensors();
 
+  int i = 0;
+  // Wait for a sensor manager update.
+  while (mgr->GetSensors().size() > 0 && i < 100)
+  {
+    gazebo::common::Time::MSleep(100);
+    ++i;
+  }
+  EXPECT_LT(i, 100);
+
   // Make sure all the sensors have been removed
   EXPECT_EQ(mgr->GetSensors().size(), size_t(0));
+
+  printf("Done done\n");
 }
 
 /////////////////////////////////////////////////
diff --git a/gazebo/sensors/SensorTypes.hh b/gazebo/sensors/SensorTypes.hh
index 031482d..d36d944 100644
--- a/gazebo/sensors/SensorTypes.hh
+++ b/gazebo/sensors/SensorTypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 
 #include <vector>
 #include <boost/shared_ptr.hpp>
+#include "gazebo/util/system.hh"
 
 /// \file
 /// \ingroup gazebo_sensors
@@ -32,12 +33,22 @@ namespace gazebo
     class Sensor;
     class RaySensor;
     class CameraSensor;
+    class MultiCameraSensor;
     class DepthCameraSensor;
     class ContactSensor;
     class ImuSensor;
     class GpuRaySensor;
     class RFIDSensor;
     class RFIDTag;
+    class SonarSensor;
+    class ForceTorqueSensor;
+    class GpsSensor;
+    class Noise;
+    class GaussianNoiseModel;
+    class ImageGaussianNoiseModel;
+    class WirelessTransceiver;
+    class WirelessTransmitter;
+    class WirelessReceiver;
 
     /// \def SensorPtr
     /// \brief Shared pointer to Sensor
@@ -51,6 +62,10 @@ namespace gazebo
     /// \brief Shared pointer to CameraSensor
     typedef boost::shared_ptr<CameraSensor> CameraSensorPtr;
 
+    /// \def MultiCameraSensorPtr
+    /// \brief Shared pointer to MultiCameraSensor
+    typedef boost::shared_ptr<MultiCameraSensor> MultiCameraSensorPtr;
+
     /// \def DepthCameraSensorPtr
     /// \brief Shared pointer to DepthCameraSensor
     typedef boost::shared_ptr<DepthCameraSensor> DepthCameraSensorPtr;
@@ -75,6 +90,42 @@ namespace gazebo
     /// \brief Shared pointer to RFIDTag
     typedef boost::shared_ptr<RFIDTag> RFIDTagPtr;
 
+    /// \def SonarSensorPtr
+    /// \brief Shared pointer to SonarSensor
+    typedef boost::shared_ptr<SonarSensor> SonarSensorPtr;
+
+    /// \def ForceTorqueSensorPtr
+    /// \brief Shared pointer to ForceTorqueSensor
+    typedef boost::shared_ptr<ForceTorqueSensor> ForceTorqueSensorPtr;
+
+    /// \def GpsSensorPtr
+    /// \brief Shared pointer to GpsSensor
+    typedef boost::shared_ptr<GpsSensor> GpsSensorPtr;
+
+    /// \def NoisePtr
+    /// \brief Shared pointer to Noise
+    typedef boost::shared_ptr<Noise> NoisePtr;
+
+    /// \def GaussianNoisePtr
+    /// \brief Shared pointer to Noise
+    typedef boost::shared_ptr<GaussianNoiseModel> GaussianNoiseModelPtr;
+
+    /// \brief Shared pointer to Noise
+    typedef boost::shared_ptr<ImageGaussianNoiseModel>
+        ImageGaussianNoiseModelPtr;
+
+    /// \def WirelessTransceiverPtr
+    /// \brief Shared pointer to WirelessTransceiver
+    typedef boost::shared_ptr<WirelessTransceiver> WirelessTransceiverPtr;
+
+    /// \def WirelessTransmitterPtr
+    /// \brief Shared pointer to WirelessTransmitter
+    typedef boost::shared_ptr<WirelessTransmitter> WirelessTransmitterPtr;
+
+    /// \def WirelessReceiverPtr
+    /// \brief Shared pointer to WirelessReceiver
+    typedef boost::shared_ptr<WirelessReceiver> WirelessReceiverPtr;
+
     /// \def Sensor_V
     /// \brief Vector of Sensor shared pointers
     typedef std::vector<SensorPtr> Sensor_V;
@@ -87,6 +138,10 @@ namespace gazebo
     /// \brief Vector of CameraSensor shared pointers
     typedef std::vector<CameraSensorPtr> CameraSensor_V;
 
+    /// \def MultiCameraSensor_V
+    /// \brief Vector of MultiCameraSensor shared pointers
+    typedef std::vector<MultiCameraSensorPtr> MultiCameraSensor_V;
+
     /// \def DepthCameraSensor_V
     /// \brief Vector of DepthCameraSensor shared pointers
     typedef std::vector<DepthCameraSensorPtr> DepthCameraSensor_V;
@@ -110,6 +165,20 @@ namespace gazebo
     /// \def RFIDTag_V
     /// \brief Vector of RFIDTags
     typedef std::vector<RFIDTag> RFIDTag_V;
+
+    /// \def WirelessTransceiver_V
+    /// \brief Vector of WirelessTransceiver
+    typedef std::vector<WirelessTransceiver> WirelessTransceiver_V;
+
+    /// \def WirelessTransmitter_V
+    /// \brief Vector of WirelessTransmitter
+    typedef std::vector<WirelessTransmitter> WirelessTransmitter_V;
+
+    /// \def WirelessReceiver_V
+    /// \brief Vector of WirelessReceiver
+    typedef std::vector<WirelessReceiver> WirelessReceiver_V;
+
+
     /// \}
   }
 }
diff --git a/gazebo/sensors/Sensor_TEST.cc b/gazebo/sensors/Sensor_TEST.cc
index 8d87468..1c3606c 100644
--- a/gazebo/sensors/Sensor_TEST.cc
+++ b/gazebo/sensors/Sensor_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
 */
 
 #include <gtest/gtest.h>
-#include "gazebo/physics/Physics.hh"
+#include "gazebo/physics/PhysicsIface.hh"
 #include "gazebo/common/Time.hh"
 #include "test/ServerFixture.hh"
 
@@ -89,6 +89,20 @@ TEST_F(Sensor_TEST, UpdateAfterReset)
   EXPECT_GT(static_cast<double>(hokuyoMsgCount),
               updateRate*now * 0.5);
 
+  // Wait another 1.5 seconds
+  for (i = 0; i < 15; ++i)
+    common::Time::MSleep(100);
+
+  hokuyoMsgCount = g_hokuyoMsgCount;
+  now = world->GetSimTime().Double();
+
+  gzdbg << "counted " << hokuyoMsgCount << " messages in "
+        << now << " seconds\n";
+
+  // Expect at least 50% of specified update rate
+  EXPECT_GT(static_cast<double>(hokuyoMsgCount),
+              updateRate*now * 0.5);
+
   // Send reset world message
   transport::PublisherPtr worldControlPub =
     node->Advertise<msgs::WorldControl>("~/world_control");
@@ -138,68 +152,6 @@ TEST_F(Sensor_TEST, UpdateAfterReset)
 }
 
 /////////////////////////////////////////////////
-/// \brief Reset world a bunch of times and verify that no assertions happen
-/// The assert "SensorManager.cc(479): Took negative time to update a sensor."
-/// has been observed in Jenkins testing.
-TEST_F(Sensor_TEST, ResetWorldStressTest)
-{
-  // Load in a world with lasers
-  Load("worlds/ray_test.world");
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // get the sensor manager
-  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
-  EXPECT_TRUE(mgr->SensorsInitialized());
-
-  // get the hokuyo sensor
-  sensors::SensorPtr sensor;
-  sensor = mgr->GetSensor("default::hokuyo::link::laser");
-  ASSERT_TRUE(sensor != NULL);
-
-  // set update rate to unlimited
-  double updateRate = 0.0;
-  sensor->SetUpdateRate(updateRate);
-  gzdbg << sensor->GetScopedName() << " loaded with update rate of "
-        << sensor->GetUpdateRate() << " Hz\n";
-
-  g_hokuyoMsgCount = 0;
-
-  // Subscribe to hokuyo laser scan messages
-  transport::NodePtr node = transport::NodePtr(new transport::Node());
-  node->Init();
-  transport::SubscriberPtr sceneSub = node->Subscribe(
-      "~/hokuyo/link/laser/scan", &ReceiveHokuyoMsg);
-
-  // Wait for messages to arrive
-  {
-    boost::mutex countMutex;
-    boost::mutex::scoped_lock lock(countMutex);
-    g_countCondition.wait(lock);
-    gzdbg << "counted " << g_hokuyoMsgCount << " hokuyo messages\n";
-  }
-
-  // Send reset world message
-  transport::PublisherPtr worldControlPub =
-    node->Advertise<msgs::WorldControl>("~/world_control");
-
-  // Copied from MainWindow::OnResetWorld
-  msgs::WorldControl msg;
-  msg.mutable_reset()->set_all(true);
-  worldControlPub->Publish(msg);
-
-  common::Time::MSleep(300);
-
-  int i;
-  for (i = 0; i < 20; ++i)
-  {
-    worldControlPub->Publish(msg);
-    gzdbg << "counted " << g_hokuyoMsgCount << " hokuyo messages\n";
-    common::Time::MSleep(200);
-  }
-}
-
-/////////////////////////////////////////////////
 int main(int argc, char **argv)
 {
   ::testing::InitGoogleTest(&argc, argv);
diff --git a/gazebo/sensors/Sensors.cc b/gazebo/sensors/Sensors.cc
deleted file mode 100644
index 5aa839e..0000000
--- a/gazebo/sensors/Sensors.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "common/Console.hh"
-
-#include "transport/Transport.hh"
-
-#include "rendering/Rendering.hh"
-
-#include "sensors/SensorFactory.hh"
-#include "sensors/SensorManager.hh"
-#include "sensors/Sensor.hh"
-#include "sensors/Sensors.hh"
-
-using namespace gazebo;
-
-/////////////////////////////////////////////////
-bool sensors::load()
-{
-  // Register all the sensor types
-  sensors::SensorFactory::RegisterAll();
-
-  // Load the rendering system
-  return gazebo::rendering::load();
-}
-
-/////////////////////////////////////////////////
-bool sensors::init()
-{
-  // The rendering engine will run headless
-  if (!gazebo::rendering::init())
-  {
-    gzthrow("Unable to intialize the rendering engine");
-    return false;
-  }
-
-  sensors::SensorManager::Instance()->Init();
-
-  return true;
-}
-
-/////////////////////////////////////////////////
-bool sensors::fini()
-{
-  sensors::SensorManager::Instance()->Fini();
-  rendering::fini();
-  return true;
-}
-
-/////////////////////////////////////////////////
-std::string sensors::create_sensor(sdf::ElementPtr _elem,
-                                   const std::string &_worldName,
-                                   const std::string &_parentName)
-{
-  return sensors::SensorManager::Instance()->CreateSensor(_elem, _worldName,
-                                                          _parentName);
-}
-
-/////////////////////////////////////////////////
-void sensors::remove_sensor(const std::string &_sensorName)
-{
-  sensors::SensorManager::Instance()->RemoveSensor(_sensorName);
-}
-
-/////////////////////////////////////////////////
-void sensors::run()
-{
-  sensors::run_threads();
-}
-
-/////////////////////////////////////////////////
-void sensors::run_threads()
-{
-  sensors::SensorManager::Instance()->RunThreads();
-}
-
-/////////////////////////////////////////////////
-void sensors::run_once(bool _force)
-{
-  sensors::SensorManager::Instance()->Update(_force);
-}
-
-/////////////////////////////////////////////////
-void sensors::stop()
-{
-  sensors::SensorManager::Instance()->Stop();
-}
-
-/////////////////////////////////////////////////
-bool sensors::remove_sensors()
-{
-  sensors::SensorManager::Instance()->RemoveSensors();
-  return true;
-}
-
-/////////////////////////////////////////////////
-sensors::SensorPtr sensors::get_sensor(const std::string &_name)
-{
-  return sensors::SensorManager::Instance()->GetSensor(_name);
-}
diff --git a/gazebo/sensors/Sensors.hh b/gazebo/sensors/Sensors.hh
deleted file mode 100644
index 1e34ec4..0000000
--- a/gazebo/sensors/Sensors.hh
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef _GAZEBO_SENSORS_HH_
-#define _GAZEBO_SENSORS_HH_
-
-#include <string>
-#include "sdf/sdf.hh"
-#include "sensors/SensorTypes.hh"
-
-namespace gazebo
-{
-  namespace sensors
-  {
-    /// \addtogroup gazebo_sensors
-    /// \{
-
-    /// \brief Load the sensor library.
-    /// \return True if successfully loaded, false if not.
-    bool load();
-
-    /// \brief Create a sensor using SDF.
-    /// \param[in] _elem The SDF element that describes the sensor.
-    /// \param[in] _worldName Name of the world in which to create the sensor.
-    /// \param[in] _parentName The fully scoped parent name (model::link).
-    /// \return The name of the new sensor.
-    std::string create_sensor(sdf::ElementPtr _elem,
-                              const std::string &_worldName,
-                              const std::string &_parentName);
-
-    /// \brief Remove a sensor by name
-    /// \param[in] _sensorName Name of sensor to remove
-    void remove_sensor(const std::string &_sensorName);
-
-    /// \brief Run the sensor generation one step.
-    /// \param _force: If true, all sensors are forced to update. Otherwise
-    ///        a sensor will update based on it's Hz rate.
-    void run_once(bool _force = false);
-
-    /// \brief Deprecated
-    /// \sa run_threads
-    void run() GAZEBO_DEPRECATED(1.5);
-
-    /// \brief Run sensors in a threads. This is a non-blocking call.
-    void run_threads();
-
-    /// \brief Stop the sensor generation loop.
-    void stop();
-
-    /// \brief initialize the sensor generation loop.
-    /// \return True if successfully initialized, false if not
-    bool init();
-
-    /// \brief shutdown the sensor generation loop.
-    /// \return True if successfully finalized, false if not
-    bool fini();
-
-    /// \brief Remove all sensors.
-    /// \return True if all successfully removed, false if not
-    bool remove_sensors();
-
-    /// \brief Get a sensor using by name
-    ///
-    /// The given name should have:
-    /// world_name::model_name::link_name::sensor_name
-    /// \param[in] _name Name of the sensor. This name should be fully scoped.
-    /// This means _name = world_name::model_name::link_name::sensor_name.
-    /// You may use the unscoped sensor name if that name is unique within
-    /// the entire simulation. If the name is not unique a NULL pointer is
-    /// returned.
-    /// \return Pointer to the sensor, NULL if the sensor could not be
-    /// found.
-    SensorPtr get_sensor(const std::string &_name);
-
-    /// \}
-  }
-}
-#endif
diff --git a/gazebo/sensors/SensorsIface.cc b/gazebo/sensors/SensorsIface.cc
new file mode 100644
index 0000000..c381202
--- /dev/null
+++ b/gazebo/sensors/SensorsIface.cc
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Console.hh"
+
+#include "gazebo/transport/TransportIface.hh"
+
+#include "gazebo/rendering/RenderingIface.hh"
+
+#include "gazebo/sensors/SensorFactory.hh"
+#include "gazebo/sensors/SensorManager.hh"
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/sensors/SensorsIface.hh"
+
+using namespace gazebo;
+
+bool g_disable = false;
+
+/////////////////////////////////////////////////
+bool sensors::load()
+{
+  if (g_disable)
+    return true;
+
+  // Register all the sensor types
+  sensors::SensorFactory::RegisterAll();
+
+  // Load the rendering system
+  return gazebo::rendering::load();
+}
+
+/////////////////////////////////////////////////
+bool sensors::init()
+{
+  if (g_disable)
+    return true;
+
+  // The rendering engine will run headless
+  if (!gazebo::rendering::init())
+  {
+    gzthrow("Unable to intialize the rendering engine");
+    return false;
+  }
+
+  sensors::SensorManager::Instance()->Init();
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool sensors::fini()
+{
+  if (g_disable)
+    return true;
+
+  sensors::SensorManager::Instance()->Fini();
+  rendering::fini();
+  return true;
+}
+
+/////////////////////////////////////////////////
+std::string sensors::create_sensor(sdf::ElementPtr _elem,
+                                   const std::string &_worldName,
+                                   const std::string &_parentName)
+{
+  if (g_disable)
+    return "";
+
+  SensorPtr parentSensor = get_sensor(_parentName);
+  GZ_ASSERT(parentSensor, "Unable to get parent sensor");
+
+  return create_sensor(_elem, _worldName, _parentName, parentSensor->GetId());
+}
+
+/////////////////////////////////////////////////
+std::string sensors::create_sensor(sdf::ElementPtr _elem,
+                                   const std::string &_worldName,
+                                   const std::string &_parentName,
+                                   uint32_t _parentId)
+{
+  if (g_disable)
+    return "";
+
+  return sensors::SensorManager::Instance()->CreateSensor(_elem, _worldName,
+      _parentName, _parentId);
+}
+
+/////////////////////////////////////////////////
+void sensors::remove_sensor(const std::string &_sensorName)
+{
+  if (g_disable)
+    return;
+
+  sensors::SensorManager::Instance()->RemoveSensor(_sensorName);
+}
+
+/////////////////////////////////////////////////
+void sensors::run_threads()
+{
+  if (g_disable)
+    return;
+
+  sensors::SensorManager::Instance()->RunThreads();
+}
+
+/////////////////////////////////////////////////
+void sensors::run_once(bool _force)
+{
+  if (g_disable)
+    return;
+
+  sensors::SensorManager::Instance()->Update(_force);
+}
+
+/////////////////////////////////////////////////
+void sensors::stop()
+{
+  if (g_disable)
+    return;
+
+  sensors::SensorManager::Instance()->Stop();
+}
+
+/////////////////////////////////////////////////
+bool sensors::remove_sensors()
+{
+  if (g_disable)
+    return true;
+
+  sensors::SensorManager::Instance()->RemoveSensors();
+  return true;
+}
+
+/////////////////////////////////////////////////
+sensors::SensorPtr sensors::get_sensor(const std::string &_name)
+{
+  if (g_disable)
+    return sensors::SensorPtr();
+
+  return sensors::SensorManager::Instance()->GetSensor(_name);
+}
+
+/////////////////////////////////////////////////
+void sensors::disable()
+{
+  g_disable = true;
+}
+
+/////////////////////////////////////////////////
+void sensors::enable()
+{
+  g_disable = false;
+}
diff --git a/gazebo/sensors/SensorsIface.hh b/gazebo/sensors/SensorsIface.hh
new file mode 100644
index 0000000..f37e9f0
--- /dev/null
+++ b/gazebo/sensors/SensorsIface.hh
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_SENSORSIFACE_HH_
+#define _GAZEBO_SENSORSIFACE_HH_
+
+#include <string>
+#include <sdf/sdf.hh>
+#include "gazebo/common/CommonTypes.hh"
+#include "gazebo/sensors/SensorTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace sensors
+  {
+    /// \addtogroup gazebo_sensors
+    /// \{
+
+    /// \brief Load the sensor library.
+    /// \return True if successfully loaded, false if not.
+    GAZEBO_VISIBLE
+    bool load();
+
+    /// \brief Deprecated.
+    GAZEBO_VISIBLE
+    std::string create_sensor(sdf::ElementPtr _elem,
+        const std::string &_worldName,
+        const std::string &_parentName) GAZEBO_DEPRECATED(2.0);
+
+    /// \brief Create a sensor using SDF.
+    /// \param[in] _elem The SDF element that describes the sensor.
+    /// \param[in] _worldName Name of the world in which to create the sensor.
+    /// \param[in] _parentName The fully scoped parent name (model::link).
+    /// \return The name of the new sensor.
+    GAZEBO_VISIBLE
+    std::string create_sensor(sdf::ElementPtr _elem,
+        const std::string &_worldName, const std::string &_parentName,
+        uint32_t _parentId);
+
+    /// \brief Remove a sensor by name
+    /// \param[in] _sensorName Name of sensor to remove
+    GAZEBO_VISIBLE
+    void remove_sensor(const std::string &_sensorName);
+
+    /// \brief Run the sensor generation one step.
+    /// \param _force: If true, all sensors are forced to update. Otherwise
+    ///        a sensor will update based on it's Hz rate.
+    GAZEBO_VISIBLE
+    void run_once(bool _force = false);
+
+    /// \brief Run sensors in a threads. This is a non-blocking call.
+    GAZEBO_VISIBLE
+    void run_threads();
+
+    /// \brief Stop the sensor generation loop.
+    GAZEBO_VISIBLE
+    void stop();
+
+    /// \brief initialize the sensor generation loop.
+    /// \return True if successfully initialized, false if not
+    GAZEBO_VISIBLE
+    bool init();
+
+    /// \brief shutdown the sensor generation loop.
+    /// \return True if successfully finalized, false if not
+    GAZEBO_VISIBLE
+    bool fini();
+
+    /// \brief Remove all sensors.
+    /// \return True if all successfully removed, false if not
+    GAZEBO_VISIBLE
+    bool remove_sensors();
+
+    /// \brief Get a sensor using by name
+    ///
+    /// The given name should have:
+    /// world_name::model_name::link_name::sensor_name
+    /// \param[in] _name Name of the sensor. This name should be fully scoped.
+    /// This means _name = world_name::model_name::link_name::sensor_name.
+    /// You may use the unscoped sensor name if that name is unique within
+    /// the entire simulation. If the name is not unique a NULL pointer is
+    /// returned.
+    /// \return Pointer to the sensor, NULL if the sensor could not be
+    /// found.
+    GAZEBO_VISIBLE
+    SensorPtr get_sensor(const std::string &_name);
+
+    /// \brief Disable sensors.
+    GAZEBO_VISIBLE
+    void disable();
+
+    /// \brief Enable sensors.
+    GAZEBO_VISIBLE
+    void enable();
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/sensors/SonarSensor.cc b/gazebo/sensors/SonarSensor.cc
new file mode 100644
index 0000000..4f1d59d
--- /dev/null
+++ b/gazebo/sensors/SonarSensor.cc
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/SurfaceParams.hh"
+#include "gazebo/physics/MeshShape.hh"
+#include "gazebo/physics/PhysicsEngine.hh"
+#include "gazebo/physics/ContactManager.hh"
+#include "gazebo/physics/Collision.hh"
+
+#include "gazebo/common/Assert.hh"
+
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
+#include "gazebo/msgs/msgs.hh"
+
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Rand.hh"
+
+#include "gazebo/sensors/SensorFactory.hh"
+#include "gazebo/sensors/SonarSensor.hh"
+
+using namespace gazebo;
+using namespace sensors;
+
+GZ_REGISTER_STATIC_SENSOR("sonar", SonarSensor)
+
+//////////////////////////////////////////////////
+SonarSensor::SonarSensor()
+: Sensor(sensors::OTHER)
+{
+}
+
+//////////////////////////////////////////////////
+SonarSensor::~SonarSensor()
+{
+  this->sonarCollision->Fini();
+  this->sonarCollision.reset();
+
+  this->sonarShape->Fini();
+  this->sonarShape.reset();
+}
+
+//////////////////////////////////////////////////
+std::string SonarSensor::GetTopic() const
+{
+  std::string topicName = "~/";
+  topicName += this->parentName + "/" + this->GetName() + "/sonar";
+  boost::replace_all(topicName, "::", "/");
+
+  return topicName;
+}
+
+//////////////////////////////////////////////////
+void SonarSensor::Load(const std::string &_worldName)
+{
+  sdf::ElementPtr sonarElem = this->sdf->GetElement("sonar");
+  if (!sonarElem)
+  {
+    gzerr << "Sonar sensor is missing <sonar> SDF element";
+    return;
+  }
+
+  this->rangeMin = sonarElem->Get<double>("min");
+  this->rangeMax = sonarElem->Get<double>("max");
+  this->radius = sonarElem->Get<double>("radius");
+  double range = this->rangeMax - this->rangeMin;
+
+  if (this->radius < 0)
+  {
+    gzerr << "Sonar radius must be > 0. Current value is["
+      << this->radius << "]\n";
+    return;
+  }
+
+  if (this->rangeMin < 0)
+  {
+    gzerr << "Min sonar range must be >= 0. Current value is["
+      << this->rangeMin << "]\n";
+    return;
+  }
+
+  if (this->rangeMin > this->rangeMax)
+  {
+    gzerr << "Min sonar range of [" << this->rangeMin << "] must be less than"
+      << "the max sonar range of[" << this->rangeMax << "]\n";
+    return;
+  }
+
+  Sensor::Load(_worldName);
+  GZ_ASSERT(this->world != NULL,
+      "SonarSensor did not get a valid World pointer");
+
+  this->parentEntity = this->world->GetEntity(this->parentName);
+
+  GZ_ASSERT(this->parentEntity != NULL,
+      "Unable to get the parent entity.");
+
+  physics::PhysicsEnginePtr physicsEngine = this->world->GetPhysicsEngine();
+
+  GZ_ASSERT(physicsEngine != NULL,
+      "Unable to get a pointer to the physics engine");
+
+  /// \todo: Change the collision shape to a cone. Needs a collision shape
+  /// within ODE. Or, switch out the collision engine.
+  this->sonarCollision = physicsEngine->CreateCollision("mesh",
+      this->parentName);
+
+  GZ_ASSERT(this->sonarCollision != NULL,
+      "Unable to create a cylinder collision using the physics engine.");
+
+  this->sonarCollision->SetName(this->GetScopedName() + "sensor_collision");
+
+  // We need a few contacts in order to get the closest collision. This is
+  // not guaranteed to return the closest contact.
+  this->sonarCollision->SetMaxContacts(2);
+  this->sonarCollision->AddType(physics::Base::SENSOR_COLLISION);
+  this->parentEntity->AddChild(this->sonarCollision);
+
+  this->sonarShape = boost::dynamic_pointer_cast<physics::MeshShape>(
+      this->sonarCollision->GetShape());
+
+  GZ_ASSERT(this->sonarShape != NULL,
+      "Unable to get the sonar shape from the sonar collision.");
+
+  // Use a scaled cone mesh for the sonar collision shape.
+  this->sonarShape->SetMesh("unit_cone");
+  this->sonarShape->SetScale(math::Vector3(this->radius*2.0,
+        this->radius*2.0, range));
+
+  // Position the collision shape properly. Without this, the shape will be
+  // centered at the start of the sonar.
+  math::Vector3 offset(0, 0, range * 0.5);
+  offset = this->pose.rot.RotateVector(offset);
+  this->sonarMidPose.Set(this->pose.pos - offset, this->pose.rot);
+
+  this->sonarCollision->SetRelativePose(this->sonarMidPose);
+  this->sonarCollision->SetInitialRelativePose(this->sonarMidPose);
+
+  // Don't create contacts when objects collide with the sonar shape
+  this->sonarCollision->GetSurface()->collideWithoutContact = true;
+  this->sonarCollision->GetSurface()->collideWithoutContactBitmask = 1;
+  this->sonarCollision->SetCollideBits(~GZ_SENSOR_COLLIDE);
+  this->sonarCollision->SetCategoryBits(GZ_SENSOR_COLLIDE);
+
+  /*std::vector<std::string> collisions;
+  collisions.push_back(this->sonarCollision->GetScopedName());
+
+  physics::ContactManager *contactMgr =
+    this->world->GetPhysicsEngine()->GetContactManager();
+    */
+
+  // Create a contact topic for the collision shape
+  std::string topic =
+    this->world->GetPhysicsEngine()->GetContactManager()->CreateFilter(
+        this->sonarCollision->GetScopedName(),
+        this->sonarCollision->GetScopedName());
+
+  // Subscribe to the contact topic
+  this->contactSub = this->node->Subscribe(topic,
+      &SonarSensor::OnContacts, this);
+
+  // Advertise the sensor's topic on which we will output range data.
+  this->sonarPub = this->node->Advertise<msgs::SonarStamped>(this->GetTopic());
+
+  // Initialize the message that will be published on this->sonarPub.
+  this->sonarMsg.mutable_sonar()->set_range_min(this->rangeMin);
+  this->sonarMsg.mutable_sonar()->set_range_max(this->rangeMax);
+  this->sonarMsg.mutable_sonar()->set_radius(this->radius);
+
+  msgs::Set(this->sonarMsg.mutable_sonar()->mutable_world_pose(),
+      this->sonarMidPose);
+  this->sonarMsg.mutable_sonar()->set_range(0);
+}
+
+//////////////////////////////////////////////////
+void SonarSensor::Init()
+{
+  Sensor::Init();
+  this->sonarMsg.mutable_sonar()->set_frame(this->parentName);
+  msgs::Set(this->sonarMsg.mutable_time(), this->world->GetSimTime());
+  this->sonarMsg.mutable_sonar()->set_range(this->rangeMax);
+
+  if (this->sonarPub)
+    this->sonarPub->Publish(this->sonarMsg);
+}
+
+//////////////////////////////////////////////////
+void SonarSensor::Fini()
+{
+  if (this->world && this->world->GetRunning())
+  {
+    physics::ContactManager *mgr =
+        this->world->GetPhysicsEngine()->GetContactManager();
+    mgr->RemoveFilter(this->sonarCollision->GetScopedName());
+  }
+
+  this->sonarPub.reset();
+  this->contactSub.reset();
+  Sensor::Fini();
+}
+
+//////////////////////////////////////////////////
+double SonarSensor::GetRangeMin() const
+{
+  return this->rangeMin;
+}
+
+//////////////////////////////////////////////////
+double SonarSensor::GetRangeMax() const
+{
+  return this->rangeMax;
+}
+
+//////////////////////////////////////////////////
+double SonarSensor::GetRadius() const
+{
+  return this->radius;
+}
+
+//////////////////////////////////////////////////
+double SonarSensor::GetRange()
+{
+  boost::mutex::scoped_lock lock(this->mutex);
+  return this->sonarMsg.sonar().range();
+}
+
+//////////////////////////////////////////////////
+bool SonarSensor::UpdateImpl(bool /*_force*/)
+{
+  boost::mutex::scoped_lock lock(this->mutex);
+
+  this->lastMeasurementTime = this->world->GetSimTime();
+  msgs::Set(this->sonarMsg.mutable_time(), this->lastMeasurementTime);
+
+  math::Pose referencePose = this->pose + this->parentEntity->GetWorldPose();
+  math::Vector3 pos;
+
+  if (!this->incomingContacts.empty())
+    this->sonarMsg.mutable_sonar()->set_range(this->rangeMax);
+
+  // Iterate over all the contact messages
+  for (ContactMsgs_L::iterator iter = this->incomingContacts.begin();
+      iter != this->incomingContacts.end(); ++iter)
+  {
+    // Iterate over all the contacts in the message
+    for (int i = 0; i < (*iter)->contact_size(); ++i)
+    {
+      // Debug output:
+      // std::cout << "Collision1[" << (*iter)->contact(i).collision1() << "]"
+      //  << "C2[" << (*iter)->contact(i).collision2() << "]\n";
+
+      for (int j = 0; j < (*iter)->contact(i).position_size(); ++j)
+      {
+        pos = msgs::Convert((*iter)->contact(i).position(j));
+        math::Vector3 relPos = pos - referencePose.pos;
+        double len = pos.Distance(referencePose.pos);
+
+        // Debug output:
+        // std::cout << "  SP[" << this->pose.pos << "]  P[" << pos
+        //  << "] Len[" << len << "]D["
+        //  << (*iter)->contact(i).depth(j) << "]\n";
+
+        // Copy the contact message.
+        if (len < this->sonarMsg.sonar().range())
+        {
+          this->sonarMsg.mutable_sonar()->set_range(len);
+        }
+      }
+    }
+  }
+
+  // Clear the incoming contact list.
+  this->incomingContacts.clear();
+
+  this->update(this->sonarMsg);
+
+  if (this->sonarPub)
+    this->sonarPub->Publish(this->sonarMsg);
+
+  return true;
+}
+
+//////////////////////////////////////////////////
+bool SonarSensor::IsActive()
+{
+  return Sensor::IsActive() || this->sonarPub->HasConnections();
+}
+
+//////////////////////////////////////////////////
+void SonarSensor::OnContacts(ConstContactsPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(this->mutex);
+
+  // Only store information if the sensor is active
+  if (this->IsActive() && _msg->contact_size() > 0)
+  {
+    // Store the contacts message for processing in UpdateImpl
+    this->incomingContacts.push_back(_msg);
+
+    // Prevent the incomingContacts list to grow indefinitely.
+    if (this->incomingContacts.size() > 100)
+      this->incomingContacts.pop_front();
+  }
+}
diff --git a/gazebo/sensors/SonarSensor.hh b/gazebo/sensors/SonarSensor.hh
new file mode 100644
index 0000000..d10ec57
--- /dev/null
+++ b/gazebo/sensors/SonarSensor.hh
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _SONARSENSOR_HH_
+#define _SONARSENSOR_HH_
+
+#include <string>
+#include <list>
+
+#include "gazebo/math/Angle.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  /// \ingroup gazebo_sensors
+  /// \brief Sensors namespace
+  namespace sensors
+  {
+    /// \addtogroup gazebo_sensors
+    /// \{
+
+    /// \class SonarSensor SonarSensor.hh sensors/sensors.hh
+    /// \brief Sensor with sonar cone.
+    ///
+    /// This sensor uses a cone .
+    class GAZEBO_VISIBLE SonarSensor: public Sensor
+    {
+      /// \brief Constructor
+      public: SonarSensor();
+
+      /// \brief Destructor
+      public: virtual ~SonarSensor();
+
+      // Documentation inherited
+      public: virtual void Load(const std::string &_worldName);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      // Documentation inherited
+      protected: virtual bool UpdateImpl(bool _force);
+
+      // Documentation inherited
+      protected: virtual void Fini();
+
+      // Documentation inherited
+      public: virtual std::string GetTopic() const;
+
+      /// \brief Get the minimum range of the sonar
+      /// \return The sonar's minimum range.
+      public: double GetRangeMin() const;
+
+      /// \brief Get the minimum range of the sonar.
+      /// \return The sonar's maximum range.
+      public: double GetRangeMax() const;
+
+      /// \brief Get the radius of the sonar cone at maximum range.
+      /// \return The radisu of the sonar cone at max range.
+      public: double GetRadius() const;
+
+      /// \brief Get detected range for a sonar.
+      ///         Warning: If you are accessing all the ray data in a loop
+      ///         it's possible that the Ray will update in the middle of
+      ///         your access loop. This means some data will come from one
+      ///         scan, and some from another scan. You can solve this
+      ///         problem by using SetActive(false) <your accessor loop>
+      ///         SetActive(true).
+      /// \return Returns DBL_MAX for no detection.
+      public: double GetRange();
+
+      // Documentation inherited
+      public: virtual bool IsActive();
+
+      /// \brief Connect a to the new update signal.
+      /// \param[in] _subscriber Callback function.
+      /// \return The connection, which must be kept in scope.
+      public: template<typename T>
+              event::ConnectionPtr ConnectUpdate(T _subscriber)
+              {return update.Connect(_subscriber);}
+
+      /// \brief Disconnect from the update signal.
+      /// \param[in] _conn Connection to remove.
+      public: void DisconnectUpdate(event::ConnectionPtr &_conn)
+              {update.Disconnect(_conn);}
+
+      /// \brief Callback for contact messages from the physics engine.
+      private: void OnContacts(ConstContactsPtr &_msg);
+
+      /// \brief Collison object that holds the sonarShape.
+      private: physics::CollisionPtr sonarCollision;
+
+      /// \brief Shape used to generate contact information.
+      private: physics::MeshShapePtr sonarShape;
+
+      /// \brief Parent entity of this sensor
+      private: physics::EntityPtr parentEntity;
+
+      /// \brief Subscription to contact messages from the physics engine
+      private: transport::SubscriberPtr contactSub;
+
+      /// \brief Publishes the sonsarMsg.
+      private: transport::PublisherPtr sonarPub;
+
+      /// \brief Store current sonar info
+      private: msgs::SonarStamped sonarMsg;
+
+      /// \brief Mutex used to protect reading/writing the sonar message.
+      private: boost::mutex mutex;
+
+      /// \brief Contact messages list type
+      typedef std::list<boost::shared_ptr<msgs::Contacts const> > ContactMsgs_L;
+
+      /// \brief List of received contacts from the sonar collision shape.
+      private: ContactMsgs_L incomingContacts;
+
+      /// \brief Pose of the sonar shape's midpoint.
+      private: math::Pose sonarMidPose;
+
+      /// \brief Minimum range
+      private: double rangeMin;
+
+      /// \brief Maximum range
+      private: double rangeMax;
+
+      /// \brief Radius of the sonar cone at maximum range.
+      private: double radius;
+
+      /// \brief Update event.
+      protected: event::EventT<void(msgs::SonarStamped)> update;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/sensors/SonarSensor_TEST.cc b/gazebo/sensors/SonarSensor_TEST.cc
new file mode 100644
index 0000000..f22727b
--- /dev/null
+++ b/gazebo/sensors/SonarSensor_TEST.cc
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "test/ServerFixture.hh"
+#include "test/integration/helper_physics_generator.hh"
+
+using namespace gazebo;
+
+typedef std::tr1::tuple<const char *, bool> const_char_bool;
+
+class SonarSensor_TEST : public ServerFixture,
+                         public ::testing::WithParamInterface<const_char_bool>
+{
+  /// \brief Test Creation of a Sonar sensor.
+  /// \param[in] _physicsEngine Name of physics engine to use.
+  /// \param[in] _paused Start paused if true.
+  public: void CreateSonar(const std::string &_physicsEngine, bool _paused);
+
+  /// \brief Test the sonar demo world.
+  /// \param[in] _physicsEngine Name of physics engine to use.
+  /// \param[in] _paused Start paused if true.
+  public: void DemoWorld(const std::string &_physicsEngine, bool _paused);
+};
+
+static std::string sonarSensorString =
+"<sdf version='1.4'>"
+"  <sensor name='sonar' type='sonar'>"
+"    <always_on>1</always_on>"
+"    <visualize>1</visualize>"
+"    <update_rate>20.000000</update_rate>"
+"    <sonar>"
+"      <min>0</min>"
+"      <max>1</max>"
+"      <radius>0.3</radius>"
+"    </sonar>"
+"  </sensor>"
+"</sdf>";
+
+/////////////////////////////////////////////////
+void SonarSensor_TEST::CreateSonar(const std::string &_physicsEngine,
+                                   bool _paused)
+{
+  Load("worlds/empty.world", _paused, _physicsEngine);
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+
+  sdf::ElementPtr sdf(new sdf::Element);
+  sdf::initFile("sensor.sdf", sdf);
+  sdf::readString(sonarSensorString, sdf);
+
+  physics::WorldPtr world = physics::get_world("default");
+  physics::ModelPtr model = world->GetModel("ground_plane");
+  physics::LinkPtr link = model->GetLink("link");
+
+  // Create the Sonar sensor
+  std::string sensorName = mgr->CreateSensor(sdf, "default",
+      "ground_plane::link", link->GetId());
+
+  // Make sure the returned sensor name is correct
+  EXPECT_EQ(sensorName, std::string("default::ground_plane::link::sonar"));
+
+  // Update the sensor manager so that it can process new sensors.
+  mgr->Update();
+
+  // Get a pointer to the sonar sensor
+  sensors::SonarSensorPtr sensor =
+    boost::dynamic_pointer_cast<sensors::SonarSensor>(
+        mgr->GetSensor(sensorName));
+
+  // Make sure the above dynamic cast worked.
+  ASSERT_TRUE(sensor != NULL);
+
+  // Update the sensor
+  sensor->Update(true);
+
+  EXPECT_TRUE(sensor->IsActive());
+
+  EXPECT_DOUBLE_EQ(sensor->GetRangeMin(), 0.0);
+  EXPECT_DOUBLE_EQ(sensor->GetRangeMax(), 1.0);
+  EXPECT_DOUBLE_EQ(sensor->GetRadius(), 0.3);
+  EXPECT_DOUBLE_EQ(sensor->GetRange(), 1.0);
+
+  EXPECT_TRUE(sensor->IsActive());
+}
+
+/////////////////////////////////////////////////
+void SonarSensor_TEST::DemoWorld(const std::string &_physicsEngine,
+                                 bool _paused)
+{
+  Load("worlds/sonar_demo.world", _paused, _physicsEngine);
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+
+  physics::WorldPtr world = physics::get_world();
+  ASSERT_TRUE(world);
+  world->Step(100);
+
+  // Sonar sensor name
+  std::string sensorName = "sonar";
+
+  // Update the sensor manager so that it can process new sensors.
+  mgr->Update();
+
+  // Get a pointer to the sonar sensor
+  sensors::SonarSensorPtr sensor =
+    boost::dynamic_pointer_cast<sensors::SonarSensor>(
+        mgr->GetSensor(sensorName));
+
+  // Make sure the above dynamic cast worked.
+  ASSERT_TRUE(sensor != NULL);
+
+  // Update the sensor
+  sensor->Update(true);
+
+  EXPECT_TRUE(sensor->IsActive());
+
+  EXPECT_DOUBLE_EQ(sensor->GetRangeMin(), 0.0);
+  EXPECT_DOUBLE_EQ(sensor->GetRangeMax(), 2.0);
+  EXPECT_DOUBLE_EQ(sensor->GetRadius(), 0.3);
+  if (_physicsEngine == "ode")
+    EXPECT_NEAR(sensor->GetRange(), 1.517, 1e-3);
+  else
+  {
+    gzerr << "Sonar range sensing only works in ODE, issue #1038"
+          << std::endl;
+    return;
+  }
+}
+
+TEST_P(SonarSensor_TEST, CreateSonar)
+{
+  std::string physics = std::tr1::get<0>(GetParam());
+  bool paused = std::tr1::get<1>(GetParam());
+  gzdbg << "Physics " << physics
+        << " paused " << paused
+        << std::endl;
+  CreateSonar(physics, paused);
+}
+
+TEST_P(SonarSensor_TEST, DemoWorld)
+{
+  std::string physics = std::tr1::get<0>(GetParam());
+  bool paused = std::tr1::get<1>(GetParam());
+  gzdbg << "Physics " << physics
+        << " paused " << paused
+        << std::endl;
+  DemoWorld(physics, paused);
+}
+
+INSTANTIATE_TEST_CASE_P(SonarTests, SonarSensor_TEST,
+  ::testing::Combine(PHYSICS_ENGINE_VALUES,
+  ::testing::Values(false, true)));
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/sensors/WirelessReceiver.cc b/gazebo/sensors/WirelessReceiver.cc
new file mode 100644
index 0000000..96f5045
--- /dev/null
+++ b/gazebo/sensors/WirelessReceiver.cc
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/math/Rand.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/sensors/SensorFactory.hh"
+#include "gazebo/sensors/SensorManager.hh"
+#include "gazebo/sensors/WirelessReceiver.hh"
+#include "gazebo/sensors/WirelessTransmitter.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
+
+using namespace gazebo;
+using namespace sensors;
+
+GZ_REGISTER_STATIC_SENSOR("wireless_receiver", WirelessReceiver)
+
+/////////////////////////////////////////////////
+WirelessReceiver::WirelessReceiver()
+: WirelessTransceiver()
+{
+  this->minFreq = 2412.0;
+  this->maxFreq = 2484.0;
+  this->sensitivity = -90.0;
+}
+
+//////////////////////////////////////////////////
+WirelessReceiver::~WirelessReceiver()
+{
+}
+
+//////////////////////////////////////////////////
+void WirelessReceiver::Init()
+{
+  WirelessTransceiver::Init();
+}
+
+/////////////////////////////////////////////////
+void WirelessReceiver::Load(const std::string &_worldName)
+{
+  WirelessTransceiver::Load(_worldName);
+
+  this->pub = this->node->Advertise<msgs::WirelessNodes>(this->GetTopic(), 30);
+  GZ_ASSERT(this->pub != NULL,
+      "wirelessReceiverSensor did not get a valid publisher pointer");
+
+  sdf::ElementPtr transceiverElem = this->sdf->GetElement("transceiver");
+
+  this->minFreq = transceiverElem->Get<double>("min_frequency");
+  this->maxFreq = transceiverElem->Get<double>("max_frequency");
+  this->sensitivity = transceiverElem->Get<double>("sensitivity");
+
+  if (this->minFreq <= 0)
+  {
+    gzthrow("Wireless receiver min. frequency must be > 0. Current value is ["
+      << this->minFreq << "]");
+  }
+
+  if (this->maxFreq <= 0)
+  {
+    gzthrow("Wireless receiver max. frequency must be > 0. Current value is ["
+      << this->maxFreq << "]");
+  }
+
+  if (this->minFreq > this->maxFreq)
+  {
+    gzthrow("Wireless receiver min. frequency must be less or equal than max. "
+        << "frequency. Current min. frequency is [" << this->minFreq <<
+        "] and max frequency is [" << this->maxFreq << "]");
+  }
+
+  if (this->sensitivity >= 0)
+  {
+    gzthrow("Wireless receiver sensitivity must be < 0. Current value is ["
+      << this->sensitivity << "]");
+  }
+}
+
+//////////////////////////////////////////////////
+bool WirelessReceiver::UpdateImpl(bool /*_force*/)
+{
+  std::string txEssid;
+  msgs::WirelessNodes msg;
+  double rxPower;
+  double txFreq;
+
+  this->referencePose =
+      this->pose + this->parentEntity.lock()->GetWorldPose();
+
+  math::Pose myPos = this->referencePose;
+  Sensor_V sensors = SensorManager::Instance()->GetSensors();
+  for (Sensor_V::iterator it = sensors.begin(); it != sensors.end(); ++it)
+  {
+    if ((*it)->GetType() == "wireless_transmitter")
+    {
+      boost::shared_ptr<gazebo::sensors::WirelessTransmitter> transmitter =
+          boost::static_pointer_cast<WirelessTransmitter>(*it);
+
+      txFreq = transmitter->GetFreq();
+      rxPower = transmitter->GetSignalStrength(myPos, this->GetGain());
+
+      // Discard if the frequency received is out of our frequency range,
+      // or if the received signal strengh is lower than the sensivity
+      if ((txFreq < this->GetMinFreqFiltered()) ||
+          (txFreq > this->GetMaxFreqFiltered()) ||
+          (rxPower < this->GetSensitivity()))
+      {
+        continue;
+      }
+
+      txEssid = transmitter->GetESSID();
+
+      msgs::WirelessNode *wirelessNode = msg.add_node();
+      wirelessNode->set_essid(txEssid);
+      wirelessNode->set_frequency(txFreq);
+      wirelessNode->set_signal_level(rxPower);
+    }
+  }
+  if (msg.node_size() > 0)
+  {
+    this->pub->Publish(msg);
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+double WirelessReceiver::GetMinFreqFiltered() const
+{
+  return this->minFreq;
+}
+
+/////////////////////////////////////////////////
+double WirelessReceiver::GetMaxFreqFiltered() const
+{
+  return this->maxFreq;
+}
+
+/////////////////////////////////////////////////
+double WirelessReceiver::GetSensitivity() const
+{
+  return this->sensitivity;
+}
+
+//////////////////////////////////////////////////
+void WirelessReceiver::Fini()
+{
+  WirelessTransceiver::Fini();
+}
diff --git a/gazebo/sensors/WirelessReceiver.hh b/gazebo/sensors/WirelessReceiver.hh
new file mode 100644
index 0000000..98383a0
--- /dev/null
+++ b/gazebo/sensors/WirelessReceiver.hh
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _WIRELESS_RECEIVER_HH_
+#define _WIRELESS_RECEIVER_HH_
+
+#include <string>
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/sensors/WirelessTransceiver.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace sensors
+  {
+    /// \addtogroup gazebo_sensors
+    /// \{
+
+    /// \class WirelessReceiver WirelessReceiver.hh sensors/sensors.hh
+    /// \brief Sensor class for receiving wireless signals.
+    class GAZEBO_VISIBLE WirelessReceiver: public WirelessTransceiver
+    {
+      /// \brief Constructor
+      public: WirelessReceiver();
+
+      /// \brief Constructor
+      public: virtual ~WirelessReceiver();
+
+      // Documentation inherited
+      public: virtual void Load(const std::string &_worldName);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual void Fini();
+
+      // Documentation inherited
+      private: virtual bool UpdateImpl(bool _force);
+
+      /// \brief Returns the minimum frequency filtered (MHz).
+      /// \return Reception frequency (MHz).
+      public: double GetMinFreqFiltered() const;
+
+      /// \brief Returns the maximum frequency filtered (MHz).
+      /// \return Reception frequency (MHz).
+      public: double GetMaxFreqFiltered() const;
+
+      /// \brief Returns the receiver sensitivity (dBm).
+      /// \return Receiver sensitivity (dBm).
+      public: double GetSensitivity() const;
+
+      /// \brief Reception low filter frequency (MHz).
+      private: double minFreq;
+
+      /// \brief Reception high filter frequency (MHz).
+      private: double maxFreq;
+
+      /// \brief Antenna's sensitivity of the receiver (dBm).
+      private: double sensitivity;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/sensors/WirelessReceiver_TEST.cc b/gazebo/sensors/WirelessReceiver_TEST.cc
new file mode 100644
index 0000000..4a45386
--- /dev/null
+++ b/gazebo/sensors/WirelessReceiver_TEST.cc
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <boost/algorithm/string/find.hpp>
+#include <boost/regex.hpp>
+#include "test/ServerFixture.hh"
+
+using namespace gazebo;
+class WirelessReceiver_TEST : public ServerFixture
+{
+  public: static const std::string receiverSensorString;
+  public: WirelessReceiver_TEST();
+  public: void TestCreateWirelessReceiver();
+  public: void TestIllegalTransceiver();
+  public: void TestIllegalPower();
+  public: void TestIllegalGain();
+  public: void TestIllegalMinFreq();
+  public: void TestIllegalMaxFreq();
+  public: void TestIllegalMinMaxFreq();
+  public: void TestIllegalSensitivity();
+  public: void TestUpdateImpl();
+
+  private: void CheckIllegalValue(std::string _sensorString);
+
+  private: sensors::SensorManager *mgr;
+  private: sdf::ElementPtr sdf;
+};
+
+const std::string WirelessReceiver_TEST::receiverSensorString =
+    "<sdf version='1.4'>"
+    "  <sensor name='wirelessReceiver' type='wireless_receiver'>"
+    "    <always_on>1</always_on>"
+    "    <visualize>0</visualize>"
+    "    <update_rate>1.0</update_rate>"
+    "    <transceiver>"
+    "      <min_frequency>2412.0</min_frequency>"
+    "      <max_frequency>2484.0</max_frequency>"
+    "      <power>14.5</power>"
+    "      <gain>2.5</gain>"
+    "      <sensitivity>-90.0</sensitivity>"
+    "    </transceiver>"
+    "  </sensor>"
+    "</sdf>";
+
+/////////////////////////////////////////////////
+WirelessReceiver_TEST::WirelessReceiver_TEST()
+    :sdf(new sdf::Element)
+{
+  Load("worlds/empty.world");
+  this->mgr = sensors::SensorManager::Instance();
+
+  sdf::initFile("sensor.sdf", this->sdf);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test Creation of a wireless receiver sensor
+void WirelessReceiver_TEST::TestCreateWirelessReceiver()
+{
+  sdf::readString(this->receiverSensorString, this->sdf);
+
+  // Create the wireless receiver sensor
+  std::string sensorName = this->mgr->CreateSensor(this->sdf, "default",
+      "ground_plane::link", 0);
+
+  // Make sure the returned sensor name is correct
+  EXPECT_EQ(sensorName,
+      std::string("default::ground_plane::link::wirelessReceiver"));
+
+  // Update the sensor manager so that it can process new sensors.
+  this->mgr->Update();
+
+  // Get a pointer to the wireless receiver sensor
+  sensors::WirelessReceiverPtr sensor =
+    boost::dynamic_pointer_cast<sensors::WirelessReceiver>(
+        this->mgr->GetSensor(sensorName));
+
+  // Make sure the above dynamic cast worked.
+  ASSERT_TRUE(sensor != NULL);
+
+  EXPECT_DOUBLE_EQ(sensor->GetMinFreqFiltered(), 2412.0);
+  EXPECT_DOUBLE_EQ(sensor->GetMaxFreqFiltered(), 2484.0);
+  EXPECT_DOUBLE_EQ(sensor->GetPower(), 14.5);
+  EXPECT_DOUBLE_EQ(sensor->GetGain(), 2.5);
+  EXPECT_DOUBLE_EQ(sensor->GetSensitivity(), -90);
+
+  EXPECT_TRUE(sensor->IsActive());
+}
+
+/////////////////////////////////////////////////
+/// \brief Create a sensor with an illegal value and checks that an exception
+/// is thrown
+void WirelessReceiver_TEST::CheckIllegalValue(std::string _sensorString)
+{
+  sdf::readString(_sensorString, this->sdf);
+
+  // Create the wireless receiver sensor
+  ASSERT_ANY_THROW(this->mgr->CreateSensor(this->sdf,
+      "default", "ground_plane::link", 0));
+}
+
+/////////////////////////////////////////////////
+/// \brief Test Non-existent transceiver element
+void WirelessReceiver_TEST::TestIllegalTransceiver()
+{
+  // Make a copy of the sdf string for avoid affecting other tests
+  std::string receiverSensorStringCopy = this->receiverSensorString;
+  boost::replace_first(receiverSensorStringCopy, "<transceiver>", "");
+  boost::replace_first(receiverSensorStringCopy, "</transceiver>", "");
+
+  this->CheckIllegalValue(receiverSensorStringCopy);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test wrong power value for the transceiver element
+void WirelessReceiver_TEST::TestIllegalPower()
+{
+  // Replace the power by an incorrect value
+  boost::regex re("<power>.*<\\/power>");
+  std::string receiverSensorStringCopy =
+      boost::regex_replace(this->receiverSensorString,
+          re, "<power>-1.0</power>");
+
+  this->CheckIllegalValue(receiverSensorStringCopy);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test wrong gain value for the transceiver element
+void WirelessReceiver_TEST::TestIllegalGain()
+{
+  // Replace the gain by an incorrect value
+  boost::regex re("<gain>.*<\\/gain>");
+  std::string receiverSensorStringCopy =
+      boost::regex_replace(this->receiverSensorString, re, "<gain>-1.0</gain>");
+
+  this->CheckIllegalValue(receiverSensorStringCopy);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test wrong min_frequency value for the transceiver element
+void WirelessReceiver_TEST::TestIllegalMinFreq()
+{
+  // Replace the min frequency by an incorrect value
+  boost::regex re("<min_frequency>.*<\\/min_frequency>");
+  std::string receiverSensorStringCopy =
+      boost::regex_replace(this->receiverSensorString, re,
+        "<min_frequency>-1.0</min_frequency>");
+
+  this->CheckIllegalValue(receiverSensorStringCopy);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test wrong max_frequency value for the transceiver element
+void WirelessReceiver_TEST::TestIllegalMaxFreq()
+{
+  // Replace the max frequency by an incorrect value
+  boost::regex re("<max_frequency>.*<\\/max_frequency>");
+  std::string receiverSensorStringCopy =
+      boost::regex_replace(this->receiverSensorString, re,
+        "<max_frequency>-1.0</max_frequency>");
+
+  this->CheckIllegalValue(receiverSensorStringCopy);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test min_frequency value greater than max_frequency
+void WirelessReceiver_TEST::TestIllegalMinMaxFreq()
+{
+  // Swap min_frequency and max_frequency
+  boost::regex re("<max_frequency>.*<\\/max_frequency>");
+  std::string receiverSensorStringCopy =
+      boost::regex_replace(this->receiverSensorString, re,
+        "<max_frequency>2412.0</max_frequency>");
+
+  re = "<min_frequency>.*<\\/min_frequency>";
+  receiverSensorStringCopy =
+      boost::regex_replace(receiverSensorStringCopy, re,
+        "<min_frequency>2484.0</min_frequency>");
+
+  this->CheckIllegalValue(receiverSensorStringCopy);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test wrong sensitivity value for the transceiver element
+void WirelessReceiver_TEST::TestIllegalSensitivity()
+{
+  // Replace the sensitivity by an incorrect value
+  boost::regex re("<sensitivity>.*<\\/sensitivity>");
+  std::string receiverSensorStringCopy =
+      boost::regex_replace(this->receiverSensorString, re,
+        "<sensitivity>1.0</sensitivity>");
+
+  this->CheckIllegalValue(receiverSensorStringCopy);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test the updateImpl() method
+void WirelessReceiver_TEST::TestUpdateImpl()
+{
+  sdf::readString(this->receiverSensorString, this->sdf);
+
+  // Create the wireless receiver sensor
+  std::string sensorName = this->mgr->CreateSensor(this->sdf, "default",
+      "ground_plane::link", 0);
+
+  // Make sure the returned sensor name is correct
+  EXPECT_EQ(sensorName,
+      std::string("default::ground_plane::link::wirelessReceiver"));
+
+  // Update the sensor manager so that it can process new sensors.
+  this->mgr->Update();
+
+  // Get a pointer to the wireless receiver sensor
+  sensors::WirelessReceiverPtr sensor =
+    boost::dynamic_pointer_cast<sensors::WirelessReceiver>(
+        this->mgr->GetSensor(sensorName));
+
+  // Make sure the above dynamic cast worked.
+  EXPECT_TRUE(sensor != NULL);
+
+  sensor->Update(true);
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessReceiver_TEST, TestCreateWilessReceiver)
+{
+  TestCreateWirelessReceiver();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessReceiver_TEST, TestIllegalTransceiver)
+{
+  TestIllegalTransceiver();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessReceiver_TEST, TestIllegalPower)
+{
+  TestIllegalPower();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessReceiver_TEST, TestIllegalGain)
+{
+  TestIllegalGain();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessReceiver_TEST, TestIllegalMinFreq)
+{
+  TestIllegalMinFreq();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessReceiver_TEST, TestIllegalMaxFreq)
+{
+  TestIllegalMaxFreq();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessReceiver_TEST, TestIllegalMinMaxFreq)
+{
+  TestIllegalMinMaxFreq();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessReceiver_TEST, TestIllegalSensitivity)
+{
+  TestIllegalSensitivity();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessReceiver_TEST, TestUpdateImpl)
+{
+  TestUpdateImpl();
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/sensors/WirelessTransceiver.cc b/gazebo/sensors/WirelessTransceiver.cc
new file mode 100644
index 0000000..c5bbe66
--- /dev/null
+++ b/gazebo/sensors/WirelessTransceiver.cc
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <sstream>
+#include "gazebo/math/Rand.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/sensors/SensorFactory.hh"
+#include "gazebo/sensors/SensorManager.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/WirelessTransceiver.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
+
+using namespace gazebo;
+using namespace sensors;
+
+/////////////////////////////////////////////////
+WirelessTransceiver::WirelessTransceiver()
+  : Sensor(sensors::OTHER)
+{
+  this->active = false;
+  this->gain = 2.5;
+  this->power = 14.5;
+}
+
+/////////////////////////////////////////////////
+WirelessTransceiver::~WirelessTransceiver()
+{
+}
+
+//////////////////////////////////////////////////
+std::string WirelessTransceiver::GetTopic() const
+{
+  std::string topicName = "~/";
+  topicName += this->parentName + "/" + this->GetName() + "/transceiver";
+  boost::replace_all(topicName, "::", "/");
+
+  return topicName;
+}
+
+//////////////////////////////////////////////////
+void WirelessTransceiver::Load(const std::string &_worldName)
+{
+  Sensor::Load(_worldName);
+
+  this->parentEntity = boost::dynamic_pointer_cast<physics::Link>(
+    this->world->GetEntity(this->parentName));
+
+  GZ_ASSERT(this->parentEntity.lock() != NULL, "parentEntity is NULL");
+
+  this->referencePose = this->pose + this->parentEntity.lock()->GetWorldPose();
+
+  if (!this->sdf->HasElement("transceiver"))
+  {
+    gzthrow("Transceiver sensor is missing <transceiver> SDF element");
+  }
+
+  sdf::ElementPtr transceiverElem = this->sdf->GetElement("transceiver");
+  this->gain = transceiverElem->Get<double>("gain");
+  this->power = transceiverElem->Get<double>("power");
+
+  if (this->gain < 0)
+  {
+    gzthrow("Wireless transceiver gain must be > 0. Current value is [" <<
+        this->gain << "]");
+  }
+
+  if (this->power < 0)
+  {
+    gzthrow("Wireless transceiver power must be > 0. Current value is [" <<
+        this->power << "]");
+  }
+}
+
+//////////////////////////////////////////////////
+void WirelessTransceiver::Init()
+{
+  Sensor::Init();
+}
+
+/////////////////////////////////////////////////
+void WirelessTransceiver::Fini()
+{
+  this->pub.reset();
+  this->parentEntity.lock().reset();
+  Sensor::Fini();
+}
+
+/////////////////////////////////////////////////
+double WirelessTransceiver::GetPower() const
+{
+  return this->power;
+}
+
+/////////////////////////////////////////////////
+double WirelessTransceiver::GetGain() const
+{
+  return this->gain;
+}
diff --git a/gazebo/sensors/WirelessTransceiver.hh b/gazebo/sensors/WirelessTransceiver.hh
new file mode 100644
index 0000000..d51d22a
--- /dev/null
+++ b/gazebo/sensors/WirelessTransceiver.hh
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _WIRELESS_TRANSCEIVER_HH_
+#define _WIRELESS_TRANSCEIVER_HH_
+
+#include <string>
+#include "gazebo/physics/PhysicsTypes.hh"
+#include "gazebo/sensors/Sensor.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace sensors
+  {
+    /// \addtogroup gazebo_sensors
+    /// \{
+
+    /// \class WirelessTransceiver WirelessTransceiver.hh sensors/sensors.hh
+    /// \brief Sensor class for receiving wireless signals.
+    class GAZEBO_VISIBLE WirelessTransceiver: public Sensor
+    {
+      /// \brief Constructor
+      public: WirelessTransceiver();
+
+      /// \brief Constructor
+      public: ~WirelessTransceiver();
+
+      // Documentation inherited
+      public: virtual std::string GetTopic() const;
+
+      // Documentation inherited
+      public: virtual void Load(const std::string &_worldName);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      // Documentation inherited
+      public: virtual void Fini();
+
+      /// \brief Returns the antenna's gain of the receiver (dBi).
+      /// \return Antenna's gain of the receiver (dBi).
+      public: double GetGain() const;
+
+      /// \brief Returns the receiver power (dBm).
+      /// \return Receiver power (dBm).
+      public: double GetPower() const;
+
+      /// \brief Publisher to publish propagation model data
+      protected: transport::PublisherPtr pub;
+
+      /// \brief Receiver's power (dBm).
+      protected: double power;
+
+      /// \brief Antenna's gain of the receiver (dBi).
+      protected: double gain;
+
+      /// \brief Parent entity which the sensor is attached to
+      protected: boost::weak_ptr<physics::Link> parentEntity;
+
+      /// \brief Sensor reference pose
+      protected: math::Pose referencePose;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/sensors/WirelessTransmitter.cc b/gazebo/sensors/WirelessTransmitter.cc
new file mode 100644
index 0000000..ff03a1a
--- /dev/null
+++ b/gazebo/sensors/WirelessTransmitter.cc
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/math/Rand.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/SensorFactory.hh"
+#include "gazebo/sensors/WirelessTransmitter.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
+
+using namespace gazebo;
+using namespace sensors;
+using namespace physics;
+
+GZ_REGISTER_STATIC_SENSOR("wireless_transmitter", WirelessTransmitter)
+
+const double WirelessTransmitter::NEmpty = 6;
+const double WirelessTransmitter::NObstacle = 12.0;
+const double WirelessTransmitter::ModelStdDesv = 6.0;
+const double WirelessTransmitter::Step = 1.0;
+const double WirelessTransmitter::MaxRadius = 10.0;
+
+/////////////////////////////////////////////////
+WirelessTransmitter::WirelessTransmitter()
+: WirelessTransceiver()
+{
+  this->active = false;
+  this->visualize = false;
+  this->essid = "MyESSID";
+  this->freq = 2442.0;
+}
+
+/////////////////////////////////////////////////
+WirelessTransmitter::~WirelessTransmitter()
+{
+  this->testRay.reset();
+}
+
+/////////////////////////////////////////////////
+void WirelessTransmitter::Load(const std::string &_worldName)
+{
+  WirelessTransceiver::Load(_worldName);
+
+  sdf::ElementPtr transceiverElem = this->sdf->GetElement("transceiver");
+
+  this->visualize = this->sdf->Get<bool>("visualize");
+  this->essid = transceiverElem->Get<std::string>("essid");
+  this->freq = transceiverElem->Get<double>("frequency");
+
+  if (this->freq < 0)
+  {
+    gzthrow("Wireless transmitter frequency must be > 0. Current value is ["
+      << this->freq << "]");
+    return;
+  }
+
+  this->pub = this->node->Advertise<msgs::PropagationGrid>(this->GetTopic(),
+        30);
+  GZ_ASSERT(this->pub != NULL,
+      "wirelessTransmitterSensor did not get a valid publisher pointer");
+}
+
+//////////////////////////////////////////////////
+void WirelessTransmitter::Init()
+{
+  WirelessTransceiver::Init();
+
+  // This ray will be used in GetSignalStrength() for checking obstacles
+  // between the transmitter and a given point.
+  this->testRay = boost::dynamic_pointer_cast<RayShape>(
+      world->GetPhysicsEngine()->CreateShape("ray", CollisionPtr()));
+}
+
+//////////////////////////////////////////////////
+bool WirelessTransmitter::UpdateImpl(bool /*_force*/)
+{
+  this->referencePose =
+      this->pose + this->parentEntity.lock()->GetWorldPose();
+
+  if (this->visualize)
+  {
+    msgs::PropagationGrid msg;
+    math::Pose pos;
+    math::Pose worldPose;
+    double strength;
+    msgs::PropagationParticle *p;
+
+    // Iterate using a rectangular grid, but only choose the points within
+    // a circunference of radius MaxRadius
+    for (double x = -this->MaxRadius; x <= this->MaxRadius; x += this->Step)
+    {
+      for (double y = -this->MaxRadius; y <= this->MaxRadius; y += this->Step)
+      {
+        pos.Set(x, y, 0.0, 0, 0, 0);
+
+        worldPose = pos + this->referencePose;
+
+        if (this->referencePose.pos.Distance(worldPose.pos) <= this->MaxRadius)
+        {
+          // For the propagation model assume the receiver antenna has the same
+          // gain as the transmitter
+          strength = this->GetSignalStrength(worldPose, this->GetGain());
+
+          // Add a new particle to the grid
+          p = msg.add_particle();
+          p->set_x(x);
+          p->set_y(y);
+          p->set_signal_level(strength);
+        }
+      }
+    }
+    this->pub->Publish(msg);
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+std::string WirelessTransmitter::GetESSID() const
+{
+  return this->essid;
+}
+
+/////////////////////////////////////////////////
+double WirelessTransmitter::GetFreq() const
+{
+  return this->freq;
+}
+
+/////////////////////////////////////////////////
+double WirelessTransmitter::GetSignalStrength(const math::Pose &_receiver,
+    const double rxGain)
+{
+  std::string entityName;
+  double dist;
+  math::Vector3 end = _receiver.pos;
+  math::Vector3 start = this->referencePose.pos;
+
+  // Avoid computing the intersection of coincident points
+  // This prevents an assertion in bullet (issue #849)
+  if (start == end)
+  {
+    end.z += 0.00001;
+  }
+
+  // Acquire the mutex for avoiding race condition with the physics engine
+  boost::recursive_mutex::scoped_lock lock(*(world->GetPhysicsEngine()->
+      GetPhysicsUpdateMutex()));
+
+  // Compute the value of n depending on the obstacles between Tx and Rx
+  double n = NEmpty;
+
+  // Looking for obstacles between start and end points
+  this->testRay->SetPoints(start, end);
+  this->testRay->GetIntersection(dist, entityName);
+
+  // ToDo: The ray intersects with my own collision model. Fix it.
+  if (entityName != "")
+  {
+    n = NObstacle;
+  }
+
+  double distance = std::max(1.0,
+      this->referencePose.pos.Distance(_receiver.pos));
+  double x = abs(math::Rand::GetDblNormal(0.0, ModelStdDesv));
+  double wavelength = common::SpeedOfLight / (this->GetFreq() * 1000000);
+
+  // Hata-Okumara propagation model
+  double rxPower = this->GetPower() + this->GetGain() + rxGain - x +
+      20 * log10(wavelength) - 20 * log10(4 * M_PI) - 10 * n * log10(distance);
+
+  return rxPower;
+}
diff --git a/gazebo/sensors/WirelessTransmitter.hh b/gazebo/sensors/WirelessTransmitter.hh
new file mode 100644
index 0000000..937ca85
--- /dev/null
+++ b/gazebo/sensors/WirelessTransmitter.hh
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _WIRELESS_TRANSMITTER_HH_
+#define _WIRELESS_TRANSMITTER_HH_
+
+#include <string>
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/WirelessTransceiver.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace sensors
+  {
+    /// \addtogroup gazebo_sensors
+    /// \{
+
+    /// \class WirelessTransmitter WirelessTransmitter.hh sensors/sensors.hh
+    /// \brief Transmitter to send wireless signals
+    class GAZEBO_VISIBLE WirelessTransmitter: public WirelessTransceiver
+    {
+      /// \brief Constant used in the propagation model when there are no
+      /// obstacles between transmitter and receiver
+      public: static const double NEmpty;
+
+      /// \brief Constant used in the propagation model when there are
+      /// obstacles between transmitter and receiver
+      public: static const double NObstacle;
+
+      /// \brief Std desv of the Gaussian random variable used in the
+      /// propagation model
+      public: static const double ModelStdDesv;
+
+      /// \brief Constructor.
+      public: WirelessTransmitter();
+
+      /// \brief Destructor
+      public: virtual ~WirelessTransmitter();
+
+      // Documentation inherited
+      protected: virtual bool UpdateImpl(bool _force);
+
+      // Documentation inherited
+      public: virtual void Load(const std::string &_worldName);
+
+      // Documentation inherited
+      public: virtual void Init();
+
+      /// \brief Returns the Service Set Identifier (network name).
+      /// \return Service Set Identifier (network name).
+      public: std::string GetESSID() const;
+
+      /// \brief Returns reception frequency (MHz).
+      /// \return Reception frequency (MHz).
+      public: double GetFreq() const;
+
+      /// \brief Returns the signal strength in a given world's point (dBm).
+      /// \return Signal strength in a world's point (dBm).
+      public: double GetSignalStrength(const math::Pose &_receiver,
+          const double rxGain);
+
+      /// \brief Size of the grid used for visualization.
+      private: static const double Step;
+
+      /// \brief The visualization shows the propagation model using a circular
+      /// grid, where the maximum radius covered is MaxRadius
+      private: static const double MaxRadius;
+
+      /// \brief Service Set Identifier (network name).
+      private: std::string essid;
+
+      /// \brief Reception frequency (MHz).
+      protected: double freq;
+
+      // \brief Ray used to test for collisions when placing entities
+      private: physics::RayShapePtr testRay;
+
+      // \brief When true it will publish the propagation grid to be used
+      // by the transmitter visual layer
+      private: bool visualize;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/sensors/WirelessTransmitter_TEST.cc b/gazebo/sensors/WirelessTransmitter_TEST.cc
new file mode 100644
index 0000000..b63669d
--- /dev/null
+++ b/gazebo/sensors/WirelessTransmitter_TEST.cc
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "test/ServerFixture.hh"
+
+using namespace gazebo;
+class WirelessTransmitter_TEST : public ServerFixture
+{
+    public: WirelessTransmitter_TEST();
+    public: void TestCreateWirelessTransmitter();
+    public: void TestSignalStrength();
+    public: void TestUpdateImpl();
+    public: void TestUpdateImplNoVisual();
+    public: void TestInvalidFreq();
+    private: void TxMsg(const ConstPropagationGridPtr &_msg);
+
+    private: boost::mutex mutex;
+    private: bool receivedMsg;
+    private: boost::shared_ptr<msgs::PropagationGrid const> gridMsg;
+    private: sensors::WirelessTransmitterPtr tx;
+    private: sensors::WirelessTransmitterPtr txNoVisual;
+};
+
+static std::string transmitterSensorString =
+"<sdf version='1.4'>"
+"  <sensor name='wirelessTransmitter' type='wireless_transmitter'>"
+"    <always_on>1</always_on>"
+"    <visualize>true</visualize>"
+"    <update_rate>1.0</update_rate>"
+"    <transceiver>"
+"      <essid>GzTest</essid>"
+"      <frequency>2442.0</frequency>"
+"      <power>14.5</power>"
+"      <gain>2.6</gain>"
+"    </transceiver>"
+"  </sensor>"
+"</sdf>";
+
+/////////////////////////////////////////////////
+/// \brief Constructor spawns a transmitter sensor
+WirelessTransmitter_TEST::WirelessTransmitter_TEST()
+{
+  Load("worlds/empty.world");
+
+  std::string txModelName = "tx";
+  std::string txSensorName = "wirelessTransmitter";
+  std::string txEssid = "GzTest";
+  double freq = 2442.0;
+  double power = 14.5;
+  double gain = 2.6;
+  math::Pose txPose(math::Vector3(0.0, 0.0, 0.055), math::Quaternion(0, 0, 0));
+
+  // Spawn a wireless transmitter with sensor visualization
+  SpawnWirelessTransmitterSensor(txModelName, txSensorName, txPose.pos,
+      txPose.rot.GetAsEuler(), txEssid, freq, power, gain);
+
+  this->tx = boost::static_pointer_cast<sensors::WirelessTransmitter>(
+      sensors::SensorManager::Instance()->GetSensor(txSensorName));
+
+  this->receivedMsg = false;
+}
+
+/////////////////////////////////////////////////
+/// \brief Test creation of a wireless transmitter sensor
+void WirelessTransmitter_TEST::TestCreateWirelessTransmitter()
+{
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+
+  sdf::ElementPtr sdf(new sdf::Element);
+  sdf::initFile("sensor.sdf", sdf);
+  sdf::readString(transmitterSensorString, sdf);
+
+  // Create the wireless transmitter sensor
+  std::string sensorName = mgr->CreateSensor(sdf, "default",
+      "ground_plane::link", 0);
+
+  // Make sure the returned sensor name is correct
+  EXPECT_EQ(sensorName,
+      std::string("default::ground_plane::link::wirelessTransmitter"));
+
+  // Update the sensor manager so that it can process new sensors.
+  mgr->Update();
+
+  // Get a pointer to the wireless receiver sensor
+  sensors::WirelessTransmitterPtr sensor =
+    boost::dynamic_pointer_cast<sensors::WirelessTransmitter>(
+        mgr->GetSensor(sensorName));
+
+  // Make sure the above dynamic cast worked.
+  ASSERT_TRUE(sensor != NULL);
+
+  EXPECT_EQ("GzTest", sensor->GetESSID());
+  EXPECT_DOUBLE_EQ(sensor->GetFreq(), 2442.0);
+  EXPECT_DOUBLE_EQ(sensor->GetPower(), 14.5);
+  EXPECT_DOUBLE_EQ(sensor->GetGain(), 2.6);
+
+  EXPECT_TRUE(sensor->IsActive());
+}
+
+/////////////////////////////////////////////////
+/// \brief Test an invalid frequency value
+void WirelessTransmitter_TEST::TestInvalidFreq()
+{
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+
+  sdf::ElementPtr sdf(new sdf::Element);
+  sdf::initFile("sensor.sdf", sdf);
+
+  // Replace the essid by an empty value
+  boost::regex re("<frequency>.*<\\/frequency>");
+  std::string transmitterSensorStringCopy =
+      boost::regex_replace(transmitterSensorString, re,
+        "<frequency>-1.0</frequency>");
+
+  sdf::readString(transmitterSensorStringCopy, sdf);
+
+  // Create the wireless receiver sensor
+  ASSERT_ANY_THROW(mgr->CreateSensor(sdf, "default", "ground_plane::link", 0));
+}
+
+/////////////////////////////////////////////////
+/// \brief Test the signal strength function
+void WirelessTransmitter_TEST::TestSignalStrength()
+{
+  int samples = 100;
+  double signStrengthAvg = 0.0;
+  math::Pose txPose(math::Vector3(3.0, 3.0, 0.055), math::Quaternion(0, 0, 0));
+  math::Pose txPoseOccluded(math::Vector3(-3.0, -3.0, 0.055),
+      math::Quaternion(0, 0, 0));
+
+  // Take some samples and get the average signal strength
+  for (int i = 0; i < samples; ++i)
+  {
+    this->tx->Update(true);
+    signStrengthAvg += tx->GetSignalStrength(txPose, tx->GetGain());
+  }
+  signStrengthAvg /= samples;
+
+  EXPECT_NEAR(signStrengthAvg, -62.0, this->tx->ModelStdDesv);
+}
+
+/////////////////////////////////////////////////
+/// \brief Callback executed for every propagation grid message received
+void WirelessTransmitter_TEST::TxMsg(const ConstPropagationGridPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(this->mutex);
+  // Just copy the message
+  this->gridMsg = _msg;
+  this->receivedMsg = true;
+}
+
+/////////////////////////////////////////////////
+/// \brief Test the publication of the propagation grid used for visualization
+void WirelessTransmitter_TEST::TestUpdateImpl()
+{
+  // Initialize gazebo transport layer
+  transport::NodePtr node(new transport::Node());
+  node->Init("default");
+
+  std::string txTopic =
+      "/gazebo/default/tx/link/wirelessTransmitter/transceiver";
+  transport::SubscriberPtr sub = node->Subscribe(txTopic,
+      &WirelessTransmitter_TEST::TxMsg, this);
+
+  // Make sure that the sensor is updated and some messages are published
+  for (int i = 0; i < 10; ++i)
+  {
+    this->tx->Update(true);
+    common::Time::MSleep(100);
+  }
+
+  boost::mutex::scoped_lock lock(this->mutex);
+  EXPECT_TRUE(this->receivedMsg);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test the updateImpl method with the visualization disabled
+void WirelessTransmitter_TEST::TestUpdateImplNoVisual()
+{
+  sensors::WirelessTransmitterPtr txNoVisual;
+  std::string txModelName = "tx";
+  std::string txNoVisualSensorName = "wirelessTransmitterNoVisual";
+  std::string txEssid = "GzTest";
+  double freq = 2442.0;
+  double power = 14.5;
+  double gain = 2.6;
+  math::Pose txPose(math::Vector3(3.0, 3.0, 0.055), math::Quaternion(0, 0, 0));
+
+  // Spawn a wireless transmitter without sensor visualization
+  SpawnWirelessTransmitterSensor(txModelName + "NoVisual",
+      txNoVisualSensorName, txPose.pos, txPose.rot.GetAsEuler(),
+      txEssid + "NoVisual", freq, power, gain, false);
+
+  txNoVisual = boost::static_pointer_cast<sensors::WirelessTransmitter>(
+      sensors::SensorManager::Instance()->GetSensor(txNoVisualSensorName));
+
+  // Initialize gazebo transport layer
+  transport::NodePtr node(new transport::Node());
+  node->Init("default");
+
+  std::string txTopic =
+      "/gazebo/default/txNoVisual/link/wirelessTransmitter/transceiver";
+  transport::SubscriberPtr sub = node->Subscribe(txTopic,
+      &WirelessTransmitter_TEST::TxMsg, this);
+
+  // Make sure that the sensor is updated and some messages are published
+  for (int i = 0; i < 10; ++i)
+  {
+    txNoVisual->Update(true);
+    common::Time::MSleep(100);
+  }
+
+  boost::mutex::scoped_lock lock(this->mutex);
+  EXPECT_FALSE(this->receivedMsg);
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessTransmitter_TEST, TestSensorCreation)
+{
+  TestCreateWirelessTransmitter();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessTransmitter_TEST, TestInvalidFreq)
+{
+  TestInvalidFreq();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessTransmitter_TEST, TestSignalStrength)
+{
+  TestSignalStrength();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessTransmitter_TEST, TestUpdateImpl)
+{
+  TestUpdateImpl();
+}
+
+/////////////////////////////////////////////////
+TEST_F(WirelessTransmitter_TEST, TestUpdateImplNoVisual)
+{
+  TestUpdateImplNoVisual();
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/sensors/server.cc b/gazebo/sensors/server.cc
deleted file mode 100644
index 6af08e9..0000000
--- a/gazebo/sensors/server.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <signal.h>
-#include <iostream>
-#include "common/SystemPaths.hh"
-#include "common/Time.hh"
-#include "transport/Transport.hh"
-#include "sensors/Sensors.hh"
-#include "rendering/Rendering.hh"
-#include "rendering/RenderEngine.hh"
-
-#include "gazebo.hh"
-
-bool quit = false;
-
-//////////////////////////////////////////////////
-void SignalHandler(int)
-{
-  quit = true;
-}
-
-void Load()
-{
-  gazebo::load();
-
-  /// Init the sensors library
-  gazebo::sensors::load();
-  gazebo::sensors::init();
-
-  gazebo::rendering::create_scene("world_1", false);
-  gazebo::common::Time::MSleep(10);
-}
-
-void Run()
-{
-  gazebo::run();
-  while (!quit)
-  {
-    gazebo::sensors::run_once(true);
-    gazebo::common::Time::MSleep(10);
-  }
-}
-
-int main(int /*argc*/, char ** /*argv*/)
-{
-  if (signal(SIGINT, SignalHandler) == SIG_ERR)
-  {
-    std::cerr << "signal(2) failed while setting up for SIGINT" << std::endl;
-    return -1;
-  }
-
-  Load();
-  Run();
-
-  return 0;
-}
-
-
diff --git a/gazebo/server_main.cc b/gazebo/server_main.cc
index eee0e3c..454f93a 100644
--- a/gazebo/server_main.cc
+++ b/gazebo/server_main.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  *
 */
 #include "gazebo/common/Exception.hh"
-#include "gazebo/common/LogRecord.hh"
+#include "gazebo/util/LogRecord.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/Server.hh"
 
@@ -28,13 +28,10 @@ int main(int argc, char **argv)
   {
     // Initialize the informational logger. This will log warnings, and
     // errors.
-    gazebo::common::Console::Instance()->Init("gzserver.log");
+    gzLogInit("gzserver.log");
 
     // Initialize the data logger. This will log state information.
-    gazebo::common::LogRecord::Instance()->Init("gzserver");
-
-    // Output the version of Gazebo.
-    gzlog << GAZEBO_VERSION_HEADER << std::endl;
+    gazebo::util::LogRecord::Instance()->Init("gzserver");
 
     server = new gazebo::Server();
     if (!server->ParseArgs(argc, argv))
diff --git a/gazebo/transport/CMakeLists.txt b/gazebo/transport/CMakeLists.txt
index 2f714a5..3fb2bff 100644
--- a/gazebo/transport/CMakeLists.txt
+++ b/gazebo/transport/CMakeLists.txt
@@ -12,7 +12,7 @@ set (sources
   Subscriber.cc
   SubscriptionTransport.cc
   TopicManager.cc
-  Transport.cc
+  TransportIface.cc
 ) 
 
 set (headers
@@ -28,18 +28,25 @@ set (headers
   Subscriber.hh
   SubscriptionTransport.hh
   TopicManager.hh
-  Transport.hh
+  TransportIface.hh
   TransportTypes.hh
 )
 
 set (transport_headers "" CACHE INTERNAL "transport headers" FORCE)
 foreach (hdr ${headers})
   APPEND_TO_CACHED_STRING(transport_headers "Transport Headers"
-    "#include \"transport/${hdr}\"\n")
+    "#include \"gazebo/transport/${hdr}\"\n")
 endforeach()
 configure_file (${CMAKE_CURRENT_SOURCE_DIR}/transport.hh.in
                 ${CMAKE_CURRENT_BINARY_DIR}/transport.hh )
 
+set_property(
+  SOURCE TransportIface.cc
+  PROPERTY COMPILE_DEFINITIONS
+  GAZEBO_DEFAULT_MASTER_HOST="${GAZEBO_DEFAULT_MASTER_HOST}"
+  GAZEBO_DEFAULT_MASTER_PORT=${GAZEBO_DEFAULT_MASTER_PORT}
+)
+
 
 gz_add_library(gazebo_transport ${sources})
 target_link_libraries(gazebo_transport
@@ -51,3 +58,9 @@ target_link_libraries(gazebo_transport
 
 gz_install_library(gazebo_transport)
 gz_install_includes("transport" ${headers} ${CMAKE_CURRENT_BINARY_DIR}/transport.hh)
+
+# unit tests
+set (gtest_sources
+  Connection_TEST.cc
+)
+gz_build_tests(${gtest_sources})
diff --git a/gazebo/transport/CallbackHelper.cc b/gazebo/transport/CallbackHelper.cc
index a8e25b2..fbf08a6 100644
--- a/gazebo/transport/CallbackHelper.cc
+++ b/gazebo/transport/CallbackHelper.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -46,6 +46,12 @@ bool CallbackHelper::GetLatching() const
 }
 
 /////////////////////////////////////////////////
+void CallbackHelper::SetLatching(bool _latch)
+{
+  this->latching = _latch;
+}
+
+/////////////////////////////////////////////////
 unsigned int CallbackHelper::GetId() const
 {
   return this->id;
diff --git a/gazebo/transport/CallbackHelper.hh b/gazebo/transport/CallbackHelper.hh
index 1331e31..1e2cf62 100644
--- a/gazebo/transport/CallbackHelper.hh
+++ b/gazebo/transport/CallbackHelper.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@
 #include "gazebo/common/Exception.hh"
 
 #include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -39,7 +40,7 @@ namespace gazebo
 
     /// \class CallbackHelper CallbackHelper.hh transport/transport.hh
     /// \brief A helper class to handle callbacks when messages arrive
-    class CallbackHelper
+    class GAZEBO_VISIBLE CallbackHelper
     {
       /// \brief Constructor
       /// \param[in] _latching Set to true to make the callback helper
@@ -56,7 +57,11 @@ namespace gazebo
       /// \brief Process new incoming data
       /// \param[in] _newdata Incoming data to be processed
       /// \return true if successfully processed; false otherwise
-      public: virtual bool HandleData(const std::string &_newdata) = 0;
+      /// \param[in] _cb If non-null, callback to be invoked which signals
+      /// that transmission is complete.
+      /// \param[in] _id ID associated with the message data.
+      public: virtual bool HandleData(const std::string &_newdata,
+                  boost::function<void(uint32_t)> _cb, uint32_t _id) = 0;
 
       /// \brief Process new incoming message
       /// \param[in] _newMsg Incoming message to be processed
@@ -72,6 +77,11 @@ namespace gazebo
       /// \return true if the callback is latching, false otherwise
       public: bool GetLatching() const;
 
+      /// \brief Set whether this callback is latching.
+      /// This function should only be used by the Transport library.
+      /// \param[in] _latch False to turn off latching.
+      public: void SetLatching(bool _latch);
+
       /// \brief Get the unique ID of this callback.
       /// \return The unique ID of this callback.
       public: unsigned int GetId() const;
@@ -94,7 +104,7 @@ namespace gazebo
     /// \class CallbackHelperT CallbackHelper.hh transport/transport.hh
     /// \brief Callback helper Template
     template<class M>
-    class CallbackHelperT : public CallbackHelper
+    class GAZEBO_VISIBLE CallbackHelperT : public CallbackHelper
     {
       /// \brief Constructor
       /// \param[in] _cb boost function to call on incoming messages
@@ -126,11 +136,14 @@ namespace gazebo
               }
 
       // documentation inherited
-      public: virtual bool HandleData(const std::string &_newdata)
+      public: virtual bool HandleData(const std::string &_newdata,
+                  boost::function<void(uint32_t)> _cb, uint32_t _id)
               {
                 boost::shared_ptr<M> m(new M);
                 m->ParseFromString(_newdata);
                 this->callback(m);
+                if (!_cb.empty())
+                  _cb(_id);
                 return true;
               }
 
@@ -155,7 +168,7 @@ namespace gazebo
     /// \brief Used to connect publishers to subscribers, where the
     /// subscriber wants the raw data from the publisher. Raw means that the
     /// data has not been converted into a protobuf message.
-    class RawCallbackHelper : public CallbackHelper
+    class GAZEBO_VISIBLE RawCallbackHelper : public CallbackHelper
     {
       /// \brief Constructor
       /// \param[in] _cb boost function to call on incoming messages
@@ -175,9 +188,12 @@ namespace gazebo
               }
 
       // documentation inherited
-      public: virtual bool HandleData(const std::string &_newdata)
+      public: virtual bool HandleData(const std::string &_newdata,
+                  boost::function<void(uint32_t)> _cb, uint32_t _id)
               {
                 this->callback(_newdata);
+                if (!_cb.empty())
+                  _cb(_id);
                 return true;
               }
 
diff --git a/gazebo/transport/Connection.cc b/gazebo/transport/Connection.cc
index a33173f..3573eb1 100644
--- a/gazebo/transport/Connection.cc
+++ b/gazebo/transport/Connection.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,15 +25,18 @@
 
 #include <boost/lexical_cast.hpp>
 
-#include "common/Console.hh"
-#include "msgs/msgs.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/msgs/msgs.hh"
 
-#include "transport/IOManager.hh"
-#include "transport/Connection.hh"
+#include "gazebo/transport/IOManager.hh"
+#include "gazebo/transport/ConnectionManager.hh"
+#include "gazebo/transport/Connection.hh"
 
 using namespace gazebo;
 using namespace transport;
 
+extern void dummy_callback_fn(uint32_t);
+
 unsigned int Connection::idCounter = 0;
 IOManager *Connection::iomanager = NULL;
 
@@ -56,6 +59,10 @@ static bool addressIsLoopback(const boost::asio::ip::address_v4 &_addr)
 //////////////////////////////////////////////////
 Connection::Connection()
 {
+  this->isOpen = false;
+  this->dropMsgLogged = false;
+  this->headerBuffer = new char[HEADER_LENGTH+1];
+
   if (iomanager == NULL)
     iomanager = new IOManager();
 
@@ -66,6 +73,7 @@ Connection::Connection()
 
   this->acceptor = NULL;
   this->readQuit = false;
+  this->connectError = false;
   this->writeQueue.clear();
   this->writeCount = 0;
 
@@ -73,11 +81,25 @@ Connection::Connection()
                    boost::lexical_cast<std::string>(this->GetLocalPort());
 
   this->localAddress = this->GetLocalEndpoint().address().to_string();
+
+  // Get and set the IP white list from the GAZEBO_IP_WHITE_LIST environment
+  // variable.
+  char *whiteListEnv = getenv("GAZEBO_IP_WHITE_LIST");
+  if (whiteListEnv && !std::string(whiteListEnv).empty())
+  {
+    // Automatically add in the local addresses. This guarantees that
+    // Gazebo will run properly on the local machine.
+    this->ipWhiteList = "," + this->localAddress + ",127.0.0.1,"
+      + whiteListEnv + ",";
+  }
 }
 
 //////////////////////////////////////////////////
 Connection::~Connection()
 {
+  delete [] this->headerBuffer;
+  this->headerBuffer = NULL;
+
   this->Shutdown();
 
   if (iomanager)
@@ -143,7 +165,7 @@ bool Connection::Connect(const std::string &_host, unsigned int _port)
       boost::bind(&Connection::OnConnect, this,
         boost::asio::placeholders::error, endpointIter));
 
-  // Wait for at most 2 seconds for a connection to be established.
+  // Wait for at most 60 seconds for a connection to be established.
   // The connectionCondition notification occurs in ::OnConnect.
   if (!this->connectCondition.timed_wait(lock,
         boost::posix_time::milliseconds(60000)) || this->connectError)
@@ -160,19 +182,27 @@ bool Connection::Connect(const std::string &_host, unsigned int _port)
     return false;
   }
 
+  this->isOpen = true;
+
   return true;
 }
 
 //////////////////////////////////////////////////
-void Connection::Listen(unsigned int port, const AcceptCallback &accept_cb)
+void Connection::Listen(unsigned int port, const AcceptCallback &_acceptCB)
 {
-  this->acceptCB = accept_cb;
+  this->acceptCB = _acceptCB;
 
   this->acceptor = new boost::asio::ip::tcp::acceptor(iomanager->GetIO());
   boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port);
   this->acceptor->open(endpoint.protocol());
   this->acceptor->set_option(
       boost::asio::ip::tcp::acceptor::reuse_address(true));
+  this->acceptor->set_option(
+      boost::asio::ip::tcp::acceptor::keep_alive(true));
+
+  // Enable TCP_NO_DELAY
+  this->acceptor->set_option(boost::asio::ip::tcp::no_delay(true));
+
   this->acceptor->bind(endpoint);
   this->acceptor->listen();
 
@@ -189,9 +219,22 @@ void Connection::OnAccept(const boost::system::error_code &e)
   // Call the accept callback if there isn't an error
   if (!e)
   {
-    // First start a new acceptor
-    this->acceptCB(this->acceptConn);
+    this->acceptConn->isOpen = true;
+
+    if (!this->ipWhiteList.empty() &&
+        this->ipWhiteList.find("," +
+          this->acceptConn->GetRemoteHostname() + ",") == std::string::npos)
+    {
+      gzlog << "Rejected connection from["
+        << this->acceptConn->GetRemoteHostname() << "], not in white list["
+        << this->ipWhiteList << "]\n";
+    }
+    else
+    {
+      this->acceptCB(this->acceptConn);
+    }
 
+    // First start a new acceptor
     this->acceptConn = ConnectionPtr(new Connection());
 
     this->acceptor->async_accept(*this->acceptConn->socket,
@@ -222,80 +265,62 @@ void Connection::StopRead()
 //////////////////////////////////////////////////
 void Connection::EnqueueMsg(const std::string &_buffer, bool _force)
 {
+  this->EnqueueMsg(_buffer, boost::bind(&dummy_callback_fn, _1), 0, _force);
+}
+
+//////////////////////////////////////////////////
+void Connection::EnqueueMsg(const std::string &_buffer,
+    boost::function<void(uint32_t)> _cb, uint32_t _id, bool _force)
+{
   // Don't enqueue empty messages
-  if (_buffer.empty())
+  if (_buffer.empty() || !this->IsOpen())
   {
     return;
   }
 
-  std::ostringstream header_stream;
+  snprintf(this->headerBuffer, HEADER_LENGTH + 1, "%08x",
+      static_cast<unsigned int>(_buffer.size()));
 
-  header_stream << std::setw(HEADER_LENGTH) << std::hex << _buffer.size();
-
-  if (header_stream.str().empty() ||
-      header_stream.str().size() != HEADER_LENGTH)
   {
-    // Something went wrong, inform the caller
-    boost::system::error_code error(boost::asio::error::invalid_argument);
-    gzerr << "Connection::Write error[" << error.message() << "]\n";
-    return;
-  }
-
-  /*if (_force)
-    {
     boost::recursive_mutex::scoped_lock lock(this->writeMutex);
-    boost::asio::streambuf *buffer = new boost::asio::streambuf;
-    std::ostream os(buffer);
-    os << header_stream.str() << _buffer;
 
-    std::size_t written = 0;
-    written = boost::asio::write(*this->socket, buffer->data());
-    if (written != buffer->size())
-      gzerr << "Didn't write all the data\n";
-
-    delete buffer;
-    }
+    if (this->writeQueue.empty() ||
+        (this->writeCount > 0 && this->writeQueue.size() == 1) ||
+        (this->writeQueue.back().size()+_buffer.size() > 4096))
+      this->writeQueue.push_back(std::string(headerBuffer) + _buffer);
     else
-    {
-    */
-  {
-    boost::recursive_mutex::scoped_lock lock(this->writeMutex);
-    this->writeQueue.push_back(header_stream.str());
-    this->writeQueue.push_back(_buffer);
+      this->writeQueue.back() += std::string(headerBuffer) + _buffer;
+    this->callbacks.push_back(std::make_pair(_cb, _id));
   }
-  // }
 
   if (_force)
   {
     this->ProcessWriteQueue();
   }
+  else
+  {
+    // Tell the connection manager that it needs to update
+    ConnectionManager::Instance()->TriggerUpdate();
+  }
 }
 
 /////////////////////////////////////////////////
 void Connection::ProcessWriteQueue(bool _blocking)
 {
+  boost::recursive_mutex::scoped_lock lock(this->writeMutex);
+
   if (!this->IsOpen())
   {
     return;
   }
 
-  boost::recursive_mutex::scoped_lock lock(this->writeMutex);
-
   // async_write should only be called when the last async_write has
-  // completed. Therefore we have to check the writeCount attribute
-  if (this->writeQueue.size() == 0 || this->writeCount > 0)
+  // completed. therefore we have to check the writeCount attribute
+  if (this->writeQueue.empty() || this->writeCount > 0)
   {
     return;
   }
 
-  boost::asio::streambuf *buffer(new boost::asio::streambuf);
-  std::ostream os(buffer);
-
-  for (unsigned int i = 0; i < this->writeQueue.size(); i++)
-  {
-    os << this->writeQueue[i];
-  }
-  this->writeQueue.clear();
   this->writeCount++;
 
   // Write the serialized data to the socket. We use
@@ -303,23 +328,32 @@ void Connection::ProcessWriteQueue(bool _blocking)
   // a single write operation
   if (!_blocking)
   {
-    boost::asio::async_write(*this->socket, buffer->data(),
-        boost::bind(&Connection::OnWrite, shared_from_this(),
-          boost::asio::placeholders::error, buffer));
+    this->callbackIndex = this->callbacks.size();
+    boost::asio::async_write(*this->socket,
+        boost::asio::buffer(this->writeQueue.front().c_str(),
+          this->writeQueue.front().size()),
+          boost::bind(&Connection::OnWrite, shared_from_this(),
+            boost::asio::placeholders::error));
   }
   else
   {
     try
     {
-      boost::asio::write(*this->socket, buffer->data());
+      boost::asio::write(*this->socket,
+          boost::asio::buffer(this->writeQueue.front().c_str(),
+            this->writeQueue.front().size()));
     }
     catch(...)
     {
       this->Shutdown();
     }
 
+    // Call the callback, in not NULL
+    if (!this->callbacks.front().first.empty())
+      this->callbacks.front().first(this->callbacks.front().second);
+
+    this->writeQueue.pop_front();
     this->writeCount--;
-    delete buffer;
   }
 }
 
@@ -336,13 +370,24 @@ std::string Connection::GetRemoteURI() const
 }
 
 //////////////////////////////////////////////////
-void Connection::OnWrite(const boost::system::error_code &_e,
-                         boost::asio::streambuf *_buffer)
+void Connection::OnWrite(const boost::system::error_code &_e)
 {
   {
     boost::recursive_mutex::scoped_lock lock(this->writeMutex);
+
+    for (unsigned int i = 0; i < this->callbackIndex; ++i)
+    {
+      if (!this->callbacks.empty())
+      {
+        if (!this->callbacks.front().first.empty())
+          this->callbacks.front().first(this->callbacks.front().second);
+        this->callbacks.pop_front();
+      }
+    }
+
+    if (!this->writeQueue.empty())
+      this->writeQueue.pop_front();
     this->writeCount--;
-    delete _buffer;
   }
 
   if (_e)
@@ -370,19 +415,9 @@ void Connection::Shutdown()
 bool Connection::IsOpen() const
 {
   bool result = this->socket && this->socket->is_open();
-  try
-  {
-    this->GetRemoteURI();
-  }
-  catch(...)
-  {
-    result = false;
-  }
-
-  return result;
+  return this->isOpen && result;
 }
 
-
 //////////////////////////////////////////////////
 void Connection::Close()
 {
@@ -421,6 +456,10 @@ void Connection::Close()
     delete this->acceptor;
     this->acceptor = NULL;
   }
+
+  boost::recursive_mutex::scoped_lock lock2(this->writeMutex);
+  this->writeQueue.clear();
+  this->callbacks.clear();
 }
 
 //////////////////////////////////////////////////
@@ -479,7 +518,7 @@ bool Connection::Read(std::string &data)
   }
 
   // Parse the header to get the size of the incoming data packet
-  incoming_size = this->ParseHeader(header);
+  incoming_size = this->ParseHeader(std::string(header, HEADER_LENGTH));
   if (incoming_size > 0)
   {
     incoming.resize(incoming_size);
@@ -716,6 +755,8 @@ boost::asio::ip::tcp::endpoint Connection::GetLocalEndpoint()
 
       address = address.loopback();
     }
+
+    freeifaddrs(ifaddr);
   }
 
   // Complain if we were unable to find a valid address
@@ -739,7 +780,12 @@ boost::asio::ip::tcp::endpoint Connection::GetRemoteEndpoint() const
 {
   boost::asio::ip::tcp::endpoint ep;
   if (this->socket)
-    ep = this->socket->remote_endpoint();
+  {
+    boost::system::error_code ec;
+    ep = this->socket->remote_endpoint(ec);
+    if (ec)
+      gzerr << "Getting remote endpoint failed" << std::endl;
+  }
   return ep;
 }
 
@@ -823,3 +869,9 @@ unsigned int Connection::GetId() const
 {
   return this->id;
 }
+
+//////////////////////////////////////////////////
+std::string Connection::GetIPWhiteList() const
+{
+  return this->ipWhiteList;
+}
diff --git a/gazebo/transport/Connection.hh b/gazebo/transport/Connection.hh
index ea1c6ea..30a6e79 100644
--- a/gazebo/transport/Connection.hh
+++ b/gazebo/transport/Connection.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -31,11 +31,12 @@
 #include <iostream>
 #include <iomanip>
 #include <deque>
+#include <utility>
 
-
-#include "common/Event.hh"
-#include "common/Console.hh"
-#include "common/Exception.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/util/system.hh"
 
 #define HEADER_LENGTH 8
 
@@ -52,7 +53,7 @@ namespace gazebo
     /// \cond
     /// \brief A task instance that is created when data is read from
     /// a socket and used by TBB
-    class ConnectionReadTask : public tbb::task
+    class GAZEBO_VISIBLE ConnectionReadTask : public tbb::task
     {
       /// \brief Constructor
       /// \param[_in] _func Boost function pointer, which is the function
@@ -84,10 +85,20 @@ namespace gazebo
 
     /// \addtogroup gazebo_transport Transport
     /// \{
-
+    ///
+    /// \remarks
+    ///  Environment Variables:
+    ///   - GAZEBO_IP_WHITE_LIST: Comma separated list of valid IPs. Leave
+    /// this empty to accept connections from all addresses.
+    ///   - GAZEBO_IP: IP address to export. This will override the default
+    /// IP lookup.
+    ///   - GAZEBO_HOSTNAME: Hostame to export. Setting this will override
+    /// both GAZEBO_IP and the default IP lookup.
+    ///
     /// \class Connection Connection.hh transport/transport.hh
     /// \brief Single TCP/IP connection manager
-    class Connection : public boost::enable_shared_from_this<Connection>
+    class GAZEBO_VISIBLE Connection :
+      public boost::enable_shared_from_this<Connection>
     {
       /// \brief Constructor
       public: Connection();
@@ -143,6 +154,17 @@ namespace gazebo
       /// \param[in] _buffer Data to write
       /// \param[in] _force If true, block until the data has been written
       /// to the socket, otherwise just enqueue the data for asynchronous write
+      /// \param[in] _cb If non-null, callback to be invoked after
+      /// transmission is complete.
+      /// \param[in] _id ID associated with the message data.
+      public: void EnqueueMsg(const std::string &_buffer,
+                  boost::function<void(uint32_t)> _cb, uint32_t _id,
+                  bool _force = false);
+
+      /// \brief Write data to the socket
+      /// \param[in] _buffer Data to write
+      /// \param[in] _force If true, block until the data has been written
+      /// to the socket, otherwise just enqueue the data for asynchronous write
       public: void EnqueueMsg(const std::string &_buffer, bool _force = false);
 
       /// \brief Get the local URI
@@ -212,14 +234,8 @@ namespace gazebo
               {
                 if (_e)
                 {
-                  if (_e.message() != "End of File")
-                  {
-                    // This will occur when the other side closes the
-                    // connection. We don't want spew error messages in this
-                    // case.
-                    //
-                    // It's okay to do nothing here.
-                  }
+                  if (_e.message() == "End of file")
+                    this->isOpen = false;
                 }
                 else
                 {
@@ -278,8 +294,8 @@ namespace gazebo
               {
                 if (_e)
                 {
-                  gzerr << "Error Reading data["
-                    << _e.message() << "]\n";
+                  if (_e.message() == "End of file")
+                    this->isOpen = false;
                 }
 
                 // Inform caller that data has been received
@@ -294,8 +310,10 @@ namespace gazebo
                 {
                   ConnectionReadTask *task = new(tbb::task::allocate_root())
                         ConnectionReadTask(boost::get<0>(_handler), data);
-
                   tbb::task::enqueue(*task);
+
+                  // Non-tbb version:
+                  // boost::get<0>(_handler)(data);
                 }
               }
 
@@ -324,11 +342,15 @@ namespace gazebo
       /// \return True if the _ip is a valid.
       public: static bool ValidateIP(const std::string &_ip);
 
+      /// \brief Get the IP white list, from GAZEBO_IP_WHITE_LIST
+      /// environment variable.
+      /// \return GAZEBO_IP_WHITE_LIST
+      public: std::string GetIPWhiteList() const;
+
       /// \brief Callback when a write has occurred.
       /// \param[in] _e Error code
       /// \param[in] _b Buffer of the data that was written.
-      private: void OnWrite(const boost::system::error_code &_e,
-                            boost::asio::streambuf *_b);
+      private: void OnWrite(const boost::system::error_code &_e);
 
       /// \brief Handle new connections, if this is a server
       /// \param[in] _e Error code for accept method
@@ -369,6 +391,11 @@ namespace gazebo
       /// \brief Outgoing data queue
       private: std::deque<std::string> writeQueue;
 
+      /// \brief List of callbacks, paired with writeQueue. The callbacks
+      /// are used to notify a publisher when a message is successfully sent.
+      private: std::deque<
+               std::pair<boost::function<void(uint32_t)>, uint32_t> > callbacks;
+
       /// \brief Mutex to protect new connections.
       private: boost::mutex connectMutex;
 
@@ -428,6 +455,22 @@ namespace gazebo
 
       /// \brief True if the connection has an error
       private: bool connectError;
+
+      /// \brief Comma separated list of valid IP addresses.
+      private: std::string ipWhiteList;
+
+      /// \brief Buffer for header information.
+      private: char *headerBuffer;
+
+      /// \brief Used to prevent too many log messages.
+      private: bool dropMsgLogged;
+
+      /// \brief Index into the callbacks buffer that marks the last
+      /// async_write.
+      private: unsigned int callbackIndex;
+
+      /// \brief True if the connection is open.
+      private: bool isOpen;
     };
     /// \}
   }
diff --git a/gazebo/transport/ConnectionManager.cc b/gazebo/transport/ConnectionManager.cc
index fd9af03..f0af180 100644
--- a/gazebo/transport/ConnectionManager.cc
+++ b/gazebo/transport/ConnectionManager.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,12 +15,13 @@
  *
 */
 
-#include "msgs/msgs.hh"
-#include "common/Events.hh"
-#include "transport/TopicManager.hh"
-#include "transport/ConnectionManager.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/transport/TopicManager.hh"
+#include "gazebo/transport/ConnectionManager.hh"
 
-#include "gazebo_config.h"
+#include "gazebo/gazebo_config.h"
 
 using namespace gazebo;
 using namespace transport;
@@ -36,6 +37,24 @@ class TopicManagerProcessTask : public tbb::task
           }
 };
 
+/// TBB task to establish subscriber to publisher connection.
+class TopicManagerConnectionTask : public tbb::task
+{
+  /// \brief Constructor.
+  /// \param[in] _pub Publish message
+  public: TopicManagerConnectionTask(msgs::Publish _pub) : pub(_pub) {}
+
+  /// Implements the necessary execute function
+  public: tbb::task *execute()
+          {
+            TopicManager::Instance()->ConnectSubToPub(pub);
+            return NULL;
+          }
+
+  /// \brief Publish message
+  private: msgs::Publish pub;
+};
+
 //////////////////////////////////////////////////
 ConnectionManager::ConnectionManager()
 {
@@ -45,9 +64,6 @@ ConnectionManager::ConnectionManager()
   this->stopped = true;
 
   this->serverConn = NULL;
-  this->listMutex = new boost::recursive_mutex();
-  this->masterMessagesMutex = new boost::recursive_mutex();
-  this->connectionMutex = new boost::recursive_mutex();
 
   this->eventConnections.push_back(
       event::Events::ConnectStop(boost::bind(&ConnectionManager::Stop, this)));
@@ -58,15 +74,6 @@ ConnectionManager::~ConnectionManager()
 {
   this->eventConnections.clear();
 
-  delete this->listMutex;
-  this->listMutex = NULL;
-
-  delete this->masterMessagesMutex;
-  this->masterMessagesMutex = NULL;
-
-  delete this->connectionMutex;
-  this->connectionMutex = NULL;
-
   delete this->serverConn;
   this->serverConn = NULL;
   this->Fini();
@@ -74,7 +81,8 @@ ConnectionManager::~ConnectionManager()
 
 //////////////////////////////////////////////////
 bool ConnectionManager::Init(const std::string &_masterHost,
-                             unsigned int master_port)
+                             unsigned int _masterPort,
+                             uint32_t _timeoutIterations)
 {
   this->stop = false;
   this->masterConn.reset(new Connection());
@@ -85,26 +93,47 @@ bool ConnectionManager::Init(const std::string &_masterHost,
   this->serverConn->Listen(0,
       boost::bind(&ConnectionManager::OnAccept, this, _1));
 
-  gzmsg << "Waiting for master";
-  while (!this->masterConn->Connect(_masterHost, master_port) &&
-         this->IsRunning())
+  gzmsg << "Waiting for master." << std::endl;
+  uint32_t timeoutCount = 0;
+  uint32_t waitDurationMS = 1000;
+
+  while (!this->masterConn->Connect(_masterHost, _masterPort) &&
+      this->IsRunning() && timeoutCount < _timeoutIterations)
+  {
+    ++timeoutCount;
+
+    if (timeoutCount < _timeoutIterations)
+      common::Time::MSleep(waitDurationMS);
+  }
+
+
+  if (timeoutCount >= _timeoutIterations)
   {
-    printf(".");
-    fflush(stdout);
-    common::Time::MSleep(1000);
+    gzerr << "Failed to connect to master in "
+          << (timeoutCount * waitDurationMS) / 1000.0 << " seconds."
+          << std::endl;
+    return false;
   }
-  printf("\n");
 
   if (!this->IsRunning())
   {
-    gzerr << "Connection Manager is not running\n";
+    gzerr << "Connection Manager is not running" << std::endl;
     return false;
   }
 
   std::string initData, namespacesData, publishersData;
-  this->masterConn->Read(initData);
-  this->masterConn->Read(namespacesData);
-  this->masterConn->Read(publishersData);
+
+  try
+  {
+    this->masterConn->Read(initData);
+    this->masterConn->Read(namespacesData);
+    this->masterConn->Read(publishersData);
+  }
+  catch(...)
+  {
+    gzerr << "Unable to read from master" << std::endl;
+    return false;
+  }
 
   msgs::Packet packet;
   packet.ParseFromString(initData);
@@ -117,16 +146,16 @@ bool ConnectionManager::Init(const std::string &_masterHost,
     {
       // TODO: set some flag.. maybe start "serverConn" when initialized
       gzmsg << "Connected to gazebo master @ "
-            << this->masterConn->GetRemoteURI() << "\n";
+            << this->masterConn->GetRemoteURI() << std::endl;
     }
     else
     {
       // TODO: MAke this a proper error
-      gzerr << "Conflicting gazebo versions\n";
+      gzerr << "Conflicting gazebo versions" << std::endl;
     }
   }
   else
-    gzerr << "Didn't receive an init from the master\n";
+    gzerr << "Didn't receive an init from the master" << std::endl;
 
   packet.ParseFromString(namespacesData);
   if (packet.type() == "topic_namepaces_init")
@@ -142,7 +171,7 @@ bool ConnectionManager::Init(const std::string &_masterHost,
     this->namespaceCondition.notify_all();
   }
   else
-    gzerr << "Did not get topic_namespaces_init msg from master\n";
+    gzerr << "Did not get topic_namespaces_init msg from master" << std::endl;
 
   packet.ParseFromString(publishersData);
   if (packet.type() == "publishers_init")
@@ -150,7 +179,7 @@ bool ConnectionManager::Init(const std::string &_masterHost,
     msgs::Publishers pubs;
     pubs.ParseFromString(packet.serialized_data());
 
-    boost::recursive_mutex::scoped_lock lock(*this->listMutex);
+    boost::recursive_mutex::scoped_lock lock(this->listMutex);
     for (int i = 0; i < pubs.publisher_size(); i++)
     {
       const msgs::Publish &p = pubs.publisher(i);
@@ -158,7 +187,7 @@ bool ConnectionManager::Init(const std::string &_masterHost,
     }
   }
   else
-    gzerr << "Did not get publishers_init msg from master\n";
+    gzerr << "Did not get publishers_init msg from master" << std::endl;
 
   this->masterConn->AsyncRead(
       boost::bind(&ConnectionManager::OnMasterRead, this, _1));
@@ -167,7 +196,7 @@ bool ConnectionManager::Init(const std::string &_masterHost,
 
   // Tell the user what address will be publicized to other nodes.
   gzmsg << "Publicized address: "
-        << this->masterConn->GetLocalHostname() << "\n";
+        << this->masterConn->GetLocalHostname() << std::endl;
 
   return true;
 }
@@ -180,24 +209,35 @@ void ConnectionManager::Fini()
 
   this->Stop();
 
-  this->masterConn->ProcessWriteQueue();
-  this->masterConn->Shutdown();
-  this->masterConn.reset();
+  if (this->masterConn)
+  {
+    this->masterConn->ProcessWriteQueue();
+    this->masterConn->Shutdown();
+    this->masterConn.reset();
+  }
 
-  this->serverConn->ProcessWriteQueue();
-  this->serverConn->Shutdown();
-  delete this->serverConn;
-  this->serverConn = NULL;
+  if (this->serverConn)
+  {
+    this->serverConn->ProcessWriteQueue();
+    this->serverConn->Shutdown();
+    delete this->serverConn;
+    this->serverConn = NULL;
+  }
 
+  this->eventConnections.clear();
   this->connections.clear();
+  this->publishers.clear();
+  this->namespaces.clear();
+  this->masterMessages.clear();
+
   this->initialized = false;
 }
 
-
 //////////////////////////////////////////////////
 void ConnectionManager::Stop()
 {
   this->stop = true;
+  this->updateCondition.notify_all();
   if (this->initialized)
     while (this->stopped == false)
       common::Time::MSleep(100);
@@ -208,35 +248,34 @@ void ConnectionManager::RunUpdate()
 {
   std::list<ConnectionPtr>::iterator iter;
   std::list<ConnectionPtr>::iterator endIter;
-  unsigned int msize = 0;
 
+  unsigned int msize = 0;
   {
-    boost::recursive_mutex::scoped_lock lock(*this->masterMessagesMutex);
+    boost::recursive_mutex::scoped_lock lock(this->masterMessagesMutex);
     msize = this->masterMessages.size();
   }
 
   while (msize > 0)
   {
     this->ProcessMessage(this->masterMessages.front());
-
     {
-      boost::recursive_mutex::scoped_lock lock(*this->masterMessagesMutex);
+      boost::recursive_mutex::scoped_lock lock(this->masterMessagesMutex);
       this->masterMessages.pop_front();
       msize = this->masterMessages.size();
     }
   }
 
-  this->masterConn->ProcessWriteQueue();
-
-
-  // Use TBB to process nodes.
-  TopicManagerProcessTask *task = new(tbb::task::allocate_root())
-    TopicManagerProcessTask();
-  tbb::task::enqueue(*task);
-  // TopicManager::Instance()->ProcessNodes();
-
+  if (this->masterConn)
+    this->masterConn->ProcessWriteQueue();
+
+  // Use TBB to process nodes. Need more testing to see if this makes
+  // a difference.
+  // TopicManagerProcessTask *task = new(tbb::task::allocate_root())
+  //   TopicManagerProcessTask();
+  // tbb::task::enqueue(*task);
+  TopicManager::Instance()->ProcessNodes();
   {
-    boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+    boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
     iter = this->connections.begin();
     endIter = this->connections.end();
   }
@@ -250,7 +289,7 @@ void ConnectionManager::RunUpdate()
     }
     else
     {
-      boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+      boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
       iter = this->connections.erase(iter);
     }
   }
@@ -259,11 +298,15 @@ void ConnectionManager::RunUpdate()
 //////////////////////////////////////////////////
 void ConnectionManager::Run()
 {
+  boost::mutex::scoped_lock lock(this->updateMutex);
+
   this->stopped = false;
-  while (!this->stop)
+
+  while (!this->stop && this->masterConn && this->masterConn->IsOpen())
   {
     this->RunUpdate();
-    common::Time::MSleep(30);
+    this->updateCondition.timed_wait(lock,
+       boost::posix_time::milliseconds(100));
   }
   this->RunUpdate();
 
@@ -287,11 +330,14 @@ void ConnectionManager::OnMasterRead(const std::string &_data)
 
   if (!_data.empty())
   {
-    boost::recursive_mutex::scoped_lock lock(*this->masterMessagesMutex);
+    boost::recursive_mutex::scoped_lock lock(this->masterMessagesMutex);
     this->masterMessages.push_back(std::string(_data));
   }
   else
     gzerr << "ConnectionManager::OnMasterRead empty data\n";
+
+  // Tell the ourself that we need an update
+  this->TriggerUpdate();
 }
 
 /////////////////////////////////////////////////
@@ -331,15 +377,40 @@ void ConnectionManager::ProcessMessage(const std::string &_data)
     this->namespaces.push_back(std::string(result.data()));
     this->namespaceCondition.notify_all();
   }
-
-  // Publisher_update. This occurs when we try to subscribe to a topic, and
+  // FIXME "publisher_update" is currently not used and have been separated out
+  // into "publisher_subscribe" and "publisher_advertise". This is implemented
+  // as a workaround to address transport blocking issue when gzclient connects
+  // to gzserver, see issue #714. "publisher_advertise", intended
+  // for gzserver when gzclient connects, is parallelized and made non-blocking.
+  else if (packet.type() == "publisher_update")
+  {
+    msgs::Publish pub;
+    pub.ParseFromString(packet.serialized_data());
+    if (pub.host() != this->serverConn->GetLocalAddress() ||
+        pub.port() != this->serverConn->GetLocalPort())
+    {
+      TopicManager::Instance()->ConnectSubToPub(pub);
+    }
+  }
+  else if (packet.type() == "publisher_advertise")
+  {
+    msgs::Publish pub;
+    pub.ParseFromString(packet.serialized_data());
+    if (pub.host() != this->serverConn->GetLocalAddress() ||
+        pub.port() != this->serverConn->GetLocalPort())
+    {
+      TopicManagerConnectionTask *task = new(tbb::task::allocate_root())
+      TopicManagerConnectionTask(pub);
+      tbb::task::enqueue(*task);
+    }
+  }
+  // publisher_subscribe. This occurs when we try to subscribe to a topic, and
   // the master informs us of a remote host that is publishing on our
   // requested topic
-  else if (packet.type() == "publisher_update")
+  else if (packet.type() == "publisher_subscribe")
   {
     msgs::Publish pub;
     pub.ParseFromString(packet.serialized_data());
-
     if (pub.host() != this->serverConn->GetLocalAddress() ||
         pub.port() != this->serverConn->GetLocalPort())
     {
@@ -373,18 +444,18 @@ void ConnectionManager::ProcessMessage(const std::string &_data)
 }
 
 //////////////////////////////////////////////////
-void ConnectionManager::OnAccept(const ConnectionPtr &newConnection)
+void ConnectionManager::OnAccept(ConnectionPtr _newConnection)
 {
-  newConnection->AsyncRead(
-      boost::bind(&ConnectionManager::OnRead, this, newConnection, _1));
+  _newConnection->AsyncRead(
+      boost::bind(&ConnectionManager::OnRead, this, _newConnection, _1));
 
   // Add the connection to the list of connections
-  boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
-  this->connections.push_back(newConnection);
+  boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
+  this->connections.push_back(_newConnection);
 }
 
 //////////////////////////////////////////////////
-void ConnectionManager::OnRead(const ConnectionPtr &_connection,
+void ConnectionManager::OnRead(ConnectionPtr _connection,
                                const std::string &_data)
 {
   if (_data.empty())
@@ -468,7 +539,7 @@ void ConnectionManager::GetAllPublishers(std::list<msgs::Publish> &_publishers)
   _publishers.clear();
   std::list<msgs::Publish>::iterator iter;
 
-  boost::recursive_mutex::scoped_lock lock(*this->listMutex);
+  boost::recursive_mutex::scoped_lock lock(this->listMutex);
   for (iter = this->publishers.begin(); iter != this->publishers.end(); ++iter)
     _publishers.push_back(*iter);
 }
@@ -476,19 +547,16 @@ void ConnectionManager::GetAllPublishers(std::list<msgs::Publish> &_publishers)
 //////////////////////////////////////////////////
 void ConnectionManager::GetTopicNamespaces(std::list<std::string> &_namespaces)
 {
+  if (!this->initialized)
+  {
+    gzerr << "Not initialized\n";
+    return;
+  }
+
   _namespaces.clear();
 
   boost::mutex::scoped_lock lock(this->namespaceMutex);
 
-  if (!this->namespaces.size())
-  {
-    if (!this->namespaceCondition.timed_wait(lock,
-          boost::posix_time::milliseconds(60000)))
-    {
-      gzerr << "Unable to get namespaces from master\n";
-    }
-  }
-
   for (std::list<std::string>::iterator iter = this->namespaces.begin();
        iter != this->namespaces.end(); ++iter)
   {
@@ -554,8 +622,8 @@ void ConnectionManager::Subscribe(const std::string &_topic,
 }
 
 //////////////////////////////////////////////////
-ConnectionPtr ConnectionManager::ConnectToRemoteHost(const std::string &host,
-                                                     unsigned int port)
+ConnectionPtr ConnectionManager::ConnectToRemoteHost(const std::string &_host,
+                                                     unsigned int _port)
 {
   ConnectionPtr conn;
 
@@ -563,14 +631,14 @@ ConnectionPtr ConnectionManager::ConnectToRemoteHost(const std::string &host,
     return conn;
 
   // Sharing connections is broken
-  // conn = this->FindConnection(host, port);
+  // conn = this->FindConnection(_host, _port);
   // if (!conn)
   {
     // Connect to the remote host
     conn.reset(new Connection());
-    if (conn->Connect(host, port))
+    if (conn->Connect(_host, _port))
     {
-      boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+      boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
       this->connections.push_back(conn);
     }
     else
@@ -579,8 +647,6 @@ ConnectionPtr ConnectionManager::ConnectToRemoteHost(const std::string &host,
       return ConnectionPtr();
     }
   }
-  // else
-  //  printf("Found Connections\n");
 
   return conn;
 }
@@ -590,7 +656,7 @@ void ConnectionManager::RemoveConnection(ConnectionPtr &_conn)
 {
   std::list<ConnectionPtr>::iterator iter;
 
-  boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+  boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
   iter = this->connections.begin();
   while (iter != this->connections.end())
   {
@@ -611,7 +677,7 @@ ConnectionPtr ConnectionManager::FindConnection(const std::string &_host,
 
   std::list<ConnectionPtr>::iterator iter;
 
-  boost::recursive_mutex::scoped_lock lock(*this->connectionMutex);
+  boost::recursive_mutex::scoped_lock lock(this->connectionMutex);
 
   // Check to see if we are already connected to the remote publisher
   for (iter = this->connections.begin();
@@ -624,3 +690,9 @@ ConnectionPtr ConnectionManager::FindConnection(const std::string &_host,
 
   return conn;
 }
+
+//////////////////////////////////////////////////
+void ConnectionManager::TriggerUpdate()
+{
+  this->updateCondition.notify_all();
+}
diff --git a/gazebo/transport/ConnectionManager.hh b/gazebo/transport/ConnectionManager.hh
index 37c3bc1..8419eaf 100644
--- a/gazebo/transport/ConnectionManager.hh
+++ b/gazebo/transport/ConnectionManager.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
 
 
 #include <boost/shared_ptr.hpp>
-#include <boost/thread.hpp>
+#include <boost/interprocess/sync/interprocess_semaphore.hpp>
 #include <string>
 #include <list>
 #include <vector>
@@ -29,6 +29,7 @@
 
 #include "gazebo/transport/Publisher.hh"
 #include "gazebo/transport/Connection.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -39,7 +40,8 @@ namespace gazebo
 
     /// \class ConnectionManager ConnectionManager.hh transport/transport.hh
     /// \brief Manager of connections
-    class ConnectionManager : public SingletonT<ConnectionManager>
+    class GAZEBO_VISIBLE ConnectionManager :
+      public SingletonT<ConnectionManager>
     {
       /// \brief Constructor
       private: ConnectionManager();
@@ -47,12 +49,15 @@ namespace gazebo
       /// \brief Destructor
       private: virtual ~ConnectionManager();
 
-      /// \brief Initialize the connection manager
-      /// \param[in] _masterHost Host where the master is running
-      /// \param[in] _masterPort Port where the master is running
+      /// \brief Initialize the connection manager.
+      /// \param[in] _masterHost Host where the master is running.
+      /// \param[in] _masterPort Port where the master is running.
+      /// \param[in] _timeoutIterations Number of times to wait for
+      /// a connection to master.
       /// \return true if initialization succeeded, false otherwise
       public: bool Init(const std::string &_masterHost,
-                        unsigned int _masterPort);
+                        unsigned int _masterPort,
+                        uint32_t _timeoutIterations = 30);
 
       /// \brief Run the connection manager loop.  Does not return until
       /// stopped.
@@ -68,11 +73,11 @@ namespace gazebo
       /// \brief Stop the conneciton manager
       public: void Stop();
 
-      /// \brief Subscribe to a topic
-      /// \param[in] _topic The topic to subscribe to
-      /// \param[in] _msgType The type of the topic
+      /// \brief Subscribe to a topic.
+      /// \param[in] _topic The topic to subscribe to.
+      /// \param[in] _msgType The type of the topic.
       /// \param[in] _latching If true, latch the latest incoming message;
-      /// otherwise don't
+      /// otherwise don't.
       public: void Subscribe(const std::string &_topic,
                               const std::string &_msgType,
                               bool _latching);
@@ -127,6 +132,9 @@ namespace gazebo
       public: ConnectionPtr ConnectToRemoteHost(const std::string &_host,
                                                   unsigned int _port);
 
+      /// \brief Inform the connection manager that it needs an update.
+      public: void TriggerUpdate();
+
       /// \brief Callback function called when we have read data from the
       /// master
       /// \param[in] _data String of incoming data
@@ -134,20 +142,26 @@ namespace gazebo
 
       /// \brief Callback function called when a connection is accepted
       /// \param[in] _newConnection Pointer to the new connection
-      private: void OnAccept(const ConnectionPtr &_newConnection);
+      private: void OnAccept(ConnectionPtr _newConnection);
 
       /// \brief Callback function called when a connection is read
       /// \param[in] _newConnection Pointer to new connection
       /// \param[in] _data Data that has been read.
-      private: void OnRead(const ConnectionPtr &_newConnection,
-                            const std::string &_data);
+      private: void OnRead(ConnectionPtr _newConnection,
+                           const std::string &_data);
 
       /// \brief Process a raw message.
       /// \param[in] _packet The raw message data.
       private: void ProcessMessage(const std::string &_packet);
 
       /// \brief Run the manager update loop once
-      public: void RunUpdate();
+      private: void RunUpdate();
+
+      /// \brief Condition used to trigger an update.
+      private: boost::condition_variable updateCondition;
+
+      /// \brief Mutex for updateCondition
+      private: boost::mutex updateMutex;
 
       private: ConnectionPtr masterConn;
       private: Connection *serverConn;
@@ -157,15 +171,14 @@ namespace gazebo
 
       private: bool initialized;
       private: bool stop, stopped;
-      private: boost::thread *thread;
 
       private: unsigned int tmpIndex;
-      private: boost::recursive_mutex *listMutex;
+      private: boost::recursive_mutex listMutex;
 
       /// \brief A namespace to protect the namespace list.
       private: boost::mutex namespaceMutex;
-      private: boost::recursive_mutex *masterMessagesMutex;
-      private: boost::recursive_mutex *connectionMutex;
+      private: boost::recursive_mutex masterMessagesMutex;
+      private: boost::recursive_mutex connectionMutex;
 
       private: std::list<msgs::Publish> publishers;
       private: std::list<std::string> namespaces;
diff --git a/gazebo/transport/Connection_TEST.cc b/gazebo/transport/Connection_TEST.cc
new file mode 100644
index 0000000..d94fcb4
--- /dev/null
+++ b/gazebo/transport/Connection_TEST.cc
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <string>
+#include <stdlib.h>
+
+#include "gazebo/transport/Connection.hh"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class Connection : public gazebo::testing::AutoLogFixture { };
+
+/////////////////////////////////////////////////
+TEST_F(Connection, IPWhiteList)
+{
+  transport::Connection *connection = new transport::Connection();
+  EXPECT_TRUE(connection->GetIPWhiteList().empty());
+  delete connection;
+  connection = NULL;
+
+  // Get original value
+  char *ipEnv = getenv("GAZEBO_IP_WHITE_LIST");
+
+  // Set a new IP White List Value
+  setenv("GAZEBO_IP_WHITE_LIST", "192.168.1.1", 1);
+  connection = new transport::Connection();
+  std::string localAddress = connection->GetLocalAddress();
+  EXPECT_EQ(connection->GetIPWhiteList(),
+      std::string(",") + localAddress + ",127.0.0.1,192.168.1.1,");
+  delete connection;
+  connection = NULL;
+
+  // Restore value
+  if (ipEnv)
+    setenv("GAZEBO_IP_WHITE_LIST", ipEnv, 1);
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/transport/IOManager.cc b/gazebo/transport/IOManager.cc
index 5773398..4be672b 100644
--- a/gazebo/transport/IOManager.cc
+++ b/gazebo/transport/IOManager.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  *
 */
 #include <iostream>
-#include "transport/IOManager.hh"
+#include "gazebo/transport/IOManager.hh"
 
 using namespace gazebo;
 using namespace transport;
diff --git a/gazebo/transport/IOManager.hh b/gazebo/transport/IOManager.hh
index bd045e4..49f481d 100644
--- a/gazebo/transport/IOManager.hh
+++ b/gazebo/transport/IOManager.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 
 #include <boost/thread/thread.hpp>
 #include <boost/asio.hpp>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -29,7 +30,7 @@ namespace gazebo
 
     /// \class IOManager IOManager.hh transport/transport.hh
     /// \brief Manages boost::asio IO
-    class IOManager
+    class GAZEBO_VISIBLE IOManager
     {
       /// \brief Constructor
       public: IOManager();
diff --git a/gazebo/transport/Node.cc b/gazebo/transport/Node.cc
index 8f1d3b1..106289c 100644
--- a/gazebo/transport/Node.cc
+++ b/gazebo/transport/Node.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
 */
 
 #include <boost/algorithm/string.hpp>
-#include "gazebo/transport/Transport.hh"
+#include "gazebo/transport/TransportIface.hh"
 #include "gazebo/transport/Node.hh"
 
 using namespace gazebo;
@@ -24,6 +24,8 @@ using namespace transport;
 
 unsigned int Node::idCounter = 0;
 
+extern void dummy_callback_fn(uint32_t);
+
 /////////////////////////////////////////////////
 Node::Node()
 {
@@ -41,10 +43,23 @@ Node::~Node()
 /////////////////////////////////////////////////
 void Node::Fini()
 {
+  if (!this->initialized)
+    return;
+
+  // Unadvertise all the publishers.
+  for (std::vector<PublisherPtr>::iterator iter = this->publishers.begin();
+       iter != this->publishers.end(); ++iter)
+  {
+    (*iter)->Fini();
+    TopicManager::Instance()->Unadvertise(*iter);
+  }
+
+  this->initialized = false;
   TopicManager::Instance()->RemoveNode(this->id);
 
   {
-    boost::recursive_mutex::scoped_lock lock(this->publisherMutex);
+    boost::mutex::scoped_lock lock(this->publisherDeleteMutex);
+    boost::mutex::scoped_lock lock2(this->publisherMutex);
     this->publishers.clear();
   }
 
@@ -70,13 +85,17 @@ void Node::Init(const std::string &_space)
   if (_space.empty())
   {
     this->topicNamespace = "default";
-    std::list<std::string> namespaces;
-    TopicManager::Instance()->GetTopicNamespaces(namespaces);
 
-    if (namespaces.empty())
+    // wait at most 1 second for namespaces to appear.
+    if (transport::waitForNamespaces(common::Time(1, 0)))
+    {
+      std::list<std::string> namespaces;
+      TopicManager::Instance()->GetTopicNamespaces(namespaces);
+      this->topicNamespace = namespaces.empty() ? this->topicNamespace :
+        namespaces.front();
+    }
+    else
       gzerr << "No namespace found\n";
-
-    this->topicNamespace = namespaces.front();
   }
   else
     TopicManager::Instance()->RegisterTopicNamespace(_space);
@@ -120,12 +139,20 @@ unsigned int Node::GetId() const
 /////////////////////////////////////////////////
 void Node::ProcessPublishers()
 {
-  boost::recursive_mutex::scoped_lock lock(this->publisherMutex);
-  for (this->publishersIter = this->publishers.begin();
-       this->publishersIter != this->publishersEnd; this->publishersIter++)
+  if (!this->initialized)
+    return;
+
+  int start, end;
+  boost::mutex::scoped_lock lock(this->publisherDeleteMutex);
+
   {
-    (*this->publishersIter)->SendMessage();
+    boost::mutex::scoped_lock lock2(this->publisherMutex);
+    start = 0;
+    end = this->publishers.size();
   }
+
+  for (int i = start; i < end; ++i)
+    this->publishers[i]->SendMessage();
 }
 
 /////////////////////////////////////////////////
@@ -133,6 +160,7 @@ bool Node::HandleData(const std::string &_topic, const std::string &_msg)
 {
   boost::recursive_mutex::scoped_lock lock(this->incomingMutex);
   this->incomingMsgs[_topic].push_back(_msg);
+  ConnectionManager::Instance()->TriggerUpdate();
   return true;
 }
 
@@ -141,13 +169,18 @@ bool Node::HandleMessage(const std::string &_topic, MessagePtr _msg)
 {
   boost::recursive_mutex::scoped_lock lock(this->incomingMutex);
   this->incomingMsgsLocal[_topic].push_back(_msg);
+  ConnectionManager::Instance()->TriggerUpdate();
   return true;
 }
 
 /////////////////////////////////////////////////
 void Node::ProcessIncoming()
 {
-  boost::recursive_mutex::scoped_lock lock(this->incomingMutex);
+  boost::recursive_mutex::scoped_lock lock(this->processIncomingMutex);
+
+  if (!this->initialized ||
+      (this->incomingMsgs.empty() && this->incomingMsgsLocal.empty()))
+    return;
 
   Callback_M::iterator cbIter;
   Callback_L::iterator liter;
@@ -157,6 +190,8 @@ void Node::ProcessIncoming()
     std::list<std::string>::iterator msgIter;
     std::map<std::string, std::list<std::string> >::iterator inIter;
     std::map<std::string, std::list<std::string> >::iterator endIter;
+
+    boost::recursive_mutex::scoped_lock lock2(this->incomingMutex);
     inIter = this->incomingMsgs.begin();
     endIter = this->incomingMsgs.end();
 
@@ -166,19 +201,26 @@ void Node::ProcessIncoming()
       cbIter = this->callbacks.find(inIter->first);
       if (cbIter != this->callbacks.end())
       {
+        std::list<std::string>::iterator msgInIter;
+        std::list<std::string>::iterator msgEndIter;
+
+        msgInIter = inIter->second.begin();
+        msgEndIter = inIter->second.end();
+
         // For each message in the buffer
-        for (msgIter = inIter->second.begin(); msgIter != inIter->second.end();
-            ++msgIter)
+        for (msgIter = msgInIter; msgIter != msgEndIter; ++msgIter)
         {
           // Send the message to all callbacks
           for (liter = cbIter->second.begin();
               liter != cbIter->second.end(); ++liter)
           {
-            (*liter)->HandleData(*msgIter);
+            (*liter)->HandleData(*msgIter,
+                boost::bind(&dummy_callback_fn, _1), 0);
           }
         }
       }
     }
+
     this->incomingMsgs.clear();
   }
 
@@ -186,6 +228,8 @@ void Node::ProcessIncoming()
     std::list<MessagePtr>::iterator msgIter;
     std::map<std::string, std::list<MessagePtr> >::iterator inIter;
     std::map<std::string, std::list<MessagePtr> >::iterator endIter;
+
+    boost::recursive_mutex::scoped_lock lock2(this->incomingMutex);
     inIter = this->incomingMsgsLocal.begin();
     endIter = this->incomingMsgsLocal.end();
 
@@ -195,9 +239,14 @@ void Node::ProcessIncoming()
       cbIter = this->callbacks.find(inIter->first);
       if (cbIter != this->callbacks.end())
       {
+        std::list<MessagePtr>::iterator msgInIter;
+        std::list<MessagePtr>::iterator msgEndIter;
+
+        msgInIter = inIter->second.begin();
+        msgEndIter = inIter->second.end();
+
         // For each message in the buffer
-        for (msgIter = inIter->second.begin(); msgIter != inIter->second.end();
-            ++msgIter)
+        for (msgIter = msgInIter; msgIter != msgEndIter; ++msgIter)
         {
           // Send the message to all callbacks
           for (liter = cbIter->second.begin();
@@ -208,6 +257,7 @@ void Node::ProcessIncoming()
         }
       }
     }
+
     this->incomingMsgsLocal.clear();
   }
 }
@@ -225,7 +275,10 @@ void Node::InsertLatchedMsg(const std::string &_topic, const std::string &_msg)
          liter != cbIter->second.end(); ++liter)
     {
       if ((*liter)->GetLatching())
-        (*liter)->HandleData(_msg);
+      {
+        (*liter)->HandleData(_msg, boost::bind(&dummy_callback_fn, _1), 0);
+        (*liter)->SetLatching(false);
+      }
     }
   }
 }
@@ -243,7 +296,10 @@ void Node::InsertLatchedMsg(const std::string &_topic, MessagePtr _msg)
          liter != cbIter->second.end(); ++liter)
     {
       if ((*liter)->GetLatching())
+      {
         (*liter)->HandleMessage(_msg);
+        (*liter)->SetLatching(false);
+      }
     }
   }
 }
@@ -271,6 +327,9 @@ bool Node::HasLatchedSubscriber(const std::string &_topic) const
 /////////////////////////////////////////////////
 void Node::RemoveCallback(const std::string &_topic, unsigned int _id)
 {
+  if (!this->initialized)
+    return;
+
   boost::recursive_mutex::scoped_lock lock(this->incomingMutex);
 
   // Find the topic list in the map.
diff --git a/gazebo/transport/Node.hh b/gazebo/transport/Node.hh
index 641613a..12e29e8 100644
--- a/gazebo/transport/Node.hh
+++ b/gazebo/transport/Node.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,8 +25,9 @@
 #include <string>
 #include <vector>
 
-#include "transport/TransportTypes.hh"
-#include "transport/TopicManager.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/transport/TopicManager.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,7 @@ namespace gazebo
   {
     /// \cond
     /// \brief Task used by Node::Publish to publish on a one-time publisher
-    class PublishTask : public tbb::task
+    class GAZEBO_VISIBLE PublishTask : public tbb::task
     {
       /// \brief Constructor
       /// \param[in] _pub Publisher to publish the message on.
@@ -53,6 +54,7 @@ namespace gazebo
               {
                 this->pub->WaitForConnection();
                 this->pub->Publish(*this->msg, true);
+                this->pub->SendMessage();
                 delete this->msg;
                 this->pub.reset();
                 return NULL;
@@ -72,7 +74,7 @@ namespace gazebo
     /// \class Node Node.hh transport/transport.hh
     /// \brief A node can advertise and subscribe topics, publish on
     ///        advertised topics and listen to subscribed topics.
-    class Node : public boost::enable_shared_from_this<Node>
+    class GAZEBO_VISIBLE Node : public boost::enable_shared_from_this<Node>
     {
       /// \brief Constructor
       public: Node();
@@ -155,9 +157,9 @@ namespace gazebo
           transport::TopicManager::Instance()->Advertise<M>(
               decodedTopic, _queueLimit, _hzRate);
 
-        boost::recursive_mutex::scoped_lock lock(this->publisherMutex);
+        boost::mutex::scoped_lock lock(this->publisherMutex);
+        publisher->SetNode(shared_from_this());
         this->publishers.push_back(publisher);
-        this->publishersEnd = this->publishers.end();
 
         return publisher;
       }
@@ -325,7 +327,6 @@ namespace gazebo
       private: std::string topicNamespace;
       private: std::vector<PublisherPtr> publishers;
       private: std::vector<PublisherPtr>::iterator publishersIter;
-      private: std::vector<PublisherPtr>::iterator publishersEnd;
       private: static unsigned int idCounter;
       private: unsigned int id;
 
@@ -337,9 +338,14 @@ namespace gazebo
       /// \brief List of newly arrive messages
       private: std::map<std::string, std::list<MessagePtr> > incomingMsgsLocal;
 
-      private: boost::recursive_mutex publisherMutex;
+      private: boost::mutex publisherMutex;
+      private: boost::mutex publisherDeleteMutex;
       private: boost::recursive_mutex incomingMutex;
 
+      /// \brief make sure we don't call ProcessingIncoming simultaneously
+      /// from separate threads.
+      private: boost::recursive_mutex processIncomingMutex;
+
       private: bool initialized;
     };
     /// \}
diff --git a/gazebo/transport/Publication.cc b/gazebo/transport/Publication.cc
index 815621e..eeafe81 100644
--- a/gazebo/transport/Publication.cc
+++ b/gazebo/transport/Publication.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 using namespace gazebo;
 using namespace transport;
 
+extern void dummy_callback_fn(uint32_t);
 unsigned int Publication::idCounter = 0;
 
 //////////////////////////////////////////////////
@@ -51,19 +52,19 @@ void Publication::AddSubscription(const NodePtr &_node)
 
   if (iter == endIter)
   {
-    {
-      boost::mutex::scoped_lock lock(this->nodeMutex);
-      this->nodes.push_back(_node);
-    }
+    boost::mutex::scoped_lock lock(this->nodeMutex);
+    this->nodes.push_back(_node);
+  }
 
-    boost::mutex::scoped_lock lock(this->callbackMutex);
+  boost::mutex::scoped_lock lock(this->callbackMutex);
 
-    std::vector<PublisherPtr>::iterator pubIter;
-    for (pubIter = this->publishers.begin(); pubIter != this->publishers.end();
-         ++pubIter)
+  // Send latched messages to the subscription.
+  for (std::map<uint32_t, MessagePtr>::iterator pubIter =
+      this->prevMsgs.begin(); pubIter != this->prevMsgs.end(); ++pubIter)
+  {
+    if (pubIter->second)
     {
-      if ((*pubIter)->GetPrevMsgPtr())
-        _node->InsertLatchedMsg(this->topic, (*pubIter)->GetPrevMsgPtr());
+      _node->InsertLatchedMsg(this->topic, pubIter->second);
     }
   }
 }
@@ -82,18 +83,28 @@ void Publication::AddSubscription(const CallbackHelperPtr _callback)
 
     if (_callback->GetLatching())
     {
-      std::vector<PublisherPtr>::iterator pubIter;
-      for (pubIter = this->publishers.begin();
-           pubIter != this->publishers.end(); ++pubIter)
+      // Send latched messages to the subscription.
+      for (std::map<uint32_t, MessagePtr>::iterator pubIter =
+          this->prevMsgs.begin(); pubIter != this->prevMsgs.end(); ++pubIter)
       {
-        if ((*pubIter)->GetPrevMsgPtr())
-          _callback->HandleMessage((*pubIter)->GetPrevMsgPtr());
+        if (pubIter->second)
+        {
+          _callback->HandleMessage(pubIter->second);
+        }
       }
+      _callback->SetLatching(false);
     }
   }
 }
 
 //////////////////////////////////////////////////
+void Publication::SetPrevMsg(uint32_t _pubId, MessagePtr _msg)
+{
+  boost::mutex::scoped_lock lock(this->callbackMutex);
+  this->prevMsgs[_pubId] = _msg;
+}
+
+//////////////////////////////////////////////////
 void Publication::AddTransport(const PublicationTransportPtr &_publink)
 {
   bool add = true;
@@ -178,7 +189,7 @@ void Publication::RemoveSubscription(const NodePtr &_node)
   }
 
   // If no more subscribers, then disconnect from all publishers
-  if (this->nodes.size() == 0 && this->callbacks.size() == 0)
+  if (this->nodes.empty() && this->callbacks.empty())
   {
     this->transports.clear();
   }
@@ -216,14 +227,14 @@ void Publication::RemoveSubscription(const std::string &_host,
   }
 
   // If no more subscribers, then disconnect from all publishers
-  if (this->nodes.size() == 0 && this->callbacks.size() == 0)
+  if (this->nodes.empty() && this->callbacks.empty())
   {
     this->transports.clear();
   }
 }
 
 //////////////////////////////////////////////////
-void Publication::LocalPublish(const std::string &data)
+void Publication::LocalPublish(const std::string &_data)
 {
   std::list<NodePtr>::iterator iter, endIter;
 
@@ -234,7 +245,7 @@ void Publication::LocalPublish(const std::string &data)
     endIter = this->nodes.end();
     while (iter != endIter)
     {
-      if ((*iter)->HandleData(this->topic, data))
+      if ((*iter)->HandleData(this->topic, _data))
         ++iter;
       else
         this->nodes.erase(iter++);
@@ -254,7 +265,8 @@ void Publication::LocalPublish(const std::string &data)
     {
       if ((*cbIter)->IsLocal())
       {
-        if ((*cbIter)->HandleData(data))
+        if ((*cbIter)->HandleData(_data,
+              boost::bind(&dummy_callback_fn, _1), 0))
           ++cbIter;
         else
           cbIter = this->callbacks.erase(cbIter);
@@ -266,8 +278,10 @@ void Publication::LocalPublish(const std::string &data)
 }
 
 //////////////////////////////////////////////////
-void Publication::Publish(MessagePtr _msg, const boost::function<void()> &_cb)
+int Publication::Publish(MessagePtr _msg, boost::function<void(uint32_t)> _cb,
+    uint32_t _id)
 {
+  int result = 0;
   std::list<NodePtr>::iterator iter, endIter;
 
   {
@@ -292,7 +306,7 @@ void Publication::Publish(MessagePtr _msg, const boost::function<void()> &_cb)
   {
     boost::mutex::scoped_lock lock(this->callbackMutex);
 
-    if (this->callbacks.size() > 0)
+    if (!this->callbacks.empty())
     {
       std::string data;
       _msg->SerializeToString(&data);
@@ -301,16 +315,27 @@ void Publication::Publish(MessagePtr _msg, const boost::function<void()> &_cb)
 
       while (cbIter != this->callbacks.end())
       {
-        if ((*cbIter)->HandleData(data))
+        if ((*cbIter)->HandleData(data, _cb, _id))
+        {
+          ++result;
           ++cbIter;
+        }
         else
           this->callbacks.erase(cbIter++);
       }
+
+      if (this->callbacks.empty() && !_cb.empty())
+      {
+        _cb(_id);
+      }
+    }
+    else if (!_cb.empty())
+    {
+      _cb(_id);
     }
   }
 
-  if (_cb)
-    (_cb)();
+  return result;
 }
 
 //////////////////////////////////////////////////
@@ -375,6 +400,21 @@ void Publication::AddPublisher(PublisherPtr _pub)
 }
 
 //////////////////////////////////////////////////
+void Publication::RemovePublisher(PublisherPtr _pub)
+{
+  boost::mutex::scoped_lock lock(this->callbackMutex);
+
+  GZ_ASSERT(_pub, "Received a NULL PublisherPtr");
+
+  // Find the publiser
+  std::vector<PublisherPtr>::iterator iter = std::find(
+      this->publishers.begin(), this->publishers.end(), _pub);
+
+  if (iter != this->publishers.end())
+    this->publishers.erase(iter);
+}
+
+//////////////////////////////////////////////////
 void Publication::RemoveNodes()
 {
   boost::mutex::scoped_lock removeLock(this->nodeRemoveMutex);
@@ -437,9 +477,18 @@ void Publication::RemoveNodes()
   {
     boost::mutex::scoped_lock lock(this->nodeMutex);
     // If no more subscribers, then disconnect from all publishers
-    if (this->nodes.size() == 0 && this->callbacks.size() == 0)
+    if (this->nodes.empty() && this->callbacks.empty())
     {
       this->transports.clear();
     }
   }
 }
+
+//////////////////////////////////////////////////
+MessagePtr Publication::GetPrevMsg(uint32_t _pubId)
+{
+  if (this->prevMsgs.find(_pubId) != this->prevMsgs.end())
+    return this->prevMsgs[_pubId];
+  else
+    return MessagePtr();
+}
diff --git a/gazebo/transport/Publication.hh b/gazebo/transport/Publication.hh
index db0dc23..2d56782 100644
--- a/gazebo/transport/Publication.hh
+++ b/gazebo/transport/Publication.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,10 +24,12 @@
 #include <list>
 #include <string>
 #include <vector>
+#include <map>
 
-#include "transport/CallbackHelper.hh"
-#include "transport/TransportTypes.hh"
-#include "transport/PublicationTransport.hh"
+#include "gazebo/transport/CallbackHelper.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/transport/PublicationTransport.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -39,7 +41,7 @@ namespace gazebo
     /// \class Publication Publication.hh transport/transport.hh
     /// \brief A publication for a topic. This facilitates transport of
     /// messages
-    class Publication
+    class GAZEBO_VISIBLE Publication
     {
       /// \brief Constructor
       /// \param[in] _topic The topic we're publishing
@@ -110,10 +112,28 @@ namespace gazebo
 
       /// \brief Publish data to remote subscribers
       /// \param[in] _msg Message to be published
-      /// \param[in] _cb If non-null, callback to be invoked after publishing
+      /// \param[in] _cb Callback to be invoked after publishing
       /// is completed
-      public: void Publish(MessagePtr _msg,
-                           const boost::function<void()> &_cb = NULL);
+      /// \return Number of remote subscribers that will receive the
+      /// message.
+      public: int Publish(MessagePtr _msg,
+                  boost::function<void(uint32_t)> _cb,
+                  uint32_t _id);
+
+      /// \brief Remove a publisher.
+      /// \param[in] _pub Pointer to publisher object to remove.
+      public: void RemovePublisher(PublisherPtr _pub);
+
+      /// \brief Set the previous message for a publisher.
+      /// \param[in] _pubId ID of the publisher.
+      /// \param[in] _msg The previous message.
+      public: void SetPrevMsg(uint32_t _pubId, MessagePtr _msg);
+
+      /// \brief Get a previous message for a publisher.
+      /// \param[in] _pubId ID of the publisher.
+      /// \return Pointer to the previous message. NULL if there is no
+      /// previous message.
+      public: MessagePtr GetPrevMsg(uint32_t _pubId);
 
       /// \brief Add a transport
       /// \param[in] _publink Pointer to publication transport object to
@@ -145,7 +165,7 @@ namespace gazebo
       /// \brief Type of message produced through the publication
       private: std::string msgType;
 
-      /// \brief Remove nodes that receieve messages.
+      /// \brief Remote nodes that receieve messages.
       private: std::list<CallbackHelperPtr> callbacks;
 
       /// \brief Local nodes that recieve messages.
@@ -174,6 +194,9 @@ namespace gazebo
 
       /// \brief Mutex to protect the list of nodes id for removed.
       private: mutable boost::mutex nodeRemoveMutex;
+
+      /// \brief Publishers and their last messages.
+      private: std::map<uint32_t, MessagePtr> prevMsgs;
     };
     /// \}
   }
diff --git a/gazebo/transport/PublicationTransport.cc b/gazebo/transport/PublicationTransport.cc
index fe1a30f..81661d8 100644
--- a/gazebo/transport/PublicationTransport.cc
+++ b/gazebo/transport/PublicationTransport.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,9 +15,9 @@
  *
 */
 
-#include "transport/TopicManager.hh"
-#include "transport/ConnectionManager.hh"
-#include "transport/PublicationTransport.hh"
+#include "gazebo/transport/TopicManager.hh"
+#include "gazebo/transport/ConnectionManager.hh"
+#include "gazebo/transport/PublicationTransport.hh"
 
 using namespace gazebo;
 using namespace transport;
@@ -38,8 +38,6 @@ PublicationTransport::~PublicationTransport()
 {
   if (this->connection)
   {
-    this->connection->DisconnectShutdown(this->shutdownConnectionPtr);
-
     msgs::Subscribe sub;
     sub.set_topic(this->topic);
     sub.set_msg_type(this->msgType);
@@ -71,15 +69,8 @@ void PublicationTransport::Init(const ConnectionPtr &_conn, bool _latched)
   // Start reading messages from the remote publisher
   this->connection->AsyncRead(boost::bind(&PublicationTransport::OnPublish,
         this, _1));
-
-  this->shutdownConnectionPtr = this->connection->ConnectToShutdown(
-      boost::bind(&PublicationTransport::OnConnectionShutdown, this));
 }
 
-/////////////////////////////////////////////////
-void PublicationTransport::OnConnectionShutdown()
-{
-}
 
 /////////////////////////////////////////////////
 void PublicationTransport::AddCallback(
diff --git a/gazebo/transport/PublicationTransport.hh b/gazebo/transport/PublicationTransport.hh
index 11209ff..5cb3b7a 100644
--- a/gazebo/transport/PublicationTransport.hh
+++ b/gazebo/transport/PublicationTransport.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,8 +21,9 @@
 #include <boost/shared_ptr.hpp>
 #include <string>
 
-#include "transport/Connection.hh"
-#include "common/Event.hh"
+#include "gazebo/transport/Connection.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
     /// transport/transport.hh
     /// \brief Reads data from a remote advertiser, and passes the data
     /// along to local subscribers
-    class PublicationTransport
+    class GAZEBO_VISIBLE PublicationTransport
     {
       /// \brief Constructor
       /// \param[in] _topic Topic that we're publishing
@@ -72,9 +73,6 @@ namespace gazebo
       /// \return The topic type
       public: std::string GetMsgType() const;
 
-      /// \brief Called when connection is shutdown.
-      private: void OnConnectionShutdown();
-
       /// \brief Called when data is published.
       /// \param[in] _data Data to be published.
       private: void OnPublish(const std::string &_data);
@@ -91,9 +89,6 @@ namespace gazebo
       /// \brief Callback used when OnPublish is called.
       private: boost::function<void (const std::string &)> callback;
 
-      /// \brief Event listener for the connection's shutdown signal.
-      private: event::ConnectionPtr shutdownConnectionPtr;
-
       /// \brief Counter to give the publication transport a unique id.
       private: static int counter;
 
diff --git a/gazebo/transport/Publisher.cc b/gazebo/transport/Publisher.cc
index 5430b23..3cd191f 100644
--- a/gazebo/transport/Publisher.cc
+++ b/gazebo/transport/Publisher.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,20 +19,14 @@
  */
 
 #include "gazebo/common/Exception.hh"
+#include "gazebo/transport/Node.hh"
 #include "gazebo/transport/TopicManager.hh"
 #include "gazebo/transport/Publisher.hh"
 
 using namespace gazebo;
 using namespace transport;
 
-//////////////////////////////////////////////////
-Publisher::Publisher(const std::string &_topic, const std::string &_msgType,
-                     unsigned int _limit, bool /*_latch*/)
-  : topic(_topic), msgType(_msgType), queueLimit(_limit)
-{
-  this->queueLimitWarned = false;
-  this->updatePeriod = 0;
-}
+uint32_t Publisher::idCounter = 0;
 
 //////////////////////////////////////////////////
 Publisher::Publisher(const std::string &_topic, const std::string &_msgType,
@@ -44,16 +38,13 @@ Publisher::Publisher(const std::string &_topic, const std::string &_msgType,
     this->updatePeriod = 1.0 / _hzRate;
 
   this->queueLimitWarned = false;
+  this->pubId = 0;
+  this->id = ++idCounter;
 }
 
 //////////////////////////////////////////////////
 Publisher::~Publisher()
 {
-  if (this->messages.size() > 0)
-    this->SendMessage();
-
-  if (!this->topic.empty())
-    TopicManager::Instance()->Unadvertise(this->topic);
 }
 
 //////////////////////////////////////////////////
@@ -72,8 +63,24 @@ void Publisher::WaitForConnection() const
 }
 
 //////////////////////////////////////////////////
+bool Publisher::WaitForConnection(const common::Time &_timeout) const
+{
+  common::Time start = common::Time::GetWallTime();
+  common::Time curr = common::Time::GetWallTime();
+
+  while (!this->HasConnections() &&
+      (_timeout <= 0.0 || curr - start < _timeout))
+  {
+    common::Time::MSleep(100);
+    curr = common::Time::GetWallTime();
+  }
+
+  return this->HasConnections();
+}
+
+//////////////////////////////////////////////////
 void Publisher::PublishImpl(const google::protobuf::Message &_message,
-                            bool /*_block*/)
+                            bool _block)
 {
   if (_message.GetTypeName() != this->msgType)
     gzthrow("Invalid message type\n");
@@ -81,14 +88,11 @@ void Publisher::PublishImpl(const google::protobuf::Message &_message,
   if (!_message.IsInitialized())
   {
     gzerr << "Publishing an uninitialized message on topic[" <<
-        this->topic << "]. Required field [" <<
-        _message.InitializationErrorString() << "] missing.\n";
+      this->topic << "]. Required field [" <<
+      _message.InitializationErrorString() << "] missing.\n";
     return;
   }
 
-  // if (!this->HasConnections())
-  // return;
-
   // Check if a throttling rate has been set
   if (this->updatePeriod > 0)
   {
@@ -98,7 +102,7 @@ void Publisher::PublishImpl(const google::protobuf::Message &_message,
     // Skip publication if the time difference is less than the update period.
     if (this->prevPublishTime != common::Time(0, 0) &&
         (this->currentTime - this->prevPublishTime).Double() <
-         this->updatePeriod)
+        this->updatePeriod)
     {
       return;
     }
@@ -111,54 +115,98 @@ void Publisher::PublishImpl(const google::protobuf::Message &_message,
   MessagePtr msgPtr(_message.New());
   msgPtr->CopyFrom(_message);
 
+  this->publication->SetPrevMsg(this->id, msgPtr);
+
   {
-    boost::recursive_mutex::scoped_lock lock(this->mutex);
-    if (this->prevMsg == NULL)
-      this->prevMsg = msgPtr;
+    boost::mutex::scoped_lock lock(this->mutex);
 
     this->messages.push_back(msgPtr);
 
     if (this->messages.size() > this->queueLimit)
     {
+      this->messages.pop_front();
+
       if (!queueLimitWarned)
       {
         gzwarn << "Queue limit reached for topic "
-               << this->topic
-               << ", deleting message. "
-               << "This warning is printed only once." << std::endl;
+          << this->topic
+          << ", deleting message. "
+          << "This warning is printed only once." << std::endl;
         queueLimitWarned = true;
       }
-
-      this->messages.pop_front();
     }
   }
+
+  TopicManager::Instance()->AddNodeToProcess(this->node);
+
+  if (_block)
+  {
+    this->SendMessage();
+  }
+  else
+  {
+    // Tell the connection manager that it needs to update
+    ConnectionManager::Instance()->TriggerUpdate();
+  }
 }
 
 //////////////////////////////////////////////////
 void Publisher::SendMessage()
 {
-  boost::recursive_mutex::scoped_lock lock(this->mutex);
+  std::list<MessagePtr> localBuffer;
+  std::list<uint32_t> localIds;
 
-  if (this->messages.size() > 0)
   {
-    std::list<MessagePtr>::iterator iter;
-    for (iter = this->messages.begin(); iter != this->messages.end(); ++iter)
+    boost::mutex::scoped_lock lock(this->mutex);
+    if (!this->pubIds.empty() || this->messages.empty())
+      return;
+
+    for (unsigned int i = 0; i < this->messages.size(); ++i)
     {
-      // Send the latest message.
-      TopicManager::Instance()->Publish(this->topic, *iter,
-          boost::bind(&Publisher::OnPublishComplete, this));
+      this->pubId = (this->pubId + 1) % 10000;
+      this->pubIds[this->pubId] = 0;
+      localIds.push_back(this->pubId);
     }
 
+    std::copy(this->messages.begin(), this->messages.end(),
+        std::back_inserter(localBuffer));
     this->messages.clear();
   }
+
+  // Only send messages if there is something to send
+  if (!localBuffer.empty())
+  {
+    std::list<uint32_t>::iterator pubIter = localIds.begin();
+
+    // Send all the current messages
+    for (std::list<MessagePtr>::iterator iter = localBuffer.begin();
+        iter != localBuffer.end(); ++iter, ++pubIter)
+    {
+      // Send the latest message.
+      this->pubIds[*pubIter] = this->publication->Publish(*iter,
+          boost::bind(&Publisher::OnPublishComplete, this, _1), *pubIter);
+
+      if (this->pubIds[*pubIter] <= 0)
+        this->pubIds.erase(*pubIter);
+    }
+
+    // Clear the local buffer.
+    localBuffer.clear();
+    localIds.clear();
+  }
+}
+
+//////////////////////////////////////////////////
+void Publisher::SetNode(NodePtr _node)
+{
+  this->node = _node;
 }
 
 //////////////////////////////////////////////////
 unsigned int Publisher::GetOutgoingCount() const
 {
-  boost::recursive_mutex::scoped_lock lock(this->mutex);
-  unsigned int c = this->messages.size();
-  return c;
+  boost::mutex::scoped_lock lock(this->mutex);
+  return this->messages.size();
 }
 
 //////////////////////////////////////////////////
@@ -174,15 +222,13 @@ std::string Publisher::GetMsgType() const
 }
 
 //////////////////////////////////////////////////
-void Publisher::OnPublishComplete()
+void Publisher::OnPublishComplete(uint32_t _id)
 {
-}
+  boost::mutex::scoped_lock lock(this->mutex);
 
-//////////////////////////////////////////////////
-void Publisher::SetPublication(PublicationPtr &_publication, int _i)
-{
-  if (_i == 0)
-    this->publication = _publication;
+  std::map<uint32_t, int>::iterator iter = this->pubIds.find(_id);
+  if (iter != this->pubIds.end() && (--iter->second) <= 0)
+    this->pubIds.erase(iter);
 }
 
 //////////////////////////////////////////////////
@@ -192,26 +238,45 @@ void Publisher::SetPublication(PublicationPtr _publication)
 }
 
 //////////////////////////////////////////////////
-bool Publisher::GetLatching() const
+void Publisher::Fini()
 {
-  return false;
+  if (!this->messages.empty())
+    this->SendMessage();
+
+  if (!this->topic.empty())
+    TopicManager::Instance()->Unadvertise(this->topic);
+
+  common::Time slept;
+
+  // Wait for the message to be published
+  while (!this->pubIds.empty() && slept < common::Time(1, 0))
+  {
+    common::Time::MSleep(10);
+    slept += common::Time(0, 10000000);
+  }
+
+  this->node.reset();
 }
 
 //////////////////////////////////////////////////
 std::string Publisher::GetPrevMsg() const
 {
   std::string result;
-  boost::recursive_mutex::scoped_lock lock(this->mutex);
-  if (this->prevMsg)
-    this->prevMsg->SerializeToString(&result);
+  if (this->publication)
+  {
+    MessagePtr msg = this->publication->GetPrevMsg(this->id);
+    if (msg)
+      msg->SerializeToString(&result);
+  }
+
   return result;
 }
 
 //////////////////////////////////////////////////
 MessagePtr Publisher::GetPrevMsgPtr() const
 {
-  boost::recursive_mutex::scoped_lock lock(this->mutex);
-  if (this->prevMsg)
-    return this->prevMsg;
-  return MessagePtr();
+  if (this->publication)
+    return this->publication->GetPrevMsg(this->id);
+  else
+    return MessagePtr();
 }
diff --git a/gazebo/transport/Publisher.hh b/gazebo/transport/Publisher.hh
index a142dd9..f2d832d 100644
--- a/gazebo/transport/Publisher.hh
+++ b/gazebo/transport/Publisher.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,8 +25,11 @@
 #include <boost/thread.hpp>
 #include <string>
 #include <list>
+#include <map>
 
-#include "transport/TransportTypes.hh"
+#include "gazebo/common/Time.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -37,12 +40,8 @@ namespace gazebo
 
     /// \class Publisher Publisher.hh transport/transport.hh
     /// \brief A publisher of messages on a topic
-    class Publisher
+    class GAZEBO_VISIBLE Publisher
     {
-      /// Deprecated
-      public: Publisher(const std::string &_topic, const std::string &_msgType,
-                  unsigned int _limit, bool _latch) GAZEBO_DEPRECATED(1.5);
-
       /// \brief Constructor
       /// \param[in] _topic Name of topic to be published
       /// \param[in] _msgType Type of the message to be published
@@ -63,10 +62,12 @@ namespace gazebo
       ///        publisher
       public: void WaitForConnection() const;
 
-      /// \brief DEPRECATED in version 1.6
-      /// \sa SetPublication
-      public: void SetPublication(PublicationPtr &_publication, int _i)
-              GAZEBO_DEPRECATED(1.5);
+      /// \brief Block until a connection has been established with this
+      ///        publisher
+      /// \param[in] _timeout Maxiumum time to wait. Use a negative time
+      /// value to wait forever.
+      /// \return True if a connection was established.
+      public: bool WaitForConnection(const common::Time &_timeout) const;
 
       /// \brief Set the publication object for a particular publication
       /// \param[in] _publication Pointer to the publication object to be set
@@ -92,9 +93,6 @@ namespace gazebo
       /// \return The number of outgoing messages
       public: unsigned int GetOutgoingCount() const;
 
-      private: void PublishImpl(const google::protobuf::Message &_message,
-                                bool _block);
-
       /// \brief Get the topic name
       /// \return The topic name
       public: std::string GetTopic() const;
@@ -106,8 +104,10 @@ namespace gazebo
       /// \brief Send latest message over the wire. For internal use only
       public: void SendMessage();
 
-      /// Deprecated
-      public: bool GetLatching() const GAZEBO_DEPRECATED(1.5);
+      /// \brief Set our containing node.
+      /// \param[in] _node Pointer to a node. Should be the node that create
+      /// this publisher.
+      public: void SetNode(NodePtr _node);
 
       /// \brief Get the previously published message
       /// \return The previously published message, if any
@@ -117,8 +117,19 @@ namespace gazebo
       /// \return The previously published message, if any
       public: MessagePtr GetPrevMsgPtr() const;
 
+      /// \brief Finalize the publisher.
+      public: void Fini();
+
+      /// \brief Implementation of Publish.
+      /// \param[in] _message Message to be published.
+      /// \param[in] _block Whether to block until the message is actually
+      /// written out.
+      private: void PublishImpl(const google::protobuf::Message &_message,
+                                bool _block);
+
       /// \brief Callback when a publish is completed
-      private: void OnPublishComplete();
+      /// \param[in] _id ID associated with the publication.
+      private: void OnPublishComplete(uint32_t _id);
 
       /// \brief Topic on which messages are published.
       private: std::string topic;
@@ -142,17 +153,29 @@ namespace gazebo
       private: std::list<MessagePtr> messages;
 
       /// \brief For mutual exclusion.
-      private: mutable boost::recursive_mutex mutex;
+      private: mutable boost::mutex mutex;
 
       /// \brief The publication pointers. One for normal publication, and
       /// one for debug.
       private: PublicationPtr publication;
 
-      /// \brief The previous message published. Used for latching topics.
-      private: MessagePtr prevMsg;
+      /// \brief Pointer to our containing node.
+      private: NodePtr node;
 
       private: common::Time currentTime;
       private: common::Time prevPublishTime;
+
+      /// \brief Current id of the sent message.
+      private: uint32_t pubId;
+
+      /// \brief Current publication ids.
+      private: std::map<uint32_t, int> pubIds;
+
+      /// \brief Unique ID for this publisher.
+      private: uint32_t id;
+
+      /// \brief Counter to create unique ID for publishers.
+      private: static uint32_t idCounter;
     };
     /// \}
   }
diff --git a/gazebo/transport/SubscribeOptions.hh b/gazebo/transport/SubscribeOptions.hh
index ace2c54..1ff8302 100644
--- a/gazebo/transport/SubscribeOptions.hh
+++ b/gazebo/transport/SubscribeOptions.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 #include <boost/shared_ptr.hpp>
 #include <string>
 #include "gazebo/transport/CallbackHelper.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -31,7 +32,7 @@ namespace gazebo
 
     /// \class SubscribeOptions SubscribeOptions.hh transport/transport.hh
     /// \brief Options for a subscription
-    class SubscribeOptions
+    class GAZEBO_VISIBLE SubscribeOptions
     {
       /// \brief Constructor
       public: SubscribeOptions()
diff --git a/gazebo/transport/Subscriber.cc b/gazebo/transport/Subscriber.cc
index 5f44813..0f7a2e1 100644
--- a/gazebo/transport/Subscriber.cc
+++ b/gazebo/transport/Subscriber.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/gazebo/transport/Subscriber.hh b/gazebo/transport/Subscriber.hh
index 7f35337..c0396df 100644
--- a/gazebo/transport/Subscriber.hh
+++ b/gazebo/transport/Subscriber.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,7 +24,8 @@
 #include <string>
 #include <boost/shared_ptr.hpp>
 
-#include "transport/CallbackHelper.hh"
+#include "gazebo/transport/CallbackHelper.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -35,7 +36,7 @@ namespace gazebo
 
     /// \class Subscriber Subscriber.hh transport/transport.hh
     /// \brief A subscriber to a topic
-    class Subscriber
+    class GAZEBO_VISIBLE Subscriber
     {
       /// \brief Constructor
       /// \param[in] _topic The topic we're subscribing to
diff --git a/gazebo/transport/SubscriptionTransport.cc b/gazebo/transport/SubscriptionTransport.cc
index 25e5111..697f65d 100644
--- a/gazebo/transport/SubscriptionTransport.cc
+++ b/gazebo/transport/SubscriptionTransport.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,12 +14,14 @@
  * limitations under the License.
  *
 */
-#include "transport/ConnectionManager.hh"
-#include "transport/SubscriptionTransport.hh"
+#include "gazebo/transport/ConnectionManager.hh"
+#include "gazebo/transport/SubscriptionTransport.hh"
 
 using namespace gazebo;
 using namespace transport;
 
+extern void dummy_callback_fn(uint32_t);
+
 //////////////////////////////////////////////////
 SubscriptionTransport::SubscriptionTransport()
 {
@@ -29,10 +31,11 @@ SubscriptionTransport::SubscriptionTransport()
 SubscriptionTransport::~SubscriptionTransport()
 {
   ConnectionManager::Instance()->RemoveConnection(this->connection);
+  this->connection.reset();
 }
 
 //////////////////////////////////////////////////
-void SubscriptionTransport::Init(const ConnectionPtr &_conn, bool _latching)
+void SubscriptionTransport::Init(ConnectionPtr _conn, bool _latching)
 {
   this->connection = _conn;
   this->latching = _latching;
@@ -43,16 +46,17 @@ bool SubscriptionTransport::HandleMessage(MessagePtr _newMsg)
 {
   std::string data;
   _newMsg->SerializeToString(&data);
-  return this->HandleData(data);
+  return this->HandleData(data, boost::bind(&dummy_callback_fn, _1), 0);
 }
 
 //////////////////////////////////////////////////
-bool SubscriptionTransport::HandleData(const std::string &newdata)
+bool SubscriptionTransport::HandleData(const std::string &_newdata,
+    boost::function<void(uint32_t)> _cb, uint32_t _id)
 {
   bool result = false;
   if (this->connection->IsOpen())
   {
-    this->connection->EnqueueMsg(newdata);
+    this->connection->EnqueueMsg(_newdata, _cb, _id);
     result = true;
   }
   else
@@ -73,4 +77,3 @@ bool SubscriptionTransport::IsLocal() const
 {
   return false;
 }
-
diff --git a/gazebo/transport/SubscriptionTransport.hh b/gazebo/transport/SubscriptionTransport.hh
index 7931e19..960bbc4 100644
--- a/gazebo/transport/SubscriptionTransport.hh
+++ b/gazebo/transport/SubscriptionTransport.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 
 #include "Connection.hh"
 #include "CallbackHelper.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -34,7 +35,7 @@ namespace gazebo
     /// transport/transport.hh
     /// \brief Handles sending data over the wire to
     /// remote subscribers
-    class SubscriptionTransport : public CallbackHelper
+    class GAZEBO_VISIBLE SubscriptionTransport : public CallbackHelper
     {
       /// \brief Constructor
       public: SubscriptionTransport();
@@ -46,12 +47,16 @@ namespace gazebo
       /// \param[in] _conn The connection to use
       /// \param[in] _latching If true, latch the latest message; if false,
       /// don't latch
-      public: void Init(const ConnectionPtr &_conn, bool _latching);
+      public: void Init(ConnectionPtr _conn, bool _latching);
 
       /// \brief Output a message to a connection
       /// \param[in] _newdata The message to be handled
       /// \return true if the message was handled successfully, false otherwise
-      public: virtual bool HandleData(const std::string &_newdata);
+      /// \param[in] _cb If non-null, callback to be invoked after
+      /// transmission is complete.
+      /// \param[in] _id ID associated with the message data.
+      public: virtual bool HandleData(const std::string &_newdata,
+                  boost::function<void(uint32_t)> _cb, uint32_t _id);
 
       // Documentation inherited
       public: virtual bool HandleMessage(MessagePtr _newMsg);
diff --git a/gazebo/transport/TopicManager.cc b/gazebo/transport/TopicManager.cc
index b59544d..0b229cb 100644
--- a/gazebo/transport/TopicManager.cc
+++ b/gazebo/transport/TopicManager.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -74,7 +74,7 @@ void TopicManager::Fini()
 {
   // These two lines make sure that pending messages get sent out
   this->ProcessNodes(true);
-  ConnectionManager::Instance()->RunUpdate();
+  // ConnectionManager::Instance()->RunUpdate();
 
   PublicationPtr_M::iterator iter;
   for (iter = this->advertisedTopics.begin();
@@ -134,24 +134,53 @@ void TopicManager::RemoveNode(unsigned int _id)
 }
 
 //////////////////////////////////////////////////
-void TopicManager::ProcessNodes(bool _onlyOut)
+void TopicManager::AddNodeToProcess(NodePtr _ptr)
 {
-  std::vector<NodePtr>::iterator iter;
-  int s;
-
+  if (_ptr)
   {
-    boost::recursive_mutex::scoped_lock lock(this->nodeMutex);
+    boost::mutex::scoped_lock lock(this->processNodesMutex);
+    this->nodesToProcess.insert(_ptr);
+  }
+}
 
-    // store as size might change (spawning)
-    s = this->nodes.size();
+//////////////////////////////////////////////////
+void TopicManager::ProcessNodes(bool _onlyOut)
+{
+  {
+    boost::mutex::scoped_lock lock(this->processNodesMutex);
+    for (boost::unordered_set<NodePtr>::iterator iter =
+        this->nodesToProcess.begin();
+        iter != this->nodesToProcess.end(); ++iter)
+    {
+      (*iter)->ProcessPublishers();
+    }
+    this->nodesToProcess.clear();
   }
 
+  // Note: In general there are very few nodes. So, parallelization is not
+  // needed. Keeping this code for posterity.
+  // int s;
+  // {
+  //   boost::recursive_mutex::scoped_lock lock(this->nodeMutex);
+  //   // store as size might change (spawning)
+  //   s = this->nodes.size();
+  // }
   // Process nodes in parallel
-  tbb::parallel_for(tbb::blocked_range<size_t>(0, this->nodes.size(), 10),
-      NodeProcess_TBB(&this->nodes));
+  // try
+  // {
+  //   boost::mutex::scoped_lock lock(this->processNodesMutex);
+  //   tbb::parallel_for(tbb::blocked_range<size_t>(0, this->nodes.size(), 10),
+  //       NodeProcess_TBB(&this->nodes));
+  // }
+  // catch(...)
+  // {
+  //   /// Failed to process the nodes this time around. But not to
+  //   /// worry. This function is called again.
+  // }
 
   if (!this->pauseIncoming && !_onlyOut)
   {
+    int s = 0;
     {
       boost::recursive_mutex::scoped_lock lock(this->nodeMutex);
       s = this->nodes.size();
@@ -168,12 +197,14 @@ void TopicManager::ProcessNodes(bool _onlyOut)
 
 //////////////////////////////////////////////////
 void TopicManager::Publish(const std::string &_topic, MessagePtr _message,
-    const boost::function<void()> &_cb)
+    boost::function<void(uint32_t)> _cb, uint32_t _id)
 {
   PublicationPtr pub = this->FindPublication(_topic);
 
   if (pub)
-    pub->Publish(_message, _cb);
+    pub->Publish(_message, _cb, _id);
+  else if (!_cb.empty())
+    _cb(_id);
 }
 
 //////////////////////////////////////////////////
@@ -324,24 +355,23 @@ void TopicManager::ConnectSubToPub(const msgs::Publish &_pub)
   this->ConnectSubscribers(_pub.topic());
 }
 
-
 //////////////////////////////////////////////////
-PublicationPtr TopicManager::UpdatePublications(const std::string &topic,
-                                                const std::string &msgType)
+PublicationPtr TopicManager::UpdatePublications(const std::string &_topic,
+                                                const std::string &_msgType)
 {
   // Find a current publication on this topic
-  PublicationPtr pub = this->FindPublication(topic);
+  PublicationPtr pub = this->FindPublication(_topic);
 
   if (pub)
   {
-    if (msgType != pub->GetMsgType())
+    if (_msgType != pub->GetMsgType())
       gzthrow("Attempting to advertise on an existing topic with"
               " a conflicting message type\n");
   }
   else
   {
-    pub = PublicationPtr(new Publication(topic, msgType));
-    this->advertisedTopics[topic] =  pub;
+    pub = PublicationPtr(new Publication(_topic, _msgType));
+    this->advertisedTopics[_topic] =  pub;
     this->advertisedTopicsEnd = this->advertisedTopics.end();
   }
 
@@ -365,33 +395,30 @@ void TopicManager::Unadvertise(const std::string &_topic)
 }
 
 //////////////////////////////////////////////////
-void TopicManager::RegisterTopicNamespace(const std::string &_name)
+void TopicManager::Unadvertise(PublisherPtr _pub)
 {
-  ConnectionManager::Instance()->RegisterTopicNamespace(_name);
+  GZ_ASSERT(_pub, "Unadvertising a NULL Publisher");
+
+  if (_pub)
+  {
+    PublicationPtr publication = this->FindPublication(_pub->GetTopic());
+    if (publication)
+      publication->RemovePublisher(_pub);
+
+    this->Unadvertise(_pub->GetTopic());
+  }
 }
 
 //////////////////////////////////////////////////
-void TopicManager::GetTopicNamespaces(std::list<std::string> &_namespaces)
+void TopicManager::RegisterTopicNamespace(const std::string &_name)
 {
-  ConnectionManager::Instance()->GetTopicNamespaces(_namespaces);
+  ConnectionManager::Instance()->RegisterTopicNamespace(_name);
 }
 
 //////////////////////////////////////////////////
-std::map<std::string, std::list<std::string> >
-TopicManager::GetAdvertisedTopics() const
+void TopicManager::GetTopicNamespaces(std::list<std::string> &_namespaces)
 {
-  std::map<std::string, std::list<std::string> > result;
-  std::list<msgs::Publish> publishers;
-
-  ConnectionManager::Instance()->GetAllPublishers(publishers);
-
-  for (std::list<msgs::Publish>::iterator iter = publishers.begin();
-      iter != publishers.end(); ++iter)
-  {
-    result[(*iter).msg_type()].push_back((*iter).topic());
-  }
-
-  return result;
+  ConnectionManager::Instance()->GetTopicNamespaces(_namespaces);
 }
 
 //////////////////////////////////////////////////
diff --git a/gazebo/transport/TopicManager.hh b/gazebo/transport/TopicManager.hh
index ba19c9d..2eddd3b 100644
--- a/gazebo/transport/TopicManager.hh
+++ b/gazebo/transport/TopicManager.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include <list>
 #include <string>
 #include <vector>
+#include <boost/unordered/unordered_set.hpp>
 
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Exception.hh"
@@ -36,6 +37,7 @@
 #include "gazebo/transport/Publisher.hh"
 #include "gazebo/transport/Publication.hh"
 #include "gazebo/transport/Subscriber.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -46,7 +48,7 @@ namespace gazebo
 
     /// \class TopicManager TopicManager.hh transport/transport.hh
     /// \brief Manages topics and their subscriptions
-    class TopicManager : public SingletonT<TopicManager>
+    class GAZEBO_VISIBLE TopicManager : public SingletonT<TopicManager>
     {
       private: TopicManager();
       private: virtual ~TopicManager();
@@ -157,13 +159,18 @@ namespace gazebo
       /// \param[in] _topic The topic to be unadvertised
       public: void Unadvertise(const std::string &_topic);
 
+      /// \brief Unadvertise a publisher.
+      /// \param[in] _pub Publisher to unadvertise.
+      public: void Unadvertise(PublisherPtr _pub);
+
       /// \brief Send a message. Use a Publisher instead of calling this
       ///        function directly.
-      /// \param _topic Name of the topic
-      /// \param _message The message to send.
-      /// \param _cb Callback, used when the publish is completed.
+      /// \param [in] _topic Name of the topic
+      /// \param [in] _message The message to send.
+      /// \param [in] _cb Callback, used when the publish is completed.
+      /// \param [in] _id ID associated with the message.
       public: void Publish(const std::string &_topic, MessagePtr _message,
-                  const boost::function<void()> &_cb = NULL);
+                  boost::function<void(uint32_t)> _cb, uint32_t _id);
 
       /// \brief Connection a local Publisher to a remote Subscriber
       /// \param[in] _topic The topic to use
@@ -211,13 +218,6 @@ namespace gazebo
       /// \param[out] _namespaces The list of namespaces will be written here
       public: void GetTopicNamespaces(std::list<std::string> &_namespaces);
 
-      /// \brief Get a list of all the topics.
-      /// \return A map where keys are message types, and values are a list
-      /// of topic names.
-      /// \sa transport::GetAdvertisedTopics
-      public: std::map<std::string, std::list<std::string> >
-              GetAdvertisedTopics() const GAZEBO_DEPRECATED(1.5);
-
       /// \brief Clear all buffers
       public: void ClearBuffers();
 
@@ -225,6 +225,10 @@ namespace gazebo
       /// \param[in] _pause If true pause processing; otherwse unpause
       public: void PauseIncoming(bool _pause);
 
+      /// \brief Add a node to the list of nodes that requires processing.
+      /// \param[in] _ptr Node to process.
+      public: void AddNodeToProcess(NodePtr _ptr);
+
       /// \brief A map of string->list of Node pointers
       typedef std::map<std::string, std::list<NodePtr> > SubNodeMap;
 
@@ -234,11 +238,17 @@ namespace gazebo
       private: SubNodeMap subscribedNodes;
       private: std::vector<NodePtr> nodes;
 
+      /// \brief Nodes that require processing.
+      private: boost::unordered_set<NodePtr> nodesToProcess;
+
       private: boost::recursive_mutex nodeMutex;
 
       /// \brief Used to protect subscription connection creation.
       private: boost::mutex subscriberMutex;
 
+      /// \brief Mutex to protect node processing
+      private: boost::mutex processNodesMutex;
+
       private: bool pauseIncoming;
 
       // Singleton implementation
diff --git a/gazebo/transport/Transport.cc b/gazebo/transport/Transport.cc
deleted file mode 100644
index 45dce90..0000000
--- a/gazebo/transport/Transport.cc
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <list>
-#include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
-#include <string>
-
-#include "transport/Node.hh"
-#include "transport/Publisher.hh"
-#include "transport/Subscriber.hh"
-#include "transport/ConnectionManager.hh"
-#include "Transport.hh"
-
-using namespace gazebo;
-
-boost::thread *g_runThread = NULL;
-boost::condition_variable g_responseCondition;
-boost::mutex requestMutex;
-bool g_stopped = true;
-
-std::list<msgs::Request *> g_requests;
-std::list<boost::shared_ptr<msgs::Response> > g_responses;
-
-#define DEFAULT_MASTER_PORT 11345
-
-/////////////////////////////////////////////////
-bool transport::get_master_uri(std::string &_masterHost,
-                               unsigned int &_masterPort)
-{
-  char *charURI = getenv("GAZEBO_MASTER_URI");
-
-  // Set to default host and port
-  if (!charURI || strlen(charURI) == 0)
-  {
-    _masterHost = "localhost";
-    _masterPort = DEFAULT_MASTER_PORT;
-    return false;
-  }
-
-  std::string masterURI = charURI;
-
-  boost::replace_first(masterURI, "http://", "");
-  size_t lastColon = masterURI.find_last_of(":");
-  _masterHost = masterURI.substr(0, lastColon);
-
-  if (lastColon == std::string::npos)
-  {
-    gzerr << "Port missing in master URI[" << masterURI
-          << "]. Using default value of " << DEFAULT_MASTER_PORT << ".\n";
-    _masterPort = DEFAULT_MASTER_PORT;
-  }
-  else
-  {
-    _masterPort = boost::lexical_cast<unsigned int>(
-        masterURI.substr(lastColon + 1, masterURI.size() - (lastColon + 1)));
-  }
-
-  return true;
-}
-
-/////////////////////////////////////////////////
-bool transport::init(const std::string &_masterHost, unsigned int _masterPort)
-{
-  std::string host = _masterHost;
-  unsigned int port = _masterPort;
-
-  if (host.empty())
-    get_master_uri(host, port);
-
-  transport::TopicManager::Instance()->Init();
-  if (!transport::ConnectionManager::Instance()->Init(host, port))
-    return false;
-
-  return true;
-}
-
-/////////////////////////////////////////////////
-void transport::run()
-{
-  g_stopped = false;
-  g_runThread = new boost::thread(&transport::ConnectionManager::Run,
-                                transport::ConnectionManager::Instance());
-
-  std::list<std::string> namespaces;
-
-  // This chunk of code just waits until we get a list of topic namespaces.
-  unsigned int trys = 0;
-  unsigned int limit = 50;
-  while (namespaces.empty() && trys < limit)
-  {
-    TopicManager::Instance()->GetTopicNamespaces(namespaces);
-
-    if (namespaces.empty())
-    {
-      // 25 seconds max wait time
-      common::Time::MSleep(500);
-    }
-
-    trys++;
-  }
-
-  if (trys >= limit)
-    gzerr << "Unable to get topic namespaces in [" << trys << "] tries.\n";
-}
-
-/////////////////////////////////////////////////
-bool transport::is_stopped()
-{
-  return g_stopped;
-}
-
-/////////////////////////////////////////////////
-void transport::stop()
-{
-  g_stopped = true;
-  transport::ConnectionManager::Instance()->Stop();
-}
-
-/////////////////////////////////////////////////
-void transport::fini()
-{
-  g_stopped = true;
-  transport::TopicManager::Instance()->Fini();
-  transport::ConnectionManager::Instance()->Stop();
-
-  if (g_runThread)
-  {
-    g_runThread->join();
-    delete g_runThread;
-    g_runThread = NULL;
-  }
-  transport::ConnectionManager::Instance()->Fini();
-}
-
-/////////////////////////////////////////////////
-void transport::clear_buffers()
-{
-  transport::TopicManager::Instance()->ClearBuffers();
-}
-
-/////////////////////////////////////////////////
-void transport::pause_incoming(bool _pause)
-{
-  transport::TopicManager::Instance()->PauseIncoming(_pause);
-}
-
-/////////////////////////////////////////////////
-void on_response(ConstResponsePtr &_msg)
-{
-  if (g_requests.empty())
-    return;
-
-  std::list<msgs::Request *>::iterator iter;
-  for (iter = g_requests.begin(); iter != g_requests.end(); ++iter)
-  {
-    if (_msg->id() == (*iter)->id())
-      break;
-  }
-
-  // Stop if the response is not for any of the request messages.
-  if (iter == g_requests.end())
-    return;
-
-  boost::shared_ptr<msgs::Response> response(new msgs::Response);
-  response->CopyFrom(*_msg);
-  g_responses.push_back(response);
-
-  g_responseCondition.notify_all();
-}
-
-/////////////////////////////////////////////////
-void transport::get_topic_namespaces(std::list<std::string> &_namespaces)
-{
-  TopicManager::Instance()->GetTopicNamespaces(_namespaces);
-}
-
-/////////////////////////////////////////////////
-boost::shared_ptr<msgs::Response> transport::request(
-    const std::string &_worldName, const std::string &_request,
-    const std::string &_data)
-{
-  boost::mutex::scoped_lock lock(requestMutex);
-
-  msgs::Request *request = msgs::CreateRequest(_request, _data);
-
-  g_requests.push_back(request);
-
-  NodePtr node = NodePtr(new Node());
-  node->Init(_worldName);
-
-  PublisherPtr requestPub = node->Advertise<msgs::Request>("~/request");
-  SubscriberPtr responseSub = node->Subscribe("~/response", &on_response);
-
-  requestPub->Publish(*request);
-
-  boost::shared_ptr<msgs::Response> response;
-  std::list<boost::shared_ptr<msgs::Response> >::iterator iter;
-
-  bool valid = false;
-  while (!valid)
-  {
-    // Wait for a response
-    g_responseCondition.wait(lock);
-
-    for (iter = g_responses.begin(); iter != g_responses.end(); ++iter)
-    {
-      if ((*iter)->id() == request->id())
-      {
-        response = *iter;
-        g_responses.erase(iter);
-        valid = true;
-        break;
-      }
-    }
-  }
-
-  requestPub.reset();
-  responseSub.reset();
-  node.reset();
-
-  delete request;
-  return response;
-}
-
-/////////////////////////////////////////////////
-void transport::requestNoReply(const std::string &_worldName,
-                               const std::string &_request,
-                               const std::string &_data)
-{
-  // Create a node for communication.
-  NodePtr node = NodePtr(new Node());
-
-  // Initialize the node, use the world name for the topic namespace.
-  node->Init(_worldName);
-
-  // Process the request.
-  requestNoReply(node, _request, _data);
-
-  // Cleanup the node.
-  node.reset();
-}
-
-/////////////////////////////////////////////////
-void transport::requestNoReply(NodePtr _node, const std::string &_request,
-                               const std::string &_data)
-{
-  // Create a publisher on the request topic.
-  PublisherPtr requestPub = _node->Advertise<msgs::Request>("~/request");
-
-  // Create a new request message
-  msgs::Request *request = msgs::CreateRequest(_request, _data);
-
-  // Publish the request message
-  requestPub->Publish(*request);
-
-  // Cleanup the request
-  delete request;
-
-  // Clean up the publisher.
-  requestPub.reset();
-}
-
-/////////////////////////////////////////////////
-std::map<std::string, std::list<std::string> > transport::getAdvertisedTopics()
-{
-  std::map<std::string, std::list<std::string> > result;
-  std::list<msgs::Publish> publishers;
-
-  ConnectionManager::Instance()->GetAllPublishers(publishers);
-
-  for (std::list<msgs::Publish>::iterator iter = publishers.begin();
-      iter != publishers.end(); ++iter)
-  {
-    result[(*iter).msg_type()].push_back((*iter).topic());
-  }
-
-  return result;
-}
-
-/////////////////////////////////////////////////
-std::list<std::string> transport::getAdvertisedTopics(
-    const std::string &_msgType)
-{
-  std::list<std::string> result;
-  std::list<msgs::Publish> publishers;
-
-  ConnectionManager::Instance()->GetAllPublishers(publishers);
-
-  for (std::list<msgs::Publish>::iterator iter = publishers.begin();
-      iter != publishers.end(); ++iter)
-  {
-    if (std::find(result.begin(), result.end(), (*iter).topic()) !=
-        result.end())
-      continue;
-
-    if (_msgType.empty() || _msgType == (*iter).msg_type())
-      result.push_back((*iter).topic());
-  }
-
-  return result;
-}
-
-/////////////////////////////////////////////////
-std::string transport::getTopicMsgType(const std::string &_topicName)
-{
-  std::string result;
-  std::list<msgs::Publish> publishers;
-
-  ConnectionManager::Instance()->GetAllPublishers(publishers);
-
-  for (std::list<msgs::Publish>::iterator iter = publishers.begin();
-      iter != publishers.end() && result.empty(); ++iter)
-  {
-    if (_topicName == (*iter).topic())
-      result = (*iter).msg_type();
-  }
-
-  return result;
-}
diff --git a/gazebo/transport/Transport.hh b/gazebo/transport/Transport.hh
deleted file mode 100644
index 243d402..0000000
--- a/gazebo/transport/Transport.hh
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef _GAZEBO_TRANSPORT_HH_
-#define _GAZEBO_TRANSPORT_HH_
-
-#include <boost/bind.hpp>
-#include <string>
-#include <list>
-#include <map>
-
-#include "transport/TransportTypes.hh"
-#include "transport/SubscribeOptions.hh"
-#include "transport/TopicManager.hh"
-
-namespace gazebo
-{
-  namespace transport
-  {
-    /// \brief Handles transportation of messages
-    /// \addtogroup gazebo_transport
-    /// \{
-
-    /// \brief Get the hostname and port of the master from the
-    /// GAZEBO_MASTER_URI environment variable
-    /// \param[out] _master_host The hostname of the master is set to this param
-    /// \param[out] _master_port The port of the master is set to this param
-    /// \return true if GAZEBO_MASTER_URI was successfully parsed; false
-    /// otherwise (in which case output params are not set)
-    bool get_master_uri(std::string &_master_host, unsigned int &_master_port);
-
-    /// \brief Initialize the transport system
-    /// \param[in] _master_host The hostname or IP of the master. Leave empty to
-    ///                    use pull address from the GAZEBO_MASTER_URI env var.
-    /// \param[in] _master_port The port  of the master. Leave empty to
-    ///                    use pull address from the GAZEBO_MASTER_URI env var.
-    /// \return true if initialization succeeded; false otherwise
-    bool init(const std::string &_master_host ="",
-              unsigned int _master_port = 0);
-
-    /// \brief Run the transport component. Creates a thread to handle
-    /// message passing. This call will block until the master can
-    /// be contacted or until a retry limit is reached
-    void run();
-
-    /// \brief Return all the namespace (world names) on the master
-    /// \param[out] _namespaces The list of namespace will be written here
-    void get_topic_namespaces(std::list<std::string> &_namespaces);
-
-    /// \brief Is the transport system stopped?
-    /// \return true if the transport system is stopped; false otherwise
-    bool is_stopped();
-
-    /// \brief Stop the transport component from running.
-    void stop();
-
-    /// \brief Cleanup the transport component
-    void fini();
-
-    /// \brief Clear any remaining communication buffers
-    void clear_buffers();
-
-    /// \brief Pause or unpause incoming messages. When paused, messages
-    /// are queued for later delivery
-    /// \param[in] _pause If true, pause; otherwise unpause
-    void pause_incoming(bool _pause);
-
-    /// \brief Send a request and receive a response.  This call will block
-    /// until a response is received.
-    /// \param[in] _worldName The name of the world to which the request
-    /// should be sent
-    /// \param[in] _request The type request.
-    /// \param[in] _data Optional data string.
-    /// \return The response to the request.  Can be empty.
-    boost::shared_ptr<msgs::Response> request(const std::string &_worldName,
-                                              const std::string &_request,
-                                              const std::string &_data = "");
-
-    /// \brief Send a request and don't wait for a response. This is
-    /// non-blocking.
-    /// \param[in] _worldName The name of the world to which the request
-    /// should be sent.
-    /// \param[in] _request The type request.
-    /// \param[in] _data Optional data string.
-    void requestNoReply(const std::string &_worldName,
-                        const std::string &_request,
-                        const std::string &_data = "");
-
-    /// \brief Send a request and don't wait for a response. This is
-    /// non-blocking.
-    /// \param[in] _node Pointer to a node that provides communication.
-    /// \param[in] _request The type request.
-    /// \param[in] _data Optional data string.
-    void requestNoReply(NodePtr _node, const std::string &_request,
-                        const std::string &_data = "");
-
-    /// \brief Get a list of all the topics and their message types.
-    /// \return A map where keys are message types, and values are a list
-    /// of topic names.
-    std::map<std::string, std::list<std::string> > getAdvertisedTopics();
-
-    /// \brief Get a list of all the unique advertised topic names.
-    /// \param[in] _msgType Type of message to filter the result on. If
-    /// empty, then a list of all the topics is returned.
-    /// \return A list of the advertised topics that publish messages
-    /// of the type specified by _msgType.
-    std::list<std::string> getAdvertisedTopics(const std::string &_msgType);
-
-    /// \brief Get the message typename that is published on the given topic.
-    /// \param[in] _topicName Name of the topic to query.
-    /// \return The message type, or empty string if the topic is not valid.
-    std::string getTopicMsgType(const std::string &_topicName);
-
-    /// \}
-  }
-}
-#endif
diff --git a/gazebo/transport/TransportIface.cc b/gazebo/transport/TransportIface.cc
new file mode 100644
index 0000000..1ad341b
--- /dev/null
+++ b/gazebo/transport/TransportIface.cc
@@ -0,0 +1,426 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <list>
+#include <boost/algorithm/string.hpp>
+#include <boost/lexical_cast.hpp>
+#include <string>
+
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/Publisher.hh"
+#include "gazebo/transport/Subscriber.hh"
+#include "gazebo/transport/ConnectionManager.hh"
+#include "gazebo/transport/TransportIface.hh"
+
+using namespace gazebo;
+
+boost::thread *g_runThread = NULL;
+boost::condition_variable g_responseCondition;
+boost::mutex requestMutex;
+bool g_stopped = true;
+bool g_minimalComms = false;
+
+std::list<msgs::Request *> g_requests;
+std::list<boost::shared_ptr<msgs::Response> > g_responses;
+
+/////////////////////////////////////////////////
+void dummy_callback_fn(uint32_t)
+{
+}
+
+/////////////////////////////////////////////////
+bool transport::get_master_uri(std::string &_masterHost,
+                               unsigned int &_masterPort)
+{
+  char *charURI = getenv("GAZEBO_MASTER_URI");
+
+  // Set to default host and port
+  if (!charURI || strlen(charURI) == 0)
+  {
+    _masterHost = GAZEBO_DEFAULT_MASTER_HOST;
+    _masterPort = GAZEBO_DEFAULT_MASTER_PORT;
+    return false;
+  }
+
+  std::string masterURI = charURI;
+
+  boost::replace_first(masterURI, "http://", "");
+  size_t lastColon = masterURI.find_last_of(":");
+  _masterHost = masterURI.substr(0, lastColon);
+
+  if (lastColon == std::string::npos)
+  {
+    gzerr << "Port missing in master URI[" << masterURI
+          << "]. Using default value of " << GAZEBO_DEFAULT_MASTER_PORT
+          << ".\n";
+    _masterPort = GAZEBO_DEFAULT_MASTER_PORT;
+  }
+  else
+  {
+    try
+    {
+      _masterPort = boost::lexical_cast<unsigned int>(
+          masterURI.substr(lastColon + 1, masterURI.size() - (lastColon + 1)));
+    }
+    catch(...)
+    {
+      gzerr << "Unable to port from GAZEBO_MASTER_URI[" << masterURI << "]."
+        << "Using the default port number of 11345.\n";
+    }
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool transport::init(const std::string &_masterHost, unsigned int _masterPort,
+    uint32_t _timeoutIterations)
+{
+  std::string host = _masterHost;
+  unsigned int port = _masterPort;
+
+  if (host.empty())
+    get_master_uri(host, port);
+
+  transport::TopicManager::Instance()->Init();
+
+  if (!transport::ConnectionManager::Instance()->Init(host, port,
+        _timeoutIterations))
+    return false;
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+void transport::run()
+{
+  g_stopped = false;
+  g_runThread = new boost::thread(&transport::ConnectionManager::Run,
+                                transport::ConnectionManager::Instance());
+}
+
+/////////////////////////////////////////////////
+bool transport::is_stopped()
+{
+  return g_stopped;
+}
+
+/////////////////////////////////////////////////
+void transport::stop()
+{
+  g_stopped = true;
+  g_responseCondition.notify_all();
+  transport::ConnectionManager::Instance()->Stop();
+}
+
+/////////////////////////////////////////////////
+void transport::fini()
+{
+  transport::TopicManager::Instance()->Fini();
+
+  transport::stop();
+  if (g_runThread)
+  {
+    g_runThread->join();
+    delete g_runThread;
+    g_runThread = NULL;
+  }
+  transport::ConnectionManager::Instance()->Fini();
+}
+
+/////////////////////////////////////////////////
+void transport::clear_buffers()
+{
+  transport::TopicManager::Instance()->ClearBuffers();
+}
+
+/////////////////////////////////////////////////
+void transport::pause_incoming(bool _pause)
+{
+  transport::TopicManager::Instance()->PauseIncoming(_pause);
+}
+
+/////////////////////////////////////////////////
+void on_response(ConstResponsePtr &_msg)
+{
+  if (g_requests.empty())
+    return;
+
+  std::list<msgs::Request *>::iterator iter;
+  for (iter = g_requests.begin(); iter != g_requests.end(); ++iter)
+  {
+    if (_msg->id() == (*iter)->id())
+      break;
+  }
+
+  // Stop if the response is not for any of the request messages.
+  if (iter == g_requests.end())
+    return;
+
+  boost::shared_ptr<msgs::Response> response(new msgs::Response);
+  response->CopyFrom(*_msg);
+  g_responses.push_back(response);
+
+  g_responseCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+void transport::get_topic_namespaces(std::list<std::string> &_namespaces)
+{
+  TopicManager::Instance()->GetTopicNamespaces(_namespaces);
+}
+
+/////////////////////////////////////////////////
+boost::shared_ptr<msgs::Response> transport::request(
+    const std::string &_worldName, const std::string &_request,
+    const std::string &_data)
+{
+  boost::mutex::scoped_lock lock(requestMutex);
+
+  msgs::Request *request = msgs::CreateRequest(_request, _data);
+
+  g_requests.push_back(request);
+
+  NodePtr node = NodePtr(new Node());
+  node->Init(_worldName);
+
+  PublisherPtr requestPub = node->Advertise<msgs::Request>("~/request");
+  requestPub->WaitForConnection();
+
+  SubscriberPtr responseSub = node->Subscribe("~/response", &on_response);
+
+  requestPub->Publish(*request, true);
+
+  boost::shared_ptr<msgs::Response> response;
+  std::list<boost::shared_ptr<msgs::Response> >::iterator iter;
+
+  bool valid = false;
+  while (!valid)
+  {
+    // Wait for a response
+    g_responseCondition.wait(lock);
+
+    for (iter = g_responses.begin(); iter != g_responses.end(); ++iter)
+    {
+      if ((*iter)->id() == request->id())
+      {
+        response = *iter;
+        g_responses.erase(iter);
+        valid = true;
+        break;
+      }
+    }
+  }
+
+  requestPub.reset();
+  responseSub.reset();
+  node.reset();
+
+  delete request;
+  return response;
+}
+
+/////////////////////////////////////////////////
+void transport::requestNoReply(const std::string &_worldName,
+                               const std::string &_request,
+                               const std::string &_data)
+{
+  // Create a node for communication.
+  NodePtr node = NodePtr(new Node());
+
+  // Initialize the node, use the world name for the topic namespace.
+  node->Init(_worldName);
+
+  // Process the request.
+  requestNoReply(node, _request, _data);
+
+  // Cleanup the node.
+  node.reset();
+}
+
+/////////////////////////////////////////////////
+void transport::requestNoReply(NodePtr _node, const std::string &_request,
+                               const std::string &_data)
+{
+  // Create a publisher on the request topic.
+  PublisherPtr requestPub = _node->Advertise<msgs::Request>("~/request");
+
+  // Create a new request message
+  msgs::Request *request = msgs::CreateRequest(_request, _data);
+
+  // Publish the request message
+  requestPub->Publish(*request);
+
+  // Cleanup the request
+  delete request;
+
+  // Clean up the publisher.
+  requestPub.reset();
+}
+
+/////////////////////////////////////////////////
+std::map<std::string, std::list<std::string> > transport::getAdvertisedTopics()
+{
+  std::map<std::string, std::list<std::string> > result;
+  std::list<msgs::Publish> publishers;
+
+  ConnectionManager::Instance()->GetAllPublishers(publishers);
+
+  for (std::list<msgs::Publish>::iterator iter = publishers.begin();
+      iter != publishers.end(); ++iter)
+  {
+    result[(*iter).msg_type()].push_back((*iter).topic());
+  }
+
+  return result;
+}
+
+/////////////////////////////////////////////////
+std::list<std::string> transport::getAdvertisedTopics(
+    const std::string &_msgType)
+{
+  std::list<std::string> result;
+  std::list<msgs::Publish> publishers;
+
+  ConnectionManager::Instance()->GetAllPublishers(publishers);
+
+  for (std::list<msgs::Publish>::iterator iter = publishers.begin();
+      iter != publishers.end(); ++iter)
+  {
+    if (std::find(result.begin(), result.end(), (*iter).topic()) !=
+        result.end())
+      continue;
+
+    if (_msgType.empty() || _msgType == (*iter).msg_type())
+      result.push_back((*iter).topic());
+  }
+
+  return result;
+}
+
+/////////////////////////////////////////////////
+std::string transport::getTopicMsgType(const std::string &_topicName)
+{
+  std::string result;
+  std::list<msgs::Publish> publishers;
+
+  ConnectionManager::Instance()->GetAllPublishers(publishers);
+
+  for (std::list<msgs::Publish>::iterator iter = publishers.begin();
+      iter != publishers.end() && result.empty(); ++iter)
+  {
+    if (_topicName == (*iter).topic())
+      result = (*iter).msg_type();
+  }
+
+  return result;
+}
+
+/////////////////////////////////////////////////
+void transport::setMinimalComms(bool _enabled)
+{
+  g_minimalComms = _enabled;
+}
+
+/////////////////////////////////////////////////
+bool transport::getMinimalComms()
+{
+  return g_minimalComms;
+}
+
+/////////////////////////////////////////////////
+transport::ConnectionPtr transport::connectToMaster()
+{
+  std::string data, namespacesData, publishersData;
+  msgs::Packet packet;
+
+  std::string host;
+  unsigned int port;
+  transport::get_master_uri(host, port);
+
+  // Connect to the master
+  transport::ConnectionPtr connection(new transport::Connection());
+
+  if (connection->Connect(host, port))
+  {
+    try
+    {
+      // Read the verification message
+      connection->Read(data);
+      connection->Read(namespacesData);
+      connection->Read(publishersData);
+    }
+    catch(...)
+    {
+      gzerr << "Unable to read from master\n";
+      return transport::ConnectionPtr();
+    }
+
+    packet.ParseFromString(data);
+    if (packet.type() == "version_init")
+    {
+      msgs::GzString msg;
+      msg.ParseFromString(packet.serialized_data());
+      if (msg.data() != std::string("gazebo ") + GAZEBO_VERSION)
+        std::cerr << "Conflicting gazebo versions\n";
+    }
+    else
+    {
+      gzerr  << "Failed to received version_init packet from master. "
+        << "Connection to master failed\n";
+      connection.reset();
+    }
+  }
+  else
+  {
+    gzerr << "Unable to connect to master.\n";
+    connection.reset();
+  }
+
+  if (connection && !connection->IsOpen())
+  {
+    gzerr << "Connection to master instatiated, but socket is not open."
+      << "Connection to master failed\n";
+    connection.reset();
+  }
+
+  return connection;
+}
+
+/////////////////////////////////////////////////
+bool transport::waitForNamespaces(const gazebo::common::Time &_maxWait)
+{
+  std::list<std::string> namespaces;
+  gazebo::common::Time startTime = gazebo::common::Time::GetWallTime();
+
+  gazebo::common::Time waitTime = std::min(
+      gazebo::common::Time(0, 100000000), _maxWait / 10);
+
+  gazebo::transport::TopicManager::Instance()->GetTopicNamespaces(
+      namespaces);
+
+  while (namespaces.empty() &&
+      gazebo::common::Time::GetWallTime() - startTime < _maxWait)
+  {
+    gazebo::transport::TopicManager::Instance()->GetTopicNamespaces(
+        namespaces);
+    gazebo::common::Time::Sleep(waitTime);
+  }
+
+  if (gazebo::common::Time::GetWallTime() - startTime <= _maxWait)
+    return true;
+  return false;
+}
diff --git a/gazebo/transport/TransportIface.hh b/gazebo/transport/TransportIface.hh
new file mode 100644
index 0000000..8057fef
--- /dev/null
+++ b/gazebo/transport/TransportIface.hh
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_TRANSPORTIFACE_HH_
+#define _GAZEBO_TRANSPORTIFACE_HH_
+
+#include <boost/bind.hpp>
+#include <string>
+#include <list>
+#include <map>
+
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/transport/SubscribeOptions.hh"
+#include "gazebo/transport/Node.hh"
+#include "gazebo/transport/TopicManager.hh"
+
+namespace gazebo
+{
+  namespace transport
+  {
+    /// \brief Handles transportation of messages
+    /// \addtogroup gazebo_transport
+    /// \{
+
+    /// \brief Get the hostname and port of the master from the
+    /// GAZEBO_MASTER_URI environment variable
+    /// \param[out] _master_host The hostname of the master is set to this param
+    /// \param[out] _master_port The port of the master is set to this param
+    /// \return true if GAZEBO_MASTER_URI was successfully parsed; false
+    /// otherwise (in which case output params are not set)
+    GAZEBO_VISIBLE
+    bool get_master_uri(std::string &_master_host, unsigned int &_master_port);
+
+    /// \brief Initialize the transport system
+    /// \param[in] _masterHost The hostname or IP of the master. Leave empty to
+    /// use pull address from the GAZEBO_MASTER_URI env var.
+    /// \param[in] _masterPort The port  of the master. Leave empty to
+    /// use pull address from the GAZEBO_MASTER_URI env var.
+    /// \param[in] _timeoutIterations Number of times to wait for
+    /// a connection to master.
+    /// \return true if initialization succeeded; false otherwise
+    GAZEBO_VISIBLE
+    bool init(const std::string &_masterHost = "",
+              unsigned int _masterPort = 0,
+              uint32_t _timeoutIterations = 30);
+
+    /// \brief Run the transport component. Creates a thread to handle
+    /// message passing. This call will block until the master can
+    /// be contacted or until a retry limit is reached
+    GAZEBO_VISIBLE
+    void run();
+
+    /// \brief Return all the namespace (world names) on the master
+    /// \param[out] _namespaces The list of namespace will be written here
+    GAZEBO_VISIBLE
+    void get_topic_namespaces(std::list<std::string> &_namespaces);
+
+    /// \brief Is the transport system stopped?
+    /// \return true if the transport system is stopped; false otherwise
+    GAZEBO_VISIBLE
+    bool is_stopped();
+
+    /// \brief Stop the transport component from running.
+    GAZEBO_VISIBLE
+    void stop();
+
+    /// \brief Cleanup the transport component
+    GAZEBO_VISIBLE
+    void fini();
+
+    /// \brief Clear any remaining communication buffers
+    GAZEBO_VISIBLE
+    void clear_buffers();
+
+    /// \brief Pause or unpause incoming messages. When paused, messages
+    /// are queued for later delivery
+    /// \param[in] _pause If true, pause; otherwise unpause
+    GAZEBO_VISIBLE
+    void pause_incoming(bool _pause);
+
+    /// \brief Send a request and receive a response.  This call will block
+    /// until a response is received.
+    /// \param[in] _worldName The name of the world to which the request
+    /// should be sent
+    /// \param[in] _request The type request.
+    /// \param[in] _data Optional data string.
+    /// \return The response to the request.  Can be empty.
+    GAZEBO_VISIBLE
+    boost::shared_ptr<msgs::Response> request(const std::string &_worldName,
+                                              const std::string &_request,
+                                              const std::string &_data = "");
+
+    /// \brief Send a request and don't wait for a response. This is
+    /// non-blocking.
+    /// \param[in] _worldName The name of the world to which the request
+    /// should be sent.
+    /// \param[in] _request The type request.
+    /// \param[in] _data Optional data string.
+    GAZEBO_VISIBLE
+    void requestNoReply(const std::string &_worldName,
+                        const std::string &_request,
+                        const std::string &_data = "");
+
+    /// \brief Send a request and don't wait for a response. This is
+    /// non-blocking.
+    /// \param[in] _node Pointer to a node that provides communication.
+    /// \param[in] _request The type request.
+    /// \param[in] _data Optional data string.
+    GAZEBO_VISIBLE
+    void requestNoReply(NodePtr _node, const std::string &_request,
+                        const std::string &_data = "");
+
+    /// \brief A convenience function for a one-time publication of
+    /// a message. This is inefficient, compared to
+    /// Node::Advertise followed by Publisher::Publish. This function
+    /// should only be used when sending a message very infrequently.
+    /// \param[in] _topic The topic to advertise
+    /// \param[in] _message Message to be published
+    template<typename M>
+    GAZEBO_VISIBLE
+    void publish(const std::string &_topic,
+                 const google::protobuf::Message &_message)
+    {
+      transport::NodePtr node = transport::NodePtr(new transport::Node());
+      node->Init();
+      node->Publish<M>(_topic, _message);
+    }
+
+    /// \brief Get a list of all the topics and their message types.
+    /// \return A map where keys are message types, and values are a list
+    /// of topic names.
+    GAZEBO_VISIBLE
+    std::map<std::string, std::list<std::string> > getAdvertisedTopics();
+
+    /// \brief Get a list of all the unique advertised topic names.
+    /// \param[in] _msgType Type of message to filter the result on. If
+    /// empty, then a list of all the topics is returned.
+    /// \return A list of the advertised topics that publish messages
+    /// of the type specified by _msgType.
+    GAZEBO_VISIBLE
+    std::list<std::string> getAdvertisedTopics(const std::string &_msgType);
+
+    /// \brief Get the message typename that is published on the given topic.
+    /// \param[in] _topicName Name of the topic to query.
+    /// \return The message type, or empty string if the topic is not valid.
+    GAZEBO_VISIBLE
+    std::string getTopicMsgType(const std::string &_topicName);
+
+    /// \brief Set whether minimal comms should be used. This will be used
+    /// to reduce network traffic.
+    GAZEBO_VISIBLE
+    void setMinimalComms(bool _enabled);
+
+    /// \brief Get whether minimal comms has been enabled.
+    /// \return True if minimal comms is enabled.
+    GAZEBO_VISIBLE
+    bool getMinimalComms();
+
+    /// \brief Create a connection to master.
+    /// \return Connection to the master, NULL on error.
+    GAZEBO_VISIBLE
+    transport::ConnectionPtr connectToMaster();
+
+    /// \brief Blocks while waiting for topic namespaces from the Master.
+    /// This function will wait a maximum of _maxWait.
+    /// \return True if namespaces were found before _maxWait time.
+    GAZEBO_VISIBLE
+    bool waitForNamespaces(const gazebo::common::Time &_maxWait);
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/transport/TransportTypes.hh b/gazebo/transport/TransportTypes.hh
index e6f17bb..1e7cc19 100644
--- a/gazebo/transport/TransportTypes.hh
+++ b/gazebo/transport/TransportTypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 
 #include <boost/shared_ptr.hpp>
 #include <google/protobuf/message.h>
+#include "gazebo/util/system.hh"
 
 /// \file
 /// \ingroup gazebo_transport
diff --git a/gazebo/util/CMakeLists.txt b/gazebo/util/CMakeLists.txt
index ad904f3..e2f017f 100644
--- a/gazebo/util/CMakeLists.txt
+++ b/gazebo/util/CMakeLists.txt
@@ -1,23 +1,37 @@
 include (${gazebo_cmake_dir}/GazeboUtils.cmake)
 
+if (HAVE_OPENAL)
+  include_directories(${OPENAL_INCLUDE_DIR})
+endif()
+
 set (sources 
   Diagnostics.cc
+  LogPlay.cc
+  LogRecord.cc
+  OpenAL.cc
 )
 
 set (headers 
   Diagnostics.hh
+  LogPlay.hh
+  LogRecord.hh
+  OpenAL.hh
   UtilTypes.hh
- )
+  system.hh
+)
 
 set (gtest_sources
   Diagnostics_TEST.cc
+  LogRecord_TEST.cc
+  OpenAL_TEST.cc
 )
+
 gz_build_tests(${gtest_sources})
 
 set (util_headers "" CACHE INTERNAL "util headers" FORCE)
 foreach (hdr ${headers})
-  APPEND_TO_CACHED_STRING(common_headers
-    "Utility Headers" "#include \"util/${hdr}\"\n")
+  APPEND_TO_CACHED_STRING(util_headers
+    "Utility Headers" "#include \"gazebo/util/${hdr}\"\n")
 endforeach()
 
 configure_file (${CMAKE_CURRENT_SOURCE_DIR}/util.hh.in
diff --git a/gazebo/util/Diagnostics.cc b/gazebo/util/Diagnostics.cc
index 212d414..be8fbc6 100644
--- a/gazebo/util/Diagnostics.cc
+++ b/gazebo/util/Diagnostics.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,10 @@
  * Date: 2 Feb 2011
  */
 
-#include "gazebo/transport/transport.hh"
 #include "gazebo/common/Assert.hh"
 #include "gazebo/common/Events.hh"
-
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/transport/transport.hh"
 #include "gazebo/util/Diagnostics.hh"
 
 using namespace gazebo;
@@ -34,9 +34,10 @@ DiagnosticManager::DiagnosticManager()
   // Get the base of the time logging path
   if (!getenv("HOME"))
   {
-    gzwarn << "HOME environment variable missing. Diagnostic timing "
-      << "information will be logged to /tmp/gazebo.\n";
-    this->logPath = "/tmp/gazebo";
+    common::SystemPaths *paths = common::SystemPaths::Instance();
+    gzwarn << "HOME environment variable missing. Diagnostic timing " <<
+      "information will be logged to " << paths->GetTmpPath() << "\n";
+    this->logPath = paths->GetTmpPath() + "/gazebo";
   }
   else
   {
@@ -88,7 +89,7 @@ void DiagnosticManager::Update(const common::UpdateInfo &_info)
   msgs::Set(this->msg.mutable_real_time(), _info.realTime);
   msgs::Set(this->msg.mutable_sim_time(), _info.simTime);
 
-  if (this->pub)
+  if (this->pub && this->pub->HasConnections())
     this->pub->Publish(this->msg);
 
   this->msg.clear_time();
diff --git a/gazebo/util/Diagnostics.hh b/gazebo/util/Diagnostics.hh
index ae54f71..a6d1e2d 100644
--- a/gazebo/util/Diagnostics.hh
+++ b/gazebo/util/Diagnostics.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -37,6 +37,7 @@
 #include "gazebo/common/Timer.hh"
 
 #include "gazebo/util/UtilTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
@@ -72,7 +73,8 @@ namespace gazebo
 
     /// \class DiagnosticManager Diagnostics.hh util/util.hh
     /// \brief A diagnostic manager class
-    class DiagnosticManager : public SingletonT<DiagnosticManager>
+    class GAZEBO_VISIBLE DiagnosticManager :
+      public SingletonT<DiagnosticManager>
     {
       /// \brief Constructor
       private: DiagnosticManager();
@@ -166,7 +168,7 @@ namespace gazebo
 
     /// \class DiagnosticTimer Diagnostics.hh util/util.hh
     /// \brief A timer designed for diagnostics
-    class DiagnosticTimer : public common::Timer
+    class GAZEBO_VISIBLE DiagnosticTimer : public common::Timer
     {
       /// \brief Constructor
       /// \param[in] _name Name of the timer
diff --git a/gazebo/util/Diagnostics_TEST.cc b/gazebo/util/Diagnostics_TEST.cc
index 2ebcaa6..01a3484 100644
--- a/gazebo/util/Diagnostics_TEST.cc
+++ b/gazebo/util/Diagnostics_TEST.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,10 +19,13 @@
 
 #include "gazebo/common/Time.hh"
 #include "gazebo/util/Diagnostics.hh"
+#include "test/util.hh"
 
 using namespace gazebo;
 
-TEST(DiagnosticsTest, Diagnostics)
+class DiagnosticsTest : public gazebo::testing::AutoLogFixture { };
+
+TEST_F(DiagnosticsTest, Diagnostics)
 {
 #ifdef ENABLE_DIAGNOSTICS
   util::DiagnosticManager *mgr = util::DiagnosticManager::Instance();
diff --git a/gazebo/util/LogPlay.cc b/gazebo/util/LogPlay.cc
new file mode 100644
index 0000000..bf91a39
--- /dev/null
+++ b/gazebo/util/LogPlay.cc
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/filesystem.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/iostreams/filter/bzip2.hpp>
+#include <boost/iostreams/filter/zlib.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/copy.hpp>
+#include <boost/archive/iterators/base64_from_binary.hpp>
+#include <boost/archive/iterators/binary_from_base64.hpp>
+#include <boost/archive/iterators/remove_whitespace.hpp>
+#include <boost/archive/iterators/istream_iterator.hpp>
+#include <boost/archive/iterators/transform_width.hpp>
+
+#include "gazebo/math/Rand.hh"
+
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Base64.hh"
+#include "gazebo/util/LogRecord.hh"
+#include "gazebo/util/LogPlay.hh"
+
+using namespace gazebo;
+using namespace util;
+
+/////////////////////////////////////////////////
+LogPlay::LogPlay()
+{
+  this->logStartXml = NULL;
+}
+
+/////////////////////////////////////////////////
+LogPlay::~LogPlay()
+{
+}
+
+/////////////////////////////////////////////////
+void LogPlay::Open(const std::string &_logFile)
+{
+  boost::filesystem::path path(_logFile);
+  if (!boost::filesystem::exists(path))
+    gzthrow("Invalid logfile[" + _logFile + "]. Does not exist.");
+
+  // Parse the log file
+  if (!this->xmlDoc.LoadFile(_logFile))
+    gzthrow("Unable to parse log file[" << _logFile << "]");
+
+  // Get the gazebo_log element
+  this->logStartXml = this->xmlDoc.FirstChildElement("gazebo_log");
+
+  if (!this->logStartXml)
+    gzthrow("Log file is missing the <gazebo_log> element");
+
+  // Store the filename for future use.
+  this->filename = _logFile;
+
+  // Read in the header.
+  this->ReadHeader();
+
+  this->logCurrXml = this->logStartXml;
+  this->encoding.clear();
+}
+
+/////////////////////////////////////////////////
+std::string LogPlay::GetHeader() const
+{
+  std::ostringstream stream;
+  stream << "<?xml version='1.0'?>\n"
+         << "<gazebo_log>\n"
+         << "<header>\n"
+         << "<log_version>" << this->logVersion << "</log_version>\n"
+         << "<gazebo_version>" << this->gazeboVersion << "</gazebo_version>\n"
+         << "<rand_seed>" << this->randSeed << "</rand_seed>\n"
+         << "</header>\n";
+
+  return stream.str();
+}
+
+/////////////////////////////////////////////////
+void LogPlay::ReadHeader()
+{
+  this->randSeed = math::Rand::GetSeed();
+  TiXmlElement *headerXml, *childXml;
+
+  this->logVersion.clear();
+  this->gazeboVersion.clear();
+
+  // Get the header element
+  headerXml = this->logStartXml->FirstChildElement("header");
+  if (!headerXml)
+    gzthrow("Log file has no header");
+
+  // Get the log format version
+  childXml = headerXml->FirstChildElement("log_version");
+  if (!childXml)
+    gzerr << "Log file header is missing the log version.\n";
+  else
+    this->logVersion = childXml->GetText();
+
+  // Get the gazebo version
+  childXml = headerXml->FirstChildElement("gazebo_version");
+  if (!childXml)
+    gzerr << "Log file header is missing the gazebo version.\n";
+  else
+    this->gazeboVersion = childXml->GetText();
+
+  // Get the random number seed.
+  childXml = headerXml->FirstChildElement("rand_seed");
+  if (!childXml)
+    gzerr << "Log file header is missing the random number seed.\n";
+  else
+    this->randSeed = boost::lexical_cast<uint32_t>(childXml->GetText());
+
+  if (this->logVersion != GZ_LOG_VERSION)
+    gzwarn << "Log version[" << this->logVersion << "] in file["
+           << this->filename
+           << "] does not match Gazebo's log version["
+           << GZ_LOG_VERSION << "]\n";
+
+  /// Set the random number seed for simulation
+  math::Rand::SetSeed(this->randSeed);
+}
+
+/////////////////////////////////////////////////
+bool LogPlay::IsOpen() const
+{
+  return this->logStartXml != NULL;
+}
+
+/////////////////////////////////////////////////
+std::string LogPlay::GetLogVersion() const
+{
+  return this->logVersion;
+}
+
+/////////////////////////////////////////////////
+std::string LogPlay::GetGazeboVersion() const
+{
+  return this->gazeboVersion;
+}
+
+/////////////////////////////////////////////////
+uint32_t LogPlay::GetRandSeed() const
+{
+  return this->randSeed;
+}
+
+/////////////////////////////////////////////////
+bool LogPlay::Step(std::string &_data)
+{
+  std::string startMarker = "<sdf ";
+  std::string endMarker = "</sdf>";
+  size_t start = this->currentChunk.find(startMarker);
+  size_t end = this->currentChunk.find(endMarker);
+
+  if (start == std::string::npos || end == std::string::npos)
+  {
+    this->currentChunk.clear();
+
+    if (this->logCurrXml == this->logStartXml)
+      this->logCurrXml = this->logStartXml->FirstChildElement("chunk");
+    else if (this->logCurrXml)
+    {
+      this->logCurrXml = this->logCurrXml->NextSiblingElement("chunk");
+    }
+    else
+      return false;
+
+    // Stop if there are no more chunks
+    if (!this->logCurrXml)
+      return false;
+
+    if (!this->GetChunkData(this->logCurrXml, this->currentChunk))
+    {
+      gzerr << "Unable to decode log file\n";
+      return false;
+    }
+
+    start = this->currentChunk.find(startMarker);
+    end = this->currentChunk.find(endMarker);
+  }
+
+  _data = this->currentChunk.substr(start, end+endMarker.size()-start);
+
+  this->currentChunk.erase(0, end + endMarker.size());
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool LogPlay::GetChunk(unsigned int _index, std::string &_data)
+{
+  unsigned int count = 0;
+  TiXmlElement *xml = this->logStartXml->FirstChildElement("chunk");
+
+  while (xml && count < _index)
+  {
+    count++;
+    xml = xml->NextSiblingElement("chunk");
+  }
+
+  if (xml && count == _index)
+    return this->GetChunkData(xml, _data);
+  else
+    return false;
+}
+
+/////////////////////////////////////////////////
+bool LogPlay::GetChunkData(TiXmlElement *_xml, std::string &_data)
+{
+  // Make sure we have valid xml pointer
+  if (!_xml)
+    return false;
+
+  /// Get the chunk's encoding
+  this->encoding = _xml->Attribute("encoding");
+
+  // Make sure there is an encoding value.
+  if (this->encoding.empty())
+    gzthrow("Enconding missing for a chunk in log file[" +
+        this->filename + "]");
+
+  if (this->encoding == "txt")
+    _data = _xml->GetText();
+  else if (this->encoding == "bz2")
+  {
+    std::string data = _xml->GetText();
+    std::string buffer;
+
+    // Decode the base64 string
+    buffer = Base64Decode(data);
+
+    // Decompress the bz2 data
+    {
+      boost::iostreams::filtering_istream in;
+      in.push(boost::iostreams::bzip2_decompressor());
+      in.push(boost::make_iterator_range(buffer));
+
+      // Get the data
+      std::getline(in, _data, '\0');
+      _data += '\0';
+    }
+  }
+  else if (this->encoding == "zlib")
+  {
+    std::string data = _xml->GetText();
+    std::string buffer;
+
+    // Decode the base64 string
+    buffer = Base64Decode(data);
+
+    // Decompress the zlib data
+    {
+      boost::iostreams::filtering_istream in;
+      in.push(boost::iostreams::zlib_decompressor());
+      in.push(boost::make_iterator_range(buffer));
+
+      // Get the data
+      std::getline(in, _data, '\0');
+      _data += '\0';
+    }
+  }
+  else
+  {
+    gzerr << "Inavlid encoding[" << this->encoding << "] in log file["
+      << this->filename << "]\n";
+    return false;
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+std::string LogPlay::GetEncoding() const
+{
+  return this->encoding;
+}
+
+/////////////////////////////////////////////////
+unsigned int LogPlay::GetChunkCount() const
+{
+  unsigned int count = 0;
+  TiXmlElement *xml = this->logStartXml->FirstChildElement("chunk");
+
+  while (xml)
+  {
+    count++;
+    xml = xml->NextSiblingElement("chunk");
+  }
+
+  return count;
+}
diff --git a/gazebo/util/LogPlay.hh b/gazebo/util/LogPlay.hh
new file mode 100644
index 0000000..4694623
--- /dev/null
+++ b/gazebo/util/LogPlay.hh
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _LOGPLAY_HH_
+#define _LOGPLAY_HH_
+
+#include <tinyxml.h>
+
+#include <list>
+#include <string>
+#include <fstream>
+
+#include "gazebo/common/SingletonT.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  namespace util
+  {
+    /// \addtogroup gazebo_physics
+    /// \{
+
+    /// \class Logplay Logplay.hh util/util.hh
+    /// \brief Open and playback log files that were recorded using LogRecord.
+    ///
+    /// Use Logplay to open a log file (Logplay::Open), and access the
+    /// recorded state information. Iterators are available to step through
+    /// the state information. It is also possible to replay the data in a
+    /// World using the Play functions. Replay involves reading and applying
+    /// state information to a World.
+    ///
+    /// \sa LogRecord, State
+    class GAZEBO_VISIBLE LogPlay : public SingletonT<LogPlay>
+    {
+      /// \brief Constructor
+      private: LogPlay();
+
+      /// \brief Destructor
+      private: virtual ~LogPlay();
+
+      /// \brief Open a log file for reading
+      ///
+      /// Open a log file that was previously recorded.
+      /// \param[in] _logFile The file to load
+      /// \throws Exception
+      public: void Open(const std::string &_logFile);
+
+      /// \brief Return true if a file is open.
+      /// \return True if a log file is open.
+      public: bool IsOpen() const;
+
+      /// \brief Get the log version number of the open log file.
+      /// \return The log version of the open log file. Empty string if
+      /// a log file is not open.
+      public: std::string GetLogVersion() const;
+
+      /// \brief Get the Gazebo version number of the open log file.
+      /// \return The Gazebo version of the open log file. Empty string if
+      /// a log file is not open.
+      public: std::string GetGazeboVersion() const;
+
+      /// \brief Get the random number seed of the open log file.
+      /// \return The random number seed the open log file. The current
+      /// random number seed, as defined in math::Rand::GetSeed.
+      public: uint32_t GetRandSeed() const;
+
+      /// \brief Step through the open log file.
+      /// \param[out] _data Data from next entry in the log file.
+      public: bool Step(std::string &_data);
+
+      /// \brief Get the number of chunks (steps) in the open log file.
+      /// \return The number of recorded states in the log file.
+      public: unsigned int GetChunkCount() const;
+
+      /// \brief Get data for a particular chunk index.
+      /// \param[in] _index Index of the chunk.
+      /// \param[out] _data Storage for the chunk's data.
+      /// \return True if the _index was valid.
+      public: bool GetChunk(unsigned int _index, std::string &_data);
+
+      /// \brief Get the type of encoding used for current chunck in the
+      /// open log file.
+      /// \return The type of encoding. An empty string will be returned if
+      /// LogPlay::Step has not been called at least once.
+      public: std::string GetEncoding() const;
+
+      /// \brief Get the header that was read from a log file. Should call
+      /// LogPlay::Open first.
+      /// \return Header of the open log file.
+      public: std::string GetHeader() const;
+
+      /// \brief Helper function to get chunk data from XML.
+      /// \param[in] _xml Pointer to an xml block that has state data.
+      /// \param[out] _data Storage for the chunk's data.
+      /// \return True if the chunk was successfully parsed.
+      private: bool GetChunkData(TiXmlElement *_xml, std::string &_data);
+
+      /// \brief Read the header from the log file.
+      private: void ReadHeader();
+
+      /// \brief The XML document of the log file.
+      private: TiXmlDocument xmlDoc;
+
+      /// \brief Start of the log.
+      private: TiXmlElement *logStartXml;
+
+      /// \brief Current position in the log file.
+      private: TiXmlElement *logCurrXml;
+
+      /// \brief Name of the log file.
+      private: std::string filename;
+
+      /// \brief The version of the Gazebo logger used to create the open
+      /// log file.
+      private: std::string logVersion;
+
+      /// \brief The version of Gazebo used to create the open log file.
+      private: std::string gazeboVersion;
+
+      /// \brief The random number seed recorded in the open log file.
+      private: uint32_t randSeed;
+
+      /// \brief The encoding for the current chunk in the log file.
+      private: std::string encoding;
+
+      private: std::string currentChunk;
+
+      /// \brief This is a singleton
+      private: friend class SingletonT<LogPlay>;
+    };
+    /// \}
+  }
+}
+
+#endif
diff --git a/gazebo/util/LogRecord.cc b/gazebo/util/LogRecord.cc
new file mode 100644
index 0000000..cbdbe3a
--- /dev/null
+++ b/gazebo/util/LogRecord.cc
@@ -0,0 +1,865 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <boost/date_time.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/iostreams/filter/bzip2.hpp>
+#include <boost/iostreams/filter/zlib.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/copy.hpp>
+#include <iomanip>
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/Base64.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Time.hh"
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/gazebo_config.h"
+#include "gazebo/math/Rand.hh"
+#include "gazebo/transport/transport.hh"
+#include "gazebo/util/LogRecord.hh"
+
+using namespace gazebo;
+using namespace util;
+
+//////////////////////////////////////////////////
+LogRecord::LogRecord()
+{
+  this->pauseState = false;
+  this->running = false;
+  this->paused = false;
+  this->initialized = false;
+  this->stopThread = false;
+  this->firstUpdate = true;
+  this->readyToStart = false;
+
+  // Get the user's home directory
+  // \todo getenv is not portable, and there is no generic cross-platform
+  // method. Must check OS and choose a method
+  char *homePath = getenv("HOME");
+  GZ_ASSERT(homePath, "HOME environment variable is missing");
+
+  if (!homePath)
+  {
+    common::SystemPaths *paths = common::SystemPaths::Instance();
+    this->logBasePath = paths->GetTmpPath() + "/gazebo";
+  }
+  else
+    this->logBasePath = boost::filesystem::path(homePath);
+
+  this->logBasePath /= "/.gazebo/log/";
+
+  this->logsEnd = this->logs.end();
+
+  this->connections.push_back(
+     event::Events::ConnectPause(
+       boost::bind(&LogRecord::OnPause, this, _1)));
+}
+
+//////////////////////////////////////////////////
+void LogRecord::OnPause(bool _pause)
+{
+  this->pauseState = _pause;
+}
+
+//////////////////////////////////////////////////
+LogRecord::~LogRecord()
+{
+  // Stop the write thread.
+  this->Fini();
+}
+
+//////////////////////////////////////////////////
+bool LogRecord::Init(const std::string &_subdir)
+{
+  if (_subdir.empty())
+  {
+    gzerr << "LogRecord initialization directory is empty." << std::endl;
+    return false;
+  }
+
+  this->logSubDir = _subdir;
+
+  this->ClearLogs();
+
+  this->initialized = true;
+  this->running = false;
+  this->paused = false;
+  this->stopThread = false;
+  this->firstUpdate = true;
+  this->readyToStart = true;
+
+  return true;
+}
+
+//////////////////////////////////////////////////
+bool LogRecord::Start(const std::string &_encoding, const std::string &_path)
+{
+  boost::mutex::scoped_lock lock(this->controlMutex);
+
+  // Make sure ::Init has been called.
+  if (!this->initialized)
+  {
+    gzerr << "LogRecord has not been initialized." << std::endl;
+    return false;
+  }
+
+  // Check to see if the logger is already started.
+  if (this->running)
+  {
+    /// \TODO replace this with gzlog
+    gzerr << "LogRecord has already been started" << std::endl;
+    return false;
+  }
+
+  // Get the current time as an ISO string.
+  std::string logTimeDir = common::Time::GetWallTimeAsISOString();
+
+  // Override the default path settings if the _path parameter is set.
+  if (!_path.empty())
+  {
+    this->logBasePath = boost::filesystem::path(_path);
+    this->logCompletePath = this->logBasePath;
+  }
+  else
+    this->logCompletePath = this->logBasePath / logTimeDir / this->logSubDir;
+
+  // Create the log directory if necessary
+  if (!boost::filesystem::exists(this->logCompletePath))
+    boost::filesystem::create_directories(logCompletePath);
+
+  if (_encoding != "bz2" && _encoding != "txt" && _encoding != "zlib")
+    gzthrow("Invalid log encoding[" + _encoding +
+            "]. Must be one of [bz2, zlib, txt]");
+
+  this->encoding = _encoding;
+
+  {
+    boost::mutex::scoped_lock logLock(this->writeMutex);
+    this->logsEnd = this->logs.end();
+
+    // Start all the logs
+    for (Log_M::iterator iter = this->logs.begin();
+         iter != this->logsEnd; ++iter)
+      iter->second->Start(logCompletePath);
+  }
+
+  this->running = true;
+  this->paused = false;
+  this->firstUpdate = true;
+  this->stopThread = false;
+  this->readyToStart = false;
+
+  this->startTime = this->currTime = common::Time();
+
+  // Create a thread to cleanup recording.
+  this->cleanupThread = boost::thread(boost::bind(&LogRecord::Cleanup, this));
+  // Wait for thread to start
+  this->startThreadCondition.wait(lock);
+
+  // Start the update thread if it has not already been started
+  if (!this->updateThread)
+  {
+    boost::mutex::scoped_lock updateLock(this->updateMutex);
+    this->updateThread = new boost::thread(
+        boost::bind(&LogRecord::RunUpdate, this));
+    this->startThreadCondition.wait(updateLock);
+  }
+
+  // Start the writing thread if it has not already been started
+  if (!this->writeThread)
+  {
+    boost::mutex::scoped_lock writeLock(this->runWriteMutex);
+    this->writeThread = new boost::thread(
+        boost::bind(&LogRecord::RunWrite, this));
+    this->startThreadCondition.wait(writeLock);
+  }
+
+  return true;
+}
+
+//////////////////////////////////////////////////
+const std::string &LogRecord::GetEncoding() const
+{
+  return this->encoding;
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Fini()
+{
+  do
+  {
+    boost::mutex::scoped_lock lock(this->controlMutex);
+    this->cleanupCondition.notify_all();
+  } while (this->cleanupThread.joinable() &&
+          !this->cleanupThread.timed_join(
+            boost::posix_time::milliseconds(1000)));
+
+  boost::mutex::scoped_lock lock(this->controlMutex);
+  this->connections.clear();
+
+  // Remove all the logs.
+  this->ClearLogs();
+
+  this->logControlSub.reset();
+  this->logStatusPub.reset();
+  this->node.reset();
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Stop()
+{
+  boost::mutex::scoped_lock lock(this->controlMutex);
+
+  this->running = false;
+  this->cleanupCondition.notify_all();
+}
+
+//////////////////////////////////////////////////
+void LogRecord::ClearLogs()
+{
+  boost::mutex::scoped_lock logLock(this->writeMutex);
+
+  // Delete all the log objects
+  for (Log_M::iterator iter = this->logs.begin();
+      iter != this->logs.end(); ++iter)
+  {
+    delete iter->second;
+  }
+
+  this->logs.clear();
+  this->logsEnd = this->logs.end();
+}
+
+//////////////////////////////////////////////////
+void LogRecord::SetPaused(bool _paused)
+{
+  this->paused = _paused;
+}
+
+//////////////////////////////////////////////////
+bool LogRecord::GetPaused() const
+{
+  return this->paused;
+}
+
+//////////////////////////////////////////////////
+bool LogRecord::GetRunning() const
+{
+  return this->running;
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Add(const std::string &_name, const std::string &_filename,
+                    boost::function<bool (std::ostringstream &)> _logCallback)
+{
+  boost::mutex::scoped_lock logLock(this->writeMutex);
+
+  // Check to see if the log has already been added.
+  if (this->logs.find(_name) != this->logs.end())
+  {
+    GZ_ASSERT(this->logs.find(_name)->second != NULL, "Unable to find log");
+
+    if (this->logs.find(_name)->second->GetRelativeFilename() != _filename)
+    {
+      gzerr << "Attempting to add a duplicate log object named["
+          << _name << "] with a filename of [" << _filename << "].\n";
+      return;
+    }
+    else
+    {
+      return;
+    }
+  }
+
+  LogRecord::Log *newLog;
+
+  // Create a new log object
+  try
+  {
+    newLog = new LogRecord::Log(this, _filename, _logCallback);
+  }
+  catch(...)
+  {
+    gzthrow("Unable to create log. File permissions are probably bad.");
+  }
+
+  if (this->running)
+    newLog->Start(this->logCompletePath);
+
+  // Add the log to our map
+  this->logs[_name] = newLog;
+
+  // Update the pointer to the end of the log objects list.
+  this->logsEnd = this->logs.end();
+
+  if (!this->node)
+  {
+    this->node = transport::NodePtr(new transport::Node());
+    this->node->Init();
+
+    this->logControlSub = this->node->Subscribe("~/log/control",
+        &LogRecord::OnLogControl, this);
+    this->logStatusPub = this->node->Advertise<msgs::LogStatus>("~/log/status");
+  }
+}
+
+//////////////////////////////////////////////////
+bool LogRecord::Remove(const std::string &_name)
+{
+  boost::mutex::scoped_lock logLock(this->writeMutex);
+
+  bool result = false;
+
+  Log_M::iterator iter = this->logs.find(_name);
+  if (iter != this->logs.end())
+  {
+    delete iter->second;
+    this->logs.erase(iter);
+
+    // Update the pointer to the end of the log objects list.
+    this->logsEnd = this->logs.end();
+
+    result = true;
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+std::string LogRecord::GetFilename(const std::string &_name) const
+{
+  boost::mutex::scoped_lock logLock(this->writeMutex);
+
+  std::string result;
+
+  Log_M::const_iterator iter = this->logs.find(_name);
+  if (iter != this->logs.end())
+  {
+    GZ_ASSERT(iter->second, "Invalid log");
+    result = iter->second->GetCompleteFilename();
+  }
+  else
+    result = this->logs.begin()->second->GetCompleteFilename();
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+unsigned int LogRecord::GetFileSize(const std::string &_name) const
+{
+  unsigned int result = 0;
+
+  // Get the filename of the specified log object;
+  std::string filename = this->GetFilename(_name);
+
+  // Get the size of the log file on disk.
+  if (!filename.empty())
+  {
+    // Get the size of the file
+    if (!filename.empty() && boost::filesystem::exists(filename))
+      result = boost::filesystem::file_size(filename);
+  }
+
+  // Add in the contents of the write buffer. This is the data that will be
+  // written to disk soon.
+  {
+    boost::mutex::scoped_lock lock(this->writeMutex);
+    Log_M::const_iterator iter = this->logs.find(_name);
+
+    if (iter != this->logs.end())
+    {
+      GZ_ASSERT(iter->second, "Log object is NULL");
+      result += iter->second->GetBufferSize();
+    }
+  }
+
+  return result;
+}
+
+//////////////////////////////////////////////////
+void LogRecord::SetBasePath(const std::string &_path)
+{
+  // Make sure the  directory exists
+  if (!boost::filesystem::exists(_path))
+    boost::filesystem::create_directories(_path);
+
+  // Make sure we have a directory
+  if (!boost::filesystem::is_directory(_path))
+  {
+    gzerr << "Path " << _path << " is not a directory. Please only specify a "
+           << "directory for data logging.\n";
+    return;
+  }
+
+  // Make sure the path is writable.
+  // Note: This is not cross-platform compatible.
+  if (access(_path.c_str(), W_OK) != 0)
+  {
+    gzerr << "You do no have permission to write into " << _path << "\n";
+    return;
+  }
+
+  this->logBasePath = _path;
+}
+
+//////////////////////////////////////////////////
+std::string LogRecord::GetBasePath() const
+{
+  return this->logBasePath.string();
+}
+
+//////////////////////////////////////////////////
+bool LogRecord::GetFirstUpdate() const
+{
+  return this->firstUpdate;
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Notify()
+{
+  if (this->running)
+    this->updateCondition.notify_all();
+}
+
+//////////////////////////////////////////////////
+void LogRecord::RunUpdate()
+{
+  boost::mutex::scoped_lock updateLock(this->updateMutex);
+  this->startThreadCondition.notify_all();
+
+  // This loop will write data to disk.
+  while (!this->stopThread)
+  {
+    // Don't completely lock, just to be safe.
+    this->updateCondition.wait(updateLock);
+
+    if (!this->stopThread)
+      this->Update();
+  }
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Update()
+{
+  if (!this->paused)
+  {
+    unsigned int size = 0;
+
+    {
+      boost::mutex::scoped_lock lock(this->writeMutex);
+
+      // Collect all the new log data. This will not write data to disk.
+      for (this->updateIter = this->logs.begin();
+           this->updateIter != this->logsEnd; ++this->updateIter)
+      {
+        size += this->updateIter->second->Update();
+      }
+    }
+
+    if (this->firstUpdate)
+    {
+      this->firstUpdate = false;
+      this->startTime = common::Time::GetWallTime();
+    }
+
+    // Signal that new data is available.
+    if (size > 0)
+      this->dataAvailableCondition.notify_one();
+
+    this->currTime = common::Time::GetWallTime();
+
+    // Output the new log status
+    this->PublishLogStatus();
+  }
+}
+
+//////////////////////////////////////////////////
+void LogRecord::RunWrite()
+{
+  // Wait for new data.
+  boost::mutex::scoped_lock lock(this->runWriteMutex);
+  this->startThreadCondition.notify_all();
+
+  // This loop will write data to disk.
+  while (!this->stopThread)
+  {
+    this->dataAvailableCondition.wait(lock);
+
+    this->Write(false);
+  }
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Write(bool /*_force*/)
+{
+  boost::mutex::scoped_lock lock(this->writeMutex);
+
+  // Collect all the new log data.
+  for (this->updateIter = this->logs.begin();
+      this->updateIter != this->logsEnd; ++this->updateIter)
+  {
+    this->updateIter->second->Write();
+  }
+}
+
+//////////////////////////////////////////////////
+common::Time LogRecord::GetRunTime() const
+{
+  return this->currTime - this->startTime;
+}
+
+//////////////////////////////////////////////////
+LogRecord::Log::Log(LogRecord *_parent, const std::string &_relativeFilename,
+                 boost::function<bool (std::ostringstream &)> _logCB)
+{
+  this->parent = _parent;
+  this->logCB = _logCB;
+
+  this->relativeFilename = _relativeFilename;
+}
+
+//////////////////////////////////////////////////
+LogRecord::Log::~Log()
+{
+  this->Stop();
+}
+
+//////////////////////////////////////////////////
+unsigned int LogRecord::Log::Update()
+{
+  std::ostringstream stream;
+
+  // Get log data via the callback.
+  if (this->logCB(stream))
+  {
+    std::string data = stream.str();
+    if (!data.empty())
+    {
+      const std::string encodingLocal = this->parent->GetEncoding();
+
+      this->buffer.append("<chunk encoding='");
+      this->buffer.append(encodingLocal);
+      this->buffer.append("'>\n");
+
+      this->buffer.append("<![CDATA[");
+      // Compress the data.
+      if (encodingLocal == "bz2")
+      {
+        std::string str;
+
+        // Compress to bzip2
+        {
+          boost::iostreams::filtering_ostream out;
+          out.push(boost::iostreams::bzip2_compressor());
+          out.push(std::back_inserter(str));
+          boost::iostreams::copy(boost::make_iterator_range(data), out);
+        }
+
+        // Encode in base64.
+        Base64Encode(str.c_str(), str.size(), this->buffer);
+      }
+      else if (encodingLocal == "zlib")
+      {
+        std::string str;
+
+        // Compress to zlib
+        {
+          boost::iostreams::filtering_ostream out;
+          out.push(boost::iostreams::zlib_compressor());
+          out.push(std::back_inserter(str));
+          boost::iostreams::copy(boost::make_iterator_range(data), out);
+        }
+
+        // Encode in base64.
+        Base64Encode(str.c_str(), str.size(), this->buffer);
+      }
+      else if (encodingLocal == "txt")
+        this->buffer.append(data);
+      else
+        gzerr << "Unknown log file encoding[" << encodingLocal << "]\n";
+      this->buffer.append("]]>\n");
+
+      this->buffer.append("</chunk>\n");
+    }
+  }
+
+  return this->buffer.size();
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Log::ClearBuffer()
+{
+  this->buffer.clear();
+}
+
+//////////////////////////////////////////////////
+unsigned int LogRecord::Log::GetBufferSize()
+{
+  return this->buffer.size();
+}
+
+//////////////////////////////////////////////////
+std::string LogRecord::Log::GetRelativeFilename() const
+{
+  return this->relativeFilename;
+}
+
+//////////////////////////////////////////////////
+std::string LogRecord::Log::GetCompleteFilename() const
+{
+  return this->completePath.string();
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Log::Stop()
+{
+  if (this->logFile.is_open())
+  {
+    this->Update();
+    this->Write();
+
+    std::string xmlEnd = "</gazebo_log>";
+    this->logFile.write(xmlEnd.c_str(), xmlEnd.size());
+
+    this->logFile.close();
+  }
+
+  this->completePath.clear();
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Log::Start(const boost::filesystem::path &_path)
+{
+  // Make the full path for the log file
+  this->completePath = _path / this->relativeFilename;
+
+  // Make sure the file does not exist
+  if (boost::filesystem::exists(this->completePath))
+    gzlog << "Filename[" + this->completePath.string() + "], already exists."
+      << " The log file will be overwritten.\n";
+
+  std::ostringstream stream;
+  stream << "<?xml version='1.0'?>\n"
+         << "<gazebo_log>\n"
+         << "<header>\n"
+         << "<log_version>" << GZ_LOG_VERSION << "</log_version>\n"
+         << "<gazebo_version>" << GAZEBO_VERSION_FULL << "</gazebo_version>\n"
+         << "<rand_seed>" << math::Rand::GetSeed() << "</rand_seed>\n"
+         << "</header>\n";
+
+  this->buffer.append(stream.str());
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Log::Write()
+{
+  // Make sure the file is open for writing
+  if (!this->logFile.is_open())
+  {
+    // Try to open it...
+    this->logFile.open(this->completePath.string().c_str(),
+                       std::fstream::out | std::ios::binary);
+
+    // Throw an error if we couldn't open the file for writing.
+    if (!this->logFile.is_open())
+      gzthrow("Unable to open file for logging:" +
+              this->completePath.string() + "]");
+  }
+
+  // Check to see if the log file still exists on disk. This will catch the
+  // case when someone deletes a log file while recording.
+  if (!boost::filesystem::exists(this->completePath.string().c_str()))
+  {
+    gzerr << "Log file[" << this->completePath << "] no longer exists. "
+          << "Unable to write log data.\n";
+
+    // We have to clear the buffer, or else it may grow indefinitely.
+    this->buffer.clear();
+    return;
+  }
+
+  // Write out the contents of the buffer.
+  this->logFile.write(this->buffer.c_str(), this->buffer.size());
+  this->logFile.flush();
+
+  // Clear the buffer.
+  this->buffer.clear();
+}
+
+//////////////////////////////////////////////////
+void LogRecord::OnLogControl(ConstLogControlPtr &_data)
+{
+  if (_data->has_base_path() && !_data->base_path().empty())
+    this->SetBasePath(_data->base_path());
+
+  std::string msgEncoding = "zlib";
+  if (_data->has_encoding())
+    msgEncoding = _data->encoding();
+
+  if (_data->has_start() && _data->start())
+  {
+    this->Start(msgEncoding);
+  }
+  else if (_data->has_stop() && _data->stop())
+  {
+    this->Stop();
+  }
+  else if (_data->has_paused())
+  {
+    this->SetPaused(_data->paused());
+  }
+
+  // Output the new log status
+  this->PublishLogStatus();
+}
+
+//////////////////////////////////////////////////
+void LogRecord::PublishLogStatus()
+{
+  if (this->logs.empty() || !this->logStatusPub ||
+      !this->logStatusPub->HasConnections())
+    return;
+
+  /// \todo right now this function will only report on the first log.
+
+  msgs::LogStatus msg;
+  unsigned int size = 0;
+
+  // Set the time of the status message
+  msgs::Set(msg.mutable_sim_time(), this->GetRunTime());
+
+  // Set the log recording base path name
+  msg.mutable_log_file()->set_base_path(this->GetBasePath());
+
+  // Get the full name of the log file
+  msg.mutable_log_file()->set_full_path(this->GetFilename());
+
+  // Set the URI of th log file
+  msg.mutable_log_file()->set_uri(transport::Connection::GetLocalHostname());
+
+  // Get the size of the log file
+  size = this->GetFileSize();
+
+  if (size < 1000)
+    msg.mutable_log_file()->set_size_units(msgs::LogStatus::LogFile::BYTES);
+  else if (size < 1e6)
+  {
+    msg.mutable_log_file()->set_size(size / 1.0e3);
+    msg.mutable_log_file()->set_size_units(msgs::LogStatus::LogFile::K_BYTES);
+  }
+  else if (size < 1e9)
+  {
+    msg.mutable_log_file()->set_size(size / 1.0e6);
+    msg.mutable_log_file()->set_size_units(msgs::LogStatus::LogFile::M_BYTES);
+  }
+  else
+  {
+    msg.mutable_log_file()->set_size(size / 1.0e9);
+    msg.mutable_log_file()->set_size_units(msgs::LogStatus::LogFile::G_BYTES);
+  }
+
+  this->logStatusPub->Publish(msg);
+}
+
+//////////////////////////////////////////////////
+void LogRecord::Cleanup()
+{
+  boost::mutex::scoped_lock lock(this->controlMutex);
+  this->startThreadCondition.notify_all();
+
+  // Wait for the cleanup signal
+  this->cleanupCondition.wait(lock);
+
+  bool currentPauseState = this->pauseState;
+  event::Events::pause(true);
+
+  // Reset the flags
+  this->paused = false;
+  this->running = false;
+  this->stopThread = true;
+
+  // Kick the update thread
+  {
+    boost::mutex::scoped_lock updateLock(this->updateMutex);
+    this->updateCondition.notify_all();
+  }
+
+  // Wait for the write thread, if it exists
+  if (this->updateThread)
+    this->updateThread->join();
+
+  // Kick the write thread
+  {
+    boost::mutex::scoped_lock lock2(this->runWriteMutex);
+    this->dataAvailableCondition.notify_all();
+  }
+
+  // Wait for the write thread, if it exists
+  if (this->writeThread)
+    this->writeThread->join();
+
+  delete this->updateThread;
+  this->updateThread = NULL;
+
+  delete this->writeThread;
+  this->writeThread = NULL;
+
+  // Update and write one last time to make sure we log all data.
+  this->Update();
+
+  this->Write(true);
+
+  // Stop all the logs
+  for (Log_M::iterator iter = this->logs.begin();
+      iter != this->logsEnd; ++iter)
+  {
+    iter->second->Stop();
+  }
+
+  // Reset the times
+  this->startTime = this->currTime = common::Time();
+
+  // Output the new log status
+  this->PublishLogStatus();
+
+  event::Events::pause(currentPauseState);
+  this->readyToStart = true;
+}
+
+//////////////////////////////////////////////////
+bool LogRecord::IsReadyToStart() const
+{
+  return this->readyToStart;
+}
+
+//////////////////////////////////////////////////
+unsigned int LogRecord::GetBufferSize() const
+{
+  boost::mutex::scoped_lock lock(this->writeMutex);
+  unsigned int size = 0;
+
+  for (Log_M::const_iterator iter = this->logs.begin();
+      iter != this->logs.end(); ++iter)
+  {
+    size += iter->second->GetBufferSize();
+  }
+
+  return size;
+}
diff --git a/gazebo/util/LogRecord.hh b/gazebo/util/LogRecord.hh
new file mode 100644
index 0000000..91d06b2
--- /dev/null
+++ b/gazebo/util/LogRecord.hh
@@ -0,0 +1,385 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/* Desc: A class to log data
+ * Author: Nate Koenig
+ * Date: 1 Jun 2010
+ */
+
+#ifndef _LOGRECORD_HH_
+#define _LOGRECORD_HH_
+
+#include <fstream>
+#include <string>
+#include <map>
+#include <boost/thread.hpp>
+#include <boost/archive/iterators/base64_from_binary.hpp>
+#include <boost/archive/iterators/insert_linebreaks.hpp>
+#include <boost/archive/iterators/transform_width.hpp>
+#include <boost/archive/iterators/ostream_iterator.hpp>
+#include <boost/filesystem.hpp>
+
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/common/UpdateInfo.hh"
+#include "gazebo/common/Event.hh"
+#include "gazebo/common/SingletonT.hh"
+#include "gazebo/util/system.hh"
+
+#define GZ_LOG_VERSION "1.0"
+
+namespace gazebo
+{
+  namespace util
+  {
+    /// addtogroup gazebo_util
+    /// \{
+
+    /// \class LogRecord LogRecord.hh util/util.hh
+    /// \brief Handles logging of data to disk
+    ///
+    /// The LogRecord class is a Singleton that manages data logging of any
+    /// entity within a running simulation. An entity may be a World, Model,
+    /// or any of their child entities. This class only writes log files,
+    /// see LogPlay for playback functionality.
+    ///
+    /// State information for an entity may be logged through the LogRecord::Add
+    /// function, and stopped through the LogRecord::Remove function. Data may
+    /// be logged into a single file, or split into many separate files by
+    /// specifying different filenames for the LogRecord::Add function.
+    ///
+    /// The LogRecord is updated at the start of each simulation step. This
+    /// guarantees that all data is stored.
+    ///
+    /// \sa Logplay, State
+    class GAZEBO_VISIBLE LogRecord : public SingletonT<LogRecord>
+    {
+      /// \brief Constructor
+      private: LogRecord();
+
+      /// \brief Destructor
+      private: virtual ~LogRecord();
+
+      /// \brief Initialize logging into a subdirectory.
+      ///
+      /// Init may only be called once, False will be returned if called
+      /// multiple times.
+      /// \param[in] _subdir Directory to record to
+      /// \return True if successful.
+      public: bool Init(const std::string &_subdir);
+
+      /// \brief Add an object to a log file.
+      ///
+      /// Add a new object to a log. An object can be any valid named object
+      /// in simulation, including the world itself. Duplicate additions are
+      /// ignored. Objects can be added to the same file by
+      /// specifying the same _filename.
+      /// \param[in] _name Name of the object to log.
+      /// \param[in] _filename Filename of the log file.
+      /// \param[in] _logCallback Function used to log data for the object.
+      /// Typically an object will have a log function that outputs data to
+      /// the provided ofstream.
+      /// \throws Exception
+      public: void Add(const std::string &_name, const std::string &_filename,
+                    boost::function<bool (std::ostringstream &)> _logCallback);
+
+      /// \brief Remove an entity from a log
+      ///
+      /// Removes an entity from the logger. The stops data recording for
+      /// the entity and all its children. For example, specifying a world
+      /// will stop all data logging.
+      /// \param[in] _name Name of the log
+      /// \return True if the entity existed and was removed. False if the
+      /// entity was not registered with the logger.
+      public: bool Remove(const std::string &_name);
+
+      /// \brief Stop the logger.
+      public: void Stop();
+
+      /// \brief Tell the recorder that an update should occur.
+      public: void Notify();
+
+      /// \brief Set whether logging should pause. A paused state means the
+      /// log file is still open, but data is not written to it.
+      /// \param[in] _paused True to pause data logging.
+      /// \sa LogRecord::GetPaused
+      public: void SetPaused(bool _paused);
+
+      /// \brief Get whether logging is paused.
+      /// \return True if logging is paused.
+      /// \sa LogRecord::SetPaused
+      public: bool GetPaused() const;
+
+      /// \brief Get whether the logger is ready to start, which implies
+      /// that any previous runs have finished.
+      // \return True if logger is ready to start.
+      public: bool IsReadyToStart() const;
+
+      /// \brief Get whether logging is running.
+      /// \return True if logging has been started.
+      public: bool GetRunning() const;
+
+      /// \brief Start the logger.
+      /// \param[in] _encoding The type of encoding (txt, zlib, or bz2).
+      /// \param[in] _path Path in which to store log files.
+      public: bool Start(const std::string &_encoding="zlib",
+                  const std::string &_path="");
+
+      /// \brief Get the encoding used.
+      /// \return Either [txt, zlib, or bz2], where txt is plain txt and bz2
+      /// and zlib are compressed data with Base64 encoding.
+      public: const std::string &GetEncoding() const;
+
+      /// \brief Get the filename for a log object.
+      /// \param[in] _name Name of the log object.
+      /// \return Filename, empty string if not found.
+      public: std::string GetFilename(const std::string &_name = "") const;
+
+      /// \brief Get the file size for a log object.
+      /// \param[in] _name Name of the log object.
+      /// \return Size in bytes.
+      public: unsigned int GetFileSize(const std::string &_name = "") const;
+
+      /// \brief Set the base path.
+      /// \param[in] _path Path to the new logging location.
+      public: void SetBasePath(const std::string &_path);
+
+      /// \brief Get the base path for a log recording.
+      /// \return Path for log recording.
+      public: std::string GetBasePath() const;
+
+      /// \brief Get the run time in sim time.
+      /// \return Run sim time.
+      public: common::Time GetRunTime() const;
+
+      /// \brief Finialize, and shutdown.
+      public: void Fini();
+
+      /// \brief Return true if an Update has not yet been completed.
+      /// \return True if an Update has not yet been completed.
+      public: bool GetFirstUpdate() const;
+
+      /// \brief Write all logs.
+      /// \param[in] _force True to skip waiting on dataAvailableCondition.
+      public: void Write(bool _force = false);
+
+      /// \brief Get the size of the buffer.
+      /// \return Size of the buffer, in bytes.
+      public: unsigned int GetBufferSize() const;
+
+      /// \brief Update the log files
+      ///
+      /// Captures the current state of all registered entities, and outputs
+      /// the data to their respective log files.
+      // private: void Update(const common::UpdateInfo &_info);
+      private: void Update();
+
+      /// \brief Function used by the update thread.
+      private: void RunUpdate();
+
+      /// \brief Run the Write loop.
+      private: void RunWrite();
+
+      /// \brief Clear and delete the log buffers.
+      private: void ClearLogs();
+
+      /// \brief Publish log status message.
+      private: void PublishLogStatus();
+
+      /// \brief Called when a log control message is received.
+      /// \param[in] _data The log control message.
+      private: void OnLogControl(ConstLogControlPtr &_data);
+
+      /// \brief Cleanup log recording. A thread uses this function, you
+      /// should never call this function directly. Use the Stop() function
+      /// to trigger a cleanup.
+      private: void Cleanup();
+
+      /// \brief Used to get the simulation pause state.
+      private: void OnPause(bool _pause);
+
+      /// \cond
+      private: class Log
+      {
+        /// \brief Constructor
+        /// \param[in] _parent Pointer to the LogRecord parent.
+        /// \param[in] _relativeFilename The name of the log file to
+        /// generate, sans the complete path.
+        /// \param[in] _logCB Callback function, which is used to get log
+        /// data.
+        public: Log(LogRecord *_parent, const std::string &_relativeFilename,
+                    boost::function<bool (std::ostringstream &)> _logCB);
+
+        /// \brief Destructor
+        public: virtual ~Log();
+
+        /// \brief Start the log.
+        /// \param[in] _path The complete path in which to put the log file.
+        public: void Start(const boost::filesystem::path &_path);
+
+        /// \brief Stop logging.
+        public: void Stop();
+
+        /// \brief Write data to disk.
+        public: void Write();
+
+        /// \brief Update the data buffer.
+        /// \return The size of the data buffer.
+        public: unsigned int Update();
+
+        /// \brief Clear the data buffer.
+        public: void ClearBuffer();
+
+        /// \brief Get the byte size of the buffer.
+        /// \return Buffer byte size.
+        public: unsigned int GetBufferSize();
+
+        /// \brief Get the relative filename. This is the filename passed
+        /// to the constructor.
+        /// \return The relative filename.
+        public: std::string GetRelativeFilename() const;
+
+        /// \brief Get the complete filename.
+        /// \return The complete filename.
+        public: std::string GetCompleteFilename() const;
+
+        /// \brief Pointer to the log record parent.
+        public: LogRecord *parent;
+
+        /// \brief Callback from which to get data.
+        public: boost::function<bool (std::ostringstream &)> logCB;
+
+        /// \brief Data buffer.
+        public: std::string buffer;
+
+        /// \brief The log file.
+        public: std::ofstream logFile;
+
+        /// \brief Relative log filename.
+        public: std::string relativeFilename;
+
+        /// \brief Complete file path.
+        private: boost::filesystem::path completePath;
+      };
+      /// \endcond
+
+      /// \def Log_M
+      /// \brief Map of names to logs.
+      private: typedef std::map<std::string, Log*> Log_M;
+
+      /// \brief All the log objects.
+      private: Log_M logs;
+
+      /// \brief Iterator used to update the log objects.
+      private: Log_M::iterator updateIter;
+
+      /// \brief Convenience iterator to the end of the log objects map.
+      private: Log_M::iterator logsEnd;
+
+      /// \brief Condition used to start threads
+      private: boost::condition_variable startThreadCondition;
+
+      /// \brief Condition used to trigger an update
+      private: boost::condition_variable updateCondition;
+
+      /// \brief Used by the cleanupThread to wait for a cleanup signal.
+      private: boost::condition_variable cleanupCondition;
+
+      /// \brief True if logging is running.
+      private: bool running;
+
+      /// \brief Thread used to write data to disk.
+      private: boost::thread *writeThread;
+
+      /// \brief Thread used to update data.
+      private: boost::thread *updateThread;
+
+      /// \brief Thread to cleanup log recording.
+      private: boost::thread cleanupThread;
+
+      /// \brief Mutex to protect against parallel calls to Write()
+      private: mutable boost::mutex writeMutex;
+
+      /// \brief Mutex to synchronize with RunWrite()
+      private: mutable boost::mutex runWriteMutex;
+
+      /// \brief Mutex to synchronize with RunUpdate()
+      private: mutable boost::mutex updateMutex;
+
+      /// \brief Mutex to protect logging control.
+      private: boost::mutex controlMutex;
+
+      /// \brief Used by the write thread to know when data needs to be
+      /// written to disk
+      private: boost::condition_variable dataAvailableCondition;
+
+      /// \brief The base pathname for all the logs.
+      private: boost::filesystem::path logBasePath;
+
+      /// \brief The complete pathname for all the logs.
+      private: boost::filesystem::path logCompletePath;
+
+      /// \brief Subdirectory for log files. This is appended to
+      /// logBasePath.
+      private: std::string logSubDir;
+
+      /// \brief Encoding format for each chunk.
+      private: std::string encoding;
+
+      /// \brief True if initialized.
+      private: bool initialized;
+
+      /// \brief True to pause recording.
+      private: bool paused;
+
+      /// \brief Used to indicate the first update callback.
+      private: bool firstUpdate;
+
+      /// \brief Flag used to stop the write thread.
+      private: bool stopThread;
+
+      /// \brief Start simulation time.
+      private: common::Time startTime;
+
+      /// \brief Current simulation time.
+      private: common::Time currTime;
+
+      /// \brief Transportation node.
+      private: transport::NodePtr node;
+
+      /// \brief Subscriber to log control messages.
+      private: transport::SubscriberPtr logControlSub;
+
+      /// \brief Publisher of log status messages.
+      private: transport::PublisherPtr logStatusPub;
+
+      /// \brief All the event connections.
+      private: event::Connection_V connections;
+
+      /// \brief Simulation pause state.
+      private: bool pauseState;
+
+      /// \brief This is a singleton
+      private: friend class SingletonT<LogRecord>;
+
+      /// \brief True if the logger is ready to start, and the previous run
+      /// has finished.
+      private: bool readyToStart;
+    };
+    /// \}
+  }
+}
+#endif
diff --git a/gazebo/util/LogRecord_TEST.cc b/gazebo/util/LogRecord_TEST.cc
new file mode 100644
index 0000000..32d92e9
--- /dev/null
+++ b/gazebo/util/LogRecord_TEST.cc
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <boost/filesystem.hpp>
+
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/common/Time.hh"
+#include "gazebo/util/LogRecord.hh"
+#include "test/util.hh"
+
+class LogRecord_TEST : public gazebo::testing::AutoLogFixture { };
+
+/////////////////////////////////////////////////
+/// \brief Test LogRecord constructor and a few accessors
+TEST_F(LogRecord_TEST, Constructor)
+{
+  gazebo::util::LogRecord *recorder = gazebo::util::LogRecord::Instance();
+
+  char *homePath = getenv("HOME");
+  EXPECT_TRUE(homePath != NULL);
+
+  common::SystemPaths *paths = common::SystemPaths::Instance();
+  boost::filesystem::path logPath = paths->GetTmpPath() + "/gazebo";
+  if (homePath)
+    logPath = boost::filesystem::path(homePath);
+  logPath /= "/.gazebo/log/";
+
+  // Make sure the log path is correct
+  EXPECT_EQ(recorder->GetBasePath(), logPath.string());
+
+  EXPECT_FALSE(recorder->GetPaused());
+  EXPECT_FALSE(recorder->GetRunning());
+  EXPECT_TRUE(recorder->GetFirstUpdate());
+
+  // Init without a subdirectory
+  EXPECT_FALSE(recorder->Init(""));
+}
+
+/////////////////////////////////////////////////
+/// \brief Test LogRecord Start errors
+TEST_F(LogRecord_TEST, StartErrors)
+{
+  gazebo::util::LogRecord *recorder = gazebo::util::LogRecord::Instance();
+
+  // Start without an init
+  {
+    EXPECT_FALSE(recorder->Start("bz2"));
+  }
+
+  // Invalid encoding
+  {
+    EXPECT_TRUE(recorder->Init("test"));
+    EXPECT_THROW(recorder->Start("garbage"), gazebo::common::Exception);
+  }
+
+  // Double start
+  {
+    EXPECT_TRUE(recorder->Start("bz2"));
+    EXPECT_TRUE(recorder->GetRunning());
+    EXPECT_FALSE(recorder->Start("bz2"));
+  }
+
+  // Stop recording.
+  recorder->Stop();
+
+  // Make sure everything has reset.
+  EXPECT_FALSE(recorder->GetRunning());
+  EXPECT_FALSE(recorder->GetPaused());
+  EXPECT_EQ(recorder->GetRunTime(), gazebo::common::Time());
+
+  // Logger may still be writing so make sure we exit cleanly
+  int i = 0;
+  while (!recorder->IsReadyToStart())
+  {
+    gazebo::common::Time::MSleep(100);
+    if ((++i % 50) == 0)
+      gzdbg << "Waiting for recorder->IsReadyToStart()" << std::endl;
+  }
+}
+
+/////////////////////////////////////////////////
+/// \brief Test LogRecord Init and Start
+TEST_F(LogRecord_TEST, Start_bzip2)
+{
+  gazebo::util::LogRecord *recorder = gazebo::util::LogRecord::Instance();
+
+  EXPECT_TRUE(recorder->Init("test"));
+  EXPECT_TRUE(recorder->Start("bz2"));
+
+  // Make sure the right flags have been set
+  EXPECT_FALSE(recorder->GetPaused());
+  EXPECT_TRUE(recorder->GetRunning());
+  EXPECT_TRUE(recorder->GetFirstUpdate());
+
+  // Make sure the right encoding is set
+  EXPECT_EQ(recorder->GetEncoding(), std::string("bz2"));
+
+  // Make sure the log directories exist
+  EXPECT_TRUE(boost::filesystem::exists(recorder->GetBasePath()));
+  EXPECT_TRUE(boost::filesystem::is_directory(recorder->GetBasePath()));
+
+  // Run time should be zero since no update has been triggered.
+  EXPECT_EQ(recorder->GetRunTime(), gazebo::common::Time());
+
+  // Stop recording.
+  recorder->Stop();
+
+  // Make sure everything has reset.
+  EXPECT_FALSE(recorder->GetRunning());
+  EXPECT_FALSE(recorder->GetPaused());
+  EXPECT_EQ(recorder->GetRunTime(), gazebo::common::Time());
+
+  // Logger may still be writing so make sure we exit cleanly
+  int i = 0;
+  while (!recorder->IsReadyToStart())
+  {
+    gazebo::common::Time::MSleep(100);
+    if ((++i % 50) == 0)
+      gzdbg << "Waiting for recorder->IsReadyToStart()" << std::endl;
+  }
+}
+
+/////////////////////////////////////////////////
+/// \brief Test LogRecord Init and Start
+TEST_F(LogRecord_TEST, Start_zlib)
+{
+  gazebo::util::LogRecord *recorder = gazebo::util::LogRecord::Instance();
+
+  EXPECT_TRUE(recorder->Init("test"));
+  EXPECT_TRUE(recorder->Start("zlib"));
+
+  // Make sure the right flags have been set
+  EXPECT_FALSE(recorder->GetPaused());
+  EXPECT_TRUE(recorder->GetRunning());
+  EXPECT_TRUE(recorder->GetFirstUpdate());
+
+  // Make sure the right encoding is set
+  EXPECT_EQ(recorder->GetEncoding(), std::string("zlib"));
+
+  // Make sure the log directories exist
+  EXPECT_TRUE(boost::filesystem::exists(recorder->GetBasePath()));
+  EXPECT_TRUE(boost::filesystem::is_directory(recorder->GetBasePath()));
+
+  // Run time should be zero since no update has been triggered.
+  EXPECT_EQ(recorder->GetRunTime(), gazebo::common::Time());
+
+  // Stop recording.
+  recorder->Stop();
+
+  // Make sure everything has reset.
+  EXPECT_FALSE(recorder->GetRunning());
+  EXPECT_FALSE(recorder->GetPaused());
+  EXPECT_EQ(recorder->GetRunTime(), gazebo::common::Time());
+
+  // Logger may still be writing so make sure we exit cleanly
+  int i = 0;
+  while (!recorder->IsReadyToStart())
+  {
+    gazebo::common::Time::MSleep(100);
+    if ((++i % 50) == 0)
+      gzdbg << "Waiting for recorder->IsReadyToStart()" << std::endl;
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/util/OpenAL.cc b/gazebo/util/OpenAL.cc
new file mode 100644
index 0000000..0fc6604
--- /dev/null
+++ b/gazebo/util/OpenAL.cc
@@ -0,0 +1,541 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <stdio.h>
+#include <unistd.h>
+#include <iostream>
+
+#include <gazebo/gazebo_config.h>
+
+#ifdef HAVE_OPENAL
+#ifdef __APPLE__
+# include <OpenAL/al.h>
+# include <OpenAL/alc.h>
+# include <OpenAL/MacOSX_OALExtensions.h>
+#else
+# include <AL/al.h>
+# include <AL/alc.h>
+# include <AL/alext.h>
+#endif
+#endif
+
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/AudioDecoder.hh"
+#include "gazebo/util/OpenAL.hh"
+
+using namespace gazebo;
+using namespace util;
+
+#ifdef HAVE_OPENAL
+/////////////////////////////////////////////////
+OpenAL::OpenAL()
+{
+  this->context = NULL;
+  this->audioDevice = NULL;
+}
+
+/////////////////////////////////////////////////
+OpenAL::~OpenAL()
+{
+  this->Fini();
+}
+
+/////////////////////////////////////////////////
+bool OpenAL::Load(sdf::ElementPtr _sdf)
+{
+  std::string deviceName = "default";
+
+  if (_sdf && _sdf->HasElement("device"))
+    deviceName = _sdf->Get<std::string>("device");
+
+  // Open the default audio device
+  if (deviceName == "default")
+    this->audioDevice = alcOpenDevice(NULL);
+  else
+    this->audioDevice = alcOpenDevice(deviceName.c_str());
+
+  // Make sure that we could open the audio device
+  if (this->audioDevice == NULL)
+  {
+    gzerr << "Unable to open audio device["
+      << deviceName << "]\n Audio will be disabled.\n";
+    return false;
+  }
+
+  // Create the audio context
+  this->context = alcCreateContext(this->audioDevice, NULL);
+
+  if (this->context == NULL)
+  {
+    gzerr << "Unable to create OpenAL Context.\nAudio will be disabled.\n";
+    return false;
+  }
+
+  // Make the context current
+  alcMakeContextCurrent(this->context);
+
+  // Clear error code
+  alGetError();
+
+  alDistanceModel(AL_EXPONENT_DISTANCE);
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+void OpenAL::Fini()
+{
+  if (this->audioDevice)
+  {
+    alcCloseDevice(this->audioDevice);
+    this->audioDevice = NULL;
+  }
+
+  if (this->context)
+  {
+    this->context = alcGetCurrentContext();
+    alcMakeContextCurrent(NULL);
+    alcDestroyContext(this->context);
+    this->context = NULL;
+  }
+
+  this->sink.reset();
+}
+
+/////////////////////////////////////////////////
+OpenALSinkPtr OpenAL::CreateSink(sdf::ElementPtr /*_sdf*/)
+{
+  OpenALSinkPtr result;
+
+  if (this->sink == NULL)
+  {
+    this->sink.reset(new OpenALSink);
+    result  = this->sink;
+  }
+  else
+    gzerr << "An OpenALSink has already been created."
+     << "Only one is allowed.\n";
+
+  return result;
+}
+
+/////////////////////////////////////////////////
+OpenALSourcePtr OpenAL::CreateSource(sdf::ElementPtr _sdf)
+{
+  OpenALSourcePtr source;
+
+  // Make sure the audio device has been opened
+  if (!this->audioDevice)
+  {
+    gzerr << "Audio device not open\n";
+    return source;
+  }
+
+  // Create a source
+  source.reset(new OpenALSource());
+
+  // Load the source
+  if (!source->Load(_sdf))
+  {
+    gzerr << "Unable to load OpenAL source from SDF\n";
+    source.reset();
+  }
+
+  // Return a pointer to the source
+  return source;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+//                      OPENAL LISTENER
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////
+OpenALSink::OpenALSink()
+{
+}
+
+/////////////////////////////////////////////////
+OpenALSink::~OpenALSink()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool OpenALSink::SetPose(const math::Pose &_pose)
+{
+  ALenum error;
+
+  // Clear error state
+  alGetError();
+
+  alListener3f(AL_POSITION, _pose.pos.x, _pose.pos.y, _pose.pos.z);
+
+  if ((error = alGetError()) != AL_NO_ERROR)
+  {
+    gzerr << " Unable to set pose. Error code[" <<  error << "]\n";
+    return false;
+  }
+
+  math::Matrix3 rot = _pose.rot.GetAsMatrix3();
+
+  // The first three values are the direction vector values.
+  // The second three value are the up vector values.
+  ALfloat orient[] = {static_cast<ALfloat>(rot[0][0]),
+                      static_cast<ALfloat>(rot[0][1]),
+                      static_cast<ALfloat>(rot[0][2]),
+                      static_cast<ALfloat>(rot[2][0]),
+                      static_cast<ALfloat>(rot[2][1]),
+                      static_cast<ALfloat>(rot[2][2])};
+
+  // Clear error state
+  alGetError();
+
+  alListenerfv(AL_ORIENTATION, orient);
+
+  if ((error = alGetError()) != AL_NO_ERROR)
+  {
+    gzerr << " Unable to set pose. Error code[" <<  error << "]\n";
+    return false;
+  }
+
+  return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool OpenALSink::SetVelocity(const math::Vector3 &_vel)
+{
+  ALenum error;
+
+  // Clear error state
+  alGetError();
+
+  alListener3f(AL_VELOCITY, _vel.x, _vel.y, _vel.z);
+  if ((error = alGetError()) != AL_NO_ERROR)
+  {
+    gzerr << " Unable to set velocity. Error code[" <<  error << "]\n";
+    return false;
+  }
+
+  return true;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+//                      OPENAL SOURCE
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////
+OpenALSource::OpenALSource()
+{
+  // Create 1 source
+  alGenSources(1, &this->alSource);
+
+  // Create 1 buffer
+  alGenBuffers(1, &this->alBuffer);
+}
+
+/////////////////////////////////////////////////
+OpenALSource::~OpenALSource()
+{
+  alDeleteSources(1, &this->alSource);
+  alDeleteBuffers(1, &this->alBuffer);
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::Load(sdf::ElementPtr _sdf)
+{
+  if (_sdf && _sdf->HasElement("uri"))
+    this->FillBufferFromFile(_sdf->Get<std::string>("uri"));
+  else
+  {
+    gzerr << "<audio_source> is missing <uri>...</uri> element\n";
+    return false;
+  }
+
+  bool result = true;
+
+  if (_sdf->HasElement("pitch"))
+    result = result && this->SetPitch(_sdf->Get<double>("pitch"));
+
+  if (_sdf->HasElement("gain"))
+    result = result && this->SetGain(_sdf->Get<double>("gain"));
+
+  if (_sdf->HasElement("loop"))
+    result = result && this->SetLoop(_sdf->Get<bool>("loop"));
+
+  if (_sdf->HasElement("contact"))
+  {
+    sdf::ElementPtr collisionElem =
+      _sdf->GetElement("contact")->GetElement("collision");
+
+    while (collisionElem)
+    {
+      this->collisionNames.push_back(collisionElem->Get<std::string>());
+      collisionElem = collisionElem->GetNextElement("collision");
+    }
+
+    result = result && !this->collisionNames.empty();
+  }
+  else
+    this->Play();
+
+  return result;
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::SetPose(const math::Pose &_pose)
+{
+  ALfloat p[3] = {static_cast<float>(_pose.pos.x),
+    static_cast<float>(_pose.pos.y), static_cast<float>(_pose.pos.z)};
+  ALenum error;
+
+  // Clear error state
+  alGetError();
+
+  alSourcefv(this->alSource, AL_POSITION, p);
+
+  if ((error = alGetError()) != AL_NO_ERROR)
+  {
+    gzerr << " Unable to set position. Error code[" << error << "]\n";
+    return false;
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::SetVelocity(const math::Vector3 &_vel)
+{
+  ALenum error;
+  ALfloat v[3] = {static_cast<float>(_vel.x),
+    static_cast<float>(_vel.y), static_cast<float>(_vel.z)};
+
+  // Clear error state
+  alGetError();
+
+  alSourcefv(this->alSource, AL_VELOCITY, v);
+
+  if ((error = alGetError()) != AL_NO_ERROR)
+  {
+    gzerr << " Unable to set velocity. Error code[" << error << "]\n";
+    return false;
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::SetPitch(float _pitch)
+{
+  ALenum error;
+
+  // clear error state
+  alGetError();
+
+  alSourcef(this->alSource, AL_PITCH, _pitch);
+
+  if ((error = alGetError()) != AL_NO_ERROR)
+  {
+    gzerr << " Unable to set pitch. Error code[" << error << "]\n";
+    return false;
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::SetGain(float _gain)
+{
+  ALenum error;
+
+  // clear error state
+  alGetError();
+
+  alSourcef(this->alSource, AL_GAIN, _gain);
+
+  if ((error = alGetError()) != AL_NO_ERROR)
+  {
+    gzerr << " Unable to set gain. Error code[" << error << "]\n";
+    return false;
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::SetLoop(bool _state)
+{
+  ALenum error;
+
+  // clear error state
+  alGetError();
+
+  // Set looping state
+  alSourcei(this->alSource, AL_LOOPING, _state);
+
+  if ((error = alGetError()) != AL_NO_ERROR)
+  {
+    gzerr << " Unable to set loop. Error code[" << error << "]\n";
+    return false;
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+std::vector<std::string> OpenALSource::GetCollisionNames() const
+{
+  return this->collisionNames;
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::GetOnContact() const
+{
+  return !this->collisionNames.empty();
+}
+
+/////////////////////////////////////////////////
+void OpenALSource::Play()
+{
+  int sourceState;
+  alGetSourcei(this->alSource, AL_SOURCE_STATE, &sourceState);
+
+  // Play the source, if it's not already playing
+  if (sourceState != AL_PLAYING)
+    alSourcePlay(this->alSource);
+}
+
+/////////////////////////////////////////////////
+void OpenALSource::Pause()
+{
+  int sourceState;
+  alGetSourcei(this->alSource, AL_SOURCE_STATE, &sourceState);
+
+  // Pause the source if it playing
+  if (sourceState == AL_PLAYING)
+    alSourcePause(this->alSource);
+}
+
+/////////////////////////////////////////////////
+void OpenALSource::Stop()
+{
+  int sourceState;
+  alGetSourcei(this->alSource, AL_SOURCE_STATE, &sourceState);
+
+  // Stop the source if it is not already stopped
+  if (sourceState != AL_STOPPED)
+    alSourceStop(this->alSource);
+}
+
+/////////////////////////////////////////////////
+void OpenALSource::Rewind()
+{
+  alSourceRewind(this->alSource);
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::IsPlaying()
+{
+  int sourceState;
+  alGetSourcei(this->alSource, AL_SOURCE_STATE, &sourceState);
+
+  return sourceState == AL_PLAYING;
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::FillBufferFromPCM(uint8_t *_pcmData,
+    unsigned int _dataCount, int _sampleRate)
+{
+  // First detach the buffer
+  alSourcei(this->alSource, AL_BUFFER, 0);
+
+  // Copy raw buffer into AL buffer
+  // AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8,
+  // AL_FORMAT_STEREO16
+  alBufferData(this->alBuffer, AL_FORMAT_MONO16, _pcmData, _dataCount,
+      _sampleRate);
+
+  // Attach buffer to source
+  alSourcei(this->alSource, AL_BUFFER, this->alBuffer);
+
+  if (alGetError() != AL_NO_ERROR)
+  {
+    gzerr << "Unable to copy audio data into openAL buffer.\n";
+    return false;
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+void OpenALSource::FillBufferFromFile(const std::string &_audioFile)
+{
+  std::string fullPathAudioFile = common::find_file(_audioFile);
+
+  // Try to open the audio file in the current directory
+  FILE *testFile = fopen(fullPathAudioFile.c_str(), "r");
+
+  // If the audio file couldn't be opened, try the gazebo paths
+  if (testFile == NULL)
+  {
+    gzerr << "Unable to open audio file[" << _audioFile << "]\n";
+  }
+
+  uint8_t *dataBuffer = NULL;
+
+#ifdef HAVE_FFMPEG
+  unsigned int dataBufferSize;
+  // Create an audio decoder
+  common::AudioDecoder audioDecoder;
+
+  // Set the audio file to decode
+  audioDecoder.SetFile(fullPathAudioFile);
+  audioDecoder.Decode(&dataBuffer, &dataBufferSize);
+
+  // Copy raw buffer into AL buffer
+  // AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8,
+  // AL_FORMAT_STEREO16
+  this->FillBufferFromPCM(dataBuffer, dataBufferSize,
+      audioDecoder.GetSampleRate());
+
+#else
+  std::cerr << "No FFMPEG audio decoder. Missing FFMPEG libraries.\n";
+#endif
+
+  if (dataBuffer)
+    delete [] dataBuffer;
+
+  fclose(testFile);
+}
+
+/////////////////////////////////////////////////
+bool OpenALSource::HasCollisionName(const std::string &_name) const
+{
+  for (std::vector<std::string>::const_iterator iter =
+      this->collisionNames.begin(); iter != this->collisionNames.end(); ++iter)
+  {
+    if (*iter  == _name)
+      return true;
+  }
+
+  return false;
+}
+#endif
diff --git a/gazebo/util/OpenAL.hh b/gazebo/util/OpenAL.hh
new file mode 100644
index 0000000..7e47185
--- /dev/null
+++ b/gazebo/util/OpenAL.hh
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_OPENAL_HH_
+#define _GAZEBO_OPENAL_HH_
+
+#include <string>
+#include <vector>
+#include <sdf/sdf.hh>
+
+#include "gazebo/math/Vector3.hh"
+#include "gazebo/math/Pose.hh"
+#include "gazebo/common/SingletonT.hh"
+#include "gazebo/util/UtilTypes.hh"
+
+#include "gazebo/gazebo_config.h"
+#include "gazebo/util/system.hh"
+
+#ifdef HAVE_OPENAL
+
+struct ALCcontext_struct;
+struct ALCdevice_struct;
+
+namespace gazebo
+{
+  namespace util
+  {
+    class OpenALIface;
+    class OpenALSource;
+    class OpenALSink;
+
+    /// \addtogroup gazebo_util Utility
+    /// \{
+
+    /// \class OpenAL OpenAL.hh util/util.hh
+    /// \brief 3D audio setup and playback.
+    class GAZEBO_VISIBLE OpenAL : public SingletonT<OpenAL>
+    {
+      /// \brief Constructor
+      private: OpenAL();
+
+      /// \brief Destructor
+      private: virtual ~OpenAL();
+
+      /// \brief Load the OpenAL server.
+      /// \return True on success.
+      public: bool Load(sdf::ElementPtr _sdf = sdf::ElementPtr());
+
+      /// \brief Finalize.
+      public: void Fini();
+
+      /// \brief Create an OpenALSource object.
+      /// \param[in] _sdf SDF element parameters for an audio_source.
+      /// \return A pointer to an OpenALSource object.
+      public: OpenALSourcePtr CreateSource(sdf::ElementPtr _sdf);
+
+      /// \brief Create an audio listener. Currenly, only one listener may be
+      /// created.
+      /// \param[in] _sdf SDF element parameters for an audio_source.
+      /// \return A pointer to an OpenALSink object.
+      public: OpenALSinkPtr CreateSink(sdf::ElementPtr _sdf);
+
+      /// \brief OpenAL audio context pointer.
+      private: ALCcontext_struct *context;
+
+      /// \brief OpenAL audio device pointer.
+      private: ALCdevice_struct *audioDevice;
+
+      /// \brief OpenAL sink pointer.
+      private: OpenALSinkPtr sink;
+
+      /// \brief This is a singleton
+      private: friend class SingletonT<OpenAL>;
+    };
+
+    /// \class OpenALSink OpenALSink.hh util/util.hh
+    /// \brief OpenAL Listener. This can be thought of as a microphone.
+    class GAZEBO_VISIBLE OpenALSink
+    {
+      /// \brief Constructor
+      public: OpenALSink();
+
+      /// \brief Destructor
+      public: virtual ~OpenALSink();
+
+      /// \brief Set the position of the sink.
+      /// \param[in] _pose New pose of the sink.
+      /// \return True on success.
+      public: bool SetPose(const math::Pose &_pose);
+
+      /// \brief Set the velocity of the sink
+      /// \param[in] _vel Velocity of the sink.
+      /// \return True on success.
+      public: bool SetVelocity(const math::Vector3 &_vel);
+    };
+
+    /// \class OpenALSource OpenALSource.hh util/util.hh
+    /// \brief OpenAL Source. This can be thought of as a speaker.
+    class GAZEBO_VISIBLE OpenALSource
+    {
+      /// \brief Constructor.
+      public: OpenALSource();
+
+      /// \brief Destructor.
+      public: virtual ~OpenALSource();
+
+      /// \brief Load the source from sdf.
+      /// \param[in] _sdf SDF element parameters for an audio_source.
+      /// \return True on success.
+      public: bool Load(sdf::ElementPtr _sdf);
+
+      /// \brief Set the position of the source.
+      /// \param[in] _pose New pose of the source.
+      /// \return True on success.
+      public: bool SetPose(const math::Pose &_pose);
+
+      /// \brief Set the velocity of the source.
+      /// \param[in] _vel New velocity of the source.
+      /// \return True on success.
+      public: bool SetVelocity(const math::Vector3 &_vel);
+
+      /// \brief Set the pitch of the source.
+      /// \param[in] _p Pitch value.
+      /// \return True on success.
+      public: bool SetPitch(float _p);
+
+      /// \brief Set the pitch of the source.
+      /// \param[in] _g Gain value.
+      /// \return True on success.
+      public: bool SetGain(float _g);
+
+      /// \brief Set whether the source loops the audio.
+      /// \param[in] _state True to cause playback to loop.
+      /// \return True on success.
+      public: bool SetLoop(bool _state);
+
+      /// \brief Return true if the audio source is played on contact with
+      /// another object. Contact is determine based on a set of
+      /// collision objects.
+      /// \return True if audio is played on contact.
+      /// \sa AddCollision()
+      public: bool GetOnContact() const;
+
+      /// \brief Get a vector of all the collision names.
+      /// \return All the collision names used to trigger audio playback on
+      /// contact.
+      public: std::vector<std::string> GetCollisionNames() const;
+
+      /// \brief Get whether the source has a collision name set.
+      /// \param[in] _name Name of a collision to check for.
+      /// \return True if the collision name was found.
+      public: bool HasCollisionName(const std::string &_name) const;
+
+      /// \brief Play a sound
+      public: void Play();
+
+      /// \brief Pause a sound
+      public: void Pause();
+
+      /// \brief Stop a sound
+      public: void Stop();
+
+      /// \brief Rewind the sound to the beginning
+      public: void Rewind();
+
+      /// \brief Is the audio playing
+      public: bool IsPlaying();
+
+      /// \brief Fill the OpenAL audio buffer from PCM data
+      /// \param[in] _pcmData Pointer to the PCM audio data.
+      /// \param[in] _dataCount Size of the PCM data.
+      /// \param[in] _sampleRate Sample rate for the PCM data.
+      /// \return True on success.
+      public: bool FillBufferFromPCM(uint8_t *_pcmData, unsigned int _dataCount,
+                                     int _sampleRate);
+
+      /// \brief Fill the OpenAL audio buffer with data from a sound file.
+      /// \param[in] _audioFile Name and an audio file.
+      public: void FillBufferFromFile(const std::string &_audioFile);
+
+      /// \brief OpenAL source index.
+      private: unsigned int alSource;
+
+      /// \brief OpenAL buffer index.
+      private: unsigned int alBuffer;
+
+      /// \brief Names of collision objects that should trigger audio
+      /// playback.
+      private: std::vector<std::string> collisionNames;
+    };
+    /// \}
+  }
+}
+#endif
+#endif
diff --git a/gazebo/util/OpenAL_TEST.cc b/gazebo/util/OpenAL_TEST.cc
new file mode 100644
index 0000000..48d116e
--- /dev/null
+++ b/gazebo/util/OpenAL_TEST.cc
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/filesystem.hpp>
+#include <gtest/gtest.h>
+#include <sdf/sdf.hh>
+
+#include "test_config.h"
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/util/OpenAL.hh"
+#include "gazebo/gazebo_config.h"
+#include "test/util.hh"
+
+using namespace gazebo;
+
+class OpenAL : public gazebo::testing::AutoLogFixture { };
+
+#ifdef HAVE_OPENAL
+/////////////////////////////////////////////////
+TEST_F(OpenAL, SourceInvalid)
+{
+  common::load();
+  util::OpenALSourcePtr source;
+  EXPECT_EQ(util::OpenAL::Instance()->CreateSource(sdf::ElementPtr()), source);
+
+  ASSERT_NO_THROW(util::OpenAL::Instance()->Fini());
+}
+/////////////////////////////////////////////////
+TEST_F(OpenAL, DefaultDevice)
+{
+  common::load();
+
+  sdf::SDFPtr sdf(new sdf::SDF);
+  sdf::initFile("world.sdf", sdf->root);
+
+  std::string sdfString = "<sdf version='1.4'>"
+    "<world name='default'>"
+    "<audio>"
+    "<device>default</device>"
+    "</device>"
+    "</world>"
+    "</sdf>";
+
+  EXPECT_TRUE(sdf::readString(sdfString, sdf->root));
+
+  EXPECT_TRUE(util::OpenAL::Instance()->Load(sdf->root));
+  EXPECT_TRUE(util::OpenAL::Instance()->Load(sdf->root->GetElement("audio")));
+}
+
+/////////////////////////////////////////////////
+TEST_F(OpenAL, NonDefaultDevice)
+{
+  common::load();
+
+  sdf::SDFPtr sdf(new sdf::SDF);
+  sdf::initFile("world.sdf", sdf->root);
+
+  std::string sdfString = "<sdf version='1.4'>"
+    "<world name='default'>"
+    "<audio>"
+    "<device>garbage</device>"
+    "</device>"
+    "</world>"
+    "</sdf>";
+
+  EXPECT_TRUE(sdf::readString(sdfString, sdf->root));
+
+  EXPECT_FALSE(util::OpenAL::Instance()->Load(sdf->root->GetElement("audio")));
+}
+
+/////////////////////////////////////////////////
+TEST_F(OpenAL, BadSDF)
+{
+  common::load();
+  util::OpenALSourcePtr source;
+  EXPECT_TRUE(util::OpenAL::Instance()->Load());
+
+  // NULL SDF
+  EXPECT_EQ(util::OpenAL::Instance()->CreateSource(sdf::ElementPtr()), source);
+
+  sdf::SDFPtr sdf(new sdf::SDF);
+  // Bad SDF
+  EXPECT_EQ(util::OpenAL::Instance()->CreateSource(sdf->root), source);
+
+  ASSERT_NO_THROW(util::OpenAL::Instance()->Fini());
+}
+
+/////////////////////////////////////////////////
+TEST_F(OpenAL, BadValues)
+{
+  common::load();
+
+  EXPECT_TRUE(util::OpenAL::Instance()->Load());
+
+  util::OpenALSourcePtr source;
+
+  sdf::SDFPtr sdf(new sdf::SDF);
+  sdf::initFile("audio_source.sdf", sdf->root);
+
+  std::string sdfString = "<sdf version='1.4'>"
+    "<audio_source>"
+    "<uri>file://media/audio/cheer.wav</uri>"
+    "<pitch>2.0</pitch>"
+    "<gain>1.0</gain>"
+    "<loop>true</loop>"
+    "</audio_source>"
+    "</sdf>";
+
+  EXPECT_TRUE(sdf::readString(sdfString, sdf->root));
+
+  source = util::OpenAL::Instance()->CreateSource(sdf->root);
+  EXPECT_TRUE(source != NULL);
+
+  ASSERT_NO_THROW(util::OpenAL::Instance()->Fini());
+
+  EXPECT_FALSE(source->SetPitch(0));
+  EXPECT_FALSE(source->SetGain(-1));
+  EXPECT_FALSE(source->SetLoop(false));
+
+  EXPECT_FALSE(source->HasCollisionName("name2"));
+}
+
+/////////////////////////////////////////////////
+TEST_F(OpenAL, SourcePlay)
+{
+  util::OpenALSourcePtr source;
+  common::load();
+
+  EXPECT_TRUE(util::OpenAL::Instance()->Load());
+
+  sdf::SDFPtr sdf(new sdf::SDF);
+  sdf::initFile("audio_source.sdf", sdf->root);
+
+  std::string sdfString = "<sdf version='1.4'>"
+    "<audio_source>"
+    "<uri>file://media/audio/cheer.wav</uri>"
+    "<pitch>2.0</pitch>"
+    "<gain>1.0</gain>"
+    "<loop>true</loop>"
+    "<contact><collision>name</collision><collision>name2</collision></contact>"
+    "</audio_source>"
+    "</sdf>";
+
+
+  EXPECT_TRUE(sdf::readString(sdfString, sdf->root));
+
+  source = util::OpenAL::Instance()->CreateSource(sdf->root);
+  EXPECT_TRUE(source != NULL);
+
+  EXPECT_TRUE(source->GetOnContact());
+
+  EXPECT_EQ(source->GetCollisionNames().size(), 2u);
+  EXPECT_EQ(source->GetCollisionNames()[0], "name");
+  EXPECT_EQ(source->GetCollisionNames()[1], "name2");
+  EXPECT_TRUE(source->HasCollisionName("name2"));
+  EXPECT_TRUE(source->HasCollisionName("name"));
+
+  EXPECT_NO_THROW(source->Play());
+  EXPECT_TRUE(source->IsPlaying());
+  EXPECT_NO_THROW(source->Play());
+  EXPECT_TRUE(source->IsPlaying());
+
+  EXPECT_NO_THROW(source->Rewind());
+
+  EXPECT_NO_THROW(source->Play());
+  EXPECT_TRUE(source->IsPlaying());
+
+  EXPECT_NO_THROW(source->Pause());
+  EXPECT_FALSE(source->IsPlaying());
+  EXPECT_NO_THROW(source->Pause());
+  EXPECT_FALSE(source->IsPlaying());
+
+  EXPECT_NO_THROW(source->Play());
+  EXPECT_TRUE(source->IsPlaying());
+  EXPECT_NO_THROW(source->Stop());
+  EXPECT_FALSE(source->IsPlaying());
+  EXPECT_NO_THROW(source->Stop());
+  EXPECT_FALSE(source->IsPlaying());
+
+  EXPECT_NO_THROW(source->Rewind());
+
+  EXPECT_NO_THROW(source->Play());
+  EXPECT_TRUE(source->IsPlaying());
+
+  ASSERT_NO_THROW(util::OpenAL::Instance()->Fini());
+}
+
+/////////////////////////////////////////////////
+TEST_F(OpenAL, SourceVelPose)
+{
+  util::OpenALSourcePtr source;
+  common::load();
+
+  sdf::SDFPtr sdf(new sdf::SDF);
+  sdf::initFile("audio_source.sdf", sdf->root);
+
+  std::string sdfString = "<sdf version='1.4'>"
+    "<audio_source>"
+    "<uri>file://media/audio/cheer.wav</uri>"
+    "<pitch>2.0</pitch>"
+    "<gain>1.0</gain>"
+    "<loop>true</loop>"
+    "</audio_source>"
+    "</sdf>";
+
+  EXPECT_TRUE(sdf::readString(sdfString, sdf->root));
+
+  EXPECT_TRUE(util::OpenAL::Instance()->Load());
+  source = util::OpenAL::Instance()->CreateSource(sdf->root);
+  EXPECT_TRUE(source != NULL);
+
+  EXPECT_FALSE(source->GetOnContact());
+  EXPECT_TRUE(source->SetVelocity(math::Vector3(1, 1, 1)));
+  EXPECT_TRUE(source->SetPose(math::Pose(1, 1, 1, 0, 0, 0)));
+}
+
+/////////////////////////////////////////////////
+TEST_F(OpenAL, Sourcevalid)
+{
+  common::load();
+
+  EXPECT_TRUE(util::OpenAL::Instance()->Load());
+
+  // Has pitch, gain, loop, contact
+  {
+    sdf::SDFPtr sdf(new sdf::SDF);
+    sdf::initFile("audio_source.sdf", sdf->root);
+
+    std::string sdfString = "<sdf version='1.4'>"
+      "<audio_source>"
+      "<uri>file://media/audio/cheer.wav</uri>"
+      "<pitch>2.0</pitch>"
+      "<gain>1.0</gain>"
+      "<loop>true</loop>"
+      "<contact>true</contact>"
+      "</audio_source>"
+      "</sdf>";
+
+    EXPECT_TRUE(sdf::readString(sdfString, sdf->root));
+
+    EXPECT_TRUE(util::OpenAL::Instance()->CreateSource(sdf->root));
+  }
+
+  // No Pitch, gain, loop, contact
+  {
+    sdf::SDFPtr sdf(new sdf::SDF);
+    sdf::initFile("audio_source.sdf", sdf->root);
+
+    std::string sdfString = "<sdf version='1.4'>"
+      "<audio_source>"
+      "<uri>file://media/audio/cheer.wav</uri>"
+      "</audio_source>"
+      "</sdf>";
+
+    EXPECT_TRUE(sdf::readString(sdfString, sdf->root));
+
+    EXPECT_TRUE(util::OpenAL::Instance()->CreateSource(sdf->root));
+  }
+
+  ASSERT_NO_THROW(util::OpenAL::Instance()->Fini());
+
+  // Calling Fini twice shouldn't cause a problem
+  ASSERT_NO_THROW(util::OpenAL::Instance()->Fini());
+}
+
+/////////////////////////////////////////////////
+TEST_F(OpenAL, SinkCreate)
+{
+  util::OpenALSinkPtr sink1;
+  util::OpenALSinkPtr sink2;
+  common::load();
+
+  sink1 = util::OpenAL::Instance()->CreateSink(sdf::ElementPtr());
+  sink2 = util::OpenAL::Instance()->CreateSink(sdf::ElementPtr());
+
+  EXPECT_TRUE(sink1 != NULL);
+  EXPECT_TRUE(sink2 == NULL);
+
+  EXPECT_NO_THROW(util::OpenAL::Instance()->Fini());
+  EXPECT_NO_THROW(sink1.reset());
+}
+
+/////////////////////////////////////////////////
+TEST_F(OpenAL, SinkVelPose)
+{
+  util::OpenALSinkPtr sink;
+  common::load();
+
+  sink = util::OpenAL::Instance()->CreateSink(sdf::ElementPtr());
+  EXPECT_TRUE(sink != NULL);
+
+  EXPECT_FALSE(sink->SetVelocity(math::Vector3(1, 1, 1)));
+  EXPECT_FALSE(sink->SetPose(math::Pose(1, 1, 1, 0, 0, 0)));
+
+  EXPECT_TRUE(util::OpenAL::Instance()->Load());
+  EXPECT_TRUE(sink->SetVelocity(math::Vector3(1, 1, 1)));
+  EXPECT_TRUE(sink->SetPose(math::Pose(1, 1, 1, 0, 0, 0)));
+}
+#endif
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/gazebo/util/UtilTypes.hh b/gazebo/util/UtilTypes.hh
index 08bddc2..658e24e 100644
--- a/gazebo/util/UtilTypes.hh
+++ b/gazebo/util/UtilTypes.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define _GAZEBO_UTIL_TYPES_HH_
 
 #include <boost/shared_ptr.hpp>
+#include "gazebo/util/system.hh"
 
 /// \file
 /// \ingroup gazebo_util
@@ -29,10 +30,20 @@ namespace gazebo
   namespace util
   {
     class DiagnosticTimer;
+    class OpenALSink;
+    class OpenALSource;
 
     /// \def DiagnosticTimerPtr
     /// \brief boost::shared_ptr to a DiagnosticTimer class
     typedef boost::shared_ptr<DiagnosticTimer> DiagnosticTimerPtr;
+
+    /// \def OpenALSinkPtr
+    /// \brief boost::shared_ptr to a OpenALSink class
+    typedef boost::shared_ptr<OpenALSink> OpenALSinkPtr;
+
+    /// \def OpenALSourcePtr
+    /// \brief boost::shared_ptr to a OpenALSource class
+    typedef boost::shared_ptr<OpenALSource> OpenALSourcePtr;
   }
 }
 /// \}
diff --git a/gazebo/util/system.hh b/gazebo/util/system.hh
new file mode 100644
index 0000000..b5e06e0
--- /dev/null
+++ b/gazebo/util/system.hh
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_VISIBLE_HH_
+#define _GAZEBO_VISIBLE_HH_
+
+/** \def GAZEBO_VISIBLE
+ * Use to represent "symbol visible" if supported
+ */
+
+/** \def GAZEBO_HIDDEN
+ * Use to represent "symbol hidden" if supported
+ */
+
+#if defined _WIN32 || defined __CYGWIN__
+  #ifdef BUILDING_DLL
+    #ifdef __GNUC__
+      #define GAZEBO_VISIBLE __attribute__ ((dllexport))
+    #else
+      #define GAZEBO_VISIBLE __declspec(dllexport)
+    #endif
+  #else
+    #ifdef __GNUC__
+      #define GAZEBO_VISIBLE __attribute__ ((dllimport))
+    #else
+      #define GAZEBO_VISIBLE __declspec(dllimport)
+    #endif
+  #endif
+  #define GAZEBO_HIDDEN
+#else
+  #if __GNUC__ >= 4
+    #define GAZEBO_VISIBLE __attribute__ ((visibility ("default")))
+    #define GAZEBO_HIDDEN  __attribute__ ((visibility ("hidden")))
+  #else
+    #define GAZEBO_VISIBLE
+    #define GAZEBO_HIDDEN
+  #endif
+#endif
+
+#endif /* GAZEBO_VISIBLE_HH */
diff --git a/interfaces/player/ActarrayInterface.cc b/interfaces/player/ActarrayInterface.cc
index 3d7fc15..a347190 100644
--- a/interfaces/player/ActarrayInterface.cc
+++ b/interfaces/player/ActarrayInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/ActarrayInterface.hh b/interfaces/player/ActarrayInterface.hh
index ac68631..dae05b7 100644
--- a/interfaces/player/ActarrayInterface.hh
+++ b/interfaces/player/ActarrayInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,10 +25,11 @@
 #include <string>
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
-  class recursive_mutex;
+  class GAZEBO_VISIBLE recursive_mutex;
 }
 
 namespace libgazebo
@@ -38,10 +39,10 @@ namespace libgazebo
 /// \defgroup actarray_player Actarray Interface
 /// \brief Interface for controller an actuator array
 /// \{
-  class ActarrayIface;
+  class GAZEBO_VISIBLE ActarrayIface;
 
   /// \brief Actarray interface
-  class ActarrayInterface : public GazeboInterface
+  class GAZEBO_VISIBLE ActarrayInterface : public GazeboInterface
   {
     /// \brief Constructor
     public: ActarrayInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/BumperInterface.cc b/interfaces/player/BumperInterface.cc
index 72372aa..4a82e91 100644
--- a/interfaces/player/BumperInterface.cc
+++ b/interfaces/player/BumperInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/BumperInterface.hh b/interfaces/player/BumperInterface.hh
index f73e399..a851484 100644
--- a/interfaces/player/BumperInterface.hh
+++ b/interfaces/player/BumperInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #define BUMPERINTERFACE_HH
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
@@ -39,7 +40,7 @@ namespace libgazebo
   class BumperIface;
 
   /// \brief Bumper interface
-  class BumperInterface : public GazeboInterface
+  class GAZEBO_VISIBLE BumperInterface : public GazeboInterface
   {
     /// \brief Constructor
     public: BumperInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/CMakeLists.txt b/interfaces/player/CMakeLists.txt
index 60c94cc..e8ab425 100644
--- a/interfaces/player/CMakeLists.txt
+++ b/interfaces/player/CMakeLists.txt
@@ -18,14 +18,17 @@ set (sources GazeboDriver.cc
              #ImuInterface.cc
 
 include_directories( 
+  ${SDF_INCLUDE_DIRS} 
   ${PLAYER_INCLUDE_DIRS} 
-  ${PROJECT_SOURCE_DIR}/gazebo 
-  ${PROJECT_BINARY_DIR}/gazebo 
   ${OPENGL_INCLUDE_DIR}
   ${OGRE_INCLUDE_DIRS}
   ${Boost_INCLUDE_DIRS}
 )
 
+link_directories( 
+  ${SDF_LIBRARY_DIRS} 
+)
+
 link_directories(${PLAYER_LINK_DIRS} ${Boost_LIBRARY_DIRS})
 
 gz_add_library(gazebo_player ${sources})
@@ -35,6 +38,7 @@ gazebo_common
 gazebo_transport
 gazebo_msgs
 gazebo_math
+gazebo_util
 )
 
 gz_install_library(gazebo_player)
diff --git a/interfaces/player/CameraInterface.cc b/interfaces/player/CameraInterface.cc
index 837c7c0..59b9179 100644
--- a/interfaces/player/CameraInterface.cc
+++ b/interfaces/player/CameraInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -128,34 +128,34 @@ void CameraInterface::Unsubscribe()
 }
 
 /////////////////////////////////////////////////
-void CameraInterface::SaveFrame(const char * /*filename*/) const
-{
-  /*
-  int width, height;
-  FILE *file;
-
-  file = fopen(filename, "w+");
-  if (!file)
-    return;
-
-  width = this->data.width;
-  height = this->data.height;
-
-  int pixelSize = 3;
-  int rowSize = width * pixelSize;
-
-  if (this->data.format == PLAYER_CAMERA_FORMAT_RGB888)
-  {
-    // Write ppm
-    fprintf(file, "P6\n%d %d\n%d\n", width, height, 255);
-    for (int i = 0; i < height; i++)
-      fwrite(this->data.image + i * rowSize, rowSize, 1, file);
-  }
-  else
-  {
-    PLAYER_WARN("unsupported format for saving");
-  }
-
-  fclose(file);
-  */
-}
+// void CameraInterface::SaveFrame(const char * /*filename*/) const
+// {
+//   /*
+//   int width, height;
+//   FILE *file;
+//
+//   file = fopen(filename, "w+");
+//   if (!file)
+//     return;
+//
+//   width = this->data.width;
+//   height = this->data.height;
+//
+//   int pixelSize = 3;
+//   int rowSize = width * pixelSize;
+//
+//   if (this->data.format == PLAYER_CAMERA_FORMAT_RGB888)
+//   {
+//     // Write ppm
+//     fprintf(file, "P6\n%d %d\n%d\n", width, height, 255);
+//     for (int i = 0; i < height; i++)
+//       fwrite(this->data.image + i * rowSize, rowSize, 1, file);
+//   }
+//   else
+//   {
+//     PLAYER_WARN("unsupported format for saving");
+//   }
+//
+//   fclose(file);
+//   */
+// }
diff --git a/interfaces/player/CameraInterface.hh b/interfaces/player/CameraInterface.hh
index da44c0b..bb04a2a 100644
--- a/interfaces/player/CameraInterface.hh
+++ b/interfaces/player/CameraInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #define CAMERAINTERFACE_HH
 
 #include <string>
+#include "gazebo/util/system.hh"
 #include "GazeboInterface.hh"
 
 /// \addtogroup player_iface
@@ -31,7 +32,7 @@
 /// \brief Camera interface
 /// \{
 /// \brief Camera interface
-class CameraInterface : public GazeboInterface
+class GAZEBO_VISIBLE CameraInterface : public GazeboInterface
 {
   /// \brief Constructor
   public: CameraInterface(player_devaddr_t _addr, GazeboDriver *_driver,
@@ -58,7 +59,8 @@ class CameraInterface : public GazeboInterface
   private: void OnImage(ConstImageStampedPtr &_msg);
 
   /// Save a camera frame
-  private: void SaveFrame(const char *filename) const;
+  /// This function is commented out because it's not used.
+  /// private: void SaveFrame(const char *filename) const;
 
   /// \brief Gazebo id. This needs to match and ID in a Gazebo WorldFile
   private: std::string cameraName;
diff --git a/interfaces/player/FiducialInterface.cc b/interfaces/player/FiducialInterface.cc
index eadbd52..0809982 100644
--- a/interfaces/player/FiducialInterface.cc
+++ b/interfaces/player/FiducialInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/FiducialInterface.hh b/interfaces/player/FiducialInterface.hh
index a5f1891..9cc06b7 100644
--- a/interfaces/player/FiducialInterface.hh
+++ b/interfaces/player/FiducialInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,10 +23,11 @@
 #define FIDUCIALINTERFACE_HH
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
-  class recursive_mutex;
+  class GAZEBO_VISIBLE recursive_mutex;
 }
 
 namespace libgazebo
@@ -37,10 +38,10 @@ namespace libgazebo
 /// \brief Plugin Player interface for Gazebo fiducials
 /// \{
   // Forward declarations
-  class FiducialIface;
+  class GAZEBO_VISIBLE FiducialIface;
 
   /// \brief Plugin Player interface for Gazebo fiducials
-  class FiducialInterface : public GazeboInterface
+  class GAZEBO_VISIBLE FiducialInterface : public GazeboInterface
   {
     /// \brief Constructor
     /// \param addr Plaer device address
diff --git a/interfaces/player/GazeboClient.cc b/interfaces/player/GazeboClient.cc
index 12b0e6e..b2e8acc 100644
--- a/interfaces/player/GazeboClient.cc
+++ b/interfaces/player/GazeboClient.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/GazeboClient.hh b/interfaces/player/GazeboClient.hh
index 5b809bf..8ea3a32 100644
--- a/interfaces/player/GazeboClient.hh
+++ b/interfaces/player/GazeboClient.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,8 @@
 
 #include <string>
 
+#include "gazebo/util/system.hh"
+
 /// \addtogroup player
 /// \brief Gazebo client handler
 /// \{
@@ -33,7 +35,7 @@
 /// This class handles the Gazebo client object, and acts as a shared
 /// data-structure for all Gazebo related drivers.  Note that there
 /// can only be one instance of this class (it is entirely static).
-class GazeboClient
+class GAZEBO_VISIBLE GazeboClient
 {
   /// \brief Initialize
   public: static void Init(int _serverid, const std::string &_worldName);
diff --git a/interfaces/player/GazeboDriver.cc b/interfaces/player/GazeboDriver.cc
index 806971a..c5a8fc6 100644
--- a/interfaces/player/GazeboDriver.cc
+++ b/interfaces/player/GazeboDriver.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -70,16 +70,6 @@ void GazeboDriver_Register(DriverTable *_table)
   // TODO: Fix the PACKAGE_VERSION
   // printf("\n ** Gazebo plugin v%s **", PACKAGE_VERSION);
 
-  if (!player_quiet_startup)
-  {
-    puts("\n * Part of the Player/Stage Project "
-          "[http://playerstage.sourceforge.net]\n"
-          " * Copyright 2000-2006 Richard Vaughan, Andrew Howard, "
-          "Brian Gerkey, Nathan Koenig\n"
-          " * and contributors. Released under the GNU General Public"
-          " License v2.");
-  }
-
   _table->AddDriver(const_cast<char*>("gazebo"), GazeboDriver_Init);
 }
 
@@ -190,13 +180,12 @@ int GazeboDriver::Unsubscribe(player_devaddr_t addr)
 void GazeboDriver::Update()
 {
   int i;
-  GazeboInterface *iface;
 
   Driver::ProcessMessages();
 
   for (i = 0; i < this->deviceCount; i++)
   {
-    iface = this->devices[i];
+    GazeboInterface *iface = this->devices[i];
     iface->Update();
   }
 
@@ -371,11 +360,10 @@ int GazeboDriver::LoadDevices(ConfigFile *_cf, int _section)
 GazeboInterface *GazeboDriver::LookupDevice(player_devaddr_t _addr)
 {
   int i;
-  GazeboInterface *iface = NULL;
 
   for (i = 0; i < static_cast<int>(this->deviceCount); ++i)
   {
-    iface = static_cast<GazeboInterface*>(this->devices[i]);
+    GazeboInterface *iface = static_cast<GazeboInterface*>(this->devices[i]);
 
     if (iface->device_addr.robot == _addr.robot &&
         iface->device_addr.interf == _addr.interf &&
diff --git a/interfaces/player/GazeboDriver.hh b/interfaces/player/GazeboDriver.hh
index 8240666..7488a97 100644
--- a/interfaces/player/GazeboDriver.hh
+++ b/interfaces/player/GazeboDriver.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
 #include <string.h>
 
 #include "player.h"
+#include "gazebo/util/system.hh"
 
 /// \addtogroup player
 /// \brief Gazebo player driver
@@ -34,7 +35,7 @@
 class GazeboInterface;
 
 /// \brief Gazebo player driver
-class GazeboDriver : public Driver
+class GAZEBO_VISIBLE GazeboDriver : public Driver
 {
   /// \brief Constructor
   public: GazeboDriver(ConfigFile *_cf, int _section);
diff --git a/interfaces/player/GazeboInterface.cc b/interfaces/player/GazeboInterface.cc
index f4118f3..4eb7313 100644
--- a/interfaces/player/GazeboInterface.cc
+++ b/interfaces/player/GazeboInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/GazeboInterface.hh b/interfaces/player/GazeboInterface.hh
index 17935a9..5d6df91 100644
--- a/interfaces/player/GazeboInterface.hh
+++ b/interfaces/player/GazeboInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,7 +24,8 @@
 
 #include <string>
 #include "player.h"
-#include "transport/TransportTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 
 /// \addtogroup player
 /// \brief Base class for all the player interfaces
@@ -33,7 +34,7 @@
 class GazeboDriver;
 
 /// \brief Base class for all the player interfaces
-class GazeboInterface
+class GAZEBO_VISIBLE GazeboInterface
 {
   /// \brief Constructor
   public: GazeboInterface(player_devaddr_t _addr, GazeboDriver *_driver,
diff --git a/interfaces/player/GazeboTime.cc b/interfaces/player/GazeboTime.cc
index 5c15f2c..92d9bc7 100644
--- a/interfaces/player/GazeboTime.cc
+++ b/interfaces/player/GazeboTime.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/GazeboTime.hh b/interfaces/player/GazeboTime.hh
index 2f596ad..a93e5fc 100644
--- a/interfaces/player/GazeboTime.hh
+++ b/interfaces/player/GazeboTime.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,12 +27,13 @@
 #include "gazebo/common/CommonTypes.hh"
 #include "gazebo/transport/TransportTypes.hh"
 #include "gazebo/msgs/msgs.hh"
+#include "gazebo/util/system.hh"
 
 /// \addtogroup player
 /// \brief Gazebo player driver
 /// \{
   /// \brief Gazebo access to PlayerTime
-class GazeboTime : public PlayerTime
+class GAZEBO_VISIBLE GazeboTime : public PlayerTime
 {
   /// \brief Constructor
   public: GazeboTime();
diff --git a/interfaces/player/GpsInterface.cc b/interfaces/player/GpsInterface.cc
index a7460d8..d0bfdba 100644
--- a/interfaces/player/GpsInterface.cc
+++ b/interfaces/player/GpsInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/GpsInterface.hh b/interfaces/player/GpsInterface.hh
index 0622bce..3361f3d 100644
--- a/interfaces/player/GpsInterface.hh
+++ b/interfaces/player/GpsInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #define GPSINTERFACE_HH
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
@@ -34,7 +35,7 @@ namespace boost
 typedef struct gz_gps gz_gps_t;
 
 /// \brief GPS interface
-class GpsInterface : public GazeboInterface
+class GAZEBO_VISIBLE GpsInterface : public GazeboInterface
 {
   /// @brief Constructor
   public: GpsInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/Graphics3dInterface.cc b/interfaces/player/Graphics3dInterface.cc
index 75c834c..bbc6673 100644
--- a/interfaces/player/Graphics3dInterface.cc
+++ b/interfaces/player/Graphics3dInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/Graphics3dInterface.hh b/interfaces/player/Graphics3dInterface.hh
index 1079c04..dbe6b19 100644
--- a/interfaces/player/Graphics3dInterface.hh
+++ b/interfaces/player/Graphics3dInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,19 +23,20 @@
 #define GRAPHICS3DINTERFACE_HH
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
-  class recursive_mutex;
+  class GAZEBO_VISIBLE recursive_mutex;
 }
 
 namespace libgazebo
 {
   // Forward declarations
-  class Graphics3dIface;
+  class GAZEBO_VISIBLE Graphics3dIface;
 
   /// \brief Graphics3d interface
-  class Graphics3dInterface : public GazeboInterface
+  class GAZEBO_VISIBLE Graphics3dInterface : public GazeboInterface
   {
     /// \brief Constructor
     public: Graphics3dInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/GripperInterface.cc b/interfaces/player/GripperInterface.cc
index 7d9cbe1..8eff97a 100644
--- a/interfaces/player/GripperInterface.cc
+++ b/interfaces/player/GripperInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/GripperInterface.hh b/interfaces/player/GripperInterface.hh
index 6470e3d..2e0ae1f 100644
--- a/interfaces/player/GripperInterface.hh
+++ b/interfaces/player/GripperInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,10 +23,11 @@
 #define GRIPPERINTERFACE_HH
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
-  class recursive_mutex;
+  class GAZEBO_VISIBLE recursive_mutex;
 }
 
 namespace libgazebo
@@ -36,10 +37,10 @@ namespace libgazebo
   /// \defgroup gripper_player Gripper Interface
   /// \brief Gripper Player interface
   /// \{
-  class GripperIface;
+  class GAZEBO_VISIBLE GripperIface;
 
   /// \brief Gripper interface
-  class GripperInterface : public GazeboInterface
+  class GAZEBO_VISIBLE GripperInterface : public GazeboInterface
   {
     /// \brief Constructor
     public: GripperInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/IRInterface.cc b/interfaces/player/IRInterface.cc
index d786d22..1ad6ea1 100644
--- a/interfaces/player/IRInterface.cc
+++ b/interfaces/player/IRInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/IRInterface.hh b/interfaces/player/IRInterface.hh
index 006978f..d36bbfc 100644
--- a/interfaces/player/IRInterface.hh
+++ b/interfaces/player/IRInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #define IRINTERFACE_HH
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
@@ -40,7 +41,7 @@ namespace libgazebo
 class IRIface;
 
 /// \brief Plugin Player interface for a Gazebo laser
-class IRInterface : public GazeboInterface
+class GAZEBO_VISIBLE IRInterface : public GazeboInterface
 {
   /// \brief Constructor
   /// \param addr Plaer device address
diff --git a/interfaces/player/LaserInterface.cc b/interfaces/player/LaserInterface.cc
index a634072..02780eb 100644
--- a/interfaces/player/LaserInterface.cc
+++ b/interfaces/player/LaserInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/LaserInterface.hh b/interfaces/player/LaserInterface.hh
index c05107f..69c08a8 100644
--- a/interfaces/player/LaserInterface.hh
+++ b/interfaces/player/LaserInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,7 +23,8 @@
 #define LASERINTERFACE_HH
 
 #include <string>
-#include "transport/TransportTypes.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 #include "GazeboInterface.hh"
 
 /// \addtogroup player_iface Interfaces
@@ -33,7 +34,7 @@
 /// \{
 
 /// \brief Plugin Player interface for a Gazebo laser
-class LaserInterface : public GazeboInterface
+class GAZEBO_VISIBLE LaserInterface : public GazeboInterface
 {
   /// \brief Constructor
   /// \param addr Plaer device address
diff --git a/interfaces/player/OpaqueInterface.cc b/interfaces/player/OpaqueInterface.cc
index b023ace..59ace9f 100644
--- a/interfaces/player/OpaqueInterface.cc
+++ b/interfaces/player/OpaqueInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/OpaqueInterface.hh b/interfaces/player/OpaqueInterface.hh
index c1b5945..f839fa5 100644
--- a/interfaces/player/OpaqueInterface.hh
+++ b/interfaces/player/OpaqueInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #define OPAQUEINTERFACE_HH
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
@@ -40,7 +41,7 @@ namespace libgazebo
 class OpaqueIface;
 
 /// \brief Opaque Player interface
-class OpaqueInterface : public GazeboInterface
+class GAZEBO_VISIBLE OpaqueInterface : public GazeboInterface
 {
   /// \brief Constructor
     public: OpaqueInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/PTZInterface.cc b/interfaces/player/PTZInterface.cc
index 68acc13..51f0492 100644
--- a/interfaces/player/PTZInterface.cc
+++ b/interfaces/player/PTZInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/PTZInterface.hh b/interfaces/player/PTZInterface.hh
index 81a0d77..260ae58 100644
--- a/interfaces/player/PTZInterface.hh
+++ b/interfaces/player/PTZInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,10 +23,11 @@
 #define PTZINTERFACE_HH
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
-  class recursive_mutex;
+  class GAZEBO_VISIBLE recursive_mutex;
 }
 
 namespace libgazebo
@@ -36,10 +37,10 @@ namespace libgazebo
   /// \defgroup ptz_player PTZ Interface
   /// \brief Interface for controling a ptz
   /// \{
-  class PTZIface;
+  class GAZEBO_VISIBLE PTZIface;
 
   /// \brief PTZ Interface
-  class PTZInterface : public GazeboInterface
+  class GAZEBO_VISIBLE PTZInterface : public GazeboInterface
   {
     /// \brief Constructor
     public: PTZInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/Position2dInterface.cc b/interfaces/player/Position2dInterface.cc
index 9e6ad15..a05fa0b 100644
--- a/interfaces/player/Position2dInterface.cc
+++ b/interfaces/player/Position2dInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/Position2dInterface.hh b/interfaces/player/Position2dInterface.hh
index 1fafd09..f6092c3 100644
--- a/interfaces/player/Position2dInterface.hh
+++ b/interfaces/player/Position2dInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,8 @@
 #define GAZEBO_POSITION2DINTERFACE_HH
 
 #include <string>
+
+#include "gazebo/util/system.hh"
 #include "GazeboInterface.hh"
 
 /// \addtogroup player_iface
@@ -31,7 +33,7 @@
 /// \brief Position2d Player interface
 /// \{
 /// \brief Position2d Player interface
-class Position2dInterface : public GazeboInterface
+class GAZEBO_VISIBLE Position2dInterface : public GazeboInterface
 {
   /// \brief Constructor
   public: Position2dInterface(player_devaddr_t _addr, GazeboDriver *_driver,
diff --git a/interfaces/player/Position3dInterface.cc b/interfaces/player/Position3dInterface.cc
index 3932232..a652098 100644
--- a/interfaces/player/Position3dInterface.cc
+++ b/interfaces/player/Position3dInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/Position3dInterface.hh b/interfaces/player/Position3dInterface.hh
index 39d4c29..ac123f5 100644
--- a/interfaces/player/Position3dInterface.hh
+++ b/interfaces/player/Position3dInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,10 +23,11 @@
 #define POSITION3DINTERFACE_HH
 
 #include "GazeboInterface.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
-  class recursive_mutex;
+  class GAZEBO_VISIBLE recursive_mutex;
 }
 
 // Forward declarations
@@ -38,10 +39,10 @@ namespace libgazebo
 /// \brief Position3d interface
 /// \{
 
-  class PositionIface;
+  class GAZEBO_VISIBLE PositionIface;
 
   /// \brief Position3d interface
-  class Position3dInterface : public GazeboInterface
+  class GAZEBO_VISIBLE Position3dInterface : public GazeboInterface
   {
     /// \brief Constructor
     public: Position3dInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/PowerInterface.cc b/interfaces/player/PowerInterface.cc
index a5656a9..87d35fb 100644
--- a/interfaces/player/PowerInterface.cc
+++ b/interfaces/player/PowerInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/PowerInterface.hh b/interfaces/player/PowerInterface.hh
index 02615f1..402a82d 100644
--- a/interfaces/player/PowerInterface.hh
+++ b/interfaces/player/PowerInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #ifndef POWERINTERFACE_HH
 #define POWERINTERFACE_HH
 
+#include "gazebo/util/system.hh"
 #include "GazeboInterface.hh"
 
 // Forward declarations
@@ -29,7 +30,7 @@ typedef struct gz_power gz_power_t;
 
 
 /// \brief Power interface
-class PowerInterface : public GazeboInterface
+class GAZEBO_VISIBLE PowerInterface : public GazeboInterface
 {
   /// \brief Constructor
   public: PowerInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/SimulationInterface.cc b/interfaces/player/SimulationInterface.cc
index 784e052..3cff4a7 100644
--- a/interfaces/player/SimulationInterface.cc
+++ b/interfaces/player/SimulationInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,10 +14,6 @@
  * limitations under the License.
  *
 */
-/* Desc: Simulation Interface for Player
- * Author: Nate Koenig
- * Date: 2 March 2006
- */
 
 #include <time.h>
 
@@ -43,9 +39,7 @@ SimulationInterface::SimulationInterface(player_devaddr_t _addr,
     GazeboDriver *_driver, ConfigFile *_cf, int _section)
 : GazeboInterface(_addr, _driver, _cf, _section)
 {
-  gazebo::load();
-  gazebo::init();
-  gazebo::run();
+  gazebo::setupClient();
 
   worldName = _cf->ReadString(_section, "world_name", "default");
 
@@ -79,7 +73,7 @@ SimulationInterface::SimulationInterface(player_devaddr_t _addr,
 // Destructor
 SimulationInterface::~SimulationInterface()
 {
-  gazebo::fini();
+  gazebo::shutdown();
   if (this->responseQueue)
   {
     delete this->responseQueue;
@@ -156,7 +150,7 @@ int SimulationInterface::ProcessMessage(QueuePointer &_respQueue,
     iter = this->entityPoses.find(req->name);
     if (iter != this->entityPoses.end())
     {
-      snprintf(this->pose3dReq.name, sizeof(this->pose3dReq.name),
+      snprintf(this->pose3dReq.name, strlen(this->pose3dReq.name),
           "%s", req->name);
       this->pose3dReq.name_count = strlen(this->pose3dReq.name);
 
@@ -187,7 +181,7 @@ int SimulationInterface::ProcessMessage(QueuePointer &_respQueue,
     iter = this->entityPoses.find(req->name);
     if (iter != this->entityPoses.end())
     {
-      snprintf(this->pose3dReq.name, sizeof(this->pose3dReq.name),
+      snprintf(this->pose3dReq.name, strlen(this->pose3dReq.name),
           "%s", req->name);
       this->pose3dReq.name_count = strlen(this->pose3dReq.name);
 
diff --git a/interfaces/player/SimulationInterface.hh b/interfaces/player/SimulationInterface.hh
index 51348f0..215a406 100644
--- a/interfaces/player/SimulationInterface.hh
+++ b/interfaces/player/SimulationInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@
 #include "GazeboInterface.hh"
 #include "gazebo/msgs/msgs.hh"
 #include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/util/system.hh"
 
 namespace boost
 {
@@ -55,7 +56,7 @@ namespace boost
 ///
 
 /// \brief The Simulation interface
-class SimulationInterface : public GazeboInterface
+class GAZEBO_VISIBLE SimulationInterface : public GazeboInterface
 {
   /// \brief Constructor
   public: SimulationInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/SonarInterface.cc b/interfaces/player/SonarInterface.cc
index 76ef0d0..dfb4f9c 100644
--- a/interfaces/player/SonarInterface.cc
+++ b/interfaces/player/SonarInterface.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/interfaces/player/SonarInterface.hh b/interfaces/player/SonarInterface.hh
index 24b7f49..e9ca78f 100644
--- a/interfaces/player/SonarInterface.hh
+++ b/interfaces/player/SonarInterface.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,13 +22,15 @@
 #ifndef SONARINTERFACE_HH
 #define SONARINTERFACE_HH
 
+#include "gazebo/util/system.hh"
+
 #include "GazeboInterface.hh"
 
 // Forward declarations
 typedef struct gz_sonar gz_sonar_t;
 
 /// \brief Sonar interface
-class SonarInterface : public GazeboInterface
+class GAZEBO_VISIBLE SonarInterface : public GazeboInterface
 {
   /// @brief Constructor
   public: SonarInterface(player_devaddr_t addr, GazeboDriver *driver,
diff --git a/interfaces/player/player.h b/interfaces/player/player.h
index 387dfc8..fad20b3 100644
--- a/interfaces/player/player.h
+++ b/interfaces/player/player.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Nate Koenig & Andrew Howard
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/media/CMakeLists.txt b/media/CMakeLists.txt
index 15cd9a9..63ee6af 100644
--- a/media/CMakeLists.txt
+++ b/media/CMakeLists.txt
@@ -1,6 +1,7 @@
 add_subdirectory(audio)
+add_subdirectory(dem)
 add_subdirectory(fonts)
+add_subdirectory(gui)
 add_subdirectory(materials)
 add_subdirectory(rtshaderlib)
-add_subdirectory(gui)
 add_subdirectory(skyx)
diff --git a/media/audio/CMakeLists.txt b/media/audio/CMakeLists.txt
index 7ae14f0..ca0156e 100644
--- a/media/audio/CMakeLists.txt
+++ b/media/audio/CMakeLists.txt
@@ -1,2 +1,2 @@
-SET(files test.mp3)
+SET(files cheer.wav cheer.ogg cheer.mp3)
 INSTALL(FILES ${files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/media/audio)
diff --git a/media/audio/cheer.mp3 b/media/audio/cheer.mp3
new file mode 100644
index 0000000..5abbc0b
Binary files /dev/null and b/media/audio/cheer.mp3 differ
diff --git a/media/audio/cheer.ogg b/media/audio/cheer.ogg
new file mode 100644
index 0000000..7ea4853
Binary files /dev/null and b/media/audio/cheer.ogg differ
diff --git a/media/audio/cheer.wav b/media/audio/cheer.wav
new file mode 100644
index 0000000..653c932
Binary files /dev/null and b/media/audio/cheer.wav differ
diff --git a/media/audio/test.mp3 b/media/audio/test.mp3
deleted file mode 100644
index f58580e..0000000
Binary files a/media/audio/test.mp3 and /dev/null differ
diff --git a/media/dem/CMakeLists.txt b/media/dem/CMakeLists.txt
new file mode 100644
index 0000000..d934f4e
--- /dev/null
+++ b/media/dem/CMakeLists.txt
@@ -0,0 +1,2 @@
+SET(files volcano.tif)
+INSTALL(FILES ${files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/media/dem)
diff --git a/media/dem/volcano.tif b/media/dem/volcano.tif
new file mode 100644
index 0000000..fa51cbc
Binary files /dev/null and b/media/dem/volcano.tif differ
diff --git a/media/materials/programs/deferred_rendering/ssao_fp.glsl b/media/materials/programs/deferred_rendering/ssao_fp.glsl
index aad1a9d..f7d2741 100644
--- a/media/materials/programs/deferred_rendering/ssao_fp.glsl
+++ b/media/materials/programs/deferred_rendering/ssao_fp.glsl
@@ -84,7 +84,7 @@ void main()
 
     // this is a sample occlusion function, you can always play with
     // other ones, like 1.0 / (1.0 + zd * zd) and stuff
-    occ += clamp(pow(1.0 - zd, 11) + zd, 0.0, 1.0);
+    occ += clamp(pow(1.0 - zd, 11.0) + zd, 0.0, 1.0);
   }
 
   occ /= 6.0;
diff --git a/media/materials/programs/depth_points_map.vert b/media/materials/programs/depth_points_map.vert
index e67c358..49aaa6e 100644
--- a/media/materials/programs/depth_points_map.vert
+++ b/media/materials/programs/depth_points_map.vert
@@ -7,5 +7,5 @@ void main()
   // Vertex in world space
   point = gl_ModelViewMatrix * gl_Vertex;
 
-  point.z *= -1;
+  point.z *= -1.0;
 }
diff --git a/media/materials/programs/laser_1st_pass.frag b/media/materials/programs/laser_1st_pass.frag
index 5623848..fc81b46 100644
--- a/media/materials/programs/laser_1st_pass.frag
+++ b/media/materials/programs/laser_1st_pass.frag
@@ -12,6 +12,6 @@ void main()
 
   if (l>far)
     l = far;
-  
+
   gl_FragColor = vec4(l, retro, 0, 1.0);
 }
diff --git a/media/materials/programs/laser_1st_pass.vert b/media/materials/programs/laser_1st_pass.vert
index 04887b9..6c77644 100644
--- a/media/materials/programs/laser_1st_pass.vert
+++ b/media/materials/programs/laser_1st_pass.vert
@@ -5,5 +5,5 @@ void main()
   gl_Position = ftransform();
 
   // Vertex in world space
-  point = gl_ModelViewMatrix * gl_Vertex;
+   point = gl_ModelViewMatrix * gl_Vertex;   
 }
diff --git a/media/materials/programs/laser_2nd_pass.frag b/media/materials/programs/laser_2nd_pass.frag
index 525100a..19496fa 100644
--- a/media/materials/programs/laser_2nd_pass.frag
+++ b/media/materials/programs/laser_2nd_pass.frag
@@ -7,12 +7,12 @@ varying float tex;
 
 void main()
 {
-  if ((gl_TexCoord[0].s < 0) || (gl_TexCoord[0].s > 1) || 
-      (gl_TexCoord[0].t < 0) || (gl_TexCoord[0].t > 1))
+  if ((gl_TexCoord[0].s < 0.0) || (gl_TexCoord[0].s > 1.0) || 
+      (gl_TexCoord[0].t < 0.0) || (gl_TexCoord[0].t > 1.0))
     gl_FragColor = vec4(1,1,1,1);
   else
   {
-    int int_tex = int(tex*1000);
+    int int_tex = int(tex * 1000.0);
     if (int_tex == 0)
       //gl_FragColor=vec4(1,0,0,1);
       gl_FragColor = texture2D( tex1, gl_TexCoord[0].st);
diff --git a/media/materials/scripts/gazebo.material b/media/materials/scripts/gazebo.material
index 12fcbe3..49771dc 100644
--- a/media/materials/scripts/gazebo.material
+++ b/media/materials/scripts/gazebo.material
@@ -41,7 +41,7 @@ vertex_program Gazebo/XYZPointsVS glsl
 fragment_program Gazebo/XYZPointsFS glsl
 {
   source depth_points_map.frag
-  
+
   default_params
   {
     param_named_auto width viewport_width
@@ -71,7 +71,7 @@ vertex_program Gazebo/LaserScan1stVS glsl
 fragment_program Gazebo/LaserScan1stFS glsl
 {
   source laser_1st_pass.frag
-  
+
   default_params
   {
     param_named retro float 0.0
@@ -102,7 +102,7 @@ vertex_program Gazebo/LaserScan2ndVS glsl
 fragment_program Gazebo/LaserScan2ndFS glsl
 {
   source laser_2nd_pass.frag
-  
+
   default_params
   {
     param_named tex1 int 0
@@ -139,160 +139,226 @@ material Gazebo/Grey
   }
 }
 
+material Gazebo/DarkGrey
+{
+  technique
+  {
+    pass main
+    {
+      ambient .175 .175 .175  1.0
+      diffuse .175 .175 .175  1.0
+      specular .175 .175 .175 1.000000 1.500000
+    }
+  }
+}
+
 material Gazebo/White
 {
-	technique
-	{
-		pass ambient
-		{
-			ambient 1 1 1 1
-		}
+  technique
+  {
+    pass ambient
+    {
+      ambient 1 1 1 1
+    }
 
-		pass light
-		{
+    pass light
+    {
       diffuse 1 1 1 1
       specular .1 .1 .1 128
-		}
-	}
+    }
+  }
 }
 
 material Gazebo/FlatBlack
 {
-	technique
-	{
-		pass
-		{
-			ambient 0.1 0.1 0.1
+  technique
+  {
+    pass
+    {
+      ambient 0.1 0.1 0.1
       diffuse 0.1 0.1 0.1
       specular 0.01 0.01 0.01 1.0 1.0
     }
-	}
+  }
 }
 
 material Gazebo/Black
 {
-	technique
-	{
-		pass
-		{
-			ambient 0 0 0 1
-			diffuse 0 0 0 1 
+  technique
+  {
+    pass
+    {
+      ambient 0 0 0 1
+      diffuse 0 0 0 1
       specular 0.1 0.1 0.1 1 5.0
-		}
-	}
+    }
+  }
 }
 
 
 material Gazebo/Red
 {
-	technique
-	{
-		pass ambient
-		{
-			ambient 1 0 0 
+  technique
+  {
+    pass ambient
+    {
+      ambient 1 0 0
       diffuse 1 0 0
       specular 0.1 0.1 0.1 1 1
-		}
-	}
+    }
+  }
+}
+
+material Gazebo/RedBright
+{
+  technique
+  {
+    pass ambient
+    {
+      ambient 0.87 0.26 0.07
+      diffuse 0.87 0.26 0.07
+      specular 0.87 0.26 0.07 1 1
+    }
+  }
 }
 
 material Gazebo/Green
 {
-	technique
-	{
-		pass ambient
-		{
-			ambient 0 1 0
+  technique
+  {
+    pass ambient
+    {
+      ambient 0 1 0
       diffuse 0 1 0
       specular 0.1 0.1 0.1 1 1
-		}
-	}
+    }
+  }
 }
 
 material Gazebo/Blue
 {
-	technique
-	{
+  technique
+  {
+    pass ambient
+    {
+      ambient 0 0 1
+      diffuse 0 0 1
+      specular 0.1 0.1 0.1 1 1
+    }
+  }
+}
+
+material Gazebo/SkyBlue
+{
+  technique
+  {
     pass ambient
     {
-			ambient 0 0 1
+      ambient 0.13 0.44 0.70
       diffuse 0 0 1
       specular 0.1 0.1 0.1 1 1
     }
-	}
+  }
 }
 
 material Gazebo/Yellow
 {
-	technique
-	{
-		pass ambient
-		{
-			ambient 1 1 0 1
+  technique
+  {
+    pass ambient
+    {
+      ambient 1 1 0 1
       diffuse 1 1 0 1
       specular 0 0 0 0 0
     }
-	}
+  }
+}
+
+material Gazebo/ZincYellow
+{
+  technique
+  {
+    pass ambient
+    {
+      ambient 0.9725 0.9529 0.2078 1
+      diffuse 0.9725 0.9529 0.2078 1
+      specular 0.9725 0.9529 0.2078 1 1
+    }
+  }
 }
 
 material Gazebo/Purple
 {
-	technique
-	{
-		pass ambient
-		{
-			ambient 1 0 1
+  technique
+  {
+    pass ambient
+    {
+      ambient 1 0 1
       diffuse 1 0 1
       specular 0.1 0.1 0.1 1 1
-		}
-	}
+    }
+  }
 }
 
 material Gazebo/Turquoise
 {
-	technique
-	{
-		pass ambient
-		{
-			ambient 0 1 1
+  technique
+  {
+    pass ambient
+    {
+      ambient 0 1 1
       diffuse 0 1 1
       specular 0.1 0.1 0.1 1 1
-		}
-	}
+    }
+  }
 }
 
+material Gazebo/Orange
+{
+  technique
+  {
+    pass ambient
+    {
+      lighting on
+
+      ambient 1 0.5088 0.0468 1
+      diffuse 1 0.5088 0.0468 1
+      specular 0.5 0.5 0.5 128
+    }
+  }
+}
 
 material Gazebo/WhiteGlow : Gazebo/White
 {
-	technique
-	{
+  technique
+  {
     pass light
     {
-			emissive 1 1 1
+      emissive 1 1 1
     }
-	}
+  }
 }
 
 material Gazebo/RedGlow
 {
-	technique
-	{
+  technique
+  {
     pass ambient
     {
       ambient 1 0 0
       diffuse 1 0 0
       emissive 1 0 0
-			specular 0 0 0 128 
+      specular 0 0 0 128
     }
 
     pass light
     {
       ambient 1 0 0
       diffuse 1 0 0
-			emissive 1 0 0
-			specular 1 0 0 128 
+      emissive 1 0 0
+      specular 1 0 0 128
     }
-	}
+  }
 }
 
 
@@ -319,74 +385,134 @@ material Gazebo/BlueGlow : Gazebo/Blue
   {
     pass light
     {
-      emissive 0 0 1 
+      emissive 0 0 1
     }
   }
 }
 
 material Gazebo/YellowGlow : Gazebo/Yellow
 {
-	technique
-	{
-		pass light
-		{
-			emissive 1 1 0
-		}
-	}
+  technique
+  {
+    pass light
+    {
+      emissive 1 1 0
+    }
+  }
 }
 
 material Gazebo/PurpleGlow : Gazebo/Purple
 {
-	technique
-	{
-		pass light
-		{
-			emissive 1 0 1
-		}
-	}
+  technique
+  {
+    pass light
+    {
+      emissive 1 0 1
+    }
+  }
 }
 
 material Gazebo/TurquoiseGlow : Gazebo/Turquoise
 {
-	technique
-	{
-		pass light
-		{
-			emissive 0 1 1
-		}
-	}
+  technique
+  {
+    pass light
+    {
+      emissive 0 1 1
+    }
+  }
 }
 
 material Gazebo/TurquoiseGlowOutline
 {
-	technique
-	{
+  technique
+  {
     pass ambient
     {
       scene_blend alpha_blend
       //lighting off
 
-			diffuse 0 1 1 1
-			specular .1 .1 .1 128 
+      diffuse 0 1 1 1
+      specular .1 .1 .1 128
     }
 
     pass ambient2
     {
       scene_blend alpha_blend
 
-			diffuse 0 1 1 
-			specular .1 .1 .1 128 
-			emissive 0 1 1
+      diffuse 0 1 1
+      specular .1 .1 .1 128
+      emissive 0 1 1
 
       polygon_mode wireframe
     }
-	}
+  }
+}
+
+material Gazebo/RedTransparentOverlay
+{
+  technique
+  {
+    pass
+    {
+      scene_blend alpha_blend
+      depth_write off
+      lighting off
+      depth_check off
+
+      texture_unit
+      {
+        colour_op_ex source1 src_manual src_current 1 0 0
+        alpha_op_ex source1 src_manual src_current 0.5
+      }
+    }
+  }
+}
+
+material Gazebo/BlueTransparentOverlay
+{
+  technique
+  {
+    pass
+    {
+      scene_blend alpha_blend
+      depth_write off
+      lighting off
+      depth_check off
+
+      texture_unit
+      {
+        colour_op_ex source1 src_manual src_current 0 0 1
+        alpha_op_ex source1 src_manual src_current 0.5
+      }
+    }
+  }
+}
+
+material Gazebo/GreenTransparentOverlay
+{
+  technique
+  {
+    pass
+    {
+      scene_blend alpha_blend
+      depth_write off
+      lighting off
+      depth_check off
+
+      texture_unit
+      {
+        colour_op_ex source1 src_manual src_current 0 1 0
+        alpha_op_ex source1 src_manual src_current 0.5
+      }
+    }
+  }
 }
 
 material Gazebo/RedTransparent
 {
-	technique
-	{
+  technique
+  {
     pass
     {
       scene_blend alpha_blend
@@ -399,13 +525,13 @@ material Gazebo/RedTransparent
         alpha_op_ex source1 src_manual src_current 0.5
       }
     }
-	}
+  }
 }
 
 material Gazebo/GreenTransparent
 {
-	technique
-	{
+  technique
+  {
     pass
     {
       scene_blend alpha_blend
@@ -420,13 +546,13 @@ material Gazebo/GreenTransparent
         alpha_op_ex source1 src_manual src_current 0.5
       }
     }
-	}
+  }
 }
 
 material Gazebo/BlueTransparent
 {
-	technique
-	{
+  technique
+  {
     pass
     {
       scene_blend alpha_blend
@@ -441,7 +567,28 @@ material Gazebo/BlueTransparent
         alpha_op_ex source1 src_manual src_current 0.5
       }
     }
-	}
+  }
+}
+
+material Gazebo/GreyTransparent
+{
+  technique
+  {
+    pass
+    {
+      scene_blend alpha_blend
+      depth_write off
+
+      ambient 0.5 0.5 0.5 1
+      diffuse 0.5 0.5 0.5 1
+
+      texture_unit
+      {
+        colour_op_ex source1 src_current src_current 0 1 0
+        alpha_op_ex source1 src_manual src_current 0.5
+      }
+    }
+  }
 }
 
 material Gazebo/YellowTransparent
@@ -506,8 +653,6 @@ material Gazebo/LightOff
   }
 }
 
-
-
 material Gazebo/BlueLaser
 {
   receive_shadows off
@@ -584,7 +729,7 @@ material Gazebo/WoodFloor
   {
     pass
     {
-			ambient 0.5 0.5 0.5 1.000000
+      ambient 0.5 0.5 0.5 1.000000
 
       texture_unit
       {
@@ -602,7 +747,7 @@ material Gazebo/CeilingTiled
   {
     pass
     {
-			ambient 0.5 0.5 0.5 1.000000
+      ambient 0.5 0.5 0.5 1.000000
 
       texture_unit
       {
@@ -620,7 +765,7 @@ material Gazebo/PaintedWall
   {
     pass
     {
-			ambient 1.0 1.0 1.0 1.000000
+      ambient 1.0 1.0 1.0 1.000000
 
       texture_unit
       {
@@ -632,129 +777,129 @@ material Gazebo/PaintedWall
 
 material Gazebo/PioneerBody
 {
-	receive_shadows on
-	technique
-	{
+  receive_shadows on
+  technique
+  {
     pass Ambient
     {
-      ambient 0.5 0 0 
+      ambient 0.5 0 0
 
-			texture_unit
-			{
-				texture pioneerBody.jpg
-				filtering trilinear
-			}
+      texture_unit
+      {
+        texture pioneerBody.jpg
+        filtering trilinear
+      }
     }
     pass DirectionalLight
     {
-      ambient 0 0 0 
+      ambient 0 0 0
       diffuse 1 0 0 1
       specular 0.5 0 0 1 10
 
-			texture_unit
-			{
-				texture pioneerBody.jpg
-				filtering trilinear
-			}
+      texture_unit
+      {
+        texture pioneerBody.jpg
+        filtering trilinear
+      }
     }
     pass PointLight
     {
-      ambient 0 0 0 
+      ambient 0 0 0
       diffuse 1 0 0 1
       specular 0.5 0 0 1 10
 
-			texture_unit
-			{
-				texture pioneerBody.jpg
-				filtering trilinear
-			}
+      texture_unit
+      {
+        texture pioneerBody.jpg
+        filtering trilinear
+      }
     }
 
-	}
+  }
 }
 
 material Gazebo/Pioneer2Body
 {
-	receive_shadows on
-	technique
-	{
-		pass
-		{
-			//ambient 0.500000 0.500000 0.500000 1.000000
-			ambient 0.481193 0.000123 0.000123 1.000000
-			diffuse 0.681193 0.000923 0.000923 1.000000
-			specular 0.500000 0.500000 0.500000 1.000000 12.500000
-			emissive 0.000000 0.000000 0.000000 1.000000
-		}
-	}
+  receive_shadows on
+  technique
+  {
+    pass
+    {
+      //ambient 0.500000 0.500000 0.500000 1.000000
+      ambient 0.481193 0.000123 0.000123 1.000000
+      diffuse 0.681193 0.000923 0.000923 1.000000
+      specular 0.500000 0.500000 0.500000 1.000000 12.500000
+      emissive 0.000000 0.000000 0.000000 1.000000
+    }
+  }
 }
 
 material Gazebo/Gold
 {
-	receive_shadows on
-	technique
-	{
-		pass
-		{
-			ambient 0.400000 0.248690 0.020759 1.000000
-			diffuse 0.800000 0.648690 0.120759 1.000000
-			specular 0.400000 0.400000 0.400000 1.000000 12.500000
-		}
-	}
+  receive_shadows on
+  technique
+  {
+    pass
+    {
+      ambient 0.400000 0.248690 0.020759 1.000000
+      diffuse 0.800000 0.648690 0.120759 1.000000
+      specular 0.400000 0.400000 0.400000 1.000000 12.500000
+    }
+  }
 }
 
 material Gazebo/GreyGradientSky
 {
-	technique
-	{
-		pass
-		{
-			depth_write off
+  technique
+  {
+    pass
+    {
+      depth_write off
       lighting off
 
-			texture_unit
-			{
-				texture grey_gradient.jpg
-			}
-		}
-	}
+      texture_unit
+      {
+        texture grey_gradient.jpg
+      }
+    }
+  }
 }
 
 material Gazebo/CloudySky
 {
-	technique
-	{
-		pass
-		{
-			depth_write off
+  technique
+  {
+    pass
+    {
+      depth_write off
       lighting off
 
-			texture_unit
-			{
-				texture clouds.jpg
-				scroll_anim 0.15 0
-			}
-		}
-	}
+      texture_unit
+      {
+        texture clouds.jpg
+        scroll_anim 0.15 0
+      }
+    }
+  }
 }
 
 material Gazebo/WoodPallet
 {
-	technique
-	{
-		pass
-		{
-			ambient 0.5 0.5 0.5 1.0
-			diffuse 1.0 1.0 1.0 1.0
-			specular 0.0 0.0 0.0 1.0 0.5
-
-			texture_unit
-			{
-				texture WoodPallet.png
-				filtering trilinear
-			}
-		}
-	}
+  technique
+  {
+    pass
+    {
+      ambient 0.5 0.5 0.5 1.0
+      diffuse 1.0 1.0 1.0 1.0
+      specular 0.0 0.0 0.0 1.0 0.5
+
+      texture_unit
+      {
+        texture WoodPallet.png
+        filtering trilinear
+      }
+    }
+  }
 
   /*
   technique
@@ -777,21 +922,21 @@ material Gazebo/WoodPallet
 
 material Gazebo/Wood
 {
-	technique
-	{
-		pass
-		{
-			ambient 1.0 1.0 1.0 1.0
-			diffuse 1.0 1.0 1.0 1.0
-			specular 0.2 0.2 0.2 1.0 12.5
+  technique
+  {
+    pass
+    {
+      ambient 1.0 1.0 1.0 1.0
+      diffuse 1.0 1.0 1.0 1.0
+      specular 0.2 0.2 0.2 1.0 12.5
 
-			texture_unit
-			{
-				texture wood.jpg
-				filtering trilinear
-			}
-		}
-	}
+      texture_unit
+      {
+        texture wood.jpg
+        filtering trilinear
+      }
+    }
+  }
 }
 
 material Gazebo/Road
@@ -804,11 +949,11 @@ material Gazebo/Road
       diffuse 0.8 0.8 0.8 1.0
       specular 0.01 0.01 0.01 1.0 2.0
 
-			texture_unit
-			{
-				texture road1.jpg
-				filtering trilinear
-			}
+      texture_unit
+      {
+        texture road1.jpg
+        filtering trilinear
+      }
     }
   }
 }
@@ -824,11 +969,11 @@ material drc/san_fauxcity_sign
       diffuse 0.8 0.8 0.8 1.0
       specular 0.1 0.1 0.1 1.0 2.0
 
-			texture_unit
-			{
-				texture san_fauxcity.png
-				filtering trilinear
-			}
+      texture_unit
+      {
+        texture san_fauxcity.png
+        filtering trilinear
+      }
     }
   }
 }
@@ -868,3 +1013,20 @@ material Gazebo/GaussianCameraNoise
     }
   }
 }
+
+material Gazebo/PointCloud
+{
+   technique
+   {
+      pass
+      {
+         diffuse vertexcolour
+         specular vertexcolour
+         ambient vertexcolour
+         point_size 3
+         point_sprites off
+         point_size_attenuation off
+      }
+   }
+}
+
diff --git a/media/models/pioneer2at/CMakeLists.txt b/media/models/pioneer2at/CMakeLists.txt
deleted file mode 100644
index e51898d..0000000
--- a/media/models/pioneer2at/CMakeLists.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-SET (files chassis.mesh
-           chassis_top.mesh
-           Cylinder.012.mesh.xml
-           hub.mesh
-           Scene.material
-           sonarbank.mesh
-           sonar.mesh
-           tire.mesh
-           wheel.mesh
-)
-
-INSTALL(FILES ${files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/media/models/Pioneer2at)
diff --git a/media/models/pioneer2at/Cylinder.012.mesh.xml b/media/models/pioneer2at/Cylinder.012.mesh.xml
deleted file mode 100644
index 9574a2a..0000000
--- a/media/models/pioneer2at/Cylinder.012.mesh.xml
+++ /dev/null
@@ -1,2828 +0,0 @@
-<mesh>
-	<submeshes>
-		<submesh material="default" usesharedvertices="false">
-			<faces count="256">
-				<face v1="0" v2="1" v3="2"/>
-				<face v1="3" v2="4" v3="5"/>
-				<face v1="6" v2="7" v3="8"/>
-				<face v1="9" v2="10" v3="11"/>
-				<face v1="12" v2="13" v3="14"/>
-				<face v1="15" v2="16" v3="17"/>
-				<face v1="18" v2="19" v3="20"/>
-				<face v1="21" v2="22" v3="23"/>
-				<face v1="24" v2="25" v3="26"/>
-				<face v1="27" v2="28" v3="29"/>
-				<face v1="30" v2="31" v3="32"/>
-				<face v1="33" v2="34" v3="35"/>
-				<face v1="36" v2="37" v3="38"/>
-				<face v1="39" v2="40" v3="41"/>
-				<face v1="42" v2="43" v3="44"/>
-				<face v1="45" v2="46" v3="47"/>
-				<face v1="48" v2="49" v3="50"/>
-				<face v1="48" v2="50" v3="51"/>
-				<face v1="52" v2="53" v3="54"/>
-				<face v1="52" v2="54" v3="55"/>
-				<face v1="56" v2="57" v3="59"/>
-				<face v1="57" v2="58" v3="59"/>
-				<face v1="60" v2="61" v3="63"/>
-				<face v1="61" v2="62" v3="63"/>
-				<face v1="64" v2="65" v3="67"/>
-				<face v1="65" v2="66" v3="67"/>
-				<face v1="68" v2="69" v3="71"/>
-				<face v1="69" v2="70" v3="71"/>
-				<face v1="72" v2="73" v3="75"/>
-				<face v1="73" v2="74" v3="75"/>
-				<face v1="76" v2="77" v3="79"/>
-				<face v1="77" v2="78" v3="79"/>
-				<face v1="80" v2="81" v3="83"/>
-				<face v1="81" v2="82" v3="83"/>
-				<face v1="84" v2="85" v3="87"/>
-				<face v1="85" v2="86" v3="87"/>
-				<face v1="88" v2="89" v3="91"/>
-				<face v1="89" v2="90" v3="91"/>
-				<face v1="92" v2="93" v3="95"/>
-				<face v1="93" v2="94" v3="95"/>
-				<face v1="96" v2="97" v3="98"/>
-				<face v1="96" v2="98" v3="99"/>
-				<face v1="100" v2="101" v3="102"/>
-				<face v1="100" v2="102" v3="103"/>
-				<face v1="104" v2="105" v3="106"/>
-				<face v1="104" v2="106" v3="107"/>
-				<face v1="108" v2="109" v3="110"/>
-				<face v1="108" v2="110" v3="111"/>
-				<face v1="112" v2="113" v3="114"/>
-				<face v1="115" v2="116" v3="117"/>
-				<face v1="118" v2="119" v3="120"/>
-				<face v1="121" v2="122" v3="123"/>
-				<face v1="124" v2="125" v3="126"/>
-				<face v1="127" v2="128" v3="129"/>
-				<face v1="130" v2="131" v3="132"/>
-				<face v1="133" v2="134" v3="135"/>
-				<face v1="136" v2="137" v3="138"/>
-				<face v1="139" v2="140" v3="141"/>
-				<face v1="142" v2="143" v3="144"/>
-				<face v1="145" v2="146" v3="147"/>
-				<face v1="148" v2="149" v3="150"/>
-				<face v1="151" v2="152" v3="153"/>
-				<face v1="154" v2="155" v3="156"/>
-				<face v1="157" v2="158" v3="159"/>
-				<face v1="160" v2="161" v3="162"/>
-				<face v1="163" v2="164" v3="165"/>
-				<face v1="166" v2="167" v3="168"/>
-				<face v1="169" v2="170" v3="171"/>
-				<face v1="172" v2="173" v3="174"/>
-				<face v1="175" v2="176" v3="177"/>
-				<face v1="178" v2="179" v3="180"/>
-				<face v1="181" v2="182" v3="183"/>
-				<face v1="184" v2="185" v3="186"/>
-				<face v1="187" v2="188" v3="189"/>
-				<face v1="190" v2="191" v3="192"/>
-				<face v1="193" v2="194" v3="195"/>
-				<face v1="196" v2="197" v3="198"/>
-				<face v1="199" v2="200" v3="201"/>
-				<face v1="202" v2="203" v3="204"/>
-				<face v1="205" v2="206" v3="207"/>
-				<face v1="208" v2="209" v3="210"/>
-				<face v1="208" v2="210" v3="211"/>
-				<face v1="212" v2="213" v3="214"/>
-				<face v1="212" v2="214" v3="215"/>
-				<face v1="216" v2="217" v3="218"/>
-				<face v1="216" v2="218" v3="219"/>
-				<face v1="220" v2="221" v3="223"/>
-				<face v1="221" v2="222" v3="223"/>
-				<face v1="224" v2="225" v3="227"/>
-				<face v1="225" v2="226" v3="227"/>
-				<face v1="228" v2="229" v3="231"/>
-				<face v1="229" v2="230" v3="231"/>
-				<face v1="232" v2="233" v3="235"/>
-				<face v1="233" v2="234" v3="235"/>
-				<face v1="236" v2="237" v3="239"/>
-				<face v1="237" v2="238" v3="239"/>
-				<face v1="240" v2="241" v3="243"/>
-				<face v1="241" v2="242" v3="243"/>
-				<face v1="244" v2="245" v3="247"/>
-				<face v1="245" v2="246" v3="247"/>
-				<face v1="248" v2="249" v3="251"/>
-				<face v1="249" v2="250" v3="251"/>
-				<face v1="252" v2="253" v3="255"/>
-				<face v1="253" v2="254" v3="255"/>
-				<face v1="256" v2="257" v3="258"/>
-				<face v1="256" v2="258" v3="259"/>
-				<face v1="260" v2="261" v3="262"/>
-				<face v1="260" v2="262" v3="263"/>
-				<face v1="264" v2="265" v3="266"/>
-				<face v1="264" v2="266" v3="267"/>
-				<face v1="268" v2="269" v3="270"/>
-				<face v1="268" v2="270" v3="271"/>
-				<face v1="272" v2="273" v3="274"/>
-				<face v1="275" v2="276" v3="277"/>
-				<face v1="278" v2="279" v3="280"/>
-				<face v1="281" v2="282" v3="283"/>
-				<face v1="284" v2="285" v3="286"/>
-				<face v1="287" v2="288" v3="289"/>
-				<face v1="290" v2="291" v3="292"/>
-				<face v1="293" v2="294" v3="295"/>
-				<face v1="296" v2="297" v3="298"/>
-				<face v1="299" v2="300" v3="301"/>
-				<face v1="302" v2="303" v3="304"/>
-				<face v1="305" v2="306" v3="307"/>
-				<face v1="308" v2="309" v3="310"/>
-				<face v1="311" v2="312" v3="313"/>
-				<face v1="314" v2="315" v3="316"/>
-				<face v1="317" v2="318" v3="319"/>
-				<face v1="320" v2="321" v3="322"/>
-				<face v1="323" v2="324" v3="325"/>
-				<face v1="326" v2="327" v3="328"/>
-				<face v1="329" v2="330" v3="331"/>
-				<face v1="332" v2="333" v3="334"/>
-				<face v1="335" v2="336" v3="337"/>
-				<face v1="338" v2="339" v3="340"/>
-				<face v1="341" v2="342" v3="343"/>
-				<face v1="344" v2="345" v3="346"/>
-				<face v1="347" v2="348" v3="349"/>
-				<face v1="350" v2="351" v3="352"/>
-				<face v1="353" v2="354" v3="355"/>
-				<face v1="356" v2="357" v3="358"/>
-				<face v1="359" v2="360" v3="361"/>
-				<face v1="362" v2="363" v3="364"/>
-				<face v1="365" v2="366" v3="367"/>
-				<face v1="368" v2="369" v3="370"/>
-				<face v1="368" v2="370" v3="371"/>
-				<face v1="372" v2="373" v3="374"/>
-				<face v1="372" v2="374" v3="375"/>
-				<face v1="376" v2="377" v3="378"/>
-				<face v1="376" v2="378" v3="379"/>
-				<face v1="380" v2="381" v3="383"/>
-				<face v1="381" v2="382" v3="383"/>
-				<face v1="384" v2="385" v3="387"/>
-				<face v1="385" v2="386" v3="387"/>
-				<face v1="388" v2="389" v3="391"/>
-				<face v1="389" v2="390" v3="391"/>
-				<face v1="392" v2="393" v3="395"/>
-				<face v1="393" v2="394" v3="395"/>
-				<face v1="396" v2="397" v3="399"/>
-				<face v1="397" v2="398" v3="399"/>
-				<face v1="400" v2="401" v3="403"/>
-				<face v1="401" v2="402" v3="403"/>
-				<face v1="404" v2="405" v3="407"/>
-				<face v1="405" v2="406" v3="407"/>
-				<face v1="408" v2="409" v3="411"/>
-				<face v1="409" v2="410" v3="411"/>
-				<face v1="412" v2="413" v3="415"/>
-				<face v1="413" v2="414" v3="415"/>
-				<face v1="416" v2="417" v3="419"/>
-				<face v1="417" v2="418" v3="419"/>
-				<face v1="420" v2="421" v3="422"/>
-				<face v1="420" v2="422" v3="423"/>
-				<face v1="424" v2="425" v3="426"/>
-				<face v1="424" v2="426" v3="427"/>
-				<face v1="428" v2="429" v3="430"/>
-				<face v1="428" v2="430" v3="431"/>
-				<face v1="432" v2="433" v3="434"/>
-				<face v1="435" v2="436" v3="437"/>
-				<face v1="438" v2="439" v3="440"/>
-				<face v1="441" v2="442" v3="443"/>
-				<face v1="444" v2="445" v3="446"/>
-				<face v1="447" v2="448" v3="449"/>
-				<face v1="450" v2="451" v3="452"/>
-				<face v1="453" v2="454" v3="455"/>
-				<face v1="456" v2="457" v3="458"/>
-				<face v1="459" v2="460" v3="461"/>
-				<face v1="462" v2="463" v3="464"/>
-				<face v1="465" v2="466" v3="467"/>
-				<face v1="468" v2="469" v3="470"/>
-				<face v1="471" v2="472" v3="473"/>
-				<face v1="474" v2="475" v3="476"/>
-				<face v1="477" v2="478" v3="479"/>
-				<face v1="480" v2="481" v3="482"/>
-				<face v1="483" v2="484" v3="485"/>
-				<face v1="486" v2="487" v3="488"/>
-				<face v1="489" v2="490" v3="491"/>
-				<face v1="492" v2="493" v3="494"/>
-				<face v1="495" v2="496" v3="497"/>
-				<face v1="498" v2="499" v3="500"/>
-				<face v1="501" v2="502" v3="503"/>
-				<face v1="504" v2="505" v3="506"/>
-				<face v1="507" v2="508" v3="509"/>
-				<face v1="510" v2="511" v3="512"/>
-				<face v1="513" v2="514" v3="515"/>
-				<face v1="516" v2="517" v3="518"/>
-				<face v1="519" v2="520" v3="521"/>
-				<face v1="522" v2="523" v3="524"/>
-				<face v1="525" v2="526" v3="527"/>
-				<face v1="528" v2="529" v3="530"/>
-				<face v1="528" v2="530" v3="531"/>
-				<face v1="532" v2="533" v3="534"/>
-				<face v1="532" v2="534" v3="535"/>
-				<face v1="536" v2="537" v3="538"/>
-				<face v1="536" v2="538" v3="539"/>
-				<face v1="540" v2="541" v3="543"/>
-				<face v1="541" v2="542" v3="543"/>
-				<face v1="544" v2="545" v3="547"/>
-				<face v1="545" v2="546" v3="547"/>
-				<face v1="548" v2="549" v3="551"/>
-				<face v1="549" v2="550" v3="551"/>
-				<face v1="552" v2="553" v3="555"/>
-				<face v1="553" v2="554" v3="555"/>
-				<face v1="556" v2="557" v3="558"/>
-				<face v1="556" v2="558" v3="559"/>
-				<face v1="560" v2="561" v3="562"/>
-				<face v1="560" v2="562" v3="563"/>
-				<face v1="564" v2="565" v3="567"/>
-				<face v1="565" v2="566" v3="567"/>
-				<face v1="568" v2="569" v3="571"/>
-				<face v1="569" v2="570" v3="571"/>
-				<face v1="572" v2="573" v3="575"/>
-				<face v1="573" v2="574" v3="575"/>
-				<face v1="576" v2="577" v3="579"/>
-				<face v1="577" v2="578" v3="579"/>
-				<face v1="580" v2="581" v3="582"/>
-				<face v1="580" v2="582" v3="583"/>
-				<face v1="584" v2="585" v3="587"/>
-				<face v1="585" v2="586" v3="587"/>
-				<face v1="588" v2="589" v3="590"/>
-				<face v1="588" v2="590" v3="591"/>
-				<face v1="592" v2="593" v3="594"/>
-				<face v1="595" v2="596" v3="597"/>
-				<face v1="598" v2="599" v3="600"/>
-				<face v1="601" v2="602" v3="603"/>
-				<face v1="604" v2="605" v3="606"/>
-				<face v1="607" v2="608" v3="609"/>
-				<face v1="610" v2="611" v3="612"/>
-				<face v1="613" v2="614" v3="615"/>
-				<face v1="616" v2="617" v3="618"/>
-				<face v1="619" v2="620" v3="621"/>
-				<face v1="622" v2="623" v3="624"/>
-				<face v1="625" v2="626" v3="627"/>
-				<face v1="628" v2="629" v3="630"/>
-				<face v1="631" v2="632" v3="633"/>
-				<face v1="634" v2="635" v3="636"/>
-				<face v1="637" v2="638" v3="639"/>
-			</faces>
-			<geometry vertexcount="640">
-				<vertexbuffer positions="true" normals="true">
-					<vertex>
-						<position x="-0.043575" y="-0.134930" z="0.000000"/>
-						<normal x="0.000000" y="-1.000000" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050386" y="-0.134930" z="0.017188"/>
-						<normal x="0.000000" y="-1.000000" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060545" y="-0.134930" z="0.007338"/>
-						<normal x="0.000000" y="-1.000000" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.139105" z="0.000000"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060545" y="-0.139105" z="0.007338"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050386" y="-0.139105" z="0.017188"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.134930" z="0.000000"/>
-						<normal x="-0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060545" y="-0.134930" z="0.007338"/>
-						<normal x="-0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060763" y="-0.134930" z="-0.006811"/>
-						<normal x="-0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.139105" z="0.000000"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060763" y="-0.139105" z="-0.006811"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060545" y="-0.139105" z="0.007338"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.134930" z="0.000000"/>
-						<normal x="0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060763" y="-0.134930" z="-0.006811"/>
-						<normal x="0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050913" y="-0.134930" z="-0.016970"/>
-						<normal x="0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.139105" z="0.000000"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050913" y="-0.139105" z="-0.016970"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060763" y="-0.139105" z="-0.006811"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.134930" z="0.000000"/>
-						<normal x="0.000000" y="-1.000000" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050913" y="-0.134930" z="-0.016970"/>
-						<normal x="0.000000" y="-1.000000" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036764" y="-0.134930" z="-0.017188"/>
-						<normal x="0.000000" y="-1.000000" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.139105" z="0.000000"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036764" y="-0.139105" z="-0.017188"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050913" y="-0.139105" z="-0.016970"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.134930" z="0.000000"/>
-						<normal x="0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036764" y="-0.134930" z="-0.017188"/>
-						<normal x="0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026605" y="-0.134930" z="-0.007338"/>
-						<normal x="0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.139105" z="0.000000"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026605" y="-0.139105" z="-0.007338"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036764" y="-0.139105" z="-0.017188"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.134930" z="0.000000"/>
-						<normal x="0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026605" y="-0.134930" z="-0.007338"/>
-						<normal x="0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026387" y="-0.134930" z="0.006811"/>
-						<normal x="0.000000" y="-1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.139105" z="0.000000"/>
-						<normal x="-0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026387" y="-0.139105" z="0.006811"/>
-						<normal x="-0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026605" y="-0.139105" z="-0.007338"/>
-						<normal x="-0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.134930" z="0.000000"/>
-						<normal x="-0.000000" y="-1.000000" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026387" y="-0.134930" z="0.006811"/>
-						<normal x="-0.000000" y="-1.000000" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036237" y="-0.134930" z="0.016970"/>
-						<normal x="-0.000000" y="-1.000000" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.139105" z="0.000000"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036237" y="-0.139105" z="0.016970"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026387" y="-0.139105" z="0.006811"/>
-						<normal x="0.000000" y="1.000000" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036237" y="-0.134930" z="0.016970"/>
-						<normal x="0.000000" y="-1.000000" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050386" y="-0.134930" z="0.017188"/>
-						<normal x="0.000000" y="-1.000000" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.134930" z="0.000000"/>
-						<normal x="0.000000" y="-1.000000" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043575" y="-0.139105" z="0.000000"/>
-						<normal x="0.000000" y="1.000000" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050386" y="-0.139105" z="0.017188"/>
-						<normal x="0.000000" y="1.000000" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036237" y="-0.139105" z="0.016970"/>
-						<normal x="0.000000" y="1.000000" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050386" y="-0.134930" z="0.017188"/>
-						<normal x="0.696112" y="0.000000" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050386" y="-0.139105" z="0.017188"/>
-						<normal x="0.696112" y="0.000000" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060545" y="-0.139105" z="0.007338"/>
-						<normal x="0.696112" y="0.000000" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060545" y="-0.134930" z="0.007338"/>
-						<normal x="0.696112" y="0.000000" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060545" y="-0.134930" z="0.007338"/>
-						<normal x="0.999881" y="0.000001" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060545" y="-0.139105" z="0.007338"/>
-						<normal x="0.999881" y="0.000001" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060763" y="-0.139105" z="-0.006811"/>
-						<normal x="0.999881" y="0.000001" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060763" y="-0.134930" z="-0.006811"/>
-						<normal x="0.999881" y="0.000001" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060763" y="-0.134930" z="-0.006811"/>
-						<normal x="0.717933" y="0.000000" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060763" y="-0.139105" z="-0.006811"/>
-						<normal x="0.717933" y="0.000000" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050913" y="-0.139105" z="-0.016970"/>
-						<normal x="0.717933" y="0.000000" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050913" y="-0.134930" z="-0.016970"/>
-						<normal x="0.717933" y="0.000000" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050913" y="-0.134930" z="-0.016970"/>
-						<normal x="0.015435" y="0.000000" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050913" y="-0.139105" z="-0.016970"/>
-						<normal x="0.015435" y="0.000000" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036764" y="-0.139105" z="-0.017188"/>
-						<normal x="0.015435" y="0.000000" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036764" y="-0.134930" z="-0.017188"/>
-						<normal x="0.015435" y="0.000000" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036764" y="-0.134930" z="-0.017188"/>
-						<normal x="-0.696113" y="0.000000" z="0.717933"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036764" y="-0.139105" z="-0.017188"/>
-						<normal x="-0.696113" y="0.000000" z="0.717933"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026605" y="-0.139105" z="-0.007338"/>
-						<normal x="-0.696113" y="0.000000" z="0.717933"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026605" y="-0.134930" z="-0.007338"/>
-						<normal x="-0.696113" y="0.000000" z="0.717933"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026605" y="-0.134930" z="-0.007338"/>
-						<normal x="-0.999881" y="-0.000001" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026605" y="-0.139105" z="-0.007338"/>
-						<normal x="-0.999881" y="-0.000001" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026387" y="-0.139105" z="0.006811"/>
-						<normal x="-0.999881" y="-0.000001" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026387" y="-0.134930" z="0.006811"/>
-						<normal x="-0.999881" y="-0.000001" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026387" y="-0.134930" z="0.006811"/>
-						<normal x="-0.717936" y="-0.000013" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026387" y="-0.139105" z="0.006811"/>
-						<normal x="-0.717936" y="-0.000013" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036237" y="-0.139105" z="0.016970"/>
-						<normal x="-0.717936" y="-0.000013" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036237" y="-0.134930" z="0.016970"/>
-						<normal x="-0.717936" y="-0.000013" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050386" y="-0.139105" z="0.017188"/>
-						<normal x="-0.015428" y="0.000000" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050386" y="-0.134930" z="0.017188"/>
-						<normal x="-0.015428" y="0.000000" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036237" y="-0.134930" z="0.016970"/>
-						<normal x="-0.015428" y="0.000000" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036237" y="-0.139105" z="0.016970"/>
-						<normal x="-0.015428" y="0.000000" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000813" y="-0.125556" z="0.017188"/>
-						<normal x="-0.011923" y="-0.009790" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003462" y="-0.122329" z="0.017188"/>
-						<normal x="-0.011923" y="-0.009790" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.007473" y="-0.113351" z="0.016970"/>
-						<normal x="-0.011923" y="-0.009790" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.010122" y="-0.116577" z="0.016970"/>
-						<normal x="-0.011923" y="-0.009790" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.015086" y="-0.107100" z="0.006811"/>
-						<normal x="-0.554846" y="-0.455607" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.017735" y="-0.110326" z="0.006811"/>
-						<normal x="-0.554846" y="-0.455607" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.010122" y="-0.116577" z="0.016970"/>
-						<normal x="-0.554846" y="-0.455607" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.007473" y="-0.113351" z="0.016970"/>
-						<normal x="-0.554846" y="-0.455607" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.014917" y="-0.107238" z="-0.007338"/>
-						<normal x="-0.772754" y="-0.634518" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.017566" y="-0.110465" z="-0.007338"/>
-						<normal x="-0.772754" y="-0.634518" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.017735" y="-0.110326" z="0.006811"/>
-						<normal x="-0.772754" y="-0.634518" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.015086" y="-0.107100" z="0.006811"/>
-						<normal x="-0.772754" y="-0.634518" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.007065" y="-0.113685" z="-0.017188"/>
-						<normal x="-0.537989" y="-0.441747" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.009715" y="-0.116912" z="-0.017188"/>
-						<normal x="-0.537989" y="-0.441747" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.017566" y="-0.110465" z="-0.007338"/>
-						<normal x="-0.537989" y="-0.441747" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.014917" y="-0.107238" z="-0.007338"/>
-						<normal x="-0.537989" y="-0.441747" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003869" y="-0.122664" z="-0.016970"/>
-						<normal x="0.011929" y="0.009795" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.001220" y="-0.125890" z="-0.016970"/>
-						<normal x="0.011929" y="0.009795" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.009715" y="-0.116912" z="-0.017188"/>
-						<normal x="0.011929" y="0.009795" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.007065" y="-0.113685" z="-0.017188"/>
-						<normal x="0.011929" y="0.009795" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011482" y="-0.128915" z="-0.006811"/>
-						<normal x="0.554853" y="0.455593" z="0.696112"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008833" y="-0.132141" z="-0.006811"/>
-						<normal x="0.554853" y="0.455593" z="0.696112"/>
-					</vertex>
-					<vertex>
-						<position x="-0.001220" y="-0.125890" z="-0.016970"/>
-						<normal x="0.554853" y="0.455593" z="0.696112"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003869" y="-0.122664" z="-0.016970"/>
-						<normal x="0.554853" y="0.455593" z="0.696112"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011313" y="-0.128776" z="0.007338"/>
-						<normal x="0.772755" y="0.634517" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008664" y="-0.132003" z="0.007338"/>
-						<normal x="0.772755" y="0.634517" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008833" y="-0.132141" z="-0.006811"/>
-						<normal x="0.772755" y="0.634517" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011482" y="-0.128915" z="-0.006811"/>
-						<normal x="0.772755" y="0.634517" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003462" y="-0.122329" z="0.017188"/>
-						<normal x="0.537988" y="0.441746" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000813" y="-0.125556" z="0.017188"/>
-						<normal x="0.537988" y="0.441746" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008664" y="-0.132003" z="0.007338"/>
-						<normal x="0.537988" y="0.441746" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011313" y="-0.128776" z="0.007338"/>
-						<normal x="0.537988" y="0.441746" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.004451" y="-0.121234" z="0.000000"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000813" y="-0.125556" z="0.017188"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.010122" y="-0.116577" z="0.016970"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.007473" y="-0.113351" z="0.016970"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003462" y="-0.122329" z="0.017188"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.001802" y="-0.118007" z="0.000000"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.004451" y="-0.121234" z="0.000000"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.010122" y="-0.116577" z="0.016970"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.017735" y="-0.110326" z="0.006811"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.001802" y="-0.118007" z="0.000000"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.015086" y="-0.107100" z="0.006811"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.007473" y="-0.113351" z="0.016970"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.004451" y="-0.121234" z="0.000000"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.017735" y="-0.110326" z="0.006811"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.017566" y="-0.110465" z="-0.007338"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.001802" y="-0.118007" z="0.000000"/>
-						<normal x="0.634591" y="-0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.014917" y="-0.107238" z="-0.007338"/>
-						<normal x="0.634591" y="-0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.015086" y="-0.107100" z="0.006811"/>
-						<normal x="0.634591" y="-0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.004451" y="-0.121234" z="0.000000"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.017566" y="-0.110465" z="-0.007338"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.009715" y="-0.116912" z="-0.017188"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.001802" y="-0.118007" z="0.000000"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.007065" y="-0.113685" z="-0.017188"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.014917" y="-0.107238" z="-0.007338"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.004451" y="-0.121234" z="0.000000"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.009715" y="-0.116912" z="-0.017188"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.001220" y="-0.125890" z="-0.016970"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.001802" y="-0.118007" z="0.000000"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003869" y="-0.122664" z="-0.016970"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.007065" y="-0.113685" z="-0.017188"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.004451" y="-0.121234" z="0.000000"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.001220" y="-0.125890" z="-0.016970"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008833" y="-0.132141" z="-0.006811"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.001802" y="-0.118007" z="0.000000"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011482" y="-0.128915" z="-0.006811"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003869" y="-0.122664" z="-0.016970"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.004451" y="-0.121234" z="0.000000"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008833" y="-0.132141" z="-0.006811"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008664" y="-0.132003" z="0.007338"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.001802" y="-0.118007" z="0.000000"/>
-						<normal x="0.634591" y="-0.772848" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011313" y="-0.128776" z="0.007338"/>
-						<normal x="0.634591" y="-0.772848" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011482" y="-0.128915" z="-0.006811"/>
-						<normal x="0.634591" y="-0.772848" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.004451" y="-0.121234" z="0.000000"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008664" y="-0.132003" z="0.007338"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000813" y="-0.125556" z="0.017188"/>
-						<normal x="-0.634591" y="0.772848" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.001802" y="-0.118007" z="0.000000"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003462" y="-0.122329" z="0.017188"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011313" y="-0.128776" z="0.007338"/>
-						<normal x="0.634591" y="-0.772848" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035680" y="-0.077418" z="0.000000"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.032254" y="-0.083305" z="0.017188"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.027144" y="-0.092085" z="0.007338"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039288" y="-0.079518" z="0.000000"/>
-						<normal x="-0.864301" y="0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.030753" y="-0.094185" z="0.007338"/>
-						<normal x="-0.864301" y="0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035862" y="-0.085405" z="0.017188"/>
-						<normal x="-0.864301" y="0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035680" y="-0.077418" z="0.000000"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.027144" y="-0.092085" z="0.007338"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.027034" y="-0.092274" z="-0.006811"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039288" y="-0.079518" z="0.000000"/>
-						<normal x="-0.864301" y="0.502975" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.030643" y="-0.094374" z="-0.006811"/>
-						<normal x="-0.864301" y="0.502975" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.030753" y="-0.094185" z="0.007338"/>
-						<normal x="-0.864301" y="0.502975" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.035680" y="-0.077418" z="0.000000"/>
-						<normal x="0.864301" y="-0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.027034" y="-0.092274" z="-0.006811"/>
-						<normal x="0.864301" y="-0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.031989" y="-0.083760" z="-0.016970"/>
-						<normal x="0.864301" y="-0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039288" y="-0.079518" z="0.000000"/>
-						<normal x="-0.864302" y="0.502974" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035597" y="-0.085860" z="-0.016970"/>
-						<normal x="-0.864302" y="0.502974" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.030643" y="-0.094374" z="-0.006811"/>
-						<normal x="-0.864302" y="0.502974" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035680" y="-0.077418" z="0.000000"/>
-						<normal x="0.864301" y="-0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.031989" y="-0.083760" z="-0.016970"/>
-						<normal x="0.864301" y="-0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039105" y="-0.071532" z="-0.017188"/>
-						<normal x="0.864301" y="-0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039288" y="-0.079518" z="0.000000"/>
-						<normal x="-0.864301" y="0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.042714" y="-0.073632" z="-0.017188"/>
-						<normal x="-0.864301" y="0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035597" y="-0.085860" z="-0.016970"/>
-						<normal x="-0.864301" y="0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035680" y="-0.077418" z="0.000000"/>
-						<normal x="0.864302" y="-0.502974" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039105" y="-0.071532" z="-0.017188"/>
-						<normal x="0.864302" y="-0.502974" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.044215" y="-0.062751" z="-0.007338"/>
-						<normal x="0.864302" y="-0.502974" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039288" y="-0.079518" z="0.000000"/>
-						<normal x="-0.864301" y="0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.047823" y="-0.064851" z="-0.007338"/>
-						<normal x="-0.864301" y="0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.042714" y="-0.073632" z="-0.017188"/>
-						<normal x="-0.864301" y="0.502975" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035680" y="-0.077418" z="0.000000"/>
-						<normal x="0.864301" y="-0.502974" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.044215" y="-0.062751" z="-0.007338"/>
-						<normal x="0.864301" y="-0.502974" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.044325" y="-0.062562" z="0.006811"/>
-						<normal x="0.864301" y="-0.502974" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039288" y="-0.079518" z="0.000000"/>
-						<normal x="-0.864301" y="0.502974" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.047933" y="-0.064662" z="0.006811"/>
-						<normal x="-0.864301" y="0.502974" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.047823" y="-0.064851" z="-0.007338"/>
-						<normal x="-0.864301" y="0.502974" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.035680" y="-0.077418" z="0.000000"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.044325" y="-0.062562" z="0.006811"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039370" y="-0.071076" z="0.016970"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039288" y="-0.079518" z="0.000000"/>
-						<normal x="-0.864302" y="0.502974" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.042979" y="-0.073176" z="0.016970"/>
-						<normal x="-0.864302" y="0.502974" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.047933" y="-0.064662" z="0.006811"/>
-						<normal x="-0.864302" y="0.502974" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039370" y="-0.071076" z="0.016970"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.032254" y="-0.083305" z="0.017188"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035680" y="-0.077418" z="0.000000"/>
-						<normal x="0.864301" y="-0.502974" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039288" y="-0.079518" z="0.000000"/>
-						<normal x="-0.864301" y="0.502975" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.035862" y="-0.085405" z="0.017188"/>
-						<normal x="-0.864301" y="0.502975" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.042979" y="-0.073176" z="0.016970"/>
-						<normal x="-0.864301" y="0.502975" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.032254" y="-0.083305" z="0.017188"/>
-						<normal x="0.350128" y="0.601650" z="-0.717933"/>
-					</vertex>
-					<vertex>
-						<position x="0.035862" y="-0.085405" z="0.017188"/>
-						<normal x="0.350128" y="0.601650" z="-0.717933"/>
-					</vertex>
-					<vertex>
-						<position x="0.030753" y="-0.094185" z="0.007338"/>
-						<normal x="0.350128" y="0.601650" z="-0.717933"/>
-					</vertex>
-					<vertex>
-						<position x="0.027144" y="-0.092085" z="0.007338"/>
-						<normal x="0.350128" y="0.601650" z="-0.717933"/>
-					</vertex>
-					<vertex>
-						<position x="0.027144" y="-0.092085" z="0.007338"/>
-						<normal x="0.502913" y="0.864199" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.030753" y="-0.094185" z="0.007338"/>
-						<normal x="0.502913" y="0.864199" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.030643" y="-0.094374" z="-0.006811"/>
-						<normal x="0.502913" y="0.864199" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.027034" y="-0.092274" z="-0.006811"/>
-						<normal x="0.502913" y="0.864199" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.027034" y="-0.092274" z="-0.006811"/>
-						<normal x="0.361103" y="0.620510" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.030643" y="-0.094374" z="-0.006811"/>
-						<normal x="0.361103" y="0.620510" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.035597" y="-0.085860" z="-0.016970"/>
-						<normal x="0.361103" y="0.620510" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.031989" y="-0.083760" z="-0.016970"/>
-						<normal x="0.361103" y="0.620510" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.031989" y="-0.083760" z="-0.016970"/>
-						<normal x="0.007763" y="0.013340" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.035597" y="-0.085860" z="-0.016970"/>
-						<normal x="0.007763" y="0.013340" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.042714" y="-0.073632" z="-0.017188"/>
-						<normal x="0.007763" y="0.013340" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.039105" y="-0.071532" z="-0.017188"/>
-						<normal x="0.007763" y="0.013340" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.039105" y="-0.071532" z="-0.017188"/>
-						<normal x="-0.350127" y="-0.601651" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.042714" y="-0.073632" z="-0.017188"/>
-						<normal x="-0.350127" y="-0.601651" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.047823" y="-0.064851" z="-0.007338"/>
-						<normal x="-0.350127" y="-0.601651" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.044215" y="-0.062751" z="-0.007338"/>
-						<normal x="-0.350127" y="-0.601651" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.044215" y="-0.062751" z="-0.007338"/>
-						<normal x="-0.502913" y="-0.864199" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.047823" y="-0.064851" z="-0.007338"/>
-						<normal x="-0.502913" y="-0.864199" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.047933" y="-0.064662" z="0.006811"/>
-						<normal x="-0.502913" y="-0.864199" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.044325" y="-0.062562" z="0.006811"/>
-						<normal x="-0.502913" y="-0.864199" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.044325" y="-0.062562" z="0.006811"/>
-						<normal x="-0.361091" y="-0.620520" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.047933" y="-0.064662" z="0.006811"/>
-						<normal x="-0.361091" y="-0.620520" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.042979" y="-0.073176" z="0.016970"/>
-						<normal x="-0.361091" y="-0.620520" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.039370" y="-0.071076" z="0.016970"/>
-						<normal x="-0.361091" y="-0.620520" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.035862" y="-0.085405" z="0.017188"/>
-						<normal x="-0.007760" y="-0.013334" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.032254" y="-0.083305" z="0.017188"/>
-						<normal x="-0.007760" y="-0.013334" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.039370" y="-0.071076" z="0.016970"/>
-						<normal x="-0.007760" y="-0.013334" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.042979" y="-0.073176" z="0.016970"/>
-						<normal x="-0.007760" y="-0.013334" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.056559" y="-0.035008" z="0.017188"/>
-						<normal x="-0.002529" y="-0.015219" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.052440" y="-0.034324" z="0.017188"/>
-						<normal x="-0.002529" y="-0.015219" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.054759" y="-0.020367" z="0.016970"/>
-						<normal x="-0.002529" y="-0.015219" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.058878" y="-0.021051" z="0.016970"/>
-						<normal x="-0.002529" y="-0.015219" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.056374" y="-0.010650" z="0.006811"/>
-						<normal x="-0.117669" y="-0.708227" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.060492" y="-0.011334" z="0.006811"/>
-						<normal x="-0.117669" y="-0.708227" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.058878" y="-0.021051" z="0.016970"/>
-						<normal x="-0.117669" y="-0.708227" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.054759" y="-0.020367" z="0.016970"/>
-						<normal x="-0.117669" y="-0.708227" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.056338" y="-0.010865" z="-0.007338"/>
-						<normal x="-0.163902" y="-0.986356" z="0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.060457" y="-0.011550" z="-0.007338"/>
-						<normal x="-0.163902" y="-0.986356" z="0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.060492" y="-0.011334" z="0.006811"/>
-						<normal x="-0.163902" y="-0.986356" z="0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.056374" y="-0.010650" z="0.006811"/>
-						<normal x="-0.163902" y="-0.986356" z="0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.054673" y="-0.020887" z="-0.017188"/>
-						<normal x="-0.114107" y="-0.686697" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.058791" y="-0.021571" z="-0.017188"/>
-						<normal x="-0.114107" y="-0.686697" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.060457" y="-0.011550" z="-0.007338"/>
-						<normal x="-0.114107" y="-0.686697" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.056338" y="-0.010865" z="-0.007338"/>
-						<normal x="-0.114107" y="-0.686697" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.052354" y="-0.034844" z="-0.016970"/>
-						<normal x="0.002530" y="0.015226" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.056472" y="-0.035528" z="-0.016970"/>
-						<normal x="0.002530" y="0.015226" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.058791" y="-0.021571" z="-0.017188"/>
-						<normal x="0.002530" y="0.015226" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.054673" y="-0.020887" z="-0.017188"/>
-						<normal x="0.002530" y="0.015226" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.050739" y="-0.044561" z="-0.006811"/>
-						<normal x="0.117685" y="0.708221" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.054858" y="-0.045245" z="-0.006811"/>
-						<normal x="0.117685" y="0.708221" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.056472" y="-0.035528" z="-0.016970"/>
-						<normal x="0.117685" y="0.708221" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.052354" y="-0.034844" z="-0.016970"/>
-						<normal x="0.117685" y="0.708221" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.050775" y="-0.044346" z="0.007338"/>
-						<normal x="0.163901" y="0.986356" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.054893" y="-0.045030" z="0.007338"/>
-						<normal x="0.163901" y="0.986356" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.054858" y="-0.045245" z="-0.006811"/>
-						<normal x="0.163901" y="0.986356" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.050739" y="-0.044561" z="-0.006811"/>
-						<normal x="0.163901" y="0.986356" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.052440" y="-0.034324" z="0.017188"/>
-						<normal x="0.114107" y="0.686696" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.056559" y="-0.035008" z="0.017188"/>
-						<normal x="0.114107" y="0.686696" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.054893" y="-0.045030" z="0.007338"/>
-						<normal x="0.114107" y="0.686696" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.050775" y="-0.044346" z="0.007338"/>
-						<normal x="0.114107" y="0.686696" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.057675" y="-0.028290" z="0.000000"/>
-						<normal x="-0.986474" y="0.163919" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056559" y="-0.035008" z="0.017188"/>
-						<normal x="-0.986474" y="0.163919" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.058878" y="-0.021051" z="0.016970"/>
-						<normal x="-0.986474" y="0.163919" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.054759" y="-0.020367" z="0.016970"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.052440" y="-0.034324" z="0.017188"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053557" y="-0.027605" z="0.000000"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.057675" y="-0.028290" z="0.000000"/>
-						<normal x="-0.986474" y="0.163919" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.058878" y="-0.021051" z="0.016970"/>
-						<normal x="-0.986474" y="0.163919" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.060492" y="-0.011334" z="0.006811"/>
-						<normal x="-0.986474" y="0.163919" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053557" y="-0.027605" z="0.000000"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056374" y="-0.010650" z="0.006811"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.054759" y="-0.020367" z="0.016970"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.057675" y="-0.028290" z="0.000000"/>
-						<normal x="-0.986474" y="0.163920" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.060492" y="-0.011334" z="0.006811"/>
-						<normal x="-0.986474" y="0.163920" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.060457" y="-0.011550" z="-0.007338"/>
-						<normal x="-0.986474" y="0.163920" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.053557" y="-0.027605" z="0.000000"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056338" y="-0.010865" z="-0.007338"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056374" y="-0.010650" z="0.006811"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.057675" y="-0.028290" z="0.000000"/>
-						<normal x="-0.986474" y="0.163921" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.060457" y="-0.011550" z="-0.007338"/>
-						<normal x="-0.986474" y="0.163921" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.058791" y="-0.021571" z="-0.017188"/>
-						<normal x="-0.986474" y="0.163921" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053557" y="-0.027605" z="0.000000"/>
-						<normal x="0.986474" y="-0.163919" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.054673" y="-0.020887" z="-0.017188"/>
-						<normal x="0.986474" y="-0.163919" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.056338" y="-0.010865" z="-0.007338"/>
-						<normal x="0.986474" y="-0.163919" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.057675" y="-0.028290" z="0.000000"/>
-						<normal x="-0.986474" y="0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.058791" y="-0.021571" z="-0.017188"/>
-						<normal x="-0.986474" y="0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056472" y="-0.035528" z="-0.016970"/>
-						<normal x="-0.986474" y="0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053557" y="-0.027605" z="0.000000"/>
-						<normal x="0.986474" y="-0.163920" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.052354" y="-0.034844" z="-0.016970"/>
-						<normal x="0.986474" y="-0.163920" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.054673" y="-0.020887" z="-0.017188"/>
-						<normal x="0.986474" y="-0.163920" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.057675" y="-0.028290" z="0.000000"/>
-						<normal x="-0.986474" y="0.163919" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056472" y="-0.035528" z="-0.016970"/>
-						<normal x="-0.986474" y="0.163919" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.054858" y="-0.045245" z="-0.006811"/>
-						<normal x="-0.986474" y="0.163919" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053557" y="-0.027605" z="0.000000"/>
-						<normal x="0.986474" y="-0.163920" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.050739" y="-0.044561" z="-0.006811"/>
-						<normal x="0.986474" y="-0.163920" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.052354" y="-0.034844" z="-0.016970"/>
-						<normal x="0.986474" y="-0.163920" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.057675" y="-0.028290" z="0.000000"/>
-						<normal x="-0.986474" y="0.163919" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.054858" y="-0.045245" z="-0.006811"/>
-						<normal x="-0.986474" y="0.163919" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.054893" y="-0.045030" z="0.007338"/>
-						<normal x="-0.986474" y="0.163919" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.053557" y="-0.027605" z="0.000000"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.050775" y="-0.044346" z="0.007338"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.050739" y="-0.044561" z="-0.006811"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.057675" y="-0.028290" z="0.000000"/>
-						<normal x="-0.986474" y="0.163920" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.054893" y="-0.045030" z="0.007338"/>
-						<normal x="-0.986474" y="0.163920" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056559" y="-0.035008" z="0.017188"/>
-						<normal x="-0.986474" y="0.163920" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053557" y="-0.027605" z="0.000000"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.052440" y="-0.034324" z="0.017188"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.050775" y="-0.044346" z="0.007338"/>
-						<normal x="0.986474" y="-0.163920" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053687" y="0.026429" z="0.000000"/>
-						<normal x="0.983519" y="0.180807" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.054918" y="0.019730" z="0.017188"/>
-						<normal x="0.983519" y="0.180807" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056755" y="0.009739" z="0.007338"/>
-						<normal x="0.983519" y="0.180807" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.057793" y="0.027184" z="0.000000"/>
-						<normal x="-0.983519" y="-0.180806" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.060861" y="0.010494" z="0.007338"/>
-						<normal x="-0.983519" y="-0.180806" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.059024" y="0.020485" z="0.017188"/>
-						<normal x="-0.983519" y="-0.180806" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053687" y="0.026429" z="0.000000"/>
-						<normal x="0.983519" y="0.180807" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056755" y="0.009739" z="0.007338"/>
-						<normal x="0.983519" y="0.180807" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056795" y="0.009524" z="-0.006811"/>
-						<normal x="0.983519" y="0.180807" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.057793" y="0.027184" z="0.000000"/>
-						<normal x="-0.983519" y="-0.180807" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.060901" y="0.010279" z="-0.006811"/>
-						<normal x="-0.983519" y="-0.180807" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.060861" y="0.010494" z="0.007338"/>
-						<normal x="-0.983519" y="-0.180807" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.053687" y="0.026429" z="0.000000"/>
-						<normal x="0.983519" y="0.180807" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.056795" y="0.009524" z="-0.006811"/>
-						<normal x="0.983519" y="0.180807" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.055014" y="0.019212" z="-0.016970"/>
-						<normal x="0.983519" y="0.180807" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.057793" y="0.027184" z="0.000000"/>
-						<normal x="-0.983518" y="-0.180808" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.059120" y="0.019967" z="-0.016970"/>
-						<normal x="-0.983518" y="-0.180808" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.060901" y="0.010279" z="-0.006811"/>
-						<normal x="-0.983518" y="-0.180808" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053687" y="0.026429" z="0.000000"/>
-						<normal x="0.983519" y="0.180807" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.055014" y="0.019212" z="-0.016970"/>
-						<normal x="0.983519" y="0.180807" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.052456" y="0.033127" z="-0.017188"/>
-						<normal x="0.983519" y="0.180807" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.057793" y="0.027184" z="0.000000"/>
-						<normal x="-0.983519" y="-0.180807" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056562" y="0.033882" z="-0.017188"/>
-						<normal x="-0.983519" y="-0.180807" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.059120" y="0.019967" z="-0.016970"/>
-						<normal x="-0.983519" y="-0.180807" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053687" y="0.026429" z="0.000000"/>
-						<normal x="0.983519" y="0.180807" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.052456" y="0.033127" z="-0.017188"/>
-						<normal x="0.983519" y="0.180807" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.050619" y="0.043119" z="-0.007338"/>
-						<normal x="0.983519" y="0.180807" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.057793" y="0.027184" z="0.000000"/>
-						<normal x="-0.983519" y="-0.180806" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.054725" y="0.043874" z="-0.007338"/>
-						<normal x="-0.983519" y="-0.180806" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056562" y="0.033882" z="-0.017188"/>
-						<normal x="-0.983519" y="-0.180806" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053687" y="0.026429" z="0.000000"/>
-						<normal x="0.983519" y="0.180806" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.050619" y="0.043119" z="-0.007338"/>
-						<normal x="0.983519" y="0.180806" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.050579" y="0.043334" z="0.006811"/>
-						<normal x="0.983519" y="0.180806" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.057793" y="0.027184" z="0.000000"/>
-						<normal x="-0.983519" y="-0.180807" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.054685" y="0.044089" z="0.006811"/>
-						<normal x="-0.983519" y="-0.180807" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.054725" y="0.043874" z="-0.007338"/>
-						<normal x="-0.983519" y="-0.180807" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.053687" y="0.026429" z="0.000000"/>
-						<normal x="0.983519" y="0.180807" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.050579" y="0.043334" z="0.006811"/>
-						<normal x="0.983519" y="0.180807" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.052360" y="0.033646" z="0.016970"/>
-						<normal x="0.983519" y="0.180807" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.057793" y="0.027184" z="0.000000"/>
-						<normal x="-0.983518" y="-0.180808" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056466" y="0.034401" z="0.016970"/>
-						<normal x="-0.983518" y="-0.180808" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.054685" y="0.044089" z="0.006811"/>
-						<normal x="-0.983518" y="-0.180808" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.052360" y="0.033646" z="0.016970"/>
-						<normal x="0.983519" y="0.180806" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.054918" y="0.019730" z="0.017188"/>
-						<normal x="0.983519" y="0.180806" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.053687" y="0.026429" z="0.000000"/>
-						<normal x="0.983519" y="0.180806" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.057793" y="0.027184" z="0.000000"/>
-						<normal x="-0.983519" y="-0.180807" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.059024" y="0.020485" z="0.017188"/>
-						<normal x="-0.983519" y="-0.180807" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.056466" y="0.034401" z="0.016970"/>
-						<normal x="-0.983519" y="-0.180807" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.054918" y="0.019730" z="0.017188"/>
-						<normal x="-0.125860" y="0.684639" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.059024" y="0.020485" z="0.017188"/>
-						<normal x="-0.125860" y="0.684639" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.060861" y="0.010494" z="0.007338"/>
-						<normal x="-0.125860" y="0.684639" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.056755" y="0.009739" z="0.007338"/>
-						<normal x="-0.125860" y="0.684639" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.056755" y="0.009739" z="0.007338"/>
-						<normal x="-0.180787" y="0.983401" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.060861" y="0.010494" z="0.007338"/>
-						<normal x="-0.180787" y="0.983401" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.060901" y="0.010279" z="-0.006811"/>
-						<normal x="-0.180787" y="0.983401" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.056795" y="0.009524" z="-0.006811"/>
-						<normal x="-0.180787" y="0.983401" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.056795" y="0.009524" z="-0.006811"/>
-						<normal x="-0.129802" y="0.706101" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.060901" y="0.010279" z="-0.006811"/>
-						<normal x="-0.129802" y="0.706101" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.059120" y="0.019967" z="-0.016970"/>
-						<normal x="-0.129802" y="0.706101" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.055014" y="0.019212" z="-0.016970"/>
-						<normal x="-0.129802" y="0.706101" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.055014" y="0.019212" z="-0.016970"/>
-						<normal x="-0.002791" y="0.015181" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.059120" y="0.019967" z="-0.016970"/>
-						<normal x="-0.002791" y="0.015181" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.056562" y="0.033882" z="-0.017188"/>
-						<normal x="-0.002791" y="0.015181" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.052456" y="0.033127" z="-0.017188"/>
-						<normal x="-0.002791" y="0.015181" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.052456" y="0.033127" z="-0.017188"/>
-						<normal x="0.125863" y="-0.684640" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.056562" y="0.033882" z="-0.017188"/>
-						<normal x="0.125863" y="-0.684640" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.054725" y="0.043874" z="-0.007338"/>
-						<normal x="0.125863" y="-0.684640" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.050619" y="0.043119" z="-0.007338"/>
-						<normal x="0.125863" y="-0.684640" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.050619" y="0.043119" z="-0.007338"/>
-						<normal x="0.180783" y="-0.983402" z="0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.054725" y="0.043874" z="-0.007338"/>
-						<normal x="0.180783" y="-0.983402" z="0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.054685" y="0.044089" z="0.006811"/>
-						<normal x="0.180783" y="-0.983402" z="0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.050579" y="0.043334" z="0.006811"/>
-						<normal x="0.180783" y="-0.983402" z="0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.050579" y="0.043334" z="0.006811"/>
-						<normal x="0.129821" y="-0.706100" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.054685" y="0.044089" z="0.006811"/>
-						<normal x="0.129821" y="-0.706100" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.056466" y="0.034401" z="0.016970"/>
-						<normal x="0.129821" y="-0.706100" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.052360" y="0.033646" z="0.016970"/>
-						<normal x="0.129821" y="-0.706100" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.059024" y="0.020485" z="0.017188"/>
-						<normal x="0.002789" y="-0.015174" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.054918" y="0.019730" z="0.017188"/>
-						<normal x="0.002789" y="-0.015174" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.052360" y="0.033646" z="0.016970"/>
-						<normal x="0.002789" y="-0.015174" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.056466" y="0.034401" z="0.016970"/>
-						<normal x="0.002789" y="-0.015174" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.043209" y="0.073426" z="0.017188"/>
-						<normal x="0.007688" y="-0.013376" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.039589" y="0.071346" z="0.017188"/>
-						<normal x="0.007688" y="-0.013376" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.032539" y="0.083613" z="0.016970"/>
-						<normal x="0.007688" y="-0.013376" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.036159" y="0.085693" z="0.016970"/>
-						<normal x="0.007688" y="-0.013376" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.027631" y="0.092153" z="0.006811"/>
-						<normal x="0.357750" y="-0.622451" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.031251" y="0.094233" z="0.006811"/>
-						<normal x="0.357750" y="-0.622451" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.036159" y="0.085693" z="0.016970"/>
-						<normal x="0.357750" y="-0.622451" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.032539" y="0.083613" z="0.016970"/>
-						<normal x="0.357750" y="-0.622451" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="0.027740" y="0.091964" z="-0.007338"/>
-						<normal x="0.498226" y="-0.866910" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.031360" y="0.094044" z="-0.007338"/>
-						<normal x="0.498226" y="-0.866910" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.031251" y="0.094233" z="0.006811"/>
-						<normal x="0.498226" y="-0.866910" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.027631" y="0.092153" z="0.006811"/>
-						<normal x="0.498226" y="-0.866910" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.032802" y="0.083156" z="-0.017188"/>
-						<normal x="0.346867" y="-0.603536" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.036422" y="0.085236" z="-0.017188"/>
-						<normal x="0.346867" y="-0.603536" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.031360" y="0.094044" z="-0.007338"/>
-						<normal x="0.346867" y="-0.603536" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.027740" y="0.091964" z="-0.007338"/>
-						<normal x="0.346867" y="-0.603536" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="0.039852" y="0.070889" z="-0.016970"/>
-						<normal x="-0.007691" y="0.013382" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.043472" y="0.072969" z="-0.016970"/>
-						<normal x="-0.007691" y="0.013382" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.036422" y="0.085236" z="-0.017188"/>
-						<normal x="-0.007691" y="0.013382" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.032802" y="0.083156" z="-0.017188"/>
-						<normal x="-0.007691" y="0.013382" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.044760" y="0.062348" z="-0.006811"/>
-						<normal x="-0.357733" y="0.622458" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.048380" y="0.064429" z="-0.006811"/>
-						<normal x="-0.357733" y="0.622458" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.043472" y="0.072969" z="-0.016970"/>
-						<normal x="-0.357733" y="0.622458" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.039852" y="0.070889" z="-0.016970"/>
-						<normal x="-0.357733" y="0.622458" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.044652" y="0.062538" z="0.007338"/>
-						<normal x="-0.498229" y="0.866908" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.048271" y="0.064618" z="0.007338"/>
-						<normal x="-0.498229" y="0.866908" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.048380" y="0.064429" z="-0.006811"/>
-						<normal x="-0.498229" y="0.866908" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.044760" y="0.062348" z="-0.006811"/>
-						<normal x="-0.498229" y="0.866908" z="-0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="0.039589" y="0.071346" z="0.017188"/>
-						<normal x="-0.346863" y="0.603537" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.043209" y="0.073426" z="0.017188"/>
-						<normal x="-0.346863" y="0.603537" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.048271" y="0.064618" z="0.007338"/>
-						<normal x="-0.346863" y="0.603537" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.044652" y="0.062538" z="0.007338"/>
-						<normal x="-0.346863" y="0.603537" z="-0.717934"/>
-					</vertex>
-					<vertex>
-						<position x="0.039815" y="0.079331" z="0.000000"/>
-						<normal x="-0.867012" y="-0.498288" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.043209" y="0.073426" z="0.017188"/>
-						<normal x="-0.867012" y="-0.498288" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.036159" y="0.085693" z="0.016970"/>
-						<normal x="-0.867012" y="-0.498288" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.032539" y="0.083613" z="0.016970"/>
-						<normal x="0.867012" y="0.498287" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039589" y="0.071346" z="0.017188"/>
-						<normal x="0.867012" y="0.498287" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.036196" y="0.077251" z="0.000000"/>
-						<normal x="0.867012" y="0.498287" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039815" y="0.079331" z="0.000000"/>
-						<normal x="-0.867011" y="-0.498289" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.036159" y="0.085693" z="0.016970"/>
-						<normal x="-0.867011" y="-0.498289" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.031251" y="0.094233" z="0.006811"/>
-						<normal x="-0.867011" y="-0.498289" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.036196" y="0.077251" z="0.000000"/>
-						<normal x="0.867012" y="0.498287" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.027631" y="0.092153" z="0.006811"/>
-						<normal x="0.867012" y="0.498287" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.032539" y="0.083613" z="0.016970"/>
-						<normal x="0.867012" y="0.498287" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039815" y="0.079331" z="0.000000"/>
-						<normal x="-0.867012" y="-0.498288" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.031251" y="0.094233" z="0.006811"/>
-						<normal x="-0.867012" y="-0.498288" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.031360" y="0.094044" z="-0.007338"/>
-						<normal x="-0.867012" y="-0.498288" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.036196" y="0.077251" z="0.000000"/>
-						<normal x="0.867012" y="0.498287" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.027740" y="0.091964" z="-0.007338"/>
-						<normal x="0.867012" y="0.498287" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.027631" y="0.092153" z="0.006811"/>
-						<normal x="0.867012" y="0.498287" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.039815" y="0.079331" z="0.000000"/>
-						<normal x="-0.867012" y="-0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.031360" y="0.094044" z="-0.007338"/>
-						<normal x="-0.867012" y="-0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.036422" y="0.085236" z="-0.017188"/>
-						<normal x="-0.867012" y="-0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.036196" y="0.077251" z="0.000000"/>
-						<normal x="0.867012" y="0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.032802" y="0.083156" z="-0.017188"/>
-						<normal x="0.867012" y="0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.027740" y="0.091964" z="-0.007338"/>
-						<normal x="0.867012" y="0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039815" y="0.079331" z="0.000000"/>
-						<normal x="-0.867012" y="-0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.036422" y="0.085236" z="-0.017188"/>
-						<normal x="-0.867012" y="-0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.043472" y="0.072969" z="-0.016970"/>
-						<normal x="-0.867012" y="-0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.036196" y="0.077251" z="0.000000"/>
-						<normal x="0.867012" y="0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039852" y="0.070889" z="-0.016970"/>
-						<normal x="0.867012" y="0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.032802" y="0.083156" z="-0.017188"/>
-						<normal x="0.867012" y="0.498287" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039815" y="0.079331" z="0.000000"/>
-						<normal x="-0.867012" y="-0.498288" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.043472" y="0.072969" z="-0.016970"/>
-						<normal x="-0.867012" y="-0.498288" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.048380" y="0.064429" z="-0.006811"/>
-						<normal x="-0.867012" y="-0.498288" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.036196" y="0.077251" z="0.000000"/>
-						<normal x="0.867012" y="0.498288" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.044760" y="0.062348" z="-0.006811"/>
-						<normal x="0.867012" y="0.498288" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039852" y="0.070889" z="-0.016970"/>
-						<normal x="0.867012" y="0.498288" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039815" y="0.079331" z="0.000000"/>
-						<normal x="-0.867012" y="-0.498287" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.048380" y="0.064429" z="-0.006811"/>
-						<normal x="-0.867012" y="-0.498287" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.048271" y="0.064618" z="0.007338"/>
-						<normal x="-0.867012" y="-0.498287" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.036196" y="0.077251" z="0.000000"/>
-						<normal x="0.867012" y="0.498288" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.044652" y="0.062538" z="0.007338"/>
-						<normal x="0.867012" y="0.498288" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.044760" y="0.062348" z="-0.006811"/>
-						<normal x="0.867012" y="0.498288" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039815" y="0.079331" z="0.000000"/>
-						<normal x="-0.867013" y="-0.498286" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.048271" y="0.064618" z="0.007338"/>
-						<normal x="-0.867013" y="-0.498286" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.043209" y="0.073426" z="0.017188"/>
-						<normal x="-0.867013" y="-0.498286" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.036196" y="0.077251" z="0.000000"/>
-						<normal x="0.867012" y="0.498287" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.039589" y="0.071346" z="0.017188"/>
-						<normal x="0.867012" y="0.498287" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.044652" y="0.062538" z="0.007338"/>
-						<normal x="0.867012" y="0.498287" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.002116" y="0.117839" z="0.000000"/>
-						<normal x="0.639191" y="0.769048" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.007354" y="0.113485" z="0.017188"/>
-						<normal x="0.639191" y="0.769048" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.015166" y="0.106992" z="0.007338"/>
-						<normal x="0.639191" y="0.769048" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.004784" y="0.121049" z="0.000000"/>
-						<normal x="-0.639192" y="-0.769047" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.017835" y="0.110202" z="0.007338"/>
-						<normal x="-0.639192" y="-0.769047" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.010022" y="0.116696" z="0.017188"/>
-						<normal x="-0.639192" y="-0.769047" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.002116" y="0.117839" z="0.000000"/>
-						<normal x="0.639190" y="0.769049" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.015166" y="0.106992" z="0.007338"/>
-						<normal x="0.639190" y="0.769049" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.015334" y="0.106852" z="-0.006811"/>
-						<normal x="0.639190" y="0.769049" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.004784" y="0.121049" z="0.000000"/>
-						<normal x="-0.639191" y="-0.769048" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.018003" y="0.110063" z="-0.006811"/>
-						<normal x="-0.639191" y="-0.769048" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.017835" y="0.110202" z="0.007338"/>
-						<normal x="-0.639191" y="-0.769048" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.002116" y="0.117839" z="0.000000"/>
-						<normal x="0.639190" y="0.769049" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.015334" y="0.106852" z="-0.006811"/>
-						<normal x="0.639190" y="0.769049" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.007759" y="0.113148" z="-0.016970"/>
-						<normal x="0.639190" y="0.769049" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.004784" y="0.121049" z="0.000000"/>
-						<normal x="-0.639191" y="-0.769048" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.010427" y="0.116359" z="-0.016970"/>
-						<normal x="-0.639191" y="-0.769048" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.018003" y="0.110063" z="-0.006811"/>
-						<normal x="-0.639191" y="-0.769048" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.002116" y="0.117839" z="0.000000"/>
-						<normal x="0.639191" y="0.769048" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.007759" y="0.113148" z="-0.016970"/>
-						<normal x="0.639191" y="0.769048" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003122" y="0.122192" z="-0.017188"/>
-						<normal x="0.639191" y="0.769048" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.004784" y="0.121049" z="0.000000"/>
-						<normal x="-0.639191" y="-0.769048" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000454" y="0.125403" z="-0.017188"/>
-						<normal x="-0.639191" y="-0.769048" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.010427" y="0.116359" z="-0.016970"/>
-						<normal x="-0.639191" y="-0.769048" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.002116" y="0.117839" z="0.000000"/>
-						<normal x="0.639192" y="0.769047" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003122" y="0.122192" z="-0.017188"/>
-						<normal x="0.639192" y="0.769047" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.010935" y="0.128685" z="-0.007338"/>
-						<normal x="0.639192" y="0.769047" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.004784" y="0.121049" z="0.000000"/>
-						<normal x="-0.639191" y="-0.769048" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008266" y="0.131896" z="-0.007338"/>
-						<normal x="-0.639191" y="-0.769048" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000454" y="0.125403" z="-0.017188"/>
-						<normal x="-0.639191" y="-0.769048" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.002116" y="0.117839" z="0.000000"/>
-						<normal x="0.639191" y="0.769048" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.010935" y="0.128685" z="-0.007338"/>
-						<normal x="0.639191" y="0.769048" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011103" y="0.128825" z="0.006811"/>
-						<normal x="0.639191" y="0.769048" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.004784" y="0.121049" z="0.000000"/>
-						<normal x="-0.639190" y="-0.769049" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008434" y="0.132036" z="0.006811"/>
-						<normal x="-0.639190" y="-0.769049" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008266" y="0.131896" z="-0.007338"/>
-						<normal x="-0.639190" y="-0.769049" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="0.002116" y="0.117839" z="0.000000"/>
-						<normal x="0.639191" y="0.769048" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011103" y="0.128825" z="0.006811"/>
-						<normal x="0.639191" y="0.769048" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003528" y="0.122529" z="0.016970"/>
-						<normal x="0.639191" y="0.769048" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="0.004784" y="0.121049" z="0.000000"/>
-						<normal x="-0.639189" y="-0.769049" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000859" y="0.125740" z="0.016970"/>
-						<normal x="-0.639189" y="-0.769049" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008434" y="0.132036" z="0.006811"/>
-						<normal x="-0.639189" y="-0.769049" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003528" y="0.122529" z="0.016970"/>
-						<normal x="0.639190" y="0.769049" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.007354" y="0.113485" z="0.017188"/>
-						<normal x="0.639190" y="0.769049" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.002116" y="0.117839" z="0.000000"/>
-						<normal x="0.639190" y="0.769049" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.004784" y="0.121049" z="0.000000"/>
-						<normal x="-0.639190" y="-0.769049" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.010022" y="0.116696" z="0.017188"/>
-						<normal x="-0.639190" y="-0.769049" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000859" y="0.125740" z="0.016970"/>
-						<normal x="-0.639190" y="-0.769049" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="0.007354" y="0.113485" z="0.017188"/>
-						<normal x="-0.535345" y="0.444945" z="-0.717935"/>
-					</vertex>
-					<vertex>
-						<position x="0.010022" y="0.116696" z="0.017188"/>
-						<normal x="-0.535345" y="0.444945" z="-0.717935"/>
-					</vertex>
-					<vertex>
-						<position x="0.017835" y="0.110202" z="0.007338"/>
-						<normal x="-0.535345" y="0.444945" z="-0.717935"/>
-					</vertex>
-					<vertex>
-						<position x="0.015166" y="0.106992" z="0.007338"/>
-						<normal x="-0.535345" y="0.444945" z="-0.717935"/>
-					</vertex>
-					<vertex>
-						<position x="0.015166" y="0.106992" z="0.007338"/>
-						<normal x="-0.768959" y="0.639112" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.017835" y="0.110202" z="0.007338"/>
-						<normal x="-0.768959" y="0.639112" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.018003" y="0.110063" z="-0.006811"/>
-						<normal x="-0.768959" y="0.639112" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.015334" y="0.106852" z="-0.006811"/>
-						<normal x="-0.768959" y="0.639112" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="0.015334" y="0.106852" z="-0.006811"/>
-						<normal x="-0.552121" y="0.458900" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.018003" y="0.110063" z="-0.006811"/>
-						<normal x="-0.552121" y="0.458900" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.010427" y="0.116359" z="-0.016970"/>
-						<normal x="-0.552121" y="0.458900" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.007759" y="0.113148" z="-0.016970"/>
-						<normal x="-0.552121" y="0.458900" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="0.007759" y="0.113148" z="-0.016970"/>
-						<normal x="-0.011870" y="0.009866" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.010427" y="0.116359" z="-0.016970"/>
-						<normal x="-0.011870" y="0.009866" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000454" y="0.125403" z="-0.017188"/>
-						<normal x="-0.011870" y="0.009866" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003122" y="0.122192" z="-0.017188"/>
-						<normal x="-0.011870" y="0.009866" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003122" y="0.122192" z="-0.017188"/>
-						<normal x="0.535348" y="-0.444944" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000454" y="0.125403" z="-0.017188"/>
-						<normal x="0.535348" y="-0.444944" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008266" y="0.131896" z="-0.007338"/>
-						<normal x="0.535348" y="-0.444944" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="-0.010935" y="0.128685" z="-0.007338"/>
-						<normal x="0.535348" y="-0.444944" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="-0.010935" y="0.128685" z="-0.007338"/>
-						<normal x="0.768955" y="-0.639117" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008266" y="0.131896" z="-0.007338"/>
-						<normal x="0.768955" y="-0.639117" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008434" y="0.132036" z="0.006811"/>
-						<normal x="0.768955" y="-0.639117" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011103" y="0.128825" z="0.006811"/>
-						<normal x="0.768955" y="-0.639117" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.011103" y="0.128825" z="0.006811"/>
-						<normal x="0.552138" y="-0.458885" z="-0.696109"/>
-					</vertex>
-					<vertex>
-						<position x="-0.008434" y="0.132036" z="0.006811"/>
-						<normal x="0.552138" y="-0.458885" z="-0.696109"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000859" y="0.125740" z="0.016970"/>
-						<normal x="0.552138" y="-0.458885" z="-0.696109"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003528" y="0.122529" z="0.016970"/>
-						<normal x="0.552138" y="-0.458885" z="-0.696109"/>
-					</vertex>
-					<vertex>
-						<position x="0.010022" y="0.116696" z="0.017188"/>
-						<normal x="0.011865" y="-0.009861" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="0.007354" y="0.113485" z="0.017188"/>
-						<normal x="0.011865" y="-0.009861" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.003528" y="0.122529" z="0.016970"/>
-						<normal x="0.011865" y="-0.009861" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.000859" y="0.125740" z="0.016970"/>
-						<normal x="0.011865" y="-0.009861" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036890" y="0.139036" z="0.017188"/>
-						<normal x="0.015428" y="-0.000044" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036902" y="0.134861" z="0.017188"/>
-						<normal x="0.015428" y="-0.000044" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.051051" y="0.134902" z="0.016970"/>
-						<normal x="0.015428" y="-0.000044" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.051039" y="0.139077" z="0.016970"/>
-						<normal x="0.015428" y="-0.000044" z="-0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060901" y="0.134930" z="0.006811"/>
-						<normal x="0.717933" y="-0.002038" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060889" y="0.139105" z="0.006811"/>
-						<normal x="0.717933" y="-0.002038" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="-0.051039" y="0.139077" z="0.016970"/>
-						<normal x="0.717933" y="-0.002038" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="-0.051051" y="0.134902" z="0.016970"/>
-						<normal x="0.717933" y="-0.002038" z="-0.696110"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060682" y="0.134929" z="-0.007338"/>
-						<normal x="0.999877" y="-0.002866" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060670" y="0.139104" z="-0.007338"/>
-						<normal x="0.999877" y="-0.002866" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060889" y="0.139105" z="0.006811"/>
-						<normal x="0.999877" y="-0.002866" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060901" y="0.134930" z="0.006811"/>
-						<normal x="0.999877" y="-0.002866" z="0.015436"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050523" y="0.134900" z="-0.017188"/>
-						<normal x="0.696110" y="-0.001988" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050511" y="0.139075" z="-0.017188"/>
-						<normal x="0.696110" y="-0.001988" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060670" y="0.139104" z="-0.007338"/>
-						<normal x="0.696110" y="-0.001988" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060682" y="0.134929" z="-0.007338"/>
-						<normal x="0.696110" y="-0.001988" z="0.717932"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036375" y="0.134860" z="-0.016970"/>
-						<normal x="-0.015435" y="0.000044" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036363" y="0.139035" z="-0.016970"/>
-						<normal x="-0.015435" y="0.000044" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050511" y="0.139075" z="-0.017188"/>
-						<normal x="-0.015435" y="0.000044" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050523" y="0.134900" z="-0.017188"/>
-						<normal x="-0.015435" y="0.000044" z="0.999881"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026525" y="0.134831" z="-0.006811"/>
-						<normal x="-0.717929" y="0.002063" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026513" y="0.139006" z="-0.006811"/>
-						<normal x="-0.717929" y="0.002063" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036363" y="0.139035" z="-0.016970"/>
-						<normal x="-0.717929" y="0.002063" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036375" y="0.134860" z="-0.016970"/>
-						<normal x="-0.717929" y="0.002063" z="0.696113"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026743" y="0.134832" z="0.007338"/>
-						<normal x="-0.999877" y="0.002858" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026731" y="0.139007" z="0.007338"/>
-						<normal x="-0.999877" y="0.002858" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026513" y="0.139006" z="-0.006811"/>
-						<normal x="-0.999877" y="0.002858" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026525" y="0.134831" z="-0.006811"/>
-						<normal x="-0.999877" y="0.002858" z="-0.015437"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036902" y="0.134861" z="0.017188"/>
-						<normal x="-0.696107" y="0.001990" z="-0.717935"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036890" y="0.139036" z="0.017188"/>
-						<normal x="-0.696107" y="0.001990" z="-0.717935"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026731" y="0.139007" z="0.007338"/>
-						<normal x="-0.696107" y="0.001990" z="-0.717935"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026743" y="0.134832" z="0.007338"/>
-						<normal x="-0.696107" y="0.001990" z="-0.717935"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043701" y="0.139056" z="0.000000"/>
-						<normal x="-0.002863" y="-0.999996" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036890" y="0.139036" z="0.017188"/>
-						<normal x="-0.002863" y="-0.999996" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.051039" y="0.139077" z="0.016970"/>
-						<normal x="-0.002863" y="-0.999996" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.051051" y="0.134902" z="0.016970"/>
-						<normal x="0.002860" y="0.999996" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036902" y="0.134861" z="0.017188"/>
-						<normal x="0.002860" y="0.999996" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043713" y="0.134881" z="0.000000"/>
-						<normal x="0.002860" y="0.999996" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043701" y="0.139056" z="0.000000"/>
-						<normal x="-0.002862" y="-0.999996" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.051039" y="0.139077" z="0.016970"/>
-						<normal x="-0.002862" y="-0.999996" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060889" y="0.139105" z="0.006811"/>
-						<normal x="-0.002862" y="-0.999996" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043713" y="0.134881" z="0.000000"/>
-						<normal x="0.002865" y="0.999996" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060901" y="0.134930" z="0.006811"/>
-						<normal x="0.002865" y="0.999996" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.051051" y="0.134902" z="0.016970"/>
-						<normal x="0.002865" y="0.999996" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043701" y="0.139056" z="0.000000"/>
-						<normal x="-0.002863" y="-0.999996" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060889" y="0.139105" z="0.006811"/>
-						<normal x="-0.002863" y="-0.999996" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060670" y="0.139104" z="-0.007338"/>
-						<normal x="-0.002863" y="-0.999996" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043713" y="0.134881" z="0.000000"/>
-						<normal x="0.002864" y="0.999996" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060682" y="0.134929" z="-0.007338"/>
-						<normal x="0.002864" y="0.999996" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060901" y="0.134930" z="0.006811"/>
-						<normal x="0.002864" y="0.999996" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043701" y="0.139056" z="0.000000"/>
-						<normal x="-0.002864" y="-0.999996" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060670" y="0.139104" z="-0.007338"/>
-						<normal x="-0.002864" y="-0.999996" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050511" y="0.139075" z="-0.017188"/>
-						<normal x="-0.002864" y="-0.999996" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043713" y="0.134881" z="0.000000"/>
-						<normal x="0.002864" y="0.999996" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050523" y="0.134900" z="-0.017188"/>
-						<normal x="0.002864" y="0.999996" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.060682" y="0.134929" z="-0.007338"/>
-						<normal x="0.002864" y="0.999996" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043701" y="0.139056" z="0.000000"/>
-						<normal x="-0.002865" y="-0.999996" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050511" y="0.139075" z="-0.017188"/>
-						<normal x="-0.002865" y="-0.999996" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036363" y="0.139035" z="-0.016970"/>
-						<normal x="-0.002865" y="-0.999996" z="-0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043713" y="0.134881" z="0.000000"/>
-						<normal x="0.002865" y="0.999996" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036375" y="0.134860" z="-0.016970"/>
-						<normal x="0.002865" y="0.999996" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.050523" y="0.134900" z="-0.017188"/>
-						<normal x="0.002865" y="0.999996" z="0.000001"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043701" y="0.139056" z="0.000000"/>
-						<normal x="-0.002863" y="-0.999996" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036363" y="0.139035" z="-0.016970"/>
-						<normal x="-0.002863" y="-0.999996" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026513" y="0.139006" z="-0.006811"/>
-						<normal x="-0.002863" y="-0.999996" z="0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043713" y="0.134881" z="0.000000"/>
-						<normal x="0.002863" y="0.999996" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026525" y="0.134831" z="-0.006811"/>
-						<normal x="0.002863" y="0.999996" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036375" y="0.134860" z="-0.016970"/>
-						<normal x="0.002863" y="0.999996" z="-0.000000"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043701" y="0.139056" z="0.000000"/>
-						<normal x="-0.002863" y="-0.999996" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026513" y="0.139006" z="-0.006811"/>
-						<normal x="-0.002863" y="-0.999996" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026731" y="0.139007" z="0.007338"/>
-						<normal x="-0.002863" y="-0.999996" z="-0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043713" y="0.134881" z="0.000000"/>
-						<normal x="0.002863" y="0.999996" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026743" y="0.134832" z="0.007338"/>
-						<normal x="0.002863" y="0.999996" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026525" y="0.134831" z="-0.006811"/>
-						<normal x="0.002863" y="0.999996" z="0.000002"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043701" y="0.139056" z="0.000000"/>
-						<normal x="-0.002866" y="-0.999996" z="0.000003"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026731" y="0.139007" z="0.007338"/>
-						<normal x="-0.002866" y="-0.999996" z="0.000003"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036890" y="0.139036" z="0.017188"/>
-						<normal x="-0.002866" y="-0.999996" z="0.000003"/>
-					</vertex>
-					<vertex>
-						<position x="-0.043713" y="0.134881" z="0.000000"/>
-						<normal x="0.002866" y="0.999996" z="-0.000003"/>
-					</vertex>
-					<vertex>
-						<position x="-0.036902" y="0.134861" z="0.017188"/>
-						<normal x="0.002866" y="0.999996" z="-0.000003"/>
-					</vertex>
-					<vertex>
-						<position x="-0.026743" y="0.134832" z="0.007338"/>
-						<normal x="0.002866" y="0.999996" z="-0.000003"/>
-					</vertex>
-				</vertexbuffer>
-			</geometry>
-		</submesh>
-	</submeshes>
-</mesh>
diff --git a/media/models/pioneer2at/Scene.material b/media/models/pioneer2at/Scene.material
deleted file mode 100644
index ebc8ef7..0000000
--- a/media/models/pioneer2at/Scene.material
+++ /dev/null
@@ -1,14 +0,0 @@
-material Material.005
-{
-	receive_shadows on
-	technique
-	{
-		pass
-		{
-			ambient 0.500000 0.500000 0.500000 1.000000
-			diffuse 0.072412 0.072412 0.072412 1.000000
-			specular 0.500000 0.500000 0.500000 1.000000 12.500000
-			emissive 0.000000 0.000000 0.000000 1.000000
-		}
-	}
-}
diff --git a/media/models/pioneer2at/chassis.mesh b/media/models/pioneer2at/chassis.mesh
deleted file mode 100644
index ec1c73f..0000000
Binary files a/media/models/pioneer2at/chassis.mesh and /dev/null differ
diff --git a/media/models/pioneer2at/chassis_top.mesh b/media/models/pioneer2at/chassis_top.mesh
deleted file mode 100644
index ef70069..0000000
Binary files a/media/models/pioneer2at/chassis_top.mesh and /dev/null differ
diff --git a/media/models/pioneer2at/hub.mesh b/media/models/pioneer2at/hub.mesh
deleted file mode 100644
index 2a34e4f..0000000
Binary files a/media/models/pioneer2at/hub.mesh and /dev/null differ
diff --git a/media/models/pioneer2at/pioneer3at.blend b/media/models/pioneer2at/pioneer3at.blend
deleted file mode 100644
index e91335b..0000000
Binary files a/media/models/pioneer2at/pioneer3at.blend and /dev/null differ
diff --git a/media/models/pioneer2at/sonar.mesh b/media/models/pioneer2at/sonar.mesh
deleted file mode 100644
index 4581c46..0000000
Binary files a/media/models/pioneer2at/sonar.mesh and /dev/null differ
diff --git a/media/models/pioneer2at/sonarbank.mesh b/media/models/pioneer2at/sonarbank.mesh
deleted file mode 100644
index a2674b5..0000000
Binary files a/media/models/pioneer2at/sonarbank.mesh and /dev/null differ
diff --git a/media/models/pioneer2at/tire.mesh b/media/models/pioneer2at/tire.mesh
deleted file mode 100644
index 265b65e..0000000
Binary files a/media/models/pioneer2at/tire.mesh and /dev/null differ
diff --git a/media/models/pioneer2at/wheel.mesh b/media/models/pioneer2at/wheel.mesh
deleted file mode 100644
index b663e1a..0000000
Binary files a/media/models/pioneer2at/wheel.mesh and /dev/null differ
diff --git a/media/models/quadrotor/CMakeLists.txt b/media/models/quadrotor/CMakeLists.txt
deleted file mode 100644
index 077f7b7..0000000
--- a/media/models/quadrotor/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-SET (files 
-quadrotor_base.dae
-)
-
-INSTALL(FILES ${files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/media/models/quadrotor)
diff --git a/media/models/quadrotor/quadrotor_base.dae b/media/models/quadrotor/quadrotor_base.dae
deleted file mode 100644
index 0065209..0000000
--- a/media/models/quadrotor/quadrotor_base.dae
+++ /dev/null
@@ -1,235 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
-  <asset>
-    <contributor>
-      <author>Stefan Kohlbrecher</author>
-      <authoring_tool>Blender 2.61.4 r43829</authoring_tool>
-    </contributor>
-    <created>2012-02-03T14:20:49</created>
-    <modified>2012-02-03T14:20:49</modified>
-    <unit name="meter" meter="1"/>
-    <up_axis>Z_UP</up_axis>
-  </asset>
-  <library_effects>
-    <effect id="BodyDark_001-effect">
-      <profile_COMMON>
-        <technique sid="common">
-          <phong>
-            <emission>
-              <color sid="emission">0 0 0 1</color>
-            </emission>
-            <ambient>
-              <color sid="ambient">0.1 0.1 0.1 1</color>
-            </ambient>
-            <diffuse>
-              <color sid="diffuse">1 0 0.0106101 1</color>
-            </diffuse>
-            <specular>
-              <color sid="specular">0.5 0.5 0.5 1</color>
-            </specular>
-            <shininess>
-              <float sid="shininess">50</float>
-            </shininess>
-            <index_of_refraction>
-              <float sid="index_of_refraction">1</float>
-            </index_of_refraction>
-          </phong>
-        </technique>
-        <extra>
-          <technique profile="GOOGLEEARTH">
-            <double_sided>1</double_sided>
-          </technique>
-        </extra>
-      </profile_COMMON>
-      <extra><technique profile="MAX3D"><double_sided>1</double_sided></technique></extra>
-    </effect>
-    <effect id="RotorGrey-effect">
-      <profile_COMMON>
-        <technique sid="common">
-          <phong>
-            <emission>
-              <color sid="emission">0.15 0.15 0.15 1</color>
-            </emission>
-            <ambient>
-              <color sid="ambient">0.2 0.2 0.2 1</color>
-            </ambient>
-            <diffuse>
-              <color sid="diffuse">0.48 0.48 0.48 1</color>
-            </diffuse>
-            <specular>
-              <color sid="specular">1 1 1 1</color>
-            </specular>
-            <shininess>
-              <float sid="shininess">33</float>
-            </shininess>
-            <index_of_refraction>
-              <float sid="index_of_refraction">1</float>
-            </index_of_refraction>
-          </phong>
-        </technique>
-        <extra>
-          <technique profile="GOOGLEEARTH">
-            <double_sided>1</double_sided>
-          </technique>
-        </extra>
-      </profile_COMMON>
-      <extra><technique profile="MAX3D"><double_sided>1</double_sided></technique></extra>
-    </effect>
-    <effect id="BodyDark-effect">
-      <profile_COMMON>
-        <technique sid="common">
-          <phong>
-            <emission>
-              <color sid="emission">0 0 0 1</color>
-            </emission>
-            <ambient>
-              <color sid="ambient">0.1 0.1 0.1 1</color>
-            </ambient>
-            <diffuse>
-              <color sid="diffuse">0.05496641 0.05496641 0.05496641 1</color>
-            </diffuse>
-            <specular>
-              <color sid="specular">0.5 0.5 0.5 1</color>
-            </specular>
-            <shininess>
-              <float sid="shininess">50</float>
-            </shininess>
-            <index_of_refraction>
-              <float sid="index_of_refraction">1</float>
-            </index_of_refraction>
-          </phong>
-        </technique>
-        <extra>
-          <technique profile="GOOGLEEARTH">
-            <double_sided>1</double_sided>
-          </technique>
-        </extra>
-      </profile_COMMON>
-      <extra><technique profile="MAX3D"><double_sided>1</double_sided></technique></extra>
-    </effect>
-    <effect id="RotorGrey2-effect">
-      <profile_COMMON>
-        <technique sid="common">
-          <phong>
-            <emission>
-              <color sid="emission">0.15 0.15 0.15 1</color>
-            </emission>
-            <ambient>
-              <color sid="ambient">0.23 0.23 0.23 1</color>
-            </ambient>
-            <diffuse>
-              <color sid="diffuse">0.5 0.5 0.5 1</color>
-            </diffuse>
-            <specular>
-              <color sid="specular">1 1 1 1</color>
-            </specular>
-            <shininess>
-              <float sid="shininess">20</float>
-            </shininess>
-            <index_of_refraction>
-              <float sid="index_of_refraction">1</float>
-            </index_of_refraction>
-          </phong>
-        </technique>
-        <extra>
-          <technique profile="GOOGLEEARTH">
-            <double_sided>1</double_sided>
-          </technique>
-        </extra>
-      </profile_COMMON>
-      <extra><technique profile="MAX3D"><double_sided>1</double_sided></technique></extra>
-    </effect>
-  </library_effects>
-  <library_materials>
-    <material id="BodyDark_001-material" name="BodyDark.001">
-      <instance_effect url="#BodyDark_001-effect"/>
-    </material>
-    <material id="RotorGrey-material" name="RotorGrey">
-      <instance_effect url="#RotorGrey-effect"/>
-    </material>
-    <material id="BodyDark-material" name="BodyDark">
-      <instance_effect url="#BodyDark-effect"/>
-    </material>
-    <material id="RotorGrey2-material" name="RotorGrey2">
-      <instance_effect url="#RotorGrey2-effect"/>
-    </material>
-  </library_materials>
-  <library_geometries>
-    <geometry id="Cube_002-mesh">
-      <mesh>
-        <source id="Cube_002-mesh-positions">
-          <float_array id="Cube_002-mesh-positions-array" count="900">0.8236175 0.673869 -1.366201 -0.8236175 0.6738689 -1.366201 -0.8236175 0.6852639 -1.361481 0.8236175 0.6852641 -1.361481 -0.8236175 0.6899839 -1.350086 0.8236175 0.689984 -1.350086 -0.8236175 0.6852639 -1.338691 0.8236175 0.685264 -1.338691 -0.8236175 0.6738689 -1.333971 0.8236175 0.673869 -1.333971 -0.8236175 0.6624739 -1.338691 0.8236175 0.662474 -1.338691 -0.8236175 0.657754 -1.350086 0.8236175 0.6577541 -1.350086 - [...]
-          <technique_common>
-            <accessor source="#Cube_002-mesh-positions-array" count="300" stride="3">
-              <param name="X" type="float"/>
-              <param name="Y" type="float"/>
-              <param name="Z" type="float"/>
-            </accessor>
-          </technique_common>
-        </source>
-        <source id="Cube_002-mesh-normals">
-          <float_array id="Cube_002-mesh-normals-array" count="1368">1 0 0 0.6302378 0 -0.7763603 0.6302378 0.548967 -0.548967 -0.6302378 0.548967 -0.548967 -0.6302378 0 -0.7763603 -1 0 0 0.6302378 0.7763603 0 -0.6302378 0.7763603 0 0.6302378 0.548967 0.548967 -0.6302378 0.548967 0.548967 0.6302378 0 0.7763603 -0.6302378 0 0.7763603 0.6302378 -0.548967 0.548967 -0.6302378 -0.548967 0.548967 0.6302378 -0.7763603 0 -0.6302378 -0.7763603 0 0.6302378 -0.548967 -0.548967 -0.6302378 -0.548967  [...]
-          <technique_common>
-            <accessor source="#Cube_002-mesh-normals-array" count="456" stride="3">
-              <param name="X" type="float"/>
-              <param name="Y" type="float"/>
-              <param name="Z" type="float"/>
-            </accessor>
-          </technique_common>
-        </source>
-        <vertices id="Cube_002-mesh-vertices">
-          <input semantic="POSITION" source="#Cube_002-mesh-positions"/>
-        </vertices>
-        <polylist material="BodyDark_0011" count="48">
-          <input semantic="VERTEX" source="#Cube_002-mesh-vertices" offset="0"/>
-          <input semantic="NORMAL" source="#Cube_002-mesh-normals" offset="1"/>
-          <vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
-          <p>60 36 36 36 37 36 61 37 49 37 48 37 60 38 37 38 38 38 61 39 50 39 49 39 60 40 38 40 39 40 61 41 51 41 50 41 60 42 39 42 40 42 61 43 52 43 51 43 60 44 40 44 41 44 61 45 53 45 52 45 60 46 41 46 42 46 61 47 54 47 53 47 60 48 42 48 43 48 61 49 55 49 54 49 60 50 43 50 44 50 61 51 56 51 55 51 60 52 44 52 45 52 61 53 57 53 56 53 60 54 45 54 46 54 61 55 58 55 57 55 60 56 46 56 47 56 61 57 59 57 58 57 47 58 36 58 60 58 61 59 48 59 59 59 48 432 36 433 47 434 48 432 47 434 59 435 46 43 [...]
-        </polylist>
-        <polylist material="RotorGrey2" count="64">
-          <input semantic="VERTEX" source="#Cube_002-mesh-vertices" offset="0"/>
-          <input semantic="NORMAL" source="#Cube_002-mesh-normals" offset="1"/>
-          <vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
-          <p>151 132 135 132 134 132 137 133 135 133 151 133 136 136 138 136 134 136 137 137 138 137 136 137 139 140 140 140 134 140 137 141 140 141 139 141 141 144 142 144 134 144 137 145 142 145 141 145 143 148 144 148 134 148 137 149 144 149 143 149 145 152 146 152 134 152 137 153 146 153 145 153 147 156 148 156 134 156 137 157 148 157 147 157 149 160 150 160 134 160 137 161 150 161 149 161 181 190 178 190 182 190 182 191 178 191 179 191 181 194 183 194 184 194 184 195 183 195 179 195 [...]
-        </polylist>
-        <polylist material="BodyDark3" count="364">
-          <input semantic="VERTEX" source="#Cube_002-mesh-vertices" offset="0"/>
-          <input semantic="NORMAL" source="#Cube_002-mesh-normals" offset="1"/>
-          <vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  [...]
-          <p>16 0 0 1 3 2 2 3 1 4 17 5 16 0 3 2 5 6 17 5 4 7 2 3 16 0 5 6 7 8 17 5 6 9 4 7 16 0 7 8 9 10 17 5 8 11 6 9 16 0 9 10 11 12 17 5 10 13 8 11 16 0 11 12 13 14 17 5 12 15 10 13 16 0 13 14 15 16 17 5 14 17 12 15 15 16 0 1 16 0 17 5 1 4 14 17 18 18 20 19 19 20 21 21 23 22 22 23 18 18 19 20 24 24 21 21 25 25 23 22 18 18 24 24 26 26 21 21 27 27 25 25 18 18 26 26 28 28 21 21 29 29 27 27 18 18 28 28 30 30 21 21 31 31 29 29 18 18 30 30 32 32 21 21 33 33 31 31 18 18 32 32 34 34 21 21 35  [...]
-        </polylist>
-        <polylist material="RotorGrey24" count="64">
-          <input semantic="VERTEX" source="#Cube_002-mesh-vertices" offset="0"/>
-          <input semantic="NORMAL" source="#Cube_002-mesh-normals" offset="1"/>
-          <vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
-          <p>137 134 136 134 135 134 135 135 136 135 134 135 137 138 139 138 138 138 138 139 139 139 134 139 137 142 141 142 140 142 140 143 141 143 134 143 137 146 143 146 142 146 142 147 143 147 134 147 137 150 145 150 144 150 144 151 145 151 134 151 137 154 147 154 146 154 146 155 147 155 134 155 137 158 149 158 148 158 148 159 149 159 134 159 137 162 151 162 150 162 150 163 151 163 134 163 178 188 180 188 179 188 181 189 180 189 178 189 183 192 182 192 179 192 181 193 182 193 183 193 [...]
-        </polylist>
-      </mesh>
-      <extra><technique profile="MAYA"><double_sided>1</double_sided></technique></extra>
-    </geometry>
-  </library_geometries>
-  <library_visual_scenes>
-    <visual_scene id="Scene" name="Scene">
-      <node id="MainBody_002" type="NODE">
-        <translate sid="location">0 0 0</translate>
-        <rotate sid="rotationZ">0 0 1 0</rotate>
-        <rotate sid="rotationY">0 1 0 0</rotate>
-        <rotate sid="rotationX">1 0 0 0</rotate>
-        <scale sid="scale">0.1335572 0.1335572 0.1335572</scale>
-        <instance_geometry url="#Cube_002-mesh">
-          <bind_material>
-            <technique_common>
-              <instance_material symbol="BodyDark_0011" target="#BodyDark_001-material"/>
-              <instance_material symbol="RotorGrey2" target="#RotorGrey-material"/>
-              <instance_material symbol="BodyDark3" target="#BodyDark-material"/>
-              <instance_material symbol="RotorGrey24" target="#RotorGrey2-material"/>
-            </technique_common>
-          </bind_material>
-        </instance_geometry>
-      </node>
-    </visual_scene>
-  </library_visual_scenes>
-  <scene>
-    <instance_visual_scene url="#Scene"/>
-  </scene>
-</COLLADA>
diff --git a/media/rtshaderlib/SGXLib_IntegratedPSSM.glsl b/media/rtshaderlib/SGXLib_IntegratedPSSM.glsl
index 3dc56da..9756811 100644
--- a/media/rtshaderlib/SGXLib_IntegratedPSSM.glsl
+++ b/media/rtshaderlib/SGXLib_IntegratedPSSM.glsl
@@ -43,47 +43,78 @@ void SGX_ModulateScalar(in float vIn0, in vec4 vIn1, out vec4 vOut)
 {
 	vOut = vIn0 * vIn1;
 }
-	
+
 //-----------------------------------------------------------------------------
-void SGX_ApplyShadowFactor_Diffuse(in vec4 ambient, 
-					  in vec4 lightSum, 
-					  in float fShadowFactor, 
+void SGX_ApplyShadowFactor_Diffuse(in vec4 ambient,
+					  in vec4 lightSum,
+					  in float fShadowFactor,
 					  out vec4 oLight)
 {
 	oLight.rgb = ambient.rgb + (lightSum.rgb - ambient.rgb) * (fShadowFactor);
 	oLight.a   = lightSum.a;
 }
-	
+
+//-----------------------------------------------------------------------------
+float texture2DCompare(sampler2D depths, vec2 uv, float compare)
+{
+  float depth = texture2D(depths, uv).r;
+  return (step(compare, depth) >= 1.0) ? 1.0 : 0.4;
+}
+
 //-----------------------------------------------------------------------------
 float _SGX_ShadowPCF4(sampler2D shadowMap, vec4 shadowMapPos, vec2 offset)
 {
-	shadowMapPos = shadowMapPos / shadowMapPos.w;
-	vec2 uv = shadowMapPos.xy;
-	vec3 o = vec3(offset, -offset.x) * 0.3;
+  // Interpolated 3x3 PCF
+  // Adapted from http://www.ogre3d.org/forums/viewtopic.php?f=1&t=78834
+
+  if (offset.x <= 0.0 || offset.y <= 0.0 || shadowMapPos.w <= 0.0)
+    return 1.0;
 
-  float z = shadowMapPos.z;
+  shadowMapPos = shadowMapPos / shadowMapPos.w;
+  vec2 uv = shadowMapPos.xy;
 
-	// Note: We using 2x2 PCF. Good enough and is a lot faster.
-  float c;
+  vec2 texelSize = offset;
+  vec2 size = 1.0 / offset;
+  vec2 centroidUV = floor(uv * size + 0.5) / size;
+  vec2 f = fract(uv * size + 0.5);
 
-  // top left
-	c =	(z < texture2D(shadowMap, uv.xy - o.xy).x) ? 1.0 : 0.4;
+  // 3 x 3 kernel
+  const int   X = 3;
 
-  // bottom right
-	c += (z < texture2D(shadowMap, uv.xy + o.xy).x) ? 1.0 : 0.4;
+  vec2 topLeft = centroidUV - texelSize * 1.5;
+
+  // load all pixels needed for the computation
+  // this way a pixel won't be loaded twice
+  float kernel[9];
+  for (int i = 0; i < X; ++i)
+  {
+    for (int j = 0; j < X; ++j)
+    {
+       kernel[i * X + j] = texture2DCompare(shadowMap,
+          topLeft + vec2(i, j) * texelSize, shadowMapPos.z);
+    }
+  }
 
-  // bottom left
-	c += (z < texture2D(shadowMap, uv.xy + o.zy).x) ? 1.0 : 0.4;
+  float kernel_interpolated[4];
 
-  // top right
-	c += (z < texture2D(shadowMap, uv.xy - o.zy).x) ? 1.0 : 0.4;
+  kernel_interpolated[0] = kernel[0] + kernel[1] + kernel[3] + kernel[4];
+  kernel_interpolated[0] /= 4.0;
+  kernel_interpolated[1] = kernel[1] + kernel[2] + kernel[4] + kernel[5];
+  kernel_interpolated[1] /= 4.0;
+  kernel_interpolated[2] = kernel[3] + kernel[4] + kernel[6] + kernel[7];
+  kernel_interpolated[2] /= 4.0;
+  kernel_interpolated[3] = kernel[4] + kernel[5] + kernel[7] + kernel[8];
+  kernel_interpolated[3] /= 4.0;
 
-	return c / 4.0;
+  float a = mix(kernel_interpolated[0], kernel_interpolated[1], f.y);
+  float b = mix(kernel_interpolated[2], kernel_interpolated[3], f.y);
+  float c = mix(a, b, f.x);
+  return c;
 }
 
 //-----------------------------------------------------------------------------
 void SGX_ComputeShadowFactor_PSSM3(in float fDepth,
-							in vec4 vSplitPoints,	
+							in vec4 vSplitPoints,
 							in vec4 lightPosition0,
 							in vec4 lightPosition1,
 							in vec4 lightPosition2,
@@ -92,22 +123,22 @@ void SGX_ComputeShadowFactor_PSSM3(in float fDepth,
 							in sampler2D shadowMap2,
 							in vec4 invShadowMapSize0,
 							in vec4 invShadowMapSize1,
-							in vec4 invShadowMapSize2,																			
+							in vec4 invShadowMapSize2,
 							out float oShadowFactor)
 {
   if (fDepth  <= vSplitPoints.x)
-  {									
+  {
     oShadowFactor =
-      _SGX_ShadowPCF4(shadowMap0, lightPosition0, invShadowMapSize0.xy);				
+      _SGX_ShadowPCF4(shadowMap0, lightPosition0, invShadowMapSize0.xy);
   }
   else if (fDepth <= vSplitPoints.y)
-  {									
+  {
     oShadowFactor =
-      _SGX_ShadowPCF4(shadowMap1, lightPosition1, invShadowMapSize1.xy);		
+      _SGX_ShadowPCF4(shadowMap1, lightPosition1, invShadowMapSize1.xy);
   }
   else
-  {										
+  {
     oShadowFactor =
-      _SGX_ShadowPCF4(shadowMap2, lightPosition2, invShadowMapSize2.xy);				
+      _SGX_ShadowPCF4(shadowMap2, lightPosition2, invShadowMapSize2.xy);
   }
 }
diff --git a/media/skyx/SkyX_Clouds.fragment b/media/skyx/SkyX_Clouds.fragment
index 048d8bd..11ea742 100644
--- a/media/skyx/SkyX_Clouds.fragment
+++ b/media/skyx/SkyX_Clouds.fragment
@@ -90,4 +90,4 @@ void main(void)
   #else // HDR
     gl_FragColor.xyz *= pow(uExposure, 0.5);
   #endif
-}
\ No newline at end of file
+}
diff --git a/media/skyx/SkyX_Skydome.fragment b/media/skyx/SkyX_Skydome.fragment
index 81f69e0..38dfe4c 100644
--- a/media/skyx/SkyX_Skydome.fragment
+++ b/media/skyx/SkyX_Skydome.fragment
@@ -44,7 +44,7 @@ uniform sampler2D uStarfield;
 
 void main(void)
 {
-    float cos = dot(uLightDir, vDirection) / length(vDirection);
+  float cos = dot(uLightDir, vDirection) / length(vDirection);
 	float cos2 = cos*cos;
 	
 	float rayleighPhase = 0.75 * (1.0 + 0.5*cos2);
@@ -63,15 +63,15 @@ void main(void)
 	
 #ifdef STARFIELD
 	#ifdef LDR
-		gl_FragColor.xyz += nightmult *(vec3(0.05, 0.05, 0.1)*(2.0-0.75*clamp(-uLightDir.y, 0.0, 1.0))*pow(vHeight,3.0) + texture2D(uStarfield, vUV+uTime).xyz*(0.35 + clamp(-uLightDir.y*0.45, 0.0, 1.0))); 
+		gl_FragColor.xyz += nightmult *(vec3(0.05, 0.05, 0.1)*(2.0-0.75*clamp(-uLightDir.y, 0.0, 1.0))*pow(vHeight, 3.0) + texture2D(uStarfield, vUV+uTime).xyz*(0.35 + clamp(-uLightDir.y*0.45, 0.0, 1.0))); 
 	#else // HDR (Linear pipeline -> Gamma correction)
-		gl_FragColor.xyz += nightmult *(pow(vec3(0.05, 0.05, 0.1)*(2.0-0.75*clamp(-uLightDir.y, 0.0, 1.0))*pow(vHeight,3.0), 2.2) + texture2D(uStarfield, vUV+uTime).xyz*(0.35 + clamp(-uLightDir.y*0.45, 0.0, 1.0))); 
+		gl_FragColor.xyz += nightmult * (pow(vec3(0.05, 0.05, 0.1) * (2.0-0.75*clamp(-uLightDir.y, 0.0, 1.0))*pow(vHeight, 3.0), vec3(2.2, 2.2, 2.2)) + texture2D(uStarfield, vUV+uTime).xyz*(0.35 + clamp(-uLightDir.y*0.45, 0.0, 1.0))); 
 	#endif // LDR
 #else // NO STARFIELD
 	#ifdef LDR
 		gl_FragColor.xyz += nightmult *(vec3(0.05, 0.05, 0.1)*(2.0-0.75*clamp(-uLightDir.y, 0.0, 1.0))*pow(vHeight,3.0)); 
 	#else // HDR (Linear pipeline -> Gamma correction)
-		gl_FragColor.xyz += nightmult * pow(vec3(0.05, 0.05, 0.1)*(2.0-0.75*clamp(-uLightDir.y, 0.0, 1.0))*pow(vHeight,3.0), 2.2);  
+		gl_FragColor.xyz += nightmult * pow(vec3(0.05, 0.05, 0.1)*(2.0-0.75*clamp(-uLightDir.y, 0.0, 1.0))*pow(vHeight,3.0), vec3(2.2, 2.2, 2.2));
 	#endif // LDR
 #endif // STARFIELD	
-}
\ No newline at end of file
+}
diff --git a/plugins/BreakableJointPlugin.cc b/plugins/BreakableJointPlugin.cc
new file mode 100644
index 0000000..e1f239b
--- /dev/null
+++ b/plugins/BreakableJointPlugin.cc
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/PhysicsIface.hh"
+#include "BreakableJointPlugin.hh"
+
+using namespace gazebo;
+
+// Register this plugin with the simulator
+GZ_REGISTER_SENSOR_PLUGIN(BreakableJointPlugin)
+
+/////////////////////////////////////////////////
+BreakableJointPlugin::BreakableJointPlugin()
+  : breakingForce(1.0)
+{
+}
+
+/////////////////////////////////////////////////
+BreakableJointPlugin::~BreakableJointPlugin()
+{
+}
+
+/////////////////////////////////////////////////
+void BreakableJointPlugin::Load(sensors::SensorPtr _parent,
+    sdf::ElementPtr _sdf)
+{
+  ForceTorquePlugin::Load(_parent, _sdf);
+
+  std::string paramName = "breaking_force_N";
+  if (_sdf->HasElement(paramName))
+    this->breakingForce = _sdf->Get<double>(paramName);
+
+  this->parentJoint = this->parentSensor->GetJoint();
+}
+
+/////////////////////////////////////////////////
+void BreakableJointPlugin::OnUpdate(msgs::WrenchStamped _msg)
+{
+  if (this->parentJoint)
+  {
+    math::Vector3 force = msgs::Convert(_msg.wrench().force());
+    if (force.GetLength() > this->breakingForce)
+    {
+      this->worldConnection = event::Events::ConnectWorldUpdateBegin(
+        boost::bind(&BreakableJointPlugin::OnWorldUpdate, this));
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void BreakableJointPlugin::OnWorldUpdate()
+{
+  this->parentSensor->SetActive(false);
+  this->parentJoint->Detach();
+  this->parentJoint->SetProvideFeedback(false);
+  event::Events::DisconnectWorldUpdateBegin(this->worldConnection);
+}
diff --git a/plugins/BreakableJointPlugin.hh b/plugins/BreakableJointPlugin.hh
new file mode 100644
index 0000000..ac86b4d
--- /dev/null
+++ b/plugins/BreakableJointPlugin.hh
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_BREAKABLE_JOINT_PLUGIN_HH_
+#define _GAZEBO_BREAKABLE_JOINT_PLUGIN_HH_
+
+#include "plugins/ForceTorquePlugin.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/common/Events.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  /// \brief A plugin for breakable joints, based on a ForceTorque sensor plugin
+  class GAZEBO_VISIBLE BreakableJointPlugin : public ForceTorquePlugin
+  {
+    /// \brief Constructor
+    public: BreakableJointPlugin();
+
+    /// \brief Destructor
+    public: virtual ~BreakableJointPlugin();
+
+    /// \brief Load the plugin.
+    /// \param[in] _parent Pointer to the parent sensor.
+    /// \param[in] _sdf SDF element for the plugin.
+    public: virtual void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf);
+
+    /// \brief Overloaded Update callback.
+    /// \param[in] _msg The force torque message.
+    protected: virtual void OnUpdate(msgs::WrenchStamped _msg);
+
+    /// \brief WorldUpdate callback, used to safely detach parent joint.
+    protected: void OnWorldUpdate();
+
+    /// \brief Pointer to the parent joint
+    private: physics::JointPtr parentJoint;
+
+    /// \brief Pointer to the world update event connection
+    private: event::ConnectionPtr worldConnection;
+
+    /// \brief Breaking force threshold (N).
+    private: double breakingForce;
+  };
+}
+#endif
diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
index 74594d9..63cd962 100644
--- a/plugins/CMakeLists.txt
+++ b/plugins/CMakeLists.txt
@@ -1,39 +1,55 @@
 include_directories(
-  ${PROJECT_BINARY_DIR}/gazebo
-  ${PROJECT_SOURCE_DIR}/gazebo
+  ${PROJECT_SOURCE_DIR}
   ${PROTOBUF_INCLUDE_DIR}
+  ${SDF_INCLUDE_DIRS}
+  ${OGRE_INCLUDE_DIRS}
 )
 
-if(HAVE_URDFDOM_HEADERS)
-  link_directories(
-    ${urdfdom_LIBRARY_DIRS}
-    ${urdfdom_headers_LIBRARY_DIRS})
-endif(HAVE_URDFDOM_HEADERS)
+# Tinyxml are used since the plugins are linking against gazebo_common
+# which uses tinxyml. Not defining the link directory here will end up 
+# failures in clang.
+link_directories(
+  ${SDF_LIBRARY_DIRS}
+  ${tinyxml_LIBRARY_DIRS}
+)
 
-if(HAVE_CONSOLE_BRIDGE)
-  link_directories(
-    ${console_bridge_LIBRARY_DIRS})
-endif(HAVE_CONSOLE_BRIDGE)
+if (HAVE_BULLET)
+  link_directories(${BULLET_LIBRARY_DIRS})
+endif()
 
 set (plugins
+  BreakableJointPlugin
   CameraPlugin
-  DepthCameraPlugin
-  GpuRayPlugin
+  CartDemoPlugin
   ContactPlugin
-  CartTestPlugin
+  DepthCameraPlugin
+  DiffDrivePlugin
   ForceTorquePlugin
-  ModelTrajectoryTestPlugin
+  GpuRayPlugin
+  JointTrajectoryPlugin
+  LiftDragPlugin
+  ModelPropShop
+  MudPlugin
+  PressurePlugin
   RayPlugin
+  RaySensorNoisePlugin
   RubblePlugin
-  SpringTestPlugin
-  DiffDrivePlugin
   SkidSteerDrivePlugin
-  JointTrajectoryPlugin
+  SonarPlugin
+  SphereAtlasDemoPlugin
   VehiclePlugin)
 
+set(GAZEBO_PLUGIN_INSTALL_DIR
+  ${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/gazebo-${GAZEBO_VERSION}/plugins/
+)
 foreach (src ${plugins})
   add_library(${src} SHARED ${src}.cc)
-  target_link_libraries(${src} libgazebo gazebo_sensors)
-  install (TARGETS ${src} DESTINATION ${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/gazebo-${GAZEBO_VERSION}/plugins/)
+  target_link_libraries(${src} libgazebo gazebo_sensors ${ogre_libraries})
+  install (TARGETS ${src} DESTINATION ${GAZEBO_PLUGIN_INSTALL_DIR})
   gz_install_includes("plugins" ${src}.hh)
 endforeach (src ${plugins})
+
+target_link_libraries(BreakableJointPlugin ForceTorquePlugin)
+set_target_properties(BreakableJointPlugin PROPERTIES
+  INSTALL_RPATH ${GAZEBO_PLUGIN_INSTALL_DIR}
+)
diff --git a/plugins/CameraPlugin.cc b/plugins/CameraPlugin.cc
index e71d6b5..a4ebb6a 100644
--- a/plugins/CameraPlugin.cc
+++ b/plugins/CameraPlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  * limitations under the License.
  *
 */
-#include "sensors/DepthCameraSensor.hh"
+#include "gazebo/sensors/DepthCameraSensor.hh"
 #include "plugins/CameraPlugin.hh"
 
 using namespace gazebo;
diff --git a/plugins/CameraPlugin.hh b/plugins/CameraPlugin.hh
index 13c446e..29b35a6 100644
--- a/plugins/CameraPlugin.hh
+++ b/plugins/CameraPlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,14 +19,15 @@
 
 #include <string>
 
-#include "common/Plugin.hh"
-#include "sensors/CameraSensor.hh"
-#include "rendering/Camera.hh"
-#include "gazebo.hh"
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/sensors/CameraSensor.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  class CameraPlugin : public SensorPlugin
+  class GAZEBO_VISIBLE CameraPlugin : public SensorPlugin
   {
     public: CameraPlugin();
 
diff --git a/plugins/CartDemoPlugin.cc b/plugins/CartDemoPlugin.cc
new file mode 100644
index 0000000..46076c2
--- /dev/null
+++ b/plugins/CartDemoPlugin.cc
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/transport.hh"
+#include "plugins/CartDemoPlugin.hh"
+
+using namespace gazebo;
+GZ_REGISTER_MODEL_PLUGIN(CartDemoPlugin)
+
+/////////////////////////////////////////////////
+CartDemoPlugin::CartDemoPlugin()
+{
+  for (int i = 0; i < NUM_JOINTS; i++)
+  {
+    this->jointPIDs[i] = common::PID(1, 0.1, 0.01, 1, -1);
+    this->jointPositions[i] = 0;
+    this->jointVelocities[i] = 0;
+    this->jointMaxEfforts[i] = 100;
+  }
+}
+
+/////////////////////////////////////////////////
+void CartDemoPlugin::Load(physics::ModelPtr _model,
+                           sdf::ElementPtr _sdf)
+{
+  this->model = _model;
+
+  this->node = transport::NodePtr(new transport::Node());
+  this->node->Init(this->model->GetWorld()->GetName());
+
+  if (!_sdf->HasElement("steer"))
+    gzerr << "CartTest plugin missing <steer> element\n";
+
+  // get all joints
+  this->joints[0] = _model->GetJoint(
+    _sdf->GetElement("steer")->Get<std::string>());
+  this->jointPIDs[0] = common::PID(
+    _sdf->GetElement("steer_pid")->Get<math::Vector3>().x,
+    _sdf->GetElement("steer_pid")->Get<math::Vector3>().y,
+    _sdf->GetElement("steer_pid")->Get<math::Vector3>().z,
+    _sdf->GetElement("steer_ilim")->Get<math::Vector2d>().y,
+    _sdf->GetElement("steer_ilim")->Get<math::Vector2d>().x);
+  this->jointPositions[0] =
+    _sdf->GetElement("steer_pos")->Get<double>();
+  this->jointVelocities[0] =
+    _sdf->GetElement("steer_vel")->Get<double>();
+  this->jointMaxEfforts[0] =
+    _sdf->GetElement("steer_eff")->Get<double>();
+
+  this->joints[1] = _model->GetJoint(
+    _sdf->GetElement("right")->Get<std::string>());
+  this->jointPIDs[1] = common::PID(
+    _sdf->GetElement("right_pid")->Get<math::Vector3>().x,
+    _sdf->GetElement("right_pid")->Get<math::Vector3>().y,
+    _sdf->GetElement("right_pid")->Get<math::Vector3>().z,
+    _sdf->GetElement("right_ilim")->Get<math::Vector2d>().y,
+    _sdf->GetElement("right_ilim")->Get<math::Vector2d>().x);
+  this->jointPositions[1] =
+    _sdf->GetElement("right_pos")->Get<double>();
+  this->jointVelocities[1] =
+    _sdf->GetElement("right_vel")->Get<double>();
+  this->jointMaxEfforts[1] =
+    _sdf->GetElement("right_eff")->Get<double>();
+
+  this->joints[2] = _model->GetJoint(
+    _sdf->GetElement("left")->Get<std::string>());
+  this->jointPIDs[2] = common::PID(
+    _sdf->GetElement("left_pid")->Get<math::Vector3>().x,
+    _sdf->GetElement("left_pid")->Get<math::Vector3>().y,
+    _sdf->GetElement("left_pid")->Get<math::Vector3>().z,
+    _sdf->GetElement("left_ilim")->Get<math::Vector2d>().y,
+    _sdf->GetElement("left_ilim")->Get<math::Vector2d>().x);
+  this->jointPositions[2] =
+    _sdf->GetElement("left_pos")->Get<double>();
+  this->jointVelocities[2] =
+    _sdf->GetElement("left_vel")->Get<double>();
+  this->jointMaxEfforts[2] =
+    _sdf->GetElement("left_eff")->Get<double>();
+
+  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
+          boost::bind(&CartDemoPlugin::OnUpdate, this));
+}
+
+/////////////////////////////////////////////////
+void CartDemoPlugin::Init()
+{
+  // physics::EntityPtr parent = boost::dynamic_pointer_cast<physics::Entity>(
+  //   this->joints[0]->GetChild());
+}
+
+/////////////////////////////////////////////////
+void CartDemoPlugin::OnUpdate()
+{
+  common::Time currTime = this->model->GetWorld()->GetSimTime();
+  common::Time stepTime = currTime - this->prevUpdateTime;
+  this->prevUpdateTime = currTime;
+
+  for (int i = 0; i < 1; i++)
+  {
+    // first joint, set position
+    double pos_target = this->jointPositions[i];
+    double pos_curr = this->joints[i]->GetAngle(0).Radian();
+    double max_cmd = this->jointMaxEfforts[i];
+
+    double pos_err = pos_curr - pos_target;
+
+    double effort_cmd = this->jointPIDs[i].Update(pos_err, stepTime);
+    effort_cmd = effort_cmd > max_cmd ? max_cmd :
+      (effort_cmd < -max_cmd ? -max_cmd : effort_cmd);
+    this->joints[i]->SetForce(0, effort_cmd);
+    gzdbg << "steer [" << pos_curr << "] [" << pos_target << "]";
+  }
+
+  for (int i = 1; i < NUM_JOINTS; i++)
+  {
+    double tmp_t = currTime.Double();
+    double eff;
+    // custom test
+    if (tmp_t < 10)      eff = 0;
+    else if (tmp_t < 20) eff = this->jointMaxEfforts[i];
+    else if (tmp_t < 30) eff = -this->jointMaxEfforts[i];
+    else if (tmp_t < 40) eff = -this->jointMaxEfforts[i];
+    else if (tmp_t < 50) eff = this->jointMaxEfforts[i];
+    else if (tmp_t < 60)
+    {
+      /* pid to velocity */
+      double vel_target = this->jointVelocities[i];
+      double vel_curr = this->joints[i]->GetVelocity(0);
+      double max_cmd = 100.0;  // this->jointMaxEfforts[i];
+
+      double vel_err = vel_curr - vel_target;
+
+      eff = this->jointPIDs[i].Update(vel_err, stepTime);
+      eff = eff > max_cmd ? max_cmd :
+        (eff < -max_cmd ? -max_cmd : eff);
+    }
+    else
+    {
+      // hold wheel positions
+      double pos_target = this->jointPositions[i];
+      double pos_curr = this->joints[i]->GetAngle(0).Radian();
+      double max_cmd = 100;  // this->jointMaxEfforts[i];
+
+      double pos_err = pos_curr - pos_target;
+
+      eff = this->jointPIDs[i].Update(pos_err, stepTime);
+      eff = eff > max_cmd ? max_cmd :
+        (eff < -max_cmd ? -max_cmd : eff);
+      // gzdbg << "wheel pos [" << pos_curr << "] tar [" << pos_target << "]\n";
+    }
+
+    gzdbg << " wheel pos ["
+          << this->joints[i]->GetAngle(0).Radian()
+          << "] vel ["
+          << this->joints[i]->GetVelocity(0)
+          << "] effort [" << eff << "]";
+    this->joints[i]->SetForce(0, eff);
+  }
+  gzdbg << "\n";
+}
diff --git a/plugins/CartDemoPlugin.hh b/plugins/CartDemoPlugin.hh
new file mode 100644
index 0000000..69f1890
--- /dev/null
+++ b/plugins/CartDemoPlugin.hh
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#ifndef _GAZEBO_CART_DEMO_PLUGIN_HH_
+#define _GAZEBO_CART_DEMO_PLUGIN_HH_
+
+#include "gazebo/common/common.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
+
+#define NUM_JOINTS 3
+
+namespace gazebo
+{
+  /// \brief This plugin drives a four wheeled cart model forward and back
+  /// by applying a small wheel torque.  Steering is controlled via
+  /// a position pid.
+  /// this is a test for general rolling contact stability.
+  /// should refine the test to be more specific in the future.
+  class GAZEBO_VISIBLE CartDemoPlugin : public ModelPlugin
+  {
+    public: CartDemoPlugin();
+    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
+    public: virtual void Init();
+
+    private: void OnUpdate();
+
+    private: transport::NodePtr node;
+
+    private: event::ConnectionPtr updateConnection;
+
+    private: physics::ModelPtr model;
+
+    private: physics::JointPtr joints[NUM_JOINTS];
+    private: common::PID jointPIDs[NUM_JOINTS];
+    private: double jointPositions[NUM_JOINTS];
+    private: double jointVelocities[NUM_JOINTS];
+    private: double jointMaxEfforts[NUM_JOINTS];
+
+    private: common::Time prevUpdateTime;
+  };
+}
+#endif
diff --git a/plugins/CartTestPlugin.cc b/plugins/CartTestPlugin.cc
deleted file mode 100644
index 2d80fea..0000000
--- a/plugins/CartTestPlugin.cc
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-
-/*
- *  this plugin drives a four wheeled cart model forward and back
- *  by applying a small wheel torque.  Steering is controlled via
- *  a position pid.
- *  this is a test for general rolling contact stability.
- *  should refine the test to be more specific in the future.
-*/
-
-#include "physics/physics.hh"
-#include "transport/transport.hh"
-#include "plugins/CartTestPlugin.hh"
-
-using namespace gazebo;
-GZ_REGISTER_MODEL_PLUGIN(CartTestPlugin)
-
-/////////////////////////////////////////////////
-CartTestPlugin::CartTestPlugin()
-{
-  for (int i = 0; i < NUM_JOINTS; i++)
-  {
-    this->jointPIDs[i] = common::PID(1, 0.1, 0.01, 1, -1);
-    this->jointPositions[i] = 0;
-    this->jointVelocities[i] = 0;
-    this->jointMaxEfforts[i] = 100;
-  }
-}
-
-/////////////////////////////////////////////////
-void CartTestPlugin::Load(physics::ModelPtr _model,
-                           sdf::ElementPtr _sdf)
-{
-  this->model = _model;
-
-  this->node = transport::NodePtr(new transport::Node());
-  this->node->Init(this->model->GetWorld()->GetName());
-
-  if (!_sdf->HasElement("steer"))
-    gzerr << "CartTest plugin missing <steer> element\n";
-
-  // get all joints
-  this->joints[0] = _model->GetJoint(
-    _sdf->GetElement("steer")->GetValueString());
-  this->jointPIDs[0] = common::PID(
-    _sdf->GetElement("steer_pid")->GetValueVector3().x,
-    _sdf->GetElement("steer_pid")->GetValueVector3().y,
-    _sdf->GetElement("steer_pid")->GetValueVector3().z,
-    _sdf->GetElement("steer_ilim")->GetValueVector2d().y,
-    _sdf->GetElement("steer_ilim")->GetValueVector2d().x);
-  this->jointPositions[0] =
-    _sdf->GetElement("steer_pos")->GetValueDouble();
-  this->jointVelocities[0] =
-    _sdf->GetElement("steer_vel")->GetValueDouble();
-  this->jointMaxEfforts[0] =
-    _sdf->GetElement("steer_eff")->GetValueDouble();
-
-  this->joints[1] = _model->GetJoint(
-    _sdf->GetElement("right")->GetValueString());
-  this->jointPIDs[1] = common::PID(
-    _sdf->GetElement("right_pid")->GetValueVector3().x,
-    _sdf->GetElement("right_pid")->GetValueVector3().y,
-    _sdf->GetElement("right_pid")->GetValueVector3().z,
-    _sdf->GetElement("right_ilim")->GetValueVector2d().y,
-    _sdf->GetElement("right_ilim")->GetValueVector2d().x);
-  this->jointPositions[1] =
-    _sdf->GetElement("right_pos")->GetValueDouble();
-  this->jointVelocities[1] =
-    _sdf->GetElement("right_vel")->GetValueDouble();
-  this->jointMaxEfforts[1] =
-    _sdf->GetElement("right_eff")->GetValueDouble();
-
-  this->joints[2] = _model->GetJoint(
-    _sdf->GetElement("left")->GetValueString());
-  this->jointPIDs[2] = common::PID(
-    _sdf->GetElement("left_pid")->GetValueVector3().x,
-    _sdf->GetElement("left_pid")->GetValueVector3().y,
-    _sdf->GetElement("left_pid")->GetValueVector3().z,
-    _sdf->GetElement("left_ilim")->GetValueVector2d().y,
-    _sdf->GetElement("left_ilim")->GetValueVector2d().x);
-  this->jointPositions[2] =
-    _sdf->GetElement("left_pos")->GetValueDouble();
-  this->jointVelocities[2] =
-    _sdf->GetElement("left_vel")->GetValueDouble();
-  this->jointMaxEfforts[2] =
-    _sdf->GetElement("left_eff")->GetValueDouble();
-
-  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
-          boost::bind(&CartTestPlugin::OnUpdate, this));
-}
-
-/////////////////////////////////////////////////
-void CartTestPlugin::Init()
-{
-  // physics::EntityPtr parent = boost::dynamic_pointer_cast<physics::Entity>(
-  //   this->joints[0]->GetChild());
-}
-
-/////////////////////////////////////////////////
-void CartTestPlugin::OnUpdate()
-{
-  common::Time currTime = this->model->GetWorld()->GetSimTime();
-  common::Time stepTime = currTime - this->prevUpdateTime;
-  this->prevUpdateTime = currTime;
-
-
-  for (int i = 0; i < 1; i++)
-  {
-    // first joint, set position
-    double pos_target = this->jointPositions[i];
-    double pos_curr = this->joints[i]->GetAngle(0).Radian();
-    double max_cmd = this->jointMaxEfforts[i];
-
-    double pos_err = pos_curr - pos_target;
-
-    double effort_cmd = this->jointPIDs[i].Update(pos_err, stepTime);
-    effort_cmd = effort_cmd > max_cmd ? max_cmd :
-      (effort_cmd < -max_cmd ? -max_cmd : effort_cmd);
-    this->joints[i]->SetForce(0, effort_cmd);
-    gzdbg << "steer [" << pos_curr << "] [" << pos_target << "]";
-  }
-
-  for (int i = 1; i < NUM_JOINTS; i++)
-  {
-    double tmp_t = currTime.Double();
-    double eff;
-    // custom test
-    if (tmp_t < 10)      eff = 0;
-    else if (tmp_t < 20) eff = this->jointMaxEfforts[i];
-    else if (tmp_t < 30) eff = -this->jointMaxEfforts[i];
-    else if (tmp_t < 40) eff = -this->jointMaxEfforts[i];
-    else if (tmp_t < 50) eff = this->jointMaxEfforts[i];
-    else if (tmp_t < 60)
-    {
-      /* pid to velocity */
-      double vel_target = this->jointVelocities[i];
-      double vel_curr = this->joints[i]->GetVelocity(0);
-      double max_cmd = 100.0;  // this->jointMaxEfforts[i];
-
-      double vel_err = vel_curr - vel_target;
-
-      eff = this->jointPIDs[i].Update(vel_err, stepTime);
-      eff = eff > max_cmd ? max_cmd :
-        (eff < -max_cmd ? -max_cmd : eff);
-    }
-    else
-    {
-      // hold wheel positions
-      double pos_target = this->jointPositions[i];
-      double pos_curr = this->joints[i]->GetAngle(0).Radian();
-      double max_cmd = 100;  // this->jointMaxEfforts[i];
-
-      double pos_err = pos_curr - pos_target;
-
-      eff = this->jointPIDs[i].Update(pos_err, stepTime);
-      eff = eff > max_cmd ? max_cmd :
-        (eff < -max_cmd ? -max_cmd : eff);
-      // gzdbg << "wheel pos [" << pos_curr << "] tar [" << pos_target << "]\n";
-    }
-
-    gzdbg << " wheel pos ["
-          << this->joints[i]->GetAngle(0).Radian()
-          << "] vel ["
-          << this->joints[i]->GetVelocity(0)
-          << "] effort [" << eff << "]";
-    this->joints[i]->SetForce(0, eff);
-  }
-  gzdbg << "\n";
-}
diff --git a/plugins/CartTestPlugin.hh b/plugins/CartTestPlugin.hh
deleted file mode 100644
index 96650dc..0000000
--- a/plugins/CartTestPlugin.hh
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef __GAZEBO_CART_TEST_PLUGIN_HH__
-#define __GAZEBO_CART_TEST_PLUGIN_HH__
-
-#include "gazebo/common/common.hh"
-#include "gazebo/physics/physics.hh"
-#include "gazebo/transport/TransportTypes.hh"
-#include "gazebo/gazebo.hh"
-
-#define NUM_JOINTS 3
-namespace gazebo
-{
-  class CartTestPlugin : public ModelPlugin
-  {
-    public: CartTestPlugin();
-    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
-    public: virtual void Init();
-
-    private: void OnUpdate();
-
-    private: transport::NodePtr node;
-
-    private: event::ConnectionPtr updateConnection;
-
-    private: physics::ModelPtr model;
-
-    private: physics::JointPtr joints[NUM_JOINTS];
-    private: common::PID jointPIDs[NUM_JOINTS];
-    private: double jointPositions[NUM_JOINTS];
-    private: double jointVelocities[NUM_JOINTS];
-    private: double jointMaxEfforts[NUM_JOINTS];
-
-    private: common::Time prevUpdateTime;
-  };
-}
-#endif
diff --git a/plugins/ContactPlugin.cc b/plugins/ContactPlugin.cc
index 4837371..855d988 100644
--- a/plugins/ContactPlugin.cc
+++ b/plugins/ContactPlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -12,9 +12,7 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- *
-*/
-/*
+ * */ /*
  * Desc: Contact plugin
  * Author: Nate Koenig mod by John Hsu
  */
@@ -58,8 +56,9 @@ void ContactPlugin::Load(sensors::SensorPtr _sensor, sdf::ElementPtr /*_sdf*/)
 /////////////////////////////////////////////////
 void ContactPlugin::OnUpdate()
 {
+  // Uncoment the following lines for debug output
   // Get all the contacts.
-  msgs::Contacts contacts;
+  /*msgs::Contacts contacts;
   contacts = this->parentSensor->GetContacts();
   for (int i = 0; i < contacts.contact_size(); ++i)
   {
@@ -79,11 +78,12 @@ void ContactPlugin::OnUpdate()
       std::cout << "   Depth:" << contacts.contact(i).depth(j) << "\n";
       std::cout << "   Normal force 1: "
                 << contacts.contact(i).normal(j).x() *
-                   contacts.contact(i).wrench(j).body_1_force().x() +
+                   contacts.contact(i).wrench(j).body_1_wrench().force().x() +
                    contacts.contact(i).normal(j).y() *
-                   contacts.contact(i).wrench(j).body_1_force().y() +
+                   contacts.contact(i).wrench(j).body_1_wrench().force().y() +
                    contacts.contact(i).normal(j).z() *
-                   contacts.contact(i).wrench(j).body_1_force().z() << "\n";
+                   contacts.contact(i).wrench(j).body_1_wrench().force().z()
+                   << "\n";
     }
-  }
+  }*/
 }
diff --git a/plugins/ContactPlugin.hh b/plugins/ContactPlugin.hh
index f79d5bc..3845066 100644
--- a/plugins/ContactPlugin.hh
+++ b/plugins/ContactPlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,12 +25,13 @@
 
 #include <gazebo/gazebo.hh>
 #include <gazebo/sensors/sensors.hh>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
   /// \brief A plugin for a contact sensor. Inherit from this class to make
   /// your own contact plugin.
-  class ContactPlugin : public SensorPlugin
+  class GAZEBO_VISIBLE ContactPlugin : public SensorPlugin
   {
     /// \brief Constructor.
     public: ContactPlugin();
diff --git a/plugins/DepthCameraPlugin.cc b/plugins/DepthCameraPlugin.cc
index 579c4a2..13db573 100644
--- a/plugins/DepthCameraPlugin.cc
+++ b/plugins/DepthCameraPlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -82,7 +82,7 @@ void DepthCameraPlugin::OnNewDepthFrame(const float *_image,
   }
 
   int index =  ((_height * 0.5) * _width) + _width * 0.5;
-  printf("W[%d] H[%d] MidPoint[%d] Dist[%f] Min[%f] Max[%f]\n",
+  printf("W[%u] H[%u] MidPoint[%d] Dist[%f] Min[%f] Max[%f]\n",
       width, height, index, _image[index], min, max);
 
   /*rendering::Camera::SaveFrame(_image, this->width,
diff --git a/plugins/DepthCameraPlugin.hh b/plugins/DepthCameraPlugin.hh
index 49f7101..42c5d49 100644
--- a/plugins/DepthCameraPlugin.hh
+++ b/plugins/DepthCameraPlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,15 +20,16 @@
 
 #include <string>
 
-#include "common/Plugin.hh"
-#include "sensors/DepthCameraSensor.hh"
-#include "sensors/CameraSensor.hh"
-#include "rendering/DepthCamera.hh"
-#include "gazebo.hh"
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/sensors/DepthCameraSensor.hh"
+#include "gazebo/sensors/CameraSensor.hh"
+#include "gazebo/rendering/DepthCamera.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  class DepthCameraPlugin : public SensorPlugin
+  class GAZEBO_VISIBLE DepthCameraPlugin : public SensorPlugin
   {
     /// \brief Constructor
     public: DepthCameraPlugin();
diff --git a/plugins/DiffDrivePlugin.cc b/plugins/DiffDrivePlugin.cc
index 2de806c..fb0040e 100644
--- a/plugins/DiffDrivePlugin.cc
+++ b/plugins/DiffDrivePlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,8 +15,8 @@
  *
 */
 
-#include "physics/physics.hh"
-#include "transport/transport.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/transport.hh"
 #include "plugins/DiffDrivePlugin.hh"
 
 using namespace gazebo;
@@ -49,12 +49,12 @@ void DiffDrivePlugin::Load(physics::ModelPtr _model,
     gzerr << "DiffDrive plugin missing <right_joint> element\n";
 
   this->leftJoint = _model->GetJoint(
-      _sdf->GetElement("left_joint")->GetValueString());
+      _sdf->GetElement("left_joint")->Get<std::string>());
   this->rightJoint = _model->GetJoint(
-      _sdf->GetElement("right_joint")->GetValueString());
+      _sdf->GetElement("right_joint")->Get<std::string>());
 
   if (_sdf->HasElement("torque"))
-    this->torque = _sdf->GetElement("torque")->GetValueDouble();
+    this->torque = _sdf->GetElement("torque")->Get<double>();
   else
   {
     gzwarn << "No torque value set for the DiffDrive plugin.\n";
@@ -63,10 +63,10 @@ void DiffDrivePlugin::Load(physics::ModelPtr _model,
 
   if (!this->leftJoint)
     gzerr << "Unable to find left joint["
-          << _sdf->GetElement("left_joint")->GetValueString() << "]\n";
+          << _sdf->GetElement("left_joint")->Get<std::string>() << "]\n";
   if (!this->rightJoint)
     gzerr << "Unable to find right joint["
-          << _sdf->GetElement("right_joint")->GetValueString() << "]\n";
+          << _sdf->GetElement("right_joint")->Get<std::string>() << "]\n";
 
   this->updateConnection = event::Events::ConnectWorldUpdateBegin(
           boost::bind(&DiffDrivePlugin::OnUpdate, this));
diff --git a/plugins/DiffDrivePlugin.hh b/plugins/DiffDrivePlugin.hh
index 291ad7a..f1e7bd9 100644
--- a/plugins/DiffDrivePlugin.hh
+++ b/plugins/DiffDrivePlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,17 +14,18 @@
  * limitations under the License.
  *
 */
-#ifndef __GAZEBO_DIFFDRIVE_PLUGIN_HH__
-#define __GAZEBO_DIFFDRIVE_PLUGIN_HH__
+#ifndef _GAZEBO_DIFFDRIVE_PLUGIN_HH_
+#define _GAZEBO_DIFFDRIVE_PLUGIN_HH_
 
-#include "common/common.hh"
-#include "physics/physics.hh"
-#include "transport/TransportTypes.hh"
-#include "gazebo.hh"
+#include "gazebo/common/common.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  class DiffDrivePlugin : public ModelPlugin
+  class GAZEBO_VISIBLE DiffDrivePlugin : public ModelPlugin
   {
     public: DiffDrivePlugin();
     public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
@@ -47,8 +48,6 @@ namespace gazebo
     private: common::Time prevUpdateTime;
 
     private: physics::LinkPtr link, leftWheelLink, rightWheelLink;
-
-    private: double sum;
   };
 }
 #endif
diff --git a/plugins/ForceTorquePlugin.cc b/plugins/ForceTorquePlugin.cc
index 73f630c..986ad9e 100644
--- a/plugins/ForceTorquePlugin.cc
+++ b/plugins/ForceTorquePlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,16 +14,13 @@
  * limitations under the License.
  *
 */
-/*
- * Desc: a test for getting force and torques at joints
- * Author: John Hsu
- */
 
-#include <plugins/ForceTorquePlugin.hh>
+#include "ForceTorquePlugin.hh"
 
-namespace gazebo
-{
-GZ_REGISTER_MODEL_PLUGIN(ForceTorquePlugin)
+using namespace gazebo;
+
+// Register this plugin with the simulator
+GZ_REGISTER_SENSOR_PLUGIN(ForceTorquePlugin)
 
 /////////////////////////////////////////////////
 ForceTorquePlugin::ForceTorquePlugin()
@@ -33,52 +30,26 @@ ForceTorquePlugin::ForceTorquePlugin()
 /////////////////////////////////////////////////
 ForceTorquePlugin::~ForceTorquePlugin()
 {
-  event::Events::DisconnectWorldUpdateBegin(this->updateConnection);
+  this->parentSensor->DisconnectUpdate(this->connection);
+  this->parentSensor.reset();
 }
 
 /////////////////////////////////////////////////
-void ForceTorquePlugin::Load(physics::ModelPtr _parent,
-                                 sdf::ElementPtr /*_sdf*/)
+void ForceTorquePlugin::Load(sensors::SensorPtr _parent,
+    sdf::ElementPtr /*_sdf*/)
 {
-  //  the world name.
-  this->world = _parent->GetWorld();
-  this->model = _parent;
-  this->joints = this->model->GetJoints();
+  this->parentSensor =
+    boost::dynamic_pointer_cast<sensors::ForceTorqueSensor>(_parent);
 
-  // this->world->PhysicsEngine()->SetGravity(math::Vector3(0,0,0));
+  if (!this->parentSensor)
+    gzthrow("ForceTorquePlugin requires a force_torque sensor as its parent.");
 
-  // New Mechanism for Updating every World Cycle
-  // Listen to the update event. This event is broadcast every
-  // simulation iteration.
-  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
-      boost::bind(&ForceTorquePlugin::UpdateStates, this, _1));
+  this->connection = this->parentSensor->ConnectUpdate(
+        boost::bind(&ForceTorquePlugin::OnUpdate, this, _1));
 }
 
 /////////////////////////////////////////////////
-void ForceTorquePlugin::UpdateStates(const common::UpdateInfo & /*_info*/)
+void ForceTorquePlugin::OnUpdate(msgs::WrenchStamped /*_msg*/)
 {
-  common::Time cur_time = this->world->GetSimTime();
-
-  // convert to joint frame?
-
-  gzdbg << "-----------------------------------------------------\n";
-  for (unsigned int i = 0; i < this->joints.size(); ++i)
-  {
-    if (i < 2)
-      this->joints[i]->SetForce(0, 1.0);
-
-    physics::JointWrench jw = this->joints[i]->GetForceTorque(0u);
-    gzdbg << "model [" << this->model->GetName()
-          << "] joint [" << this->joints[i]->GetName()
-          << "] b1f [" << jw.body1Force
-          << "] b1t [" << jw.body1Torque
-          << "] b2f [" << jw.body2Force
-          << "] b2t [" << jw.body2Torque
-          << "] link1f [" << this->joints[i]->GetLinkForce(0)
-          << "] link1t [" << this->joints[i]->GetLinkTorque(0)
-          << "] link2f [" << this->joints[i]->GetLinkForce(1)
-          << "] link2t [" << this->joints[i]->GetLinkTorque(1)
-          << "]\n";
-  }
-}
+  // overload with useful callback here
 }
diff --git a/plugins/ForceTorquePlugin.hh b/plugins/ForceTorquePlugin.hh
index 7876347..970b20f 100644
--- a/plugins/ForceTorquePlugin.hh
+++ b/plugins/ForceTorquePlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,25 +14,19 @@
  * limitations under the License.
  *
 */
-/*
- * Desc: a test for getting force and torques at joints
- * Author: John Hsu
- */
-#ifndef GAZEBO_JOINT_TRAJECTORY_PLUGIN_HH
-#define GAZEBO_JOINT_TRAJECTORY_PLUGIN_HH
-
-#include <boost/thread.hpp>
-#include <boost/thread/mutex.hpp>
-
-#include "gazebo/physics/physics.hh"
-#include "gazebo/transport/TransportTypes.hh"
-#include "gazebo/common/Time.hh"
+
+#ifndef _GAZEBO_FORCE_TORQUE_PLUGIN_HH_
+#define _GAZEBO_FORCE_TORQUE_PLUGIN_HH_
+
+#include "gazebo/sensors/sensors.hh"
 #include "gazebo/common/Plugin.hh"
 #include "gazebo/common/Events.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  class ForceTorquePlugin : public ModelPlugin
+  /// \brief An base class plugin for custom force torque sensor processing.
+  class GAZEBO_VISIBLE ForceTorquePlugin : public SensorPlugin
   {
     /// \brief Constructor
     public: ForceTorquePlugin();
@@ -40,21 +34,20 @@ namespace gazebo
     /// \brief Destructor
     public: virtual ~ForceTorquePlugin();
 
-    /// \brief Load the controller
-    public: void Load(physics::ModelPtr _parent, sdf::ElementPtr _sdf);
-
-    /// \brief Update the controller
-    /// \param[in] _info Update information provided by the server.
-    private: void UpdateStates(const common::UpdateInfo &_info);
+    /// \brief Load the plugin.
+    /// \param[in] _parent Pointer to the parent sensor.
+    /// \param[in] _sdf SDF element for the plugin.
+    public: virtual void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf);
 
-    private: physics::WorldPtr world;
-    private: physics::ModelPtr model;
-    private: physics::Joint_V joints;
+    /// \brief Update callback. Overload this function in a child class.
+    /// \param[in] _msg The force torque message.
+    protected: virtual void OnUpdate(msgs::WrenchStamped _msg);
 
-    private: boost::mutex update_mutex;
+    /// \brief The parent sensor
+    protected: sensors::ForceTorqueSensorPtr parentSensor;
 
-    // Pointer to the update event connection
-    private: event::ConnectionPtr updateConnection;
+    /// \brief Pointer to the update event connection
+    private: event::ConnectionPtr connection;
   };
 }
 #endif
diff --git a/plugins/GpuRayPlugin.cc b/plugins/GpuRayPlugin.cc
index deffd25..047bba8 100644
--- a/plugins/GpuRayPlugin.cc
+++ b/plugins/GpuRayPlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
  *
 */
 #include "plugins/GpuRayPlugin.hh"
-#include "sensors/GpuRaySensor.hh"
+#include "gazebo/sensors/GpuRaySensor.hh"
 
 using namespace gazebo;
 GZ_REGISTER_SENSOR_PLUGIN(GpuRayPlugin)
diff --git a/plugins/GpuRayPlugin.hh b/plugins/GpuRayPlugin.hh
index 4b63780..5178fba 100644
--- a/plugins/GpuRayPlugin.hh
+++ b/plugins/GpuRayPlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,19 +15,20 @@
  *
 */
 
-#ifndef __GAZEBO_GPU_LASER_PLUGIN_HH__
-#define __GAZEBO_GPU_LASER_PLUGIN_HH__
+#ifndef _GAZEBO_GPU_LASER_PLUGIN_HH_
+#define _GAZEBO_GPU_LASER_PLUGIN_HH_
 
 #include <string>
 
-#include "common/Plugin.hh"
-#include "sensors/CameraSensor.hh"
-#include "rendering/RenderTypes.hh"
-#include "gazebo.hh"
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/sensors/CameraSensor.hh"
+#include "gazebo/rendering/RenderTypes.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  class GpuRayPlugin : public SensorPlugin
+  class GAZEBO_VISIBLE GpuRayPlugin : public SensorPlugin
   {
     public: GpuRayPlugin();
 
diff --git a/plugins/JointTrajectoryPlugin.cc b/plugins/JointTrajectoryPlugin.cc
index 780aea1..d90a21d 100644
--- a/plugins/JointTrajectoryPlugin.cc
+++ b/plugins/JointTrajectoryPlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -56,27 +56,28 @@ void JointTrajectoryPlugin::Load(physics::ModelPtr _parent,
 }
 
 /////////////////////////////////////////////////
-void JointTrajectoryPlugin::FixLink(physics::LinkPtr _link)
-{
-  this->joint = this->world->GetPhysicsEngine()->CreateJoint("revolute",
-      this->model);
-
-  this->joint->SetModel(this->model);
-  math::Pose pose = _link->GetWorldPose();
-  // math::Pose  pose(math::Vector3(0, 0, 0.2), math::Quaternion(1, 0, 0, 0));
-  this->joint->Load(physics::LinkPtr(), _link, pose);
-  this->joint->SetAxis(0, math::Vector3(0, 0, 0));
-  this->joint->SetHighStop(0, 0);
-  this->joint->SetLowStop(0, 0);
-  this->joint->SetAnchor(0, pose.pos);
-  this->joint->Init();
-}
+// void JointTrajectoryPlugin::FixLink(physics::LinkPtr _link)
+// {
+//   this->joint = this->world->GetPhysicsEngine()->CreateJoint("revolute",
+//       this->model);
+//
+//   this->joint->SetModel(this->model);
+//   math::Pose pose = _link->GetWorldPose();
+//   // math::Pose  pose(math::Vector3(0, 0, 0.2),
+//                       math::Quaternion(1, 0, 0, 0));
+//   this->joint->Load(physics::LinkPtr(), _link, pose);
+//   this->joint->SetAxis(0, math::Vector3(0, 0, 0));
+//   this->joint->SetHighStop(0, 0);
+//   this->joint->SetLowStop(0, 0);
+//   this->joint->SetAnchor(0, pose.pos);
+//   this->joint->Init();
+// }
 
 /////////////////////////////////////////////////
-void JointTrajectoryPlugin::UnfixLink()
-{
-  this->joint.reset();
-}
+// void JointTrajectoryPlugin::UnfixLink()
+// {
+//   this->joint.reset();
+// }
 
 /////////////////////////////////////////////////
 void JointTrajectoryPlugin::UpdateStates(const common::UpdateInfo & /*_info*/)
diff --git a/plugins/JointTrajectoryPlugin.hh b/plugins/JointTrajectoryPlugin.hh
index 4deee07..5b60b6b 100644
--- a/plugins/JointTrajectoryPlugin.hh
+++ b/plugins/JointTrajectoryPlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,10 +29,11 @@
 #include "gazebo/common/Time.hh"
 #include "gazebo/common/Plugin.hh"
 #include "gazebo/common/Events.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  class JointTrajectoryPlugin : public ModelPlugin
+  class GAZEBO_VISIBLE JointTrajectoryPlugin : public ModelPlugin
   {
     /// \brief Constructor
     public: JointTrajectoryPlugin();
@@ -48,8 +49,11 @@ namespace gazebo
     private: void UpdateStates(const common::UpdateInfo &_info);
 
 
-    private: void FixLink(physics::LinkPtr link);
-    private: void UnfixLink();
+    // This function is commented out because it is not used.
+    // private: void FixLink(physics::LinkPtr link);
+
+    // This function is commented out because it is not used.
+    // private: void UnfixLink();
 
     private: physics::WorldPtr world;
     private: physics::ModelPtr model;
diff --git a/plugins/LiftDragPlugin.cc b/plugins/LiftDragPlugin.cc
new file mode 100644
index 0000000..e81b1aa
--- /dev/null
+++ b/plugins/LiftDragPlugin.cc
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <algorithm>
+#include <string>
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/SensorManager.hh"
+#include "gazebo/transport/transport.hh"
+#include "plugins/LiftDragPlugin.hh"
+
+using namespace gazebo;
+
+GZ_REGISTER_MODEL_PLUGIN(LiftDragPlugin)
+
+/////////////////////////////////////////////////
+LiftDragPlugin::LiftDragPlugin() : cla(1.0), cda(0.01), cma(0.01), rho(1.2041)
+{
+  this->cp = math::Vector3(0, 0, 0);
+  this->forward = math::Vector3(1, 0, 0);
+  this->upward = math::Vector3(0, 0, 1);
+  this->area = 1.0;
+  this->alpha0 = 0.0;
+
+  // 90 deg stall
+  this->alphaStall = 0.5*M_PI;
+  this->claStall = 0.0;
+
+  /// \TODO: what's flat plate drag?
+  this->cdaStall = 1.0;
+  this->cmaStall = 0.0;
+}
+
+/////////////////////////////////////////////////
+void LiftDragPlugin::Load(physics::ModelPtr _model, sdf::ElementPtr _sdf)
+{
+  GZ_ASSERT(_model, "LiftDragPlugin _model pointer is NULL");
+  GZ_ASSERT(_sdf, "LiftDragPlugin _sdf pointer is NULL");
+  this->model = _model;
+  this->modelName = _model->GetName();
+  this->sdf = _sdf;
+
+  this->world = this->model->GetWorld();
+  GZ_ASSERT(this->world, "LiftDragPlugin world pointer is NULL");
+
+  this->physics = this->world->GetPhysicsEngine();
+  GZ_ASSERT(this->physics, "LiftDragPlugin physics pointer is NULL");
+
+  GZ_ASSERT(_sdf, "LiftDragPlugin _sdf pointer is NULL");
+
+  if (_sdf->HasElement("a0"))
+    this->alpha0 = _sdf->Get<double>("a0");
+
+  if (_sdf->HasElement("cla"))
+    this->cla = _sdf->Get<double>("cla");
+
+  if (_sdf->HasElement("cda"))
+    this->cda = _sdf->Get<double>("cda");
+
+  if (_sdf->HasElement("cma"))
+    this->cma = _sdf->Get<double>("cma");
+
+  if (_sdf->HasElement("alpha_stall"))
+    this->alphaStall = _sdf->Get<double>("alpha_stall");
+
+  if (_sdf->HasElement("cla_stall"))
+    this->claStall = _sdf->Get<double>("cla_stall");
+
+  if (_sdf->HasElement("cda_stall"))
+    this->cdaStall = _sdf->Get<double>("cda_stall");
+
+  if (_sdf->HasElement("cma_stall"))
+    this->cmaStall = _sdf->Get<double>("cma_stall");
+
+  if (_sdf->HasElement("cp"))
+    this->cp = _sdf->Get<math::Vector3>("cp");
+
+  // blade forward (-drag) direction in link frame
+  if (_sdf->HasElement("forward"))
+    this->forward = _sdf->Get<math::Vector3>("forward");
+
+  // blade upward (+lift) direction in link frame
+  if (_sdf->HasElement("upward"))
+    this->upward = _sdf->Get<math::Vector3>("upward");
+
+  if (_sdf->HasElement("area"))
+    this->area = _sdf->Get<double>("area");
+
+  if (_sdf->HasElement("air_density"))
+    this->rho = _sdf->Get<double>("air_density");
+
+  if (_sdf->HasElement("link_name"))
+  {
+    sdf::ElementPtr elem = _sdf->GetElement("link_name");
+    this->linkName = elem->Get<std::string>();
+    this->link = this->model->GetLink(this->linkName);
+  }
+}
+
+/////////////////////////////////////////////////
+void LiftDragPlugin::Init()
+{
+  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
+          boost::bind(&LiftDragPlugin::OnUpdate, this));
+}
+
+/////////////////////////////////////////////////
+void LiftDragPlugin::OnUpdate()
+{
+  // get linear velocity at cp in inertial frame
+  math::Vector3 vel = this->link->GetWorldLinearVel(this->cp);
+
+  // smoothing
+  // double e = 0.8;
+  // this->velSmooth = e*vel + (1.0 - e)*velSmooth;
+  // vel = this->velSmooth;
+
+  if (vel.GetLength() <= 0.01)
+    return;
+
+  // pose of body
+  math::Pose pose = this->link->GetWorldPose();
+
+  // rotate forward and upward vectors into inertial frame
+  math::Vector3 forwardI = pose.rot.RotateVector(this->forward);
+  math::Vector3 upwardI = pose.rot.RotateVector(this->upward);
+
+  // ldNormal vector to lift-drag-plane described in inertial frame
+  math::Vector3 ldNormal = forwardI.Cross(upwardI).Normalize();
+
+  // check sweep (angle between vel and lift-drag-plane)
+  double sinSweepAngle = ldNormal.Dot(vel) / vel.GetLength();
+
+  // get cos from trig identity
+  double cosSweepAngle2 = (1.0 - sinSweepAngle * sinSweepAngle);
+  this->sweep = asin(sinSweepAngle);
+
+  // truncate sweep to within +/-90 deg
+  while (fabs(this->sweep) > 0.5 * M_PI)
+    this->sweep = this->sweep > 0 ? this->sweep - M_PI
+                                  : this->sweep + M_PI;
+
+  // angle of attack is the angle between
+  // vel projected into lift-drag plane
+  //  and
+  // forward vector
+  //
+  // projected = ldNormal Xcross ( vector Xcross ldNormal)
+  //
+  // so,
+  // velocity in lift-drag plane (expressed in inertial frame) is:
+  math::Vector3 velInLDPlane = ldNormal.Cross(vel.Cross(ldNormal));
+
+  // get direction of drag
+  math::Vector3 dragDirection = -velInLDPlane;
+  dragDirection.Normalize();
+
+  // get direction of lift
+  math::Vector3 liftDirection = ldNormal.Cross(velInLDPlane);
+  liftDirection.Normalize();
+
+  // get direction of moment
+  math::Vector3 momentDirection = ldNormal;
+
+  double cosAlpha = math::clamp(
+    forwardI.Dot(velInLDPlane) /
+    (forwardI.GetLength() * velInLDPlane.GetLength()), -1.0, 1.0);
+  // gzerr << "ca " << forwardI.Dot(velInLDPlane) /
+  //   (forwardI.GetLength() * velInLDPlane.GetLength()) << "\n";
+
+  // get sign of alpha
+  // take upwards component of velocity in lift-drag plane.
+  // if sign == upward, then alpha is negative
+  double alphaSign = -upwardI.Dot(velInLDPlane)/
+    (upwardI.GetLength() + velInLDPlane.GetLength());
+
+  // double sinAlpha = sqrt(1.0 - cosAlpha * cosAlpha);
+  if (alphaSign > 0.0)
+    this->alpha = this->alpha0 + acos(cosAlpha);
+  else
+    this->alpha = this->alpha0 - acos(cosAlpha);
+
+  // normalize to within +/-90 deg
+  while (fabs(this->alpha) > 0.5 * M_PI)
+    this->alpha = this->alpha > 0 ? this->alpha - M_PI
+                                  : this->alpha + M_PI;
+
+  // compute dynamic pressure
+  double speedInLDPlane = velInLDPlane.GetLength();
+  double q = 0.5 * this->rho * speedInLDPlane * speedInLDPlane;
+
+  // compute cl at cp, check for stall, correct for sweep
+  double cl;
+  if (this->alpha > this->alphaStall)
+  {
+    cl = (this->cla * this->alphaStall +
+          this->claStall * (this->alpha - this->alphaStall))
+         * cosSweepAngle2;
+    // make sure cl is still great than 0
+    cl = std::max(0.0, cl);
+  }
+  else if (this->alpha < -this->alphaStall)
+  {
+    cl = (-this->cla * this->alphaStall +
+          this->claStall * (this->alpha + this->alphaStall))
+         * cosSweepAngle2;
+    // make sure cl is still less than 0
+    cl = std::min(0.0, cl);
+  }
+  else
+    cl = this->cla * this->alpha * cosSweepAngle2;
+
+  // compute lift force at cp
+  math::Vector3 lift = cl * q * this->area * liftDirection;
+
+  // compute cd at cp, check for stall, correct for sweep
+  double cd;
+  if (this->alpha > this->alphaStall)
+  {
+    cd = (this->cda * this->alphaStall +
+          this->cdaStall * (this->alpha - this->alphaStall))
+         * cosSweepAngle2;
+  }
+  else if (this->alpha < -this->alphaStall)
+  {
+    cd = (-this->cda * this->alphaStall +
+          this->cdaStall * (this->alpha + this->alphaStall))
+         * cosSweepAngle2;
+  }
+  else
+    cd = (this->cda * this->alpha) * cosSweepAngle2;
+
+  // make sure drag is positive
+  cd = fabs(cd);
+
+  // drag at cp
+  math::Vector3 drag = cd * q * this->area * dragDirection;
+
+  // compute cm at cp, check for stall, correct for sweep
+  double cm;
+  if (this->alpha > this->alphaStall)
+  {
+    cm = (this->cma * this->alphaStall +
+          this->cmaStall * (this->alpha - this->alphaStall))
+         * cosSweepAngle2;
+    // make sure cm is still great than 0
+    cm = std::max(0.0, cm);
+  }
+  else if (this->alpha < -this->alphaStall)
+  {
+    cm = (-this->cma * this->alphaStall +
+          this->cmaStall * (this->alpha + this->alphaStall))
+         * cosSweepAngle2;
+    // make sure cm is still less than 0
+    cm = std::min(0.0, cm);
+  }
+  else
+    cm = this->cma * this->alpha * cosSweepAngle2;
+
+  // reset cm to zero, as cm needs testing
+  cm = 0.0;
+
+  // compute moment (torque) at cp
+  math::Vector3 moment = cm * q * this->area * momentDirection;
+
+  // moment arm from cg to cp in inertial plane
+  math::Vector3 momentArm = pose.rot.RotateVector(
+    this->cp - this->link->GetInertial()->GetCoG());
+  // gzerr << this->cp << " : " << this->link->GetInertial()->GetCoG() << "\n";
+
+  // force and torque about cg in inertial frame
+  math::Vector3 force = lift + drag;
+  // + moment.Cross(momentArm);
+
+  math::Vector3 torque = moment;
+  // - lift.Cross(momentArm) - drag.Cross(momentArm);
+
+  // debug
+  //
+  // if ((this->link->GetName() == "wing_1" ||
+  //      this->link->GetName() == "wing_2") &&
+  //     (vel.GetLength() > 50.0 &&
+  //      vel.GetLength() < 50.0))
+  if (0)
+  {
+    gzerr << "=============================\n";
+    gzerr << "Link: [" << this->link->GetName()
+          << "] pose: [" << pose
+          << "] dynamic pressure: [" << q << "]\n";
+    gzerr << "spd: [" << vel.GetLength() << "] vel: [" << vel << "]\n";
+    gzerr << "spd sweep: [" << velInLDPlane.GetLength()
+          << "] vel in LD: [" << velInLDPlane << "]\n";
+    gzerr << "forward (inertial): " << forwardI << "\n";
+    gzerr << "upward (inertial): " << upwardI << "\n";
+    gzerr << "lift dir (inertial): " << liftDirection << "\n";
+    gzerr << "LD Normal: " << ldNormal << "\n";
+    gzerr << "sweep: " << this->sweep << "\n";
+    gzerr << "alpha: " << this->alpha << "\n";
+    gzerr << "lift: " << lift << "\n";
+    gzerr << "drag: " << drag << " cd: "
+    << cd << " cda: " << this->cda << "\n";
+    gzerr << "moment: " << moment << "\n";
+    gzerr << "cp momentArm: " << momentArm << "\n";
+    gzerr << "force: " << force << "\n";
+    gzerr << "torque: " << torque << "\n";
+  }
+
+  // apply forces at cg (with torques for position shift)
+  this->link->AddForceAtRelativePosition(force, this->cp);
+  this->link->AddTorque(torque);
+}
diff --git a/plugins/LiftDragPlugin.hh b/plugins/LiftDragPlugin.hh
new file mode 100644
index 0000000..964d08c
--- /dev/null
+++ b/plugins/LiftDragPlugin.hh
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_LIFT_DRAG_PLUGIN_HH_
+#define _GAZEBO_LIFT_DRAG_PLUGIN_HH_
+
+#include <string>
+#include <vector>
+
+#include "gazebo/common/common.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/gazebo.hh"
+
+namespace gazebo
+{
+  /// \brief A plugin that simulates lift and drag.
+  class LiftDragPlugin : public ModelPlugin
+  {
+    /// \brief Constructor.
+    public: LiftDragPlugin();
+
+    // Documentation Inherited.
+    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
+
+    // Documentation Inherited.
+    public: virtual void Init();
+
+    /// \brief Callback for World Update events.
+    protected: virtual void OnUpdate();
+
+    /// \brief Connection to World Update events.
+    protected: event::ConnectionPtr updateConnection;
+
+    /// \brief Pointer to world.
+    protected: physics::WorldPtr world;
+
+    /// \brief Pointer to physics engine.
+    protected: physics::PhysicsEnginePtr physics;
+
+    /// \brief Pointer to model containing plugin.
+    protected: physics::ModelPtr model;
+
+    /// \brief Name of model containing plugin.
+    protected: std::string modelName;
+
+    /// \brief Coefficient of Lift / alpha slope.
+    /// Lift = C_L * q * S
+    /// where q (dynamic pressure) = 0.5 * rho * v^2
+    protected: double cla;
+
+    /// \brief Coefficient of Drag / alpha slope.
+    /// Drag = C_D * q * S
+    /// where q (dynamic pressure) = 0.5 * rho * v^2
+    protected: double cda;
+
+    /// \brief Coefficient of Moment / alpha slope.
+    /// Moment = C_M * q * S
+    /// where q (dynamic pressure) = 0.5 * rho * v^2
+    protected: double cma;
+
+    /// \brief angle of attach when airfoil stalls
+    protected: double alphaStall;
+
+    /// \brief Cl-alpha rate after stall
+    protected: double claStall;
+
+    /// \brief Cd-alpha rate after stall
+    protected: double cdaStall;
+
+    /// \brief Cm-alpha rate after stall
+    protected: double cmaStall;
+
+    /// \brief: \TODO: make a stall velocity curve
+    protected: double velocityStall;
+
+    /// \brief air density
+    /// at 25 deg C it's about 1.1839 kg/m^3
+    /// At 20 °C and 101.325 kPa, dry air has a density of 1.2041 kg/m3.
+    protected: double rho;
+
+    /// \brief effective planeform surface area
+    protected: double area;
+
+    /// \brief angle of sweep
+    protected: double sweep;
+
+    /// \brief initial angle of attack
+    protected: double alpha0;
+
+    /// \brief angle of attack
+    protected: double alpha;
+
+    /// \brief center of pressure in link local coordinates
+    protected: math::Vector3 cp;
+
+    /// \brief forward flight direction in link local coordinates
+    protected: math::Vector3 forward;
+
+    /// \brief A vector in the lift/drag plane, anything orthogonal to it
+    /// is considered wing sweep.
+    protected: math::Vector3 upward;
+
+    /// \brief Smooth velocity
+    protected: math::Vector3 velSmooth;
+
+    /// \brief Names of allowed target links, specified in sdf parameters.
+    protected: std::string linkName;
+
+    /// \brief Pointer to link currently targeted by mud joint.
+    protected: physics::LinkPtr link;
+
+    /// \brief SDF for this plugin;
+    protected: sdf::ElementPtr sdf;
+  };
+}
+#endif
diff --git a/plugins/ModelPropShop.cc b/plugins/ModelPropShop.cc
new file mode 100644
index 0000000..6be31d5
--- /dev/null
+++ b/plugins/ModelPropShop.cc
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <boost/program_options.hpp>
+
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/transport.hh"
+#include "gazebo/sensors/SensorsIface.hh"
+#include "ModelPropShop.hh"
+
+using namespace gazebo;
+namespace po = boost::program_options;
+
+// Register this plugin with the simulator
+GZ_REGISTER_SYSTEM_PLUGIN(ModelPropShop)
+
+/////////////////////////////////////////////
+ModelPropShop::~ModelPropShop()
+{
+  rendering::fini();
+}
+
+/////////////////////////////////////////////
+void ModelPropShop::Load(int _argc, char **_argv)
+{
+  // Turn off sensors.
+  gazebo::sensors::disable();
+
+  po::options_description v_desc("Options");
+  v_desc.add_options()
+    ("propshop-save", po::value<std::string>(),
+     "Path to save image files into.")
+    ("propshop-model", po::value<std::string>(), "Model to spawn.");
+
+  po::options_description desc("Options");
+  desc.add(v_desc);
+
+  po::variables_map vm;
+  try
+  {
+    po::store(po::command_line_parser(_argc, _argv).options(
+          desc).allow_unregistered().run(), vm);
+    po::notify(vm);
+  } catch(boost::exception &_e)
+  {
+    std::cerr << "Error. Invalid arguments\n";
+    return;
+  }
+
+  // Get the directory in which to save the images.
+  if (vm.count("propshop-save"))
+  {
+    this->savePath = boost::filesystem::path(
+        vm["propshop-save"].as<std::string>());
+    if (!boost::filesystem::exists(this->savePath))
+      boost::filesystem::create_directories(this->savePath);
+  }
+  else
+    this->savePath = boost::filesystem::temp_directory_path();
+
+  std::string modelFile;
+
+  if (vm.count("propshop-model"))
+    modelFile = vm["propshop-model"].as<std::string>();
+  else
+    return;
+
+  std::ifstream ifs(modelFile.c_str());
+  if (!ifs)
+  {
+    std::cerr << "Error: Unable to open file[" << modelFile << "]\n";
+    return;
+  }
+
+  this->sdf.reset(new sdf::SDF());
+  if (!sdf::init(this->sdf))
+  {
+    std::cerr << "ERROR: SDF parsing the xml failed" << std::endl;
+    return;
+  }
+
+  if (!sdf::readFile(modelFile, this->sdf))
+  {
+    std::cerr << "Error: SDF parsing the xml failed\n";
+    return;
+  }
+
+  sdf::ElementPtr modelElem = this->sdf->root->GetElement("model");
+  this->modelName = modelElem->Get<std::string>("name");
+}
+
+/////////////////////////////////////////////
+void ModelPropShop::Init()
+{
+  this->worldCreatedConn = event::Events::ConnectWorldCreated(
+        boost::bind(&ModelPropShop::OnWorldCreated, this));
+
+  this->updateConn = event::Events::ConnectWorldUpdateBegin(
+        boost::bind(&ModelPropShop::Update, this));
+
+  this->node = transport::NodePtr(new transport::Node());
+  this->node->Init();
+  this->pub = this->node->Advertise<msgs::ServerControl>(
+      "/gazebo/server/control");
+
+  this->factoryPub = this->node->Advertise<msgs::Factory>("~/factory");
+}
+
+/////////////////////////////////////////////
+void ModelPropShop::OnWorldCreated()
+{
+  this->factoryPub->WaitForConnection();
+
+  if (this->sdf)
+  {
+    msgs::Factory msg;
+    msg.set_sdf(this->sdf->ToString());
+    this->factoryPub->Publish(msg, true);
+  }
+}
+
+/////////////////////////////////////////////
+void ModelPropShop::Update()
+{
+  // Make sure to initialize the rendering engine in the same thread that will
+  // capture images.
+  if (!this->scene)
+  {
+    rendering::load();
+    rendering::init();
+
+    sdf::ElementPtr cameraSDF(new sdf::Element);
+    sdf::initFile("camera.sdf", cameraSDF);
+
+    this->scene = rendering::create_scene("default", false, true);
+    this->camera = this->scene->CreateCamera("propshopcamera", false);
+    this->camera->SetCaptureData(true);
+    this->camera->Load(cameraSDF);
+    this->camera->Init();
+    this->camera->SetHFOV(GZ_DTOR(60));
+    this->camera->SetImageWidth(960);
+    this->camera->SetImageHeight(540);
+    this->camera->CreateRenderTexture("ModelPropShop_RttTex");
+
+    // Create a light
+    gazebo::msgs::Light lightMsg;
+    lightMsg.set_name("propshop_light");
+    lightMsg.set_type(gazebo::msgs::Light::DIRECTIONAL);
+    gazebo::msgs::Set(lightMsg.mutable_diffuse(),
+                      gazebo::common::Color(1, 1, 1, 1));
+    gazebo::msgs::Set(lightMsg.mutable_specular(),
+                      gazebo::common::Color(.2, .2, .2, 1));
+    gazebo::msgs::Set(lightMsg.mutable_direction(),
+                      gazebo::math::Vector3(-0.5, 0.1, -0.9));
+    lightMsg.set_cast_shadows(false);
+    lightMsg.set_range(1000);
+    lightMsg.set_attenuation_constant(1);
+    lightMsg.set_attenuation_linear(0);
+    lightMsg.set_attenuation_quadratic(0);
+
+    this->light.reset(new gazebo::rendering::Light(this->scene));
+    light->LoadFromMsg(lightMsg);
+    gazebo::rendering::RTShaderSystem::Instance()->UpdateShaders();
+    return;
+  }
+
+  if (this->camera && this->scene)
+    event::Events::preRender();
+
+  if (this->camera && this->scene->GetInitialized() &&
+      this->camera->GetInitialized())
+  {
+    rendering::VisualPtr vis = this->scene->GetVisual(this->modelName);
+    if (vis)
+    {
+      math::Box bbox = vis->GetBoundingBox();
+
+      // Compute model scaling.
+      double scaling = 1.0 / bbox.GetSize().GetMax();
+
+      // Compute the model translation.
+      math::Vector3 trans = bbox.GetCenter();
+      trans *= -scaling;
+
+      // Normalize the size of the visual
+      vis->SetScale(math::Vector3(scaling, scaling, scaling));
+      vis->SetWorldPose(math::Pose(trans.x, trans.y, trans.z, 0, 0, 0));
+
+      // Place the visual at the origin
+      bbox = vis->GetBoundingBox();
+
+      math::Pose pose;
+
+      // Perspective view
+      pose.pos.Set(1.6, -1.6, 1.2);
+      pose.rot.SetFromEuler(0, GZ_DTOR(30), GZ_DTOR(-225));
+      this->light->SetDirection(math::Vector3(-0.4, 0.4, -0.4));
+      this->camera->SetWorldPose(pose);
+      this->camera->Update();
+      this->camera->Render(true);
+      this->camera->PostRender();
+      this->camera->SaveFrame((this->savePath / "1.png").string());
+
+      // Top view
+      pose.pos.Set(0, 0, 2.2);
+      pose.rot.SetFromEuler(0, GZ_DTOR(90), 0);
+      this->light->SetDirection(math::Vector3(0, 0, -1.0));
+      this->camera->SetWorldPose(pose);
+      this->camera->Update();
+      this->camera->Render(true);
+      this->camera->PostRender();
+      this->camera->SaveFrame((this->savePath / "2.png").string());
+
+      // Front view
+      pose.pos.Set(2.2, 0, 0);
+      pose.rot.SetFromEuler(0, 0, GZ_DTOR(-180));
+      this->light->SetDirection(math::Vector3(-0.6, 0.0, -0.4));
+      this->camera->SetWorldPose(pose);
+      this->camera->Update();
+      this->camera->Render(true);
+      this->camera->PostRender();
+      this->camera->SaveFrame((this->savePath / "3.png").string());
+
+      // Side view
+      pose.pos.Set(0, 2.2, 0);
+      pose.rot.SetFromEuler(0, 0, GZ_DTOR(-90));
+      this->light->SetDirection(math::Vector3(0, -0.6, -0.4));
+      this->camera->SetWorldPose(pose);
+      this->camera->Update();
+      this->camera->Render(true);
+      this->camera->PostRender();
+      this->camera->SaveFrame((this->savePath / "4.png").string());
+
+      // Back view
+      pose.pos.Set(-2.2, 0, 0);
+      pose.rot.SetFromEuler(0, 0, 0);
+      this->light->SetDirection(math::Vector3(0.6, 0, -0.4));
+      this->camera->SetWorldPose(pose);
+      this->camera->Update();
+      this->camera->Render(true);
+      this->camera->PostRender();
+      this->camera->SaveFrame((this->savePath / "5.png").string());
+
+      event::Events::DisconnectWorldCreated(this->worldCreatedConn);
+      this->worldCreatedConn.reset();
+
+      event::Events::DisconnectWorldUpdateBegin(this->updateConn);
+      this->updateConn.reset();
+
+      // Clean up the camera.
+      this->camera.reset();
+      this->light.reset();
+      this->scene->RemoveCamera("propshopcamera");
+
+      // Tell the server to stop.
+      msgs::ServerControl msg;
+      msg.set_stop(true);
+      this->pub->Publish(msg);
+    }
+  }
+}
diff --git a/plugins/ModelPropShop.hh b/plugins/ModelPropShop.hh
new file mode 100644
index 0000000..ffbd87d
--- /dev/null
+++ b/plugins/ModelPropShop.hh
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string>
+
+// Include Rand.hh first to avoid osx compilation errors
+#include "gazebo/math/Rand.hh"
+#include "gazebo/rendering/rendering.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  /// \brief This plugin will generate 5 pictures of a model: perspective,
+  /// top, front, side, back.
+  class GAZEBO_VISIBLE ModelPropShop : public SystemPlugin
+  {
+    /// \brief Destructor
+    public: virtual ~ModelPropShop();
+
+    /// \brief Load the plugin.
+    /// \param[in] _argc Number of command line arguments.
+    /// \param[in] _argv Array of command line arguments.
+    public: void Load(int _argc, char **_argv);
+
+    /// \brief Initialize the plugin.
+    private: void Init();
+
+    /// \brief Callback triggered when the world has been created.
+    private: void OnWorldCreated();
+
+    /// \brief Update the plugin.
+    private: void Update();
+
+    /// \brief The update connection.
+    private: event::ConnectionPtr updateConn;
+
+    /// \brief The world created connection.
+    private: event::ConnectionPtr worldCreatedConn;
+
+    /// \brief Node for communication.
+    private: transport::NodePtr node;
+
+    /// \brief Publisher used to stop the server.
+    private: transport::PublisherPtr pub;
+
+    /// \brief Publisher used to spawn the model.
+    private: transport::PublisherPtr factoryPub;
+
+    /// \brief Pointer to the scene.
+    private: rendering::ScenePtr scene;
+
+    /// \brief Pointer to the camera.
+    private: rendering::CameraPtr camera;
+
+    /// \brief Pointer to the light.
+    private: rendering::LightPtr light;
+
+    /// \brief Pointer to the sdf document.
+    private: boost::shared_ptr<sdf::SDF> sdf;
+
+    /// \brief Name of the model.
+    private: std::string modelName;
+
+    /// \brief Path in which to save the output images.
+    private: boost::filesystem::path savePath;
+  };
+}
diff --git a/plugins/ModelTrajectoryTestPlugin.cc b/plugins/ModelTrajectoryTestPlugin.cc
deleted file mode 100644
index 58ccaaa..0000000
--- a/plugins/ModelTrajectoryTestPlugin.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "gazebo/physics/physics.hh"
-#include "gazebo/transport/transport.hh"
-#include "plugins/ModelTrajectoryTestPlugin.hh"
-
-using namespace gazebo;
-
-GZ_REGISTER_MODEL_PLUGIN(ModelTrajectoryTestPlugin)
-
-/////////////////////////////////////////////////
-ModelTrajectoryTestPlugin::ModelTrajectoryTestPlugin()
-{
-}
-
-/////////////////////////////////////////////////
-void ModelTrajectoryTestPlugin::Load(physics::ModelPtr _model,
-                           sdf::ElementPtr /*_sdf*/)
-{
-  this->model = _model;
-
-  this->node = transport::NodePtr(new transport::Node());
-  this->node->Init(this->model->GetWorld()->GetName());
-
-  this->trajSub = this->node->Subscribe(std::string("~/") +
-      this->model->GetName() + "/pose_trajectory",
-      &ModelTrajectoryTestPlugin::OnPoseTrajectoryMsg, this);
-
-  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
-          boost::bind(&ModelTrajectoryTestPlugin::OnUpdate, this));
-}
-
-/////////////////////////////////////////////////
-void ModelTrajectoryTestPlugin::Init()
-{
-}
-
-/////////////////////////////////////////////////
-void ModelTrajectoryTestPlugin::OnPoseTrajectoryMsg(
-    ConstPoseTrajectoryPtr &/*_msg*/)
-{
-}
-
-/////////////////////////////////////////////////
-void ModelTrajectoryTestPlugin::OnUpdate()
-{
-  common::Time currTime = this->model->GetWorld()->GetSimTime();
-  common::Time stepTime = currTime - this->prevUpdateTime;
-  this->prevUpdateTime = currTime;
-
-  {
-    // ignore everything else, get position and force only
-    math::Pose pose;
-    this->model->SetWorldPose(pose);
-  }
-}
diff --git a/plugins/ModelTrajectoryTestPlugin.hh b/plugins/ModelTrajectoryTestPlugin.hh
deleted file mode 100644
index deda71a..0000000
--- a/plugins/ModelTrajectoryTestPlugin.hh
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef _GAZEBO_MODEL_TRAJECTORY_TEST_PLUGIN_HH_
-#define _GAZEBO_MODEL_TRAJECTORY_TEST_PLUGIN_HH_
-
-#include "gazebo/common/common.hh"
-#include "gazebo/physics/physics.hh"
-#include "gazebo/transport/TransportTypes.hh"
-#include "gazebo/gazebo.hh"
-
-namespace gazebo
-{
-  class ModelTrajectoryTestPlugin : public ModelPlugin
-  {
-    public: ModelTrajectoryTestPlugin();
-    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
-    public: virtual void Init();
-
-    private: void OnUpdate();
-
-    private: void OnPoseTrajectoryMsg(ConstPoseTrajectoryPtr &_msg);
-
-    private: transport::NodePtr node;
-    private: transport::SubscriberPtr trajSub;
-
-    private: event::ConnectionPtr updateConnection;
-
-    private: physics::ModelPtr model;
-
-    private: common::Time prevUpdateTime;
-  };
-}
-#endif
diff --git a/plugins/MudPlugin.cc b/plugins/MudPlugin.cc
new file mode 100644
index 0000000..28d0c38
--- /dev/null
+++ b/plugins/MudPlugin.cc
@@ -0,0 +1,346 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/unordered_map.hpp>
+#include <boost/unordered_set.hpp>
+
+#include "gazebo/common/Assert.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/SensorManager.hh"
+#include "gazebo/sensors/ContactSensor.hh"
+#include "gazebo/transport/transport.hh"
+#include "plugins/MudPlugin.hh"
+
+using namespace gazebo;
+
+GZ_REGISTER_MODEL_PLUGIN(MudPlugin)
+
+/////////////////////////////////////////////////
+MudPlugin::MudPlugin()
+  : newMsg(false), newMsgWait(0), stiffness(0.0), damping(100.0),
+    contactSurfaceBitmask(0)
+{
+}
+
+/////////////////////////////////////////////////
+void MudPlugin::Load(physics::ModelPtr _model,
+                     sdf::ElementPtr _sdf)
+{
+  GZ_ASSERT(_model, "MudPlugin _model pointer is NULL");
+  this->model = _model;
+  this->modelName = _model->GetName();
+  this->sdf = _sdf;
+
+  this->world = this->model->GetWorld();
+  GZ_ASSERT(this->world, "MudPlugin world pointer is NULL");
+
+  this->physics = this->world->GetPhysicsEngine();
+  GZ_ASSERT(this->physics, "MudPlugin physics pointer is NULL");
+
+  this->link = _model->GetLink();
+  GZ_ASSERT(this->link, "MudPlugin link pointer is NULL");
+
+  GZ_ASSERT(_sdf, "MudPlugin _sdf pointer is NULL");
+  if (_sdf->HasElement("contact_sensor_name"))
+  {
+    this->contactSensorName = _sdf->Get<std::string>("contact_sensor_name");
+  }
+  else
+  {
+    gzerr << "contactSensorName not supplied, ignoring contacts\n";
+  }
+
+  if (_sdf->HasElement("stiffness"))
+    this->stiffness = _sdf->Get<double>("stiffness");
+
+  if (_sdf->HasElement("damping"))
+    this->damping = _sdf->Get<double>("damping");
+
+  if (_sdf->HasElement("contact_surface_bitmask"))
+  {
+    this->contactSurfaceBitmask =
+        _sdf->Get<unsigned int>("contact_surface_bitmask");
+  }
+
+  if (_sdf->HasElement("link_name"))
+  {
+    sdf::ElementPtr elem = _sdf->GetElement("link_name");
+    while (elem)
+    {
+      allowedLinks.push_back(elem->Get<std::string>());
+      links.push_back(physics::LinkPtr());
+      joints.push_back(physics::JointPtr());
+      elem = elem->GetNextElement("link_name");
+    }
+  }
+  GZ_ASSERT(allowedLinks.size() == links.size(),
+    "Length of links data structure doesn't match allowedLinks");
+  GZ_ASSERT(allowedLinks.size() == joints.size(),
+    "Length of joints data structure doesn't match allowedLinks");
+}
+
+/////////////////////////////////////////////////
+void MudPlugin::Init()
+{
+  this->node.reset(new transport::Node());
+  this->node->Init(this->world->GetName());
+
+  if (!this->contactSensorName.empty())
+  {
+    std::string topic = std::string("~/") + this->modelName + "/" +
+      this->contactSensorName;
+    this->contactSub =
+      this->node->Subscribe(topic, &MudPlugin::OnContact, this);
+
+    // create bitmask from contact sensor's collisions if it's not specified in
+    // the sdf
+    if (!this->sdf->HasElement("contact_surface_bitmask"))
+    {
+      std::string name = this->contactSensorName;
+      boost::replace_all(name, "/", "::");
+      name = this->world->GetName() + "::"+ this->modelName + "::" + name;
+      sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+      // Get a pointer to the contact sensor
+      sensors::ContactSensorPtr sensor =
+          boost::dynamic_pointer_cast<sensors::ContactSensor>
+          (mgr->GetSensor(name));
+      if (sensor)
+      {
+        for (unsigned int i = 0; i < sensor->GetCollisionCount(); ++i)
+        {
+          std::string colName = sensor->GetCollisionName(i);
+          physics::CollisionPtr colPtr =
+              boost::dynamic_pointer_cast<physics::Collision>(
+              this->world->GetEntity(colName));
+          if (colPtr)
+          {
+            this->contactSurfaceBitmask |=
+                colPtr->GetSurface()->collideWithoutContactBitmask;
+          }
+        }
+      }
+      else
+      {
+        gzerr << "Unable to GetSensor, ignoring contact_surface_bitmask\n";
+      }
+    }
+  }
+
+  for (unsigned int i = 0; i < this->allowedLinks.size(); ++i)
+  {
+    physics::LinkPtr allowedLink = boost::dynamic_pointer_cast<physics::Link>(
+        this->world->GetEntity(this->allowedLinks[i]));
+
+    if (!allowedLink)
+      continue;
+
+    std::vector<physics::CollisionPtr> collisions
+        = allowedLink->GetCollisions();
+    for (unsigned int j = 0; j < collisions.size(); ++j)
+    {
+      collisions[j]->GetSurface()->collideWithoutContactBitmask |=
+          this->contactSurfaceBitmask;
+    }
+  }
+
+  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
+          boost::bind(&MudPlugin::OnUpdate, this));
+}
+
+/////////////////////////////////////////////////
+void MudPlugin::OnContact(ConstContactsPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(this->mutex);
+  this->newestContactsMsg = *_msg;
+  this->newMsg = true;
+}
+
+/////////////////////////////////////////////////
+void MudPlugin::OnUpdate()
+{
+  double dt = this->physics->GetMaxStepSize();
+  if (dt < 1e-6)
+    dt = 1e-6;
+  if (this->newMsg)
+  {
+    boost::mutex::scoped_lock lock(this->mutex);
+
+    unsigned int nc = this->newestContactsMsg.contact_size();
+    boost::unordered_set<std::string> contactLinkNames;
+    boost::unordered_map<std::string, unsigned int> linkNameIndices;
+
+    // If new contacts, then get the link names
+    if (nc)
+    {
+      // Starting with last contact message, iterate backwards
+      // checking each contact with a timestamp matching the last contact
+      // Add each link name to contactLinkNames
+      common::Time latestContactTime =
+        msgs::Convert(this->newestContactsMsg.contact(nc-1).time());
+      std::string targetCollName, tmpLinkName;
+
+      for (int i = nc-1; i >= 0 &&
+           msgs::Convert(this->newestContactsMsg.contact(i).time())
+            == latestContactTime; --i)
+      {
+        // Try to find name of the other collision
+        // If collision1() starts with this->modelName, then use collision2()
+        targetCollName = this->newestContactsMsg.contact(i).collision1();
+        if (0 == targetCollName.compare(0, this->modelName.length(),
+               targetCollName))
+        {
+          targetCollName = this->newestContactsMsg.contact(i).collision2();
+        }
+        tmpLinkName = targetCollName.substr(0,
+                      targetCollName.rfind("::"));
+        contactLinkNames.insert(tmpLinkName);
+        linkNameIndices[tmpLinkName] = i;
+      }
+    }
+
+    // Iterate through the list of allowed links
+    std::vector<std::string>::iterator iterLinkName =
+      this->allowedLinks.begin();
+    std::vector<physics::LinkPtr>::iterator iterLink = this->links.begin();
+    std::vector<physics::JointPtr>::iterator iterJoint = this->joints.begin();
+    unsigned int countIters = 0;
+    // Only check the length of the first iterator since we used a GZ_ASSERT
+    // in the Load function to confirm the vectors have the same length
+    while (iterLinkName != this->allowedLinks.end())
+    {
+      // If *iterLinkName is in contactLinkNames
+      if (contactLinkNames.end() != contactLinkNames.find(*iterLinkName))
+      {
+        // Compute the average contact point position
+        math::Vector3 contactPositionAverage;
+        {
+          // Find the index to the correct contact data structure
+          unsigned int i = linkNameIndices[*iterLinkName];
+          if (i < nc)
+          {
+            unsigned int pc =
+              this->newestContactsMsg.contact(i).position_size();
+            // Add up all the contact point positions
+            for (unsigned int j = 0; j < pc; ++j)
+            {
+              contactPositionAverage +=
+                msgs::Convert(this->newestContactsMsg.contact(i).position(j));
+            }
+            // Then divide by numer of contact points
+            contactPositionAverage /= static_cast<double>(pc);
+          }
+          else
+          {
+            gzerr << "Error in linkNameIndices\n";
+          }
+        }
+
+        // If joint exists
+        if (*iterJoint)
+        {
+          // Update the anchor position
+          // TODO: consider checking MaxStepSize and updating erp, cfm
+          (*iterJoint)->SetAnchor(0, contactPositionAverage);
+        }
+        // Otherwise, try to create a joint
+        else
+        {
+          // Try to get link pointer if we don't already have it
+          if (!(*iterLink))
+          {
+            std::string targetModelName = (*iterLinkName).substr(0,
+                                          (*iterLinkName).rfind("::"));
+            physics::ModelPtr targetModel =
+              this->world->GetModel(targetModelName);
+            if (targetModel)
+              *iterLink = targetModel->GetLink(*iterLinkName);
+          }
+
+          if (*iterLink)
+          {
+            // Create the joint
+            // gzdbg << "Creating a mud joint with " << *iterLinkName << '\n';
+            (*iterLink)->SetAutoDisable(false);
+            *iterJoint = this->physics->CreateJoint("revolute", this->model);
+
+            (*iterJoint)->Attach(this->link, *iterLink);
+
+            (*iterJoint)->Load(this->link, *iterLink,
+              math::Pose(contactPositionAverage, math::Quaternion()));
+            // Joint names must be unique
+            // name as mud_joint_0, mud_joint_1, etc.
+            {
+              std::stringstream jointNameStream;
+              jointNameStream << "mud_joint_" << countIters;
+              (*iterJoint)->SetName(jointNameStream.str());
+            }
+
+            {
+              double erp, cfm;
+              erp = this->stiffness*dt / (this->stiffness*dt + this->damping);
+              cfm = 1.0 / (this->stiffness*dt + this->damping);
+              (*iterJoint)->SetParam("erp", 0, erp);
+              (*iterJoint)->SetParam("cfm", 0, cfm);
+              (*iterJoint)->SetParam("stop_erp", 0, erp);
+              (*iterJoint)->SetParam("stop_cfm", 0, cfm);
+            }
+            (*iterJoint)->SetHighStop(0, 0.0);
+            (*iterJoint)->SetLowStop(0, 0.0);
+
+            (*iterJoint)->Init();
+          }
+        }
+      }
+      // *iterLinkName is not in contactLinkNames
+      else
+      {
+        // If there's an existing joint,
+        // then delete the joint
+        if (*iterJoint)
+        {
+          // gzdbg << "Destroying mud joint\n";
+
+          // reenable collision between the link pair
+          physics::LinkPtr parent = (*iterJoint)->GetParent();
+          physics::LinkPtr child = (*iterJoint)->GetChild();
+          if (parent)
+            parent->SetCollideMode("all");
+          if (child)
+            child->SetCollideMode("all");
+
+          (*iterJoint)->Detach();
+          (*iterJoint).reset();
+        }
+      }
+
+      // Increment
+      ++countIters;
+      ++iterJoint;
+      ++iterLink;
+      ++iterLinkName;
+    }
+
+    this->newMsg = false;
+    this->newMsgWait = 0;
+  }
+  else if (++this->newMsgWait > floor(1.0 / dt))
+  {
+    gzlog << "MudPlugin attached to " << this->modelName
+          << " waited 1.0 s without contact messages\n";
+    this->newMsgWait = 0;
+  }
+}
diff --git a/plugins/MudPlugin.hh b/plugins/MudPlugin.hh
new file mode 100644
index 0000000..d983f89
--- /dev/null
+++ b/plugins/MudPlugin.hh
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _MUD_PLUGIN_HH_
+#define _MUD_PLUGIN_HH_
+
+#include <string>
+#include <vector>
+
+#include "gazebo/common/common.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  class GAZEBO_VISIBLE MudPlugin : public ModelPlugin
+  {
+    /// \brief Constructor.
+    public: MudPlugin();
+
+    // Documentation Inherited.
+    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
+
+    // Documentation Inherited.
+    public: virtual void Init();
+
+    /// \brief Callback for receipt of contact sensor messages.
+    /// \param[in] _msg Contacts message from contact sensor.
+    private: void OnContact(ConstContactsPtr &_msg);
+
+    /// \brief Callback for World Update events.
+    private: void OnUpdate();
+
+    /// \brief Transport node used for subscribing to contact sensor messages.
+    private: transport::NodePtr node;
+
+    /// \brief Subscriber to contact sensor messages.
+    private: transport::SubscriberPtr contactSub;
+
+    /// \brief Connection to World Update events.
+    private: event::ConnectionPtr updateConnection;
+
+    /// \brief Pointer to world.
+    private: physics::WorldPtr world;
+
+    /// \brief Pointer to physics engine.
+    private: physics::PhysicsEnginePtr physics;
+
+    /// \brief Pointer to model containing plugin.
+    private: physics::ModelPtr model;
+
+    /// \brief Name of model containing plugin.
+    private: std::string modelName;
+
+    /// \brief Pointer to canonical link in mud model. It is assumed that
+    ///        the canonical link has the contact sensor.
+    private: physics::LinkPtr link;
+
+    /// \brief Name of contact sensor relative to model, scoped with '/',
+    private: std::string contactSensorName;
+
+    /// \brief Mutex to protect reads and writes.
+    private: mutable boost::mutex mutex;
+
+    /// \brief Store newest contacts message.
+    private: msgs::Contacts newestContactsMsg;
+
+    /// \brief Flag to indicate new contact message.
+    private: bool newMsg;
+
+    /// \brief Number of updates without having a new contacts message.
+    private: unsigned int newMsgWait;
+
+    /// \brief Stiffness parameter, used in conjunction with damping
+    ///        to compute joint erp, cfm
+    private: double stiffness;
+
+    /// \brief Damping parameter, used in conjunction with stiffness
+    ///        to compute joint erp, cfm
+    private: double damping;
+
+    /// \brief Names of allowed target links, specified in sdf parameters.
+    private: std::vector<std::string> allowedLinks;
+
+    /// \brief Pointer to link currently targeted by mud joint.
+    private: std::vector<physics::LinkPtr> links;
+
+    /// \brief Dynamically created joint for simulating mud forces.
+    private: std::vector<physics::JointPtr> joints;
+
+    /// \brief Custom bitmask associated to collision surface of allowed links
+    private: unsigned int contactSurfaceBitmask;
+
+    /// \brief SDF for this plugin;
+    private: sdf::ElementPtr sdf;
+  };
+}
+#endif  // ifndef _MUD_PLUGIN_HH_
diff --git a/plugins/PressurePlugin.cc b/plugins/PressurePlugin.cc
new file mode 100644
index 0000000..8af1808
--- /dev/null
+++ b/plugins/PressurePlugin.cc
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/*
+ * Desc: Pressure sensor plugin
+ * Author: Steve Peters
+ */
+#include <gazebo/physics/Base.hh>
+#include "PressurePlugin.hh"
+
+using namespace gazebo;
+GZ_REGISTER_SENSOR_PLUGIN(PressurePlugin)
+
+/////////////////////////////////////////////////
+PressurePlugin::PressurePlugin() : SensorPlugin()
+{
+}
+
+/////////////////////////////////////////////////
+PressurePlugin::~PressurePlugin()
+{
+}
+
+/////////////////////////////////////////////////
+void PressurePlugin::Load(sensors::SensorPtr _sensor, sdf::ElementPtr /*_sdf*/)
+{
+  // Get the parent sensor.
+  this->parentSensor =
+    boost::dynamic_pointer_cast<sensors::ContactSensor>(_sensor);
+
+  // Make sure the parent sensor is valid.
+  if (!this->parentSensor)
+  {
+    gzerr << "PressurePlugin requires a ContactSensor.\n";
+    return;
+  }
+
+  // Connect to the sensor update event.
+  this->updateConnection = this->parentSensor->ConnectUpdated(
+      boost::bind(&PressurePlugin::OnUpdate, this));
+
+  // Make sure the parent sensor is active.
+  this->parentSensor->SetActive(true);
+
+  // Get world name.
+  this->worldName = this->parentSensor->GetWorldName();
+
+  // Get name of parent sensor.
+  this->parentSensorName = this->parentSensor->GetName();
+
+  // Get collision names of parent sensor and physics pointers.
+  physics::WorldPtr world = physics::get_world(this->worldName);
+  unsigned int collisionCount = this->parentSensor->GetCollisionCount();
+  for (unsigned int i = 0; i < collisionCount; ++i)
+  {
+    std::string collisionScopedName = this->parentSensor->GetCollisionName(i);
+    // Strip off ::collision_name to get link name
+    std::string linkName = collisionScopedName.substr(0,
+                           collisionScopedName.rfind("::"));
+    // Get unscoped name of collision
+    std::string collisionName =
+      collisionScopedName.substr(collisionScopedName.rfind("::") + 2);
+    // Get physics pointers
+    physics::EntityPtr entity = world->GetEntity(linkName);
+    if (entity && entity->HasType(physics::Base::LINK))
+    {
+      physics::LinkPtr link =
+        boost::dynamic_pointer_cast<physics::Link>(entity);
+      if (link)
+      {
+        physics::CollisionPtr collision = link->GetCollision(collisionName);
+        if (collision)
+        {
+          physics::ShapePtr shape = collision->GetShape();
+          if (shape->HasType(physics::Base::BOX_SHAPE))
+          {
+            physics::BoxShapePtr box =
+              boost::dynamic_pointer_cast<physics::BoxShape>(shape);
+            if (box)
+            {
+              math::Vector3 size = box->GetSize();
+              std::vector<double> sizeVector;
+              sizeVector.push_back(size.x);
+              sizeVector.push_back(size.y);
+              sizeVector.push_back(size.z);
+              std::sort(sizeVector.begin(), sizeVector.end());
+              double area = sizeVector[1] * sizeVector[2];
+              if (area > 0.0)
+                this->collisionNamesToArea[collisionScopedName] = area;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void PressurePlugin::Init()
+{
+  this->node.reset(new transport::Node());
+  this->node->Init(this->worldName);
+
+  if (!this->parentSensorName.empty())
+  {
+    // Create publisher for tactile messages
+    std::string topicName = "~/" + this->parentSensorName + "/tactile";
+    boost::replace_all(topicName, "::", "/");
+    this->tactilePub = this->node->Advertise<msgs::Tactile>(topicName);
+  }
+}
+
+/////////////////////////////////////////////////
+void PressurePlugin::OnUpdate()
+{
+  msgs::Tactile tactileMsg;
+
+  // For each collision attached to this sensor
+  boost::unordered_map<std::string, double>::iterator iter;
+  for (iter = this->collisionNamesToArea.begin();
+       iter != this->collisionNamesToArea.end(); ++iter)
+  {
+    double normalForceSum = 0, normalForce;
+    // Get the contacts sorted by collision element.
+    std::map<std::string, gazebo::physics::Contact> contacts;
+    std::map<std::string, gazebo::physics::Contact>::iterator iter2;
+    contacts = this->parentSensor->GetContacts(iter->first);
+    for (iter2 = contacts.begin(); iter2 != contacts.end(); ++iter2)
+    {
+      for (int i = 0; i < iter2->second.count; ++i)
+      {
+        // TODO: determine whether body1Force or body2Force should be used.
+        normalForce = iter2->second.normals[i].x *
+                      iter2->second.wrench[i].body1Force.x +
+                      iter2->second.normals[i].y *
+                      iter2->second.wrench[i].body1Force.y +
+                      iter2->second.normals[i].z *
+                      iter2->second.wrench[i].body1Force.z;
+        normalForceSum += normalForce;
+      }
+    }
+    if (normalForceSum > 0)
+    {
+      tactileMsg.add_collision_name(iter->first);
+      tactileMsg.add_collision_id(0);
+      tactileMsg.add_pressure(normalForceSum / iter->second);
+    }
+  }
+
+  msgs::Contacts contacts = this->parentSensor->GetContacts();
+  int nc = contacts.contact_size();
+  if (nc > 0)
+  {
+    common::Time currentContactTime;
+    currentContactTime = msgs::Convert(contacts.contact(nc-1).time());
+    msgs::Set(tactileMsg.mutable_time(), currentContactTime);
+
+    if (this->tactilePub && tactileMsg.pressure_size() > 0)
+      this->tactilePub->Publish(tactileMsg);
+  }
+}
diff --git a/plugins/PressurePlugin.hh b/plugins/PressurePlugin.hh
new file mode 100644
index 0000000..bdb22ec
--- /dev/null
+++ b/plugins/PressurePlugin.hh
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/*
+ * Desc: Pressure Sensor Plugin
+ * Author: Steve Peters
+ */
+#ifndef _GAZEBO_PRESSURE_PLUGIN_HH_
+#define _GAZEBO_PRESSURE_PLUGIN_HH_
+
+#include <string>
+#include <boost/unordered_map.hpp>
+
+#include <gazebo/gazebo.hh>
+#include <gazebo/sensors/sensors.hh>
+#include <gazebo/transport/transport.hh>
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  /// \brief A plugin for a tactile pressure sensor.
+  /// The plugin extends the contact sensor and is currently limited to
+  /// collision elements with BoxShape geometry. It is assumed that pressure
+  /// measurement occurs on the largest face of the box. All normal forces on
+  /// each box shape are summed and divided by the area of the largest face
+  /// to compute pressure.
+  class GAZEBO_VISIBLE PressurePlugin : public SensorPlugin
+  {
+    /// \brief Constructor.
+    public: PressurePlugin();
+
+    /// \brief Destructor.
+    public: virtual ~PressurePlugin();
+
+    // Documentation inherited.
+    public: virtual void Load(sensors::SensorPtr _sensor, sdf::ElementPtr _sdf);
+
+    // Documentation inherited.
+    public: virtual void Init();
+
+    /// \brief Callback that recieves the contact sensor's update signal.
+    private: virtual void OnUpdate();
+
+    /// \brief Pointer to the contact sensor
+    private: sensors::ContactSensorPtr parentSensor;
+
+    /// \brief Connection that maintains a link between the contact sensor's
+    /// updated signal and the OnUpdate callback.
+    private: event::ConnectionPtr updateConnection;
+
+    /// \brief Transport node used for publishing tactile messages.
+    private: transport::NodePtr node;
+
+    /// \brief Publisher of tactile messages.
+    private: transport::PublisherPtr tactilePub;
+
+    /// \brief World name.
+    private: std::string worldName;
+
+    /// \brief Parent sensor name.
+    private: std::string parentSensorName;
+
+    /// \brief Parent sensor collision names.
+    private: boost::unordered_map<std::string, double> collisionNamesToArea;
+  };
+}
+#endif
diff --git a/plugins/RayPlugin.cc b/plugins/RayPlugin.cc
index 3563bd8..be22315 100644
--- a/plugins/RayPlugin.cc
+++ b/plugins/RayPlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
  * Author: Nate Koenig mod by John Hsu
  */
 
-#include "physics/physics.hh"
+#include "gazebo/physics/physics.hh"
 #include "RayPlugin.hh"
 
 using namespace gazebo;
@@ -35,6 +35,10 @@ RayPlugin::RayPlugin()
 /////////////////////////////////////////////////
 RayPlugin::~RayPlugin()
 {
+  this->parentSensor->GetLaserShape()->DisconnectNewLaserScans(
+      this->newLaserScansConnection);
+  this->newLaserScansConnection.reset();
+
   this->parentSensor.reset();
   this->world.reset();
 }
diff --git a/plugins/RayPlugin.hh b/plugins/RayPlugin.hh
index 27f126f..7b67f32 100644
--- a/plugins/RayPlugin.hh
+++ b/plugins/RayPlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,22 +15,23 @@
  *
 */
 /*
- * Desc: Contact Plugin
+ * Desc: Ray Plugin
  * Author: Nate Koenig mod by John Hsu
  */
 
-#ifndef GAZEBO_RAY_PLUGIN_HH
-#define GAZEBO_RAY_PLUGIN_HH
+#ifndef _GAZEBO_RAY_PLUGIN_HH_
+#define _GAZEBO_RAY_PLUGIN_HH_
 
-#include "common/Plugin.hh"
-#include "sensors/SensorTypes.hh"
-#include "sensors/RaySensor.hh"
-#include "gazebo.hh"
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/sensors/SensorTypes.hh"
+#include "gazebo/sensors/RaySensor.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  /// \brief A Bumper controller
-  class RayPlugin : public SensorPlugin
+  /// \brief A Ray Sensor Plugin
+  class GAZEBO_VISIBLE RayPlugin : public SensorPlugin
   {
     /// \brief Constructor
     public: RayPlugin();
@@ -38,9 +39,8 @@ namespace gazebo
     /// \brief Destructor
     public: virtual ~RayPlugin();
 
-    // update callback
+    /// \brief Update callback
     public: virtual void OnNewLaserScans();
-    private: event::ConnectionPtr newLaserScansConnection;
 
     /// \brief Load the plugin
     /// \param take in SDF root element
@@ -51,8 +51,9 @@ namespace gazebo
 
     /// \brief The parent sensor
     private: sensors::RaySensorPtr parentSensor;
+
+    /// \brief The connection tied to RayPlugin::OnNewLaserScans()
+    private: event::ConnectionPtr newLaserScansConnection;
   };
 }
-
 #endif
-
diff --git a/plugins/RaySensorNoisePlugin.cc b/plugins/RaySensorNoisePlugin.cc
new file mode 100644
index 0000000..a387892
--- /dev/null
+++ b/plugins/RaySensorNoisePlugin.cc
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2012-2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/sensors/Noise.hh"
+#include "RaySensorNoisePlugin.hh"
+
+using namespace gazebo;
+
+// Register this plugin with the simulator
+GZ_REGISTER_SENSOR_PLUGIN(RaySensorNoisePlugin)
+
+/////////////////////////////////////////////////
+RaySensorNoisePlugin::RaySensorNoisePlugin()
+{
+  this->fixedNoiseRate = 0.005;
+  this->sign = 1;
+}
+
+/////////////////////////////////////////////////
+RaySensorNoisePlugin::~RaySensorNoisePlugin()
+{
+}
+
+/////////////////////////////////////////////////
+void RaySensorNoisePlugin::Load(sensors::SensorPtr _parent,
+    sdf::ElementPtr /*_sdf*/)
+{
+  if (!_parent)
+  {
+    gzerr << "RaySensorNoisePlugin requires a ray sensor as its parent.\n";
+    return;
+  }
+
+  sensors::NoisePtr noise = _parent->GetNoise();
+
+  if (noise)
+  {
+    noise->SetCustomNoiseCallback(
+      boost::bind(&RaySensorNoisePlugin::OnApplyNoise, this, _1));
+  }
+  else
+  {
+    gzwarn << "No noise found. Please add noise element to you ray sensor sdf "
+        << "and set noise type to \"custom\"" << std::endl;
+  }
+}
+
+/////////////////////////////////////////////////
+double RaySensorNoisePlugin::OnApplyNoise(double _in)
+{
+  // Apply alternating random noise.
+  double randNoise = math::Rand::GetDblUniform(0, this->fixedNoiseRate);
+  this->sign *= -1;
+  return _in + this->sign*randNoise*_in;
+}
diff --git a/plugins/RaySensorNoisePlugin.hh b/plugins/RaySensorNoisePlugin.hh
new file mode 100644
index 0000000..4cf4249
--- /dev/null
+++ b/plugins/RaySensorNoisePlugin.hh
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_RAY_SENSOR_NOISE_PLUGIN_HH_
+#define _GAZEBO_RAY_SENSOR_NOISE_PLUGIN_HH_
+
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/sensors/SensorTypes.hh"
+#include "gazebo/sensors/RaySensor.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  /// \brief A Ray Sensor Noise Plugin
+  class GAZEBO_VISIBLE RaySensorNoisePlugin : public SensorPlugin
+  {
+    /// \brief Constructor
+    public: RaySensorNoisePlugin();
+
+    /// \brief Destructor
+    public: virtual ~RaySensorNoisePlugin();
+
+    /// \brief Callback for applying noise to a single sensor beam.
+    /// \param[in] _in Input range value.
+    /// \return Range value with noise added.
+    public: virtual double OnApplyNoise(double _in);
+
+    /// \brief Load the plugin
+    /// \param[in] _parent Parent sensor
+    /// \param[in] _sdf Parent sensor's sdf element.
+    public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf);
+
+    /// \brief Apply fixed noise rate to each sensor beam.
+    private: double fixedNoiseRate;
+
+    /// \brief Sign of the noise value.
+    private: int sign;
+  };
+}
+#endif
diff --git a/plugins/RubblePlugin.cc b/plugins/RubblePlugin.cc
index 3fad6d8..c7ae3f0 100644
--- a/plugins/RubblePlugin.cc
+++ b/plugins/RubblePlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,7 +15,8 @@
  *
 */
 
-#include "gazebo/math/Rand.hh"
+#include <gazebo/math/Rand.hh>
+#include <gazebo/physics/World.hh>
 #include "RubblePlugin.hh"
 
 using namespace gazebo;
@@ -32,16 +33,13 @@ void RubblePlugin::Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
 {
   this->world = _world;
 
-  math::Vector3 bottomRight = _sdf->GetValueVector3("bottom_right");
-  math::Vector3 topLeft = _sdf->GetValueVector3("top_left");
-  math::Vector3 minSize = _sdf->GetValueVector3("min_size");
-  math::Vector3 maxSize = _sdf->GetValueVector3("max_size");
-  double minMass = _sdf->GetValueDouble("min_mass");
-  double maxMass = _sdf->GetValueDouble("max_mass");
-  unsigned int count = _sdf->GetValueUInt("count");
-
-  std::vector<CompoundObj> objects;
-  std::vector<CompoundObj>::iterator iter;
+  math::Vector3 bottomRight = _sdf->Get<math::Vector3>("bottom_right");
+  math::Vector3 topLeft = _sdf->Get<math::Vector3>("top_left");
+  math::Vector3 minSize = _sdf->Get<math::Vector3>("min_size");
+  math::Vector3 maxSize = _sdf->Get<math::Vector3>("max_size");
+  double minMass = _sdf->Get<double>("min_mass");
+  double maxMass = _sdf->Get<double>("max_mass");
+  unsigned int count = _sdf->Get<unsigned int>("count");
 
   for (unsigned int i = 0; i < count; ++i)
   {
@@ -108,7 +106,9 @@ void RubblePlugin::Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
 
     // Disable compound objects for now.
     // bool merged = false;
-    /*for (iter = objects.begin(); iter != objects.end(); ++iter)
+    /* std::vector<CompoundObj> objects;
+       std::vector<CompoundObj>::iterator iter;
+       for (iter = objects.begin(); iter != objects.end(); ++iter)
     {
       bool x = fabs(obj.pos.x - (*iter).pos.x) <=
         (*iter).size.x * 0.5 + obj.size.x * 0.5;
@@ -187,7 +187,7 @@ void RubblePlugin::MakeCinderBlock(const std::string &_name, math::Pose &_pose,
   float sy = _size.y;
   float sz = _size.z;
 
-  newModelStr << "<sdf version='1.3'>"
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
     "<model name='" << _name << "'>"
     "<pose>" << _pose << "</pose>"
     "<link name='link'>"
@@ -232,7 +232,7 @@ void RubblePlugin::MakeBox(const std::string &_name, math::Pose &_pose,
   float sy = _size.y;
   float sz = _size.z;
 
-  newModelStr << "<sdf version='1.3'>"
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
     "<model name='" << _name << "'>"
     "<allow_auto_disable>true</allow_auto_disable>"
     "<pose>" << _pose << "</pose>"
@@ -277,7 +277,7 @@ void RubblePlugin::MakeCylinder(const std::string &_name, math::Vector3 &_pos,
   float r = _size.x * 0.5;
   float h = _size.z;
 
-  newModelStr << "<sdf version='1.3'>"
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
     "<model name='" << _name << "'>"
     "<pose>" << _pos << " 0 0 0</pose>"
     "<link name='link'>"
diff --git a/plugins/RubblePlugin.hh b/plugins/RubblePlugin.hh
index 417b247..f1192e1 100644
--- a/plugins/RubblePlugin.hh
+++ b/plugins/RubblePlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,11 +21,12 @@
 #include <string>
 #include <vector>
 
-#include "gazebo/gazebo.hh"
+#include <gazebo/gazebo.hh>
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  class RubblePlugin : public WorldPlugin
+  class GAZEBO_VISIBLE RubblePlugin : public WorldPlugin
   {
     /// \brief Constructor.
     public: RubblePlugin();
diff --git a/plugins/SkidSteerDrivePlugin.cc b/plugins/SkidSteerDrivePlugin.cc
index 5e71323..73a5702 100644
--- a/plugins/SkidSteerDrivePlugin.cc
+++ b/plugins/SkidSteerDrivePlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,8 +17,8 @@
 
 #include <string>
 
-#include "physics/physics.hh"
-#include "transport/transport.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/transport.hh"
 #include "plugins/SkidSteerDrivePlugin.hh"
 
 using namespace gazebo;
@@ -28,7 +28,7 @@ GZ_REGISTER_MODEL_PLUGIN(SkidSteerDrivePlugin)
 /////////////////////////////////////////////////
 SkidSteerDrivePlugin::SkidSteerDrivePlugin()
 {
-  this->MaxForce = 5.0;
+  this->maxForce = 5.0;
   this->wheelRadius = 0.0;
   this->wheelSeparation = 0.0;
 }
@@ -45,8 +45,8 @@ int SkidSteerDrivePlugin::RegisterJoint(int _index, const std::string &_name)
   }
 
   // Find the specified joint and add it to out list
-  this->Joints[_index] = this->model->GetJoint(_name);
-  if (!this->Joints[_index])
+  this->joints[_index] = this->model->GetJoint(_name);
+  if (!this->joints[_index])
   {
     gzerr << "Unable to find the " << _name
           <<  " joint in model " << this->model->GetName() << "." << std::endl;
@@ -67,32 +67,28 @@ void SkidSteerDrivePlugin::Load(physics::ModelPtr _model,
   this->node->Init(this->model->GetWorld()->GetName());
 
   int err = 0;
+
   err += RegisterJoint(RIGHT_FRONT, "right_front");
   err += RegisterJoint(RIGHT_REAR,  "right_rear");
   err += RegisterJoint(LEFT_FRONT,  "left_front");
   err += RegisterJoint(LEFT_REAR,   "left_rear");
+
   if (err > 0)
-  {
     return;
-  }
 
-  if (_sdf->HasElement("MaxForce"))
-  {
-    this->MaxForce = _sdf->GetElement("MaxForce")->GetValueDouble();
-  }
+  if (_sdf->HasElement("max_force"))
+    this->maxForce = _sdf->GetElement("max_force")->Get<double>();
   else
-  {
     gzwarn << "No MaxForce value set in the model sdf, default value is 5.0.\n";
-  }
 
   // This assumes that front and rear wheel spacing is identical
-  this->wheelSeparation = this->Joints[RIGHT_FRONT]->GetAnchor(0).Distance(
-                          this->Joints[LEFT_FRONT]->GetAnchor(0));
+  this->wheelSeparation = this->joints[RIGHT_FRONT]->GetAnchor(0).Distance(
+                          this->joints[LEFT_FRONT]->GetAnchor(0));
 
   // This assumes that the largest dimension of the wheel is the diameter
   // and that all wheels have the same diameter
   physics::EntityPtr wheelLink = boost::dynamic_pointer_cast<physics::Entity>(
-                                        this->Joints[RIGHT_FRONT]->GetChild() );
+                                        this->joints[RIGHT_FRONT]->GetChild() );
   if (wheelLink)
   {
     math::Box bb = wheelLink->GetBoundingBox();
@@ -128,14 +124,14 @@ void SkidSteerDrivePlugin::OnVelMsg(ConstPosePtr &_msg)
   //       << msgs::Convert(msg->orientation()).GetAsEuler().z << std::endl;
 
   for (int i = 0; i < NUMBER_OF_WHEELS; i++)
-    this->Joints[i]->SetMaxForce(0, this->MaxForce);
+    this->joints[i]->SetMaxForce(0, this->maxForce);
 
   double vel_lin = _msg->position().x() / this->wheelRadius;
   double vel_rot = -1 * msgs::Convert(_msg->orientation()).GetAsEuler().z
                    * (this->wheelSeparation / this->wheelRadius);
 
-  this->Joints[RIGHT_FRONT]->SetVelocity(0, vel_lin - vel_rot);
-  this->Joints[RIGHT_REAR ]->SetVelocity(0, vel_lin - vel_rot);
-  this->Joints[LEFT_FRONT ]->SetVelocity(0, vel_lin + vel_rot);
-  this->Joints[LEFT_REAR  ]->SetVelocity(0, vel_lin + vel_rot);
+  this->joints[RIGHT_FRONT]->SetVelocity(0, vel_lin - vel_rot);
+  this->joints[RIGHT_REAR ]->SetVelocity(0, vel_lin - vel_rot);
+  this->joints[LEFT_FRONT ]->SetVelocity(0, vel_lin + vel_rot);
+  this->joints[LEFT_REAR  ]->SetVelocity(0, vel_lin + vel_rot);
 }
diff --git a/plugins/SkidSteerDrivePlugin.hh b/plugins/SkidSteerDrivePlugin.hh
index c674489..831e1d4 100644
--- a/plugins/SkidSteerDrivePlugin.hh
+++ b/plugins/SkidSteerDrivePlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,16 @@
  * limitations under the License.
  *
 */
-#ifndef __GAZEBO_SkidSteerDrive_PLUGIN_HH__
-#define __GAZEBO_SkidSteerDrive_PLUGIN_HH__
+#ifndef _GAZEBO_SkidSteerDrive_PLUGIN_HH_
+#define _GAZEBO_SkidSteerDrive_PLUGIN_HH_
 
 #include <string>
 
-#include "common/common.hh"
-#include "physics/physics.hh"
-#include "transport/TransportTypes.hh"
-#include "gazebo.hh"
+#include "gazebo/common/common.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
 
 #define NUMBER_OF_WHEELS 4
 
@@ -32,7 +33,7 @@ namespace gazebo
   /// \brief A gazebo model plugin that controls a four wheel skid-steer
   ///        robot via a gazebo topic. See the Pioneer3AT model in the
   ///        OSRF model database for an example use case.
-  class SkidSteerDrivePlugin : public ModelPlugin
+  class GAZEBO_VISIBLE SkidSteerDrivePlugin : public ModelPlugin
   {
     /// \brief Default Contstuctor
     public: SkidSteerDrivePlugin();
@@ -65,10 +66,10 @@ namespace gazebo
     private: physics::ModelPtr model;
 
     /// \brief Pointer to each wheel joint
-    private: physics::JointPtr Joints[NUMBER_OF_WHEELS];
+    private: physics::JointPtr joints[NUMBER_OF_WHEELS];
 
     /// \brief Max force limit for each wheel joint (Default 5.0)
-    private: double MaxForce;
+    private: double maxForce;
 
     /// \brief Distance between wheels on the same axis (Determined from SDF)
     private: double wheelSeparation;
diff --git a/plugins/SonarPlugin.cc b/plugins/SonarPlugin.cc
new file mode 100644
index 0000000..15b7a00
--- /dev/null
+++ b/plugins/SonarPlugin.cc
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/physics.hh"
+#include "SonarPlugin.hh"
+
+using namespace gazebo;
+
+// Register this plugin with the simulator
+GZ_REGISTER_SENSOR_PLUGIN(SonarPlugin)
+
+/////////////////////////////////////////////////
+SonarPlugin::SonarPlugin()
+{
+}
+
+/////////////////////////////////////////////////
+SonarPlugin::~SonarPlugin()
+{
+  this->parentSensor->DisconnectUpdate(this->connection);
+  this->parentSensor.reset();
+}
+
+/////////////////////////////////////////////////
+void SonarPlugin::Load(sensors::SensorPtr _parent, sdf::ElementPtr /*_sdf*/)
+{
+  // Get then name of the parent sensor
+  this->parentSensor =
+    boost::dynamic_pointer_cast<sensors::SonarSensor>(_parent);
+
+  if (!this->parentSensor)
+    gzthrow("SonarPlugin requires a sonar sensor as its parent.");
+
+  this->connection =
+    this->parentSensor->ConnectUpdate(
+      boost::bind(&SonarPlugin::OnUpdate, this, _1));
+}
+
+/////////////////////////////////////////////////
+void SonarPlugin::OnUpdate(msgs::SonarStamped /*_msg*/)
+{
+  // overload with useful callback here
+}
diff --git a/plugins/SonarPlugin.hh b/plugins/SonarPlugin.hh
new file mode 100644
index 0000000..b6801ea
--- /dev/null
+++ b/plugins/SonarPlugin.hh
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _GAZEBO_SONAR_PLUGIN_HH_
+#define _GAZEBO_SONAR_PLUGIN_HH_
+
+#include "gazebo/common/Plugin.hh"
+#include "gazebo/sensors/SensorTypes.hh"
+#include "gazebo/sensors/SonarSensor.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  /// \brief A sonar sensor plugin
+  class GAZEBO_VISIBLE SonarPlugin : public SensorPlugin
+  {
+    /// \brief Constructor
+    public: SonarPlugin();
+
+    /// \brief Destructor
+    public: virtual ~SonarPlugin();
+
+    /// \brief Load the plugin
+    /// \param[in] _parent Pointer to the parent sensor.
+    /// \param[in] _sdf SDF element for the plugin.
+    public: void Load(sensors::SensorPtr _parent, sdf::ElementPtr _sdf);
+
+    /// \brief Update callback. Overload this function in a child class.
+    /// \param[in] _msg The sonar ping message.
+    protected: virtual void OnUpdate(msgs::SonarStamped _msg);
+
+    /// \brief The parent sensor
+    protected: sensors::SonarSensorPtr parentSensor;
+
+    /// \brief The connection tied to SonarSensor's update event
+    private: event::ConnectionPtr connection;
+  };
+}
+#endif
diff --git a/plugins/SphereAtlasDemoPlugin.cc b/plugins/SphereAtlasDemoPlugin.cc
new file mode 100644
index 0000000..5b6bdfe
--- /dev/null
+++ b/plugins/SphereAtlasDemoPlugin.cc
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/physics.hh"
+#include "plugins/SphereAtlasDemoPlugin.hh"
+
+using namespace gazebo;
+
+GZ_REGISTER_MODEL_PLUGIN(SphereAtlasDemoPlugin)
+
+/////////////////////////////////////////////////
+SphereAtlasDemoPlugin::SphereAtlasDemoPlugin()
+{
+}
+
+/////////////////////////////////////////////////
+void SphereAtlasDemoPlugin::Load(physics::ModelPtr _model,
+                           sdf::ElementPtr /*_sdf*/)
+{
+  this->model = _model;
+
+  this->jointNames.push_back("l_leg_hpz");
+  this->jointNames.push_back("l_leg_hpx");
+  this->jointNames.push_back("l_leg_hpy");
+  this->jointNames.push_back("l_leg_kny");
+  this->jointNames.push_back("l_leg_aky");
+  this->jointNames.push_back("l_leg_akx");
+  this->jointNames.push_back("r_leg_hpz");
+  this->jointNames.push_back("r_leg_hpx");
+  this->jointNames.push_back("r_leg_hpy");
+  this->jointNames.push_back("r_leg_kny");
+  this->jointNames.push_back("r_leg_aky");
+  this->jointNames.push_back("r_leg_akx");
+  this->jointNames.push_back("l_arm_shy");
+  this->jointNames.push_back("l_arm_shx");
+  this->jointNames.push_back("l_arm_ely");
+  this->jointNames.push_back("l_arm_elx");
+  this->jointNames.push_back("l_arm_wry");
+  this->jointNames.push_back("l_arm_wrx");
+  this->jointNames.push_back("r_arm_shy");
+  this->jointNames.push_back("r_arm_shx");
+  this->jointNames.push_back("r_arm_ely");
+  this->jointNames.push_back("r_arm_elx");
+  this->jointNames.push_back("r_arm_wry");
+  this->jointNames.push_back("r_arm_wrx");
+  this->jointNames.push_back("neck_ry");
+  this->jointNames.push_back("back_bkz");
+  this->jointNames.push_back("back_bky");
+  this->jointNames.push_back("back_bkx");
+
+  this->jointKp.push_back(  1000.0);  // l_leg_hpz        NOLINT
+  this->jointKp.push_back(  1000.0);  // l_leg_hpx        NOLINT
+  this->jointKp.push_back(  2000.0);  // l_leg_hpy        NOLINT
+  this->jointKp.push_back(  5000.0);  // l_leg_kny        NOLINT
+  this->jointKp.push_back(  3000.0);  // l_leg_aky        NOLINT
+  this->jointKp.push_back(  1000.0);  // l_leg_akx        NOLINT
+  this->jointKp.push_back(  1000.0);  // r_leg_hpz        NOLINT
+  this->jointKp.push_back(  1000.0);  // r_leg_hpx        NOLINT
+  this->jointKp.push_back(  2000.0);  // r_leg_hpy        NOLINT
+  this->jointKp.push_back(  5000.0);  // r_leg_kny        NOLINT
+  this->jointKp.push_back(  3000.0);  // r_leg_aky        NOLINT
+  this->jointKp.push_back(  1000.0);  // r_leg_akx        NOLINT
+  this->jointKp.push_back(  2000.0);  // l_arm_shy        NOLINT
+  this->jointKp.push_back(  1000.0);  // l_arm_shx        NOLINT
+  this->jointKp.push_back(   200.0);  // l_arm_ely        NOLINT
+  this->jointKp.push_back(   200.0);  // l_arm_elx        NOLINT
+  this->jointKp.push_back(    50.0);  // l_arm_wry        NOLINT
+  this->jointKp.push_back(   100.0);  // l_arm_wrx        NOLINT
+  this->jointKp.push_back(  2000.0);  // r_arm_shy        NOLINT
+  this->jointKp.push_back(  1000.0);  // r_arm_shx        NOLINT
+  this->jointKp.push_back(   200.0);  // r_arm_ely        NOLINT
+  this->jointKp.push_back(   200.0);  // r_arm_elx        NOLINT
+  this->jointKp.push_back(    50.0);  // r_arm_wry        NOLINT
+  this->jointKp.push_back(   100.0);  // r_arm_wrx        NOLINT
+  this->jointKp.push_back(  1000.0);  // neck_ry          NOLINT
+  this->jointKp.push_back( 20000.0);  // back_bkz         NOLINT
+  this->jointKp.push_back(200000.0);  // back_bky         NOLINT
+  this->jointKp.push_back(200000.0);  // back_bkx         NOLINT
+
+  this->jointKd.push_back( 0.01);  // l_leg_hpz           NOLINT
+  this->jointKd.push_back( 1.00);  // l_leg_hpx           NOLINT
+  this->jointKd.push_back(10.00);  // l_leg_hpy           NOLINT
+  this->jointKd.push_back(10.00);  // l_leg_kny           NOLINT
+  this->jointKd.push_back( 2.00);  // l_leg_aky           NOLINT
+  this->jointKd.push_back( 1.00);  // l_leg_akx           NOLINT
+  this->jointKd.push_back( 0.01);  // r_leg_hpz           NOLINT
+  this->jointKd.push_back( 1.00);  // r_leg_hpx           NOLINT
+  this->jointKd.push_back(10.00);  // r_leg_hpy           NOLINT
+  this->jointKd.push_back(10.00);  // r_leg_kny           NOLINT
+  this->jointKd.push_back( 2.00);  // r_leg_aky           NOLINT
+  this->jointKd.push_back( 1.00);  // r_leg_akx           NOLINT
+  this->jointKd.push_back( 3.00);  // l_arm_shy           NOLINT
+  this->jointKd.push_back(10.00);  // l_arm_shx           NOLINT
+  this->jointKd.push_back( 3.00);  // l_arm_ely           NOLINT
+  this->jointKd.push_back( 3.00);  // l_arm_elx           NOLINT
+  this->jointKd.push_back( 0.10);  // l_arm_wry           NOLINT
+  this->jointKd.push_back( 0.20);  // l_arm_wrx           NOLINT
+  this->jointKd.push_back( 3.00);  // r_arm_shy           NOLINT
+  this->jointKd.push_back(10.00);  // r_arm_shx           NOLINT
+  this->jointKd.push_back( 3.00);  // r_arm_ely           NOLINT
+  this->jointKd.push_back( 3.00);  // r_arm_elx           NOLINT
+  this->jointKd.push_back( 0.10);  // r_arm_wry           NOLINT
+  this->jointKd.push_back( 0.20);  // r_arm_wrx           NOLINT
+  this->jointKd.push_back( 1.00);  // neck_ry             NOLINT
+  this->jointKd.push_back( 1.00);  // back_bkz            NOLINT
+  this->jointKd.push_back( 2.00);  // back_bky            NOLINT
+  this->jointKd.push_back( 1.00);  // back_bkx            NOLINT
+
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+  this->qp.push_back(0.0);
+
+  for (unsigned int i = 0; i < this->jointNames.size(); ++i)
+  {
+    physics::JointPtr j = model->GetJoint(this->jointNames[i]);
+    this->joints.push_back(j);
+  }
+
+  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
+          boost::bind(&SphereAtlasDemoPlugin::OnUpdate, this));
+}
+
+/////////////////////////////////////////////////
+void SphereAtlasDemoPlugin::Init()
+{
+}
+
+/////////////////////////////////////////////////
+void SphereAtlasDemoPlugin::Reset()
+{
+  gzlog << "SphereAtlasDemoPlugin: \n"
+        << "  This is not a typical usage of plugin Reset function,\n"
+        << "  we are doing this just for testing purposes.\n";
+  if (this->updateConnection)
+  {
+    event::Events::DisconnectWorldUpdateBegin(this->updateConnection);
+    this->updateConnection.reset();
+  }
+}
+
+/////////////////////////////////////////////////
+void SphereAtlasDemoPlugin::OnUpdate()
+{
+  common::Time currTime = this->model->GetWorld()->GetSimTime();
+  common::Time stepTime = currTime - this->prevUpdateTime;
+  this->prevUpdateTime = currTime;
+  double dt = stepTime.Double();
+
+  for (unsigned int j = 0; j < this->joints.size(); ++j)
+  {
+    double p = this->joints[j]->GetAngle(0).Radian();
+    double target = 0;
+    double perror = target - p;
+    double derror = (perror - this->qp[j])/dt;
+    this->qp[j] = perror;  // save qp
+    double force = this->jointKp[j] * perror +
+                   this->jointKd[j] * derror;
+    this->joints[j]->SetForce(0, force);
+  }
+}
diff --git a/plugins/SphereAtlasDemoPlugin.hh b/plugins/SphereAtlasDemoPlugin.hh
new file mode 100644
index 0000000..12f255f
--- /dev/null
+++ b/plugins/SphereAtlasDemoPlugin.hh
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_SPHERE_ATLAS_DEMO_PLUGIN_HH_
+#define _GAZEBO_SPHERE_ATLAS_DEMO_PLUGIN_HH_
+
+#include <string>
+#include <vector>
+
+#include "gazebo/common/common.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  class GAZEBO_VISIBLE SphereAtlasDemoPlugin : public ModelPlugin
+  {
+    public: SphereAtlasDemoPlugin();
+    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
+    public: virtual void Init();
+    public: virtual void Reset();
+
+    private: void OnUpdate();
+
+    private: event::ConnectionPtr updateConnection;
+
+    private: physics::ModelPtr model;
+    private: std::vector<std::string> jointNames;
+    private: physics::Joint_V joints;
+
+    private: common::Time prevUpdateTime;
+
+    private: std::vector<double> qp;
+    private: std::vector<double> jointKp;
+    private: std::vector<double> jointKd;
+  };
+}
+#endif
diff --git a/plugins/SpringTestPlugin.cc b/plugins/SpringTestPlugin.cc
deleted file mode 100644
index 2565618..0000000
--- a/plugins/SpringTestPlugin.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "gazebo/physics/physics.hh"
-#include "plugins/SpringTestPlugin.hh"
-
-using namespace gazebo;
-
-GZ_REGISTER_MODEL_PLUGIN(SpringTestPlugin)
-
-/////////////////////////////////////////////////
-SpringTestPlugin::SpringTestPlugin()
-{
-}
-
-/////////////////////////////////////////////////
-void SpringTestPlugin::Load(physics::ModelPtr _model,
-                           sdf::ElementPtr _sdf)
-{
-  this->model = _model;
-
-  this->k =
-    _sdf->GetElement("k")->GetValueDouble();
-
-  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
-          boost::bind(&SpringTestPlugin::OnUpdate, this));
-}
-
-/////////////////////////////////////////////////
-void SpringTestPlugin::Init()
-{
-}
-
-/////////////////////////////////////////////////
-void SpringTestPlugin::OnUpdate()
-{
-  common::Time currTime = this->model->GetWorld()->GetSimTime();
-  common::Time stepTime = currTime - this->prevUpdateTime;
-  this->prevUpdateTime = currTime;
-
-  physics::JointPtr joint = this->model->GetJoint("joint_0");
-  {
-    double pos = joint->GetAngle(0).Radian();
-    double force = -this->k * pos;
-    gzdbg << "joint pos [" << pos << "] force [" << force << "]\n";
-    joint->SetForce(0, force);
-  }
-}
diff --git a/plugins/SpringTestPlugin.hh b/plugins/SpringTestPlugin.hh
deleted file mode 100644
index b42f343..0000000
--- a/plugins/SpringTestPlugin.hh
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#ifndef __GAZEBO_SPRING_TEST_PLUGIN_HH__
-#define __GAZEBO_SPRING_TEST_PLUGIN_HH__
-
-#include "gazebo/common/common.hh"
-#include "gazebo/physics/physics.hh"
-#include "gazebo/gazebo.hh"
-
-namespace gazebo
-{
-  class SpringTestPlugin : public ModelPlugin
-  {
-    public: SpringTestPlugin();
-    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
-    public: virtual void Init();
-
-    private: void OnUpdate();
-
-    private: event::ConnectionPtr updateConnection;
-
-    private: physics::ModelPtr model;
-
-    private: common::Time prevUpdateTime;
-
-    private: double k;
-  };
-}
-#endif
diff --git a/plugins/VehiclePlugin.cc b/plugins/VehiclePlugin.cc
index d4af3df..e5f27a1 100644
--- a/plugins/VehiclePlugin.cc
+++ b/plugins/VehiclePlugin.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,8 +15,8 @@
  *
 */
 
-#include "physics/physics.hh"
-#include "transport/transport.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/transport.hh"
 #include "plugins/VehiclePlugin.hh"
 
 using namespace gazebo;
@@ -42,21 +42,23 @@ void VehiclePlugin::Load(physics::ModelPtr _model, sdf::ElementPtr _sdf)
   this->model = _model;
   // this->physics = this->model->GetWorld()->GetPhysicsEngine();
 
-  this->joints[0] = this->model->GetJoint(_sdf->GetValueString("front_left"));
+  this->joints[0] = this->model->GetJoint(_sdf->Get<std::string>("front_left"));
   if (!this->joints[0])
   {
     gzerr << "Unable to find joint: front_left\n";
     return;
   }
 
-  this->joints[1] = this->model->GetJoint(_sdf->GetValueString("front_right"));
+  this->joints[1] = this->model->GetJoint(
+      _sdf->Get<std::string>("front_right"));
+
   if (!this->joints[1])
   {
     gzerr << "Unable to find joint: front_right\n";
     return;
   }
 
-  this->joints[2] = this->model->GetJoint(_sdf->GetValueString("back_left"));
+  this->joints[2] = this->model->GetJoint(_sdf->Get<std::string>("back_left"));
   if (!this->joints[2])
   {
     gzerr << "Unable to find joint: back_left\n";
@@ -64,40 +66,41 @@ void VehiclePlugin::Load(physics::ModelPtr _model, sdf::ElementPtr _sdf)
   }
 
 
-  this->joints[3] = this->model->GetJoint(_sdf->GetValueString("back_right"));
+  this->joints[3] = this->model->GetJoint(_sdf->Get<std::string>("back_right"));
   if (!this->joints[3])
   {
     gzerr << "Unable to find joint: back_right\n";
     return;
   }
 
-  this->joints[0]->SetAttribute("suspension_erp", 0, 0.15);
-  this->joints[0]->SetAttribute("suspension_cfm", 0, 0.04);
+  this->joints[0]->SetParam("suspension_erp", 0, 0.15);
+  this->joints[0]->SetParam("suspension_cfm", 0, 0.04);
 
-  this->joints[1]->SetAttribute("suspension_erp", 0, 0.15);
-  this->joints[1]->SetAttribute("suspension_cfm", 0, 0.04);
+  this->joints[1]->SetParam("suspension_erp", 0, 0.15);
+  this->joints[1]->SetParam("suspension_cfm", 0, 0.04);
 
-  this->joints[2]->SetAttribute("suspension_erp", 0, 0.15);
-  this->joints[2]->SetAttribute("suspension_cfm", 0, 0.04);
+  this->joints[2]->SetParam("suspension_erp", 0, 0.15);
+  this->joints[2]->SetParam("suspension_cfm", 0, 0.04);
 
-  this->joints[3]->SetAttribute("suspension_erp", 0, 0.15);
-  this->joints[3]->SetAttribute("suspension_cfm", 0, 0.04);
+  this->joints[3]->SetParam("suspension_erp", 0, 0.15);
+  this->joints[3]->SetParam("suspension_cfm", 0, 0.04);
 
-  this->gasJoint = this->model->GetJoint(_sdf->GetValueString("gas"));
-  this->brakeJoint = this->model->GetJoint(_sdf->GetValueString("brake"));
-  this->steeringJoint = this->model->GetJoint(_sdf->GetValueString("steering"));
+  this->gasJoint = this->model->GetJoint(_sdf->Get<std::string>("gas"));
+  this->brakeJoint = this->model->GetJoint(_sdf->Get<std::string>("brake"));
+  this->steeringJoint = this->model->GetJoint(
+      _sdf->Get<std::string>("steering"));
 
   if (!this->gasJoint)
   {
     gzerr << "Unable to find gas joint["
-          << _sdf->GetValueString("gas") << "]\n";
+          << _sdf->Get<std::string>("gas") << "]\n";
     return;
   }
 
   if (!this->steeringJoint)
   {
     gzerr << "Unable to find steering joint["
-          << _sdf->GetValueString("steering") << "]\n";
+          << _sdf->Get<std::string>("steering") << "]\n";
     return;
   }
 
@@ -129,11 +132,11 @@ void VehiclePlugin::Load(physics::ModelPtr _model, sdf::ElementPtr _sdf)
     return;
   }
 
-  this->maxSpeed = _sdf->GetValueDouble("max_speed");
-  this->aeroLoad = _sdf->GetValueDouble("aero_load");
-  this->tireAngleRange = _sdf->GetValueDouble("tire_angle_range");
-  this->frontPower = _sdf->GetValueDouble("front_power");
-  this->rearPower = _sdf->GetValueDouble("rear_power");
+  this->maxSpeed = _sdf->Get<double>("max_speed");
+  this->aeroLoad = _sdf->Get<double>("aero_load");
+  this->tireAngleRange = _sdf->Get<double>("tire_angle_range");
+  this->frontPower = _sdf->Get<double>("front_power");
+  this->rearPower = _sdf->Get<double>("rear_power");
 
   this->connections.push_back(event::Events::ConnectWorldUpdateBegin(
           boost::bind(&VehiclePlugin::OnUpdate, this)));
@@ -232,15 +235,13 @@ void VehiclePlugin::OnUpdate()
   math::Vector3 hingePoint;
   math::Vector3 axis;
 
-  double displacement;
-
   for (int ix = 0; ix < 4; ++ix)
   {
     hingePoint = this->joints[ix]->GetAnchor(0);
     bodyPoint = this->joints[ix]->GetAnchor(1);
 
     axis = this->joints[ix]->GetGlobalAxis(0).Round();
-    displacement = (bodyPoint - hingePoint).Dot(axis);
+    double displacement = (bodyPoint - hingePoint).Dot(axis);
 
     float amt = displacement * this->swayForce;
     if (displacement > 0)
diff --git a/plugins/VehiclePlugin.hh b/plugins/VehiclePlugin.hh
index 75b9a7e..cba4329 100644
--- a/plugins/VehiclePlugin.hh
+++ b/plugins/VehiclePlugin.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,20 +18,21 @@
  * Author: Nate Koenig
  */
 
-#ifndef __GAZEBO_VEHICLE_PLUGIN_HH__
-#define __GAZEBO_VEHICLE_PLUGIN_HH__
+#ifndef _GAZEBO_VEHICLE_PLUGIN_HH_
+#define _GAZEBO_VEHICLE_PLUGIN_HH_
 
 #include <string>
 #include <vector>
 
-#include "common/common.hh"
-#include "physics/physics.hh"
-#include "transport/transport.hh"
-#include "gazebo.hh"
+#include "gazebo/common/common.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/transport.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
 
 namespace gazebo
 {
-  class VehiclePlugin : public ModelPlugin
+  class GAZEBO_VISIBLE VehiclePlugin : public ModelPlugin
   {
     /// \brief Constructor
     public: VehiclePlugin();
diff --git a/sdf/CMakeLists.txt b/sdf/CMakeLists.txt
deleted file mode 100644
index 8c5d2bd..0000000
--- a/sdf/CMakeLists.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-add_subdirectory(worlds)
-add_subdirectory(models)
diff --git a/sdf/models/CMakeLists.txt b/sdf/models/CMakeLists.txt
deleted file mode 100644
index 2240db7..0000000
--- a/sdf/models/CMakeLists.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-set (models
-  pioneer2at.model
-  quadrotor.model
-  weshare2012_apartment.model
-  weshare2012_pioneer.model
-  weshare2012_bookshelf.model
-  car.model
-  actor_circle.model
-  actor_demo.model
-  actor.model
-  multi_visuals.model
-  ragdoll.model
-)
-
-# install(FILES ${models} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/models/)
diff --git a/sdf/models/actor.model b/sdf/models/actor.model
deleted file mode 100644
index baed557..0000000
--- a/sdf/models/actor.model
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-    <actor name="actor1" static="true">
-        <origin pose="0 0 0 0 0 0" />
-        <skin filename="walk.dae" scale="1.0" />
-    </actor>
-</gazebo>
diff --git a/sdf/models/actor_circle.model b/sdf/models/actor_circle.model
deleted file mode 100644
index 950b2ea..0000000
--- a/sdf/models/actor_circle.model
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-    <actor name="actor1" static="true">
-        <origin pose="0 0 0 0 0 0" />
-        <skin filename="sub_16.dae" scale="1.0" />
-        <animation name="walking" filename="walk.dae" scale="1.0" interpolate_x="true" />
-        <script loop="true" delay_start="0.0" auto_start="true">
-            <trajectory id="0" type="walking">
-                <waypoint time="0.0" pose="0 1 0 0 0 0" />
-                <waypoint time="0.5" pose="0.19509 0.980785 0 0 0 -0.19635" />
-                <waypoint time="1.0" pose="0.382683 0.92388 0 0 0 -0.392699" />
-                <waypoint time="1.5" pose="0.55557 0.83147 0 0 0 -0.589049" />
-                <waypoint time="2.0" pose="0.707107 0.707107 0 0 -0 -0.785398" />
-                <waypoint time="2.5" pose="0.83147 0.55557 0 0 0 -0.981748" />
-                <waypoint time="3.0" pose="0.92388 0.382683 0 0 0 -1.1781" />
-                <waypoint time="3.5" pose="0.980785 0.19509 0 0 0 -1.37445" />
-                <waypoint time="4.0" pose="1 0 0 0 0 -1.5708" />
-                <waypoint time="4.5" pose="0.980785 -0.19509 0 0 0 -1.76715" />
-                <waypoint time="5.0" pose="0.92388 -0.382683 0 0 0 -1.9635" />
-                <waypoint time="5.5" pose="0.83147 -0.55557 0 0 0 -2.15984" />
-                <waypoint time="6.0" pose="0.707107 -0.707107 0 0 0 -2.35619" />
-                <waypoint time="6.5" pose="0.55557 -0.83147 0 0 0 -2.55254" />
-                <waypoint time="7.5" pose="0.382683 -0.92388 0 0 0 -2.74889" />
-                <waypoint time="8.5" pose="0.19509 -0.980785 0 0 0 -2.94524" />
-                <waypoint time="9.5" pose="0 -1 0 0 0 -3.14159" />
-                <waypoint time="10.5" pose="-0.19509 -0.980785 0 0 0 -3.33794" />
-                <waypoint time="11.5" pose="-0.382683 -0.92388 0 0 0 -3.53429" />
-                <waypoint time="12.0" pose="-0.55557 -0.83147 0 0 0 -3.73064" />
-                <waypoint time="12.5" pose="-0.707107 -0.707107 0 0 0 -3.92699" />
-                <waypoint time="13.0" pose="-0.83147 -0.55557 0 0 0 -4.12334" />
-                <waypoint time="13.5" pose="-0.92388 -0.382683 0 0 0 -4.31969" />
-                <waypoint time="14.0" pose="-0.980785 -0.19509 0 0 0 -4.51604" />
-                <waypoint time="14.5" pose="-1 0 0 0 0 -4.71239" />
-                <waypoint time="15.0" pose="-0.980785 0.19509 0 0 0 -4.90874" />
-                <waypoint time="15.5" pose="-0.92388 0.382683 0 0 0 -5.10509" />
-                <waypoint time="16.0" pose="-0.83147 0.55557 0 0 0 -5.30144" />
-                <waypoint time="16.5" pose="-0.707107 0.707107 0 0 0 -5.49779" />
-                <waypoint time="17.0" pose="-0.55557 0.83147 0 0 0 -5.69414" />
-                <waypoint time="17.5" pose="-0.382683 0.92388 0 0 0 -5.89049" />
-                <waypoint time="18.0" pose="-0.19509 0.980785 0 0 0 -6.08684" />
-            </trajectory>
-        </script>
-    </actor>
-</gazebo>
diff --git a/sdf/models/actor_demo.model b/sdf/models/actor_demo.model
deleted file mode 100644
index 567e9c6..0000000
--- a/sdf/models/actor_demo.model
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-    <actor name="actor1" static="true">
-        <origin pose="0 0 0 0 0 0" />
-        <skin filename="walk.dae" scale="1.0" />
-        <!-- resource files -->
-        <animation name="sit_down" filename="sit_down.dae" scale="1.0" />
-        <animation name="sitting" filename="sitting.dae" scale="1.0" />
-        <animation name="stand_up" filename="stand_up.dae" scale="1.0" />
-        <animation name="stand" filename="stand.dae" scale="1.0" />
-        <animation name="walking" filename="walk.dae" scale="1.0" interpolate_x="true" />
-        <animation name="running" filename="run.dae" scale="1.0" interpolate_x="true" />
-        <animation name="moonwalking" filename="moonwalk.dae" scale="1.0" interpolate_x="true" />
-        <script loop="true" delay_start="0.0" auto_start="true">
-            <!--stand at origin for 10 seconds -->
-            <trajectory id="0" type="stand">
-                <waypoint time="0.0" pose="0 0 0 0 0 0" />
-                <waypoint time="10.0" pose="0 0 0 0 0 0" />
-            </trajectory>
-            <!--sit down-->
-            <trajectory id="1" type="sit_down" />
-            <!--sit-->
-            <trajectory id="2" type="sitting" />
-            <!--stand up-->
-            <trajectory id="3" type="stand_up" />
-            <!--walk 5 meters forward in 10 seconds-->
-            <trajectory id="4" type="walking">
-                <waypoint time="0.0" pose="0 0 0 0 0 0" />
-                <waypoint time="10.0" pose="5 0 0 0 0 0" />
-            </trajectory>
-            <!--run 5 meters forward in 5 seconds-->
-            <trajectory id="5" type="running">
-                <waypoint time="0.0" pose="5 0 0 0 0 0" />
-                <waypoint time="5.0" pose="10 0 0 0 0 0" />
-            </trajectory>
-            <!--moonwalk bak to origin in 20 seconds-->
-            <trajectory id="6" type="moonwalking">
-                <waypoint time="0.0" pose="10 0 0 0 0 3.14159" />
-                <waypoint time="20.0" pose="0 0 0 0 0 3.14159" />
-            </trajectory>
-        </script>
-    </actor>
-</gazebo>
diff --git a/sdf/models/car.model b/sdf/models/car.model
deleted file mode 100644
index eaa3e73..0000000
--- a/sdf/models/car.model
+++ /dev/null
@@ -1,213 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-  <model name="car" static="false">
-    <link name="chassis">
-      <pose>0 0 0.3 0 0 0</pose>
-      <collision name="collision">
-        <geometry>
-          <box size="2.0 1.0 0.2" />
-        </geometry>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <box size="2.0 1.0 0.2" />
-        </geometry>
-        <material script="Gazebo/Green" />
-      </visual>
-    </link>
-    <link name="front_left_wheel">
-      <pose>0.8 0.6 0.3 0 1.5707 1.5707</pose>
-      <collision name="collision">
-        <geometry>
-          <cylinder radius="0.3" length="0.1" />
-        </geometry>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <cylinder radius="0.3" length="0.1" />
-        </geometry>
-        <material script="Gazebo/Black" />
-      </visual>
-    </link>
-    <link name="front_right_wheel">
-      <pose>0.8 -0.6 0.3 0 1.5707 1.5707</pose>
-      <collision name="collision">
-        <geometry>
-          <cylinder radius="0.3" length="0.1" />
-        </geometry>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <cylinder radius="0.3" length="0.1" />
-        </geometry>
-        <material script="Gazebo/Black" />
-      </visual>
-    </link>
-    <link name="back_right_wheel">
-      <pose>-0.8 -0.6 0.3 0 1.5707 1.5707</pose>
-      <collision name="collision">
-        <geometry>
-          <cylinder radius="0.3" length="0.1" />
-        </geometry>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <cylinder radius="0.3" length="0.1" />
-        </geometry>
-        <material script="Gazebo/Black" />
-      </visual>
-    </link>
-    <link name="back_left_wheel">
-      <pose>-0.8 0.6 0.3 0 1.5707 1.5707</pose>
-      <collision name="collision">
-        <geometry>
-          <cylinder radius="0.3" length="0.1" />
-        </geometry>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <cylinder radius="0.3" length="0.1" />
-        </geometry>
-        <material script="Gazebo/Black" />
-      </visual>
-    </link>
-    <link name="gas_pedal">
-      <pose>0.3 0.1 0.5 0 0 0</pose>
-      <collision name="collision">
-        <geometry>
-          <box size="0.1 0.1 0.1" />
-        </geometry>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <box size="0.1 0.1 0.1" />
-        </geometry>
-        <material script="Gazebo/Red" />
-      </visual>
-    </link>
-    <link name="brake_pedal">
-      <pose>0.3 0.25 0.5 0 0 0</pose>
-      <collision name="collision">
-        <geometry>
-          <box size="0.1 0.1 0.1" />
-        </geometry>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <box size="0.1 0.1 0.1" />
-        </geometry>
-        <material script="Gazebo/Blue" />
-      </visual>
-    </link>
-    <link name="steering_wheel">
-      <pose>0.3 0.2 1.0 0 1.5707 0</pose>
-      <collision name="collision">
-        <geometry>
-          <cylinder radius="0.1" length="0.01" />
-        </geometry>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <cylinder radius="0.1" length="0.01" />
-        </geometry>
-        <material script="Gazebo/Blue" />
-      </visual>
-    </link>
-    <joint type="prismatic" name="gas_joint">
-      <parent>chassis</parent>
-      <child>gas_pedal</child>
-      <axis xyz="1 0 0">
-        <limit lower="0" upper="0.2" />
-      </axis>
-    </joint>
-    <joint type="prismatic" name="brake_joint">
-      <parent>chassis</parent>
-      <child>brake_pedal</child>
-      <axis xyz="1 0 0">
-        <limit lower="0" upper="0.2" />
-      </axis>
-    </joint>
-    <joint type="revolute" name="steering_joint">
-      <parent>chassis</parent>
-      <child>steering_wheel</child>
-      <axis xyz="1 0 0">
-        <limit lower="-7.853" upper="7.853" />
-      </axis>
-    </joint>
-    <joint type="revolute2" name="front_left_joint">
-      <parent>chassis</parent>
-      <child>front_left_wheel</child>
-      <axis xyz="0 0 1">
-        <limit lower="0" upper="0" />
-      </axis>
-      <axis2 xyz="0 1 0" />
-      <physics>
-        <ode>
-          <limit cfm="0.0" erp="0.9" />
-        </ode>
-      </physics>
-    </joint>
-    <joint type="revolute2" name="front_right_joint">
-      <parent>chassis</parent>
-      <child>front_right_wheel</child>
-      <axis xyz="0 0 1">
-        <limit lower="0" upper="0" />
-      </axis>
-      <axis2 xyz="0 1 0" />
-      <physics>
-        <ode>
-          <limit cfm="0.0" erp="0.9" />
-        </ode>
-      </physics>
-    </joint>
-    <joint type="revolute2" name="back_right_joint">
-      <parent>chassis</parent>
-      <child>back_right_wheel</child>
-      <axis xyz="0 0 1">
-        <limit lower="0" upper="0" />
-      </axis>
-      <axis2 xyz="0 1 0" />
-      <physics>
-        <ode>
-          <limit cfm="0.0" erp="0.9" />
-        </ode>
-      </physics>
-    </joint>
-    <joint type="revolute2" name="back_left_joint">
-      <parent>chassis</parent>
-      <child>back_left_wheel</child>
-      <axis xyz="0 0 1">
-        <limit lower="0" upper="0" />
-      </axis>
-      <axis2 xyz="0 1 0" />
-      <physics>
-        <ode>
-          <limit cfm="0.0" erp="0.9" />
-        </ode>
-      </physics>
-    </joint>
-    <plugin filename="libVehiclePlugin.so" name="vehicle">
-      <!-- Joints for each wheel -->
-      <front_left>front_left_joint</front_left>
-      <front_right>front_right_joint</front_right>
-      <back_left>back_left_joint</back_left>
-      <back_right>back_right_joint</back_right>
-      <!-- Joint which controls the gas -->
-      <gas>gas_joint</gas>
-      <!-- Joint which controls the gas -->
-      <brake>brake_joint</brake>
-      <!-- Joint which controls the steering -->
-      <steering>steering_joint</steering>
-      <!-- Power is multiplied by "gas" to determine force applied to wheels -->
-      <front_power>10</front_power>
-      <rear_power>10</rear_power>
-      <!-- The angle range the front tires can turn for steering, in radians -->
-      <tire_angle_range>0.5</tire_angle_range>
-      <!-- Maximum speed for the car in meters/second -->
-      <max_speed>10</max_speed>
-      <!-- Factor for the down-force applied as the car travels faster -->
-      <!-- A larger number increases the down force -->
-      <aero_load>0.1</aero_load>
-    </plugin>
-  </model>
-</gazebo>
diff --git a/sdf/models/multi_visuals.model b/sdf/models/multi_visuals.model
deleted file mode 100644
index c437eb2..0000000
--- a/sdf/models/multi_visuals.model
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-    <model name="box_model" static="false">
-        <link name="body">
-            <origin pose="0 0 0.5 0 0 0" />
-            <inertial mass="1.0">
-                <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
-            </inertial>
-            <collision name="geom1">
-                <geometry>
-                    <box size="1 1 1" />
-                </geometry>
-            </collision>
-            <visual name="visual1">
-                <geometry>
-                    <box size="1 1 1" />
-                </geometry>
-                <material script="Gazebo/WoodPallet" />
-            </visual>
-            <collision name="geom2">
-                <origin pose="0 0 1.0 0 0 0" />
-                <geometry>
-                    <box size="1 1 1" />
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <origin pose="0 0 1.0 0 0 0" />
-                <geometry>
-                    <box size="1 1 1" />
-                </geometry>
-                <material script="Gazebo/WoodPallet" />
-            </visual>
-            <sensor name="cam" type="depth" always_on="1" update_rate="30" visualize="false">
-                <origin pose="0.0232 0.06 0.098 0 -0 0" />
-                <camera>
-                    <horizontal_fov angle="0.78539816339744828" />
-                    <image width="320" height="240" format="L8" />
-                    <clip near="0.10000000000000001" far="100" />
-                </camera>
-            </sensor>
-        </link>
-    </model>
-</gazebo>
diff --git a/sdf/models/pioneer2at.model b/sdf/models/pioneer2at.model
deleted file mode 100644
index a39ec5f..0000000
--- a/sdf/models/pioneer2at.model
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0"?>
-<gazebo version="1.2">
-  <model name="pioneer2at">
-    <static>0</static>
-
-    <link name="chassis">
-      <pose>0.0 0.0 0.16 0 0 0</pose>
-      <inertial>
-        <mass>5.0</mass>
-      </inertial>
-
-      <collision name="collision">
-        <geometry>
-          <box>
-            <size>0.445 0.277 0.17</size>
-          </box>
-        </geometry>
-      </collision>
-
-      <visual name="visual">
-        <pose>0 0 0.04 0 0 0</pose>
-        <geometry>
-          <mesh>
-            <filename>pioneer2dx/chassis.dae</filename>
-          </mesh>
-        </geometry>
-      </visual>
-    </link>
-
-    <link name="front_right_wheel">
-      <pose>0.144 -.17 0.11 0 1.5707 1.5707</pose>
-      <inertial>
-        <mass>0.5</mass>
-      </inertial>
-
-      <collision name="collision">
-        <geometry>
-          <cylinder>
-            <radius>0.111</radius>
-            <length>0.05</length>
-          </cylinder>
-        </geometry>
-
-        <surface>
-          <friction>
-            <ode>
-              <slip1>0.0</slip1>
-              <slip2>0.0</slip2>
-            </ode>
-          </friction>
-        </surface>
-      </collision>
-
-      <visual name="visual">
-        <geometry>
-          <cylinder>
-            <radius>0.111</radius>
-            <length>0.05</length>
-          </cylinder>
-        </geometry>
-        <material>
-          <script>Gazebo/FlatBlack</script>
-        </material>
-      </visual>
-    </link>
-
-    <link name="front_left_wheel">
-      <pose>0.144 .17 0.11 0 1.5707 1.5707</pose>
-
-      <inertial>
-        <mass>0.5</mass>
-      </inertial>
-
-      <collision name="collision">
-        <geometry>
-          <cylinder><radius>0.111</radius><length>0.05</length></cylinder>
-        </geometry>
-        <surface>
-          <friction>
-            <ode><slip1>0.0</slip1><slip2>0.0</slip2></ode>
-          </friction>
-        </surface>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <cylinder><radius>0.111</radius><length>0.05</length></cylinder>
-        </geometry>
-        <material><script>Gazebo/FlatBlack</script></material>
-      </visual>
-    </link>
-    <link name="back_right_wheel">
-      <pose>-0.144 -.17 0.11 0 1.5707 1.5707</pose>
-      <inertial>
-        <mass>0.5</mass>
-      </inertial>
-
-      <collision name="collision">
-        <geometry>
-          <cylinder><radius>0.111</radius><length>0.05</length></cylinder>
-        </geometry>
-        <surface>
-          <friction>
-            <ode><slip1>0.0</slip1><slip2>0.0</slip2></ode>
-          </friction>
-        </surface>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <cylinder><radius>0.111</radius><length>0.05</length></cylinder>
-        </geometry>
-        <material><script>Gazebo/FlatBlack</script></material>
-      </visual>
-    </link>
-    <link name="back_left_wheel">
-      <pose>-0.144 .17 0.11 0 1.5707 1.5707</pose>
-      <inertial>
-        <mass>0.5</mass>
-      </inertial>
-
-      <collision name="collision">
-        <geometry>
-          <cylinder><radius>0.111</radius><length>0.05</length></cylinder>
-        </geometry>
-        <surface>
-          <friction>
-            <ode><slip1>0.0</slip1><slip2>0.0</slip2></ode>
-          </friction>
-        </surface>
-      </collision>
-      <visual name="visual">
-        <geometry>
-          <cylinder><radius>0.111</radius><length>0.05</length></cylinder>
-        </geometry>
-        <material><script>Gazebo/FlatBlack</script></material>
-      </visual>
-    </link>
-
-    <joint type="revolute" name="front_left_wheel_hinge">
-      <pose>0 0 -0.03 0 0 0</pose>
-      <child>front_left_wheel</child>
-      <parent>chassis</parent>
-      <axis><xyz>0 1 0</xyz></axis>
-    </joint>
-    <joint type="revolute" name="front_right_wheel_hinge">
-      <pose>0 0 0.03 0 0 0</pose>
-      <child>front_right_wheel</child>
-      <parent>chassis</parent>
-      <axis><xyz>0 1 0</xyz></axis>
-    </joint>
-    <joint type="revolute" name="back_left_wheel_hinge">
-      <pose>0 0 -0.03 0 0 0</pose>
-      <child>back_left_wheel</child>
-      <parent>chassis</parent>
-      <axis><xyz>0 1 0</xyz></axis>
-    </joint>
-
-    <joint type="revolute" name="back_right_wheel_hinge">
-      <pose>0 0 0.03 0 0 0</pose>
-      <child>back_right_wheel</child>
-      <parent>chassis</parent>
-      <axis><xyz>0 1 0</xyz></axis>
-    </joint>
-  </model>
-</gazebo>
diff --git a/sdf/models/pr2_gripper.model b/sdf/models/pr2_gripper.model
deleted file mode 100644
index d8e7980..0000000
--- a/sdf/models/pr2_gripper.model
+++ /dev/null
@@ -1,691 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-    <model name="pr2_gripper">
-        <pose>-0.771000 0.188000 -0.790675 0.000000 -1.57079633 0.000000</pose>
-        <link name="r_wrist_roll_link">
-            <pose>0.771000 -0.188000 0.790675 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.056408 0.000451 -0.001014 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.011352</ixx>
-                    <ixy>-0.000016</ixy>
-                    <ixz>-0.000001</ixz>
-                    <iyy>0.011677</iyy>
-                    <iyz>-0.000001</iyz>
-                    <izz>0.011866</izz>
-                </inertia>
-                <mass>0.681070</mass>
-            </inertial>
-            <collision name="r_wrist_roll_link_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/forearm_v0/wrist_roll_L.stl</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_wrist_roll_link_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/forearm_v0/wrist_roll.stl</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <material>
-                    <script>PR2/RollLinks</script>
-                </material>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <visual name="r_wrist_roll_link_geom_r_gripper_palm_link_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/gripper_v0/gripper_palm.dae</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_gripper_l_finger_link">
-            <pose>0.847910 -0.178000 0.790675 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.035980 0.017300 -0.001640 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.000078</ixx>
-                    <ixy>0.000001</ixy>
-                    <ixz>-0.000010</ixz>
-                    <iyy>0.000197</iyy>
-                    <iyz>-0.000003</iyz>
-                    <izz>0.000181</izz>
-                </inertia>
-                <mass>0.171260</mass>
-            </inertial>
-            <collision name="r_gripper_l_finger_link_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/gripper_v0/l_finger.stl</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>500.000000</mu>
-                            <mu2>500.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_gripper_l_finger_link_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/gripper_v0/l_finger.dae</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_gripper_l_finger_tip_link">
-            <pose>0.939280 -0.173050 0.790675 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.004230 0.002840 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.000008</ixx>
-                    <ixy>0.000006</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.000010</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.000015</izz>
-                </inertia>
-                <mass>0.044190</mass>
-            </inertial>
-            <collision name="r_gripper_l_finger_tip_link_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/gripper_v0/l_finger_tip.stl</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>500.000000</mu>
-                            <mu2>500.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>10000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_gripper_l_finger_tip_link_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/gripper_v0/l_finger_tip.dae</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <sensor name="r_gripper_l_finger_tip_contact_sensor" type="contact">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <contact>
-                    <collision>r_gripper_l_finger_tip_link_geom</collision>
-                </contact>
-                <always_on>0</always_on>
-                <update_rate>100.000000</update_rate>
-                <visualize>0</visualize>
-            </sensor>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_gripper_motor_slider_link">
-            <pose>0.939280 -0.188000 0.790675 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.001000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.001000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.001000</izz>
-                </inertia>
-                <mass>0.010000</mass>
-            </inertial>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_gripper_motor_screw_link">
-            <pose>0.939280 -0.188000 0.790675 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.000100</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.000100</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.000100</izz>
-                </inertia>
-                <mass>0.010000</mass>
-            </inertial>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_gripper_r_finger_link">
-            <pose>0.847910 -0.198000 0.790675 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.035760 -0.017360 -0.000950 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.000077</ixx>
-                    <ixy>-0.000002</ixy>
-                    <ixz>-0.000008</ixz>
-                    <iyy>0.000198</iyy>
-                    <iyz>0.000002</iyz>
-                    <izz>0.000181</izz>
-                </inertia>
-                <mass>0.173890</mass>
-            </inertial>
-            <collision name="r_gripper_r_finger_link_geom">
-                <pose>0.000000 0.000000 0.000000 -3.141590 -0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/gripper_v0/l_finger.stl</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>500.000000</mu>
-                            <mu2>500.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_gripper_r_finger_link_geom_visual">
-                <pose>0.000000 0.000000 0.000000 -3.141590 0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/gripper_v0/l_finger.dae</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_gripper_r_finger_tip_link">
-            <pose>0.939280 -0.202950 0.790675 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.004230 -0.002840 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.000008</ixx>
-                    <ixy>-0.000006</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.000010</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.000015</izz>
-                </inertia>
-                <mass>0.044190</mass>
-            </inertial>
-            <collision name="r_gripper_r_finger_tip_link_geom">
-                <pose>0.000000 0.000000 0.000000 -3.141590 -0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/gripper_v0/l_finger_tip.stl</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>500.000000</mu>
-                            <mu2>500.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>10000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_gripper_r_finger_tip_link_geom_visual">
-                <pose>0.000000 0.000000 0.000000 -3.141590 0.000000 0.000000</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pr2/gripper_v0/l_finger_tip.dae</filename>
-                        <scale>1.000000 1.000000 1.000000</scale>
-                    </mesh>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <sensor name="r_gripper_r_finger_tip_contact_sensor" type="contact">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <contact>
-                    <collision>r_gripper_r_finger_tip_link_geom</collision>
-                </contact>
-                <always_on>0</always_on>
-                <update_rate>100.000000</update_rate>
-                <visualize>0</visualize>
-            </sensor>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="torso_lift_motor_screw_link">
-            <pose>-0.150000 0.000000 0.751000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.001000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.001000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.001000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-            </inertial>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_gripper_l_parallel_link">
-            <pose>0.829910 -0.157000 0.790675 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.035980 0.017300 -0.001640 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.000078</ixx>
-                    <ixy>0.000001</ixy>
-                    <ixz>-0.000010</ixz>
-                    <iyy>0.000197</iyy>
-                    <iyz>-0.000003</iyz>
-                    <izz>0.000181</izz>
-                </inertia>
-                <mass>0.171260</mass>
-            </inertial>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_gripper_r_parallel_link">
-            <pose>0.829910 -0.219000 0.790675 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.035760 -0.017360 -0.000950 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.000077</ixx>
-                    <ixy>-0.000002</ixy>
-                    <ixz>-0.000008</ixz>
-                    <iyy>0.000198</iyy>
-                    <iyz>0.000002</iyz>
-                    <izz>0.000181</izz>
-                </inertia>
-                <mass>0.173890</mass>
-            </inertial>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <joint name="r_gripper_l_finger_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_wrist_roll_link</parent>
-            <child>r_gripper_l_finger_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.020000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>0.000000</lower>
-                  <upper>0.548000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 0.000000 1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_l_finger_tip_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_l_finger_link</parent>
-            <child>r_gripper_l_finger_tip_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.001000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>0.000000</lower>
-                  <upper>0.548000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 0.000000 -1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_motor_slider_joint" type="prismatic">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_wrist_roll_link</parent>
-            <child>r_gripper_motor_slider_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>-0.100000</lower>
-                  <upper>0.100000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>1.000000 0.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_motor_screw_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_motor_slider_link</parent>
-            <child>r_gripper_motor_screw_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000100</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>-10000000000000000.000000</lower>
-                  <upper>10000000000000000.000000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_r_finger_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_wrist_roll_link</parent>
-            <child>r_gripper_r_finger_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.020000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>0.000000</lower>
-                  <upper>0.548000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 0.000000 -1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_r_finger_tip_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_r_finger_link</parent>
-            <child>r_gripper_r_finger_tip_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.001000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>0.000000</lower>
-                  <upper>0.548000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 0.000000 1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_r_screw_screw_joint" type="screw">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_r_finger_tip_link</parent>
-            <child>r_gripper_motor_screw_link</child>
-            <thread_pitch>-3141.600000</thread_pitch>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>-10000000000000000.000000</lower>
-                  <upper>10000000000000000.000000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_l_screw_screw_joint" type="screw">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_l_finger_tip_link</parent>
-            <child>r_gripper_motor_screw_link</child>
-            <thread_pitch>3141.600000</thread_pitch>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>-10000000000000000.000000</lower>
-                  <upper>10000000000000000.000000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_r_parallel_root_joint" type="revolute">
-            <pose>0.058910 -0.031000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_r_parallel_link</parent>
-            <child>r_wrist_roll_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.200000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>-10000000000000000.000000</lower>
-                  <upper>10000000000000000.000000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 0.000000 -1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_l_parallel_root_joint" type="revolute">
-            <pose>0.058910 0.031000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_l_parallel_link</parent>
-            <child>r_wrist_roll_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.200000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>-10000000000000000.000000</lower>
-                  <upper>10000000000000000.000000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 0.000000 1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_r_parallel_tip_joint" type="revolute">
-            <pose>-0.018000 -0.021000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_r_parallel_link</parent>
-            <child>r_gripper_r_finger_tip_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>-10000000000000000.000000</lower>
-                  <upper>10000000000000000.000000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 0.000000 1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_l_parallel_tip_joint" type="revolute">
-            <pose>-0.018000 0.021000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_l_parallel_link</parent>
-            <child>r_gripper_l_finger_tip_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>-10000000000000000.000000</lower>
-                  <upper>10000000000000000.000000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 0.000000 1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_gripper_joint" type="prismatic">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_gripper_r_finger_tip_link</parent>
-            <child>r_gripper_l_finger_tip_link</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit>
-                  <lower>-10000000000000000.000000</lower>
-                  <upper>10000000000000000.000000</upper>
-                  <effort>0.000000</effort>
-                  <velocity>0.000000</velocity>
-                </limit>
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <static>0</static>
-    </model>
-</gazebo>
diff --git a/sdf/models/quadrotor.model b/sdf/models/quadrotor.model
deleted file mode 100644
index d726642..0000000
--- a/sdf/models/quadrotor.model
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-    <model name="quadrotor" static="false">
-        <link name="link">
-            <inertial mass="1.316">
-                <inertia ixx="0.0128" ixy="0" ixz="0" iyy="0.0128" iyz="0" izz="0.0218" />
-            </inertial>
-            <collision name="collision">
-                <geometry>
-                    <mesh filename="quadrotor/quadrotor_base.dae" />
-                </geometry>
-            </collision>
-            <visual name="visual">
-                <geometry>
-                    <mesh filename="quadrotor/quadrotor_base.dae" />
-                </geometry>
-            </visual>
-        </link>
-    </model>
-</gazebo>
diff --git a/sdf/models/ragdoll.model b/sdf/models/ragdoll.model
deleted file mode 100644
index 1470b34..0000000
--- a/sdf/models/ragdoll.model
+++ /dev/null
@@ -1,1863 +0,0 @@
-<?xml version="1.0" ?>
-<!-- this was initially generated from ragdoll.urdf,
-     but have sence been updated to turn off gravity for certain links
-     and various tweaks -->
-<gazebo version="1.2">
-    <model name="ragdoll">
-        <pose>0.000000 0.000000 1.4 0.000000 -0.000000 0.000000</pose>
-        <link name="hip">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.100000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.100000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.100000</izz>
-                </inertia>
-                <mass>10.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="hip_geom">
-                <pose>0.000000 0.000000 0.125000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.100000 0.500000 0.250000</size>
-                    </box>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="hip_geom_visual">
-                <pose>0.000000 0.000000 0.125000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.100000 0.500000 0.250000</size>
-                    </box>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_thigh_pan">
-            <pose>0.000000 0.220000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_thigh_pan_geom">
-                <pose>0.000000 0.000000 -0.030000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.060000</radius>
-                    </sphere>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_thigh_pan_geom_visual">
-                <pose>0.000000 0.000000 -0.030000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.060000</radius>
-                    </sphere>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_thigh_lift">
-            <pose>0.000000 0.220000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.050000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.050000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.050000</izz>
-                </inertia>
-                <mass>5.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_thigh_lift_geom">
-                <pose>0.000000 0.000000 -0.350000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.060000</radius>
-                        <length>0.700000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_thigh_lift_geom_visual">
-                <pose>0.000000 0.000000 -0.350000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.060000</radius>
-                        <length>0.700000</length>
-                    </cylinder>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_calf">
-            <pose>0.000000 0.220000 -0.700000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.020000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.020000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.020000</izz>
-                </inertia>
-                <mass>2.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_calf_geom">
-                <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.050000</radius>
-                        <length>0.600000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_calf_geom_visual">
-                <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.050000</radius>
-                        <length>0.600000</length>
-                    </cylinder>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_ankle">
-            <pose>0.000000 0.220000 -1.325000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_ankle_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.050000</radius>
-                    </sphere>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_ankle_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.050000</radius>
-                    </sphere>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_foot">
-            <pose>0.000000 0.220000 -1.350000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.100000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_foot_geom">
-                <pose>0.100000 0.000000 -0.025000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.200000 0.030000 0.050000</size>
-                    </box>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_foot_geom_visual">
-                <pose>0.100000 0.000000 -0.025000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.200000 0.030000 0.050000</size>
-                    </box>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_thigh_pan">
-            <pose>0.000000 -0.220000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_thigh_pan_geom">
-                <pose>0.000000 0.000000 -0.030000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.060000</radius>
-                    </sphere>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_thigh_pan_geom_visual">
-                <pose>0.000000 0.000000 -0.030000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.060000</radius>
-                    </sphere>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_thigh_lift">
-            <pose>0.000000 -0.220000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.050000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.050000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.050000</izz>
-                </inertia>
-                <mass>5.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_thigh_lift_geom">
-                <pose>0.000000 0.000000 -0.350000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.060000</radius>
-                        <length>0.700000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_thigh_lift_geom_visual">
-                <pose>0.000000 0.000000 -0.350000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.060000</radius>
-                        <length>0.700000</length>
-                    </cylinder>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_calf">
-            <pose>0.000000 -0.220000 -0.700000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.020000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.020000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.020000</izz>
-                </inertia>
-                <mass>2.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_calf_geom">
-                <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.050000</radius>
-                        <length>0.600000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_calf_geom_visual">
-                <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.050000</radius>
-                        <length>0.600000</length>
-                    </cylinder>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_ankle">
-            <pose>0.000000 -0.220000 -1.325000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_ankle_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.050000</radius>
-                    </sphere>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_ankle_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.050000</radius>
-                    </sphere>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_foot">
-            <pose>0.000000 -0.220000 -1.350000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.100000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_foot_geom">
-                <pose>0.100000 0.000000 -0.025000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.200000 0.030000 0.050000</size>
-                    </box>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_foot_geom_visual">
-                <pose>0.100000 0.000000 -0.025000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.200000 0.030000 0.050000</size>
-                    </box>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="torso">
-            <pose>0.000000 0.000000 0.250000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.300000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.300000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.300000</izz>
-                </inertia>
-                <mass>30.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="torso_geom">
-                <pose>0.000000 0.000000 0.350000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.100000 0.600000 0.700000</size>
-                    </box>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="torso_geom_visual">
-                <pose>0.000000 0.000000 0.350000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.100000 0.600000 0.700000</size>
-                    </box>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_shoulder">
-            <pose>0.000000 0.327500 0.922500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_shoulder_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.055000</radius>
-                    </sphere>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_shoulder_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.055000</radius>
-                    </sphere>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_upper_arm">
-            <pose>0.000000 0.327500 0.922500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.020000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.020000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.020000</izz>
-                </inertia>
-                <mass>2.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_upper_arm_geom">
-                <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.055000</radius>
-                        <length>0.600000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_upper_arm_geom_visual">
-                <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.055000</radius>
-                        <length>0.600000</length>
-                    </cylinder>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_forearm">
-            <pose>0.000000 0.327500 0.322500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_forearm_geom">
-                <pose>0.000000 0.000000 -0.225000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.050000</radius>
-                        <length>0.450000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_forearm_geom_visual">
-                <pose>0.000000 0.000000 -0.225000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.050000</radius>
-                        <length>0.450000</length>
-                    </cylinder>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_wrist">
-            <pose>0.000000 0.327500 -0.142500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_wrist_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.030000</radius>
-                    </sphere>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_wrist_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.030000</radius>
-                    </sphere>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="l_hand">
-            <pose>0.000000 0.327500 -0.157500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="l_hand_geom">
-                <pose>0.000000 0.000000 -0.100000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.030000 0.100000 0.200000</size>
-                    </box>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="l_hand_geom_visual">
-                <pose>0.000000 0.000000 -0.100000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.030000 0.100000 0.200000</size>
-                    </box>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="neck">
-            <pose>0.000000 0.000000 0.950000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="neck_geom">
-                <pose>0.000000 0.000000 0.100000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.075000</radius>
-                        <length>0.200000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="neck_geom_visual">
-                <pose>0.000000 0.000000 0.100000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.075000</radius>
-                        <length>0.200000</length>
-                    </cylinder>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="head">
-            <pose>0.000000 0.000000 1.225000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.100000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.100000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.100000</izz>
-                </inertia>
-                <mass>10.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="head_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.150000</radius>
-                    </sphere>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="head_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.150000</radius>
-                    </sphere>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_shoulder">
-            <pose>0.000000 -0.327500 0.922500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_shoulder_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.055000</radius>
-                    </sphere>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_shoulder_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.055000</radius>
-                    </sphere>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_upper_arm">
-            <pose>0.000000 -0.327500 0.922500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.020000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.020000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.020000</izz>
-                </inertia>
-                <mass>2.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_upper_arm_geom">
-                <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.055000</radius>
-                        <length>0.600000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_upper_arm_geom_visual">
-                <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.055000</radius>
-                        <length>0.600000</length>
-                    </cylinder>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_forearm">
-            <pose>0.000000 -0.327500 0.322500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_forearm_geom">
-                <pose>0.000000 0.000000 -0.225000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.050000</radius>
-                        <length>0.450000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_forearm_geom_visual">
-                <pose>0.000000 0.000000 -0.225000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.050000</radius>
-                        <length>0.450000</length>
-                    </cylinder>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_wrist">
-            <pose>0.000000 -0.327500 -0.142500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_wrist_geom">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.030000</radius>
-                    </sphere>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_wrist_geom_visual">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <sphere>
-                        <radius>0.030000</radius>
-                    </sphere>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="r_hand">
-            <pose>0.000000 -0.327500 -0.157500 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>0.010000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>0.010000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>0.010000</izz>
-                </inertia>
-                <mass>1.000000</mass>
-                <density>1.000000</density>
-            </inertial>
-            <collision name="r_hand_geom">
-                <pose>0.000000 0.000000 -0.100000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.030000 0.100000 0.200000</size>
-                    </box>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>-1.000000</mu>
-                            <mu2>-1.000000</mu2>
-                            <fdir1>0.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>100000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <kp>1000000000000.000000</kp>
-                            <kd>1.000000</kd>
-                            <max_vel>0.000000</max_vel>
-                            <min_depth>0.001000</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>0.000000</laser_retro>
-            </collision>
-            <visual name="r_hand_geom_visual">
-                <pose>0.000000 0.000000 -0.100000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.030000 0.100000 0.200000</size>
-                    </box>
-                </geometry>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>0.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <gravity>0</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <joint name="l_thigh_pan_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>hip</parent>
-            <child>l_thigh_pan</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 0.000000 1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="l_thigh_lift_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>l_thigh_pan</parent>
-            <child>l_thigh_lift</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="l_calf_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>l_thigh_lift</parent>
-            <child>l_calf</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="l_ankle_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>l_calf</parent>
-            <child>l_ankle</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="l_foot_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>l_ankle</parent>
-            <child>l_foot</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>1.000000 0.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_thigh_pan_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>hip</parent>
-            <child>r_thigh_pan</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 0.000000 1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_thigh_lift_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_thigh_pan</parent>
-            <child>r_thigh_lift</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_calf_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_thigh_lift</parent>
-            <child>r_calf</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_ankle_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_calf</parent>
-            <child>r_ankle</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_foot_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_ankle</parent>
-            <child>r_foot</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>1.000000 0.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="torso_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>hip</parent>
-            <child>torso</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="l_shoulder_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>torso</parent>
-            <child>l_shoulder</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>1.000000 0.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="l_upper_arm_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>l_shoulder</parent>
-            <child>l_upper_arm</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="l_forearm_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>l_upper_arm</parent>
-            <child>l_forearm</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="l_wrist_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>l_forearm</parent>
-            <child>l_wrist</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="l_hand_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>l_wrist</parent>
-            <child>l_hand</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="neck_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>torso</parent>
-            <child>neck</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 0.000000 1.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="head_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>neck</parent>
-            <child>head</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_shoulder_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>torso</parent>
-            <child>r_shoulder</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>1.000000 0.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_upper_arm_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_shoulder</parent>
-            <child>r_upper_arm</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_forearm_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_upper_arm</parent>
-            <child>r_forearm</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_wrist_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_forearm</parent>
-            <child>r_wrist</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <joint name="r_hand_joint" type="revolute">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <parent>r_wrist</parent>
-            <child>r_hand</child>
-            <axis>
-                <dynamics>
-                    <damping>0.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
-                <xyz>0.000000 1.000000 0.000000</xyz>
-            </axis>
-        </joint>
-        <static>0</static>
-    </model>
-</gazebo>
diff --git a/sdf/models/weshare2012_apartment.model b/sdf/models/weshare2012_apartment.model
deleted file mode 100644
index 84aed45..0000000
--- a/sdf/models/weshare2012_apartment.model
+++ /dev/null
@@ -1,740 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-    <model name="apartment">
-        <!--<origin pose="0 0 0 0 0 0"/>-->
-        <link name="wooden-floor">
-            <visual name="visual2">
-                <pose>0 0 0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>24.5 20 0.03</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Kitchen/WoodFloor</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall1east">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="surface_1">
-                <pose>0 -10.0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>24.5 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <pose>0 -10.0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>24.5 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall2west">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall2surface">
-                <pose>0 10.0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>24.5 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall2visual">
-                <pose>0 10.0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>24.5 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall3north-right">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall2surface">
-                <pose>12 -7.5 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>5.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall2visual">
-                <pose>12 -7.5 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>5.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall3north-left">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall2surface">
-                <pose>12 4.0 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>12.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall2visual">
-                <pose>12 4.0 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>12.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall4southleft">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall4side1surface">
-                <pose>-12 8.5 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall4side1visual">
-                <pose>-12 8.5 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall4southwindowwallleft">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall4side1surface">
-                <pose>-12 4.5 1.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>5.0 0.5 2.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall4side1visual">
-                <pose>-12 4.5 1.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>5.0 0.5 2.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall4southwindowwindowleft">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall4side1surface">
-                <pose>-12 4.5 3.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>5.0 0.5 2.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall4side1visual">
-                <pose>-12 4.5 3.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>5.0 0.5 2.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/BlueTransparent</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall4southright">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall4side1surface">
-                <pose>-12 0.5 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall4side1visual">
-                <pose>-12 0.5 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall4southrightwindowwall">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall4side1surface">
-                <pose>-12 -2.5 1.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 0.5 2.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall4side1visual">
-                <pose>-12 -2.5 1.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 0.5 2.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall4southrightwindowwindow">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall4side1surface">
-                <pose>-12 -2.5 3.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 0.5 2.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall4side1visual">
-                <pose>-12 -2.5 3.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 0.5 2.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/BlueTransparent</script>
-                </material>
-            </visual>
-        </link>
-        <link name="wall4southrightright">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall4side1surface">
-                <pose>-12 -7.0 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>6.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall4side1visual">
-                <pose>-12 -7.0 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>6.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <!--BATHROOM-->
-        <!-- WALLS -->
-        <link name="bathroom-south">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall2surface">
-                <pose>5 -7.5 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>5.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall2visual">
-                <pose>5 -7.5 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>5.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="bathroom-west">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall2surface">
-                <pose>10 -5.0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>4.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall2visual">
-                <pose>10 -5.0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>4.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <!-- //BATHROOM -->
-        <!-- BEDROOM -->
-        <!-- WALLS -->
-        <link name="bedroom-north">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="wall2surface">
-                <pose>2 -7.0 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>6.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="wall2visual">
-                <pose>2 -7.0 2.0 0 0 1.5707</pose>
-                <geometry>
-                    <box>
-                        <size>6.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <link name="bedroom-west">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="surface_1">
-                <pose>5 -1.0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>14.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <pose>-5 -1.0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>14.0 0.5 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <!-- //BEDROOM -->
-        <!-- KITCHEN -->
-        <!-- KITCHEN/HALLWAY STORAGE -->
-        <link name="kitchen-hallway-storage">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="surface_1">
-                <pose>10 0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>4.0 4.0 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <pose>10 0 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>4.0 4.0 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <!-- HALLWAY COAT CLOSET -->
-        <link name="hallway-coat-closet">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="surface_1">
-                <pose>6.5 -0.5 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 3.0 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <pose>6.5 -0.5 2.0 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>3.0 3.0 4.0</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-        </link>
-        <!-- KITCHEN BANKS -->
-        <link name="kitchen bank1">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="surface_1">
-                <pose>9 6 0.75 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>2 8 1.5</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <pose>11 6 0.75 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>2 8 1.5</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Kitchen/Cabinet</script>
-                </material>
-            </visual>
-        </link>
-        <link name="kitchen bank1top">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="surface_1">
-                <pose>9 6 1.55 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>2.0 8 0.5</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <pose>11 6 1.55 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>2.0 8 0.5</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Kitchen/CounterTop</script>
-                </material>
-            </visual>
-        </link>
-        <link name="kitchen bank2">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="surface_1">
-                <pose>7.5 9 0.75 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>5 2 1.5</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <pose>7.5 9 0.75 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>5 2 1.5</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Kitchen/Cabinet</script>
-                </material>
-            </visual>
-        </link>
-        <link name="kitchen bank2top">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="surface_1">
-                <pose>7.5 9 1.55 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>5 2 0.5</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <pose>7.5 9 1.55 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>5 2 0.5</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Kitchen/CounterTop_H</script>
-                </material>
-            </visual>
-        </link>
-        <!-- FRIDGE -->
-        <link name="fridge">
-            <pose>6.5 1.5 2.0 0 0 0</pose>
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="surface_1">
-                <geometry>
-                    <box>
-                        <size>3.0 3.0 4.0</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <geometry>
-                    <box>
-                        <size>2.0 2.0 3.5</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/White</script>
-                </material>
-            </visual>
-            <sensor name="bank_sensor" type="rfid">
-                <topic>~/rfid</topic>
-                <always_on>1</always_on>
-                <update_rate>100</update_rate>
-                <visualize>true</visualize>
-            </sensor>
-        </link>
-        <static>true</static>
-    </model>
-</gazebo>
diff --git a/sdf/models/weshare2012_bookshelf.model b/sdf/models/weshare2012_bookshelf.model
deleted file mode 100644
index dc692c8..0000000
--- a/sdf/models/weshare2012_bookshelf.model
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-    <model name="bookshelf">
-        <pose>0 9.5 0.6 0 0 0</pose>
-        <link name="body">
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="back">
-                <pose>0 0.005 0.6 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.9 0.01 1.2</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual1">
-                <pose>0 0.005 0.6 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.9 0.01 1.2</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/Wood</script>
-                </material>
-            </visual>
-            <collision name="left_side">
-                <pose>0.45 -0.195 0.6 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.02 0.4 1.2</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual2">
-                <pose>0.45 -0.195 0.6 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.02 0.4 1.2</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/Wood</script>
-                </material>
-            </visual>
-            <collision name="right_side">
-                <pose>-0.45 -0.195 0.6 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.02 0.4 1.2</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual3">
-                <pose>-0.45 -0.195 0.6 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.02 0.4 1.2</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/Wood</script>
-                </material>
-            </visual>
-            <collision name="bottom">
-                <pose>0 -0.195 0.03 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.88 0.4 0.06</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual4">
-                <pose>0 -0.195 0.03 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.88 0.4 0.06</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/Wood</script>
-                </material>
-            </visual>
-            <collision name="top">
-                <pose>0 -0.195 1.19 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.88 0.4 0.02</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual5">
-                <pose>0 -0.195 1.19 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.88 0.4 0.02</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/Wood</script>
-                </material>
-            </visual>
-            <collision name="low_shelf">
-                <pose>0 -0.195 0.43 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.88 0.4 0.02</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual6">
-                <pose>0 -0.195 0.43 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.88 0.4 0.02</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/Wood</script>
-                </material>
-            </visual>
-            <collision name="high_shelf">
-                <pose>0 -0.195 0.8 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.88 0.4 0.02</size>
-                    </box>
-                </geometry>
-            </collision>
-            <visual name="visual7">
-                <pose>0 -0.195 0.8 0 0 0</pose>
-                <geometry>
-                    <box>
-                        <size>0.88 0.4 0.02</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/Wood</script>
-                </material>
-            </visual>
-        </link>
-        <static>true</static>
-    </model>
-</gazebo>
diff --git a/sdf/models/weshare2012_pioneer.model b/sdf/models/weshare2012_pioneer.model
deleted file mode 100644
index 3791d39..0000000
--- a/sdf/models/weshare2012_pioneer.model
+++ /dev/null
@@ -1,197 +0,0 @@
-<?xml version="1.0" ?>
-<gazebo version="1.2">
-    <model name="default_pioneer_model">
-        <pose>0 0 0 0 0 0</pose>
-        <link name="chassis">
-            <pose>0.0 0.0 0.16 0 0 0</pose>
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>1.0</mass>
-            </inertial>
-            <collision name="geom">
-                <geometry>
-                    <box>
-                        <size>0.445 0.277 0.17</size>
-                    </box>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>1</mu>
-                        </ode>
-                    </friction>
-                </surface>
-            </collision>
-            <visual name="visual1">
-                <pose>0 0 0.04 0 0 0</pose>
-                <geometry>
-                    <mesh>
-                        <filename>pioneer2dx/chassis.dae</filename>
-                    </mesh>
-                </geometry>
-            </visual>
-            <sensor name="base_laser" type="ray">
-                <pose>0.5 0 0.5 0 0 0</pose>
-                <topic>~/laser_scan</topic>
-                <ray>
-                    <scan>
-                        <horizontal>
-                            <samples>640</samples>
-                            <resolution>1</resolution>
-                            <min_angle>-1</min_angle>
-                            <max_angle>1</max_angle>
-                        </horizontal>
-                    </scan>
-                    <range>
-                        <min>0.080000000000000002</min>
-                        <max>4</max>
-                        <resolution>0.01</resolution>
-                    </range>
-                </ray>
-                <!--<plugin name='laser' filename='libRayPlugin.so'/>-->
-                <always_on>1</always_on>
-                <update_rate>20</update_rate>
-                <visualize>true</visualize>
-            </sensor>
-        </link>
-        <link name="right_wheel">
-            <pose>0.1 -.17 0.11 0 1.5707 1.5707</pose>
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>0.1</mass>
-            </inertial>
-            <collision name="geom">
-                <geometry>
-                    <cylinder>
-                        <radius>0.11</radius>
-                        <length>0.05</length>
-                    </cylinder>
-                </geometry>
-            </collision>
-            <visual name="visual">
-                <geometry>
-                    <cylinder>
-                        <radius>0.11</radius>
-                        <length>0.05</length>
-                    </cylinder>
-                </geometry>
-                <material>
-                    <script>Gazebo/FlatBlack</script>
-                </material>
-            </visual>
-        </link>
-        <link name="left_wheel">
-            <pose>0.1 .17 0.11 0 1.5707 1.5707</pose>
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>0.1</mass>
-            </inertial>
-            <collision name="geom">
-                <geometry>
-                    <cylinder>
-                        <radius>0.11</radius>
-                        <length>0.05</length>
-                    </cylinder>
-                </geometry>
-            </collision>
-            <visual name="visual">
-                <geometry>
-                    <cylinder>
-                        <radius>0.11</radius>
-                        <length>0.05</length>
-                    </cylinder>
-                </geometry>
-                <material>
-                    <script>Gazebo/FlatBlack</script>
-                </material>
-            </visual>
-        </link>
-        <link name="castor">
-            <pose>-0.200 0 0.04 0 0 0</pose>
-            <inertial>
-                <inertia>
-                    <ixx>1</ixx>
-                    <ixy>0</ixy>
-                    <ixz>0</ixz>
-                    <iyy>1</iyy>
-                    <iyz>0</iyz>
-                    <izz>1</izz>
-                </inertia>
-                <mass>0.1</mass>
-            </inertial>
-            <collision name="geom">
-                <geometry>
-                    <sphere>
-                        <radius>0.04</radius>
-                    </sphere>
-                </geometry>
-            </collision>
-            <visual name="visual">
-                <geometry>
-                    <sphere>
-                        <radius>0.04</radius>
-                    </sphere>
-                </geometry>
-                <material>
-                    <script>Gazebo/FlatBlack</script>
-                </material>
-            </visual>
-            <!--<sensor name='base_contact_sensor' type='contact' always_on='1' update_rate='100' visualize="true">
-        <topic>~/contact</topic>
-        <origin pose='0 0 0 0 -0 0'/>
-        <contact>
-          <collision name='geom'/>
-        </contact>
-        <plugin name='gazebo_contact' filename='libHlaContactPlugin.so'/>
-      </sensor>-->
-            <sensor name="rfidtag" type="rfidtag">
-                <topic>~/rfidtag</topic>
-                <always_on>1</always_on>
-                <visualize>true</visualize>
-            </sensor>
-        </link>
-        <joint type="revolute" name="left_wheel_hinge">
-            <pose>0 0 0.04 0 0 0</pose>
-            <child>left_wheel</child>
-            <parent>chassis</parent>
-            <axis>
-                <xyz>0 1 0</xyz>
-            </axis>
-        </joint>
-        <joint type="revolute" name="right_wheel_hinge">
-            <pose>0 0 -0.04 0 0 0</pose>
-            <child>right_wheel</child>
-            <parent>chassis</parent>
-            <axis>
-                <xyz>0 1 0</xyz>
-            </axis>
-        </joint>
-        <joint type="ball" name="ball_joint">
-            <child>castor</child>
-            <parent>chassis</parent>
-        </joint>
-        <!--<plugin filename="libHlaModelPlugin.so" name="plugin"/>
-    <plugin filename="libHlaRFIDTagPlugin.so" name="rfid1"/>-->
-    </model>
-</gazebo>
diff --git a/sdf/worlds/.cvsignore b/sdf/worlds/.cvsignore
deleted file mode 100644
index 583fdbd..0000000
--- a/sdf/worlds/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-Makefile
-Makefile.in
-.gazebo
diff --git a/sdf/worlds/CMakeLists.txt b/sdf/worlds/CMakeLists.txt
deleted file mode 100644
index 0eb53f7..0000000
--- a/sdf/worlds/CMakeLists.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-set (files 
-  actor.world
-  actor_demo.world
-  actor_circle.world
-  two_actors.world
-  camera.world
-  joint_damping_demo.world
-  depth_camera.world
-  empty.world
-  force_torque_demo.world
-  force_torque_demo2.world
-  joints.world
-  heightmap.world
-  lights.world
-  model_nesting.world
-  pioneer2dx.world
-  trimesh_test.world
-  cart_test.world
-  double_pendulums.world
-  plugin.world
-  pr2.world
-  presentation.world
-  projector.world
-  rubble.world
-  shapes.world
-  weshare2012.world
-  willowgarage.world)
-
-install(FILES ${files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/worlds/)
diff --git a/sdf/worlds/actor.world b/sdf/worlds/actor.world
deleted file mode 100644
index 4ce1e91..0000000
--- a/sdf/worlds/actor.world
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-    <world name="default">
-        <include><uri>model://ground_plane</uri></include>
-        <light type="directional" name="sun">
-            <pose>0 0 100 0 0 0</pose>
-            <diffuse>0.5 0.5 0.5 1</diffuse>
-            <specular>0.2 0.2 0.2 1</specular>
-            <attenuation>
-                <range>100</range>
-                <linear>0.01</linear>
-                <constant>0.8</constant>
-                <quadratic>0.0</quadratic>
-            </attenuation>
-            <direction>0.0 0.2 -8.0</direction>
-            <cast_shadows>true</cast_shadows>
-        </light>
-        <include filename="actor.model" />
-    </world>
-</sdf>
diff --git a/sdf/worlds/actor_circle.world b/sdf/worlds/actor_circle.world
deleted file mode 100644
index d398a2a..0000000
--- a/sdf/worlds/actor_circle.world
+++ /dev/null
@@ -1,82 +0,0 @@
-<sdf version="1.3">
-    <world name="default">
-        <model name="plane1_model" static="1">
-            <link name="body" gravity="1" self_collide="0" kinematic="0">
-                <collision name="geom" laser_retro="0.000000">
-                    <geometry>
-                        <plane>
-                            <normal>0.000000 0.000000 1.000000</normal>
-                            <size>100.000000 100.000000</size>
-                        </plane>
-                    </geometry>
-                    <surface>
-                        <friction>
-                            <ode mu="100.000000" mu2="50.000000" fdir1="0.000000 0.000000 0.000000" slip1="0.000000" slip2="0.000000" />
-                        </friction>
-                    </surface>
-                </collision>
-                <visual name="visual" cast_shadows="0" laser_retro="0.000000" transparency="0.000000">
-                    <geometry>
-                        <plane>
-                            <normal>0.000000 0.000000 1.000000</normal>
-                            <size>100.000000 100.000000</size>
-                        </plane>
-                    </geometry>
-                    <material script="Gazebo/Grey" />
-                </visual>
-                <damping />
-            </link>
-        </model>
-        <light name="sun" type="directional" cast_shadows="1">
-            <pose>0.000000 0.000000 100.000000 0.000000 -0.000000 0.000000</pose>
-            <diffuse>0.500000 0.500000 0.500000 1.000000</diffuse>
-            <specular>0.200000 0.200000 0.200000 1.000000</specular>
-            <attenuation range="100.000000" linear="0.010000" constant="0.800000" quadratic="0.000000" />
-            <direction xyz="0.000000 0.200000 -8.000000" />
-        </light>
-        <actor name="actor1" static="1">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <skin filename="sub_16.dae" scale="1.000000" />
-            <animation name="walking" filename="walk.dae" scale="1.000000" interpolate_x="1" />
-            <script loop="1" delay_start="0.000000" auto_start="1">
-                <trajectory id="0" type="walking">
-                    <waypoint time="0.000000" pose="0.000000 1.000000 0.000000 0.000000 -0.000000 0.000000" />
-                    <waypoint time="0.500000" pose="0.195090 0.980785 0.000000 0.000000 0.000000 -0.196350" />
-                    <waypoint time="1.000000" pose="0.382683 0.923880 0.000000 0.000000 0.000000 -0.392699" />
-                    <waypoint time="1.500000" pose="0.555570 0.831470 0.000000 0.000000 0.000000 -0.589049" />
-                    <waypoint time="2.000000" pose="0.707107 0.707107 0.000000 0.000000 -0.000000 -0.785398" />
-                    <waypoint time="2.500000" pose="0.831470 0.555570 0.000000 0.000000 0.000000 -0.981748" />
-                    <waypoint time="3.000000" pose="0.923880 0.382683 0.000000 0.000000 0.000000 -1.178100" />
-                    <waypoint time="3.500000" pose="0.980785 0.195090 0.000000 0.000000 0.000000 -1.374450" />
-                    <waypoint time="4.000000" pose="1.000000 0.000000 0.000000 0.000000 0.000000 -1.570800" />
-                    <waypoint time="4.500000" pose="0.980785 -0.195090 0.000000 0.000000 0.000000 -1.767150" />
-                    <waypoint time="5.000000" pose="0.923880 -0.382683 0.000000 0.000000 0.000000 -1.963500" />
-                    <waypoint time="5.500000" pose="0.831470 -0.555570 0.000000 0.000000 0.000000 -2.159840" />
-                    <waypoint time="6.000000" pose="0.707107 -0.707107 0.000000 0.000000 0.000000 -2.356190" />
-                    <waypoint time="6.500000" pose="0.555570 -0.831470 0.000000 0.000000 0.000000 -2.552540" />
-                    <waypoint time="7.500000" pose="0.382683 -0.923880 0.000000 0.000000 0.000000 -2.748890" />
-                    <waypoint time="8.500000" pose="0.195090 -0.980785 0.000000 0.000000 0.000000 -2.945240" />
-                    <waypoint time="9.500000" pose="0.000000 -1.000000 0.000000 0.000000 0.000000 -3.141590" />
-                    <waypoint time="10.500000" pose="-0.195090 -0.980785 0.000000 0.000000 0.000000 2.945245" />
-                    <waypoint time="11.500000" pose="-0.382683 -0.923880 0.000000 0.000000 0.000000 2.748895" />
-                    <waypoint time="12.000000" pose="-0.555570 -0.831470 0.000000 0.000000 0.000000 2.552545" />
-                    <waypoint time="12.500000" pose="-0.707107 -0.707107 0.000000 0.000000 0.000000 2.356195" />
-                    <waypoint time="13.000000" pose="-0.831470 -0.555570 0.000000 0.000000 0.000000 2.159845" />
-                    <waypoint time="13.500000" pose="-0.923880 -0.382683 0.000000 0.000000 0.000000 1.963495" />
-                    <waypoint time="14.000000" pose="-0.980785 -0.195090 0.000000 0.000000 0.000000 1.767145" />
-                    <waypoint time="14.500000" pose="-1.000000 0.000000 0.000000 0.000000 0.000000 1.570795" />
-                    <waypoint time="15.000000" pose="-0.980785 0.195090 0.000000 0.000000 0.000000 1.374445" />
-                    <waypoint time="15.500000" pose="-0.923880 0.382683 0.000000 0.000000 0.000000 1.178095" />
-                    <waypoint time="16.000000" pose="-0.831470 0.555570 0.000000 0.000000 0.000000 0.981745" />
-                    <waypoint time="16.500000" pose="-0.707107 0.707107 0.000000 0.000000 0.000000 0.785395" />
-                    <waypoint time="17.000000" pose="-0.555570 0.831470 0.000000 0.000000 0.000000 0.589045" />
-                    <waypoint time="17.500000" pose="-0.382683 0.923880 0.000000 0.000000 0.000000 0.392695" />
-                    <waypoint time="18.000000" pose="-0.195090 0.980785 0.000000 0.000000 0.000000 0.196345" />
-                </trajectory>
-            </script>
-            <link name="__default__" gravity="1" self_collide="0" kinematic="0" />
-        </actor>
-        <physics type="ode" update_rate="0.000000" />
-        <scene />
-    </world>
-</sdf>
diff --git a/sdf/worlds/actor_demo.world b/sdf/worlds/actor_demo.world
deleted file mode 100644
index c2a11e0..0000000
--- a/sdf/worlds/actor_demo.world
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <include><uri>model://sun</uri></include>
-    <model name="cube">
-      <pose>-0.4 0 0.275 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <mass>1</mass>
-          <geometry>
-            <box>
-              <size>0.45 0.5 0.45</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>0.45 0.5 0.45</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <include filename="actor_demo.model" />
-  </world>
-</sdf>
diff --git a/sdf/worlds/camera.world b/sdf/worlds/camera.world
deleted file mode 100644
index 152f98f..0000000
--- a/sdf/worlds/camera.world
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <include><uri>model://sun</uri></include>
-    <include><uri>model://camera</uri></include>
-    <include>
-      <uri>model://camera</uri>
-      <pose>2 0 0 0 0 0</pose>
-      <name>camera 2</name>
-    </include>
-  </world>
-</sdf>
diff --git a/sdf/worlds/car.world b/sdf/worlds/car.world
deleted file mode 100644
index 143764e..0000000
--- a/sdf/worlds/car.world
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <physics type="ode">
-      <gravity>0 0 -9.8</gravity>
-      <ode>
-        <solver>
-          <type>quick</type>
-          <dt>0.003</dt>
-          <iters>80</iters>
-          <sor>1.3</sor>
-        </solver>
-        <constraints>
-          <cfm>0.0</cfm>
-          <erp>0.2</erp>
-          <contact_max_correcting_vel>100</contact_max_correcting_vel>
-          <contact_surface_layer>0.001</contact_surface_layer>
-        </constraints>
-      </ode>
-    </physics>
-    <!-- A ground plane -->
-    <include><uri>model://ground_plane</uri></include>
-    <!-- A global light source -->
-    <include><uri>model://sun</uri></include>
-    <include filename="car.model" />
-  </world>
-</sdf>
diff --git a/sdf/worlds/cart_test.world b/sdf/worlds/cart_test.world
deleted file mode 100644
index ffb3c6d..0000000
--- a/sdf/worlds/cart_test.world
+++ /dev/null
@@ -1,649 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <scene>
-      <ambient>1.0 1.0 1.0 1</ambient>
-      <background>0 0 0 1.0</background>
-      <shadows>true</shadows>
-    </scene>
-    <physics type="ode">
-      <gravity>0 0 -10.0</gravity>
-      <ode>
-        <solver>
-          <type>quick</type>
-          <dt>0.001</dt>
-          <iters>10</iters>
-          <sor>1.3</sor>
-        </solver>
-        <constraints>
-          <cfm>0.0</cfm>
-          <erp>0.2</erp>
-          <contact_max_correcting_vel>100.0</contact_max_correcting_vel>
-          <contact_surface_layer>0.0</contact_surface_layer>
-        </constraints>
-      </ode>
-    </physics>
-    <include><uri>model://ground_plane</uri></include>
-    <!-- 25.3kg total mass -->
-    <model name="test_model">
-      <pose>0 0 0.7 0 0 0</pose>
-      <link name="link">
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="collision">
-          <pose>0 0 -0.55 0 0 0</pose>
-          <geometry>
-            <box>
-              <size>1 1 0.1</size>
-            </box>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>100</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <pose>0 0 -0.55 0 0 0</pose>
-          <geometry>
-            <box>
-              <size>1 1 0.1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-        <collision name="collision2">
-          <pose>0 0 0 0 0 0</pose>
-          <geometry>
-            <box>
-              <size>0.5 0.5 0.5</size>
-            </box>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>100</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual2">
-          <pose>0 0 0 0 0 0</pose>
-          <geometry>
-            <box>
-              <size>0.5 0.5 0.5</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <link name="bar_1">
-        <pose>0.45 0 -0.5 0 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>0.001</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>0.001</iyy>
-            <iyz>0</iyz>
-            <izz>0.001</izz>
-          </inertia>
-          <mass>0.1</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <box>
-              <size>0.02 1.0 0.02</size>
-            </box>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>100</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>0.02 1.0 0.02</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint name="bar_12_joint" type="revolute">
-        <parent>bar_2</parent>
-        <child>bar_1</child>
-        <pose>0 0.5 0 0 0 0</pose>
-        <axis>
-          <xyz>0 0 1</xyz>
-        </axis>
-      </joint>
-      <joint name="bar_13_joint" type="revolute">
-        <parent>bar_3</parent>
-        <child>bar_1</child>
-        <pose>0 -0.5 0 0 0 0</pose>
-        <axis>
-          <xyz>0 0 1</xyz>
-        </axis>
-      </joint>
-      <link name="bar_2">
-        <pose>0.5 0.5 -0.5 0 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>0.001</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>0.001</iyy>
-            <iyz>0</iyz>
-            <izz>0.001</izz>
-          </inertia>
-          <mass>0.1</mass>
-        </inertial>
-        <collision name="collision">
-          <pose>-0.025 0 0 0 0 0</pose>
-          <geometry>
-            <box>
-              <size>0.05 0.02 0.02</size>
-            </box>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>100</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <pose>-0.025 0 0 0 0 0</pose>
-          <geometry>
-            <box>
-              <size>0.05 0.02 0.02</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint name="bar_2_joint" type="revolute">
-        <parent>link</parent>
-        <child>bar_2</child>
-        <pose>0 0 0 0 0 0</pose>
-        <axis>
-          <xyz>0 0 1</xyz>
-        </axis>
-      </joint>
-      <link name="bar_3">
-        <pose>0.5 -0.5 -0.5 0 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>0.001</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>0.001</iyy>
-            <iyz>0</iyz>
-            <izz>0.001</izz>
-          </inertia>
-          <mass>0.1</mass>
-        </inertial>
-        <collision name="collision">
-          <pose>-0.025 0 0 0 0 0</pose>
-          <geometry>
-            <box>
-              <size>0.05 0.02 0.02</size>
-            </box>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>100</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <pose>-0.025 0 0 0 0 0</pose>
-          <geometry>
-            <box>
-              <size>0.05 0.02 0.02</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint name="bar_3_joint" type="revolute">
-        <parent>link</parent>
-        <child>bar_3</child>
-        <pose>0 0 0 0 0 0</pose>
-        <axis>
-          <xyz>0 0 1</xyz>
-        </axis>
-      </joint>
-      <link name="wheel_1">
-        <pose>0.5 0.55 -0.5 1.57079633 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>0.01</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>0.01</iyy>
-            <iyz>0</iyz>
-            <izz>0.01</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.2</radius>
-              <length>0.1</length>
-            </cylinder>
-          </geometry>
-          <surface>
-            <friction>
-              <ode fdir="1 0 0">
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>100</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.2</radius>
-              <length>0.1</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint name="wheel_1_joint" type="revolute">
-        <parent>bar_2</parent>
-        <child>wheel_1</child>
-        <pose>0 0 0 0 0 0</pose>
-        <axis>
-          <xyz>0 1 0</xyz>
-        </axis>
-      </joint>
-      <link name="wheel_2">
-        <pose>0.5 -0.55 -0.5 1.57079633 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>0.01</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>0.01</iyy>
-            <iyz>0</iyz>
-            <izz>0.01</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.2</radius>
-              <length>0.1</length>
-            </cylinder>
-          </geometry>
-          <surface>
-            <friction>
-              <ode fdir="1 0 0">
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>100</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.2</radius>
-              <length>0.1</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint name="wheel_2_joint" type="revolute">
-        <parent>bar_3</parent>
-        <child>wheel_2</child>
-        <pose>0 0 0 0 0 0</pose>
-        <axis>
-          <xyz>0 1 0</xyz>
-        </axis>
-      </joint>
-      <link name="wheel_3">
-        <pose>-0.5 0.55 -0.5 1.57079633 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>0.01</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>0.01</iyy>
-            <iyz>0</iyz>
-            <izz>0.01</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.2</radius>
-              <length>0.1</length>
-            </cylinder>
-          </geometry>
-          <surface>
-            <friction>
-              <ode fdir="1 0 0">
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>100</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.2</radius>
-              <length>0.1</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint name="wheel_3_joint" type="revolute">
-        <parent>link</parent>
-        <child>wheel_3</child>
-        <pose>0 0 0 0 0 0</pose>
-        <axis>
-          <dynamics>
-            <damping>0.0</damping>
-            <friction>0.0</friction>
-          </dynamics>
-          <xyz>0 1 0</xyz>
-        </axis>
-      </joint>
-      <link name="wheel_4">
-        <pose>-0.5 -0.55 -0.5 1.57079633 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>0.01</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>0.01</iyy>
-            <iyz>0</iyz>
-            <izz>0.01</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.2</radius>
-              <length>0.1</length>
-            </cylinder>
-          </geometry>
-          <surface>
-            <friction>
-              <ode fdir="1 0 0">
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>100</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.2</radius>
-              <length>0.1</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint name="wheel_4_joint" type="revolute">
-        <parent>link</parent>
-        <child>wheel_4</child>
-        <pose>0 0 0 0 0 0</pose>
-        <axis>
-          <dynamics>
-            <damping>0.0</damping>
-            <friction>0.0</friction>
-          </dynamics>
-          <xyz>0 1 0</xyz>
-        </axis>
-      </joint>
-      <link name="sphere_link">
-        <pose>0 0 0.5 0 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>0.1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>0.1</iyy>
-            <iyz>0</iyz>
-            <izz>0.1</izz>
-          </inertia>
-          <mass>10.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.25</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <friction>
-              <ode fdir="1 0 0">
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>10</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.25</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint name="joint_sphere" type="revolute">
-        <parent>link</parent>
-        <child>sphere_link</child>
-        <pose>0 0 0 0 0 0</pose>
-        <axis>
-          <xyz>0 0 1</xyz>
-        </axis>
-      </joint>
-      <link name="cylinder_link">
-        <pose>0 0 0.25 0 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>0.1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>0.1</iyy>
-            <iyz>0</iyz>
-            <izz>0.1</izz>
-          </inertia>
-          <mass>10.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.25</radius>
-              <length>0.5</length>
-            </cylinder>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>10</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.25</radius>
-              <length>0.5</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint name="joint_cylinder" type="revolute">
-        <parent>sphere_link</parent>
-        <child>cylinder_link</child>
-        <pose>0 0 0 0 0 0</pose>
-        <axis>
-          <xyz>0 0 1</xyz>
-        </axis>
-      </joint>
-      <plugin name="cart_test_plugin" filename="libCartTestPlugin.so">
-        <steer>bar_2_joint</steer>
-        <steer_pid>10 0.1 0.5</steer_pid>
-        <steer_ilim>-10 10</steer_ilim>
-        <steer_pos>0.0</steer_pos>
-        <!-- steer -->
-        <steer_vel>0</steer_vel>
-        <!-- not used -->
-        <steer_eff>100.0</steer_eff>
-        <!-- max pos pid effort -->
-        <right>wheel_3_joint</right>
-        <right_pid>0.1 0.0 0.001</right_pid>
-        <right_ilim>-.1 .1</right_ilim>
-        <right_pos>0</right_pos>
-        <!-- final position pid -->
-        <right_vel>0</right_vel>
-        <!-- final velocity pid -->
-        <right_eff>0.1</right_eff>
-        <!-- drive torque -->
-        <left>wheel_4_joint</left>
-        <left_pid>0.1 0.0 0.001</left_pid>
-        <left_ilim>-.1 .1</left_ilim>
-        <left_pos>0</left_pos>
-        <!-- final position pid -->
-        <left_vel>0</left_vel>
-        <!-- final velocity pid -->
-        <left_eff>0.1</left_eff>
-        <!-- drive torque -->
-      </plugin>
-    </model>
-    <light type="directional" name="sun">
-      <pose>0 0 10 0 0 0</pose>
-      <diffuse>.8 .8 .8 1</diffuse>
-      <specular>.1 .1 .1 1</specular>
-      <attenuation>
-        <range>10</range>
-        <linear>0.01</linear>
-        <constant>0.8</constant>
-        <quadratic>0.0</quadratic>
-      </attenuation>
-      <direction>0 .5 -.5</direction>
-      <cast_shadows>true</cast_shadows>
-    </light>
-  </world>
-</sdf>
diff --git a/sdf/worlds/cfm_test.world b/sdf/worlds/cfm_test.world
deleted file mode 100644
index 7788999..0000000
--- a/sdf/worlds/cfm_test.world
+++ /dev/null
@@ -1,234 +0,0 @@
-<sdf version="1.3">
-  <world name="default">
-
-    <include><uri>model://sun</uri></include>
-    <include><uri>model://ground_plane</uri></include>
-  
-    <physics type="ode">
-        <gravity>0.000000 0.000000 0000</gravity>
-        <ode>
-            <solver>
-                <type>quick</type>
-                <dt>0.001000</dt>
-                <iters>100</iters>
-                <precon_iters>0</precon_iters>
-                <sor>1.000000</sor>
-            </solver>
-            <constraints>
-                <cfm>0.000000</cfm>
-                <erp>0.200000</erp>
-                <contact_max_correcting_vel>100.000000</contact_max_correcting_vel>
-                <contact_surface_layer>0.01000</contact_surface_layer>
-            </constraints>
-        </ode>
-        <update_rate>0.000000</update_rate>
-    </physics>
-    <model name="model_1">
-        <pose>0.000000 0.000000 2.100000 -1.415927 -0.000000 0.000000</pose>
-        <link name="link_1">
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>1.000000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>1.000000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>1.000000</izz>
-                </inertia>
-                <mass>10.000000</mass>
-            </inertial>
-            <visual name="visual_cylinder">
-                <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <cylinder>
-                        <radius>0.100000</radius>
-                        <length>1.000000</length>
-                    </cylinder>
-                </geometry>
-                <material>
-                    <script>Gazebo/Green</script>
-                </material>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>100.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <collision name="collision_cylinder">
-                <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                <max_contacts>250</max_contacts>
-                <geometry>
-                    <cylinder>
-                        <radius>0.100000</radius>
-                        <length>1.000000</length>
-                    </cylinder>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>0.500000</mu>
-                            <mu2>0.200000</mu2>
-                            <fdir1>1.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>1000000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <max_vel>100.000000</max_vel>
-                            <min_depth>0.000100</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>100.000000</laser_retro>
-            </collision>
-            <gravity>1</gravity>
-            <self_collide>1</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <link name="link_2">
-            <pose>0.000000 0.000000 -1.000000 0.000000 -0.000000 0.000000</pose>
-            <inertial>
-                <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                <inertia>
-                    <ixx>1.000000</ixx>
-                    <ixy>0.000000</ixy>
-                    <ixz>0.000000</ixz>
-                    <iyy>1.000000</iyy>
-                    <iyz>0.000000</iyz>
-                    <izz>1.000000</izz>
-                </inertia>
-                <mass>10.000000</mass>
-            </inertial>
-            <visual name="visual_box">
-                <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                <geometry>
-                    <box>
-                        <size>0.100000 0.100000 1.000000</size>
-                    </box>
-                </geometry>
-                <material>
-                    <script>Gazebo/Red</script>
-                </material>
-                <cast_shadows>1</cast_shadows>
-                <laser_retro>100.000000</laser_retro>
-                <transparency>0.000000</transparency>
-            </visual>
-            <collision name="collision_box">
-                <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                <max_contacts>250</max_contacts>
-                <geometry>
-                    <box>
-                        <size>0.100000 0.100000 1.000000</size>
-                    </box>
-                </geometry>
-                <surface>
-                    <friction>
-                        <ode>
-                            <mu>0.500000</mu>
-                            <mu2>0.200000</mu2>
-                            <fdir1>1.000000 0.000000 0.000000</fdir1>
-                            <slip1>0.000000</slip1>
-                            <slip2>0.000000</slip2>
-                        </ode>
-                    </friction>
-                    <bounce>
-                        <restitution_coefficient>0.000000</restitution_coefficient>
-                        <threshold>1000000.000000</threshold>
-                    </bounce>
-                    <contact>
-                        <ode>
-                            <soft_cfm>0.000000</soft_cfm>
-                            <soft_erp>0.200000</soft_erp>
-                            <max_vel>100.000000</max_vel>
-                            <min_depth>0.000100</min_depth>
-                        </ode>
-                    </contact>
-                </surface>
-                <laser_retro>100.000000</laser_retro>
-            </collision>
-            <gravity>1</gravity>
-            <self_collide>0</self_collide>
-            <kinematic>0</kinematic>
-        </link>
-        <joint name="joint_0" type="revolute">
-            <parent>world</parent>
-            <child>link_1</child>
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <axis>
-                <limit>
-                    <lower>1000.000000</lower>
-                    <upper>-1000.000000</upper>
-                    <effort>1000.000000</effort>
-                    <velocity>1000.000000</velocity>
-                </limit>
-                <dynamics>
-                    <damping>10.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <xyz>1.000000 0.000000 0.000000</xyz>
-            </axis>
-            <physics>
-                <ode>
-                    <provide_feedback>1</provide_feedback>
-                    <cfm>0.200000</cfm>
-                    <bounce>0.000000</bounce>
-                    <max_force>1000.000000</max_force>
-                    <velocity>0.000000</velocity>
-                    <fudge_factor>0.000000</fudge_factor>
-                    <limit>
-                       <cfm>0</cfm>
-                       <erp>0.2</erp>
-                    </limit>
-                    <suspension>
-                       <cfm>0</cfm>
-                       <erp>0.2</erp>
-                    </suspension>
-                </ode>
-            </physics>
-        </joint>
-        <joint name="joint_1" type="revolute">
-            <parent>link_1</parent>
-            <child>link_2</child>
-            <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-            <axis>
-                <limit>
-                    <lower>-100.000000</lower>
-                    <upper>100.000000</upper>
-                    <effort>1000.000000</effort>
-                    <velocity>1000.000000</velocity>
-                </limit>
-                <dynamics>
-                    <damping>1.000000</damping>
-                    <friction>0.000000</friction>
-                </dynamics>
-                <xyz>1.000000 0.000000 0.000000</xyz>
-            </axis>
-            <physics>
-                <ode>
-                    <cfm>0.200000</cfm>
-                    <bounce>0.000000</bounce>
-                    <max_force>1000.000000</max_force>
-                    <velocity>0.000000</velocity>
-                    <fudge_factor>0.000000</fudge_factor>
-                    <limit>
-                       <cfm>0</cfm>
-                       <erp>0.2</erp>
-                    </limit>
-                    <suspension>
-                       <cfm>0</cfm>
-                       <erp>0.2</erp>
-                    </suspension>
-                </ode>
-            </physics>
-        </joint>
-        <static>0</static>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/contact.world b/sdf/worlds/contact.world
deleted file mode 100644
index 1c56b45..0000000
--- a/sdf/worlds/contact.world
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0"?>
-<sdf version="1.3">
-  <world name="default">
-    <include>
-      <uri>model://ground_plane</uri>
-    </include>
-
-     <include>
-      <uri>model://sun</uri>
-    </include>
-
-    <model name="box">
-      <link name="link">
-        <pose>0 0 0.5 0 0 0</pose>
-
-        <collision name="box_collision">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </visual>
-
-        <sensor name='my_contact' type='contact'>
-          <contact>
-            <collision>box_collision</collision>
-          </contact>
-
-          <plugin name="my_plugin" filename="libContactPlugin.so"/>
-        </sensor>
-      </link>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/depth_camera.world b/sdf/worlds/depth_camera.world
deleted file mode 100644
index e93dcf3..0000000
--- a/sdf/worlds/depth_camera.world
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <include><uri>model://sun</uri></include>
-    <model name="sphere">
-      <pose>2 0 0 0 0 0</pose>
-      <link name="body">
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="geom">
-          <geometry>
-            <sphere>
-              <radius>1</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="camera_model">
-      <pose>0 0 0 0 0 0</pose>
-      <link name="my_link">
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <sensor name="camera" type="depth">
-          <camera>
-            <horizontal_fov>1.04719755</horizontal_fov>
-            <image>
-              <width>640</width>
-              <height>480</height>
-              <format>R8G8B8</format>
-            </image>
-            <clip near=".1" far="20" />
-            <save enabled="true" path="/tmp/camera" />
-          </camera>
-          <plugin filename="libDepthCameraPlugin.so" name="depth_camera_plugin" />
-          <always_on>true</always_on>
-          <update_rate>10</update_rate>
-        </sensor>
-      </link>
-      <static>true</static>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/double_pendulums.world b/sdf/worlds/double_pendulums.world
deleted file mode 100644
index e539d9c..0000000
--- a/sdf/worlds/double_pendulums.world
+++ /dev/null
@@ -1,671 +0,0 @@
-<sdf version="1.3">
-    <world name="default">
-        <scene>
-            <ambient>0.500000 0.500000 0.500000 1.000000</ambient>
-            <background>0.500000 0.500000 0.500000 1.000000</background>
-            <shadows>0</shadows>
-        </scene>
-        <light name="sun" type="directional">
-            <pose>0.000000 0.000000 100.000000 0.000000 -0.000000 0.000000</pose>
-            <diffuse>1.000000 1.000000 1.000000 1.000000</diffuse>
-            <specular>0.100000 0.100000 0.100000 1.000000</specular>
-            <attenuation>
-                <range>1000.000000</range>
-                <linear>0.010000</linear>
-                <constant>0.900000</constant>
-                <quadratic>0.000000</quadratic>
-            </attenuation>
-            <direction>-1.000000 0.000000 -1.000000</direction>
-            <cast_shadows>1</cast_shadows>
-        </light>
-        <physics type="ode">
-            <gravity>0.000000 0.000000 -9.810000</gravity>
-            <ode>
-                <solver>
-                    <type>quick</type>
-                    <dt>0.001000</dt>
-                    <iters>100</iters>
-                    <precon_iters>0</precon_iters>
-                    <sor>1.300000</sor>
-                </solver>
-                <constraints>
-                    <cfm>0.000000</cfm>
-                    <erp>1.000000</erp>
-                    <contact_max_correcting_vel>0.000000</contact_max_correcting_vel>
-                    <contact_surface_layer>0.000000</contact_surface_layer>
-                </constraints>
-            </ode>
-            <update_rate>0.000000</update_rate>
-        </physics>
-        <model name="model_1">
-            <pose>0.000000 0.000000 2.100000 -1.415927 -0.000000 0.000000</pose>
-            <link name="link_1">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertial>
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <inertia>
-                        <ixx>1.000000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>1.000000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>1.000000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_cylinder">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.100000</radius>
-                            <length>1.000000</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                    <cast_shadows>1</cast_shadows>
-                    <laser_retro>100.000000</laser_retro>
-                    <transparency>0.000000</transparency>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.100000</radius>
-                            <length>1.000000</length>
-                        </cylinder>
-                    </geometry>
-                    <surface>
-                        <friction>
-                            <ode>
-                                <mu>0.500000</mu>
-                                <mu2>0.200000</mu2>
-                                <fdir1>1.000000 0.000000 0.000000</fdir1>
-                                <slip1>0.000000</slip1>
-                                <slip2>0.000000</slip2>
-                            </ode>
-                        </friction>
-                        <bounce>
-                            <restitution_coefficient>0.000000</restitution_coefficient>
-                            <threshold>1000000.000000</threshold>
-                        </bounce>
-                        <contact>
-                            <ode>
-                                <soft_cfm>0.000000</soft_cfm>
-                                <soft_erp>0.200000</soft_erp>
-                                <kp>1000000000000000.000000</kp>
-                                <kd>10000000000000.000000</kd>
-                                <max_vel>100.000000</max_vel>
-                                <min_depth>0.000100</min_depth>
-                            </ode>
-                        </contact>
-                    </surface>
-                    <laser_retro>100.000000</laser_retro>
-                </collision>
-                <gravity>1</gravity>
-                <self_collide>1</self_collide>
-                <kinematic>0</kinematic>
-            </link>
-            <link name="link_2">
-                <pose>0.000000 0.000000 -1.000000 0.000000 -0.000000 0.000000</pose>
-                <inertial>
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <inertia>
-                        <ixx>1.000000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>1.000000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>1.000000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_box">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <geometry>
-                        <box>
-                            <size>0.100000 0.100000 1.000000</size>
-                        </box>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Red</script>
-                    </material>
-                    <cast_shadows>1</cast_shadows>
-                    <laser_retro>100.000000</laser_retro>
-                    <transparency>0.000000</transparency>
-                </visual>
-                <collision name="collision_box">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <box>
-                            <size>0.100000 0.100000 1.000000</size>
-                        </box>
-                    </geometry>
-                    <surface>
-                        <friction>
-                            <ode>
-                                <mu>0.500000</mu>
-                                <mu2>0.200000</mu2>
-                                <fdir1>1.000000 0.000000 0.000000</fdir1>
-                                <slip1>0.000000</slip1>
-                                <slip2>0.000000</slip2>
-                            </ode>
-                        </friction>
-                        <bounce>
-                            <restitution_coefficient>0.000000</restitution_coefficient>
-                            <threshold>1000000.000000</threshold>
-                        </bounce>
-                        <contact>
-                            <ode>
-                                <soft_cfm>0.000000</soft_cfm>
-                                <soft_erp>0.200000</soft_erp>
-                                <kp>1000000000000000.000000</kp>
-                                <kd>10000000000000.000000</kd>
-                                <max_vel>100.000000</max_vel>
-                                <min_depth>0.000100</min_depth>
-                            </ode>
-                        </contact>
-                    </surface>
-                    <laser_retro>100.000000</laser_retro>
-                </collision>
-                <gravity>1</gravity>
-                <self_collide>0</self_collide>
-                <kinematic>0</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <axis>
-                    <limit>
-                        <lower>-100.000000</lower>
-                        <upper>100.000000</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>0.000000</damping>
-                        <friction>0.000000</friction>
-                    </dynamics>
-                    <xyz>1.000000 0.000000 0.000000</xyz>
-                </axis>
-                <physics>
-                    <ode>
-                        <cfm>0.200000</cfm>
-                        <bounce>0.000000</bounce>
-                        <max_force>1000.000000</max_force>
-                        <velocity>0.000000</velocity>
-                        <fudge_factor>0.000000</fudge_factor>
-                        <limit>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </limit>
-                        <suspension>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </suspension>
-                    </ode>
-                </physics>
-            </joint>
-            <joint name="joint_1" type="revolute">
-                <parent>link_1</parent>
-                <child>link_2</child>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <axis>
-                    <limit>
-                        <lower>-100.000000</lower>
-                        <upper>100.000000</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>0.000000</damping>
-                        <friction>0.000000</friction>
-                    </dynamics>
-                    <xyz>1.000000 0.000000 0.000000</xyz>
-                </axis>
-                <physics>
-                    <ode>
-                        <cfm>0.200000</cfm>
-                        <bounce>0.000000</bounce>
-                        <max_force>1000.000000</max_force>
-                        <velocity>0.000000</velocity>
-                        <fudge_factor>0.000000</fudge_factor>
-                        <limit>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </limit>
-                        <suspension>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </suspension>
-                    </ode>
-                </physics>
-            </joint>
-            <static>0</static>
-        </model>
-        <model name="model_2">
-            <pose>1.000000 0.000000 2.100000 -1.415927 -0.000000 0.000000</pose>
-            <link name="link_1">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertial>
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <inertia>
-                        <ixx>1.000000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>1.000000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>1.000000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_cylinder">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.100000</radius>
-                            <length>1.000000</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                    <cast_shadows>1</cast_shadows>
-                    <laser_retro>100.000000</laser_retro>
-                    <transparency>0.000000</transparency>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.100000</radius>
-                            <length>1.000000</length>
-                        </cylinder>
-                    </geometry>
-                    <surface>
-                        <friction>
-                            <ode>
-                                <mu>0.500000</mu>
-                                <mu2>0.200000</mu2>
-                                <fdir1>1.000000 0.000000 0.000000</fdir1>
-                                <slip1>0.000000</slip1>
-                                <slip2>0.000000</slip2>
-                            </ode>
-                        </friction>
-                        <bounce>
-                            <restitution_coefficient>0.000000</restitution_coefficient>
-                            <threshold>1000000.000000</threshold>
-                        </bounce>
-                        <contact>
-                            <ode>
-                                <soft_cfm>0.000000</soft_cfm>
-                                <soft_erp>0.200000</soft_erp>
-                                <kp>1000000000000000.000000</kp>
-                                <kd>10000000000000.000000</kd>
-                                <max_vel>100.000000</max_vel>
-                                <min_depth>0.000100</min_depth>
-                            </ode>
-                        </contact>
-                    </surface>
-                    <laser_retro>100.000000</laser_retro>
-                </collision>
-                <gravity>1</gravity>
-                <self_collide>1</self_collide>
-                <kinematic>0</kinematic>
-            </link>
-            <link name="link_2">
-                <pose>0.000000 0.000000 -1.000000 0.000000 -0.000000 0.000000</pose>
-                <inertial>
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <inertia>
-                        <ixx>1.000000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>1.000000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>1.000000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_box">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <geometry>
-                        <box>
-                            <size>0.100000 0.100000 1.000000</size>
-                        </box>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Red</script>
-                    </material>
-                    <cast_shadows>1</cast_shadows>
-                    <laser_retro>100.000000</laser_retro>
-                    <transparency>0.000000</transparency>
-                </visual>
-                <collision name="collision_box">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <box>
-                            <size>0.100000 0.100000 1.000000</size>
-                        </box>
-                    </geometry>
-                    <surface>
-                        <friction>
-                            <ode>
-                                <mu>0.500000</mu>
-                                <mu2>0.200000</mu2>
-                                <fdir1>1.000000 0.000000 0.000000</fdir1>
-                                <slip1>0.000000</slip1>
-                                <slip2>0.000000</slip2>
-                            </ode>
-                        </friction>
-                        <bounce>
-                            <restitution_coefficient>0.000000</restitution_coefficient>
-                            <threshold>1000000.000000</threshold>
-                        </bounce>
-                        <contact>
-                            <ode>
-                                <soft_cfm>0.000000</soft_cfm>
-                                <soft_erp>0.200000</soft_erp>
-                                <kp>1000000000000000.000000</kp>
-                                <kd>10000000000000.000000</kd>
-                                <max_vel>100.000000</max_vel>
-                                <min_depth>0.000100</min_depth>
-                            </ode>
-                        </contact>
-                    </surface>
-                    <laser_retro>100.000000</laser_retro>
-                </collision>
-                <gravity>1</gravity>
-                <self_collide>0</self_collide>
-                <kinematic>0</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <axis>
-                    <limit>
-                        <lower>-100.000000</lower>
-                        <upper>100.000000</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>0.000000</damping>
-                        <friction>0.000000</friction>
-                    </dynamics>
-                    <xyz>1.000000 0.000000 0.000000</xyz>
-                </axis>
-                <physics>
-                    <ode>
-                        <cfm>0.200000</cfm>
-                        <bounce>0.000000</bounce>
-                        <max_force>1000.000000</max_force>
-                        <velocity>0.000000</velocity>
-                        <fudge_factor>0.000000</fudge_factor>
-                        <limit>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </limit>
-                        <suspension>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </suspension>
-                    </ode>
-                </physics>
-            </joint>
-            <joint name="joint_1" type="revolute">
-                <parent>link_1</parent>
-                <child>link_2</child>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <axis>
-                    <limit>
-                        <lower>-100.000000</lower>
-                        <upper>100.000000</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>0.000000</damping>
-                        <friction>0.000000</friction>
-                    </dynamics>
-                    <xyz>1.000000 0.000000 0.000000</xyz>
-                </axis>
-                <physics>
-                    <ode>
-                        <cfm>0.200000</cfm>
-                        <bounce>0.000000</bounce>
-                        <max_force>1000.000000</max_force>
-                        <velocity>0.000000</velocity>
-                        <fudge_factor>0.000000</fudge_factor>
-                        <limit>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </limit>
-                        <suspension>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </suspension>
-                    </ode>
-                </physics>
-            </joint>
-            <static>0</static>
-        </model>
-        <model name="model_3">
-            <pose>0.000000 -2.500000 2.100000 0.000000 -1.415927 0.000000</pose>
-            <link name="link_1">
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <inertial>
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <inertia>
-                        <ixx>1.000000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>1.000000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>1.000000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_cylinder">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.100000</radius>
-                            <length>1.000000</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                    <cast_shadows>1</cast_shadows>
-                    <laser_retro>100.000000</laser_retro>
-                    <transparency>0.000000</transparency>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.100000</radius>
-                            <length>1.000000</length>
-                        </cylinder>
-                    </geometry>
-                    <surface>
-                        <friction>
-                            <ode>
-                                <mu>0.500000</mu>
-                                <mu2>0.200000</mu2>
-                                <fdir1>1.000000 0.000000 0.000000</fdir1>
-                                <slip1>0.000000</slip1>
-                                <slip2>0.000000</slip2>
-                            </ode>
-                        </friction>
-                        <bounce>
-                            <restitution_coefficient>0.000000</restitution_coefficient>
-                            <threshold>1000000.000000</threshold>
-                        </bounce>
-                        <contact>
-                            <ode>
-                                <soft_cfm>0.000000</soft_cfm>
-                                <soft_erp>0.200000</soft_erp>
-                                <kp>1000000000000000.000000</kp>
-                                <kd>10000000000000.000000</kd>
-                                <max_vel>100.000000</max_vel>
-                                <min_depth>0.000100</min_depth>
-                            </ode>
-                        </contact>
-                    </surface>
-                    <laser_retro>100.000000</laser_retro>
-                </collision>
-                <gravity>1</gravity>
-                <self_collide>1</self_collide>
-                <kinematic>0</kinematic>
-            </link>
-            <link name="link_2">
-                <pose>0.000000 0.000000 -1.000000 0.000000 -0.000000 0.000000</pose>
-                <inertial>
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <inertia>
-                        <ixx>1.000000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>1.000000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>1.000000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_box">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <geometry>
-                        <box>
-                            <size>0.100000 0.100000 1.000000</size>
-                        </box>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Red</script>
-                    </material>
-                    <cast_shadows>1</cast_shadows>
-                    <laser_retro>100.000000</laser_retro>
-                    <transparency>0.000000</transparency>
-                </visual>
-                <collision name="collision_box">
-                    <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <box>
-                            <size>0.100000 0.100000 1.000000</size>
-                        </box>
-                    </geometry>
-                    <surface>
-                        <friction>
-                            <ode>
-                                <mu>0.500000</mu>
-                                <mu2>0.200000</mu2>
-                                <fdir1>1.000000 0.000000 0.000000</fdir1>
-                                <slip1>0.000000</slip1>
-                                <slip2>0.000000</slip2>
-                            </ode>
-                        </friction>
-                        <bounce>
-                            <restitution_coefficient>0.000000</restitution_coefficient>
-                            <threshold>1000000.000000</threshold>
-                        </bounce>
-                        <contact>
-                            <ode>
-                                <soft_cfm>0.000000</soft_cfm>
-                                <soft_erp>0.200000</soft_erp>
-                                <kp>1000000000000000.000000</kp>
-                                <kd>10000000000000.000000</kd>
-                                <max_vel>100.000000</max_vel>
-                                <min_depth>0.000100</min_depth>
-                            </ode>
-                        </contact>
-                    </surface>
-                    <laser_retro>100.000000</laser_retro>
-                </collision>
-                <gravity>1</gravity>
-                <self_collide>0</self_collide>
-                <kinematic>0</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <axis>
-                    <limit>
-                        <lower>-100.000000</lower>
-                        <upper>100.000000</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>0.000000</damping>
-                        <friction>0.000000</friction>
-                    </dynamics>
-                    <xyz>0.000000 1.000000 0.000000</xyz>
-                </axis>
-                <physics>
-                    <ode>
-                        <cfm>0.200000</cfm>
-                        <bounce>0.000000</bounce>
-                        <max_force>1000.000000</max_force>
-                        <velocity>0.000000</velocity>
-                        <fudge_factor>0.000000</fudge_factor>
-                        <limit>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </limit>
-                        <suspension>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </suspension>
-                    </ode>
-                </physics>
-            </joint>
-            <joint name="joint_1" type="revolute">
-                <parent>link_1</parent>
-                <child>link_2</child>
-                <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
-                <axis>
-                    <limit>
-                        <lower>-100.000000</lower>
-                        <upper>100.000000</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>0.000000</damping>
-                        <friction>0.000000</friction>
-                    </dynamics>
-                    <xyz>0.000000 1.000000 0.000000</xyz>
-                </axis>
-                <physics>
-                    <ode>
-                        <cfm>0.200000</cfm>
-                        <bounce>0.000000</bounce>
-                        <max_force>1000.000000</max_force>
-                        <velocity>0.000000</velocity>
-                        <fudge_factor>0.000000</fudge_factor>
-                        <limit>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </limit>
-                        <suspension>
-                           <cfm>0</cfm>
-                           <erp>0.2</erp>
-                        </suspension>
-                    </ode>
-                </physics>
-            </joint>
-            <static>0</static>
-        </model>
-    </world>
-</sdf>
diff --git a/sdf/worlds/empty.world b/sdf/worlds/empty.world
deleted file mode 100644
index 3763356..0000000
--- a/sdf/worlds/empty.world
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <!-- A global light source -->
-    <include>
-      <uri>model://sun</uri>
-    </include>
-
-    <!-- A ground plane -->
-    <include>
-      <uri>model://ground_plane</uri>
-    </include>
-  </world>
-</sdf>
diff --git a/sdf/worlds/empty_1_0.world b/sdf/worlds/empty_1_0.world
deleted file mode 100644
index 4f7ab07..0000000
--- a/sdf/worlds/empty_1_0.world
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <scene>
-      <ambient>0 0 0 1</ambient>
-      <fog>
-        <color>1 2 3 4</color>
-        <type>linear</type>
-        <start>.1</start>
-        <end>100.1</end>
-        <density>0.5</density>
-      </fog>
-      <background>.5 .5 .5 1</background>
-    </scene>
-    <!-- A ground plane -->
-    <include><uri>model://ground_plane</uri></include>
-    <!-- A global light source -->
-    <include><uri>model://sun</uri></include>
-  </world>
-</sdf>
diff --git a/sdf/worlds/empty_bullet.world b/sdf/worlds/empty_bullet.world
deleted file mode 100644
index bd2673d..0000000
--- a/sdf/worlds/empty_bullet.world
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <scene>
-      <ambient>.1 .1 .1 1</ambient>
-      <shadows>false</shadows>
-    </scene>
-    <physics type="bullet">
-      <gravity>0 0 -9.8</gravity>
-      <bullet>
-        <dt>0.001</dt>
-      </bullet>
-    </physics>
-
-    <!-- A ground plane -->
-    <include><uri>model://ground_plane</uri></include>
-
-    <!-- A global light source -->
-    <include><uri>model://sun</uri></include>
-
-  </world>
-</sdf>
diff --git a/sdf/worlds/force_torque_demo.world b/sdf/worlds/force_torque_demo.world
deleted file mode 100644
index 0ec6699..0000000
--- a/sdf/worlds/force_torque_demo.world
+++ /dev/null
@@ -1,424 +0,0 @@
-<sdf version="1.3">
-    <world name="default">
-        <include><uri>model://ground_plane</uri></include>
-        <include><uri>model://sun</uri></include>
-        <scene>
-            <ambient>0.500000 0.500000 0.500000 1.000000</ambient>
-            <background>0.500000 0.500000 0.500000 1.000000</background>
-            <shadows>0</shadows>
-        </scene>
-        <physics type="ode">
-            <gravity>0.000000 0.000000 -9.810000</gravity>
-            <ode>
-                <solver>
-                    <type>quick</type>
-                    <dt>0.001000</dt>
-                    <iters>1000</iters>
-                    <precon_iters>0</precon_iters>
-                    <sor>1.000000</sor>
-                </solver>
-                <constraints>
-                    <cfm>0.000000</cfm>
-                    <erp>0.200000</erp>
-                    <contact_max_correcting_vel>100.000000</contact_max_correcting_vel>
-                    <contact_surface_layer>0.01000</contact_surface_layer>
-                </constraints>
-            </ode>
-            <update_rate>0.000000</update_rate>
-        </physics>
-
-
-        <!-- to demonstrate force torque, we'll construct a model with
-             two bodies stacked vertically, with a x-revolute joint connecting
-             them.  The joint has 90 degree limit.  We'll test force
-             torque readings and characterize them. -->
-        <model name="model_1">
-            <pose>0 0 0 0 0 0</pose>
-            <link name="link_1">
-                <pose>0 0 0 0 0 0</pose>
-                <inertial>
-                    <pose>0 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.100000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>0.100000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>0.100000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_sphere">
-                    <pose>0 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <sphere>
-                            <radius>0.100000</radius>
-                        </sphere>
-                    </geometry>
-                </visual>
-                <collision name="collision_sphere">
-                    <pose>0 0 0.5 0 0 0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <sphere>
-                            <radius>0.100000</radius>
-                        </sphere>
-                    </geometry>
-                </collision>
-            </link>
-            <link name="link_2">
-                <pose>0 0 1.5 0 0 0</pose>
-                <inertial>
-                    <pose>0 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.100000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>0.100000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>0.100000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_box">
-                    <pose>0 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>0.1 0.2 0.4</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <collision name="collision_box">
-                    <pose>0 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>0.1 0.2 0.4</size>
-                        </box>
-                    </geometry>
-                </collision>
-            </link>
-            <joint name="joint_01" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <!-- joint at origin of link_1 inertial frame -->
-                <!-- moement arm from link_1 inertial frame to joint_01
-                     is 0m -->
-                <pose>0 0 0.5 0 0 0</pose>
-                <axis>
-                    <limit>
-                        <lower>-1.57079</lower>
-                        <upper>1.57079</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>0.000000</damping>
-                        <friction>0.000000</friction>
-                    </dynamics>
-                    <xyz>1.000000 0.000000 0.000000</xyz>
-                </axis>
-                <physics>
-                    <ode>
-                        <provide_feedback>1</provide_feedback>
-                        <!--<cfm_damping>1</cfm_damping>-->
-                    </ode>
-                </physics>
-            </joint>
-            <joint name="joint_12" type="revolute">
-                <parent>link_1</parent>
-                <child>link_2</child>
-                <!-- joint_1 at origin of link_2 link frame -->
-                <!-- moement arm from link_2 inertial frame to joint_01
-                     is 2m -->
-                <!-- moement arm from link_2 inertial frame to joint_12
-                     is 0.5m -->
-                <pose>0 0 0 0 0 0</pose>
-                <axis>
-                    <limit>
-                        <lower>-0.0</lower>
-                        <upper>0.0</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>0.000000</damping>
-                        <friction>0.000000</friction>
-                    </dynamics>
-                    <xyz>0.000000 0.000000 1.000000</xyz>
-                </axis>
-                <physics>
-                    <ode>
-                        <provide_feedback>1</provide_feedback>
-                        <!--<cfm_damping>1</cfm_damping>-->
-                    </ode>
-                </physics>
-            </joint>
-            <static>0</static>
-        </model>
-        <model name="box">
-            <pose>-3.5 0 0 0 0 0</pose>
-            <link name="link">
-                <collision name="collision">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <visual name="visual">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <inertial>
-                    <mass>100.0</mass>
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.1</ixx>
-                        <iyy>0.1</iyy>
-                        <izz>0.1</izz>
-                        <ixy>0.1</ixy>
-                        <ixz>0.1</ixz>
-                        <iyz>0.1</iyz>
-                    </inertia>
-                </inertial>
-            </link>
-            <link name="link2">
-                <pose>1.0 0 1.0 0 0 0</pose>
-                <collision name="collision">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <visual name="visual">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <inertial>
-                    <mass>5.0</mass>
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.1</ixx>
-                        <iyy>0.1</iyy>
-                        <izz>0.1</izz>
-                        <ixy>0.1</ixy>
-                        <ixz>0.1</ixz>
-                        <iyz>0.1</iyz>
-                    </inertia>
-                </inertial>
-            </link>
-            <link name="link3">
-                <pose>2.0 0 2.0 0 0 0</pose>
-                <collision name="collision">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <visual name="visual">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <inertial>
-                    <mass>1.0</mass>
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.1</ixx>
-                        <iyy>0.1</iyy>
-                        <izz>0.1</izz>
-                        <ixy>0.1</ixy>
-                        <ixz>0.1</ixz>
-                        <iyz>0.1</iyz>
-                    </inertia>
-                </inertial>
-            </link>
-            <joint name="joint1" type="revolute">
-                <physics>
-                    <ode>
-                        <provide_feedback>true</provide_feedback>
-                    </ode>
-                </physics>
-                <axis>
-                    <xyz>0 1 0</xyz>
-                </axis>
-                <parent>
-                    <link_name>link</link_name>
-                </parent>
-                <child>
-                    <link_name>link2</link_name>
-                </child>
-            </joint>
-            <joint name="joint2" type="revolute">
-                <physics>
-                    <ode>
-                        <provide_feedback>true</provide_feedback>
-                    </ode>
-                </physics>
-                <axis>
-                    <xyz>0 1 0</xyz>
-                </axis>
-                <parent>
-                    <link_name>link2</link_name>
-                </parent>
-                <child>
-                    <link_name>link3</link_name>
-                </child>
-            </joint>
-            <!--<plugin name="GazeboJointControlTester" filename="libGazeboJointControlTester.so">
-      </plugin>-->
-            <plugin name="GazeboStateCommunicator" filename="libGazeboStateCommunicator.so" imulink="imu_link" />
-        </model>
-        <model name="boxes">
-            <pose>-3.5 0 0 0 0 0</pose>
-            <link name="link1">
-                <collision name="collision">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <visual name="visual">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <inertial>
-                    <mass>100.0</mass>
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.1</ixx>
-                        <iyy>0.1</iyy>
-                        <izz>0.1</izz>
-                        <ixy>0.1</ixy>
-                        <ixz>0.1</ixz>
-                        <iyz>0.1</iyz>
-                    </inertia>
-                </inertial>
-            </link>
-            <link name="link2">
-                <pose>1.0 0 1.0 0 0 0</pose>
-                <collision name="collision">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <visual name="visual">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <inertial>
-                    <mass>5.0</mass>
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.1</ixx>
-                        <iyy>0.1</iyy>
-                        <izz>0.1</izz>
-                        <ixy>0.1</ixy>
-                        <ixz>0.1</ixz>
-                        <iyz>0.1</iyz>
-                    </inertia>
-                </inertial>
-            </link>
-            <link name="link3">
-                <pose>2.0 0 2.0 0 0 0</pose>
-                <collision name="collision">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <visual name="visual">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <inertial>
-                    <mass>1.0</mass>
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.1</ixx>
-                        <iyy>0.1</iyy>
-                        <izz>0.1</izz>
-                        <ixy>0.1</ixy>
-                        <ixz>0.1</ixz>
-                        <iyz>0.1</iyz>
-                    </inertia>
-                </inertial>
-            </link>
-            <joint name="joint1" type="revolute">
-                <physics>
-                    <ode>
-                        <provide_feedback>true</provide_feedback>
-                        <cfm_damping>true</cfm_damping>
-                    </ode>
-                </physics>
-                <axis>
-                    <xyz>0 1 0</xyz>
-                    <dynamics>
-                        <damping>60.000000</damping>
-                    </dynamics>
-                </axis>
-                <parent>
-                    <link_name>link1</link_name>
-                </parent>
-                <child>
-                    <link_name>link2</link_name>
-                </child>
-            </joint>
-            <joint name="joint2" type="revolute">
-                <physics>
-                    <ode>
-                        <provide_feedback>true</provide_feedback>
-                        <cfm_damping>true</cfm_damping>
-                    </ode>
-                </physics>
-                <axis>
-                    <xyz>0 1 0</xyz>
-                    <dynamics>
-                        <damping>30.000000</damping>
-                    </dynamics>
-                </axis>
-                <parent>
-                    <link_name>link2</link_name>
-                </parent>
-                <child>
-                    <link_name>link3</link_name>
-                </child>
-            </joint>
-        </model>
-    </world>
-</sdf>
diff --git a/sdf/worlds/force_torque_demo2.world b/sdf/worlds/force_torque_demo2.world
deleted file mode 100644
index f75961e..0000000
--- a/sdf/worlds/force_torque_demo2.world
+++ /dev/null
@@ -1,168 +0,0 @@
-<sdf version="1.3">
-    <world name="default">
-        <include><uri>model://ground_plane</uri></include>
-        <include><uri>model://sun</uri></include>
-        <scene>
-            <ambient>0.500000 0.500000 0.500000 1.000000</ambient>
-            <background>0.500000 0.500000 0.500000 1.000000</background>
-            <shadows>0</shadows>
-        </scene>
-        <physics type="ode">
-            <gravity>0.000000 0.000000 -9.810000</gravity>
-            <ode>
-                <solver>
-                    <type>quick</type>
-                    <dt>0.001000</dt>
-                    <iters>1000</iters>
-                    <precon_iters>0</precon_iters>
-                    <sor>1.000000</sor>
-                </solver>
-                <constraints>
-                    <cfm>0.000000</cfm>
-                    <erp>0.200000</erp>
-                    <contact_max_correcting_vel>100.000000</contact_max_correcting_vel>
-                    <contact_surface_layer>0.01000</contact_surface_layer>
-                </constraints>
-            </ode>
-            <update_rate>0.000000</update_rate>
-        </physics>
-
-
-        <!-- test contributed by jesper -->
-        <model name="boxes">
-            <pose>0 0 0 0 0 0</pose>
-            <link name="link1">
-                <collision name="collision">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <visual name="visual">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <inertial>
-                    <mass>100.0</mass>
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.1</ixx>
-                        <iyy>0.1</iyy>
-                        <izz>0.1</izz>
-                        <ixy>0.1</ixy>
-                        <ixz>0.1</ixz>
-                        <iyz>0.1</iyz>
-                    </inertia>
-                </inertial>
-            </link>
-            <link name="link2">
-                <pose>1.0 0 1.0 0 0 0</pose>
-                <collision name="collision">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <visual name="visual">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <inertial>
-                    <mass>5.0</mass>
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.1</ixx>
-                        <iyy>0.1</iyy>
-                        <izz>0.1</izz>
-                        <ixy>0.1</ixy>
-                        <ixz>0.1</ixz>
-                        <iyz>0.1</iyz>
-                    </inertia>
-                </inertial>
-            </link>
-            <link name="link3">
-                <pose>2.0 0 2.0 0 0 0</pose>
-                <collision name="collision">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <visual name="visual">
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>1 1 1</size>
-                        </box>
-                    </geometry>
-                </visual>
-                <inertial>
-                    <mass>1.0</mass>
-                    <pose>0.5 0 0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>0.1</ixx>
-                        <iyy>0.1</iyy>
-                        <izz>0.1</izz>
-                        <ixy>0.1</ixy>
-                        <ixz>0.1</ixz>
-                        <iyz>0.1</iyz>
-                    </inertia>
-                </inertial>
-            </link>
-            <joint name="joint1" type="revolute">
-                <physics>
-                    <ode>
-                        <provide_feedback>true</provide_feedback>
-                        <cfm_damping>true</cfm_damping>
-                    </ode>
-                </physics>
-                <axis>
-                    <xyz>0 1 0</xyz>
-                    <dynamics>
-                        <damping>100.000000</damping>
-                    </dynamics>
-                </axis>
-                <parent>
-                    <link_name>link1</link_name>
-                </parent>
-                <child>
-                    <link_name>link2</link_name>
-                </child>
-            </joint>
-            <joint name="joint2" type="revolute">
-                <physics>
-                    <ode>
-                        <provide_feedback>true</provide_feedback>
-                        <cfm_damping>true</cfm_damping>
-                    </ode>
-                </physics>
-                <axis>
-                    <xyz>0 1 0</xyz>
-                    <dynamics>
-                        <damping>30.000000</damping>
-                    </dynamics>
-                </axis>
-                <parent>
-                    <link_name>link2</link_name>
-                </parent>
-                <child>
-                    <link_name>link3</link_name>
-                </child>
-            </joint>
-        </model>
-    </world>
-</sdf>
diff --git a/sdf/worlds/heightmap.world b/sdf/worlds/heightmap.world
deleted file mode 100644
index 767fe15..0000000
--- a/sdf/worlds/heightmap.world
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <!-- A global light source -->
-    <include>
-      <uri>model://sun</uri>
-    </include>
-
-    <model name="heightmap">
-      <static>true</static>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <heightmap>
-              <uri>file://media/materials/textures/heightmap_bowl.png</uri>
-              <size>129 129 10</size>
-              <pos>0 0 0</pos>
-            </heightmap>
-          </geometry>
-        </collision>
-
-        <visual name="visual">
-          <geometry>
-            <heightmap>
-              <texture>
-                <diffuse>file://media/materials/textures/dirt_diffusespecular.png</diffuse>
-                <normal>file://media/materials/textures/flat_normal.png</normal>
-                <size>50</size>
-              </texture>
-              <texture>
-                <diffuse>file://media/materials/textures/grass_diffusespecular.png</diffuse>
-                <normal>file://media/materials/textures/flat_normal.png</normal>
-                <size>20</size>
-              </texture>
-              <texture>
-                <diffuse>file://media/materials/textures/fungus_diffusespecular.png</diffuse>
-                <normal>file://media/materials/textures/flat_normal.png</normal>
-                <size>80</size>
-              </texture>
-              <blend>
-                <min_height>2</min_height>
-                <fade_dist>5</fade_dist>
-              </blend>
-              <blend>
-                <min_height>4</min_height>
-                <fade_dist>5</fade_dist>
-              </blend>
-              <uri>file://media/materials/textures/heightmap_bowl.png</uri>
-              <size>129 129 10</size>
-              <pos>0 0 0</pos>
-            </heightmap>
-          </geometry>
-        </visual>
-
-      </link>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/joint_damping_demo.world b/sdf/worlds/joint_damping_demo.world
deleted file mode 100644
index fafcb22..0000000
--- a/sdf/worlds/joint_damping_demo.world
+++ /dev/null
@@ -1,635 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-    <world name="default">
-        <gui>
-            <camera name="user_camera">
-                <pose>-60 0 5 0 0 0</pose>
-            </camera>
-        </gui>
-        <scene>
-            <ambient>0.5 0.5 0.5 1</ambient>
-            <background>0.5 0.5 0.5 1</background>
-            <shadows>false</shadows>
-        </scene>
-        <include>
-            <uri>model://sun</uri>
-        </include>
-        <physics type="ode">
-            <gravity>0.0 0.0 -9.81</gravity>
-            <ode>
-                <solver>
-                    <type>quick</type>
-                    <dt>0.001</dt>
-                    <iters>100</iters>
-                    <sor>1.0</sor>
-                </solver>
-                <constraints>
-                    <cfm>0</cfm>
-                    <erp>1.0</erp>
-                    <contact_max_correcting_vel>0.0</contact_max_correcting_vel>
-                    <contact_surface_layer>0.0</contact_surface_layer>
-                </constraints>
-            </ode>
-        </physics>
-        <model name="model_1_mass_1_damping_10000">
-            <pose>0.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10000.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_2_mass_01_damping_10">
-            <pose>1.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>0.1</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_3_mass_1_damping_10">
-            <pose>2.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_4_mass_1_ixx_1_damping_10">
-            <pose>3.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>1.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_5_mass_1_damping_1">
-            <pose>4.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>1.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_6_mass_1_damping_10">
-            <pose>5.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_7_mass_1_damping_100">
-            <pose>6.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>100.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_8_mass_1_damping_1000">
-            <pose>7.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>1000.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_9_mass_1_damping_0">
-            <pose>8.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>0.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_10_mass_10_damping_0">
-            <pose>9.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>10.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>0.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-    </world>
-</sdf>
diff --git a/sdf/worlds/joints.world b/sdf/worlds/joints.world
deleted file mode 100644
index 7af8823..0000000
--- a/sdf/worlds/joints.world
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include>
-      <uri>model://ground_plane</uri>
-    </include>
-
-    <include>
-      <uri>model://sun</uri>
-    </include>
-
-    <model name="revolute_model">
-      <pose>0 0 0.5 0 0 0</pose>
-      <link name="body1">
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="geom">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <link name="body2">
-        <pose>0 0.5 2.0 0 0 0</pose>
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="geom">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <joint type="revolute" name="revolute_joint">
-        <pose>0 0 1 0 0 0</pose>
-        <parent>body2</parent>
-        <child>body1</child>
-        <axis>
-          <xyz>0 0 1</xyz>
-        </axis>
-      </joint>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/lights.world b/sdf/worlds/lights.world
deleted file mode 100644
index 4d5606c..0000000
--- a/sdf/worlds/lights.world
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <light type="point" name="point">
-      <pose>0 2 2 0 0 0</pose>
-      <diffuse>1 0 0 1</diffuse>
-      <specular>.1 .1 .1 1</specular>
-      <attenuation>
-        <range>20</range>
-        <linear>0.2</linear>
-        <constant>0.8</constant>
-        <quadratic>0.01</quadratic>
-      </attenuation>
-      <cast_shadows>false</cast_shadows>
-    </light>
-    <light type="point" name="point1">
-      <pose>0 1 2 0 0 0</pose>
-      <diffuse>0 1 0 1</diffuse>
-      <specular>.1 .1 .1 1</specular>
-      <attenuation>
-        <range>20</range>
-        <linear>0.2</linear>
-        <constant>0.8</constant>
-        <quadratic>0.01</quadratic>
-      </attenuation>
-      <cast_shadows>false</cast_shadows>
-    </light>
-    <light type="point" name="point2">
-      <pose>0 0 2 0 0 0</pose>
-      <diffuse>0 0 1 1</diffuse>
-      <specular>.1 .1 .1 1</specular>
-      <attenuation>
-        <range>20</range>
-        <linear>0.2</linear>
-        <constant>0.8</constant>
-        <quadratic>0.01</quadratic>
-      </attenuation>
-      <cast_shadows>false</cast_shadows>
-    </light>
-    <light type="spot" name="spot">
-      <pose>0 -1 2 0 0 0</pose>
-      <diffuse>0 1 0 1</diffuse>
-      <specular>.2 .2 .2 1</specular>
-      <attenuation>
-        <range>10</range>
-        <linear>0.01</linear>
-        <constant>0.2</constant>
-        <quadratic>0.0</quadratic>
-      </attenuation>
-      <direction>0 0 -1</direction>
-      <spot>
-        <inner_angle>0.1</inner_angle>
-        <outer_angle>0.5</outer_angle>
-        <falloff>1.2</falloff>
-      </spot>
-      <cast_shadows>false</cast_shadows>
-    </light>
-    <light type="directional" name="directional">
-      <pose>0 -2 2 0 0 0</pose>
-      <diffuse>0.2 0.2 .2 1</diffuse>
-      <specular>.1 .1 .1 1</specular>
-      <attenuation>
-        <range>100</range>
-        <linear>0.01</linear>
-        <constant>0.2</constant>
-        <quadratic>0.0</quadratic>
-      </attenuation>
-      <direction>0 0 -1</direction>
-      <cast_shadows>true</cast_shadows>
-    </light>
-  </world>
-</sdf>
diff --git a/sdf/worlds/max_vel_test.world b/sdf/worlds/max_vel_test.world
deleted file mode 100644
index 7142992..0000000
--- a/sdf/worlds/max_vel_test.world
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <scene>
-      <ambient>0.5 0.5 0.5 1</ambient>
-      <background>0.5 0.5 0.5 1</background>
-      <shadows>false</shadows>
-    </scene>
-    <include><uri>model://sun</uri></include>
-    <physics type="ode">
-      <gravity>0.0 0.0 -10.0</gravity>
-      <ode>
-        <solver>
-          <type>quick</type>
-          <dt>0.001</dt>
-          <iters>100</iters>
-          <sor>1.0</sor>
-        </solver>
-        <constraints>
-          <cfm>0</cfm>
-          <erp>0.2</erp>
-          <contact_max_correcting_vel>0</contact_max_correcting_vel>
-          <contact_surface_layer>0.0</contact_surface_layer>
-        </constraints>
-      </ode>
-    </physics>
-    <!-- model slides when cg is 0.3 0 0 -->
-    <model name="model_1">
-      <pose>0.5 -0.5 0.5 0.0 0.0 0.0</pose>
-      <link name="link_1">
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.45 0 0.0 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>1.0</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>1.0</iyy>
-            <iyz>0.0</iyz>
-            <izz>1.0</izz>
-          </inertia>
-          <mass>10000.0</mass>
-        </inertial>
-        <visual name="visual_box">
-          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/Green</script>
-          </material>
-          <laser_retro>100.0</laser_retro>
-        </visual>
-        <collision name="collision_box">
-          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>100.0</mu>
-                <mu2>100.0</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <kp>1000000000000.0</kp>
-                <kd>10000000000.0</kd>
-                <max_vel>0</max_vel>
-                <min_depth>0.0</min_depth>
-              </ode>
-            </contact>
-          </surface>
-          <laser_retro>100.0</laser_retro>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <static>false</static>
-    </model>
-    <!-- by shifting cg down, the block will not slide.
-         coupling of box rotation and the moment arm about contact points
-    <model name="model_2" static="false">
-
-      <origin pose="0.5 1.5 0.5 0 0.0 0.0"/>
-
-      <link name="link_1" self_collide="true" gravity="true" kinematic="false">
-
-        <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-
-        <inertial mass="10000.0">
-          <origin pose="0.45 0.0 -0.5 0.0 0.0 0.0"/>
-          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
-                   iyy="1.0" iyz="0.0"
-                   izz="1.0"/>
-        </inertial>
-
-        <visual name="visual_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <box size="1 1 1"/>
-          </geometry>
-          <material script="Gazebo/Green"/>
-        </visual>
-
-        <collision name="collision_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <box size="1 1 1"/>
-          </geometry>
-          <surface>
-            <contact>
-              <ode kp="1000000000000.0" kd="100000000.0" max_vel="0"/>
-            </contact>
-          </surface>
-        </collision>
-
-      </link>
-
-    </model>
-    -->
-  </world>
-</sdf>
diff --git a/sdf/worlds/model_nesting.world b/sdf/worlds/model_nesting.world
deleted file mode 100644
index b223711..0000000
--- a/sdf/worlds/model_nesting.world
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <!-- Ground -->
-    <include><uri>model://ground_plane</uri></include>
-    <!-- A global light source -->
-    <include><uri>model://sun</uri></include>
-    <!-- Pioneer2dx model with a hokuyo laser and camera-->
-    <model name="pioneer2dx">
-      <include filename="pioneer2dx.model" />
-      <include filename="hokuyo.model" model_pose="0.2 0 0.3 0 0 0" />
-      <include filename="camera.model" model_pose="0.2 0 0.5 0 0 0" />
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/pioneer2dx.world b/sdf/worlds/pioneer2dx.world
deleted file mode 100644
index 70312bf..0000000
--- a/sdf/worlds/pioneer2dx.world
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <!-- Ground -->
-    <include>
-      <uri>model://ground_plane</uri>
-    </include>
-
-    <!-- Pioneer2dx model -->
-    <include>
-      <uri>model://pioneer2dx</uri>
-    </include>
-
-    <!-- A global light source -->
-    <include>
-      <uri>model://sun</uri>
-    </include>
-
-  </world>
-</sdf>
diff --git a/sdf/worlds/plugin.world b/sdf/worlds/plugin.world
deleted file mode 100644
index b7b8735..0000000
--- a/sdf/worlds/plugin.world
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <plugin name="world_edit" filename="libworld_edit.so" />
-    <include><uri>model://ground_plane</uri></include>
-    <include><uri>model://sun</uri></include>
-    <model name="box_model">
-      <pose>0 0 0.5 0 0 0</pose>
-      <link name="body">
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="geom">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>0</mu>
-                <mu2>0</mu2>
-              </ode>
-            </friction>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-      <plugin name="my_plugin" filename="libmodel_push.so" />
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/pr2.world b/sdf/worlds/pr2.world
deleted file mode 100644
index e0c47f0..0000000
--- a/sdf/worlds/pr2.world
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include>
-      <uri>model://ground_plane</uri>
-    </include>
-    <include>
-      <uri>model://sun</uri>
-    </include>
-    <include>
-      <uri>model://pr2</uri>
-    </include>
-  </world>
-</sdf>
diff --git a/sdf/worlds/presentation.world b/sdf/worlds/presentation.world
deleted file mode 100644
index 0992f5f..0000000
--- a/sdf/worlds/presentation.world
+++ /dev/null
@@ -1,602 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <scene>
-      <ambient>0.1 0.1 0.1 1</ambient>
-      <background>1 1 1 1</background>
-      <shadows>false</shadows>
-      <grid>false</grid>
-    </scene>
-    <!--<gui fullscreen="true">
-      <camera name="user_camera">
-        <view_controller type="orbit"/>
-        <pose pose="0 0 5 0 -1.5707 0"/>
-      </camera>
-    </gui>
-    -->
-    <physics type="ode">
-      <gravity>0 0 -9.8</gravity>
-      <ode>
-        <solver>
-          <type>quick</type>
-          <dt>0.001</dt>
-          <iters>10</iters>
-          <sor>1.3</sor>
-        </solver>
-        <constraints>
-          <cfm>0.0</cfm>
-          <erp>0.2</erp>
-          <contact_max_correcting_vel>100.0</contact_max_correcting_vel>
-          <contact_surface_layer>0.001</contact_surface_layer>
-        </constraints>
-      </ode>
-    </physics>
-    <!-- Ground Plane -->
-    <model name="plane1_model">
-      <link name="body">
-        <collision name="geom_1">
-          <geometry>
-            <plane>
-              <normal>0 0 1</normal>
-            </plane>
-          </geometry>
-        </collision>
-        <visual name="visual_1">
-          <geometry>
-            <plane>
-              <normal>0 0 1</normal>
-            </plane>
-          </geometry>
-          <material>
-            <script>Gazebo/Grey</script>
-          </material>
-          <cast_shadows>false</cast_shadows>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide1">
-      <pose>0 0 0 0 0 0</pose>
-      <link name="link">
-        <pose pose="0 0 0.1 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>3 4 0.2</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>3 4 0.2</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide1</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide2">
-      <pose>1 0 0.201 0 0 0</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide2</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide3">
-      <pose>0.95 -0.05 0.201 0 0 -1.5707</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide3</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide4">
-      <pose>0.95 -0.07 0.201 0 0 -1.5707</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide4</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide5">
-      <pose>0.95 -0.09 0.201 0 0 -1.5707</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide5</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide6">
-      <pose>0.95 -0.11 0.201 0 0 -1.5707</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide6</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide7">
-      <pose>0.91 -0.11 0.2011 0 0 -1.5707</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide7</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide8">
-      <pose>10 10 0 0 0 0</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>3 4 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>3 4 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide8</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide9">
-      <pose>10.2 9.78 0.005 0 0 0</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide9</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide10">
-      <pose>10.20 9.74 0.005 0 0 0</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide10</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide11">
-      <pose>9.93 9.07 0.005 0 0 0</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide11</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide12">
-      <pose>9.69 8.21 0.005 0 0 0</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide12</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide13">
-      <pose>9.43 8.93 0.005 0 0 0</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>.03 .04 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide13</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide14">
-      <pose>7 14 0.005 0 0 1.5707</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>3 4 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>3 4 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide14</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="slide15">
-      <pose>3 10 0.005 0 0 3.1415</pose>
-      <link name="link">
-        <pose pose="0 0 0.0005 0 0 0" />
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="c">
-          <geometry>
-            <box>
-              <size>3 4 0.001</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="v">
-          <geometry>
-            <box>
-              <size>3 4 0.001</size>
-            </box>
-          </geometry>
-          <material>
-            <script>nate/slide15</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-    <!--
-    <light type="point" name="point_light" cast_shadows="false">
-      <pose pose="-5 -2 5 0 0 0"/>
-      <diffuse rgba=".4 .4 .4 1"/>
-      <specular rgba=".2 .2 .2 1"/>
-      <attenuation range="20" constant="0.9" linear="0.01" quadratic="0.001"/>
-    </light>
-    -->
-    <light type="directional" name="my_light">
-      <pose>0 0 10 0 0 0</pose>
-      <diffuse>.9 .9 .9 1</diffuse>
-      <specular>.1 .1 .1 1</specular>
-      <attenuation>
-        <range>20</range>
-      </attenuation>
-      <direction>0 0 -1</direction>
-      <cast_shadows>false</cast_shadows>
-    </light>
-  </world>
-</sdf>
diff --git a/sdf/worlds/projector.world b/sdf/worlds/projector.world
deleted file mode 100644
index 63e4d57..0000000
--- a/sdf/worlds/projector.world
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <include><uri>model://sun</uri></include>
-    <model name="projector_model">
-      <pose>0 0 1 0.0 0.0 0</pose>
-      <link name="projector_link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Grey</script>
-          </material>
-        </visual>
-        <projector name="texture_projector">
-          <pose>0 0 0 0 -1.5707 0</pose>
-          <texture>stereo_projection_pattern_high_res_red.png</texture>
-          <fov>0.959931088597</fov>
-          <near_clip>0.1</near_clip>
-          <far_clip>10</far_clip>
-        </projector>
-      </link>
-      <static>true</static>
-    </model>
-    <model name="texture_test_model">
-      <pose>3 0 1 0.0 0.0 0</pose>
-      <link name="texture_test_link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Grey</script>
-          </material>
-        </visual>
-      </link>
-      <static>true</static>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/ray_test.world b/sdf/worlds/ray_test.world
deleted file mode 100644
index a07232a..0000000
--- a/sdf/worlds/ray_test.world
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-
-    <!-- A ground plane -->
-    <include>
-      <uri>model://ground_plane</uri>
-    </include>
-
-    <!-- A global light source -->
-    <include>
-      <uri>model://sun</uri>
-    </include>
-
-    <!-- a static object -->
-    <model name="cylinder_model">
-      <static>true</static>
-      <link name="cylinder_link">
-        <visual name="cylinder_visual">
-          <pose>0 0 0.5 0 0 0</pose>
-          <geometry>
-            <cylinder>
-              <radius>0.5</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-        </visual>
-        <collision name="cylinder_collision">
-          <pose>0 0 0.5 0 0 0</pose>
-          <geometry>
-            <cylinder>
-              <radius>0.5</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-      </link>
-    </model>
-
-    <!-- a non-static object -->
-    <model name="box_model">
-      <static>false</static>
-      <pose>0 0.8 0 0 0 0</pose>
-      <link name="box_link">
-        <visual name="box_visual">
-          <pose>0 0 0.5 0 0 0</pose>
-          <geometry>
-            <box>
-            <size>1.0 1.0 1.0</size>
-            </box>
-          </geometry>
-        </visual>
-        <collision name="box_collision">
-          <pose>0 0 0.5 0 0 0</pose>
-          <geometry>
-            <box>
-            <size>1.0 1.0 1.0</size>
-            </box>
-          </geometry>
-        </collision>
-      </link>
-    </model>
-
-    <!-- a ray sensor -->
-    <include>
-      <uri>model://hokuyo</uri>
-      <pose>-1.0 0 0.5 0 0 0</pose>
-    </include>
-  </world>
-</sdf>
diff --git a/sdf/worlds/revolute_joint_test.world b/sdf/worlds/revolute_joint_test.world
deleted file mode 100644
index 90a8ee0..0000000
--- a/sdf/worlds/revolute_joint_test.world
+++ /dev/null
@@ -1,56 +0,0 @@
-<sdf version="1.3">
-  <world name="default">
-
-    <include><uri>model://sun</uri></include>
-    <include><uri>model://ground_plane</uri></include>
-  
-    <include>
-      <uri>model://double_pendulum_with_base</uri>
-      <name>pendulum_0deg</name>
-      <pose>0 2.1 0  0 0 0</pose>
-    </include>
-
-    <include>
-      <uri>model://double_pendulum_with_base</uri>
-      <name>pendulum_180deg</name>
-      <pose>0 -2.1 0  0 0 3.1416</pose>
-    </include>
-
-    <include>
-      <uri>model://double_pendulum_with_base</uri>
-      <name>pendulum_90deg</name>
-      <pose>-2.1 0 0  0 0 1.5708</pose>
-    </include>
-
-    <include>
-      <uri>model://double_pendulum_with_base</uri>
-      <name>pendulum_270deg</name>
-      <pose>2.1 0 0  0 0 -1.5708</pose>
-    </include>
-
-    <include>
-      <uri>model://double_pendulum_with_base</uri>
-      <name>pendulum_315deg</name>
-      <pose>1.48 1.48 0  0 0 -0.7854</pose>
-    </include>
-
-    <include>
-      <uri>model://double_pendulum_with_base</uri>
-      <name>pendulum_225deg</name>
-      <pose>1.48 -1.48 0  0 0 -2.3562</pose>
-      <pose>0 -2.1 0  0 0 </pose>
-    </include>
-
-    <include>
-      <uri>model://double_pendulum_with_base</uri>
-      <name>pendulum_135deg</name>
-      <pose>-1.48 -1.48 0  0 0 2.3562</pose>
-    </include>
-
-    <include>
-      <uri>model://double_pendulum_with_base</uri>
-      <name>pendulum_45deg</name>
-      <pose>-1.48 1.48 0  0 0 0.7854</pose>
-    </include>
-  </world>
-</sdf>
diff --git a/sdf/worlds/road.world b/sdf/worlds/road.world
deleted file mode 100644
index a2337e0..0000000
--- a/sdf/worlds/road.world
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <scene>
-      <grid>false</grid>
-    </scene>
-    <!-- A global light source -->
-    <include><uri>model://sun</uri></include>
-    <!-- Invisible ground plane -->
-    <model name="ground">
-      <link name="body">
-        <collision name="geom">
-          <geometry>
-            <plane>
-              <normal>0 0 1</normal>
-            </plane>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>100</mu>
-                <mu2>50</mu2>
-              </ode>
-            </friction>
-          </surface>
-        </collision>
-      </link>
-      <static>true</static>
-    </model>
-    <road name="my_road">
-      <width>7.34</width>
-      <point>0 0 0</point>
-      <point>100 0 0</point>
-    </road>
-  </world>
-</sdf>
diff --git a/sdf/worlds/rubble.world b/sdf/worlds/rubble.world
deleted file mode 100644
index 8c1f48c..0000000
--- a/sdf/worlds/rubble.world
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-
-    <!-- A ground plane -->
-    <include>
-      <uri>model://ground_plane</uri>
-    </include>
-
-    <!-- A global light source -->
-    <include>
-      <uri>model://sun</uri>
-    </include>
-
-    <plugin filename="libRubblePlugin.so" name="rubble">
-      <bottom_right>-.5 -1 0.0</bottom_right>
-      <top_left>0.5 1.0 0.4</top_left>
-      <min_size>0.05 0.05 0.05</min_size>
-      <max_size>0.2 0.2 0.2</max_size>
-      <min_mass>0.1</min_mass>
-      <max_mass>1.0</max_mass>
-      <count>100</count>
-    </plugin>
-
-    <model name="right_wall">
-      <static>true</static>
-      <pose>0 -1.1 0.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <box><size>5 0.2 1.0</size></box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box><size>5 0.2 1.0</size></box>
-          </geometry>
-          <material>
-            <script>
-              <uri>file://media/materials/scripts/gazebo.material</uri>
-              <name>Gazebo/Wood</name>
-            </script>
-          </material>
-        </visual>
-      </link>
-    </model>
-
-    <model name="left_wall">
-      <static>true</static>
-      <pose>0 1.1 0.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <box><size>5 0.2 1.0</size></box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box><size>5 0.2 1.0</size></box>
-          </geometry>
-          <material>
-            <script>
-              <uri>file://media/materials/scripts/gazebo.material</uri>
-              <name>Gazebo/Wood</name>
-            </script>
-          </material>
-        </visual>
-      </link>
-    </model>
-
-  </world>
-</sdf>
diff --git a/sdf/worlds/shapes.world b/sdf/worlds/shapes.world
deleted file mode 100644
index 21fefd3..0000000
--- a/sdf/worlds/shapes.world
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <include><uri>model://sun</uri></include>
-    <model name="box">
-      <pose>0 0 0.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-
-    <model name="sphere">
-      <pose>0 1.5 0.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-
-    <model name="cylinder">
-      <pose>0 -1.5 0.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.5</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.5</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/simple_gripper.world b/sdf/worlds/simple_gripper.world
deleted file mode 100644
index 0b7e134..0000000
--- a/sdf/worlds/simple_gripper.world
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-      <scene>
-        <grid>false</grid>
-        <background>1 1 1 1</background>
-        <ambient>0.5 0.5 0.5 1</ambient>
-      </scene>
-      <physics type="ode">
-        <gravity>0 0 -9.8</gravity>
-        <ode>
-          <solver>
-            <type>quick</type>
-            <dt>0.001</dt>
-            <iters>10</iters>
-            <sor>1.0</sor>
-          </solver>
-          <constraints>
-            <cfm>0.0</cfm>
-            <erp>0.01</erp>
-            <contact_max_correcting_vel>0.0</contact_max_correcting_vel>
-            <contact_surface_layer>0.001</contact_surface_layer>
-          </constraints>
-        </ode>
-      </physics>
-      <!-- A ground plane -->
-      <include filename="ground_plane.model"/>
-      <!-- A global light source -->
-      <include filename="sun.light" />
-      <include filename="simple_arm.model" />
-      <include filename="cylinder.model" model_pose="1.0 1.0 0 0 0 0"/>
-      <include filename="camera.model" model_pose="-1.0 -1.0 0.5 0 0 0.7071"/>
-      <include filename="hokuyo.model" model_pose="-1.0 -1.0 0.3 0 0 0.7071"/>
-    </world>
-  </sdf>
diff --git a/sdf/worlds/spring_test.world b/sdf/worlds/spring_test.world
deleted file mode 100644
index 95c3aeb..0000000
--- a/sdf/worlds/spring_test.world
+++ /dev/null
@@ -1,486 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <scene>
-      <ambient>0.5 0.5 0.5 1</ambient>
-      <background>0.5 0.5 0.5 1</background>
-      <shadows>false</shadows>
-    </scene>
-    <include><uri>model://sun</uri></include>
-    <physics type="ode">
-      <gravity>0.0 0.0 -10.0</gravity>
-      <ode>
-        <solver>
-          <type>quick</type>
-          <dt>0.001</dt>
-          <iters>100</iters>
-          <sor>1.3</sor>
-        </solver>
-        <constraints>
-          <cfm>0.0</cfm>
-          <erp>1.0</erp>
-          <contact_max_correcting_vel>1000.0</contact_max_correcting_vel>
-          <contact_surface_layer>0.0</contact_surface_layer>
-        </constraints>
-      </ode>
-      <update_rate>300</update_rate>
-    </physics>
-    <!-- a test of spring, see reference from ODE discussion
-      http://www.ode.org/old_list_archives/2006-March/018014.html
-      where stiffness and damping are related to joint limit cfm and erp
-      public static void Calc(float springConstant, float dampingCofficient, float
-      sprungMass, out float erp, out float cfm)
-      {
-                  float r = 2.0f * dampingCofficient * (float)Math.Sqrt(sprungMass
-      * springConstant);
-                  float hk = Scene.OdeTimeStep * springConstant;
-
-                  erp = hk / (hk + r);
-                  cfm = 1.0f / (hk + r);
-      }
-      in the end,
-      erp = dt * kp / ( dt * kp + kd )
-      cfm = 1 / ( dt * kp + kd )
-    -->
-    <model name="model_0">
-      <pose>0.0 0.0 2.1 0 0.0 0.0</pose>
-      <link name="link_1">
-        <velocity_decay>
-          <linear>0.0</linear>
-          <angular>0.0</angular>
-        </velocity_decay>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>0.01</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>0.01</iyy>
-            <iyz>0.0</iyz>
-            <izz>0.01</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <visual name="visual_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Red</script>
-          </material>
-          <laser_retro>100.0</laser_retro>
-        </visual>
-        <collision name="collision_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>0.5</mu>
-                <mu2>0.2</mu2>
-                <fdir1>1.0 0 0</fdir1>
-                <slip1>0</slip1>
-                <slip2>0</slip2>
-              </ode>
-            </friction>
-            <bounce>
-              <restitution_coefficient>0</restitution_coefficient>
-              <threshold>1000000.0</threshold>
-            </bounce>
-            <contact>
-              <ode>
-                <soft_cfm>0</soft_cfm>
-                <kp>1e15</kp>
-                <kd>1e13</kd>
-                <max_vel>100.0</max_vel>
-                <min_depth>0.0001</min_depth>
-              </ode>
-            </contact>
-          </surface>
-          <laser_retro>100.0</laser_retro>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <joint name="joint_0" type="prismatic">
-        <parent>world</parent>
-        <child>link_1</child>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <axis>
-          <limit lower="0" upper="0" effort="1000" velocity="1000" />
-          <xyz>0.0 0.0 1.0</xyz>
-        </axis>
-        <physics>
-          <ode>
-            <cfm>0.0</cfm>
-            <bounce>0.0</bounce>
-            <max_force>1000.0</max_force>
-            <velocity>0.0</velocity>
-            <fudge_factor>0.0</fudge_factor>
-            <limit cfm="0.0" erp="0.2" />
-            <!--<suspension cfm="0.0" erp="0.2"/>-->
-          </ode>
-        </physics>
-      </joint>
-      <static>false</static>
-    </model>
-    <model name="model_1">
-      <pose>0.0 0.3 2.1 0 0.0 0.0</pose>
-      <link name="link_1">
-        <velocity_decay>
-          <linear>0.0</linear>
-          <angular>0.0</angular>
-        </velocity_decay>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>0.01</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>0.01</iyy>
-            <iyz>0.0</iyz>
-            <izz>0.01</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <visual name="visual_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Red</script>
-          </material>
-          <laser_retro>100.0</laser_retro>
-        </visual>
-        <collision name="collision_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>0.5</mu>
-                <mu2>0.2</mu2>
-                <fdir1>1.0 0 0</fdir1>
-                <slip1>0</slip1>
-                <slip2>0</slip2>
-              </ode>
-            </friction>
-            <bounce>
-              <restitution_coefficient>0</restitution_coefficient>
-              <threshold>1000000.0</threshold>
-            </bounce>
-            <contact>
-              <ode>
-                <soft_cfm>0</soft_cfm>
-                <kp>1e15</kp>
-                <kd>1e13</kd>
-                <max_vel>100.0</max_vel>
-                <min_depth>0.0001</min_depth>
-              </ode>
-            </contact>
-          </surface>
-          <laser_retro>100.0</laser_retro>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <joint name="joint_0" type="prismatic">
-        <parent>world</parent>
-        <child>link_1</child>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <axis>
-          <limit lower="0" upper="0" effort="1000" velocity="1000" />
-          <xyz>0.0 0.0 1.0</xyz>
-        </axis>
-        <physics>
-          <ode>
-            <cfm>0.0</cfm>
-            <bounce>0.0</bounce>
-            <max_force>1000.0</max_force>
-            <velocity>0.0</velocity>
-            <fudge_factor>0.0</fudge_factor>
-            <limit cfm="3.0" erp="1.0" />
-            <!--<suspension cfm="0.0" erp="0.2"/>-->
-          </ode>
-        </physics>
-      </joint>
-      <static>false</static>
-    </model>
-    <model name="model_2">
-      <pose>0.0 0.6 2.1 0 0.0 0.0</pose>
-      <link name="link_1">
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>0.01</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>0.01</iyy>
-            <iyz>0.0</iyz>
-            <izz>0.01</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <visual name="visual_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Red</script>
-          </material>
-          <laser_retro>100.0</laser_retro>
-        </visual>
-        <collision name="collision_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>0.5</mu>
-                <mu2>0.2</mu2>
-                <fdir1>1.0 0 0</fdir1>
-                <slip1>0</slip1>
-                <slip2>0</slip2>
-              </ode>
-            </friction>
-            <bounce>
-              <restitution_coefficient>0</restitution_coefficient>
-              <threshold>1000000.0</threshold>
-            </bounce>
-            <contact>
-              <ode>
-                <soft_cfm>0</soft_cfm>
-                <kp>1e15</kp>
-                <kd>1e13</kd>
-                <max_vel>100.0</max_vel>
-                <min_depth>0.0001</min_depth>
-              </ode>
-            </contact>
-          </surface>
-          <laser_retro>100.0</laser_retro>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <joint name="joint_0" type="prismatic">
-        <parent>world</parent>
-        <child>link_1</child>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <axis>
-          <limit lower="0" upper="0" effort="1000" velocity="1000" />
-          <xyz>0.0 0.0 1.0</xyz>
-        </axis>
-        <physics>
-          <ode>
-            <cfm>0.0</cfm>
-            <bounce>0.0</bounce>
-            <max_force>1000.0</max_force>
-            <velocity>0.0</velocity>
-            <fudge_factor>0.0</fudge_factor>
-            <limit cfm="6.0" erp="1.0" />
-            <!--<suspension cfm="0.0" erp="0.2"/>-->
-          </ode>
-        </physics>
-      </joint>
-      <static>false</static>
-    </model>
-    <model name="model_3">
-      <pose>0.0 0.9 2.1 0 0.0 0.0</pose>
-      <link name="link_1">
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>0.01</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>0.01</iyy>
-            <iyz>0.0</iyz>
-            <izz>0.01</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <visual name="visual_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Red</script>
-          </material>
-          <laser_retro>100.0</laser_retro>
-        </visual>
-        <collision name="collision_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>0.5</mu>
-                <mu2>0.2</mu2>
-                <fdir1>1.0 0 0</fdir1>
-                <slip1>0</slip1>
-                <slip2>0</slip2>
-              </ode>
-            </friction>
-            <bounce>
-              <restitution_coefficient>0</restitution_coefficient>
-              <threshold>1000000.0</threshold>
-            </bounce>
-            <contact>
-              <ode>
-                <soft_cfm>0</soft_cfm>
-                <kp>1e15</kp>
-                <kd>1e13</kd>
-                <max_vel>100.0</max_vel>
-                <min_depth>0.0001</min_depth>
-              </ode>
-            </contact>
-          </surface>
-          <laser_retro>100.0</laser_retro>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <joint name="joint_0" type="prismatic">
-        <parent>world</parent>
-        <child>link_1</child>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <axis>
-          <limit lower="0" upper="0" effort="1000" velocity="1000" />
-          <xyz>0.0 0.0 1.0</xyz>
-        </axis>
-        <physics>
-          <ode>
-            <cfm>0.0</cfm>
-            <bounce>0.0</bounce>
-            <max_force>1000.0</max_force>
-            <velocity>0.0</velocity>
-            <fudge_factor>0.0</fudge_factor>
-            <limit cfm="9.0" erp="1.0" />
-            <!--<suspension cfm="0.0" erp="0.2"/>-->
-          </ode>
-        </physics>
-      </joint>
-      <static>false</static>
-    </model>
-    <model name="model_4">
-      <pose>0.0 1.2 2.1 0 0.0 0.0</pose>
-      <link name="link_1">
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>0.01</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>0.01</iyy>
-            <iyz>0.0</iyz>
-            <izz>0.01</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <visual name="visual_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Red</script>
-          </material>
-          <laser_retro>100.0</laser_retro>
-        </visual>
-        <collision name="collision_sphere">
-          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>0.5</mu>
-                <mu2>0.2</mu2>
-                <fdir1>1.0 0 0</fdir1>
-                <slip1>0</slip1>
-                <slip2>0</slip2>
-              </ode>
-            </friction>
-            <bounce>
-              <restitution_coefficient>0</restitution_coefficient>
-              <threshold>1000000.0</threshold>
-            </bounce>
-            <contact>
-              <ode>
-                <soft_cfm>0</soft_cfm>
-                <kp>1e15</kp>
-                <kd>1e13</kd>
-                <max_vel>100.0</max_vel>
-                <min_depth>0.0001</min_depth>
-              </ode>
-            </contact>
-          </surface>
-          <laser_retro>100.0</laser_retro>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <joint name="joint_0" type="prismatic">
-        <parent>world</parent>
-        <child>link_1</child>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <axis>
-          <limit lower="-1.0" upper="1.0" effort="1000" velocity="1000" />
-          <xyz>0.0 0.0 1.0</xyz>
-        </axis>
-      </joint>
-      <plugin name="spring_test" filename="libSpringTestPlugin.so">
-        <k>111.1111</k>
-      </plugin>
-      <static>false</static>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/stacks.world b/sdf/worlds/stacks.world
deleted file mode 100644
index 4e9f80e..0000000
--- a/sdf/worlds/stacks.world
+++ /dev/null
@@ -1,498 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <include><uri>model://sun</uri></include>
-
-    <model name="box_1">
-      <pose>0 0 .5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="box_2">
-      <pose>0 0 1.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="box_3">
-      <pose>0 0 2.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="box_4">
-      <pose>0 0 3.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="box_5">
-      <pose>0 0 4.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_1">
-      <pose>0 1.5 0.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <contact>
-              <ode>
-                <soft_erp>1.0</soft_erp>
-                <max_vel>0</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_2">
-      <pose>0 1.5 1.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <contact>
-              <ode>
-                <soft_erp>1.0</soft_erp>
-                <max_vel>0</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_3">
-      <pose>0 1.5 2.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <contact>
-              <ode>
-                <soft_erp>1.0</soft_erp>
-                <max_vel>0</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_4">
-      <pose>0 1.5 3.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <contact>
-              <ode>
-                <soft_erp>1.0</soft_erp>
-                <max_vel>0</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_5">
-      <pose>0 1.5 4.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <contact>
-              <ode>
-                <soft_erp>1.0</soft_erp>
-                <max_vel>0</max_vel>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_1a">
-      <pose>1.5 1.5 0.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_2a">
-      <pose>1.5 1.5 1.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_3a">
-      <pose>1.5 1.5 2.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_4a">
-      <pose>1.5 1.5 3.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere_5a">
-      <pose>1.5 1.5 4.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="cylinder_1">
-      <pose>0 -1.5 0.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="cylinder_2">
-      <pose>0 -1.5 1.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="cylinder_3">
-      <pose>0 -1.5 2.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="cylinder_4">
-      <pose>0 -1.5 3.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="cylinder_5">
-      <pose>0 -1.5 4.5 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/trigger.world b/sdf/worlds/trigger.world
deleted file mode 100644
index 5e65868..0000000
--- a/sdf/worlds/trigger.world
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <!-- A ground plane -->
-    <include><uri>model://ground_plane</uri></include>
-    <!-- A global light source -->
-    <include><uri>model://sun</uri></include>
-    <plugin filename="libTriggerPlugin.so" name="trigger">
-      <point>0 0 0</point>
-      <radius>5</radius>
-    </plugin>
-    <model name="sphere">
-      <pose>0 0 10.0 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <mass>1</mass>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Grey</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="box">
-      <pose>1 0 50.0 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <mass>1</mass>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Grey</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="cylinder">
-      <pose>5 0 50.0 0 0 0</pose>
-      <link name="link">
-        <collision name="collision">
-          <mass>1</mass>
-          <geometry>
-            <sphere>
-              <radius>0.2</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.2</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Grey</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-  </world>
-</sdf>
diff --git a/sdf/worlds/trimesh_test.world b/sdf/worlds/trimesh_test.world
deleted file mode 100644
index 8aee19d..0000000
--- a/sdf/worlds/trimesh_test.world
+++ /dev/null
@@ -1,184 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <scene>
-      <ambient>1.0 1.0 1.0 1</ambient>
-      <background>0 0 0 1.0</background>
-      <shadows>true</shadows>
-    </scene>
-    <physics type="ode">
-      <gravity>0 0 -10.0</gravity>
-      <ode>
-        <solver>
-          <type>quick</type>
-          <dt>0.001</dt>
-          <iters>1000</iters>
-          <sor>1.3</sor>
-        </solver>
-        <constraints>
-          <cfm>0.0</cfm>
-          <erp>1.0</erp>
-          <contact_max_correcting_vel>0.0</contact_max_correcting_vel>
-          <contact_surface_layer>0.0</contact_surface_layer>
-        </constraints>
-      </ode>
-    </physics>
-    <include><uri>model://ground_plane</uri></include>
-    <model name="box">
-      <pose>0 0 10.5 0 0 0</pose>
-      <link name="link">
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>0</max_vel>
-                <min_depth>0</min_depth>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="sphere">
-      <pose>0 1.5 10.5 0 0 0</pose>
-      <link name="link">
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>0</max_vel>
-                <min_depth>0</min_depth>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <sphere>
-              <radius>0.5</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <model name="cylinder">
-      <pose>0 -1.5 10.5 0 0 0</pose>
-      <link name="link">
-        <inertial>
-          <inertia>
-            <ixx>1</ixx>
-            <ixy>0</ixy>
-            <ixz>0</ixz>
-            <iyy>1</iyy>
-            <iyz>0</iyz>
-            <izz>1</izz>
-          </inertia>
-          <mass>1.0</mass>
-        </inertial>
-        <collision name="collision">
-          <geometry>
-            <cylinder>
-              <radius>0.5</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-          <surface>
-            <friction>
-              <ode>
-                <mu>1</mu>
-                <mu2>1</mu2>
-              </ode>
-            </friction>
-            <contact>
-              <ode>
-                <max_vel>0</max_vel>
-                <min_depth>0</min_depth>
-              </ode>
-            </contact>
-          </surface>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <cylinder>
-              <radius>0.5</radius>
-              <length>1.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/WoodPallet</script>
-          </material>
-        </visual>
-      </link>
-    </model>
-    <light type="directional" name="sun">
-      <pose>0 0 10 0 0 0</pose>
-      <diffuse>.8 .8 .8 1</diffuse>
-      <specular>.1 .1 .1 1</specular>
-      <attenuation>
-        <range>10</range>
-        <linear>0.01</linear>
-        <constant>0.8</constant>
-        <quadratic>0.0</quadratic>
-      </attenuation>
-      <direction>0 .5 -.5</direction>
-      <cast_shadows>true</cast_shadows>
-    </light>
-  </world>
-</sdf>
diff --git a/sdf/worlds/two_actors.world b/sdf/worlds/two_actors.world
deleted file mode 100644
index be57f38..0000000
--- a/sdf/worlds/two_actors.world
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <light type="directional" name="sun">
-      <pose>0 0 100 0 0 0</pose>
-      <diffuse>0.5 0.5 0.5 1</diffuse>
-      <specular>0.2 0.2 0.2 1</specular>
-      <attenuation>
-        <range>100</range>
-        <linear>0.01</linear>
-        <constant>0.8</constant>
-        <quadratic>0.0</quadratic>
-      </attenuation>
-      <direction>0.0 0.2 -8.0</direction>
-      <cast_shadows>true</cast_shadows>
-    </light>
-    <actor name="actor1" static="true">
-      <pose>0 0 0 0 0 0</pose>
-      <skin>
-        <filename>talk_a.dae</filename>
-        <scale>1.0</scale>
-      </skin>
-      <script>
-        <loop>true</loop>
-        <delay_start>0.0</delay_start>
-        <auto_start>true</auto_start>
-      </script>
-    </actor>
-    <actor name="actor2" static="true">
-      <pose>0 0 0 0 0 0</pose>
-      <skin>
-        <filename>talk_b.dae</filename>
-        <scale>1.0</scale>
-      </skin>
-      <script>
-        <loop>true</loop>
-        <delay_start>0.0</delay_start>
-        <auto_start>true</auto_start>
-      </script>
-    </actor>
-  </world>
-</sdf>
diff --git a/sdf/worlds/weshare2012.world b/sdf/worlds/weshare2012.world
deleted file mode 100644
index b3d62ba..0000000
--- a/sdf/worlds/weshare2012.world
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include><uri>model://ground_plane</uri></include>
-    <include><uri>model://sun</uri></include>
-    <include filename="weshare2012_pioneer.model" />
-    <include filename="weshare2012_apartment.model" />
-  </world>
-</sdf>
diff --git a/sdf/worlds/willowgarage.world b/sdf/worlds/willowgarage.world
deleted file mode 100644
index 012037b..0000000
--- a/sdf/worlds/willowgarage.world
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <include>
-      <uri>model://ground_plane</uri>
-    </include>
-
-    <include>
-      <uri>model://sun</uri>
-    </include>
-
-    <include>
-      <uri>model://willowgarage</uri>
-    </include>
-  </world>
-</sdf>
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 95da95f..41bed2a 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,9 +1,8 @@
 include_directories (
-  ${PROJECT_SOURCE_DIR}/gazebo
-  ${PROJECT_BINARY_DIR}/gazebo
   ${ODE_INCLUDE_DIRS}
   ${OPENGL_INCLUDE_DIR}
   ${OGRE_INCLUDE_DIRS}
+  ${SDF_INCLUDE_DIRS}
   ${Boost_INCLUDE_DIRS}
   ${PROJECT_SOURCE_DIR}/test/gtest/include
   ${PROJECT_SOURCE_DIR}/test/gtest
@@ -14,18 +13,12 @@ link_directories(
   ${ogre_library_dirs}
   ${Boost_LIBRARY_DIRS}
   ${ODE_LIBRARY_DIRS}
+  ${SDF_LIBRARY_DIRS}
 )
 
-if(HAVE_URDFDOM_HEADERS)
-  link_directories(
-    ${urdfdom_LIBRARY_DIRS}
-    ${urdfdom_headers_LIBRARY_DIRS})
-endif(HAVE_URDFDOM_HEADERS)
-
-if(HAVE_CONSOLE_BRIDGE)
-  link_directories(
-    ${console_bridge_LIBRARY_DIRS})
-endif(HAVE_CONSOLE_BRIDGE)
+if (HAVE_BULLET)
+  link_directories(${BULLET_LIBRARY_DIRS})
+endif()
 
 configure_file (test_config.h.in ${PROJECT_BINARY_DIR}/test_config.h)
 
@@ -36,8 +29,33 @@ target_link_libraries(gtest_main gtest)
 set(GTEST_LIBRARY "${PROJECT_BINARY_DIR}/test/libgtest.a")
 set(GTEST_MAIN_LIBRARY "${PROJECT_BINARY_DIR}/test/libgtest_main.a")
 
+# Build static ServerFixture library
+set(ServerFixtureSources
+  ${PROJECT_SOURCE_DIR}/gazebo/Server.cc
+  ${PROJECT_SOURCE_DIR}/gazebo/Master.cc
+  ${PROJECT_SOURCE_DIR}/gazebo/gazebo.cc
+  ${PROJECT_SOURCE_DIR}/test/ServerFixture.cc
+)
+add_library(server_fixture STATIC ${ServerFixtureSources})
+add_dependencies(server_fixture gazebo_msgs)
+set(SERVER_FIXTURE_LIBRARY "${PROJECT_BINARY_DIR}/test/libserver_fixture.a")
+
 execute_process(COMMAND cmake -E remove_directory ${CMAKE_BINARY_DIR}/test_results)
 execute_process(COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/test_results)
 include_directories(${GTEST_INCLUDE_DIRS})
 
+add_subdirectory(plugins)
+
+set(TEST_TYPE "PERFORMANCE")
+add_subdirectory(performance)
+set(TEST_TYPE "INTEGRATION")
+add_subdirectory(integration)
+set(TEST_TYPE "EXAMPLE")
+add_subdirectory(examples)
+set(TEST_TYPE "REGRESSION")
 add_subdirectory(regression)
+add_subdirectory(cmake)
+add_subdirectory(pkgconfig)
+
+set(headers ServerFixture.hh)
+gz_install_includes("test" ${headers} ${PROJECT_BINARY_DIR}/test_config.h)
diff --git a/test/ServerFixture.cc b/test/ServerFixture.cc
new file mode 100644
index 0000000..f0684e1
--- /dev/null
+++ b/test/ServerFixture.cc
@@ -0,0 +1,1286 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <stdio.h>
+#include <string>
+
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+
+/////////////////////////////////////////////////
+std::string custom_exec(std::string _cmd)
+{
+  _cmd += " 2>/dev/null";
+  FILE* pipe = popen(_cmd.c_str(), "r");
+
+  if (!pipe)
+    return "ERROR";
+
+  char buffer[128];
+  std::string result = "";
+
+  while (!feof(pipe))
+  {
+    if (fgets(buffer, 128, pipe) != NULL)
+      result += buffer;
+  }
+
+  pclose(pipe);
+  return result;
+}
+
+/////////////////////////////////////////////////
+ServerFixture::ServerFixture()
+{
+  this->server = NULL;
+  this->serverRunning = false;
+  this->paused = false;
+  this->percentRealTime = 0;
+  this->gotImage = 0;
+  this->imgData = NULL;
+  this->serverThread = NULL;
+
+  gzLogInit("test.log");
+  gazebo::common::Console::SetQuiet(false);
+  common::SystemPaths::Instance()->AddGazeboPaths(
+      TEST_INTEGRATION_PATH);
+
+  // Add local search paths
+  boost::filesystem::path path;
+
+  path = PROJECT_SOURCE_PATH;
+  gazebo::common::SystemPaths::Instance()->AddGazeboPaths(path.string());
+
+  path = PROJECT_SOURCE_PATH;
+  path /= "gazebo";
+  gazebo::common::SystemPaths::Instance()->AddGazeboPaths(path.string());
+
+  path = PROJECT_BINARY_PATH;
+  path /= "plugins";
+  gazebo::common::SystemPaths::Instance()->AddPluginPaths(path.string());
+
+  path = PROJECT_BINARY_PATH;
+  path /= "test";
+  path /= "plugins";
+  gazebo::common::SystemPaths::Instance()->AddPluginPaths(path.string());
+
+  path = TEST_PATH;
+  gazebo::common::SystemPaths::Instance()->AddGazeboPaths(path.string());
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::TearDown()
+{
+  this->Unload();
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::Unload()
+{
+  gzdbg << "ServerFixture::Unload" << std::endl;
+  this->serverRunning = false;
+  if (this->node)
+    this->node->Fini();
+
+  if (this->server)
+  {
+    this->server->Stop();
+
+    if (this->serverThread)
+    {
+      this->serverThread->join();
+    }
+  }
+
+  delete this->serverThread;
+  this->serverThread = NULL;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::Load(const std::string &_worldFilename)
+{
+  this->Load(_worldFilename, false);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::Load(const std::string &_worldFilename, bool _paused)
+{
+  this->Load(_worldFilename, _paused, "");
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::Load(const std::string &_worldFilename,
+                  bool _paused, const std::string &_physics)
+{
+  delete this->server;
+  this->server = NULL;
+
+  // Create, load, and run the server in its own thread
+  this->serverThread = new boost::thread(
+     boost::bind(&ServerFixture::RunServer, this, _worldFilename,
+                 _paused, _physics));
+
+  // Wait for the server to come up
+  // Use a 60 second timeout.
+  int waitCount = 0, maxWaitCount = 6000;
+  while ((!this->server || !this->server->GetInitialized()) &&
+         ++waitCount < maxWaitCount)
+    common::Time::MSleep(100);
+  gzdbg << "ServerFixture load in "
+         << static_cast<double>(waitCount)/10.0
+         << " seconds, timeout after "
+         << static_cast<double>(maxWaitCount)/10.0
+         << " seconds\n";
+
+  if (waitCount >= maxWaitCount)
+    this->launchTimeoutFailure(
+        "while waiting for Load() function", waitCount);
+
+  this->node = transport::NodePtr(new transport::Node());
+  ASSERT_NO_THROW(this->node->Init());
+  this->poseSub = this->node->Subscribe("~/pose/local/info",
+      &ServerFixture::OnPose, this, true);
+  this->statsSub = this->node->Subscribe("~/world_stats",
+      &ServerFixture::OnStats, this);
+
+  this->factoryPub =
+    this->node->Advertise<msgs::Factory>("~/factory");
+
+  this->requestPub =
+    this->node->Advertise<msgs::Request>("~/request");
+
+  // Wait for the world to reach the correct pause state.
+  // This might not work properly with multiple worlds.
+  // Use a 30 second timeout.
+  waitCount = 0;
+  maxWaitCount = 3000;
+  while ((!physics::get_world() ||
+           physics::get_world()->IsPaused() != _paused) &&
+         ++waitCount < maxWaitCount)
+    common::Time::MSleep(100);
+  ASSERT_LT(waitCount, maxWaitCount);
+
+  this->factoryPub->WaitForConnection();
+  this->requestPub->WaitForConnection();
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::RunServer(const std::string &_worldFilename)
+{
+  this->RunServer(_worldFilename, false, "");
+}
+
+/////////////////////////////////////////////////
+rendering::ScenePtr ServerFixture::GetScene(
+    const std::string &_sceneName)
+{
+  // Wait for the scene to get loaded.
+  int i = 0;
+  int timeoutDS = 20;
+  while (rendering::get_scene(_sceneName) == NULL && i < timeoutDS)
+  {
+    common::Time::MSleep(100);
+    ++i;
+  }
+
+  if (i >= timeoutDS)
+  {
+    gzerr << "Unable to load the rendering scene.\n"
+          << "Test will fail";
+    this->launchTimeoutFailure(
+        "while waiting to load rendering scene", i);
+  }
+
+  return rendering::get_scene(_sceneName);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::RunServer(const std::string &_worldFilename, bool _paused,
+               const std::string &_physics)
+{
+  ASSERT_NO_THROW(this->server = new Server());
+  this->server->PreLoad();
+  if (_physics.length())
+    ASSERT_NO_THROW(this->server->LoadFile(_worldFilename,
+                                           _physics));
+  else
+    ASSERT_NO_THROW(this->server->LoadFile(_worldFilename));
+
+  if (!rendering::get_scene(
+        gazebo::physics::get_world()->GetName()))
+  {
+    rendering::create_scene(
+        gazebo::physics::get_world()->GetName(), false, true);
+  }
+
+  this->SetPause(_paused);
+
+  this->server->Run();
+
+  ASSERT_NO_THROW(this->server->Fini());
+
+  delete this->server;
+  this->server = NULL;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::OnStats(ConstWorldStatisticsPtr &_msg)
+{
+  this->simTime = msgs::Convert(_msg->sim_time());
+  this->realTime = msgs::Convert(_msg->real_time());
+  this->pauseTime = msgs::Convert(_msg->pause_time());
+  this->paused = _msg->paused();
+
+  if (this->realTime == 0)
+    this->percentRealTime = 0;
+  else
+    this->percentRealTime =
+      (this->simTime / this->realTime).Double();
+
+  this->serverRunning = true;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SetPause(bool _pause)
+{
+  physics::pause_worlds(_pause);
+}
+
+/////////////////////////////////////////////////
+double ServerFixture::GetPercentRealTime() const
+{
+  while (!this->serverRunning)
+    common::Time::MSleep(100);
+
+  return this->percentRealTime;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::OnPose(ConstPosesStampedPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(this->receiveMutex);
+  for (int i = 0; i < _msg->pose_size(); ++i)
+  {
+    this->poses[_msg->pose(i).name()] =
+      msgs::Convert(_msg->pose(i));
+  }
+}
+
+/////////////////////////////////////////////////
+math::Pose ServerFixture::GetEntityPose(const std::string &_name)
+{
+  boost::mutex::scoped_lock lock(this->receiveMutex);
+
+  std::map<std::string, math::Pose>::iterator iter;
+  iter = this->poses.find(_name);
+  EXPECT_TRUE(iter != this->poses.end());
+  return iter->second;
+}
+
+/////////////////////////////////////////////////
+bool ServerFixture::HasEntity(const std::string &_name)
+{
+  boost::mutex::scoped_lock lock(this->receiveMutex);
+  std::map<std::string, math::Pose>::iterator iter;
+  iter = this->poses.find(_name);
+  return iter != this->poses.end();
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::PrintImage(const std::string &_name, unsigned char **_image,
+    unsigned int _width, unsigned int _height, unsigned int _depth)
+{
+  unsigned int count = _height * _width * _depth;
+  printf("\n");
+  printf("static unsigned char __%s[] = {", _name.c_str());
+  unsigned int i;
+  for (i = 0; i < count-1; i++)
+  {
+    if (i % 10 == 0)
+      printf("\n");
+    else
+      printf(" ");
+    printf("%d,", (*_image)[i]);
+  }
+  printf(" %d};\n", (*_image)[i]);
+  printf("static unsigned char *%s = __%s;\n", _name.c_str(),
+      _name.c_str());
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::PrintScan(const std::string &_name, double *_scan,
+               unsigned int _sampleCount)
+{
+  printf("static double __%s[] = {\n", _name.c_str());
+  for (unsigned int i = 0; i < _sampleCount-1; ++i)
+  {
+    if ((i+1) % 5 == 0)
+      printf("%13.10f,\n", math::precision(_scan[i], 10));
+    else
+      printf("%13.10f, ", math::precision(_scan[i], 10));
+  }
+  printf("%13.10f};\n",
+      math::precision(_scan[_sampleCount-1], 10));
+  printf("static double *%s = __%s;\n", _name.c_str(),
+      _name.c_str());
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::FloatCompare(float *_scanA, float *_scanB,
+    unsigned int _sampleCount, float &_diffMax,
+    float &_diffSum, float &_diffAvg)
+{
+  _diffMax = 0;
+  _diffSum = 0;
+  _diffAvg = 0;
+  for (unsigned int i = 0; i < _sampleCount; ++i)
+  {
+    double diff = fabs(math::precision(_scanA[i], 10) -
+                math::precision(_scanB[i], 10));
+    _diffSum += diff;
+    if (diff > _diffMax)
+    {
+      _diffMax = diff;
+    }
+  }
+  _diffAvg = _diffSum / _sampleCount;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::DoubleCompare(double *_scanA, double *_scanB,
+    unsigned int _sampleCount, double &_diffMax,
+    double &_diffSum, double &_diffAvg)
+{
+  _diffMax = 0;
+  _diffSum = 0;
+  _diffAvg = 0;
+  for (unsigned int i = 0; i < _sampleCount; ++i)
+  {
+    double diff = fabs(math::precision(_scanA[i], 10) -
+                math::precision(_scanB[i], 10));
+    _diffSum += diff;
+    if (diff > _diffMax)
+    {
+      _diffMax = diff;
+    }
+  }
+  _diffAvg = _diffSum / _sampleCount;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::ImageCompare(unsigned char *_imageA,
+    unsigned char *_imageB,
+    unsigned int _width, unsigned int _height, unsigned int _depth,
+    unsigned int &_diffMax, unsigned int &_diffSum,
+    double &_diffAvg)
+{
+  _diffMax = 0;
+  _diffSum = 0;
+
+  for (unsigned int y = 0; y < _height; ++y)
+  {
+    for (unsigned int x = 0; x < _width*_depth; ++x)
+    {
+      unsigned int a = _imageA[(y*_width*_depth)+x];
+      unsigned int b = _imageB[(y*_width*_depth)+x];
+
+      unsigned int diff = (unsigned int)(abs(a - b));
+
+      if (diff > _diffMax)
+        _diffMax = diff;
+
+      _diffSum += diff;
+    }
+  }
+  _diffAvg = _diffSum / (_height*_width*_depth);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::OnNewFrame(const unsigned char *_image,
+                 unsigned int _width, unsigned int _height,
+                 unsigned int _depth,
+                 const std::string &/*_format*/)
+{
+  memcpy(*this->imgData, _image, _width * _height * _depth);
+  this->gotImage+= 1;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::GetFrame(const std::string &_cameraName,
+    unsigned char **_imgData, unsigned int &_width,
+    unsigned int &_height)
+{
+  sensors::SensorPtr sensor = sensors::get_sensor(_cameraName);
+  EXPECT_TRUE(sensor);
+  sensors::CameraSensorPtr camSensor =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+
+  _width = camSensor->GetImageWidth();
+  _height = camSensor->GetImageHeight();
+
+  if (*_imgData)
+  {
+    delete *_imgData;
+    *_imgData = NULL;
+  }
+  (*_imgData) = new unsigned char[_width *_height*3];
+  this->imgData = _imgData;
+
+  this->gotImage = 0;
+  event::ConnectionPtr c =
+    camSensor->GetCamera()->ConnectNewImageFrame(
+        boost::bind(&ServerFixture::OnNewFrame,
+                    this, _1, _2, _3, _4, _5));
+
+  while (this->gotImage < 20)
+    common::Time::MSleep(100);
+
+  camSensor->GetCamera()->DisconnectNewImageFrame(c);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnCamera(const std::string &_modelName,
+    const std::string &_cameraName,
+    const math::Vector3 &_pos, const math::Vector3 &_rpy,
+    unsigned int _width, unsigned int _height,
+    double _rate,
+    const std::string &_noiseType,
+    double _noiseMean,
+    double _noiseStdDev)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _modelName << "'>"
+    << "<static>true</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "  <sensor name ='" << _cameraName
+    << "' type ='camera'>"
+    << "    <always_on>1</always_on>"
+    << "    <update_rate>" << _rate << "</update_rate>"
+    << "    <visualize>true</visualize>"
+    << "    <camera>"
+    << "      <horizontal_fov>0.78539816339744828</horizontal_fov>"
+    << "      <image>"
+    << "        <width>" << _width << "</width>"
+    << "        <height>" << _height << "</height>"
+    << "        <format>R8G8B8</format>"
+    << "      </image>"
+    << "      <clip>"
+    << "        <near>0.1</near><far>100</far>"
+    << "      </clip>";
+    // << "      <save enabled ='true' path ='/tmp/camera/'/>"
+
+  if (_noiseType.size() > 0)
+    newModelStr << "      <noise>"
+    << "        <type>" << _noiseType << "</type>"
+    << "        <mean>" << _noiseMean << "</mean>"
+    << "        <stddev>" << _noiseStdDev << "</stddev>"
+    << "      </noise>";
+
+  newModelStr << "    </camera>"
+    << "  </sensor>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  WaitUntilEntitySpawn(_modelName, 100, 50);
+  WaitUntilSensorSpawn(_cameraName, 100, 100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnRaySensor(const std::string &_modelName,
+    const std::string &_raySensorName,
+    const math::Vector3 &_pos, const math::Vector3 &_rpy,
+    double _hMinAngle, double _hMaxAngle,
+    double _vMinAngle, double _vMaxAngle,
+    double _minRange, double _maxRange,
+    double _rangeResolution, unsigned int _samples,
+    unsigned int _vSamples, double _hResolution,
+    double _vResolution,
+    const std::string &_noiseType, double _noiseMean,
+    double _noiseStdDev)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _modelName << "'>"
+    << "<static>true</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "<collision name='parent_collision'>"
+    << "  <pose>0 0 0.0205 0 0 0</pose>"
+    << "  <geometry>"
+    << "    <cylinder>"
+    << "      <radius>0.021</radius>"
+    << "      <length>0.029</length>"
+    << "    </cylinder>"
+    << "  </geometry>"
+    << "</collision>"
+    << "  <sensor name ='" << _raySensorName << "' type ='ray'>"
+    << "    <ray>"
+    << "      <scan>"
+    << "        <horizontal>"
+    << "          <samples>" << _samples << "</samples>"
+    << "          <resolution>" << _hResolution << "</resolution>"
+    << "          <min_angle>" << _hMinAngle << "</min_angle>"
+    << "          <max_angle>" << _hMaxAngle << "</max_angle>"
+    << "        </horizontal>"
+    << "        <vertical>"
+    << "          <samples>" << _vSamples << "</samples>"
+    << "          <resolution>" << _vResolution << "</resolution>"
+    << "          <min_angle>" << _vMinAngle << "</min_angle>"
+    << "          <max_angle>" << _vMaxAngle << "</max_angle>"
+    << "        </vertical>"
+    << "      </scan>"
+    << "      <range>"
+    << "        <min>" << _minRange << "</min>"
+    << "        <max>" << _maxRange << "</max>"
+    << "        <resolution>" << _rangeResolution <<"</resolution>"
+    << "      </range>";
+
+  if (_noiseType.size() > 0)
+    newModelStr << "      <noise>"
+    << "        <type>" << _noiseType << "</type>"
+    << "        <mean>" << _noiseMean << "</mean>"
+    << "        <stddev>" << _noiseStdDev << "</stddev>"
+    << "      </noise>";
+
+  newModelStr << "    </ray>"
+    << "    <visualize>true</visualize>"
+    << "  </sensor>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  WaitUntilEntitySpawn(_modelName, 100, 100);
+  WaitUntilSensorSpawn(_raySensorName, 100, 100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnGpuRaySensor(const std::string &_modelName,
+    const std::string &_raySensorName,
+    const math::Vector3 &_pos, const math::Vector3 &_rpy,
+    double _hMinAngle, double _hMaxAngle,
+    double _minRange, double _maxRange,
+    double _rangeResolution, unsigned int _samples,
+    const std::string &_noiseType, double _noiseMean,
+    double _noiseStdDev)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _modelName << "'>"
+    << "<static>true</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "<collision name='parent_collision'>"
+    << "  <pose>0 0 0.0205 0 0 0</pose>"
+    << "  <geometry>"
+    << "    <cylinder>"
+    << "      <radius>0.021</radius>"
+    << "      <length>0.029</length>"
+    << "    </cylinder>"
+    << "  </geometry>"
+    << "</collision>"
+    << "  <sensor name ='" << _raySensorName
+    << "' type ='gpu_ray'>"
+    << "    <ray>"
+    << "      <scan>"
+    << "        <horizontal>"
+    << "          <samples>" << _samples << "</samples>"
+    << "          <resolution> 1 </resolution>"
+    << "          <min_angle>" << _hMinAngle << "</min_angle>"
+    << "          <max_angle>" << _hMaxAngle << "</max_angle>"
+    << "        </horizontal>"
+    << "      </scan>"
+    << "      <range>"
+    << "        <min>" << _minRange << "</min>"
+    << "        <max>" << _maxRange << "</max>"
+    << "        <resolution>" << _rangeResolution <<"</resolution>"
+    << "      </range>";
+
+  if (_noiseType.size() > 0)
+    newModelStr << "      <noise>"
+    << "        <type>" << _noiseType << "</type>"
+    << "        <mean>" << _noiseMean << "</mean>"
+    << "        <stddev>" << _noiseStdDev << "</stddev>"
+    << "      </noise>";
+
+  newModelStr << "    </ray>"
+    << "  </sensor>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  WaitUntilEntitySpawn(_modelName, 100, 100);
+  WaitUntilSensorSpawn(_raySensorName, 100, 100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnImuSensor(const std::string &_modelName,
+    const std::string &_imuSensorName,
+    const math::Vector3 &_pos, const math::Vector3 &_rpy,
+    const std::string &_noiseType,
+    double _rateNoiseMean, double _rateNoiseStdDev,
+    double _rateBiasMean, double _rateBiasStdDev,
+    double _accelNoiseMean, double _accelNoiseStdDev,
+    double _accelBiasMean, double _accelBiasStdDev)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _modelName << "'>" << std::endl
+    << "<static>true</static>" << std::endl
+    << "<pose>" << _pos << " " << _rpy << "</pose>" << std::endl
+    << "<link name ='body'>" << std::endl
+    << "<inertial>" << std::endl
+    << "<mass>0.1</mass>" << std::endl
+    << "</inertial>" << std::endl
+    << "<collision name='parent_collision'>" << std::endl
+    << "  <pose>0 0 0.0205 0 0 0</pose>" << std::endl
+    << "  <geometry>" << std::endl
+    << "    <cylinder>" << std::endl
+    << "      <radius>0.021</radius>" << std::endl
+    << "      <length>0.029</length>" << std::endl
+    << "    </cylinder>" << std::endl
+    << "  </geometry>" << std::endl
+    << "</collision>" << std::endl
+    << "  <sensor name ='" << _imuSensorName
+    << "' type ='imu'>" << std::endl
+    << "    <imu>" << std::endl;
+
+  if (_noiseType.size() > 0)
+  {
+    newModelStr << "      <noise>" << std::endl
+    << "        <type>" << _noiseType << "</type>" << std::endl
+    << "        <rate>" << std::endl
+    << "          <mean>" << _rateNoiseMean
+    << "</mean>" << std::endl
+    << "          <stddev>" << _rateNoiseStdDev
+    << "</stddev>" << std::endl
+    << "          <bias_mean>" << _rateBiasMean
+    << "</bias_mean>" << std::endl
+    << "          <bias_stddev>" << _rateBiasStdDev
+    << "</bias_stddev>" << std::endl
+    << "        </rate>" << std::endl
+    << "        <accel>" << std::endl
+    << "          <mean>" << _accelNoiseMean << "</mean>"
+    << std::endl
+    << "          <stddev>" << _accelNoiseStdDev << "</stddev>"
+    << std::endl
+    << "          <bias_mean>" << _accelBiasMean
+    << "</bias_mean>" << std::endl
+    << "          <bias_stddev>" << _accelBiasStdDev
+    << "</bias_stddev>" << std::endl
+    << "        </accel>" << std::endl
+    << "      </noise>" << std::endl;
+  }
+
+  newModelStr << "    </imu>" << std::endl
+    << "  </sensor>" << std::endl
+    << "</link>" << std::endl
+    << "</model>" << std::endl
+    << "</sdf>" << std::endl;
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  WaitUntilEntitySpawn(_modelName, 100, 1000);
+  WaitUntilSensorSpawn(_imuSensorName, 100, 100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnUnitContactSensor(const std::string &_name,
+    const std::string &_sensorName,
+    const std::string &_collisionType, const math::Vector3 &_pos,
+    const math::Vector3 &_rpy, bool _static)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+  std::ostringstream shapeStr;
+
+  if (_collisionType == "box")
+  {
+    shapeStr << " <box><size>1 1 1</size></box>";
+  }
+  else if (_collisionType == "cylinder")
+  {
+    shapeStr << "<cylinder>"
+             << "  <radius>.5</radius><length>1.0</length>"
+             << "</cylinder>";
+  }
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>" << _static << "</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "  <collision name ='contact_collision'>"
+    << "    <geometry>"
+    << shapeStr.str()
+    << "    </geometry>"
+    << "    <surface>"
+    << "      <contact>"
+    << "        <ode>"
+    << "          <min_depth>0.005</min_depth>"
+    << "        </ode>"
+    << "      </contact>"
+    << "    </surface>"
+    << "  </collision>"
+    << "  <visual name ='visual'>"
+    << "    <geometry>"
+    << shapeStr.str()
+    << "    </geometry>"
+    << "  </visual>"
+    << "  <sensor name='" << _sensorName << "' type='contact'>"
+    << "    <contact>"
+    << "      <collision>contact_collision</collision>"
+    << "    </contact>"
+    << "  </sensor>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  WaitUntilEntitySpawn(_name, 100, 100);
+  WaitUntilSensorSpawn(_sensorName, 100, 100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnUnitImuSensor(const std::string &_name,
+    const std::string &_sensorName,
+    const std::string &_collisionType,
+    const std::string &_topic, const math::Vector3 &_pos,
+    const math::Vector3 &_rpy, bool _static)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+  std::ostringstream shapeStr;
+  if (_collisionType == "box")
+    shapeStr << " <box><size>1 1 1</size></box>";
+  else if (_collisionType == "cylinder")
+  {
+    shapeStr << "<cylinder>"
+             << "  <radius>.5</radius><length>1.0</length>"
+             << "</cylinder>";
+  }
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>" << _static << "</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "  <collision name ='contact_collision'>"
+    << "    <geometry>"
+    << shapeStr.str()
+    << "    </geometry>"
+    << "    <surface>"
+    << "      <contact>"
+    << "        <ode>"
+    << "          <min_depth>0.01</min_depth>"
+    << "        </ode>"
+    << "      </contact>"
+    << "    </surface>"
+    << "  </collision>"
+    << "  <visual name ='visual'>"
+    << "    <geometry>"
+    << shapeStr.str()
+    << "    </geometry>"
+    << "  </visual>"
+    << "  <sensor name='" << _sensorName << "' type='imu'>"
+    << "    <imu>"
+    << "      <topic>" << _topic << "</topic>"
+    << "    </imu>"
+    << "  </sensor>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  WaitUntilEntitySpawn(_name, 20, 50);
+  WaitUntilSensorSpawn(_sensorName, 100, 100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::launchTimeoutFailure(const char *_logMsg,
+                                         const int _timeoutCS)
+{
+     FAIL() << "ServerFixture timeout (wait more than " << _timeoutCS / 100
+            << "s): " << _logMsg;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnWirelessTransmitterSensor(const std::string &_name,
+    const std::string &_sensorName,
+    const math::Vector3 &_pos,
+    const math::Vector3 &_rpy,
+    const std::string &_essid,
+    double _freq,
+    double _power,
+    double _gain,
+    bool _visualize)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>true</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='link'>"
+    << "  <sensor name='" << _sensorName
+    <<         "' type='wireless_transmitter'>"
+    << "    <always_on>1</always_on>"
+    << "    <update_rate>1</update_rate>"
+    << "    <visualize>" << _visualize << "</visualize>"
+    << "    <transceiver>"
+    << "      <essid>" << _essid << "</essid>"
+    << "      <frequency>" << _freq << "</frequency>"
+    << "      <power>" << _power << "</power>"
+    << "      <gain>" << _gain << "</gain>"
+    << "    </transceiver>"
+    << "  </sensor>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  WaitUntilEntitySpawn(_name, 100, 100);
+  WaitUntilSensorSpawn(_sensorName, 100, 100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnWirelessReceiverSensor(const std::string &_name,
+    const std::string &_sensorName,
+    const math::Vector3 &_pos,
+    const math::Vector3 &_rpy,
+    double _minFreq,
+    double _maxFreq,
+    double _power,
+    double _gain,
+    double _sensitivity,
+    bool _visualize)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>true</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='link'>"
+    << "  <sensor name='" << _sensorName
+    <<         "' type='wireless_receiver'>"
+    << "    <update_rate>1</update_rate>"
+    << "    <visualize>" << _visualize << "</visualize>"
+    << "    <transceiver>"
+    << "      <min_frequency>" << _minFreq << "</min_frequency>"
+    << "      <max_frequency>" << _maxFreq << "</max_frequency>"
+    << "      <power>" << _power << "</power>"
+    << "      <gain>" << _gain << "</gain>"
+    << "      <sensitivity>" << _sensitivity << "</sensitivity>"
+    << "    </transceiver>"
+    << "  </sensor>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  WaitUntilEntitySpawn(_name, 100, 100);
+  WaitUntilSensorSpawn(_sensorName, 100, 100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::WaitUntilEntitySpawn(const std::string &_name,
+                        unsigned int _sleepEach,
+                        int _retries)
+{
+  int i = 0;
+  // Wait for the entity to spawn
+  while (!this->HasEntity(_name) && i < _retries)
+  {
+    common::Time::MSleep(_sleepEach);
+    ++i;
+  }
+  EXPECT_LT(i, _retries);
+
+  if (i >= _retries)
+    FAIL() << "ServerFixture timeout: max number of retries ("
+           << _retries
+           << ") exceeded while awaiting the spawn of " << _name;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::WaitUntilSensorSpawn(const std::string &_name,
+                        unsigned int _sleepEach,
+                        int _retries)
+{
+  int i = 0;
+  // Wait for the sensor to spawn
+  while (!sensors::get_sensor(_name) && i < _retries)
+  {
+    common::Time::MSleep(_sleepEach);
+    ++i;
+  }
+  EXPECT_LT(i, _retries);
+
+  if (i >= _retries)
+    FAIL() << "ServerFixture timeout: max number of retries ("
+           << _retries
+           << ") exceeded while awaiting the spawn of " << _name;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnCylinder(const std::string &_name,
+    const math::Vector3 &_pos, const math::Vector3 &_rpy,
+    bool _static)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>" << _static << "</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "  <collision name ='geom'>"
+    << "    <geometry>"
+    << "      <cylinder>"
+    << "        <radius>.5</radius><length>1.0</length>"
+    << "      </cylinder>"
+    << "    </geometry>"
+    << "  </collision>"
+    << "  <visual name ='visual'>"
+    << "    <geometry>"
+    << "      <cylinder>"
+    << "        <radius>.5</radius><length>1.0</length>"
+    << "      </cylinder>"
+    << "    </geometry>"
+    << "  </visual>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  // Wait for the entity to spawn
+  while (!this->HasEntity(_name))
+    common::Time::MSleep(100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnSphere(const std::string &_name,
+    const math::Vector3 &_pos, const math::Vector3 &_rpy,
+    bool _wait, bool _static)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>" << _static << "</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "  <collision name ='geom'>"
+    << "    <geometry>"
+    << "      <sphere><radius>.5</radius></sphere>"
+    << "    </geometry>"
+    << "  </collision>"
+    << "  <visual name ='visual'>"
+    << "    <geometry>"
+    << "      <sphere><radius>.5</radius></sphere>"
+    << "    </geometry>"
+    << "  </visual>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  // Wait for the entity to spawn
+  while (_wait && !this->HasEntity(_name))
+    common::Time::MSleep(100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnSphere(const std::string &_name,
+    const math::Vector3 &_pos, const math::Vector3 &_rpy,
+    const math::Vector3 &_cog, double _radius,
+    bool _wait, bool _static)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>" << _static << "</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "  <inertial>"
+    << "    <pose>" << _cog << " 0 0 0</pose>"
+    << "  </inertial>"
+    << "  <collision name ='geom'>"
+    << "    <geometry>"
+    << "      <sphere><radius>" << _radius << "</radius></sphere>"
+    << "    </geometry>"
+    << "  </collision>"
+    << "  <visual name ='visual'>"
+    << "    <geometry>"
+    << "      <sphere><radius>" << _radius << "</radius></sphere>"
+    << "    </geometry>"
+    << "  </visual>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  // Wait for the entity to spawn
+  while (_wait && !this->HasEntity(_name))
+    common::Time::MSleep(100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnBox(const std::string &_name,
+    const math::Vector3 &_size, const math::Vector3 &_pos,
+    const math::Vector3 &_rpy, bool _static)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>" << _static << "</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "  <collision name ='geom'>"
+    << "    <geometry>"
+    << "      <box><size>" << _size << "</size></box>"
+    << "    </geometry>"
+    << "  </collision>"
+    << "  <visual name ='visual'>"
+    << "    <geometry>"
+    << "      <box><size>" << _size << "</size></box>"
+    << "    </geometry>"
+    << "  </visual>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  // Wait for the entity to spawn
+  while (!this->HasEntity(_name))
+    common::Time::MSleep(100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnTrimesh(const std::string &_name,
+    const std::string &_modelPath, const math::Vector3 &_scale,
+    const math::Vector3 &_pos, const math::Vector3 &_rpy,
+    bool _static)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>" << _static << "</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "  <collision name ='geom'>"
+    << "    <geometry>"
+    << "      <mesh>"
+    << "        <uri>" << _modelPath << "</uri>"
+    << "        <scale>" << _scale << "</scale>"
+    << "      </mesh>"
+    << "    </geometry>"
+    << "  </collision>"
+    << "  <visual name ='visual'>"
+    << "    <geometry>"
+    << "      <mesh><uri>" << _modelPath << "</uri></mesh>"
+    << "    </geometry>"
+    << "  </visual>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  // Wait for the entity to spawn
+  while (!this->HasEntity(_name))
+    common::Time::MSleep(100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnEmptyLink(const std::string &_name,
+    const math::Vector3 &_pos, const math::Vector3 &_rpy,
+    bool _static)
+{
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << _name << "'>"
+    << "<static>" << _static << "</static>"
+    << "<pose>" << _pos << " " << _rpy << "</pose>"
+    << "<link name ='body'>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  // Wait for the entity to spawn
+  while (!this->HasEntity(_name))
+    common::Time::MSleep(100);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnModel(const std::string &_filename)
+{
+  msgs::Factory msg;
+  msg.set_sdf_filename(_filename);
+  this->factoryPub->Publish(msg);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::SpawnSDF(const std::string &_sdf)
+{
+  msgs::Factory msg;
+  msg.set_sdf(_sdf);
+  this->factoryPub->Publish(msg);
+
+  // The code above sends a message, but it will take some time
+  // before the message is processed.
+  //
+  // The code below parses the sdf string to find a model name,
+  // then this function will block until that model
+  // has been processed and recognized by the Server Fixture.
+  sdf::SDF sdfParsed;
+  sdfParsed.SetFromString(_sdf);
+  // Check that sdf contains a model
+  if (sdfParsed.root->HasElement("model"))
+  {
+    // Timeout of 30 seconds (3000 * 10 ms)
+    int waitCount = 0, maxWaitCount = 3000;
+    sdf::ElementPtr model = sdfParsed.root->GetElement("model");
+    std::string name = model->Get<std::string>("name");
+    while (!this->HasEntity(name) && ++waitCount < maxWaitCount)
+      common::Time::MSleep(100);
+    ASSERT_LT(waitCount, maxWaitCount);
+  }
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::LoadPlugin(const std::string &_filename,
+                const std::string &_name)
+{
+  // Get the first world...we assume it the only one running
+  physics::WorldPtr world = physics::get_world();
+  world->LoadPlugin(_filename, _name, sdf::ElementPtr());
+}
+
+/////////////////////////////////////////////////
+physics::ModelPtr ServerFixture::GetModel(const std::string &_name)
+{
+  // Get the first world...we assume it the only one running
+  physics::WorldPtr world = physics::get_world();
+  return world->GetModel(_name);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::RemoveModel(const std::string &_name)
+{
+  msgs::Request *msg = msgs::CreateRequest("entity_delete", _name);
+  this->requestPub->Publish(*msg);
+  delete msg;
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::RemovePlugin(const std::string &_name)
+{
+  // Get the first world...we assume it the only one running
+  physics::WorldPtr world = physics::get_world();
+  world->RemovePlugin(_name);
+}
+
+/////////////////////////////////////////////////
+void ServerFixture::GetMemInfo(double &_resident, double &_share)
+{
+#ifdef __linux__
+  int totalSize, residentPages, sharePages;
+  totalSize = residentPages = sharePages = 0;
+
+  std::ifstream buffer("/proc/self/statm");
+  buffer >> totalSize >> residentPages >> sharePages;
+  buffer.close();
+
+  // in case x86-64 is configured to use 2MB pages
+  int64_t pageSizeKb = sysconf(_SC_PAGE_SIZE) / 1024;
+
+  _resident = residentPages * pageSizeKb;
+  _share = sharePages * pageSizeKb;
+#elif __MACH__
+  // /proc is only available on Linux
+  // for OSX, use task_info to get resident and virtual memory
+  struct task_basic_info t_info;
+  mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
+  if (KERN_SUCCESS != task_info(mach_task_self(),
+                                TASK_BASIC_INFO,
+                                (task_info_t)&t_info,
+                                &t_info_count))
+  {
+    gzerr << "failure calling task_info\n";
+    return;
+  }
+  _resident = static_cast<double>(t_info.resident_size/1024);
+  _share = static_cast<double>(t_info.virtual_size/1024);
+#else
+  gzerr << "Unsupported architecture\n";
+  return;
+#endif
+}
diff --git a/test/ServerFixture.hh b/test/ServerFixture.hh
index bf6a22b..35f32f1 100644
--- a/test/ServerFixture.hh
+++ b/test/ServerFixture.hh
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,6 +14,8 @@
  * limitations under the License.
  *
 */
+#ifndef _GAZEBO_SERVER_FIXTURE_HH_
+#define _GAZEBO_SERVER_FIXTURE_HH_
 
 #pragma GCC diagnostic ignored "-Wswitch-default"
 #pragma GCC diagnostic ignored "-Wfloat-equal"
@@ -24,6 +26,8 @@
 # include <mach/mach.h>
 #endif  // __MACH__
 
+#include <sdf/sdf.hh>
+
 #include <gtest/gtest.h>
 #include <boost/thread.hpp>
 #include <boost/filesystem.hpp>
@@ -33,528 +37,256 @@
 
 #include "gazebo/transport/transport.hh"
 
+#include "gazebo/common/CommonIface.hh"
 #include "gazebo/common/SystemPaths.hh"
 #include "gazebo/common/Console.hh"
 #include "gazebo/physics/World.hh"
 #include "gazebo/physics/PhysicsTypes.hh"
-#include "gazebo/physics/Physics.hh"
+#include "gazebo/physics/PhysicsIface.hh"
 #include "gazebo/sensors/sensors.hh"
 #include "gazebo/rendering/rendering.hh"
 #include "gazebo/msgs/msgs.hh"
 
-#include "gazebo_config.h"
+#include "gazebo/gazebo_config.h"
 #include "gazebo/Server.hh"
 
 #include "test_config.h"
 
 using namespace gazebo;
 
+std::string custom_exec(std::string _cmd);
+
 class ServerFixture : public testing::Test
 {
-  protected: ServerFixture()
-             {
-               this->server = NULL;
-               this->serverRunning = false;
-               this->paused = false;
-               this->percentRealTime = 0;
-               this->gotImage = 0;
-               this->imgData = NULL;
-               this->serverThread = NULL;
-
-               common::Console::Instance()->Init("test.log");
-               common::SystemPaths::Instance()->AddGazeboPaths(
-                   TEST_REGRESSION_PATH);
-
-               // Add local search paths
-               std::string path = TEST_REGRESSION_PATH;
-               path += "/../..";
-               gazebo::common::SystemPaths::Instance()->AddGazeboPaths(path);
-
-               path = TEST_REGRESSION_PATH;
-               path += "/../../sdf";
-               gazebo::common::SystemPaths::Instance()->AddGazeboPaths(path);
-
-               path = TEST_REGRESSION_PATH;
-               path += "/../../gazebo";
-               gazebo::common::SystemPaths::Instance()->AddGazeboPaths(path);
-
-               path = TEST_REGRESSION_PATH;
-               path += "/../../build/plugins";
-               gazebo::common::SystemPaths::Instance()->AddPluginPaths(path);
-
-               path = TEST_PATH;
-               gazebo::common::SystemPaths::Instance()->AddGazeboPaths(path);
-             }
-
-  protected: virtual void TearDown()
-             {
-               this->Unload();
-             }
-
-  protected: virtual void Unload()
-             {
-               this->serverRunning = false;
-               if (this->node)
-                 this->node->Fini();
-
-               if (this->server)
-               {
-                 this->server->Stop();
-
-                 if (this->serverThread)
-                 {
-                   this->serverThread->join();
-                 }
-               }
-
-               delete this->serverThread;
-               this->serverThread = NULL;
-             }
-
-  protected: virtual void Load(const std::string &_worldFilename)
-             {
-               this->Load(_worldFilename, false);
-             }
-
-  protected: virtual void Load(const std::string &_worldFilename, bool _paused)
-             {
-               this->Load(_worldFilename, _paused, "");
-             }
-
+  /// \brief Constructor
+  protected: ServerFixture();
+
+  /// \brief Tear down the test fixture. This gets called by gtest.
+  protected: virtual void TearDown();
+
+  /// \brief Unload the test fixture.
+  protected: virtual void Unload();
+
+  /// \brief Load a world based on a filename.
+  /// \param[in] _worldFilename Name of the world to load.
+  protected: virtual void Load(const std::string &_worldFilename);
+
+  /// \brief Load a world based on a filename and set simulation
+  /// paused/un-paused.
+  /// \param[in] _worldFilename Name of the world to load.
+  /// \param[in] _paused True to start the world paused.
+  protected: virtual void Load(const std::string &_worldFilename, bool _paused);
+
+  /// \brief Load a world based on a filename and set simulation
+  /// paused/un-paused, and specify physics engine.
+  /// \param[in] _worldFilename Name of the world to load.
+  /// \param[in] _paused True to start the world paused.
+  /// \param[in] _physics Name of the physics engine.
   protected: virtual void Load(const std::string &_worldFilename,
-                               bool _paused, const std::string &_physics)
-             {
-               delete this->server;
-               this->server = NULL;
-
-               // Create, load, and run the server in its own thread
-               this->serverThread = new boost::thread(
-                  boost::bind(&ServerFixture::RunServer, this, _worldFilename,
-                              _paused, _physics));
-
-               // Wait for the server to come up
-               // Use a 60 second timeout.
-               int waitCount = 0, maxWaitCount = 6000;
-               while ((!this->server || !this->server->GetInitialized()) &&
-                      ++waitCount < maxWaitCount)
-                 common::Time::MSleep(10);
-               gzwarn << "ServerFixture load in "
-                      << static_cast<double>(waitCount)/100.0
-                      << " seconds, timeout after "
-                      << static_cast<double>(maxWaitCount)/100.0
-                      << " seconds\n";
-               ASSERT_LT(waitCount, maxWaitCount);
-
-               this->node = transport::NodePtr(new transport::Node());
-               ASSERT_NO_THROW(this->node->Init());
-               this->poseSub = this->node->Subscribe("~/pose/info",
-                   &ServerFixture::OnPose, this, true);
-               this->statsSub = this->node->Subscribe("~/world_stats",
-                   &ServerFixture::OnStats, this);
-
-               this->factoryPub =
-                 this->node->Advertise<msgs::Factory>("~/factory");
-               this->factoryPub->WaitForConnection();
-
-               // Wait for the world to reach the correct pause state.
-               // This might not work properly with multiple worlds.
-               // Use a 30 second timeout.
-               waitCount = 0;
-               maxWaitCount = 3000;
-               while ((!physics::get_world() ||
-                        physics::get_world()->IsPaused() != _paused) &&
-                      ++waitCount < maxWaitCount)
-                 common::Time::MSleep(10);
-               ASSERT_LT(waitCount, maxWaitCount);
-
-             }
-
-  protected: void RunServer(const std::string &_worldFilename)
-             {
-               this->RunServer(_worldFilename, false, "");
-             }
+                               bool _paused, const std::string &_physics);
+
+  /// \brief Run the server.
+  /// \param[in] _worldFilename Name of the world to run in simulation.
+  protected: void RunServer(const std::string &_worldFilename);
 
+  /// \brief Get a pointer to the rendering scene.
+  /// \param[in] _sceneName Name of the scene to get.
   protected: rendering::ScenePtr GetScene(
-                 const std::string &_sceneName = "default")
-             {
-               // Wait for the scene to get loaded.
-               int i = 0;
-               while (rendering::get_scene(_sceneName) == NULL && i < 20)
-               {
-                 common::Time::MSleep(100);
-                 ++i;
-               }
-
-               if (i >= 20)
-                 gzerr << "Unable to load the rendering scene.\n"
-                   << "Test will fail";
-
-               EXPECT_LT(i, 20);
-               return rendering::get_scene(_sceneName);
-             }
+                 const std::string &_sceneName = "default");
 
+  /// \brief Run the server, start paused/unpaused, and specify the physics
+  /// engine.
+  /// \param[in] _worldFilename Name of the world to load.
+  /// \param[in] _paused True to start the world paused.
+  /// \param[in] _physics Name of the physics engine.
   protected: void RunServer(const std::string &_worldFilename, bool _paused,
-                            const std::string &_physics)
-             {
-               ASSERT_NO_THROW(this->server = new Server());
-               if (_physics.length())
-                 ASSERT_NO_THROW(this->server->LoadFile(_worldFilename,
-                                                        _physics));
-               else
-                 ASSERT_NO_THROW(this->server->LoadFile(_worldFilename));
-               ASSERT_NO_THROW(this->server->Init());
-
-               if (!rendering::get_scene(
-                     gazebo::physics::get_world()->GetName()))
-               {
-                 rendering::create_scene(
-                     gazebo::physics::get_world()->GetName(), false);
-               }
-
-               this->SetPause(_paused);
-
-               this->server->Run();
-
-               rendering::remove_scene(gazebo::physics::get_world()->GetName());
-
-               ASSERT_NO_THROW(this->server->Fini());
-               delete this->server;
-               this->server = NULL;
-             }
-
-  protected: void OnStats(ConstWorldStatisticsPtr &_msg)
-             {
-               this->simTime = msgs::Convert(_msg->sim_time());
-               this->realTime = msgs::Convert(_msg->real_time());
-               this->pauseTime = msgs::Convert(_msg->pause_time());
-               this->paused = _msg->paused();
-
-               if (this->realTime == 0)
-                 this->percentRealTime = 0;
-               else
-                 this->percentRealTime =
-                   (this->simTime / this->realTime).Double();
-
-               this->serverRunning = true;
-             }
-
-  protected: void SetPause(bool _pause)
-             {
-               physics::pause_worlds(_pause);
-             }
-
-  protected: double GetPercentRealTime() const
-             {
-               while (!this->serverRunning)
-                 common::Time::MSleep(100);
-
-               return this->percentRealTime;
-             }
-
-  protected: void OnPose(ConstPose_VPtr &_msg)
-             {
-               boost::mutex::scoped_lock lock(this->receiveMutex);
-               for (int i = 0; i < _msg->pose_size(); ++i)
-               {
-                 this->poses[_msg->pose(i).name()] =
-                   msgs::Convert(_msg->pose(i));
-               }
-             }
-
-  protected: math::Pose GetEntityPose(const std::string &_name)
-             {
-               boost::mutex::scoped_lock lock(this->receiveMutex);
-
-               std::map<std::string, math::Pose>::iterator iter;
-               iter = this->poses.find(_name);
-               EXPECT_TRUE(iter != this->poses.end());
-               return iter->second;
-             }
-
-  protected: bool HasEntity(const std::string &_name)
-             {
-               boost::mutex::scoped_lock lock(this->receiveMutex);
-               std::map<std::string, math::Pose>::iterator iter;
-               iter = this->poses.find(_name);
-               return iter != this->poses.end();
-             }
-
+                            const std::string &_physics);
+
+  /// \brief Function that received world stastics messages.
+  /// \param[in] _msg World statistics message.
+  protected: void OnStats(ConstWorldStatisticsPtr &_msg);
+
+  /// \brief Set a running simulation paused/unpaused.
+  protected: void SetPause(bool _pause);
+
+  /// \brief Get the real-time factor.
+  /// \return The percent real time simulation is running.
+  protected: double GetPercentRealTime() const;
+
+  /// \brief Function that received poses messages from a running
+  /// simulation.
+  /// \param[in] _msg Pose message.
+  protected: void OnPose(ConstPosesStampedPtr &_msg);
+
+  /// \brief Get the pose of an entity.
+  /// \param[in] _name Name of the entity.
+  /// \return Pose of the named entity.
+  protected: math::Pose GetEntityPose(const std::string &_name);
+
+  /// \brief Return true if the named entity exists.
+  /// \param[in] _name Name of the entity to check for.
+  /// \return True if the entity exists.
+  protected: bool HasEntity(const std::string &_name);
+
+  /// \brief Print image data to screen. This is used to generate test data.
+  /// \param[in] _name Name to associate with the printed data.
+  /// \param[in] _image The raw image data.
+  /// \param[in] _width Width of the image.
+  /// \param[in] _height Height of the image.
+  /// \param[in] _depth Pixel depth.
   protected: void PrintImage(const std::string &_name, unsigned char **_image,
-                 unsigned int _width, unsigned int _height, unsigned int _depth)
-             {
-               unsigned int count = _height * _width * _depth;
-               printf("\n");
-               printf("static unsigned char __%s[] = {", _name.c_str());
-               unsigned int i;
-               for (i = 0; i < count-1; i++)
-               {
-                 if (i % 10 == 0)
-                   printf("\n");
-                 else
-                   printf(" ");
-                 printf("%d,", (*_image)[i]);
-               }
-               printf(" %d};\n", (*_image)[i]);
-               printf("static unsigned char *%s = __%s;\n", _name.c_str(),
-                   _name.c_str());
-             }
+                unsigned int _width, unsigned int _height, unsigned int _depth);
 
+  /// \brief Print laser scan to screen. This is used to generate test data.
+  /// \param[in] _name Name to associate with the printed data.
+  /// \param[in] _scan The laser scan data.
+  /// \param[in] _sampleCount Number of samples in the scan data.
   protected: void PrintScan(const std::string &_name, double *_scan,
-                            unsigned int _sampleCount)
-             {
-               printf("static double __%s[] = {\n", _name.c_str());
-               for (unsigned int i = 0; i < _sampleCount-1; ++i)
-               {
-                 if ((i+1) % 5 == 0)
-                   printf("%13.10f,\n", math::precision(_scan[i], 10));
-                 else
-                   printf("%13.10f, ", math::precision(_scan[i], 10));
-               }
-               printf("%13.10f};\n",
-                   math::precision(_scan[_sampleCount-1], 10));
-               printf("static double *%s = __%s;\n", _name.c_str(),
-                   _name.c_str());
-             }
-
+                            unsigned int _sampleCount);
+
+  /// \brief Function to compare two float arrays (for example two laser
+  /// scans).
+  /// \param[in] _scanA First float array.
+  /// \param[in] _scanB Second float array.
+  /// \param[in] _sampleCount Number of samples in each float array.
+  /// \param[out] _diffMax Maximum difference between the two arrays.
+  /// \param[out] _diffSum Sum of the differences between the two arrays.
+  /// \param[out] _diffAvg Average difference between the two arrays.
   protected: void FloatCompare(float *_scanA, float *_scanB,
                  unsigned int _sampleCount, float &_diffMax,
-                 float &_diffSum, float &_diffAvg)
-             {
-               float diff;
-               _diffMax = 0;
-               _diffSum = 0;
-               _diffAvg = 0;
-               for (unsigned int i = 0; i < _sampleCount; ++i)
-               {
-                 diff = fabs(math::precision(_scanA[i], 10) -
-                             math::precision(_scanB[i], 10));
-                 _diffSum += diff;
-                 if (diff > _diffMax)
-                 {
-                   _diffMax = diff;
-                 }
-               }
-               _diffAvg = _diffSum / _sampleCount;
-             }
-
+                 float &_diffSum, float &_diffAvg);
+
+  /// \brief Function to compare two double arrays (for example two laser
+  /// scans).
+  /// \param[in] _scanA First double array.
+  /// \param[in] _scanB Second double array.
+  /// \param[in] _sampleCount Number of samples in each double array.
+  /// \param[out] _diffMax Maximum difference between the two arrays.
+  /// \param[out] _diffSum Sum of the differences between the two arrays.
+  /// \param[out] _diffAvg Average difference between the two arrays.
   protected: void DoubleCompare(double *_scanA, double *_scanB,
                  unsigned int _sampleCount, double &_diffMax,
-                 double &_diffSum, double &_diffAvg)
-             {
-               double diff;
-               _diffMax = 0;
-               _diffSum = 0;
-               _diffAvg = 0;
-               for (unsigned int i = 0; i < _sampleCount; ++i)
-               {
-                 diff = fabs(math::precision(_scanA[i], 10) -
-                             math::precision(_scanB[i], 10));
-                 _diffSum += diff;
-                 if (diff > _diffMax)
-                 {
-                   _diffMax = diff;
-                 }
-               }
-               _diffAvg = _diffSum / _sampleCount;
-             }
-
+                 double &_diffSum, double &_diffAvg);
+
+  /// \brief Function to compare two images.
+  /// \param[in] _imageA First image to compare.
+  /// \param[in] _imageB Second image to compare.
+  /// \param[in] _width Width of both images.
+  /// \param[in] _height Height of both images.
+  /// \param[in] _depth Depth of both images.
+  /// \param[out] _diffMax Maximum difference between the two arrays.
+  /// \param[out] _diffSum Sum of the differences between the two arrays.
+  /// \param[out] _diffAvg Average difference between the two arrays.
   protected: void ImageCompare(unsigned char *_imageA,
                  unsigned char *_imageB,
                  unsigned int _width, unsigned int _height, unsigned int _depth,
                  unsigned int &_diffMax, unsigned int &_diffSum,
-                 double &_diffAvg)
-             {
-               _diffMax = 0;
-               _diffSum = 0;
-               _diffAvg = 0;
-
-               for (unsigned int y = 0; y < _height; y++)
-               {
-                 for (unsigned int x = 0; x < _width*_depth; x++)
-                 {
-                   unsigned int a = _imageA[(y*_width*_depth)+x];
-                   unsigned int b = _imageB[(y*_width*_depth)+x];
-
-                   unsigned int diff = (unsigned int)(abs(a - b));
-
-                   if (diff > _diffMax)
-                     _diffMax = diff;
-
-                   _diffSum += diff;
-                 }
-               }
-               _diffAvg = _diffSum / (_height*_width*_depth);
-             }
-
+                 double &_diffAvg);
+
+  /// \brief Function that receives new image frames.
+  /// \param[in] _image Image data.
+  /// \param[in] _width Width of the image frame.
+  /// \param[in] _height Height of the image frame.
+  /// \param[in] _depth Depth of the image frame.
+  /// \param[in] _format Pixel format.
   private: void OnNewFrame(const unsigned char *_image,
-                              unsigned int _width, unsigned int _height,
-                              unsigned int _depth,
-                              const std::string &/*_format*/)
-           {
-             memcpy(*this->imgData, _image, _width * _height * _depth);
-             this->gotImage+= 1;
-           }
-
+                           unsigned int _width, unsigned int _height,
+                           unsigned int _depth,
+                           const std::string &/*_format*/);
+
+  /// \brief Get an image frame from a camera.
+  /// \param[in] _cameraName Name of the camera to get a frame from.
+  /// \param[out] _imgData Array that receives the image data.
+  /// \param[in] _width Width of the image frame.
+  /// \param[in] _height Height of the image frame.
   protected: void GetFrame(const std::string &_cameraName,
                  unsigned char **_imgData, unsigned int &_width,
-                 unsigned int &_height)
-             {
-               sensors::SensorPtr sensor = sensors::get_sensor(_cameraName);
-               EXPECT_TRUE(sensor);
-               sensors::CameraSensorPtr camSensor =
-                 boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
-
-               _width = camSensor->GetImageWidth();
-               _height = camSensor->GetImageHeight();
-
-               if (*_imgData)
-               {
-                 delete *_imgData;
-                 *_imgData = NULL;
-               }
-               (*_imgData) = new unsigned char[_width *_height*3];
-               this->imgData = _imgData;
-
-               this->gotImage = 0;
-               event::ConnectionPtr c =
-                 camSensor->GetCamera()->ConnectNewImageFrame(
-                     boost::bind(&ServerFixture::OnNewFrame,
-                                 this, _1, _2, _3, _4, _5));
-
-               while (this->gotImage < 20)
-                 common::Time::MSleep(10);
-
-               camSensor->GetCamera()->DisconnectNewImageFrame(c);
-             }
-
+                 unsigned int &_height);
+
+  /// \brief Spawn a camera.
+  /// \param[in] _modelName Name of the model.
+  /// \param[in] _cameraName Name of the camera.
+  /// \param[in] _pos Camera position.
+  /// \param[in] _rpy Camera roll, pitch, yaw.
+  /// \param[in] _width Output image width.
+  /// \param[in] _height Output image height.
+  /// \param[in] _rate Output Hz.
+  /// \param[in] _noiseType Type of noise to apply.
+  /// \param[in] _noiseMean Mean noise value.
+  /// \param[in] _noiseStdDev Standard deviation of the noise.
   protected: void SpawnCamera(const std::string &_modelName,
                  const std::string &_cameraName,
                  const math::Vector3 &_pos, const math::Vector3 &_rpy,
                  unsigned int _width = 320, unsigned int _height = 240,
                  double _rate = 25,
-                 const std::string &_noiseType = "", 
+                 const std::string &_noiseType = "",
                  double _noiseMean = 0.0,
-                 double _noiseStdDev = 0.0)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _modelName << "'>"
-                 << "<static>true</static>"
-                 << "<pose>" << _pos << " " << _rpy << "</pose>"
-                 << "<link name ='body'>"
-                 << "  <sensor name ='" << _cameraName
-                 << "' type ='camera'>"
-                 << "    <always_on>1</always_on>"
-                 << "    <update_rate>" << _rate << "</update_rate>"
-                 << "    <visualize>true</visualize>"
-                 << "    <camera>"
-                 << "      <horizontal_fov>0.78539816339744828</horizontal_fov>"
-                 << "      <image>"
-                 << "        <width>" << _width << "</width>"
-                 << "        <height>" << _height << "</height>"
-                 << "        <format>R8G8B8</format>"
-                 << "      </image>"
-                 << "      <clip>"
-                 << "        <near>0.1</near><far>100</far>"
-                 << "      </clip>";
-                 // << "      <save enabled ='true' path ='/tmp/camera/'/>"
-
-               if (_noiseType.size() > 0)
-                 newModelStr << "      <noise>"
-                 << "        <type>" << _noiseType << "</type>"
-                 << "        <mean>" << _noiseMean << "</mean>"
-                 << "        <stddev>" << _noiseStdDev << "</stddev>"
-                 << "      </noise>";
-
-               newModelStr << "    </camera>"
-                 << "  </sensor>"
-                 << "</link>"
-                 << "</model>"
-                 << "</sdf>";
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               int i = 0;
-               // Wait for the entity to spawn
-               while (!this->HasEntity(_modelName) && i < 50)
-               {
-                 common::Time::MSleep(20);
-                 ++i;
-               }
-               EXPECT_LT(i, 50);
-             }
-
+                 double _noiseStdDev = 0.0);
+
+  /// \brief Spawn a laser.
+  /// \param[in] _modelName Name of the model.
+  /// \param[in] _raySensorName Name of the laser.
+  /// \param[in] _pos Camera position.
+  /// \param[in] _rpy Camera roll, pitch, yaw.
+  /// \param[in] _hMinAngle Horizontal min angle
+  /// \param[in] _hMaxAngle Horizontal max angle
+  /// \param[in] _minRange Min range
+  /// \param[in] _maxRange Max range
+  /// \param[in] _rangeResolution Resolution of the scan
+  /// \param[in] _samples Number of samples.
+  /// \param[in] _rate Output Hz.
+  /// \param[in] _noiseType Type of noise to apply.
+  /// \param[in] _noiseMean Mean noise value.
+  /// \param[in] _noiseStdDev Standard deviation of the noise.
   protected: void SpawnRaySensor(const std::string &_modelName,
                  const std::string &_raySensorName,
                  const math::Vector3 &_pos, const math::Vector3 &_rpy,
                  double _hMinAngle = -2.0, double _hMaxAngle = 2.0,
+                 double _vMinAngle = -1.0, double _vMaxAngle = 1.0,
                  double _minRange = 0.08, double _maxRange = 10,
                  double _rangeResolution = 0.01, unsigned int _samples = 640,
+                 unsigned int _vSamples = 1, double _hResolution = 1.0,
+                 double _vResolution = 1.0,
                  const std::string &_noiseType = "", double _noiseMean = 0.0,
-                 double _noiseStdDev = 0.0)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _modelName << "'>"
-                 << "<static>true</static>"
-                 << "<pose>" << _pos << " " << _rpy << "</pose>"
-                 << "<link name ='body'>"
-                 << "<collision name='parent_collision'>"
-                 << "  <pose>0 0 0.0205 0 0 0</pose>"
-                 << "  <geometry>"
-                 << "    <cylinder>"
-                 << "      <radius>0.021</radius>"
-                 << "      <length>0.029</length>"
-                 << "    </cylinder>"
-                 << "  </geometry>"
-                 << "</collision>"
-                 << "  <sensor name ='" << _raySensorName << "' type ='ray'>"
-                 << "    <ray>"
-                 << "      <scan>"
-                 << "        <horizontal>"
-                 << "          <samples>" << _samples << "</samples>"
-                 << "          <resolution> 1 </resolution>"
-                 << "          <min_angle>" << _hMinAngle << "</min_angle>"
-                 << "          <max_angle>" << _hMaxAngle << "</max_angle>"
-                 << "        </horizontal>"
-                 << "      </scan>"
-                 << "      <range>"
-                 << "        <min>" << _minRange << "</min>"
-                 << "        <max>" << _maxRange << "</max>"
-                 << "        <resolution>" << _rangeResolution <<"</resolution>"
-                 << "      </range>";
-
-               if (_noiseType.size() > 0)
-                 newModelStr << "      <noise>"
-                 << "        <type>" << _noiseType << "</type>"
-                 << "        <mean>" << _noiseMean << "</mean>"
-                 << "        <stddev>" << _noiseStdDev << "</stddev>"
-                 << "      </noise>";
-
-               newModelStr << "    </ray>"
-                 << "  </sensor>"
-                 << "</link>"
-                 << "</model>"
-                 << "</sdf>";
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               int i = 0;
-               // Wait for the entity to spawn
-               while (!this->HasEntity(_modelName) && i < 50)
-               {
-                 common::Time::MSleep(20);
-                 ++i;
-               }
-               EXPECT_LT(i, 50);
-             }
-
+                 double _noiseStdDev = 0.0);
+
+  /// \brief Spawn a gpu laser.
+  /// \param[in] _modelName Name of the model.
+  /// \param[in] _raySensorName Name of the laser.
+  /// \param[in] _pos Camera position.
+  /// \param[in] _rpy Camera roll, pitch, yaw.
+  /// \param[in] _hMinAngle Horizontal min angle
+  /// \param[in] _hMaxAngle Horizontal max angle
+  /// \param[in] _minRange Min range
+  /// \param[in] _maxRange Max range
+  /// \param[in] _rangeResolution Resolution of the scan
+  /// \param[in] _samples Number of samples.
+  /// \param[in] _rate Output Hz.
+  /// \param[in] _noiseType Type of noise to apply.
+  /// \param[in] _noiseMean Mean noise value.
+  /// \param[in] _noiseStdDev Standard deviation of the noise.
+  protected: void SpawnGpuRaySensor(const std::string &_modelName,
+                 const std::string &_raySensorName,
+                 const math::Vector3 &_pos, const math::Vector3 &_rpy,
+                 double _hMinAngle = -2.0, double _hMaxAngle = 2.0,
+                 double _minRange = 0.08, double _maxRange = 10,
+                 double _rangeResolution = 0.01, unsigned int _samples = 640,
+                 const std::string &_noiseType = "", double _noiseMean = 0.0,
+                 double _noiseStdDev = 0.0);
+
+  /// \brief Spawn an imu sensor laser.
+  /// \param[in] _modelName Name of the model.
+  /// \param[in] _imuSensorName Name of the imu sensor.
+  /// \param[in] _pos Camera position.
+  /// \param[in] _rpy Camera roll, pitch, yaw.
+  /// \param[in] _noiseType Type of noise to apply.
+  /// \param[in] _noiseMean Mean noise value.
+  /// \param[in] _noiseStdDev Standard deviation of the noise.
+  /// \param[in] _accelNoiseMean Acceleration based noise mean.
+  /// \param[in] _accelNoiseStdDev Acceleration based noise standard
+  /// deviation.
+  /// \param[in] _accelBiasMean Acceleration mean bias
+  /// \param[in] _accelBiasStdDev Acceleration standard deviation bias
   protected: void SpawnImuSensor(const std::string &_modelName,
                  const std::string &_imuSensorName,
                  const math::Vector3 &_pos, const math::Vector3 &_rpy,
@@ -562,66 +294,7 @@ class ServerFixture : public testing::Test
                  double _rateNoiseMean = 0.0, double _rateNoiseStdDev = 0.0,
                  double _rateBiasMean = 0.0, double _rateBiasStdDev = 0.0,
                  double _accelNoiseMean = 0.0, double _accelNoiseStdDev = 0.0,
-                 double _accelBiasMean = 0.0, double _accelBiasStdDev = 0.0)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _modelName << "'>" << std::endl
-                 << "<static>true</static>" << std::endl
-                 << "<pose>" << _pos << " " << _rpy << "</pose>" << std::endl
-                 << "<link name ='body'>" << std::endl
-                 << "<inertial>" << std::endl
-                 << "<mass>0.1</mass>" << std::endl
-                 << "</inertial>" << std::endl
-                 << "<collision name='parent_collision'>" << std::endl
-                 << "  <pose>0 0 0.0205 0 0 0</pose>" << std::endl
-                 << "  <geometry>" << std::endl
-                 << "    <cylinder>" << std::endl
-                 << "      <radius>0.021</radius>" << std::endl
-                 << "      <length>0.029</length>" << std::endl
-                 << "    </cylinder>" << std::endl
-                 << "  </geometry>" << std::endl
-                 << "</collision>" << std::endl
-                 << "  <sensor name ='" << _imuSensorName << "' type ='imu'>" << std::endl
-                 << "    <imu>" << std::endl;
-
-               if (_noiseType.size() > 0)
-                 newModelStr << "      <noise>" << std::endl
-                 << "        <type>" << _noiseType << "</type>" << std::endl
-                 << "        <rate>" << std::endl
-                 << "          <mean>" << _rateNoiseMean << "</mean>" << std::endl
-                 << "          <stddev>" << _rateNoiseStdDev << "</stddev>" << std::endl
-                 << "          <bias_mean>" << _rateBiasMean << "</bias_mean>" << std::endl
-                 << "          <bias_stddev>" << _rateBiasStdDev << "</bias_stddev>" << std::endl
-                 << "        </rate>" << std::endl
-                 << "        <accel>" << std::endl
-                 << "          <mean>" << _accelNoiseMean << "</mean>" << std::endl
-                 << "          <stddev>" << _accelNoiseStdDev << "</stddev>" << std::endl
-                 << "          <bias_mean>" << _accelBiasMean << "</bias_mean>" << std::endl
-                 << "          <bias_stddev>" << _accelBiasStdDev << "</bias_stddev>" << std::endl
-                 << "        </accel>" << std::endl
-                 << "      </noise>" << std::endl;
-
-               newModelStr << "    </imu>" << std::endl
-                 << "  </sensor>" << std::endl
-                 << "</link>" << std::endl
-                 << "</model>" << std::endl
-                 << "</sdf>" << std::endl;
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               int i = 0;
-               // Wait for the entity to spawn
-               while (!this->HasEntity(_modelName) && i < 50)
-               {
-                 common::Time::MSleep(20);
-                 ++i;
-               }
-               EXPECT_LT(i, 50);
-             }
+                 double _accelBiasMean = 0.0, double _accelBiasStdDev = 0.0);
 
   /// \brief Spawn a contact sensor with the specified collision geometry
   /// \param[in] _name Model name
@@ -633,373 +306,226 @@ class ServerFixture : public testing::Test
   protected: void SpawnUnitContactSensor(const std::string &_name,
                  const std::string &_sensorName,
                  const std::string &_collisionType, const math::Vector3 &_pos,
-                 const math::Vector3 &_rpy, bool _static = false)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-               std::ostringstream shapeStr;
-               if (_collisionType == "box")
-                 shapeStr << " <box><size>1 1 1</size></box>";
-               else if (_collisionType == "cylinder")
-               {
-                 shapeStr << "<cylinder>"
-                          << "  <radius>.5</radius><length>1.0</length>"
-                          << "</cylinder>";
-               }
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _name << "'>"
-                 << "<static>" << _static << "</static>"
-                 << "<pose>" << _pos << " " << _rpy << "</pose>"
-                 << "<link name ='body'>"
-                 << "  <collision name ='contact_collision'>"
-                 << "    <geometry>"
-                 << shapeStr.str()
-                 << "    </geometry>"
-                 << "  </collision>"
-                 << "  <visual name ='visual'>"
-                 << "    <geometry>"
-                 << shapeStr.str()
-                 << "    </geometry>"
-                 << "  </visual>"
-                 << "  <sensor name='" << _sensorName << "' type='contact'>"
-                 << "    <contact>"
-                 << "      <collision>contact_collision</collision>"
-                 << "    </contact>"
-                 << "  </sensor>"
-                 << "</link>"
-                 << "</model>"
-                 << "</sdf>";
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               int i = 0;
-               // Wait for the entity to spawn
-               while (!this->HasEntity(_name) && i < 50)
-               {
-                 common::Time::MSleep(20);
-                 ++i;
-               }
-               EXPECT_LT(i, 50);
-             }
+                 const math::Vector3 &_rpy, bool _static = false);
 
+  /// \brief Spawn an IMU sensor on a link
+  /// \param[in] _name Model name
+  /// \param[in] _sensorName Sensor name
+  /// \param[in] _collisionType Type of collision, box or cylinder
+  /// \param[in] _topic Topic to publish IMU data to
+  /// \param[in] _pos World position
+  /// \param[in] _rpy World rotation in Euler angles
+  /// \param[in] _static True to make the model static
+  protected: void SpawnUnitImuSensor(const std::string &_name,
+                 const std::string &_sensorName,
+                 const std::string &_collisionType,
+                 const std::string &_topic, const math::Vector3 &_pos,
+                 const math::Vector3 &_rpy, bool _static = false);
+
+  /// \brief generate a gtest failure from a timeout error and display a
+  /// log message about the problem.
+  /// \param[in] log_msg: error msg related to the timeout
+  /// \param[in] timeoutCS: failing period (in centiseconds)
+  private: void launchTimeoutFailure(const char *_logMsg, const int _timeoutCS);
+
+  /// \brief Spawn an Wireless transmitter sensor on a link
+  /// \param[in] _name Model name
+  /// \param[in] _sensorName Sensor name
+  /// \param[in] _pos World position
+  /// \param[in] _rpy World rotation in Euler angles
+  /// \param[in] _essid Service set identifier (network name)
+  /// \param[in] _freq Frequency of transmission (MHz)
+  /// \param[in] _power Transmission power (dBm)
+  /// \param[in] _gain Antenna gain (dBi)
+  /// \param[in] _visualize Enable sensor visualization
+  protected: void SpawnWirelessTransmitterSensor(const std::string &_name,
+                 const std::string &_sensorName,
+                 const math::Vector3 &_pos,
+                 const math::Vector3 &_rpy,
+                 const std::string &_essid,
+                 double _freq,
+                 double _power,
+                 double _gain,
+                 bool _visualize = true);
+
+  /// \brief Spawn an Wireless receiver sensor on a link
+  /// \param[in] _name Model name
+  /// \param[in] _sensorName Sensor name
+  /// \param[in] _pos World position
+  /// \param[in] _rpy World rotation in Euler angles
+  /// \param[in] _minFreq Minimum frequency to be filtered (MHz)
+  /// \param[in] _maxFreq Maximum frequency to be filtered (MHz)
+  /// \param[in] _power Transmission power (dBm)
+  /// \param[in] _gain Antenna gain (dBi)
+  /// \param[in] _sensitivity Receiver sensitibity (dBm)
+  /// \param[in] _visualize Enable sensor visualization
+  protected: void SpawnWirelessReceiverSensor(const std::string &_name,
+                 const std::string &_sensorName,
+                 const math::Vector3 &_pos,
+                 const math::Vector3 &_rpy,
+                 double _minFreq,
+                 double _maxFreq,
+                 double _power,
+                 double _gain,
+                 double _sensitivity,
+                 bool _visualize = true);
+
+  /// \brief Wait for a number of ms. and attempts until the entity is spawned
+  /// \param[in] _name Model name
+  /// \param[in] _sleepEach Number of milliseconds to sleep in each iteration
+  /// \param[in] _retries Number of iterations until give up
+  protected: void WaitUntilEntitySpawn(const std::string &_name,
+                                     unsigned int _sleepEach,
+                                     int _retries);
+
+  /// \brief Wait for a number of ms. and attempts until the sensor is spawned
+  /// \param[in] _name Sensor name
+  /// \param[in] _sleepEach Number of milliseconds to sleep in each iteration
+  /// \param[in] _retries Number of iterations until give up
+  protected: void WaitUntilSensorSpawn(const std::string &_name,
+                                     unsigned int _sleepEach,
+                                     int _retries);
+
+  /// \brief Spawn a cylinder
+  /// \param[in] _name Name for the model.
+  /// \param[in] _pos Position for the model.
+  /// \param[in] _rpy Roll, pitch, yaw for the model.
+  /// \param[in] _static True to make the model static.
   protected: void SpawnCylinder(const std::string &_name,
                  const math::Vector3 &_pos, const math::Vector3 &_rpy,
-                 bool _static = false)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _name << "'>"
-                 << "<static>" << _static << "</static>"
-                 << "<pose>" << _pos << " " << _rpy << "</pose>"
-                 << "<link name ='body'>"
-                 << "  <collision name ='geom'>"
-                 << "    <geometry>"
-                 << "      <cylinder>"
-                 << "        <radius>.5</radius><length>1.0</length>"
-                 << "      </cylinder>"
-                 << "    </geometry>"
-                 << "  </collision>"
-                 << "  <visual name ='visual'>"
-                 << "    <geometry>"
-                 << "      <cylinder>"
-                 << "        <radius>.5</radius><length>1.0</length>"
-                 << "      </cylinder>"
-                 << "    </geometry>"
-                 << "  </visual>"
-                 << "</link>"
-                 << "</model>"
-                 << "</sdf>";
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               // Wait for the entity to spawn
-               while (!this->HasEntity(_name))
-                 common::Time::MSleep(10);
-             }
-
+                 bool _static = false);
+
+  /// \brief Spawn a sphere
+  /// \param[in] _name Name for the model.
+  /// \param[in] _pos Position for the model.
+  /// \param[in] _rpy Roll, pitch, yaw for the model.
+  /// \param[in] _static True to make the model static.
+  /// \param[in] _wait True to wait for the sphere to spawn before
+  /// returning.
   protected: void SpawnSphere(const std::string &_name,
                  const math::Vector3 &_pos, const math::Vector3 &_rpy,
-                 bool _wait = true, bool _static = false)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _name << "'>"
-                 << "<static>" << _static << "</static>"
-                 << "<pose>" << _pos << " " << _rpy << "</pose>"
-                 << "<link name ='body'>"
-                 << "  <collision name ='geom'>"
-                 << "    <geometry>"
-                 << "      <sphere><radius>.5</radius></sphere>"
-                 << "    </geometry>"
-                 << "  </collision>"
-                 << "  <visual name ='visual'>"
-                 << "    <geometry>"
-                 << "      <sphere><radius>.5</radius></sphere>"
-                 << "    </geometry>"
-                 << "  </visual>"
-                 << "</link>"
-                 << "</model>"
-                 << "</sdf>";
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               // Wait for the entity to spawn
-               while (_wait && !this->HasEntity(_name))
-                 common::Time::MSleep(10);
-             }
-
+                 bool _wait = true, bool _static = false);
+
+  /// \brief Spawn a sphere
+  /// \param[in] _name Name for the model.
+  /// \param[in] _pos Position for the model.
+  /// \param[in] _rpy Roll, pitch, yaw for the model.
+  /// \param[in] _cog Center of gravity.
+  /// \param[in] _radius Sphere radius.
+  /// \param[in] _static True to make the model static.
+  /// \param[in] _wait True to wait for the sphere to spawn before
+  /// returning.
   protected: void SpawnSphere(const std::string &_name,
                  const math::Vector3 &_pos, const math::Vector3 &_rpy,
                  const math::Vector3 &_cog, double _radius,
-                 bool _wait = true, bool _static = false)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _name << "'>"
-                 << "<static>" << _static << "</static>"
-                 << "<pose>" << _pos << " " << _rpy << "</pose>"
-                 << "<link name ='body'>"
-                 << "  <inertial>"
-                 << "    <pose>" << _cog << " 0 0 0</pose>"
-                 << "  </inertial>"
-                 << "  <collision name ='geom'>"
-                 << "    <geometry>"
-                 << "      <sphere><radius>" << _radius << "</radius></sphere>"
-                 << "    </geometry>"
-                 << "  </collision>"
-                 << "  <visual name ='visual'>"
-                 << "    <geometry>"
-                 << "      <sphere><radius>" << _radius << "</radius></sphere>"
-                 << "    </geometry>"
-                 << "  </visual>"
-                 << "</link>"
-                 << "</model>"
-                 << "</sdf>";
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               // Wait for the entity to spawn
-               while (_wait && !this->HasEntity(_name))
-                 common::Time::MSleep(10);
-             }
-
+                 bool _wait = true, bool _static = false);
+
+  /// \brief Spawn a box.
+  /// \param[in] _name Name for the model.
+  /// \param[in] _size Size of the box.
+  /// \param[in] _pos Position for the model.
+  /// \param[in] _rpy Roll, pitch, yaw for the model.
+  /// \param[in] _static True to make the model static.
   protected: void SpawnBox(const std::string &_name,
                  const math::Vector3 &_size, const math::Vector3 &_pos,
-                 const math::Vector3 &_rpy, bool _static = false)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _name << "'>"
-                 << "<static>" << _static << "</static>"
-                 << "<pose>" << _pos << " " << _rpy << "</pose>"
-                 << "<link name ='body'>"
-                 << "  <collision name ='geom'>"
-                 << "    <geometry>"
-                 << "      <box><size>" << _size << "</size></box>"
-                 << "    </geometry>"
-                 << "  </collision>"
-                 << "  <visual name ='visual'>"
-                 << "    <geometry>"
-                 << "      <box><size>" << _size << "</size></box>"
-                 << "    </geometry>"
-                 << "  </visual>"
-                 << "</link>"
-                 << "</model>"
-                 << "</sdf>";
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               // Wait for the entity to spawn
-               while (!this->HasEntity(_name))
-                 common::Time::MSleep(10);
-             }
-
+                 const math::Vector3 &_rpy, bool _static = false);
+
+  /// \brief Spawn a triangle mesh.
+  /// \param[in] _name Name for the model.
+  /// \param[in] _modelPath Path to the mesh file.
+  /// \param[in] _scale Scaling factor.
+  /// \param[in] _pos Position for the model.
+  /// \param[in] _rpy Roll, pitch, yaw for the model.
+  /// \param[in] _static True to make the model static.
   protected: void SpawnTrimesh(const std::string &_name,
                  const std::string &_modelPath, const math::Vector3 &_scale,
                  const math::Vector3 &_pos, const math::Vector3 &_rpy,
-                 bool _static = false)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _name << "'>"
-                 << "<static>" << _static << "</static>"
-                 << "<pose>" << _pos << " " << _rpy << "</pose>"
-                 << "<link name ='body'>"
-                 << "  <collision name ='geom'>"
-                 << "    <geometry>"
-                 << "      <mesh>"
-                 << "        <uri>" << _modelPath << "</uri>"
-                 << "        <scale>" << _scale << "</scale>"
-                 << "      </mesh>"
-                 << "    </geometry>"
-                 << "  </collision>"
-                 << "  <visual name ='visual'>"
-                 << "    <geometry>"
-                 << "      <mesh><uri>" << _modelPath << "</uri></mesh>"
-                 << "    </geometry>"
-                 << "  </visual>"
-                 << "</link>"
-                 << "</model>"
-                 << "</sdf>";
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               // Wait for the entity to spawn
-               while (!this->HasEntity(_name))
-                 common::Time::MSleep(10);
-             }
+                 bool _static = false);
 
+  /// \brief Spawn an empty link.
+  /// \param[in] _name Name for the model.
+  /// \param[in] _pos Position for the model.
+  /// \param[in] _rpy Roll, pitch, yaw for the model.
+  /// \param[in] _static True to make the model static.
   protected: void SpawnEmptyLink(const std::string &_name,
                  const math::Vector3 &_pos, const math::Vector3 &_rpy,
-                 bool _static = false)
-             {
-               msgs::Factory msg;
-               std::ostringstream newModelStr;
-
-               newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-                 << "<model name ='" << _name << "'>"
-                 << "<static>" << _static << "</static>"
-                 << "<pose>" << _pos << " " << _rpy << "</pose>"
-                 << "<link name ='body'>"
-                 << "</link>"
-                 << "</model>"
-                 << "</sdf>";
-
-               msg.set_sdf(newModelStr.str());
-               this->factoryPub->Publish(msg);
-
-               // Wait for the entity to spawn
-               while (!this->HasEntity(_name))
-                 common::Time::MSleep(10);
-             }
-
-  protected: void SpawnModel(const std::string &_filename)
-             {
-               msgs::Factory msg;
-               msg.set_sdf_filename(_filename);
-               this->factoryPub->Publish(msg);
-             }
-
-             /// \brief Send a factory message based on an SDF string.
-             /// \param[in] _sdf SDF string to publish.
-  protected: void SpawnSDF(const std::string &_sdf)
-             {
-               msgs::Factory msg;
-               msg.set_sdf(_sdf);
-               this->factoryPub->Publish(msg);
-
-               // The code above sends a message, but it will take some time
-               // before the message is processed.
-               //
-               // The code below parses the sdf string to find a model name,
-               // then this function will block until that model
-               // has been processed and recognized by the Server Fixture.
-               sdf::SDF sdfParsed;
-               sdfParsed.SetFromString(_sdf);
-               // Check that sdf contains a model
-               if (sdfParsed.root->HasElement("model"))
-               {
-                 // Timeout of 30 seconds (3000 * 10 ms)
-                 int waitCount = 0, maxWaitCount = 3000;
-                 sdf::ElementPtr model = sdfParsed.root->GetElement("model");
-                 std::string name = model->GetValueString("name");
-                 while (!this->HasEntity(name) && ++waitCount < maxWaitCount)
-                   common::Time::MSleep(10);
-                 ASSERT_LT(waitCount, maxWaitCount);
-               }
-             }
+                 bool _static = false);
+
+  /// \brief Spawn a model from file.
+  /// \param[in] _filename File to load a model from.
+  protected: void SpawnModel(const std::string &_filename);
 
+  /// \brief Send a factory message based on an SDF string.
+  /// \param[in] _sdf SDF string to publish.
+  protected: void SpawnSDF(const std::string &_sdf);
+
+  /// \brief Load a plugin.
+  /// \param[in] _filename Plugin filename to load.
+  /// \param[in] _name Name to associate with with the plugin.
   protected: void LoadPlugin(const std::string &_filename,
-                             const std::string &_name)
-             {
-               // Get the first world...we assume it the only one running
-               physics::WorldPtr world = physics::get_world();
-               world->LoadPlugin(_filename, _name, sdf::ElementPtr());
-             }
-
-  protected: physics::ModelPtr GetModel(const std::string &_name)
-             {
-               // Get the first world...we assume it the only one running
-               physics::WorldPtr world = physics::get_world();
-               return world->GetModel(_name);
-             }
-
-
-  protected: void RemovePlugin(const std::string &_name)
-             {
-               // Get the first world...we assume it the only one running
-               physics::WorldPtr world = physics::get_world();
-               world->RemovePlugin(_name);
-             }
-
-  protected: void GetMemInfo(double &_resident, double &_share)
-            {
-#ifdef __linux__
-              int totalSize, residentPages, sharePages;
-              totalSize = residentPages = sharePages = 0;
-
-              std::ifstream buffer("/proc/self/statm");
-              buffer >> totalSize >> residentPages >> sharePages;
-              buffer.close();
-
-              // in case x86-64 is configured to use 2MB pages
-              int64_t pageSizeKb = sysconf(_SC_PAGE_SIZE) / 1024;
-
-              _resident = residentPages * pageSizeKb;
-              _share = sharePages * pageSizeKb;
-#elif __MACH__
-              // /proc is only available on Linux
-              // for OSX, use task_info to get resident and virtual memory
-              struct task_basic_info t_info;
-              mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
-              if (KERN_SUCCESS != task_info(mach_task_self(),
-                                            TASK_BASIC_INFO,
-                                            (task_info_t)&t_info,
-                                            &t_info_count))
-              {
-                gzerr << "failure calling task_info\n";
-                return;
-              }
-              _resident = static_cast<double>(t_info.resident_size/1024);
-              _share = static_cast<double>(t_info.virtual_size/1024);
-#else
-              gzerr << "Unsupported architecture\n";
-              return;
-#endif
-            }
+                             const std::string &_name);
+
+  /// \brief Get a pointer to a model.
+  /// \param[in] _name Name of the model to get.
+  /// \return Pointer to the model, or NULL if the model was not found.
+  protected: physics::ModelPtr GetModel(const std::string &_name);
+
+  /// \brief Remove a model by name.
+  /// \param[in] _name Name of the model to remove.
+  protected: void RemoveModel(const std::string &_name);
+
+  /// \brief Remove a plugin.
+  /// \param[in] _name Name of the plugin to remove.
+  protected: void RemovePlugin(const std::string &_name);
 
+  /// \brief Get the current memory information.
+  /// \param[out] _resident Resident memory.
+  /// \param[out] _share Shared memory.
+  protected: void GetMemInfo(double &_resident, double &_share);
+
+  /// \brief Pointer the Gazebo server.
   protected: Server *server;
+
+  /// \brief Pointer the thread the runs the server.
   protected: boost::thread *serverThread;
 
+  /// \brief Pointer to a node for communication.
   protected: transport::NodePtr node;
+
+  /// \brief Pose subscription.
   protected: transport::SubscriberPtr poseSub;
+
+  /// \brief World statistics subscription.
   protected: transport::SubscriberPtr statsSub;
+
+  /// \brief Factory publisher.
   protected: transport::PublisherPtr factoryPub;
 
+  /// \brief Request publisher.
+  protected: transport::PublisherPtr requestPub;
+
+  /// \brief Map of received poses.
   protected: std::map<std::string, math::Pose> poses;
+
+  /// \brief Mutex to protect data structures that store messages.
   protected: boost::mutex receiveMutex;
 
+  /// \brief Image data
   private: unsigned char **imgData;
+
+  /// \brief Increments when images are received.
   private: int gotImage;
 
+  /// \brief Current simulation time, real time, and pause time.
   protected: common::Time simTime, realTime, pauseTime;
+
+  /// \brief Current percent realtime.
   private: double percentRealTime;
+
+  /// \brief True if paused.
   private: bool paused;
+
+  /// \brief True if server is running.
   private: bool serverRunning;
 };
+#endif  // define _GAZEBO_SERVER_FIXTURE_HH_
diff --git a/test/cmake/CMakeLists.txt b/test/cmake/CMakeLists.txt
new file mode 100644
index 0000000..e7ef400
--- /dev/null
+++ b/test/cmake/CMakeLists.txt
@@ -0,0 +1,3 @@
+set (tests config-cmake.cc)
+add_definitions("-DSOURCE_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}/plugin\"")
+gz_build_tests(${tests})
diff --git a/test/cmake/config-cmake.cc b/test/cmake/config-cmake.cc
new file mode 100644
index 0000000..7215789
--- /dev/null
+++ b/test/cmake/config-cmake.cc
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#include <gtest/gtest.h>
+#include <stdio.h>
+
+TEST(Cmake, Config)
+{
+  char cmd[1024];
+
+  snprintf(cmd, sizeof(cmd), "cmake %s", SOURCE_DIR);
+  ASSERT_EQ(system(cmd), 0);
+  snprintf(cmd, sizeof(cmd), "make");
+  ASSERT_EQ(system(cmd), 0);
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/cmake/plugin/CMakeLists.txt b/test/cmake/plugin/CMakeLists.txt
new file mode 100644
index 0000000..1d8729b
--- /dev/null
+++ b/test/cmake/plugin/CMakeLists.txt
@@ -0,0 +1,21 @@
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+
+find_package(Boost REQUIRED COMPONENTS system)
+include_directories(${Boost_INCLUDE_DIRS})
+link_directories(${Boost_LIBRARY_DIRS})
+
+find_package(gazebo REQUIRED)
+if (NOT gazebo_FOUND)
+  message(FATAL_ERROR "Didn't find Gazebo")
+endif()
+if (NOT GAZEBO_LIBRARIES)
+  message(FATAL_ERROR "Empty GAZEBO_LIBRARIES")
+endif()
+if (NOT GAZEBO_INCLUDE_DIRS)
+  message(FATAL_ERROR "Empty GAZEBO_LIBRARIES")
+endif()
+
+include_directories(${GAZEBO_INCLUDE_DIRS})
+link_directories(${GAZEBO_LIBRARY_DIRS})
+add_library(hello_world SHARED ../../testfiles/hello_world.cc)
+target_link_libraries(hello_world ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})
diff --git a/test/data/audio_bad_codec.grf b/test/data/audio_bad_codec.grf
new file mode 100644
index 0000000..ff289b9
Binary files /dev/null and b/test/data/audio_bad_codec.grf differ
diff --git a/test/data/audio_bad_codec.mp4 b/test/data/audio_bad_codec.mp4
new file mode 100644
index 0000000..e69de29
diff --git a/test/data/dem_landscape.tif b/test/data/dem_landscape.tif
new file mode 100644
index 0000000..b860237
Binary files /dev/null and b/test/data/dem_landscape.tif differ
diff --git a/test/data/dem_portrait.tif b/test/data/dem_portrait.tif
new file mode 100644
index 0000000..bc80342
Binary files /dev/null and b/test/data/dem_portrait.tif differ
diff --git a/test/data/dem_squared.tif b/test/data/dem_squared.tif
new file mode 100644
index 0000000..dcb8dd0
Binary files /dev/null and b/test/data/dem_squared.tif differ
diff --git a/test/data/empty_audio.mp4 b/test/data/empty_audio.mp4
new file mode 100644
index 0000000..1fc1561
Binary files /dev/null and b/test/data/empty_audio.mp4 differ
diff --git a/tools/test/data/empty_state.log b/test/data/empty_state.log
similarity index 100%
rename from tools/test/data/empty_state.log
rename to test/data/empty_state.log
diff --git a/tools/test/data/pr2_state.log b/test/data/pr2_state.log
similarity index 100%
rename from tools/test/data/pr2_state.log
rename to test/data/pr2_state.log
diff --git a/test/data/pr2_state_log_expected.h b/test/data/pr2_state_log_expected.h
new file mode 100644
index 0000000..bc67322
--- /dev/null
+++ b/test/data/pr2_state_log_expected.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _TEST_LOGS_CMP_H_
+#define _TEST_LOGS_CMP_H_
+
+#include "gazebo/gazebo_config.h"
+
+#ifdef __GNUC__
+    #define MAYBE_UNUSED __attribute__((used))
+#elif defined _MSC_VER
+    #pragma warning(disable: Cxxxxx)
+    #define MAYBE_UNUSED
+#else
+    #define MAYBE_UNUSED
+#endif
+
+
+static std::string pr2StateLog =
+"<?xml version='1.0'?>\n<gazebo_log>\n<header>\n<log_version>1.0</log_version>\n<gazebo_version>1.4.6</gazebo_version>\n<rand_seed>32606</rand_seed>\n</header>\n\n<chunk encoding='txt'><![CDATA[\n<sdf version ='1.3'>\n<world name='default'>\n  <model name='ground_plane'>\n    <static>1</static>\n    <link name='link'>\n      <collision name='collision'>\n        <geometry>\n          <plane>\n            <normal>0.000000 0.000000 1.000000</normal>\n            <size>100.000000 100.000000 [...]
+
+static std::string pr2PoseStateLog =
+"<?xml version='1.0'?>\n<gazebo_log>\n<header>\n<log_version>1.0</log_version>\n<gazebo_version>1.4.6</gazebo_version>\n<rand_seed>32606</rand_seed>\n</header>\n\n<chunk encoding='txt'><![CDATA[\n<sdf version ='1.3'>\n<world name='default'>\n  <model name='ground_plane'>\n    <static>1</static>\n    <link name='link'>\n      <collision name='collision'>\n        <geometry>\n          <plane>\n            <normal>0.000000 0.000000 1.000000</normal>\n            <size>100.000000 100.000000 [...]
+
+static std::string pr2PoseXStateLog =
+"<?xml version='1.0'?>\n<gazebo_log>\n<header>\n<log_version>1.0</log_version>\n<gazebo_version>1.4.6</gazebo_version>\n<rand_seed>32606</rand_seed>\n</header>\n\n<chunk encoding='txt'><![CDATA[\n<sdf version ='1.3'>\n<world name='default'>\n  <model name='ground_plane'>\n    <static>1</static>\n    <link name='link'>\n      <collision name='collision'>\n        <geometry>\n          <plane>\n            <normal>0.000000 0.000000 1.000000</normal>\n            <size>100.000000 100.000000 [...]
+
+static std::string pr2PoseXYStateLog =
+"<?xml version='1.0'?>\n<gazebo_log>\n<header>\n<log_version>1.0</log_version>\n<gazebo_version>1.4.6</gazebo_version>\n<rand_seed>32606</rand_seed>\n</header>\n\n<chunk encoding='txt'><![CDATA[\n<sdf version ='1.3'>\n<world name='default'>\n  <model name='ground_plane'>\n    <static>1</static>\n    <link name='link'>\n      <collision name='collision'>\n        <geometry>\n          <plane>\n            <normal>0.000000 0.000000 1.000000</normal>\n            <size>100.000000 100.000000 [...]
+
+static std::string pr2LinkStateLog =
+"<?xml version='1.0'?>\n<gazebo_log>\n<header>\n<log_version>1.0</log_version>\n<gazebo_version>1.4.6</gazebo_version>\n<rand_seed>32606</rand_seed>\n</header>\n\n<chunk encoding='txt'><![CDATA[\n<sdf version ='1.3'>\n<world name='default'>\n  <model name='ground_plane'>\n    <static>1</static>\n    <link name='link'>\n      <collision name='collision'>\n        <geometry>\n          <plane>\n            <normal>0.000000 0.000000 1.000000</normal>\n            <size>100.000000 100.000000 [...]
+
+static std::string pr2JointStateLog =
+"<?xml version='1.0'?>\n<gazebo_log>\n<header>\n<log_version>1.0</log_version>\n<gazebo_version>1.4.6</gazebo_version>\n<rand_seed>32606</rand_seed>\n</header>\n\n<chunk encoding='txt'><![CDATA[\n<sdf version ='1.3'>\n<world name='default'>\n  <model name='ground_plane'>\n    <static>1</static>\n    <link name='link'>\n      <collision name='collision'>\n        <geometry>\n          <plane>\n            <normal>0.000000 0.000000 1.000000</normal>\n            <size>100.000000 100.000000 [...]
+
+#endif
diff --git a/test/examples/CMakeLists.txt b/test/examples/CMakeLists.txt
new file mode 100644
index 0000000..276d88f
--- /dev/null
+++ b/test/examples/CMakeLists.txt
@@ -0,0 +1,3 @@
+set (tests example_plugins.cc)
+add_definitions("-DCMAKE_SOURCE_DIR=\"${CMAKE_SOURCE_DIR}\"")
+gz_build_tests(${tests})
diff --git a/test/examples/example_plugins.cc b/test/examples/example_plugins.cc
new file mode 100644
index 0000000..afd135b
--- /dev/null
+++ b/test/examples/example_plugins.cc
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#include <gtest/gtest.h>
+#include <stdio.h>
+#include <string>
+#include <boost/filesystem.hpp>
+
+#include "gazebo/common/Console.hh"
+
+///////////////////////////////////////////////////////////////////
+// Create a temporary build folder
+boost::filesystem::path createTempBuildFolder(const std::string &_prefix)
+{
+  boost::filesystem::path path = boost::filesystem::temp_directory_path();
+  path /= boost::filesystem::unique_path(_prefix + "-%%%%-%%%%-%%%%-%%%%");
+  boost::filesystem::create_directories(path);
+  gzdbg << "mkdir " << path.string() << std::endl;
+  return path;
+}
+
+///////////////////////////////////////////////////////////////////
+// Get path to source folder with specified suffix
+boost::filesystem::path getSourcePath(const std::string &_suffix)
+{
+  boost::filesystem::path path = CMAKE_SOURCE_DIR;
+  path /= std::string("examples");
+  path /= std::string("plugins");
+  path /= _suffix;
+  gzdbg << "source " << path.string() << std::endl;
+  return path;
+}
+
+class ExamplePlugins : public ::testing::TestWithParam<const char*>
+{
+  /// \brief Build plugin in subfolder _name in a temporary build folder
+  /// \param[in] _name Subfolder to build.
+  public: void Build(const std::string &_name);
+};
+
+///////////////////////////////////////////////////////////////////
+// Build plugin in subfolder _name in a temporary build folder
+void ExamplePlugins::Build(const std::string &_name)
+{
+  // get a unique temporary build folder name
+  boost::filesystem::path build = createTempBuildFolder(_name);
+
+  // construct path of source folder
+  boost::filesystem::path source = getSourcePath(_name);
+
+  char cmd[1024];
+
+  // cd build && cmake source
+  snprintf(cmd, sizeof(cmd), "cd %s && cmake %s && make",
+    build.c_str(), source.c_str());
+  ASSERT_EQ(system(cmd), 0);
+
+  // remove temporary folder
+  gzdbg << "removing " << build.string() << std::endl;
+  boost::filesystem::remove_all(build);
+}
+
+TEST_P(ExamplePlugins, Build)
+{
+  Build(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(ExamplePlugins, ExamplePlugins, ::testing::Values(
+  "hello_world"
+  , "world_edit"
+  , "model_push"
+  , "factory"
+));
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/gtest/cmake/internal_utils.cmake b/test/gtest/cmake/internal_utils.cmake
index 7efc2ac..8cb2189 100644
--- a/test/gtest/cmake/internal_utils.cmake
+++ b/test/gtest/cmake/internal_utils.cmake
@@ -56,6 +56,16 @@ macro(config_compiler_and_linker)
     # Newlines inside flags variables break CMake's NMake generator.
     # TODO(vladl at google.com): Add -RTCs and -RTCu to debug builds.
     set(cxx_base_flags "-GS -W4 -WX -wd4127 -wd4251 -wd4275 -nologo -J -Zi")
+    if (MSVC_VERSION LESS 1400)
+      # Suppress spurious warnings MSVC 7.1 sometimes issues.
+      # Forcing value to bool.
+      set(cxx_base_flags "${cxx_base_flags} -wd4800")
+      # Copy constructor and assignment operator could not be generated.
+      set(cxx_base_flags "${cxx_base_flags} -wd4511 -wd4512")
+      # Compatibility warnings not applicable to Google Test.
+      # Resolved overload was found by argument-dependent lookup.
+      set(cxx_base_flags "${cxx_base_flags} -wd4675")
+    endif()
     set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32")
     set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN")
     set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1")
@@ -69,7 +79,8 @@ macro(config_compiler_and_linker)
     # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI
     # explicitly.
     set(cxx_no_rtti_flags "-fno-rtti -DGTEST_HAS_RTTI=0")
-    set(cxx_strict_flags "-Wextra")
+    set(cxx_strict_flags
+      "-Wextra -Wno-unused-parameter -Wno-missing-field-initializers")
   elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
     set(cxx_exception_flags "-features=except")
     # Sun Pro doesn't provide macros to indicate whether exceptions and
diff --git a/test/gtest/gtest-1.7.0.diff b/test/gtest/gtest-1.7.0.diff
new file mode 100644
index 0000000..e878396
--- /dev/null
+++ b/test/gtest/gtest-1.7.0.diff
@@ -0,0 +1,44 @@
+diff -r a5e72dd0ecf3 test/gtest/include/gtest/gtest-typed-test.h
+--- a/test/gtest/include/gtest/gtest-typed-test.h	Mon Nov 04 11:47:43 2013 -0800
++++ b/test/gtest/include/gtest/gtest-typed-test.h	Mon Nov 04 11:49:12 2013 -0800
+@@ -31,6 +31,7 @@
+ 
+ #ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+ #define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
++#pragma GCC system_header
+ 
+ // This header implements typed tests and type-parameterized tests.
+ 
+diff -r a5e72dd0ecf3 test/gtest/src/gtest.cc
+--- a/test/gtest/src/gtest.cc	Mon Nov 04 11:47:43 2013 -0800
++++ b/test/gtest/src/gtest.cc	Mon Nov 04 11:49:12 2013 -0800
+@@ -33,6 +33,7 @@
+ 
+ #include "gtest/gtest.h"
+ #include "gtest/gtest-spi.h"
++#pragma GCC system_header
+ 
+ #include <ctype.h>
+ #include <math.h>
+diff -r c33b44f8a9a1 test/gtest/include/gtest/internal/gtest-port.h
+--- a/test/gtest/include/gtest/internal/gtest-port.h	Wed Nov 06 11:23:38 2013 -0800
++++ b/test/gtest/include/gtest/internal/gtest-port.h	Wed Nov 06 17:12:57 2013 -0800
+@@ -39,6 +39,7 @@
+ 
+ #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
++#pragma GCC system_header
+ 
+ // The user can define the following macros in the build script to
+ // control Google Test's behavior.  If the user doesn't define a macro
+diff -r e980730656c1 test/gtest/include/gtest/gtest-printers.h
+--- a/test/gtest/include/gtest/gtest-printers.h	Wed Nov 06 17:13:57 2013 -0800
++++ b/test/gtest/include/gtest/gtest-printers.h	Thu Nov 07 09:29:28 2013 -0800
+@@ -94,6 +94,7 @@
+ 
+ #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+ #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
++#pragma GCC system_header
+ 
+ #include <ostream>  // NOLINT
+ #include <sstream>
diff --git a/test/gtest/include/gtest/gtest-death-test.h b/test/gtest/include/gtest/gtest-death-test.h
index a27883f..957a69c 100644
--- a/test/gtest/include/gtest/gtest-death-test.h
+++ b/test/gtest/include/gtest/gtest-death-test.h
@@ -51,6 +51,17 @@ GTEST_DECLARE_string_(death_test_style);
 
 #if GTEST_HAS_DEATH_TEST
 
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+}  // namespace internal
+
 // The following macros are useful for writing death tests.
 
 // Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
@@ -75,7 +86,7 @@ GTEST_DECLARE_string_(death_test_style);
 //   for (int i = 0; i < 5; i++) {
 //     EXPECT_DEATH(server.ProcessRequest(i),
 //                  "Invalid request .* in ProcessRequest()")
-//         << "Failed to die on request " << i);
+//                  << "Failed to die on request " << i;
 //   }
 //
 //   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
@@ -245,10 +256,10 @@ class GTEST_API_ KilledBySignal {
 # ifdef NDEBUG
 
 #  define EXPECT_DEBUG_DEATH(statement, regex) \
-  do { statement; } while (::testing::internal::AlwaysFalse())
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
 
 #  define ASSERT_DEBUG_DEATH(statement, regex) \
-  do { statement; } while (::testing::internal::AlwaysFalse())
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
 
 # else
 
diff --git a/test/gtest/include/gtest/gtest-message.h b/test/gtest/include/gtest/gtest-message.h
index 9b7142f..fe879bc 100644
--- a/test/gtest/include/gtest/gtest-message.h
+++ b/test/gtest/include/gtest/gtest-message.h
@@ -48,8 +48,11 @@
 
 #include <limits>
 
-#include "gtest/internal/gtest-string.h"
-#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-port.h"
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
 
 namespace testing {
 
@@ -87,15 +90,7 @@ class GTEST_API_ Message {
 
  public:
   // Constructs an empty Message.
-  // We allocate the stringstream separately because otherwise each use of
-  // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
-  // stack frame leading to huge stack frames in some cases; gcc does not reuse
-  // the stack space.
-  Message() : ss_(new ::std::stringstream) {
-    // By default, we want there to be enough precision when printing
-    // a double to a Message.
-    *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
-  }
+  Message();
 
   // Copy constructor.
   Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
@@ -118,7 +113,22 @@ class GTEST_API_ Message {
   // Streams a non-pointer value to this object.
   template <typename T>
   inline Message& operator <<(const T& val) {
-    ::GTestStreamToHelper(ss_.get(), val);
+    // Some libraries overload << for STL containers.  These
+    // overloads are defined in the global namespace instead of ::std.
+    //
+    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+    // overloads are visible in either the std namespace or the global
+    // namespace, but not other namespaces, including the testing
+    // namespace which Google Test's Message class is in.
+    //
+    // To allow STL containers (and other types that has a << operator
+    // defined in the global namespace) to be used in Google Test
+    // assertions, testing::Message must access the custom << operator
+    // from the global namespace.  With this using declaration,
+    // overloads of << defined in the global namespace and those
+    // visible via Koenig lookup are both exposed in this function.
+    using ::operator <<;
+    *ss_ << val;
     return *this;
   }
 
@@ -140,7 +150,7 @@ class GTEST_API_ Message {
     if (pointer == NULL) {
       *ss_ << "(null)";
     } else {
-      ::GTestStreamToHelper(ss_.get(), pointer);
+      *ss_ << pointer;
     }
     return *this;
   }
@@ -164,12 +174,8 @@ class GTEST_API_ Message {
 
   // These two overloads allow streaming a wide C string to a Message
   // using the UTF-8 encoding.
-  Message& operator <<(const wchar_t* wide_c_str) {
-    return *this << internal::String::ShowWideCString(wide_c_str);
-  }
-  Message& operator <<(wchar_t* wide_c_str) {
-    return *this << internal::String::ShowWideCString(wide_c_str);
-  }
+  Message& operator <<(const wchar_t* wide_c_str);
+  Message& operator <<(wchar_t* wide_c_str);
 
 #if GTEST_HAS_STD_WSTRING
   // Converts the given wide string to a narrow string using the UTF-8
@@ -183,13 +189,11 @@ class GTEST_API_ Message {
   Message& operator <<(const ::wstring& wstr);
 #endif  // GTEST_HAS_GLOBAL_WSTRING
 
-  // Gets the text streamed to this object so far as a String.
+  // Gets the text streamed to this object so far as an std::string.
   // Each '\0' character in the buffer is replaced with "\\0".
   //
   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-  internal::String GetString() const {
-    return internal::StringStreamToString(ss_.get());
-  }
+  std::string GetString() const;
 
  private:
 
@@ -199,16 +203,20 @@ class GTEST_API_ Message {
   // decide between class template specializations for T and T*, so a
   // tr1::type_traits-like is_pointer works, and we can overload on that.
   template <typename T>
-  inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) {
+  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
     if (pointer == NULL) {
       *ss_ << "(null)";
     } else {
-      ::GTestStreamToHelper(ss_.get(), pointer);
+      *ss_ << pointer;
     }
   }
   template <typename T>
-  inline void StreamHelper(internal::false_type /*dummy*/, const T& value) {
-    ::GTestStreamToHelper(ss_.get(), value);
+  inline void StreamHelper(internal::false_type /*is_pointer*/,
+                           const T& value) {
+    // See the comments in Message& operator <<(const T&) above for why
+    // we need this using statement.
+    using ::operator <<;
+    *ss_ << value;
   }
 #endif  // GTEST_OS_SYMBIAN
 
@@ -225,6 +233,18 @@ inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
   return os << sb.GetString();
 }
 
+namespace internal {
+
+// Converts a streamable value to an std::string.  A NULL pointer is
+// converted to "(null)".  When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+  return (Message() << streamable).GetString();
+}
+
+}  // namespace internal
 }  // namespace testing
 
 #endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
diff --git a/test/gtest/include/gtest/gtest-param-test.h b/test/gtest/include/gtest/gtest-param-test.h
index 6407cfd..d6702c8 100644
--- a/test/gtest/include/gtest/gtest-param-test.h
+++ b/test/gtest/include/gtest/gtest-param-test.h
@@ -1257,7 +1257,7 @@ inline internal::ParamGenerator<bool> Bool() {
 // Boolean flags:
 //
 // class FlagDependentTest
-//     : public testing::TestWithParam<tuple(bool, bool)> > {
+//     : public testing::TestWithParam<tuple<bool, bool> > {
 //   virtual void SetUp() {
 //     // Assigns external_flag_1 and external_flag_2 values from the tuple.
 //     tie(external_flag_1, external_flag_2) = GetParam();
diff --git a/test/gtest/include/gtest/gtest-param-test.h.pump b/test/gtest/include/gtest/gtest-param-test.h.pump
index 401cb51..2dc9303 100644
--- a/test/gtest/include/gtest/gtest-param-test.h.pump
+++ b/test/gtest/include/gtest/gtest-param-test.h.pump
@@ -414,7 +414,7 @@ inline internal::ParamGenerator<bool> Bool() {
 // Boolean flags:
 //
 // class FlagDependentTest
-//     : public testing::TestWithParam<tuple(bool, bool)> > {
+//     : public testing::TestWithParam<tuple<bool, bool> > {
 //   virtual void SetUp() {
 //     // Assigns external_flag_1 and external_flag_2 values from the tuple.
 //     tie(external_flag_1, external_flag_2) = GetParam();
diff --git a/test/gtest/include/gtest/gtest-printers.h b/test/gtest/include/gtest/gtest-printers.h
index 9cbab3f..b00f91e 100644
--- a/test/gtest/include/gtest/gtest-printers.h
+++ b/test/gtest/include/gtest/gtest-printers.h
@@ -94,6 +94,7 @@
 
 #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
 #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#pragma GCC system_header
 
 #include <ostream>  // NOLINT
 #include <sstream>
@@ -630,9 +631,12 @@ void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
   }
 }
 // This overload prints a (const) char array compactly.
-GTEST_API_ void UniversalPrintArray(const char* begin,
-                                    size_t len,
-                                    ::std::ostream* os);
+GTEST_API_ void UniversalPrintArray(
+    const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const wchar_t* begin, size_t len, ::std::ostream* os);
 
 // Implements printing an array type T[N].
 template <typename T, size_t N>
@@ -673,19 +677,72 @@ class UniversalPrinter<T&> {
 // Prints a value tersely: for a reference type, the referenced value
 // (but not the address) is printed; for a (const) char pointer, the
 // NUL-terminated string (but not the pointer) is printed.
+
 template <typename T>
-void UniversalTersePrint(const T& value, ::std::ostream* os) {
-  UniversalPrint(value, os);
-}
-inline void UniversalTersePrint(const char* str, ::std::ostream* os) {
-  if (str == NULL) {
-    *os << "NULL";
-  } else {
-    UniversalPrint(string(str), os);
+class UniversalTersePrinter {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
   }
-}
-inline void UniversalTersePrint(char* str, ::std::ostream* os) {
-  UniversalTersePrint(static_cast<const char*>(str), os);
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+  static void Print(const T (&value)[N], ::std::ostream* os) {
+    UniversalPrinter<T[N]>::Print(value, os);
+  }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+  static void Print(const char* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(string(str), os);
+    }
+  }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+  static void Print(char* str, ::std::ostream* os) {
+    UniversalTersePrinter<const char*>::Print(str, os);
+  }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+  static void Print(const wchar_t* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(::std::wstring(str), os);
+    }
+  }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+  static void Print(wchar_t* str, ::std::ostream* os) {
+    UniversalTersePrinter<const wchar_t*>::Print(str, os);
+  }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+  UniversalTersePrinter<T>::Print(value, os);
 }
 
 // Prints a value using the type inferred by the compiler.  The
@@ -694,7 +751,10 @@ inline void UniversalTersePrint(char* str, ::std::ostream* os) {
 // NUL-terminated string.
 template <typename T>
 void UniversalPrint(const T& value, ::std::ostream* os) {
-  UniversalPrinter<T>::Print(value, os);
+  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+  // UniversalPrinter with T directly.
+  typedef T T1;
+  UniversalPrinter<T1>::Print(value, os);
 }
 
 #if GTEST_HAS_TR1_TUPLE
@@ -787,7 +847,7 @@ Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
 template <typename T>
 ::std::string PrintToString(const T& value) {
   ::std::stringstream ss;
-  internal::UniversalTersePrint(value, &ss);
+  internal::UniversalTersePrinter<T>::Print(value, &ss);
   return ss.str();
 }
 
diff --git a/test/gtest/include/gtest/gtest-spi.h b/test/gtest/include/gtest/gtest-spi.h
index b226e55..f63fa9a 100644
--- a/test/gtest/include/gtest/gtest-spi.h
+++ b/test/gtest/include/gtest/gtest-spi.h
@@ -223,7 +223,7 @@ class GTEST_API_ SingleFailureChecker {
         (substr));\
     {\
       ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
-          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
+          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
           &gtest_failures);\
       if (::testing::internal::AlwaysTrue()) { statement; }\
     }\
diff --git a/test/gtest/include/gtest/gtest-test-part.h b/test/gtest/include/gtest/gtest-test-part.h
index 8aeea14..77eb844 100644
--- a/test/gtest/include/gtest/gtest-test-part.h
+++ b/test/gtest/include/gtest/gtest-test-part.h
@@ -62,7 +62,7 @@ class GTEST_API_ TestPartResult {
                  int a_line_number,
                  const char* a_message)
       : type_(a_type),
-        file_name_(a_file_name),
+        file_name_(a_file_name == NULL ? "" : a_file_name),
         line_number_(a_line_number),
         summary_(ExtractSummary(a_message)),
         message_(a_message) {
@@ -73,7 +73,9 @@ class GTEST_API_ TestPartResult {
 
   // Gets the name of the source file where the test part took place, or
   // NULL if it's unknown.
-  const char* file_name() const { return file_name_.c_str(); }
+  const char* file_name() const {
+    return file_name_.empty() ? NULL : file_name_.c_str();
+  }
 
   // Gets the line in the source file where the test part took place,
   // or -1 if it's unknown.
@@ -96,21 +98,22 @@ class GTEST_API_ TestPartResult {
 
   // Returns true iff the test part fatally failed.
   bool fatally_failed() const { return type_ == kFatalFailure; }
+
  private:
   Type type_;
 
   // Gets the summary of the failure message by omitting the stack
   // trace in it.
-  static internal::String ExtractSummary(const char* message);
+  static std::string ExtractSummary(const char* message);
 
   // The name of the source file where the test part took place, or
-  // NULL if the source file is unknown.
-  internal::String file_name_;
+  // "" if the source file is unknown.
+  std::string file_name_;
   // The line in the source file where the test part took place, or -1
   // if the line number is unknown.
   int line_number_;
-  internal::String summary_;  // The test failure summary.
-  internal::String message_;  // The test failure message.
+  std::string summary_;  // The test failure summary.
+  std::string message_;  // The test failure message.
 };
 
 // Prints a TestPartResult object.
diff --git a/test/gtest/include/gtest/gtest.h b/test/gtest/include/gtest/gtest.h
index cd01c7b..6fa0a39 100644
--- a/test/gtest/include/gtest/gtest.h
+++ b/test/gtest/include/gtest/gtest.h
@@ -52,6 +52,7 @@
 #define GTEST_INCLUDE_GTEST_GTEST_H_
 
 #include <limits>
+#include <ostream>
 #include <vector>
 
 #include "gtest/internal/gtest-internal.h"
@@ -153,25 +154,15 @@ class ExecDeathTest;
 class NoExecDeathTest;
 class FinalSuccessChecker;
 class GTestFlagSaver;
+class StreamingListenerTest;
 class TestResultAccessor;
 class TestEventListenersAccessor;
 class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
 class WindowsDeathTest;
 class UnitTestImpl* GetUnitTestImpl();
 void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
-                                    const String& message);
-
-// Converts a streamable value to a String.  A NULL pointer is
-// converted to "(null)".  When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-// Declared in gtest-internal.h but defined here, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable) {
-  return (Message() << streamable).GetString();
-}
+                                    const std::string& message);
 
 }  // namespace internal
 
@@ -391,20 +382,21 @@ class GTEST_API_ Test {
   // non-fatal) failure.
   static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
 
-  // Logs a property for the current test.  Only the last value for a given
-  // key is remembered.
-  // These are public static so they can be called from utility functions
-  // that are not members of the test fixture.
-  // The arguments are const char* instead strings, as Google Test is used
-  // on platforms where string doesn't compile.
-  //
-  // Note that a driving consideration for these RecordProperty methods
-  // was to produce xml output suited to the Greenspan charting utility,
-  // which at present will only chart values that fit in a 32-bit int. It
-  // is the user's responsibility to restrict their values to 32-bit ints
-  // if they intend them to be used with Greenspan.
-  static void RecordProperty(const char* key, const char* value);
-  static void RecordProperty(const char* key, int value);
+  // Logs a property for the current test, test case, or for the entire
+  // invocation of the test program when used outside of the context of a
+  // test case.  Only the last value for a given key is remembered.  These
+  // are public static so they can be called from utility functions that are
+  // not members of the test fixture.  Calls to RecordProperty made during
+  // lifespan of the test (from the moment its constructor starts to the
+  // moment its destructor finishes) will be output in XML as attributes of
+  // the <testcase> element.  Properties recorded from fixture's
+  // SetUpTestCase or TearDownTestCase are logged as attributes of the
+  // corresponding <testsuite> element.  Calls to RecordProperty made in the
+  // global context (before or after invocation of RUN_ALL_TESTS and from
+  // SetUp/TearDown method of Environment objects registered with Google
+  // Test) will be output as attributes of the <testsuites> element.
+  static void RecordProperty(const std::string& key, const std::string& value);
+  static void RecordProperty(const std::string& key, int value);
 
  protected:
   // Creates a Test object.
@@ -473,7 +465,7 @@ class TestProperty {
   // C'tor.  TestProperty does NOT have a default constructor.
   // Always use this constructor (with parameters) to create a
   // TestProperty object.
-  TestProperty(const char* a_key, const char* a_value) :
+  TestProperty(const std::string& a_key, const std::string& a_value) :
     key_(a_key), value_(a_value) {
   }
 
@@ -488,15 +480,15 @@ class TestProperty {
   }
 
   // Sets a new value, overriding the one supplied in the constructor.
-  void SetValue(const char* new_value) {
+  void SetValue(const std::string& new_value) {
     value_ = new_value;
   }
 
  private:
   // The key supplied by the user.
-  internal::String key_;
+  std::string key_;
   // The value supplied by the user.
-  internal::String value_;
+  std::string value_;
 };
 
 // The result of a single Test.  This includes a list of
@@ -547,6 +539,7 @@ class GTEST_API_ TestResult {
 
  private:
   friend class TestInfo;
+  friend class TestCase;
   friend class UnitTest;
   friend class internal::DefaultGlobalTestPartResultReporter;
   friend class internal::ExecDeathTest;
@@ -571,13 +564,16 @@ class GTEST_API_ TestResult {
   // a non-fatal failure if invalid (e.g., if it conflicts with reserved
   // key names). If a property is already recorded for the same key, the
   // value will be updated, rather than storing multiple values for the same
-  // key.
-  void RecordProperty(const TestProperty& test_property);
+  // key.  xml_element specifies the element for which the property is being
+  // recorded and is used for validation.
+  void RecordProperty(const std::string& xml_element,
+                      const TestProperty& test_property);
 
   // Adds a failure if the key is a reserved attribute of Google Test
   // testcase tags.  Returns true if the property is valid.
   // TODO(russr): Validate attribute names are legal and human readable.
-  static bool ValidateTestProperty(const TestProperty& test_property);
+  static bool ValidateTestProperty(const std::string& xml_element,
+                                   const TestProperty& test_property);
 
   // Adds a test part result to the list.
   void AddTestPartResult(const TestPartResult& test_part_result);
@@ -650,9 +646,9 @@ class GTEST_API_ TestInfo {
     return NULL;
   }
 
-  // Returns true if this test should run, that is if the test is not disabled
-  // (or it is disabled but the also_run_disabled_tests flag has been specified)
-  // and its full name matches the user-specified filter.
+  // Returns true if this test should run, that is if the test is not
+  // disabled (or it is disabled but the also_run_disabled_tests flag has
+  // been specified) and its full name matches the user-specified filter.
   //
   // Google Test allows the user to filter the tests by their full names.
   // The full name of a test Bar in test case Foo is defined as
@@ -668,19 +664,28 @@ class GTEST_API_ TestInfo {
   // contains the character 'A' or starts with "Foo.".
   bool should_run() const { return should_run_; }
 
+  // Returns true iff this test will appear in the XML report.
+  bool is_reportable() const {
+    // For now, the XML report includes all tests matching the filter.
+    // In the future, we may trim tests that are excluded because of
+    // sharding.
+    return matches_filter_;
+  }
+
   // Returns the result of the test.
   const TestResult* result() const { return &result_; }
 
  private:
-
 #if GTEST_HAS_DEATH_TEST
   friend class internal::DefaultDeathTestFactory;
 #endif  // GTEST_HAS_DEATH_TEST
   friend class Test;
   friend class TestCase;
   friend class internal::UnitTestImpl;
+  friend class internal::StreamingListenerTest;
   friend TestInfo* internal::MakeAndRegisterTestInfo(
-      const char* test_case_name, const char* name,
+      const char* test_case_name,
+      const char* name,
       const char* type_param,
       const char* value_param,
       internal::TypeId fixture_class_id,
@@ -690,9 +695,10 @@ class GTEST_API_ TestInfo {
 
   // Constructs a TestInfo object. The newly constructed instance assumes
   // ownership of the factory object.
-  TestInfo(const char* test_case_name, const char* name,
-           const char* a_type_param,
-           const char* a_value_param,
+  TestInfo(const std::string& test_case_name,
+           const std::string& name,
+           const char* a_type_param,   // NULL if not a type-parameterized test
+           const char* a_value_param,  // NULL if not a value-parameterized test
            internal::TypeId fixture_class_id,
            internal::TestFactoryBase* factory);
 
@@ -778,9 +784,15 @@ class GTEST_API_ TestCase {
   // Gets the number of failed tests in this test case.
   int failed_test_count() const;
 
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
   // Gets the number of disabled tests in this test case.
   int disabled_test_count() const;
 
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
   // Get the number of tests in this test case that should run.
   int test_to_run_count() const;
 
@@ -800,6 +812,10 @@ class GTEST_API_ TestCase {
   // total_test_count() - 1. If i is not in that range, returns NULL.
   const TestInfo* GetTestInfo(int i) const;
 
+  // Returns the TestResult that holds test properties recorded during
+  // execution of SetUpTestCase and TearDownTestCase.
+  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
  private:
   friend class Test;
   friend class internal::UnitTestImpl;
@@ -852,11 +868,22 @@ class GTEST_API_ TestCase {
     return test_info->should_run() && test_info->result()->Failed();
   }
 
+  // Returns true iff the test is disabled and will be reported in the XML
+  // report.
+  static bool TestReportableDisabled(const TestInfo* test_info) {
+    return test_info->is_reportable() && test_info->is_disabled_;
+  }
+
   // Returns true iff test is disabled.
   static bool TestDisabled(const TestInfo* test_info) {
     return test_info->is_disabled_;
   }
 
+  // Returns true iff this test will appear in the XML report.
+  static bool TestReportable(const TestInfo* test_info) {
+    return test_info->is_reportable();
+  }
+
   // Returns true if the given test should run.
   static bool ShouldRunTest(const TestInfo* test_info) {
     return test_info->should_run();
@@ -869,7 +896,7 @@ class GTEST_API_ TestCase {
   void UnshuffleTests();
 
   // Name of the test case.
-  internal::String name_;
+  std::string name_;
   // Name of the parameter type, or NULL if this is not a typed or a
   // type-parameterized test.
   const internal::scoped_ptr<const ::std::string> type_param_;
@@ -888,6 +915,9 @@ class GTEST_API_ TestCase {
   bool should_run_;
   // Elapsed time, in milliseconds.
   TimeInMillis elapsed_time_;
+  // Holds test properties recorded during execution of SetUpTestCase and
+  // TearDownTestCase.
+  TestResult ad_hoc_test_result_;
 
   // We disallow copying TestCases.
   GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
@@ -1107,11 +1137,13 @@ class GTEST_API_ UnitTest {
 
   // Returns the TestCase object for the test that's currently running,
   // or NULL if no test is running.
-  const TestCase* current_test_case() const;
+  const TestCase* current_test_case() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
 
   // Returns the TestInfo object for the test that's currently running,
   // or NULL if no test is running.
-  const TestInfo* current_test_info() const;
+  const TestInfo* current_test_info() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
 
   // Returns the random seed used at the start of the current test run.
   int random_seed() const;
@@ -1121,7 +1153,8 @@ class GTEST_API_ UnitTest {
   // value-parameterized tests and instantiate and register them.
   //
   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-  internal::ParameterizedTestCaseRegistry& parameterized_test_registry();
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+      GTEST_LOCK_EXCLUDED_(mutex_);
 #endif  // GTEST_HAS_PARAM_TEST
 
   // Gets the number of successful test cases.
@@ -1143,15 +1176,25 @@ class GTEST_API_ UnitTest {
   // Gets the number of failed tests.
   int failed_test_count() const;
 
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
   // Gets the number of disabled tests.
   int disabled_test_count() const;
 
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
   // Gets the number of all tests.
   int total_test_count() const;
 
   // Gets the number of tests that should run.
   int test_to_run_count() const;
 
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const;
+
   // Gets the elapsed time, in milliseconds.
   TimeInMillis elapsed_time() const;
 
@@ -1166,6 +1209,10 @@ class GTEST_API_ UnitTest {
   // total_test_case_count() - 1. If i is not in that range, returns NULL.
   const TestCase* GetTestCase(int i) const;
 
+  // Returns the TestResult containing information on test failures and
+  // properties logged outside of individual test cases.
+  const TestResult& ad_hoc_test_result() const;
+
   // Returns the list of event listeners that can be used to track events
   // inside Google Test.
   TestEventListeners& listeners();
@@ -1189,12 +1236,16 @@ class GTEST_API_ UnitTest {
   void AddTestPartResult(TestPartResult::Type result_type,
                          const char* file_name,
                          int line_number,
-                         const internal::String& message,
-                         const internal::String& os_stack_trace);
+                         const std::string& message,
+                         const std::string& os_stack_trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
 
-  // Adds a TestProperty to the current TestResult object. If the result already
-  // contains a property with the same key, the value will be updated.
-  void RecordPropertyForCurrentTest(const char* key, const char* value);
+  // Adds a TestProperty to the current TestResult object when invoked from
+  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+  // from SetUpTestCase or TearDownTestCase, or to the global property set
+  // when invoked elsewhere.  If the result already contains a property with
+  // the same key, the value will be updated.
+  void RecordProperty(const std::string& key, const std::string& value);
 
   // Gets the i-th test case among all the test cases. i can range from 0 to
   // total_test_case_count() - 1. If i is not in that range, returns NULL.
@@ -1209,11 +1260,13 @@ class GTEST_API_ UnitTest {
   friend class Test;
   friend class internal::AssertHelper;
   friend class internal::ScopedTrace;
+  friend class internal::StreamingListenerTest;
+  friend class internal::UnitTestRecordPropertyTestHelper;
   friend Environment* AddGlobalTestEnvironment(Environment* env);
   friend internal::UnitTestImpl* internal::GetUnitTestImpl();
   friend void internal::ReportFailureInUnknownLocation(
       TestPartResult::Type result_type,
-      const internal::String& message);
+      const std::string& message);
 
   // Creates an empty UnitTest.
   UnitTest();
@@ -1223,10 +1276,12 @@ class GTEST_API_ UnitTest {
 
   // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
   // Google Test trace stack.
-  void PushGTestTrace(const internal::TraceInfo& trace);
+  void PushGTestTrace(const internal::TraceInfo& trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
 
   // Pops a trace from the per-thread Google Test trace stack.
-  void PopGTestTrace();
+  void PopGTestTrace()
+      GTEST_LOCK_EXCLUDED_(mutex_);
 
   // Protects mutable state in *impl_.  This is mutable as some const
   // methods need to lock it too.
@@ -1281,24 +1336,101 @@ GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
 
 namespace internal {
 
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value.  In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object.  If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+  static ::std::string Format(const ToPrint& value) {
+    return ::testing::PrintToString(value);
+  }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+  static ::std::string Format(const ToPrint* value) {
+    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+  }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
+  template <typename OtherOperand>                                      \
+  class FormatForComparison<CharType*, OtherOperand> {                  \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(static_cast<const void*>(value)); \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+  template <>                                                           \
+  class FormatForComparison<CharType*, OtherStringType> {               \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(value);                           \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
 // Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
 // operand to be used in a failure message.  The type (but not value)
 // of the other operand may affect the format.  This allows us to
 // print a char* as a raw pointer when it is compared against another
-// char*, and print it as a C string when it is compared against an
-// std::string object, for example.
-//
-// The default implementation ignores the type of the other operand.
-// Some specialized versions are used to handle formatting wide or
-// narrow C strings.
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
 //
 // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
 template <typename T1, typename T2>
-String FormatForComparisonFailureMessage(const T1& value,
-                                         const T2& /* other_operand */) {
-  // C++Builder compiles this incorrectly if the namespace isn't explicitly
-  // given.
-  return ::testing::PrintToString(value);
+std::string FormatForComparisonFailureMessage(
+    const T1& value, const T2& /* other_operand */) {
+  return FormatForComparison<T1, T2>::Format(value);
 }
 
 // The helper function for {ASSERT|EXPECT}_EQ.
@@ -1310,7 +1442,7 @@ AssertionResult CmpHelperEQ(const char* expected_expression,
 #ifdef _MSC_VER
 # pragma warning(push)          // Saves the current warning state.
 # pragma warning(disable:4389)  // Temporarily disables warning on
-                               // signed/unsigned mismatch.
+                                // signed/unsigned mismatch.
 #endif
 
   if (expected == actual) {
@@ -1446,11 +1578,11 @@ GTEST_IMPL_CMP_HELPER_(NE, !=);
 // Implements the helper function for {ASSERT|EXPECT}_LE
 GTEST_IMPL_CMP_HELPER_(LE, <=);
 // Implements the helper function for {ASSERT|EXPECT}_LT
-GTEST_IMPL_CMP_HELPER_(LT, < );
+GTEST_IMPL_CMP_HELPER_(LT, <);
 // Implements the helper function for {ASSERT|EXPECT}_GE
 GTEST_IMPL_CMP_HELPER_(GE, >=);
 // Implements the helper function for {ASSERT|EXPECT}_GT
-GTEST_IMPL_CMP_HELPER_(GT, > );
+GTEST_IMPL_CMP_HELPER_(GT, >);
 
 #undef GTEST_IMPL_CMP_HELPER_
 
@@ -1614,9 +1746,9 @@ class GTEST_API_ AssertHelper {
         : type(t), file(srcfile), line(line_num), message(msg) { }
 
     TestPartResult::Type const type;
-    const char*        const file;
-    int                const line;
-    String             const message;
+    const char* const file;
+    int const line;
+    std::string const message;
 
    private:
     GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
@@ -1675,7 +1807,12 @@ class WithParamInterface {
   // references static data, to reduce the opportunity for incorrect uses
   // like writing 'WithParamInterface<bool>::GetParam()' for a test that
   // uses a fixture whose parameter type is int.
-  const ParamType& GetParam() const { return *parameter_; }
+  const ParamType& GetParam() const {
+    GTEST_CHECK_(parameter_ != NULL)
+        << "GetParam() can only be called inside a value-parameterized test "
+        << "-- did you intend to write TEST_P instead of TEST_F?";
+    return *parameter_;
+  }
 
  private:
   // Sets parameter value. The caller is responsible for making sure the value
@@ -1721,12 +1858,6 @@ class TestWithParam : public Test, public WithParamInterface<T> {
 // usually want the fail-fast behavior of FAIL and ASSERT_*, but those
 // writing data-driven tests often find themselves using ADD_FAILURE
 // and EXPECT_* more.
-//
-// Examples:
-//
-//   EXPECT_TRUE(server.StatusIsOK());
-//   ASSERT_FALSE(server.HasPendingRequest(port))
-//       << "There are still pending requests " << "on port " << port;
 
 // Generates a nonfatal failure with a generic message.
 #define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
@@ -1900,7 +2031,7 @@ class TestWithParam : public Test, public WithParamInterface<T> {
 # define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
 #endif
 
-// C String Comparisons.  All tests treat NULL and any non-NULL string
+// C-string Comparisons.  All tests treat NULL and any non-NULL string
 // as different.  Two NULLs are equal.
 //
 //    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
@@ -2141,15 +2272,20 @@ bool StaticAssertTypeEq() {
   GTEST_TEST_(test_fixture, test_name, test_fixture, \
               ::testing::internal::GetTypeId<test_fixture>())
 
-// Use this macro in main() to run all tests.  It returns 0 if all
+}  // namespace testing
+
+// Use this function in main() to run all tests.  It returns 0 if all
 // tests are successful, or 1 otherwise.
 //
 // RUN_ALL_TESTS() should be invoked after the command line has been
 // parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
 
-#define RUN_ALL_TESTS()\
-  (::testing::UnitTest::GetInstance()->Run())
-
-}  // namespace testing
+inline int RUN_ALL_TESTS() {
+  return ::testing::UnitTest::GetInstance()->Run();
+}
 
 #endif  // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/test/gtest/include/gtest/gtest_pred_impl.h b/test/gtest/include/gtest/gtest_pred_impl.h
index 3805f85..30ae712 100644
--- a/test/gtest/include/gtest/gtest_pred_impl.h
+++ b/test/gtest/include/gtest/gtest_pred_impl.h
@@ -27,7 +27,7 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-// This file is AUTOMATICALLY GENERATED on 09/24/2010 by command
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
 // 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
 //
 // Implements a family of generic predicate assertion macros.
@@ -98,7 +98,7 @@ AssertionResult AssertPred1Helper(const char* pred_text,
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
 // Don't use this in your code.
 #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, v1),\
+  GTEST_ASSERT_(pred_format(#v1, v1), \
                 on_failure)
 
 // Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
@@ -144,7 +144,7 @@ AssertionResult AssertPred2Helper(const char* pred_text,
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
 // Don't use this in your code.
 #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\
+  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
                 on_failure)
 
 // Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
@@ -197,7 +197,7 @@ AssertionResult AssertPred3Helper(const char* pred_text,
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
 // Don't use this in your code.
 #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
                 on_failure)
 
 // Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
@@ -257,7 +257,7 @@ AssertionResult AssertPred4Helper(const char* pred_text,
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
 // Don't use this in your code.
 #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
                 on_failure)
 
 // Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
@@ -324,7 +324,7 @@ AssertionResult AssertPred5Helper(const char* pred_text,
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
 // Don't use this in your code.
 #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
-  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
                 on_failure)
 
 // Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
diff --git a/test/gtest/include/gtest/internal/gtest-death-test-internal.h b/test/gtest/include/gtest/internal/gtest-death-test-internal.h
index 1d9f83b..2b3a78f 100644
--- a/test/gtest/include/gtest/internal/gtest-death-test-internal.h
+++ b/test/gtest/include/gtest/internal/gtest-death-test-internal.h
@@ -127,11 +127,11 @@ class GTEST_API_ DeathTest {
   // the last death test.
   static const char* LastMessage();
 
-  static void set_last_death_test_message(const String& message);
+  static void set_last_death_test_message(const std::string& message);
 
  private:
   // A string containing a description of the outcome of the last death test.
-  static String last_death_test_message_;
+  static std::string last_death_test_message_;
 
   GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
 };
@@ -217,12 +217,23 @@ GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
 // The symbol "fail" here expands to something into which a message
 // can be streamed.
 
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } else \
+    ::testing::Message()
+
 // A class representing the parsed contents of the
 // --gtest_internal_run_death_test flag, as it existed when
 // RUN_ALL_TESTS was called.
 class InternalRunDeathTestFlag {
  public:
-  InternalRunDeathTestFlag(const String& a_file,
+  InternalRunDeathTestFlag(const std::string& a_file,
                            int a_line,
                            int an_index,
                            int a_write_fd)
@@ -234,13 +245,13 @@ class InternalRunDeathTestFlag {
       posix::Close(write_fd_);
   }
 
-  String file() const { return file_; }
+  const std::string& file() const { return file_; }
   int line() const { return line_; }
   int index() const { return index_; }
   int write_fd() const { return write_fd_; }
 
  private:
-  String file_;
+  std::string file_;
   int line_;
   int index_;
   int write_fd_;
diff --git a/test/gtest/include/gtest/internal/gtest-filepath.h b/test/gtest/include/gtest/internal/gtest-filepath.h
index b36b3cf..7a13b4b 100644
--- a/test/gtest/include/gtest/internal/gtest-filepath.h
+++ b/test/gtest/include/gtest/internal/gtest-filepath.h
@@ -61,11 +61,7 @@ class GTEST_API_ FilePath {
   FilePath() : pathname_("") { }
   FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
 
-  explicit FilePath(const char* pathname) : pathname_(pathname) {
-    Normalize();
-  }
-
-  explicit FilePath(const String& pathname) : pathname_(pathname) {
+  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
     Normalize();
   }
 
@@ -78,7 +74,7 @@ class GTEST_API_ FilePath {
     pathname_ = rhs.pathname_;
   }
 
-  String ToString() const { return pathname_; }
+  const std::string& string() const { return pathname_; }
   const char* c_str() const { return pathname_.c_str(); }
 
   // Returns the current working directory, or "" if unsuccessful.
@@ -111,8 +107,8 @@ class GTEST_API_ FilePath {
                                          const FilePath& base_name,
                                          const char* extension);
 
-  // Returns true iff the path is NULL or "".
-  bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; }
+  // Returns true iff the path is "".
+  bool IsEmpty() const { return pathname_.empty(); }
 
   // If input name has a trailing separator character, removes it and returns
   // the name, otherwise return the name string unmodified.
@@ -201,7 +197,7 @@ class GTEST_API_ FilePath {
   // separators. Returns NULL if no path separator was found.
   const char* FindLastPathSeparator() const;
 
-  String pathname_;
+  std::string pathname_;
 };  // class FilePath
 
 }  // namespace internal
diff --git a/test/gtest/include/gtest/internal/gtest-internal.h b/test/gtest/include/gtest/internal/gtest-internal.h
index 7aa1197..0dcc3a3 100644
--- a/test/gtest/include/gtest/internal/gtest-internal.h
+++ b/test/gtest/include/gtest/internal/gtest-internal.h
@@ -46,12 +46,18 @@
 # include <unistd.h>
 #endif  // GTEST_OS_LINUX
 
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
 #include <ctype.h>
+#include <float.h>
 #include <string.h>
 #include <iomanip>
 #include <limits>
 #include <set>
 
+#include "gtest/gtest-message.h"
 #include "gtest/internal/gtest-string.h"
 #include "gtest/internal/gtest-filepath.h"
 #include "gtest/internal/gtest-type-util.h"
@@ -67,36 +73,6 @@
 #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
 #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
 
-// Google Test defines the testing::Message class to allow construction of
-// test messages via the << operator.  The idea is that anything
-// streamable to std::ostream can be streamed to a testing::Message.
-// This allows a user to use his own types in Google Test assertions by
-// overloading the << operator.
-//
-// util/gtl/stl_logging-inl.h overloads << for STL containers.  These
-// overloads cannot be defined in the std namespace, as that will be
-// undefined behavior.  Therefore, they are defined in the global
-// namespace instead.
-//
-// C++'s symbol lookup rule (i.e. Koenig lookup) says that these
-// overloads are visible in either the std namespace or the global
-// namespace, but not other namespaces, including the testing
-// namespace which Google Test's Message class is in.
-//
-// To allow STL containers (and other types that has a << operator
-// defined in the global namespace) to be used in Google Test assertions,
-// testing::Message must access the custom << operator from the global
-// namespace.  Hence this helper function.
-//
-// Note: Jeffrey Yasskin suggested an alternative fix by "using
-// ::operator<<;" in the definition of Message's operator<<.  That fix
-// doesn't require a helper function, but unfortunately doesn't
-// compile with MSVC.
-template <typename T>
-inline void GTestStreamToHelper(std::ostream* os, const T& val) {
-  *os << val;
-}
-
 class ProtocolMessage;
 namespace proto2 { class Message; }
 
@@ -122,17 +98,12 @@ class TestInfoImpl;                    // Opaque implementation of TestInfo
 class UnitTestImpl;                    // Opaque implementation of UnitTest
 
 // How many times InitGoogleTest() has been called.
-extern int g_init_gtest_count;
+GTEST_API_ extern int g_init_gtest_count;
 
 // The text used in failure messages to indicate the start of the
 // stack trace.
 GTEST_API_ extern const char kStackTraceMarker[];
 
-// A secret type that Google Test users don't know about.  It has no
-// definition on purpose.  Therefore it's impossible to create a
-// Secret object, which is what we want.
-class Secret;
-
 // Two overloaded helpers for checking at compile time whether an
 // expression is a null pointer literal (i.e. NULL or any 0-valued
 // compile-time integral constant).  Their return values have
@@ -163,8 +134,23 @@ char (&IsNullLiteralHelper(...))[2];  // NOLINT
 #endif  // GTEST_ELLIPSIS_NEEDS_POD_
 
 // Appends the user-supplied message to the Google-Test-generated message.
-GTEST_API_ String AppendUserMessage(const String& gtest_msg,
-                                    const Message& user_msg);
+GTEST_API_ std::string AppendUserMessage(
+    const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled).  We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time.  Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+  explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif  // GTEST_HAS_EXCEPTIONS
 
 // A helper class for creating scoped traces in user programs.
 class GTEST_API_ ScopedTrace {
@@ -185,77 +171,6 @@ class GTEST_API_ ScopedTrace {
                             // c'tor and d'tor.  Therefore it doesn't
                             // need to be used otherwise.
 
-// Converts a streamable value to a String.  A NULL pointer is
-// converted to "(null)".  When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-// Declared here but defined in gtest.h, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable);
-
-// The Symbian compiler has a bug that prevents it from selecting the
-// correct overload of FormatForComparisonFailureMessage (see below)
-// unless we pass the first argument by reference.  If we do that,
-// however, Visual Age C++ 10.1 generates a compiler error.  Therefore
-// we only apply the work-around for Symbian.
-#if defined(__SYMBIAN32__)
-# define GTEST_CREF_WORKAROUND_ const&
-#else
-# define GTEST_CREF_WORKAROUND_
-#endif
-
-// When this operand is a const char* or char*, if the other operand
-// is a ::std::string or ::string, we print this operand as a C string
-// rather than a pointer (we do the same for wide strings); otherwise
-// we print it as a pointer to be safe.
-
-// This internal macro is used to avoid duplicated code.
-#define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\
-inline String FormatForComparisonFailureMessage(\
-    operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \
-    const operand2_type& /*operand2*/) {\
-  return operand1_printer(str);\
-}\
-inline String FormatForComparisonFailureMessage(\
-    const operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \
-    const operand2_type& /*operand2*/) {\
-  return operand1_printer(str);\
-}
-
-GTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted)
-#if GTEST_HAS_STD_WSTRING
-GTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted)
-#endif  // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_STRING
-GTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted)
-#endif  // GTEST_HAS_GLOBAL_STRING
-#if GTEST_HAS_GLOBAL_WSTRING
-GTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted)
-#endif  // GTEST_HAS_GLOBAL_WSTRING
-
-#undef GTEST_FORMAT_IMPL_
-
-// The next four overloads handle the case where the operand being
-// printed is a char/wchar_t pointer and the other operand is not a
-// string/wstring object.  In such cases, we just print the operand as
-// a pointer to be safe.
-#define GTEST_FORMAT_CHAR_PTR_IMPL_(CharType)                       \
-  template <typename T>                                             \
-  String FormatForComparisonFailureMessage(CharType* GTEST_CREF_WORKAROUND_ p, \
-                                           const T&) { \
-    return PrintToString(static_cast<const void*>(p));              \
-  }
-
-GTEST_FORMAT_CHAR_PTR_IMPL_(char)
-GTEST_FORMAT_CHAR_PTR_IMPL_(const char)
-GTEST_FORMAT_CHAR_PTR_IMPL_(wchar_t)
-GTEST_FORMAT_CHAR_PTR_IMPL_(const wchar_t)
-
-#undef GTEST_FORMAT_CHAR_PTR_IMPL_
-
 // Constructs and returns the message for an equality assertion
 // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
 //
@@ -273,12 +188,12 @@ GTEST_FORMAT_CHAR_PTR_IMPL_(const wchar_t)
 // be inserted into the message.
 GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
                                      const char* actual_expression,
-                                     const String& expected_value,
-                                     const String& actual_value,
+                                     const std::string& expected_value,
+                                     const std::string& actual_value,
                                      bool ignoring_case);
 
 // Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
-GTEST_API_ String GetBoolAssertionFailureMessage(
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
     const AssertionResult& assertion_result,
     const char* expression_text,
     const char* actual_predicate_value,
@@ -353,7 +268,7 @@ class FloatingPoint {
   // bits.  Therefore, 4 should be enough for ordinary use.
   //
   // See the following article for more details on ULP:
-  // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.
+  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
   static const size_t kMaxUlps = 4;
 
   // Constructs a FloatingPoint from a raw floating-point number.
@@ -380,6 +295,9 @@ class FloatingPoint {
     return ReinterpretBits(kExponentBitMask);
   }
 
+  // Returns the maximum representable finite floating-point number.
+  static RawType Max();
+
   // Non-static methods
 
   // Returns the bits that represents this number.
@@ -460,6 +378,13 @@ class FloatingPoint {
   FloatingPointUnion u_;
 };
 
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
 // Typedefs the instances of the FloatingPoint template class that we
 // care to use.
 typedef FloatingPoint<float> Float;
@@ -554,7 +479,7 @@ typedef void (*TearDownTestCaseFunc)();
 //   test_case_name:   name of the test case
 //   name:             name of the test
 //   type_param        the name of the test's type parameter, or NULL if
-//                     this is not  a typed or a type-parameterized test.
+//                     this is not a typed or a type-parameterized test.
 //   value_param       text representation of the test's value parameter,
 //                     or NULL if this is not a type-parameterized test.
 //   fixture_class_id: ID of the test fixture class
@@ -564,7 +489,8 @@ typedef void (*TearDownTestCaseFunc)();
 //                     The newly created TestInfo instance will assume
 //                     ownership of the factory object.
 GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
-    const char* test_case_name, const char* name,
+    const char* test_case_name,
+    const char* name,
     const char* type_param,
     const char* value_param,
     TypeId fixture_class_id,
@@ -624,9 +550,9 @@ inline const char* SkipComma(const char* str) {
 
 // Returns the prefix of 'str' before the first comma in it; returns
 // the entire string if it contains no comma.
-inline String GetPrefixUntilComma(const char* str) {
+inline std::string GetPrefixUntilComma(const char* str) {
   const char* comma = strchr(str, ',');
-  return comma == NULL ? String(str) : String(str, comma - str);
+  return comma == NULL ? str : std::string(str, comma);
 }
 
 // TypeParameterizedTest<Fixture, TestSel, Types>::Register()
@@ -652,8 +578,8 @@ class TypeParameterizedTest {
     // First, registers the first type-parameterized test in the type
     // list.
     MakeAndRegisterTestInfo(
-        String::Format("%s%s%s/%d", prefix, prefix[0] == '\0' ? "" : "/",
-                       case_name, index).c_str(),
+        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+         + StreamableToString(index)).c_str(),
         GetPrefixUntilComma(test_names).c_str(),
         GetTypeName<Type>().c_str(),
         NULL,  // No value parameter.
@@ -711,7 +637,7 @@ class TypeParameterizedTestCase<Fixture, Templates0, Types> {
 
 #endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
 
-// Returns the current OS stack trace as a String.
+// Returns the current OS stack trace as an std::string.
 //
 // The maximum number of stack frames to be included is specified by
 // the gtest_stack_trace_depth flag.  The skip_count parameter
@@ -721,8 +647,8 @@ class TypeParameterizedTestCase<Fixture, Templates0, Types> {
 // For example, if Foo() calls Bar(), which in turn calls
 // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
 // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
-GTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test,
-                                                  int skip_count);
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+    UnitTest* unit_test, int skip_count);
 
 // Helpers for suppressing warnings on unreachable code or constant
 // condition.
@@ -797,13 +723,19 @@ struct RemoveConst<const T> { typedef T type; };  // NOLINT
 // MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
 // definition to fail to remove the const in 'const int[3]' and 'const
 // char[3][4]'.  The following specialization works around the bug.
-// However, it causes trouble with GCC and thus needs to be
-// conditionally compiled.
-#if defined(_MSC_VER) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
 template <typename T, size_t N>
 struct RemoveConst<const T[N]> {
   typedef typename RemoveConst<T>::type type[N];
 };
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
 #endif
 
 // A handy wrapper around RemoveConst that works when the argument
diff --git a/test/gtest/include/gtest/internal/gtest-linked_ptr.h b/test/gtest/include/gtest/internal/gtest-linked_ptr.h
index 57147b4..b1362cd 100644
--- a/test/gtest/include/gtest/internal/gtest-linked_ptr.h
+++ b/test/gtest/include/gtest/internal/gtest-linked_ptr.h
@@ -105,8 +105,8 @@ class linked_ptr_internal {
   // framework.
 
   // Join an existing circle.
-  // L < g_linked_ptr_mutex
-  void join(linked_ptr_internal const* ptr) {
+  void join(linked_ptr_internal const* ptr)
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
     MutexLock lock(&g_linked_ptr_mutex);
 
     linked_ptr_internal const* p = ptr;
@@ -117,8 +117,8 @@ class linked_ptr_internal {
 
   // Leave whatever circle we're part of.  Returns true if we were the
   // last member of the circle.  Once this is done, you can join() another.
-  // L < g_linked_ptr_mutex
-  bool depart() {
+  bool depart()
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
     MutexLock lock(&g_linked_ptr_mutex);
 
     if (next_ == this) return true;
diff --git a/test/gtest/include/gtest/internal/gtest-param-util-generated.h b/test/gtest/include/gtest/internal/gtest-param-util-generated.h
index 2582675..e805485 100644
--- a/test/gtest/include/gtest/internal/gtest-param-util-generated.h
+++ b/test/gtest/include/gtest/internal/gtest-param-util-generated.h
@@ -95,7 +95,7 @@ class ValueArray2 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
     return ValuesIn(array);
   }
 
@@ -114,7 +114,8 @@ class ValueArray3 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_)};
     return ValuesIn(array);
   }
 
@@ -135,7 +136,8 @@ class ValueArray4 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_)};
     return ValuesIn(array);
   }
 
@@ -157,7 +159,8 @@ class ValueArray5 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
     return ValuesIn(array);
   }
 
@@ -181,7 +184,9 @@ class ValueArray6 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_)};
     return ValuesIn(array);
   }
 
@@ -206,7 +211,9 @@ class ValueArray7 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_)};
     return ValuesIn(array);
   }
 
@@ -233,7 +240,9 @@ class ValueArray8 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
     return ValuesIn(array);
   }
 
@@ -261,7 +270,10 @@ class ValueArray9 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_)};
     return ValuesIn(array);
   }
 
@@ -290,7 +302,10 @@ class ValueArray10 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_)};
     return ValuesIn(array);
   }
 
@@ -321,7 +336,10 @@ class ValueArray11 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
     return ValuesIn(array);
   }
 
@@ -353,8 +371,11 @@ class ValueArray12 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_)};
     return ValuesIn(array);
   }
 
@@ -388,8 +409,11 @@ class ValueArray13 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_)};
     return ValuesIn(array);
   }
 
@@ -424,8 +448,11 @@ class ValueArray14 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
     return ValuesIn(array);
   }
 
@@ -461,8 +488,12 @@ class ValueArray15 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_)};
     return ValuesIn(array);
   }
 
@@ -501,8 +532,12 @@ class ValueArray16 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_)};
     return ValuesIn(array);
   }
 
@@ -542,8 +577,12 @@ class ValueArray17 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
     return ValuesIn(array);
   }
 
@@ -584,8 +623,13 @@ class ValueArray18 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_)};
     return ValuesIn(array);
   }
 
@@ -627,8 +671,13 @@ class ValueArray19 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_)};
     return ValuesIn(array);
   }
 
@@ -672,8 +721,13 @@ class ValueArray20 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
     return ValuesIn(array);
   }
 
@@ -719,8 +773,14 @@ class ValueArray21 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_)};
     return ValuesIn(array);
   }
 
@@ -767,8 +827,14 @@ class ValueArray22 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_)};
     return ValuesIn(array);
   }
 
@@ -817,9 +883,14 @@ class ValueArray23 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
-        v23_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
     return ValuesIn(array);
   }
 
@@ -869,9 +940,15 @@ class ValueArray24 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_)};
     return ValuesIn(array);
   }
 
@@ -922,9 +999,15 @@ class ValueArray25 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_)};
     return ValuesIn(array);
   }
 
@@ -977,9 +1060,15 @@ class ValueArray26 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
     return ValuesIn(array);
   }
 
@@ -1034,9 +1123,16 @@ class ValueArray27 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_)};
     return ValuesIn(array);
   }
 
@@ -1092,9 +1188,16 @@ class ValueArray28 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_)};
     return ValuesIn(array);
   }
 
@@ -1151,9 +1254,16 @@ class ValueArray29 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
     return ValuesIn(array);
   }
 
@@ -1212,9 +1322,17 @@ class ValueArray30 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_)};
     return ValuesIn(array);
   }
 
@@ -1275,9 +1393,17 @@ class ValueArray31 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_)};
     return ValuesIn(array);
   }
 
@@ -1339,9 +1465,17 @@ class ValueArray32 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
     return ValuesIn(array);
   }
 
@@ -1405,9 +1539,18 @@ class ValueArray33 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_)};
     return ValuesIn(array);
   }
 
@@ -1472,9 +1615,18 @@ class ValueArray34 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_)};
     return ValuesIn(array);
   }
 
@@ -1540,10 +1692,18 @@ class ValueArray35 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
-        v35_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
     return ValuesIn(array);
   }
 
@@ -1611,10 +1771,19 @@ class ValueArray36 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_)};
     return ValuesIn(array);
   }
 
@@ -1684,10 +1853,19 @@ class ValueArray37 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_)};
     return ValuesIn(array);
   }
 
@@ -1758,10 +1936,19 @@ class ValueArray38 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
     return ValuesIn(array);
   }
 
@@ -1833,10 +2020,20 @@ class ValueArray39 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_)};
     return ValuesIn(array);
   }
 
@@ -1910,10 +2107,20 @@ class ValueArray40 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_)};
     return ValuesIn(array);
   }
 
@@ -1989,10 +2196,20 @@ class ValueArray41 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
     return ValuesIn(array);
   }
 
@@ -2069,10 +2286,21 @@ class ValueArray42 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_)};
     return ValuesIn(array);
   }
 
@@ -2150,10 +2378,21 @@ class ValueArray43 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_)};
     return ValuesIn(array);
   }
 
@@ -2233,10 +2472,21 @@ class ValueArray44 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
     return ValuesIn(array);
   }
 
@@ -2317,10 +2567,22 @@ class ValueArray45 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_)};
     return ValuesIn(array);
   }
 
@@ -2403,10 +2665,22 @@ class ValueArray46 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_)};
     return ValuesIn(array);
   }
 
@@ -2491,11 +2765,22 @@ class ValueArray47 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
-        v47_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
     return ValuesIn(array);
   }
 
@@ -2581,11 +2866,23 @@ class ValueArray48 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
-        v48_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_)};
     return ValuesIn(array);
   }
 
@@ -2672,11 +2969,23 @@ class ValueArray49 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
-        v48_, v49_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_)};
     return ValuesIn(array);
   }
 
@@ -2764,11 +3073,23 @@ class ValueArray50 {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
-        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
-        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
-        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
-        v48_, v49_, v50_};
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
     return ValuesIn(array);
   }
 
diff --git a/test/gtest/include/gtest/internal/gtest-param-util-generated.h.pump b/test/gtest/include/gtest/internal/gtest-param-util-generated.h.pump
index dbe9386..009206f 100644
--- a/test/gtest/include/gtest/internal/gtest-param-util-generated.h.pump
+++ b/test/gtest/include/gtest/internal/gtest-param-util-generated.h.pump
@@ -98,7 +98,7 @@ class ValueArray$i {
 
   template <typename T>
   operator ParamGenerator<T>() const {
-    const T array[] = {$for j, [[v$(j)_]]};
+    const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]};
     return ValuesIn(array);
   }
 
diff --git a/test/gtest/include/gtest/internal/gtest-param-util.h b/test/gtest/include/gtest/internal/gtest-param-util.h
index 0ef9718..d5e1028 100644
--- a/test/gtest/include/gtest/internal/gtest-param-util.h
+++ b/test/gtest/include/gtest/internal/gtest-param-util.h
@@ -494,10 +494,10 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
         const string& instantiation_name = gen_it->first;
         ParamGenerator<ParamType> generator((*gen_it->second)());
 
-        Message test_case_name_stream;
+        string test_case_name;
         if ( !instantiation_name.empty() )
-          test_case_name_stream << instantiation_name << "/";
-        test_case_name_stream << test_info->test_case_base_name;
+          test_case_name = instantiation_name + "/";
+        test_case_name += test_info->test_case_base_name;
 
         int i = 0;
         for (typename ParamGenerator<ParamType>::iterator param_it =
@@ -506,7 +506,7 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
           Message test_name_stream;
           test_name_stream << test_info->test_base_name << "/" << i;
           MakeAndRegisterTestInfo(
-              test_case_name_stream.GetString().c_str(),
+              test_case_name.c_str(),
               test_name_stream.GetString().c_str(),
               NULL,  // No type parameter.
               PrintToString(*param_it).c_str(),
diff --git a/test/gtest/include/gtest/internal/gtest-port.h b/test/gtest/include/gtest/internal/gtest-port.h
index 157b47f..ab40df1 100644
--- a/test/gtest/include/gtest/internal/gtest-port.h
+++ b/test/gtest/include/gtest/internal/gtest-port.h
@@ -32,9 +32,14 @@
 // Low-level types and utilities for porting Google Test to various
 // platforms.  They are subject to change without notice.  DO NOT USE
 // THEM IN USER CODE.
+//
+// This file is fundamental to Google Test.  All other Google Test source
+// files are expected to #include this.  Therefore, it cannot #include
+// any other Google Test header.
 
 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#pragma GCC system_header
 
 // The user can define the following macros in the build script to
 // control Google Test's behavior.  If the user doesn't define a macro
@@ -72,6 +77,8 @@
 //                              Test's own tr1 tuple implementation should be
 //                              used.  Unused when the user sets
 //                              GTEST_HAS_TR1_TUPLE to 0.
+//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
+//                              is building in C++11/C++98 mode.
 //   GTEST_LINKED_AS_SHARED_LIBRARY
 //                            - Define to 1 when compiling tests that use
 //                              Google Test as a shared library (known as
@@ -90,7 +97,11 @@
 //   GTEST_OS_LINUX    - Linux
 //     GTEST_OS_LINUX_ANDROID - Google Android
 //   GTEST_OS_MAC      - Mac OS X
+//     GTEST_OS_IOS    - iOS
+//       GTEST_OS_IOS_SIMULATOR - iOS simulator
 //   GTEST_OS_NACL     - Google Native Client (NaCl)
+//   GTEST_OS_OPENBSD  - OpenBSD
+//   GTEST_OS_QNX      - QNX
 //   GTEST_OS_SOLARIS  - Sun Solaris
 //   GTEST_OS_SYMBIAN  - Symbian
 //   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
@@ -175,7 +186,7 @@
 //   GTEST_FLAG()       - references a flag.
 //   GTEST_DECLARE_*()  - declares a flag.
 //   GTEST_DEFINE_*()   - defines a flag.
-//   GetArgvs()         - returns the command line as a vector of strings.
+//   GetInjectableArgvs() - returns the command line as a vector of strings.
 //
 // Environment variable utilities:
 //   GetEnv()             - gets the value of an environment variable.
@@ -193,6 +204,11 @@
 # include <sys/stat.h>
 #endif  // !_WIN32_WCE
 
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
 #include <iostream>  // NOLINT
 #include <sstream>  // NOLINT
 #include <string>  // NOLINT
@@ -227,11 +243,17 @@
 # endif  // _WIN32_WCE
 #elif defined __APPLE__
 # define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+#  define GTEST_OS_IOS 1
+#  if TARGET_IPHONE_SIMULATOR
+#   define GTEST_OS_IOS_SIMULATOR 1
+#  endif
+# endif
 #elif defined __linux__
 # define GTEST_OS_LINUX 1
-# ifdef ANDROID
+# if defined __ANDROID__
 #  define GTEST_OS_LINUX_ANDROID 1
-# endif  // ANDROID
+# endif
 #elif defined __MVS__
 # define GTEST_OS_ZOS 1
 #elif defined(__sun) && defined(__SVR4)
@@ -242,8 +264,25 @@
 # define GTEST_OS_HPUX 1
 #elif defined __native_client__
 # define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
 #endif  // __CYGWIN__
 
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+#  define GTEST_LANG_CXX11 1
+# else
+#  define GTEST_LANG_CXX11 0
+# endif
+#endif
+
 // Brings in definitions for functions used in the testing::internal::posix
 // namespace (read, write, close, chdir, isatty, stat). We do not currently
 // use them on Windows Mobile.
@@ -252,20 +291,25 @@
 // is not the case, we need to include headers that provide the functions
 // mentioned above.
 # include <unistd.h>
-# if !GTEST_OS_NACL
-// TODO(vladl at google.com): Remove this condition when Native Client SDK adds
-// strings.h (tracked in
-// http://code.google.com/p/nativeclient/issues/detail?id=1175).
-#  include <strings.h>  // Native Client doesn't provide strings.h.
-# endif
+# include <strings.h>
 #elif !GTEST_OS_WINDOWS_MOBILE
 # include <direct.h>
 # include <io.h>
 #endif
 
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+#  include <android/api-level.h>  // NOLINT
+#endif
+
 // Defines this to true iff Google Test can use POSIX regular expressions.
 #ifndef GTEST_HAS_POSIX_RE
-# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
 #endif
 
 #if GTEST_HAS_POSIX_RE
@@ -380,11 +424,27 @@
 # elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
 
 #  ifdef __GXX_RTTI
-#   define GTEST_HAS_RTTI 1
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+       !defined(__EXCEPTIONS)
+#    define GTEST_HAS_RTTI 0
+#   else
+#    define GTEST_HAS_RTTI 1
+#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
 #  else
 #   define GTEST_HAS_RTTI 0
 #  endif  // __GXX_RTTI
 
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
 // Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
 // both the typeid and dynamic_cast features are present.
 # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
@@ -417,7 +477,8 @@
 //
 // To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
 // to your compiler flags.
-# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX)
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+    || GTEST_OS_QNX)
 #endif  // GTEST_HAS_PTHREAD
 
 #if GTEST_HAS_PTHREAD
@@ -433,8 +494,13 @@
 // this macro to 0 to prevent Google Test from using tuple (any
 // feature depending on tuple with be disabled in this mode).
 #ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+#  define GTEST_HAS_TR1_TUPLE 0
+# else
 // The user didn't tell us not to do it, so we assume it's OK.
-# define GTEST_HAS_TR1_TUPLE 1
+#  define GTEST_HAS_TR1_TUPLE 1
+# endif
 #endif  // GTEST_HAS_TR1_TUPLE
 
 // Determines whether Google Test's own tr1 tuple implementation
@@ -443,14 +509,28 @@
 // The user didn't tell us, so we need to figure it out.
 
 // We use our own TR1 tuple if we aren't sure the user has an
-// implementation of it already.  At this time, GCC 4.0.0+ and MSVC
-// 2010 are the only mainstream compilers that come with a TR1 tuple
-// implementation.  NVIDIA's CUDA NVCC compiler pretends to be GCC by
-// defining __GNUC__ and friends, but cannot compile GCC's tuple
-// implementation.  MSVC 2008 (9.0) provides TR1 tuple in a 323 MB
-// Feature Pack download, which we cannot assume the user has.
-# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \
-    || _MSC_VER >= 1600
+// implementation of it already.  At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has.  QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+#  define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
 #  define GTEST_USE_OWN_TR1_TUPLE 0
 # else
 #  define GTEST_USE_OWN_TR1_TUPLE 1
@@ -465,6 +545,22 @@
 
 # if GTEST_USE_OWN_TR1_TUPLE
 #  include "gtest/internal/gtest-tuple.h"
+# elif GTEST_ENV_HAS_STD_TUPLE_
+#  include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
 # elif GTEST_OS_SYMBIAN
 
 // On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
@@ -515,7 +611,16 @@
 // The user didn't tell us, so we need to figure it out.
 
 # if GTEST_OS_LINUX && !defined(__ia64__)
-#  define GTEST_HAS_CLONE 1
+#  if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+#    if defined(__arm__) && __ANDROID_API__ >= 9
+#     define GTEST_HAS_CLONE 1
+#    else
+#     define GTEST_HAS_CLONE 0
+#    endif
+#  else
+#   define GTEST_HAS_CLONE 1
+#  endif
 # else
 #  define GTEST_HAS_CLONE 0
 # endif  // GTEST_OS_LINUX && !defined(__ia64__)
@@ -538,9 +643,11 @@
 // Google Test does not support death tests for VC 7.1 and earlier as
 // abort() in a VC 7.1 application compiled as GUI in debug config
 // pops up a dialog window that cannot be suppressed programmatically.
-#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
      (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
-     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX)
+     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+     GTEST_OS_OPENBSD || GTEST_OS_QNX)
 # define GTEST_HAS_DEATH_TEST 1
 # include <vector>  // NOLINT
 #endif
@@ -669,13 +776,23 @@
 # define GTEST_NO_INLINE_
 #endif
 
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
 namespace testing {
 
 class Message;
 
 namespace internal {
 
-class String;
+// A secret type that Google Test users don't know about.  It has no
+// definition on purpose.  Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
 
 // The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
 // expression is true. For example, you could use it to verify the
@@ -697,8 +814,8 @@ struct CompileAssert {
 };
 
 #define GTEST_COMPILE_ASSERT_(expr, msg) \
-  typedef ::testing::internal::CompileAssert<(bool(expr))> \
-      msg[bool(expr) ? 1 : -1]
+  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
 
 // Implementation details of GTEST_COMPILE_ASSERT_:
 //
@@ -796,6 +913,7 @@ class scoped_ptr {
       ptr_ = p;
     }
   }
+
  private:
   T* ptr_;
 
@@ -858,10 +976,9 @@ class GTEST_API_ RE {
  private:
   void Init(const char* regex);
 
-  // We use a const char* instead of a string, as Google Test may be used
-  // where string is not available.  We also do not use Google Test's own
-  // String type here, in order to simplify dependencies between the
-  // files.
+  // We use a const char* instead of an std::string, as Google Test used to be
+  // used where std::string is not available.  TODO(wan at google.com): change to
+  // std::string.
   const char* pattern_;
   bool is_valid_;
 
@@ -1044,20 +1161,21 @@ Derived* CheckedDowncastToActualType(Base* base) {
 //   GetCapturedStderr - stops capturing stderr and returns the captured string.
 //
 GTEST_API_ void CaptureStdout();
-GTEST_API_ String GetCapturedStdout();
+GTEST_API_ std::string GetCapturedStdout();
 GTEST_API_ void CaptureStderr();
-GTEST_API_ String GetCapturedStderr();
+GTEST_API_ std::string GetCapturedStderr();
 
 #endif  // GTEST_HAS_STREAM_REDIRECTION
 
 
 #if GTEST_HAS_DEATH_TEST
 
-// A copy of all command line arguments.  Set by InitGoogleTest().
-extern ::std::vector<String> g_argvs;
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+                             new_argvs);
 
-// GTEST_HAS_DEATH_TEST implies we have ::std::string.
-const ::std::vector<String>& GetArgvs();
+// A copy of all command line arguments.  Set by InitGoogleTest().
+extern ::std::vector<testing::internal::string> g_argvs;
 
 #endif  // GTEST_HAS_DEATH_TEST
 
@@ -1084,22 +1202,37 @@ inline void SleepMilliseconds(int n) {
 // use it in user tests, either directly or indirectly.
 class Notification {
  public:
-  Notification() : notified_(false) {}
+  Notification() : notified_(false) {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+  }
+  ~Notification() {
+    pthread_mutex_destroy(&mutex_);
+  }
 
   // Notifies all threads created with this notification to start. Must
   // be called from the controller thread.
-  void Notify() { notified_ = true; }
+  void Notify() {
+    pthread_mutex_lock(&mutex_);
+    notified_ = true;
+    pthread_mutex_unlock(&mutex_);
+  }
 
   // Blocks until the controller thread notifies. Must be called from a test
   // thread.
   void WaitForNotification() {
-    while(!notified_) {
+    for (;;) {
+      pthread_mutex_lock(&mutex_);
+      const bool notified = notified_;
+      pthread_mutex_unlock(&mutex_);
+      if (notified)
+        break;
       SleepMilliseconds(10);
     }
   }
 
  private:
-  volatile bool notified_;
+  pthread_mutex_t mutex_;
+  bool notified_;
 
   GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
 };
@@ -1207,21 +1340,23 @@ class MutexBase {
   void Lock() {
     GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
     owner_ = pthread_self();
+    has_owner_ = true;
   }
 
   // Releases this mutex.
   void Unlock() {
-    // We don't protect writing to owner_ here, as it's the caller's
-    // responsibility to ensure that the current thread holds the
+    // Since the lock is being released the owner_ field should no longer be
+    // considered valid. We don't protect writing to has_owner_ here, as it's
+    // the caller's responsibility to ensure that the current thread holds the
     // mutex when this is called.
-    owner_ = 0;
+    has_owner_ = false;
     GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
   }
 
   // Does nothing if the current thread holds the mutex. Otherwise, crashes
   // with high probability.
   void AssertHeld() const {
-    GTEST_CHECK_(owner_ == pthread_self())
+    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
         << "The current thread is not holding the mutex @" << this;
   }
 
@@ -1232,7 +1367,14 @@ class MutexBase {
   // have to be public.
  public:
   pthread_mutex_t mutex_;  // The underlying pthread mutex.
-  pthread_t owner_;  // The thread holding the mutex; 0 means no one holds it.
+  // has_owner_ indicates whether the owner_ field below contains a valid thread
+  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+  // accesses to the owner_ field should be protected by a check of this field.
+  // An alternative might be to memset() owner_ to all zeros, but there's no
+  // guarantee that a zero'd pthread_t is necessarily invalid or even different
+  // from pthread_self().
+  bool has_owner_;
+  pthread_t owner_;  // The thread holding the mutex.
 };
 
 // Forward-declares a static mutex.
@@ -1240,8 +1382,13 @@ class MutexBase {
     extern ::testing::internal::MutexBase mutex
 
 // Defines and statically (i.e. at link time) initializes a static mutex.
+// The initialization list here does not explicitly initialize each field,
+// instead relying on default initialization for the unspecified fields. In
+// particular, the owner_ field (a pthread_t) is not explicitly initialized.
+// This allows initialization to work whether pthread_t is a scalar or struct.
+// The flag -Wmissing-field-initializers must not be specified for this to work.
 # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
-    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 }
+    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
 
 // The Mutex class can only be used for mutexes created at runtime. It
 // shares its API with MutexBase otherwise.
@@ -1249,7 +1396,7 @@ class Mutex : public MutexBase {
  public:
   Mutex() {
     GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
-    owner_ = 0;
+    has_owner_ = false;
   }
   ~Mutex() {
     GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
@@ -1399,6 +1546,8 @@ class ThreadLocal {
 class Mutex {
  public:
   Mutex() {}
+  void Lock() {}
+  void Unlock() {}
   void AssertHeld() const {}
 };
 
@@ -1529,6 +1678,10 @@ inline bool IsUpper(char ch) {
 inline bool IsXDigit(char ch) {
   return isxdigit(static_cast<unsigned char>(ch)) != 0;
 }
+inline bool IsXDigit(wchar_t ch) {
+  const unsigned char low_byte = static_cast<unsigned char>(ch);
+  return ch == low_byte && isxdigit(low_byte) != 0;
+}
 
 inline char ToLower(char ch) {
   return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
@@ -1666,6 +1819,23 @@ inline void Abort() { abort(); }
 
 }  // namespace posix
 
+// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that.  We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
 // The maximum number a BiggestInt can represent.  This definition
 // works no matter BiggestInt is represented in one's complement or
 // two's complement.
@@ -1718,7 +1888,6 @@ class TypeWithSize<4> {
 template <>
 class TypeWithSize<8> {
  public:
-
 #if GTEST_OS_WINDOWS
   typedef __int64 Int;
   typedef unsigned __int64 UInt;
@@ -1745,7 +1914,7 @@ typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
 #define GTEST_DECLARE_int32_(name) \
     GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
 #define GTEST_DECLARE_string_(name) \
-    GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name)
+    GTEST_API_ extern ::std::string GTEST_FLAG(name)
 
 // Macros for defining flags.
 #define GTEST_DEFINE_bool_(name, default_val, doc) \
@@ -1753,7 +1922,11 @@ typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
 #define GTEST_DEFINE_int32_(name, default_val, doc) \
     GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
 #define GTEST_DEFINE_string_(name, default_val, doc) \
-    GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val)
+    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+// Thread annotations
+#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+#define GTEST_LOCK_EXCLUDED_(locks)
 
 // Parses 'str' for a 32-bit signed integer.  If successful, writes the result
 // to *value and returns true; otherwise leaves *value unchanged and returns
diff --git a/test/gtest/include/gtest/internal/gtest-string.h b/test/gtest/include/gtest/internal/gtest-string.h
index dc3a07b..97f1a7f 100644
--- a/test/gtest/include/gtest/internal/gtest-string.h
+++ b/test/gtest/include/gtest/internal/gtest-string.h
@@ -47,50 +47,18 @@
 #endif
 
 #include <string.h>
-#include "gtest/internal/gtest-port.h"
-
 #include <string>
 
+#include "gtest/internal/gtest-port.h"
+
 namespace testing {
 namespace internal {
 
-// String - a UTF-8 string class.
-//
-// For historic reasons, we don't use std::string.
-//
-// TODO(wan at google.com): replace this class with std::string or
-// implement it in terms of the latter.
-//
-// Note that String can represent both NULL and the empty string,
-// while std::string cannot represent NULL.
-//
-// NULL and the empty string are considered different.  NULL is less
-// than anything (including the empty string) except itself.
-//
-// This class only provides minimum functionality necessary for
-// implementing Google Test.  We do not intend to implement a full-fledged
-// string class here.
-//
-// Since the purpose of this class is to provide a substitute for
-// std::string on platforms where it cannot be used, we define a copy
-// constructor and assignment operators such that we don't need
-// conditional compilation in a lot of places.
-//
-// In order to make the representation efficient, the d'tor of String
-// is not virtual.  Therefore DO NOT INHERIT FROM String.
+// String - an abstract class holding static string utilities.
 class GTEST_API_ String {
  public:
   // Static utility methods
 
-  // Returns the input enclosed in double quotes if it's not NULL;
-  // otherwise returns "(null)".  For example, "\"Hello\"" is returned
-  // for input "Hello".
-  //
-  // This is useful for printing a C string in the syntax of a literal.
-  //
-  // Known issue: escape sequences are not handled yet.
-  static String ShowCStringQuoted(const char* c_str);
-
   // Clones a 0-terminated C string, allocating memory using new.  The
   // caller is responsible for deleting the return value using
   // delete[].  Returns the cloned string, or NULL if the input is
@@ -137,11 +105,7 @@ class GTEST_API_ String {
   // NULL will be converted to "(null)".  If an error occurred during
   // the conversion, "(failed to convert from wide string)" is
   // returned.
-  static String ShowWideCString(const wchar_t* wide_c_str);
-
-  // Similar to ShowWideCString(), except that this function encloses
-  // the converted string in double quotes.
-  static String ShowWideCStringQuoted(const wchar_t* wide_c_str);
+  static std::string ShowWideCString(const wchar_t* wide_c_str);
 
   // Compares two wide C strings.  Returns true iff they have the same
   // content.
@@ -175,174 +139,27 @@ class GTEST_API_ String {
   static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
                                                const wchar_t* rhs);
 
-  // Formats a list of arguments to a String, using the same format
-  // spec string as for printf.
-  //
-  // We do not use the StringPrintf class as it is not universally
-  // available.
-  //
-  // The result is limited to 4096 characters (including the tailing
-  // 0).  If 4096 characters are not enough to format the input,
-  // "<buffer exceeded>" is returned.
-  static String Format(const char* format, ...);
-
-  // C'tors
-
-  // The default c'tor constructs a NULL string.
-  String() : c_str_(NULL), length_(0) {}
-
-  // Constructs a String by cloning a 0-terminated C string.
-  String(const char* a_c_str) {  // NOLINT
-    if (a_c_str == NULL) {
-      c_str_ = NULL;
-      length_ = 0;
-    } else {
-      ConstructNonNull(a_c_str, strlen(a_c_str));
-    }
-  }
+  // Returns true iff the given string ends with the given suffix, ignoring
+  // case. Any string is considered to end with an empty suffix.
+  static bool EndsWithCaseInsensitive(
+      const std::string& str, const std::string& suffix);
 
-  // Constructs a String by copying a given number of chars from a
-  // buffer.  E.g. String("hello", 3) creates the string "hel",
-  // String("a\0bcd", 4) creates "a\0bc", String(NULL, 0) creates "",
-  // and String(NULL, 1) results in access violation.
-  String(const char* buffer, size_t a_length) {
-    ConstructNonNull(buffer, a_length);
-  }
+  // Formats an int value as "%02d".
+  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
 
-  // The copy c'tor creates a new copy of the string.  The two
-  // String objects do not share content.
-  String(const String& str) : c_str_(NULL), length_(0) { *this = str; }
+  // Formats an int value as "%X".
+  static std::string FormatHexInt(int value);
 
-  // D'tor.  String is intended to be a final class, so the d'tor
-  // doesn't need to be virtual.
-  ~String() { delete[] c_str_; }
-
-  // Allows a String to be implicitly converted to an ::std::string or
-  // ::string, and vice versa.  Converting a String containing a NULL
-  // pointer to ::std::string or ::string is undefined behavior.
-  // Converting a ::std::string or ::string containing an embedded NUL
-  // character to a String will result in the prefix up to the first
-  // NUL character.
-  String(const ::std::string& str) {
-    ConstructNonNull(str.c_str(), str.length());
-  }
-
-  operator ::std::string() const { return ::std::string(c_str(), length()); }
-
-#if GTEST_HAS_GLOBAL_STRING
-  String(const ::string& str) {
-    ConstructNonNull(str.c_str(), str.length());
-  }
-
-  operator ::string() const { return ::string(c_str(), length()); }
-#endif  // GTEST_HAS_GLOBAL_STRING
-
-  // Returns true iff this is an empty string (i.e. "").
-  bool empty() const { return (c_str() != NULL) && (length() == 0); }
-
-  // Compares this with another String.
-  // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
-  // if this is greater than rhs.
-  int Compare(const String& rhs) const;
-
-  // Returns true iff this String equals the given C string.  A NULL
-  // string and a non-NULL string are considered not equal.
-  bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; }
-
-  // Returns true iff this String is less than the given String.  A
-  // NULL string is considered less than "".
-  bool operator<(const String& rhs) const { return Compare(rhs) < 0; }
-
-  // Returns true iff this String doesn't equal the given C string.  A NULL
-  // string and a non-NULL string are considered not equal.
-  bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); }
-
-  // Returns true iff this String ends with the given suffix.  *Any*
-  // String is considered to end with a NULL or empty suffix.
-  bool EndsWith(const char* suffix) const;
-
-  // Returns true iff this String ends with the given suffix, not considering
-  // case. Any String is considered to end with a NULL or empty suffix.
-  bool EndsWithCaseInsensitive(const char* suffix) const;
-
-  // Returns the length of the encapsulated string, or 0 if the
-  // string is NULL.
-  size_t length() const { return length_; }
-
-  // Gets the 0-terminated C string this String object represents.
-  // The String object still owns the string.  Therefore the caller
-  // should NOT delete the return value.
-  const char* c_str() const { return c_str_; }
-
-  // Assigns a C string to this object.  Self-assignment works.
-  const String& operator=(const char* a_c_str) {
-    return *this = String(a_c_str);
-  }
-
-  // Assigns a String object to this object.  Self-assignment works.
-  const String& operator=(const String& rhs) {
-    if (this != &rhs) {
-      delete[] c_str_;
-      if (rhs.c_str() == NULL) {
-        c_str_ = NULL;
-        length_ = 0;
-      } else {
-        ConstructNonNull(rhs.c_str(), rhs.length());
-      }
-    }
-
-    return *this;
-  }
+  // Formats a byte as "%02X".
+  static std::string FormatByte(unsigned char value);
 
  private:
-  // Constructs a non-NULL String from the given content.  This
-  // function can only be called when c_str_ has not been allocated.
-  // ConstructNonNull(NULL, 0) results in an empty string ("").
-  // ConstructNonNull(NULL, non_zero) is undefined behavior.
-  void ConstructNonNull(const char* buffer, size_t a_length) {
-    char* const str = new char[a_length + 1];
-    memcpy(str, buffer, a_length);
-    str[a_length] = '\0';
-    c_str_ = str;
-    length_ = a_length;
-  }
-
-  const char* c_str_;
-  size_t length_;
+  String();  // Not meant to be instantiated.
 };  // class String
 
-// Streams a String to an ostream.  Each '\0' character in the String
-// is replaced with "\\0".
-inline ::std::ostream& operator<<(::std::ostream& os, const String& str) {
-  if (str.c_str() == NULL) {
-    os << "(null)";
-  } else {
-    const char* const c_str = str.c_str();
-    for (size_t i = 0; i != str.length(); i++) {
-      if (c_str[i] == '\0') {
-        os << "\\0";
-      } else {
-        os << c_str[i];
-      }
-    }
-  }
-  return os;
-}
-
-// Gets the content of the stringstream's buffer as a String.  Each '\0'
+// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
 // character in the buffer is replaced with "\\0".
-GTEST_API_ String StringStreamToString(::std::stringstream* stream);
-
-// Converts a streamable value to a String.  A NULL pointer is
-// converted to "(null)".  When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-
-// Declared here but defined in gtest.h, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable);
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
 
 }  // namespace internal
 }  // namespace testing
diff --git a/test/gtest/include/gtest/internal/gtest-tuple.h b/test/gtest/include/gtest/internal/gtest-tuple.h
index d1af50e..7b3dfc3 100644
--- a/test/gtest/include/gtest/internal/gtest-tuple.h
+++ b/test/gtest/include/gtest/internal/gtest-tuple.h
@@ -1,4 +1,6 @@
-// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!
+// This file was GENERATED by command:
+//     pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
 
 // Copyright 2009 Google Inc.
 // All Rights Reserved.
@@ -140,34 +142,54 @@ template <bool kIndexValid, int kIndex, class Tuple>
 struct TupleElement;
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+  typedef T0 type;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+  typedef T1 type;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+  typedef T2 type;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+  typedef T3 type;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+  typedef T4 type;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+  typedef T5 type;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+  typedef T6 type;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+  typedef T7 type;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+  typedef T8 type;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+  typedef T9 type;
+};
 
 }  // namespace gtest_internal
 
@@ -708,37 +730,59 @@ inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
 template <typename Tuple> struct tuple_size;
 
 template <GTEST_0_TYPENAMES_(T)>
-struct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+  static const int value = 0;
+};
 
 template <GTEST_1_TYPENAMES_(T)>
-struct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+  static const int value = 1;
+};
 
 template <GTEST_2_TYPENAMES_(T)>
-struct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+  static const int value = 2;
+};
 
 template <GTEST_3_TYPENAMES_(T)>
-struct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+  static const int value = 3;
+};
 
 template <GTEST_4_TYPENAMES_(T)>
-struct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+  static const int value = 4;
+};
 
 template <GTEST_5_TYPENAMES_(T)>
-struct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+  static const int value = 5;
+};
 
 template <GTEST_6_TYPENAMES_(T)>
-struct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+  static const int value = 6;
+};
 
 template <GTEST_7_TYPENAMES_(T)>
-struct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+  static const int value = 7;
+};
 
 template <GTEST_8_TYPENAMES_(T)>
-struct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+  static const int value = 8;
+};
 
 template <GTEST_9_TYPENAMES_(T)>
-struct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+  static const int value = 9;
+};
 
 template <GTEST_10_TYPENAMES_(T)>
-struct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+  static const int value = 10;
+};
 
 template <int k, class Tuple>
 struct tuple_element {
@@ -922,8 +966,8 @@ template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
 inline bool operator==(const GTEST_10_TUPLE_(T)& t,
                        const GTEST_10_TUPLE_(U)& u) {
   return gtest_internal::SameSizeTuplePrefixComparator<
-      tuple_size<GTEST_10_TUPLE_(T)>::value,
-      tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);
+      tuple_size<GTEST_10_TUPLE_(T) >::value,
+      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
 }
 
 template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
diff --git a/test/gtest/include/gtest/internal/gtest-tuple.h.pump b/test/gtest/include/gtest/internal/gtest-tuple.h.pump
index ef51909..c7d9e03 100644
--- a/test/gtest/include/gtest/internal/gtest-tuple.h.pump
+++ b/test/gtest/include/gtest/internal/gtest-tuple.h.pump
@@ -118,8 +118,9 @@ struct TupleElement;
 
 $for i [[
 template <GTEST_$(n)_TYPENAMES_(T)>
-struct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T)> [[]]
-{ typedef T$i type; };
+struct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T) > {
+  typedef T$i type;
+};
 
 
 ]]
@@ -220,7 +221,9 @@ template <typename Tuple> struct tuple_size;
 
 $for j [[
 template <GTEST_$(j)_TYPENAMES_(T)>
-struct tuple_size<GTEST_$(j)_TUPLE_(T)> { static const int value = $j; };
+struct tuple_size<GTEST_$(j)_TUPLE_(T) > {
+  static const int value = $j;
+};
 
 
 ]]
@@ -302,8 +305,8 @@ template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
 inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t,
                        const GTEST_$(n)_TUPLE_(U)& u) {
   return gtest_internal::SameSizeTuplePrefixComparator<
-      tuple_size<GTEST_$(n)_TUPLE_(T)>::value,
-      tuple_size<GTEST_$(n)_TUPLE_(U)>::value>::Eq(t, u);
+      tuple_size<GTEST_$(n)_TUPLE_(T) >::value,
+      tuple_size<GTEST_$(n)_TUPLE_(U) >::value>::Eq(t, u);
 }
 
 template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
diff --git a/test/gtest/include/gtest/internal/gtest-type-util.h b/test/gtest/include/gtest/internal/gtest-type-util.h
index b7b01b0..e46f7cf 100644
--- a/test/gtest/include/gtest/internal/gtest-type-util.h
+++ b/test/gtest/include/gtest/internal/gtest-type-util.h
@@ -45,15 +45,14 @@
 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
 
 #include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-string.h"
 
 // #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
 // libstdc++ (which is where cxxabi.h comes from).
-# ifdef __GLIBCXX__
+# if GTEST_HAS_CXXABI_H_
 #  include <cxxabi.h>
 # elif defined(__HP_aCC)
 #  include <acxx_demangle.h>
-# endif  // __GLIBCXX__
+# endif  // GTEST_HASH_CXXABI_H_
 
 namespace testing {
 namespace internal {
@@ -62,24 +61,24 @@ namespace internal {
 // NB: This function is also used in Google Mock, so don't move it inside of
 // the typed-test-only section below.
 template <typename T>
-String GetTypeName() {
+std::string GetTypeName() {
 # if GTEST_HAS_RTTI
 
   const char* const name = typeid(T).name();
-#  if defined(__GLIBCXX__) || defined(__HP_aCC)
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
   int status = 0;
   // gcc's implementation of typeid(T).name() mangles the type name,
   // so we have to demangle it.
-#   ifdef __GLIBCXX__
+#   if GTEST_HAS_CXXABI_H_
   using abi::__cxa_demangle;
-#   endif // __GLIBCXX__
+#   endif  // GTEST_HAS_CXXABI_H_
   char* const readable_name = __cxa_demangle(name, 0, 0, &status);
-  const String name_str(status == 0 ? readable_name : name);
+  const std::string name_str(status == 0 ? readable_name : name);
   free(readable_name);
   return name_str;
 #  else
   return name;
-#  endif  // __GLIBCXX__ || __HP_aCC
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
 
 # else
 
@@ -3300,7 +3299,9 @@ struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
 // INSTANTIATE_TYPED_TEST_CASE_P().
 
 template <typename T>
-struct TypeList { typedef Types1<T> type; };
+struct TypeList {
+  typedef Types1<T> type;
+};
 
 template <typename T1, typename T2, typename T3, typename T4, typename T5,
     typename T6, typename T7, typename T8, typename T9, typename T10,
diff --git a/test/gtest/include/gtest/internal/gtest-type-util.h.pump b/test/gtest/include/gtest/internal/gtest-type-util.h.pump
index 27f331d..251fdf0 100644
--- a/test/gtest/include/gtest/internal/gtest-type-util.h.pump
+++ b/test/gtest/include/gtest/internal/gtest-type-util.h.pump
@@ -43,15 +43,14 @@ $var n = 50  $$ Maximum length of type lists we want to support.
 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
 
 #include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-string.h"
 
 // #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
 // libstdc++ (which is where cxxabi.h comes from).
-# ifdef __GLIBCXX__
+# if GTEST_HAS_CXXABI_H_
 #  include <cxxabi.h>
 # elif defined(__HP_aCC)
 #  include <acxx_demangle.h>
-# endif  // __GLIBCXX__
+# endif  // GTEST_HASH_CXXABI_H_
 
 namespace testing {
 namespace internal {
@@ -60,24 +59,24 @@ namespace internal {
 // NB: This function is also used in Google Mock, so don't move it inside of
 // the typed-test-only section below.
 template <typename T>
-String GetTypeName() {
+std::string GetTypeName() {
 # if GTEST_HAS_RTTI
 
   const char* const name = typeid(T).name();
-#  if defined(__GLIBCXX__) || defined(__HP_aCC)
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
   int status = 0;
   // gcc's implementation of typeid(T).name() mangles the type name,
   // so we have to demangle it.
-#   ifdef __GLIBCXX__
+#   if GTEST_HAS_CXXABI_H_
   using abi::__cxa_demangle;
-#   endif // __GLIBCXX__
+#   endif  // GTEST_HAS_CXXABI_H_
   char* const readable_name = __cxa_demangle(name, 0, 0, &status);
-  const String name_str(status == 0 ? readable_name : name);
+  const std::string name_str(status == 0 ? readable_name : name);
   free(readable_name);
   return name_str;
 #  else
   return name;
-#  endif  // __GLIBCXX__ || __HP_aCC
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
 
 # else
 
@@ -279,7 +278,9 @@ struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
 // INSTANTIATE_TYPED_TEST_CASE_P().
 
 template <typename T>
-struct TypeList { typedef Types1<T> type; };
+struct TypeList {
+  typedef Types1<T> type;
+};
 
 
 $range i 1..n
diff --git a/test/gtest/src/gtest-death-test.cc b/test/gtest/src/gtest-death-test.cc
index 8b2e413..a6023fc 100644
--- a/test/gtest/src/gtest-death-test.cc
+++ b/test/gtest/src/gtest-death-test.cc
@@ -43,6 +43,11 @@
 # include <errno.h>
 # include <fcntl.h>
 # include <limits.h>
+
+# if GTEST_OS_LINUX
+#  include <signal.h>
+# endif  // GTEST_OS_LINUX
+
 # include <stdarg.h>
 
 # if GTEST_OS_WINDOWS
@@ -52,6 +57,10 @@
 #  include <sys/wait.h>
 # endif  // GTEST_OS_WINDOWS
 
+# if GTEST_OS_QNX
+#  include <spawn.h>
+# endif  // GTEST_OS_QNX
+
 #endif  // GTEST_HAS_DEATH_TEST
 
 #include "gtest/gtest-message.h"
@@ -100,13 +109,42 @@ GTEST_DEFINE_string_(
     "Indicates the file, line number, temporal index of "
     "the single death test to run, and a file descriptor to "
     "which a success code may be sent, all separated by "
-    "colons.  This flag is specified if and only if the current "
+    "the '|' characters.  This flag is specified if and only if the current "
     "process is a sub-process launched for running a thread-safe "
     "death test.  FOR INTERNAL USE ONLY.");
 }  // namespace internal
 
 #if GTEST_HAS_DEATH_TEST
 
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+static bool g_in_fast_death_test_child = false;
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+  // On Windows, death tests are thread-safe regardless of the value of the
+  // death_test_style flag.
+  return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe")
+    return !GTEST_FLAG(internal_run_death_test).empty();
+  else
+    return g_in_fast_death_test_child;
+#endif
+}
+
+}  // namespace internal
+
 // ExitedWithCode constructor.
 ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
 }
@@ -141,7 +179,7 @@ namespace internal {
 
 // Generates a textual description of a given exit code, in the format
 // specified by wait(2).
-static String ExitSummary(int exit_code) {
+static std::string ExitSummary(int exit_code) {
   Message m;
 
 # if GTEST_OS_WINDOWS
@@ -176,7 +214,7 @@ bool ExitedUnsuccessfully(int exit_status) {
 // one thread running, or cannot determine the number of threads, prior
 // to executing the given statement.  It is the responsibility of the
 // caller not to pass a thread_count of 1.
-static String DeathTestThreadWarning(size_t thread_count) {
+static std::string DeathTestThreadWarning(size_t thread_count) {
   Message msg;
   msg << "Death tests use fork(), which is unsafe particularly"
       << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
@@ -210,7 +248,7 @@ enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
 // message is propagated back to the parent process.  Otherwise, the
 // message is simply printed to stderr.  In either case, the program
 // then exits with status 1.
-void DeathTestAbort(const String& message) {
+void DeathTestAbort(const std::string& message) {
   // On a POSIX system, this function may be called from a threadsafe-style
   // death test child process, which operates on a very small stack.  Use
   // the heap for any additional non-minuscule memory requirements.
@@ -234,9 +272,10 @@ void DeathTestAbort(const String& message) {
 # define GTEST_DEATH_TEST_CHECK_(expression) \
   do { \
     if (!::testing::internal::IsTrue(expression)) { \
-      DeathTestAbort(::testing::internal::String::Format( \
-          "CHECK failed: File %s, line %d: %s", \
-          __FILE__, __LINE__, #expression)); \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression); \
     } \
   } while (::testing::internal::AlwaysFalse())
 
@@ -254,15 +293,16 @@ void DeathTestAbort(const String& message) {
       gtest_retval = (expression); \
     } while (gtest_retval == -1 && errno == EINTR); \
     if (gtest_retval == -1) { \
-      DeathTestAbort(::testing::internal::String::Format( \
-          "CHECK failed: File %s, line %d: %s != -1", \
-          __FILE__, __LINE__, #expression)); \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression + " != -1"); \
     } \
   } while (::testing::internal::AlwaysFalse())
 
 // Returns the message describing the last system error in errno.
-String GetLastErrnoDescription() {
-    return String(errno == 0 ? "" : posix::StrError(errno));
+std::string GetLastErrnoDescription() {
+    return errno == 0 ? "" : posix::StrError(errno);
 }
 
 // This is called from a death test parent process to read a failure
@@ -312,11 +352,11 @@ const char* DeathTest::LastMessage() {
   return last_death_test_message_.c_str();
 }
 
-void DeathTest::set_last_death_test_message(const String& message) {
+void DeathTest::set_last_death_test_message(const std::string& message) {
   last_death_test_message_ = message;
 }
 
-String DeathTest::last_death_test_message_;
+std::string DeathTest::last_death_test_message_;
 
 // Provides cross platform implementation for some death functionality.
 class DeathTestImpl : public DeathTest {
@@ -491,7 +531,7 @@ bool DeathTestImpl::Passed(bool status_ok) {
   if (!spawned())
     return false;
 
-  const String error_message = GetCapturedStderr();
+  const std::string error_message = GetCapturedStderr();
 
   bool success = false;
   Message buffer;
@@ -673,22 +713,19 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
       FALSE,   // The initial state is non-signalled.
       NULL));  // The even is unnamed.
   GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
-  const String filter_flag = String::Format("--%s%s=%s.%s",
-                                            GTEST_FLAG_PREFIX_, kFilterFlag,
-                                            info->test_case_name(),
-                                            info->name());
-  const String internal_flag = String::Format(
-    "--%s%s=%s|%d|%d|%u|%Iu|%Iu",
-      GTEST_FLAG_PREFIX_,
-      kInternalRunDeathTestFlag,
-      file_, line_,
-      death_test_index,
-      static_cast<unsigned int>(::GetCurrentProcessId()),
-      // size_t has the same with as pointers on both 32-bit and 64-bit
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+      info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+      "=" + file_ + "|" + StreamableToString(line_) + "|" +
+      StreamableToString(death_test_index) + "|" +
+      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+      // size_t has the same width as pointers on both 32-bit and 64-bit
       // Windows platforms.
       // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
-      reinterpret_cast<size_t>(write_handle),
-      reinterpret_cast<size_t>(event_handle_.Get()));
+      "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+      "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
 
   char executable_path[_MAX_PATH + 1];  // NOLINT
   GTEST_DEATH_TEST_CHECK_(
@@ -696,10 +733,9 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {
                                             executable_path,
                                             _MAX_PATH));
 
-  String command_line = String::Format("%s %s \"%s\"",
-                                       ::GetCommandLineA(),
-                                       filter_flag.c_str(),
-                                       internal_flag.c_str());
+  std::string command_line =
+      std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+      internal_flag + "\"";
 
   DeathTest::set_last_death_test_message("");
 
@@ -816,6 +852,7 @@ DeathTest::TestRole NoExecDeathTest::AssumeRole() {
     // Event forwarding to the listeners of event listener API mush be shut
     // down in death test subprocesses.
     GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+    g_in_fast_death_test_child = true;
     return EXECUTE_TEST;
   } else {
     GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
@@ -835,6 +872,11 @@ class ExecDeathTest : public ForkingDeathTest {
       ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
   virtual TestRole AssumeRole();
  private:
+  static ::std::vector<testing::internal::string>
+  GetArgvsForDeathTestChildProcess() {
+    ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+    return args;
+  }
   // The name of the file in which the death test is located.
   const char* const file_;
   // The line number on which the death test is located.
@@ -869,6 +911,7 @@ class Arguments {
   char* const* Argv() {
     return &args_[0];
   }
+
  private:
   std::vector<char*> args_;
 };
@@ -894,6 +937,7 @@ extern "C" char** environ;
 inline char** GetEnviron() { return environ; }
 #  endif  // GTEST_OS_MAC
 
+#  if !GTEST_OS_QNX
 // The main function for a threadsafe-style death test child process.
 // This function is called in a clone()-ed process and thus must avoid
 // any potentially unsafe operations like malloc or libc functions.
@@ -908,9 +952,8 @@ static int ExecDeathTestChildMain(void* child_arg) {
       UnitTest::GetInstance()->original_working_dir();
   // We can safely call chdir() as it's a direct system call.
   if (chdir(original_dir) != 0) {
-    DeathTestAbort(String::Format("chdir(\"%s\") failed: %s",
-                                  original_dir,
-                                  GetLastErrnoDescription().c_str()));
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
     return EXIT_FAILURE;
   }
 
@@ -920,12 +963,12 @@ static int ExecDeathTestChildMain(void* child_arg) {
   // invoke the test program via a valid path that contains at least
   // one path separator.
   execve(args->argv[0], args->argv, GetEnviron());
-  DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s",
-                                args->argv[0],
-                                original_dir,
-                                GetLastErrnoDescription().c_str()));
+  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+                 original_dir + " failed: " +
+                 GetLastErrnoDescription());
   return EXIT_FAILURE;
 }
+#  endif  // !GTEST_OS_QNX
 
 // Two utility routines that together determine the direction the stack
 // grows.
@@ -936,25 +979,75 @@ static int ExecDeathTestChildMain(void* child_arg) {
 // GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
 // StackLowerThanAddress into StackGrowsDown, which then doesn't give
 // correct answer.
-bool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_;
-bool StackLowerThanAddress(const void* ptr) {
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
   int dummy;
-  return &dummy < ptr;
+  *result = (&dummy < ptr);
 }
 
 bool StackGrowsDown() {
   int dummy;
-  return StackLowerThanAddress(&dummy);
+  bool result;
+  StackLowerThanAddress(&dummy, &result);
+  return result;
 }
 
-// A threadsafe implementation of fork(2) for threadsafe-style death tests
-// that uses clone(2).  It dies with an error message if anything goes
-// wrong.
-static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test.  The
+// implementation uses fork(2) + exec.  On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe.  On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead.  The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
   ExecDeathTestArgs args = { argv, close_fd };
   pid_t child_pid = -1;
 
-#  if GTEST_HAS_CLONE
+#  if GTEST_OS_QNX
+  // Obtains the current directory and sets it to be closed in the child
+  // process.
+  const int cwd_fd = open(".", O_RDONLY);
+  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  int fd_flags;
+  // Set close_fd to be closed after spawn.
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+                                        fd_flags | FD_CLOEXEC));
+  struct inheritance inherit = {0};
+  // spawn is a system call.
+  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+  // Restores the current working directory.
+  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+#  else   // GTEST_OS_QNX
+#   if GTEST_OS_LINUX
+  // When a SIGPROF signal is received while fork() or clone() are executing,
+  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+  // it after the call to fork()/clone() is complete.
+  struct sigaction saved_sigprof_action;
+  struct sigaction ignore_sigprof_action;
+  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+  sigemptyset(&ignore_sigprof_action.sa_mask);
+  ignore_sigprof_action.sa_handler = SIG_IGN;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+#   endif  // GTEST_OS_LINUX
+
+#   if GTEST_HAS_CLONE
   const bool use_fork = GTEST_FLAG(death_test_use_fork);
 
   if (!use_fork) {
@@ -964,21 +1057,37 @@ static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
     void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
                              MAP_ANON | MAP_PRIVATE, -1, 0);
     GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+    // Maximum stack alignment in bytes:  For a downward-growing stack, this
+    // amount is subtracted from size of the stack space to get an address
+    // that is within the stack space and is aligned on all systems we care
+    // about.  As far as I know there is no ABI with stack alignment greater
+    // than 64.  We assume stack and stack_size already have alignment of
+    // kMaxStackAlignment.
+    const size_t kMaxStackAlignment = 64;
     void* const stack_top =
-        static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);
+        static_cast<char*>(stack) +
+            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
 
     child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
 
     GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
   }
-#  else
+#   else
   const bool use_fork = true;
-#  endif  // GTEST_HAS_CLONE
+#   endif  // GTEST_HAS_CLONE
 
   if (use_fork && (child_pid = fork()) == 0) {
       ExecDeathTestChildMain(&args);
       _exit(0);
   }
+#  endif  // GTEST_OS_QNX
+#  if GTEST_OS_LINUX
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(
+      sigaction(SIGPROF, &saved_sigprof_action, NULL));
+#  endif  // GTEST_OS_LINUX
 
   GTEST_DEATH_TEST_CHECK_(child_pid != -1);
   return child_pid;
@@ -1006,16 +1115,16 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
   // it be closed when the child process does an exec:
   GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
 
-  const String filter_flag =
-      String::Format("--%s%s=%s.%s",
-                     GTEST_FLAG_PREFIX_, kFilterFlag,
-                     info->test_case_name(), info->name());
-  const String internal_flag =
-      String::Format("--%s%s=%s|%d|%d|%d",
-                     GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
-                     file_, line_, death_test_index, pipe_fd[1]);
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+      + info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+      + file_ + "|" + StreamableToString(line_) + "|"
+      + StreamableToString(death_test_index) + "|"
+      + StreamableToString(pipe_fd[1]);
   Arguments args;
-  args.AddArguments(GetArgvs());
+  args.AddArguments(GetArgvsForDeathTestChildProcess());
   args.AddArgument(filter_flag.c_str());
   args.AddArgument(internal_flag.c_str());
 
@@ -1026,7 +1135,7 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
   // is necessary.
   FlushInfoLog();
 
-  const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
+  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
   GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
   set_child_pid(child_pid);
   set_read_fd(pipe_fd[0]);
@@ -1052,9 +1161,10 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
 
   if (flag != NULL) {
     if (death_test_index > flag->index()) {
-      DeathTest::set_last_death_test_message(String::Format(
-          "Death test count (%d) somehow exceeded expected maximum (%d)",
-          death_test_index, flag->index()));
+      DeathTest::set_last_death_test_message(
+          "Death test count (" + StreamableToString(death_test_index)
+          + ") somehow exceeded expected maximum ("
+          + StreamableToString(flag->index()) + ")");
       return false;
     }
 
@@ -1083,9 +1193,9 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
 # endif  // GTEST_OS_WINDOWS
 
   else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
-    DeathTest::set_last_death_test_message(String::Format(
-        "Unknown death test style \"%s\" encountered",
-        GTEST_FLAG(death_test_style).c_str()));
+    DeathTest::set_last_death_test_message(
+        "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+        + "\" encountered");
     return false;
   }
 
@@ -1123,8 +1233,8 @@ int GetStatusFileDescriptor(unsigned int parent_process_id,
                                                    FALSE,  // Non-inheritable.
                                                    parent_process_id));
   if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
-    DeathTestAbort(String::Format("Unable to open parent process %u",
-                                  parent_process_id));
+    DeathTestAbort("Unable to open parent process " +
+                   StreamableToString(parent_process_id));
   }
 
   // TODO(vladl at google.com): Replace the following check with a
@@ -1144,9 +1254,10 @@ int GetStatusFileDescriptor(unsigned int parent_process_id,
                                  // DUPLICATE_SAME_ACCESS is used.
                          FALSE,  // Request non-inheritable handler.
                          DUPLICATE_SAME_ACCESS)) {
-    DeathTestAbort(String::Format(
-        "Unable to duplicate the pipe handle %Iu from the parent process %u",
-        write_handle_as_size_t, parent_process_id));
+    DeathTestAbort("Unable to duplicate the pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
   }
 
   const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
@@ -1157,17 +1268,18 @@ int GetStatusFileDescriptor(unsigned int parent_process_id,
                          0x0,
                          FALSE,
                          DUPLICATE_SAME_ACCESS)) {
-    DeathTestAbort(String::Format(
-        "Unable to duplicate the event handle %Iu from the parent process %u",
-        event_handle_as_size_t, parent_process_id));
+    DeathTestAbort("Unable to duplicate the event handle " +
+                   StreamableToString(event_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
   }
 
   const int write_fd =
       ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
   if (write_fd == -1) {
-    DeathTestAbort(String::Format(
-        "Unable to convert pipe handle %Iu to a file descriptor",
-        write_handle_as_size_t));
+    DeathTestAbort("Unable to convert pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " to a file descriptor");
   }
 
   // Signals the parent that the write end of the pipe has been acquired
@@ -1204,9 +1316,8 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
       || !ParseNaturalNumber(fields[3], &parent_process_id)
       || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
       || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
-    DeathTestAbort(String::Format(
-        "Bad --gtest_internal_run_death_test flag: %s",
-        GTEST_FLAG(internal_run_death_test).c_str()));
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+                   GTEST_FLAG(internal_run_death_test));
   }
   write_fd = GetStatusFileDescriptor(parent_process_id,
                                      write_handle_as_size_t,
@@ -1217,9 +1328,8 @@ InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
       || !ParseNaturalNumber(fields[1], &line)
       || !ParseNaturalNumber(fields[2], &index)
       || !ParseNaturalNumber(fields[3], &write_fd)) {
-    DeathTestAbort(String::Format(
-        "Bad --gtest_internal_run_death_test flag: %s",
-        GTEST_FLAG(internal_run_death_test).c_str()));
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+        + GTEST_FLAG(internal_run_death_test));
   }
 
 # endif  // GTEST_OS_WINDOWS
diff --git a/test/gtest/src/gtest-filepath.cc b/test/gtest/src/gtest-filepath.cc
index 91b2571..6be58b6 100644
--- a/test/gtest/src/gtest-filepath.cc
+++ b/test/gtest/src/gtest-filepath.cc
@@ -29,6 +29,7 @@
 //
 // Authors: keith.ray at gmail.com (Keith Ray)
 
+#include "gtest/gtest-message.h"
 #include "gtest/internal/gtest-filepath.h"
 #include "gtest/internal/gtest-port.h"
 
@@ -39,8 +40,8 @@
 #elif GTEST_OS_WINDOWS
 # include <direct.h>
 # include <io.h>
-#elif GTEST_OS_SYMBIAN || GTEST_OS_NACL
-// Symbian OpenC and NaCl have PATH_MAX in sys/syslimits.h
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
 # include <sys/syslimits.h>
 #else
 # include <limits.h>
@@ -116,9 +117,10 @@ FilePath FilePath::GetCurrentDir() {
 // FilePath("dir/file"). If a case-insensitive extension is not
 // found, returns a copy of the original FilePath.
 FilePath FilePath::RemoveExtension(const char* extension) const {
-  String dot_extension(String::Format(".%s", extension));
-  if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) {
-    return FilePath(String(pathname_.c_str(), pathname_.length() - 4));
+  const std::string dot_extension = std::string(".") + extension;
+  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+    return FilePath(pathname_.substr(
+        0, pathname_.length() - dot_extension.length()));
   }
   return *this;
 }
@@ -147,7 +149,7 @@ const char* FilePath::FindLastPathSeparator() const {
 // On Windows platform, '\' is the path separator, otherwise it is '/'.
 FilePath FilePath::RemoveDirectoryName() const {
   const char* const last_sep = FindLastPathSeparator();
-  return last_sep ? FilePath(String(last_sep + 1)) : *this;
+  return last_sep ? FilePath(last_sep + 1) : *this;
 }
 
 // RemoveFileName returns the directory path with the filename removed.
@@ -158,9 +160,9 @@ FilePath FilePath::RemoveDirectoryName() const {
 // On Windows platform, '\' is the path separator, otherwise it is '/'.
 FilePath FilePath::RemoveFileName() const {
   const char* const last_sep = FindLastPathSeparator();
-  String dir;
+  std::string dir;
   if (last_sep) {
-    dir = String(c_str(), last_sep + 1 - c_str());
+    dir = std::string(c_str(), last_sep + 1 - c_str());
   } else {
     dir = kCurrentDirectoryString;
   }
@@ -177,11 +179,12 @@ FilePath FilePath::MakeFileName(const FilePath& directory,
                                 const FilePath& base_name,
                                 int number,
                                 const char* extension) {
-  String file;
+  std::string file;
   if (number == 0) {
-    file = String::Format("%s.%s", base_name.c_str(), extension);
+    file = base_name.string() + "." + extension;
   } else {
-    file = String::Format("%s_%d.%s", base_name.c_str(), number, extension);
+    file = base_name.string() + "_" + StreamableToString(number)
+        + "." + extension;
   }
   return ConcatPaths(directory, FilePath(file));
 }
@@ -193,8 +196,7 @@ FilePath FilePath::ConcatPaths(const FilePath& directory,
   if (directory.IsEmpty())
     return relative_path;
   const FilePath dir(directory.RemoveTrailingPathSeparator());
-  return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator,
-                                 relative_path.c_str()));
+  return FilePath(dir.string() + kPathSeparator + relative_path.string());
 }
 
 // Returns true if pathname describes something findable in the file-system,
@@ -338,7 +340,7 @@ bool FilePath::CreateFolder() const {
 // On Windows platform, uses \ as the separator, other platforms use /.
 FilePath FilePath::RemoveTrailingPathSeparator() const {
   return IsDirectory()
-      ? FilePath(String(pathname_.c_str(), pathname_.length() - 1))
+      ? FilePath(pathname_.substr(0, pathname_.length() - 1))
       : *this;
 }
 
diff --git a/test/gtest/src/gtest-internal-inl.h b/test/gtest/src/gtest-internal-inl.h
index 65a2101..35df303 100644
--- a/test/gtest/src/gtest-internal-inl.h
+++ b/test/gtest/src/gtest-internal-inl.h
@@ -58,6 +58,11 @@
 
 #include "gtest/internal/gtest-port.h"
 
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
 #if GTEST_OS_WINDOWS
 # include <windows.h>  // NOLINT
 #endif  // GTEST_OS_WINDOWS
@@ -112,6 +117,12 @@ GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
 // Formats the given time in milliseconds as seconds.
 GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
 
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information.  N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe.  Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
 // Parses a string for an Int32 flag, in the form of "--flag=value".
 //
 // On success, stores the value of the flag in *value, and returns
@@ -190,37 +201,35 @@ class GTestFlagSaver {
     GTEST_FLAG(stream_result_to) = stream_result_to_;
     GTEST_FLAG(throw_on_failure) = throw_on_failure_;
   }
+
  private:
   // Fields for saving the original values of flags.
   bool also_run_disabled_tests_;
   bool break_on_failure_;
   bool catch_exceptions_;
-  String color_;
-  String death_test_style_;
+  std::string color_;
+  std::string death_test_style_;
   bool death_test_use_fork_;
-  String filter_;
-  String internal_run_death_test_;
+  std::string filter_;
+  std::string internal_run_death_test_;
   bool list_tests_;
-  String output_;
+  std::string output_;
   bool print_time_;
-  bool pretty_;
   internal::Int32 random_seed_;
   internal::Int32 repeat_;
   bool shuffle_;
   internal::Int32 stack_trace_depth_;
-  String stream_result_to_;
+  std::string stream_result_to_;
   bool throw_on_failure_;
 } GTEST_ATTRIBUTE_UNUSED_;
 
 // Converts a Unicode code point to a narrow string in UTF-8 encoding.
 // code_point parameter is of type UInt32 because wchar_t may not be
 // wide enough to contain a code point.
-// The output buffer str must containt at least 32 characters.
-// The function returns the address of the output buffer.
 // If the code_point is not a valid Unicode code point
-// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'.
-GTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str);
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
 
 // Converts a wide string to a narrow string in UTF-8 encoding.
 // The wide string is assumed to have the following encoding:
@@ -235,7 +244,7 @@ GTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str);
 // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
 // and contains invalid UTF-16 surrogate pairs, values in those pairs
 // will be encoded as individual Unicode characters from Basic Normal Plane.
-GTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars);
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
 
 // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
 // if the variable is present. If a file already exists at this location, this
@@ -339,16 +348,15 @@ class TestPropertyKeyIs {
   // Constructor.
   //
   // TestPropertyKeyIs has NO default constructor.
-  explicit TestPropertyKeyIs(const char* key)
-      : key_(key) {}
+  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
 
   // Returns true iff the test name of test property matches on key_.
   bool operator()(const TestProperty& test_property) const {
-    return String(test_property.key()).Compare(key_) == 0;
+    return test_property.key() == key_;
   }
 
  private:
-  String key_;
+  std::string key_;
 };
 
 // Class UnitTestOptions.
@@ -366,12 +374,12 @@ class GTEST_API_ UnitTestOptions {
   // Functions for processing the gtest_output flag.
 
   // Returns the output format, or "" for normal printed output.
-  static String GetOutputFormat();
+  static std::string GetOutputFormat();
 
   // Returns the absolute path of the requested output file, or the
   // default (test_detail.xml in the original working directory) if
   // none was explicitly specified.
-  static String GetAbsolutePathToOutputFile();
+  static std::string GetAbsolutePathToOutputFile();
 
   // Functions for processing the gtest_filter flag.
 
@@ -384,8 +392,8 @@ class GTEST_API_ UnitTestOptions {
 
   // Returns true iff the user-specified filter matches the test case
   // name and the test name.
-  static bool FilterMatchesTest(const String &test_case_name,
-                                const String &test_name);
+  static bool FilterMatchesTest(const std::string &test_case_name,
+                                const std::string &test_name);
 
 #if GTEST_OS_WINDOWS
   // Function for supporting the gtest_catch_exception flag.
@@ -398,7 +406,7 @@ class GTEST_API_ UnitTestOptions {
 
   // Returns true if "name" matches the ':' separated list of glob-style
   // filters in "filter".
-  static bool MatchesFilter(const String& name, const char* filter);
+  static bool MatchesFilter(const std::string& name, const char* filter);
 };
 
 // Returns the current application's name, removing directory path if that
@@ -411,13 +419,13 @@ class OsStackTraceGetterInterface {
   OsStackTraceGetterInterface() {}
   virtual ~OsStackTraceGetterInterface() {}
 
-  // Returns the current OS stack trace as a String.  Parameters:
+  // Returns the current OS stack trace as an std::string.  Parameters:
   //
   //   max_depth  - the maximum number of stack frames to be included
   //                in the trace.
   //   skip_count - the number of top frames to be skipped; doesn't count
   //                against max_depth.
-  virtual String CurrentStackTrace(int max_depth, int skip_count) = 0;
+  virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
 
   // UponLeavingGTest() should be called immediately before Google Test calls
   // user code. It saves some information about the current stack that
@@ -432,8 +440,11 @@ class OsStackTraceGetterInterface {
 class OsStackTraceGetter : public OsStackTraceGetterInterface {
  public:
   OsStackTraceGetter() : caller_frame_(NULL) {}
-  virtual String CurrentStackTrace(int max_depth, int skip_count);
-  virtual void UponLeavingGTest();
+
+  virtual string CurrentStackTrace(int max_depth, int skip_count)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
 
   // This string is inserted in place of stack frames that are part of
   // Google Test's implementation.
@@ -455,7 +466,7 @@ class OsStackTraceGetter : public OsStackTraceGetterInterface {
 struct TraceInfo {
   const char* file;
   int line;
-  String message;
+  std::string message;
 };
 
 // This is the default global test part result reporter used in UnitTestImpl.
@@ -539,15 +550,25 @@ class GTEST_API_ UnitTestImpl {
   // Gets the number of failed tests.
   int failed_test_count() const;
 
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
   // Gets the number of disabled tests.
   int disabled_test_count() const;
 
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
   // Gets the number of all tests.
   int total_test_count() const;
 
   // Gets the number of tests that should run.
   int test_to_run_count() const;
 
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const { return start_timestamp_; }
+
   // Gets the elapsed time, in milliseconds.
   TimeInMillis elapsed_time() const { return elapsed_time_; }
 
@@ -596,7 +617,7 @@ class GTEST_API_ UnitTestImpl {
   // getter, and returns it.
   OsStackTraceGetterInterface* os_stack_trace_getter();
 
-  // Returns the current OS stack trace as a String.
+  // Returns the current OS stack trace as an std::string.
   //
   // The maximum number of stack frames to be included is specified by
   // the gtest_stack_trace_depth flag.  The skip_count parameter
@@ -606,7 +627,7 @@ class GTEST_API_ UnitTestImpl {
   // For example, if Foo() calls Bar(), which in turn calls
   // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
   // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
-  String CurrentOsStackTraceExceptTop(int skip_count);
+  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
 
   // Finds and returns a TestCase with the given name.  If one doesn't
   // exist, creates one and returns it.
@@ -696,6 +717,12 @@ class GTEST_API_ UnitTestImpl {
     ad_hoc_test_result_.Clear();
   }
 
+  // Adds a TestProperty to the current TestResult object when invoked in a
+  // context of a test or a test case, or to the global property set. If the
+  // result already contains a property with the same key, the value will be
+  // updated.
+  void RecordProperty(const TestProperty& test_property);
+
   enum ReactionToSharding {
     HONOR_SHARDING_PROTOCOL,
     IGNORE_SHARDING_PROTOCOL
@@ -880,6 +907,10 @@ class GTEST_API_ UnitTestImpl {
   // Our random number generator.
   internal::Random random_;
 
+  // The time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp_;
+
   // How long the test took to run, in milliseconds.
   TimeInMillis elapsed_time_;
 
@@ -935,7 +966,7 @@ GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
 
 // Returns the message describing the last system error, regardless of the
 // platform.
-GTEST_API_ String GetLastErrnoDescription();
+GTEST_API_ std::string GetLastErrnoDescription();
 
 # if GTEST_OS_WINDOWS
 // Provides leak-safe Windows kernel handle ownership.
@@ -1018,8 +1049,9 @@ bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
 class TestResultAccessor {
  public:
   static void RecordProperty(TestResult* test_result,
+                             const std::string& xml_element,
                              const TestProperty& property) {
-    test_result->RecordProperty(property);
+    test_result->RecordProperty(xml_element, property);
   }
 
   static void ClearTestPartResults(TestResult* test_result) {
@@ -1032,6 +1064,154 @@ class TestResultAccessor {
   }
 };
 
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class StreamingListener : public EmptyTestEventListener {
+ public:
+  // Abstract base class for writing strings to a socket.
+  class AbstractSocketWriter {
+   public:
+    virtual ~AbstractSocketWriter() {}
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) = 0;
+
+    // Closes the socket.
+    virtual void CloseConnection() {}
+
+    // Sends a string and a newline to the socket.
+    void SendLn(const string& message) {
+      Send(message + "\n");
+    }
+  };
+
+  // Concrete class for actually writing strings to a socket.
+  class SocketWriter : public AbstractSocketWriter {
+   public:
+    SocketWriter(const string& host, const string& port)
+        : sockfd_(-1), host_name_(host), port_num_(port) {
+      MakeConnection();
+    }
+
+    virtual ~SocketWriter() {
+      if (sockfd_ != -1)
+        CloseConnection();
+    }
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "Send() can be called only when there is a connection.";
+
+      const int len = static_cast<int>(message.length());
+      if (write(sockfd_, message.c_str(), len) != len) {
+        GTEST_LOG_(WARNING)
+            << "stream_result_to: failed to stream to "
+            << host_name_ << ":" << port_num_;
+      }
+    }
+
+   private:
+    // Creates a client socket and connects to the server.
+    void MakeConnection();
+
+    // Closes the socket.
+    void CloseConnection() {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "CloseConnection() can be called only when there is a connection.";
+
+      close(sockfd_);
+      sockfd_ = -1;
+    }
+
+    int sockfd_;  // socket file descriptor
+    const string host_name_;
+    const string port_num_;
+
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+  };  // class SocketWriter
+
+  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+  static string UrlEncode(const char* str);
+
+  StreamingListener(const string& host, const string& port)
+      : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+  explicit StreamingListener(AbstractSocketWriter* socket_writer)
+      : socket_writer_(socket_writer) { Start(); }
+
+  void OnTestProgramStart(const UnitTest& /* unit_test */) {
+    SendLn("event=TestProgramStart");
+  }
+
+  void OnTestProgramEnd(const UnitTest& unit_test) {
+    // Note that Google Test current only report elapsed time for each
+    // test iteration, not for the entire test program.
+    SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+    // Notify the streaming server to stop.
+    socket_writer_->CloseConnection();
+  }
+
+  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+    SendLn("event=TestIterationStart&iteration=" +
+           StreamableToString(iteration));
+  }
+
+  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+    SendLn("event=TestIterationEnd&passed=" +
+           FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+           StreamableToString(unit_test.elapsed_time()) + "ms");
+  }
+
+  void OnTestCaseStart(const TestCase& test_case) {
+    SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+  }
+
+  void OnTestCaseEnd(const TestCase& test_case) {
+    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+           + "ms");
+  }
+
+  void OnTestStart(const TestInfo& test_info) {
+    SendLn(std::string("event=TestStart&name=") + test_info.name());
+  }
+
+  void OnTestEnd(const TestInfo& test_info) {
+    SendLn("event=TestEnd&passed=" +
+           FormatBool((test_info.result())->Passed()) +
+           "&elapsed_time=" +
+           StreamableToString((test_info.result())->elapsed_time()) + "ms");
+  }
+
+  void OnTestPartResult(const TestPartResult& test_part_result) {
+    const char* file_name = test_part_result.file_name();
+    if (file_name == NULL)
+      file_name = "";
+    SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+           "&line=" + StreamableToString(test_part_result.line_number()) +
+           "&message=" + UrlEncode(test_part_result.message()));
+  }
+
+ private:
+  // Sends the given message and a newline to the socket.
+  void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+  // Called at the start of streaming to notify the receiver what
+  // protocol we are using.
+  void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+  string FormatBool(bool value) { return value ? "1" : "0"; }
+
+  const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+};  // class StreamingListener
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
 }  // namespace internal
 }  // namespace testing
 
diff --git a/test/gtest/src/gtest-port.cc b/test/gtest/src/gtest-port.cc
index b860d48..0c4df5f 100644
--- a/test/gtest/src/gtest-port.cc
+++ b/test/gtest/src/gtest-port.cc
@@ -51,6 +51,11 @@
 # include <mach/vm_map.h>
 #endif  // GTEST_OS_MAC
 
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <sys/procfs.h>
+#endif  // GTEST_OS_QNX
+
 #include "gtest/gtest-spi.h"
 #include "gtest/gtest-message.h"
 #include "gtest/internal/gtest-internal.h"
@@ -98,6 +103,26 @@ size_t GetThreadCount() {
   }
 }
 
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const int fd = open("/proc/self/as", O_RDONLY);
+  if (fd < 0) {
+    return 0;
+  }
+  procfs_info process_info;
+  const int status =
+      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+  close(fd);
+  if (status == EOK) {
+    return static_cast<size_t>(process_info.num_threads);
+  } else {
+    return 0;
+  }
+}
+
 #else
 
 size_t GetThreadCount() {
@@ -222,7 +247,7 @@ bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
 }
 
 // Helper function used by ValidateRegex() to format error messages.
-String FormatRegexSyntaxError(const char* regex, int index) {
+std::string FormatRegexSyntaxError(const char* regex, int index) {
   return (Message() << "Syntax error at index " << index
           << " in simple regular expression \"" << regex << "\": ").GetString();
 }
@@ -429,15 +454,15 @@ const char kUnknownFile[] = "unknown file";
 // Formats a source file path and a line number as they would appear
 // in an error message from the compiler used to compile this code.
 GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
-  const char* const file_name = file == NULL ? kUnknownFile : file;
+  const std::string file_name(file == NULL ? kUnknownFile : file);
 
   if (line < 0) {
-    return String::Format("%s:", file_name).c_str();
+    return file_name + ":";
   }
 #ifdef _MSC_VER
-  return String::Format("%s(%d):", file_name, line).c_str();
+  return file_name + "(" + StreamableToString(line) + "):";
 #else
-  return String::Format("%s:%d:", file_name, line).c_str();
+  return file_name + ":" + StreamableToString(line) + ":";
 #endif  // _MSC_VER
 }
 
@@ -448,12 +473,12 @@ GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
 // to the file location it produces, unlike FormatFileLocation().
 GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
     const char* file, int line) {
-  const char* const file_name = file == NULL ? kUnknownFile : file;
+  const std::string file_name(file == NULL ? kUnknownFile : file);
 
   if (line < 0)
     return file_name;
   else
-    return String::Format("%s:%d", file_name, line).c_str();
+    return file_name + ":" + StreamableToString(line);
 }
 
 
@@ -488,8 +513,7 @@ GTestLog::~GTestLog() {
 class CapturedStream {
  public:
   // The ctor redirects the stream to a temporary file.
-  CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
-
+  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
 # if GTEST_OS_WINDOWS
     char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
     char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
@@ -506,10 +530,29 @@ class CapturedStream {
                                     << temp_file_path;
     filename_ = temp_file_path;
 # else
-    // There's no guarantee that a test has write access to the
-    // current directory, so we create the temporary file in the /tmp
-    // directory instead.
+    // There's no guarantee that a test has write access to the current
+    // directory, so we create the temporary file in the /tmp directory
+    // instead. We use /tmp on most systems, and /sdcard on Android.
+    // That's because Android doesn't have /tmp.
+#  if GTEST_OS_LINUX_ANDROID
+    // Note: Android applications are expected to call the framework's
+    // Context.getExternalStorageDirectory() method through JNI to get
+    // the location of the world-writable SD Card directory. However,
+    // this requires a Context handle, which cannot be retrieved
+    // globally from native code. Doing so also precludes running the
+    // code as part of a regular standalone executable, which doesn't
+    // run in a Dalvik process (e.g. when running it through 'adb shell').
+    //
+    // The location /sdcard is directly accessible from native code
+    // and is the only location (unofficially) supported by the Android
+    // team. It's generally a symlink to the real SD Card mount point
+    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+    // other OEM-customized locations. Never rely on these, and always
+    // use /sdcard.
+    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+#  else
     char name_template[] = "/tmp/captured_stream.XXXXXX";
+#  endif  // GTEST_OS_LINUX_ANDROID
     const int captured_fd = mkstemp(name_template);
     filename_ = name_template;
 # endif  // GTEST_OS_WINDOWS
@@ -522,7 +565,7 @@ class CapturedStream {
     remove(filename_.c_str());
   }
 
-  String GetCapturedString() {
+  std::string GetCapturedString() {
     if (uncaptured_fd_ != -1) {
       // Restores the original stream.
       fflush(NULL);
@@ -532,14 +575,14 @@ class CapturedStream {
     }
 
     FILE* const file = posix::FOpen(filename_.c_str(), "r");
-    const String content = ReadEntireFile(file);
+    const std::string content = ReadEntireFile(file);
     posix::FClose(file);
     return content;
   }
 
  private:
-  // Reads the entire content of a file as a String.
-  static String ReadEntireFile(FILE* file);
+  // Reads the entire content of a file as an std::string.
+  static std::string ReadEntireFile(FILE* file);
 
   // Returns the size (in bytes) of a file.
   static size_t GetFileSize(FILE* file);
@@ -559,7 +602,7 @@ size_t CapturedStream::GetFileSize(FILE* file) {
 }
 
 // Reads the entire content of a file as a string.
-String CapturedStream::ReadEntireFile(FILE* file) {
+std::string CapturedStream::ReadEntireFile(FILE* file) {
   const size_t file_size = GetFileSize(file);
   char* const buffer = new char[file_size];
 
@@ -575,7 +618,7 @@ String CapturedStream::ReadEntireFile(FILE* file) {
     bytes_read += bytes_last_read;
   } while (bytes_last_read > 0 && bytes_read < file_size);
 
-  const String content(buffer, bytes_read);
+  const std::string content(buffer, bytes_read);
   delete[] buffer;
 
   return content;
@@ -598,8 +641,8 @@ void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
 }
 
 // Stops capturing the output stream and returns the captured string.
-String GetCapturedStream(CapturedStream** captured_stream) {
-  const String content = (*captured_stream)->GetCapturedString();
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+  const std::string content = (*captured_stream)->GetCapturedString();
 
   delete *captured_stream;
   *captured_stream = NULL;
@@ -618,21 +661,37 @@ void CaptureStderr() {
 }
 
 // Stops capturing stdout and returns the captured string.
-String GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); }
+std::string GetCapturedStdout() {
+  return GetCapturedStream(&g_captured_stdout);
+}
 
 // Stops capturing stderr and returns the captured string.
-String GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); }
+std::string GetCapturedStderr() {
+  return GetCapturedStream(&g_captured_stderr);
+}
 
 #endif  // GTEST_HAS_STREAM_REDIRECTION
 
 #if GTEST_HAS_DEATH_TEST
 
 // A copy of all command line arguments.  Set by InitGoogleTest().
-::std::vector<String> g_argvs;
+::std::vector<testing::internal::string> g_argvs;
 
-// Returns the command line as a vector of strings.
-const ::std::vector<String>& GetArgvs() { return g_argvs; }
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+                                        NULL;  // Owned.
 
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+  if (g_injected_test_argvs != argvs)
+    delete g_injected_test_argvs;
+  g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+  if (g_injected_test_argvs != NULL) {
+    return *g_injected_test_argvs;
+  }
+  return g_argvs;
+}
 #endif  // GTEST_HAS_DEATH_TEST
 
 #if GTEST_OS_WINDOWS_MOBILE
@@ -647,8 +706,8 @@ void Abort() {
 // Returns the name of the environment variable corresponding to the
 // given flag.  For example, FlagToEnvVar("foo") will return
 // "GTEST_FOO" in the open-source version.
-static String FlagToEnvVar(const char* flag) {
-  const String full_flag =
+static std::string FlagToEnvVar(const char* flag) {
+  const std::string full_flag =
       (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
 
   Message env_var;
@@ -705,7 +764,7 @@ bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
 //
 // The value is considered true iff it's not "0".
 bool BoolFromGTestEnv(const char* flag, bool default_value) {
-  const String env_var = FlagToEnvVar(flag);
+  const std::string env_var = FlagToEnvVar(flag);
   const char* const string_value = posix::GetEnv(env_var.c_str());
   return string_value == NULL ?
       default_value : strcmp(string_value, "0") != 0;
@@ -715,7 +774,7 @@ bool BoolFromGTestEnv(const char* flag, bool default_value) {
 // variable corresponding to the given flag; if it isn't set or
 // doesn't represent a valid 32-bit integer, returns default_value.
 Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
-  const String env_var = FlagToEnvVar(flag);
+  const std::string env_var = FlagToEnvVar(flag);
   const char* const string_value = posix::GetEnv(env_var.c_str());
   if (string_value == NULL) {
     // The environment variable is not set.
@@ -737,7 +796,7 @@ Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
 // Reads and returns the string environment variable corresponding to
 // the given flag; if it's not set, returns default_value.
 const char* StringFromGTestEnv(const char* flag, const char* default_value) {
-  const String env_var = FlagToEnvVar(flag);
+  const std::string env_var = FlagToEnvVar(flag);
   const char* const value = posix::GetEnv(env_var.c_str());
   return value == NULL ? default_value : value;
 }
diff --git a/test/gtest/src/gtest-printers.cc b/test/gtest/src/gtest-printers.cc
index ed63c7b..75fa408 100644
--- a/test/gtest/src/gtest-printers.cc
+++ b/test/gtest/src/gtest-printers.cc
@@ -55,14 +55,6 @@ namespace {
 
 using ::std::ostream;
 
-#if GTEST_OS_WINDOWS_MOBILE  // Windows CE does not define _snprintf_s.
-# define snprintf _snprintf
-#elif _MSC_VER >= 1400  // VC 8.0 and later deprecate snprintf and _snprintf.
-# define snprintf _snprintf_s
-#elif _MSC_VER
-# define snprintf _snprintf
-#endif  // GTEST_OS_WINDOWS_MOBILE
-
 // Prints a segment of bytes in the given object.
 void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
                                 size_t count, ostream* os) {
@@ -77,7 +69,7 @@ void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
       else
         *os << '-';
     }
-    snprintf(text, sizeof(text), "%02X", obj_bytes[j]);
+    GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
     *os << text;
   }
 }
@@ -184,16 +176,16 @@ static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
         *os << static_cast<char>(c);
         return kAsIs;
       } else {
-        *os << String::Format("\\x%X", static_cast<UnsignedChar>(c));
+        *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
         return kHexEscape;
       }
   }
   return kSpecialEscape;
 }
 
-// Prints a char c as if it's part of a string literal, escaping it when
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
 // necessary; returns how c was formatted.
-static CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) {
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
   switch (c) {
     case L'\'':
       *os << "'";
@@ -208,8 +200,9 @@ static CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) {
 
 // Prints a char c as if it's part of a string literal, escaping it when
 // necessary; returns how c was formatted.
-static CharFormat PrintAsNarrowStringLiteralTo(char c, ostream* os) {
-  return PrintAsWideStringLiteralTo(static_cast<unsigned char>(c), os);
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+  return PrintAsStringLiteralTo(
+      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
 }
 
 // Prints a wide or narrow character c and its code.  '\0' is printed
@@ -228,7 +221,7 @@ void PrintCharAndCodeTo(Char c, ostream* os) {
   // obvious).
   if (c == 0)
     return;
-  *os << " (" << String::Format("%d", c).c_str();
+  *os << " (" << static_cast<int>(c);
 
   // For more convenience, we print c's code again in hexidecimal,
   // unless c was already printed in the form '\x##' or the code is in
@@ -236,8 +229,7 @@ void PrintCharAndCodeTo(Char c, ostream* os) {
   if (format == kHexEscape || (1 <= c && c <= 9)) {
     // Do nothing.
   } else {
-    *os << String::Format(", 0x%X",
-                          static_cast<UnsignedChar>(c)).c_str();
+    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
   }
   *os << ")";
 }
@@ -255,48 +247,63 @@ void PrintTo(wchar_t wc, ostream* os) {
   PrintCharAndCodeTo<wchar_t>(wc, os);
 }
 
-// Prints the given array of characters to the ostream.
-// The array starts at *begin, the length is len, it may include '\0' characters
-// and may not be null-terminated.
-static void PrintCharsAsStringTo(const char* begin, size_t len, ostream* os) {
-  *os << "\"";
+// Prints the given array of characters to the ostream.  CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+static void PrintCharsAsStringTo(
+    const CharType* begin, size_t len, ostream* os) {
+  const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+  *os << kQuoteBegin;
   bool is_previous_hex = false;
   for (size_t index = 0; index < len; ++index) {
-    const char cur = begin[index];
+    const CharType cur = begin[index];
     if (is_previous_hex && IsXDigit(cur)) {
       // Previous character is of '\x..' form and this character can be
       // interpreted as another hexadecimal digit in its number. Break string to
       // disambiguate.
-      *os << "\" \"";
+      *os << "\" " << kQuoteBegin;
     }
-    is_previous_hex = PrintAsNarrowStringLiteralTo(cur, os) == kHexEscape;
+    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
   }
   *os << "\"";
 }
 
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'.  CharType must be either char or wchar_t.
+template <typename CharType>
+static void UniversalPrintCharArray(
+    const CharType* begin, size_t len, ostream* os) {
+  // The code
+  //   const char kFoo[] = "foo";
+  // generates an array of 4, not 3, elements, with the last one being '\0'.
+  //
+  // Therefore when printing a char array, we don't print the last element if
+  // it's '\0', such that the output matches the string literal as it's
+  // written in the source code.
+  if (len > 0 && begin[len - 1] == '\0') {
+    PrintCharsAsStringTo(begin, len - 1, os);
+    return;
+  }
+
+  // If, however, the last element in the array is not '\0', e.g.
+  //    const char kFoo[] = { 'f', 'o', 'o' };
+  // we must print the entire array.  We also print a message to indicate
+  // that the array is not NUL-terminated.
+  PrintCharsAsStringTo(begin, len, os);
+  *os << " (no terminating NUL)";
+}
+
 // Prints a (const) char array of 'len' elements, starting at address 'begin'.
 void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
-  PrintCharsAsStringTo(begin, len, os);
+  UniversalPrintCharArray(begin, len, os);
 }
 
-// Prints the given array of wide characters to the ostream.
-// The array starts at *begin, the length is len, it may include L'\0'
-// characters and may not be null-terminated.
-static void PrintWideCharsAsStringTo(const wchar_t* begin, size_t len,
-                                     ostream* os) {
-  *os << "L\"";
-  bool is_previous_hex = false;
-  for (size_t index = 0; index < len; ++index) {
-    const wchar_t cur = begin[index];
-    if (is_previous_hex && isascii(cur) && IsXDigit(static_cast<char>(cur))) {
-      // Previous character is of '\x..' form and this character can be
-      // interpreted as another hexadecimal digit in its number. Break string to
-      // disambiguate.
-      *os << "\" L\"";
-    }
-    is_previous_hex = PrintAsWideStringLiteralTo(cur, os) == kHexEscape;
-  }
-  *os << "\"";
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
 }
 
 // Prints the given C string to the ostream.
@@ -322,7 +329,7 @@ void PrintTo(const wchar_t* s, ostream* os) {
     *os << "NULL";
   } else {
     *os << ImplicitCast_<const void*>(s) << " pointing to ";
-    PrintWideCharsAsStringTo(s, wcslen(s), os);
+    PrintCharsAsStringTo(s, wcslen(s), os);
   }
 }
 #endif  // wchar_t is native
@@ -341,13 +348,13 @@ void PrintStringTo(const ::std::string& s, ostream* os) {
 // Prints a ::wstring object.
 #if GTEST_HAS_GLOBAL_WSTRING
 void PrintWideStringTo(const ::wstring& s, ostream* os) {
-  PrintWideCharsAsStringTo(s.data(), s.size(), os);
+  PrintCharsAsStringTo(s.data(), s.size(), os);
 }
 #endif  // GTEST_HAS_GLOBAL_WSTRING
 
 #if GTEST_HAS_STD_WSTRING
 void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
-  PrintWideCharsAsStringTo(s.data(), s.size(), os);
+  PrintCharsAsStringTo(s.data(), s.size(), os);
 }
 #endif  // GTEST_HAS_STD_WSTRING
 
diff --git a/test/gtest/src/gtest-test-part.cc b/test/gtest/src/gtest-test-part.cc
index 5ddc67c..c60eef3 100644
--- a/test/gtest/src/gtest-test-part.cc
+++ b/test/gtest/src/gtest-test-part.cc
@@ -48,10 +48,10 @@ using internal::GetUnitTestImpl;
 
 // Gets the summary of the failure message by omitting the stack trace
 // in it.
-internal::String TestPartResult::ExtractSummary(const char* message) {
+std::string TestPartResult::ExtractSummary(const char* message) {
   const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
-  return stack_trace == NULL ? internal::String(message) :
-      internal::String(message, stack_trace - message);
+  return stack_trace == NULL ? message :
+      std::string(message, stack_trace);
 }
 
 // Prints a TestPartResult object.
diff --git a/test/gtest/src/gtest-typed-test.cc b/test/gtest/src/gtest-typed-test.cc
index a5cc88f..f0079f4 100644
--- a/test/gtest/src/gtest-typed-test.cc
+++ b/test/gtest/src/gtest-typed-test.cc
@@ -58,10 +58,10 @@ const char* TypedTestCasePState::VerifyRegisteredTestNames(
   registered_tests = SkipSpaces(registered_tests);
 
   Message errors;
-  ::std::set<String> tests;
+  ::std::set<std::string> tests;
   for (const char* names = registered_tests; names != NULL;
        names = SkipComma(names)) {
-    const String name = GetPrefixUntilComma(names);
+    const std::string name = GetPrefixUntilComma(names);
     if (tests.count(name) != 0) {
       errors << "Test " << name << " is listed more than once.\n";
       continue;
@@ -93,7 +93,7 @@ const char* TypedTestCasePState::VerifyRegisteredTestNames(
     }
   }
 
-  const String& errors_str = errors.GetString();
+  const std::string& errors_str = errors.GetString();
   if (errors_str != "") {
     fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
             errors_str.c_str());
diff --git a/test/gtest/src/gtest.cc b/test/gtest/src/gtest.cc
index 904d9d7..7ee9368 100644
--- a/test/gtest/src/gtest.cc
+++ b/test/gtest/src/gtest.cc
@@ -33,16 +33,20 @@
 
 #include "gtest/gtest.h"
 #include "gtest/gtest-spi.h"
+#pragma GCC system_header
 
 #include <ctype.h>
 #include <math.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <time.h>
 #include <wchar.h>
 #include <wctype.h>
 
 #include <algorithm>
+#include <iomanip>
+#include <limits>
 #include <ostream>  // NOLINT
 #include <sstream>
 #include <vector>
@@ -179,6 +183,10 @@ bool g_help_flag = false;
 
 }  // namespace internal
 
+static const char* GetDefaultFilter() {
+  return kUniversalFilter;
+}
+
 GTEST_DEFINE_bool_(
     also_run_disabled_tests,
     internal::BoolFromGTestEnv("also_run_disabled_tests", false),
@@ -201,11 +209,11 @@ GTEST_DEFINE_string_(
     "Whether to use colors in the output.  Valid values: yes, no, "
     "and auto.  'auto' means to use colors if the output is "
     "being sent to a terminal and the TERM environment variable "
-    "is set to xterm, xterm-color, xterm-256color, linux or cygwin.");
+    "is set to a terminal type that supports colors.");
 
 GTEST_DEFINE_string_(
     filter,
-    internal::StringFromGTestEnv("filter", kUniversalFilter),
+    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
     "A colon-separated list of glob (not regex) patterns "
     "for filtering the tests to run, optionally followed by a "
     "'-' and a : separated list of negative patterns (tests to "
@@ -305,7 +313,7 @@ UInt32 Random::Generate(UInt32 range) {
 // Test.  g_init_gtest_count is set to the number of times
 // InitGoogleTest() has been called.  We don't protect this variable
 // under a mutex as it is only accessed in the main thread.
-int g_init_gtest_count = 0;
+GTEST_API_ int g_init_gtest_count = 0;
 static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
 
 // Iterates over a vector of TestCases, keeping a running sum of the
@@ -360,10 +368,10 @@ void AssertHelper::operator=(const Message& message) const {
 }
 
 // Mutex for linked pointers.
-GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
 
 // Application pathname gotten in InitGoogleTest.
-String g_executable_path;
+std::string g_executable_path;
 
 // Returns the current application's name, removing directory path if that
 // is present.
@@ -382,29 +390,29 @@ FilePath GetCurrentExecutableName() {
 // Functions for processing the gtest_output flag.
 
 // Returns the output format, or "" for normal printed output.
-String UnitTestOptions::GetOutputFormat() {
+std::string UnitTestOptions::GetOutputFormat() {
   const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
-  if (gtest_output_flag == NULL) return String("");
+  if (gtest_output_flag == NULL) return std::string("");
 
   const char* const colon = strchr(gtest_output_flag, ':');
   return (colon == NULL) ?
-      String(gtest_output_flag) :
-      String(gtest_output_flag, colon - gtest_output_flag);
+      std::string(gtest_output_flag) :
+      std::string(gtest_output_flag, colon - gtest_output_flag);
 }
 
 // Returns the name of the requested output file, or the default if none
 // was explicitly specified.
-String UnitTestOptions::GetAbsolutePathToOutputFile() {
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
   const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
   if (gtest_output_flag == NULL)
-    return String("");
+    return "";
 
   const char* const colon = strchr(gtest_output_flag, ':');
   if (colon == NULL)
-    return String(internal::FilePath::ConcatPaths(
-               internal::FilePath(
-                   UnitTest::GetInstance()->original_working_dir()),
-               internal::FilePath(kDefaultOutputFile)).ToString() );
+    return internal::FilePath::ConcatPaths(
+        internal::FilePath(
+            UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(kDefaultOutputFile)).string();
 
   internal::FilePath output_name(colon + 1);
   if (!output_name.IsAbsolutePath())
@@ -417,12 +425,12 @@ String UnitTestOptions::GetAbsolutePathToOutputFile() {
         internal::FilePath(colon + 1));
 
   if (!output_name.IsDirectory())
-    return output_name.ToString();
+    return output_name.string();
 
   internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
       output_name, internal::GetCurrentExecutableName(),
       GetOutputFormat().c_str()));
-  return result.ToString();
+  return result.string();
 }
 
 // Returns true iff the wildcard pattern matches the string.  The
@@ -447,7 +455,8 @@ bool UnitTestOptions::PatternMatchesString(const char *pattern,
   }
 }
 
-bool UnitTestOptions::MatchesFilter(const String& name, const char* filter) {
+bool UnitTestOptions::MatchesFilter(
+    const std::string& name, const char* filter) {
   const char *cur_pattern = filter;
   for (;;) {
     if (PatternMatchesString(cur_pattern, name.c_str())) {
@@ -467,28 +476,24 @@ bool UnitTestOptions::MatchesFilter(const String& name, const char* filter) {
   }
 }
 
-// TODO(keithray): move String function implementations to gtest-string.cc.
-
 // Returns true iff the user-specified filter matches the test case
 // name and the test name.
-bool UnitTestOptions::FilterMatchesTest(const String &test_case_name,
-                                        const String &test_name) {
-  const String& full_name = String::Format("%s.%s",
-                                           test_case_name.c_str(),
-                                           test_name.c_str());
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+                                        const std::string &test_name) {
+  const std::string& full_name = test_case_name + "." + test_name.c_str();
 
   // Split --gtest_filter at '-', if there is one, to separate into
   // positive filter and negative filter portions
   const char* const p = GTEST_FLAG(filter).c_str();
   const char* const dash = strchr(p, '-');
-  String positive;
-  String negative;
+  std::string positive;
+  std::string negative;
   if (dash == NULL) {
     positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
-    negative = String("");
+    negative = "";
   } else {
-    positive = String(p, dash - p);  // Everything up to the dash
-    negative = String(dash+1);       // Everything after the dash
+    positive = std::string(p, dash);   // Everything up to the dash
+    negative = std::string(dash + 1);  // Everything after the dash
     if (positive.empty()) {
       // Treat '-test1' as the same as '*-test1'
       positive = kUniversalFilter;
@@ -608,7 +613,7 @@ AssertionResult HasOneFailure(const char* /* results_expr */,
                               const TestPartResultArray& results,
                               TestPartResult::Type type,
                               const string& substr) {
-  const String expected(type == TestPartResult::kFatalFailure ?
+  const std::string expected(type == TestPartResult::kFatalFailure ?
                         "1 fatal failure" :
                         "1 non-fatal failure");
   Message msg;
@@ -731,11 +736,22 @@ int UnitTestImpl::failed_test_count() const {
   return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
 }
 
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_,
+                             &TestCase::reportable_disabled_test_count);
+}
+
 // Gets the number of disabled tests.
 int UnitTestImpl::disabled_test_count() const {
   return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
 }
 
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
 // Gets the number of all tests.
 int UnitTestImpl::total_test_count() const {
   return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
@@ -746,7 +762,7 @@ int UnitTestImpl::test_to_run_count() const {
   return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
 }
 
-// Returns the current OS stack trace as a String.
+// Returns the current OS stack trace as an std::string.
 //
 // The maximum number of stack frames to be included is specified by
 // the gtest_stack_trace_depth flag.  The skip_count parameter
@@ -756,9 +772,9 @@ int UnitTestImpl::test_to_run_count() const {
 // For example, if Foo() calls Bar(), which in turn calls
 // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
 // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
-String UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
   (void)skip_count;
-  return String("");
+  return "";
 }
 
 // Returns the current time in milliseconds.
@@ -815,41 +831,7 @@ TimeInMillis GetTimeInMillis() {
 
 // Utilities
 
-// class String
-
-// Returns the input enclosed in double quotes if it's not NULL;
-// otherwise returns "(null)".  For example, "\"Hello\"" is returned
-// for input "Hello".
-//
-// This is useful for printing a C string in the syntax of a literal.
-//
-// Known issue: escape sequences are not handled yet.
-String String::ShowCStringQuoted(const char* c_str) {
-  return c_str ? String::Format("\"%s\"", c_str) : String("(null)");
-}
-
-// Copies at most length characters from str into a newly-allocated
-// piece of memory of size length+1.  The memory is allocated with new[].
-// A terminating null byte is written to the memory, and a pointer to it
-// is returned.  If str is NULL, NULL is returned.
-static char* CloneString(const char* str, size_t length) {
-  if (str == NULL) {
-    return NULL;
-  } else {
-    char* const clone = new char[length + 1];
-    posix::StrNCpy(clone, str, length);
-    clone[length] = '\0';
-    return clone;
-  }
-}
-
-// Clones a 0-terminated C string, allocating memory using new.  The
-// caller is responsible for deleting[] the return value.  Returns the
-// cloned string, or NULL if the input is NULL.
-const char * String::CloneCString(const char* c_str) {
-  return (c_str == NULL) ?
-                    NULL : CloneString(c_str, strlen(c_str));
-}
+// class String.
 
 #if GTEST_OS_WINDOWS_MOBILE
 // Creates a UTF-16 wide string from the given ANSI string, allocating
@@ -906,11 +888,6 @@ bool String::CStringEquals(const char * lhs, const char * rhs) {
 // encoding, and streams the result to the given Message object.
 static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
                                      Message* msg) {
-  // TODO(wan): consider allowing a testing::String object to
-  // contain '\0'.  This will make it behave more like std::string,
-  // and will allow ToUtf8String() to return the correct encoding
-  // for '\0' s.t. we can get rid of the conditional here (and in
-  // several other places).
   for (size_t i = 0; i != length; ) {  // NOLINT
     if (wstr[i] != L'\0') {
       *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
@@ -927,6 +904,26 @@ static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
 
 }  // namespace internal
 
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+  // By default, we want there to be enough precision when printing
+  // a double to a Message.
+  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
 #if GTEST_HAS_STD_WSTRING
 // Converts the given wide string to a narrow string using the UTF-8
 // encoding, and streams the result to this Message object.
@@ -945,6 +942,12 @@ Message& Message::operator <<(const ::wstring& wstr) {
 }
 #endif  // GTEST_HAS_GLOBAL_WSTRING
 
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+  return internal::StringStreamToString(ss_.get());
+}
+
 // AssertionResult constructors.
 // Used in EXPECT_TRUE/FALSE(assertion_result).
 AssertionResult::AssertionResult(const AssertionResult& other)
@@ -997,8 +1000,8 @@ namespace internal {
 // be inserted into the message.
 AssertionResult EqFailure(const char* expected_expression,
                           const char* actual_expression,
-                          const String& expected_value,
-                          const String& actual_value,
+                          const std::string& expected_value,
+                          const std::string& actual_value,
                           bool ignoring_case) {
   Message msg;
   msg << "Value of: " << actual_expression;
@@ -1018,10 +1021,11 @@ AssertionResult EqFailure(const char* expected_expression,
 }
 
 // Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
-String GetBoolAssertionFailureMessage(const AssertionResult& assertion_result,
-                                      const char* expression_text,
-                                      const char* actual_predicate_value,
-                                      const char* expected_predicate_value) {
+std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value) {
   const char* actual_message = assertion_result.message();
   Message msg;
   msg << "Value of: " << expression_text
@@ -1168,8 +1172,8 @@ AssertionResult CmpHelperSTREQ(const char* expected_expression,
 
   return EqFailure(expected_expression,
                    actual_expression,
-                   String::ShowCStringQuoted(expected),
-                   String::ShowCStringQuoted(actual),
+                   PrintToString(expected),
+                   PrintToString(actual),
                    false);
 }
 
@@ -1184,8 +1188,8 @@ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
 
   return EqFailure(expected_expression,
                    actual_expression,
-                   String::ShowCStringQuoted(expected),
-                   String::ShowCStringQuoted(actual),
+                   PrintToString(expected),
+                   PrintToString(actual),
                    true);
 }
 
@@ -1349,7 +1353,7 @@ AssertionResult HRESULTFailureHelper(const char* expr,
   // want inserts expanded.
   const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
                        FORMAT_MESSAGE_IGNORE_INSERTS;
-  const DWORD kBufSize = 4096;  // String::Format can't exceed this length.
+  const DWORD kBufSize = 4096;
   // Gets the system's human readable message string for this HRESULT.
   char error_text[kBufSize] = { '\0' };
   DWORD message_length = ::FormatMessageA(kFlags,
@@ -1359,7 +1363,7 @@ AssertionResult HRESULTFailureHelper(const char* expr,
                                           error_text,  // output buffer
                                           kBufSize,  // buf size
                                           NULL);  // no arguments for inserts
-  // Trims tailing white space (FormatMessage leaves a trailing cr-lf)
+  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
   for (; message_length && IsSpace(error_text[message_length - 1]);
           --message_length) {
     error_text[message_length - 1] = '\0';
@@ -1367,10 +1371,10 @@ AssertionResult HRESULTFailureHelper(const char* expr,
 
 # endif  // GTEST_OS_WINDOWS_MOBILE
 
-  const String error_hex(String::Format("0x%08X ", hr));
+  const std::string error_hex("0x" + String::FormatHexInt(hr));
   return ::testing::AssertionFailure()
       << "Expected: " << expr << " " << expected << ".\n"
-      << "  Actual: " << error_hex << error_text << "\n";
+      << "  Actual: " << error_hex << " " << error_text << "\n";
 }
 
 }  // namespace
@@ -1427,12 +1431,15 @@ inline UInt32 ChopLowBits(UInt32* bits, int n) {
 // Converts a Unicode code point to a narrow string in UTF-8 encoding.
 // code_point parameter is of type UInt32 because wchar_t may not be
 // wide enough to contain a code point.
-// The output buffer str must containt at least 32 characters.
-// The function returns the address of the output buffer.
 // If the code_point is not a valid Unicode code point
-// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'.
-char* CodePointToUtf8(UInt32 code_point, char* str) {
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+  if (code_point > kMaxCodePoint4) {
+    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+  }
+
+  char str[5];  // Big enough for the largest valid code point.
   if (code_point <= kMaxCodePoint1) {
     str[1] = '\0';
     str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
@@ -1445,22 +1452,12 @@ char* CodePointToUtf8(UInt32 code_point, char* str) {
     str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
     str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
     str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
-  } else if (code_point <= kMaxCodePoint4) {
+  } else {  // code_point <= kMaxCodePoint4
     str[4] = '\0';
     str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
     str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
     str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
     str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
-  } else {
-    // The longest string String::Format can produce when invoked
-    // with these parameters is 28 character long (not including
-    // the terminating nul character). We are asking for 32 character
-    // buffer just in case. This is also enough for strncpy to
-    // null-terminate the destination string.
-    posix::StrNCpy(
-        str, String::Format("(Invalid Unicode 0x%X)", code_point).c_str(), 32);
-    str[31] = '\0';  // Makes sure no change in the format to strncpy leaves
-                     // the result unterminated.
   }
   return str;
 }
@@ -1501,7 +1498,7 @@ inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
 // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
 // and contains invalid UTF-16 surrogate pairs, values in those pairs
 // will be encoded as individual Unicode characters from Basic Normal Plane.
-String WideStringToUtf8(const wchar_t* str, int num_chars) {
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
   if (num_chars == -1)
     num_chars = static_cast<int>(wcslen(str));
 
@@ -1519,27 +1516,17 @@ String WideStringToUtf8(const wchar_t* str, int num_chars) {
       unicode_code_point = static_cast<UInt32>(str[i]);
     }
 
-    char buffer[32];  // CodePointToUtf8 requires a buffer this big.
-    stream << CodePointToUtf8(unicode_code_point, buffer);
+    stream << CodePointToUtf8(unicode_code_point);
   }
   return StringStreamToString(&stream);
 }
 
-// Converts a wide C string to a String using the UTF-8 encoding.
+// Converts a wide C string to an std::string using the UTF-8 encoding.
 // NULL will be converted to "(null)".
-String String::ShowWideCString(const wchar_t * wide_c_str) {
-  if (wide_c_str == NULL) return String("(null)");
-
-  return String(internal::WideStringToUtf8(wide_c_str, -1).c_str());
-}
-
-// Similar to ShowWideCString(), except that this function encloses
-// the converted string in double quotes.
-String String::ShowWideCStringQuoted(const wchar_t* wide_c_str) {
-  if (wide_c_str == NULL) return String("(null)");
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+  if (wide_c_str == NULL)  return "(null)";
 
-  return String::Format("L\"%s\"",
-                        String::ShowWideCString(wide_c_str).c_str());
+  return internal::WideStringToUtf8(wide_c_str, -1);
 }
 
 // Compares two wide C strings.  Returns true iff they have the same
@@ -1567,8 +1554,8 @@ AssertionResult CmpHelperSTREQ(const char* expected_expression,
 
   return EqFailure(expected_expression,
                    actual_expression,
-                   String::ShowWideCStringQuoted(expected),
-                   String::ShowWideCStringQuoted(actual),
+                   PrintToString(expected),
+                   PrintToString(actual),
                    false);
 }
 
@@ -1583,8 +1570,8 @@ AssertionResult CmpHelperSTRNE(const char* s1_expression,
 
   return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
                             << s2_expression << "), actual: "
-                            << String::ShowWideCStringQuoted(s1)
-                            << " vs " << String::ShowWideCStringQuoted(s2);
+                            << PrintToString(s1)
+                            << " vs " << PrintToString(s2);
 }
 
 // Compares two C strings, ignoring case.  Returns true iff they have
@@ -1635,135 +1622,69 @@ bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
 #endif  // OS selector
 }
 
-// Compares this with another String.
-// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
-// if this is greater than rhs.
-int String::Compare(const String & rhs) const {
-  const char* const lhs_c_str = c_str();
-  const char* const rhs_c_str = rhs.c_str();
-
-  if (lhs_c_str == NULL) {
-    return rhs_c_str == NULL ? 0 : -1;  // NULL < anything except NULL
-  } else if (rhs_c_str == NULL) {
-    return 1;
-  }
-
-  const size_t shorter_str_len =
-      length() <= rhs.length() ? length() : rhs.length();
-  for (size_t i = 0; i != shorter_str_len; i++) {
-    if (lhs_c_str[i] < rhs_c_str[i]) {
-      return -1;
-    } else if (lhs_c_str[i] > rhs_c_str[i]) {
-      return 1;
-    }
-  }
-  return (length() < rhs.length()) ? -1 :
-      (length() > rhs.length()) ? 1 : 0;
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+    const std::string& str, const std::string& suffix) {
+  const size_t str_len = str.length();
+  const size_t suffix_len = suffix.length();
+  return (str_len >= suffix_len) &&
+         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+                                      suffix.c_str());
 }
 
-// Returns true iff this String ends with the given suffix.  *Any*
-// String is considered to end with a NULL or empty suffix.
-bool String::EndsWith(const char* suffix) const {
-  if (suffix == NULL || CStringEquals(suffix, "")) return true;
-
-  if (c_str() == NULL) return false;
-
-  const size_t this_len = strlen(c_str());
-  const size_t suffix_len = strlen(suffix);
-  return (this_len >= suffix_len) &&
-         CStringEquals(c_str() + this_len - suffix_len, suffix);
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << value;
+  return ss.str();
 }
 
-// Returns true iff this String ends with the given suffix, ignoring case.
-// Any String is considered to end with a NULL or empty suffix.
-bool String::EndsWithCaseInsensitive(const char* suffix) const {
-  if (suffix == NULL || CStringEquals(suffix, "")) return true;
-
-  if (c_str() == NULL) return false;
-
-  const size_t this_len = strlen(c_str());
-  const size_t suffix_len = strlen(suffix);
-  return (this_len >= suffix_len) &&
-         CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix);
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+  std::stringstream ss;
+  ss << std::hex << std::uppercase << value;
+  return ss.str();
 }
 
-// Formats a list of arguments to a String, using the same format
-// spec string as for printf.
-//
-// We do not use the StringPrintf class as it is not universally
-// available.
-//
-// The result is limited to 4096 characters (including the tailing 0).
-// If 4096 characters are not enough to format the input, or if
-// there's an error, "<formatting error or buffer exceeded>" is
-// returned.
-String String::Format(const char * format, ...) {
-  va_list args;
-  va_start(args, format);
-
-  char buffer[4096];
-  const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]);
-
-  // MSVC 8 deprecates vsnprintf(), so we want to suppress warning
-  // 4996 (deprecated function) there.
-#ifdef _MSC_VER  // We are using MSVC.
-# pragma warning(push)          // Saves the current warning state.
-# pragma warning(disable:4996)  // Temporarily disables warning 4996.
-
-  const int size = vsnprintf(buffer, kBufferSize, format, args);
-
-# pragma warning(pop)           // Restores the warning state.
-#else  // We are not using MSVC.
-  const int size = vsnprintf(buffer, kBufferSize, format, args);
-#endif  // _MSC_VER
-  va_end(args);
-
-  // vsnprintf()'s behavior is not portable.  When the buffer is not
-  // big enough, it returns a negative value in MSVC, and returns the
-  // needed buffer size on Linux.  When there is an output error, it
-  // always returns a negative value.  For simplicity, we lump the two
-  // error cases together.
-  if (size < 0 || size >= kBufferSize) {
-    return String("<formatting error or buffer exceeded>");
-  } else {
-    return String(buffer, size);
-  }
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+     << static_cast<unsigned int>(value);
+  return ss.str();
 }
 
-// Converts the buffer in a stringstream to a String, converting NUL
+// Converts the buffer in a stringstream to an std::string, converting NUL
 // bytes to "\\0" along the way.
-String StringStreamToString(::std::stringstream* ss) {
+std::string StringStreamToString(::std::stringstream* ss) {
   const ::std::string& str = ss->str();
   const char* const start = str.c_str();
   const char* const end = start + str.length();
 
-  // We need to use a helper stringstream to do this transformation
-  // because String doesn't support push_back().
-  ::std::stringstream helper;
+  std::string result;
+  result.reserve(2 * (end - start));
   for (const char* ch = start; ch != end; ++ch) {
     if (*ch == '\0') {
-      helper << "\\0";  // Replaces NUL with "\\0";
+      result += "\\0";  // Replaces NUL with "\\0";
     } else {
-      helper.put(*ch);
+      result += *ch;
     }
   }
 
-  return String(helper.str().c_str());
+  return result;
 }
 
 // Appends the user-supplied message to the Google-Test-generated message.
-String AppendUserMessage(const String& gtest_msg,
-                         const Message& user_msg) {
+std::string AppendUserMessage(const std::string& gtest_msg,
+                              const Message& user_msg) {
   // Appends the user message if it's non-empty.
-  const String user_msg_string = user_msg.GetString();
+  const std::string user_msg_string = user_msg.GetString();
   if (user_msg_string.empty()) {
     return gtest_msg;
   }
 
-  Message msg;
-  msg << gtest_msg << "\n" << user_msg_string;
-
-  return msg.GetString();
+  return gtest_msg + "\n" + user_msg_string;
 }
 
 }  // namespace internal
@@ -1811,8 +1732,9 @@ void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
 // Adds a test property to the list. If a property with the same key as the
 // supplied property is already represented, the value of this test_property
 // replaces the old value for that key.
-void TestResult::RecordProperty(const TestProperty& test_property) {
-  if (!ValidateTestProperty(test_property)) {
+void TestResult::RecordProperty(const std::string& xml_element,
+                                const TestProperty& test_property) {
+  if (!ValidateTestProperty(xml_element, test_property)) {
     return;
   }
   internal::MutexLock lock(&test_properites_mutex_);
@@ -1826,21 +1748,94 @@ void TestResult::RecordProperty(const TestProperty& test_property) {
   property_with_matching_key->SetValue(test_property.value());
 }
 
-// Adds a failure if the key is a reserved attribute of Google Test
-// testcase tags.  Returns true if the property is valid.
-bool TestResult::ValidateTestProperty(const TestProperty& test_property) {
-  internal::String key(test_property.key());
-  if (key == "name" || key == "status" || key == "time" || key == "classname") {
-    ADD_FAILURE()
-        << "Reserved key used in RecordProperty(): "
-        << key
-        << " ('name', 'status', 'time', and 'classname' are reserved by "
-        << GTEST_NAME_ << ")";
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "random_seed",
+  "tests",
+  "time",
+  "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "tests",
+  "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+  "classname",
+  "name",
+  "status",
+  "time",
+  "type_param",
+  "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+  return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+    const std::string& xml_element) {
+  if (xml_element == "testsuites") {
+    return ArrayAsVector(kReservedTestSuitesAttributes);
+  } else if (xml_element == "testsuite") {
+    return ArrayAsVector(kReservedTestSuiteAttributes);
+  } else if (xml_element == "testcase") {
+    return ArrayAsVector(kReservedTestCaseAttributes);
+  } else {
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+  }
+  // This code is unreachable but some compilers may not realizes that.
+  return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+  Message word_list;
+  for (size_t i = 0; i < words.size(); ++i) {
+    if (i > 0 && words.size() > 2) {
+      word_list << ", ";
+    }
+    if (i == words.size() - 1) {
+      word_list << "and ";
+    }
+    word_list << "'" << words[i] << "'";
+  }
+  return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+                              const std::vector<std::string>& reserved_names) {
+  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+          reserved_names.end()) {
+    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+                  << " (" << FormatWordList(reserved_names)
+                  << " are reserved by " << GTEST_NAME_ << ")";
     return false;
   }
   return true;
 }
 
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element.  Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+                                      const TestProperty& test_property) {
+  return ValidateTestPropertyName(test_property.key(),
+                                  GetReservedAttributesForElement(xml_element));
+}
+
 // Clears the object.
 void TestResult::Clear() {
   test_part_results_.clear();
@@ -1916,12 +1911,12 @@ void Test::TearDown() {
 }
 
 // Allows user supplied key value pairs to be recorded for later output.
-void Test::RecordProperty(const char* key, const char* value) {
-  UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value);
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+  UnitTest::GetInstance()->RecordProperty(key, value);
 }
 
 // Allows user supplied key value pairs to be recorded for later output.
-void Test::RecordProperty(const char* key, int value) {
+void Test::RecordProperty(const std::string& key, int value) {
   Message value_message;
   value_message << value;
   RecordProperty(key, value_message.GetString().c_str());
@@ -1930,7 +1925,7 @@ void Test::RecordProperty(const char* key, int value) {
 namespace internal {
 
 void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
-                                    const String& message) {
+                                    const std::string& message) {
   // This function is a friend of UnitTest and as such has access to
   // AddTestPartResult.
   UnitTest::GetInstance()->AddTestPartResult(
@@ -1938,7 +1933,7 @@ void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
       NULL,  // No info about the source file where the exception occurred.
       -1,    // We have no info on which line caused the exception.
       message,
-      String());  // No stack trace, either.
+      "");   // No stack trace, either.
 }
 
 }  // namespace internal
@@ -2015,22 +2010,24 @@ bool Test::HasSameFixtureClass() {
 // function returns its result via an output parameter pointer because VC++
 // prohibits creation of objects with destructors on stack in functions
 // using __try (see error C2712).
-static internal::String* FormatSehExceptionMessage(DWORD exception_code,
-                                                   const char* location) {
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+                                              const char* location) {
   Message message;
   message << "SEH exception with code 0x" << std::setbase(16) <<
     exception_code << std::setbase(10) << " thrown in " << location << ".";
 
-  return new internal::String(message.GetString());
+  return new std::string(message.GetString());
 }
 
 #endif  // GTEST_HAS_SEH
 
+namespace internal {
+
 #if GTEST_HAS_EXCEPTIONS
 
 // Adds an "exception thrown" fatal failure to the current test.
-static internal::String FormatCxxExceptionMessage(const char* description,
-                                                  const char* location) {
+static std::string FormatCxxExceptionMessage(const char* description,
+                                             const char* location) {
   Message message;
   if (description != NULL) {
     message << "C++ exception with description \"" << description << "\"";
@@ -2042,23 +2039,15 @@ static internal::String FormatCxxExceptionMessage(const char* description,
   return message.GetString();
 }
 
-static internal::String PrintTestPartResultToString(
+static std::string PrintTestPartResultToString(
     const TestPartResult& test_part_result);
 
-// A failed Google Test assertion will throw an exception of this type when
-// GTEST_FLAG(throw_on_failure) is true (if exceptions are enabled).  We
-// derive it from std::runtime_error, which is for errors presumably
-// detectable only at run time.  Since std::runtime_error inherits from
-// std::exception, many testing frameworks know how to extract and print the
-// message inside it.
-class GoogleTestFailureException : public ::std::runtime_error {
- public:
-  explicit GoogleTestFailureException(const TestPartResult& failure)
-      : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
-};
+GoogleTestFailureException::GoogleTestFailureException(
+    const TestPartResult& failure)
+    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
 #endif  // GTEST_HAS_EXCEPTIONS
 
-namespace internal {
 // We put these helper functions in the internal namespace as IBM's xlC
 // compiler rejects the code if they were declared static.
 
@@ -2078,7 +2067,7 @@ Result HandleSehExceptionsInMethodIfSupported(
     // We create the exception message on the heap because VC++ prohibits
     // creation of objects with destructors on stack in functions using __try
     // (see error C2712).
-    internal::String* exception_message = FormatSehExceptionMessage(
+    std::string* exception_message = FormatSehExceptionMessage(
         GetExceptionCode(), location);
     internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
                                              *exception_message);
@@ -2124,9 +2113,10 @@ Result HandleExceptionsInMethodIfSupported(
 #if GTEST_HAS_EXCEPTIONS
     try {
       return HandleSehExceptionsInMethodIfSupported(object, method, location);
-    } catch (const GoogleTestFailureException&) {  // NOLINT
-      // This exception doesn't originate in code under test. It makes no
-      // sense to report it as a test failure.
+    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
+      // This exception type can only be thrown by a failed Google
+      // Test assertion with the intention of letting another testing
+      // framework catch it.  Therefore we just re-throw it.
       throw;
     } catch (const std::exception& e) {  // NOLINT
       internal::ReportFailureInUnknownLocation(
@@ -2185,10 +2175,8 @@ bool Test::HasNonfatalFailure() {
 
 // Constructs a TestInfo object. It assumes ownership of the test factory
 // object.
-// TODO(vladl at google.com): Make a_test_case_name and a_name const string&'s
-// to signify they cannot be NULLs.
-TestInfo::TestInfo(const char* a_test_case_name,
-                   const char* a_name,
+TestInfo::TestInfo(const std::string& a_test_case_name,
+                   const std::string& a_name,
                    const char* a_type_param,
                    const char* a_value_param,
                    internal::TypeId fixture_class_id,
@@ -2227,7 +2215,8 @@ namespace internal {
 //                     The newly created TestInfo instance will assume
 //                     ownership of the factory object.
 TestInfo* MakeAndRegisterTestInfo(
-    const char* test_case_name, const char* name,
+    const char* test_case_name,
+    const char* name,
     const char* type_param,
     const char* value_param,
     TypeId fixture_class_id,
@@ -2282,11 +2271,11 @@ class TestNameIs {
 
   // Returns true iff the test name of test_info matches name_.
   bool operator()(const TestInfo * test_info) const {
-    return test_info && internal::String(test_info->name()).Compare(name_) == 0;
+    return test_info && test_info->name() == name_;
   }
 
  private:
-  internal::String name_;
+  std::string name_;
 };
 
 }  // namespace
@@ -2365,10 +2354,21 @@ int TestCase::failed_test_count() const {
   return CountIf(test_info_list_, TestFailed);
 }
 
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+  return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
 int TestCase::disabled_test_count() const {
   return CountIf(test_info_list_, TestDisabled);
 }
 
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+  return CountIf(test_info_list_, TestReportable);
+}
+
 // Get the number of tests in this test case that should run.
 int TestCase::test_to_run_count() const {
   return CountIf(test_info_list_, ShouldRunTest);
@@ -2456,6 +2456,7 @@ void TestCase::Run() {
 
 // Clears the results of all tests in this test case.
 void TestCase::ClearResult() {
+  ad_hoc_test_result_.Clear();
   ForEach(test_info_list_, TestInfo::ClearTestResult);
 }
 
@@ -2476,20 +2477,20 @@ void TestCase::UnshuffleTests() {
 //
 // FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
 // FormatCountableNoun(5, "book", "books") returns "5 books".
-static internal::String FormatCountableNoun(int count,
-                                            const char * singular_form,
-                                            const char * plural_form) {
-  return internal::String::Format("%d %s", count,
-                                  count == 1 ? singular_form : plural_form);
+static std::string FormatCountableNoun(int count,
+                                       const char * singular_form,
+                                       const char * plural_form) {
+  return internal::StreamableToString(count) + " " +
+      (count == 1 ? singular_form : plural_form);
 }
 
 // Formats the count of tests.
-static internal::String FormatTestCount(int test_count) {
+static std::string FormatTestCount(int test_count) {
   return FormatCountableNoun(test_count, "test", "tests");
 }
 
 // Formats the count of test cases.
-static internal::String FormatTestCaseCount(int test_case_count) {
+static std::string FormatTestCaseCount(int test_case_count) {
   return FormatCountableNoun(test_case_count, "test case", "test cases");
 }
 
@@ -2514,8 +2515,10 @@ static const char * TestPartResultTypeToString(TestPartResult::Type type) {
   }
 }
 
-// Prints a TestPartResult to a String.
-static internal::String PrintTestPartResultToString(
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
     const TestPartResult& test_part_result) {
   return (Message()
           << internal::FormatFileLocation(test_part_result.file_name(),
@@ -2526,7 +2529,7 @@ static internal::String PrintTestPartResultToString(
 
 // Prints a TestPartResult.
 static void PrintTestPartResult(const TestPartResult& test_part_result) {
-  const internal::String& result =
+  const std::string& result =
       PrintTestPartResultToString(test_part_result);
   printf("%s\n", result.c_str());
   fflush(stdout);
@@ -2545,8 +2548,6 @@ static void PrintTestPartResult(const TestPartResult& test_part_result) {
 
 // class PrettyUnitTestResultPrinter
 
-namespace internal {
-
 enum GTestColor {
   COLOR_DEFAULT,
   COLOR_RED,
@@ -2598,6 +2599,7 @@ bool ShouldUseColor(bool stdout_is_tty) {
         String::CStringEquals(term, "xterm-color") ||
         String::CStringEquals(term, "xterm-256color") ||
         String::CStringEquals(term, "screen") ||
+        String::CStringEquals(term, "screen-256color") ||
         String::CStringEquals(term, "linux") ||
         String::CStringEquals(term, "cygwin");
     return stdout_is_tty && term_supports_color;
@@ -2621,7 +2623,7 @@ void ColoredPrintf(GTestColor color, const char* fmt, ...) {
   va_list args;
   va_start(args, fmt);
 
-#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
   const bool use_color = false;
 #else
   static const bool in_color_mode =
@@ -2663,6 +2665,11 @@ void ColoredPrintf(GTestColor color, const char* fmt, ...) {
   va_end(args);
 }
 
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
 void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
   const char* const type_param = test_info.type_param();
   const char* const value_param = test_info.value_param();
@@ -2670,12 +2677,12 @@ void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
   if (type_param != NULL || value_param != NULL) {
     printf(", where ");
     if (type_param != NULL) {
-      printf("TypeParam = %s", type_param);
+      printf("%s = %s", kTypeParamLabel, type_param);
       if (value_param != NULL)
         printf(" and ");
     }
     if (value_param != NULL) {
-      printf("GetParam() = %s", value_param);
+      printf("%s = %s", kValueParamLabel, value_param);
     }
   }
 }
@@ -2707,8 +2714,6 @@ class PrettyUnitTestResultPrinter : public TestEventListener {
 
  private:
   static void PrintFailedTests(const UnitTest& unit_test);
-
-  internal::String test_case_name_;
 };
 
   // Fired before each iteration of tests starts.
@@ -2721,7 +2726,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationStart(
 
   // Prints the filter if it's not *.  This reminds the user that some
   // tests may be skipped.
-  if (!internal::String::CStringEquals(filter, kUniversalFilter)) {
+  if (!String::CStringEquals(filter, kUniversalFilter)) {
     ColoredPrintf(COLOR_YELLOW,
                   "Note: %s filter = %s\n", GTEST_NAME_, filter);
   }
@@ -2755,22 +2760,21 @@ void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
 }
 
 void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
-  test_case_name_ = test_case.name();
-  const internal::String counts =
+  const std::string counts =
       FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
   ColoredPrintf(COLOR_GREEN, "[----------] ");
-  printf("%s from %s", counts.c_str(), test_case_name_.c_str());
+  printf("%s from %s", counts.c_str(), test_case.name());
   if (test_case.type_param() == NULL) {
     printf("\n");
   } else {
-    printf(", where TypeParam = %s\n", test_case.type_param());
+    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
   }
   fflush(stdout);
 }
 
 void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
   ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
-  PrintTestName(test_case_name_.c_str(), test_info.name());
+  PrintTestName(test_info.test_case_name(), test_info.name());
   printf("\n");
   fflush(stdout);
 }
@@ -2793,7 +2797,7 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
   } else {
     ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
   }
-  PrintTestName(test_case_name_.c_str(), test_info.name());
+  PrintTestName(test_info.test_case_name(), test_info.name());
   if (test_info.result()->Failed())
     PrintFullTestCommentIfPresent(test_info);
 
@@ -2809,12 +2813,11 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
 void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
   if (!GTEST_FLAG(print_time)) return;
 
-  test_case_name_ = test_case.name();
-  const internal::String counts =
+  const std::string counts =
       FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
   ColoredPrintf(COLOR_GREEN, "[----------] ");
   printf("%s from %s (%s ms total)\n\n",
-         counts.c_str(), test_case_name_.c_str(),
+         counts.c_str(), test_case.name(),
          internal::StreamableToString(test_case.elapsed_time()).c_str());
   fflush(stdout);
 }
@@ -2875,7 +2878,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
                         num_failures == 1 ? "TEST" : "TESTS");
   }
 
-  int num_disabled = unit_test.disabled_test_count();
+  int num_disabled = unit_test.reportable_disabled_test_count();
   if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
     if (!num_failures) {
       printf("\n");  // Add a spacer if no FAILURE banner is displayed.
@@ -3029,18 +3032,27 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {
   // is_attribute is true, the text is meant to appear as an attribute
   // value, and normalizable whitespace is preserved by replacing it
   // with character references.
-  static String EscapeXml(const char* str, bool is_attribute);
+  static std::string EscapeXml(const std::string& str, bool is_attribute);
 
   // Returns the given string with all characters invalid in XML removed.
-  static string RemoveInvalidXmlCharacters(const string& str);
+  static std::string RemoveInvalidXmlCharacters(const std::string& str);
 
   // Convenience wrapper around EscapeXml when str is an attribute value.
-  static String EscapeXmlAttribute(const char* str) {
+  static std::string EscapeXmlAttribute(const std::string& str) {
     return EscapeXml(str, true);
   }
 
   // Convenience wrapper around EscapeXml when str is not an attribute value.
-  static String EscapeXmlText(const char* str) { return EscapeXml(str, false); }
+  static std::string EscapeXmlText(const char* str) {
+    return EscapeXml(str, false);
+  }
+
+  // Verifies that the given attribute belongs to the given element and
+  // streams the attribute as XML.
+  static void OutputXmlAttribute(std::ostream* stream,
+                                 const std::string& element_name,
+                                 const std::string& name,
+                                 const std::string& value);
 
   // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
   static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
@@ -3051,19 +3063,21 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {
                                 const TestInfo& test_info);
 
   // Prints an XML representation of a TestCase object
-  static void PrintXmlTestCase(FILE* out, const TestCase& test_case);
+  static void PrintXmlTestCase(::std::ostream* stream,
+                               const TestCase& test_case);
 
   // Prints an XML summary of unit_test to output stream out.
-  static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test);
+  static void PrintXmlUnitTest(::std::ostream* stream,
+                               const UnitTest& unit_test);
 
   // Produces a string representing the test properties in a result as space
   // delimited XML attributes based on the property key="value" pairs.
-  // When the String is not empty, it includes a space at the beginning,
+  // When the std::string is not empty, it includes a space at the beginning,
   // to delimit this attribute from prior attributes.
-  static String TestPropertiesAsXmlAttributes(const TestResult& result);
+  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
 
   // The output file.
-  const String output_file_;
+  const std::string output_file_;
 
   GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
 };
@@ -3105,7 +3119,9 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
     fflush(stderr);
     exit(EXIT_FAILURE);
   }
-  PrintXmlUnitTest(xmlout, unit_test);
+  std::stringstream stream;
+  PrintXmlUnitTest(&stream, unit_test);
+  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
   fclose(xmlout);
 }
 
@@ -3121,42 +3137,43 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
 // most invalid characters can be retained using character references.
 // TODO(wan): It might be nice to have a minimally invasive, human-readable
 // escaping scheme for invalid characters, rather than dropping them.
-String XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) {
+std::string XmlUnitTestResultPrinter::EscapeXml(
+    const std::string& str, bool is_attribute) {
   Message m;
 
-  if (str != NULL) {
-    for (const char* src = str; *src; ++src) {
-      switch (*src) {
-        case '<':
-          m << "<";
-          break;
-        case '>':
-          m << ">";
-          break;
-        case '&':
-          m << "&";
-          break;
-        case '\'':
-          if (is_attribute)
-            m << "'";
-          else
-            m << '\'';
-          break;
-        case '"':
-          if (is_attribute)
-            m << """;
+  for (size_t i = 0; i < str.size(); ++i) {
+    const char ch = str[i];
+    switch (ch) {
+      case '<':
+        m << "<";
+        break;
+      case '>':
+        m << ">";
+        break;
+      case '&':
+        m << "&";
+        break;
+      case '\'':
+        if (is_attribute)
+          m << "'";
+        else
+          m << '\'';
+        break;
+      case '"':
+        if (is_attribute)
+          m << """;
+        else
+          m << '"';
+        break;
+      default:
+        if (IsValidXmlCharacter(ch)) {
+          if (is_attribute && IsNormalizableWhitespace(ch))
+            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+              << ";";
           else
-            m << '"';
-          break;
-        default:
-          if (IsValidXmlCharacter(*src)) {
-            if (is_attribute && IsNormalizableWhitespace(*src))
-              m << String::Format("&#x%02X;", unsigned(*src));
-            else
-              m << *src;
-          }
-          break;
-      }
+            m << ch;
+        }
+        break;
     }
   }
 
@@ -3166,10 +3183,11 @@ String XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) {
 // Returns the given string with all characters invalid in XML removed.
 // Currently invalid characters are dropped from the string. An
 // alternative is to replace them with certain characters such as . or ?.
-string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const string& str) {
-  string output;
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+    const std::string& str) {
+  std::string output;
   output.reserve(str.size());
-  for (string::const_iterator it = str.begin(); it != str.end(); ++it)
+  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
     if (IsValidXmlCharacter(*it))
       output.push_back(*it);
 
@@ -3199,6 +3217,32 @@ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
   return ss.str();
 }
 
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+  // Using non-reentrant version as localtime_r is not portable.
+  time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe).
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+# pragma warning(pop)           // Restores the warning state again.
+#else
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+#endif
+  if (time_struct == NULL)
+    return "";  // Invalid ms value
+
+  // YYYY-MM-DDThh:mm:ss
+  return StreamableToString(time_struct->tm_year + 1900) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+      String::FormatIntWidth2(time_struct->tm_min) + ":" +
+      String::FormatIntWidth2(time_struct->tm_sec);
+}
+
 // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
 void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
                                                      const char* data) {
@@ -3219,45 +3263,63 @@ void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
   *stream << "]]>";
 }
 
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+    std::ostream* stream,
+    const std::string& element_name,
+    const std::string& name,
+    const std::string& value) {
+  const std::vector<std::string>& allowed_names =
+      GetReservedAttributesForElement(element_name);
+
+  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+                   allowed_names.end())
+      << "Attribute " << name << " is not allowed for element <" << element_name
+      << ">.";
+
+  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
 // Prints an XML representation of a TestInfo object.
 // TODO(wan): There is also value in printing properties with the plain printer.
 void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
                                                  const char* test_case_name,
                                                  const TestInfo& test_info) {
   const TestResult& result = *test_info.result();
-  *stream << "    <testcase name=\""
-          << EscapeXmlAttribute(test_info.name()).c_str() << "\"";
+  const std::string kTestcase = "testcase";
+
+  *stream << "    <testcase";
+  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
 
   if (test_info.value_param() != NULL) {
-    *stream << " value_param=\"" << EscapeXmlAttribute(test_info.value_param())
-            << "\"";
+    OutputXmlAttribute(stream, kTestcase, "value_param",
+                       test_info.value_param());
   }
   if (test_info.type_param() != NULL) {
-    *stream << " type_param=\"" << EscapeXmlAttribute(test_info.type_param())
-            << "\"";
+    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
   }
 
-  *stream << " status=\""
-          << (test_info.should_run() ? "run" : "notrun")
-          << "\" time=\""
-          << FormatTimeInMillisAsSeconds(result.elapsed_time())
-          << "\" classname=\"" << EscapeXmlAttribute(test_case_name).c_str()
-          << "\"" << TestPropertiesAsXmlAttributes(result).c_str();
+  OutputXmlAttribute(stream, kTestcase, "status",
+                     test_info.should_run() ? "run" : "notrun");
+  OutputXmlAttribute(stream, kTestcase, "time",
+                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
+  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+  *stream << TestPropertiesAsXmlAttributes(result);
 
   int failures = 0;
   for (int i = 0; i < result.total_part_count(); ++i) {
     const TestPartResult& part = result.GetTestPartResult(i);
     if (part.failed()) {
-      if (++failures == 1)
+      if (++failures == 1) {
         *stream << ">\n";
-      *stream << "      <failure message=\""
-              << EscapeXmlAttribute(part.summary()).c_str()
-              << "\" type=\"\">";
+      }
       const string location = internal::FormatCompilerIndependentFileLocation(
           part.file_name(), part.line_number());
-      const string message = location + "\n" + part.message();
-      OutputXmlCDataSection(stream,
-                            RemoveInvalidXmlCharacters(message).c_str());
+      const string summary = location + "\n" + part.summary();
+      *stream << "      <failure message=\""
+              << EscapeXmlAttribute(summary.c_str())
+              << "\" type=\"\">";
+      const string detail = location + "\n" + part.message();
+      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
       *stream << "</failure>\n";
     }
   }
@@ -3269,49 +3331,73 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
 }
 
 // Prints an XML representation of a TestCase object
-void XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out,
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
                                                 const TestCase& test_case) {
-  fprintf(out,
-          "  <testsuite name=\"%s\" tests=\"%d\" failures=\"%d\" "
-          "disabled=\"%d\" ",
-          EscapeXmlAttribute(test_case.name()).c_str(),
-          test_case.total_test_count(),
-          test_case.failed_test_count(),
-          test_case.disabled_test_count());
-  fprintf(out,
-          "errors=\"0\" time=\"%s\">\n",
-          FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str());
+  const std::string kTestsuite = "testsuite";
+  *stream << "  <" << kTestsuite;
+  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+  OutputXmlAttribute(stream, kTestsuite, "tests",
+                     StreamableToString(test_case.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "failures",
+                     StreamableToString(test_case.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuite, "disabled",
+      StreamableToString(test_case.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+  OutputXmlAttribute(stream, kTestsuite, "time",
+                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+          << ">\n";
+
   for (int i = 0; i < test_case.total_test_count(); ++i) {
-    ::std::stringstream stream;
-    OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i));
-    fprintf(out, "%s", StringStreamToString(&stream).c_str());
+    if (test_case.GetTestInfo(i)->is_reportable())
+      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
   }
-  fprintf(out, "  </testsuite>\n");
+  *stream << "  </" << kTestsuite << ">\n";
 }
 
 // Prints an XML summary of unit_test to output stream out.
-void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
                                                 const UnitTest& unit_test) {
-  fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-  fprintf(out,
-          "<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
-          "errors=\"0\" time=\"%s\" ",
-          unit_test.total_test_count(),
-          unit_test.failed_test_count(),
-          unit_test.disabled_test_count(),
-          FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());
+  const std::string kTestsuites = "testsuites";
+
+  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  *stream << "<" << kTestsuites;
+
+  OutputXmlAttribute(stream, kTestsuites, "tests",
+                     StreamableToString(unit_test.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "failures",
+                     StreamableToString(unit_test.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuites, "disabled",
+      StreamableToString(unit_test.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+  OutputXmlAttribute(
+      stream, kTestsuites, "timestamp",
+      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+  OutputXmlAttribute(stream, kTestsuites, "time",
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
   if (GTEST_FLAG(shuffle)) {
-    fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
+    OutputXmlAttribute(stream, kTestsuites, "random_seed",
+                       StreamableToString(unit_test.random_seed()));
+  }
+
+  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+  *stream << ">\n";
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
   }
-  fprintf(out, "name=\"AllTests\">\n");
-  for (int i = 0; i < unit_test.total_test_case_count(); ++i)
-    PrintXmlTestCase(out, *unit_test.GetTestCase(i));
-  fprintf(out, "</testsuites>\n");
+  *stream << "</" << kTestsuites << ">\n";
 }
 
 // Produces a string representing the test properties in a result as space
 // delimited XML attributes based on the property key="value" pairs.
-String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
     const TestResult& result) {
   Message attributes;
   for (int i = 0; i < result.test_property_count(); ++i) {
@@ -3326,112 +3412,6 @@ String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
 
 #if GTEST_CAN_STREAM_RESULTS_
 
-// Streams test results to the given port on the given host machine.
-class StreamingListener : public EmptyTestEventListener {
- public:
-  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
-  static string UrlEncode(const char* str);
-
-  StreamingListener(const string& host, const string& port)
-      : sockfd_(-1), host_name_(host), port_num_(port) {
-    MakeConnection();
-    Send("gtest_streaming_protocol_version=1.0\n");
-  }
-
-  virtual ~StreamingListener() {
-    if (sockfd_ != -1)
-      CloseConnection();
-  }
-
-  void OnTestProgramStart(const UnitTest& /* unit_test */) {
-    Send("event=TestProgramStart\n");
-  }
-
-  void OnTestProgramEnd(const UnitTest& unit_test) {
-    // Note that Google Test current only report elapsed time for each
-    // test iteration, not for the entire test program.
-    Send(String::Format("event=TestProgramEnd&passed=%d\n",
-                        unit_test.Passed()));
-
-    // Notify the streaming server to stop.
-    CloseConnection();
-  }
-
-  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
-    Send(String::Format("event=TestIterationStart&iteration=%d\n",
-                        iteration));
-  }
-
-  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
-    Send(String::Format("event=TestIterationEnd&passed=%d&elapsed_time=%sms\n",
-                        unit_test.Passed(),
-                        StreamableToString(unit_test.elapsed_time()).c_str()));
-  }
-
-  void OnTestCaseStart(const TestCase& test_case) {
-    Send(String::Format("event=TestCaseStart&name=%s\n", test_case.name()));
-  }
-
-  void OnTestCaseEnd(const TestCase& test_case) {
-    Send(String::Format("event=TestCaseEnd&passed=%d&elapsed_time=%sms\n",
-                        test_case.Passed(),
-                        StreamableToString(test_case.elapsed_time()).c_str()));
-  }
-
-  void OnTestStart(const TestInfo& test_info) {
-    Send(String::Format("event=TestStart&name=%s\n", test_info.name()));
-  }
-
-  void OnTestEnd(const TestInfo& test_info) {
-    Send(String::Format(
-        "event=TestEnd&passed=%d&elapsed_time=%sms\n",
-        (test_info.result())->Passed(),
-        StreamableToString((test_info.result())->elapsed_time()).c_str()));
-  }
-
-  void OnTestPartResult(const TestPartResult& test_part_result) {
-    const char* file_name = test_part_result.file_name();
-    if (file_name == NULL)
-      file_name = "";
-    Send(String::Format("event=TestPartResult&file=%s&line=%d&message=",
-                        UrlEncode(file_name).c_str(),
-                        test_part_result.line_number()));
-    Send(UrlEncode(test_part_result.message()) + "\n");
-  }
-
- private:
-  // Creates a client socket and connects to the server.
-  void MakeConnection();
-
-  // Closes the socket.
-  void CloseConnection() {
-    GTEST_CHECK_(sockfd_ != -1)
-        << "CloseConnection() can be called only when there is a connection.";
-
-    close(sockfd_);
-    sockfd_ = -1;
-  }
-
-  // Sends a string to the socket.
-  void Send(const string& message) {
-    GTEST_CHECK_(sockfd_ != -1)
-        << "Send() can be called only when there is a connection.";
-
-    const int len = static_cast<int>(message.length());
-    if (write(sockfd_, message.c_str(), len) != len) {
-      GTEST_LOG_(WARNING)
-          << "stream_result_to: failed to stream to "
-          << host_name_ << ":" << port_num_;
-    }
-  }
-
-  int sockfd_;   // socket file descriptor
-  const string host_name_;
-  const string port_num_;
-
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
-};  // class StreamingListener
-
 // Checks if str contains '=', '&', '%' or '\n' characters. If yes,
 // replaces them by "%xx" where xx is their hexadecimal value. For
 // example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
@@ -3446,7 +3426,7 @@ string StreamingListener::UrlEncode(const char* str) {
       case '=':
       case '&':
       case '\n':
-        result.append(String::Format("%%%02x", static_cast<unsigned char>(ch)));
+        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
         break;
       default:
         result.push_back(ch);
@@ -3456,7 +3436,7 @@ string StreamingListener::UrlEncode(const char* str) {
   return result;
 }
 
-void StreamingListener::MakeConnection() {
+void StreamingListener::SocketWriter::MakeConnection() {
   GTEST_CHECK_(sockfd_ == -1)
       << "MakeConnection() can't be called when there is already a connection.";
 
@@ -3504,8 +3484,8 @@ void StreamingListener::MakeConnection() {
 
 // Pushes the given source file location and message onto a per-thread
 // trace stack maintained by Google Test.
-// L < UnitTest::mutex_
-ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
   TraceInfo trace;
   trace.file = file;
   trace.line = line;
@@ -3515,35 +3495,64 @@ ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
 }
 
 // Pops the info pushed by the c'tor.
-// L < UnitTest::mutex_
-ScopedTrace::~ScopedTrace() {
+ScopedTrace::~ScopedTrace()
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
   UnitTest::GetInstance()->PopGTestTrace();
 }
 
 
 // class OsStackTraceGetter
 
-// Returns the current OS stack trace as a String.  Parameters:
+// Returns the current OS stack trace as an std::string.  Parameters:
 //
 //   max_depth  - the maximum number of stack frames to be included
 //                in the trace.
 //   skip_count - the number of top frames to be skipped; doesn't count
 //                against max_depth.
 //
-// L < mutex_
-// We use "L < mutex_" to denote that the function may acquire mutex_.
-String OsStackTraceGetter::CurrentStackTrace(int, int) {
-  return String("");
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+                                             int /* skip_count */)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  return "";
 }
 
-// L < mutex_
-void OsStackTraceGetter::UponLeavingGTest() {
+void OsStackTraceGetter::UponLeavingGTest()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
 }
 
 const char* const
 OsStackTraceGetter::kElidedFramesMarker =
     "... " GTEST_NAME_ " internal frames ...";
 
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+      : premature_exit_filepath_(premature_exit_filepath) {
+    // If a path to the premature-exit file is specified...
+    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+      // create the file with a single "0" character in it.  I/O
+      // errors are ignored as there's nothing better we can do and we
+      // don't want to fail the test because of this.
+      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+      fwrite("0", 1, 1, pfile);
+      fclose(pfile);
+    }
+  }
+
+  ~ScopedPrematureExitFile() {
+    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+      remove(premature_exit_filepath_);
+    }
+  }
+
+ private:
+  const char* const premature_exit_filepath_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
 }  // namespace internal
 
 // class TestEventListeners
@@ -3630,7 +3639,7 @@ void TestEventListeners::SuppressEventForwarding() {
 // We don't protect this under mutex_ as a user is not supposed to
 // call this before main() starts, from which point on the return
 // value will never change.
-UnitTest * UnitTest::GetInstance() {
+UnitTest* UnitTest::GetInstance() {
   // When compiled with MSVC 7.1 in optimized mode, destroying the
   // UnitTest object upon exiting the program messes up the exit code,
   // causing successful tests to appear failed.  We have to use a
@@ -3680,17 +3689,33 @@ int UnitTest::successful_test_count() const {
 // Gets the number of failed tests.
 int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
 
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+  return impl()->reportable_disabled_test_count();
+}
+
 // Gets the number of disabled tests.
 int UnitTest::disabled_test_count() const {
   return impl()->disabled_test_count();
 }
 
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+  return impl()->reportable_test_count();
+}
+
 // Gets the number of all tests.
 int UnitTest::total_test_count() const { return impl()->total_test_count(); }
 
 // Gets the number of tests that should run.
 int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
 
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+    return impl()->start_timestamp();
+}
+
 // Gets the elapsed time, in milliseconds.
 internal::TimeInMillis UnitTest::elapsed_time() const {
   return impl()->elapsed_time();
@@ -3709,6 +3734,12 @@ const TestCase* UnitTest::GetTestCase(int i) const {
   return impl()->GetTestCase(i);
 }
 
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+  return *impl()->ad_hoc_test_result();
+}
+
 // Gets the i-th test case among all the test cases. i can range from 0 to
 // total_test_case_count() - 1. If i is not in that range, returns NULL.
 TestCase* UnitTest::GetMutableTestCase(int i) {
@@ -3744,12 +3775,12 @@ Environment* UnitTest::AddEnvironment(Environment* env) {
 // assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
 // this to report their results.  The user code should use the
 // assertion macros instead of calling this directly.
-// L < mutex_
-void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
-                                 const char* file_name,
-                                 int line_number,
-                                 const internal::String& message,
-                                 const internal::String& os_stack_trace) {
+void UnitTest::AddTestPartResult(
+    TestPartResult::Type result_type,
+    const char* file_name,
+    int line_number,
+    const std::string& message,
+    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
   Message msg;
   msg << message;
 
@@ -3796,7 +3827,7 @@ void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
 #endif  // GTEST_OS_WINDOWS
     } else if (GTEST_FLAG(throw_on_failure)) {
 #if GTEST_HAS_EXCEPTIONS
-      throw GoogleTestFailureException(result);
+      throw internal::GoogleTestFailureException(result);
 #else
       // We cannot call abort() as it generates a pop-up in debug mode
       // that cannot be suppressed in VC 7.1 or below.
@@ -3806,12 +3837,14 @@ void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
   }
 }
 
-// Creates and adds a property to the current TestResult. If a property matching
-// the supplied value already exists, updates its value instead.
-void UnitTest::RecordPropertyForCurrentTest(const char* key,
-                                            const char* value) {
-  const TestProperty test_property(key, value);
-  impl_->current_test_result()->RecordProperty(test_property);
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere.  If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+                              const std::string& value) {
+  impl_->RecordProperty(TestProperty(key, value));
 }
 
 // Runs all tests in this UnitTest object and prints the result.
@@ -3820,20 +3853,44 @@ void UnitTest::RecordPropertyForCurrentTest(const char* key,
 // We don't protect this under mutex_, as we only support calling it
 // from the main thread.
 int UnitTest::Run() {
+  const bool in_death_test_child_process =
+      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+  // Google Test implements this protocol for catching that a test
+  // program exits before returning control to Google Test:
+  //
+  //   1. Upon start, Google Test creates a file whose absolute path
+  //      is specified by the environment variable
+  //      TEST_PREMATURE_EXIT_FILE.
+  //   2. When Google Test has finished its work, it deletes the file.
+  //
+  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+  // running a Google-Test-based test program and check the existence
+  // of the file at the end of the test execution to see if it has
+  // exited prematurely.
+
+  // If we are in the child process of a death test, don't
+  // create/delete the premature exit file, as doing so is unnecessary
+  // and will confuse the parent process.  Otherwise, create/delete
+  // the file upon entering/leaving this function.  If the program
+  // somehow exits before this function has a chance to return, the
+  // premature-exit file will be left undeleted, causing a test runner
+  // that understands the premature-exit-file protocol to report the
+  // test as having failed.
+  const internal::ScopedPrematureExitFile premature_exit_file(
+      in_death_test_child_process ?
+      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
   // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
   // used for the duration of the program.
   impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
 
 #if GTEST_HAS_SEH
-  const bool in_death_test_child_process =
-      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
-
   // Either the user wants Google Test to catch exceptions thrown by the
   // tests or this is executing in the context of death test child
   // process. In either case the user does not want to see pop-up dialogs
   // about crashes - they are expected.
   if (impl()->catch_exceptions() || in_death_test_child_process) {
-
 # if !GTEST_OS_WINDOWS_MOBILE
     // SetErrorMode doesn't exist on CE.
     SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
@@ -3864,7 +3921,6 @@ int UnitTest::Run() {
           0x0,                                    // Clear the following flags:
           _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
 # endif
-
   }
 #endif  // GTEST_HAS_SEH
 
@@ -3882,16 +3938,16 @@ const char* UnitTest::original_working_dir() const {
 
 // Returns the TestCase object for the test that's currently running,
 // or NULL if no test is running.
-// L < mutex_
-const TestCase* UnitTest::current_test_case() const {
+const TestCase* UnitTest::current_test_case() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
   internal::MutexLock lock(&mutex_);
   return impl_->current_test_case();
 }
 
 // Returns the TestInfo object for the test that's currently running,
 // or NULL if no test is running.
-// L < mutex_
-const TestInfo* UnitTest::current_test_info() const {
+const TestInfo* UnitTest::current_test_info() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
   internal::MutexLock lock(&mutex_);
   return impl_->current_test_info();
 }
@@ -3902,9 +3958,9 @@ int UnitTest::random_seed() const { return impl_->random_seed(); }
 #if GTEST_HAS_PARAM_TEST
 // Returns ParameterizedTestCaseRegistry object used to keep track of
 // value-parameterized tests and instantiate and register them.
-// L < mutex_
 internal::ParameterizedTestCaseRegistry&
-    UnitTest::parameterized_test_registry() {
+    UnitTest::parameterized_test_registry()
+        GTEST_LOCK_EXCLUDED_(mutex_) {
   return impl_->parameterized_test_registry();
 }
 #endif  // GTEST_HAS_PARAM_TEST
@@ -3921,15 +3977,15 @@ UnitTest::~UnitTest() {
 
 // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
 // Google Test trace stack.
-// L < mutex_
-void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
   internal::MutexLock lock(&mutex_);
   impl_->gtest_trace_stack().push_back(trace);
 }
 
 // Pops a trace from the per-thread Google Test trace stack.
-// L < mutex_
-void UnitTest::PopGTestTrace() {
+void UnitTest::PopGTestTrace()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
   internal::MutexLock lock(&mutex_);
   impl_->gtest_trace_stack().pop_back();
 }
@@ -3965,9 +4021,9 @@ UnitTestImpl::UnitTestImpl(UnitTest* parent)
       post_flag_parse_init_performed_(false),
       random_seed_(0),  // Will be overridden by the flag before first use.
       random_(0),  // Will be reseeded before first use.
+      start_timestamp_(0),
       elapsed_time_(0),
 #if GTEST_HAS_DEATH_TEST
-      internal_run_death_test_flag_(NULL),
       death_test_factory_(new DefaultDeathTestFactory),
 #endif
       // Will be overridden by the flag before first use.
@@ -3985,6 +4041,28 @@ UnitTestImpl::~UnitTestImpl() {
   delete os_stack_trace_getter_;
 }
 
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise.  If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+  std::string xml_element;
+  TestResult* test_result;  // TestResult appropriate for property recording.
+
+  if (current_test_info_ != NULL) {
+    xml_element = "testcase";
+    test_result = &(current_test_info_->result_);
+  } else if (current_test_case_ != NULL) {
+    xml_element = "testsuite";
+    test_result = &(current_test_case_->ad_hoc_test_result_);
+  } else {
+    xml_element = "testsuites";
+    test_result = &ad_hoc_test_result_;
+  }
+  test_result->RecordProperty(xml_element, test_property);
+}
+
 #if GTEST_HAS_DEATH_TEST
 // Disables event forwarding if the control is currently in a death test
 // subprocess. Must not be called before InitGoogleTest.
@@ -3997,7 +4075,7 @@ void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
 // Initializes event listeners performing XML output as specified by
 // UnitTestOptions. Must not be called before InitGoogleTest.
 void UnitTestImpl::ConfigureXmlOutput() {
-  const String& output_format = UnitTestOptions::GetOutputFormat();
+  const std::string& output_format = UnitTestOptions::GetOutputFormat();
   if (output_format == "xml") {
     listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
         UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
@@ -4009,13 +4087,13 @@ void UnitTestImpl::ConfigureXmlOutput() {
 }
 
 #if GTEST_CAN_STREAM_RESULTS_
-// Initializes event listeners for streaming test results in String form.
+// Initializes event listeners for streaming test results in string form.
 // Must not be called before InitGoogleTest.
 void UnitTestImpl::ConfigureStreamingOutput() {
-  const string& target = GTEST_FLAG(stream_result_to);
+  const std::string& target = GTEST_FLAG(stream_result_to);
   if (!target.empty()) {
     const size_t pos = target.find(':');
-    if (pos != string::npos) {
+    if (pos != std::string::npos) {
       listeners()->Append(new StreamingListener(target.substr(0, pos),
                                                 target.substr(pos+1)));
     } else {
@@ -4069,7 +4147,7 @@ void UnitTestImpl::PostFlagParsingInit() {
 class TestCaseNameIs {
  public:
   // Constructor.
-  explicit TestCaseNameIs(const String& name)
+  explicit TestCaseNameIs(const std::string& name)
       : name_(name) {}
 
   // Returns true iff the name of test_case matches name_.
@@ -4078,7 +4156,7 @@ class TestCaseNameIs {
   }
 
  private:
-  String name_;
+  std::string name_;
 };
 
 // Finds and returns a TestCase with the given name.  If one doesn't
@@ -4110,7 +4188,7 @@ TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
       new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
 
   // Is this a death test case?
-  if (internal::UnitTestOptions::MatchesFilter(String(test_case_name),
+  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
                                                kDeathTestCaseFilter)) {
     // Yes.  Inserts the test case after the last death test case
     // defined so far.  This only works when the test cases haven't
@@ -4196,6 +4274,7 @@ bool UnitTestImpl::RunAllTests() {
 
   TestEventListener* repeater = listeners()->repeater();
 
+  start_timestamp_ = GetTimeInMillis();
   repeater->OnTestProgramStart(*parent_);
 
   // How many times to repeat the tests?  We don't want to repeat them
@@ -4388,12 +4467,12 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
   int num_selected_tests = 0;
   for (size_t i = 0; i < test_cases_.size(); i++) {
     TestCase* const test_case = test_cases_[i];
-    const String &test_case_name = test_case->name();
+    const std::string &test_case_name = test_case->name();
     test_case->set_should_run(false);
 
     for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
       TestInfo* const test_info = test_case->test_info_list()[j];
-      const String test_name(test_info->name());
+      const std::string test_name(test_info->name());
       // A test is disabled if test case name or test name matches
       // kDisableTestFilter.
       const bool is_disabled =
@@ -4427,8 +4506,33 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
   return num_selected_tests;
 }
 
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n".  If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+  if (str != NULL) {
+    for (int i = 0; *str != '\0'; ++str) {
+      if (i >= max_length) {
+        printf("...");
+        break;
+      }
+      if (*str == '\n') {
+        printf("\\n");
+        i += 2;
+      } else {
+        printf("%c", *str);
+        ++i;
+      }
+    }
+  }
+}
+
 // Prints the names of the tests matching the user-specified filter flag.
 void UnitTestImpl::ListTestsMatchingFilter() {
+  // Print at most this many characters for each type/value parameter.
+  const int kMaxParamLength = 250;
+
   for (size_t i = 0; i < test_cases_.size(); i++) {
     const TestCase* const test_case = test_cases_[i];
     bool printed_test_case_name = false;
@@ -4439,9 +4543,23 @@ void UnitTestImpl::ListTestsMatchingFilter() {
       if (test_info->matches_filter_) {
         if (!printed_test_case_name) {
           printed_test_case_name = true;
-          printf("%s.\n", test_case->name());
+          printf("%s.", test_case->name());
+          if (test_case->type_param() != NULL) {
+            printf("  # %s = ", kTypeParamLabel);
+            // We print the type parameter on a single line to make
+            // the output easy to parse by a program.
+            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+          }
+          printf("\n");
+        }
+        printf("  %s", test_info->name());
+        if (test_info->value_param() != NULL) {
+          printf("  # %s = ", kValueParamLabel);
+          // We print the value parameter on a single line to make the
+          // output easy to parse by a program.
+          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
         }
-        printf("  %s\n", test_info->name());
+        printf("\n");
       }
     }
   }
@@ -4505,7 +4623,7 @@ void UnitTestImpl::UnshuffleTests() {
   }
 }
 
-// Returns the current OS stack trace as a String.
+// Returns the current OS stack trace as an std::string.
 //
 // The maximum number of stack frames to be included is specified by
 // the gtest_stack_trace_depth flag.  The skip_count parameter
@@ -4515,8 +4633,8 @@ void UnitTestImpl::UnshuffleTests() {
 // For example, if Foo() calls Bar(), which in turn calls
 // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
 // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
-String GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
-                                       int skip_count) {
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+                                            int skip_count) {
   // We pass skip_count + 1 to skip this wrapper function in addition
   // to what the user really wants to skip.
   return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
@@ -4564,7 +4682,7 @@ const char* ParseFlagValue(const char* str,
   if (str == NULL || flag == NULL) return NULL;
 
   // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
-  const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX_, flag);
+  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
   const size_t flag_len = flag_str.length();
   if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
 
@@ -4629,7 +4747,7 @@ bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
 //
 // On success, stores the value of the flag in *value, and returns
 // true.  On failure, returns false without changing *value.
-bool ParseStringFlag(const char* str, const char* flag, String* value) {
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
   // Gets the value of the flag as a string.
   const char* const value_str = ParseFlagValue(str, flag, false);
 
@@ -4681,7 +4799,7 @@ static void PrintColorEncoded(const char* str) {
       return;
     }
 
-    ColoredPrintf(color, "%s", String(str, p - str).c_str());
+    ColoredPrintf(color, "%s", std::string(str, p).c_str());
 
     const char ch = p[1];
     str = p + 2;
@@ -4771,7 +4889,7 @@ static const char kColorEncodedHelpMessage[] =
 template <typename CharType>
 void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
   for (int i = 1; i < *argc; i++) {
-    const String arg_string = StreamableToString(argv[i]);
+    const std::string arg_string = StreamableToString(argv[i]);
     const char* const arg = arg_string.c_str();
 
     using internal::ParseBoolFlag;
diff --git a/test/gtest/src/gtest_main.cc b/test/gtest/src/gtest_main.cc
index a09bbe0..f302822 100644
--- a/test/gtest/src/gtest_main.cc
+++ b/test/gtest/src/gtest_main.cc
@@ -27,13 +27,12 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#include <iostream>
+#include <stdio.h>
 
 #include "gtest/gtest.h"
 
 GTEST_API_ int main(int argc, char **argv) {
-  std::cout << "Running main() from gtest_main.cc\n";
-
+  printf("Running main() from gtest_main.cc\n");
   testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
 }
diff --git a/test/integration/CMakeLists.txt b/test/integration/CMakeLists.txt
new file mode 100644
index 0000000..70cd76c
--- /dev/null
+++ b/test/integration/CMakeLists.txt
@@ -0,0 +1,117 @@
+include_directories (
+  ${ODE_INCLUDE_DIRS}
+  ${OPENGL_INCLUDE_DIR}
+  ${OGRE_INCLUDE_DIRS}
+  ${Boost_INCLUDE_DIRS}
+  ${PROTOBUF_INCLUDE_DIR}
+)
+
+link_directories(
+  ${ogre_library_dirs}
+  ${Boost_LIBRARY_DIRS}
+  ${ODE_LIBRARY_DIRS}
+)
+
+# Disable the player test for now, until we figure out a better way to test them
+#if (INCLUDE_PLAYER)
+#  add_subdirectory(player)
+#endif()
+
+if(HAVE_BULLET)
+  include_directories ( ${BULLET_INCLUDE_DIRS} )
+  link_directories ( ${BULLET_LIBRARY_DIRS} )
+endif()
+if(HAVE_DART)
+  include_directories ( ${DART_INCLUDE_DIRS} )
+  link_directories ( ${DART_LIBRARY_DIRS} )
+endif()
+
+set(tests
+  aero_plugin.cc
+  bandwidth.cc
+  concave_mesh.cc
+  contact_sensor.cc
+  dem.cc
+  factory.cc
+  file_handling.cc
+  gripper.cc
+  gz_joint.cc
+  gz_log.cc
+  gz_model.cc
+  gz_physics.cc
+  gz_world.cc
+  imu.cc
+  joint_controller.cc
+  joint_force_torque.cc
+  joint_gearbox.cc
+  joint_revolute.cc
+  joint_screw.cc
+  joint_spawn.cc
+  joint_test.cc
+  joint_universal.cc
+  laser.cc
+  model_database.cc
+  noise.cc
+  nondefault_world.cc
+  physics.cc
+  physics_friction.cc
+  physics_link.cc
+  physics_msgs.cc
+  physics_thread_safe.cc
+  pioneer2dx.cc
+  server_fixture.cc
+  speed.cc
+  stress_spawn_models.cc
+  #state_log.cc
+  surface_properties.cc
+  transceiver.cc
+  transport.cc
+  world.cc
+  world_entity_below_point.cc
+  worlds_installed.cc
+  )
+
+if (MANPAGES_SUPPORT)
+  set (tests ${tests}
+	      manpages.cc)
+endif()
+
+gz_build_tests(${tests})
+
+if (ENABLE_TESTS_COMPILATION)
+  # Increase timeout, to account for model download time.
+  set_tests_properties(${TEST_TYPE}_factory PROPERTIES TIMEOUT 500)
+  set_tests_properties(${TEST_TYPE}_physics PROPERTIES TIMEOUT 500)
+endif()
+
+set(display_tests
+)
+
+# Build the display tests (need extra sources to compile)
+gz_build_display_tests(${display_tests})
+
+set(dri_tests
+  camera.cc
+  camera_sensor.cc
+  gpu_laser.cc
+  gz_camera.cc
+  heightmap.cc
+  multicamera_sensor.cc
+  ogre_log.cc
+  pr2.cc
+  projector.cc
+  rendering_sensor.cc
+  speed_pr2.cc
+  world_reset.cc
+)
+
+gz_build_dri_tests(${dri_tests})
+
+
+if (ENABLE_TESTS_COMPILATION AND VALID_DRI_DISPLAY)
+  # Increase timeout, to account for model download time.
+  set_tests_properties(${TEST_TYPE}_pr2 PROPERTIES TIMEOUT 500)
+
+  # Increase timeout, to account for model download time.
+  set_tests_properties(${TEST_TYPE}_pioneer2dx PROPERTIES TIMEOUT 500)
+endif()
diff --git a/test/integration/SimplePendulumIntegrator.hh b/test/integration/SimplePendulumIntegrator.hh
new file mode 100644
index 0000000..bb0e5d1
--- /dev/null
+++ b/test/integration/SimplePendulumIntegrator.hh
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+/* Desc: Simple pendulum motion integrator
+ * Author: John Hsu
+ * Date: 2012/04/20
+ */
+
+#include <math.h>
+
+// integrate d^2 theta / dt^2 = - g * sin(theta) / l
+// by discretizing via central differencing (requires very small dt)
+//   (theta_2 - 2*theta_1 + theta_2) / dt^2 = -g * sin(theta_1) / l
+//
+//   or euler + 3-4-1 backward Euler is 2nd order:
+//
+//   (2*theta_2 - 5*theta_1 + 4*theta_2 -theta_3) / dt^2
+//     = -g * sin(theta_1) / l
+//
+// where thata_3 is theta(t - 3*dt)
+//       thata_2 is theta(t - 2*dt)
+//       thata_1 is theta(t -   dt)
+//       and
+//       thata_f or theta(t_f) is the solution returned
+//
+// If pendulum starts out stationary, one can assume
+//   theta_3 = theta_2 = theta_1 = theta_i
+//
+double PendulumAngle(double g, double l, double theta_i,
+                     double t_i, double t_f , double dt)
+{
+  double theta_3 = theta_i;
+  double theta_2 = theta_i;
+  double theta_1 = theta_i;
+  double theta_f = theta_i;
+  int steps = ceil((t_f - t_i) / dt);
+  double t = t_i;
+  for (int i = 0 ; i < steps; i++)
+  {
+    t += dt;
+    theta_f = (-dt*dt*g*sin(theta_1)/l
+                + theta_3
+                - 4.0*theta_2
+                + 5.0*theta_1)/2.0;
+    /*
+    theta_f = (-dt*dt*g*sin(theta_1)/l
+                - 1.0*theta_2
+                + 2.0*theta_1);
+    */
+    // next step
+    theta_3 = theta_2;
+    theta_2 = theta_1;
+    theta_1 = theta_f;
+    // printf("debug t[%f] t_f[%f] theta_f[%f]\n", t, t_f, theta_f);
+  }
+  if (fabs(t - t_f) > 0.000001)
+    printf("time mismatch t[%f] t_f[%f] theta_f[%f]\n", t, t_f, theta_f);
+
+  return theta_f;
+}
diff --git a/test/integration/aero_plugin.cc b/test/integration/aero_plugin.cc
new file mode 100644
index 0000000..ec131f3
--- /dev/null
+++ b/test/integration/aero_plugin.cc
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/physics/physics.hh"
+#include "gazebo/physics/Joint.hh"
+#include "test/ServerFixture.hh"
+#include "test/integration/helper_physics_generator.hh"
+
+#define TOL 1e-6
+#define TOL_CONT 2.0
+
+using namespace gazebo;
+
+class JointLiftDragPluginTest : public ServerFixture,
+                             public testing::WithParamInterface<const char*>
+{
+  /// \brief Load example world with a lifting surface plugin
+  /// Measure / verify force torques against analytical answers.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void LiftDragPlugin1(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void JointLiftDragPluginTest::LiftDragPlugin1(const std::string &_physicsEngine)
+{
+  if (_physicsEngine != "ode")
+  {
+    gzlog << "this test works for ode only for now (Link::AddForce)"
+          << " missing for other engines.\n";
+    return;
+  }
+
+  // Load our force torque test world
+  Load("worlds/lift_drag_plugin.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics->SetGravity(math::Vector3(0, 0, 0));
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+
+  // get time step size
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  gzlog << "dt : " << dt << "\n";
+
+  // verify that time moves forward
+  EXPECT_DOUBLE_EQ(t, dt);
+  gzlog << "t after one step : " << t << "\n";
+
+  // get joint and get force torque
+  physics::ModelPtr model_1 = world->GetModel("lift_drag_demo_model");
+  physics::LinkPtr body = model_1->GetLink("body");
+  physics::LinkPtr wing_1 = model_1->GetLink("wing_1");
+  physics::LinkPtr wing_2 = model_1->GetLink("wing_2");
+  physics::JointPtr body_joint = model_1->GetJoint("body_joint");
+  physics::JointPtr wing_1_joint = model_1->GetJoint("wing_1_joint");
+  physics::JointPtr wing_2_joint = model_1->GetJoint("wing_2_joint");
+
+  // some aero coeffs
+  double cla = 4.0;
+  double cda = 20.0;
+  double dihedral = 0.1;
+  double rho = 1.2041;
+  double area = 10;
+  // double stall_alpha = 10.0;
+  double a0 = 0.1;
+
+  // run for 100 seconds
+  for (unsigned int i = 0; i < 2400; ++i)
+  {
+    world->Step(1);
+    body->AddForce(math::Vector3(-1, 0, 0));
+
+    if (i > 2385)
+    {
+      double v = body->GetWorldLinearVel().x;
+      double q = 0.5 * rho * v * v;
+      double cl = cla * a0 * q * area;
+      double cd = cda * a0 * q * area;
+
+      physics::JointWrench body_wrench = body_joint->GetForceTorque(0);
+      physics::JointWrench wing_1_wrench = wing_1_joint->GetForceTorque(0);
+      physics::JointWrench wing_2_wrench = wing_2_joint->GetForceTorque(0);
+      math::Pose wing_1_pose = wing_1->GetWorldPose();
+      math::Vector3 wing_1_force =
+        wing_1_pose.rot.RotateVector(wing_1_wrench.body2Force);
+      math::Vector3 wing_1_torque =
+        wing_1_pose.rot.RotateVector(wing_1_wrench.body2Torque);
+
+      math::Pose wing_2_pose = wing_2->GetWorldPose();
+      math::Vector3 wing_2_force =
+        wing_2_pose.rot.RotateVector(wing_2_wrench.body2Force);
+      math::Vector3 wing_2_torque =
+        wing_2_pose.rot.RotateVector(wing_2_wrench.body2Torque);
+      gzdbg << "body velocity [" << body->GetWorldLinearVel()
+            << "] cl [" << cl
+            << "] cd [" << cd
+            << "] body force [" << body_wrench.body2Force
+            << "] body torque [" << body_wrench.body2Torque
+            << "] wing_1 force [" << wing_1_force
+            << "] wing_1 torque [" << wing_1_torque
+            << "] wing_2 force [" << wing_2_force
+            << "] wing_2 torque [" << wing_2_torque
+            << "]\n";
+
+      EXPECT_NEAR(wing_1_force.z, cl * cos(dihedral), TOL);
+    }
+  }
+}
+
+TEST_P(JointLiftDragPluginTest, LiftDragPlugin1)
+{
+  LiftDragPlugin1(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, JointLiftDragPluginTest,
+                        PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/bandwidth.cc b/test/integration/bandwidth.cc
new file mode 100644
index 0000000..920f01a
--- /dev/null
+++ b/test/integration/bandwidth.cc
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <unistd.h>
+
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+
+class BandwidthTest : public ServerFixture,
+                      public testing::WithParamInterface<const char*>
+{
+  public: void Bandwidth(const std::string &_physicsEngine);
+};
+
+boost::mutex g_mutex;
+std::vector<int> g_bwBytes;
+std::vector<common::Time> g_bwTime;
+
+
+void BandwidthMsg(const std::string &_msg)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_bwBytes.push_back(_msg.size());
+  g_bwTime.push_back(common::Time::GetWallTime());
+}
+
+void BandwidthTest::Bandwidth(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support closed loops in PR2, "
+          << "Please see issue #913. "
+          << "(https://bitbucket.org/osrf/gazebo/issue/913)\n";
+    return;
+  }
+
+  Load("worlds/pr2.world", false, _physicsEngine);
+
+  transport::NodePtr node(new transport::Node());
+  node->Init("default");
+
+  std::string topic = "/gazebo/default/pose/info";
+
+  transport::SubscriberPtr sub = node->Subscribe(topic, BandwidthMsg);
+
+  while (true)
+  {
+    common::Time::MSleep(100);
+    {
+      boost::mutex::scoped_lock lock(g_mutex);
+      if (g_bwBytes.size() >= 100)
+      {
+        std::sort(g_bwBytes.begin(), g_bwBytes.end());
+
+        float sumSize = 0;
+        unsigned int count = g_bwBytes.size();
+        common::Time dt = g_bwTime[count - 1] - g_bwTime[0];
+
+        for (unsigned int i = 0; i < count; ++i)
+          sumSize += g_bwBytes[i];
+
+        float meanSize = sumSize / count;
+        float totalBw = sumSize / dt.Double();
+
+        printf("Bandwidth:\n");
+        printf("  Total[%6.2f B/s] Mean[%6.2f B] Messages[%u] Time[%4.2fs]\n",
+               totalBw, meanSize, count, dt.Double());
+
+        EXPECT_GT(totalBw, 1000.0);
+        g_bwBytes.clear();
+        g_bwTime.clear();
+
+        break;
+      }
+    }
+  }
+}
+
+TEST_P(BandwidthTest, Bandwidth)
+{
+  Bandwidth(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, BandwidthTest, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/camera.cc b/test/integration/camera.cc
new file mode 100644
index 0000000..8dddc9f
--- /dev/null
+++ b/test/integration/camera.cc
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class CameraTest : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+// \brief Test that camera follow (gz camera -f <model> -c <camera>) moves
+// the camera
+TEST_F(CameraTest, Follow)
+{
+  Load("worlds/empty.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  // Spawn a box to follow.
+  SpawnBox("box", math::Vector3(1, 1, 1), math::Vector3(10, 10, 1),
+      math::Vector3(0, 0, 0));
+
+  math::Pose cameraStartPose(0, 0, 0, 0, 0, 0);
+
+  // Spawn a camera that will do the following
+  SpawnCamera("test_camera_model", "test_camera",
+      cameraStartPose.pos, cameraStartPose.rot.GetAsEuler());
+
+  rendering::ScenePtr scene = rendering::get_scene();
+  ASSERT_TRUE(scene);
+
+  rendering::CameraPtr camera = scene->GetCamera("test_camera");
+  ASSERT_TRUE(camera);
+
+  // Make sure the sensor is at the correct initial pose
+  EXPECT_EQ(camera->GetWorldPose(), cameraStartPose);
+
+  SetPause(true);
+
+  // Tell the camera to follow the box. The camera should move toward the
+  // box.
+  msgs::CameraCmd msg;
+  msg.set_follow_model("box");
+
+  transport::NodePtr node(new transport::Node());
+  node->Init("default");
+
+  transport::PublisherPtr pub =
+    node->Advertise<msgs::CameraCmd>("~/test_camera/cmd");
+
+  pub->WaitForConnection();
+  pub->Publish(msg, true);
+
+  world->Step(1000);
+
+  // Make sure the sensor is at the correct initial pose
+  EXPECT_TRUE(camera->GetWorldPose() != cameraStartPose);
+
+  EXPECT_NEAR(camera->GetWorldPose().pos.x, 4.3, 0.1);
+  EXPECT_NEAR(camera->GetWorldPose().pos.y, 4.3, 0.1);
+}
+
+/////////////////////////////////////////////////
+// \brief Test the camera IsVisible function
+TEST_F(CameraTest, Visible)
+{
+  Load("worlds/empty.world", true);
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  // Spawn a box.
+  SpawnBox("box", math::Vector3(1, 1, 1), math::Vector3(1, 0, 0.5),
+      math::Vector3(0, 0, 0));
+
+  math::Pose cameraStartPose(0, 0, 0, 0, 0, 0);
+
+  std::string cameraName = "test_camera";
+  // Spawn a camera facing the box
+  SpawnCamera("test_camera_model", cameraName,
+      cameraStartPose.pos, cameraStartPose.rot.GetAsEuler());
+
+  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
+  ASSERT_TRUE(sensor);
+  // this makes sure a world step will trigger the camera render update
+  sensor->SetUpdateRate(1000);
+
+  rendering::ScenePtr scene = rendering::get_scene();
+  ASSERT_TRUE(scene);
+  rendering::CameraPtr camera = scene->GetCamera(cameraName);
+  ASSERT_TRUE(camera);
+
+  // Make sure the camera is at the correct initial pose
+  EXPECT_EQ(camera->GetWorldPose(), cameraStartPose);
+
+  int sleep = 0;
+  int maxSleep = 5;
+  rendering::VisualPtr visual;
+  while (!visual && sleep < maxSleep)
+  {
+    visual = scene->GetVisual("box::body");
+    common::Time::MSleep(100);
+    sleep++;
+  }
+  ASSERT_TRUE(visual);
+
+  // box should be visible to the camera.
+  EXPECT_TRUE(camera->IsVisible(visual));
+
+  physics::ModelPtr box = world->GetModel("box");
+  ASSERT_TRUE(box);
+
+  // move the box behind the camera and it should not be visible to the camera
+  math::Pose pose = math::Pose(-1, 0, 0.5, 0, 0, 0);
+  box->SetWorldPose(pose);
+  world->Step(1);
+  sleep = 0;
+  maxSleep = 10;
+  while (visual->GetWorldPose() != pose && sleep < maxSleep)
+  {
+    common::Time::MSleep(100);
+    sleep++;
+  }
+  EXPECT_TRUE(visual->GetWorldPose() == pose);
+  world->Step(1);
+  EXPECT_TRUE(!camera->IsVisible(visual));
+  EXPECT_TRUE(!camera->IsVisible(visual->GetName()));
+
+  // move the box to the left of the camera and it should not be visible
+  pose = math::Pose(0, -1, 0.5, 0, 0, 0);
+  box->SetWorldPose(pose);
+  world->Step(1);
+  sleep = 0;
+  maxSleep = 10;
+  while (visual->GetWorldPose() != pose && sleep < maxSleep)
+  {
+    common::Time::MSleep(100);
+    sleep++;
+  }
+  EXPECT_TRUE(visual->GetWorldPose() == pose);
+  world->Step(1);
+  EXPECT_TRUE(!camera->IsVisible(visual));
+  EXPECT_TRUE(!camera->IsVisible(visual->GetName()));
+
+  // move the box to the right of the camera with some rotations,
+  // it should still not be visible.
+  pose = math::Pose(0, 1, 0.5, 0, 0, 1.57);
+  box->SetWorldPose(pose);
+  world->Step(1);
+  sleep = 0;
+  maxSleep = 10;
+  while (visual->GetWorldPose() != pose && sleep < maxSleep)
+  {
+    common::Time::MSleep(100);
+    sleep++;
+  }
+  EXPECT_TRUE(visual->GetWorldPose() == pose);
+  world->Step(1);
+  EXPECT_TRUE(!camera->IsVisible(visual));
+  EXPECT_TRUE(!camera->IsVisible(visual->GetName()));
+
+  // rotate the camera counter-clockwise to see the box
+  camera->RotateYaw(math::Angle(1.57));
+  EXPECT_TRUE(camera->IsVisible(visual));
+  EXPECT_TRUE(camera->IsVisible(visual->GetName()));
+
+  // move the box up and let it drop. The camera should not see the box
+  // initially but the box should eventually move into the camera view
+  // as it falls
+  pose = math::Pose(0, 1, 5.5, 0, 0, 1.57);
+  box->SetWorldPose(pose);
+  world->Step(1);
+  sleep = 0;
+  maxSleep = 10;
+  while (visual->GetWorldPose() != pose && sleep < maxSleep)
+  {
+    common::Time::MSleep(100);
+    sleep++;
+  }
+  EXPECT_TRUE(visual->GetWorldPose() == pose);
+  world->Step(1);
+  EXPECT_TRUE(!camera->IsVisible(visual));
+  EXPECT_TRUE(!camera->IsVisible(visual->GetName()));
+
+  sleep = 0;
+  maxSleep = 100;
+  while (!camera->IsVisible(visual) && sleep < maxSleep)
+  {
+    world->Step(10);
+    sleep++;
+  }
+  EXPECT_TRUE(camera->IsVisible(visual));
+  EXPECT_TRUE(camera->IsVisible(visual->GetName()));
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/camera_sensor.cc b/test/integration/camera_sensor.cc
new file mode 100644
index 0000000..c8eb586
--- /dev/null
+++ b/test/integration/camera_sensor.cc
@@ -0,0 +1,446 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "gazebo/common/common.hh"
+#include "gazebo/common/Timer.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/sensors/CameraSensor.hh"
+
+#include "ServerFixture.hh"
+#include "scans_cmp.h"
+
+using namespace gazebo;
+class CameraSensor : public ServerFixture
+{
+};
+
+boost::mutex mutex;
+
+unsigned char* img = NULL;
+unsigned char* img2 = NULL;
+int imageCount = 0;
+int imageCount2 = 0;
+
+/////////////////////////////////////////////////
+void OnNewCameraFrame(int* _imageCounter, unsigned char* _imageDest,
+                  const unsigned char *_image,
+                  unsigned int _width, unsigned int _height,
+                  unsigned int _depth,
+                  const std::string &/*_format*/)
+{
+  boost::mutex::scoped_lock lock(mutex);
+  memcpy(_imageDest, _image, _width * _height * _depth);
+  *_imageCounter += 1;
+}
+
+/////////////////////////////////////////////////
+TEST_F(CameraSensor, CheckThrottle)
+{
+  Load("worlds/empty_test.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run camera test\n";
+    return;
+  }
+
+  // spawn sensors of various sizes to test speed
+  std::string modelName = "camera_model";
+  std::string cameraName = "camera_sensor";
+  unsigned int width  = 320;
+  unsigned int height = 240;  // 106 fps
+  double updateRate = 10;
+  math::Pose setPose, testPose(
+      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
+  SpawnCamera(modelName, cameraName, setPose.pos,
+      setPose.rot.GetAsEuler(), width, height, updateRate);
+  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
+  sensors::CameraSensorPtr camSensor =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+  imageCount = 0;
+  img = new unsigned char[width * height*3];
+  event::ConnectionPtr c =
+    camSensor->GetCamera()->ConnectNewImageFrame(
+        boost::bind(&::OnNewCameraFrame, &imageCount, img,
+          _1, _2, _3, _4, _5));
+  common::Timer timer;
+  timer.Start();
+
+  // time how long it takes to get 50 images @ 10Hz
+  int total_images = 50;
+
+  while (imageCount < total_images)
+    common::Time::MSleep(10);
+  common::Time dt = timer.GetElapsed();
+  double rate = static_cast<double>(total_images)/dt.Double();
+  gzdbg << "timer [" << dt.Double() << "] seconds rate [" << rate << "] fps\n";
+  EXPECT_GT(rate, 7.0);
+  EXPECT_LT(rate, 11.0);
+  camSensor->GetCamera()->DisconnectNewImageFrame(c);
+  delete img;
+}
+
+/////////////////////////////////////////////////
+TEST_F(CameraSensor, UnlimitedTest)
+{
+  Load("worlds/empty_test.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run camera test\n";
+    return;
+  }
+
+  // spawn sensors of various sizes to test speed
+  std::string modelName = "camera_model";
+  std::string cameraName = "camera_sensor";
+
+  // test resolution, my machine gets about 106 fps
+  unsigned int width  = 320;
+  unsigned int height = 240;
+  double updateRate = 0;
+  math::Pose setPose(
+      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
+  SpawnCamera(modelName, cameraName, setPose.pos,
+      setPose.rot.GetAsEuler(), width, height, updateRate);
+  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
+  sensors::CameraSensorPtr camSensor =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+  imageCount = 0;
+  img = new unsigned char[width * height*3];
+  event::ConnectionPtr c =
+    camSensor->GetCamera()->ConnectNewImageFrame(
+        boost::bind(&::OnNewCameraFrame, &imageCount, img,
+          _1, _2, _3, _4, _5));
+  common::Timer timer;
+  timer.Start();
+  // time how long it takes to get N images
+  int total_images = 500;
+  while (imageCount < total_images)
+    common::Time::MSleep(10);
+  common::Time dt = timer.GetElapsed();
+  double rate = static_cast<double>(total_images)/dt.Double();
+  gzdbg << "timer [" << dt.Double() << "] seconds rate [" << rate << "] fps\n";
+  camSensor->GetCamera()->DisconnectNewImageFrame(c);
+  EXPECT_GT(rate, 30.0);
+
+  delete img;
+}
+
+/////////////////////////////////////////////////
+TEST_F(CameraSensor, MultiSenseHigh)
+{
+  // This test is disabled because it does not work on machines with
+  // limited rendering capabilities.
+  return;
+/*
+  Load("worlds/empty_test.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run camera test\n";
+    return;
+  }
+
+  // spawn sensors of various sizes to test speed
+  std::string modelName = "camera_model";
+  std::string cameraName = "camera_sensor";
+
+  // nominal resolution of multisense
+  unsigned int width  = 2048;
+  unsigned int height = 1088;
+  double updateRate = 25;
+  math::Pose setPose, testPose(
+      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
+  SpawnCamera(modelName, cameraName, setPose.pos,
+      setPose.rot.GetAsEuler(), width, height, updateRate);
+  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
+  sensors::CameraSensorPtr camSensor =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+  imageCount = 0;
+  img = new unsigned char[width * height*3];
+  event::ConnectionPtr c =
+    camSensor->GetCamera()->ConnectNewImageFrame(
+        boost::bind(&::OnNewCameraFrame, &imageCount, img,
+          _1, _2, _3, _4, _5));
+  common::Timer timer;
+  timer.Start();
+  // time how long it takes to get N images
+  int total_images = 500;
+  while (imageCount < total_images)
+    common::Time::MSleep(10);
+  common::Time dt = timer.GetElapsed();
+  double rate = static_cast<double>(total_images)/dt.Double();
+  gzdbg << "timer [" << dt.Double() << "] seconds rate [" << rate << "] fps\n";
+  camSensor->GetCamera()->DisconnectNewImageFrame(c);
+  EXPECT_GT(rate, 24.0);
+  EXPECT_LT(rate, 25.0);
+
+  delete img;
+  */
+}
+
+/////////////////////////////////////////////////
+TEST_F(CameraSensor, MultiSenseLow)
+{
+  // This test is disabled because it does not work on machines with
+  // limited rendering capabilities.
+  return;
+/*
+  Load("worlds/empty_test.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run camera test\n";
+    return;
+  }
+
+  // spawn sensors of various sizes to test speed
+  std::string modelName = "camera_model";
+  std::string cameraName = "camera_sensor";
+
+  // lower resolution of multisense
+  unsigned int width  = 1024;
+  unsigned int height = 544;
+  double updateRate = 25;
+  math::Pose setPose, testPose(
+      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
+  SpawnCamera(modelName, cameraName, setPose.pos,
+      setPose.rot.GetAsEuler(), width, height, updateRate);
+  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
+  sensors::CameraSensorPtr camSensor =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+  imageCount = 0;
+  img = new unsigned char[width * height*3];
+  event::ConnectionPtr c =
+    camSensor->GetCamera()->ConnectNewImageFrame(
+        boost::bind(&::OnNewCameraFrame, &imageCount, img,
+          _1, _2, _3, _4, _5));
+  common::Timer timer;
+  timer.Start();
+  // time how long it takes to get N images
+  int total_images = 500;
+  while (imageCount < total_images)
+    common::Time::MSleep(10);
+  common::Time dt = timer.GetElapsed();
+  double rate = static_cast<double>(total_images)/dt.Double();
+  gzdbg << "timer [" << dt.Double() << "] seconds rate [" << rate << "] fps\n";
+  camSensor->GetCamera()->DisconnectNewImageFrame(c);
+  EXPECT_GT(rate, 24.0);
+  EXPECT_LT(rate, 25.0);
+
+  delete img;
+  Unload();
+  */
+}
+
+/////////////////////////////////////////////////
+TEST_F(CameraSensor, CheckNoise)
+{
+  Load("worlds/empty_test.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run camera test\n";
+    return;
+  }
+
+  // Spawn two cameras in the same location, one with noise and one without.
+  std::string modelName = "camera_model";
+  std::string cameraName = "camera_sensor";
+  std::string modelNameNoisy = "camera_model_noisy";
+  std::string cameraNameNoisy = "camera_sensor_noisy";
+  unsigned int width  = 320;
+  unsigned int height = 240;
+  double updateRate = 10;
+  double noiseMean = 0.1;
+  double noiseStdDev = 0.01;
+  math::Pose setPose(
+      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
+  SpawnCamera(modelName, cameraName, setPose.pos,
+      setPose.rot.GetAsEuler(), width, height, updateRate);
+  SpawnCamera(modelNameNoisy, cameraNameNoisy, setPose.pos,
+      setPose.rot.GetAsEuler(), width, height, updateRate,
+      "gaussian", noiseMean, noiseStdDev);
+  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
+  sensors::CameraSensorPtr camSensor =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+  sensor = sensors::get_sensor(cameraNameNoisy);
+  sensors::CameraSensorPtr camSensorNoisy =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+
+  imageCount = 0;
+  imageCount2 = 0;
+  img = new unsigned char[width * height*3];
+  img2 = new unsigned char[width * height*3];
+  event::ConnectionPtr c =
+    camSensor->GetCamera()->ConnectNewImageFrame(
+        boost::bind(&::OnNewCameraFrame, &imageCount, img,
+          _1, _2, _3, _4, _5));
+  event::ConnectionPtr c2 =
+    camSensorNoisy->GetCamera()->ConnectNewImageFrame(
+        boost::bind(&::OnNewCameraFrame, &imageCount2, img2,
+          _1, _2, _3, _4, _5));
+
+  // Get some images
+  while (imageCount < 10 || imageCount2 < 10)
+    common::Time::MSleep(10);
+
+  unsigned int diffMax = 0, diffSum = 0;
+  double diffAvg = 0.0;
+  this->ImageCompare(img, img2, width, height, 3,
+                     diffMax, diffSum, diffAvg);
+  // We expect that there will be some non-zero difference between the two
+  // images.
+  EXPECT_NE(diffSum, 0u);
+  // We expect that the average difference will be well within 3-sigma.
+  EXPECT_NEAR(diffAvg/255., noiseMean, 3*noiseStdDev);
+  delete[] img;
+  delete[] img2;
+}
+
+int main(int argc, char **argv)
+{
+  // Set a specific seed to avoid occasional test failures due to
+  // statistically unlikely, but possible results.
+  math::Rand::SetSeed(42);
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
+
+
+// Place two cameras at some distance apart and a box in between
+// them. Verify they generate different images.
+TEST_F(CameraSensor, CompareSideBySideCamera)
+{
+  Load("worlds/empty.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run camera test\n";
+    return;
+  }
+
+  // Spawn two cameras at 2m apart.
+  std::string modelName = "camera_model";
+  std::string cameraName = "camera_sensor";
+  std::string modelName2 = "camera_model2";
+  std::string cameraName2 = "camera_sensor2";
+  unsigned int width  = 320;
+  unsigned int height = 240;
+  double updateRate = 10;
+
+  math::Pose testPose(
+      math::Vector3(0, 0, 0.5), math::Quaternion(0, 0, 0));
+  math::Pose testPose2(
+      math::Vector3(0, 2, 0.5), math::Quaternion(0, 0, 0));
+  SpawnCamera(modelName, cameraName, testPose.pos,
+      testPose.rot.GetAsEuler(), width, height, updateRate);
+  SpawnCamera(modelName2, cameraName2, testPose2.pos,
+      testPose.rot.GetAsEuler(), width, height, updateRate);
+
+  // Spawn a box in front of the cameras
+  SpawnBox("test_box", math::Vector3(1, 1, 1),
+      math::Vector3(4, 1, 0.5), math::Vector3(0, 0, 0));
+
+  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
+  sensors::CameraSensorPtr camSensor =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+  sensor = sensors::get_sensor(cameraName2);
+  sensors::CameraSensorPtr camSensor2 =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+
+  imageCount = 0;
+  imageCount2 = 0;
+  img = new unsigned char[width * height*3];
+  unsigned char *prevImg = new unsigned char[width * height*3];
+  img2 = new unsigned char[width * height*3];
+  unsigned char *prevImg2 = new unsigned char[width * height*3];
+  event::ConnectionPtr c =
+    camSensor->GetCamera()->ConnectNewImageFrame(
+        boost::bind(&::OnNewCameraFrame, &imageCount, img,
+          _1, _2, _3, _4, _5));
+  event::ConnectionPtr c2 =
+    camSensor2->GetCamera()->ConnectNewImageFrame(
+        boost::bind(&::OnNewCameraFrame, &imageCount2, img2,
+          _1, _2, _3, _4, _5));
+
+  while (imageCount < 10 || imageCount2 < 10)
+    common::Time::MSleep(10);
+
+  memcpy(prevImg, img, width * height * 3);
+  memcpy(prevImg2, img2, width * height * 3);
+
+  for (int i = 0; i < 10; ++i)
+  {
+    imageCount = 0;
+    imageCount2 = 0;
+
+    // Get some images
+    while (imageCount < 1 || imageCount2 < 1)
+      common::Time::MSleep(10);
+
+    unsigned int diffMax = 0, diffSum = 0;
+    double diffAvg = 0.0;
+    unsigned int diffMax2 = 0, diffSum2 = 0;
+    double diffAvg2 = 0.0;
+    unsigned int diffMax12 = 0, diffSum12 = 0;
+    double diffAvg12 = 0.0;
+
+    {
+      boost::mutex::scoped_lock lock(mutex);
+      this->ImageCompare(img, prevImg, width, height, 3,
+                         diffMax, diffSum, diffAvg);
+      this->ImageCompare(prevImg2, prevImg2, width, height, 3,
+                         diffMax2, diffSum2, diffAvg2);
+      this->ImageCompare(img, img2, width, height, 3,
+                         diffMax12, diffSum12, diffAvg12);
+      memcpy(prevImg, img, width * height * 3);
+      memcpy(prevImg2, img2, width * height * 3);
+    }
+
+    // Images from the same camera should be identical
+    EXPECT_EQ(diffSum, 0u);
+    EXPECT_EQ(diffSum2, 0u);
+
+    // We expect that there will some noticeable difference
+    // between the two different camera images.
+    EXPECT_NE(diffSum12, 1000000u);
+    EXPECT_GT(diffAvg12, 0.0);
+    EXPECT_GT(diffMax12, 0.0);
+
+    common::Time::MSleep(100);
+  }
+  delete[] img;
+  delete[] img2;
+  delete[] prevImg;
+  delete[] prevImg2;
+}
diff --git a/test/integration/concave_mesh.cc b/test/integration/concave_mesh.cc
new file mode 100644
index 0000000..61dd2a6
--- /dev/null
+++ b/test/integration/concave_mesh.cc
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+
+class ConcaveMeshTest : public ServerFixture,
+                        public testing::WithParamInterface<const char*>
+{
+  public: void RayTest(const std::string &_physicsEngine);
+  public: void SubmeshNoCollisionTest(const std::string &_physicsEngine);
+  public: void SubmeshCollisionTest(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void ConcaveMeshTest::SubmeshNoCollisionTest(const std::string &_physicsEngine)
+{
+  Load("worlds/concave_submesh_no_collision_test.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  EXPECT_TRUE(world != NULL);
+
+  world->Step(100);
+
+  sensors::RaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::RaySensor>(
+    sensors::get_sensor("default::hokuyo::link::laser"));
+  EXPECT_TRUE(raySensor != NULL);
+
+  // No ray should interect a collision.
+  for (int i = 0; i < raySensor->GetRangeCount(); ++i)
+    EXPECT_NEAR(raySensor->GetRange(i), raySensor->GetRangeMax(), 1e-2);
+}
+
+/////////////////////////////////////////////////
+void ConcaveMeshTest::SubmeshCollisionTest(const std::string &_physicsEngine)
+{
+  Load("worlds/concave_submesh_collision_test.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  EXPECT_TRUE(world != NULL);
+
+  world->Step(100);
+
+  sensors::RaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::RaySensor>(
+    sensors::get_sensor("default::hokuyo::link::laser"));
+  EXPECT_TRUE(raySensor != NULL);
+
+  EXPECT_NEAR(raySensor->GetRange(0), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(1), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(2), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(3), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(4), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(5), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(6), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(7), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(8), 1.92439, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(9), 1.86443, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(10), 1.86443, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(11), 1.92439, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(12), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(13), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(14), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(15), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(16), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(17), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(18), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(19), 10, 1e-2);
+}
+
+/////////////////////////////////////////////////
+void ConcaveMeshTest::RayTest(const std::string &_physicsEngine)
+{
+  Load("worlds/concave_mesh_test.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  EXPECT_TRUE(world != NULL);
+
+  world->Step(100);
+
+  sensors::RaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::RaySensor>(
+    sensors::get_sensor("default::hokuyo::link::laser"));
+  EXPECT_TRUE(raySensor != NULL);
+
+  EXPECT_NEAR(raySensor->GetRange(0), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(1), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(2), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(3), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(4), 0.972282, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(5), 0.967148, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(6), 0.962889, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(7), 0.9597, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(8), 0.957242, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(9), 0.955562, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(10), 0.948761, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(11), 0.847463, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(12), 0.847665, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(13), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(14), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(15), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(16), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(17), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(18), 10, 1e-2);
+  EXPECT_NEAR(raySensor->GetRange(19), 10, 1e-2);
+}
+
+/////////////////////////////////////////////////
+TEST_P(ConcaveMeshTest, SubmeshCollisionTest)
+{
+  if (std::string(GetParam()) == "simbody" ||
+      std::string(GetParam()) == "dart")
+  {
+    gzdbg << "ConcaveMeshes not supported in " << GetParam() << "\n";
+  }
+  else
+  {
+    SubmeshCollisionTest(GetParam());
+  }
+}
+
+/////////////////////////////////////////////////
+TEST_P(ConcaveMeshTest, SubmeshNoCollisionTest)
+{
+  if (std::string(GetParam()) == "simbody" ||
+      std::string(GetParam()) == "dart")
+  {
+    gzdbg << "ConcaveMeshes not supported in " << GetParam() << "\n";
+  }
+  else
+  {
+    SubmeshNoCollisionTest(GetParam());
+  }
+}
+
+/////////////////////////////////////////////////
+TEST_P(ConcaveMeshTest, RayTest)
+{
+  if (std::string(GetParam()) == "simbody" ||
+      std::string(GetParam()) == "dart")
+  {
+    gzdbg << "ConcaveMeshes not supported in " << GetParam() << "\n";
+  }
+  else
+  {
+    RayTest(GetParam());
+  }
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, ConcaveMeshTest, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/contact_sensor.cc b/test/integration/contact_sensor.cc
new file mode 100644
index 0000000..63149b8
--- /dev/null
+++ b/test/integration/contact_sensor.cc
@@ -0,0 +1,435 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "gazebo/common/common.hh"
+#include "scans_cmp.h"
+#include "helper_physics_generator.hh"
+
+#define TOL 1e-4
+
+using namespace gazebo;
+class ContactSensor : public ServerFixture,
+                      public testing::WithParamInterface<const char*>
+{
+  public: void EmptyWorld(const std::string &_physicsEngine);
+  public: void StackTest(const std::string &_physicsEngine);
+  public: void TorqueTest(const std::string &_physicsEngine);
+};
+
+void ContactSensor::EmptyWorld(const std::string &_physicsEngine)
+{
+  Load("worlds/empty.world", false, _physicsEngine);
+}
+
+TEST_P(ContactSensor, EmptyWorld)
+{
+  EmptyWorld(GetParam());
+}
+
+////////////////////////////////////////////////////////////////////////
+// Test contact sensor using two configurations. Both place a sphere over
+// a box collision contact sensor. It is expected that there is one point of
+// contact in the negative z direction (world frame). The second contact sensor
+// model differ from the first in that it is rotated by 90 degrees about the
+// y axis. The test verifies that the feedback is given in the correct
+// reference frame
+////////////////////////////////////////////////////////////////////////
+void ContactSensor::StackTest(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test for Simbody, see issue #865.\n";
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  std::string modelName01 = "contactModel01";
+  std::string contactSensorName01 = "contactSensor01";
+  math::Pose modelPose01(0, 0, 0.5, 0, 0, 0);
+
+  std::string modelName02 = "contactModel02";
+  std::string contactSensorName02 = "contactSensor02";
+  math::Pose modelPose02(0, 2, 0.5, 0, M_PI/2.0, 0);
+
+  std::string sphereName01 = "sphere01";
+  math::Pose spherePose01(0, 0, 1.5, 0, 0, 0);
+
+  std::string sphereName02 = "sphere02";
+  math::Pose spherePose02(0, 2, 1.5, 0, 0, 0);
+
+  // spawn two contact sensors
+  SpawnUnitContactSensor(modelName01, contactSensorName01,
+      "box", modelPose01.pos, modelPose01.rot.GetAsEuler());
+  SpawnUnitContactSensor(modelName02, contactSensorName02,
+      "box", modelPose02.pos, modelPose02.rot.GetAsEuler());
+
+  // spawn two spheres, each sphere rests on top of one contact sensor
+  SpawnSphere(sphereName01, spherePose01.pos, spherePose01.rot.GetAsEuler());
+  SpawnSphere(sphereName02, spherePose02.pos, spherePose02.rot.GetAsEuler());
+
+  sensors::SensorPtr sensor01 = sensors::get_sensor(contactSensorName01);
+  sensors::ContactSensorPtr contactSensor01 =
+      boost::dynamic_pointer_cast<sensors::ContactSensor>(sensor01);
+
+  ASSERT_TRUE(contactSensor01);
+
+  sensors::SensorPtr sensor02 = sensors::get_sensor(contactSensorName02);
+  sensors::ContactSensorPtr contactSensor02 =
+      boost::dynamic_pointer_cast<sensors::ContactSensor>(sensor02);
+
+  ASSERT_TRUE(contactSensor02);
+
+  sensors::SensorManager::Instance()->Init();
+  sensors::SensorManager::Instance()->RunThreads();
+
+  EXPECT_FALSE(contactSensor01->IsActive());
+  EXPECT_FALSE(contactSensor02->IsActive());
+
+  unsigned int expectedColCount = 1;
+  EXPECT_EQ(contactSensor01->GetCollisionCount(), expectedColCount);
+  EXPECT_EQ(contactSensor02->GetCollisionCount(), expectedColCount);
+
+  // make sure the sensors are active and publishing
+  contactSensor01->SetActive(true);
+  contactSensor02->SetActive(true);
+
+  EXPECT_TRUE(contactSensor01->IsActive());
+  EXPECT_TRUE(contactSensor02->IsActive());
+
+  physics::ModelPtr contactModel01 = world->GetModel(modelName01);
+  physics::ModelPtr contactModel02 = world->GetModel(modelName02);
+  ASSERT_TRUE(contactModel01);
+  ASSERT_TRUE(contactModel02);
+
+  std::vector<physics::ModelPtr> models;
+  models.push_back(contactModel01);
+  models.push_back(contactModel02);
+
+  double gravityZ = -9.8;
+  physics->SetGravity(math::Vector3(0, 0, gravityZ));
+
+  msgs::Contacts contacts01;
+  msgs::Contacts contacts02;
+
+  // let objects stablize
+  world->Step(1000);
+
+  int steps = 1000;
+  while ((contacts01.contact_size() == 0 || contacts02.contact_size() == 0)
+      && --steps > 0)
+  {
+    world->Step(1);
+    contacts01 = contactSensor01->GetContacts();
+    contacts02 = contactSensor02->GetContacts();
+  }
+  EXPECT_GT(steps, 0);
+
+  std::vector<msgs::Contacts> contacts;
+  contacts.push_back(contacts01);
+  contacts.push_back(contacts02);
+
+  math::Vector3 expectedForce;
+  math::Vector3 expectedTorque;
+
+  // double tolPercentage = 0.1;
+  // double tol = 1e-2;
+  // double tolX, tolY, tolZ;
+
+  // Run the test once for each contact sensor
+  for (unsigned int k = 0; k < contacts.size(); ++k)
+  {
+    double mass = models[k]->GetLink()->GetInertial()->GetMass();
+    expectedForce = models[k]->GetLink()->GetWorldCoGPose().rot.GetInverse()
+        * math::Vector3(0, 0, (gravityZ * mass));
+    expectedTorque = math::Vector3(0, 0, 0);
+
+    unsigned int ColInd = 0;
+    physics::CollisionPtr col = models[k]->GetLink()->GetCollision(ColInd);
+    ASSERT_TRUE(col);
+
+    // calculate tolerance based on magnitude of force
+    // Uncomment lines below once we are able to accurately determine the
+    // expected force output, see issue #565
+    // tolX = std::max(tolPercentage*expectedForce.x, tol);
+    // tolY = std::max(tolPercentage*expectedForce.y, tol);
+    // tolZ = std::max(tolPercentage*expectedForce.z, tol);
+
+    // loop through contact collision pairs
+    for (int i = 0; i < contacts[k].contact_size(); ++i)
+    {
+      bool body1 = true;
+      if (contacts[k].contact(i).collision1() == col->GetScopedName())
+        body1 = true;
+      else if (contacts[k].contact(i).collision2() == col->GetScopedName())
+        body1 = false;
+      else
+      {
+        FAIL();
+      }
+
+      math::Vector3 actualForce;
+      math::Vector3 actualTorque;
+
+      // loop through all contact points between the two collisions
+      for (int j = 0; j < contacts[k].contact(i).position_size(); ++j)
+      {
+        // Contact between the sphere and the contact sensor occurs at z=1.0
+        // Skip other contact points with the ground plane
+        if (!math::equal(contacts[k].contact(i).position(j).z(), 1.0))
+          continue;
+
+        EXPECT_NEAR(contacts[k].contact(i).position(j).x(),
+            models[k]->GetLink()->GetWorldCoGPose().pos.x, TOL);
+        EXPECT_NEAR(contacts[k].contact(i).position(j).y(),
+            models[k]->GetLink()->GetWorldCoGPose().pos.y, TOL);
+
+        EXPECT_NEAR(contacts[k].contact(i).normal(j).x(), 0, TOL);
+        EXPECT_NEAR(contacts[k].contact(i).normal(j).y(), 0, TOL);
+        EXPECT_NEAR(contacts[k].contact(i).normal(j).z(), 1, TOL);
+
+        if (body1)
+        {
+          actualForce.x =
+            contacts[k].contact(i).wrench(j).body_1_wrench().force().x();
+          actualForce.y =
+            contacts[k].contact(i).wrench(j).body_1_wrench().force().y();
+          actualForce.z =
+            contacts[k].contact(i).wrench(j).body_1_wrench().force().z();
+
+          actualTorque.x =
+            contacts[k].contact(i).wrench(j).body_1_wrench().torque().x();
+          actualTorque.y =
+            contacts[k].contact(i).wrench(j).body_1_wrench().torque().y();
+          actualTorque.z =
+            contacts[k].contact(i).wrench(j).body_1_wrench().torque().z();
+        }
+        else
+        {
+          actualForce.x =
+            contacts[k].contact(i).wrench(j).body_2_wrench().force().x();
+          actualForce.y =
+            contacts[k].contact(i).wrench(j).body_2_wrench().force().y();
+          actualForce.z =
+            contacts[k].contact(i).wrench(j).body_2_wrench().force().z();
+
+          actualTorque.x =
+            contacts[k].contact(i).wrench(j).body_2_wrench().torque().x();
+          actualTorque.y =
+            contacts[k].contact(i).wrench(j).body_2_wrench().torque().y();
+          actualTorque.z =
+            contacts[k].contact(i).wrench(j).body_2_wrench().torque().z();
+        }
+
+        // Find the dominant force vector component and verify the value has
+        // the correct sign.
+        // Force and torque are given in the link frame, see issue #545
+        int vi = (fabs(expectedForce.x) > fabs(expectedForce.y))
+            ? 0 : 1;
+        vi = (fabs(expectedForce[vi]) > fabs(expectedForce.z))
+            ? vi : 2;
+        EXPECT_EQ((expectedForce[vi] < 0), (actualForce[vi] < 0));
+
+        // Verify torque with a large tolerance
+        double odeTorqueTol = 2;
+        EXPECT_LT(fabs(actualTorque.x), odeTorqueTol);
+        EXPECT_LT(fabs(actualTorque.y), odeTorqueTol);
+        EXPECT_LT(fabs(actualTorque.z), odeTorqueTol);
+
+        // TODO: ODE and bullet produce slightly different results
+        // In ODE the force and torque on an object seem to be affected by other
+        // components like friction, e.g. It is found that the stationary sphere
+        // exerts non-zero x and y forces on the contact sensor when only
+        // negative z forces are expected.
+        // The tests below pass in bullet but fail in ode, see issue #565
+        // EXPECT_NEAR(expectedForce.x, actualForce.x, tolX);
+        // EXPECT_NEAR(expectedForce.y, actualForce.y, tolY);
+        // EXPECT_NEAR(expectedForce.z, actualForce.z, tolZ);
+        // EXPECT_NEAR(expectedTorque.x, actualTorque.x, tolX);
+        // EXPECT_NEAR(expectedTorque.y, actualTorque.y, tolY);
+        // EXPECT_NEAR(expectedTorque.z, actualTorque.z, tolZ);
+      }
+    }
+  }
+}
+
+TEST_P(ContactSensor, StackTest)
+{
+  StackTest(GetParam());
+}
+
+////////////////////////////////////////////////////////////////////////
+// Test contact sensor torque feedback. Rest one x-rotated cylinder over
+// a y-rotated cylinder so they form a cross shape. Position the top cylinder
+// slightly to the -y direction so it begins to topple when simulation starts,
+// then verify it's torque
+////////////////////////////////////////////////////////////////////////
+void ContactSensor::TorqueTest(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test for Simbody, see issue #865.\n";
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  std::string modelName = "contactModel";
+  std::string contactSensorName = "contactSensor";
+  math::Pose modelPose(0, -0.3, 1.5, M_PI/2.0, 0, 0);
+
+  std::string cylinderName = "cylinder";
+  math::Pose cylinderPose(0, 0, 0.5, 0, M_PI/2.0, 0);
+
+  SpawnUnitContactSensor(modelName, contactSensorName,
+      "cylinder", modelPose.pos, modelPose.rot.GetAsEuler());
+
+  SpawnCylinder(cylinderName, cylinderPose.pos, cylinderPose.rot.GetAsEuler());
+
+  sensors::SensorPtr sensor = sensors::get_sensor(contactSensorName);
+  sensors::ContactSensorPtr contactSensor =
+      boost::dynamic_pointer_cast<sensors::ContactSensor>(sensor);
+
+  ASSERT_TRUE(contactSensor);
+
+  sensors::SensorManager::Instance()->Init();
+  sensors::SensorManager::Instance()->RunThreads();
+
+  EXPECT_FALSE(contactSensor->IsActive());
+
+  unsigned int expectedColCount = 1;
+  EXPECT_EQ(contactSensor->GetCollisionCount(), expectedColCount);
+
+  contactSensor->SetActive(true);
+
+  EXPECT_TRUE(contactSensor->IsActive());
+
+  physics::ModelPtr contactModel = world->GetModel(modelName);
+  ASSERT_TRUE(contactModel);
+
+  double gravityZ = -9.8;
+  physics->SetGravity(math::Vector3(0, 0, gravityZ));
+
+  msgs::Contacts contacts;
+
+  physics->SetContactMaxCorrectingVel(0);
+  physics->SetParam("iters", 100);
+
+  world->Step(1);
+
+  // run simulation until contacts occur
+  int steps = 2000;
+  while (contacts.contact_size() == 0 && --steps > 0)
+  {
+    world->Step(1);
+    contacts = contactSensor->GetContacts();
+  }
+
+  EXPECT_GT(steps, 0);
+
+  contacts = contactSensor->GetContacts();
+
+  unsigned int ColInd = 0;
+  physics::CollisionPtr col = contactModel->GetLink()->GetCollision(ColInd);
+  ASSERT_TRUE(col);
+
+  // double tol = 2e-1;
+  // loop through contact collision pairs
+  for (int i = 0; i < contacts.contact_size(); ++i)
+  {
+    bool body1 = true;
+    if (contacts.contact(i).collision1() == col->GetScopedName())
+      body1 = true;
+    else if (contacts.contact(i).collision2() == col->GetScopedName())
+      body1 = false;
+    else
+    {
+      FAIL();
+    }
+    math::Vector3 actualTorque;
+
+    // loop through all contact points between the two collisions
+    for (int j = 0; j < contacts.contact(i).position_size(); ++j)
+    {
+      if (contacts.contact(i).position(j).z() < 0.5)
+        continue;
+
+      if (body1)
+      {
+        actualTorque.x =
+          contacts.contact(i).wrench(j).body_1_wrench().torque().x();
+        actualTorque.y =
+          contacts.contact(i).wrench(j).body_1_wrench().torque().y();
+        actualTorque.z =
+          contacts.contact(i).wrench(j).body_1_wrench().torque().z();
+      }
+      else
+      {
+        actualTorque.x =
+          contacts.contact(i).wrench(j).body_2_wrench().torque().x();
+        actualTorque.y =
+          contacts.contact(i).wrench(j).body_2_wrench().torque().y();
+        actualTorque.z =
+          contacts.contact(i).wrench(j).body_2_wrench().torque().z();
+      }
+
+      // dart doesn't pass this portion of the test (#910)
+      if (_physicsEngine != "dart")
+      {
+        // contact sensor should have positive x torque and relatively large
+        // compared to y and z
+        EXPECT_GT(actualTorque.x, 0);
+        EXPECT_GT(actualTorque.x, fabs(actualTorque.y));
+        EXPECT_GT(actualTorque.x, fabs(actualTorque.z));
+        // EXPECT_LT(fabs(actualTorque.y), tol);
+        // EXPECT_LT(fabs(actualTorque.z), tol);
+      }
+    }
+  }
+}
+
+TEST_P(ContactSensor, TorqueTest)
+{
+  TorqueTest(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, ContactSensor, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/dem.cc b/test/integration/dem.cc
new file mode 100644
index 0000000..7883be9
--- /dev/null
+++ b/test/integration/dem.cc
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/common/Dem.hh"
+#include "gazebo/math/Angle.hh"
+#include "gazebo/sensors/GpsSensor.hh"
+#include "ServerFixture.hh"
+
+#define DOUBLE_TOL 1e-3
+
+using namespace gazebo;
+class Dem_TEST : public ServerFixture
+{
+};
+
+#ifdef HAVE_GDAL
+/////////////////////////////////////////////////
+/// \brief Test the integration between GPS and a DEM terrain.
+TEST_F(Dem_TEST, GPS)
+{
+  math::Angle latitude, longitude;
+  double elevation;
+  common::Dem dem;
+  boost::filesystem::path path = "file://media/dem/volcano.tif";
+
+  // Load a DEM world with a GPS sensor (without noise) attached to a box.
+  Load("worlds/dem_gps.world");
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+
+  // Update the sensor manager so that it can process new sensors.
+  mgr->Update();
+
+  // Get a pointer to the GPS sensor.
+  sensors::GpsSensorPtr sensor =
+    boost::dynamic_pointer_cast<sensors::GpsSensor>(
+        mgr->GetSensor("gps"));
+
+  // Make sure the above dynamic cast worked.
+  EXPECT_TRUE(sensor != NULL);
+  EXPECT_TRUE(sensor->IsActive());
+  sensor->Update(true);
+
+  // Get the georeference coordinates of the DEM's origin
+  dem.Load(path.string());
+  dem.GetGeoReferenceOrigin(latitude, longitude);
+  elevation = dem.GetElevation(0.0, 0.0);
+
+  EXPECT_NEAR(sensor->GetLatitude().Degree(), latitude.Degree(), DOUBLE_TOL);
+  EXPECT_NEAR(sensor->GetLongitude().Degree(), longitude.Degree(), DOUBLE_TOL);
+  EXPECT_NEAR(sensor->GetAltitude(), elevation, 1);
+}
+#endif
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/factory.cc b/test/integration/factory.cc
new file mode 100644
index 0000000..afaff98
--- /dev/null
+++ b/test/integration/factory.cc
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string.h>
+#include "gazebo/math/Helpers.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/transport/Node.hh"
+
+#include "gazebo/rendering/RenderEngine.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/sensors/SensorsIface.hh"
+#include "gazebo/sensors/CameraSensor.hh"
+#include "ServerFixture.hh"
+#include "images_cmp.h"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+class FactoryTest : public ServerFixture,
+                    public testing::WithParamInterface<const char*>
+{
+  public: void BoxSdf(const std::string &_physicsEngine);
+  public: void Box(const std::string &_physicsEngine);
+  public: void Sphere(const std::string &_physicsEngine);
+  public: void Cylinder(const std::string &_physicsEngine);
+};
+
+///////////////////////////////////////////////////
+// Verify that sdf is retained by entities spawned
+// via factory messages. A change between 1.6, 1.7
+// caused entities to lose their sdf data
+// (see issue #651)
+void FactoryTest::BoxSdf(const std::string &_physicsEngine)
+{
+  math::Pose setPose, testPose;
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  unsigned int entityCount = 6;
+
+  for (unsigned int i = 0; i < entityCount; ++i)
+  {
+    std::ostringstream name;
+    name << "test_box_" << i;
+    setPose.Set(math::Vector3(0, 0, i+0.5), math::Quaternion(0, 0, 0));
+    SpawnBox(name.str(), math::Vector3(1, 1, 1), setPose.pos,
+        setPose.rot.GetAsEuler());
+  }
+
+  // This loop must be separate from the previous loop to cause
+  // the failure.
+  for (unsigned int i = 0; i < entityCount; ++i)
+  {
+    std::ostringstream name;
+    name << "test_box_" << i;
+
+    physics::ModelPtr model = world->GetModel(name.str());
+    ASSERT_TRUE(model != NULL);
+    msgs::Model msg;
+    model->FillMsg(msg);
+    EXPECT_TRUE(msg.has_pose());
+    // gzerr << msg.DebugString() << '\n';
+  }
+}
+
+TEST_P(FactoryTest, BoxSdf)
+{
+  BoxSdf(GetParam());
+}
+
+void FactoryTest::Box(const std::string &_physicsEngine)
+{
+  math::Pose setPose, testPose;
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  for (unsigned int i = 0; i < 100; i++)
+  {
+    std::ostringstream name;
+    name << "test_box_" << i;
+    setPose.Set(math::Vector3(0, 0, i+0.5), math::Quaternion(0, 0, 0));
+    SpawnBox(name.str(), math::Vector3(1, 1, 1), setPose.pos,
+        setPose.rot.GetAsEuler());
+    testPose = GetEntityPose(name.str());
+    EXPECT_TRUE(math::equal(testPose.pos.x, setPose.pos.x, 0.1));
+    EXPECT_TRUE(math::equal(testPose.pos.y, setPose.pos.y, 0.1));
+    EXPECT_TRUE(math::equal(testPose.pos.z, setPose.pos.z, 0.1));
+  }
+}
+
+TEST_P(FactoryTest, Box)
+{
+  Box(GetParam());
+}
+
+void FactoryTest::Sphere(const std::string &_physicsEngine)
+{
+  math::Pose setPose, testPose;
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  for (unsigned int i = 0; i < 100; i++)
+  {
+    std::ostringstream name;
+    name << "test_sphere_" << i;
+    setPose.Set(math::Vector3(0, 0, i+0.5), math::Quaternion(0, 0, 0));
+    SpawnSphere(name.str(), setPose.pos, setPose.rot.GetAsEuler());
+    testPose = GetEntityPose(name.str());
+    EXPECT_TRUE(math::equal(testPose.pos.x, setPose.pos.x, 0.1));
+    EXPECT_TRUE(math::equal(testPose.pos.y, setPose.pos.y, 0.1));
+    EXPECT_TRUE(math::equal(testPose.pos.z, setPose.pos.z, 0.1));
+  }
+}
+
+TEST_P(FactoryTest, Sphere)
+{
+  Sphere(GetParam());
+}
+
+void FactoryTest::Cylinder(const std::string &_physicsEngine)
+{
+  math::Pose setPose, testPose;
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  for (unsigned int i = 0; i < 100; i++)
+  {
+    std::ostringstream name;
+    name << "test_cylinder_" << i;
+    setPose.Set(math::Vector3(0, 0, i+0.5), math::Quaternion(0, 0, 0));
+    SpawnCylinder(name.str(), setPose.pos, setPose.rot.GetAsEuler());
+    testPose = GetEntityPose(name.str());
+    EXPECT_TRUE(math::equal(testPose.pos.x, setPose.pos.x, 0.1));
+    EXPECT_TRUE(math::equal(testPose.pos.y, setPose.pos.y, 0.1));
+    EXPECT_TRUE(math::equal(testPose.pos.z, setPose.pos.z, 0.1));
+  }
+}
+
+TEST_P(FactoryTest, Cylinder)
+{
+  Cylinder(GetParam());
+}
+
+// Disabling this test for now. Different machines return different
+// camera images. Need a better way to evaluate rendered content.
+// TEST_F(FactoryTest, Camera)
+// {
+/*
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+    return;
+
+  math::Pose setPose, testPose;
+  Load("worlds/empty.world");
+  setPose.Set(math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
+  SpawnCamera("camera_model", "camera_sensor2", setPose.pos,
+      setPose.rot.GetAsEuler());
+
+  unsigned char *img = NULL;
+  unsigned int width;
+  unsigned int height;
+  GetFrame("camera_sensor2", &img, width, height);
+  ASSERT_EQ(width, static_cast<unsigned int>(320));
+  ASSERT_EQ(height, static_cast<unsigned int>(240));
+
+  unsigned int diffMax = 0;
+  unsigned int diffSum = 0;
+  double diffAvg = 0;
+  ImageCompare(&img, &empty_world_camera1,
+      width, height, 3, diffMax, diffSum, diffAvg);
+  // PrintImage("empty_world_camera1", &img, width, height, 3);
+  ASSERT_LT(diffSum, static_cast<unsigned int>(100));
+  ASSERT_EQ(static_cast<unsigned int>(0), diffMax);
+  ASSERT_EQ(0.0, diffAvg);
+  */
+// }
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, FactoryTest, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/file_handling.cc b/test/integration/file_handling.cc
new file mode 100644
index 0000000..2485bcd
--- /dev/null
+++ b/test/integration/file_handling.cc
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/filesystem.hpp>
+#include "ServerFixture.hh"
+#include "gazebo/common/common.hh"
+#include "gazebo/common/SystemPaths.hh"
+
+
+using namespace gazebo;
+class FileHandling : public ServerFixture
+{
+};
+
+TEST_F(FileHandling, Save)
+{
+  // Cleanup test directory.
+  common::SystemPaths *paths = common::SystemPaths::Instance();
+  boost::filesystem::remove_all(paths->GetDefaultTestPath());
+  boost::filesystem::create_directories(paths->GetDefaultTestPath());
+
+  Load("worlds/empty.world");
+
+  transport::PublisherPtr serverControlPub =
+    node->Advertise<msgs::ServerControl>("/gazebo/server/control");
+
+  transport::PublisherPtr requestPub =
+    node->Advertise<msgs::Request>("~/request");
+
+  // Find a valid filename
+  FILE *file = NULL;
+  std::ostringstream filename;
+  int i = 0;
+  do
+  {
+    filename.str("");
+    filename << paths->GetDefaultTestPath() << "/test_" << i << ".world";
+    i++;
+  } while ((file = fopen(filename.str().c_str(), "r")) != NULL);
+
+  msgs::ServerControl msg;
+  msg.set_save_world_name("default");
+  msg.set_save_filename(filename.str());
+  serverControlPub->Publish(msg);
+
+  // Wait until the file exists
+  i = 0;
+  while (i < 10 && (file = fopen(filename.str().c_str(), "r")) == NULL)
+  {
+    i++;
+    common::Time::MSleep(100);
+  }
+  fclose(file);
+
+  EXPECT_LT(i, 10);
+
+  // Cleanup test directory.
+  boost::filesystem::remove_all(paths->GetDefaultTestPath());
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/gpu_laser.cc b/test/integration/gpu_laser.cc
new file mode 100644
index 0000000..b6adf7a
--- /dev/null
+++ b/test/integration/gpu_laser.cc
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/sensors/sensors.hh"
+
+#define LASER_TOL 1e-5
+#define DOUBLE_TOL 1e-6
+
+using namespace gazebo;
+class GPURaySensorTest : public ServerFixture
+{
+};
+
+void OnNewLaserFrame(int *_scanCounter, float *_scanDest,
+                  const float *_scan,
+                  unsigned int _width, unsigned int _height,
+                  unsigned int _depth,
+                  const std::string &/*_format*/)
+{
+  memcpy(_scanDest, _scan, _width * _height * _depth);
+  *_scanCounter += 1;
+}
+
+/////////////////////////////////////////////////
+/// \brief Test GPU ray sensor range values,
+/// Adapted from LaserUnitBox test in laser.cc
+TEST_F(GPURaySensorTest, LaserUnitBox)
+{
+  // Test GPU ray sensors with 3 boxes in the world.
+  // First GPU ray sensor at identity orientation, second at 90 degree roll
+  // First place 2 of 3 boxes within range and verify range values.
+  // then move all 3 boxes out of range and verify range values
+  Load("worlds/empty_test.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run gpu laser test\n";
+    return;
+  }
+
+  std::string modelName = "gpu_ray_model";
+  std::string raySensorName = "gpu_ray_sensor";
+  double hMinAngle = -M_PI/2.0;
+  double hMaxAngle = M_PI/2.0;
+  double minRange = 0.1;
+  double maxRange = 5.0;
+  double rangeResolution = 0.02;
+  unsigned int samples = 320;
+  math::Pose testPose(math::Vector3(0, 0, 0.1),
+      math::Quaternion(0, 0, 0));
+
+  // Spawn another gpu ray sensor at 90 degree roll
+  std::string modelName2 = "gpu_ray_model_roll";
+  std::string raySensorName2 = "gpu_ray_sensor_roll";
+  math::Pose testPose2(math::Vector3(0, 0, 0.1),
+      math::Quaternion(M_PI/2.0, 0, 0));
+
+  SpawnGpuRaySensor(modelName, raySensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, minRange, maxRange,
+      rangeResolution, samples);
+
+  SpawnGpuRaySensor(modelName2, raySensorName2, testPose2.pos,
+      testPose2.rot.GetAsEuler(), hMinAngle, hMaxAngle, minRange, maxRange,
+      rangeResolution, samples);
+
+  std::string box01 = "box_01";
+  std::string box02 = "box_02";
+  std::string box03 = "box_03";
+
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+  world->GetPhysicsEngine()->SetGravity(math::Vector3(0, 0, 0));
+
+  // box in front of ray sensor 1 and 2
+  math::Pose box01Pose(math::Vector3(1, 0, 0.5), math::Quaternion(0, 0, 0));
+  // box on the right of ray sensor 1
+  math::Pose box02Pose(math::Vector3(0, -1, 0.5), math::Quaternion(0, 0, 0));
+  // box on the left of the ray sensor 1 but out of range
+  math::Pose box03Pose(math::Vector3(0, maxRange + 1, 0.5),
+      math::Quaternion(0, 0, 0));
+
+  SpawnBox(box01, math::Vector3(1, 1, 1), box01Pose.pos,
+      box01Pose.rot.GetAsEuler());
+
+  SpawnBox(box02, math::Vector3(1, 1, 1), box02Pose.pos,
+      box02Pose.rot.GetAsEuler());
+
+  SpawnBox(box03, math::Vector3(1, 1, 1), box03Pose.pos,
+      box03Pose.rot.GetAsEuler());
+
+  sensors::SensorPtr sensor = sensors::get_sensor(raySensorName);
+  sensors::GpuRaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::GpuRaySensor>(sensor);
+
+  sensors::SensorPtr sensor2 = sensors::get_sensor(raySensorName2);
+  sensors::GpuRaySensorPtr raySensor2 =
+    boost::dynamic_pointer_cast<sensors::GpuRaySensor>(sensor2);
+
+  // Make sure the above dynamic cast worked.
+  EXPECT_TRUE(raySensor != NULL);
+  EXPECT_TRUE(raySensor2 != NULL);
+
+  raySensor->SetActive(true);
+  raySensor2->SetActive(true);
+
+  // Verify ray sensor 1 range readings
+  // listen to new laser frames
+  float *scan = new float[raySensor->GetRayCount()
+      * raySensor->GetVerticalRayCount() * 3];
+  int scanCount = 0;
+  event::ConnectionPtr c =
+    raySensor->ConnectNewLaserFrame(
+        boost::bind(&::OnNewLaserFrame, &scanCount, scan,
+          _1, _2, _3, _4, _5));
+
+  // wait for a few laser scans
+  int i = 0;
+  while (scanCount < 10 && i < 300)
+  {
+    common::Time::MSleep(10);
+    i++;
+  }
+  EXPECT_LT(i, 300);
+
+  int mid = samples / 2;
+  double unitBoxSize = 1.0;
+  double expectedRangeAtMidPoint = box01Pose.pos.x - unitBoxSize/2;
+
+  // ray sensor 1 should see box01 and box02
+  EXPECT_NEAR(raySensor->GetRange(mid), expectedRangeAtMidPoint, LASER_TOL);
+  EXPECT_NEAR(raySensor->GetRange(0), expectedRangeAtMidPoint, LASER_TOL);
+
+  // WARNING: for readings of no return, gazebo returns max range rather
+  // than +inf. issue #124
+  EXPECT_NEAR(raySensor->GetRange(samples-1), maxRange, LASER_TOL);
+
+  // Verify ray sensor 2 range readings
+  // listen to new laser frames
+  float *scan2 = new float[raySensor2->GetRayCount()
+      * raySensor2->GetVerticalRayCount() * 3];
+  int scanCount2 = 0;
+  event::ConnectionPtr c2 =
+    raySensor->ConnectNewLaserFrame(
+        boost::bind(&::OnNewLaserFrame, &scanCount2, scan2,
+          _1, _2, _3, _4, _5));
+
+  // wait for a few laser scans
+  i = 0;
+  scanCount2 = 0;
+  while (scanCount2 < 10 && i < 300)
+  {
+    common::Time::MSleep(10);
+    i++;
+  }
+  EXPECT_LT(i, 300);
+
+  // Only box01 should be visible to ray sensor 2
+  EXPECT_NEAR(raySensor2->GetRange(mid), expectedRangeAtMidPoint, LASER_TOL);
+  EXPECT_NEAR(raySensor2->GetRange(0), maxRange, LASER_TOL);
+  EXPECT_NEAR(raySensor->GetRange(samples-1), maxRange, LASER_TOL);
+
+  // Move all boxes out of range
+  world->GetModel(box01)->SetWorldPose(
+      math::Pose(math::Vector3(maxRange + 1, 0, 0), math::Quaternion(0, 0, 0)));
+  world->GetModel(box02)->SetWorldPose(
+      math::Pose(math::Vector3(0, -(maxRange + 1), 0),
+      math::Quaternion(0, 0, 0)));
+
+  // wait for a few more laser scans
+  i = 0;
+  scanCount = 0;
+  scanCount2 = 0;
+  while ((scanCount < 10 ||scanCount2 < 10) && i < 300)
+  {
+    common::Time::MSleep(10);
+    i++;
+  }
+  EXPECT_LT(i, 300);
+
+  for (int i = 0; i < raySensor->GetRayCount(); ++i)
+    EXPECT_NEAR(raySensor->GetRange(i), maxRange, LASER_TOL);
+
+  for (int i = 0; i < raySensor->GetRayCount(); ++i)
+    EXPECT_NEAR(raySensor2->GetRange(i), maxRange, LASER_TOL);
+
+  raySensor->DisconnectNewLaserFrame(c);
+  raySensor2->DisconnectNewLaserFrame(c2);
+
+  delete [] scan;
+  delete [] scan2;
+}
+
+
+/////////////////////////////////////////////////
+/// \brief Test GPU ray sensor interaction with terrain
+TEST_F(GPURaySensorTest, Heightmap)
+{
+  Load("worlds/gpu_laser_heightmap.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run gpu laser test\n";
+    return;
+  }
+
+  // Get a pointer to the gpu laser sensor
+  std::string gpuLaserName = "gpu_laser_sensor";
+  int t = 0;
+  while (sensors::get_sensor(gpuLaserName) == NULL && t < 100)
+  {
+    common::Time::MSleep(100);
+    ++t;
+  }
+  ASSERT_LT(t, 100);
+  sensors::SensorPtr sensor = sensors::get_sensor(gpuLaserName);
+  sensors::GpuRaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::GpuRaySensor>(sensor);
+
+  EXPECT_TRUE(raySensor != NULL);
+
+  // listen to new laser frames
+  float *scan = new float[raySensor->GetRayCount()
+      * raySensor->GetVerticalRayCount() * 3];
+  int scanCount = 0;
+  event::ConnectionPtr c =
+    raySensor->ConnectNewLaserFrame(
+        boost::bind(&::OnNewLaserFrame, &scanCount, scan,
+          _1, _2, _3, _4, _5));
+
+  // wait for a few laser scans
+  int i = 0;
+  while (scanCount < 10 && i < 300)
+  {
+    common::Time::MSleep(10);
+    i++;
+  }
+  EXPECT_LT(i, 300);
+
+  // Verify initial laser range readings. Nothing should be intersecting
+  double maxRange = 10;
+  EXPECT_NEAR(raySensor->GetRangeMax(), maxRange, LASER_TOL);
+
+  for (int i = 0; i < raySensor->GetRayCount(); ++i)
+    EXPECT_NEAR(raySensor->GetRange(i), maxRange, LASER_TOL);
+
+  // Move laser model very close to terrain, it should now returns range values
+  // that are less than half the max range
+  std::string gpuLaserModelName = "gpu_laser";
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+  world->GetModel(gpuLaserModelName)->SetWorldPose(
+      math::Pose(math::Vector3(13.2, 0, 0.035), math::Quaternion(0, 0, 0)));
+
+  // wait for a few laser scans
+  i = 0;
+  scanCount = 0;
+  while (scanCount < 10 && i < 300)
+  {
+    common::Time::MSleep(10);
+    i++;
+  }
+  EXPECT_LT(i, 300);
+
+  for (int i = 0; i < raySensor->GetRayCount(); ++i)
+    EXPECT_TRUE(raySensor->GetRange(i) < maxRange / 2.0);
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/gripper.cc b/test/integration/gripper.cc
new file mode 100644
index 0000000..1767374
--- /dev/null
+++ b/test/integration/gripper.cc
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/physics/Gripper.hh"
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/Joint.hh"
+
+class GripperTest : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+// \brief Test to make sure the gripper forms a joint when grasping an object
+TEST_F(GripperTest, Close)
+{
+  Load("worlds/gripper.world");
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  physics::ModelPtr model = world->GetModel("simple_gripper");
+  ASSERT_TRUE(model);
+
+  physics::JointPtr leftJoint = model->GetJoint("palm_left_finger");
+  ASSERT_TRUE(leftJoint);
+
+  physics::JointPtr rightJoint = model->GetJoint("palm_right_finger");
+  ASSERT_TRUE(rightJoint);
+
+  physics::GripperPtr gripper = model->GetGripper(0);
+  ASSERT_TRUE(gripper);
+
+  // The gripper should not be attached to anything
+  EXPECT_FALSE(gripper->IsAttached());
+
+  // Close the gripper.
+  leftJoint->SetForce(0, -0.5);
+  rightJoint->SetForce(0, 0.5);
+
+  transport::PublisherPtr jointPub = this->node->Advertise<msgs::JointCmd>(
+        "~/simple_gripper/joint_cmd");
+
+  msgs::JointCmd msg;
+  msg.set_name("simple_gripper::palm_right_finger");
+  msg.set_force(0.6);
+  jointPub->Publish(msg);
+
+  msg.set_name("simple_gripper::palm_left_finger");
+  msg.set_force(-0.6);
+  jointPub->Publish(msg);
+
+  int i = 0;
+  while (!gripper->IsAttached() && i < 100)
+  {
+    common::Time::MSleep(500);
+    ++i;
+  }
+  EXPECT_LT(i, 100);
+
+  // The gripper should be attached.
+  EXPECT_TRUE(gripper->IsAttached());
+}
+
+/////////////////////////////////////////////////
+// \brief Test grasp can close and open
+TEST_F(GripperTest, CloseOpen)
+{
+  Load("worlds/gripper.world");
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  physics::ModelPtr model = world->GetModel("simple_gripper");
+  ASSERT_TRUE(model);
+
+  physics::JointPtr leftJoint = model->GetJoint("palm_left_finger");
+  ASSERT_TRUE(leftJoint);
+
+  physics::JointPtr rightJoint = model->GetJoint("palm_right_finger");
+  ASSERT_TRUE(rightJoint);
+
+  physics::GripperPtr gripper = model->GetGripper(0);
+  ASSERT_TRUE(gripper);
+
+  // The gripper should not be attached to anything
+  EXPECT_FALSE(gripper->IsAttached());
+
+  // Close the gripper.
+  leftJoint->SetForce(0, -0.5);
+  rightJoint->SetForce(0, 0.5);
+
+  transport::PublisherPtr jointPub = this->node->Advertise<msgs::JointCmd>(
+        "~/simple_gripper/joint_cmd");
+
+  msgs::JointCmd msg;
+  msg.set_name("simple_gripper::palm_right_finger");
+  msg.set_force(0.6);
+  jointPub->Publish(msg);
+
+  msg.set_name("simple_gripper::palm_left_finger");
+  msg.set_force(-0.6);
+  jointPub->Publish(msg);
+
+  int i = 0;
+  while (!gripper->IsAttached() && i < 100)
+  {
+    common::Time::MSleep(500);
+    ++i;
+  }
+  EXPECT_LT(i, 100);
+
+  // The gripper should be attached.
+  EXPECT_TRUE(gripper->IsAttached());
+
+  // Open the gripper.
+  msg.set_name("simple_gripper::palm_right_finger");
+  msg.set_force(-0.6);
+  jointPub->Publish(msg);
+
+  msg.set_name("simple_gripper::palm_left_finger");
+  msg.set_force(0.6);
+  jointPub->Publish(msg);
+
+  i = 0;
+  while (gripper->IsAttached() && i < 100)
+  {
+    common::Time::MSleep(500);
+    ++i;
+  }
+  EXPECT_LT(i, 100);
+
+  // The gripper should release the box.
+  EXPECT_FALSE(gripper->IsAttached());
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/gz_camera.cc b/test/integration/gz_camera.cc
new file mode 100644
index 0000000..0482578
--- /dev/null
+++ b/test/integration/gz_camera.cc
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/sensors/SensorsIface.hh"
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class GzCamera : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+// \brief Test the at camera follow (gz camera -f <model> -c <camera>) moves
+// the camera
+TEST_F(GzCamera, Follow)
+{
+  Load("worlds/empty_test.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  // Spawn a box to follow.
+  SpawnBox("box", math::Vector3(1, 1, 1), math::Vector3(10, 10, 1),
+      math::Vector3(0, 0, 0));
+
+  math::Pose cameraStartPose(0, 0, 0, 0, 0, 0);
+
+  // Spawn a camera that will do the following
+  SpawnCamera("test_camera_model", "test_camera",
+      cameraStartPose.pos, cameraStartPose.rot.GetAsEuler());
+
+  rendering::ScenePtr scene = rendering::get_scene();
+  ASSERT_TRUE(scene);
+
+  rendering::CameraPtr camera = scene->GetCamera("test_camera");
+  ASSERT_TRUE(camera);
+
+  // Make sure the sensor is at the correct initial pose
+  EXPECT_EQ(camera->GetWorldPose(), cameraStartPose);
+
+  SetPause(true);
+
+  // Tell the camera to follow the box. The camera should move toward the
+  // box.
+  custom_exec("gz camera -c test_camera -f box");
+  world->Step(5000);
+
+  // Make sure the camera is not at the initial pose.
+  EXPECT_TRUE(camera->GetWorldPose() != cameraStartPose);
+
+  EXPECT_NEAR(camera->GetWorldPose().pos.x, 9.9, 0.1);
+  EXPECT_NEAR(camera->GetWorldPose().pos.y, 9.9, 0.1);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/gz_joint.cc b/test/integration/gz_joint.cc
new file mode 100644
index 0000000..0aa044a
--- /dev/null
+++ b/test/integration/gz_joint.cc
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <sstream>
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class GzJoint : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+/// \brief Test application of force to a joint ('gz joint -f')
+TEST_F(GzJoint, Force)
+{
+  Load("worlds/single_revolute_test.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  // Get a pointer to the model
+  physics::ModelPtr model = world->GetModel("model");
+  ASSERT_TRUE(model);
+
+  // Get a pointer to the joint
+  physics::JointPtr joint = model->GetJoint("joint");
+  ASSERT_TRUE(joint);
+
+  // Make sure the joint is at the correct initial pose
+  EXPECT_NEAR(joint->GetAngle(0).Radian(), 0.0, 1e-3);
+
+  world->SetPaused(true);
+
+  // Move the joint
+  custom_exec("gz joint -w default -m model -j joint -f 1.0e5");
+
+  world->Step(100);
+
+  // Make sure the joint has moved.
+  EXPECT_GT(joint->GetAngle(0).Radian(), 0.1);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test application of position PID to a joint ('gz joint --pos-*')
+TEST_F(GzJoint, PositionPID)
+{
+  Load("worlds/single_revolute_test.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  // Disable gravity to simplify PID control
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  physics->SetGravity(math::Vector3::Zero);
+
+  // Get a pointer to the model
+  physics::ModelPtr model = world->GetModel("model");
+  ASSERT_TRUE(model);
+
+  // Get a pointer to the joint
+  physics::JointPtr joint = model->GetJoint("joint");
+  ASSERT_TRUE(joint);
+
+  // Make sure the joint is at the correct initial pose
+  EXPECT_NEAR(joint->GetAngle(0).Radian(), 0.0, 1e-3);
+
+  world->SetPaused(true);
+
+  // Tell the joint to hold a position using a PID controller.
+  double targetAngle = 0.5;
+  std::ostringstream stream;
+  stream << "gz joint -w default -m model -j joint --pos-t "
+         << targetAngle
+         << " --pos-p 0.6e10 --pos-i 0.0 --pos-d 1.8e10";
+  custom_exec(stream.str());
+
+  world->Step(5000);
+
+  // Make sure the joint is at the specified pose
+  EXPECT_NEAR(joint->GetAngle(0).Radian(), targetAngle, 0.2);
+}
+
+/////////////////////////////////////////////////
+/// \brief Test application of velocity PID to a joint ('gz joint --vel-*')
+TEST_F(GzJoint, VelocityPID)
+{
+  Load("worlds/single_revolute_test.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  // Get a pointer to the model
+  physics::ModelPtr model = world->GetModel("model");
+  ASSERT_TRUE(model);
+
+  // Get a pointer to the joint
+  physics::JointPtr joint = model->GetJoint("joint");
+  ASSERT_TRUE(joint);
+
+  // Make sure the joint is at the correct initial pose
+  EXPECT_NEAR(joint->GetAngle(0).Radian(), 0.0, 1e-3);
+
+  world->SetPaused(true);
+
+  // Tell the joint to hold a velocity using a PID controller.
+  custom_exec("gz joint -w default -m model -j joint --vel-t 0.5 "
+      "--vel-p 1e5 --vel-i 10.0 --vel-d 0.01");
+
+  world->Step(800);
+
+  // Make sure the joint has the specified velocity
+  EXPECT_NEAR(joint->GetVelocity(0), 0.5, 0.1);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/gz_log.cc b/test/integration/gz_log.cc
new file mode 100644
index 0000000..258bc73
--- /dev/null
+++ b/test/integration/gz_log.cc
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/util/LogRecord.hh"
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class GzLog : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+/// \brief Test log recording from gzserver
+TEST_F(GzLog, Record)
+{
+  util::LogRecord *recorder = util::LogRecord::Instance();
+  recorder->Init("test");
+  Load("worlds/single_revolute_test.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  world->SetPaused(true);
+
+  ASSERT_TRUE(recorder);
+
+  EXPECT_FALSE(recorder->GetPaused());
+  EXPECT_FALSE(recorder->GetRunning());
+
+  // Start log recording
+  custom_exec("gz log -w default -d 1");
+  world->Step(100);
+
+  std::string filename = recorder->GetFilename();
+
+  EXPECT_TRUE(recorder->GetRunning());
+  EXPECT_FALSE(recorder->GetPaused());
+  EXPECT_FALSE(filename.empty());
+  EXPECT_GT(recorder->GetFileSize(), 0u);
+
+  // Stop log recording
+  custom_exec("gz log -w default -d 0");
+
+  EXPECT_FALSE(recorder->GetRunning());
+
+  std::string cmd = "gz log -i -f " + filename;
+  std::string info = custom_exec(cmd);
+  std::string logVersionStr = info.substr(
+      info.find("Log Version:    ")+16, info.find("\n")-16);
+
+  EXPECT_EQ(logVersionStr, GZ_LOG_VERSION);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/gz_model.cc b/test/integration/gz_model.cc
new file mode 100644
index 0000000..8f739ca
--- /dev/null
+++ b/test/integration/gz_model.cc
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/filesystem.hpp>
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class GzModel : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+/// \brief Test spawning a model from SDF ('gz model -f')
+TEST_F(GzModel, Spawn)
+{
+  Load("worlds/empty_test.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  std::string cmd;
+  boost::filesystem::path path;
+
+  path = path / TEST_PATH / "models" / "box.sdf";
+
+  // Spawn a model with few parameters.
+  {
+    cmd = "gz model -w default -m my_model -f " + path.string();
+
+    SetPause(true);
+
+    // Spawn a model.
+    custom_exec(cmd);
+
+    world->Step(100);
+
+    EXPECT_TRUE(world->GetModel("my_model"));
+  }
+
+  // Spawn another box at a different location
+  {
+    cmd = "gz model -w default -m next_model -x 5 -y 2 -z 9000 "
+      "-R 0.1 -P 0.2 -Y 0.3 -f " + path.string();
+
+    SetPause(true);
+
+    // Spawn a model.
+    custom_exec(cmd);
+    world->Step(100);
+
+    EXPECT_TRUE(world->GetModel("next_model"));
+
+    physics::ModelPtr model = world->GetModel("next_model");
+    ASSERT_TRUE(model);
+
+    // Check the pose of the spawned model
+    math::Pose pose = model->GetWorldPose();
+    math::Vector3 rpy = pose.rot.GetAsEuler();
+
+    EXPECT_NEAR(pose.pos.x, 5, 1e-5);
+    EXPECT_NEAR(pose.pos.y, 2, 1e-5);
+    EXPECT_LT(pose.pos.z, 9000.0);
+    EXPECT_GT(pose.pos.z, 8900.0);
+
+    EXPECT_NEAR(rpy.x, 0.1, 1e-5);
+    EXPECT_NEAR(rpy.y, 0.2, 1e-5);
+    EXPECT_NEAR(rpy.z, 0.3, 1e-5);
+  }
+}
+
+/////////////////////////////////////////////////
+/// \brief Test spawning and deleting a model from SDF ('gz model -d')
+TEST_F(GzModel, SpawnAndDelete)
+{
+  Load("worlds/empty_test.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  boost::filesystem::path path = TEST_PATH;
+  path = path / "models" / "box.sdf";
+
+  std::string cmd = "gz model -w default -m my_model -f " + path.string();
+
+  // Spawn a model.
+  custom_exec(cmd);
+
+  common::Time::MSleep(1000);
+
+  EXPECT_TRUE(HasEntity("my_model"));
+
+  // Delete a model.
+  custom_exec("gz model -w default -m my_model -d ");
+
+  common::Time::MSleep(1000);
+
+  EXPECT_FALSE(world->GetModel("my_model"));
+}
+
+/////////////////////////////////////////////////
+/// \brief Test spawning and moving a model
+TEST_F(GzModel, SpawnAndMove)
+{
+  Load("worlds/empty.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  boost::filesystem::path path = TEST_PATH;
+  path = path / "models" / "box.sdf";
+
+  std::string cmd = "cat ";
+  cmd += path.string() + " | gz model -w default -m my_model -s ";
+
+  // Spawn a model.
+  custom_exec(cmd);
+
+  common::Time::MSleep(1000);
+
+  EXPECT_TRUE(HasEntity("my_model"));
+  physics::ModelPtr model = world->GetModel("my_model");
+
+  world->SetPaused(true);
+
+  // Move a model.
+  custom_exec("gz model -w default -m my_model -x 10 -y 11 -z 5 "
+      "-R 0.1 -P 0.2 -Y 0.3");
+
+  common::Time::MSleep(1000);
+
+  EXPECT_EQ(model->GetWorldPose(), math::Pose(10, 11, 5, 0.1, 0.2, 0.3));
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/gz_physics.cc b/test/integration/gz_physics.cc
new file mode 100644
index 0000000..0515a12
--- /dev/null
+++ b/test/integration/gz_physics.cc
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class GzPhysics : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+// \brief Test setting the gravity.
+TEST_F(GzPhysics, Gravity)
+{
+  Load("worlds/empty.world");
+
+  // Spawn a box that will eventually float up.
+  SpawnBox("box", math::Vector3(1, 1, 1), math::Vector3(0, 0, .5),
+      math::Vector3(0, 0, 0));
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  // Get a pointer to the model
+  physics::ModelPtr model = world->GetModel("box");
+  ASSERT_TRUE(model);
+
+  EXPECT_EQ(model->GetWorldPose(), math::Pose(0, 0, .5, 0, 0, 0));
+
+  SetPause(true);
+
+  // Change gravity
+  custom_exec("gz physics -g 0,0,9.8");
+
+  world->Step(100);
+
+  EXPECT_GT(model->GetWorldPose().pos.z, 0.5);
+}
+
+/////////////////////////////////////////////////
+// \brief Test setting the step size.
+TEST_F(GzPhysics, StepSize)
+{
+  Load("worlds/empty.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+  ASSERT_TRUE(world->GetPhysicsEngine());
+
+  // Change step size
+  custom_exec("gz physics -s 0.002");
+  EXPECT_NEAR(world->GetPhysicsEngine()->GetMaxStepSize(), 0.002, 1e-5);
+
+  // Change step size
+  custom_exec("gz physics -s 0.001");
+  EXPECT_NEAR(world->GetPhysicsEngine()->GetMaxStepSize(), 0.001, 1e-5);
+}
+
+/////////////////////////////////////////////////
+// \brief Test setting the iterations.
+TEST_F(GzPhysics, Iters)
+{
+  Load("worlds/empty.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+  ASSERT_TRUE(world->GetPhysicsEngine());
+
+  // Change iterations
+  {
+    custom_exec("gz physics -i 35");
+    boost::any iters = world->GetPhysicsEngine()->GetParam("iters");
+    EXPECT_EQ(boost::any_cast<int>(iters), 35);
+  }
+
+  // Change iterations
+  {
+    custom_exec("gz physics -i 200");
+    boost::any iters = world->GetPhysicsEngine()->GetParam("iters");
+    EXPECT_EQ(boost::any_cast<int>(iters), 200);
+  }
+}
+
+/////////////////////////////////////////////////
+// \brief Test setting the update rate.
+TEST_F(GzPhysics, UpdateRate)
+{
+  Load("worlds/empty.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+  ASSERT_TRUE(world->GetPhysicsEngine());
+
+  // Change update rate
+  custom_exec("gz physics -u 2.0");
+  EXPECT_NEAR(world->GetPhysicsEngine()->GetRealTimeUpdateRate(), 2.0, 1e-3);
+
+  // Change update rate
+  custom_exec("gz physics -u 0.5");
+  EXPECT_NEAR(world->GetPhysicsEngine()->GetRealTimeUpdateRate(), 0.5, 1e-3);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/gz_world.cc b/test/integration/gz_world.cc
new file mode 100644
index 0000000..49fd058
--- /dev/null
+++ b/test/integration/gz_world.cc
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class GzWorld : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+// \brief Test world pause.
+TEST_F(GzWorld, Pause)
+{
+  Load("worlds/empty_test.world");
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  EXPECT_FALSE(world->IsPaused());
+
+  // Pause
+  custom_exec("gz world -p 1");
+
+  EXPECT_TRUE(world->IsPaused());
+
+  // Run
+  custom_exec("gz world -p 0");
+
+  EXPECT_FALSE(world->IsPaused());
+}
+
+/////////////////////////////////////////////////
+// \brief Test world step.
+TEST_F(GzWorld, Step)
+{
+  Load("worlds/empty_test.world", true);
+
+  // Get a pointer to the world
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  EXPECT_TRUE(world->IsPaused());
+
+  EXPECT_EQ(world->GetIterations(), 0u);
+
+  // Step the world one iteration.
+  custom_exec("gz world -s 1");
+
+  EXPECT_EQ(world->GetIterations(), 1u);
+
+  EXPECT_TRUE(world->IsPaused());
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/heightmap.cc b/test/integration/heightmap.cc
new file mode 100644
index 0000000..4502fa6
--- /dev/null
+++ b/test/integration/heightmap.cc
@@ -0,0 +1,371 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <string.h>
+
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/rendering/RenderingIface.hh"
+#include "gazebo/rendering/Scene.hh"
+#include "heights_cmp.h"
+#include "helper_physics_generator.hh"
+#include "images_cmp.h"
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+
+class HeightmapTest : public ServerFixture,
+                      public testing::WithParamInterface<const char*>
+{
+  public: void PhysicsLoad(const std::string &_physicsEngine);
+  public: void WhiteAlpha(const std::string &_physicsEngine);
+  public: void WhiteNoAlpha(const std::string &_physicsEngine);
+  public: void NotSquareImage();
+  public: void InvalidSizeImage();
+  // public: void Heights(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void HeightmapTest::PhysicsLoad(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Aborting test for dart, see issue #909" << std::endl;
+    return;
+  }
+
+  Load("worlds/heightmap_test.world", true, _physicsEngine);
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run heights test\n";
+    return;
+  }
+
+  physics::ModelPtr model = GetModel("heightmap");
+  EXPECT_TRUE(model);
+
+  physics::CollisionPtr collision =
+    model->GetLink("link")->GetCollision("collision");
+
+  physics::HeightmapShapePtr shape =
+    boost::dynamic_pointer_cast<physics::HeightmapShape>(
+        collision->GetShape());
+
+  EXPECT_TRUE(shape);
+  EXPECT_TRUE(shape->HasType(physics::Base::HEIGHTMAP_SHAPE));
+
+  EXPECT_TRUE(shape->GetPos() == math::Vector3(0, 0, 0));
+  EXPECT_TRUE(shape->GetSize() == math::Vector3(129, 129, 10));
+
+  common::Image trueImage("media/materials/textures/heightmap_bowl.png");
+  common::Image testImage = shape->GetImage();
+
+  common::SystemPaths *paths = common::SystemPaths::Instance();
+  testImage.SavePNG(paths->GetTmpPath() + "/test_shape.png");
+
+  EXPECT_EQ(trueImage.GetWidth(), testImage.GetWidth());
+  EXPECT_EQ(trueImage.GetHeight(), testImage.GetHeight());
+
+  // Debug output
+  // Compare the true image to the image generated by the heightmap shape
+  // for (uint16_t y = 0; y < testImage.GetHeight(); y += 1.0)
+  // {
+  //   for (uint16_t x = 0; x < testImage.GetWidth(); x += 1.0)
+  //   {
+  //     // EXPECT_NEAR(trueImage.GetPixel(x, y).r,
+  //     //             testImage.GetPixel(x, y).r, 0.008);
+  //     // if (fabs(trueImage.GetPixel(x, y).r - testImage.GetPixel(x, y).r)
+  //     // > 0.008)
+  //     {
+  //       printf("XY[%d %d] True[%f] Test[%f]\n", x, y,
+  //           trueImage.GetPixel(x, y).r, testImage.GetPixel(x, y).r);
+  //     }
+  //   }
+  // }
+}
+
+/////////////////////////////////////////////////
+void HeightmapTest::WhiteAlpha(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Aborting test for dart, see issue #909" << std::endl;
+    return;
+  }
+
+  Load("worlds/white_alpha_heightmap.world", true, _physicsEngine);
+  physics::ModelPtr model = GetModel("heightmap");
+  EXPECT_TRUE(model);
+
+  physics::CollisionPtr collision =
+    model->GetLink("link")->GetCollision("collision");
+
+  physics::HeightmapShapePtr shape =
+    boost::dynamic_pointer_cast<physics::HeightmapShape>(collision->GetShape());
+
+  EXPECT_TRUE(shape);
+  EXPECT_TRUE(shape->HasType(physics::Base::HEIGHTMAP_SHAPE));
+
+  int x, y;
+  for (y = 0; y < shape->GetVertexCount().y; ++y)
+  {
+    for (x = 0; x < shape->GetVertexCount().x; ++x)
+    {
+      EXPECT_NEAR(shape->GetHeight(x, y), 10.0, 1e-4);
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void HeightmapTest::WhiteNoAlpha(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Aborting test for dart, see issue #909" << std::endl;
+    return;
+  }
+
+  Load("worlds/white_no_alpha_heightmap.world", true, _physicsEngine);
+  physics::ModelPtr model = GetModel("heightmap");
+  EXPECT_TRUE(model);
+
+  physics::CollisionPtr collision =
+    model->GetLink("link")->GetCollision("collision");
+
+  physics::HeightmapShapePtr shape =
+    boost::dynamic_pointer_cast<physics::HeightmapShape>(collision->GetShape());
+
+  EXPECT_TRUE(shape);
+  EXPECT_TRUE(shape->HasType(physics::Base::HEIGHTMAP_SHAPE));
+
+  int x, y;
+  for (y = 0; y < shape->GetVertexCount().y; ++y)
+  {
+    for (x = 0; x < shape->GetVertexCount().x; ++x)
+    {
+      EXPECT_EQ(shape->GetHeight(x, y), 10.0);
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void HeightmapTest::NotSquareImage()
+{
+  common::SystemPaths::Instance()->AddGazeboPaths(
+      TEST_INTEGRATION_PATH);
+
+  this->server = new Server();
+  this->server->PreLoad();
+  // EXPECT_THROW(this->server->LoadFile("worlds/not_square_heightmap.world"),
+  //            common::Exception);
+
+  this->server->Fini();
+  delete this->server;
+}
+
+/////////////////////////////////////////////////
+void HeightmapTest::InvalidSizeImage()
+{
+  common::SystemPaths::Instance()->AddGazeboPaths(
+      TEST_INTEGRATION_PATH);
+
+  this->server = new Server();
+  this->server->PreLoad();
+  // EXPECT_THROW(this->server->LoadFile("worlds/invalid_size_heightmap.world"),
+  //             common::Exception);
+
+  this->server->Fini();
+  delete this->server;
+}
+
+/*
+void HeightmapTest::Heights(const std::string &_physicsEngine)
+{
+  Load("worlds/heightmap_test.world", _physicsEngine);
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run heights test\n";
+    return;
+  }
+
+  // Make sure we can get a valid pointer to the scene.
+  rendering::ScenePtr scene = GetScene();
+  ASSERT_TRUE(scene);
+
+  rendering::Heightmap *heightmap = NULL;
+
+  // Wait for the heightmap to get loaded by the scene.
+  {
+    int i = 0;
+    while (i < 20 && (heightmap = scene->GetHeightmap()) == NULL)
+    {
+      common::Time::MSleep(100);
+      i++;
+    }
+
+    if (i >= 20)
+      gzthrow("Unable to get heightmap");
+  }
+
+  physics::ModelPtr model = GetModel("heightmap");
+  EXPECT_TRUE(model);
+
+  physics::CollisionPtr collision =
+    model->GetLink("link")->GetCollision("collision");
+
+  physics::HeightmapShapePtr shape =
+    boost::dynamic_pointer_cast<physics::HeightmapShape>(collision->GetShape());
+
+  EXPECT_TRUE(shape);
+  EXPECT_TRUE(shape->HasType(physics::Base::HEIGHTMAP_SHAPE));
+
+  EXPECT_TRUE(shape->GetPos() == math::Vector3(0, 0, 0));
+  EXPECT_TRUE(shape->GetSize() == math::Vector3(129, 129, 10));
+
+  std::vector<float> physicsTest;
+  std::vector<float> renderTest;
+
+  float x, y;
+
+  for (y = 0; y < shape->GetSize().y && y < .3; y += 0.2)
+  {
+    for (x = 0; x < shape->GetSize().x && x < 1; x += 0.2)
+    {
+      // Compute the proper physics test point.
+      int xi = rint(x);
+      if (xi >= shape->GetSize().x)
+        xi = shape->GetSize().x - 1.0;
+
+      int yi = rint(y);
+      if (yi >= shape->GetSize().y)
+        yi = shape->GetSize().y - 1.0;
+
+      // Compute the proper render test point.
+      double xd = xi - (shape->GetSize().x) * 0.5;
+      double yd = (shape->GetSize().y) * 0.5 - yi;
+
+      // The shape->GetHeight function requires a point relative to the
+      // bottom left of the heightmap image
+      physicsTest.push_back(shape->GetHeight(xi, yi));
+
+      // The render test requires a point relative to the center of the
+      // heightmap.
+      renderTest.push_back(heightmap->GetHeight(xd, yd));
+
+      // Debug output
+      if (fabs(physicsTest.back() - renderTest.back()) >= 0.04)
+      {
+        std::cout << "Render XY[" << xd << " " << yd << "] Physics XY[" << xi
+          << " " << yi << "] R[" << renderTest.back() << "] P["
+          << physicsTest.back() << "] D["
+          << fabs(renderTest.back() - physicsTest.back()) << "]\n";
+      }
+
+      // Test to see if the physics height is equal to the render engine
+      // height.
+      EXPECT_NEAR(physicsTest.back(), renderTest.back(), 0.04);
+    }
+  }
+
+  float diffMax, diffSum, diffAvg;
+  FloatCompare(&physicsTest[0], &renderTest[0], physicsTest.size(),
+      diffMax, diffSum, diffAvg);
+
+  EXPECT_LT(diffMax, 0.04);
+  EXPECT_LT(diffSum, 0.2);
+  EXPECT_LT(diffAvg, 0.02);
+
+  printf("Max[%f] Sum[%f] Avg[%f]\n", diffMax, diffSum, diffAvg);
+
+  // This will print the heights
+  // printf("static float __heights[] = {");
+  // unsigned int i=0;
+  // for (y = 0; y < shape->GetVertexCount().y; ++y)
+  // {
+  //   for (x = 0; x < shape->GetVertexCount().x; ++x)
+  //   {
+  //     if (y == shape->GetVertexCount().y && x == shape->GetVertexCount().x)
+  //       break;
+
+  //     if (i % 7 == 0)
+  //       printf("\n");
+  //     else
+  //       printf(" ");
+  //     printf("%f,", shape->GetHeight(x, y));
+  //     i++;
+  //   }
+  // }
+  // printf(" %f};\nstatic float *heights = __heights;\n",
+  // shape->GetHeight(x,y));
+}
+*/
+
+/////////////////////////////////////////////////
+TEST_F(HeightmapTest, NotSquareImage)
+{
+  NotSquareImage();
+}
+
+/////////////////////////////////////////////////
+TEST_F(HeightmapTest, InvalidSizeImage)
+{
+  InvalidSizeImage();
+}
+
+/////////////////////////////////////////////////
+TEST_P(HeightmapTest, PhysicsLoad)
+{
+  PhysicsLoad(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(HeightmapTest, WhiteAlpha)
+{
+  WhiteAlpha(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(HeightmapTest, WhiteNoAlpha)
+{
+  WhiteNoAlpha(GetParam());
+}
+
+/////////////////////////////////////////////////
+//
+// Disabled: segfaults ocassionally
+// See https://bitbucket.org/osrf/gazebo/issue/521 for details
+
+/*
+TEST_P(HeightmapTest, Heights)
+{
+  Heights(GetParam());
+}
+*/
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, HeightmapTest, PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/heights_cmp.h b/test/integration/heights_cmp.h
new file mode 100644
index 0000000..c125ef6
--- /dev/null
+++ b/test/integration/heights_cmp.h
@@ -0,0 +1,2411 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef TEST_HEIGHTS_CMP_H_
+#define TEST_HEIGHTS_CMP_H_
+
+#ifdef __GNUC__
+    #define MAYBE_UNUSED __attribute__((used))
+#elif defined _MSC_VER
+    #pragma warning(disable: Cxxxxx)
+    #define MAYBE_UNUSED
+#else
+    #define MAYBE_UNUSED
+#endif
+
+static float __heights[] = {
+0.000000, 0.019685, 0.039370, 0.059055, 0.078740, 0.098425, 0.118110,
+0.137795, 0.157480, 0.177165, 0.196850, 0.216535, 0.236220, 0.255906,
+0.275591, 0.295276, 0.314961, 0.334646, 0.354331, 0.374016, 0.393701,
+0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
+0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291,
+0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087,
+0.826772, 0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.944882,
+0.964567, 0.984252, 1.003937, 1.023622, 1.043307, 1.062992, 1.082677,
+1.102362, 1.122047, 1.141732, 1.161417, 1.181102, 1.200787, 1.220472,
+1.240157, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.348425,
+1.358268, 1.368110, 1.377953, 1.407480, 1.437008, 1.466535, 1.496063,
+1.505906, 1.515748, 1.525591, 1.535433, 1.564961, 1.594488, 1.624016,
+1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.742126, 1.751969,
+1.761811, 1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079,
+1.889764, 1.909449, 1.929134, 1.958661, 1.988189, 2.017717, 2.047244,
+2.066929, 2.086614, 2.106299, 2.125984, 2.135827, 2.145669, 2.155512,
+2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.273622, 2.303150,
+2.332677, 2.362205, 2.372047, 2.381890, 2.391732, 2.401575, 2.431102,
+2.460630, 2.490157, 2.519685, 0.019685, 0.034449, 0.049213, 0.063976,
+0.078740, 0.098425, 0.118110, 0.137795, 0.157480, 0.177165, 0.196850,
+0.216535, 0.236220, 0.255906, 0.275591, 0.295276, 0.314961, 0.334646,
+0.354331, 0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441,
+0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236,
+0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031,
+0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827,
+0.905512, 0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622,
+1.043307, 1.062992, 1.082677, 1.102362, 1.119587, 1.136811, 1.154035,
+1.171260, 1.193406, 1.215551, 1.237697, 1.259843, 1.279528, 1.299213,
+1.318898, 1.338583, 1.350886, 1.363189, 1.375492, 1.387795, 1.412402,
+1.437008, 1.461614, 1.486220, 1.498524, 1.510827, 1.523130, 1.535433,
+1.562500, 1.589567, 1.616634, 1.643701, 1.665846, 1.687992, 1.710138,
+1.732283, 1.744587, 1.756890, 1.769193, 1.781496, 1.798720, 1.815945,
+1.833169, 1.850394, 1.872539, 1.894685, 1.916831, 1.938976, 1.963583,
+1.988189, 2.012795, 2.037402, 2.059547, 2.081693, 2.103839, 2.125984,
+2.135827, 2.145669, 2.155512, 2.165354, 2.185039, 2.204724, 2.224410,
+2.244095, 2.271161, 2.298228, 2.325295, 2.352362, 2.364665, 2.376969,
+2.389272, 2.401575, 2.428642, 2.455709, 2.482776, 2.509843, 0.039370,
+0.049213, 0.059055, 0.068898, 0.078740, 0.098425, 0.118110, 0.137795,
+0.157480, 0.177165, 0.196850, 0.216535, 0.236220, 0.255906, 0.275591,
+0.295276, 0.314961, 0.334646, 0.354331, 0.374016, 0.393701, 0.413386,
+0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181,
+0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291, 0.688976,
+0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.826772,
+0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567,
+0.984252, 1.003937, 1.023622, 1.043307, 1.062992, 1.082677, 1.102362,
+1.117126, 1.131890, 1.146654, 1.161417, 1.186024, 1.210630, 1.235236,
+1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.353346, 1.368110,
+1.382874, 1.397638, 1.417323, 1.437008, 1.456693, 1.476378, 1.491142,
+1.505906, 1.520669, 1.535433, 1.560039, 1.584646, 1.609252, 1.633858,
+1.658465, 1.683071, 1.707677, 1.732283, 1.747047, 1.761811, 1.776575,
+1.791339, 1.806102, 1.820866, 1.835630, 1.850394, 1.875000, 1.899606,
+1.924213, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.052165,
+2.076772, 2.101378, 2.125984, 2.135827, 2.145669, 2.155512, 2.165354,
+2.185039, 2.204724, 2.224410, 2.244095, 2.268701, 2.293307, 2.317913,
+2.342520, 2.357284, 2.372047, 2.386811, 2.401575, 2.426181, 2.450787,
+2.475394, 2.500000, 0.059055, 0.063976, 0.068898, 0.073819, 0.078740,
+0.098425, 0.118110, 0.137795, 0.157480, 0.177165, 0.196850, 0.216535,
+0.236220, 0.255906, 0.275591, 0.295276, 0.314961, 0.334646, 0.354331,
+0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126,
+0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921,
+0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717,
+0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827, 0.905512,
+0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.043307,
+1.062992, 1.082677, 1.102362, 1.114665, 1.126969, 1.139272, 1.151575,
+1.178642, 1.205709, 1.232776, 1.259843, 1.279528, 1.299213, 1.318898,
+1.338583, 1.355807, 1.373032, 1.390256, 1.407480, 1.422244, 1.437008,
+1.451772, 1.466535, 1.483760, 1.500984, 1.518209, 1.535433, 1.557579,
+1.579724, 1.601870, 1.624016, 1.651083, 1.678150, 1.705217, 1.732283,
+1.749508, 1.766732, 1.783957, 1.801181, 1.813484, 1.825787, 1.838091,
+1.850394, 1.877461, 1.904528, 1.931594, 1.958661, 1.973425, 1.988189,
+2.002953, 2.017717, 2.044784, 2.071851, 2.098917, 2.125984, 2.135827,
+2.145669, 2.155512, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
+2.266240, 2.288386, 2.310532, 2.332677, 2.349902, 2.367126, 2.384350,
+2.401575, 2.423720, 2.445866, 2.468012, 2.490158, 0.078740, 0.078740,
+0.078740, 0.078740, 0.078740, 0.098425, 0.118110, 0.137795, 0.157480,
+0.177165, 0.196850, 0.216535, 0.236220, 0.255906, 0.275591, 0.295276,
+0.314961, 0.334646, 0.354331, 0.374016, 0.393701, 0.413386, 0.433071,
+0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866,
+0.590551, 0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661,
+0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.826772, 0.846457,
+0.866142, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567, 0.984252,
+1.003937, 1.023622, 1.043307, 1.062992, 1.082677, 1.102362, 1.112205,
+1.122047, 1.131890, 1.141732, 1.171260, 1.200787, 1.230315, 1.259843,
+1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638,
+1.417323, 1.427165, 1.437008, 1.446850, 1.456693, 1.476378, 1.496063,
+1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.643701,
+1.673228, 1.702756, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024,
+1.820866, 1.830709, 1.840551, 1.850394, 1.879921, 1.909449, 1.938976,
+1.968504, 1.978346, 1.988189, 1.998031, 2.007874, 2.037402, 2.066929,
+2.096457, 2.125984, 2.135827, 2.145669, 2.155512, 2.165354, 2.185039,
+2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
+2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630,
+2.480315, 0.098425, 0.098425, 0.098425, 0.098425, 0.098425, 0.113189,
+0.127953, 0.142717, 0.157480, 0.177165, 0.196850, 0.216535, 0.236220,
+0.255906, 0.275591, 0.295276, 0.314961, 0.334646, 0.354331, 0.374016,
+0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811,
+0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606,
+0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402,
+0.804626, 0.821850, 0.839075, 0.856299, 0.875984, 0.895669, 0.915354,
+0.935039, 0.957185, 0.979331, 1.001476, 1.023622, 1.040846, 1.058071,
+1.075295, 1.092520, 1.107283, 1.122047, 1.136811, 1.151575, 1.176181,
+1.200787, 1.225394, 1.250000, 1.269685, 1.289370, 1.309055, 1.328740,
+1.348425, 1.368110, 1.387795, 1.407480, 1.422244, 1.437008, 1.451772,
+1.466535, 1.483760, 1.500984, 1.518209, 1.535433, 1.557579, 1.579724,
+1.601870, 1.624016, 1.651083, 1.678150, 1.705217, 1.732283, 1.751969,
+1.771654, 1.791339, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394,
+1.877461, 1.904528, 1.931594, 1.958661, 1.970965, 1.983268, 1.995571,
+2.007874, 2.034941, 2.062008, 2.089075, 2.116142, 2.130906, 2.145669,
+2.160433, 2.175197, 2.192421, 2.209646, 2.226870, 2.244095, 2.263780,
+2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575,
+2.421260, 2.440945, 2.460630, 2.480315, 0.118110, 0.118110, 0.118110,
+0.118110, 0.118110, 0.127953, 0.137795, 0.147638, 0.157480, 0.177165,
+0.196850, 0.216535, 0.236220, 0.255906, 0.275591, 0.295276, 0.314961,
+0.334646, 0.354331, 0.374016, 0.393701, 0.413386, 0.433071, 0.452756,
+0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551,
+0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346,
+0.748031, 0.767717, 0.787402, 0.802165, 0.816929, 0.831693, 0.846457,
+0.866142, 0.885827, 0.905512, 0.925197, 0.949803, 0.974409, 0.999016,
+1.023622, 1.038386, 1.053150, 1.067913, 1.082677, 1.102362, 1.122047,
+1.141732, 1.161417, 1.181102, 1.200787, 1.220472, 1.240157, 1.259843,
+1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638,
+1.417323, 1.437008, 1.456693, 1.476378, 1.491142, 1.505906, 1.520669,
+1.535433, 1.560039, 1.584646, 1.609252, 1.633858, 1.658465, 1.683071,
+1.707677, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.820866,
+1.830709, 1.840551, 1.850394, 1.875000, 1.899606, 1.924213, 1.948819,
+1.963583, 1.978346, 1.993110, 2.007874, 2.032480, 2.057087, 2.081693,
+2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.199803, 2.214567,
+2.229331, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
+2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
+0.137795, 0.137795, 0.137795, 0.137795, 0.137795, 0.142717, 0.147638,
+0.152559, 0.157480, 0.177165, 0.196850, 0.216535, 0.236220, 0.255906,
+0.275591, 0.295276, 0.314961, 0.334646, 0.354331, 0.374016, 0.393701,
+0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
+0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291,
+0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.799705,
+0.812008, 0.824311, 0.836614, 0.856299, 0.875984, 0.895669, 0.915354,
+0.942421, 0.969488, 0.996555, 1.023622, 1.035925, 1.048228, 1.060531,
+1.072835, 1.097441, 1.122047, 1.146654, 1.171260, 1.186024, 1.200787,
+1.215551, 1.230315, 1.250000, 1.269685, 1.289370, 1.309055, 1.328740,
+1.348425, 1.368110, 1.387795, 1.412402, 1.437008, 1.461614, 1.486220,
+1.498524, 1.510827, 1.523130, 1.535433, 1.562500, 1.589567, 1.616634,
+1.643701, 1.665846, 1.687992, 1.710138, 1.732283, 1.751969, 1.771654,
+1.791339, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.872539,
+1.894685, 1.916831, 1.938976, 1.956201, 1.973425, 1.990650, 2.007874,
+2.030020, 2.052165, 2.074311, 2.096457, 2.121063, 2.145669, 2.170276,
+2.194882, 2.207185, 2.219488, 2.231791, 2.244095, 2.263780, 2.283465,
+2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260,
+2.440945, 2.460630, 2.480315, 0.157480, 0.157480, 0.157480, 0.157480,
+0.157480, 0.157480, 0.157480, 0.157480, 0.157480, 0.177165, 0.196850,
+0.216535, 0.236220, 0.255906, 0.275591, 0.295276, 0.314961, 0.334646,
+0.354331, 0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441,
+0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236,
+0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031,
+0.767717, 0.787402, 0.797244, 0.807087, 0.816929, 0.826772, 0.846457,
+0.866142, 0.885827, 0.905512, 0.935039, 0.964567, 0.994094, 1.023622,
+1.033465, 1.043307, 1.053150, 1.062992, 1.092520, 1.122047, 1.151575,
+1.181102, 1.190945, 1.200787, 1.210630, 1.220472, 1.240157, 1.259843,
+1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.407480,
+1.437008, 1.466535, 1.496063, 1.505906, 1.515748, 1.525591, 1.535433,
+1.564961, 1.594488, 1.624016, 1.653543, 1.673228, 1.692913, 1.712598,
+1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.820866, 1.830709,
+1.840551, 1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.948819,
+1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
+2.116142, 2.145669, 2.175197, 2.204724, 2.214567, 2.224410, 2.234252,
+2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
+2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 0.177165,
+0.177165, 0.177165, 0.177165, 0.177165, 0.177165, 0.177165, 0.177165,
+0.177165, 0.194390, 0.211614, 0.228839, 0.246063, 0.268209, 0.290354,
+0.312500, 0.334646, 0.354331, 0.374016, 0.393701, 0.413386, 0.433071,
+0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866,
+0.590551, 0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661,
+0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.816929, 0.826772,
+0.836614, 0.846457, 0.868602, 0.890748, 0.912894, 0.935039, 0.962106,
+0.989173, 1.016240, 1.043307, 1.053150, 1.062992, 1.072835, 1.082677,
+1.112205, 1.141732, 1.171260, 1.200787, 1.213091, 1.225394, 1.237697,
+1.250000, 1.269685, 1.289370, 1.309055, 1.328740, 1.345965, 1.363189,
+1.380413, 1.397638, 1.427165, 1.456693, 1.486220, 1.515748, 1.528051,
+1.540354, 1.552657, 1.564961, 1.592028, 1.619094, 1.646161, 1.673228,
+1.692913, 1.712598, 1.732283, 1.751969, 1.769193, 1.786417, 1.803642,
+1.820866, 1.835630, 1.850394, 1.865157, 1.879921, 1.899606, 1.919291,
+1.938976, 1.958661, 1.975886, 1.993110, 2.010335, 2.027559, 2.047244,
+2.066929, 2.086614, 2.106299, 2.133366, 2.160433, 2.187500, 2.214567,
+2.226870, 2.239173, 2.251476, 2.263780, 2.283465, 2.303150, 2.322835,
+2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630,
+2.480315, 2.500000, 0.196850, 0.196850, 0.196850, 0.196850, 0.196850,
+0.196850, 0.196850, 0.196850, 0.196850, 0.211614, 0.226378, 0.241142,
+0.255906, 0.280512, 0.305118, 0.329724, 0.354331, 0.374016, 0.393701,
+0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
+0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291,
+0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087,
+0.826772, 0.836614, 0.846457, 0.856299, 0.866142, 0.890748, 0.915354,
+0.939961, 0.964567, 0.989173, 1.013780, 1.038386, 1.062992, 1.072835,
+1.082677, 1.092520, 1.102362, 1.131890, 1.161417, 1.190945, 1.220472,
+1.235236, 1.250000, 1.264764, 1.279528, 1.299213, 1.318898, 1.338583,
+1.358268, 1.373032, 1.387795, 1.402559, 1.417323, 1.446850, 1.476378,
+1.505906, 1.535433, 1.550197, 1.564961, 1.579724, 1.594488, 1.619094,
+1.643701, 1.668307, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654,
+1.786417, 1.801181, 1.815945, 1.830709, 1.850394, 1.870079, 1.889764,
+1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.002953, 2.017717,
+2.032480, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.150591,
+2.175197, 2.199803, 2.224410, 2.239173, 2.253937, 2.268701, 2.283465,
+2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260,
+2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 0.216535, 0.216535,
+0.216535, 0.216535, 0.216535, 0.216535, 0.216535, 0.216535, 0.216535,
+0.228839, 0.241142, 0.253445, 0.265748, 0.292815, 0.319882, 0.346949,
+0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126,
+0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921,
+0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717,
+0.787402, 0.807087, 0.826772, 0.846457, 0.856299, 0.866142, 0.875984,
+0.885827, 0.912894, 0.939961, 0.967028, 0.994094, 1.016240, 1.038386,
+1.060531, 1.082677, 1.092520, 1.102362, 1.112205, 1.122047, 1.151575,
+1.181102, 1.210630, 1.240157, 1.257382, 1.274606, 1.291831, 1.309055,
+1.328740, 1.348425, 1.368110, 1.387795, 1.400098, 1.412402, 1.424705,
+1.437008, 1.466535, 1.496063, 1.525591, 1.555118, 1.572343, 1.589567,
+1.606791, 1.624016, 1.646161, 1.668307, 1.690453, 1.712598, 1.732283,
+1.751969, 1.771654, 1.791339, 1.803642, 1.815945, 1.828248, 1.840551,
+1.865157, 1.889764, 1.914370, 1.938976, 1.958661, 1.978346, 1.998031,
+2.017717, 2.030020, 2.042323, 2.054626, 2.066929, 2.086614, 2.106299,
+2.125984, 2.145669, 2.167815, 2.189961, 2.212106, 2.234252, 2.251476,
+2.268701, 2.285925, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890,
+2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685,
+2.539370, 0.236220, 0.236220, 0.236220, 0.236220, 0.236220, 0.236220,
+0.236220, 0.236220, 0.236220, 0.246063, 0.255906, 0.265748, 0.275591,
+0.305118, 0.334646, 0.364173, 0.393701, 0.413386, 0.433071, 0.452756,
+0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551,
+0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346,
+0.748031, 0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142,
+0.875984, 0.885827, 0.895669, 0.905512, 0.935039, 0.964567, 0.994094,
+1.023622, 1.043307, 1.062992, 1.082677, 1.102362, 1.112205, 1.122047,
+1.131890, 1.141732, 1.171260, 1.200787, 1.230315, 1.259843, 1.279528,
+1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323,
+1.427165, 1.437008, 1.446850, 1.456693, 1.486220, 1.515748, 1.545276,
+1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
+1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.820866,
+1.830709, 1.840551, 1.850394, 1.879921, 1.909449, 1.938976, 1.968504,
+1.988189, 2.007874, 2.027559, 2.047244, 2.057087, 2.066929, 2.076772,
+2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
+2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
+2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 0.255906, 0.255906, 0.255906,
+0.255906, 0.255906, 0.255906, 0.255906, 0.255906, 0.255906, 0.263287,
+0.270669, 0.278051, 0.285433, 0.312500, 0.339567, 0.366634, 0.393701,
+0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
+0.551181, 0.568406, 0.585630, 0.602854, 0.620079, 0.642224, 0.664370,
+0.686516, 0.708661, 0.725886, 0.743110, 0.760335, 0.777559, 0.799705,
+0.821850, 0.843996, 0.866142, 0.878445, 0.890748, 0.903051, 0.915354,
+0.942421, 0.969488, 0.996555, 1.023622, 1.040846, 1.058071, 1.075295,
+1.092520, 1.107283, 1.122047, 1.136811, 1.151575, 1.176181, 1.200787,
+1.225394, 1.250000, 1.269685, 1.289370, 1.309055, 1.328740, 1.348425,
+1.368110, 1.387795, 1.407480, 1.419783, 1.432087, 1.444390, 1.456693,
+1.486220, 1.515748, 1.545276, 1.574803, 1.592028, 1.609252, 1.626476,
+1.643701, 1.665846, 1.687992, 1.710138, 1.732283, 1.749508, 1.766732,
+1.783957, 1.801181, 1.815945, 1.830709, 1.845472, 1.860236, 1.884843,
+1.909449, 1.934055, 1.958661, 1.978346, 1.998031, 2.017717, 2.037402,
+2.052165, 2.066929, 2.081693, 2.096457, 2.113681, 2.130906, 2.148130,
+2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465,
+2.303150, 2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.428642,
+2.445866, 2.463091, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
+0.275591, 0.275591, 0.275591, 0.275591, 0.275591, 0.275591, 0.275591,
+0.275591, 0.275591, 0.280512, 0.285433, 0.290354, 0.295276, 0.319882,
+0.344488, 0.369094, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441,
+0.492126, 0.511811, 0.531496, 0.551181, 0.565945, 0.580709, 0.595472,
+0.610236, 0.634843, 0.659449, 0.684055, 0.708661, 0.723425, 0.738189,
+0.752953, 0.767717, 0.792323, 0.816929, 0.841535, 0.866142, 0.880906,
+0.895669, 0.910433, 0.925197, 0.949803, 0.974409, 0.999016, 1.023622,
+1.038386, 1.053150, 1.067913, 1.082677, 1.102362, 1.122047, 1.141732,
+1.161417, 1.181102, 1.200787, 1.220472, 1.240157, 1.259843, 1.279528,
+1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.412402,
+1.427165, 1.441929, 1.456693, 1.486220, 1.515748, 1.545276, 1.574803,
+1.589567, 1.604331, 1.619094, 1.633858, 1.658465, 1.683071, 1.707677,
+1.732283, 1.747047, 1.761811, 1.776575, 1.791339, 1.811024, 1.830709,
+1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.948819, 1.968504,
+1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299,
+2.121063, 2.135827, 2.150591, 2.165354, 2.185039, 2.204724, 2.224410,
+2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.347441, 2.372047,
+2.396654, 2.421260, 2.436024, 2.450787, 2.465551, 2.480315, 2.500000,
+2.519685, 2.539370, 2.559055, 0.295276, 0.295276, 0.295276, 0.295276,
+0.295276, 0.295276, 0.295276, 0.295276, 0.295276, 0.297736, 0.300197,
+0.302657, 0.305118, 0.327264, 0.349409, 0.371555, 0.393701, 0.413386,
+0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181,
+0.563484, 0.575787, 0.588091, 0.600394, 0.627461, 0.654528, 0.681595,
+0.708661, 0.720965, 0.733268, 0.745571, 0.757874, 0.784941, 0.812008,
+0.839075, 0.866142, 0.883366, 0.900591, 0.917815, 0.935039, 0.957185,
+0.979331, 1.001476, 1.023622, 1.035925, 1.048228, 1.060531, 1.072835,
+1.097441, 1.122047, 1.146654, 1.171260, 1.186024, 1.200787, 1.215551,
+1.230315, 1.250000, 1.269685, 1.289370, 1.309055, 1.328740, 1.348425,
+1.368110, 1.387795, 1.405020, 1.422244, 1.439469, 1.456693, 1.486220,
+1.515748, 1.545276, 1.574803, 1.587106, 1.599409, 1.611713, 1.624016,
+1.651083, 1.678150, 1.705217, 1.732283, 1.744587, 1.756890, 1.769193,
+1.781496, 1.806102, 1.830709, 1.855315, 1.879921, 1.894685, 1.909449,
+1.924213, 1.938976, 1.958661, 1.978346, 1.998031, 2.017717, 2.042323,
+2.066929, 2.091536, 2.116142, 2.128445, 2.140748, 2.153051, 2.165354,
+2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
+2.322835, 2.349902, 2.376969, 2.404035, 2.431102, 2.443406, 2.455709,
+2.468012, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 0.314961,
+0.314961, 0.314961, 0.314961, 0.314961, 0.314961, 0.314961, 0.314961,
+0.314961, 0.314961, 0.314961, 0.314961, 0.314961, 0.334646, 0.354331,
+0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126,
+0.511811, 0.531496, 0.551181, 0.561024, 0.570866, 0.580709, 0.590551,
+0.620079, 0.649606, 0.679134, 0.708661, 0.718504, 0.728346, 0.738189,
+0.748031, 0.777559, 0.807087, 0.836614, 0.866142, 0.885827, 0.905512,
+0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.033465,
+1.043307, 1.053150, 1.062992, 1.092520, 1.122047, 1.151575, 1.181102,
+1.190945, 1.200787, 1.210630, 1.220472, 1.240157, 1.259843, 1.279528,
+1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323,
+1.437008, 1.456693, 1.486220, 1.515748, 1.545276, 1.574803, 1.584646,
+1.594488, 1.604331, 1.614173, 1.643701, 1.673228, 1.702756, 1.732283,
+1.742126, 1.751969, 1.761811, 1.771654, 1.801181, 1.830709, 1.860236,
+1.889764, 1.899606, 1.909449, 1.919291, 1.929134, 1.948819, 1.968504,
+1.988189, 2.007874, 2.037402, 2.066929, 2.096457, 2.125984, 2.135827,
+2.145669, 2.155512, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
+2.263780, 2.283465, 2.303150, 2.322835, 2.352362, 2.381890, 2.411417,
+2.440945, 2.450787, 2.460630, 2.470472, 2.480315, 2.500000, 2.519685,
+2.539370, 2.559055, 0.334646, 0.334646, 0.334646, 0.334646, 0.334646,
+0.334646, 0.334646, 0.334646, 0.334646, 0.334646, 0.334646, 0.334646,
+0.334646, 0.349409, 0.364173, 0.378937, 0.393701, 0.413386, 0.433071,
+0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.563484,
+0.575787, 0.588091, 0.600394, 0.627461, 0.654528, 0.681595, 0.708661,
+0.720965, 0.733268, 0.745571, 0.757874, 0.784941, 0.812008, 0.839075,
+0.866142, 0.883366, 0.900591, 0.917815, 0.935039, 0.957185, 0.979331,
+1.001476, 1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.092520,
+1.122047, 1.151575, 1.181102, 1.193406, 1.205709, 1.218012, 1.230315,
+1.250000, 1.269685, 1.289370, 1.309055, 1.326280, 1.343504, 1.360728,
+1.377953, 1.400098, 1.422244, 1.444390, 1.466535, 1.493602, 1.520669,
+1.547736, 1.574803, 1.587106, 1.599409, 1.611713, 1.624016, 1.651083,
+1.678150, 1.705217, 1.732283, 1.744587, 1.756890, 1.769193, 1.781496,
+1.806102, 1.830709, 1.855315, 1.879921, 1.892224, 1.904528, 1.916831,
+1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.034941, 2.062008,
+2.089075, 2.116142, 2.128445, 2.140748, 2.153051, 2.165354, 2.187500,
+2.209646, 2.231791, 2.253937, 2.271161, 2.288386, 2.305610, 2.322835,
+2.352362, 2.381890, 2.411417, 2.440945, 2.450787, 2.460630, 2.470472,
+2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 0.354331, 0.354331,
+0.354331, 0.354331, 0.354331, 0.354331, 0.354331, 0.354331, 0.354331,
+0.354331, 0.354331, 0.354331, 0.354331, 0.364173, 0.374016, 0.383858,
+0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811,
+0.531496, 0.551181, 0.565945, 0.580709, 0.595472, 0.610236, 0.634843,
+0.659449, 0.684055, 0.708661, 0.723425, 0.738189, 0.752953, 0.767717,
+0.792323, 0.816929, 0.841535, 0.866142, 0.880906, 0.895669, 0.910433,
+0.925197, 0.949803, 0.974409, 0.999016, 1.023622, 1.033465, 1.043307,
+1.053150, 1.062992, 1.092520, 1.122047, 1.151575, 1.181102, 1.195866,
+1.210630, 1.225394, 1.240157, 1.259843, 1.279528, 1.299213, 1.318898,
+1.333661, 1.348425, 1.363189, 1.377953, 1.402559, 1.427165, 1.451772,
+1.476378, 1.500984, 1.525591, 1.550197, 1.574803, 1.589567, 1.604331,
+1.619094, 1.633858, 1.658465, 1.683071, 1.707677, 1.732283, 1.747047,
+1.761811, 1.776575, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079,
+1.884843, 1.899606, 1.914370, 1.929134, 1.948819, 1.968504, 1.988189,
+2.007874, 2.032480, 2.057087, 2.081693, 2.106299, 2.121063, 2.135827,
+2.150591, 2.165354, 2.189961, 2.214567, 2.239173, 2.263780, 2.278543,
+2.293307, 2.308071, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945,
+2.450787, 2.460630, 2.470472, 2.480315, 2.500000, 2.519685, 2.539370,
+2.559055, 0.374016, 0.374016, 0.374016, 0.374016, 0.374016, 0.374016,
+0.374016, 0.374016, 0.374016, 0.374016, 0.374016, 0.374016, 0.374016,
+0.378937, 0.383858, 0.388780, 0.393701, 0.413386, 0.433071, 0.452756,
+0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.568406, 0.585630,
+0.602854, 0.620079, 0.642224, 0.664370, 0.686516, 0.708661, 0.725886,
+0.743110, 0.760335, 0.777559, 0.799705, 0.821850, 0.843996, 0.866142,
+0.878445, 0.890748, 0.903051, 0.915354, 0.942421, 0.969488, 0.996555,
+1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.092520, 1.122047,
+1.151575, 1.181102, 1.198327, 1.215551, 1.232776, 1.250000, 1.269685,
+1.289370, 1.309055, 1.328740, 1.341043, 1.353346, 1.365650, 1.377953,
+1.405020, 1.432087, 1.459154, 1.486220, 1.508366, 1.530512, 1.552657,
+1.574803, 1.592028, 1.609252, 1.626476, 1.643701, 1.665846, 1.687992,
+1.710138, 1.732283, 1.749508, 1.766732, 1.783957, 1.801181, 1.815945,
+1.830709, 1.845472, 1.860236, 1.877461, 1.894685, 1.911909, 1.929134,
+1.948819, 1.968504, 1.988189, 2.007874, 2.030020, 2.052165, 2.074311,
+2.096457, 2.113681, 2.130906, 2.148130, 2.165354, 2.192421, 2.219488,
+2.246555, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.352362,
+2.381890, 2.411417, 2.440945, 2.450787, 2.460630, 2.470472, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 0.393701, 0.393701, 0.393701,
+0.393701, 0.393701, 0.393701, 0.393701, 0.393701, 0.393701, 0.393701,
+0.393701, 0.393701, 0.393701, 0.393701, 0.393701, 0.393701, 0.393701,
+0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
+0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291,
+0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087,
+0.826772, 0.846457, 0.866142, 0.875984, 0.885827, 0.895669, 0.905512,
+0.935039, 0.964567, 0.994094, 1.023622, 1.033465, 1.043307, 1.053150,
+1.062992, 1.092520, 1.122047, 1.151575, 1.181102, 1.200787, 1.220472,
+1.240157, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.348425,
+1.358268, 1.368110, 1.377953, 1.407480, 1.437008, 1.466535, 1.496063,
+1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858,
+1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654,
+1.791339, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.870079,
+1.889764, 1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874,
+2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
+2.165354, 2.194882, 2.224410, 2.253937, 2.283465, 2.293307, 2.303150,
+2.312992, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945, 2.450787,
+2.460630, 2.470472, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
+0.413386, 0.410925, 0.408465, 0.406004, 0.403543, 0.406004, 0.408465,
+0.410925, 0.413386, 0.413386, 0.413386, 0.413386, 0.413386, 0.413386,
+0.413386, 0.413386, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126,
+0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921,
+0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717,
+0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827, 0.895669,
+0.905512, 0.915354, 0.925197, 0.954724, 0.984252, 1.013780, 1.043307,
+1.053150, 1.062992, 1.072835, 1.082677, 1.109744, 1.136811, 1.163878,
+1.190945, 1.213091, 1.235236, 1.257382, 1.279528, 1.296752, 1.313976,
+1.331201, 1.348425, 1.363189, 1.377953, 1.392717, 1.407480, 1.432087,
+1.456693, 1.481299, 1.505906, 1.528051, 1.550197, 1.572343, 1.594488,
+1.614173, 1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283,
+1.751969, 1.771654, 1.791339, 1.811024, 1.830709, 1.843012, 1.855315,
+1.867618, 1.879921, 1.897146, 1.914370, 1.931594, 1.948819, 1.968504,
+1.988189, 2.007874, 2.027559, 2.049705, 2.071851, 2.093996, 2.116142,
+2.133366, 2.150591, 2.167815, 2.185039, 2.212106, 2.239173, 2.266240,
+2.293307, 2.305610, 2.317913, 2.330217, 2.342520, 2.369587, 2.396654,
+2.423720, 2.450787, 2.465551, 2.480315, 2.495079, 2.509843, 2.529528,
+2.549213, 2.568898, 2.588583, 0.433071, 0.428150, 0.423228, 0.418307,
+0.413386, 0.418307, 0.423228, 0.428150, 0.433071, 0.433071, 0.433071,
+0.433071, 0.433071, 0.433071, 0.433071, 0.433071, 0.433071, 0.452756,
+0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551,
+0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346,
+0.748031, 0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142,
+0.885827, 0.905512, 0.915354, 0.925197, 0.935039, 0.944882, 0.974409,
+1.003937, 1.033465, 1.062992, 1.072835, 1.082677, 1.092520, 1.102362,
+1.126969, 1.151575, 1.176181, 1.200787, 1.225394, 1.250000, 1.274606,
+1.299213, 1.313976, 1.328740, 1.343504, 1.358268, 1.377953, 1.397638,
+1.417323, 1.437008, 1.456693, 1.476378, 1.496063, 1.515748, 1.540354,
+1.564961, 1.589567, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
+1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.830709,
+1.850394, 1.865157, 1.879921, 1.894685, 1.909449, 1.924213, 1.938976,
+1.953740, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.071851,
+2.096457, 2.121063, 2.145669, 2.160433, 2.175197, 2.189961, 2.204724,
+2.229331, 2.253937, 2.278543, 2.303150, 2.317913, 2.332677, 2.347441,
+2.362205, 2.386811, 2.411417, 2.436024, 2.460630, 2.480315, 2.500000,
+2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 0.452756,
+0.445374, 0.437992, 0.430610, 0.423228, 0.430610, 0.437992, 0.445374,
+0.452756, 0.452756, 0.452756, 0.452756, 0.452756, 0.452756, 0.452756,
+0.452756, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181,
+0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291, 0.688976,
+0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.826772,
+0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.935039, 0.944882,
+0.954724, 0.964567, 0.994094, 1.023622, 1.053150, 1.082677, 1.092520,
+1.102362, 1.112205, 1.122047, 1.144193, 1.166339, 1.188484, 1.210630,
+1.237697, 1.264764, 1.291831, 1.318898, 1.331201, 1.343504, 1.355807,
+1.368110, 1.392717, 1.417323, 1.441929, 1.466535, 1.481299, 1.496063,
+1.510827, 1.525591, 1.552657, 1.579724, 1.606791, 1.633858, 1.653543,
+1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339,
+1.811024, 1.830709, 1.850394, 1.870079, 1.887303, 1.904528, 1.921752,
+1.938976, 1.951280, 1.963583, 1.975886, 1.988189, 2.007874, 2.027559,
+2.047244, 2.066929, 2.093996, 2.121063, 2.148130, 2.175197, 2.187500,
+2.199803, 2.212106, 2.224410, 2.246555, 2.268701, 2.290847, 2.312992,
+2.330217, 2.347441, 2.364665, 2.381890, 2.404035, 2.426181, 2.448327,
+2.470472, 2.495079, 2.519685, 2.544291, 2.568898, 2.588583, 2.608268,
+2.627953, 2.647638, 0.472441, 0.462598, 0.452756, 0.442913, 0.433071,
+0.442913, 0.452756, 0.462598, 0.472441, 0.472441, 0.472441, 0.472441,
+0.472441, 0.472441, 0.472441, 0.472441, 0.472441, 0.492126, 0.511811,
+0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606,
+0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402,
+0.807087, 0.826772, 0.846457, 0.866142, 0.885827, 0.905512, 0.925197,
+0.944882, 0.954724, 0.964567, 0.974409, 0.984252, 1.013780, 1.043307,
+1.072835, 1.102362, 1.112205, 1.122047, 1.131890, 1.141732, 1.161417,
+1.181102, 1.200787, 1.220472, 1.250000, 1.279528, 1.309055, 1.338583,
+1.348425, 1.358268, 1.368110, 1.377953, 1.407480, 1.437008, 1.466535,
+1.496063, 1.505906, 1.515748, 1.525591, 1.535433, 1.564961, 1.594488,
+1.624016, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969,
+1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764,
+1.909449, 1.929134, 1.948819, 1.968504, 1.978346, 1.988189, 1.998031,
+2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.116142, 2.145669,
+2.175197, 2.204724, 2.214567, 2.224410, 2.234252, 2.244095, 2.263780,
+2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575,
+2.421260, 2.440945, 2.460630, 2.480315, 2.509843, 2.539370, 2.568898,
+2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 0.492126, 0.484744,
+0.477362, 0.469980, 0.462598, 0.469980, 0.477362, 0.484744, 0.492126,
+0.489665, 0.487205, 0.484744, 0.482283, 0.484744, 0.487205, 0.489665,
+0.492126, 0.506890, 0.521654, 0.536417, 0.551181, 0.568406, 0.585630,
+0.602854, 0.620079, 0.642224, 0.664370, 0.686516, 0.708661, 0.728346,
+0.748031, 0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142,
+0.885827, 0.905512, 0.925197, 0.944882, 0.957185, 0.969488, 0.981791,
+0.994094, 1.021161, 1.048228, 1.075295, 1.102362, 1.114665, 1.126969,
+1.139272, 1.151575, 1.171260, 1.190945, 1.210630, 1.230315, 1.257382,
+1.284449, 1.311516, 1.338583, 1.348425, 1.358268, 1.368110, 1.377953,
+1.405020, 1.432087, 1.459154, 1.486220, 1.500984, 1.515748, 1.530512,
+1.545276, 1.569882, 1.594488, 1.619094, 1.643701, 1.663386, 1.683071,
+1.702756, 1.722441, 1.742126, 1.761811, 1.781496, 1.801181, 1.820866,
+1.840551, 1.860236, 1.879921, 1.899606, 1.919291, 1.938976, 1.958661,
+1.973425, 1.988189, 2.002953, 2.017717, 2.037402, 2.057087, 2.076772,
+2.096457, 2.121063, 2.145669, 2.170276, 2.194882, 2.209646, 2.224410,
+2.239173, 2.253937, 2.273622, 2.293307, 2.312992, 2.332677, 2.349902,
+2.367126, 2.384350, 2.401575, 2.423720, 2.445866, 2.468012, 2.490158,
+2.514764, 2.539370, 2.563976, 2.588583, 2.610729, 2.632874, 2.655020,
+2.677166, 0.511811, 0.506890, 0.501969, 0.497047, 0.492126, 0.497047,
+0.501969, 0.506890, 0.511811, 0.506890, 0.501969, 0.497047, 0.492126,
+0.497047, 0.501969, 0.506890, 0.511811, 0.521654, 0.531496, 0.541339,
+0.551181, 0.565945, 0.580709, 0.595472, 0.610236, 0.634843, 0.659449,
+0.684055, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087,
+0.826772, 0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.944882,
+0.959646, 0.974409, 0.989173, 1.003937, 1.028543, 1.053150, 1.077756,
+1.102362, 1.117126, 1.131890, 1.146654, 1.161417, 1.181102, 1.200787,
+1.220472, 1.240157, 1.264764, 1.289370, 1.313976, 1.338583, 1.348425,
+1.358268, 1.368110, 1.377953, 1.402559, 1.427165, 1.451772, 1.476378,
+1.496063, 1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173,
+1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969,
+1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764,
+1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559,
+2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354,
+2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
+2.322835, 2.342520, 2.357284, 2.372047, 2.386811, 2.401575, 2.426181,
+2.450787, 2.475394, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
+2.603347, 2.627953, 2.652559, 2.677166, 0.531496, 0.529035, 0.526575,
+0.524114, 0.521654, 0.524114, 0.526575, 0.529035, 0.531496, 0.524114,
+0.516732, 0.509350, 0.501969, 0.509350, 0.516732, 0.524114, 0.531496,
+0.536417, 0.541339, 0.546260, 0.551181, 0.563484, 0.575787, 0.588091,
+0.600394, 0.627461, 0.654528, 0.681595, 0.708661, 0.728346, 0.748031,
+0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827,
+0.905512, 0.925197, 0.944882, 0.962106, 0.979331, 0.996555, 1.013780,
+1.035925, 1.058071, 1.080217, 1.102362, 1.119587, 1.136811, 1.154035,
+1.171260, 1.190945, 1.210630, 1.230315, 1.250000, 1.272146, 1.294291,
+1.316437, 1.338583, 1.348425, 1.358268, 1.368110, 1.377953, 1.400098,
+1.422244, 1.444390, 1.466535, 1.491142, 1.515748, 1.540354, 1.564961,
+1.579724, 1.594488, 1.609252, 1.624016, 1.643701, 1.663386, 1.683071,
+1.702756, 1.722441, 1.742126, 1.761811, 1.781496, 1.801181, 1.820866,
+1.840551, 1.860236, 1.879921, 1.899606, 1.919291, 1.938976, 1.963583,
+1.988189, 2.012795, 2.037402, 2.057087, 2.076772, 2.096457, 2.116142,
+2.130906, 2.145669, 2.160433, 2.175197, 2.199803, 2.224410, 2.249016,
+2.273622, 2.293307, 2.312992, 2.332677, 2.352362, 2.364665, 2.376969,
+2.389272, 2.401575, 2.428642, 2.455709, 2.482776, 2.509843, 2.524606,
+2.539370, 2.554134, 2.568898, 2.595965, 2.623032, 2.650099, 2.677166,
+0.551181, 0.551181, 0.551181, 0.551181, 0.551181, 0.551181, 0.551181,
+0.551181, 0.551181, 0.541339, 0.531496, 0.521654, 0.511811, 0.521654,
+0.531496, 0.541339, 0.551181, 0.551181, 0.551181, 0.551181, 0.551181,
+0.561024, 0.570866, 0.580709, 0.590551, 0.620079, 0.649606, 0.679134,
+0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.826772,
+0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567,
+0.984252, 1.003937, 1.023622, 1.043307, 1.062992, 1.082677, 1.102362,
+1.122047, 1.141732, 1.161417, 1.181102, 1.200787, 1.220472, 1.240157,
+1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.348425, 1.358268,
+1.368110, 1.377953, 1.397638, 1.417323, 1.437008, 1.456693, 1.486220,
+1.515748, 1.545276, 1.574803, 1.584646, 1.594488, 1.604331, 1.614173,
+1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969,
+1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764,
+1.909449, 1.929134, 1.958661, 1.988189, 2.017717, 2.047244, 2.066929,
+2.086614, 2.106299, 2.125984, 2.135827, 2.145669, 2.155512, 2.165354,
+2.194882, 2.224410, 2.253937, 2.283465, 2.303150, 2.322835, 2.342520,
+2.362205, 2.372047, 2.381890, 2.391732, 2.401575, 2.431102, 2.460630,
+2.490157, 2.519685, 2.529528, 2.539370, 2.549213, 2.559055, 2.588583,
+2.618110, 2.647638, 2.677166, 0.570866, 0.570866, 0.570866, 0.570866,
+0.570866, 0.570866, 0.570866, 0.570866, 0.570866, 0.563484, 0.556102,
+0.548720, 0.541339, 0.548720, 0.556102, 0.563484, 0.570866, 0.570866,
+0.570866, 0.570866, 0.570866, 0.578248, 0.585630, 0.593012, 0.600394,
+0.627461, 0.654528, 0.681595, 0.708661, 0.725886, 0.743110, 0.760335,
+0.777559, 0.799705, 0.821850, 0.843996, 0.866142, 0.885827, 0.905512,
+0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.043307,
+1.062992, 1.082677, 1.102362, 1.122047, 1.141732, 1.161417, 1.181102,
+1.198327, 1.215551, 1.232776, 1.250000, 1.269685, 1.289370, 1.309055,
+1.328740, 1.343504, 1.358268, 1.373032, 1.387795, 1.405020, 1.422244,
+1.439469, 1.456693, 1.483760, 1.510827, 1.537894, 1.564961, 1.579724,
+1.594488, 1.609252, 1.624016, 1.641240, 1.658465, 1.675689, 1.692913,
+1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.830709,
+1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.956201, 1.983268,
+2.010335, 2.037402, 2.057087, 2.076772, 2.096457, 2.116142, 2.128445,
+2.140748, 2.153051, 2.165354, 2.194882, 2.224410, 2.253937, 2.283465,
+2.303150, 2.322835, 2.342520, 2.362205, 2.372047, 2.381890, 2.391732,
+2.401575, 2.428642, 2.455709, 2.482776, 2.509843, 2.522146, 2.534449,
+2.546752, 2.559055, 2.588583, 2.618110, 2.647638, 2.677166, 0.590551,
+0.590551, 0.590551, 0.590551, 0.590551, 0.590551, 0.590551, 0.590551,
+0.590551, 0.585630, 0.580709, 0.575787, 0.570866, 0.575787, 0.580709,
+0.585630, 0.590551, 0.590551, 0.590551, 0.590551, 0.590551, 0.595472,
+0.600394, 0.605315, 0.610236, 0.634843, 0.659449, 0.684055, 0.708661,
+0.723425, 0.738189, 0.752953, 0.767717, 0.792323, 0.816929, 0.841535,
+0.866142, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567, 0.984252,
+1.003937, 1.023622, 1.043307, 1.062992, 1.082677, 1.102362, 1.122047,
+1.141732, 1.161417, 1.181102, 1.195866, 1.210630, 1.225394, 1.240157,
+1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953,
+1.397638, 1.412402, 1.427165, 1.441929, 1.456693, 1.481299, 1.505906,
+1.530512, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.648622,
+1.663386, 1.678150, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654,
+1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764, 1.909449,
+1.929134, 1.953740, 1.978346, 2.002953, 2.027559, 2.047244, 2.066929,
+2.086614, 2.106299, 2.121063, 2.135827, 2.150591, 2.165354, 2.194882,
+2.224410, 2.253937, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
+2.372047, 2.381890, 2.391732, 2.401575, 2.426181, 2.450787, 2.475394,
+2.500000, 2.514764, 2.529528, 2.544291, 2.559055, 2.588583, 2.618110,
+2.647638, 2.677166, 0.610236, 0.610236, 0.610236, 0.610236, 0.610236,
+0.610236, 0.610236, 0.610236, 0.610236, 0.607776, 0.605315, 0.602854,
+0.600394, 0.602854, 0.605315, 0.607776, 0.610236, 0.610236, 0.610236,
+0.610236, 0.610236, 0.612697, 0.615157, 0.617618, 0.620079, 0.642224,
+0.664370, 0.686516, 0.708661, 0.720965, 0.733268, 0.745571, 0.757874,
+0.784941, 0.812008, 0.839075, 0.866142, 0.885827, 0.905512, 0.925197,
+0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.043307, 1.062992,
+1.082677, 1.102362, 1.122047, 1.141732, 1.161417, 1.181102, 1.193406,
+1.205709, 1.218012, 1.230315, 1.250000, 1.269685, 1.289370, 1.309055,
+1.333661, 1.358268, 1.382874, 1.407480, 1.419783, 1.432087, 1.444390,
+1.456693, 1.478839, 1.500984, 1.523130, 1.545276, 1.569882, 1.594488,
+1.619094, 1.643701, 1.656004, 1.668307, 1.680610, 1.692913, 1.712598,
+1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.830709, 1.850394,
+1.870079, 1.889764, 1.909449, 1.929134, 1.951280, 1.973425, 1.995571,
+2.017717, 2.037402, 2.057087, 2.076772, 2.096457, 2.113681, 2.130906,
+2.148130, 2.165354, 2.194882, 2.224410, 2.253937, 2.283465, 2.303150,
+2.322835, 2.342520, 2.362205, 2.372047, 2.381890, 2.391732, 2.401575,
+2.423720, 2.445866, 2.468012, 2.490158, 2.507382, 2.524606, 2.541831,
+2.559055, 2.588583, 2.618110, 2.647638, 2.677166, 0.629921, 0.629921,
+0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921,
+0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921,
+0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921,
+0.629921, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.718504,
+0.728346, 0.738189, 0.748031, 0.777559, 0.807087, 0.836614, 0.866142,
+0.885827, 0.905512, 0.925197, 0.944882, 0.964567, 0.984252, 1.003937,
+1.023622, 1.043307, 1.062992, 1.082677, 1.102362, 1.122047, 1.141732,
+1.161417, 1.181102, 1.190945, 1.200787, 1.210630, 1.220472, 1.240157,
+1.259843, 1.279528, 1.299213, 1.328740, 1.358268, 1.387795, 1.417323,
+1.427165, 1.437008, 1.446850, 1.456693, 1.476378, 1.496063, 1.515748,
+1.535433, 1.564961, 1.594488, 1.624016, 1.653543, 1.663386, 1.673228,
+1.683071, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339,
+1.811024, 1.830709, 1.850394, 1.870079, 1.889764, 1.909449, 1.929134,
+1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.066929,
+2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.194882, 2.224410,
+2.253937, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.372047,
+2.381890, 2.391732, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110, 2.647638,
+2.677166, 0.649606, 0.649606, 0.649606, 0.649606, 0.649606, 0.649606,
+0.649606, 0.649606, 0.649606, 0.647146, 0.644685, 0.642224, 0.639764,
+0.642224, 0.644685, 0.647146, 0.649606, 0.647146, 0.644685, 0.642224,
+0.639764, 0.639764, 0.639764, 0.639764, 0.639764, 0.661909, 0.684055,
+0.706201, 0.728346, 0.740650, 0.752953, 0.765256, 0.777559, 0.802165,
+0.826772, 0.851378, 0.875984, 0.898130, 0.920276, 0.942421, 0.964567,
+0.981791, 0.999016, 1.016240, 1.033465, 1.053150, 1.072835, 1.092520,
+1.112205, 1.134350, 1.156496, 1.178642, 1.200787, 1.213091, 1.225394,
+1.237697, 1.250000, 1.267224, 1.284449, 1.301673, 1.318898, 1.345965,
+1.373032, 1.400098, 1.427165, 1.439469, 1.451772, 1.464075, 1.476378,
+1.496063, 1.515748, 1.535433, 1.555118, 1.584646, 1.614173, 1.643701,
+1.673228, 1.685531, 1.697835, 1.710138, 1.722441, 1.739665, 1.756890,
+1.774114, 1.791339, 1.813484, 1.835630, 1.857776, 1.879921, 1.899606,
+1.919291, 1.938976, 1.958661, 1.975886, 1.993110, 2.010335, 2.027559,
+2.049705, 2.071851, 2.093996, 2.116142, 2.133366, 2.150591, 2.167815,
+2.185039, 2.212106, 2.239173, 2.266240, 2.293307, 2.315453, 2.337598,
+2.359744, 2.381890, 2.391732, 2.401575, 2.411417, 2.421260, 2.440945,
+2.460630, 2.480315, 2.500000, 2.522146, 2.544291, 2.566437, 2.588583,
+2.613189, 2.637795, 2.662402, 2.687008, 0.669291, 0.669291, 0.669291,
+0.669291, 0.669291, 0.669291, 0.669291, 0.669291, 0.669291, 0.664370,
+0.659449, 0.654528, 0.649606, 0.654528, 0.659449, 0.664370, 0.669291,
+0.664370, 0.659449, 0.654528, 0.649606, 0.649606, 0.649606, 0.649606,
+0.649606, 0.674213, 0.698819, 0.723425, 0.748031, 0.762795, 0.777559,
+0.792323, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827, 0.910433,
+0.935039, 0.959646, 0.984252, 0.999016, 1.013780, 1.028543, 1.043307,
+1.062992, 1.082677, 1.102362, 1.122047, 1.146654, 1.171260, 1.195866,
+1.220472, 1.235236, 1.250000, 1.264764, 1.279528, 1.294291, 1.309055,
+1.323819, 1.338583, 1.363189, 1.387795, 1.412402, 1.437008, 1.451772,
+1.466535, 1.481299, 1.496063, 1.515748, 1.535433, 1.555118, 1.574803,
+1.604331, 1.633858, 1.663386, 1.692913, 1.707677, 1.722441, 1.737205,
+1.751969, 1.766732, 1.781496, 1.796260, 1.811024, 1.835630, 1.860236,
+1.884843, 1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.002953,
+2.017717, 2.032480, 2.047244, 2.071851, 2.096457, 2.121063, 2.145669,
+2.160433, 2.175197, 2.189961, 2.204724, 2.229331, 2.253937, 2.278543,
+2.303150, 2.327756, 2.352362, 2.376969, 2.401575, 2.411417, 2.421260,
+2.431102, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.544291,
+2.568898, 2.593504, 2.618110, 2.637795, 2.657480, 2.677165, 2.696851,
+0.688976, 0.688976, 0.688976, 0.688976, 0.688976, 0.688976, 0.688976,
+0.688976, 0.688976, 0.681595, 0.674213, 0.666831, 0.659449, 0.666831,
+0.674213, 0.681595, 0.688976, 0.681595, 0.674213, 0.666831, 0.659449,
+0.659449, 0.659449, 0.659449, 0.659449, 0.686516, 0.713583, 0.740650,
+0.767717, 0.784941, 0.802165, 0.819390, 0.836614, 0.851378, 0.866142,
+0.880906, 0.895669, 0.922736, 0.949803, 0.976870, 1.003937, 1.016240,
+1.028543, 1.040846, 1.053150, 1.072835, 1.092520, 1.112205, 1.131890,
+1.158957, 1.186024, 1.213091, 1.240157, 1.257382, 1.274606, 1.291831,
+1.309055, 1.321358, 1.333661, 1.345965, 1.358268, 1.380413, 1.402559,
+1.424705, 1.446850, 1.464075, 1.481299, 1.498524, 1.515748, 1.535433,
+1.555118, 1.574803, 1.594488, 1.624016, 1.653543, 1.683071, 1.712598,
+1.729823, 1.747047, 1.764272, 1.781496, 1.793799, 1.806102, 1.818406,
+1.830709, 1.857776, 1.884843, 1.911909, 1.938976, 1.958661, 1.978346,
+1.998031, 2.017717, 2.030020, 2.042323, 2.054626, 2.066929, 2.093996,
+2.121063, 2.148130, 2.175197, 2.187500, 2.199803, 2.212106, 2.224410,
+2.246555, 2.268701, 2.290847, 2.312992, 2.340059, 2.367126, 2.394193,
+2.421260, 2.431102, 2.440945, 2.450787, 2.460630, 2.480315, 2.500000,
+2.519685, 2.539370, 2.566437, 2.593504, 2.620571, 2.647638, 2.662402,
+2.677166, 2.691929, 2.706693, 0.708661, 0.708661, 0.708661, 0.708661,
+0.708661, 0.708661, 0.708661, 0.708661, 0.708661, 0.698819, 0.688976,
+0.679134, 0.669291, 0.679134, 0.688976, 0.698819, 0.708661, 0.698819,
+0.688976, 0.679134, 0.669291, 0.669291, 0.669291, 0.669291, 0.669291,
+0.698819, 0.728346, 0.757874, 0.787402, 0.807087, 0.826772, 0.846457,
+0.866142, 0.875984, 0.885827, 0.895669, 0.905512, 0.935039, 0.964567,
+0.994094, 1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.082677,
+1.102362, 1.122047, 1.141732, 1.171260, 1.200787, 1.230315, 1.259843,
+1.279528, 1.299213, 1.318898, 1.338583, 1.348425, 1.358268, 1.368110,
+1.377953, 1.397638, 1.417323, 1.437008, 1.456693, 1.476378, 1.496063,
+1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.643701,
+1.673228, 1.702756, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024,
+1.820866, 1.830709, 1.840551, 1.850394, 1.879921, 1.909449, 1.938976,
+1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.057087, 2.066929,
+2.076772, 2.086614, 2.116142, 2.145669, 2.175197, 2.204724, 2.214567,
+2.224410, 2.234252, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
+2.352362, 2.381890, 2.411417, 2.440945, 2.450787, 2.460630, 2.470472,
+2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110,
+2.647638, 2.677166, 2.687008, 2.696851, 2.706693, 2.716536, 0.728346,
+0.728346, 0.728346, 0.728346, 0.728346, 0.728346, 0.728346, 0.728346,
+0.728346, 0.720965, 0.713583, 0.706201, 0.698819, 0.706201, 0.713583,
+0.720965, 0.728346, 0.720965, 0.713583, 0.706201, 0.698819, 0.698819,
+0.698819, 0.698819, 0.698819, 0.720965, 0.743110, 0.765256, 0.787402,
+0.807087, 0.826772, 0.846457, 0.866142, 0.878445, 0.890748, 0.903051,
+0.915354, 0.942421, 0.969488, 0.996555, 1.023622, 1.033465, 1.043307,
+1.053150, 1.062992, 1.085138, 1.107283, 1.129429, 1.151575, 1.178642,
+1.205709, 1.232776, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583,
+1.350886, 1.363189, 1.375492, 1.387795, 1.405020, 1.422244, 1.439469,
+1.456693, 1.478839, 1.500984, 1.523130, 1.545276, 1.564961, 1.584646,
+1.604331, 1.624016, 1.648622, 1.673228, 1.697835, 1.722441, 1.744587,
+1.766732, 1.788878, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394,
+1.877461, 1.904528, 1.931594, 1.958661, 1.980807, 2.002953, 2.025099,
+2.047244, 2.059547, 2.071851, 2.084154, 2.096457, 2.121063, 2.145669,
+2.170276, 2.194882, 2.209646, 2.224410, 2.239173, 2.253937, 2.271161,
+2.288386, 2.305610, 2.322835, 2.349902, 2.376969, 2.404035, 2.431102,
+2.443406, 2.455709, 2.468012, 2.480315, 2.500000, 2.519685, 2.539370,
+2.559055, 2.586122, 2.613189, 2.640256, 2.667323, 2.679626, 2.691929,
+2.704232, 2.716536, 0.748031, 0.748031, 0.748031, 0.748031, 0.748031,
+0.748031, 0.748031, 0.748031, 0.748031, 0.743110, 0.738189, 0.733268,
+0.728346, 0.733268, 0.738189, 0.743110, 0.748031, 0.743110, 0.738189,
+0.733268, 0.728346, 0.728346, 0.728346, 0.728346, 0.728346, 0.743110,
+0.757874, 0.772638, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142,
+0.880906, 0.895669, 0.910433, 0.925197, 0.949803, 0.974409, 0.999016,
+1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.087598, 1.112205,
+1.136811, 1.161417, 1.186024, 1.210630, 1.235236, 1.259843, 1.279528,
+1.299213, 1.318898, 1.338583, 1.353346, 1.368110, 1.382874, 1.397638,
+1.412402, 1.427165, 1.441929, 1.456693, 1.481299, 1.505906, 1.530512,
+1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228,
+1.692913, 1.712598, 1.737205, 1.761811, 1.786417, 1.811024, 1.820866,
+1.830709, 1.840551, 1.850394, 1.875000, 1.899606, 1.924213, 1.948819,
+1.973425, 1.998031, 2.022638, 2.047244, 2.062008, 2.076772, 2.091536,
+2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410,
+2.244095, 2.263780, 2.278543, 2.293307, 2.308071, 2.322835, 2.347441,
+2.372047, 2.396654, 2.421260, 2.436024, 2.450787, 2.465551, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.583662, 2.608268, 2.632874,
+2.657480, 2.672244, 2.687008, 2.701772, 2.716536, 0.767717, 0.767717,
+0.767717, 0.767717, 0.767717, 0.767717, 0.767717, 0.767717, 0.767717,
+0.765256, 0.762795, 0.760335, 0.757874, 0.760335, 0.762795, 0.765256,
+0.767717, 0.765256, 0.762795, 0.760335, 0.757874, 0.757874, 0.757874,
+0.757874, 0.757874, 0.765256, 0.772638, 0.780020, 0.787402, 0.807087,
+0.826772, 0.846457, 0.866142, 0.883366, 0.900591, 0.917815, 0.935039,
+0.957185, 0.979331, 1.001476, 1.023622, 1.033465, 1.043307, 1.053150,
+1.062992, 1.090059, 1.117126, 1.144193, 1.171260, 1.193406, 1.215551,
+1.237697, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.355807,
+1.373032, 1.390256, 1.407480, 1.419783, 1.432087, 1.444390, 1.456693,
+1.483760, 1.510827, 1.537894, 1.564961, 1.584646, 1.604331, 1.624016,
+1.643701, 1.658465, 1.673228, 1.687992, 1.702756, 1.729823, 1.756890,
+1.783957, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.872539,
+1.894685, 1.916831, 1.938976, 1.966043, 1.993110, 2.020177, 2.047244,
+2.064469, 2.081693, 2.098917, 2.116142, 2.130906, 2.145669, 2.160433,
+2.175197, 2.199803, 2.224410, 2.249016, 2.273622, 2.285925, 2.298228,
+2.310532, 2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.428642,
+2.445866, 2.463091, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
+2.581201, 2.603347, 2.625492, 2.647638, 2.664862, 2.682087, 2.699311,
+2.716536, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402,
+0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402,
+0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402,
+0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402,
+0.787402, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827,
+0.905512, 0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622,
+1.033465, 1.043307, 1.053150, 1.062992, 1.092520, 1.122047, 1.151575,
+1.181102, 1.200787, 1.220472, 1.240157, 1.259843, 1.279528, 1.299213,
+1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323, 1.427165,
+1.437008, 1.446850, 1.456693, 1.486220, 1.515748, 1.545276, 1.574803,
+1.594488, 1.614173, 1.633858, 1.653543, 1.663386, 1.673228, 1.683071,
+1.692913, 1.722441, 1.751969, 1.781496, 1.811024, 1.820866, 1.830709,
+1.840551, 1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.958661,
+1.988189, 2.017717, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984,
+2.135827, 2.145669, 2.155512, 2.165354, 2.194882, 2.224410, 2.253937,
+2.283465, 2.293307, 2.303150, 2.312992, 2.322835, 2.342520, 2.362205,
+2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
+2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
+2.657480, 2.677166, 2.696851, 2.716536, 0.807087, 0.804626, 0.802165,
+0.799705, 0.797244, 0.799705, 0.802165, 0.804626, 0.807087, 0.804626,
+0.802165, 0.799705, 0.797244, 0.797244, 0.797244, 0.797244, 0.797244,
+0.797244, 0.797244, 0.797244, 0.797244, 0.799705, 0.802165, 0.804626,
+0.807087, 0.807087, 0.807087, 0.807087, 0.807087, 0.819390, 0.831693,
+0.843996, 0.856299, 0.878445, 0.900591, 0.922736, 0.944882, 0.964567,
+0.984252, 1.003937, 1.023622, 1.033465, 1.043307, 1.053150, 1.062992,
+1.090059, 1.117126, 1.144193, 1.171260, 1.193406, 1.215551, 1.237697,
+1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.355807, 1.373032,
+1.390256, 1.407480, 1.419783, 1.432087, 1.444390, 1.456693, 1.486220,
+1.515748, 1.545276, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543,
+1.663386, 1.673228, 1.683071, 1.692913, 1.722441, 1.751969, 1.781496,
+1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.872539, 1.894685,
+1.916831, 1.938976, 1.963583, 1.988189, 2.012795, 2.037402, 2.057087,
+2.076772, 2.096457, 2.116142, 2.130906, 2.145669, 2.160433, 2.175197,
+2.199803, 2.224410, 2.249016, 2.273622, 2.285925, 2.298228, 2.310532,
+2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.431102, 2.450787,
+2.470472, 2.490158, 2.509843, 2.529528, 2.549213, 2.568898, 2.586122,
+2.603347, 2.620571, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
+0.826772, 0.821850, 0.816929, 0.812008, 0.807087, 0.812008, 0.816929,
+0.821850, 0.826772, 0.821850, 0.816929, 0.812008, 0.807087, 0.807087,
+0.807087, 0.807087, 0.807087, 0.807087, 0.807087, 0.807087, 0.807087,
+0.812008, 0.816929, 0.821850, 0.826772, 0.826772, 0.826772, 0.826772,
+0.826772, 0.831693, 0.836614, 0.841535, 0.846457, 0.871063, 0.895669,
+0.920276, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.033465,
+1.043307, 1.053150, 1.062992, 1.087598, 1.112205, 1.136811, 1.161417,
+1.186024, 1.210630, 1.235236, 1.259843, 1.279528, 1.299213, 1.318898,
+1.338583, 1.353346, 1.368110, 1.382874, 1.397638, 1.412402, 1.427165,
+1.441929, 1.456693, 1.486220, 1.515748, 1.545276, 1.574803, 1.594488,
+1.614173, 1.633858, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913,
+1.722441, 1.751969, 1.781496, 1.811024, 1.820866, 1.830709, 1.840551,
+1.850394, 1.875000, 1.899606, 1.924213, 1.948819, 1.968504, 1.988189,
+2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984,
+2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780,
+2.278543, 2.293307, 2.308071, 2.322835, 2.347441, 2.372047, 2.396654,
+2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370,
+2.559055, 2.578740, 2.593504, 2.608268, 2.623032, 2.637795, 2.657480,
+2.677166, 2.696851, 2.716536, 0.846457, 0.839075, 0.831693, 0.824311,
+0.816929, 0.824311, 0.831693, 0.839075, 0.846457, 0.839075, 0.831693,
+0.824311, 0.816929, 0.816929, 0.816929, 0.816929, 0.816929, 0.816929,
+0.816929, 0.816929, 0.816929, 0.824311, 0.831693, 0.839075, 0.846457,
+0.846457, 0.846457, 0.846457, 0.846457, 0.843996, 0.841535, 0.839075,
+0.836614, 0.863681, 0.890748, 0.917815, 0.944882, 0.964567, 0.984252,
+1.003937, 1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.085138,
+1.107283, 1.129429, 1.151575, 1.178642, 1.205709, 1.232776, 1.259843,
+1.279528, 1.299213, 1.318898, 1.338583, 1.350886, 1.363189, 1.375492,
+1.387795, 1.405020, 1.422244, 1.439469, 1.456693, 1.486220, 1.515748,
+1.545276, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.663386,
+1.673228, 1.683071, 1.692913, 1.722441, 1.751969, 1.781496, 1.811024,
+1.820866, 1.830709, 1.840551, 1.850394, 1.877461, 1.904528, 1.931594,
+1.958661, 1.973425, 1.988189, 2.002953, 2.017717, 2.037402, 2.057087,
+2.076772, 2.096457, 2.121063, 2.145669, 2.170276, 2.194882, 2.209646,
+2.224410, 2.239173, 2.253937, 2.271161, 2.288386, 2.305610, 2.322835,
+2.349902, 2.376969, 2.404035, 2.431102, 2.450787, 2.470472, 2.490157,
+2.509843, 2.529528, 2.549213, 2.568898, 2.588583, 2.600886, 2.613189,
+2.625492, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 0.866142,
+0.856299, 0.846457, 0.836614, 0.826772, 0.836614, 0.846457, 0.856299,
+0.866142, 0.856299, 0.846457, 0.836614, 0.826772, 0.826772, 0.826772,
+0.826772, 0.826772, 0.826772, 0.826772, 0.826772, 0.826772, 0.836614,
+0.846457, 0.856299, 0.866142, 0.866142, 0.866142, 0.866142, 0.866142,
+0.856299, 0.846457, 0.836614, 0.826772, 0.856299, 0.885827, 0.915354,
+0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.033465, 1.043307,
+1.053150, 1.062992, 1.082677, 1.102362, 1.122047, 1.141732, 1.171260,
+1.200787, 1.230315, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583,
+1.348425, 1.358268, 1.368110, 1.377953, 1.397638, 1.417323, 1.437008,
+1.456693, 1.486220, 1.515748, 1.545276, 1.574803, 1.594488, 1.614173,
+1.633858, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913, 1.722441,
+1.751969, 1.781496, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394,
+1.879921, 1.909449, 1.938976, 1.968504, 1.978346, 1.988189, 1.998031,
+2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.116142, 2.145669,
+2.175197, 2.204724, 2.214567, 2.224410, 2.234252, 2.244095, 2.263780,
+2.283465, 2.303150, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945,
+2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
+2.598425, 2.608268, 2.618110, 2.627953, 2.637795, 2.657480, 2.677166,
+2.696851, 2.716536, 0.875984, 0.868602, 0.861220, 0.853839, 0.846457,
+0.853839, 0.861220, 0.868602, 0.875984, 0.871063, 0.866142, 0.861220,
+0.856299, 0.856299, 0.856299, 0.856299, 0.856299, 0.856299, 0.856299,
+0.856299, 0.856299, 0.863681, 0.871063, 0.878445, 0.885827, 0.885827,
+0.885827, 0.885827, 0.885827, 0.878445, 0.871063, 0.863681, 0.856299,
+0.880906, 0.905512, 0.930118, 0.954724, 0.976870, 0.999016, 1.021161,
+1.043307, 1.053150, 1.062992, 1.072835, 1.082677, 1.104823, 1.126969,
+1.149114, 1.171260, 1.198327, 1.225394, 1.252461, 1.279528, 1.299213,
+1.318898, 1.338583, 1.358268, 1.370571, 1.382874, 1.395177, 1.407480,
+1.427165, 1.446850, 1.466535, 1.486220, 1.510827, 1.535433, 1.560039,
+1.584646, 1.604331, 1.624016, 1.643701, 1.663386, 1.678150, 1.692913,
+1.707677, 1.722441, 1.747047, 1.771654, 1.796260, 1.820866, 1.833169,
+1.845472, 1.857776, 1.870079, 1.899606, 1.929134, 1.958661, 1.988189,
+2.000492, 2.012795, 2.025099, 2.037402, 2.054626, 2.071851, 2.089075,
+2.106299, 2.133366, 2.160433, 2.187500, 2.214567, 2.226870, 2.239173,
+2.251476, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.369587,
+2.396654, 2.423720, 2.450787, 2.470472, 2.490158, 2.509843, 2.529528,
+2.549213, 2.568898, 2.588583, 2.608268, 2.623031, 2.637795, 2.652559,
+2.667323, 2.684547, 2.701772, 2.718996, 2.736221, 0.885827, 0.880906,
+0.875984, 0.871063, 0.866142, 0.871063, 0.875984, 0.880906, 0.885827,
+0.885827, 0.885827, 0.885827, 0.885827, 0.885827, 0.885827, 0.885827,
+0.885827, 0.885827, 0.885827, 0.885827, 0.885827, 0.890748, 0.895669,
+0.900591, 0.905512, 0.905512, 0.905512, 0.905512, 0.905512, 0.900591,
+0.895669, 0.890748, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567,
+0.989173, 1.013780, 1.038386, 1.062992, 1.072835, 1.082677, 1.092520,
+1.102362, 1.126969, 1.151575, 1.176181, 1.200787, 1.225394, 1.250000,
+1.274606, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.392717,
+1.407480, 1.422244, 1.437008, 1.456693, 1.476378, 1.496063, 1.515748,
+1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543,
+1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339,
+1.811024, 1.830709, 1.845472, 1.860236, 1.875000, 1.889764, 1.919291,
+1.948819, 1.978346, 2.007874, 2.022638, 2.037402, 2.052165, 2.066929,
+2.081693, 2.096457, 2.111221, 2.125984, 2.150591, 2.175197, 2.199803,
+2.224410, 2.239173, 2.253937, 2.268701, 2.283465, 2.303150, 2.322835,
+2.342520, 2.362205, 2.386811, 2.411417, 2.436024, 2.460630, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
+2.637795, 2.657480, 2.677165, 2.696851, 2.711614, 2.726378, 2.741142,
+2.755906, 0.895669, 0.893209, 0.890748, 0.888287, 0.885827, 0.888287,
+0.890748, 0.893209, 0.895669, 0.900591, 0.905512, 0.910433, 0.915354,
+0.915354, 0.915354, 0.915354, 0.915354, 0.915354, 0.915354, 0.915354,
+0.915354, 0.917815, 0.920276, 0.922736, 0.925197, 0.925197, 0.925197,
+0.925197, 0.925197, 0.922736, 0.920276, 0.917815, 0.915354, 0.930118,
+0.944882, 0.959646, 0.974409, 1.001476, 1.028543, 1.055610, 1.082677,
+1.092520, 1.102362, 1.112205, 1.122047, 1.149114, 1.176181, 1.203248,
+1.230315, 1.252461, 1.274606, 1.296752, 1.318898, 1.338583, 1.358268,
+1.377953, 1.397638, 1.414862, 1.432087, 1.449311, 1.466535, 1.486220,
+1.505906, 1.525591, 1.545276, 1.560039, 1.574803, 1.589567, 1.604331,
+1.624016, 1.643701, 1.663386, 1.683071, 1.707677, 1.732283, 1.756890,
+1.781496, 1.796260, 1.811024, 1.825787, 1.840551, 1.857776, 1.875000,
+1.892224, 1.909449, 1.938976, 1.968504, 1.998031, 2.027559, 2.044784,
+2.062008, 2.079232, 2.096457, 2.108760, 2.121063, 2.133366, 2.145669,
+2.167815, 2.189961, 2.212106, 2.234252, 2.251476, 2.268701, 2.285925,
+2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.404035, 2.426181,
+2.448327, 2.470472, 2.490157, 2.509843, 2.529528, 2.549213, 2.568898,
+2.588583, 2.608268, 2.627953, 2.652559, 2.677166, 2.701772, 2.726378,
+2.738681, 2.750984, 2.763287, 2.775591, 0.905512, 0.905512, 0.905512,
+0.905512, 0.905512, 0.905512, 0.905512, 0.905512, 0.905512, 0.915354,
+0.925197, 0.935039, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882,
+0.944882, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882,
+0.944882, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882,
+0.944882, 0.944882, 0.954724, 0.964567, 0.974409, 0.984252, 1.013780,
+1.043307, 1.072835, 1.102362, 1.112205, 1.122047, 1.131890, 1.141732,
+1.171260, 1.200787, 1.230315, 1.259843, 1.279528, 1.299213, 1.318898,
+1.338583, 1.358268, 1.377953, 1.397638, 1.417323, 1.437008, 1.456693,
+1.476378, 1.496063, 1.515748, 1.535433, 1.555118, 1.574803, 1.584646,
+1.594488, 1.604331, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
+1.722441, 1.751969, 1.781496, 1.811024, 1.820866, 1.830709, 1.840551,
+1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.958661, 1.988189,
+2.017717, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.135827,
+2.145669, 2.155512, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
+2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890,
+2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685,
+2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.667323,
+2.696851, 2.726378, 2.755906, 2.765748, 2.775591, 2.785433, 2.795276,
+0.935039, 0.935039, 0.935039, 0.935039, 0.935039, 0.935039, 0.935039,
+0.935039, 0.935039, 0.942421, 0.949803, 0.957185, 0.964567, 0.962106,
+0.959646, 0.957185, 0.954724, 0.957185, 0.959646, 0.962106, 0.964567,
+0.964567, 0.964567, 0.964567, 0.964567, 0.962106, 0.959646, 0.957185,
+0.954724, 0.957185, 0.959646, 0.962106, 0.964567, 0.971949, 0.979331,
+0.986713, 0.994094, 1.021161, 1.048228, 1.075295, 1.102362, 1.112205,
+1.122047, 1.131890, 1.141732, 1.168799, 1.195866, 1.222933, 1.250000,
+1.269685, 1.289370, 1.309055, 1.328740, 1.348425, 1.368110, 1.387795,
+1.407480, 1.429626, 1.451772, 1.473917, 1.496063, 1.515748, 1.535433,
+1.555118, 1.574803, 1.587106, 1.599409, 1.611713, 1.624016, 1.643701,
+1.663386, 1.683071, 1.702756, 1.727362, 1.751969, 1.776575, 1.801181,
+1.815945, 1.830709, 1.845472, 1.860236, 1.879921, 1.899606, 1.919291,
+1.938976, 1.963583, 1.988189, 2.012795, 2.037402, 2.059547, 2.081693,
+2.103839, 2.125984, 2.138287, 2.150591, 2.162894, 2.175197, 2.194882,
+2.214567, 2.234252, 2.253937, 2.271161, 2.288386, 2.305610, 2.322835,
+2.344980, 2.367126, 2.389272, 2.411417, 2.428642, 2.445866, 2.463091,
+2.480315, 2.502461, 2.524606, 2.546752, 2.568898, 2.588583, 2.608268,
+2.627953, 2.647638, 2.672244, 2.696851, 2.721457, 2.746063, 2.758366,
+2.770669, 2.782973, 2.795276, 0.964567, 0.964567, 0.964567, 0.964567,
+0.964567, 0.964567, 0.964567, 0.964567, 0.964567, 0.969488, 0.974409,
+0.979331, 0.984252, 0.979331, 0.974409, 0.969488, 0.964567, 0.969488,
+0.974409, 0.979331, 0.984252, 0.984252, 0.984252, 0.984252, 0.984252,
+0.979331, 0.974409, 0.969488, 0.964567, 0.969488, 0.974409, 0.979331,
+0.984252, 0.989173, 0.994094, 0.999016, 1.003937, 1.028543, 1.053150,
+1.077756, 1.102362, 1.112205, 1.122047, 1.131890, 1.141732, 1.166339,
+1.190945, 1.215551, 1.240157, 1.259843, 1.279528, 1.299213, 1.318898,
+1.338583, 1.358268, 1.377953, 1.397638, 1.422244, 1.446850, 1.471457,
+1.496063, 1.515748, 1.535433, 1.555118, 1.574803, 1.589567, 1.604331,
+1.619094, 1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283,
+1.751969, 1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079,
+1.889764, 1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874,
+2.027559, 2.052165, 2.076772, 2.101378, 2.125984, 2.140748, 2.155512,
+2.170276, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.278543,
+2.293307, 2.308071, 2.322835, 2.347441, 2.372047, 2.396654, 2.421260,
+2.436024, 2.450787, 2.465551, 2.480315, 2.504921, 2.529528, 2.554134,
+2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677165, 2.696851,
+2.716535, 2.736221, 2.750984, 2.765748, 2.780512, 2.795276, 0.994094,
+0.994094, 0.994094, 0.994094, 0.994094, 0.994094, 0.994094, 0.994094,
+0.994094, 0.996555, 0.999016, 1.001476, 1.003937, 0.996555, 0.989173,
+0.981791, 0.974409, 0.981791, 0.989173, 0.996555, 1.003937, 1.003937,
+1.003937, 1.003937, 1.003937, 0.996555, 0.989173, 0.981791, 0.974409,
+0.981791, 0.989173, 0.996555, 1.003937, 1.006398, 1.008858, 1.011319,
+1.013780, 1.035925, 1.058071, 1.080217, 1.102362, 1.112205, 1.122047,
+1.131890, 1.141732, 1.163878, 1.186024, 1.208169, 1.230315, 1.250000,
+1.269685, 1.289370, 1.309055, 1.328740, 1.348425, 1.368110, 1.387795,
+1.414862, 1.441929, 1.468996, 1.496063, 1.515748, 1.535433, 1.555118,
+1.574803, 1.592028, 1.609252, 1.626476, 1.643701, 1.663386, 1.683071,
+1.702756, 1.722441, 1.737205, 1.751969, 1.766732, 1.781496, 1.806102,
+1.830709, 1.855315, 1.879921, 1.899606, 1.919291, 1.938976, 1.958661,
+1.973425, 1.988189, 2.002953, 2.017717, 2.044784, 2.071851, 2.098917,
+2.125984, 2.143209, 2.160433, 2.177658, 2.194882, 2.214567, 2.234252,
+2.253937, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.349902,
+2.376969, 2.404035, 2.431102, 2.443406, 2.455709, 2.468012, 2.480315,
+2.507382, 2.534449, 2.561516, 2.588583, 2.608268, 2.627953, 2.647638,
+2.667323, 2.682087, 2.696851, 2.711614, 2.726378, 2.743603, 2.760827,
+2.778051, 2.795276, 1.023622, 1.023622, 1.023622, 1.023622, 1.023622,
+1.023622, 1.023622, 1.023622, 1.023622, 1.023622, 1.023622, 1.023622,
+1.023622, 1.013780, 1.003937, 0.994094, 0.984252, 0.994094, 1.003937,
+1.013780, 1.023622, 1.023622, 1.023622, 1.023622, 1.023622, 1.013780,
+1.003937, 0.994094, 0.984252, 0.994094, 1.003937, 1.013780, 1.023622,
+1.023622, 1.023622, 1.023622, 1.023622, 1.043307, 1.062992, 1.082677,
+1.102362, 1.112205, 1.122047, 1.131890, 1.141732, 1.161417, 1.181102,
+1.200787, 1.220472, 1.240157, 1.259843, 1.279528, 1.299213, 1.318898,
+1.338583, 1.358268, 1.377953, 1.407480, 1.437008, 1.466535, 1.496063,
+1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858,
+1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.742126, 1.751969,
+1.761811, 1.771654, 1.801181, 1.830709, 1.860236, 1.889764, 1.909449,
+1.929134, 1.948819, 1.968504, 1.978346, 1.988189, 1.998031, 2.007874,
+2.037402, 2.066929, 2.096457, 2.125984, 2.145669, 2.165354, 2.185039,
+2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.293307, 2.303150,
+2.312992, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945, 2.450787,
+2.460630, 2.470472, 2.480315, 2.509843, 2.539370, 2.568898, 2.598425,
+2.618110, 2.637795, 2.657480, 2.677166, 2.687008, 2.696851, 2.706693,
+2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 1.043307, 1.040846,
+1.038386, 1.035925, 1.033465, 1.035925, 1.038386, 1.040846, 1.043307,
+1.043307, 1.043307, 1.043307, 1.043307, 1.035925, 1.028543, 1.021161,
+1.013780, 1.018701, 1.023622, 1.028543, 1.033465, 1.035925, 1.038386,
+1.040846, 1.043307, 1.035925, 1.028543, 1.021161, 1.013780, 1.018701,
+1.023622, 1.028543, 1.033465, 1.035925, 1.038386, 1.040846, 1.043307,
+1.058071, 1.072835, 1.087598, 1.102362, 1.114665, 1.126969, 1.139272,
+1.151575, 1.168799, 1.186024, 1.203248, 1.220472, 1.242618, 1.264764,
+1.286910, 1.309055, 1.326280, 1.343504, 1.360728, 1.377953, 1.407480,
+1.437008, 1.466535, 1.496063, 1.515748, 1.535433, 1.555118, 1.574803,
+1.594488, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913, 1.712598,
+1.732283, 1.744587, 1.756890, 1.769193, 1.781496, 1.806102, 1.830709,
+1.855315, 1.879921, 1.899606, 1.919291, 1.938976, 1.958661, 1.970965,
+1.983268, 1.995571, 2.007874, 2.034941, 2.062008, 2.089075, 2.116142,
+2.138287, 2.160433, 2.182579, 2.204724, 2.221949, 2.239173, 2.256398,
+2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.349902, 2.376969,
+2.404035, 2.431102, 2.445866, 2.460630, 2.475394, 2.490158, 2.514764,
+2.539370, 2.563976, 2.588583, 2.608268, 2.627953, 2.647638, 2.667323,
+2.679626, 2.691929, 2.704232, 2.716536, 2.736221, 2.755906, 2.775591,
+2.795276, 1.062992, 1.058071, 1.053150, 1.048228, 1.043307, 1.048228,
+1.053150, 1.058071, 1.062992, 1.062992, 1.062992, 1.062992, 1.062992,
+1.058071, 1.053150, 1.048228, 1.043307, 1.043307, 1.043307, 1.043307,
+1.043307, 1.048228, 1.053150, 1.058071, 1.062992, 1.058071, 1.053150,
+1.048228, 1.043307, 1.043307, 1.043307, 1.043307, 1.043307, 1.048228,
+1.053150, 1.058071, 1.062992, 1.072835, 1.082677, 1.092520, 1.102362,
+1.117126, 1.131890, 1.146654, 1.161417, 1.176181, 1.190945, 1.205709,
+1.220472, 1.245079, 1.269685, 1.294291, 1.318898, 1.333661, 1.348425,
+1.363189, 1.377953, 1.407480, 1.437008, 1.466535, 1.496063, 1.515748,
+1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543,
+1.673228, 1.692913, 1.712598, 1.732283, 1.747047, 1.761811, 1.776575,
+1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764, 1.909449,
+1.929134, 1.948819, 1.963583, 1.978346, 1.993110, 2.007874, 2.032480,
+2.057087, 2.081693, 2.106299, 2.130906, 2.155512, 2.180118, 2.204724,
+2.219488, 2.234252, 2.249016, 2.263780, 2.278543, 2.293307, 2.308071,
+2.322835, 2.347441, 2.372047, 2.396654, 2.421260, 2.440945, 2.460630,
+2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
+2.618110, 2.637795, 2.657480, 2.672244, 2.687008, 2.701772, 2.716536,
+2.736221, 2.755906, 2.775591, 2.795276, 1.082677, 1.075295, 1.067913,
+1.060531, 1.053150, 1.060531, 1.067913, 1.075295, 1.082677, 1.082677,
+1.082677, 1.082677, 1.082677, 1.080217, 1.077756, 1.075295, 1.072835,
+1.067913, 1.062992, 1.058071, 1.053150, 1.060531, 1.067913, 1.075295,
+1.082677, 1.080217, 1.077756, 1.075295, 1.072835, 1.067913, 1.062992,
+1.058071, 1.053150, 1.060531, 1.067913, 1.075295, 1.082677, 1.087598,
+1.092520, 1.097441, 1.102362, 1.119587, 1.136811, 1.154035, 1.171260,
+1.183563, 1.195866, 1.208169, 1.220472, 1.247539, 1.274606, 1.301673,
+1.328740, 1.341043, 1.353346, 1.365650, 1.377953, 1.407480, 1.437008,
+1.466535, 1.496063, 1.515748, 1.535433, 1.555118, 1.574803, 1.594488,
+1.614173, 1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283,
+1.749508, 1.766732, 1.783957, 1.801181, 1.815945, 1.830709, 1.845472,
+1.860236, 1.879921, 1.899606, 1.919291, 1.938976, 1.956201, 1.973425,
+1.990650, 2.007874, 2.030020, 2.052165, 2.074311, 2.096457, 2.123524,
+2.150591, 2.177658, 2.204724, 2.217028, 2.229331, 2.241634, 2.253937,
+2.271161, 2.288386, 2.305610, 2.322835, 2.344980, 2.367126, 2.389272,
+2.411417, 2.436024, 2.460630, 2.485236, 2.509843, 2.524606, 2.539370,
+2.554134, 2.568898, 2.588583, 2.608268, 2.627953, 2.647638, 2.664862,
+2.682087, 2.699311, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
+1.102362, 1.092520, 1.082677, 1.072835, 1.062992, 1.072835, 1.082677,
+1.092520, 1.102362, 1.102362, 1.102362, 1.102362, 1.102362, 1.102362,
+1.102362, 1.102362, 1.102362, 1.092520, 1.082677, 1.072835, 1.062992,
+1.072835, 1.082677, 1.092520, 1.102362, 1.102362, 1.102362, 1.102362,
+1.102362, 1.092520, 1.082677, 1.072835, 1.062992, 1.072835, 1.082677,
+1.092520, 1.102362, 1.102362, 1.102362, 1.102362, 1.102362, 1.122047,
+1.141732, 1.161417, 1.181102, 1.190945, 1.200787, 1.210630, 1.220472,
+1.250000, 1.279528, 1.309055, 1.338583, 1.348425, 1.358268, 1.368110,
+1.377953, 1.407480, 1.437008, 1.466535, 1.496063, 1.515748, 1.535433,
+1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228,
+1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024,
+1.820866, 1.830709, 1.840551, 1.850394, 1.870079, 1.889764, 1.909449,
+1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244,
+2.066929, 2.086614, 2.116142, 2.145669, 2.175197, 2.204724, 2.214567,
+2.224410, 2.234252, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
+2.342520, 2.362205, 2.381890, 2.401575, 2.431102, 2.460630, 2.490157,
+2.519685, 2.529528, 2.539370, 2.549213, 2.559055, 2.578740, 2.598425,
+2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221,
+2.755906, 2.775591, 2.795276, 1.122047, 1.114665, 1.107283, 1.099902,
+1.092520, 1.099902, 1.107283, 1.114665, 1.122047, 1.122047, 1.122047,
+1.122047, 1.122047, 1.122047, 1.122047, 1.122047, 1.122047, 1.114665,
+1.107283, 1.099902, 1.092520, 1.097441, 1.102362, 1.107283, 1.112205,
+1.114665, 1.117126, 1.119587, 1.122047, 1.112205, 1.102362, 1.092520,
+1.082677, 1.092520, 1.102362, 1.112205, 1.122047, 1.122047, 1.122047,
+1.122047, 1.122047, 1.141732, 1.161417, 1.181102, 1.200787, 1.213091,
+1.225394, 1.237697, 1.250000, 1.277067, 1.304134, 1.331201, 1.358268,
+1.370571, 1.382874, 1.395177, 1.407480, 1.434547, 1.461614, 1.488681,
+1.515748, 1.532972, 1.550197, 1.567421, 1.584646, 1.606791, 1.628937,
+1.651083, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.769193,
+1.786417, 1.803642, 1.820866, 1.833169, 1.845472, 1.857776, 1.870079,
+1.889764, 1.909449, 1.929134, 1.948819, 1.970965, 1.993110, 2.015256,
+2.037402, 2.057087, 2.076772, 2.096457, 2.116142, 2.143209, 2.170276,
+2.197343, 2.224410, 2.236713, 2.249016, 2.261319, 2.273622, 2.293307,
+2.312992, 2.332677, 2.352362, 2.372047, 2.391732, 2.411417, 2.431103,
+2.458169, 2.485236, 2.512303, 2.539370, 2.549213, 2.559055, 2.568898,
+2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851,
+2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 1.141732,
+1.136811, 1.131890, 1.126969, 1.122047, 1.126969, 1.131890, 1.136811,
+1.141732, 1.141732, 1.141732, 1.141732, 1.141732, 1.141732, 1.141732,
+1.141732, 1.141732, 1.136811, 1.131890, 1.126969, 1.122047, 1.122047,
+1.122047, 1.122047, 1.122047, 1.126969, 1.131890, 1.136811, 1.141732,
+1.131890, 1.122047, 1.112205, 1.102362, 1.112205, 1.122047, 1.131890,
+1.141732, 1.141732, 1.141732, 1.141732, 1.141732, 1.161417, 1.181102,
+1.200787, 1.220472, 1.235236, 1.250000, 1.264764, 1.279528, 1.304134,
+1.328740, 1.353346, 1.377953, 1.392717, 1.407480, 1.422244, 1.437008,
+1.461614, 1.486220, 1.510827, 1.535433, 1.550197, 1.564961, 1.579724,
+1.594488, 1.619094, 1.643701, 1.668307, 1.692913, 1.712598, 1.732283,
+1.751969, 1.771654, 1.786417, 1.801181, 1.815945, 1.830709, 1.845472,
+1.860236, 1.875000, 1.889764, 1.909449, 1.929134, 1.948819, 1.968504,
+1.993110, 2.017717, 2.042323, 2.066929, 2.086614, 2.106299, 2.125984,
+2.145669, 2.170276, 2.194882, 2.219488, 2.244095, 2.258858, 2.273622,
+2.288386, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575,
+2.421260, 2.440945, 2.460630, 2.485236, 2.509843, 2.534449, 2.559055,
+2.568898, 2.578740, 2.588583, 2.598425, 2.618110, 2.637795, 2.657480,
+2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
+2.814961, 2.834646, 1.161417, 1.158957, 1.156496, 1.154035, 1.151575,
+1.154035, 1.156496, 1.158957, 1.161417, 1.161417, 1.161417, 1.161417,
+1.161417, 1.161417, 1.161417, 1.161417, 1.161417, 1.158957, 1.156496,
+1.154035, 1.151575, 1.146654, 1.141732, 1.136811, 1.131890, 1.139272,
+1.146654, 1.154035, 1.161417, 1.151575, 1.141732, 1.131890, 1.122047,
+1.131890, 1.141732, 1.151575, 1.161417, 1.161417, 1.161417, 1.161417,
+1.161417, 1.181102, 1.200787, 1.220472, 1.240157, 1.257382, 1.274606,
+1.291831, 1.309055, 1.331201, 1.353346, 1.375492, 1.397638, 1.414862,
+1.432087, 1.449311, 1.466535, 1.488681, 1.510827, 1.532972, 1.555118,
+1.567421, 1.579724, 1.592028, 1.604331, 1.631398, 1.658465, 1.685531,
+1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.803642, 1.815945,
+1.828248, 1.840551, 1.857776, 1.875000, 1.892224, 1.909449, 1.929134,
+1.948819, 1.968504, 1.988189, 2.015256, 2.042323, 2.069390, 2.096457,
+2.116142, 2.135827, 2.155512, 2.175197, 2.197343, 2.219488, 2.241634,
+2.263780, 2.281004, 2.298228, 2.315453, 2.332677, 2.352362, 2.372047,
+2.391732, 2.411417, 2.431102, 2.450787, 2.470472, 2.490158, 2.512303,
+2.534449, 2.556595, 2.578740, 2.588583, 2.598425, 2.608268, 2.618110,
+2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906,
+2.775591, 2.795276, 2.814961, 2.834646, 2.854331, 1.181102, 1.181102,
+1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.181102,
+1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.181102,
+1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.171260, 1.161417,
+1.151575, 1.141732, 1.151575, 1.161417, 1.171260, 1.181102, 1.171260,
+1.161417, 1.151575, 1.141732, 1.151575, 1.161417, 1.171260, 1.181102,
+1.181102, 1.181102, 1.181102, 1.181102, 1.200787, 1.220472, 1.240157,
+1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953,
+1.397638, 1.417323, 1.437008, 1.456693, 1.476378, 1.496063, 1.515748,
+1.535433, 1.555118, 1.574803, 1.584646, 1.594488, 1.604331, 1.614173,
+1.643701, 1.673228, 1.702756, 1.732283, 1.751969, 1.771654, 1.791339,
+1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.870079, 1.889764,
+1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.037402,
+2.066929, 2.096457, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
+2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
+2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.608268,
+2.618110, 2.627953, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
+2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331,
+2.874016, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
+1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
+1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
+1.200787, 1.193406, 1.186024, 1.178642, 1.171260, 1.176181, 1.181102,
+1.186024, 1.190945, 1.186024, 1.181102, 1.176181, 1.171260, 1.178642,
+1.186024, 1.193406, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
+1.215551, 1.230315, 1.245079, 1.259843, 1.279528, 1.299213, 1.318898,
+1.338583, 1.358268, 1.377953, 1.397638, 1.417323, 1.434547, 1.451772,
+1.468996, 1.486220, 1.505906, 1.525591, 1.545276, 1.564961, 1.579724,
+1.594488, 1.609252, 1.624016, 1.648622, 1.673228, 1.697835, 1.722441,
+1.742126, 1.761811, 1.781496, 1.801181, 1.815945, 1.830709, 1.845472,
+1.860236, 1.877461, 1.894685, 1.911909, 1.929134, 1.948819, 1.968504,
+1.988189, 2.007874, 2.037402, 2.066929, 2.096457, 2.125984, 2.143209,
+2.160433, 2.177658, 2.194882, 2.214567, 2.234252, 2.253937, 2.273622,
+2.295768, 2.317913, 2.340059, 2.362205, 2.379429, 2.396654, 2.413878,
+2.431102, 2.450787, 2.470472, 2.490157, 2.509843, 2.529528, 2.549213,
+2.568898, 2.588583, 2.603346, 2.618110, 2.632874, 2.647638, 2.667323,
+2.687008, 2.706693, 2.726378, 2.743603, 2.760827, 2.778051, 2.795276,
+2.814961, 2.834646, 2.854331, 2.874016, 1.220472, 1.220472, 1.220472,
+1.220472, 1.220472, 1.220472, 1.220472, 1.220472, 1.220472, 1.220472,
+1.220472, 1.220472, 1.220472, 1.220472, 1.220472, 1.220472, 1.220472,
+1.220472, 1.220472, 1.220472, 1.220472, 1.215551, 1.210630, 1.205709,
+1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
+1.200787, 1.200787, 1.205709, 1.210630, 1.215551, 1.220472, 1.220472,
+1.220472, 1.220472, 1.220472, 1.230315, 1.240157, 1.250000, 1.259843,
+1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638,
+1.417323, 1.432087, 1.446850, 1.461614, 1.476378, 1.496063, 1.515748,
+1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543,
+1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339,
+1.811024, 1.830709, 1.850394, 1.870079, 1.884843, 1.899606, 1.914370,
+1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.037402, 2.066929,
+2.096457, 2.125984, 2.140748, 2.155512, 2.170276, 2.185039, 2.204724,
+2.224410, 2.244095, 2.263780, 2.288386, 2.312992, 2.337598, 2.362205,
+2.376969, 2.391732, 2.406496, 2.421260, 2.440945, 2.460630, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
+2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.750984,
+2.765748, 2.780512, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016,
+1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157,
+1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157,
+1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157,
+1.237697, 1.235236, 1.232776, 1.230315, 1.225394, 1.220472, 1.215551,
+1.210630, 1.215551, 1.220472, 1.225394, 1.230315, 1.232776, 1.235236,
+1.237697, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.245079,
+1.250000, 1.254921, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583,
+1.358268, 1.377953, 1.397638, 1.417323, 1.429626, 1.441929, 1.454232,
+1.466535, 1.486220, 1.505906, 1.525591, 1.545276, 1.569882, 1.594488,
+1.619094, 1.643701, 1.658465, 1.673228, 1.687992, 1.702756, 1.722441,
+1.742126, 1.761811, 1.781496, 1.806102, 1.830709, 1.855315, 1.879921,
+1.892224, 1.904528, 1.916831, 1.929134, 1.948819, 1.968504, 1.988189,
+2.007874, 2.037402, 2.066929, 2.096457, 2.125984, 2.138287, 2.150591,
+2.162894, 2.175197, 2.194882, 2.214567, 2.234252, 2.253937, 2.281004,
+2.308071, 2.335138, 2.362205, 2.374508, 2.386811, 2.399114, 2.411417,
+2.431102, 2.450787, 2.470472, 2.490158, 2.509843, 2.529528, 2.549213,
+2.568898, 2.593504, 2.618110, 2.642716, 2.667323, 2.687008, 2.706693,
+2.726378, 2.746063, 2.758366, 2.770669, 2.782973, 2.795276, 2.814961,
+2.834646, 2.854331, 2.874016, 1.259843, 1.259843, 1.259843, 1.259843,
+1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843,
+1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843,
+1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843,
+1.250000, 1.240157, 1.230315, 1.220472, 1.230315, 1.240157, 1.250000,
+1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843,
+1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.279528,
+1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323,
+1.427165, 1.437008, 1.446850, 1.456693, 1.476378, 1.496063, 1.515748,
+1.535433, 1.564961, 1.594488, 1.624016, 1.653543, 1.663386, 1.673228,
+1.683071, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.801181,
+1.830709, 1.860236, 1.889764, 1.899606, 1.909449, 1.919291, 1.929134,
+1.948819, 1.968504, 1.988189, 2.007874, 2.037402, 2.066929, 2.096457,
+2.125984, 2.135827, 2.145669, 2.155512, 2.165354, 2.185039, 2.204724,
+2.224410, 2.244095, 2.273622, 2.303150, 2.332677, 2.362205, 2.372047,
+2.381890, 2.391732, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110, 2.647638,
+2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.765748, 2.775591,
+2.785433, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 1.279528,
+1.279528, 1.279528, 1.279528, 1.279528, 1.279528, 1.279528, 1.279528,
+1.279528, 1.277067, 1.274606, 1.272146, 1.269685, 1.272146, 1.274606,
+1.277067, 1.279528, 1.279528, 1.279528, 1.279528, 1.279528, 1.279528,
+1.279528, 1.279528, 1.279528, 1.269685, 1.259843, 1.250000, 1.240157,
+1.250000, 1.259843, 1.269685, 1.279528, 1.277067, 1.274606, 1.272146,
+1.269685, 1.272146, 1.274606, 1.277067, 1.279528, 1.279528, 1.279528,
+1.279528, 1.279528, 1.291831, 1.304134, 1.316437, 1.328740, 1.348425,
+1.368110, 1.387795, 1.407480, 1.419783, 1.432087, 1.444390, 1.456693,
+1.476378, 1.496063, 1.515748, 1.535433, 1.562500, 1.589567, 1.616634,
+1.643701, 1.656004, 1.668307, 1.680610, 1.692913, 1.712598, 1.732283,
+1.751969, 1.771654, 1.801181, 1.830709, 1.860236, 1.889764, 1.902067,
+1.914370, 1.926673, 1.938976, 1.958661, 1.978346, 1.998031, 2.017717,
+2.042323, 2.066929, 2.091536, 2.116142, 2.128445, 2.140748, 2.153051,
+2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.271161, 2.298228,
+2.325295, 2.352362, 2.364665, 2.376969, 2.389272, 2.401575, 2.421260,
+2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
+2.586122, 2.613189, 2.640256, 2.667323, 2.689469, 2.711614, 2.733760,
+2.755906, 2.768209, 2.780512, 2.792815, 2.805118, 2.822343, 2.839567,
+2.856791, 2.874016, 1.299213, 1.299213, 1.299213, 1.299213, 1.299213,
+1.299213, 1.299213, 1.299213, 1.299213, 1.294291, 1.289370, 1.284449,
+1.279528, 1.284449, 1.289370, 1.294291, 1.299213, 1.299213, 1.299213,
+1.299213, 1.299213, 1.299213, 1.299213, 1.299213, 1.299213, 1.289370,
+1.279528, 1.269685, 1.259843, 1.269685, 1.279528, 1.289370, 1.299213,
+1.294291, 1.289370, 1.284449, 1.279528, 1.284449, 1.289370, 1.294291,
+1.299213, 1.299213, 1.299213, 1.299213, 1.299213, 1.304134, 1.309055,
+1.313976, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.412402,
+1.427165, 1.441929, 1.456693, 1.476378, 1.496063, 1.515748, 1.535433,
+1.560039, 1.584646, 1.609252, 1.633858, 1.648622, 1.663386, 1.678150,
+1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.801181, 1.830709,
+1.860236, 1.889764, 1.904528, 1.919291, 1.934055, 1.948819, 1.968504,
+1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299,
+2.121063, 2.135827, 2.150591, 2.165354, 2.185039, 2.204724, 2.224410,
+2.244095, 2.268701, 2.293307, 2.317913, 2.342520, 2.357284, 2.372047,
+2.386811, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
+2.519685, 2.539370, 2.559055, 2.583662, 2.608268, 2.632874, 2.657480,
+2.682087, 2.706693, 2.731299, 2.755906, 2.770669, 2.785433, 2.800197,
+2.814961, 2.829725, 2.844488, 2.859252, 2.874016, 1.318898, 1.318898,
+1.318898, 1.318898, 1.318898, 1.318898, 1.318898, 1.318898, 1.318898,
+1.311516, 1.304134, 1.296752, 1.289370, 1.296752, 1.304134, 1.311516,
+1.318898, 1.318898, 1.318898, 1.318898, 1.318898, 1.318898, 1.318898,
+1.318898, 1.318898, 1.309055, 1.299213, 1.289370, 1.279528, 1.289370,
+1.299213, 1.309055, 1.318898, 1.311516, 1.304134, 1.296752, 1.289370,
+1.296752, 1.304134, 1.311516, 1.318898, 1.318898, 1.318898, 1.318898,
+1.318898, 1.316437, 1.313976, 1.311516, 1.309055, 1.328740, 1.348425,
+1.368110, 1.387795, 1.405020, 1.422244, 1.439469, 1.456693, 1.476378,
+1.496063, 1.515748, 1.535433, 1.557579, 1.579724, 1.601870, 1.624016,
+1.641240, 1.658465, 1.675689, 1.692913, 1.712598, 1.732283, 1.751969,
+1.771654, 1.801181, 1.830709, 1.860236, 1.889764, 1.906988, 1.924213,
+1.941437, 1.958661, 1.978346, 1.998031, 2.017717, 2.037402, 2.052165,
+2.066929, 2.081693, 2.096457, 2.113681, 2.130906, 2.148130, 2.165354,
+2.185039, 2.204724, 2.224410, 2.244095, 2.266240, 2.288386, 2.310532,
+2.332677, 2.349902, 2.367126, 2.384350, 2.401575, 2.421260, 2.440945,
+2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.581201,
+2.603347, 2.625492, 2.647638, 2.674705, 2.701772, 2.728839, 2.755906,
+2.773130, 2.790354, 2.807579, 2.824803, 2.837106, 2.849410, 2.861713,
+2.874016, 1.338583, 1.338583, 1.338583, 1.338583, 1.338583, 1.338583,
+1.338583, 1.338583, 1.338583, 1.328740, 1.318898, 1.309055, 1.299213,
+1.309055, 1.318898, 1.328740, 1.338583, 1.338583, 1.338583, 1.338583,
+1.338583, 1.338583, 1.338583, 1.338583, 1.338583, 1.328740, 1.318898,
+1.309055, 1.299213, 1.309055, 1.318898, 1.328740, 1.338583, 1.328740,
+1.318898, 1.309055, 1.299213, 1.309055, 1.318898, 1.328740, 1.338583,
+1.338583, 1.338583, 1.338583, 1.338583, 1.328740, 1.318898, 1.309055,
+1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323,
+1.437008, 1.456693, 1.476378, 1.496063, 1.515748, 1.535433, 1.555118,
+1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
+1.712598, 1.732283, 1.751969, 1.771654, 1.801181, 1.830709, 1.860236,
+1.889764, 1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874,
+2.027559, 2.047244, 2.057087, 2.066929, 2.076772, 2.086614, 2.106299,
+2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
+2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890,
+2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685,
+2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.667323,
+2.696851, 2.726378, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646,
+2.844488, 2.854331, 2.864173, 2.874016, 1.358268, 1.358268, 1.358268,
+1.358268, 1.358268, 1.358268, 1.358268, 1.358268, 1.358268, 1.350886,
+1.343504, 1.336122, 1.328740, 1.333661, 1.338583, 1.343504, 1.348425,
+1.350886, 1.353346, 1.355807, 1.358268, 1.355807, 1.353346, 1.350886,
+1.348425, 1.343504, 1.338583, 1.333661, 1.328740, 1.336122, 1.343504,
+1.350886, 1.358268, 1.350886, 1.343504, 1.336122, 1.328740, 1.336122,
+1.343504, 1.350886, 1.358268, 1.358268, 1.358268, 1.358268, 1.358268,
+1.350886, 1.343504, 1.336122, 1.328740, 1.348425, 1.368110, 1.387795,
+1.407480, 1.424705, 1.441929, 1.459154, 1.476378, 1.498524, 1.520669,
+1.542815, 1.564961, 1.582185, 1.599409, 1.616634, 1.633858, 1.653543,
+1.673228, 1.692913, 1.712598, 1.734744, 1.756890, 1.779035, 1.801181,
+1.825787, 1.850394, 1.875000, 1.899606, 1.919291, 1.938976, 1.958661,
+1.978346, 1.998031, 2.017717, 2.037402, 2.057087, 2.071851, 2.086614,
+2.101378, 2.116142, 2.133366, 2.150591, 2.167815, 2.185039, 2.204724,
+2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
+2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
+2.637795, 2.657480, 2.684547, 2.711614, 2.738681, 2.765748, 2.785433,
+2.805118, 2.824803, 2.844488, 2.856791, 2.869095, 2.881398, 2.893701,
+1.377953, 1.377953, 1.377953, 1.377953, 1.377953, 1.377953, 1.377953,
+1.377953, 1.377953, 1.373032, 1.368110, 1.363189, 1.358268, 1.358268,
+1.358268, 1.358268, 1.358268, 1.363189, 1.368110, 1.373032, 1.377953,
+1.373032, 1.368110, 1.363189, 1.358268, 1.358268, 1.358268, 1.358268,
+1.358268, 1.363189, 1.368110, 1.373032, 1.377953, 1.373032, 1.368110,
+1.363189, 1.358268, 1.363189, 1.368110, 1.373032, 1.377953, 1.377953,
+1.377953, 1.377953, 1.377953, 1.373032, 1.368110, 1.363189, 1.358268,
+1.377953, 1.397638, 1.417323, 1.437008, 1.451772, 1.466535, 1.481299,
+1.496063, 1.520669, 1.545276, 1.569882, 1.594488, 1.609252, 1.624016,
+1.638780, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.756890,
+1.781496, 1.806102, 1.830709, 1.850394, 1.870079, 1.889764, 1.909449,
+1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244,
+2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.160433, 2.175197,
+2.189961, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
+2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945,
+2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
+2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.701772, 2.726378,
+2.750984, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331, 2.869095,
+2.883858, 2.898622, 2.913386, 1.397638, 1.397638, 1.397638, 1.397638,
+1.397638, 1.397638, 1.397638, 1.397638, 1.397638, 1.395177, 1.392717,
+1.390256, 1.387795, 1.382874, 1.377953, 1.373032, 1.368110, 1.375492,
+1.382874, 1.390256, 1.397638, 1.390256, 1.382874, 1.375492, 1.368110,
+1.373032, 1.377953, 1.382874, 1.387795, 1.390256, 1.392717, 1.395177,
+1.397638, 1.395177, 1.392717, 1.390256, 1.387795, 1.390256, 1.392717,
+1.395177, 1.397638, 1.397638, 1.397638, 1.397638, 1.397638, 1.395177,
+1.392717, 1.390256, 1.387795, 1.407480, 1.427165, 1.446850, 1.466535,
+1.478839, 1.491142, 1.503445, 1.515748, 1.542815, 1.569882, 1.596949,
+1.624016, 1.636319, 1.648622, 1.660925, 1.673228, 1.692913, 1.712598,
+1.732283, 1.751969, 1.779035, 1.806102, 1.833169, 1.860236, 1.875000,
+1.889764, 1.904528, 1.919291, 1.938976, 1.958661, 1.978346, 1.998031,
+2.017717, 2.037402, 2.057087, 2.076772, 2.101378, 2.125984, 2.150591,
+2.175197, 2.187500, 2.199803, 2.212106, 2.224410, 2.244095, 2.263780,
+2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575,
+2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370,
+2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677166,
+2.696851, 2.718996, 2.741142, 2.763288, 2.785433, 2.805118, 2.824803,
+2.844488, 2.864173, 2.881398, 2.898622, 2.915847, 2.933071, 1.417323,
+1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323,
+1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.407480, 1.397638,
+1.387795, 1.377953, 1.387795, 1.397638, 1.407480, 1.417323, 1.407480,
+1.397638, 1.387795, 1.377953, 1.387795, 1.397638, 1.407480, 1.417323,
+1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323,
+1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323,
+1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.437008,
+1.456693, 1.476378, 1.496063, 1.505906, 1.515748, 1.525591, 1.535433,
+1.564961, 1.594488, 1.624016, 1.653543, 1.663386, 1.673228, 1.683071,
+1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.801181, 1.830709,
+1.860236, 1.889764, 1.899606, 1.909449, 1.919291, 1.929134, 1.948819,
+1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
+2.116142, 2.145669, 2.175197, 2.204724, 2.214567, 2.224410, 2.234252,
+2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
+2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
+2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
+2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
+2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
+2.933071, 2.952756, 1.427165, 1.427165, 1.427165, 1.427165, 1.427165,
+1.429626, 1.432087, 1.434547, 1.437008, 1.437008, 1.437008, 1.437008,
+1.437008, 1.427165, 1.417323, 1.407480, 1.397638, 1.407480, 1.417323,
+1.427165, 1.437008, 1.429626, 1.422244, 1.414862, 1.407480, 1.412402,
+1.417323, 1.422244, 1.427165, 1.429626, 1.432087, 1.434547, 1.437008,
+1.434547, 1.432087, 1.429626, 1.427165, 1.429626, 1.432087, 1.434547,
+1.437008, 1.434547, 1.432087, 1.429626, 1.427165, 1.427165, 1.427165,
+1.427165, 1.427165, 1.444390, 1.461614, 1.478839, 1.496063, 1.505906,
+1.515748, 1.525591, 1.535433, 1.564961, 1.594488, 1.624016, 1.653543,
+1.663386, 1.673228, 1.683071, 1.692913, 1.712598, 1.732283, 1.751969,
+1.771654, 1.798720, 1.825787, 1.852854, 1.879921, 1.894685, 1.909449,
+1.924213, 1.938976, 1.956201, 1.973425, 1.990650, 2.007874, 2.030020,
+2.052165, 2.074311, 2.096457, 2.121063, 2.145669, 2.170276, 2.194882,
+2.209646, 2.224410, 2.239173, 2.253937, 2.271161, 2.288386, 2.305610,
+2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.428642, 2.445866,
+2.463091, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
+2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
+2.736221, 2.755906, 2.775591, 2.795276, 2.817421, 2.839567, 2.861713,
+2.883858, 2.901083, 2.918307, 2.935532, 2.952756, 1.437008, 1.437008,
+1.437008, 1.437008, 1.437008, 1.441929, 1.446850, 1.451772, 1.456693,
+1.456693, 1.456693, 1.456693, 1.456693, 1.446850, 1.437008, 1.427165,
+1.417323, 1.427165, 1.437008, 1.446850, 1.456693, 1.451772, 1.446850,
+1.441929, 1.437008, 1.437008, 1.437008, 1.437008, 1.437008, 1.441929,
+1.446850, 1.451772, 1.456693, 1.451772, 1.446850, 1.441929, 1.437008,
+1.441929, 1.446850, 1.451772, 1.456693, 1.451772, 1.446850, 1.441929,
+1.437008, 1.437008, 1.437008, 1.437008, 1.437008, 1.451772, 1.466535,
+1.481299, 1.496063, 1.505906, 1.515748, 1.525591, 1.535433, 1.564961,
+1.594488, 1.624016, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913,
+1.712598, 1.732283, 1.751969, 1.771654, 1.796260, 1.820866, 1.845472,
+1.870079, 1.889764, 1.909449, 1.929134, 1.948819, 1.963583, 1.978346,
+1.993110, 2.007874, 2.032480, 2.057087, 2.081693, 2.106299, 2.125984,
+2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780,
+2.278543, 2.293307, 2.308071, 2.322835, 2.347441, 2.372047, 2.396654,
+2.421260, 2.436024, 2.450787, 2.465551, 2.480315, 2.500000, 2.519685,
+2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.657480,
+2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
+2.819882, 2.844488, 2.869095, 2.893701, 2.908465, 2.923229, 2.937992,
+2.952756, 1.446850, 1.446850, 1.446850, 1.446850, 1.446850, 1.454232,
+1.461614, 1.468996, 1.476378, 1.476378, 1.476378, 1.476378, 1.476378,
+1.466535, 1.456693, 1.446850, 1.437008, 1.446850, 1.456693, 1.466535,
+1.476378, 1.473917, 1.471457, 1.468996, 1.466535, 1.461614, 1.456693,
+1.451772, 1.446850, 1.454232, 1.461614, 1.468996, 1.476378, 1.468996,
+1.461614, 1.454232, 1.446850, 1.454232, 1.461614, 1.468996, 1.476378,
+1.468996, 1.461614, 1.454232, 1.446850, 1.446850, 1.446850, 1.446850,
+1.446850, 1.459154, 1.471457, 1.483760, 1.496063, 1.505906, 1.515748,
+1.525591, 1.535433, 1.564961, 1.594488, 1.624016, 1.653543, 1.663386,
+1.673228, 1.683071, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654,
+1.793799, 1.815945, 1.838091, 1.860236, 1.884843, 1.909449, 1.934055,
+1.958661, 1.970965, 1.983268, 1.995571, 2.007874, 2.034941, 2.062008,
+2.089075, 2.116142, 2.130906, 2.145669, 2.160433, 2.175197, 2.199803,
+2.224410, 2.249016, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835,
+2.349902, 2.376969, 2.404035, 2.431102, 2.443406, 2.455709, 2.468012,
+2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
+2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221,
+2.755906, 2.775591, 2.795276, 2.822343, 2.849410, 2.876476, 2.903543,
+2.915847, 2.928150, 2.940453, 2.952756, 1.456693, 1.456693, 1.456693,
+1.456693, 1.456693, 1.466535, 1.476378, 1.486220, 1.496063, 1.496063,
+1.496063, 1.496063, 1.496063, 1.486220, 1.476378, 1.466535, 1.456693,
+1.466535, 1.476378, 1.486220, 1.496063, 1.496063, 1.496063, 1.496063,
+1.496063, 1.486220, 1.476378, 1.466535, 1.456693, 1.466535, 1.476378,
+1.486220, 1.496063, 1.486220, 1.476378, 1.466535, 1.456693, 1.466535,
+1.476378, 1.486220, 1.496063, 1.486220, 1.476378, 1.466535, 1.456693,
+1.456693, 1.456693, 1.456693, 1.456693, 1.466535, 1.476378, 1.486220,
+1.496063, 1.505906, 1.515748, 1.525591, 1.535433, 1.564961, 1.594488,
+1.624016, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913, 1.712598,
+1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.830709, 1.850394,
+1.879921, 1.909449, 1.938976, 1.968504, 1.978346, 1.988189, 1.998031,
+2.007874, 2.037402, 2.066929, 2.096457, 2.125984, 2.135827, 2.145669,
+2.155512, 2.165354, 2.194882, 2.224410, 2.253937, 2.283465, 2.293307,
+2.303150, 2.312992, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945,
+2.450787, 2.460630, 2.470472, 2.480315, 2.500000, 2.519685, 2.539370,
+2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677166,
+2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.824803,
+2.854331, 2.883858, 2.913386, 2.923228, 2.933071, 2.942913, 2.952756,
+1.476378, 1.476378, 1.476378, 1.476378, 1.476378, 1.486220, 1.496063,
+1.505906, 1.515748, 1.515748, 1.515748, 1.515748, 1.515748, 1.508366,
+1.500984, 1.493602, 1.486220, 1.493602, 1.500984, 1.508366, 1.515748,
+1.515748, 1.515748, 1.515748, 1.515748, 1.505906, 1.496063, 1.486220,
+1.476378, 1.483760, 1.491142, 1.498524, 1.505906, 1.500984, 1.496063,
+1.491142, 1.486220, 1.493602, 1.500984, 1.508366, 1.515748, 1.508366,
+1.500984, 1.493602, 1.486220, 1.483760, 1.481299, 1.478839, 1.476378,
+1.483760, 1.491142, 1.498524, 1.505906, 1.513287, 1.520669, 1.528051,
+1.535433, 1.562500, 1.589567, 1.616634, 1.643701, 1.658465, 1.673228,
+1.687992, 1.702756, 1.722441, 1.742126, 1.761811, 1.781496, 1.801181,
+1.820866, 1.840551, 1.860236, 1.884843, 1.909449, 1.934055, 1.958661,
+1.973425, 1.988189, 2.002953, 2.017717, 2.042323, 2.066929, 2.091536,
+2.116142, 2.128445, 2.140748, 2.153051, 2.165354, 2.192421, 2.219488,
+2.246555, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.349902,
+2.376969, 2.404035, 2.431102, 2.443406, 2.455709, 2.468012, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
+2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906,
+2.775591, 2.795276, 2.822343, 2.849410, 2.876476, 2.903543, 2.915847,
+2.928150, 2.940453, 2.952756, 1.496063, 1.496063, 1.496063, 1.496063,
+1.496063, 1.505906, 1.515748, 1.525591, 1.535433, 1.535433, 1.535433,
+1.535433, 1.535433, 1.530512, 1.525591, 1.520669, 1.515748, 1.520669,
+1.525591, 1.530512, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433,
+1.525591, 1.515748, 1.505906, 1.496063, 1.500984, 1.505906, 1.510827,
+1.515748, 1.515748, 1.515748, 1.515748, 1.515748, 1.520669, 1.525591,
+1.530512, 1.535433, 1.530512, 1.525591, 1.520669, 1.515748, 1.510827,
+1.505906, 1.500984, 1.496063, 1.500984, 1.505906, 1.510827, 1.515748,
+1.520669, 1.525591, 1.530512, 1.535433, 1.560039, 1.584646, 1.609252,
+1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969,
+1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764,
+1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559,
+2.047244, 2.066929, 2.086614, 2.106299, 2.121063, 2.135827, 2.150591,
+2.165354, 2.189961, 2.214567, 2.239173, 2.263780, 2.278543, 2.293307,
+2.308071, 2.322835, 2.347441, 2.372047, 2.396654, 2.421260, 2.436024,
+2.450787, 2.465551, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
+2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851,
+2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.819882, 2.844488,
+2.869095, 2.893701, 2.908465, 2.923229, 2.937992, 2.952756, 1.515748,
+1.515748, 1.515748, 1.515748, 1.515748, 1.525591, 1.535433, 1.545276,
+1.555118, 1.555118, 1.555118, 1.555118, 1.555118, 1.552657, 1.550197,
+1.547736, 1.545276, 1.547736, 1.550197, 1.552657, 1.555118, 1.555118,
+1.555118, 1.555118, 1.555118, 1.545276, 1.535433, 1.525591, 1.515748,
+1.518209, 1.520669, 1.523130, 1.525591, 1.530512, 1.535433, 1.540354,
+1.545276, 1.547736, 1.550197, 1.552657, 1.555118, 1.552657, 1.550197,
+1.547736, 1.545276, 1.537894, 1.530512, 1.523130, 1.515748, 1.518209,
+1.520669, 1.523130, 1.525591, 1.528051, 1.530512, 1.532972, 1.535433,
+1.557579, 1.579724, 1.601870, 1.624016, 1.648622, 1.673228, 1.697835,
+1.722441, 1.742126, 1.761811, 1.781496, 1.801181, 1.820866, 1.840551,
+1.860236, 1.879921, 1.894685, 1.909449, 1.924213, 1.938976, 1.963583,
+1.988189, 2.012795, 2.037402, 2.052165, 2.066929, 2.081693, 2.096457,
+2.113681, 2.130906, 2.148130, 2.165354, 2.187500, 2.209646, 2.231791,
+2.253937, 2.271161, 2.288386, 2.305610, 2.322835, 2.344980, 2.367126,
+2.389272, 2.411417, 2.428642, 2.445866, 2.463091, 2.480315, 2.500000,
+2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
+2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
+2.795276, 2.817421, 2.839567, 2.861713, 2.883858, 2.901083, 2.918307,
+2.935532, 2.952756, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433,
+1.545276, 1.555118, 1.564961, 1.574803, 1.574803, 1.574803, 1.574803,
+1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.574803,
+1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.564961,
+1.555118, 1.545276, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433,
+1.545276, 1.555118, 1.564961, 1.574803, 1.574803, 1.574803, 1.574803,
+1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.564961, 1.555118,
+1.545276, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433,
+1.535433, 1.535433, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173,
+1.643701, 1.673228, 1.702756, 1.732283, 1.751969, 1.771654, 1.791339,
+1.811024, 1.830709, 1.850394, 1.870079, 1.889764, 1.899606, 1.909449,
+1.919291, 1.929134, 1.958661, 1.988189, 2.017717, 2.047244, 2.057087,
+2.066929, 2.076772, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354,
+2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
+2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945,
+2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
+2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
+2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331,
+2.874016, 2.893701, 2.913386, 2.933071, 2.952756, 1.564961, 1.564961,
+1.564961, 1.564961, 1.564961, 1.569882, 1.574803, 1.579724, 1.584646,
+1.587106, 1.589567, 1.592028, 1.594488, 1.592028, 1.589567, 1.587106,
+1.584646, 1.587106, 1.589567, 1.592028, 1.594488, 1.594488, 1.594488,
+1.594488, 1.594488, 1.587106, 1.579724, 1.572343, 1.564961, 1.564961,
+1.564961, 1.564961, 1.564961, 1.572343, 1.579724, 1.587106, 1.594488,
+1.594488, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488,
+1.594488, 1.584646, 1.574803, 1.564961, 1.555118, 1.557579, 1.560039,
+1.562500, 1.564961, 1.564961, 1.564961, 1.564961, 1.564961, 1.584646,
+1.604331, 1.624016, 1.643701, 1.668307, 1.692913, 1.717520, 1.742126,
+1.764272, 1.786417, 1.808563, 1.830709, 1.847933, 1.865157, 1.882382,
+1.899606, 1.911909, 1.924213, 1.936516, 1.948819, 1.975886, 2.002953,
+2.030020, 2.057087, 2.069390, 2.081693, 2.093996, 2.106299, 2.125984,
+2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780,
+2.283465, 2.303150, 2.322835, 2.342520, 2.364665, 2.386811, 2.408957,
+2.431103, 2.450788, 2.470473, 2.490158, 2.509843, 2.529528, 2.549213,
+2.568898, 2.588583, 2.605807, 2.623032, 2.640256, 2.657480, 2.677166,
+2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.814961,
+2.834646, 2.854331, 2.874016, 2.893701, 2.915847, 2.937992, 2.960138,
+2.982284, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488,
+1.594488, 1.594488, 1.594488, 1.599409, 1.604331, 1.609252, 1.614173,
+1.609252, 1.604331, 1.599409, 1.594488, 1.599409, 1.604331, 1.609252,
+1.614173, 1.614173, 1.614173, 1.614173, 1.614173, 1.609252, 1.604331,
+1.599409, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488, 1.599409,
+1.604331, 1.609252, 1.614173, 1.614173, 1.614173, 1.614173, 1.614173,
+1.614173, 1.614173, 1.614173, 1.614173, 1.604331, 1.594488, 1.584646,
+1.574803, 1.579724, 1.584646, 1.589567, 1.594488, 1.594488, 1.594488,
+1.594488, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
+1.712598, 1.732283, 1.751969, 1.776575, 1.801181, 1.825787, 1.850394,
+1.865157, 1.879921, 1.894685, 1.909449, 1.924213, 1.938976, 1.953740,
+1.968504, 1.993110, 2.017717, 2.042323, 2.066929, 2.081693, 2.096457,
+2.111221, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410,
+2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
+2.386811, 2.411417, 2.436024, 2.460630, 2.480315, 2.500000, 2.519685,
+2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.632874, 2.647638,
+2.662402, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
+2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
+2.937992, 2.962599, 2.987205, 3.011811, 1.624016, 1.624016, 1.624016,
+1.624016, 1.624016, 1.619094, 1.614173, 1.609252, 1.604331, 1.611713,
+1.619094, 1.626476, 1.633858, 1.626476, 1.619094, 1.611713, 1.604331,
+1.611713, 1.619094, 1.626476, 1.633858, 1.633858, 1.633858, 1.633858,
+1.633858, 1.631398, 1.628937, 1.626476, 1.624016, 1.624016, 1.624016,
+1.624016, 1.624016, 1.626476, 1.628937, 1.631398, 1.633858, 1.633858,
+1.633858, 1.633858, 1.633858, 1.633858, 1.633858, 1.633858, 1.633858,
+1.624016, 1.614173, 1.604331, 1.594488, 1.601870, 1.609252, 1.616634,
+1.624016, 1.624016, 1.624016, 1.624016, 1.624016, 1.643701, 1.663386,
+1.683071, 1.702756, 1.717520, 1.732283, 1.747047, 1.761811, 1.788878,
+1.815945, 1.843012, 1.870079, 1.882382, 1.894685, 1.906988, 1.919291,
+1.936516, 1.953740, 1.970965, 1.988189, 2.010335, 2.032480, 2.054626,
+2.076772, 2.093996, 2.111221, 2.128445, 2.145669, 2.165354, 2.185039,
+2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
+2.342520, 2.362205, 2.381890, 2.408957, 2.436024, 2.463091, 2.490158,
+2.509843, 2.529528, 2.549213, 2.568898, 2.588583, 2.608268, 2.627953,
+2.647638, 2.659941, 2.672244, 2.684547, 2.696851, 2.716536, 2.736221,
+2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016,
+2.893701, 2.913386, 2.933071, 2.960138, 2.987205, 3.014272, 3.041339,
+1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.643701, 1.633858,
+1.624016, 1.614173, 1.624016, 1.633858, 1.643701, 1.653543, 1.643701,
+1.633858, 1.624016, 1.614173, 1.624016, 1.633858, 1.643701, 1.653543,
+1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543,
+1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543,
+1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543,
+1.653543, 1.653543, 1.653543, 1.643701, 1.633858, 1.624016, 1.614173,
+1.624016, 1.633858, 1.643701, 1.653543, 1.653543, 1.653543, 1.653543,
+1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.742126, 1.751969,
+1.761811, 1.771654, 1.801181, 1.830709, 1.860236, 1.889764, 1.899606,
+1.909449, 1.919291, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874,
+2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
+2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465,
+2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.431102,
+2.460630, 2.490157, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
+2.618110, 2.637795, 2.657480, 2.677166, 2.687008, 2.696851, 2.706693,
+2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646,
+2.854331, 2.874016, 2.893701, 2.913386, 2.933071, 2.952756, 2.982283,
+3.011811, 3.041338, 3.070866, 1.663386, 1.665846, 1.668307, 1.670768,
+1.673228, 1.665846, 1.658465, 1.651083, 1.643701, 1.651083, 1.658465,
+1.665846, 1.673228, 1.663386, 1.653543, 1.643701, 1.633858, 1.643701,
+1.653543, 1.663386, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
+1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
+1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
+1.673228, 1.673228, 1.670768, 1.668307, 1.665846, 1.663386, 1.658465,
+1.653543, 1.648622, 1.643701, 1.648622, 1.653543, 1.658465, 1.663386,
+1.663386, 1.663386, 1.663386, 1.663386, 1.680610, 1.697835, 1.715059,
+1.732283, 1.744587, 1.756890, 1.769193, 1.781496, 1.806102, 1.830709,
+1.855315, 1.879921, 1.892224, 1.904528, 1.916831, 1.929134, 1.948819,
+1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
+2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410,
+2.244095, 2.266240, 2.288386, 2.310532, 2.332677, 2.349902, 2.367126,
+2.384350, 2.401575, 2.428642, 2.455709, 2.482776, 2.509843, 2.529528,
+2.549213, 2.568898, 2.588583, 2.610729, 2.632874, 2.655020, 2.677166,
+2.689469, 2.701772, 2.714075, 2.726378, 2.746063, 2.765748, 2.785433,
+2.805118, 2.824803, 2.844488, 2.864173, 2.883858, 2.903543, 2.923229,
+2.942914, 2.962599, 2.987205, 3.011811, 3.036417, 3.061024, 1.673228,
+1.678150, 1.683071, 1.687992, 1.692913, 1.687992, 1.683071, 1.678150,
+1.673228, 1.678150, 1.683071, 1.687992, 1.692913, 1.683071, 1.673228,
+1.663386, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913, 1.692913,
+1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913,
+1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913,
+1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.687992, 1.683071,
+1.678150, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
+1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
+1.687992, 1.702756, 1.717520, 1.732283, 1.747047, 1.761811, 1.776575,
+1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.884843, 1.899606,
+1.914370, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559,
+2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354,
+2.185039, 2.204724, 2.224410, 2.244095, 2.268701, 2.293307, 2.317913,
+2.342520, 2.357284, 2.372047, 2.386811, 2.401575, 2.426181, 2.450787,
+2.475394, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.603347,
+2.627953, 2.652559, 2.677166, 2.691929, 2.706693, 2.721457, 2.736221,
+2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016,
+2.893701, 2.913386, 2.933071, 2.952756, 2.972441, 2.992126, 3.011811,
+3.031496, 3.051181, 1.683071, 1.690453, 1.697835, 1.705217, 1.712598,
+1.710138, 1.707677, 1.705217, 1.702756, 1.705217, 1.707677, 1.710138,
+1.712598, 1.702756, 1.692913, 1.683071, 1.673228, 1.683071, 1.692913,
+1.702756, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598,
+1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598,
+1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598,
+1.712598, 1.705217, 1.697835, 1.690453, 1.683071, 1.687992, 1.692913,
+1.697835, 1.702756, 1.697835, 1.692913, 1.687992, 1.683071, 1.683071,
+1.683071, 1.683071, 1.683071, 1.695374, 1.707677, 1.719980, 1.732283,
+1.749508, 1.766732, 1.783957, 1.801181, 1.815945, 1.830709, 1.845472,
+1.860236, 1.877461, 1.894685, 1.911909, 1.929134, 1.948819, 1.968504,
+1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299,
+2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
+2.271161, 2.298228, 2.325295, 2.352362, 2.364665, 2.376969, 2.389272,
+2.401575, 2.423720, 2.445866, 2.468012, 2.490158, 2.509843, 2.529528,
+2.549213, 2.568898, 2.595965, 2.623032, 2.650099, 2.677166, 2.694390,
+2.711614, 2.728839, 2.746063, 2.765748, 2.785433, 2.805118, 2.824803,
+2.844488, 2.864173, 2.883858, 2.903543, 2.923229, 2.942914, 2.962599,
+2.982284, 2.997047, 3.011811, 3.026575, 3.041339, 1.692913, 1.702756,
+1.712598, 1.722441, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283,
+1.732283, 1.732283, 1.732283, 1.732283, 1.722441, 1.712598, 1.702756,
+1.692913, 1.702756, 1.712598, 1.722441, 1.732283, 1.732283, 1.732283,
+1.732283, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283,
+1.732283, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283,
+1.732283, 1.732283, 1.732283, 1.732283, 1.722441, 1.712598, 1.702756,
+1.692913, 1.702756, 1.712598, 1.722441, 1.732283, 1.722441, 1.712598,
+1.702756, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.702756,
+1.712598, 1.722441, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024,
+1.820866, 1.830709, 1.840551, 1.850394, 1.870079, 1.889764, 1.909449,
+1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244,
+2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039,
+2.204724, 2.224410, 2.244095, 2.273622, 2.303150, 2.332677, 2.362205,
+2.372047, 2.381890, 2.391732, 2.401575, 2.421260, 2.440945, 2.460630,
+2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110,
+2.647638, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
+2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
+2.933071, 2.952756, 2.972441, 2.992126, 3.001968, 3.011811, 3.021653,
+3.031496, 1.712598, 1.719980, 1.727362, 1.734744, 1.742126, 1.742126,
+1.742126, 1.742126, 1.742126, 1.742126, 1.742126, 1.742126, 1.742126,
+1.737205, 1.732283, 1.727362, 1.722441, 1.729823, 1.737205, 1.744587,
+1.751969, 1.749508, 1.747047, 1.744587, 1.742126, 1.744587, 1.747047,
+1.749508, 1.751969, 1.749508, 1.747047, 1.744587, 1.742126, 1.742126,
+1.742126, 1.742126, 1.742126, 1.744587, 1.747047, 1.749508, 1.751969,
+1.744587, 1.737205, 1.729823, 1.722441, 1.729823, 1.737205, 1.744587,
+1.751969, 1.744587, 1.737205, 1.729823, 1.722441, 1.719980, 1.717520,
+1.715059, 1.712598, 1.722441, 1.732283, 1.742126, 1.751969, 1.766732,
+1.781496, 1.796260, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394,
+1.872539, 1.894685, 1.916831, 1.938976, 1.956201, 1.973425, 1.990650,
+2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984,
+2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.271161,
+2.298228, 2.325295, 2.352362, 2.364665, 2.376969, 2.389272, 2.401575,
+2.423720, 2.445866, 2.468012, 2.490158, 2.507382, 2.524606, 2.541831,
+2.559055, 2.586122, 2.613189, 2.640256, 2.667323, 2.687008, 2.706693,
+2.726378, 2.746063, 2.765748, 2.785433, 2.805118, 2.824803, 2.844488,
+2.864173, 2.883858, 2.903543, 2.923229, 2.942914, 2.962599, 2.982284,
+2.994587, 3.006890, 3.019193, 3.031496, 1.732283, 1.737205, 1.742126,
+1.747047, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969,
+1.751969, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969,
+1.756890, 1.761811, 1.766732, 1.771654, 1.766732, 1.761811, 1.756890,
+1.751969, 1.756890, 1.761811, 1.766732, 1.771654, 1.766732, 1.761811,
+1.756890, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969, 1.756890,
+1.761811, 1.766732, 1.771654, 1.766732, 1.761811, 1.756890, 1.751969,
+1.756890, 1.761811, 1.766732, 1.771654, 1.766732, 1.761811, 1.756890,
+1.751969, 1.747047, 1.742126, 1.737205, 1.732283, 1.742126, 1.751969,
+1.761811, 1.771654, 1.781496, 1.791339, 1.801181, 1.811024, 1.820866,
+1.830709, 1.840551, 1.850394, 1.875000, 1.899606, 1.924213, 1.948819,
+1.963583, 1.978346, 1.993110, 2.007874, 2.027559, 2.047244, 2.066929,
+2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
+2.224410, 2.244095, 2.268701, 2.293307, 2.317913, 2.342520, 2.357284,
+2.372047, 2.386811, 2.401575, 2.426181, 2.450787, 2.475394, 2.500000,
+2.514764, 2.529528, 2.544291, 2.559055, 2.583662, 2.608268, 2.632874,
+2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
+2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
+2.933071, 2.952756, 2.972441, 2.987205, 3.001969, 3.016732, 3.031496,
+1.751969, 1.754429, 1.756890, 1.759350, 1.761811, 1.761811, 1.761811,
+1.761811, 1.761811, 1.761811, 1.761811, 1.761811, 1.761811, 1.766732,
+1.771654, 1.776575, 1.781496, 1.783957, 1.786417, 1.788878, 1.791339,
+1.783957, 1.776575, 1.769193, 1.761811, 1.769193, 1.776575, 1.783957,
+1.791339, 1.783957, 1.776575, 1.769193, 1.761811, 1.761811, 1.761811,
+1.761811, 1.761811, 1.769193, 1.776575, 1.783957, 1.791339, 1.788878,
+1.786417, 1.783957, 1.781496, 1.783957, 1.786417, 1.788878, 1.791339,
+1.788878, 1.786417, 1.783957, 1.781496, 1.774114, 1.766732, 1.759350,
+1.751969, 1.761811, 1.771654, 1.781496, 1.791339, 1.796260, 1.801181,
+1.806102, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.877461,
+1.904528, 1.931594, 1.958661, 1.970965, 1.983268, 1.995571, 2.007874,
+2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
+2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.266240, 2.288386,
+2.310532, 2.332677, 2.349902, 2.367126, 2.384350, 2.401575, 2.428642,
+2.455709, 2.482776, 2.509843, 2.522146, 2.534449, 2.546752, 2.559055,
+2.581201, 2.603347, 2.625492, 2.647638, 2.667323, 2.687008, 2.706693,
+2.726378, 2.746063, 2.765748, 2.785433, 2.805118, 2.824803, 2.844488,
+2.864173, 2.883858, 2.903543, 2.923229, 2.942914, 2.962599, 2.979823,
+2.997047, 3.014272, 3.031496, 1.771654, 1.771654, 1.771654, 1.771654,
+1.771654, 1.771654, 1.771654, 1.771654, 1.771654, 1.771654, 1.771654,
+1.771654, 1.771654, 1.781496, 1.791339, 1.801181, 1.811024, 1.811024,
+1.811024, 1.811024, 1.811024, 1.801181, 1.791339, 1.781496, 1.771654,
+1.781496, 1.791339, 1.801181, 1.811024, 1.801181, 1.791339, 1.781496,
+1.771654, 1.771654, 1.771654, 1.771654, 1.771654, 1.781496, 1.791339,
+1.801181, 1.811024, 1.811024, 1.811024, 1.811024, 1.811024, 1.811024,
+1.811024, 1.811024, 1.811024, 1.811024, 1.811024, 1.811024, 1.811024,
+1.801181, 1.791339, 1.781496, 1.771654, 1.781496, 1.791339, 1.801181,
+1.811024, 1.811024, 1.811024, 1.811024, 1.811024, 1.820866, 1.830709,
+1.840551, 1.850394, 1.879921, 1.909449, 1.938976, 1.968504, 1.978346,
+1.988189, 1.998031, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
+2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410,
+2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
+2.381890, 2.401575, 2.431102, 2.460630, 2.490157, 2.519685, 2.529528,
+2.539370, 2.549213, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
+2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
+2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
+2.933071, 2.952756, 2.972441, 2.992126, 3.011811, 3.031496, 1.801181,
+1.798720, 1.796260, 1.793799, 1.791339, 1.793799, 1.796260, 1.798720,
+1.801181, 1.798720, 1.796260, 1.793799, 1.791339, 1.798720, 1.806102,
+1.813484, 1.820866, 1.820866, 1.820866, 1.820866, 1.820866, 1.815945,
+1.811024, 1.806102, 1.801181, 1.808563, 1.815945, 1.823327, 1.830709,
+1.823327, 1.815945, 1.808563, 1.801181, 1.798720, 1.796260, 1.793799,
+1.791339, 1.801181, 1.811024, 1.820866, 1.830709, 1.830709, 1.830709,
+1.830709, 1.830709, 1.830709, 1.830709, 1.830709, 1.830709, 1.830709,
+1.830709, 1.830709, 1.830709, 1.823327, 1.815945, 1.808563, 1.801181,
+1.806102, 1.811024, 1.815945, 1.820866, 1.820866, 1.820866, 1.820866,
+1.820866, 1.835630, 1.850394, 1.865157, 1.879921, 1.904528, 1.929134,
+1.953740, 1.978346, 1.990650, 2.002953, 2.015256, 2.027559, 2.047244,
+2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039,
+2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
+2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.450787, 2.480315,
+2.509843, 2.539370, 2.549213, 2.559055, 2.568898, 2.578740, 2.600886,
+2.623032, 2.645177, 2.667323, 2.684547, 2.701772, 2.718996, 2.736221,
+2.758366, 2.780512, 2.802658, 2.824803, 2.844488, 2.864173, 2.883858,
+2.903543, 2.920768, 2.937992, 2.955217, 2.972441, 2.992126, 3.011811,
+3.031496, 3.051181, 1.830709, 1.825787, 1.820866, 1.815945, 1.811024,
+1.815945, 1.820866, 1.825787, 1.830709, 1.825787, 1.820866, 1.815945,
+1.811024, 1.815945, 1.820866, 1.825787, 1.830709, 1.830709, 1.830709,
+1.830709, 1.830709, 1.830709, 1.830709, 1.830709, 1.830709, 1.835630,
+1.840551, 1.845472, 1.850394, 1.845472, 1.840551, 1.835630, 1.830709,
+1.825787, 1.820866, 1.815945, 1.811024, 1.820866, 1.830709, 1.840551,
+1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394,
+1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.845472,
+1.840551, 1.835630, 1.830709, 1.830709, 1.830709, 1.830709, 1.830709,
+1.830709, 1.830709, 1.830709, 1.830709, 1.850394, 1.870079, 1.889764,
+1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.002953, 2.017717,
+2.032480, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
+2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465,
+2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260,
+2.440945, 2.470472, 2.500000, 2.529528, 2.559055, 2.568898, 2.578740,
+2.588583, 2.598425, 2.623032, 2.647638, 2.672244, 2.696851, 2.711614,
+2.726378, 2.741142, 2.755906, 2.780512, 2.805118, 2.829725, 2.854331,
+2.874016, 2.893701, 2.913386, 2.933071, 2.947835, 2.962599, 2.977362,
+2.992126, 3.011811, 3.031496, 3.051181, 3.070866, 1.860236, 1.852854,
+1.845472, 1.838091, 1.830709, 1.838091, 1.845472, 1.852854, 1.860236,
+1.852854, 1.845472, 1.838091, 1.830709, 1.833169, 1.835630, 1.838091,
+1.840551, 1.840551, 1.840551, 1.840551, 1.840551, 1.845472, 1.850394,
+1.855315, 1.860236, 1.862697, 1.865157, 1.867618, 1.870079, 1.867618,
+1.865157, 1.862697, 1.860236, 1.852854, 1.845472, 1.838091, 1.830709,
+1.840551, 1.850394, 1.860236, 1.870079, 1.870079, 1.870079, 1.870079,
+1.870079, 1.870079, 1.870079, 1.870079, 1.870079, 1.870079, 1.870079,
+1.870079, 1.870079, 1.867618, 1.865157, 1.862697, 1.860236, 1.855315,
+1.850394, 1.845472, 1.840551, 1.840551, 1.840551, 1.840551, 1.840551,
+1.865157, 1.889764, 1.914370, 1.938976, 1.953740, 1.968504, 1.983268,
+1.998031, 2.015256, 2.032480, 2.049705, 2.066929, 2.086614, 2.106299,
+2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
+2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890,
+2.401575, 2.421260, 2.440945, 2.460630, 2.490157, 2.519685, 2.549213,
+2.578740, 2.588583, 2.598425, 2.608268, 2.618110, 2.645177, 2.672244,
+2.699311, 2.726378, 2.738681, 2.750984, 2.763287, 2.775591, 2.802658,
+2.829725, 2.856791, 2.883858, 2.903543, 2.923229, 2.942914, 2.962599,
+2.974902, 2.987205, 2.999508, 3.011811, 3.031496, 3.051181, 3.070866,
+3.090551, 1.889764, 1.879921, 1.870079, 1.860236, 1.850394, 1.860236,
+1.870079, 1.879921, 1.889764, 1.879921, 1.870079, 1.860236, 1.850394,
+1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394,
+1.850394, 1.860236, 1.870079, 1.879921, 1.889764, 1.889764, 1.889764,
+1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.879921,
+1.870079, 1.860236, 1.850394, 1.860236, 1.870079, 1.879921, 1.889764,
+1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764,
+1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764,
+1.889764, 1.889764, 1.879921, 1.870079, 1.860236, 1.850394, 1.850394,
+1.850394, 1.850394, 1.850394, 1.879921, 1.909449, 1.938976, 1.968504,
+1.978346, 1.988189, 1.998031, 2.007874, 2.027559, 2.047244, 2.066929,
+2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
+2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
+2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
+2.509843, 2.539370, 2.568898, 2.598425, 2.608268, 2.618110, 2.627953,
+2.637795, 2.667323, 2.696851, 2.726378, 2.755906, 2.765748, 2.775591,
+2.785433, 2.795276, 2.824803, 2.854331, 2.883858, 2.913386, 2.933071,
+2.952756, 2.972441, 2.992126, 3.001968, 3.011811, 3.021653, 3.031496,
+3.051181, 3.070866, 3.090551, 3.110236, 1.909449, 1.899606, 1.889764,
+1.879921, 1.870079, 1.879921, 1.889764, 1.899606, 1.909449, 1.899606,
+1.889764, 1.879921, 1.870079, 1.872539, 1.875000, 1.877461, 1.879921,
+1.877461, 1.875000, 1.872539, 1.870079, 1.877461, 1.884843, 1.892224,
+1.899606, 1.902067, 1.904528, 1.906988, 1.909449, 1.909449, 1.909449,
+1.909449, 1.909449, 1.902067, 1.894685, 1.887303, 1.879921, 1.884843,
+1.889764, 1.894685, 1.899606, 1.902067, 1.904528, 1.906988, 1.909449,
+1.906988, 1.904528, 1.902067, 1.899606, 1.899606, 1.899606, 1.899606,
+1.899606, 1.899606, 1.899606, 1.899606, 1.899606, 1.894685, 1.889764,
+1.884843, 1.879921, 1.879921, 1.879921, 1.879921, 1.879921, 1.902067,
+1.924213, 1.946358, 1.968504, 1.978346, 1.988189, 1.998031, 2.007874,
+2.027559, 2.047244, 2.066929, 2.086614, 2.108760, 2.130906, 2.153051,
+2.175197, 2.192421, 2.209646, 2.226870, 2.244095, 2.263780, 2.283465,
+2.303150, 2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.428642,
+2.445866, 2.463091, 2.480315, 2.507382, 2.534449, 2.561516, 2.588583,
+2.600886, 2.613189, 2.625492, 2.637795, 2.664862, 2.691929, 2.718996,
+2.746063, 2.758366, 2.770669, 2.782973, 2.795276, 2.822343, 2.849410,
+2.876476, 2.903543, 2.923229, 2.942914, 2.962599, 2.982284, 2.994587,
+3.006890, 3.019193, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236,
+1.929134, 1.919291, 1.909449, 1.899606, 1.889764, 1.899606, 1.909449,
+1.919291, 1.929134, 1.919291, 1.909449, 1.899606, 1.889764, 1.894685,
+1.899606, 1.904528, 1.909449, 1.904528, 1.899606, 1.894685, 1.889764,
+1.894685, 1.899606, 1.904528, 1.909449, 1.914370, 1.919291, 1.924213,
+1.929134, 1.929134, 1.929134, 1.929134, 1.929134, 1.924213, 1.919291,
+1.914370, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.914370,
+1.919291, 1.924213, 1.929134, 1.924213, 1.919291, 1.914370, 1.909449,
+1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449,
+1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449,
+1.909449, 1.909449, 1.924213, 1.938976, 1.953740, 1.968504, 1.978346,
+1.988189, 1.998031, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
+2.111221, 2.135827, 2.160433, 2.185039, 2.199803, 2.214567, 2.229331,
+2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.347441, 2.372047,
+2.396654, 2.421260, 2.436024, 2.450787, 2.465551, 2.480315, 2.504921,
+2.529528, 2.554134, 2.578740, 2.593504, 2.608268, 2.623032, 2.637795,
+2.662402, 2.687008, 2.711614, 2.736221, 2.750984, 2.765748, 2.780512,
+2.795276, 2.819882, 2.844488, 2.869095, 2.893701, 2.913386, 2.933071,
+2.952756, 2.972441, 2.987205, 3.001969, 3.016732, 3.031496, 3.051181,
+3.070866, 3.090551, 3.110236, 1.948819, 1.938976, 1.929134, 1.919291,
+1.909449, 1.919291, 1.929134, 1.938976, 1.948819, 1.938976, 1.929134,
+1.919291, 1.909449, 1.916831, 1.924213, 1.931594, 1.938976, 1.931594,
+1.924213, 1.916831, 1.909449, 1.911909, 1.914370, 1.916831, 1.919291,
+1.926673, 1.934055, 1.941437, 1.948819, 1.948819, 1.948819, 1.948819,
+1.948819, 1.946358, 1.943898, 1.941437, 1.938976, 1.934055, 1.929134,
+1.924213, 1.919291, 1.926673, 1.934055, 1.941437, 1.948819, 1.941437,
+1.934055, 1.926673, 1.919291, 1.919291, 1.919291, 1.919291, 1.919291,
+1.919291, 1.919291, 1.919291, 1.919291, 1.924213, 1.929134, 1.934055,
+1.938976, 1.938976, 1.938976, 1.938976, 1.938976, 1.946358, 1.953740,
+1.961122, 1.968504, 1.978346, 1.988189, 1.998031, 2.007874, 2.027559,
+2.047244, 2.066929, 2.086614, 2.113681, 2.140748, 2.167815, 2.194882,
+2.207185, 2.219488, 2.231791, 2.244095, 2.263780, 2.283465, 2.303150,
+2.322835, 2.349902, 2.376969, 2.404035, 2.431102, 2.443406, 2.455709,
+2.468012, 2.480315, 2.502461, 2.524606, 2.546752, 2.568898, 2.586122,
+2.603347, 2.620571, 2.637795, 2.659941, 2.682087, 2.704232, 2.726378,
+2.743603, 2.760827, 2.778051, 2.795276, 2.817421, 2.839567, 2.861713,
+2.883858, 2.903543, 2.923229, 2.942914, 2.962599, 2.979823, 2.997047,
+3.014272, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 1.968504,
+1.958661, 1.948819, 1.938976, 1.929134, 1.938976, 1.948819, 1.958661,
+1.968504, 1.958661, 1.948819, 1.938976, 1.929134, 1.938976, 1.948819,
+1.958661, 1.968504, 1.958661, 1.948819, 1.938976, 1.929134, 1.929134,
+1.929134, 1.929134, 1.929134, 1.938976, 1.948819, 1.958661, 1.968504,
+1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.968504,
+1.968504, 1.958661, 1.948819, 1.938976, 1.929134, 1.938976, 1.948819,
+1.958661, 1.968504, 1.958661, 1.948819, 1.938976, 1.929134, 1.929134,
+1.929134, 1.929134, 1.929134, 1.929134, 1.929134, 1.929134, 1.929134,
+1.938976, 1.948819, 1.958661, 1.968504, 1.968504, 1.968504, 1.968504,
+1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.978346, 1.988189,
+1.998031, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.116142,
+2.145669, 2.175197, 2.204724, 2.214567, 2.224410, 2.234252, 2.244095,
+2.263780, 2.283465, 2.303150, 2.322835, 2.352362, 2.381890, 2.411417,
+2.440945, 2.450787, 2.460630, 2.470472, 2.480315, 2.500000, 2.519685,
+2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.657480,
+2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
+2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386, 2.933071,
+2.952756, 2.972441, 2.992126, 3.011811, 3.031496, 3.051181, 3.070866,
+3.090551, 3.110236, 1.978346, 1.970965, 1.963583, 1.956201, 1.948819,
+1.956201, 1.963583, 1.970965, 1.978346, 1.973425, 1.968504, 1.963583,
+1.958661, 1.963583, 1.968504, 1.973425, 1.978346, 1.970965, 1.963583,
+1.956201, 1.948819, 1.948819, 1.948819, 1.948819, 1.948819, 1.956201,
+1.963583, 1.970965, 1.978346, 1.978346, 1.978346, 1.978346, 1.978346,
+1.978346, 1.978346, 1.978346, 1.978346, 1.970965, 1.963583, 1.956201,
+1.948819, 1.958661, 1.968504, 1.978346, 1.988189, 1.978346, 1.968504,
+1.958661, 1.948819, 1.948819, 1.948819, 1.948819, 1.948819, 1.948819,
+1.948819, 1.948819, 1.948819, 1.958661, 1.968504, 1.978346, 1.988189,
+1.985728, 1.983268, 1.980807, 1.978346, 1.978346, 1.978346, 1.978346,
+1.978346, 1.985728, 1.993110, 2.000492, 2.007874, 2.027559, 2.047244,
+2.066929, 2.086614, 2.113681, 2.140748, 2.167815, 2.194882, 2.209646,
+2.224410, 2.239173, 2.253937, 2.271161, 2.288386, 2.305610, 2.322835,
+2.349902, 2.376969, 2.404035, 2.431102, 2.445866, 2.460630, 2.475394,
+2.490158, 2.509843, 2.529528, 2.549213, 2.568898, 2.586122, 2.603347,
+2.620571, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221,
+2.755906, 2.775591, 2.795276, 2.817421, 2.839567, 2.861713, 2.883858,
+2.901083, 2.918307, 2.935532, 2.952756, 2.972441, 2.992126, 3.011811,
+3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 1.988189, 1.983268,
+1.978346, 1.973425, 1.968504, 1.973425, 1.978346, 1.983268, 1.988189,
+1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189,
+1.988189, 1.983268, 1.978346, 1.973425, 1.968504, 1.968504, 1.968504,
+1.968504, 1.968504, 1.973425, 1.978346, 1.983268, 1.988189, 1.988189,
+1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189,
+1.983268, 1.978346, 1.973425, 1.968504, 1.978346, 1.988189, 1.998031,
+2.007874, 1.998031, 1.988189, 1.978346, 1.968504, 1.968504, 1.968504,
+1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.978346,
+1.988189, 1.998031, 2.007874, 2.002953, 1.998031, 1.993110, 1.988189,
+1.988189, 1.988189, 1.988189, 1.988189, 1.993110, 1.998031, 2.002953,
+2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.111221, 2.135827,
+2.160433, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.278543,
+2.293307, 2.308071, 2.322835, 2.347441, 2.372047, 2.396654, 2.421260,
+2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
+2.578740, 2.593504, 2.608268, 2.623032, 2.637795, 2.657480, 2.677166,
+2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.819882,
+2.844488, 2.869095, 2.893701, 2.908465, 2.923229, 2.937992, 2.952756,
+2.972441, 2.992126, 3.011811, 3.031496, 3.051181, 3.070866, 3.090551,
+3.110236, 1.998031, 1.995571, 1.993110, 1.990650, 1.988189, 1.990650,
+1.993110, 1.995571, 1.998031, 2.002953, 2.007874, 2.012795, 2.017717,
+2.012795, 2.007874, 2.002953, 1.998031, 1.995571, 1.993110, 1.990650,
+1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.990650, 1.993110,
+1.995571, 1.998031, 1.998031, 1.998031, 1.998031, 1.998031, 1.998031,
+1.998031, 1.998031, 1.998031, 1.995571, 1.993110, 1.990650, 1.988189,
+1.998031, 2.007874, 2.017717, 2.027559, 2.017717, 2.007874, 1.998031,
+1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189,
+1.988189, 1.988189, 1.998031, 2.007874, 2.017717, 2.027559, 2.020177,
+2.012795, 2.005414, 1.998031, 1.998031, 1.998031, 1.998031, 1.998031,
+2.000492, 2.002953, 2.005414, 2.007874, 2.027559, 2.047244, 2.066929,
+2.086614, 2.108760, 2.130906, 2.153051, 2.175197, 2.199803, 2.224410,
+2.249016, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.344980,
+2.367126, 2.389272, 2.411417, 2.436024, 2.460630, 2.485236, 2.509843,
+2.529528, 2.549213, 2.568898, 2.588583, 2.600886, 2.613189, 2.625492,
+2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906,
+2.775591, 2.795276, 2.822343, 2.849410, 2.876476, 2.903543, 2.915847,
+2.928150, 2.940453, 2.952756, 2.972441, 2.992126, 3.011811, 3.031496,
+3.051181, 3.070866, 3.090551, 3.110236, 2.007874, 2.007874, 2.007874,
+2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.017717,
+2.027559, 2.037402, 2.047244, 2.037402, 2.027559, 2.017717, 2.007874,
+2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874,
+2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874,
+2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874,
+2.007874, 2.007874, 2.007874, 2.017717, 2.027559, 2.037402, 2.047244,
+2.037402, 2.027559, 2.017717, 2.007874, 2.007874, 2.007874, 2.007874,
+2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.017717, 2.027559,
+2.037402, 2.047244, 2.037402, 2.027559, 2.017717, 2.007874, 2.007874,
+2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874,
+2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
+2.165354, 2.194882, 2.224410, 2.253937, 2.283465, 2.293307, 2.303150,
+2.312992, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.431102,
+2.460630, 2.490157, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
+2.608268, 2.618110, 2.627953, 2.637795, 2.657480, 2.677166, 2.696851,
+2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.824803, 2.854331,
+2.883858, 2.913386, 2.923228, 2.933071, 2.942913, 2.952756, 2.972441,
+2.992126, 3.011811, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236,
+2.027559, 2.030020, 2.032480, 2.034941, 2.037402, 2.037402, 2.037402,
+2.037402, 2.037402, 2.044784, 2.052165, 2.059547, 2.066929, 2.059547,
+2.052165, 2.044784, 2.037402, 2.034941, 2.032480, 2.030020, 2.027559,
+2.027559, 2.027559, 2.027559, 2.027559, 2.030020, 2.032480, 2.034941,
+2.037402, 2.037402, 2.037402, 2.037402, 2.037402, 2.034941, 2.032480,
+2.030020, 2.027559, 2.027559, 2.027559, 2.027559, 2.027559, 2.037402,
+2.047244, 2.057087, 2.066929, 2.057087, 2.047244, 2.037402, 2.027559,
+2.030020, 2.032480, 2.034941, 2.037402, 2.037402, 2.037402, 2.037402,
+2.037402, 2.042323, 2.047244, 2.052165, 2.057087, 2.052165, 2.047244,
+2.042323, 2.037402, 2.037402, 2.037402, 2.037402, 2.037402, 2.034941,
+2.032480, 2.030020, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299,
+2.125984, 2.145669, 2.165354, 2.185039, 2.212106, 2.239173, 2.266240,
+2.293307, 2.308071, 2.322835, 2.337598, 2.352362, 2.372047, 2.391732,
+2.411417, 2.431103, 2.458169, 2.485236, 2.512303, 2.539370, 2.559055,
+2.578740, 2.598425, 2.618110, 2.630414, 2.642717, 2.655020, 2.667323,
+2.684547, 2.701772, 2.718996, 2.736221, 2.755906, 2.775591, 2.795276,
+2.814961, 2.844488, 2.874016, 2.903543, 2.933071, 2.942913, 2.952756,
+2.962598, 2.972441, 2.992126, 3.011811, 3.031496, 3.051181, 3.070866,
+3.090551, 3.110236, 3.129921, 2.047244, 2.052165, 2.057087, 2.062008,
+2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.071851, 2.076772,
+2.081693, 2.086614, 2.081693, 2.076772, 2.071851, 2.066929, 2.062008,
+2.057087, 2.052165, 2.047244, 2.047244, 2.047244, 2.047244, 2.047244,
+2.052165, 2.057087, 2.062008, 2.066929, 2.066929, 2.066929, 2.066929,
+2.066929, 2.062008, 2.057087, 2.052165, 2.047244, 2.047244, 2.047244,
+2.047244, 2.047244, 2.057087, 2.066929, 2.076772, 2.086614, 2.076772,
+2.066929, 2.057087, 2.047244, 2.052165, 2.057087, 2.062008, 2.066929,
+2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.066929,
+2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.066929,
+2.066929, 2.066929, 2.062008, 2.057087, 2.052165, 2.047244, 2.066929,
+2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
+2.229331, 2.253937, 2.278543, 2.303150, 2.322835, 2.342520, 2.362205,
+2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.485236, 2.509843,
+2.534449, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.652559,
+2.667323, 2.682087, 2.696851, 2.711614, 2.726378, 2.741142, 2.755906,
+2.775591, 2.795276, 2.814961, 2.834646, 2.864173, 2.893701, 2.923228,
+2.952756, 2.962598, 2.972441, 2.982283, 2.992126, 3.011811, 3.031496,
+3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606, 2.066929,
+2.074311, 2.081693, 2.089075, 2.096457, 2.096457, 2.096457, 2.096457,
+2.096457, 2.098917, 2.101378, 2.103839, 2.106299, 2.103839, 2.101378,
+2.098917, 2.096457, 2.089075, 2.081693, 2.074311, 2.066929, 2.066929,
+2.066929, 2.066929, 2.066929, 2.074311, 2.081693, 2.089075, 2.096457,
+2.096457, 2.096457, 2.096457, 2.096457, 2.089075, 2.081693, 2.074311,
+2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.076772, 2.086614,
+2.096457, 2.106299, 2.096457, 2.086614, 2.076772, 2.066929, 2.074311,
+2.081693, 2.089075, 2.096457, 2.096457, 2.096457, 2.096457, 2.096457,
+2.091536, 2.086614, 2.081693, 2.076772, 2.081693, 2.086614, 2.091536,
+2.096457, 2.096457, 2.096457, 2.096457, 2.096457, 2.089075, 2.081693,
+2.074311, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354,
+2.185039, 2.204724, 2.224410, 2.246555, 2.268701, 2.290847, 2.312992,
+2.337598, 2.362205, 2.386811, 2.411417, 2.431102, 2.450787, 2.470472,
+2.490158, 2.512303, 2.534449, 2.556595, 2.578740, 2.598425, 2.618110,
+2.637795, 2.657480, 2.674705, 2.691929, 2.709154, 2.726378, 2.738681,
+2.750984, 2.763287, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331,
+2.883858, 2.913386, 2.942913, 2.972441, 2.982283, 2.992126, 3.001968,
+3.011811, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921,
+3.149606, 3.169291, 2.086614, 2.096457, 2.106299, 2.116142, 2.125984,
+2.125984, 2.125984, 2.125984, 2.125984, 2.125984, 2.125984, 2.125984,
+2.125984, 2.125984, 2.125984, 2.125984, 2.125984, 2.116142, 2.106299,
+2.096457, 2.086614, 2.086614, 2.086614, 2.086614, 2.086614, 2.096457,
+2.106299, 2.116142, 2.125984, 2.125984, 2.125984, 2.125984, 2.125984,
+2.116142, 2.106299, 2.096457, 2.086614, 2.086614, 2.086614, 2.086614,
+2.086614, 2.096457, 2.106299, 2.116142, 2.125984, 2.116142, 2.106299,
+2.096457, 2.086614, 2.096457, 2.106299, 2.116142, 2.125984, 2.125984,
+2.125984, 2.125984, 2.125984, 2.116142, 2.106299, 2.096457, 2.086614,
+2.096457, 2.106299, 2.116142, 2.125984, 2.125984, 2.125984, 2.125984,
+2.125984, 2.116142, 2.106299, 2.096457, 2.086614, 2.106299, 2.125984,
+2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780,
+2.283465, 2.303150, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945,
+2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
+2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
+2.736221, 2.755906, 2.765748, 2.775591, 2.785433, 2.795276, 2.814961,
+2.834646, 2.854331, 2.874016, 2.903543, 2.933071, 2.962598, 2.992126,
+3.001968, 3.011811, 3.021653, 3.031496, 3.051181, 3.070866, 3.090551,
+3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 2.116142, 2.121063,
+2.125984, 2.130906, 2.135827, 2.135827, 2.135827, 2.135827, 2.135827,
+2.138287, 2.140748, 2.143209, 2.145669, 2.145669, 2.145669, 2.145669,
+2.145669, 2.135827, 2.125984, 2.116142, 2.106299, 2.108760, 2.111221,
+2.113681, 2.116142, 2.123524, 2.130906, 2.138287, 2.145669, 2.145669,
+2.145669, 2.145669, 2.145669, 2.135827, 2.125984, 2.116142, 2.106299,
+2.106299, 2.106299, 2.106299, 2.106299, 2.116142, 2.125984, 2.135827,
+2.145669, 2.138287, 2.130906, 2.123524, 2.116142, 2.123524, 2.130906,
+2.138287, 2.145669, 2.143209, 2.140748, 2.138287, 2.135827, 2.128445,
+2.121063, 2.113681, 2.106299, 2.116142, 2.125984, 2.135827, 2.145669,
+2.143209, 2.140748, 2.138287, 2.135827, 2.130906, 2.125984, 2.121063,
+2.116142, 2.128445, 2.140748, 2.153051, 2.165354, 2.185039, 2.204724,
+2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.352362,
+2.381890, 2.411417, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685,
+2.536910, 2.554134, 2.571358, 2.588583, 2.610729, 2.632874, 2.655020,
+2.677166, 2.694390, 2.711614, 2.728839, 2.746063, 2.758366, 2.770669,
+2.782973, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.901083,
+2.928150, 2.955217, 2.982284, 2.994587, 3.006890, 3.019193, 3.031496,
+3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606, 3.169291,
+3.188977, 2.145669, 2.145669, 2.145669, 2.145669, 2.145669, 2.145669,
+2.145669, 2.145669, 2.145669, 2.150591, 2.155512, 2.160433, 2.165354,
+2.165354, 2.165354, 2.165354, 2.165354, 2.155512, 2.145669, 2.135827,
+2.125984, 2.130906, 2.135827, 2.140748, 2.145669, 2.150591, 2.155512,
+2.160433, 2.165354, 2.165354, 2.165354, 2.165354, 2.165354, 2.155512,
+2.145669, 2.135827, 2.125984, 2.125984, 2.125984, 2.125984, 2.125984,
+2.135827, 2.145669, 2.155512, 2.165354, 2.160433, 2.155512, 2.150591,
+2.145669, 2.150591, 2.155512, 2.160433, 2.165354, 2.160433, 2.155512,
+2.150591, 2.145669, 2.140748, 2.135827, 2.130906, 2.125984, 2.135827,
+2.145669, 2.155512, 2.165354, 2.160433, 2.155512, 2.150591, 2.145669,
+2.145669, 2.145669, 2.145669, 2.145669, 2.150591, 2.155512, 2.160433,
+2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465,
+2.303150, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945, 2.460630,
+2.480315, 2.500000, 2.519685, 2.534449, 2.549213, 2.563977, 2.578740,
+2.603347, 2.627953, 2.652559, 2.677166, 2.691929, 2.706693, 2.721457,
+2.736221, 2.750984, 2.765748, 2.780512, 2.795276, 2.814961, 2.834646,
+2.854331, 2.874016, 2.898622, 2.923229, 2.947835, 2.972441, 2.987205,
+3.001969, 3.016732, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236,
+3.129921, 3.149606, 3.169291, 3.188977, 2.175197, 2.170276, 2.165354,
+2.160433, 2.155512, 2.155512, 2.155512, 2.155512, 2.155512, 2.162894,
+2.170276, 2.177658, 2.185039, 2.185039, 2.185039, 2.185039, 2.185039,
+2.175197, 2.165354, 2.155512, 2.145669, 2.153051, 2.160433, 2.167815,
+2.175197, 2.177658, 2.180118, 2.182579, 2.185039, 2.185039, 2.185039,
+2.185039, 2.185039, 2.175197, 2.165354, 2.155512, 2.145669, 2.145669,
+2.145669, 2.145669, 2.145669, 2.155512, 2.165354, 2.175197, 2.185039,
+2.182579, 2.180118, 2.177658, 2.175197, 2.177658, 2.180118, 2.182579,
+2.185039, 2.177658, 2.170276, 2.162894, 2.155512, 2.153051, 2.150591,
+2.148130, 2.145669, 2.155512, 2.165354, 2.175197, 2.185039, 2.177658,
+2.170276, 2.162894, 2.155512, 2.160433, 2.165354, 2.170276, 2.175197,
+2.172736, 2.170276, 2.167815, 2.165354, 2.185039, 2.204724, 2.224410,
+2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.352362, 2.381890,
+2.411417, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.531988,
+2.544291, 2.556595, 2.568898, 2.595965, 2.623032, 2.650099, 2.677166,
+2.689469, 2.701772, 2.714075, 2.726378, 2.743603, 2.760827, 2.778051,
+2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.896162, 2.918307,
+2.940453, 2.962599, 2.979823, 2.997047, 3.014272, 3.031496, 3.051181,
+3.070866, 3.090551, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977,
+2.204724, 2.194882, 2.185039, 2.175197, 2.165354, 2.165354, 2.165354,
+2.165354, 2.165354, 2.175197, 2.185039, 2.194882, 2.204724, 2.204724,
+2.204724, 2.204724, 2.204724, 2.194882, 2.185039, 2.175197, 2.165354,
+2.175197, 2.185039, 2.194882, 2.204724, 2.204724, 2.204724, 2.204724,
+2.204724, 2.204724, 2.204724, 2.204724, 2.204724, 2.194882, 2.185039,
+2.175197, 2.165354, 2.165354, 2.165354, 2.165354, 2.165354, 2.175197,
+2.185039, 2.194882, 2.204724, 2.204724, 2.204724, 2.204724, 2.204724,
+2.204724, 2.204724, 2.204724, 2.204724, 2.194882, 2.185039, 2.175197,
+2.165354, 2.165354, 2.165354, 2.165354, 2.165354, 2.175197, 2.185039,
+2.194882, 2.204724, 2.194882, 2.185039, 2.175197, 2.165354, 2.175197,
+2.185039, 2.194882, 2.204724, 2.194882, 2.185039, 2.175197, 2.165354,
+2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
+2.322835, 2.352362, 2.381890, 2.411417, 2.440945, 2.460630, 2.480315,
+2.500000, 2.519685, 2.529528, 2.539370, 2.549213, 2.559055, 2.588583,
+2.618110, 2.647638, 2.677166, 2.687008, 2.696851, 2.706693, 2.716536,
+2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331,
+2.874016, 2.893701, 2.913386, 2.933071, 2.952756, 2.972441, 2.992126,
+3.011811, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921,
+3.149606, 3.169291, 3.188977, 2.224410, 2.217028, 2.209646, 2.202264,
+2.194882, 2.194882, 2.194882, 2.194882, 2.194882, 2.199803, 2.204724,
+2.209646, 2.214567, 2.214567, 2.214567, 2.214567, 2.214567, 2.209646,
+2.204724, 2.199803, 2.194882, 2.199803, 2.204724, 2.209646, 2.214567,
+2.217028, 2.219488, 2.221949, 2.224410, 2.224410, 2.224410, 2.224410,
+2.224410, 2.214567, 2.204724, 2.194882, 2.185039, 2.185039, 2.185039,
+2.185039, 2.185039, 2.194882, 2.204724, 2.214567, 2.224410, 2.224410,
+2.224410, 2.224410, 2.224410, 2.221949, 2.219488, 2.217028, 2.214567,
+2.209646, 2.204724, 2.199803, 2.194882, 2.194882, 2.194882, 2.194882,
+2.194882, 2.199803, 2.204724, 2.209646, 2.214567, 2.207185, 2.199803,
+2.192421, 2.185039, 2.194882, 2.204724, 2.214567, 2.224410, 2.214567,
+2.204724, 2.194882, 2.185039, 2.202264, 2.219488, 2.236713, 2.253937,
+2.271161, 2.288386, 2.305610, 2.322835, 2.349902, 2.376969, 2.404035,
+2.431102, 2.450787, 2.470472, 2.490157, 2.509843, 2.522146, 2.534449,
+2.546752, 2.559055, 2.588583, 2.618110, 2.647638, 2.677166, 2.687008,
+2.696851, 2.706693, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
+2.817421, 2.839567, 2.861713, 2.883858, 2.903543, 2.923229, 2.942914,
+2.962599, 2.979823, 2.997047, 3.014272, 3.031496, 3.051181, 3.070866,
+3.090551, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 2.244095,
+2.239173, 2.234252, 2.229331, 2.224410, 2.224410, 2.224410, 2.224410,
+2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410,
+2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410,
+2.224410, 2.224410, 2.224410, 2.229331, 2.234252, 2.239173, 2.244095,
+2.244095, 2.244095, 2.244095, 2.244095, 2.234252, 2.224410, 2.214567,
+2.204724, 2.204724, 2.204724, 2.204724, 2.204724, 2.214567, 2.224410,
+2.234252, 2.244095, 2.244095, 2.244095, 2.244095, 2.244095, 2.239173,
+2.234252, 2.229331, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410,
+2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410,
+2.224410, 2.219488, 2.214567, 2.209646, 2.204724, 2.214567, 2.224410,
+2.234252, 2.244095, 2.234252, 2.224410, 2.214567, 2.204724, 2.219488,
+2.234252, 2.249016, 2.263780, 2.278543, 2.293307, 2.308071, 2.322835,
+2.347441, 2.372047, 2.396654, 2.421260, 2.440945, 2.460630, 2.480315,
+2.500000, 2.514764, 2.529528, 2.544291, 2.559055, 2.588583, 2.618110,
+2.647638, 2.677166, 2.687008, 2.696851, 2.706693, 2.716536, 2.736221,
+2.755906, 2.775591, 2.795276, 2.819882, 2.844488, 2.869095, 2.893701,
+2.913386, 2.933071, 2.952756, 2.972441, 2.987205, 3.001969, 3.016732,
+3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606,
+3.169291, 3.188977, 2.263780, 2.261319, 2.258858, 2.256398, 2.253937,
+2.253937, 2.253937, 2.253937, 2.253937, 2.249016, 2.244095, 2.239173,
+2.234252, 2.234252, 2.234252, 2.234252, 2.234252, 2.239173, 2.244095,
+2.249016, 2.253937, 2.249016, 2.244095, 2.239173, 2.234252, 2.241634,
+2.249016, 2.256398, 2.263780, 2.263780, 2.263780, 2.263780, 2.263780,
+2.253937, 2.244095, 2.234252, 2.224410, 2.224410, 2.224410, 2.224410,
+2.224410, 2.234252, 2.244095, 2.253937, 2.263780, 2.263780, 2.263780,
+2.263780, 2.263780, 2.256398, 2.249016, 2.241634, 2.234252, 2.239173,
+2.244095, 2.249016, 2.253937, 2.253937, 2.253937, 2.253937, 2.253937,
+2.249016, 2.244095, 2.239173, 2.234252, 2.231791, 2.229331, 2.226870,
+2.224410, 2.234252, 2.244095, 2.253937, 2.263780, 2.253937, 2.244095,
+2.234252, 2.224410, 2.236713, 2.249016, 2.261319, 2.273622, 2.285925,
+2.298228, 2.310532, 2.322835, 2.344980, 2.367126, 2.389272, 2.411417,
+2.431102, 2.450787, 2.470472, 2.490158, 2.507382, 2.524606, 2.541831,
+2.559055, 2.588583, 2.618110, 2.647638, 2.677166, 2.687008, 2.696851,
+2.706693, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.822343,
+2.849410, 2.876476, 2.903543, 2.923229, 2.942914, 2.962599, 2.982284,
+2.994587, 3.006890, 3.019193, 3.031496, 3.051181, 3.070866, 3.090551,
+3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 2.283465, 2.283465,
+2.283465, 2.283465, 2.283465, 2.283465, 2.283465, 2.283465, 2.283465,
+2.273622, 2.263780, 2.253937, 2.244095, 2.244095, 2.244095, 2.244095,
+2.244095, 2.253937, 2.263780, 2.273622, 2.283465, 2.273622, 2.263780,
+2.253937, 2.244095, 2.253937, 2.263780, 2.273622, 2.283465, 2.283465,
+2.283465, 2.283465, 2.283465, 2.273622, 2.263780, 2.253937, 2.244095,
+2.244095, 2.244095, 2.244095, 2.244095, 2.253937, 2.263780, 2.273622,
+2.283465, 2.283465, 2.283465, 2.283465, 2.283465, 2.273622, 2.263780,
+2.253937, 2.244095, 2.253937, 2.263780, 2.273622, 2.283465, 2.283465,
+2.283465, 2.283465, 2.283465, 2.273622, 2.263780, 2.253937, 2.244095,
+2.244095, 2.244095, 2.244095, 2.244095, 2.253937, 2.263780, 2.273622,
+2.283465, 2.273622, 2.263780, 2.253937, 2.244095, 2.253937, 2.263780,
+2.273622, 2.283465, 2.293307, 2.303150, 2.312992, 2.322835, 2.342520,
+2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110, 2.647638,
+2.677166, 2.687008, 2.696851, 2.706693, 2.716536, 2.736221, 2.755906,
+2.775591, 2.795276, 2.824803, 2.854331, 2.883858, 2.913386, 2.933071,
+2.952756, 2.972441, 2.992126, 3.001968, 3.011811, 3.021653, 3.031496,
+3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606, 3.169291,
+3.188977, 2.303150, 2.300689, 2.298228, 2.295768, 2.293307, 2.295768,
+2.298228, 2.300689, 2.303150, 2.293307, 2.283465, 2.273622, 2.263780,
+2.263780, 2.263780, 2.263780, 2.263780, 2.273622, 2.283465, 2.293307,
+2.303150, 2.295768, 2.288386, 2.281004, 2.273622, 2.278543, 2.283465,
+2.288386, 2.293307, 2.293307, 2.293307, 2.293307, 2.293307, 2.288386,
+2.283465, 2.278543, 2.273622, 2.271161, 2.268701, 2.266240, 2.263780,
+2.271161, 2.278543, 2.285925, 2.293307, 2.293307, 2.293307, 2.293307,
+2.293307, 2.285925, 2.278543, 2.271161, 2.263780, 2.271161, 2.278543,
+2.285925, 2.293307, 2.293307, 2.293307, 2.293307, 2.293307, 2.288386,
+2.283465, 2.278543, 2.273622, 2.273622, 2.273622, 2.273622, 2.273622,
+2.278543, 2.283465, 2.288386, 2.293307, 2.285925, 2.278543, 2.271161,
+2.263780, 2.271161, 2.278543, 2.285925, 2.293307, 2.305610, 2.317913,
+2.330217, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945,
+2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
+2.608268, 2.637795, 2.667323, 2.696851, 2.709154, 2.721457, 2.733760,
+2.746063, 2.765748, 2.785433, 2.805118, 2.824803, 2.851870, 2.878937,
+2.906004, 2.933071, 2.950295, 2.967520, 2.984744, 3.001969, 3.014272,
+3.026575, 3.038878, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921,
+3.149606, 3.169291, 3.188977, 3.208662, 2.322835, 2.317913, 2.312992,
+2.308071, 2.303150, 2.308071, 2.312992, 2.317913, 2.322835, 2.312992,
+2.303150, 2.293307, 2.283465, 2.283465, 2.283465, 2.283465, 2.283465,
+2.293307, 2.303150, 2.312992, 2.322835, 2.317913, 2.312992, 2.308071,
+2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150,
+2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.298228,
+2.293307, 2.288386, 2.283465, 2.288386, 2.293307, 2.298228, 2.303150,
+2.303150, 2.303150, 2.303150, 2.303150, 2.298228, 2.293307, 2.288386,
+2.283465, 2.288386, 2.293307, 2.298228, 2.303150, 2.303150, 2.303150,
+2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150,
+2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150,
+2.298228, 2.293307, 2.288386, 2.283465, 2.288386, 2.293307, 2.298228,
+2.303150, 2.317913, 2.332677, 2.347441, 2.362205, 2.381890, 2.401575,
+2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370,
+2.559055, 2.578740, 2.598425, 2.627953, 2.657480, 2.687008, 2.716536,
+2.731299, 2.746063, 2.760827, 2.775591, 2.795276, 2.814961, 2.834646,
+2.854331, 2.878937, 2.903543, 2.928150, 2.952756, 2.967520, 2.982284,
+2.997047, 3.011811, 3.026575, 3.041339, 3.056103, 3.070866, 3.090551,
+3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 3.208662, 3.228347,
+2.342520, 2.335138, 2.327756, 2.320374, 2.312992, 2.320374, 2.327756,
+2.335138, 2.342520, 2.332677, 2.322835, 2.312992, 2.303150, 2.303150,
+2.303150, 2.303150, 2.303150, 2.312992, 2.322835, 2.332677, 2.342520,
+2.340059, 2.337598, 2.335138, 2.332677, 2.327756, 2.322835, 2.317913,
+2.312992, 2.312992, 2.312992, 2.312992, 2.312992, 2.317913, 2.322835,
+2.327756, 2.332677, 2.325295, 2.317913, 2.310532, 2.303150, 2.305610,
+2.308071, 2.310532, 2.312992, 2.312992, 2.312992, 2.312992, 2.312992,
+2.310532, 2.308071, 2.305610, 2.303150, 2.305610, 2.308071, 2.310532,
+2.312992, 2.312992, 2.312992, 2.312992, 2.312992, 2.317913, 2.322835,
+2.327756, 2.332677, 2.332677, 2.332677, 2.332677, 2.332677, 2.327756,
+2.322835, 2.317913, 2.312992, 2.310532, 2.308071, 2.305610, 2.303150,
+2.305610, 2.308071, 2.310532, 2.312992, 2.330217, 2.347441, 2.364665,
+2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
+2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.647638,
+2.677166, 2.706693, 2.736221, 2.753445, 2.770669, 2.787894, 2.805118,
+2.824803, 2.844488, 2.864173, 2.883858, 2.906004, 2.928150, 2.950295,
+2.972441, 2.984744, 2.997047, 3.009350, 3.021654, 3.038878, 3.056103,
+3.073327, 3.090551, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977,
+3.208662, 3.228347, 3.248032, 2.362205, 2.352362, 2.342520, 2.332677,
+2.322835, 2.332677, 2.342520, 2.352362, 2.362205, 2.352362, 2.342520,
+2.332677, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.332677,
+2.342520, 2.352362, 2.362205, 2.362205, 2.362205, 2.362205, 2.362205,
+2.352362, 2.342520, 2.332677, 2.322835, 2.322835, 2.322835, 2.322835,
+2.322835, 2.332677, 2.342520, 2.352362, 2.362205, 2.352362, 2.342520,
+2.332677, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835,
+2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835,
+2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835,
+2.322835, 2.332677, 2.342520, 2.352362, 2.362205, 2.362205, 2.362205,
+2.362205, 2.362205, 2.352362, 2.342520, 2.332677, 2.322835, 2.322835,
+2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835,
+2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630,
+2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
+2.618110, 2.637795, 2.667323, 2.696851, 2.726378, 2.755906, 2.775591,
+2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
+2.933071, 2.952756, 2.972441, 2.992126, 3.001968, 3.011811, 3.021653,
+3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606,
+3.169291, 3.188977, 3.208662, 3.228347, 3.248032, 3.267717, 2.381890,
+2.374508, 2.367126, 2.359744, 2.352362, 2.357284, 2.362205, 2.367126,
+2.372047, 2.367126, 2.362205, 2.357284, 2.352362, 2.349902, 2.347441,
+2.344980, 2.342520, 2.352362, 2.362205, 2.372047, 2.381890, 2.381890,
+2.381890, 2.381890, 2.381890, 2.374508, 2.367126, 2.359744, 2.352362,
+2.349902, 2.347441, 2.344980, 2.342520, 2.349902, 2.357284, 2.364665,
+2.372047, 2.364665, 2.357284, 2.349902, 2.342520, 2.344980, 2.347441,
+2.349902, 2.352362, 2.352362, 2.352362, 2.352362, 2.352362, 2.349902,
+2.347441, 2.344980, 2.342520, 2.342520, 2.342520, 2.342520, 2.342520,
+2.342520, 2.342520, 2.342520, 2.342520, 2.349902, 2.357284, 2.364665,
+2.372047, 2.374508, 2.376969, 2.379429, 2.381890, 2.372047, 2.362205,
+2.352362, 2.342520, 2.344980, 2.347441, 2.349902, 2.352362, 2.349902,
+2.347441, 2.344980, 2.342520, 2.357284, 2.372047, 2.386811, 2.401575,
+2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370,
+2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.664862, 2.691929,
+2.718996, 2.746063, 2.768209, 2.790354, 2.812500, 2.834646, 2.854331,
+2.874016, 2.893701, 2.913386, 2.930610, 2.947835, 2.965059, 2.982284,
+2.997047, 3.011811, 3.026575, 3.041339, 3.058563, 3.075788, 3.093012,
+3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 3.208662, 3.228347,
+3.248032, 3.267717, 2.401575, 2.396654, 2.391732, 2.386811, 2.381890,
+2.381890, 2.381890, 2.381890, 2.381890, 2.381890, 2.381890, 2.381890,
+2.381890, 2.376969, 2.372047, 2.367126, 2.362205, 2.372047, 2.381890,
+2.391732, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.396654,
+2.391732, 2.386811, 2.381890, 2.376969, 2.372047, 2.367126, 2.362205,
+2.367126, 2.372047, 2.376969, 2.381890, 2.376969, 2.372047, 2.367126,
+2.362205, 2.367126, 2.372047, 2.376969, 2.381890, 2.381890, 2.381890,
+2.381890, 2.381890, 2.376969, 2.372047, 2.367126, 2.362205, 2.362205,
+2.362205, 2.362205, 2.362205, 2.362205, 2.362205, 2.362205, 2.362205,
+2.367126, 2.372047, 2.376969, 2.381890, 2.386811, 2.391732, 2.396654,
+2.401575, 2.391732, 2.381890, 2.372047, 2.362205, 2.367126, 2.372047,
+2.376969, 2.381890, 2.376969, 2.372047, 2.367126, 2.362205, 2.372047,
+2.381890, 2.391732, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
+2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
+2.637795, 2.662402, 2.687008, 2.711614, 2.736221, 2.760827, 2.785433,
+2.810040, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386, 2.928150,
+2.942914, 2.957677, 2.972441, 2.992126, 3.011811, 3.031496, 3.051181,
+3.065945, 3.080709, 3.095473, 3.110236, 3.129921, 3.149606, 3.169291,
+3.188977, 3.208662, 3.228347, 3.248032, 3.267717, 2.421260, 2.418799,
+2.416339, 2.413878, 2.411417, 2.406496, 2.401575, 2.396654, 2.391732,
+2.396654, 2.401575, 2.406496, 2.411417, 2.404035, 2.396654, 2.389272,
+2.381890, 2.391732, 2.401575, 2.411417, 2.421260, 2.421260, 2.421260,
+2.421260, 2.421260, 2.418799, 2.416339, 2.413878, 2.411417, 2.404035,
+2.396654, 2.389272, 2.381890, 2.384350, 2.386811, 2.389272, 2.391732,
+2.389272, 2.386811, 2.384350, 2.381890, 2.389272, 2.396654, 2.404035,
+2.411417, 2.411417, 2.411417, 2.411417, 2.411417, 2.404035, 2.396654,
+2.389272, 2.381890, 2.381890, 2.381890, 2.381890, 2.381890, 2.381890,
+2.381890, 2.381890, 2.381890, 2.384350, 2.386811, 2.389272, 2.391732,
+2.399114, 2.406496, 2.413878, 2.421260, 2.411417, 2.401575, 2.391732,
+2.381890, 2.389272, 2.396654, 2.404035, 2.411417, 2.404035, 2.396654,
+2.389272, 2.381890, 2.386811, 2.391732, 2.396654, 2.401575, 2.421260,
+2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
+2.578740, 2.598425, 2.618110, 2.637795, 2.659941, 2.682087, 2.704232,
+2.726378, 2.753445, 2.780512, 2.807579, 2.834646, 2.854331, 2.874016,
+2.893701, 2.913386, 2.925689, 2.937992, 2.950295, 2.962599, 2.987205,
+3.011811, 3.036417, 3.061024, 3.073327, 3.085630, 3.097933, 3.110236,
+3.129921, 3.149606, 3.169291, 3.188977, 3.208662, 3.228347, 3.248032,
+3.267717, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.431102,
+2.421260, 2.411417, 2.401575, 2.411417, 2.421260, 2.431102, 2.440945,
+2.431102, 2.421260, 2.411417, 2.401575, 2.411417, 2.421260, 2.431102,
+2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945,
+2.440945, 2.440945, 2.431102, 2.421260, 2.411417, 2.401575, 2.401575,
+2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575,
+2.411417, 2.421260, 2.431102, 2.440945, 2.440945, 2.440945, 2.440945,
+2.440945, 2.431102, 2.421260, 2.411417, 2.401575, 2.401575, 2.401575,
+2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575,
+2.401575, 2.401575, 2.401575, 2.411417, 2.421260, 2.431102, 2.440945,
+2.431102, 2.421260, 2.411417, 2.401575, 2.411417, 2.421260, 2.431102,
+2.440945, 2.431102, 2.421260, 2.411417, 2.401575, 2.401575, 2.401575,
+2.401575, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
+2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
+2.657480, 2.677166, 2.696851, 2.716536, 2.746063, 2.775591, 2.805118,
+2.834646, 2.854331, 2.874016, 2.893701, 2.913386, 2.923228, 2.933071,
+2.942913, 2.952756, 2.982283, 3.011811, 3.041338, 3.070866, 3.080709,
+3.090551, 3.100394, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977,
+3.208662, 3.228347, 3.248032, 3.267717, 2.460630, 2.460630, 2.460630,
+2.460630, 2.460630, 2.450787, 2.440945, 2.431102, 2.421260, 2.428642,
+2.436024, 2.443406, 2.450787, 2.445866, 2.440945, 2.436024, 2.431103,
+2.436024, 2.440945, 2.445866, 2.450787, 2.450787, 2.450787, 2.450787,
+2.450787, 2.450787, 2.450787, 2.450787, 2.450787, 2.445866, 2.440945,
+2.436024, 2.431103, 2.431103, 2.431103, 2.431103, 2.431103, 2.431103,
+2.431103, 2.431103, 2.431103, 2.436024, 2.440945, 2.445866, 2.450787,
+2.453248, 2.455709, 2.458169, 2.460630, 2.453248, 2.445866, 2.438484,
+2.431103, 2.428642, 2.426181, 2.423720, 2.421260, 2.421260, 2.421260,
+2.421260, 2.421260, 2.421260, 2.421260, 2.421260, 2.421260, 2.431102,
+2.440945, 2.450787, 2.460630, 2.450787, 2.440945, 2.431102, 2.421260,
+2.431102, 2.440945, 2.450787, 2.460630, 2.453248, 2.445866, 2.438484,
+2.431103, 2.431103, 2.431103, 2.431103, 2.431103, 2.445866, 2.460630,
+2.475394, 2.490158, 2.507382, 2.524606, 2.541831, 2.559055, 2.578740,
+2.598425, 2.618110, 2.637795, 2.659941, 2.682087, 2.704232, 2.726378,
+2.750984, 2.775591, 2.800197, 2.824803, 2.844488, 2.864173, 2.883858,
+2.903543, 2.915847, 2.928150, 2.940453, 2.952756, 2.979823, 3.006890,
+3.033957, 3.061024, 3.073327, 3.085630, 3.097933, 3.110236, 3.129921,
+3.149606, 3.169291, 3.188977, 3.208662, 3.228347, 3.248032, 3.267717,
+2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.470472, 2.460630,
+2.450787, 2.440945, 2.445866, 2.450787, 2.455709, 2.460630, 2.460630,
+2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630,
+2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630,
+2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630,
+2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630,
+2.460630, 2.460630, 2.460630, 2.465551, 2.470472, 2.475394, 2.480315,
+2.475394, 2.470473, 2.465551, 2.460630, 2.455709, 2.450787, 2.445866,
+2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945,
+2.440945, 2.440945, 2.450787, 2.460630, 2.470472, 2.480315, 2.470472,
+2.460630, 2.450787, 2.440945, 2.450787, 2.460630, 2.470472, 2.480315,
+2.475394, 2.470473, 2.465551, 2.460630, 2.460630, 2.460630, 2.460630,
+2.460630, 2.470473, 2.480315, 2.490158, 2.500000, 2.514764, 2.529528,
+2.544291, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.662402,
+2.687008, 2.711614, 2.736221, 2.755905, 2.775591, 2.795276, 2.814961,
+2.834646, 2.854331, 2.874016, 2.893701, 2.908465, 2.923229, 2.937992,
+2.952756, 2.977362, 3.001969, 3.026575, 3.051181, 3.065945, 3.080709,
+3.095473, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 3.208662,
+3.228347, 3.248032, 3.267717, 2.500000, 2.500000, 2.500000, 2.500000,
+2.500000, 2.490157, 2.480315, 2.470472, 2.460630, 2.463091, 2.465551,
+2.468012, 2.470472, 2.475394, 2.480315, 2.485236, 2.490158, 2.485236,
+2.480315, 2.475394, 2.470472, 2.470472, 2.470472, 2.470472, 2.470472,
+2.470472, 2.470472, 2.470472, 2.470472, 2.475394, 2.480315, 2.485236,
+2.490158, 2.490158, 2.490158, 2.490158, 2.490158, 2.490158, 2.490158,
+2.490158, 2.490158, 2.485236, 2.480315, 2.475394, 2.470472, 2.477854,
+2.485236, 2.492618, 2.500000, 2.497540, 2.495079, 2.492618, 2.490158,
+2.482776, 2.475394, 2.468012, 2.460630, 2.460630, 2.460630, 2.460630,
+2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.470472, 2.480315,
+2.490157, 2.500000, 2.490157, 2.480315, 2.470472, 2.460630, 2.470472,
+2.480315, 2.490157, 2.500000, 2.497540, 2.495079, 2.492618, 2.490158,
+2.490158, 2.490158, 2.490158, 2.490158, 2.495079, 2.500000, 2.504921,
+2.509843, 2.522146, 2.534449, 2.546752, 2.559055, 2.578740, 2.598425,
+2.618110, 2.637795, 2.664862, 2.691929, 2.718996, 2.746063, 2.760827,
+2.775591, 2.790354, 2.805118, 2.824803, 2.844488, 2.864173, 2.883858,
+2.901083, 2.918307, 2.935532, 2.952756, 2.974902, 2.997047, 3.019193,
+3.041339, 3.058563, 3.075788, 3.093012, 3.110236, 3.129921, 3.149606,
+3.169291, 3.188977, 3.208662, 3.228347, 3.248032, 3.267717, 2.519685,
+2.519685, 2.519685, 2.519685, 2.519685, 2.509843, 2.500000, 2.490157,
+2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.490157, 2.500000,
+2.509843, 2.519685, 2.509843, 2.500000, 2.490157, 2.480315, 2.480315,
+2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.480315,
+2.490157, 2.500000, 2.509843, 2.519685, 2.519685, 2.519685, 2.519685,
+2.519685, 2.519685, 2.519685, 2.519685, 2.519685, 2.509843, 2.500000,
+2.490157, 2.480315, 2.490157, 2.500000, 2.509843, 2.519685, 2.519685,
+2.519685, 2.519685, 2.519685, 2.509843, 2.500000, 2.490157, 2.480315,
+2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.480315,
+2.480315, 2.490157, 2.500000, 2.509843, 2.519685, 2.509843, 2.500000,
+2.490157, 2.480315, 2.490157, 2.500000, 2.509843, 2.519685, 2.519685,
+2.519685, 2.519685, 2.519685, 2.519685, 2.519685, 2.519685, 2.519685,
+2.519685, 2.519685, 2.519685, 2.519685, 2.529528, 2.539370, 2.549213,
+2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.667323, 2.696851,
+2.726378, 2.755906, 2.765748, 2.775591, 2.785433, 2.795276, 2.814961,
+2.834646, 2.854331, 2.874016, 2.893701, 2.913386, 2.933071, 2.952756,
+2.972441, 2.992126, 3.011811, 3.031496, 3.051181, 3.070866, 3.090551,
+3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 3.208662, 3.228347,
+3.248032, 3.267717, 3.314469};
+static float *heights MAYBE_UNUSED = __heights;
+
+#endif
diff --git a/test/integration/helper_physics_generator.hh b/test/integration/helper_physics_generator.hh
new file mode 100644
index 0000000..1ebbfd0
--- /dev/null
+++ b/test/integration/helper_physics_generator.hh
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _HELPER_PHYSICS_GENERATOR_HH_
+#define _HELPER_PHYSICS_GENERATOR_HH_
+
+#define BULLET_SUPPORT
+
+#ifdef HAVE_BULLET
+# undef BULLET_SUPPORT
+# define BULLET_SUPPORT , "bullet"
+#endif
+
+#define SIMBODY_SUPPORT
+#define DART_SUPPORT
+
+#ifdef HAVE_SIMBODY
+# undef SIMBODY_SUPPORT
+# define SIMBODY_SUPPORT , "simbody"
+#endif
+#ifdef HAVE_DART
+# undef DART_SUPPORT
+# define DART_SUPPORT , "dart"
+#endif
+
+/// \brief Helper macro to instantiate gtest for different physics engines
+#define PHYSICS_ENGINE_VALUES ::testing::Values("ode" \
+  BULLET_SUPPORT \
+  SIMBODY_SUPPORT \
+  DART_SUPPORT \
+  )
+
+#endif
diff --git a/test/integration/images_cmp.h b/test/integration/images_cmp.h
new file mode 100644
index 0000000..f332e86
--- /dev/null
+++ b/test/integration/images_cmp.h
@@ -0,0 +1,46117 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _TEST_IMAGES_CMP_H_
+#define _TEST_IMAGES_CMP_H_
+
+#ifdef __GNUC__
+    #define MAYBE_UNUSED __attribute__((used))
+#elif defined _MSC_VER
+    #pragma warning(disable: Cxxxxx)
+    #define MAYBE_UNUSED
+#else
+    #define MAYBE_UNUSED
+#endif
+
+static unsigned char __empty_world_camera1[] = {
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 155,
+155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
+156, 157, 157, 157, 157, 157, 157, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 159, 159, 159, 159,
+159, 159, 160, 160, 160, 160, 160, 160, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 157, 157, 157,
+157, 157, 157, 156, 156, 156, 156, 156, 156, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 154, 154,
+154, 154, 154, 154, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 153, 153, 153, 154, 154,
+154, 155, 155, 155, 155, 155, 155, 156, 156, 156,
+157, 157, 157, 157, 157, 157, 158, 158, 158, 159,
+159, 159, 160, 160, 160, 160, 160, 160, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 152, 152, 152, 152, 152, 152, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 161,
+161, 161, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 165, 165, 165, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 171, 171, 171, 172, 172,
+172, 173, 173, 173, 174, 174, 174, 175, 175, 175,
+176, 176, 176, 177, 177, 177, 178, 178, 178, 179,
+179, 179, 180, 180, 180, 181, 181, 181, 182, 182,
+182, 183, 183, 183, 184, 184, 184, 185, 185, 185,
+187, 187, 187, 188, 188, 188, 189, 189, 189, 189,
+189, 189, 190, 190, 190, 191, 191, 191, 192, 192,
+192, 192, 192, 192, 193, 193, 193, 194, 194, 194,
+194, 194, 194, 195, 195, 195, 196, 196, 196, 196,
+196, 196, 197, 197, 197, 198, 198, 198, 198, 198,
+198, 199, 199, 199, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+200, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+198, 198, 198, 198, 198, 198, 198, 198, 198, 197,
+197, 197, 197, 197, 197, 197, 197, 197, 196, 196,
+196, 196, 196, 196, 196, 196, 196, 195, 195, 195,
+195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+195, 195, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 194, 194, 194, 193, 193, 193, 193, 193, 193,
+151, 151, 151, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 154, 154, 154, 154, 154, 154, 155,
+155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
+156, 157, 157, 157, 157, 157, 157, 158, 158, 158,
+158, 158, 158, 159, 159, 159, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 158, 158, 158, 158, 158, 158, 157, 157, 157,
+157, 157, 157, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 155, 155, 155, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 153, 153, 153, 153, 153, 153,
+152, 152, 152, 152, 152, 152, 151, 151, 151, 151,
+151, 151, 152, 152, 152, 153, 153, 153, 154, 154,
+154, 154, 154, 154, 155, 155, 155, 156, 156, 156,
+157, 157, 157, 157, 157, 157, 158, 158, 158, 159,
+159, 159, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 154, 154, 154, 154, 154, 154, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 151, 151, 151,
+151, 151, 151, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 149, 149, 149, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 157, 157, 157,
+157, 157, 157, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 161,
+161, 161, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 165, 165, 165, 166, 166, 166,
+167, 167, 167, 168, 168, 168, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 171, 171, 171, 172, 172,
+172, 173, 173, 173, 174, 174, 174, 175, 175, 175,
+176, 176, 176, 177, 177, 177, 178, 178, 178, 179,
+179, 179, 180, 180, 180, 182, 182, 182, 183, 183,
+183, 184, 184, 184, 185, 185, 185, 186, 186, 186,
+187, 187, 187, 188, 188, 188, 189, 189, 189, 190,
+190, 190, 190, 190, 190, 191, 191, 191, 192, 192,
+192, 192, 192, 192, 193, 193, 193, 194, 194, 194,
+194, 194, 194, 195, 195, 195, 196, 196, 196, 197,
+197, 197, 197, 197, 197, 198, 198, 198, 199, 199,
+199, 199, 199, 199, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 201, 201, 201, 201, 201, 201, 201,
+201, 201, 200, 200, 200, 200, 200, 200, 200, 200,
+200, 200, 200, 200, 199, 199, 199, 199, 199, 199,
+199, 199, 199, 198, 198, 198, 198, 198, 198, 198,
+198, 198, 197, 197, 197, 197, 197, 197, 197, 197,
+197, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+195, 195, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 194, 194, 194, 194, 194, 194, 193, 193, 193,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+154, 154, 154, 154, 154, 154, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
+156, 157, 157, 157, 157, 157, 157, 158, 158, 158,
+158, 158, 158, 159, 159, 159, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+157, 157, 157, 157, 157, 157, 156, 156, 156, 156,
+156, 156, 155, 155, 155, 155, 155, 155, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 153, 153, 153,
+153, 153, 153, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 153, 153, 153, 154, 154,
+154, 155, 155, 155, 155, 155, 155, 156, 156, 156,
+157, 157, 157, 158, 158, 158, 158, 158, 158, 159,
+159, 159, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
+154, 154, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+150, 150, 150, 150, 150, 150, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 162, 162, 162, 163, 163, 163, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 168, 168, 168, 169,
+169, 169, 170, 170, 170, 171, 171, 171, 171, 171,
+171, 172, 172, 172, 173, 173, 173, 174, 174, 174,
+175, 175, 175, 177, 177, 177, 178, 178, 178, 179,
+179, 179, 180, 180, 180, 181, 181, 181, 182, 182,
+182, 183, 183, 183, 184, 184, 184, 185, 185, 185,
+186, 186, 186, 187, 187, 187, 188, 188, 188, 188,
+188, 188, 189, 189, 189, 190, 190, 190, 190, 190,
+190, 191, 191, 191, 192, 192, 192, 192, 192, 192,
+193, 193, 193, 194, 194, 194, 195, 195, 195, 195,
+195, 195, 196, 196, 196, 197, 197, 197, 197, 197,
+197, 198, 198, 198, 198, 198, 198, 198, 198, 198,
+199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
+199, 199, 199, 199, 198, 198, 198, 198, 198, 198,
+198, 198, 198, 197, 197, 197, 197, 197, 197, 197,
+197, 197, 197, 197, 197, 196, 196, 196, 196, 196,
+196, 196, 196, 196, 195, 195, 195, 195, 195, 195,
+195, 195, 195, 195, 195, 195, 195, 195, 195, 194,
+194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 194, 194, 194, 193, 193, 193, 193, 193, 193,
+152, 152, 152, 152, 152, 152, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 155, 155, 155, 155,
+155, 155, 156, 156, 156, 156, 156, 156, 157, 157,
+157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 156,
+156, 156, 156, 156, 156, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 154, 154, 154, 154, 154, 154,
+153, 153, 153, 153, 153, 153, 152, 152, 152, 152,
+152, 152, 153, 153, 153, 154, 154, 154, 154, 154,
+154, 155, 155, 155, 156, 156, 156, 156, 156, 156,
+157, 157, 157, 158, 158, 158, 159, 159, 159, 159,
+159, 159, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 157, 157, 157, 157, 157,
+157, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 150, 150,
+150, 150, 150, 150, 150, 150, 150, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 163, 163, 163, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 166, 166, 166,
+166, 166, 166, 167, 167, 167, 168, 168, 168, 168,
+168, 168, 169, 169, 169, 170, 170, 170, 171, 171,
+171, 171, 171, 171, 173, 173, 173, 174, 174, 174,
+175, 175, 175, 175, 175, 175, 176, 176, 176, 177,
+177, 177, 178, 178, 178, 179, 179, 179, 180, 180,
+180, 181, 181, 181, 182, 182, 182, 183, 183, 183,
+184, 184, 184, 185, 185, 185, 186, 186, 186, 187,
+187, 187, 187, 187, 187, 188, 188, 188, 189, 189,
+189, 189, 189, 189, 190, 190, 190, 191, 191, 191,
+191, 191, 191, 192, 192, 192, 193, 193, 193, 193,
+193, 193, 194, 194, 194, 194, 194, 194, 195, 195,
+195, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
+198, 198, 198, 198, 198, 198, 198, 198, 197, 197,
+197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
+196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+196, 196, 196, 196, 196, 195, 195, 195, 195, 195,
+195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 156, 156, 156, 156, 156, 156, 157, 157,
+157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 157, 157, 157, 157, 157, 157, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 154, 154, 154,
+154, 154, 154, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 154, 154, 154, 155, 155,
+155, 155, 155, 155, 156, 156, 156, 157, 157, 157,
+157, 157, 157, 158, 158, 158, 159, 159, 159, 159,
+159, 159, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 155, 155, 155, 155,
+155, 155, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 151, 151, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 167, 167, 167, 167, 167, 167, 168,
+168, 168, 169, 169, 169, 169, 169, 169, 170, 170,
+170, 171, 171, 171, 172, 172, 172, 173, 173, 173,
+174, 174, 174, 175, 175, 175, 176, 176, 176, 176,
+176, 176, 177, 177, 177, 178, 178, 178, 179, 179,
+179, 180, 180, 180, 181, 181, 181, 182, 182, 182,
+183, 183, 183, 184, 184, 184, 185, 185, 185, 185,
+185, 185, 186, 186, 186, 187, 187, 187, 187, 187,
+187, 188, 188, 188, 188, 188, 188, 189, 189, 189,
+190, 190, 190, 190, 190, 190, 191, 191, 191, 192,
+192, 192, 192, 192, 192, 193, 193, 193, 194, 194,
+194, 194, 194, 194, 195, 195, 195, 195, 195, 195,
+195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+195, 195, 196, 196, 196, 196, 196, 196, 196, 196,
+196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+196, 196, 196, 196, 196, 196, 197, 197, 197, 197,
+197, 197, 197, 197, 197, 196, 196, 196, 196, 196,
+196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
+196, 196, 196, 195, 195, 195, 195, 195, 195, 195,
+195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+195, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 194, 194, 194, 194, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 156,
+156, 156, 156, 156, 156, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
+156, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 153,
+153, 153, 154, 154, 154, 154, 154, 154, 155, 155,
+155, 156, 156, 156, 156, 156, 156, 157, 157, 157,
+158, 158, 158, 158, 158, 158, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 151, 151, 151, 151, 151,
+151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 167, 167, 167, 168,
+168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
+169, 170, 170, 170, 171, 171, 171, 172, 172, 172,
+173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
+175, 175, 176, 176, 176, 177, 177, 177, 178, 178,
+178, 179, 179, 179, 180, 180, 180, 180, 180, 180,
+181, 181, 181, 182, 182, 182, 183, 183, 183, 183,
+183, 183, 184, 184, 184, 185, 185, 185, 185, 185,
+185, 186, 186, 186, 187, 187, 187, 187, 187, 187,
+188, 188, 188, 189, 189, 189, 189, 189, 189, 190,
+190, 190, 190, 190, 190, 191, 191, 191, 192, 192,
+192, 192, 192, 192, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 156, 156, 156, 156,
+156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 155, 155, 155, 156, 156,
+156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
+158, 158, 158, 158, 158, 158, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 152, 152, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
+169, 169, 169, 169, 170, 170, 170, 171, 171, 171,
+172, 172, 172, 172, 172, 172, 173, 173, 173, 174,
+174, 174, 175, 175, 175, 176, 176, 176, 176, 176,
+176, 177, 177, 177, 178, 178, 178, 179, 179, 179,
+180, 180, 180, 180, 180, 180, 181, 181, 181, 182,
+182, 182, 182, 182, 182, 183, 183, 183, 184, 184,
+184, 184, 184, 184, 185, 185, 185, 185, 185, 185,
+186, 186, 186, 187, 187, 187, 187, 187, 187, 188,
+188, 188, 188, 188, 188, 189, 189, 189, 190, 190,
+190, 190, 190, 190, 191, 191, 191, 191, 191, 191,
+191, 191, 191, 191, 191, 191, 191, 191, 191, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+154, 154, 154, 154, 154, 154, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 155, 155, 155, 155, 155, 155, 154,
+154, 154, 155, 155, 155, 156, 156, 156, 156, 156,
+156, 157, 157, 157, 157, 157, 157, 158, 158, 158,
+158, 158, 158, 159, 159, 159, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 152, 152,
+152, 152, 152, 152, 152, 152, 152, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 167, 167, 167, 167, 167, 167, 168, 168,
+168, 168, 168, 168, 169, 169, 169, 170, 170, 170,
+171, 171, 171, 171, 171, 171, 172, 172, 172, 173,
+173, 173, 174, 174, 174, 174, 174, 174, 175, 175,
+175, 176, 176, 176, 176, 176, 176, 177, 177, 177,
+178, 178, 178, 179, 179, 179, 179, 179, 179, 180,
+180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
+182, 182, 182, 182, 183, 183, 183, 184, 184, 184,
+184, 184, 184, 185, 185, 185, 185, 185, 185, 186,
+186, 186, 186, 186, 186, 187, 187, 187, 188, 188,
+188, 188, 188, 188, 189, 189, 189, 189, 189, 189,
+189, 189, 189, 189, 189, 189, 190, 190, 190, 190,
+190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+190, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+191, 191, 191, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 155, 155, 155, 155,
+155, 155, 156, 156, 156, 156, 156, 156, 157, 157,
+157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+153, 153, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 168, 168, 168, 168, 168, 168, 169, 169, 169,
+170, 170, 170, 170, 170, 170, 171, 171, 171, 172,
+172, 172, 172, 172, 172, 173, 173, 173, 174, 174,
+174, 174, 174, 174, 175, 175, 175, 176, 176, 176,
+176, 176, 176, 177, 177, 177, 178, 178, 178, 178,
+178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
+180, 180, 180, 180, 181, 181, 181, 182, 182, 182,
+182, 182, 182, 183, 183, 183, 183, 183, 183, 184,
+184, 184, 185, 185, 185, 185, 185, 185, 186, 186,
+186, 186, 186, 186, 187, 187, 187, 187, 187, 187,
+187, 187, 187, 187, 187, 187, 188, 188, 188, 188,
+188, 188, 188, 188, 188, 188, 188, 188, 189, 189,
+189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+190, 190, 190, 190, 190, 191, 191, 191, 191, 191,
+191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+191, 191, 191, 191, 191, 191, 191, 191, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 193, 193, 193, 193, 193, 193, 193, 193, 193,
+155, 155, 155, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 157, 157, 157, 157, 157,
+157, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 153, 153,
+153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 167, 167, 167, 168, 168, 168, 168, 168, 168,
+169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
+170, 170, 171, 171, 171, 172, 172, 172, 172, 172,
+172, 173, 173, 173, 174, 174, 174, 174, 174, 174,
+175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
+176, 176, 177, 177, 177, 178, 178, 178, 178, 178,
+178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
+180, 180, 180, 181, 181, 181, 182, 182, 182, 182,
+182, 182, 183, 183, 183, 183, 183, 183, 184, 184,
+184, 184, 184, 184, 185, 185, 185, 185, 185, 185,
+185, 185, 185, 186, 186, 186, 186, 186, 186, 186,
+186, 186, 186, 186, 186, 187, 187, 187, 187, 187,
+187, 187, 187, 187, 187, 187, 187, 188, 188, 188,
+188, 188, 188, 188, 188, 188, 189, 189, 189, 189,
+189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+189, 189, 189, 189, 190, 190, 190, 190, 190, 190,
+190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+190, 190, 191, 191, 191, 191, 191, 191, 191, 191,
+191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+191, 191, 191, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 193, 193, 193,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 156,
+156, 156, 157, 157, 157, 157, 157, 157, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
+166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
+168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
+171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
+175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
+176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
+179, 179, 179, 179, 179, 179, 180, 180, 180, 180,
+180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
+182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
+183, 183, 183, 184, 184, 184, 184, 184, 184, 184,
+184, 184, 185, 185, 185, 185, 185, 185, 185, 185,
+185, 185, 185, 185, 186, 186, 186, 186, 186, 186,
+186, 186, 186, 187, 187, 187, 187, 187, 187, 187,
+187, 187, 188, 188, 188, 188, 188, 188, 188, 188,
+188, 188, 188, 188, 188, 188, 188, 189, 189, 189,
+189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+189, 189, 190, 190, 190, 190, 190, 190, 190, 190,
+190, 190, 190, 190, 191, 191, 191, 191, 191, 191,
+191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
+191, 191, 192, 192, 192, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 193, 193, 193,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 154, 154,
+154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
+168, 168, 169, 169, 169, 169, 169, 169, 170, 170,
+170, 170, 170, 170, 171, 171, 171, 171, 171, 171,
+171, 171, 171, 172, 172, 172, 173, 173, 173, 173,
+173, 173, 174, 174, 174, 174, 174, 174, 175, 175,
+175, 175, 175, 175, 176, 176, 176, 176, 176, 176,
+177, 177, 177, 177, 177, 177, 178, 178, 178, 178,
+178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
+180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
+181, 181, 181, 182, 182, 182, 182, 182, 182, 182,
+182, 182, 183, 183, 183, 183, 183, 183, 183, 183,
+183, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+185, 185, 185, 185, 185, 185, 185, 185, 185, 186,
+186, 186, 186, 186, 186, 186, 186, 186, 187, 187,
+187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
+188, 188, 188, 188, 188, 188, 188, 188, 188, 189,
+189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
+189, 190, 190, 190, 190, 190, 190, 190, 190, 190,
+190, 190, 190, 191, 191, 191, 191, 191, 191, 191,
+191, 191, 191, 191, 191, 192, 192, 192, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 193, 193, 193,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 155, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
+168, 169, 169, 169, 169, 169, 169, 170, 170, 170,
+170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
+171, 171, 172, 172, 172, 172, 172, 172, 173, 173,
+173, 173, 173, 173, 174, 174, 174, 174, 174, 174,
+175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
+176, 176, 177, 177, 177, 177, 177, 177, 178, 178,
+178, 178, 178, 178, 179, 179, 179, 179, 179, 179,
+179, 179, 179, 180, 180, 180, 180, 180, 180, 181,
+181, 181, 181, 181, 181, 181, 181, 181, 182, 182,
+182, 182, 182, 182, 182, 182, 182, 183, 183, 183,
+183, 183, 183, 184, 184, 184, 184, 184, 184, 184,
+184, 184, 185, 185, 185, 185, 185, 185, 185, 185,
+185, 186, 186, 186, 186, 186, 186, 186, 186, 186,
+187, 187, 187, 187, 187, 187, 187, 187, 187, 188,
+188, 188, 188, 188, 188, 188, 188, 188, 189, 189,
+189, 189, 189, 189, 189, 189, 189, 190, 190, 190,
+190, 190, 190, 190, 190, 190, 191, 191, 191, 191,
+191, 191, 191, 191, 191, 191, 191, 191, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 193, 193, 193,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 158,
+158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+155, 155, 155, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 169, 169, 169, 169, 169, 169, 170,
+170, 170, 170, 170, 170, 170, 170, 170, 171, 171,
+171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+173, 173, 173, 173, 173, 173, 174, 174, 174, 174,
+174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
+176, 176, 176, 176, 177, 177, 177, 177, 177, 177,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 179,
+179, 179, 179, 179, 179, 180, 180, 180, 180, 180,
+180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
+182, 182, 182, 182, 182, 182, 182, 182, 182, 183,
+183, 183, 183, 183, 183, 184, 184, 184, 184, 184,
+184, 184, 184, 184, 185, 185, 185, 185, 185, 185,
+186, 186, 186, 186, 186, 186, 186, 186, 186, 187,
+187, 187, 187, 187, 187, 188, 188, 188, 188, 188,
+188, 188, 188, 188, 189, 189, 189, 189, 189, 189,
+190, 190, 190, 190, 190, 190, 190, 190, 190, 191,
+191, 191, 191, 191, 191, 191, 191, 191, 192, 192,
+192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 168,
+168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
+169, 170, 170, 170, 170, 170, 170, 171, 171, 171,
+171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
+173, 173, 173, 173, 173, 174, 174, 174, 174, 174,
+174, 174, 174, 174, 175, 175, 175, 175, 175, 175,
+176, 176, 176, 176, 176, 176, 177, 177, 177, 177,
+177, 177, 177, 177, 177, 178, 178, 178, 178, 178,
+178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
+180, 180, 180, 181, 181, 181, 181, 181, 181, 181,
+181, 181, 182, 182, 182, 182, 182, 182, 183, 183,
+183, 183, 183, 183, 184, 184, 184, 184, 184, 184,
+185, 185, 185, 185, 185, 185, 186, 186, 186, 186,
+186, 186, 186, 186, 186, 187, 187, 187, 187, 187,
+187, 188, 188, 188, 188, 188, 188, 189, 189, 189,
+189, 189, 189, 189, 189, 189, 190, 190, 190, 190,
+190, 190, 191, 191, 191, 191, 191, 191, 191, 191,
+191, 192, 192, 192, 192, 192, 192, 193, 193, 193,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
+156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 167, 167, 167, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 167, 167, 167, 167, 167, 167, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 169, 169, 169,
+169, 169, 169, 170, 170, 170, 170, 170, 170, 171,
+171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
+172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
+174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
+175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
+177, 177, 177, 177, 178, 178, 178, 178, 178, 178,
+179, 179, 179, 179, 179, 179, 180, 180, 180, 180,
+180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
+182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
+184, 184, 184, 184, 184, 184, 185, 185, 185, 185,
+185, 185, 186, 186, 186, 186, 186, 186, 187, 187,
+187, 187, 187, 187, 188, 188, 188, 188, 188, 188,
+189, 189, 189, 189, 189, 189, 189, 189, 189, 190,
+190, 190, 190, 190, 190, 191, 191, 191, 191, 191,
+191, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 168, 168, 168, 169,
+169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
+169, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+167, 167, 167, 167, 167, 167, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
+165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 165, 165, 165, 165, 165, 165, 166, 166,
+166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 169,
+169, 169, 169, 169, 169, 170, 170, 170, 170, 170,
+170, 170, 170, 170, 171, 171, 171, 172, 172, 172,
+172, 172, 172, 173, 173, 173, 173, 173, 173, 174,
+174, 174, 174, 174, 174, 174, 174, 174, 175, 175,
+175, 175, 175, 175, 176, 176, 176, 177, 177, 177,
+177, 177, 177, 178, 178, 178, 178, 178, 178, 179,
+179, 179, 179, 179, 179, 180, 180, 180, 180, 180,
+180, 181, 181, 181, 181, 181, 181, 182, 182, 182,
+183, 183, 183, 183, 183, 183, 184, 184, 184, 184,
+184, 184, 185, 185, 185, 186, 186, 186, 186, 186,
+186, 187, 187, 187, 187, 187, 187, 188, 188, 188,
+188, 188, 188, 189, 189, 189, 189, 189, 189, 190,
+190, 190, 190, 190, 190, 191, 191, 191, 191, 191,
+191, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+157, 157, 157, 157, 157, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 166, 166, 166, 167, 167, 167,
+167, 167, 167, 168, 168, 168, 169, 169, 169, 170,
+170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
+170, 169, 169, 169, 169, 169, 169, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 167, 167, 167, 167,
+167, 167, 166, 166, 166, 166, 166, 166, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
+167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
+168, 169, 169, 169, 169, 169, 169, 170, 170, 170,
+170, 170, 170, 171, 171, 171, 171, 171, 171, 172,
+172, 172, 172, 172, 172, 173, 173, 173, 173, 173,
+173, 174, 174, 174, 174, 174, 174, 175, 175, 175,
+175, 175, 175, 176, 176, 176, 176, 176, 176, 177,
+177, 177, 178, 178, 178, 179, 179, 179, 179, 179,
+179, 180, 180, 180, 180, 180, 180, 181, 181, 181,
+182, 182, 182, 182, 182, 182, 183, 183, 183, 184,
+184, 184, 184, 184, 184, 185, 185, 185, 186, 186,
+186, 186, 186, 186, 187, 187, 187, 187, 187, 187,
+188, 188, 188, 188, 188, 188, 189, 189, 189, 189,
+189, 189, 190, 190, 190, 191, 191, 191, 191, 191,
+191, 192, 192, 192, 192, 192, 192, 193, 193, 193,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 167, 167, 167,
+168, 168, 168, 168, 168, 168, 169, 169, 169, 170,
+170, 170, 171, 171, 171, 170, 170, 170, 170, 170,
+170, 169, 169, 169, 169, 169, 169, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 167, 167, 167, 167,
+167, 167, 166, 166, 166, 166, 166, 166, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 168, 168, 168, 169, 169, 169,
+169, 169, 169, 170, 170, 170, 170, 170, 170, 171,
+171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
+172, 173, 173, 173, 173, 173, 173, 174, 174, 174,
+174, 174, 174, 175, 175, 175, 176, 176, 176, 176,
+176, 176, 177, 177, 177, 177, 177, 177, 178, 178,
+178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
+181, 181, 181, 181, 181, 181, 182, 182, 182, 183,
+183, 183, 184, 184, 184, 184, 184, 184, 185, 185,
+185, 185, 185, 185, 186, 186, 186, 187, 187, 187,
+187, 187, 187, 188, 188, 188, 188, 188, 188, 189,
+189, 189, 189, 189, 189, 190, 190, 190, 190, 190,
+190, 191, 191, 191, 191, 191, 191, 192, 192, 192,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 167, 167, 167,
+167, 167, 167, 168, 168, 168, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 170, 170, 170, 169, 169,
+169, 169, 169, 169, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 167, 167, 167, 167, 167, 167, 166,
+166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
+167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
+169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
+170, 170, 171, 171, 171, 171, 171, 171, 172, 172,
+172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
+174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
+175, 175, 176, 176, 176, 177, 177, 177, 177, 177,
+177, 178, 178, 178, 179, 179, 179, 179, 179, 179,
+180, 180, 180, 181, 181, 181, 181, 181, 181, 182,
+182, 182, 183, 183, 183, 183, 183, 183, 184, 184,
+184, 184, 184, 184, 185, 185, 185, 186, 186, 186,
+186, 186, 186, 187, 187, 187, 187, 187, 187, 188,
+188, 188, 188, 188, 188, 189, 189, 189, 189, 189,
+189, 190, 190, 190, 191, 191, 191, 191, 191, 191,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 168, 168, 168, 168, 168, 168, 169,
+169, 169, 170, 170, 170, 169, 169, 169, 169, 169,
+169, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+167, 167, 167, 167, 167, 167, 166, 166, 166, 166,
+166, 166, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 166, 166, 166, 166, 166, 166, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 168, 168, 168,
+168, 168, 168, 169, 169, 169, 169, 169, 169, 170,
+170, 170, 170, 170, 170, 171, 171, 171, 171, 171,
+171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
+175, 175, 175, 175, 175, 176, 176, 176, 177, 177,
+177, 178, 178, 178, 178, 178, 178, 179, 179, 179,
+179, 179, 179, 180, 180, 180, 181, 181, 181, 181,
+181, 181, 182, 182, 182, 183, 183, 183, 183, 183,
+183, 184, 184, 184, 184, 184, 184, 185, 185, 185,
+185, 185, 185, 186, 186, 186, 187, 187, 187, 187,
+187, 187, 188, 188, 188, 188, 188, 188, 189, 189,
+189, 189, 189, 189, 190, 190, 190, 190, 190, 190,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
+168, 168, 169, 169, 169, 169, 169, 169, 168, 168,
+168, 168, 168, 168, 167, 167, 167, 167, 167, 167,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 166, 166, 166, 166, 166,
+166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
+171, 171, 171, 171, 172, 172, 172, 172, 172, 172,
+173, 173, 173, 173, 173, 173, 174, 174, 174, 174,
+174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
+176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
+179, 179, 179, 179, 179, 179, 180, 180, 180, 181,
+181, 181, 181, 181, 181, 182, 182, 182, 182, 182,
+182, 183, 183, 183, 184, 184, 184, 184, 184, 184,
+185, 185, 185, 185, 185, 185, 186, 186, 186, 186,
+186, 186, 187, 187, 187, 187, 187, 187, 188, 188,
+188, 188, 188, 188, 189, 189, 189, 189, 189, 189,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+166, 166, 166, 167, 167, 167, 167, 167, 167, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 167, 167, 167, 167, 167, 167, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
+164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
+166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 169,
+169, 169, 169, 169, 169, 170, 170, 170, 170, 170,
+170, 171, 171, 171, 171, 171, 171, 172, 172, 172,
+172, 172, 172, 172, 172, 172, 173, 173, 173, 173,
+173, 173, 174, 174, 174, 175, 175, 175, 175, 175,
+175, 176, 176, 176, 177, 177, 177, 177, 177, 177,
+178, 178, 178, 178, 178, 178, 179, 179, 179, 180,
+180, 180, 180, 180, 180, 181, 181, 181, 182, 182,
+182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
+184, 184, 184, 184, 184, 184, 185, 185, 185, 185,
+185, 185, 186, 186, 186, 186, 186, 186, 187, 187,
+187, 187, 187, 187, 188, 188, 188, 188, 188, 188,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 167, 167, 167, 167, 167,
+167, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 166, 166, 166, 166, 166, 166, 167, 167, 167,
+167, 167, 167, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 169, 169, 169, 169, 169, 169, 170, 170,
+170, 170, 170, 170, 171, 171, 171, 171, 171, 171,
+171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
+173, 173, 173, 173, 173, 174, 174, 174, 175, 175,
+175, 175, 175, 175, 176, 176, 176, 176, 176, 176,
+177, 177, 177, 178, 178, 178, 178, 178, 178, 179,
+179, 179, 179, 179, 179, 180, 180, 180, 181, 181,
+181, 181, 181, 181, 182, 182, 182, 182, 182, 182,
+183, 183, 183, 183, 183, 183, 184, 184, 184, 184,
+184, 184, 185, 185, 185, 185, 185, 185, 186, 186,
+186, 186, 186, 186, 187, 187, 187, 187, 187, 187,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 168,
+168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
+169, 169, 169, 169, 170, 170, 170, 170, 170, 170,
+171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
+172, 172, 173, 173, 173, 173, 173, 173, 174, 174,
+174, 174, 174, 174, 175, 175, 175, 176, 176, 176,
+176, 176, 176, 177, 177, 177, 177, 177, 177, 178,
+178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
+180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
+182, 182, 182, 182, 182, 182, 183, 183, 183, 183,
+183, 183, 184, 184, 184, 184, 184, 184, 185, 185,
+185, 185, 185, 185, 186, 186, 186, 186, 186, 186,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
+169, 169, 169, 169, 169, 169, 169, 170, 170, 170,
+170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
+171, 171, 172, 172, 172, 173, 173, 173, 173, 173,
+173, 174, 174, 174, 174, 174, 174, 175, 175, 175,
+175, 175, 175, 176, 176, 176, 177, 177, 177, 177,
+177, 177, 178, 178, 178, 178, 178, 178, 179, 179,
+179, 179, 179, 179, 180, 180, 180, 180, 180, 180,
+181, 181, 181, 181, 181, 181, 182, 182, 182, 182,
+182, 182, 183, 183, 183, 183, 183, 183, 184, 184,
+184, 184, 184, 184, 185, 185, 185, 185, 185, 185,
+163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 169, 169, 169, 169, 169, 169,
+169, 169, 169, 170, 170, 170, 170, 170, 170, 171,
+171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
+172, 173, 173, 173, 173, 173, 173, 174, 174, 174,
+175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
+176, 176, 177, 177, 177, 177, 177, 177, 178, 178,
+178, 178, 178, 178, 179, 179, 179, 179, 179, 179,
+180, 180, 180, 180, 180, 180, 181, 181, 181, 181,
+181, 181, 182, 182, 182, 182, 182, 182, 183, 183,
+183, 183, 183, 183, 184, 184, 184, 184, 184, 184,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
+170, 170, 171, 171, 171, 171, 171, 171, 172, 172,
+172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
+174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
+175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
+177, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+179, 179, 179, 179, 179, 179, 180, 180, 180, 180,
+180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
+182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 158, 158, 158, 158, 158, 158, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
+171, 171, 171, 171, 172, 172, 172, 173, 173, 173,
+173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
+175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
+176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
+178, 178, 178, 179, 179, 179, 179, 179, 179, 179,
+179, 179, 180, 180, 180, 180, 180, 180, 181, 181,
+181, 181, 181, 181, 182, 182, 182, 182, 182, 182,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 168, 168, 168, 168, 168, 168, 169,
+169, 169, 169, 169, 169, 170, 170, 170, 170, 170,
+170, 171, 171, 171, 171, 171, 171, 172, 172, 172,
+172, 172, 172, 173, 173, 173, 173, 173, 173, 174,
+174, 174, 174, 174, 174, 175, 175, 175, 175, 175,
+175, 176, 176, 176, 176, 176, 176, 177, 177, 177,
+177, 177, 177, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
+180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 168,
+168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
+169, 170, 170, 170, 170, 170, 170, 171, 171, 171,
+171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
+173, 173, 173, 173, 173, 174, 174, 174, 174, 174,
+174, 175, 175, 175, 175, 175, 175, 175, 175, 175,
+176, 176, 176, 176, 176, 176, 177, 177, 177, 177,
+177, 177, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
+169, 169, 169, 169, 170, 170, 170, 170, 170, 170,
+170, 170, 170, 171, 171, 171, 171, 171, 171, 172,
+172, 172, 172, 172, 172, 173, 173, 173, 173, 173,
+173, 174, 174, 174, 174, 174, 174, 175, 175, 175,
+175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
+176, 176, 177, 177, 177, 177, 177, 177, 177, 177,
+177, 178, 178, 178, 178, 178, 178, 179, 179, 179,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 167, 167, 167, 167, 167, 167, 168, 168,
+168, 168, 168, 168, 169, 169, 169, 169, 169, 169,
+170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
+171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
+172, 173, 173, 173, 173, 173, 173, 174, 174, 174,
+174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
+175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
+177, 177, 177, 177, 177, 177, 177, 178, 178, 178,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
+170, 170, 171, 171, 171, 171, 171, 171, 172, 172,
+172, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+173, 173, 173, 174, 174, 174, 174, 174, 174, 174,
+174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
+176, 176, 176, 176, 176, 176, 176, 177, 177, 177,
+165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
+167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
+169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
+170, 170, 170, 170, 170, 171, 171, 171, 171, 171,
+171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+173, 173, 173, 173, 173, 173, 174, 174, 174, 174,
+174, 174, 174, 174, 174, 175, 175, 175, 175, 175,
+175, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 168, 168, 168, 168, 168, 168, 169, 169, 169,
+169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
+170, 170, 171, 171, 171, 171, 171, 171, 172, 172,
+172, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
+175, 175, 175, 175, 175, 175, 175, 175, 176, 176,
+176, 176, 176, 176, 177, 177, 177, 177, 177, 177,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 168, 168, 168, 168, 168, 168, 169, 169, 169,
+169, 169, 169, 170, 170, 170, 170, 170, 170, 171,
+171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
+172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
+174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
+175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
+176, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 166, 166, 166, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 167, 167, 167, 167, 167, 167, 168, 168,
+168, 168, 168, 168, 169, 169, 169, 169, 169, 169,
+170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
+171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
+172, 173, 173, 173, 173, 173, 173, 174, 174, 174,
+174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
+175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
+177, 177, 177, 177, 177, 177, 177, 178, 178, 178,
+163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 167,
+167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 169, 169, 169, 169, 169, 169,
+170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
+171, 171, 172, 172, 172, 172, 172, 172, 173, 173,
+173, 173, 173, 173, 174, 174, 174, 174, 174, 174,
+175, 175, 175, 175, 175, 175, 175, 175, 175, 176,
+176, 176, 176, 176, 176, 177, 177, 177, 177, 177,
+177, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
+165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
+167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
+168, 169, 169, 169, 169, 169, 169, 170, 170, 170,
+170, 170, 170, 171, 171, 171, 171, 171, 171, 172,
+172, 172, 172, 172, 172, 173, 173, 173, 173, 173,
+173, 173, 173, 173, 174, 174, 174, 174, 174, 174,
+175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
+176, 176, 177, 177, 177, 177, 177, 177, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 179, 179, 179,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
+165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
+169, 169, 169, 169, 169, 169, 169, 170, 170, 170,
+171, 171, 171, 171, 171, 171, 171, 171, 171, 172,
+172, 172, 172, 172, 172, 173, 173, 173, 173, 173,
+173, 174, 174, 174, 174, 174, 174, 175, 175, 175,
+175, 175, 175, 176, 176, 176, 176, 176, 176, 177,
+177, 177, 177, 177, 177, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 179, 179, 179, 179, 179, 179,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
+160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
+169, 169, 169, 169, 170, 170, 170, 170, 170, 170,
+171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
+172, 172, 173, 173, 173, 173, 173, 173, 174, 174,
+174, 174, 174, 174, 175, 175, 175, 175, 175, 175,
+176, 176, 176, 176, 176, 176, 177, 177, 177, 177,
+177, 177, 177, 177, 177, 178, 178, 178, 178, 178,
+178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 167, 167, 167, 167, 167, 167, 168,
+168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
+169, 170, 170, 170, 170, 170, 170, 171, 171, 171,
+171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
+173, 173, 173, 173, 173, 174, 174, 174, 174, 174,
+174, 175, 175, 175, 175, 175, 175, 176, 176, 176,
+176, 176, 176, 176, 176, 176, 177, 177, 177, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 179, 179,
+179, 179, 179, 179, 180, 180, 180, 180, 180, 180,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 167, 167, 167, 167, 167, 167, 168,
+168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
+169, 170, 170, 170, 170, 170, 170, 171, 171, 171,
+171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
+173, 173, 174, 174, 174, 174, 174, 174, 174, 174,
+174, 175, 175, 175, 175, 175, 175, 176, 176, 176,
+176, 176, 176, 177, 177, 177, 177, 177, 177, 178,
+178, 178, 178, 178, 178, 179, 179, 179, 179, 179,
+179, 180, 180, 180, 180, 180, 180, 181, 181, 181,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 166, 166, 166, 166, 166, 166,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
+168, 168, 169, 169, 169, 169, 169, 169, 170, 170,
+170, 170, 170, 170, 171, 171, 171, 171, 171, 171,
+172, 172, 172, 172, 172, 172, 173, 173, 173, 173,
+173, 173, 174, 174, 174, 174, 174, 174, 175, 175,
+175, 175, 175, 175, 176, 176, 176, 176, 176, 176,
+177, 177, 177, 177, 177, 177, 178, 178, 178, 178,
+178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
+180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
+168, 168, 169, 169, 169, 170, 170, 170, 170, 170,
+170, 171, 171, 171, 171, 171, 171, 172, 172, 172,
+172, 172, 172, 173, 173, 173, 173, 173, 173, 174,
+174, 174, 174, 174, 174, 175, 175, 175, 175, 175,
+175, 176, 176, 176, 176, 176, 176, 177, 177, 177,
+177, 177, 177, 178, 178, 178, 178, 178, 178, 179,
+179, 179, 179, 179, 179, 180, 180, 180, 180, 180,
+180, 181, 181, 181, 181, 181, 181, 182, 182, 182,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 158, 158, 158, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 168, 168, 168, 168, 168, 168, 169,
+169, 169, 169, 169, 169, 170, 170, 170, 170, 170,
+170, 171, 171, 171, 171, 171, 171, 172, 172, 172,
+172, 172, 172, 173, 173, 173, 173, 173, 173, 174,
+174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
+176, 176, 176, 176, 177, 177, 177, 177, 177, 177,
+178, 178, 178, 178, 178, 178, 179, 179, 179, 179,
+179, 179, 180, 180, 180, 180, 180, 180, 181, 181,
+181, 181, 181, 181, 182, 182, 182, 182, 182, 182,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 159, 159, 159, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 168, 168, 168, 168, 168, 168, 169,
+169, 169, 169, 169, 169, 170, 170, 170, 171, 171,
+171, 171, 171, 171, 172, 172, 172, 172, 172, 172,
+173, 173, 173, 173, 173, 173, 174, 174, 174, 174,
+174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
+176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
+178, 178, 178, 179, 179, 179, 179, 179, 179, 180,
+180, 180, 180, 180, 180, 181, 181, 181, 181, 181,
+181, 182, 182, 182, 182, 182, 182, 183, 183, 183,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
+171, 171, 171, 171, 172, 172, 172, 173, 173, 173,
+173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
+175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
+176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
+179, 179, 179, 179, 179, 179, 180, 180, 180, 180,
+180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
+182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
+157, 157, 157, 157, 157, 157, 157, 157, 157, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
+158, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 167, 167, 167, 167, 167, 167,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+168, 168, 168, 168, 168, 168, 169, 169, 169, 170,
+170, 170, 170, 170, 170, 171, 171, 171, 171, 171,
+171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+173, 173, 173, 174, 174, 174, 175, 175, 175, 175,
+175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
+177, 177, 177, 177, 178, 178, 178, 178, 178, 178,
+179, 179, 179, 179, 179, 179, 180, 180, 180, 181,
+181, 181, 181, 181, 181, 182, 182, 182, 182, 182,
+182, 183, 183, 183, 183, 183, 183, 184, 184, 184,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
+159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 168, 168, 168, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
+158, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 167, 167, 167,
+167, 167, 167, 168, 168, 168, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 159, 159, 159, 159, 159, 159, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 171, 171, 171, 171, 171,
+171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
+175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
+177, 178, 178, 178, 178, 178, 178, 179, 179, 179,
+179, 179, 179, 180, 180, 180, 180, 180, 180, 181,
+181, 181, 181, 181, 181, 182, 182, 182, 183, 183,
+183, 183, 183, 183, 184, 184, 184, 184, 184, 184,
+158, 158, 158, 158, 158, 158, 158, 158, 158, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
+158, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 171, 171, 171, 171, 171,
+171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
+175, 175, 176, 176, 176, 177, 177, 177, 177, 177,
+177, 178, 178, 178, 178, 178, 178, 179, 179, 179,
+180, 180, 180, 180, 180, 180, 181, 181, 181, 181,
+181, 181, 182, 182, 182, 182, 182, 182, 183, 183,
+183, 184, 184, 184, 184, 184, 184, 185, 185, 185,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
+164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
+162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
+161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
+163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
+165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+168, 168, 168, 168, 168, 168, 168, 168, 168, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
+164, 164, 163, 163, 163, 163, 163, 163, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
+161, 161, 161, 160, 160, 160, 160, 160, 160, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
+159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
+160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
+161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
+162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
+164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
+165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
+166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
+167, 167, 167, 168, 168, 168, 169, 169, 169, 169,
+169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
+171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
+174, 174, 174, 174, 174, 174, 175, 175, 175, 176,
+176, 176, 176, 176, 176, 177, 177, 177, 177, 177,
+177, 178, 178, 178, 179, 179, 179, 179, 179, 179,
+180, 180, 180, 180, 180, 180, 181, 181, 181, 182,
+182, 182, 182, 182, 182, 183, 183, 183, 183, 183,
+183, 184, 184, 184, 185, 185, 185, 185, 185, 185,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
+113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
+113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
+113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
+113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
+113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
+113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
+113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
+113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+95, 95, 95, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 81, 81, 81, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 81, 81,
+81, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 81, 81, 81, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 81, 81, 81, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 81,
+81, 81, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 81, 81, 81, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
+113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
+113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
+113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
+113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+95, 95, 95, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
+113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
+113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
+113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
+113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
+113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 81, 81, 81, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 81, 81, 81, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 95, 95, 95, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 95, 95, 95, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 95, 95, 95,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 95, 95, 95, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 101, 101, 101,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 95, 95, 95, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+95, 95, 95, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 95, 95, 95, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 95, 95, 95, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 81, 81, 81, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 81,
+81, 81, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 81, 81, 81, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 81, 81, 81, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 81, 81,
+81, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 81, 81, 81, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 81, 81, 81, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 81, 81, 81, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 81, 81, 81, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 81, 81, 81, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
+85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
+85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+94, 94, 94, 94, 94, 94, 94, 94, 94, 94};
+static unsigned char *empty_world_camera1 MAYBE_UNUSED = __empty_world_camera1;
+
+static unsigned char __projector_world_camera[] = {
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 142, 140, 140, 139, 136,
+136, 143, 138, 138, 140, 137, 137, 132, 130, 130,
+145, 140, 140, 140, 137, 137, 139, 136, 136, 139,
+136, 136, 145, 142, 142, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 132, 130, 130, 142, 134, 134, 121,
+120, 120, 122, 120, 120, 134, 130, 130, 130, 127,
+127, 140, 133, 133, 140, 133, 133, 122, 121, 121,
+140, 133, 133, 133, 129, 129, 129, 126, 126, 125,
+123, 123, 129, 126, 126, 119, 118, 118, 132, 128,
+128, 131, 128, 128, 136, 133, 133, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 130, 124, 124,
+120, 117, 117, 105, 105, 105, 131, 123, 123, 116,
+113, 113, 109, 108, 108, 103, 102, 102, 107, 107,
+107, 118, 115, 115, 126, 121, 121, 132, 124, 124,
+118, 115, 115, 117, 114, 114, 114, 112, 112, 112,
+111, 111, 117, 114, 114, 117, 114, 114, 117, 114,
+114, 119, 116, 116, 118, 115, 115, 135, 127, 127,
+136, 128, 128, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 128, 122, 122, 112, 109, 109, 108, 105, 105,
+114, 110, 110, 107, 105, 105, 115, 110, 110, 110,
+107, 107, 105, 103, 103, 102, 100, 100, 104, 102,
+102, 111, 107, 107, 120, 114, 114, 116, 111, 111,
+106, 104, 104, 104, 102, 102, 104, 102, 102, 124,
+115, 115, 122, 115, 115, 114, 110, 110, 118, 112,
+112, 122, 114, 114, 114, 110, 110, 123, 116, 116,
+124, 117, 117, 126, 119, 119, 139, 127, 127, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 98, 98, 98, 112, 109,
+109, 117, 111, 111, 89, 88, 88, 83, 83, 83,
+86, 86, 86, 109, 103, 103, 109, 103, 103, 104,
+100, 100, 92, 91, 91, 98, 96, 96, 79, 79,
+79, 87, 86, 86, 119, 110, 110, 116, 108, 108,
+103, 99, 99, 104, 100, 100, 91, 90, 90, 101,
+98, 98, 106, 101, 101, 104, 100, 100, 104, 100,
+100, 122, 109, 109, 96, 95, 95, 106, 102, 102,
+123, 112, 112, 120, 111, 111, 125, 116, 116, 101,
+100, 100, 93, 93, 93, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 89, 88, 88, 85, 85, 85, 99, 97,
+97, 97, 94, 94, 78, 78, 78, 82, 81, 81,
+63, 63, 63, 98, 94, 94, 114, 103, 103, 107,
+100, 100, 111, 102, 102, 113, 104, 104, 79, 79,
+79, 79, 78, 78, 103, 97, 97, 105, 98, 98,
+85, 83, 83, 93, 90, 90, 108, 100, 100, 108,
+101, 101, 104, 97, 97, 98, 94, 94, 102, 97,
+97, 106, 99, 99, 90, 88, 88, 113, 104, 104,
+108, 101, 101, 105, 99, 99, 103, 99, 99, 93,
+91, 91, 102, 99, 99, 123, 115, 115, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 106, 104, 104, 104,
+100, 100, 98, 95, 95, 95, 92, 92, 97, 92,
+92, 88, 85, 85, 78, 77, 77, 63, 63, 63,
+51, 51, 51, 59, 58, 58, 97, 90, 90, 99,
+91, 91, 74, 73, 73, 77, 76, 76, 98, 90,
+90, 96, 89, 89, 80, 78, 78, 86, 83, 83,
+89, 85, 85, 90, 85, 85, 80, 78, 78, 70,
+69, 69, 74, 73, 73, 70, 69, 69, 87, 83,
+83, 95, 89, 89, 74, 73, 73, 85, 82, 82,
+81, 79, 79, 99, 93, 93, 89, 86, 86, 93,
+89, 89, 94, 91, 91, 96, 94, 94, 104, 101,
+101, 118, 112, 112, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 122, 113, 113, 114, 104, 104, 93,
+90, 90, 97, 91, 91, 93, 88, 88, 86, 82,
+82, 80, 77, 77, 90, 83, 83, 78, 75, 75,
+58, 57, 57, 53, 52, 52, 64, 63, 63, 79,
+75, 75, 81, 76, 76, 85, 80, 80, 99, 86,
+86, 93, 84, 84, 81, 77, 77, 83, 78, 78,
+81, 76, 76, 68, 66, 66, 69, 68, 68, 57,
+57, 57, 51, 51, 51, 51, 51, 51, 60, 60,
+60, 82, 77, 77, 74, 72, 72, 88, 83, 83,
+94, 86, 86, 97, 90, 90, 81, 79, 79, 87,
+84, 84, 92, 87, 87, 96, 92, 92, 102, 96,
+96, 93, 91, 91, 122, 112, 112, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+96, 95, 95, 96, 93, 93, 89, 86, 86, 80,
+78, 78, 83, 80, 80, 79, 76, 76, 74, 72,
+72, 54, 54, 54, 57, 56, 56, 89, 82, 82,
+111, 90, 90, 94, 82, 82, 83, 76, 76, 79,
+74, 74, 74, 70, 70, 41, 41, 41, 47, 47,
+47, 45, 44, 44, 49, 49, 49, 60, 58, 58,
+67, 64, 64, 56, 55, 55, 47, 46, 46, 71,
+67, 67, 75, 70, 70, 91, 79, 79, 79, 72,
+72, 77, 71, 71, 96, 84, 84, 67, 65, 65,
+75, 72, 72, 96, 87, 87, 84, 79, 79, 91,
+85, 85, 102, 92, 92, 91, 87, 87, 90, 86,
+86, 84, 82, 82, 95, 93, 93, 103, 101, 101,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 89, 88, 88,
+78, 77, 77, 77, 76, 76, 99, 91, 91, 72,
+70, 70, 80, 76, 76, 84, 78, 78, 85, 78,
+78, 60, 58, 58, 65, 62, 62, 62, 60, 60,
+90, 79, 79, 73, 68, 68, 78, 73, 73, 68,
+65, 65, 68, 65, 65, 50, 49, 49, 50, 49,
+49, 47, 46, 46, 51, 50, 50, 79, 73, 73,
+91, 81, 81, 52, 51, 51, 65, 62, 62, 56,
+55, 55, 61, 59, 59, 81, 73, 73, 74, 69,
+69, 70, 66, 66, 75, 71, 71, 58, 57, 57,
+76, 71, 71, 61, 59, 59, 70, 68, 68, 62,
+61, 61, 75, 72, 72, 71, 69, 69, 68, 67,
+67, 79, 76, 76, 80, 78, 78, 89, 86, 86,
+96, 94, 94, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 102, 99, 99, 89, 86, 86,
+75, 73, 73, 62, 61, 61, 70, 68, 68, 63,
+62, 62, 71, 68, 68, 85, 77, 77, 82, 75,
+75, 66, 63, 63, 76, 70, 70, 77, 71, 71,
+87, 78, 78, 81, 74, 74, 71, 67, 67, 57,
+56, 56, 60, 58, 58, 62, 60, 60, 56, 55,
+55, 61, 59, 59, 56, 55, 55, 60, 58, 58,
+67, 64, 64, 71, 67, 67, 65, 62, 62, 74,
+69, 69, 69, 65, 65, 64, 62, 62, 87, 77,
+77, 71, 67, 67, 61, 59, 59, 54, 52, 52,
+60, 58, 58, 60, 58, 58, 64, 61, 61, 49,
+49, 49, 70, 67, 67, 61, 59, 59, 58, 57,
+57, 79, 75, 75, 72, 70, 70, 83, 80, 80,
+94, 90, 90, 105, 101, 101, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 92, 88, 88, 93, 87, 87,
+98, 88, 88, 91, 83, 83, 45, 45, 45, 61,
+59, 59, 58, 57, 57, 69, 66, 66, 74, 70,
+70, 85, 77, 77, 72, 68, 68, 71, 67, 67,
+72, 68, 68, 78, 73, 73, 78, 72, 72, 74,
+69, 69, 79, 72, 72, 67, 64, 64, 55, 53,
+53, 67, 64, 64, 69, 66, 66, 61, 59, 59,
+66, 63, 63, 65, 62, 62, 76, 70, 70, 83,
+76, 76, 56, 54, 54, 74, 69, 69, 65, 63,
+63, 68, 65, 65, 70, 66, 66, 66, 63, 63,
+66, 62, 62, 67, 64, 64, 72, 68, 68, 69,
+66, 66, 76, 71, 71, 73, 69, 69, 48, 48,
+48, 91, 82, 82, 83, 78, 78, 112, 96, 96,
+94, 88, 88, 71, 71, 71, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 99, 94, 94, 74, 72, 72, 65, 64, 64,
+64, 63, 63, 62, 60, 60, 39, 39, 39, 58,
+56, 56, 65, 62, 62, 75, 70, 70, 72, 69,
+69, 94, 83, 83, 89, 80, 80, 72, 68, 68,
+75, 70, 70, 95, 84, 84, 87, 79, 79, 76,
+71, 71, 60, 58, 58, 91, 80, 80, 57, 56,
+56, 72, 68, 68, 100, 86, 86, 89, 80, 80,
+102, 86, 86, 66, 63, 63, 53, 52, 52, 61,
+59, 59, 46, 45, 45, 73, 68, 68, 64, 62,
+62, 46, 45, 45, 67, 64, 64, 63, 61, 61,
+69, 66, 66, 64, 61, 61, 63, 61, 61, 75,
+70, 70, 63, 61, 61, 61, 59, 59, 45, 44,
+44, 72, 68, 68, 66, 63, 63, 62, 60, 60,
+82, 78, 78, 60, 59, 59, 106, 98, 98, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 95, 91,
+91, 91, 86, 86, 85, 79, 79, 81, 74, 74,
+87, 78, 78, 90, 79, 79, 95, 82, 82, 63,
+61, 61, 47, 47, 47, 51, 50, 50, 56, 55,
+55, 62, 60, 60, 74, 69, 69, 65, 62, 62,
+70, 66, 66, 76, 71, 71, 72, 68, 68, 73,
+68, 68, 58, 56, 56, 68, 65, 65, 56, 54,
+54, 64, 61, 61, 82, 75, 75, 65, 62, 62,
+83, 75, 75, 64, 61, 61, 56, 54, 54, 56,
+54, 54, 65, 63, 63, 83, 75, 75, 67, 64,
+64, 60, 58, 58, 66, 64, 64, 73, 68, 68,
+75, 70, 70, 62, 60, 60, 60, 58, 58, 77,
+72, 72, 77, 72, 72, 80, 73, 73, 70, 67,
+67, 49, 49, 49, 46, 45, 45, 50, 49, 49,
+77, 72, 72, 67, 65, 65, 77, 75, 75, 91,
+88, 88, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 104, 94,
+94, 82, 77, 77, 78, 73, 73, 64, 61, 61,
+64, 61, 61, 77, 71, 71, 85, 77, 77, 77,
+72, 72, 51, 50, 50, 54, 53, 53, 64, 61,
+61, 64, 61, 61, 70, 66, 66, 80, 73, 73,
+79, 72, 72, 62, 59, 59, 59, 57, 57, 57,
+55, 55, 50, 49, 49, 56, 54, 54, 57, 56,
+56, 68, 65, 65, 73, 69, 69, 57, 55, 55,
+57, 56, 56, 48, 47, 47, 52, 51, 51, 51,
+50, 50, 78, 72, 72, 102, 85, 85, 85, 76,
+76, 67, 64, 64, 55, 53, 53, 79, 72, 72,
+72, 68, 68, 68, 65, 65, 76, 70, 70, 85,
+77, 77, 86, 78, 78, 67, 64, 64, 62, 60,
+60, 40, 40, 40, 72, 68, 68, 94, 83, 83,
+63, 60, 60, 82, 76, 76, 79, 75, 75, 86,
+82, 82, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 89, 85, 85, 102, 90,
+90, 72, 68, 68, 83, 76, 76, 60, 58, 58,
+93, 82, 82, 98, 85, 85, 88, 79, 79, 65,
+63, 63, 81, 75, 75, 58, 57, 57, 56, 54,
+54, 62, 60, 60, 85, 77, 77, 87, 79, 79,
+65, 62, 62, 64, 61, 61, 77, 72, 72, 83,
+76, 76, 81, 74, 74, 80, 73, 73, 51, 50,
+50, 63, 61, 61, 73, 68, 68, 73, 68, 68,
+76, 71, 71, 68, 65, 65, 60, 58, 58, 67,
+64, 64, 69, 66, 66, 64, 62, 62, 73, 68,
+68, 75, 70, 70, 75, 70, 70, 63, 60, 60,
+81, 74, 74, 76, 71, 71, 60, 58, 58, 60,
+58, 58, 57, 56, 56, 53, 52, 52, 89, 79,
+79, 98, 84, 84, 69, 66, 66, 61, 59, 59,
+58, 57, 57, 51, 50, 50, 59, 58, 58, 57,
+56, 56, 80, 78, 78, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 73, 70, 70, 83, 77,
+77, 74, 69, 69, 78, 73, 73, 74, 69, 69,
+74, 69, 69, 84, 77, 77, 68, 65, 65, 95,
+83, 83, 70, 67, 67, 77, 72, 72, 92, 81,
+81, 99, 84, 84, 76, 71, 71, 85, 78, 78,
+73, 68, 68, 77, 72, 72, 84, 77, 77, 93,
+83, 83, 97, 84, 84, 103, 85, 85, 71, 67,
+67, 63, 61, 61, 92, 82, 82, 99, 85, 85,
+76, 71, 71, 76, 71, 71, 74, 70, 70, 75,
+71, 71, 90, 81, 81, 63, 61, 61, 65, 63,
+63, 84, 77, 77, 68, 65, 65, 53, 52, 52,
+95, 83, 83, 89, 80, 80, 89, 80, 80, 85,
+78, 78, 84, 77, 77, 73, 69, 69, 61, 59,
+59, 81, 75, 75, 95, 83, 83, 89, 80, 80,
+78, 72, 72, 58, 57, 57, 73, 69, 69, 83,
+77, 77, 92, 85, 85, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 92, 85, 85, 63, 61, 61, 59, 57,
+57, 72, 68, 68, 89, 80, 80, 97, 84, 84,
+75, 69, 69, 82, 75, 75, 60, 58, 58, 65,
+62, 62, 90, 79, 79, 94, 82, 82, 67, 64,
+64, 71, 67, 67, 67, 64, 64, 70, 66, 66,
+70, 67, 67, 76, 71, 71, 89, 80, 80, 88,
+79, 79, 99, 84, 84, 92, 81, 81, 67, 64,
+64, 57, 56, 56, 57, 56, 56, 64, 61, 61,
+63, 60, 60, 86, 78, 78, 76, 71, 71, 68,
+65, 65, 68, 65, 65, 57, 56, 56, 64, 61,
+61, 56, 54, 54, 60, 58, 58, 86, 78, 78,
+61, 59, 59, 65, 62, 62, 64, 61, 61, 45,
+44, 44, 50, 49, 49, 58, 57, 57, 65, 63,
+63, 72, 68, 68, 67, 64, 64, 72, 67, 67,
+70, 66, 66, 70, 66, 66, 74, 69, 69, 90,
+80, 80, 88, 80, 80, 85, 82, 82, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 65, 64, 64, 79, 73, 73, 82, 75,
+75, 63, 61, 61, 67, 64, 64, 73, 68, 68,
+66, 63, 63, 82, 75, 75, 68, 65, 65, 57,
+56, 56, 63, 61, 61, 75, 70, 70, 80, 74,
+74, 63, 60, 60, 73, 68, 68, 72, 68, 68,
+73, 68, 68, 85, 78, 78, 77, 72, 72, 86,
+78, 78, 72, 68, 68, 76, 70, 70, 56, 54,
+54, 58, 57, 57, 76, 71, 71, 76, 71, 71,
+66, 63, 63, 62, 60, 60, 63, 61, 61, 70,
+66, 66, 79, 72, 72, 70, 66, 66, 63, 61,
+61, 67, 64, 64, 68, 65, 65, 66, 64, 64,
+58, 57, 57, 78, 73, 73, 69, 66, 66, 52,
+51, 51, 49, 49, 49, 70, 66, 66, 76, 71,
+71, 82, 75, 75, 66, 63, 63, 63, 60, 60,
+79, 73, 73, 84, 77, 77, 47, 46, 46, 57,
+56, 56, 69, 65, 65, 64, 62, 62, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 90,
+84, 84, 67, 65, 65, 46, 45, 45, 59, 57,
+57, 76, 71, 71, 80, 74, 74, 76, 71, 71,
+83, 76, 76, 90, 80, 80, 77, 72, 72, 75,
+70, 70, 79, 73, 73, 68, 65, 65, 74, 70,
+70, 72, 68, 68, 55, 54, 54, 50, 49, 49,
+77, 72, 72, 80, 74, 74, 70, 66, 66, 68,
+65, 65, 59, 57, 57, 69, 65, 65, 56, 55,
+55, 103, 103, 103, 102, 102, 102, 103, 103, 103,
+103, 103, 103, 103, 103, 103, 103, 103, 103, 61,
+59, 59, 67, 64, 64, 69, 65, 65, 49, 49,
+49, 48, 48, 48, 46, 45, 45, 54, 53, 53,
+70, 66, 66, 98, 85, 85, 86, 78, 78, 74,
+69, 69, 70, 67, 67, 104, 87, 87, 87, 78,
+78, 90, 79, 79, 80, 74, 74, 59, 57, 57,
+77, 72, 72, 105, 87, 87, 65, 62, 62, 39,
+39, 39, 83, 76, 76, 108, 90, 90, 107, 96,
+96, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 74,
+70, 70, 54, 53, 53, 75, 70, 70, 59, 58,
+58, 68, 65, 65, 58, 57, 57, 52, 51, 51,
+53, 52, 52, 57, 56, 56, 52, 51, 51, 53,
+52, 52, 75, 70, 70, 74, 70, 70, 65, 62,
+62, 70, 66, 66, 60, 58, 58, 47, 46, 46,
+65, 62, 62, 80, 74, 74, 78, 72, 72, 73,
+69, 69, 60, 58, 58, 78, 78, 78, 73, 73,
+73, 71, 71, 71, 70, 70, 70, 70, 70, 70,
+70, 70, 70, 70, 70, 70, 71, 71, 71, 73,
+73, 73, 79, 79, 79, 64, 62, 62, 55, 54,
+54, 66, 64, 64, 69, 66, 66, 61, 59, 59,
+73, 68, 68, 87, 79, 79, 85, 77, 77, 78,
+72, 72, 71, 67, 67, 72, 67, 67, 54, 53,
+53, 64, 62, 62, 75, 69, 69, 65, 63, 63,
+68, 65, 65, 57, 56, 56, 88, 79, 79, 51,
+50, 50, 38, 37, 37, 66, 63, 63, 49, 49,
+49, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 49,
+48, 48, 39, 39, 39, 52, 51, 51, 70, 66,
+66, 45, 44, 44, 57, 55, 55, 48, 48, 48,
+50, 49, 49, 56, 54, 54, 40, 40, 40, 34,
+34, 34, 46, 46, 46, 84, 76, 76, 71, 67,
+67, 65, 62, 62, 71, 67, 67, 64, 61, 61,
+66, 63, 63, 78, 72, 72, 83, 75, 75, 79,
+79, 79, 58, 58, 58, 49, 49, 49, 45, 45,
+45, 43, 43, 43, 42, 42, 42, 41, 41, 41,
+41, 41, 41, 42, 42, 42, 44, 44, 44, 46,
+46, 46, 50, 50, 50, 59, 59, 59, 80, 80,
+80, 67, 64, 64, 79, 74, 74, 55, 53, 53,
+85, 76, 76, 72, 68, 68, 80, 73, 73, 71,
+66, 66, 58, 57, 57, 62, 60, 60, 39, 39,
+39, 55, 54, 54, 98, 83, 83, 78, 71, 71,
+56, 55, 55, 39, 39, 39, 52, 51, 51, 73,
+68, 68, 77, 71, 71, 78, 72, 72, 69, 65,
+65, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 67,
+64, 64, 71, 67, 67, 72, 68, 68, 78, 72,
+72, 73, 69, 69, 72, 67, 67, 77, 71, 71,
+54, 53, 53, 47, 46, 46, 55, 53, 53, 76,
+70, 70, 76, 70, 70, 56, 55, 55, 55, 54,
+54, 68, 65, 65, 85, 77, 77, 78, 72, 72,
+55, 54, 54, 56, 55, 55, 74, 74, 74, 46,
+46, 46, 35, 35, 35, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 28, 28, 28, 35, 35, 35, 47, 47,
+47, 75, 75, 75, 68, 65, 65, 58, 57, 57,
+79, 73, 73, 50, 49, 49, 62, 60, 60, 81,
+73, 73, 52, 51, 51, 77, 71, 71, 87, 77,
+77, 81, 74, 74, 65, 63, 63, 47, 47, 47,
+55, 53, 53, 49, 48, 48, 40, 40, 40, 61,
+59, 59, 67, 64, 64, 72, 68, 68, 64, 62,
+62, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 57, 56, 56, 48,
+48, 48, 83, 77, 77, 73, 69, 69, 71, 68,
+68, 80, 74, 74, 86, 78, 78, 81, 74, 74,
+89, 78, 78, 52, 51, 51, 47, 46, 46, 60,
+59, 59, 81, 74, 74, 58, 56, 56, 78, 73,
+73, 86, 78, 78, 87, 79, 79, 73, 69, 69,
+51, 50, 50, 58, 56, 56, 40, 40, 40, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 26, 26,
+26, 41, 41, 41, 60, 58, 58, 48, 48, 48,
+66, 63, 63, 46, 45, 45, 63, 60, 60, 70,
+66, 66, 73, 69, 69, 75, 70, 70, 93, 81,
+81, 85, 77, 77, 68, 65, 65, 58, 56, 56,
+78, 73, 73, 79, 73, 73, 57, 56, 56, 76,
+70, 70, 76, 71, 71, 76, 71, 71, 94, 82,
+82, 85, 78, 78, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 56, 55, 55, 52,
+51, 51, 57, 56, 56, 60, 58, 58, 69, 65,
+65, 61, 59, 59, 58, 56, 56, 64, 61, 61,
+83, 75, 75, 65, 62, 62, 64, 61, 61, 86,
+77, 77, 92, 79, 79, 64, 61, 61, 56, 55,
+55, 42, 42, 42, 42, 42, 42, 50, 49, 49,
+58, 56, 56, 41, 41, 41, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 42, 42, 42, 54, 53, 53,
+69, 65, 65, 84, 75, 75, 71, 66, 66, 64,
+61, 61, 68, 65, 65, 79, 73, 73, 75, 70,
+70, 68, 64, 64, 64, 61, 61, 75, 69, 69,
+55, 53, 53, 53, 52, 52, 75, 69, 69, 84,
+75, 75, 55, 53, 53, 47, 46, 46, 66, 64,
+64, 61, 59, 59, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 70, 66, 66, 56,
+54, 54, 54, 53, 53, 82, 74, 74, 83, 75,
+75, 68, 65, 65, 65, 62, 62, 62, 60, 60,
+81, 74, 74, 60, 58, 58, 60, 58, 58, 73,
+69, 69, 82, 74, 74, 83, 76, 76, 59, 57,
+57, 57, 55, 55, 60, 58, 58, 69, 66, 66,
+54, 53, 53, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 81, 74, 74,
+66, 63, 63, 91, 81, 81, 84, 76, 76, 67,
+64, 64, 65, 62, 62, 73, 68, 68, 67, 64,
+64, 70, 66, 66, 67, 64, 64, 69, 66, 66,
+67, 64, 64, 49, 49, 49, 58, 56, 56, 85,
+76, 76, 77, 72, 72, 65, 62, 62, 71, 67,
+67, 80, 74, 74, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 38, 38, 38, 36,
+36, 36, 40, 40, 40, 67, 64, 64, 87, 78,
+78, 92, 81, 81, 90, 80, 80, 85, 78, 78,
+85, 78, 78, 76, 72, 72, 57, 56, 56, 71,
+67, 67, 71, 67, 67, 85, 77, 77, 72, 68,
+68, 57, 55, 55, 70, 66, 66, 85, 77, 77,
+39, 39, 39, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 40, 40, 40,
+74, 70, 70, 94, 83, 83, 83, 76, 76, 82,
+75, 75, 76, 71, 71, 72, 68, 68, 56, 54,
+54, 69, 66, 66, 77, 72, 72, 75, 71, 71,
+73, 69, 69, 60, 58, 58, 60, 58, 58, 91,
+81, 81, 87, 78, 78, 64, 61, 61, 97, 84,
+84, 71, 67, 67, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 83, 75, 75, 83,
+75, 75, 84, 76, 76, 63, 61, 61, 51, 50,
+50, 76, 70, 70, 58, 56, 56, 51, 50, 50,
+49, 49, 49, 52, 51, 51, 51, 50, 50, 63,
+60, 60, 89, 79, 79, 50, 49, 49, 50, 49,
+49, 63, 60, 60, 70, 66, 66, 80, 74, 74,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+80, 74, 74, 99, 85, 85, 62, 60, 60, 48,
+48, 48, 49, 49, 49, 66, 63, 63, 61, 59,
+59, 52, 51, 51, 49, 49, 49, 78, 72, 72,
+71, 67, 67, 78, 72, 72, 61, 59, 59, 58,
+57, 57, 59, 57, 57, 63, 60, 60, 80, 74,
+74, 85, 77, 77, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 83, 76, 76, 88,
+79, 79, 105, 87, 87, 93, 82, 82, 83, 75,
+75, 87, 78, 78, 76, 70, 70, 69, 66, 66,
+53, 52, 52, 57, 56, 56, 66, 63, 63, 73,
+69, 69, 79, 73, 73, 62, 60, 60, 43, 43,
+43, 48, 47, 47, 56, 54, 54, 74, 69, 69,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+65, 63, 63, 73, 68, 68, 69, 65, 65, 45,
+44, 44, 57, 56, 56, 57, 56, 56, 91, 80,
+80, 82, 74, 74, 59, 57, 57, 52, 51, 51,
+67, 64, 64, 94, 83, 83, 110, 88, 88, 70,
+67, 67, 62, 60, 60, 68, 65, 65, 83, 75,
+75, 64, 61, 61, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 27, 27, 27, 32,
+32, 32, 50, 49, 49, 42, 42, 42, 33, 33,
+33, 47, 46, 46, 65, 62, 62, 54, 53, 53,
+29, 29, 29, 28, 28, 28, 44, 44, 44, 66,
+64, 64, 60, 58, 58, 71, 67, 67, 70, 67,
+67, 73, 69, 69, 105, 89, 89, 90, 80, 80,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+79, 73, 73, 85, 77, 77, 81, 75, 75, 76,
+71, 71, 79, 73, 73, 71, 67, 67, 53, 52,
+52, 71, 67, 67, 82, 75, 75, 60, 58, 58,
+85, 77, 77, 92, 81, 81, 85, 77, 77, 68,
+65, 65, 95, 84, 84, 85, 78, 78, 57, 56,
+56, 52, 51, 51, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 45, 44, 44, 38,
+37, 37, 45, 44, 44, 42, 42, 42, 39, 38,
+38, 66, 64, 64, 77, 72, 72, 58, 57, 57,
+54, 53, 53, 42, 42, 42, 51, 50, 50, 77,
+72, 72, 77, 72, 72, 69, 66, 66, 76, 70,
+70, 75, 70, 70, 75, 70, 70, 87, 79, 79,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+59, 57, 57, 77, 72, 72, 78, 73, 73, 74,
+70, 70, 73, 69, 69, 71, 68, 68, 74, 69,
+69, 73, 69, 69, 80, 74, 74, 75, 70, 70,
+83, 76, 76, 98, 84, 84, 83, 76, 76, 55,
+53, 53, 67, 64, 64, 77, 72, 72, 66, 63,
+63, 50, 49, 49, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 79, 73, 73, 62,
+60, 60, 74, 69, 69, 64, 61, 61, 54, 53,
+53, 80, 74, 74, 71, 67, 67, 70, 67, 67,
+77, 72, 72, 64, 61, 61, 64, 61, 61, 64,
+61, 61, 64, 61, 61, 69, 66, 66, 72, 67,
+67, 54, 52, 52, 39, 38, 38, 58, 57, 57,
+57, 56, 56, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 66, 63, 63,
+48, 47, 47, 66, 63, 63, 75, 70, 70, 79,
+73, 73, 68, 65, 65, 60, 58, 58, 70, 67,
+67, 76, 70, 70, 54, 53, 53, 69, 66, 66,
+79, 73, 73, 76, 71, 71, 66, 63, 63, 57,
+56, 56, 49, 49, 49, 48, 47, 47, 77, 71,
+71, 77, 72, 72, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 58, 56, 56, 58,
+56, 56, 70, 66, 66, 84, 76, 76, 72, 68,
+68, 74, 70, 70, 68, 65, 65, 71, 67, 67,
+79, 73, 73, 62, 60, 60, 82, 75, 75, 80,
+74, 74, 74, 69, 69, 65, 62, 62, 65, 62,
+62, 66, 63, 63, 76, 71, 71, 82, 75, 75,
+69, 66, 66, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 71, 67, 67,
+64, 61, 61, 90, 80, 80, 87, 78, 78, 88,
+80, 80, 90, 79, 79, 86, 77, 77, 89, 79,
+79, 76, 70, 70, 70, 67, 67, 67, 64, 64,
+75, 70, 70, 80, 74, 74, 60, 58, 58, 50,
+49, 49, 69, 65, 65, 62, 60, 60, 49, 49,
+49, 52, 51, 51, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 67, 64, 64, 83,
+77, 77, 73, 70, 70, 96, 85, 85, 80, 75,
+75, 87, 79, 79, 65, 63, 63, 50, 49, 49,
+66, 64, 64, 88, 80, 80, 79, 73, 73, 72,
+68, 68, 57, 56, 56, 86, 79, 79, 59, 57,
+57, 49, 49, 49, 76, 71, 71, 89, 80, 80,
+89, 81, 81, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 96, 84, 84,
+90, 81, 81, 87, 79, 79, 85, 78, 78, 102,
+86, 86, 82, 76, 76, 84, 77, 77, 91, 80,
+80, 91, 81, 81, 85, 78, 78, 97, 84, 84,
+83, 76, 76, 75, 70, 70, 69, 66, 66, 36,
+36, 36, 46, 45, 45, 70, 67, 67, 82, 76,
+76, 78, 73, 73, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 56,
+55, 55, 65, 63, 63, 54, 53, 53, 48, 48,
+48, 76, 71, 71, 78, 73, 73, 39, 39, 39,
+40, 40, 40, 68, 65, 65, 70, 66, 66, 91,
+80, 80, 57, 56, 56, 48, 47, 47, 63, 60,
+60, 60, 58, 58, 52, 51, 51, 48, 48, 48,
+49, 49, 49, 73, 68, 68, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 96, 84, 84, 85, 76, 76,
+53, 52, 52, 54, 52, 52, 57, 56, 56, 78,
+72, 72, 84, 76, 76, 76, 71, 71, 66, 64,
+64, 57, 56, 56, 48, 47, 47, 41, 41, 41,
+75, 71, 71, 82, 75, 75, 59, 57, 57, 80,
+73, 73, 80, 73, 73, 79, 72, 72, 76, 70,
+70, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 67,
+64, 64, 86, 77, 77, 92, 81, 81, 73, 68,
+68, 60, 58, 58, 60, 58, 58, 46, 45, 45,
+64, 62, 62, 96, 83, 83, 76, 71, 71, 61,
+59, 59, 68, 64, 64, 65, 62, 62, 57, 55,
+55, 64, 62, 62, 58, 56, 56, 58, 56, 56,
+70, 66, 66, 65, 62, 62, 80, 73, 73, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 70, 66, 66, 78, 72, 72, 71, 67, 67,
+63, 61, 61, 64, 61, 61, 67, 64, 64, 71,
+67, 67, 74, 69, 69, 65, 62, 62, 52, 51,
+51, 62, 60, 60, 65, 62, 62, 58, 56, 56,
+74, 69, 69, 62, 60, 60, 59, 57, 57, 62,
+60, 60, 40, 40, 40, 48, 47, 47, 71, 67,
+67, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
+134, 134, 134, 141, 139, 139, 149, 145, 145, 152,
+146, 146, 152, 146, 146, 153, 147, 147, 153, 147,
+147, 152, 147, 147, 152, 146, 146, 149, 144, 144,
+150, 145, 145, 149, 144, 144, 148, 144, 144, 149,
+145, 145, 149, 145, 145, 150, 146, 146, 164, 152,
+152, 169, 152, 152, 162, 150, 150, 147, 144, 144,
+137, 136, 136, 134, 134, 134, 134, 133, 133, 138,
+137, 137, 143, 141, 141, 145, 142, 142, 151, 146,
+146, 153, 147, 147, 147, 143, 143, 145, 142, 142,
+142, 140, 140, 136, 135, 135, 144, 141, 141, 151,
+146, 146, 157, 148, 148, 155, 148, 148, 157, 148,
+148, 163, 150, 150, 157, 149, 149, 150, 145, 145,
+142, 140, 140, 140, 139, 139, 146, 143, 143, 155,
+148, 148, 153, 147, 147, 149, 146, 146, 144, 142,
+142, 135, 135, 135, 134, 134, 134, 136, 136, 136,
+137, 136, 136, 141, 139, 139, 145, 143, 143, 149,
+145, 145, 152, 147, 147, 155, 149, 149, 159, 151,
+151, 149, 145, 145, 146, 143, 143, 151, 146, 146,
+155, 148, 148, 154, 148, 148, 149, 145, 145, 138,
+137, 137, 130, 130, 130, 128, 128, 128, 145, 142,
+142, 153, 147, 147, 157, 150, 150, 151, 147, 147,
+149, 146, 146, 143, 141, 141, 127, 127, 127, 135,
+134, 134, 139, 138, 138, 131, 131, 131, 141, 140,
+140, 148, 145, 145, 148, 145, 145, 147, 144, 144,
+150, 146, 146, 158, 150, 150, 154, 148, 148, 144,
+142, 142, 132, 132, 132, 140, 139, 139, 143, 141,
+141, 143, 141, 141, 141, 140, 140, 140, 139, 139,
+144, 142, 142, 155, 149, 149, 154, 149, 149, 148,
+145, 145, 141, 140, 140, 146, 143, 143, 149, 146,
+146, 153, 149, 149, 146, 143, 143, 145, 143, 143,
+141, 140, 140, 148, 145, 145, 152, 148, 148, 166,
+154, 154, 153, 148, 148, 146, 144, 144, 141, 140,
+140, 147, 144, 144, 163, 152, 152, 176, 153, 153,
+140, 139, 139, 134, 134, 134, 136, 136, 136, 137,
+137, 137, 139, 138, 138, 141, 140, 140, 138, 137,
+137, 139, 138, 138, 145, 143, 143, 161, 153, 153,
+158, 151, 151, 153, 149, 149, 156, 151, 151, 156,
+151, 151, 144, 142, 142, 154, 149, 149, 174, 152,
+152, 181, 146, 146, 181, 145, 145, 179, 147, 147,
+163, 152, 152, 140, 139, 139, 138, 137, 137, 51,
+50, 50, 38, 38, 38, 39, 39, 39, 46, 45,
+45, 55, 54, 54, 65, 62, 62, 69, 65, 65,
+82, 75, 75, 94, 84, 84, 78, 72, 72, 74,
+69, 69, 65, 62, 62, 71, 67, 67, 68, 65,
+65, 65, 62, 62, 55, 54, 54, 60, 58, 58,
+73, 68, 68, 73, 68, 68, 77, 71, 71, 88,
+77, 77, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 79, 72,
+72, 77, 72, 72, 60, 59, 59, 58, 57, 57,
+73, 69, 69, 73, 69, 69, 74, 69, 69, 78,
+73, 73, 84, 76, 76, 69, 66, 66, 62, 60,
+60, 51, 50, 50, 53, 52, 52, 77, 71, 71,
+76, 71, 71, 89, 79, 79, 63, 60, 60, 58,
+56, 56, 62, 60, 60, 86, 77, 77, 84, 76,
+76, 157, 151, 151, 153, 148, 148, 160, 152, 152,
+168, 157, 157, 154, 149, 149, 164, 154, 154, 152,
+148, 148, 156, 150, 150, 158, 151, 151, 157, 151,
+151, 161, 153, 153, 158, 152, 152, 146, 144, 144,
+148, 145, 145, 172, 152, 152, 165, 153, 153, 136,
+136, 136, 131, 131, 131, 134, 134, 134, 148, 145,
+145, 154, 149, 149, 166, 154, 154, 170, 156, 156,
+168, 154, 154, 151, 147, 147, 148, 145, 145, 152,
+147, 147, 157, 150, 150, 155, 149, 149, 136, 136,
+136, 135, 135, 135, 133, 133, 133, 132, 132, 132,
+134, 134, 134, 136, 136, 136, 138, 137, 137, 138,
+137, 137, 140, 139, 139, 141, 140, 140, 138, 138,
+138, 137, 136, 136, 139, 138, 138, 152, 148, 148,
+149, 145, 145, 154, 149, 149, 178, 152, 152, 167,
+152, 152, 155, 148, 148, 156, 149, 149, 153, 147,
+147, 152, 147, 147, 154, 149, 149, 133, 133, 133,
+129, 129, 129, 140, 139, 139, 151, 147, 147, 150,
+146, 146, 143, 141, 141, 155, 149, 149, 162, 151,
+151, 162, 150, 150, 149, 145, 145, 145, 142, 142,
+144, 142, 142, 139, 138, 138, 139, 138, 138, 139,
+138, 138, 131, 131, 131, 135, 134, 134, 142, 140,
+140, 147, 144, 144, 148, 145, 145, 147, 144, 144,
+142, 140, 140, 142, 140, 140, 144, 142, 142, 149,
+145, 145, 145, 143, 143, 143, 141, 141, 144, 142,
+142, 143, 141, 141, 144, 142, 142, 145, 143, 143,
+140, 139, 139, 140, 139, 139, 145, 143, 143, 157,
+149, 149, 151, 146, 146, 140, 139, 139, 135, 134,
+134, 142, 140, 140, 147, 143, 143, 139, 138, 138,
+140, 139, 139, 143, 140, 140, 145, 142, 142, 144,
+141, 141, 147, 144, 144, 153, 148, 148, 146, 143,
+143, 146, 143, 143, 153, 147, 147, 152, 147, 147,
+152, 146, 146, 152, 147, 147, 153, 147, 147, 150,
+145, 145, 144, 141, 141, 141, 139, 139, 138, 137,
+137, 138, 137, 137, 140, 138, 138, 139, 138, 138,
+138, 137, 137, 137, 136, 136, 135, 135, 135, 134,
+133, 133, 133, 132, 132, 142, 139, 139, 146, 143,
+143, 145, 142, 142, 144, 141, 141, 142, 139, 139,
+139, 138, 138, 140, 138, 138, 145, 142, 142, 150,
+145, 145, 146, 143, 143, 141, 139, 139, 139, 138,
+138, 140, 138, 138, 142, 140, 140, 143, 140, 140,
+147, 144, 144, 144, 141, 141, 141, 139, 139, 145,
+142, 142, 150, 145, 145, 153, 147, 147, 151, 146,
+146, 155, 148, 148, 160, 150, 150, 164, 151, 151,
+166, 151, 151, 164, 150, 150, 160, 150, 150, 157,
+148, 148, 157, 149, 149, 159, 150, 150, 154, 148,
+148, 156, 149, 149, 167, 152, 152, 167, 151, 151,
+156, 148, 148, 142, 140, 140, 142, 140, 140, 140,
+139, 139, 137, 136, 136, 133, 133, 133, 132, 131,
+131, 135, 134, 134, 142, 140, 140, 148, 144, 144,
+154, 146, 146, 158, 149, 149, 153, 146, 146, 144,
+142, 142, 138, 137, 137, 151, 146, 146, 154, 148,
+148, 146, 143, 143, 150, 146, 146, 153, 147, 147,
+153, 146, 146, 145, 142, 142, 145, 142, 142, 150,
+146, 146, 161, 150, 150, 165, 151, 151, 165, 151,
+151, 165, 153, 153, 151, 147, 147, 143, 141, 141,
+142, 141, 141, 143, 142, 142, 144, 143, 143, 144,
+142, 142, 136, 135, 135, 139, 138, 138, 147, 144,
+144, 156, 150, 150, 150, 146, 146, 148, 144, 144,
+160, 150, 150, 172, 150, 150, 174, 149, 149, 159,
+150, 150, 143, 141, 141, 132, 132, 132, 127, 127,
+127, 131, 131, 131, 136, 135, 135, 140, 139, 139,
+139, 138, 138, 137, 136, 136, 132, 132, 132, 126,
+126, 126, 127, 127, 127, 132, 131, 131, 139, 138,
+138, 152, 146, 146, 159, 150, 150, 159, 150, 150,
+154, 148, 148, 161, 151, 151, 175, 149, 149, 172,
+152, 152, 155, 149, 149, 138, 137, 137, 141, 140,
+140, 143, 141, 141, 145, 143, 143, 150, 147, 147,
+146, 144, 144, 142, 141, 141, 138, 137, 137, 132,
+132, 132, 130, 130, 130, 132, 132, 132, 141, 140,
+140, 154, 148, 148, 165, 151, 151, 148, 145, 145,
+143, 142, 142, 140, 139, 139, 130, 130, 130, 149,
+146, 146, 165, 153, 153, 168, 155, 155, 161, 153,
+153, 148, 145, 145, 138, 137, 137, 158, 152, 152,
+155, 150, 150, 152, 148, 148, 160, 152, 152, 164,
+153, 153, 167, 155, 155, 167, 155, 155, 152, 148,
+148, 136, 136, 136, 150, 147, 147, 170, 153, 153,
+180, 147, 147, 170, 152, 152, 156, 149, 149, 163,
+152, 152, 176, 151, 151, 138, 137, 137, 137, 137,
+137, 151, 147, 147, 151, 146, 146, 153, 148, 148,
+163, 151, 151, 170, 153, 153, 168, 155, 155, 117,
+88, 88, 104, 84, 84, 59, 57, 57, 69, 66,
+66, 81, 74, 74, 66, 63, 63, 67, 64, 64,
+82, 75, 75, 81, 74, 74, 75, 70, 70, 73,
+69, 69, 61, 59, 59, 62, 60, 60, 61, 59,
+59, 62, 60, 60, 57, 56, 56, 49, 48, 48,
+66, 63, 63, 63, 60, 60, 66, 63, 63, 77,
+71, 71, 77, 71, 71, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 66, 63, 63, 67, 64,
+64, 66, 63, 63, 60, 58, 58, 49, 48, 48,
+77, 72, 72, 64, 61, 61, 60, 58, 58, 61,
+59, 59, 64, 62, 62, 71, 67, 67, 67, 63,
+63, 63, 60, 60, 57, 56, 56, 57, 55, 55,
+66, 63, 63, 82, 75, 75, 69, 65, 65, 82,
+75, 75, 93, 81, 81, 83, 75, 75, 115, 87,
+87, 169, 154, 154, 154, 148, 148, 170, 152, 152,
+164, 153, 153, 158, 152, 152, 175, 154, 154, 171,
+153, 153, 175, 148, 148, 165, 149, 149, 179, 147,
+147, 179, 149, 149, 169, 150, 150, 144, 142, 142,
+150, 146, 146, 172, 154, 154, 146, 144, 144, 140,
+139, 139, 140, 139, 139, 141, 140, 140, 146, 144,
+144, 157, 151, 151, 160, 152, 152, 158, 151, 151,
+146, 144, 144, 129, 129, 129, 128, 128, 128, 138,
+137, 137, 157, 150, 150, 161, 152, 152, 160, 152,
+152, 153, 149, 149, 137, 136, 136, 137, 137, 137,
+141, 141, 141, 142, 141, 141, 141, 140, 140, 141,
+140, 140, 143, 142, 142, 135, 134, 134, 129, 129,
+129, 127, 127, 127, 148, 145, 145, 160, 151, 151,
+167, 151, 151, 167, 153, 153, 158, 151, 151, 145,
+143, 143, 145, 143, 143, 139, 138, 138, 134, 134,
+134, 140, 139, 139, 131, 131, 131, 127, 127, 127,
+135, 134, 134, 163, 150, 150, 170, 150, 150, 157,
+149, 149, 161, 152, 152, 156, 149, 149, 147, 144,
+144, 148, 145, 145, 152, 147, 147, 158, 150, 150,
+159, 151, 151, 166, 152, 152, 163, 152, 152, 143,
+141, 141, 158, 150, 150, 167, 152, 152, 163, 152,
+152, 166, 152, 152, 167, 153, 153, 169, 153, 153,
+169, 152, 152, 168, 152, 152, 164, 152, 152, 148,
+145, 145, 152, 148, 148, 157, 150, 150, 146, 143,
+143, 149, 145, 145, 152, 147, 147, 147, 144, 144,
+139, 138, 138, 139, 138, 138, 148, 144, 144, 147,
+144, 144, 147, 144, 144, 150, 146, 146, 160, 150,
+150, 162, 151, 151, 160, 150, 150, 161, 151, 151,
+155, 148, 148, 148, 145, 145, 144, 141, 141, 144,
+142, 142, 145, 143, 143, 145, 143, 143, 146, 143,
+143, 146, 143, 143, 144, 142, 142, 144, 142, 142,
+151, 146, 146, 159, 150, 150, 152, 147, 147, 147,
+144, 144, 147, 144, 144, 152, 147, 147, 155, 148,
+148, 156, 148, 148, 153, 147, 147, 152, 146, 146,
+150, 145, 145, 144, 141, 141, 133, 132, 132, 128,
+128, 128, 133, 132, 132, 142, 139, 139, 147, 143,
+143, 148, 143, 143, 142, 140, 140, 142, 139, 139,
+148, 144, 144, 160, 149, 149, 156, 148, 148, 148,
+145, 145, 146, 143, 143, 145, 143, 143, 141, 139,
+139, 136, 135, 135, 139, 138, 138, 143, 141, 141,
+144, 142, 142, 146, 143, 143, 150, 145, 145, 151,
+146, 146, 150, 146, 146, 153, 148, 148, 155, 148,
+148, 157, 149, 149, 162, 151, 151, 163, 151, 151,
+161, 151, 151, 160, 150, 150, 165, 150, 150, 163,
+151, 151, 157, 149, 149, 154, 148, 148, 156, 149,
+149, 160, 151, 151, 160, 151, 151, 164, 151, 151,
+169, 151, 151, 172, 150, 150, 158, 149, 149, 152,
+147, 147, 157, 149, 149, 148, 145, 145, 140, 138,
+138, 134, 133, 133, 133, 133, 133, 136, 135, 135,
+141, 140, 140, 146, 142, 142, 148, 144, 144, 146,
+143, 143, 141, 139, 139, 134, 133, 133, 142, 140,
+140, 158, 150, 150, 159, 150, 150, 153, 147, 147,
+148, 144, 144, 156, 149, 149, 149, 145, 145, 145,
+142, 142, 151, 146, 146, 155, 148, 148, 157, 149,
+149, 159, 150, 150, 163, 153, 153, 158, 151, 151,
+151, 147, 147, 150, 146, 146, 153, 149, 149, 156,
+150, 150, 157, 150, 150, 152, 147, 147, 146, 144,
+144, 143, 142, 142, 146, 144, 144, 143, 141, 141,
+140, 139, 139, 159, 150, 150, 165, 151, 151, 167,
+151, 151, 167, 151, 151, 158, 150, 150, 152, 148,
+148, 149, 146, 146, 148, 145, 145, 150, 146, 146,
+153, 148, 148, 153, 148, 148, 150, 146, 146, 144,
+142, 142, 134, 134, 134, 132, 132, 132, 135, 134,
+134, 143, 141, 141, 150, 146, 146, 157, 150, 150,
+162, 152, 152, 164, 153, 153, 166, 153, 153, 169,
+152, 152, 177, 154, 154, 163, 153, 153, 150, 146,
+146, 149, 146, 146, 140, 139, 139, 146, 143, 143,
+165, 154, 154, 161, 153, 153, 159, 151, 151, 156,
+150, 150, 150, 147, 147, 149, 147, 147, 152, 148,
+148, 156, 150, 150, 156, 149, 149, 150, 146, 146,
+135, 135, 135, 152, 148, 148, 150, 147, 147, 141,
+140, 140, 156, 151, 151, 167, 154, 154, 170, 154,
+154, 159, 152, 152, 153, 149, 149, 155, 150, 150,
+154, 150, 150, 147, 145, 145, 152, 148, 148, 150,
+147, 147, 154, 149, 149, 159, 152, 152, 165, 155,
+155, 154, 150, 150, 151, 148, 148, 158, 151, 151,
+166, 152, 152, 162, 151, 151, 151, 147, 147, 136,
+135, 135, 169, 152, 152, 153, 148, 148, 146, 145,
+145, 152, 149, 149, 144, 143, 143, 135, 135, 135,
+137, 136, 136, 151, 147, 147, 155, 149, 149, 168,
+154, 154, 76, 71, 71, 58, 57, 57, 40, 40,
+40, 74, 69, 69, 96, 82, 82, 85, 76, 76,
+77, 71, 71, 68, 65, 65, 56, 55, 55, 52,
+51, 51, 48, 48, 48, 62, 60, 60, 83, 75,
+75, 63, 60, 60, 56, 55, 55, 38, 38, 38,
+70, 66, 66, 63, 60, 60, 65, 62, 62, 63,
+61, 61, 68, 65, 65, 55, 54, 54, 48, 48,
+48, 62, 60, 60, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 58, 57, 57, 65,
+63, 63, 71, 67, 67, 67, 64, 64, 79, 72,
+72, 64, 61, 61, 48, 47, 47, 46, 45, 45,
+73, 69, 69, 76, 70, 70, 66, 63, 63, 56,
+54, 54, 58, 57, 57, 66, 63, 63, 68, 65,
+65, 65, 62, 62, 76, 70, 70, 74, 69, 69,
+53, 52, 52, 54, 53, 53, 92, 80, 80, 87,
+77, 77, 68, 64, 64, 62, 60, 60, 171, 155,
+155, 157, 151, 151, 152, 148, 148, 163, 153, 153,
+168, 154, 154, 179, 151, 151, 181, 152, 152, 158,
+150, 150, 155, 149, 149, 149, 146, 146, 183, 150,
+150, 175, 150, 150, 162, 151, 151, 149, 146, 146,
+167, 155, 155, 169, 156, 156, 161, 154, 154, 168,
+154, 154, 163, 153, 153, 159, 153, 153, 163, 155,
+155, 159, 152, 152, 156, 151, 151, 168, 156, 156,
+141, 140, 140, 128, 128, 128, 127, 127, 127, 139,
+138, 138, 147, 144, 144, 152, 148, 148, 165, 154,
+154, 155, 150, 150, 154, 150, 150, 157, 151, 151,
+154, 150, 150, 154, 150, 150, 155, 149, 149, 160,
+152, 152, 158, 151, 151, 148, 146, 146, 130, 130,
+130, 148, 145, 145, 164, 153, 153, 156, 149, 149,
+160, 152, 152, 158, 152, 152, 151, 147, 147, 152,
+148, 148, 141, 140, 140, 132, 132, 132, 151, 148,
+148, 151, 148, 148, 149, 146, 146, 153, 148, 148,
+156, 149, 149, 154, 147, 147, 146, 143, 143, 160,
+152, 152, 154, 149, 149, 136, 135, 135, 139, 138,
+138, 146, 144, 144, 154, 149, 149, 157, 151, 151,
+169, 154, 154, 170, 154, 154, 153, 149, 149, 163,
+153, 153, 162, 152, 152, 153, 147, 147, 159, 150,
+150, 163, 152, 152, 165, 152, 152, 167, 151, 151,
+163, 152, 152, 157, 150, 150, 149, 146, 146, 149,
+145, 145, 144, 142, 142, 137, 136, 136, 141, 140,
+140, 141, 140, 140, 137, 136, 136, 131, 131, 131,
+133, 133, 133, 139, 138, 138, 145, 143, 143, 147,
+144, 144, 153, 148, 148, 163, 152, 152, 158, 150,
+150, 156, 149, 149, 156, 149, 149, 155, 149, 149,
+156, 149, 149, 156, 149, 149, 154, 149, 149, 152,
+148, 148, 151, 147, 147, 150, 146, 146, 147, 144,
+144, 142, 140, 140, 140, 138, 138, 151, 146, 146,
+156, 150, 150, 154, 149, 149, 151, 147, 147, 148,
+145, 145, 150, 145, 145, 155, 148, 148, 155, 148,
+148, 152, 146, 146, 148, 144, 144, 153, 148, 148,
+142, 140, 140, 126, 126, 126, 125, 125, 125, 134,
+133, 133, 143, 140, 140, 148, 144, 144, 145, 142,
+142, 145, 142, 142, 151, 146, 146, 164, 150, 150,
+165, 151, 151, 155, 148, 148, 153, 147, 147, 151,
+147, 147, 147, 144, 144, 138, 137, 137, 138, 137,
+137, 141, 140, 140, 145, 142, 142, 141, 139, 139,
+150, 146, 146, 146, 143, 143, 143, 141, 141, 143,
+141, 141, 152, 146, 146, 155, 148, 148, 156, 149,
+149, 158, 150, 150, 157, 149, 149, 162, 151, 151,
+174, 151, 151, 163, 151, 151, 154, 148, 148, 150,
+145, 145, 158, 149, 149, 155, 148, 148, 149, 145,
+145, 145, 142, 142, 151, 147, 147, 159, 150, 150,
+167, 152, 152, 165, 151, 151, 171, 151, 151, 172,
+151, 151, 159, 149, 149, 166, 151, 151, 166, 152,
+152, 154, 149, 149, 145, 143, 143, 141, 140, 140,
+140, 139, 139, 141, 140, 140, 139, 138, 138, 137,
+136, 136, 132, 132, 132, 130, 130, 130, 128, 128,
+128, 133, 132, 132, 152, 147, 147, 167, 151, 151,
+169, 153, 153, 145, 142, 142, 153, 148, 148, 155,
+149, 149, 143, 141, 141, 149, 145, 145, 149, 145,
+145, 144, 142, 142, 142, 141, 141, 150, 146, 146,
+156, 150, 150, 159, 152, 152, 158, 151, 151, 162,
+153, 153, 169, 156, 156, 171, 153, 153, 170, 152,
+152, 164, 152, 152, 146, 144, 144, 139, 138, 138,
+134, 134, 134, 130, 130, 130, 153, 147, 147, 154,
+148, 148, 146, 144, 144, 168, 153, 153, 173, 153,
+153, 173, 155, 155, 174, 156, 156, 172, 154, 154,
+172, 153, 153, 174, 155, 155, 175, 156, 156, 171,
+155, 155, 162, 153, 153, 145, 144, 144, 142, 142,
+142, 143, 142, 142, 144, 143, 143, 144, 143, 143,
+151, 149, 149, 164, 156, 156, 176, 157, 157, 164,
+154, 154, 159, 153, 153, 178, 156, 156, 171, 156,
+156, 162, 153, 153, 154, 150, 150, 133, 132, 132,
+151, 147, 147, 180, 154, 154, 181, 153, 153, 186,
+147, 147, 188, 147, 147, 181, 157, 157, 179, 155,
+155, 177, 153, 153, 172, 153, 153, 146, 144, 144,
+130, 130, 130, 137, 136, 136, 173, 153, 153, 167,
+155, 155, 159, 153, 153, 159, 154, 154, 173, 155,
+155, 166, 155, 155, 158, 153, 153, 179, 157, 157,
+168, 156, 156, 152, 149, 149, 144, 143, 143, 131,
+131, 131, 125, 125, 125, 128, 128, 128, 145, 144,
+144, 171, 157, 157, 177, 157, 157, 155, 151, 151,
+153, 149, 149, 152, 149, 149, 147, 145, 145, 130,
+130, 130, 133, 133, 133, 142, 141, 141, 173, 154,
+154, 179, 156, 156, 172, 158, 158, 135, 135, 135,
+127, 127, 127, 125, 125, 125, 127, 127, 127, 148,
+145, 145, 102, 86, 86, 75, 71, 71, 58, 57,
+57, 56, 54, 54, 87, 78, 78, 70, 66, 66,
+70, 66, 66, 86, 78, 78, 67, 65, 65, 65,
+62, 62, 84, 78, 78, 81, 75, 75, 74, 69,
+69, 71, 67, 67, 72, 68, 68, 36, 36, 36,
+74, 69, 69, 85, 78, 78, 71, 67, 67, 84,
+77, 77, 96, 85, 85, 87, 79, 79, 71, 67,
+67, 64, 61, 61, 67, 64, 64, 79, 73, 73,
+76, 71, 71, 88, 79, 79, 82, 75, 75, 79,
+73, 73, 83, 76, 76, 74, 70, 70, 95, 83,
+83, 98, 84, 84, 95, 84, 84, 84, 77, 77,
+71, 67, 67, 67, 64, 64, 81, 75, 75, 84,
+76, 76, 98, 84, 84, 61, 59, 59, 67, 64,
+64, 60, 58, 58, 57, 56, 56, 79, 73, 73,
+66, 63, 63, 68, 65, 65, 93, 82, 82, 80,
+74, 74, 71, 67, 67, 72, 68, 68, 164, 156,
+156, 166, 155, 155, 160, 154, 154, 162, 155, 155,
+187, 145, 145, 171, 156, 156, 159, 154, 154, 144,
+143, 143, 144, 143, 143, 160, 154, 154, 175, 157,
+157, 166, 152, 152, 173, 151, 151, 174, 154, 154,
+167, 157, 157, 166, 156, 156, 184, 152, 152, 195,
+141, 141, 166, 155, 155, 166, 155, 155, 161, 153,
+153, 144, 143, 143, 179, 157, 157, 171, 157, 157,
+137, 136, 136, 128, 128, 128, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 150, 147, 147, 166, 155,
+155, 171, 157, 157, 169, 153, 153, 166, 152, 152,
+163, 153, 153, 170, 155, 155, 178, 153, 153, 182,
+149, 149, 182, 151, 151, 146, 144, 144, 150, 146,
+146, 174, 154, 154, 143, 142, 142, 147, 145, 145,
+158, 151, 151, 162, 153, 153, 162, 153, 153, 150,
+147, 147, 132, 132, 132, 167, 155, 155, 178, 156,
+156, 178, 156, 156, 178, 155, 155, 148, 145, 145,
+126, 126, 126, 126, 126, 126, 155, 150, 150, 152,
+148, 148, 128, 128, 128, 127, 127, 127, 136, 136,
+136, 145, 144, 144, 146, 145, 145, 165, 154, 154,
+170, 154, 154, 162, 153, 153, 158, 151, 151, 146,
+144, 144, 135, 135, 135, 143, 141, 141, 148, 144,
+144, 152, 147, 147, 156, 149, 149, 148, 145, 145,
+148, 145, 145, 152, 147, 147, 134, 134, 134, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+134, 134, 134, 143, 141, 141, 144, 142, 142, 151,
+147, 147, 152, 148, 148, 143, 141, 141, 140, 139,
+139, 146, 143, 143, 158, 150, 150, 168, 151, 151,
+169, 153, 153, 164, 153, 153, 157, 150, 150, 158,
+151, 151, 156, 149, 149, 150, 146, 146, 138, 137,
+137, 140, 139, 139, 149, 146, 146, 159, 151, 151,
+155, 149, 149, 146, 143, 143, 135, 134, 134, 143,
+141, 141, 147, 143, 143, 147, 144, 144, 137, 136,
+136, 148, 144, 144, 155, 149, 149, 135, 134, 134,
+127, 127, 127, 131, 130, 130, 138, 137, 137, 144,
+141, 141, 145, 143, 143, 146, 143, 143, 154, 148,
+148, 164, 151, 151, 167, 151, 151, 159, 150, 150,
+157, 149, 149, 158, 150, 150, 156, 149, 149, 145,
+142, 142, 140, 139, 139, 143, 141, 141, 146, 143,
+143, 145, 142, 142, 141, 139, 139, 137, 136, 136,
+153, 147, 147, 155, 148, 148, 155, 149, 149, 153,
+147, 147, 148, 145, 145, 146, 143, 143, 146, 143,
+143, 147, 143, 143, 146, 143, 143, 145, 142, 142,
+144, 141, 141, 147, 143, 143, 150, 145, 145, 145,
+142, 142, 142, 140, 140, 144, 141, 141, 150, 145,
+145, 153, 147, 147, 150, 145, 145, 149, 145, 145,
+154, 148, 148, 152, 146, 146, 150, 145, 145, 151,
+146, 146, 163, 150, 150, 159, 150, 150, 152, 147,
+147, 154, 148, 148, 155, 149, 149, 153, 148, 148,
+150, 146, 146, 149, 146, 146, 148, 145, 145, 149,
+145, 145, 149, 145, 145, 148, 144, 144, 146, 142,
+142, 144, 142, 142, 141, 140, 140, 153, 147, 147,
+163, 151, 151, 155, 148, 148, 144, 142, 142, 141,
+140, 140, 146, 143, 143, 138, 137, 137, 136, 135,
+135, 138, 137, 137, 135, 134, 134, 149, 145, 145,
+158, 150, 150, 160, 151, 151, 158, 151, 151, 160,
+151, 151, 163, 152, 152, 169, 153, 153, 155, 150,
+150, 149, 145, 145, 154, 148, 148, 153, 148, 148,
+149, 146, 146, 142, 141, 141, 130, 130, 130, 148,
+144, 144, 156, 149, 149, 146, 144, 144, 147, 145,
+145, 147, 144, 144, 148, 145, 145, 154, 149, 149,
+149, 146, 146, 148, 146, 146, 155, 150, 150, 148,
+145, 145, 158, 151, 151, 169, 152, 152, 159, 151,
+151, 156, 150, 150, 157, 150, 150, 163, 152, 152,
+164, 152, 152, 163, 153, 153, 162, 153, 153, 164,
+154, 154, 150, 147, 147, 151, 147, 147, 171, 154,
+154, 167, 153, 153, 161, 153, 153, 154, 150, 150,
+153, 148, 148, 156, 150, 150, 155, 149, 149, 148,
+145, 145, 158, 151, 151, 155, 150, 150, 147, 145,
+145, 147, 145, 145, 156, 150, 150, 155, 150, 150,
+137, 137, 137, 128, 128, 128, 134, 134, 134, 147,
+145, 145, 152, 149, 149, 155, 150, 150, 151, 148,
+148, 147, 145, 145, 139, 138, 138, 144, 143, 143,
+159, 153, 153, 178, 155, 155, 169, 156, 156, 152,
+149, 149, 125, 125, 125, 125, 125, 125, 129, 129,
+129, 141, 140, 140, 164, 154, 154, 147, 145, 145,
+140, 139, 139, 153, 149, 149, 173, 153, 153, 161,
+152, 152, 140, 139, 139, 131, 131, 131, 140, 139,
+139, 149, 147, 147, 154, 150, 150, 146, 144, 144,
+140, 139, 139, 135, 134, 134, 128, 128, 128, 132,
+132, 132, 144, 143, 143, 73, 69, 69, 68, 65,
+65, 56, 54, 54, 51, 50, 50, 65, 62, 62,
+85, 77, 77, 74, 69, 69, 84, 76, 76, 76,
+71, 71, 57, 56, 56, 65, 62, 62, 73, 68,
+68, 77, 72, 72, 69, 66, 66, 48, 47, 47,
+78, 72, 72, 71, 67, 67, 80, 74, 74, 67,
+64, 64, 70, 67, 67, 74, 69, 69, 63, 60,
+60, 66, 63, 63, 67, 64, 64, 64, 61, 61,
+56, 54, 54, 72, 68, 68, 68, 65, 65, 72,
+67, 67, 79, 72, 72, 68, 65, 65, 83, 76,
+76, 82, 75, 75, 85, 77, 77, 73, 68, 68,
+82, 75, 75, 82, 75, 75, 86, 78, 78, 91,
+81, 81, 98, 85, 85, 65, 62, 62, 70, 66,
+66, 69, 65, 65, 67, 64, 64, 58, 57, 57,
+56, 54, 54, 57, 56, 56, 67, 64, 64, 60,
+58, 58, 53, 52, 52, 146, 145, 145, 141, 140,
+140, 143, 142, 142, 137, 136, 136, 150, 147, 147,
+160, 152, 152, 174, 157, 157, 170, 156, 156, 165,
+155, 155, 165, 154, 154, 172, 156, 156, 169, 155,
+155, 160, 153, 153, 162, 153, 153, 146, 144, 144,
+138, 138, 138, 141, 140, 140, 152, 148, 148, 144,
+143, 143, 144, 142, 142, 166, 155, 155, 159, 152,
+152, 159, 152, 152, 159, 152, 152, 144, 143, 143,
+146, 144, 144, 152, 148, 148, 152, 148, 148, 147,
+145, 145, 152, 147, 147, 159, 152, 152, 155, 150,
+150, 152, 148, 148, 151, 147, 147, 144, 143, 143,
+143, 142, 142, 150, 147, 147, 159, 152, 152, 153,
+149, 149, 150, 147, 147, 154, 149, 149, 168, 153,
+153, 157, 150, 150, 146, 144, 144, 138, 137, 137,
+139, 138, 138, 140, 139, 139, 137, 136, 136, 128,
+128, 128, 144, 142, 142, 160, 153, 153, 171, 155,
+155, 169, 154, 154, 152, 148, 148, 135, 134, 134,
+126, 126, 126, 149, 146, 146, 154, 148, 148, 142,
+141, 141, 142, 141, 141, 156, 150, 150, 164, 153,
+153, 155, 149, 149, 169, 153, 153, 171, 153, 153,
+164, 152, 152, 162, 152, 152, 157, 150, 150, 151,
+147, 147, 145, 143, 143, 143, 141, 141, 151, 147,
+147, 163, 152, 152, 156, 149, 149, 155, 148, 148,
+153, 147, 147, 141, 140, 140, 145, 142, 142, 147,
+143, 143, 145, 143, 143, 145, 142, 142, 144, 142,
+142, 143, 141, 141, 143, 141, 141, 148, 145, 145,
+145, 142, 142, 139, 138, 138, 158, 151, 151, 153,
+149, 149, 143, 142, 142, 146, 143, 143, 155, 148,
+148, 159, 150, 150, 159, 150, 150, 151, 147, 147,
+151, 147, 147, 156, 149, 149, 164, 152, 152, 159,
+150, 150, 152, 147, 147, 149, 145, 145, 158, 151,
+151, 159, 151, 151, 150, 146, 146, 142, 140, 140,
+132, 132, 132, 134, 133, 133, 142, 140, 140, 143,
+141, 141, 137, 136, 136, 135, 135, 135, 153, 148,
+148, 148, 145, 145, 142, 140, 140, 140, 139, 139,
+144, 142, 142, 155, 148, 148, 161, 151, 151, 160,
+150, 150, 154, 148, 148, 154, 148, 148, 159, 149,
+149, 152, 147, 147, 152, 146, 146, 153, 147, 147,
+149, 145, 145, 143, 141, 141, 139, 138, 138, 140,
+138, 138, 147, 143, 143, 146, 143, 143, 142, 140,
+140, 143, 141, 141, 143, 141, 141, 143, 141, 141,
+153, 147, 147, 154, 148, 148, 159, 149, 149, 161,
+150, 150, 159, 149, 149, 157, 148, 148, 153, 146,
+146, 148, 144, 144, 143, 141, 141, 144, 142, 142,
+142, 140, 140, 140, 138, 138, 138, 137, 137, 138,
+137, 137, 137, 136, 136, 138, 137, 137, 139, 137,
+137, 142, 140, 140, 148, 144, 144, 155, 148, 148,
+152, 146, 146, 152, 146, 146, 153, 146, 146, 144,
+141, 141, 145, 142, 142, 151, 146, 146, 158, 150,
+150, 150, 146, 146, 145, 142, 142, 147, 144, 144,
+157, 149, 149, 155, 149, 149, 152, 147, 147, 150,
+146, 146, 152, 147, 147, 154, 147, 147, 155, 148,
+148, 156, 148, 148, 152, 146, 146, 149, 145, 145,
+153, 148, 148, 163, 150, 150, 151, 146, 146, 140,
+138, 138, 138, 137, 137, 140, 139, 139, 138, 137,
+137, 133, 133, 133, 131, 131, 131, 129, 129, 129,
+140, 139, 139, 156, 149, 149, 155, 149, 149, 153,
+148, 148, 153, 148, 148, 157, 149, 149, 163, 151,
+151, 151, 147, 147, 134, 134, 134, 144, 142, 142,
+153, 148, 148, 156, 150, 150, 151, 147, 147, 140,
+139, 139, 146, 143, 143, 154, 148, 148, 150, 146,
+146, 141, 139, 139, 134, 133, 133, 132, 132, 132,
+140, 138, 138, 133, 133, 133, 132, 132, 132, 145,
+143, 143, 136, 135, 135, 147, 144, 144, 164, 151,
+151, 163, 151, 151, 160, 150, 150, 161, 150, 150,
+167, 150, 150, 170, 152, 152, 165, 152, 152, 157,
+150, 150, 155, 150, 150, 142, 140, 140, 143, 141,
+141, 157, 150, 150, 160, 151, 151, 154, 149, 149,
+153, 149, 149, 164, 153, 153, 149, 146, 146, 135,
+135, 135, 129, 129, 129, 145, 143, 143, 138, 137,
+137, 133, 133, 133, 134, 134, 134, 150, 146, 146,
+149, 146, 146, 141, 140, 140, 132, 132, 132, 133,
+133, 133, 137, 137, 137, 145, 143, 143, 153, 148,
+148, 143, 141, 141, 134, 133, 133, 133, 132, 132,
+134, 133, 133, 157, 151, 151, 181, 155, 155, 158,
+152, 152, 136, 136, 136, 125, 125, 125, 126, 126,
+126, 131, 131, 131, 143, 141, 141, 148, 145, 145,
+132, 132, 132, 148, 146, 146, 162, 153, 153, 176,
+151, 151, 168, 152, 152, 145, 143, 143, 131, 131,
+131, 131, 131, 131, 133, 133, 133, 155, 150, 150,
+167, 153, 153, 163, 152, 152, 139, 138, 138, 132,
+131, 131, 132, 131, 131, 62, 60, 60, 76, 70,
+70, 73, 68, 68, 70, 66, 66, 48, 47, 47,
+67, 64, 64, 76, 71, 71, 64, 61, 61, 66,
+63, 63, 79, 72, 72, 55, 53, 53, 70, 66,
+66, 76, 70, 70, 68, 65, 65, 60, 58, 58,
+112, 88, 88, 80, 73, 73, 56, 55, 55, 46,
+45, 45, 58, 56, 56, 56, 55, 55, 42, 42,
+42, 53, 52, 52, 77, 72, 72, 58, 56, 56,
+55, 53, 53, 69, 66, 66, 62, 59, 59, 58,
+56, 56, 56, 55, 55, 42, 42, 42, 56, 54,
+54, 78, 72, 72, 79, 73, 73, 57, 56, 56,
+65, 61, 61, 56, 54, 54, 62, 60, 60, 63,
+61, 61, 62, 60, 60, 72, 67, 67, 46, 45,
+45, 51, 50, 50, 69, 66, 66, 80, 73, 73,
+92, 80, 80, 93, 81, 81, 85, 76, 76, 76,
+70, 70, 68, 65, 65, 132, 131, 131, 132, 131,
+131, 132, 131, 131, 133, 133, 133, 155, 151, 151,
+168, 156, 156, 179, 156, 156, 153, 149, 149, 152,
+148, 148, 151, 148, 148, 149, 146, 146, 144, 143,
+143, 143, 141, 141, 139, 139, 139, 132, 131, 131,
+132, 131, 131, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 150, 147, 147, 170, 155, 155, 166, 154,
+154, 148, 145, 145, 146, 144, 144, 152, 148, 148,
+168, 153, 153, 166, 154, 154, 161, 152, 152, 158,
+151, 151, 160, 151, 151, 153, 148, 148, 150, 146,
+146, 151, 147, 147, 144, 142, 142, 137, 136, 136,
+135, 135, 135, 147, 144, 144, 137, 137, 137, 140,
+140, 140, 154, 149, 149, 157, 150, 150, 160, 151,
+151, 154, 149, 149, 134, 134, 134, 133, 133, 133,
+134, 133, 133, 133, 133, 133, 134, 133, 133, 136,
+136, 136, 148, 146, 146, 168, 153, 153, 161, 152,
+152, 152, 148, 148, 141, 140, 140, 127, 127, 127,
+142, 140, 140, 152, 147, 147, 153, 148, 148, 151,
+147, 147, 164, 152, 152, 170, 151, 151, 160, 151,
+151, 164, 152, 152, 166, 152, 152, 164, 152, 152,
+162, 151, 151, 159, 150, 150, 152, 147, 147, 142,
+141, 141, 143, 141, 141, 153, 148, 148, 161, 151,
+151, 154, 148, 148, 152, 147, 147, 151, 146, 146,
+153, 147, 147, 161, 150, 150, 158, 149, 149, 154,
+147, 147, 151, 146, 146, 149, 145, 145, 148, 145,
+145, 149, 145, 145, 152, 147, 147, 143, 141, 141,
+145, 143, 143, 162, 152, 152, 145, 143, 143, 143,
+141, 141, 148, 145, 145, 153, 147, 147, 148, 145,
+145, 142, 140, 140, 137, 136, 136, 144, 141, 141,
+156, 149, 149, 160, 150, 150, 153, 147, 147, 151,
+146, 146, 159, 151, 151, 168, 155, 155, 153, 148,
+148, 139, 138, 138, 128, 128, 128, 126, 126, 126,
+132, 132, 132, 135, 135, 135, 134, 134, 134, 129,
+129, 129, 139, 138, 138, 146, 144, 144, 147, 144,
+144, 147, 143, 143, 150, 146, 146, 159, 149, 149,
+169, 152, 152, 168, 151, 151, 161, 150, 150, 150,
+145, 145, 150, 145, 145, 144, 141, 141, 145, 142,
+142, 152, 146, 146, 149, 144, 144, 145, 142, 142,
+142, 140, 140, 141, 139, 139, 146, 143, 143, 146,
+143, 143, 142, 140, 140, 143, 141, 141, 143, 141,
+141, 145, 142, 142, 147, 143, 143, 147, 143, 143,
+145, 142, 142, 145, 142, 142, 145, 142, 142, 148,
+144, 144, 158, 149, 149, 162, 150, 150, 158, 148,
+148, 156, 147, 147, 153, 146, 146, 149, 144, 144,
+146, 142, 142, 152, 145, 145, 151, 145, 145, 148,
+144, 144, 146, 143, 143, 146, 142, 142, 145, 142,
+142, 146, 143, 143, 147, 143, 143, 149, 144, 144,
+152, 146, 146, 155, 147, 147, 154, 147, 147, 155,
+147, 147, 153, 146, 146, 153, 146, 146, 160, 149,
+149, 158, 149, 149, 154, 147, 147, 151, 146, 146,
+147, 143, 143, 155, 147, 147, 158, 148, 148, 143,
+141, 141, 139, 138, 138, 143, 141, 141, 149, 145,
+145, 147, 143, 143, 153, 146, 146, 149, 144, 144,
+139, 138, 138, 151, 146, 146, 151, 146, 146, 150,
+146, 146, 148, 145, 145, 140, 138, 138, 143, 141,
+141, 149, 145, 145, 149, 145, 145, 141, 140, 140,
+134, 133, 133, 129, 129, 129, 134, 134, 134, 135,
+134, 134, 135, 135, 135, 135, 135, 135, 137, 136,
+136, 147, 144, 144, 149, 146, 146, 139, 138, 138,
+149, 145, 145, 155, 148, 148, 157, 150, 150, 153,
+148, 148, 153, 147, 147, 150, 146, 146, 147, 144,
+144, 154, 147, 147, 154, 147, 147, 147, 144, 144,
+139, 138, 138, 140, 139, 139, 133, 133, 133, 133,
+133, 133, 154, 148, 148, 148, 145, 145, 141, 140,
+140, 139, 138, 138, 151, 146, 146, 149, 145, 145,
+148, 145, 145, 150, 147, 147, 151, 147, 147, 149,
+145, 145, 151, 147, 147, 158, 151, 151, 141, 140,
+140, 134, 133, 133, 136, 135, 135, 147, 144, 144,
+141, 140, 140, 142, 141, 141, 147, 144, 144, 144,
+142, 142, 132, 132, 132, 136, 135, 135, 158, 150,
+150, 155, 149, 149, 155, 149, 149, 156, 149, 149,
+159, 150, 150, 158, 149, 149, 156, 149, 149, 156,
+149, 149, 157, 150, 150, 149, 146, 146, 154, 149,
+149, 175, 153, 153, 165, 153, 153, 158, 150, 150,
+149, 146, 146, 135, 134, 134, 151, 147, 147, 151,
+147, 147, 140, 139, 139, 126, 126, 126, 125, 125,
+125, 139, 138, 138, 164, 152, 152, 182, 150, 150,
+163, 152, 152, 152, 147, 147, 148, 145, 145, 136,
+136, 136, 138, 137, 137, 156, 149, 149, 163, 151,
+151, 163, 152, 152, 148, 145, 145, 128, 128, 128,
+131, 130, 130, 147, 145, 145, 165, 152, 152, 166,
+152, 152, 167, 152, 152, 167, 152, 152, 47, 46,
+46, 42, 42, 42, 55, 53, 53, 57, 55, 55,
+48, 48, 48, 56, 54, 54, 83, 76, 76, 63,
+60, 60, 69, 66, 66, 62, 60, 60, 58, 57,
+57, 63, 60, 60, 66, 63, 63, 54, 53, 53,
+82, 74, 74, 85, 77, 77, 71, 67, 67, 75,
+70, 70, 66, 63, 63, 74, 70, 70, 79, 73,
+73, 72, 68, 68, 88, 79, 79, 83, 76, 76,
+73, 68, 68, 71, 67, 67, 56, 54, 54, 54,
+53, 53, 72, 68, 68, 76, 71, 71, 71, 67,
+67, 76, 71, 71, 76, 71, 71, 60, 58, 58,
+73, 69, 69, 54, 53, 53, 71, 67, 67, 76,
+71, 71, 61, 59, 59, 67, 64, 64, 63, 61,
+61, 56, 55, 55, 71, 67, 67, 70, 67, 67,
+83, 75, 75, 86, 77, 77, 58, 57, 57, 52,
+51, 51, 167, 152, 152, 167, 152, 152, 167, 152,
+152, 167, 152, 152, 167, 152, 152, 169, 152, 152,
+161, 154, 154, 143, 142, 142, 156, 150, 150, 148,
+145, 145, 134, 133, 133, 129, 129, 129, 132, 132,
+132, 153, 148, 148, 161, 151, 151, 162, 151, 151,
+160, 151, 151, 148, 145, 145, 138, 137, 137, 146,
+143, 143, 159, 151, 151, 143, 142, 142, 136, 136,
+136, 141, 140, 140, 153, 148, 148, 150, 147, 147,
+142, 141, 141, 132, 132, 132, 131, 131, 131, 140,
+139, 139, 152, 148, 148, 161, 150, 150, 171, 150,
+150, 169, 152, 152, 162, 153, 153, 155, 149, 149,
+158, 150, 150, 150, 146, 146, 138, 138, 138, 132,
+132, 132, 141, 140, 140, 152, 147, 147, 160, 150,
+150, 156, 149, 149, 155, 148, 148, 155, 148, 148,
+154, 149, 149, 154, 148, 148, 151, 147, 147, 154,
+149, 149, 175, 151, 151, 156, 150, 150, 145, 143,
+143, 140, 139, 139, 129, 129, 129, 134, 133, 133,
+146, 143, 143, 156, 148, 148, 148, 145, 145, 152,
+147, 147, 156, 149, 149, 158, 149, 149, 144, 142,
+142, 149, 145, 145, 160, 151, 151, 154, 149, 149,
+141, 140, 140, 136, 135, 135, 140, 139, 139, 152,
+147, 147, 149, 145, 145, 142, 140, 140, 135, 134,
+134, 134, 134, 134, 146, 143, 143, 161, 150, 150,
+169, 149, 149, 153, 147, 147, 144, 142, 142, 138,
+137, 137, 134, 134, 134, 133, 133, 133, 137, 136,
+136, 145, 142, 142, 150, 146, 146, 149, 145, 145,
+144, 142, 142, 136, 135, 135, 135, 135, 135, 136,
+135, 135, 136, 135, 135, 134, 134, 134, 132, 132,
+132, 133, 132, 132, 137, 136, 136, 146, 143, 143,
+140, 139, 139, 134, 134, 134, 139, 138, 138, 162,
+151, 151, 164, 152, 152, 147, 144, 144, 129, 129,
+129, 125, 125, 125, 127, 127, 127, 128, 128, 128,
+129, 129, 129, 128, 128, 128, 129, 129, 129, 133,
+133, 133, 135, 135, 135, 140, 138, 138, 147, 144,
+144, 156, 148, 148, 158, 150, 150, 159, 149, 149,
+159, 149, 149, 154, 147, 147, 146, 142, 142, 136,
+135, 135, 137, 136, 136, 150, 145, 145, 157, 148,
+148, 155, 147, 147, 149, 144, 144, 148, 143, 143,
+145, 142, 142, 144, 141, 141, 142, 140, 140, 138,
+137, 137, 136, 135, 135, 137, 136, 136, 139, 137,
+137, 139, 138, 138, 138, 137, 137, 135, 135, 135,
+143, 140, 140, 146, 143, 143, 143, 141, 141, 144,
+141, 141, 144, 141, 141, 146, 143, 143, 153, 147,
+147, 155, 147, 147, 152, 146, 146, 148, 144, 144,
+149, 144, 144, 144, 141, 141, 142, 139, 139, 146,
+142, 142, 149, 144, 144, 148, 144, 144, 145, 142,
+142, 142, 140, 140, 144, 141, 141, 146, 142, 142,
+145, 142, 142, 145, 142, 142, 147, 143, 143, 148,
+144, 144, 148, 144, 144, 149, 145, 145, 151, 146,
+146, 151, 145, 145, 149, 145, 145, 147, 144, 144,
+145, 142, 142, 146, 143, 143, 149, 145, 145, 152,
+146, 146, 148, 143, 143, 144, 141, 141, 143, 141,
+141, 145, 142, 142, 143, 141, 141, 145, 142, 142,
+153, 146, 146, 142, 140, 140, 146, 143, 143, 155,
+148, 148, 156, 148, 148, 158, 149, 149, 150, 146,
+146, 146, 143, 143, 156, 149, 149, 158, 149, 149,
+157, 149, 149, 152, 146, 146, 142, 140, 140, 140,
+139, 139, 142, 141, 141, 143, 141, 141, 143, 142,
+142, 144, 142, 142, 147, 144, 144, 149, 145, 145,
+138, 137, 137, 139, 138, 138, 147, 144, 144, 156,
+149, 149, 151, 147, 147, 152, 147, 147, 152, 147,
+147, 143, 141, 141, 147, 144, 144, 148, 145, 145,
+145, 142, 142, 134, 134, 134, 138, 137, 137, 144,
+142, 142, 149, 145, 145, 152, 147, 147, 153, 148,
+148, 149, 145, 145, 144, 141, 141, 147, 144, 144,
+144, 142, 142, 146, 144, 144, 151, 147, 147, 152,
+147, 147, 147, 144, 144, 147, 145, 145, 152, 148,
+148, 154, 148, 148, 148, 145, 145, 145, 143, 143,
+152, 147, 147, 148, 145, 145, 145, 143, 143, 144,
+142, 142, 144, 142, 142, 142, 141, 141, 147, 144,
+144, 151, 146, 146, 148, 145, 145, 147, 145, 145,
+154, 148, 148, 159, 150, 150, 159, 149, 149, 159,
+149, 149, 159, 150, 150, 157, 150, 150, 138, 137,
+137, 147, 145, 145, 153, 148, 148, 149, 146, 146,
+146, 144, 144, 136, 136, 136, 135, 134, 134, 146,
+144, 144, 155, 149, 149, 149, 146, 146, 146, 144,
+144, 152, 147, 147, 155, 149, 149, 171, 154, 154,
+178, 154, 154, 153, 148, 148, 153, 148, 148, 147,
+145, 145, 145, 143, 143, 140, 140, 140, 150, 147,
+147, 155, 149, 149, 152, 148, 148, 141, 140, 140,
+139, 139, 139, 142, 141, 141, 146, 144, 144, 142,
+141, 141, 140, 139, 139, 140, 139, 139, 71, 67,
+67, 76, 71, 71, 67, 64, 64, 100, 85, 85,
+80, 74, 74, 67, 64, 64, 71, 67, 67, 70,
+67, 67, 88, 79, 79, 78, 73, 73, 58, 57,
+57, 51, 50, 50, 81, 75, 75, 85, 77, 77,
+75, 71, 71, 83, 76, 76, 83, 77, 77, 72,
+68, 68, 78, 73, 73, 82, 76, 76, 91, 82,
+82, 87, 79, 79, 76, 71, 71, 86, 79, 79,
+69, 66, 66, 75, 71, 71, 67, 64, 64, 60,
+58, 58, 66, 63, 63, 82, 75, 75, 64, 62,
+62, 76, 72, 72, 88, 80, 80, 72, 68, 68,
+73, 69, 69, 64, 61, 61, 83, 76, 76, 100,
+87, 87, 76, 71, 71, 73, 69, 69, 84, 78,
+78, 77, 72, 72, 80, 74, 74, 77, 72, 72,
+61, 59, 59, 52, 51, 51, 94, 83, 83, 99,
+84, 84, 140, 139, 139, 140, 139, 139, 141, 140,
+140, 141, 140, 140, 141, 140, 140, 141, 140, 140,
+143, 142, 142, 146, 144, 144, 143, 142, 142, 143,
+142, 142, 155, 150, 150, 145, 143, 143, 145, 143,
+143, 147, 145, 145, 156, 149, 149, 150, 147, 147,
+157, 150, 150, 162, 151, 151, 146, 143, 143, 155,
+149, 149, 153, 148, 148, 150, 146, 146, 151, 147,
+147, 149, 146, 146, 145, 143, 143, 138, 137, 137,
+131, 130, 130, 138, 137, 137, 146, 144, 144, 153,
+148, 148, 160, 150, 150, 157, 150, 150, 153, 148,
+148, 149, 146, 146, 149, 146, 146, 150, 147, 147,
+151, 147, 147, 151, 147, 147, 144, 142, 142, 138,
+138, 138, 139, 138, 138, 152, 148, 148, 147, 144,
+144, 145, 142, 142, 144, 142, 142, 145, 143, 143,
+145, 143, 143, 143, 141, 141, 142, 141, 141, 152,
+147, 147, 148, 145, 145, 147, 144, 144, 147, 145,
+145, 132, 132, 132, 132, 132, 132, 139, 138, 138,
+145, 143, 143, 143, 141, 141, 151, 146, 146, 161,
+149, 149, 170, 148, 148, 151, 146, 146, 146, 144,
+144, 146, 144, 144, 143, 141, 141, 143, 141, 141,
+145, 142, 142, 148, 145, 145, 149, 145, 145, 140,
+139, 139, 139, 138, 138, 139, 138, 138, 132, 132,
+132, 141, 140, 140, 150, 146, 146, 154, 147, 147,
+151, 146, 146, 147, 144, 144, 142, 140, 140, 136,
+136, 136, 130, 130, 130, 137, 136, 136, 143, 141,
+141, 144, 142, 142, 144, 142, 142, 145, 143, 143,
+148, 145, 145, 151, 146, 146, 152, 147, 147, 147,
+144, 144, 143, 141, 141, 144, 141, 141, 141, 140,
+140, 141, 140, 140, 137, 136, 136, 131, 131, 131,
+133, 133, 133, 144, 142, 142, 155, 149, 149, 154,
+148, 148, 146, 143, 143, 140, 139, 139, 140, 139,
+139, 138, 137, 137, 138, 137, 137, 138, 137, 137,
+138, 137, 137, 139, 138, 138, 141, 139, 139, 143,
+140, 140, 143, 141, 141, 148, 144, 144, 149, 145,
+145, 148, 144, 144, 149, 144, 144, 147, 143, 143,
+141, 139, 139, 133, 133, 133, 131, 131, 131, 141,
+139, 139, 149, 144, 144, 148, 144, 144, 144, 141,
+141, 148, 144, 144, 148, 144, 144, 146, 142, 142,
+146, 142, 142, 143, 140, 140, 141, 139, 139, 142,
+140, 140, 146, 142, 142, 146, 142, 142, 144, 141,
+141, 144, 141, 141, 144, 142, 142, 146, 142, 142,
+136, 135, 135, 134, 133, 133, 138, 137, 137, 144,
+141, 141, 142, 140, 140, 145, 142, 142, 144, 141,
+141, 144, 141, 141, 148, 144, 144, 149, 145, 145,
+146, 143, 143, 143, 141, 141, 146, 143, 143, 139,
+138, 138, 135, 135, 135, 139, 138, 138, 147, 143,
+143, 145, 142, 142, 140, 139, 139, 137, 136, 136,
+143, 141, 141, 144, 142, 142, 143, 141, 141, 143,
+141, 141, 141, 139, 139, 142, 140, 140, 143, 141,
+141, 146, 144, 144, 149, 145, 145, 139, 137, 137,
+135, 134, 134, 140, 138, 138, 136, 136, 136, 147,
+143, 143, 147, 143, 143, 142, 140, 140, 146, 142,
+142, 148, 143, 143, 146, 143, 143, 141, 139, 139,
+137, 136, 136, 148, 144, 144, 149, 144, 144, 145,
+142, 142, 151, 147, 147, 161, 149, 149, 167, 150,
+150, 161, 149, 149, 149, 145, 145, 155, 148, 148,
+162, 151, 151, 163, 151, 151, 165, 151, 151, 156,
+148, 148, 151, 146, 146, 152, 147, 147, 154, 148,
+148, 156, 149, 149, 153, 147, 147, 151, 145, 145,
+153, 147, 147, 140, 139, 139, 131, 131, 131, 136,
+136, 136, 154, 148, 148, 149, 145, 145, 147, 144,
+144, 150, 146, 146, 141, 140, 140, 139, 138, 138,
+138, 137, 137, 136, 135, 135, 127, 127, 127, 133,
+133, 133, 152, 146, 146, 166, 149, 149, 150, 146,
+146, 155, 148, 148, 158, 149, 149, 154, 147, 147,
+145, 143, 143, 143, 141, 141, 148, 145, 145, 156,
+148, 148, 155, 149, 149, 149, 146, 146, 145, 143,
+143, 148, 145, 145, 168, 150, 150, 162, 151, 151,
+159, 151, 151, 161, 152, 152, 158, 149, 149, 151,
+147, 147, 147, 145, 145, 148, 145, 145, 157, 148,
+148, 148, 145, 145, 139, 138, 138, 134, 133, 133,
+135, 135, 135, 149, 146, 146, 156, 148, 148, 155,
+148, 148, 155, 148, 148, 157, 149, 149, 149, 146,
+146, 133, 133, 133, 132, 132, 132, 129, 129, 129,
+129, 129, 129, 131, 131, 131, 133, 132, 132, 134,
+134, 134, 145, 143, 143, 159, 150, 150, 157, 149,
+149, 166, 151, 151, 168, 151, 151, 156, 150, 150,
+180, 157, 157, 150, 147, 147, 140, 139, 139, 147,
+145, 145, 156, 150, 150, 146, 144, 144, 154, 148,
+148, 160, 150, 150, 161, 150, 150, 162, 151, 151,
+163, 152, 152, 162, 152, 152, 159, 151, 151, 138,
+137, 137, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 107, 89, 89, 79, 73, 73, 80, 74, 74,
+80, 74, 74, 63, 61, 61, 69, 66, 66, 71,
+67, 67, 77, 72, 72, 86, 78, 78, 78, 72,
+72, 58, 57, 57, 77, 72, 72, 76, 70, 70,
+69, 66, 66, 71, 67, 67, 58, 57, 57, 52,
+51, 51, 72, 68, 68, 70, 67, 67, 65, 62,
+62, 66, 63, 63, 56, 54, 54, 58, 57, 57,
+67, 64, 64, 66, 63, 63, 57, 55, 55, 50,
+49, 49, 60, 58, 58, 79, 73, 73, 82, 76,
+76, 58, 57, 57, 56, 54, 54, 69, 66, 66,
+75, 70, 70, 57, 56, 56, 63, 61, 61, 76,
+70, 70, 67, 64, 64, 79, 73, 73, 81, 75,
+75, 69, 65, 65, 73, 68, 68, 65, 62, 62,
+67, 64, 64, 58, 57, 57, 39, 39, 39, 131,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 143, 142, 142,
+161, 153, 153, 162, 151, 151, 148, 145, 145, 167,
+150, 150, 169, 148, 148, 151, 146, 146, 143, 142,
+142, 154, 149, 149, 154, 149, 149, 143, 141, 141,
+185, 142, 142, 161, 151, 151, 142, 141, 141, 148,
+146, 146, 162, 151, 151, 164, 151, 151, 157, 150,
+150, 141, 140, 140, 139, 138, 138, 139, 138, 138,
+147, 145, 145, 161, 152, 152, 162, 151, 151, 163,
+150, 150, 152, 148, 148, 130, 130, 130, 130, 130,
+130, 133, 133, 133, 138, 138, 138, 144, 143, 143,
+155, 150, 150, 156, 149, 149, 145, 143, 143, 128,
+128, 128, 142, 141, 141, 137, 137, 137, 132, 132,
+132, 134, 133, 133, 135, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 132, 132, 132, 140,
+139, 139, 151, 147, 147, 157, 149, 149, 139, 139,
+139, 137, 136, 136, 138, 137, 137, 138, 137, 137,
+143, 141, 141, 155, 148, 148, 169, 147, 147, 179,
+141, 141, 163, 149, 149, 147, 144, 144, 137, 136,
+136, 138, 137, 137, 151, 146, 146, 158, 148, 148,
+155, 148, 148, 142, 140, 140, 138, 137, 137, 146,
+144, 144, 147, 144, 144, 134, 134, 134, 133, 133,
+133, 136, 136, 136, 145, 143, 143, 154, 148, 148,
+153, 147, 147, 148, 144, 144, 139, 138, 138, 130,
+130, 130, 140, 139, 139, 139, 138, 138, 140, 139,
+139, 149, 145, 145, 154, 148, 148, 163, 150, 150,
+170, 149, 149, 170, 150, 150, 161, 150, 150, 156,
+148, 148, 153, 147, 147, 149, 145, 145, 140, 138,
+138, 133, 133, 133, 132, 132, 132, 137, 137, 137,
+140, 139, 139, 148, 145, 145, 152, 146, 146, 153,
+146, 146, 153, 146, 146, 150, 144, 144, 148, 143,
+143, 146, 142, 142, 146, 143, 143, 146, 143, 143,
+148, 144, 144, 151, 145, 145, 147, 144, 144, 144,
+141, 141, 143, 141, 141, 142, 141, 141, 142, 140,
+140, 142, 140, 140, 137, 136, 136, 129, 129, 129,
+129, 129, 129, 135, 134, 134, 140, 138, 138, 140,
+139, 139, 138, 137, 137, 145, 142, 142, 150, 144,
+144, 148, 143, 143, 148, 143, 143, 147, 143, 143,
+146, 142, 142, 148, 144, 144, 153, 146, 146, 152,
+146, 146, 151, 145, 145, 152, 147, 147, 153, 147,
+147, 148, 144, 144, 144, 141, 141, 144, 142, 142,
+149, 144, 144, 146, 143, 143, 143, 140, 140, 136,
+135, 135, 137, 136, 136, 141, 139, 139, 145, 142,
+142, 144, 141, 141, 143, 140, 140, 143, 140, 140,
+148, 144, 144, 151, 145, 145, 148, 143, 143, 146,
+142, 142, 149, 144, 144, 146, 142, 142, 139, 137,
+137, 138, 137, 137, 143, 141, 141, 147, 144, 144,
+143, 141, 141, 145, 142, 142, 153, 147, 147, 145,
+142, 142, 149, 145, 145, 152, 146, 146, 153, 147,
+147, 154, 147, 147, 155, 148, 148, 152, 146, 146,
+143, 141, 141, 133, 133, 133, 138, 137, 137, 142,
+140, 140, 145, 142, 142, 149, 144, 144, 142, 140,
+140, 137, 135, 135, 136, 135, 135, 139, 137, 137,
+147, 144, 144, 147, 143, 143, 145, 142, 142, 146,
+143, 143, 143, 141, 141, 142, 140, 140, 148, 144,
+144, 157, 147, 147, 159, 149, 149, 147, 144, 144,
+139, 138, 138, 143, 141, 141, 147, 144, 144, 149,
+145, 145, 144, 142, 142, 142, 140, 140, 143, 141,
+141, 145, 143, 143, 150, 146, 146, 151, 146, 146,
+139, 137, 137, 147, 144, 144, 147, 144, 144, 143,
+141, 141, 142, 141, 141, 153, 147, 147, 148, 145,
+145, 139, 138, 138, 141, 139, 139, 133, 133, 133,
+131, 131, 131, 130, 130, 130, 129, 129, 129, 126,
+126, 126, 127, 127, 127, 139, 138, 138, 153, 147,
+147, 153, 147, 147, 156, 149, 149, 154, 148, 148,
+146, 143, 143, 140, 139, 139, 151, 146, 146, 154,
+147, 147, 150, 145, 145, 141, 140, 140, 151, 147,
+147, 150, 146, 146, 143, 141, 141, 141, 140, 140,
+146, 144, 144, 156, 150, 150, 160, 151, 151, 149,
+145, 145, 161, 151, 151, 160, 151, 151, 154, 148,
+148, 151, 146, 146, 144, 142, 142, 135, 134, 134,
+131, 131, 131, 137, 137, 137, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 138, 138, 138, 152, 147,
+147, 164, 150, 150, 167, 150, 150, 160, 149, 149,
+141, 140, 140, 150, 146, 146, 164, 152, 152, 167,
+152, 152, 141, 140, 140, 135, 134, 134, 133, 132,
+132, 133, 133, 133, 136, 135, 135, 163, 152, 152,
+175, 152, 152, 173, 156, 156, 151, 148, 148, 165,
+153, 153, 156, 150, 150, 149, 145, 145, 146, 144,
+144, 142, 140, 140, 145, 143, 143, 147, 144, 144,
+147, 145, 145, 141, 140, 140, 148, 145, 145, 152,
+148, 148, 149, 146, 146, 146, 144, 144, 143, 142,
+142, 65, 62, 62, 76, 71, 71, 103, 87, 87,
+90, 80, 80, 70, 66, 66, 74, 69, 69, 81,
+74, 74, 76, 71, 71, 66, 63, 63, 70, 66,
+66, 72, 67, 67, 56, 54, 54, 60, 58, 58,
+70, 66, 66, 84, 76, 76, 57, 55, 55, 49,
+49, 49, 79, 73, 73, 76, 71, 71, 70, 66,
+66, 72, 68, 68, 72, 67, 67, 61, 59, 59,
+72, 68, 68, 66, 64, 64, 60, 58, 58, 50,
+49, 49, 61, 59, 59, 70, 66, 66, 58, 56,
+56, 71, 67, 67, 79, 73, 73, 63, 61, 61,
+71, 67, 67, 47, 46, 46, 47, 46, 46, 61,
+59, 59, 59, 57, 57, 62, 60, 60, 79, 73,
+73, 76, 71, 71, 58, 56, 56, 60, 58, 58,
+57, 55, 55, 90, 81, 81, 91, 81, 81, 172,
+151, 151, 173, 153, 153, 174, 155, 155, 173, 152,
+152, 174, 151, 151, 174, 151, 151, 175, 151, 151,
+165, 151, 151, 145, 143, 143, 137, 136, 136, 154,
+148, 148, 140, 140, 140, 132, 132, 132, 132, 132,
+132, 144, 143, 143, 136, 136, 136, 139, 138, 138,
+141, 140, 140, 129, 129, 129, 162, 154, 154, 172,
+153, 153, 164, 152, 152, 141, 140, 140, 132, 132,
+132, 145, 143, 143, 160, 152, 152, 165, 152, 152,
+157, 150, 150, 167, 150, 150, 175, 145, 145, 174,
+144, 144, 152, 147, 147, 148, 145, 145, 144, 142,
+142, 140, 139, 139, 139, 139, 139, 144, 143, 143,
+143, 142, 142, 137, 136, 136, 128, 128, 128, 146,
+144, 144, 155, 149, 149, 156, 150, 150, 161, 150,
+150, 167, 152, 152, 166, 152, 152, 162, 152, 152,
+162, 151, 151, 152, 147, 147, 152, 148, 148, 158,
+150, 150, 161, 150, 150, 161, 151, 151, 167, 150,
+150, 169, 149, 149, 162, 149, 149, 161, 149, 149,
+169, 148, 148, 165, 149, 149, 151, 146, 146, 163,
+147, 147, 162, 150, 150, 159, 151, 151, 158, 149,
+149, 151, 146, 146, 161, 149, 149, 163, 150, 150,
+157, 150, 150, 159, 150, 150, 161, 151, 151, 156,
+149, 149, 148, 145, 145, 142, 140, 140, 134, 134,
+134, 139, 138, 138, 147, 145, 145, 149, 146, 146,
+144, 142, 142, 134, 134, 134, 134, 134, 134, 145,
+142, 142, 153, 147, 147, 159, 149, 149, 156, 148,
+148, 144, 142, 142, 152, 146, 146, 160, 149, 149,
+160, 150, 150, 157, 149, 149, 153, 147, 147, 159,
+149, 149, 158, 149, 149, 147, 144, 144, 136, 135,
+135, 133, 132, 132, 134, 133, 133, 138, 137, 137,
+145, 143, 143, 144, 141, 141, 143, 140, 140, 142,
+140, 140, 143, 141, 141, 138, 137, 137, 136, 135,
+135, 136, 135, 135, 138, 137, 137, 143, 140, 140,
+152, 146, 146, 156, 148, 148, 154, 148, 148, 153,
+147, 147, 152, 147, 147, 152, 147, 147, 148, 144,
+144, 132, 132, 132, 132, 132, 132, 142, 140, 140,
+149, 145, 145, 150, 145, 145, 143, 141, 141, 142,
+139, 139, 144, 141, 141, 144, 140, 140, 145, 141,
+141, 143, 140, 140, 140, 138, 138, 143, 140, 140,
+144, 141, 141, 145, 141, 141, 146, 143, 143, 148,
+144, 144, 152, 146, 146, 151, 145, 145, 149, 144,
+144, 149, 144, 144, 148, 144, 144, 148, 144, 144,
+151, 145, 145, 149, 144, 144, 147, 143, 143, 145,
+142, 142, 143, 141, 141, 138, 137, 137, 138, 137,
+137, 141, 139, 139, 145, 142, 142, 147, 143, 143,
+146, 142, 142, 145, 142, 142, 147, 143, 143, 148,
+144, 144, 144, 141, 141, 144, 141, 141, 146, 142,
+142, 147, 142, 142, 144, 140, 140, 143, 141, 141,
+143, 141, 141, 148, 144, 144, 144, 142, 142, 150,
+145, 145, 152, 146, 146, 148, 144, 144, 151, 145,
+145, 150, 145, 145, 149, 145, 145, 151, 145, 145,
+152, 146, 146, 147, 143, 143, 139, 137, 137, 135,
+134, 134, 144, 141, 141, 146, 143, 143, 149, 145,
+145, 149, 145, 145, 147, 143, 143, 142, 139, 139,
+142, 140, 140, 145, 142, 142, 147, 144, 144, 146,
+143, 143, 143, 141, 141, 143, 141, 141, 143, 141,
+141, 142, 140, 140, 148, 144, 144, 152, 146, 146,
+148, 144, 144, 140, 139, 139, 144, 142, 142, 149,
+145, 145, 152, 147, 147, 151, 145, 145, 148, 144,
+144, 149, 144, 144, 148, 145, 145, 145, 143, 143,
+149, 145, 145, 140, 139, 139, 144, 142, 142, 147,
+144, 144, 144, 142, 142, 143, 141, 141, 150, 146,
+146, 152, 147, 147, 146, 143, 143, 145, 142, 142,
+141, 140, 140, 137, 137, 137, 134, 134, 134, 134,
+133, 133, 133, 133, 133, 130, 130, 130, 135, 135,
+135, 149, 145, 145, 157, 149, 149, 159, 150, 150,
+158, 150, 150, 153, 147, 147, 145, 142, 142, 145,
+143, 143, 145, 143, 143, 141, 140, 140, 139, 138,
+138, 148, 145, 145, 153, 149, 149, 153, 147, 147,
+149, 145, 145, 155, 148, 148, 158, 150, 150, 152,
+147, 147, 142, 141, 141, 154, 149, 149, 156, 151,
+151, 151, 147, 147, 146, 143, 143, 143, 141, 141,
+137, 136, 136, 138, 137, 137, 139, 138, 138, 136,
+136, 136, 133, 133, 133, 135, 135, 135, 140, 139,
+139, 151, 146, 146, 165, 150, 150, 162, 150, 150,
+154, 148, 148, 144, 142, 142, 145, 143, 143, 163,
+153, 153, 162, 151, 151, 155, 148, 148, 147, 144,
+144, 143, 142, 142, 143, 141, 141, 151, 147, 147,
+164, 152, 152, 165, 154, 154, 153, 149, 149, 154,
+149, 149, 162, 152, 152, 161, 152, 152, 156, 148,
+148, 153, 147, 147, 141, 140, 140, 145, 143, 143,
+142, 141, 141, 137, 137, 137, 138, 138, 138, 153,
+148, 148, 159, 153, 153, 158, 151, 151, 154, 148,
+148, 151, 147, 147, 54, 53, 53, 73, 68, 68,
+85, 77, 77, 82, 75, 75, 64, 61, 61, 58,
+57, 57, 67, 64, 64, 66, 63, 63, 59, 57,
+57, 64, 61, 61, 50, 49, 49, 44, 43, 43,
+73, 69, 69, 88, 80, 80, 75, 70, 70, 70,
+67, 67, 77, 73, 73, 71, 68, 68, 75, 71,
+71, 76, 71, 71, 73, 69, 69, 78, 73, 73,
+70, 67, 67, 69, 66, 66, 72, 68, 68, 66,
+63, 63, 60, 58, 58, 69, 66, 66, 57, 56,
+56, 59, 57, 57, 74, 69, 69, 85, 77, 77,
+94, 82, 82, 81, 75, 75, 68, 65, 65, 79,
+73, 73, 79, 73, 73, 66, 64, 64, 71, 67,
+67, 78, 72, 72, 76, 71, 71, 61, 59, 59,
+47, 47, 47, 39, 38, 38, 157, 150, 150, 154,
+149, 149, 153, 149, 149, 152, 149, 149, 155, 150,
+150, 158, 151, 151, 153, 149, 149, 151, 148, 148,
+149, 147, 147, 145, 143, 143, 150, 146, 146, 158,
+149, 149, 145, 142, 142, 143, 142, 142, 144, 142,
+142, 141, 140, 140, 136, 136, 136, 138, 137, 137,
+132, 132, 132, 138, 138, 138, 154, 150, 150, 159,
+151, 151, 159, 151, 151, 154, 148, 148, 154, 148,
+148, 166, 152, 152, 160, 150, 150, 154, 148, 148,
+153, 148, 148, 161, 151, 151, 159, 149, 149, 162,
+149, 149, 159, 149, 149, 151, 146, 146, 144, 142,
+142, 146, 144, 144, 149, 146, 146, 149, 146, 146,
+146, 143, 143, 137, 136, 136, 146, 144, 144, 154,
+150, 150, 151, 147, 147, 151, 147, 147, 164, 151,
+151, 165, 151, 151, 156, 149, 149, 155, 149, 149,
+150, 147, 147, 153, 148, 148, 155, 149, 149, 150,
+146, 146, 150, 147, 147, 157, 150, 150, 158, 149,
+149, 153, 148, 148, 151, 147, 147, 159, 150, 150,
+156, 148, 148, 145, 143, 143, 156, 148, 148, 152,
+148, 148, 148, 145, 145, 146, 143, 143, 139, 138,
+138, 149, 145, 145, 152, 147, 147, 152, 147, 147,
+151, 147, 147, 153, 148, 148, 151, 147, 147, 149,
+145, 145, 147, 144, 144, 140, 138, 138, 145, 143,
+143, 150, 146, 146, 150, 146, 146, 147, 144, 144,
+143, 141, 141, 146, 143, 143, 150, 145, 145, 153,
+147, 147, 159, 149, 149, 151, 146, 146, 144, 142,
+142, 144, 142, 142, 154, 148, 148, 155, 149, 149,
+156, 149, 149, 156, 148, 148, 158, 149, 149, 152,
+147, 147, 148, 144, 144, 145, 142, 142, 142, 140,
+140, 141, 139, 139, 140, 138, 138, 137, 137, 137,
+134, 133, 133, 132, 132, 132, 137, 136, 136, 138,
+137, 137, 136, 135, 135, 136, 135, 135, 134, 133,
+133, 136, 135, 135, 141, 139, 139, 149, 145, 145,
+149, 145, 145, 149, 145, 145, 150, 145, 145, 151,
+146, 146, 146, 143, 143, 141, 139, 139, 137, 136,
+136, 142, 140, 140, 148, 144, 144, 149, 145, 145,
+144, 141, 141, 139, 138, 138, 142, 140, 140, 146,
+141, 141, 146, 142, 142, 143, 140, 140, 141, 139,
+139, 143, 140, 140, 144, 141, 141, 145, 141, 141,
+145, 141, 141, 143, 140, 140, 145, 142, 142, 147,
+143, 143, 147, 143, 143, 144, 141, 141, 143, 141,
+141, 144, 142, 142, 142, 140, 140, 139, 137, 137,
+147, 143, 143, 146, 142, 142, 145, 142, 142, 145,
+141, 141, 144, 140, 140, 142, 139, 139, 141, 139,
+139, 140, 139, 139, 141, 139, 139, 142, 140, 140,
+146, 142, 142, 150, 144, 144, 150, 144, 144, 146,
+143, 143, 144, 141, 141, 141, 139, 139, 141, 139,
+139, 141, 139, 139, 143, 141, 141, 148, 143, 143,
+150, 145, 145, 145, 142, 142, 142, 140, 140, 145,
+142, 142, 146, 143, 143, 149, 145, 145, 151, 145,
+145, 150, 145, 145, 147, 143, 143, 143, 140, 140,
+141, 139, 139, 144, 141, 141, 148, 143, 143, 145,
+142, 142, 139, 137, 137, 140, 138, 138, 146, 143,
+143, 149, 144, 144, 152, 147, 147, 153, 147, 147,
+152, 146, 146, 150, 145, 145, 151, 146, 146, 147,
+144, 144, 144, 142, 142, 140, 138, 138, 138, 137,
+137, 143, 141, 141, 142, 140, 140, 144, 142, 142,
+148, 144, 144, 144, 142, 142, 143, 141, 141, 146,
+143, 143, 153, 147, 147, 157, 148, 148, 159, 148,
+148, 158, 148, 148, 157, 148, 148, 153, 147, 147,
+144, 142, 142, 143, 141, 141, 144, 142, 142, 145,
+143, 143, 144, 142, 142, 140, 139, 139, 139, 138,
+138, 144, 142, 142, 150, 146, 146, 153, 147, 147,
+151, 146, 146, 148, 144, 144, 146, 143, 143, 143,
+140, 140, 142, 140, 140, 142, 140, 140, 138, 138,
+138, 139, 138, 138, 150, 146, 146, 158, 150, 150,
+158, 150, 150, 158, 150, 150, 160, 149, 149, 150,
+146, 146, 140, 139, 139, 134, 133, 133, 134, 134,
+134, 142, 141, 141, 143, 142, 142, 155, 149, 149,
+163, 151, 151, 163, 149, 149, 166, 149, 149, 157,
+149, 149, 144, 142, 142, 137, 137, 137, 141, 140,
+140, 149, 146, 146, 146, 144, 144, 144, 142, 142,
+144, 143, 143, 144, 142, 142, 144, 142, 142, 143,
+141, 141, 139, 139, 139, 135, 135, 135, 141, 140,
+140, 143, 141, 141, 148, 145, 145, 155, 148, 148,
+153, 149, 149, 148, 145, 145, 136, 135, 135, 131,
+131, 131, 145, 144, 144, 168, 152, 152, 173, 150,
+150, 168, 151, 151, 161, 151, 151, 164, 151, 151,
+154, 149, 149, 153, 148, 148, 151, 147, 147, 145,
+143, 143, 148, 145, 145, 156, 150, 150, 157, 151,
+151, 152, 147, 147, 146, 144, 144, 141, 140, 140,
+147, 145, 145, 149, 146, 146, 147, 144, 144, 139,
+139, 139, 141, 140, 140, 142, 141, 141, 141, 140,
+140, 140, 139, 139, 135, 134, 134, 78, 72, 72,
+79, 73, 73, 83, 76, 76, 64, 62, 62, 83,
+77, 77, 77, 72, 72, 74, 70, 70, 81, 75,
+75, 79, 73, 73, 51, 50, 50, 48, 47, 47,
+65, 62, 62, 72, 68, 68, 72, 68, 68, 76,
+71, 71, 81, 74, 74, 77, 72, 72, 76, 71,
+71, 86, 78, 78, 71, 67, 67, 81, 74, 74,
+79, 73, 73, 72, 68, 68, 67, 64, 64, 72,
+68, 68, 69, 66, 66, 78, 72, 72, 56, 55,
+55, 64, 61, 61, 79, 73, 73, 79, 73, 73,
+69, 65, 65, 82, 75, 75, 69, 66, 66, 56,
+54, 54, 66, 64, 64, 83, 76, 76, 73, 69,
+69, 76, 71, 71, 94, 82, 82, 71, 67, 67,
+50, 49, 49, 162, 152, 152, 149, 145, 145, 139,
+138, 138, 133, 133, 133, 133, 132, 132, 133, 133,
+133, 132, 132, 132, 130, 130, 130, 137, 137, 137,
+145, 143, 143, 157, 149, 149, 155, 150, 150, 157,
+149, 149, 158, 148, 148, 160, 150, 150, 153, 148,
+148, 150, 147, 147, 149, 146, 146, 146, 144, 144,
+138, 137, 137, 131, 131, 131, 136, 136, 136, 156,
+149, 149, 178, 148, 148, 170, 149, 149, 167, 150,
+150, 155, 148, 148, 146, 143, 143, 146, 144, 144,
+141, 140, 140, 136, 136, 136, 149, 146, 146, 168,
+150, 150, 153, 148, 148, 147, 145, 145, 151, 146,
+146, 155, 148, 148, 156, 149, 149, 153, 147, 147,
+145, 142, 142, 146, 144, 144, 153, 149, 149, 147,
+144, 144, 137, 137, 137, 145, 143, 143, 153, 147,
+147, 140, 139, 139, 137, 137, 137, 139, 138, 138,
+144, 143, 143, 147, 144, 144, 134, 134, 134, 133,
+133, 133, 139, 138, 138, 141, 140, 140, 138, 138,
+138, 136, 136, 136, 145, 143, 143, 149, 145, 145,
+148, 145, 145, 145, 143, 143, 136, 135, 135, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 137, 137, 137, 137, 136, 136, 135, 134, 134,
+143, 142, 142, 141, 140, 140, 147, 144, 144, 150,
+146, 146, 147, 144, 144, 149, 145, 145, 150, 145,
+145, 151, 146, 146, 153, 147, 147, 153, 146, 146,
+154, 147, 147, 149, 145, 145, 147, 143, 143, 149,
+145, 145, 147, 144, 144, 140, 138, 138, 141, 139,
+139, 149, 145, 145, 152, 147, 147, 159, 149, 149,
+154, 148, 148, 149, 145, 145, 148, 145, 145, 154,
+147, 147, 152, 146, 146, 148, 144, 144, 141, 139,
+139, 132, 132, 132, 127, 127, 127, 125, 125, 125,
+130, 130, 130, 136, 135, 135, 138, 137, 137, 140,
+138, 138, 139, 138, 138, 135, 134, 134, 134, 133,
+133, 137, 136, 136, 140, 139, 139, 143, 141, 141,
+143, 141, 141, 146, 143, 143, 140, 138, 138, 141,
+139, 139, 144, 141, 141, 142, 140, 140, 143, 141,
+141, 145, 142, 142, 142, 140, 140, 138, 137, 137,
+140, 138, 138, 147, 143, 143, 148, 143, 143, 144,
+141, 141, 143, 140, 140, 142, 140, 140, 143, 140,
+140, 146, 142, 142, 144, 141, 141, 139, 137, 137,
+139, 137, 137, 141, 139, 139, 142, 140, 140, 138,
+137, 137, 137, 136, 136, 138, 137, 137, 142, 139,
+139, 144, 141, 141, 144, 141, 141, 142, 140, 140,
+150, 144, 144, 148, 144, 144, 147, 143, 143, 146,
+142, 142, 145, 142, 142, 146, 143, 143, 147, 143,
+143, 145, 141, 141, 144, 141, 141, 145, 142, 142,
+146, 142, 142, 147, 143, 143, 148, 144, 144, 149,
+144, 144, 150, 144, 144, 145, 142, 142, 139, 138,
+138, 142, 140, 140, 147, 143, 143, 147, 143, 143,
+148, 144, 144, 150, 145, 145, 144, 141, 141, 141,
+140, 140, 140, 139, 139, 142, 140, 140, 144, 142,
+142, 147, 143, 143, 147, 143, 143, 148, 144, 144,
+147, 144, 144, 143, 140, 140, 143, 141, 141, 150,
+145, 145, 155, 147, 147, 151, 145, 145, 143, 140,
+140, 147, 144, 144, 150, 146, 146, 149, 145, 145,
+146, 143, 143, 148, 144, 144, 147, 144, 144, 149,
+145, 145, 152, 147, 147, 150, 146, 146, 139, 138,
+138, 134, 134, 134, 138, 137, 137, 141, 140, 140,
+141, 140, 140, 150, 145, 145, 143, 141, 141, 140,
+139, 139, 142, 140, 140, 143, 141, 141, 144, 142,
+142, 149, 145, 145, 149, 145, 145, 146, 143, 143,
+148, 144, 144, 145, 143, 143, 144, 142, 142, 146,
+144, 144, 151, 147, 147, 148, 145, 145, 139, 138,
+138, 134, 134, 134, 135, 135, 135, 135, 135, 135,
+144, 142, 142, 143, 141, 141, 140, 138, 138, 139,
+137, 137, 147, 144, 144, 146, 143, 143, 144, 142,
+142, 146, 143, 143, 156, 148, 148, 166, 149, 149,
+153, 147, 147, 143, 142, 142, 141, 140, 140, 147,
+144, 144, 149, 145, 145, 153, 148, 148, 148, 145,
+145, 141, 140, 140, 142, 141, 141, 144, 142, 142,
+145, 143, 143, 145, 143, 143, 147, 144, 144, 158,
+150, 150, 161, 151, 151, 151, 147, 147, 142, 141,
+141, 142, 141, 141, 150, 147, 147, 145, 143, 143,
+147, 145, 145, 149, 146, 146, 147, 145, 145, 147,
+145, 145, 142, 141, 141, 137, 137, 137, 137, 137,
+137, 143, 142, 142, 144, 142, 142, 163, 150, 150,
+174, 148, 148, 167, 152, 152, 143, 142, 142, 129,
+129, 129, 127, 127, 127, 138, 137, 137, 158, 152,
+152, 170, 153, 153, 158, 151, 151, 158, 151, 151,
+158, 151, 151, 152, 148, 148, 153, 149, 149, 147,
+144, 144, 139, 138, 138, 131, 131, 131, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 131, 131, 131,
+144, 142, 142, 169, 154, 154, 178, 146, 146, 156,
+150, 150, 143, 142, 142, 143, 142, 142, 143, 141,
+141, 138, 137, 137, 130, 130, 130, 136, 136, 136,
+57, 55, 55, 82, 75, 75, 77, 71, 71, 81,
+74, 74, 58, 56, 56, 47, 46, 46, 48, 47,
+47, 44, 44, 44, 57, 55, 55, 59, 57, 57,
+48, 48, 48, 47, 46, 46, 49, 49, 49, 60,
+58, 58, 65, 62, 62, 67, 64, 64, 65, 62,
+62, 71, 67, 67, 63, 61, 61, 76, 70, 70,
+71, 67, 67, 66, 63, 63, 59, 57, 57, 59,
+58, 58, 66, 63, 63, 74, 69, 69, 67, 64,
+64, 71, 66, 66, 67, 64, 64, 56, 54, 54,
+55, 53, 53, 63, 60, 60, 80, 74, 74, 76,
+70, 70, 48, 48, 48, 48, 47, 47, 71, 67,
+67, 88, 79, 79, 76, 70, 70, 81, 74, 74,
+141, 140, 140, 152, 148, 148, 166, 152, 152, 164,
+151, 151, 162, 150, 150, 156, 149, 149, 146, 144,
+144, 142, 141, 141, 142, 141, 141, 143, 142, 142,
+144, 143, 143, 144, 143, 143, 145, 144, 144, 144,
+143, 143, 140, 139, 139, 142, 141, 141, 152, 148,
+148, 168, 153, 153, 168, 151, 151, 157, 150, 150,
+147, 145, 145, 141, 140, 140, 137, 136, 136, 146,
+144, 144, 149, 146, 146, 152, 147, 147, 154, 149,
+149, 155, 149, 149, 155, 150, 150, 140, 139, 139,
+128, 128, 128, 132, 132, 132, 152, 148, 148, 150,
+147, 147, 146, 144, 144, 144, 143, 143, 146, 144,
+144, 146, 144, 144, 141, 140, 140, 134, 134, 134,
+139, 138, 138, 166, 151, 151, 165, 151, 151, 154,
+148, 148, 147, 145, 145, 149, 146, 146, 149, 146,
+146, 143, 142, 142, 139, 138, 138, 135, 134, 134,
+131, 131, 131, 130, 130, 130, 146, 144, 144, 154,
+148, 148, 154, 148, 148, 153, 147, 147, 148, 144,
+144, 151, 148, 148, 157, 150, 150, 158, 149, 149,
+149, 146, 146, 143, 141, 141, 140, 139, 139, 140,
+139, 139, 138, 138, 138, 133, 132, 132, 135, 134,
+134, 136, 135, 135, 142, 140, 140, 150, 146, 146,
+136, 135, 135, 146, 143, 143, 148, 145, 145, 143,
+141, 141, 136, 136, 136, 140, 139, 139, 145, 143,
+143, 148, 145, 145, 151, 146, 146, 156, 148, 148,
+148, 145, 145, 143, 141, 141, 139, 137, 137, 134,
+134, 134, 131, 131, 131, 138, 137, 137, 143, 141,
+141, 151, 147, 147, 160, 150, 150, 159, 149, 149,
+155, 148, 148, 147, 143, 143, 141, 139, 139, 141,
+139, 139, 135, 134, 134, 131, 131, 131, 129, 129,
+129, 127, 127, 127, 128, 128, 128, 131, 131, 131,
+137, 136, 136, 144, 141, 141, 147, 144, 144, 143,
+141, 141, 138, 137, 137, 140, 138, 138, 146, 142,
+142, 147, 144, 144, 150, 145, 145, 147, 143, 143,
+142, 140, 140, 141, 140, 140, 144, 141, 141, 144,
+142, 142, 145, 142, 142, 148, 144, 144, 149, 144,
+144, 142, 140, 140, 142, 140, 140, 148, 144, 144,
+150, 145, 145, 143, 141, 141, 140, 138, 138, 137,
+136, 136, 137, 136, 136, 137, 136, 136, 140, 138,
+138, 141, 139, 139, 138, 137, 137, 138, 137, 137,
+138, 137, 137, 138, 137, 137, 138, 137, 137, 139,
+137, 137, 143, 141, 141, 148, 144, 144, 148, 143,
+143, 144, 141, 141, 143, 141, 141, 145, 142, 142,
+139, 137, 137, 149, 145, 145, 148, 144, 144, 148,
+144, 144, 147, 144, 144, 147, 144, 144, 148, 144,
+144, 150, 145, 145, 154, 147, 147, 152, 146, 146,
+150, 145, 145, 148, 144, 144, 147, 143, 143, 147,
+143, 143, 147, 143, 143, 148, 144, 144, 151, 146,
+146, 150, 146, 146, 150, 145, 145, 149, 145, 145,
+146, 143, 143, 142, 140, 140, 141, 139, 139, 140,
+139, 139, 142, 140, 140, 148, 144, 144, 150, 146,
+146, 147, 143, 143, 143, 141, 141, 143, 141, 141,
+143, 141, 141, 151, 146, 146, 153, 147, 147, 151,
+146, 146, 147, 144, 144, 146, 143, 143, 147, 143,
+143, 143, 141, 141, 141, 140, 140, 143, 141, 141,
+142, 140, 140, 143, 141, 141, 146, 143, 143, 148,
+144, 144, 148, 145, 145, 148, 145, 145, 154, 149,
+149, 155, 149, 149, 152, 147, 147, 151, 147, 147,
+153, 148, 148, 149, 145, 145, 145, 142, 142, 144,
+141, 141, 147, 144, 144, 143, 141, 141, 146, 144,
+144, 146, 144, 144, 145, 142, 142, 147, 144, 144,
+157, 150, 150, 159, 150, 150, 159, 150, 150, 157,
+150, 150, 155, 149, 149, 159, 150, 150, 156, 149,
+149, 144, 142, 142, 133, 133, 133, 135, 134, 134,
+134, 134, 134, 145, 142, 142, 146, 143, 143, 142,
+141, 141, 137, 137, 137, 144, 142, 142, 157, 150,
+150, 153, 148, 148, 145, 143, 143, 151, 147, 147,
+163, 151, 151, 165, 152, 152, 160, 152, 152, 152,
+148, 148, 144, 143, 143, 140, 139, 139, 154, 149,
+149, 154, 148, 148, 147, 144, 144, 144, 142, 142,
+147, 144, 144, 162, 152, 152, 158, 152, 152, 152,
+148, 148, 156, 150, 150, 155, 150, 150, 151, 147,
+147, 141, 140, 140, 138, 137, 137, 146, 144, 144,
+148, 146, 146, 152, 148, 148, 152, 148, 148, 147,
+145, 145, 143, 142, 142, 139, 139, 139, 153, 149,
+149, 161, 153, 153, 158, 152, 152, 148, 145, 145,
+157, 150, 150, 167, 154, 154, 167, 155, 155, 161,
+153, 153, 153, 149, 149, 140, 139, 139, 141, 140,
+140, 156, 150, 150, 163, 152, 152, 148, 145, 145,
+153, 148, 148, 149, 146, 146, 159, 151, 151, 164,
+154, 154, 149, 146, 146, 140, 140, 140, 134, 134,
+134, 145, 144, 144, 159, 153, 153, 161, 154, 154,
+161, 153, 153, 155, 151, 151, 162, 153, 153, 162,
+152, 152, 152, 148, 148, 147, 144, 144, 156, 150,
+150, 149, 146, 146, 131, 131, 131, 130, 130, 130,
+163, 152, 152, 88, 78, 78, 63, 61, 61, 82,
+74, 74, 70, 66, 66, 73, 68, 68, 74, 69,
+69, 50, 49, 49, 71, 67, 67, 61, 59, 59,
+55, 53, 53, 58, 57, 57, 63, 60, 60, 69,
+65, 65, 69, 65, 65, 68, 65, 65, 75, 70,
+70, 71, 67, 67, 66, 63, 63, 71, 67, 67,
+76, 71, 71, 69, 65, 65, 69, 65, 65, 59,
+57, 57, 67, 64, 64, 65, 62, 62, 64, 62,
+62, 68, 65, 65, 72, 67, 67, 65, 62, 62,
+63, 60, 60, 66, 63, 63, 64, 61, 61, 63,
+60, 60, 44, 44, 44, 37, 37, 37, 44, 44,
+44, 60, 58, 58, 63, 61, 61, 146, 144, 144,
+142, 141, 141, 138, 137, 137, 139, 138, 138, 144,
+143, 143, 154, 149, 149, 161, 153, 153, 155, 150,
+150, 161, 152, 152, 170, 153, 153, 159, 151, 151,
+147, 144, 144, 146, 144, 144, 148, 145, 145, 146,
+144, 144, 136, 135, 135, 143, 142, 142, 144, 143,
+143, 154, 149, 149, 165, 152, 152, 162, 152, 152,
+147, 144, 144, 152, 148, 148, 161, 153, 153, 169,
+155, 155, 172, 154, 154, 155, 150, 150, 151, 147,
+147, 149, 146, 146, 150, 147, 147, 159, 153, 153,
+160, 153, 153, 168, 155, 155, 162, 153, 153, 151,
+147, 147, 152, 147, 147, 153, 148, 148, 150, 147,
+147, 157, 150, 150, 164, 153, 153, 158, 151, 151,
+154, 149, 149, 153, 148, 148, 153, 149, 149, 153,
+149, 149, 151, 147, 147, 150, 147, 147, 158, 151,
+151, 161, 153, 153, 158, 152, 152, 157, 151, 151,
+155, 150, 150, 162, 152, 152, 154, 149, 149, 142,
+140, 140, 139, 138, 138, 136, 136, 136, 140, 139,
+139, 145, 143, 143, 147, 144, 144, 145, 142, 142,
+146, 143, 143, 147, 144, 144, 149, 146, 146, 150,
+146, 146, 149, 146, 146, 157, 150, 150, 157, 151,
+151, 154, 148, 148, 149, 145, 145, 145, 143, 143,
+151, 147, 147, 157, 150, 150, 157, 150, 150, 156,
+150, 150, 157, 150, 150, 154, 149, 149, 157, 150,
+150, 160, 151, 151, 162, 151, 151, 158, 150, 150,
+156, 150, 150, 153, 148, 148, 143, 141, 141, 134,
+134, 134, 140, 139, 139, 147, 144, 144, 152, 147,
+147, 153, 147, 147, 153, 147, 147, 154, 148, 148,
+146, 143, 143, 144, 142, 142, 143, 141, 141, 141,
+139, 139, 140, 139, 139, 139, 138, 138, 139, 138,
+138, 140, 139, 139, 142, 141, 141, 145, 143, 143,
+147, 144, 144, 146, 144, 144, 144, 142, 142, 143,
+141, 141, 146, 143, 143, 147, 143, 143, 149, 145,
+145, 146, 143, 143, 140, 139, 139, 140, 139, 139,
+145, 142, 142, 150, 145, 145, 149, 145, 145, 148,
+144, 144, 147, 143, 143, 145, 142, 142, 144, 142,
+142, 150, 145, 145, 155, 147, 147, 153, 146, 146,
+146, 143, 143, 142, 140, 140, 138, 137, 137, 133,
+133, 133, 133, 132, 132, 135, 134, 134, 136, 135,
+135, 137, 136, 136, 137, 136, 136, 138, 137, 137,
+140, 138, 138, 142, 140, 140, 144, 141, 141, 148,
+144, 144, 148, 144, 144, 145, 142, 142, 145, 142,
+142, 148, 144, 144, 152, 146, 146, 142, 139, 139,
+120, 120, 120, 127, 127, 127, 137, 136, 136, 147,
+144, 144, 147, 144, 144, 148, 144, 144, 148, 144,
+144, 149, 145, 145, 150, 146, 146, 155, 148, 148,
+159, 149, 149, 157, 149, 149, 155, 148, 148, 152,
+147, 147, 150, 146, 146, 149, 145, 145, 149, 145,
+145, 149, 145, 145, 149, 145, 145, 152, 147, 147,
+154, 148, 148, 149, 145, 145, 145, 143, 143, 139,
+138, 138, 134, 134, 134, 130, 130, 130, 139, 138,
+138, 149, 145, 145, 151, 146, 146, 144, 141, 141,
+138, 137, 137, 139, 137, 137, 140, 139, 139, 148,
+144, 144, 152, 147, 147, 155, 149, 149, 153, 148,
+148, 149, 145, 145, 148, 144, 144, 147, 144, 144,
+143, 141, 141, 139, 137, 137, 135, 134, 134, 142,
+140, 140, 151, 146, 146, 154, 148, 148, 154, 148,
+148, 156, 150, 150, 160, 152, 152, 155, 149, 149,
+156, 149, 149, 154, 148, 148, 150, 146, 146, 145,
+143, 143, 139, 138, 138, 145, 142, 142, 150, 146,
+146, 156, 150, 150, 155, 149, 149, 149, 146, 146,
+144, 142, 142, 154, 148, 148, 160, 151, 151, 162,
+152, 152, 165, 152, 152, 157, 150, 150, 157, 150,
+150, 161, 151, 151, 151, 147, 147, 132, 132, 132,
+133, 133, 133, 143, 141, 141, 155, 149, 149, 157,
+150, 150, 154, 149, 149, 146, 144, 144, 141, 140,
+140, 154, 149, 149, 153, 148, 148, 141, 140, 140,
+141, 140, 140, 152, 148, 148, 158, 150, 150, 156,
+150, 150, 153, 149, 149, 148, 145, 145, 137, 136,
+136, 147, 145, 145, 148, 145, 145, 144, 142, 142,
+148, 145, 145, 159, 152, 152, 171, 155, 155, 159,
+152, 152, 149, 146, 146, 155, 150, 150, 166, 153,
+153, 162, 153, 153, 152, 147, 147, 143, 141, 141,
+141, 140, 140, 145, 143, 143, 150, 147, 147, 157,
+151, 151, 159, 152, 152, 156, 150, 150, 152, 148,
+148, 165, 154, 154, 163, 153, 153, 150, 147, 147,
+140, 139, 139, 143, 142, 142, 157, 152, 152, 157,
+152, 152, 156, 151, 151, 154, 150, 150, 148, 146,
+146, 138, 138, 138, 150, 146, 146, 147, 144, 144,
+147, 145, 145, 152, 148, 148, 158, 151, 151, 164,
+154, 154, 159, 153, 153, 156, 151, 151, 154, 150,
+150, 152, 149, 149, 155, 150, 150, 158, 152, 152,
+160, 153, 153, 160, 152, 152, 149, 146, 146, 156,
+150, 150, 153, 149, 149, 151, 148, 148, 152, 148,
+148, 155, 151, 151, 133, 133, 133, 128, 128, 128,
+142, 141, 141, 157, 151, 151, 52, 51, 51, 71,
+67, 67, 80, 73, 73, 79, 72, 72, 92, 80,
+80, 60, 58, 58, 55, 53, 53, 50, 49, 49,
+46, 46, 46, 63, 61, 61, 68, 65, 65, 69,
+65, 65, 67, 64, 64, 76, 71, 71, 82, 75,
+75, 79, 73, 73, 77, 72, 72, 86, 78, 78,
+70, 66, 66, 83, 76, 76, 71, 67, 67, 73,
+68, 68, 60, 58, 58, 47, 47, 47, 57, 55,
+55, 67, 64, 64, 73, 68, 68, 63, 60, 60,
+69, 66, 66, 65, 62, 62, 58, 56, 56, 87,
+77, 77, 91, 80, 80, 69, 65, 65, 65, 62,
+62, 72, 68, 68, 168, 154, 154, 164, 154, 154,
+161, 153, 153, 150, 147, 147, 148, 146, 146, 160,
+153, 153, 166, 154, 154, 160, 153, 153, 160, 152,
+152, 176, 154, 154, 176, 154, 154, 160, 152, 152,
+144, 143, 143, 137, 136, 136, 159, 151, 151, 149,
+146, 146, 149, 146, 146, 151, 148, 148, 137, 137,
+137, 149, 146, 146, 154, 149, 149, 147, 144, 144,
+143, 142, 142, 154, 150, 150, 160, 153, 153, 162,
+153, 153, 151, 148, 148, 143, 142, 142, 142, 141,
+141, 138, 137, 137, 152, 148, 148, 157, 151, 151,
+163, 154, 154, 166, 154, 154, 155, 150, 150, 151,
+147, 147, 160, 152, 152, 163, 153, 153, 160, 152,
+152, 161, 152, 152, 162, 153, 153, 154, 149, 149,
+148, 146, 146, 150, 147, 147, 157, 150, 150, 159,
+152, 152, 157, 150, 150, 157, 150, 150, 161, 153,
+153, 162, 154, 154, 157, 151, 151, 155, 149, 149,
+163, 153, 153, 160, 152, 152, 148, 145, 145, 140,
+139, 139, 130, 130, 130, 133, 132, 132, 144, 142,
+142, 152, 148, 148, 153, 148, 148, 158, 150, 150,
+160, 152, 152, 163, 153, 153, 165, 153, 153, 164,
+153, 153, 161, 152, 152, 165, 154, 154, 165, 153,
+153, 163, 152, 152, 156, 149, 149, 148, 145, 145,
+157, 150, 150, 162, 152, 152, 160, 152, 152, 156,
+150, 150, 155, 149, 149, 160, 151, 151, 163, 151,
+151, 164, 151, 151, 159, 150, 150, 155, 149, 149,
+151, 147, 147, 139, 138, 138, 134, 134, 134, 143,
+141, 141, 152, 147, 147, 152, 148, 148, 152, 147,
+147, 155, 148, 148, 153, 148, 148, 150, 146, 146,
+149, 146, 146, 149, 145, 145, 149, 146, 146, 151,
+146, 146, 152, 147, 147, 152, 147, 147, 154, 148,
+148, 152, 147, 147, 150, 146, 146, 149, 146, 146,
+149, 146, 146, 149, 145, 145, 149, 145, 145, 150,
+146, 146, 153, 147, 147, 147, 144, 144, 138, 137,
+137, 136, 135, 135, 146, 143, 143, 154, 147, 147,
+150, 145, 145, 146, 143, 143, 143, 141, 141, 146,
+143, 143, 148, 144, 144, 151, 146, 146, 156, 148,
+148, 157, 148, 148, 152, 147, 147, 148, 145, 145,
+139, 138, 138, 129, 129, 129, 128, 128, 128, 132,
+131, 131, 135, 134, 134, 134, 133, 133, 135, 134,
+134, 136, 135, 135, 141, 139, 139, 144, 141, 141,
+146, 143, 143, 148, 144, 144, 148, 144, 144, 146,
+143, 143, 146, 143, 143, 153, 147, 147, 159, 149,
+149, 144, 141, 141, 129, 129, 129, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 126,
+126, 126, 136, 135, 135, 149, 144, 144, 147, 144,
+144, 145, 142, 142, 145, 142, 142, 146, 143, 143,
+146, 143, 143, 150, 145, 145, 153, 146, 146, 152,
+146, 146, 153, 147, 147, 152, 146, 146, 150, 145,
+145, 148, 144, 144, 146, 143, 143, 144, 142, 142,
+143, 141, 141, 148, 144, 144, 151, 146, 146, 148,
+144, 144, 146, 143, 143, 144, 142, 142, 140, 139,
+139, 138, 137, 137, 141, 140, 140, 145, 142, 142,
+144, 142, 142, 140, 139, 139, 140, 138, 138, 141,
+139, 139, 142, 140, 140, 145, 142, 142, 149, 145,
+145, 154, 148, 148, 153, 147, 147, 151, 147, 147,
+151, 146, 146, 149, 145, 145, 145, 142, 142, 138,
+137, 137, 139, 137, 137, 147, 144, 144, 153, 147,
+147, 153, 147, 147, 155, 149, 149, 156, 150, 150,
+151, 146, 146, 149, 145, 145, 151, 146, 146, 144,
+142, 142, 144, 142, 142, 143, 141, 141, 141, 139,
+139, 147, 144, 144, 163, 152, 152, 163, 152, 152,
+156, 149, 149, 149, 146, 146, 148, 145, 145, 148,
+145, 145, 150, 146, 146, 156, 150, 150, 150, 146,
+146, 145, 143, 143, 149, 145, 145, 153, 148, 148,
+137, 136, 136, 139, 138, 138, 154, 149, 149, 165,
+153, 153, 164, 153, 153, 161, 152, 152, 154, 149,
+149, 141, 140, 140, 142, 141, 141, 146, 144, 144,
+142, 141, 141, 141, 140, 140, 144, 142, 142, 144,
+142, 142, 145, 143, 143, 151, 147, 147, 155, 149,
+149, 143, 142, 142, 144, 142, 142, 142, 140, 140,
+143, 142, 142, 153, 149, 149, 167, 155, 155, 161,
+154, 154, 153, 149, 149, 145, 143, 143, 153, 148,
+148, 171, 152, 152, 164, 154, 154, 163, 153, 153,
+150, 146, 146, 142, 141, 141, 143, 141, 141, 149,
+146, 146, 164, 153, 153, 168, 154, 154, 164, 154,
+154, 158, 152, 152, 154, 149, 149, 152, 147, 147,
+139, 138, 138, 137, 136, 136, 142, 141, 141, 144,
+143, 143, 137, 136, 136, 142, 141, 141, 155, 150,
+150, 151, 147, 147, 140, 139, 139, 137, 137, 137,
+144, 143, 143, 147, 145, 145, 164, 153, 153, 160,
+152, 152, 154, 150, 150, 162, 152, 152, 161, 151,
+151, 166, 154, 154, 146, 144, 144, 135, 135, 135,
+140, 139, 139, 147, 145, 145, 147, 145, 145, 153,
+148, 148, 156, 150, 150, 159, 153, 153, 160, 153,
+153, 152, 149, 149, 143, 142, 142, 139, 138, 138,
+141, 140, 140, 146, 144, 144, 141, 140, 140, 139,
+138, 138, 52, 51, 51, 79, 72, 72, 98, 82,
+82, 73, 68, 68, 63, 61, 61, 68, 65, 65,
+67, 64, 64, 72, 68, 68, 77, 72, 72, 77,
+72, 72, 57, 56, 56, 60, 59, 59, 65, 63,
+63, 68, 65, 65, 84, 76, 76, 88, 78, 78,
+84, 76, 76, 69, 65, 65, 56, 54, 54, 70,
+66, 66, 74, 69, 69, 56, 55, 55, 60, 58,
+58, 68, 65, 65, 75, 70, 70, 65, 62, 62,
+74, 70, 70, 77, 72, 72, 67, 64, 64, 56,
+55, 55, 50, 49, 49, 50, 49, 49, 164, 153,
+153, 150, 147, 147, 149, 146, 146, 158, 151, 151,
+173, 155, 155, 174, 155, 155, 168, 155, 155, 179,
+152, 152, 167, 154, 154, 165, 154, 154, 169, 154,
+154, 168, 156, 156, 173, 157, 157, 160, 152, 152,
+139, 138, 138, 143, 142, 142, 164, 151, 151, 150,
+147, 147, 164, 152, 152, 153, 149, 149, 144, 142,
+142, 141, 140, 140, 142, 141, 141, 142, 141, 141,
+143, 142, 142, 144, 142, 142, 141, 140, 140, 138,
+137, 137, 140, 139, 139, 142, 141, 141, 140, 139,
+139, 137, 137, 137, 138, 137, 137, 141, 140, 140,
+148, 146, 146, 152, 149, 149, 144, 142, 142, 151,
+148, 148, 164, 155, 155, 161, 153, 153, 141, 140,
+140, 147, 144, 144, 154, 149, 149, 152, 148, 148,
+147, 145, 145, 153, 148, 148, 158, 151, 151, 158,
+150, 150, 149, 145, 145, 144, 143, 143, 150, 147,
+147, 139, 138, 138, 137, 136, 136, 149, 146, 146,
+159, 151, 151, 160, 152, 152, 153, 148, 148, 138,
+138, 138, 139, 138, 138, 151, 147, 147, 159, 151,
+151, 158, 151, 151, 163, 152, 152, 166, 154, 154,
+164, 153, 153, 164, 153, 153, 160, 151, 151, 148,
+145, 145, 157, 150, 150, 167, 152, 152, 166, 152,
+152, 152, 147, 147, 140, 139, 139, 145, 143, 143,
+155, 150, 150, 149, 146, 146, 148, 145, 145, 152,
+147, 147, 155, 149, 149, 157, 149, 149, 155, 148,
+148, 149, 145, 145, 144, 142, 142, 141, 140, 140,
+137, 137, 137, 136, 135, 135, 148, 145, 145, 155,
+149, 149, 155, 148, 148, 154, 148, 148, 153, 148,
+148, 150, 146, 146, 149, 145, 145, 150, 146, 146,
+150, 146, 146, 150, 146, 146, 150, 146, 146, 149,
+145, 145, 151, 146, 146, 153, 147, 147, 152, 147,
+147, 151, 147, 147, 153, 147, 147, 152, 147, 147,
+152, 146, 146, 153, 147, 147, 154, 148, 148, 152,
+146, 146, 142, 140, 140, 138, 137, 137, 144, 141,
+141, 151, 146, 146, 148, 144, 144, 145, 142, 142,
+144, 142, 142, 146, 143, 143, 147, 143, 143, 148,
+144, 144, 150, 145, 145, 151, 146, 146, 148, 144,
+144, 146, 143, 143, 143, 140, 140, 138, 137, 137,
+139, 137, 137, 144, 141, 141, 147, 143, 143, 143,
+141, 141, 139, 138, 138, 139, 138, 138, 141, 139,
+139, 142, 140, 140, 142, 139, 139, 141, 139, 139,
+143, 140, 140, 144, 141, 141, 148, 143, 143, 153,
+147, 147, 158, 148, 148, 140, 138, 138, 127, 127,
+127, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 124, 124, 124, 136, 135,
+135, 150, 145, 145, 148, 143, 143, 143, 141, 141,
+141, 139, 139, 141, 139, 139, 142, 139, 139, 144,
+142, 142, 146, 143, 143, 148, 144, 144, 149, 145,
+145, 149, 144, 144, 148, 144, 144, 146, 142, 142,
+141, 139, 139, 136, 135, 135, 138, 137, 137, 147,
+143, 143, 151, 146, 146, 148, 144, 144, 147, 144,
+144, 149, 145, 145, 154, 147, 147, 154, 146, 146,
+149, 145, 145, 146, 143, 143, 146, 143, 143, 147,
+144, 144, 151, 146, 146, 153, 147, 147, 153, 147,
+147, 154, 148, 148, 153, 147, 147, 142, 140, 140,
+140, 138, 138, 138, 137, 137, 138, 137, 137, 141,
+140, 140, 145, 143, 143, 145, 142, 142, 145, 142,
+142, 143, 141, 141, 141, 139, 139, 140, 138, 138,
+139, 138, 138, 142, 140, 140, 148, 145, 145, 159,
+150, 150, 157, 149, 149, 153, 147, 147, 153, 147,
+147, 150, 146, 146, 144, 142, 142, 153, 148, 148,
+153, 148, 148, 151, 147, 147, 153, 148, 148, 151,
+147, 147, 145, 143, 143, 143, 141, 141, 144, 142,
+142, 147, 144, 144, 148, 145, 145, 140, 138, 138,
+137, 136, 136, 149, 145, 145, 158, 150, 150, 162,
+151, 151, 160, 151, 151, 154, 149, 149, 144, 142,
+142, 138, 137, 137, 135, 135, 135, 139, 138, 138,
+151, 147, 147, 157, 149, 149, 158, 150, 150, 156,
+149, 149, 155, 149, 149, 163, 152, 152, 169, 152,
+152, 157, 149, 149, 156, 149, 149, 157, 149, 149,
+163, 151, 151, 162, 151, 151, 154, 148, 148, 148,
+145, 145, 153, 149, 149, 162, 153, 153, 145, 143,
+143, 133, 132, 132, 133, 132, 132, 134, 134, 134,
+147, 144, 144, 165, 152, 152, 163, 152, 152, 157,
+150, 150, 155, 149, 149, 150, 147, 147, 139, 138,
+138, 147, 144, 144, 146, 143, 143, 155, 148, 148,
+169, 150, 150, 159, 150, 150, 160, 151, 151, 160,
+151, 151, 159, 151, 151, 159, 151, 151, 159, 151,
+151, 159, 151, 151, 160, 151, 151, 159, 150, 150,
+151, 147, 147, 137, 137, 137, 136, 135, 135, 161,
+153, 153, 168, 156, 156, 163, 153, 153, 146, 144,
+144, 136, 136, 136, 142, 141, 141, 163, 152, 152,
+176, 147, 147, 166, 153, 153, 150, 147, 147, 156,
+150, 150, 174, 151, 151, 168, 153, 153, 143, 141,
+141, 149, 146, 146, 158, 151, 151, 161, 152, 152,
+170, 152, 152, 195, 129, 129, 169, 154, 154, 144,
+143, 143, 145, 143, 143, 69, 65, 65, 59, 57,
+57, 54, 53, 53, 53, 52, 52, 72, 68, 68,
+81, 74, 74, 70, 66, 66, 74, 69, 69, 71,
+67, 67, 55, 54, 54, 51, 50, 50, 53, 52,
+52, 73, 68, 68, 75, 70, 70, 82, 75, 75,
+70, 66, 66, 73, 68, 68, 71, 66, 66, 63,
+61, 61, 82, 73, 73, 72, 68, 68, 74, 68,
+68, 74, 70, 70, 64, 62, 62, 72, 67, 67,
+68, 64, 64, 67, 64, 64, 64, 62, 62, 80,
+73, 73, 58, 56, 56, 159, 152, 152, 155, 150,
+150, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 130, 129, 129, 136, 136, 136, 136,
+135, 135, 144, 142, 142, 149, 147, 147, 140, 139,
+139, 137, 136, 136, 147, 145, 145, 158, 149, 149,
+130, 130, 130, 132, 132, 132, 139, 139, 139, 147,
+145, 145, 153, 148, 148, 154, 150, 150, 161, 152,
+152, 162, 152, 152, 172, 153, 153, 175, 153, 153,
+170, 154, 154, 168, 152, 152, 168, 153, 153, 168,
+154, 154, 167, 153, 153, 164, 152, 152, 160, 151,
+151, 160, 152, 152, 161, 152, 152, 150, 146, 146,
+137, 137, 137, 131, 130, 130, 131, 130, 130, 131,
+131, 131, 134, 133, 133, 153, 148, 148, 160, 150,
+150, 155, 148, 148, 144, 142, 142, 132, 132, 132,
+145, 143, 143, 139, 138, 138, 140, 139, 139, 140,
+139, 139, 143, 141, 141, 157, 150, 150, 147, 144,
+144, 137, 136, 136, 134, 133, 133, 135, 135, 135,
+141, 140, 140, 154, 149, 149, 157, 150, 150, 157,
+151, 151, 148, 145, 145, 137, 136, 136, 134, 134,
+134, 144, 142, 142, 153, 148, 148, 150, 146, 146,
+149, 145, 145, 149, 145, 145, 146, 143, 143, 140,
+139, 139, 139, 138, 138, 137, 137, 137, 139, 138,
+138, 137, 136, 136, 142, 140, 140, 167, 153, 153,
+157, 149, 149, 156, 148, 148, 156, 149, 149, 151,
+147, 147, 146, 144, 144, 157, 149, 149, 156, 149,
+149, 154, 148, 148, 149, 145, 145, 141, 139, 139,
+139, 138, 138, 151, 147, 147, 158, 150, 150, 153,
+147, 147, 150, 146, 146, 146, 143, 143, 139, 138,
+138, 140, 139, 139, 141, 139, 139, 142, 140, 140,
+138, 137, 137, 132, 132, 132, 134, 133, 133, 141,
+140, 140, 148, 144, 144, 147, 144, 144, 151, 146,
+146, 152, 147, 147, 151, 146, 146, 152, 147, 147,
+153, 147, 147, 153, 147, 147, 149, 145, 145, 145,
+142, 142, 143, 141, 141, 144, 142, 142, 148, 144,
+144, 151, 146, 146, 151, 146, 146, 145, 142, 142,
+142, 140, 140, 143, 140, 140, 148, 144, 144, 151,
+145, 145, 146, 143, 143, 141, 139, 139, 143, 141,
+141, 149, 144, 144, 153, 147, 147, 160, 149, 149,
+165, 150, 150, 156, 148, 148, 146, 143, 143, 143,
+141, 141, 143, 140, 140, 141, 139, 139, 137, 136,
+136, 132, 132, 132, 137, 136, 136, 143, 140, 140,
+148, 143, 143, 152, 146, 146, 154, 146, 146, 138,
+136, 136, 125, 125, 125, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 123, 123, 123, 134, 133, 133, 147, 143, 143,
+148, 143, 143, 144, 141, 141, 142, 140, 140, 142,
+140, 140, 142, 140, 140, 144, 141, 141, 146, 142,
+142, 147, 143, 143, 148, 144, 144, 148, 144, 144,
+146, 142, 142, 144, 141, 141, 140, 139, 139, 137,
+136, 136, 141, 140, 140, 149, 145, 145, 155, 147,
+147, 153, 147, 147, 151, 145, 145, 152, 146, 146,
+155, 147, 147, 152, 146, 146, 147, 144, 144, 143,
+141, 141, 144, 142, 142, 146, 143, 143, 147, 144,
+144, 148, 144, 144, 148, 145, 145, 149, 145, 145,
+150, 145, 145, 147, 144, 144, 143, 141, 141, 143,
+141, 141, 143, 141, 141, 140, 138, 138, 139, 138,
+138, 139, 138, 138, 139, 138, 138, 140, 139, 139,
+146, 143, 143, 145, 143, 143, 146, 143, 143, 150,
+146, 146, 152, 147, 147, 151, 146, 146, 150, 146,
+146, 148, 144, 144, 147, 144, 144, 148, 145, 145,
+154, 148, 148, 161, 151, 151, 163, 151, 151, 156,
+149, 149, 145, 143, 143, 147, 144, 144, 142, 140,
+140, 137, 136, 136, 137, 137, 137, 142, 140, 140,
+148, 145, 145, 150, 146, 146, 149, 145, 145, 147,
+144, 144, 147, 144, 144, 155, 149, 149, 168, 153,
+153, 157, 149, 149, 157, 149, 149, 152, 147, 147,
+143, 141, 141, 145, 143, 143, 158, 151, 151, 159,
+151, 151, 152, 147, 147, 143, 141, 141, 144, 142,
+142, 150, 147, 147, 146, 144, 144, 146, 144, 144,
+146, 144, 144, 143, 142, 142, 139, 138, 138, 144,
+142, 142, 155, 150, 150, 151, 148, 148, 140, 139,
+139, 143, 142, 142, 148, 145, 145, 150, 147, 147,
+148, 145, 145, 138, 137, 137, 158, 151, 151, 150,
+146, 146, 140, 139, 139, 143, 141, 141, 148, 146,
+146, 143, 142, 142, 146, 144, 144, 136, 135, 135,
+137, 137, 137, 144, 143, 143, 144, 143, 143, 141,
+140, 140, 153, 149, 149, 137, 137, 137, 135, 134,
+134, 135, 134, 134, 135, 134, 134, 135, 134, 134,
+138, 137, 137, 157, 150, 150, 134, 133, 133, 132,
+131, 131, 134, 133, 133, 137, 136, 136, 146, 144,
+144, 170, 152, 152, 156, 150, 150, 139, 138, 138,
+142, 141, 141, 142, 141, 141, 131, 131, 131, 130,
+130, 130, 134, 133, 133, 140, 139, 139, 165, 153,
+153, 161, 152, 152, 140, 139, 139, 133, 132, 132,
+134, 133, 133, 175, 153, 153, 171, 154, 154, 160,
+152, 152, 155, 150, 150, 146, 144, 144, 129, 128,
+128, 47, 46, 46, 58, 56, 56, 66, 63, 63,
+70, 66, 66, 78, 72, 72, 80, 73, 73, 65,
+62, 62, 60, 58, 58, 76, 71, 71, 73, 69,
+69, 70, 67, 67, 89, 79, 79, 91, 80, 80,
+88, 79, 79, 85, 78, 78, 72, 68, 68, 77,
+72, 72, 74, 70, 70, 74, 69, 69, 69, 66,
+66, 91, 80, 80, 69, 66, 66, 83, 76, 76,
+81, 74, 74, 87, 79, 79, 65, 63, 63, 144,
+142, 142, 166, 154, 154, 165, 154, 154, 158, 151,
+151, 155, 150, 150, 161, 153, 153, 177, 153, 153,
+162, 152, 152, 148, 145, 145, 151, 147, 147, 158,
+151, 151, 152, 148, 148, 140, 139, 139, 175, 156,
+156, 142, 141, 141, 148, 145, 145, 155, 149, 149,
+141, 140, 140, 128, 128, 128, 130, 130, 130, 137,
+137, 137, 153, 149, 149, 154, 149, 149, 152, 148,
+148, 162, 153, 153, 164, 153, 153, 163, 153, 153,
+149, 146, 146, 139, 138, 138, 137, 136, 136, 136,
+136, 136, 139, 138, 138, 153, 149, 149, 140, 139,
+139, 144, 143, 143, 159, 151, 151, 167, 153, 153,
+160, 152, 152, 159, 151, 151, 162, 150, 150, 140,
+139, 139, 135, 134, 134, 150, 146, 146, 165, 151,
+151, 156, 149, 149, 148, 145, 145, 136, 136, 136,
+138, 137, 137, 150, 146, 146, 153, 148, 148, 139,
+138, 138, 141, 140, 140, 153, 148, 148, 153, 148,
+148, 151, 147, 147, 158, 151, 151, 165, 153, 153,
+159, 152, 152, 160, 152, 152, 161, 153, 153, 149,
+146, 146, 137, 136, 136, 135, 135, 135, 143, 141,
+141, 138, 137, 137, 136, 135, 135, 137, 137, 137,
+153, 147, 147, 165, 151, 151, 161, 151, 151, 157,
+150, 150, 149, 146, 146, 142, 141, 141, 136, 135,
+135, 138, 138, 138, 146, 144, 144, 150, 146, 146,
+146, 144, 144, 159, 150, 150, 160, 150, 150, 158,
+150, 150, 156, 149, 149, 154, 148, 148, 144, 142,
+142, 139, 138, 138, 135, 135, 135, 139, 137, 137,
+143, 141, 141, 142, 140, 140, 140, 139, 139, 140,
+139, 139, 147, 144, 144, 151, 147, 147, 155, 148,
+148, 156, 149, 149, 147, 144, 144, 135, 135, 135,
+132, 132, 132, 135, 135, 135, 142, 140, 140, 147,
+144, 144, 151, 146, 146, 151, 146, 146, 152, 147,
+147, 150, 145, 145, 151, 146, 146, 150, 146, 146,
+150, 146, 146, 153, 147, 147, 152, 146, 146, 145,
+142, 142, 142, 140, 140, 149, 145, 145, 156, 149,
+149, 154, 147, 147, 147, 144, 144, 145, 142, 142,
+144, 142, 142, 144, 142, 142, 142, 140, 140, 138,
+137, 137, 143, 141, 141, 151, 146, 146, 159, 149,
+149, 166, 150, 150, 171, 150, 150, 161, 150, 150,
+150, 146, 146, 146, 143, 143, 144, 142, 142, 142,
+140, 140, 138, 137, 137, 134, 133, 133, 140, 138,
+138, 146, 143, 143, 149, 144, 144, 152, 146, 146,
+149, 143, 143, 135, 134, 134, 123, 123, 123, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 121, 121, 121,
+132, 131, 131, 144, 141, 141, 148, 144, 144, 147,
+144, 144, 146, 143, 143, 147, 143, 143, 146, 143,
+143, 148, 144, 144, 149, 145, 145, 150, 145, 145,
+150, 146, 146, 150, 146, 146, 148, 144, 144, 146,
+143, 143, 148, 144, 144, 151, 146, 146, 152, 147,
+147, 152, 147, 147, 152, 147, 147, 154, 147, 147,
+155, 148, 148, 157, 149, 149, 160, 149, 149, 159,
+150, 150, 157, 149, 149, 156, 149, 149, 156, 149,
+149, 157, 149, 149, 159, 150, 150, 159, 150, 150,
+158, 150, 150, 155, 149, 149, 149, 145, 145, 143,
+141, 141, 138, 137, 137, 139, 138, 138, 141, 140,
+140, 146, 143, 143, 147, 144, 144, 149, 145, 145,
+152, 148, 148, 151, 147, 147, 143, 141, 141, 136,
+135, 135, 139, 138, 138, 150, 146, 146, 148, 145,
+145, 155, 149, 149, 158, 150, 150, 148, 145, 145,
+139, 137, 137, 142, 140, 140, 150, 146, 146, 158,
+151, 151, 162, 152, 152, 163, 152, 152, 155, 149,
+149, 143, 141, 141, 140, 139, 139, 141, 140, 140,
+148, 145, 145, 152, 148, 148, 153, 148, 148, 154,
+149, 149, 154, 149, 149, 158, 151, 151, 159, 152,
+152, 154, 149, 149, 146, 143, 143, 142, 140, 140,
+145, 143, 143, 147, 144, 144, 144, 142, 142, 153,
+148, 148, 148, 145, 145, 148, 145, 145, 151, 147,
+147, 154, 149, 149, 157, 151, 151, 157, 150, 150,
+156, 150, 150, 156, 150, 150, 153, 149, 149, 147,
+145, 145, 145, 143, 143, 149, 146, 146, 149, 146,
+146, 149, 146, 146, 143, 142, 142, 139, 138, 138,
+144, 143, 143, 147, 145, 145, 142, 141, 141, 147,
+145, 145, 137, 137, 137, 134, 133, 133, 136, 135,
+135, 138, 137, 137, 144, 143, 143, 158, 152, 152,
+158, 152, 152, 154, 149, 149, 150, 147, 147, 148,
+146, 146, 157, 152, 152, 165, 155, 155, 161, 152,
+152, 151, 148, 148, 151, 148, 148, 151, 147, 147,
+144, 143, 143, 147, 144, 144, 160, 151, 151, 168,
+153, 153, 153, 149, 149, 151, 147, 147, 148, 146,
+146, 156, 150, 150, 152, 148, 148, 137, 137, 137,
+134, 133, 133, 155, 150, 150, 143, 142, 142, 163,
+154, 154, 158, 152, 152, 140, 139, 139, 137, 137,
+137, 151, 148, 148, 147, 145, 145, 129, 129, 129,
+127, 127, 127, 138, 137, 137, 159, 152, 152, 173,
+154, 154, 160, 153, 153, 147, 145, 145, 161, 153,
+153, 166, 155, 155, 164, 155, 155, 65, 62, 62,
+74, 69, 69, 85, 76, 76, 88, 79, 79, 84,
+77, 77, 82, 76, 76, 73, 69, 69, 57, 56,
+56, 67, 64, 64, 76, 71, 71, 66, 63, 63,
+69, 66, 66, 79, 73, 73, 79, 73, 73, 84,
+76, 76, 82, 75, 75, 68, 66, 66, 81, 75,
+75, 88, 80, 80, 76, 71, 71, 96, 84, 84,
+79, 73, 73, 162, 154, 154, 157, 152, 152, 149,
+146, 146, 152, 148, 148, 152, 148, 148, 148, 145,
+145, 142, 141, 141, 148, 145, 145, 160, 152, 152,
+137, 137, 137, 133, 132, 132, 137, 136, 136, 155,
+150, 150, 161, 153, 153, 153, 149, 149, 141, 140,
+140, 127, 127, 127, 137, 136, 136, 160, 153, 153,
+158, 152, 152, 156, 151, 151, 154, 150, 150, 149,
+146, 146, 161, 152, 152, 157, 151, 151, 154, 150,
+150, 144, 143, 143, 146, 144, 144, 157, 151, 151,
+165, 154, 154, 169, 153, 153, 157, 151, 151, 152,
+148, 148, 155, 150, 150, 155, 150, 150, 150, 147,
+147, 146, 144, 144, 147, 144, 144, 159, 152, 152,
+158, 151, 151, 158, 151, 151, 154, 149, 149, 149,
+146, 146, 150, 147, 147, 153, 148, 148, 150, 147,
+147, 159, 152, 152, 158, 151, 151, 152, 148, 148,
+150, 146, 146, 155, 149, 149, 158, 151, 151, 167,
+153, 153, 161, 151, 151, 159, 151, 151, 150, 147,
+147, 149, 146, 146, 159, 151, 151, 148, 146, 146,
+145, 144, 144, 154, 149, 149, 160, 151, 151, 157,
+150, 150, 157, 150, 150, 165, 153, 153, 156, 150,
+150, 148, 145, 145, 139, 138, 138, 156, 149, 149,
+159, 151, 151, 149, 145, 145, 145, 143, 143, 140,
+139, 139, 155, 149, 149, 152, 147, 147, 151, 147,
+147, 153, 148, 148, 154, 149, 149, 152, 148, 148,
+151, 147, 147, 152, 147, 147, 146, 143, 143, 150,
+146, 146, 156, 150, 150, 156, 150, 150, 152, 147,
+147, 150, 146, 146, 151, 147, 147, 151, 147, 147,
+150, 146, 146, 149, 146, 146, 150, 146, 146, 150,
+146, 146, 147, 144, 144, 153, 148, 148, 149, 145,
+145, 149, 145, 145, 150, 146, 146, 151, 147, 147,
+152, 146, 146, 151, 146, 146, 154, 148, 148, 153,
+148, 148, 152, 147, 147, 149, 145, 145, 148, 145,
+145, 148, 144, 144, 148, 145, 145, 147, 143, 143,
+146, 143, 143, 147, 143, 143, 149, 145, 145, 152,
+147, 147, 153, 148, 148, 152, 147, 147, 151, 146,
+146, 149, 145, 145, 151, 147, 147, 152, 146, 146,
+149, 145, 145, 146, 143, 143, 148, 145, 145, 150,
+145, 145, 154, 148, 148, 161, 150, 150, 167, 151,
+151, 158, 149, 149, 151, 146, 146, 148, 145, 145,
+148, 144, 144, 148, 144, 144, 147, 144, 144, 146,
+143, 143, 149, 145, 145, 152, 147, 147, 153, 147,
+147, 152, 147, 147, 146, 143, 143, 133, 132, 132,
+121, 121, 121, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+121, 121, 121, 122, 122, 122, 130, 130, 130, 140,
+138, 138, 146, 143, 143, 149, 145, 145, 150, 146,
+146, 150, 146, 146, 150, 146, 146, 151, 146, 146,
+152, 147, 147, 153, 147, 147, 154, 148, 148, 153,
+147, 147, 150, 146, 146, 148, 144, 144, 155, 149,
+149, 162, 151, 151, 159, 151, 151, 153, 148, 148,
+152, 147, 147, 156, 149, 149, 158, 149, 149, 159,
+150, 150, 161, 150, 150, 162, 151, 151, 163, 152,
+152, 164, 153, 153, 166, 153, 153, 165, 153, 153,
+164, 152, 152, 164, 152, 152, 162, 152, 152, 161,
+151, 151, 151, 147, 147, 143, 141, 141, 137, 136,
+136, 138, 137, 137, 143, 141, 141, 147, 144, 144,
+148, 145, 145, 151, 147, 147, 155, 150, 150, 152,
+148, 148, 139, 138, 138, 129, 129, 129, 136, 135,
+135, 142, 140, 140, 148, 145, 145, 159, 151, 151,
+156, 150, 150, 144, 142, 142, 135, 135, 135, 142,
+140, 140, 148, 145, 145, 153, 148, 148, 161, 152,
+152, 168, 154, 154, 156, 150, 150, 153, 149, 149,
+156, 150, 150, 162, 152, 152, 158, 151, 151, 153,
+148, 148, 153, 148, 148, 156, 150, 150, 153, 148,
+148, 156, 150, 150, 156, 150, 150, 151, 147, 147,
+144, 142, 142, 140, 139, 139, 146, 144, 144, 153,
+149, 149, 159, 152, 152, 159, 152, 152, 157, 151,
+151, 158, 152, 152, 160, 152, 152, 161, 153, 153,
+167, 154, 154, 168, 153, 153, 165, 153, 153, 160,
+152, 152, 153, 149, 149, 148, 146, 146, 145, 144,
+144, 142, 141, 141, 142, 140, 140, 135, 135, 135,
+131, 131, 131, 137, 136, 136, 140, 139, 139, 142,
+141, 141, 149, 146, 146, 155, 150, 150, 155, 151,
+151, 156, 150, 150, 150, 147, 147, 156, 151, 151,
+158, 151, 151, 153, 149, 149, 154, 149, 149, 157,
+151, 151, 159, 153, 153, 165, 155, 155, 163, 154,
+154, 157, 152, 152, 154, 150, 150, 157, 151, 151,
+166, 155, 155, 168, 155, 155, 148, 145, 145, 161,
+153, 153, 159, 152, 152, 153, 149, 149, 150, 147,
+147, 147, 145, 145, 151, 148, 148, 160, 153, 153,
+145, 144, 144, 162, 153, 153, 162, 154, 154, 157,
+152, 152, 154, 150, 150, 145, 144, 144, 128, 128,
+128, 138, 138, 138, 162, 154, 154, 161, 154, 154,
+161, 153, 153, 161, 153, 153, 155, 151, 151, 151,
+148, 148, 168, 156, 156, 158, 152, 152, 164, 155,
+155, 159, 153, 153, 160, 153, 153, 157, 152, 152,
+150, 147, 147, 72, 68, 68, 80, 74, 74, 80,
+74, 74, 69, 66, 66, 69, 66, 66, 62, 60,
+60, 71, 67, 67, 72, 67, 67, 68, 65, 65,
+80, 73, 73, 85, 77, 77, 65, 62, 62, 62,
+59, 59, 70, 66, 66, 68, 65, 65, 79, 73,
+73, 71, 68, 68, 83, 76, 76, 171, 155, 155,
+154, 150, 150, 145, 144, 144, 151, 148, 148, 155,
+151, 151, 158, 153, 153, 170, 156, 156, 163, 154,
+154, 151, 148, 148, 155, 151, 151, 155, 151, 151,
+147, 145, 145, 148, 145, 145, 152, 148, 148, 175,
+155, 155, 173, 157, 157, 163, 155, 155, 157, 152,
+152, 155, 151, 151, 155, 150, 150, 161, 153, 153,
+163, 154, 154, 150, 147, 147, 156, 151, 151, 159,
+152, 152, 155, 151, 151, 152, 148, 148, 149, 146,
+146, 141, 140, 140, 138, 137, 137, 148, 146, 146,
+159, 152, 152, 158, 152, 152, 154, 150, 150, 152,
+148, 148, 152, 149, 149, 152, 149, 149, 153, 150,
+150, 156, 151, 151, 164, 154, 154, 164, 153, 153,
+156, 150, 150, 151, 148, 148, 154, 150, 150, 150,
+148, 148, 144, 142, 142, 153, 149, 149, 161, 153,
+153, 156, 151, 151, 147, 145, 145, 143, 141, 141,
+145, 143, 143, 149, 146, 146, 159, 151, 151, 160,
+151, 151, 159, 152, 152, 157, 151, 151, 158, 150,
+150, 161, 151, 151, 149, 146, 146, 149, 146, 146,
+153, 148, 148, 161, 152, 152, 166, 152, 152, 169,
+153, 153, 172, 155, 155, 162, 152, 152, 145, 143,
+143, 136, 135, 135, 146, 144, 144, 145, 143, 143,
+141, 140, 140, 137, 137, 137, 140, 139, 139, 156,
+150, 150, 159, 152, 152, 154, 149, 149, 154, 149,
+149, 157, 151, 151, 155, 149, 149, 147, 145, 145,
+147, 145, 145, 150, 147, 147, 154, 149, 149, 163,
+153, 153, 160, 152, 152, 159, 150, 150, 160, 151,
+151, 158, 151, 151, 157, 151, 151, 157, 150, 150,
+153, 148, 148, 151, 147, 147, 148, 145, 145, 153,
+148, 148, 155, 148, 148, 155, 149, 149, 160, 151,
+151, 160, 151, 151, 158, 150, 150, 155, 149, 149,
+156, 150, 150, 154, 149, 149, 151, 147, 147, 147,
+144, 144, 146, 143, 143, 147, 144, 144, 148, 145,
+145, 143, 141, 141, 139, 138, 138, 143, 141, 141,
+149, 145, 145, 153, 148, 148, 153, 148, 148, 151,
+147, 147, 150, 147, 147, 150, 147, 147, 154, 148,
+148, 158, 150, 150, 158, 150, 150, 156, 150, 150,
+153, 148, 148, 150, 146, 146, 150, 146, 146, 156,
+149, 149, 162, 151, 151, 157, 149, 149, 151, 146,
+146, 150, 146, 146, 152, 147, 147, 154, 148, 148,
+156, 149, 149, 157, 149, 149, 156, 149, 149, 156,
+148, 148, 154, 148, 148, 151, 146, 146, 142, 140,
+140, 131, 131, 131, 122, 122, 122, 121, 121, 121,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
+122, 122, 130, 129, 129, 141, 139, 139, 150, 146,
+146, 151, 147, 147, 152, 147, 147, 150, 146, 146,
+148, 145, 145, 149, 146, 146, 150, 146, 146, 153,
+147, 147, 155, 149, 149, 156, 149, 149, 154, 148,
+148, 151, 147, 147, 156, 149, 149, 161, 152, 152,
+160, 151, 151, 157, 150, 150, 155, 149, 149, 154,
+148, 148, 153, 147, 147, 154, 148, 148, 155, 149,
+149, 157, 150, 150, 159, 151, 151, 158, 151, 151,
+156, 150, 150, 155, 149, 149, 163, 152, 152, 166,
+153, 153, 166, 153, 153, 164, 153, 153, 156, 150,
+150, 150, 146, 146, 148, 145, 145, 147, 144, 144,
+146, 144, 144, 146, 143, 143, 146, 144, 144, 147,
+145, 145, 150, 147, 147, 153, 148, 148, 149, 146,
+146, 148, 145, 145, 148, 145, 145, 147, 144, 144,
+150, 147, 147, 154, 149, 149, 150, 146, 146, 143,
+142, 142, 142, 140, 140, 142, 141, 141, 143, 142,
+142, 145, 143, 143, 153, 148, 148, 151, 147, 147,
+147, 145, 145, 150, 147, 147, 155, 149, 149, 157,
+151, 151, 155, 149, 149, 151, 147, 147, 161, 153,
+153, 158, 151, 151, 149, 146, 146, 147, 144, 144,
+148, 145, 145, 143, 141, 141, 135, 135, 135, 135,
+135, 135, 144, 143, 143, 153, 149, 149, 161, 153,
+153, 159, 152, 152, 157, 151, 151, 157, 151, 151,
+154, 149, 149, 162, 153, 153, 161, 153, 153, 155,
+150, 150, 156, 151, 151, 151, 148, 148, 150, 147,
+147, 152, 148, 148, 152, 149, 149, 151, 147, 147,
+153, 149, 149, 155, 150, 150, 151, 148, 148, 151,
+148, 148, 148, 146, 146, 148, 145, 145, 153, 150,
+150, 154, 150, 150, 159, 153, 153, 154, 150, 150,
+165, 155, 155, 162, 153, 153, 155, 150, 150, 156,
+151, 151, 165, 155, 155, 169, 156, 156, 159, 153,
+153, 151, 148, 148, 148, 146, 146, 146, 144, 144,
+150, 147, 147, 159, 152, 152, 159, 153, 153, 157,
+152, 152, 167, 156, 156, 163, 154, 154, 151, 148,
+148, 145, 144, 144, 147, 145, 145, 158, 152, 152,
+156, 152, 152, 153, 150, 150, 166, 156, 156, 170,
+156, 156, 154, 150, 150, 156, 151, 151, 147, 145,
+145, 139, 138, 138, 157, 152, 152, 177, 158, 158,
+176, 157, 157, 173, 157, 157, 166, 156, 156, 141,
+141, 141, 158, 153, 153, 159, 153, 153, 153, 150,
+150, 146, 144, 144, 147, 146, 146, 163, 156, 156,
+158, 153, 153, 158, 154, 154, 159, 154, 154, 158,
+153, 153, 166, 156, 156, 68, 65, 65, 66, 63,
+63, 66, 62, 62, 62, 59, 59, 60, 58, 58,
+74, 69, 69, 80, 74, 74, 64, 61, 61, 54,
+52, 52, 67, 64, 64, 158, 153, 153, 149, 147,
+147, 136, 136, 136, 153, 150, 150, 165, 157, 157,
+154, 150, 150, 152, 149, 149, 149, 147, 147, 147,
+146, 146, 150, 147, 147, 160, 153, 153, 166, 156,
+156, 166, 156, 156, 162, 155, 155, 163, 156, 156,
+159, 154, 154, 156, 152, 152, 162, 155, 155, 172,
+157, 157, 165, 156, 156, 165, 156, 156, 165, 156,
+156, 168, 156, 156, 159, 152, 152, 163, 155, 155,
+158, 152, 152, 146, 144, 144, 156, 151, 151, 151,
+148, 148, 148, 146, 146, 151, 148, 148, 159, 153,
+153, 156, 151, 151, 148, 146, 146, 144, 142, 142,
+142, 141, 141, 139, 139, 139, 142, 142, 142, 157,
+153, 153, 163, 155, 155, 163, 154, 154, 163, 154,
+154, 167, 155, 155, 170, 156, 156, 164, 154, 154,
+151, 148, 148, 161, 154, 154, 159, 153, 153, 161,
+153, 153, 162, 154, 154, 163, 155, 155, 157, 151,
+151, 145, 143, 143, 142, 141, 141, 146, 144, 144,
+152, 148, 148, 156, 151, 151, 156, 150, 150, 150,
+147, 147, 151, 148, 148, 161, 153, 153, 162, 153,
+153, 152, 149, 149, 153, 149, 149, 151, 148, 148,
+149, 146, 146, 150, 147, 147, 158, 152, 152, 164,
+155, 155, 159, 152, 152, 149, 146, 146, 146, 144,
+144, 156, 150, 150, 154, 149, 149, 153, 149, 149,
+148, 145, 145, 146, 144, 144, 149, 146, 146, 157,
+151, 151, 151, 148, 148, 151, 147, 147, 155, 150,
+150, 151, 147, 147, 147, 145, 145, 145, 143, 143,
+149, 146, 146, 151, 147, 147, 155, 150, 150, 148,
+145, 145, 151, 147, 147, 151, 147, 147, 151, 147,
+147, 154, 149, 149, 155, 150, 150, 150, 147, 147,
+149, 146, 146, 151, 147, 147, 155, 149, 149, 154,
+149, 149, 156, 150, 150, 158, 152, 152, 156, 150,
+150, 153, 148, 148, 152, 147, 147, 150, 147, 147,
+146, 144, 144, 143, 141, 141, 141, 140, 140, 147,
+144, 144, 151, 147, 147, 148, 145, 145, 143, 141,
+141, 145, 143, 143, 145, 143, 143, 149, 145, 145,
+154, 149, 149, 154, 149, 149, 150, 146, 146, 146,
+144, 144, 149, 145, 145, 150, 146, 146, 153, 148,
+148, 155, 149, 149, 154, 149, 149, 149, 146, 146,
+148, 145, 145, 154, 148, 148, 160, 151, 151, 156,
+149, 149, 150, 146, 146, 149, 145, 145, 152, 147,
+147, 153, 148, 148, 154, 148, 148, 154, 148, 148,
+151, 146, 146, 149, 145, 145, 147, 144, 144, 144,
+142, 142, 137, 136, 136, 128, 128, 128, 122, 122,
+122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 122, 122, 122, 129, 129,
+129, 140, 139, 139, 151, 146, 146, 152, 147, 147,
+152, 148, 148, 149, 145, 145, 145, 143, 143, 146,
+143, 143, 148, 145, 145, 151, 146, 146, 155, 148,
+148, 157, 149, 149, 156, 150, 150, 155, 149, 149,
+156, 150, 150, 157, 150, 150, 159, 151, 151, 160,
+151, 151, 156, 149, 149, 151, 146, 146, 147, 144,
+144, 148, 144, 144, 148, 145, 145, 150, 146, 146,
+152, 147, 147, 148, 145, 145, 144, 142, 142, 151,
+146, 146, 162, 152, 152, 167, 153, 153, 166, 153,
+153, 164, 153, 153, 160, 152, 152, 157, 151, 151,
+154, 149, 149, 149, 146, 146, 147, 144, 144, 147,
+144, 144, 147, 144, 144, 144, 142, 142, 147, 144,
+144, 158, 151, 151, 166, 155, 155, 160, 152, 152,
+153, 148, 148, 151, 147, 147, 150, 146, 146, 149,
+146, 146, 146, 144, 144, 144, 142, 142, 141, 140,
+140, 141, 140, 140, 142, 141, 141, 144, 142, 142,
+140, 139, 139, 136, 135, 135, 134, 134, 134, 139,
+138, 138, 148, 145, 145, 153, 148, 148, 153, 148,
+148, 161, 152, 152, 170, 154, 154, 154, 149, 149,
+136, 136, 136, 134, 133, 133, 134, 133, 133, 133,
+133, 133, 129, 129, 129, 129, 129, 129, 135, 135,
+135, 148, 145, 145, 155, 150, 150, 156, 150, 150,
+154, 149, 149, 146, 144, 144, 149, 146, 146, 153,
+148, 148, 141, 140, 140, 148, 146, 146, 147, 145,
+145, 149, 146, 146, 156, 151, 151, 161, 153, 153,
+170, 155, 155, 170, 155, 155, 169, 156, 156, 157,
+151, 151, 159, 152, 152, 150, 147, 147, 145, 143,
+143, 143, 142, 142, 144, 143, 143, 145, 144, 144,
+149, 147, 147, 165, 154, 154, 174, 154, 154, 161,
+154, 154, 153, 149, 149, 165, 154, 154, 166, 155,
+155, 155, 151, 151, 150, 147, 147, 148, 145, 145,
+152, 148, 148, 146, 144, 144, 148, 145, 145, 152,
+148, 148, 166, 155, 155, 173, 156, 156, 165, 154,
+154, 155, 150, 150, 151, 148, 148, 153, 149, 149,
+160, 152, 152, 153, 149, 149, 154, 150, 150, 164,
+154, 154, 161, 153, 153, 159, 153, 153, 162, 154,
+154, 156, 151, 151, 143, 142, 142, 156, 151, 151,
+159, 152, 152, 152, 149, 149, 150, 147, 147, 156,
+151, 151, 159, 152, 152, 153, 149, 149, 142, 141,
+141, 134, 134, 134, 138, 138, 138, 158, 153, 153,
+154, 150, 150, 154, 150, 150, 154, 150, 150, 149,
+147, 147, 148, 146, 146, 153, 149, 149, 151, 148,
+148, 142, 141, 141, 142, 141, 141, 143, 142, 142,
+156, 150, 150, 154, 150, 150, 151, 148, 148, 147,
+145, 145, 146, 144, 144, 142, 141, 141, 135, 134,
+134, 136, 136, 136, 159, 153, 153, 159, 153, 153,
+158, 153, 153, 159, 153, 153, 153, 149, 149, 146,
+144, 144, 145, 143, 143, 147, 145, 145, 148, 146,
+146, 154, 150, 150, 160, 153, 153, 149, 147, 147,
+140, 139, 139, 136, 136, 136, 146, 144, 144, 150,
+147, 147, 148, 145, 145, 146, 144, 144, 148, 146,
+146, 154, 150, 150, 159, 152, 152, 165, 154, 154,
+158, 152, 152, 150, 147, 147, 145, 143, 143, 148,
+145, 145, 147, 145, 145, 146, 144, 144, 156, 151,
+151, 157, 152, 152, 151, 148, 148, 146, 144, 144,
+138, 137, 137, 135, 134, 134, 147, 145, 145, 161,
+153, 153, 165, 154, 154, 162, 152, 152, 156, 151,
+151, 155, 151, 151, 156, 151, 151, 154, 150, 150,
+155, 150, 150, 161, 153, 153, 168, 155, 155, 166,
+155, 155, 160, 154, 154, 160, 153, 153, 153, 149,
+149, 150, 147, 147, 150, 147, 147, 158, 152, 152,
+159, 153, 153, 154, 150, 150, 141, 140, 140, 135,
+134, 134, 147, 145, 145, 156, 151, 151, 157, 151,
+151, 155, 150, 150, 148, 146, 146, 135, 134, 134,
+131, 131, 131, 148, 145, 145, 163, 154, 154, 163,
+154, 154, 162, 153, 153, 160, 152, 152, 167, 154,
+154, 158, 151, 151, 154, 149, 149, 152, 148, 148,
+147, 144, 144, 147, 144, 144, 150, 147, 147, 151,
+147, 147, 149, 146, 146, 151, 147, 147, 151, 147,
+147, 143, 142, 142, 140, 139, 139, 141, 140, 140,
+147, 144, 144, 148, 145, 145, 145, 143, 143, 145,
+143, 143, 146, 144, 144, 148, 145, 145, 153, 148,
+148, 154, 148, 148, 152, 147, 147, 150, 146, 146,
+148, 145, 145, 146, 144, 144, 148, 145, 145, 152,
+148, 148, 155, 150, 150, 153, 148, 148, 150, 146,
+146, 146, 144, 144, 142, 141, 141, 139, 138, 138,
+136, 135, 135, 143, 142, 142, 150, 147, 147, 150,
+147, 147, 147, 144, 144, 145, 143, 143, 144, 142,
+142, 144, 142, 142, 150, 146, 146, 155, 150, 150,
+150, 146, 146, 145, 143, 143, 143, 141, 141, 143,
+141, 141, 145, 143, 143, 151, 147, 147, 152, 148,
+148, 148, 144, 144, 144, 142, 142, 150, 146, 146,
+156, 149, 149, 153, 147, 147, 148, 144, 144, 148,
+144, 144, 150, 146, 146, 150, 146, 146, 149, 145,
+145, 147, 144, 144, 143, 141, 141, 139, 138, 138,
+138, 137, 137, 136, 135, 135, 131, 131, 131, 125,
+125, 125, 122, 122, 122, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 122, 122, 122, 126, 126, 126, 137, 136, 136,
+149, 145, 145, 152, 147, 147, 155, 148, 148, 153,
+148, 148, 151, 147, 147, 152, 147, 147, 152, 147,
+147, 153, 147, 147, 152, 147, 147, 152, 147, 147,
+153, 148, 148, 154, 148, 148, 153, 148, 148, 153,
+148, 148, 155, 149, 149, 157, 150, 150, 155, 148,
+148, 150, 146, 146, 146, 143, 143, 142, 141, 141,
+141, 140, 140, 147, 144, 144, 151, 147, 147, 148,
+145, 145, 145, 143, 143, 148, 145, 145, 153, 148,
+148, 159, 151, 151, 165, 153, 153, 164, 153, 153,
+158, 151, 151, 156, 150, 150, 154, 149, 149, 151,
+147, 147, 146, 144, 144, 143, 141, 141, 145, 143,
+143, 145, 143, 143, 147, 145, 145, 156, 150, 150,
+157, 151, 151, 149, 146, 146, 150, 147, 147, 147,
+144, 144, 145, 143, 143, 146, 143, 143, 145, 143,
+143, 145, 143, 143, 148, 145, 145, 149, 146, 146,
+150, 147, 147, 150, 146, 146, 150, 146, 146, 146,
+143, 143, 146, 144, 144, 149, 145, 145, 150, 147,
+147, 151, 147, 147, 154, 149, 149, 158, 151, 151,
+156, 150, 150, 146, 144, 144, 143, 141, 141, 144,
+142, 142, 144, 143, 143, 143, 142, 142, 144, 142,
+142, 143, 141, 141, 147, 145, 145, 156, 150, 150,
+159, 152, 152, 157, 151, 151, 145, 144, 144, 147,
+145, 145, 156, 149, 149, 143, 142, 142, 148, 145,
+145, 148, 145, 145, 152, 148, 148, 150, 147, 147,
+149, 146, 146, 157, 151, 151, 155, 150, 150, 153,
+149, 149, 147, 145, 145, 156, 151, 151, 157, 151,
+151, 152, 148, 148, 150, 147, 147, 148, 145, 145,
+145, 144, 144, 148, 145, 145, 155, 150, 150, 161,
+153, 153, 155, 150, 150, 138, 137, 137, 153, 149,
+149, 163, 154, 154, 161, 153, 153, 153, 149, 149,
+152, 148, 148, 153, 149, 149, 153, 148, 148, 149,
+146, 146, 142, 141, 141, 153, 149, 149, 159, 152,
+152, 167, 155, 155, 161, 153, 153, 154, 150, 150,
+158, 152, 152, 158, 152, 152, 157, 151, 151, 153,
+150, 150, 144, 143, 143, 137, 136, 136, 140, 139,
+139, 156, 150, 150, 152, 148, 148, 140, 139, 139,
+139, 138, 138, 142, 141, 141, 145, 144, 144, 156,
+151, 151, 167, 156, 156, 164, 154, 154, 144, 143,
+143, 137, 136, 136, 135, 135, 135, 157, 152, 152,
+158, 153, 153, 158, 153, 153, 158, 152, 152, 156,
+151, 151, 151, 148, 148, 154, 150, 150, 161, 153,
+153, 157, 151, 151, 156, 151, 151, 140, 139, 139,
+159, 153, 153, 147, 145, 145, 152, 149, 149, 153,
+149, 149, 151, 148, 148, 144, 143, 143, 137, 136,
+136, 140, 139, 139, 154, 150, 150, 150, 147, 147,
+128, 128, 128, 139, 139, 139, 155, 150, 150, 153,
+149, 149, 160, 153, 153, 154, 150, 150, 148, 145,
+145, 153, 149, 149, 159, 152, 152, 149, 146, 146,
+138, 138, 138, 137, 137, 137, 151, 148, 148, 155,
+150, 150, 157, 152, 152, 150, 148, 148, 144, 143,
+143, 150, 148, 148, 156, 151, 151, 155, 150, 150,
+158, 152, 152, 154, 150, 150, 147, 145, 145, 148,
+146, 146, 137, 137, 137, 141, 140, 140, 146, 144,
+144, 148, 146, 146, 150, 147, 147, 149, 146, 146,
+145, 143, 143, 141, 140, 140, 140, 139, 139, 145,
+144, 144, 157, 151, 151, 155, 150, 150, 143, 142,
+142, 139, 139, 139, 147, 145, 145, 146, 144, 144,
+143, 142, 142, 147, 145, 145, 149, 147, 147, 155,
+151, 151, 158, 153, 153, 150, 147, 147, 154, 150,
+150, 149, 146, 146, 150, 147, 147, 150, 147, 147,
+149, 146, 146, 144, 142, 142, 139, 138, 138, 145,
+143, 143, 155, 150, 150, 160, 152, 152, 159, 152,
+152, 153, 149, 149, 147, 145, 145, 141, 140, 140,
+153, 148, 148, 160, 152, 152, 158, 151, 151, 158,
+151, 151, 154, 149, 149, 158, 152, 152, 158, 152,
+152, 149, 146, 146, 145, 144, 144, 157, 151, 151,
+154, 149, 149, 151, 147, 147, 148, 145, 145, 146,
+144, 144, 147, 144, 144, 147, 144, 144, 143, 142,
+142, 147, 144, 144, 149, 145, 145, 156, 150, 150,
+152, 147, 147, 148, 145, 145, 149, 146, 146, 150,
+147, 147, 151, 147, 147, 152, 148, 148, 151, 147,
+147, 149, 146, 146, 148, 145, 145, 154, 149, 149,
+152, 148, 148, 151, 148, 148, 153, 149, 149, 153,
+148, 148, 150, 146, 146, 148, 145, 145, 147, 145,
+145, 146, 143, 143, 143, 141, 141, 144, 142, 142,
+148, 145, 145, 151, 147, 147, 151, 147, 147, 150,
+146, 146, 150, 146, 146, 151, 146, 146, 155, 149,
+149, 161, 152, 152, 154, 148, 148, 144, 142, 142,
+141, 140, 140, 143, 141, 141, 146, 144, 144, 153,
+148, 148, 158, 150, 150, 153, 147, 147, 147, 144,
+144, 151, 147, 147, 155, 149, 149, 150, 146, 146,
+143, 141, 141, 143, 141, 141, 149, 146, 146, 151,
+146, 146, 150, 146, 146, 149, 145, 145, 145, 142,
+142, 141, 140, 140, 142, 140, 140, 142, 140, 140,
+134, 133, 133, 125, 125, 125, 122, 122, 122, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 122, 122, 122,
+125, 125, 125, 134, 134, 134, 145, 142, 142, 151,
+146, 146, 155, 148, 148, 157, 149, 149, 159, 151,
+151, 158, 151, 151, 158, 150, 150, 154, 148, 148,
+147, 144, 144, 145, 143, 143, 149, 146, 146, 152,
+147, 147, 150, 146, 146, 149, 145, 145, 151, 147,
+147, 153, 148, 148, 153, 148, 148, 151, 147, 147,
+145, 143, 143, 136, 136, 136, 138, 137, 137, 146,
+143, 143, 150, 147, 147, 151, 147, 147, 149, 146,
+146, 145, 143, 143, 141, 140, 140, 154, 149, 149,
+166, 153, 153, 164, 153, 153, 161, 152, 152, 160,
+152, 152, 158, 151, 151, 152, 148, 148, 141, 140,
+140, 138, 137, 137, 145, 143, 143, 147, 145, 145,
+147, 144, 144, 148, 145, 145, 149, 146, 146, 151,
+147, 147, 145, 143, 143, 137, 136, 136, 136, 136,
+136, 143, 141, 141, 146, 144, 144, 149, 146, 146,
+152, 148, 148, 153, 149, 149, 154, 150, 150, 157,
+151, 151, 158, 151, 151, 157, 150, 150, 152, 148,
+148, 149, 146, 146, 152, 147, 147, 155, 150, 150,
+155, 150, 150, 155, 150, 150, 154, 150, 150, 149,
+146, 146, 150, 147, 147, 151, 148, 148, 157, 150,
+150, 163, 153, 153, 159, 152, 152, 153, 149, 149,
+157, 152, 152, 163, 154, 154, 160, 153, 153, 152,
+149, 149, 149, 146, 146, 147, 145, 145, 144, 142,
+142, 148, 145, 145, 145, 143, 143, 155, 150, 150,
+160, 153, 153, 150, 147, 147, 143, 142, 142, 147,
+145, 145, 153, 149, 149, 156, 151, 151, 167, 156,
+156, 161, 153, 153, 151, 148, 148, 149, 147, 147,
+150, 147, 147, 155, 150, 150, 157, 151, 151, 157,
+151, 151, 157, 151, 151, 154, 150, 150, 151, 148,
+148, 158, 152, 152, 169, 156, 156, 162, 154, 154,
+156, 151, 151, 139, 138, 138, 132, 131, 131, 136,
+136, 136, 138, 138, 138, 148, 146, 146, 156, 151,
+151, 160, 152, 152, 164, 155, 155, 159, 153, 153,
+146, 144, 144, 145, 144, 144, 149, 147, 147, 154,
+150, 150, 151, 148, 148, 153, 150, 150, 150, 148,
+148, 150, 148, 148, 155, 151, 151, 149, 146, 146,
+135, 135, 135, 132, 132, 132, 143, 142, 142, 155,
+151, 151, 163, 155, 155, 168, 158, 158, 157, 152,
+152, 155, 151, 151, 153, 150, 150, 153, 150, 150,
+158, 153, 153, 155, 151, 151, 153, 150, 150, 154,
+150, 150, 157, 152, 152, 158, 153, 153, 153, 149,
+149, 152, 149, 149, 155, 151, 151, 159, 153, 153,
+153, 150, 150, 151, 148, 148, 149, 147, 147, 161,
+154, 154, 156, 151, 151, 152, 149, 149, 153, 150,
+150, 148, 146, 146, 146, 144, 144, 151, 148, 148,
+146, 144, 144, 143, 142, 142, 144, 143, 143, 148,
+146, 146, 156, 151, 151, 153, 149, 149, 168, 155,
+155, 167, 155, 155, 174, 155, 155, 171, 156, 156,
+156, 152, 152, 153, 149, 149, 156, 150, 150, 160,
+152, 152, 165, 156, 156, 153, 150, 150, 159, 153,
+153, 152, 149, 149, 160, 153, 153, 156, 151, 151,
+165, 154, 154, 162, 154, 154, 149, 146, 146, 143,
+142, 142, 149, 146, 146, 156, 151, 151, 162, 153,
+153, 162, 154, 154, 158, 152, 152, 161, 153, 153,
+161, 153, 153, 155, 151, 151, 152, 149, 149, 152,
+149, 149, 152, 148, 148, 144, 143, 143, 136, 135,
+135, 139, 139, 139, 147, 145, 145, 149, 147, 147,
+149, 147, 147, 150, 148, 148, 152, 149, 149, 159,
+153, 153, 156, 151, 151, 159, 152, 152, 159, 152,
+152, 160, 153, 153, 155, 150, 150, 150, 147, 147,
+149, 146, 146, 149, 147, 147, 152, 148, 148, 153,
+149, 149, 157, 151, 151, 157, 151, 151, 159, 152,
+152, 165, 153, 153, 159, 151, 151, 154, 150, 150,
+146, 144, 144, 145, 143, 143, 148, 145, 145, 156,
+151, 151, 166, 155, 155, 166, 154, 154, 155, 150,
+150, 151, 147, 147, 171, 155, 155, 170, 155, 155,
+152, 148, 148, 141, 140, 140, 136, 136, 136, 133,
+133, 133, 139, 138, 138, 146, 144, 144, 154, 148,
+148, 159, 151, 151, 158, 151, 151, 153, 148, 148,
+151, 148, 148, 151, 147, 147, 151, 147, 147, 148,
+145, 145, 146, 143, 143, 144, 142, 142, 141, 140,
+140, 154, 149, 149, 168, 155, 155, 161, 152, 152,
+155, 150, 150, 150, 147, 147, 145, 143, 143, 146,
+143, 143, 149, 146, 146, 150, 146, 146, 150, 146,
+146, 148, 145, 145, 149, 146, 146, 149, 146, 146,
+152, 148, 148, 155, 149, 149, 157, 150, 150, 158,
+151, 151, 163, 153, 153, 167, 153, 153, 160, 151,
+151, 145, 142, 142, 138, 138, 138, 142, 140, 140,
+147, 144, 144, 155, 149, 149, 163, 151, 151, 158,
+150, 150, 153, 148, 148, 154, 148, 148, 154, 149,
+149, 147, 144, 144, 137, 136, 136, 139, 138, 138,
+149, 145, 145, 154, 148, 148, 154, 148, 148, 152,
+147, 147, 149, 145, 145, 147, 143, 143, 148, 145,
+145, 148, 145, 145, 136, 135, 135, 125, 125, 125,
+122, 122, 122, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 124, 124, 124, 134,
+133, 133, 145, 143, 143, 150, 146, 146, 153, 147,
+147, 152, 147, 147, 151, 147, 147, 153, 148, 148,
+155, 149, 149, 154, 148, 148, 150, 146, 146, 150,
+146, 146, 154, 148, 148, 155, 149, 149, 149, 145,
+145, 144, 142, 142, 144, 142, 142, 144, 142, 142,
+148, 145, 145, 150, 146, 146, 147, 144, 144, 142,
+140, 140, 146, 144, 144, 152, 148, 148, 152, 148,
+148, 148, 145, 145, 145, 143, 143, 143, 141, 141,
+143, 141, 141, 150, 146, 146, 156, 149, 149, 155,
+149, 149, 154, 148, 148, 153, 148, 148, 152, 148,
+148, 146, 144, 144, 139, 138, 138, 144, 142, 142,
+154, 149, 149, 155, 150, 150, 150, 147, 147, 150,
+147, 147, 152, 148, 148, 150, 147, 147, 148, 145,
+145, 143, 142, 142, 145, 143, 143, 148, 145, 145,
+152, 148, 148, 157, 151, 151, 156, 150, 150, 153,
+149, 149, 154, 149, 149, 152, 148, 148, 147, 145,
+145, 149, 146, 146, 149, 146, 146, 153, 149, 149,
+157, 151, 151, 156, 150, 150, 155, 150, 150, 154,
+150, 150, 150, 147, 147, 149, 146, 146, 150, 147,
+147, 154, 149, 149, 156, 150, 150, 153, 149, 149,
+151, 147, 147, 155, 150, 150, 162, 153, 153, 158,
+152, 152, 156, 151, 151, 156, 151, 151, 145, 143,
+143, 142, 141, 141, 147, 145, 145, 141, 140, 140,
+152, 148, 148, 160, 153, 153, 156, 151, 151, 150,
+148, 148, 151, 148, 148, 149, 147, 147, 151, 148,
+148, 161, 153, 153, 160, 153, 153, 157, 151, 151,
+156, 151, 151, 157, 152, 152, 157, 152, 152, 158,
+152, 152, 158, 153, 153, 156, 152, 152, 161, 153,
+153, 161, 153, 153, 159, 153, 153, 152, 149, 149,
+150, 147, 147, 147, 145, 145, 137, 136, 136, 132,
+131, 131, 134, 133, 133, 144, 142, 142, 154, 150,
+150, 154, 150, 150, 141, 140, 140, 160, 154, 154,
+161, 153, 153, 159, 153, 153, 167, 155, 155, 162,
+154, 154, 151, 148, 148, 148, 146, 146, 153, 150,
+150, 158, 152, 152, 160, 154, 154, 155, 151, 151,
+138, 137, 137, 131, 130, 130, 138, 138, 138, 150,
+147, 147, 146, 144, 144, 155, 151, 151, 159, 153,
+153, 159, 152, 152, 163, 154, 154, 169, 156, 156,
+169, 156, 156, 165, 154, 154, 164, 155, 155, 163,
+155, 155, 166, 156, 156, 180, 155, 155, 171, 157,
+157, 156, 152, 152, 161, 153, 153, 170, 156, 156,
+168, 156, 156, 165, 155, 155, 153, 149, 149, 165,
+156, 156, 148, 146, 146, 158, 152, 152, 165, 156,
+156, 159, 153, 153, 160, 154, 154, 163, 154, 154,
+151, 148, 148, 135, 135, 135, 142, 142, 142, 162,
+155, 155, 160, 154, 154, 147, 145, 145, 166, 156,
+156, 142, 141, 141, 156, 151, 151, 159, 152, 152,
+159, 152, 152, 152, 148, 148, 148, 146, 146, 149,
+146, 146, 148, 146, 146, 155, 150, 150, 162, 154,
+154, 162, 153, 153, 170, 154, 154, 152, 149, 149,
+164, 154, 154, 160, 153, 153, 152, 149, 149, 160,
+153, 153, 145, 143, 143, 139, 138, 138, 150, 147,
+147, 159, 153, 153, 161, 154, 154, 166, 155, 155,
+165, 155, 155, 161, 153, 153, 156, 151, 151, 155,
+150, 150, 163, 153, 153, 143, 142, 142, 138, 138,
+138, 140, 140, 140, 148, 146, 146, 154, 150, 150,
+154, 150, 150, 152, 149, 149, 157, 152, 152, 157,
+152, 152, 155, 150, 150, 157, 151, 151, 157, 151,
+151, 150, 147, 147, 145, 144, 144, 150, 147, 147,
+148, 146, 146, 152, 148, 148, 152, 148, 148, 155,
+150, 150, 156, 151, 151, 152, 149, 149, 162, 152,
+152, 164, 153, 153, 158, 152, 152, 155, 150, 150,
+157, 151, 151, 159, 152, 152, 163, 153, 153, 166,
+155, 155, 163, 154, 154, 156, 150, 150, 153, 149,
+149, 167, 154, 154, 166, 154, 154, 153, 148, 148,
+146, 144, 144, 142, 141, 141, 141, 140, 140, 141,
+140, 140, 144, 143, 143, 156, 150, 150, 162, 152,
+152, 158, 151, 151, 154, 149, 149, 152, 148, 148,
+149, 147, 147, 150, 147, 147, 150, 147, 147, 147,
+144, 144, 146, 144, 144, 145, 143, 143, 159, 152,
+152, 156, 151, 151, 148, 146, 146, 143, 142, 142,
+137, 137, 137, 136, 136, 136, 147, 144, 144, 154,
+149, 149, 156, 150, 150, 157, 150, 150, 155, 149,
+149, 153, 148, 148, 153, 148, 148, 154, 148, 148,
+154, 148, 148, 153, 148, 148, 154, 148, 148, 157,
+150, 150, 156, 149, 149, 148, 145, 145, 143, 141,
+141, 147, 144, 144, 152, 147, 147, 154, 148, 148,
+156, 149, 149, 154, 148, 148, 153, 148, 148, 153,
+148, 148, 153, 148, 148, 150, 146, 146, 145, 143,
+143, 147, 144, 144, 153, 147, 147, 155, 149, 149,
+153, 147, 147, 151, 146, 146, 151, 146, 146, 151,
+146, 146, 149, 146, 146, 145, 143, 143, 133, 133,
+133, 123, 123, 123, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 124, 124, 124, 134, 134, 134, 145, 143,
+143, 149, 145, 145, 148, 145, 145, 146, 143, 143,
+142, 141, 141, 144, 142, 142, 150, 146, 146, 153,
+147, 147, 155, 148, 148, 156, 149, 149, 159, 150,
+150, 157, 149, 149, 148, 144, 144, 140, 139, 139,
+137, 136, 136, 137, 136, 136, 143, 141, 141, 151,
+147, 147, 152, 147, 147, 153, 148, 148, 154, 149,
+149, 156, 150, 150, 151, 147, 147, 145, 143, 143,
+143, 141, 141, 143, 141, 141, 143, 141, 141, 144,
+142, 142, 144, 142, 142, 144, 142, 142, 144, 142,
+142, 144, 142, 142, 143, 141, 141, 143, 141, 141,
+146, 144, 144, 158, 151, 151, 168, 153, 153, 159,
+151, 151, 151, 147, 147, 151, 147, 147, 150, 147,
+147, 151, 147, 147, 152, 148, 148, 152, 148, 148,
+154, 149, 149, 156, 150, 150, 158, 151, 151, 156,
+150, 150, 148, 145, 145, 149, 146, 146, 144, 143,
+143, 144, 142, 142, 145, 143, 143, 148, 145, 145,
+150, 147, 147, 152, 148, 148, 151, 147, 147, 148,
+145, 145, 147, 145, 145, 149, 146, 146, 147, 145,
+145, 145, 144, 144, 152, 148, 148, 156, 150, 150,
+149, 146, 146, 148, 145, 145, 149, 146, 146, 149,
+146, 146, 144, 142, 142, 140, 139, 139, 143, 142,
+142, 147, 145, 145, 152, 148, 148, 146, 144, 144,
+144, 143, 143, 146, 144, 144, 149, 146, 146, 153,
+149, 149, 152, 149, 149, 152, 148, 148, 153, 149,
+149, 155, 150, 150, 153, 148, 148, 147, 144, 144,
+145, 143, 143, 145, 143, 143, 144, 142, 142, 145,
+143, 143, 149, 146, 146, 143, 142, 142, 133, 133,
+133, 142, 141, 141, 137, 136, 136, 136, 136, 136,
+147, 145, 145, 148, 146, 146, 145, 143, 143, 144,
+143, 143, 145, 143, 143, 150, 147, 147, 162, 153,
+153, 164, 154, 154, 151, 148, 148, 147, 145, 145,
+160, 152, 152, 163, 153, 153, 150, 147, 147, 159,
+151, 151, 147, 145, 145, 145, 143, 143, 144, 142,
+142, 143, 142, 142, 140, 139, 139, 134, 134, 134,
+146, 144, 144, 156, 150, 150, 147, 145, 145, 144,
+142, 142, 138, 138, 138, 139, 138, 138, 138, 138,
+138, 141, 140, 140, 147, 145, 145, 155, 151, 151,
+154, 150, 150, 150, 147, 147, 154, 150, 150, 152,
+149, 149, 154, 150, 150, 164, 154, 154, 156, 151,
+151, 143, 142, 142, 154, 150, 150, 157, 152, 152,
+161, 153, 153, 155, 151, 151, 154, 150, 150, 158,
+152, 152, 140, 139, 139, 151, 148, 148, 151, 148,
+148, 153, 149, 149, 154, 150, 150, 154, 150, 150,
+150, 147, 147, 149, 146, 146, 154, 149, 149, 151,
+148, 148, 149, 146, 146, 144, 143, 143, 144, 143,
+143, 144, 143, 143, 145, 144, 144, 153, 149, 149,
+160, 153, 153, 157, 152, 152, 153, 149, 149, 139,
+139, 139, 130, 130, 130, 137, 136, 136, 145, 144,
+144, 153, 149, 149, 154, 150, 150, 147, 145, 145,
+145, 143, 143, 148, 146, 146, 157, 151, 151, 153,
+149, 149, 134, 133, 133, 129, 129, 129, 131, 131,
+131, 141, 140, 140, 153, 149, 149, 160, 152, 152,
+156, 151, 151, 152, 149, 149, 138, 137, 137, 164,
+154, 154, 158, 152, 152, 154, 150, 150, 156, 150,
+150, 153, 149, 149, 145, 143, 143, 135, 134, 134,
+138, 138, 138, 149, 147, 147, 151, 148, 148, 147,
+145, 145, 145, 143, 143, 146, 144, 144, 146, 144,
+144, 146, 144, 144, 149, 146, 146, 149, 146, 146,
+149, 146, 146, 156, 150, 150, 155, 149, 149, 144,
+142, 142, 146, 144, 144, 152, 148, 148, 163, 153,
+153, 167, 154, 154, 169, 154, 154, 168, 154, 154,
+163, 153, 153, 158, 151, 151, 158, 152, 152, 159,
+152, 152, 157, 151, 151, 153, 149, 149, 153, 149,
+149, 154, 149, 149, 153, 148, 148, 151, 148, 148,
+154, 149, 149, 152, 148, 148, 142, 141, 141, 142,
+141, 141, 155, 149, 149, 156, 150, 150, 154, 148,
+148, 150, 146, 146, 144, 142, 142, 144, 143, 143,
+153, 149, 149, 158, 150, 150, 153, 148, 148, 148,
+145, 145, 148, 145, 145, 149, 146, 146, 140, 139,
+139, 131, 131, 131, 128, 128, 128, 125, 125, 125,
+136, 136, 136, 153, 148, 148, 161, 151, 151, 165,
+152, 152, 164, 152, 152, 159, 151, 151, 156, 149,
+149, 155, 149, 149, 152, 147, 147, 147, 144, 144,
+144, 142, 142, 144, 142, 142, 145, 142, 142, 148,
+145, 145, 151, 147, 147, 155, 149, 149, 160, 151,
+151, 154, 148, 148, 147, 144, 144, 149, 145, 145,
+151, 147, 147, 152, 147, 147, 151, 146, 146, 154,
+148, 148, 157, 149, 149, 158, 150, 150, 158, 150,
+150, 156, 149, 149, 151, 146, 146, 149, 145, 145,
+152, 147, 147, 152, 147, 147, 147, 144, 144, 140,
+139, 139, 132, 131, 131, 124, 124, 124, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 120, 120, 120, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 124, 124,
+124, 132, 132, 132, 143, 141, 141, 147, 144, 144,
+147, 144, 144, 147, 144, 144, 147, 144, 144, 148,
+145, 145, 150, 146, 146, 151, 147, 147, 152, 147,
+147, 153, 148, 148, 155, 149, 149, 155, 148, 148,
+150, 146, 146, 147, 144, 144, 145, 142, 142, 143,
+141, 141, 146, 144, 144, 149, 145, 145, 150, 146,
+146, 151, 147, 147, 153, 148, 148, 155, 150, 150,
+149, 146, 146, 143, 141, 141, 145, 143, 143, 147,
+145, 145, 149, 146, 146, 151, 147, 147, 151, 147,
+147, 151, 147, 147, 150, 146, 146, 149, 146, 146,
+149, 146, 146, 150, 146, 146, 150, 146, 146, 151,
+147, 147, 149, 146, 146, 145, 143, 143, 146, 144,
+144, 146, 144, 144, 149, 146, 146, 148, 146, 146,
+152, 148, 148, 156, 150, 150, 158, 151, 151, 154,
+149, 149, 153, 149, 149, 152, 148, 148, 148, 145,
+145, 145, 143, 143, 143, 142, 142, 149, 146, 146,
+156, 150, 150, 150, 147, 147, 147, 145, 145, 150,
+147, 147, 149, 146, 146, 150, 147, 147, 154, 149,
+149, 152, 148, 148, 147, 145, 145, 146, 144, 144,
+147, 145, 145, 151, 147, 147, 147, 145, 145, 151,
+147, 147, 154, 149, 149, 153, 148, 148, 149, 146,
+146, 147, 145, 145, 149, 147, 147, 161, 153, 153,
+144, 143, 143, 144, 142, 142, 143, 142, 142, 143,
+141, 141, 144, 143, 143, 146, 144, 144, 153, 149,
+149, 158, 151, 151, 158, 151, 151, 152, 148, 148,
+149, 146, 146, 150, 147, 147, 158, 152, 152, 158,
+152, 152, 155, 150, 150, 158, 151, 151, 151, 148,
+148, 142, 141, 141, 144, 143, 143, 147, 145, 145,
+150, 147, 147, 156, 151, 151, 151, 148, 148, 148,
+145, 145, 151, 148, 148, 154, 150, 150, 160, 153,
+153, 152, 149, 149, 141, 140, 140, 142, 141, 141,
+145, 143, 143, 149, 146, 146, 139, 138, 138, 150,
+147, 147, 160, 152, 152, 160, 152, 152, 160, 152,
+152, 161, 152, 152, 157, 151, 151, 143, 141, 141,
+144, 142, 142, 155, 150, 150, 152, 148, 148, 145,
+143, 143, 149, 147, 147, 152, 149, 149, 150, 147,
+147, 150, 147, 147, 152, 148, 148, 151, 148, 148,
+144, 143, 143, 152, 149, 149, 147, 145, 145, 148,
+146, 146, 148, 146, 146, 148, 146, 146, 151, 148,
+148, 149, 147, 147, 147, 145, 145, 155, 150, 150,
+158, 152, 152, 150, 147, 147, 144, 143, 143, 151,
+148, 148, 147, 145, 145, 140, 139, 139, 147, 145,
+145, 153, 149, 149, 153, 149, 149, 164, 152, 152,
+157, 151, 151, 154, 150, 150, 155, 150, 150, 155,
+150, 150, 155, 150, 150, 153, 149, 149, 150, 147,
+147, 146, 144, 144, 147, 145, 145, 146, 144, 144,
+150, 147, 147, 160, 153, 153, 158, 152, 152, 153,
+149, 149, 145, 144, 144, 145, 144, 144, 148, 146,
+146, 157, 152, 152, 146, 144, 144, 143, 142, 142,
+153, 149, 149, 150, 147, 147, 150, 147, 147, 148,
+146, 146, 146, 144, 144, 136, 136, 136, 134, 134,
+134, 146, 144, 144, 156, 150, 150, 155, 150, 150,
+150, 147, 147, 146, 145, 145, 144, 143, 143, 151,
+148, 148, 156, 150, 150, 154, 149, 149, 153, 149,
+149, 150, 147, 147, 145, 143, 143, 142, 141, 141,
+145, 143, 143, 157, 151, 151, 160, 153, 153, 157,
+151, 151, 153, 149, 149, 157, 151, 151, 151, 148,
+148, 145, 143, 143, 155, 150, 150, 154, 149, 149,
+161, 152, 152, 158, 151, 151, 153, 149, 149, 150,
+147, 147, 146, 144, 144, 152, 148, 148, 157, 151,
+151, 157, 151, 151, 155, 150, 150, 154, 149, 149,
+150, 147, 147, 153, 149, 149, 150, 147, 147, 151,
+148, 148, 151, 148, 148, 154, 149, 149, 157, 150,
+150, 157, 150, 150, 151, 148, 148, 150, 147, 147,
+152, 148, 148, 153, 148, 148, 154, 149, 149, 156,
+150, 150, 153, 148, 148, 148, 145, 145, 144, 142,
+142, 136, 136, 136, 140, 139, 139, 148, 145, 145,
+150, 146, 146, 150, 146, 146, 148, 145, 145, 140,
+139, 139, 140, 139, 139, 143, 141, 141, 144, 142,
+142, 140, 139, 139, 140, 139, 139, 143, 142, 142,
+147, 145, 145, 152, 148, 148, 156, 150, 150, 155,
+149, 149, 154, 149, 149, 154, 148, 148, 153, 148,
+148, 150, 146, 146, 147, 144, 144, 146, 143, 143,
+145, 142, 142, 145, 142, 142, 144, 143, 143, 148,
+145, 145, 153, 148, 148, 149, 145, 145, 144, 142,
+142, 144, 142, 142, 146, 143, 143, 150, 146, 146,
+155, 149, 149, 158, 150, 150, 158, 150, 150, 157,
+149, 149, 154, 148, 148, 151, 146, 146, 148, 145,
+145, 147, 144, 144, 150, 146, 146, 151, 147, 147,
+147, 144, 144, 140, 139, 139, 131, 130, 130, 124,
+124, 124, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 120, 120, 120, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 124, 124, 124, 130, 130, 130,
+141, 139, 139, 146, 143, 143, 146, 143, 143, 147,
+144, 144, 152, 147, 147, 153, 148, 148, 151, 146,
+146, 149, 146, 146, 150, 146, 146, 151, 146, 146,
+151, 147, 147, 153, 148, 148, 154, 149, 149, 154,
+148, 148, 151, 147, 147, 148, 145, 145, 147, 144,
+144, 147, 144, 144, 147, 144, 144, 148, 145, 145,
+151, 147, 147, 151, 148, 148, 146, 144, 144, 143,
+142, 142, 148, 145, 145, 152, 148, 148, 154, 149,
+149, 157, 150, 150, 158, 150, 150, 157, 150, 150,
+155, 149, 149, 152, 148, 148, 153, 148, 148, 154,
+148, 148, 144, 142, 142, 134, 134, 134, 136, 136,
+136, 139, 138, 138, 142, 141, 141, 145, 143, 143,
+148, 145, 145, 151, 148, 148, 158, 151, 151, 164,
+152, 152, 157, 150, 150, 148, 146, 146, 148, 145,
+145, 147, 145, 145, 144, 142, 142, 141, 140, 140,
+149, 146, 146, 161, 152, 152, 156, 150, 150, 143,
+142, 142, 145, 144, 144, 148, 146, 146, 150, 147,
+147, 150, 147, 147, 153, 149, 149, 150, 147, 147,
+152, 148, 148, 144, 143, 143, 147, 145, 145, 146,
+144, 144, 152, 148, 148, 154, 149, 149, 150, 147,
+147, 147, 145, 145, 146, 144, 144, 144, 143, 143,
+154, 149, 149, 145, 144, 144, 148, 146, 146, 140,
+139, 139, 133, 132, 132, 135, 134, 134, 141, 140,
+140, 149, 146, 146, 151, 148, 148, 155, 150, 150,
+155, 151, 151, 144, 142, 142, 145, 143, 143, 153,
+150, 150, 158, 152, 152, 155, 150, 150, 155, 150,
+150, 162, 152, 152, 164, 153, 153, 155, 150, 150,
+159, 153, 153, 166, 154, 154, 164, 154, 154, 157,
+152, 152, 152, 149, 149, 150, 147, 147, 155, 150,
+150, 157, 151, 151, 143, 142, 142, 132, 131, 131,
+133, 133, 133, 137, 137, 137, 142, 141, 141, 150,
+148, 148, 159, 152, 152, 159, 151, 151, 148, 146,
+146, 161, 152, 152, 174, 151, 151, 166, 154, 154,
+153, 149, 149, 149, 147, 147, 148, 146, 146, 142,
+142, 142, 134, 134, 134, 144, 143, 143, 149, 147,
+147, 155, 150, 150, 149, 147, 147, 152, 149, 149,
+154, 150, 150, 151, 148, 148, 156, 151, 151, 160,
+152, 152, 162, 153, 153, 162, 153, 153, 157, 152,
+152, 157, 152, 152, 161, 153, 153, 167, 156, 156,
+148, 146, 146, 160, 152, 152, 167, 155, 155, 152,
+149, 149, 155, 150, 150, 156, 151, 151, 152, 149,
+149, 143, 142, 142, 137, 137, 137, 140, 139, 139,
+148, 146, 146, 150, 147, 147, 161, 153, 153, 159,
+152, 152, 144, 142, 142, 157, 152, 152, 161, 154,
+154, 159, 152, 152, 159, 152, 152, 150, 147, 147,
+149, 147, 147, 152, 148, 148, 152, 149, 149, 147,
+145, 145, 144, 143, 143, 143, 142, 142, 153, 149,
+149, 164, 152, 152, 164, 153, 153, 165, 154, 154,
+164, 153, 153, 163, 152, 152, 163, 153, 153, 163,
+153, 153, 156, 151, 151, 143, 142, 142, 135, 135,
+135, 137, 137, 137, 142, 141, 141, 144, 143, 143,
+142, 141, 141, 137, 137, 137, 141, 140, 140, 154,
+149, 149, 155, 150, 150, 154, 150, 150, 146, 144,
+144, 142, 141, 141, 143, 142, 142, 139, 138, 138,
+150, 147, 147, 169, 154, 154, 173, 153, 153, 164,
+153, 153, 153, 149, 149, 146, 144, 144, 145, 144,
+144, 157, 151, 151, 152, 149, 149, 146, 144, 144,
+150, 147, 147, 161, 151, 151, 159, 151, 151, 159,
+151, 151, 156, 150, 150, 155, 151, 151, 154, 150,
+150, 152, 148, 148, 152, 148, 148, 146, 144, 144,
+149, 146, 146, 150, 147, 147, 151, 147, 147, 157,
+150, 150, 159, 151, 151, 161, 151, 151, 160, 151,
+151, 152, 148, 148, 150, 147, 147, 157, 150, 150,
+162, 152, 152, 158, 151, 151, 154, 150, 150, 148,
+145, 145, 140, 139, 139, 135, 134, 134, 131, 131,
+131, 135, 135, 135, 141, 140, 140, 149, 146, 146,
+154, 148, 148, 141, 140, 140, 129, 129, 129, 143,
+141, 141, 155, 149, 149, 153, 148, 148, 150, 146,
+146, 144, 142, 142, 137, 136, 136, 141, 140, 140,
+146, 144, 144, 149, 146, 146, 152, 148, 148, 152,
+148, 148, 152, 148, 148, 151, 147, 147, 150, 147,
+147, 149, 145, 145, 147, 144, 144, 144, 142, 142,
+141, 140, 140, 142, 141, 141, 145, 143, 143, 144,
+142, 142, 140, 139, 139, 139, 138, 138, 140, 139,
+139, 147, 144, 144, 158, 150, 150, 161, 151, 151,
+159, 150, 150, 155, 149, 149, 150, 146, 146, 147,
+144, 144, 146, 143, 143, 146, 143, 143, 149, 145,
+145, 149, 145, 145, 147, 144, 144, 140, 139, 139,
+130, 130, 130, 124, 124, 124, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 120, 120, 120, 120, 120, 120,
+120, 120, 120, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+123, 123, 123, 129, 129, 129, 140, 138, 138, 146,
+143, 143, 145, 143, 143, 145, 142, 142, 148, 144,
+144, 151, 146, 146, 153, 148, 148, 153, 147, 147,
+151, 146, 146, 150, 146, 146, 151, 147, 147, 152,
+147, 147, 153, 148, 148, 153, 148, 148, 152, 147,
+147, 150, 146, 146, 148, 145, 145, 146, 144, 144,
+145, 143, 143, 144, 142, 142, 143, 142, 142, 142,
+141, 141, 141, 140, 140, 142, 140, 140, 144, 142,
+142, 147, 145, 145, 149, 146, 146, 152, 147, 147,
+154, 149, 149, 155, 149, 149, 153, 148, 148, 152,
+147, 147, 150, 147, 147, 147, 144, 144, 139, 138,
+138, 137, 136, 136, 140, 139, 139, 141, 140, 140,
+141, 140, 140, 142, 140, 140, 144, 142, 142, 148,
+145, 145, 154, 149, 149, 155, 149, 149, 151, 147,
+147, 149, 146, 146, 153, 148, 148, 154, 149, 149,
+155, 149, 149, 156, 150, 150, 154, 149, 149, 155,
+149, 149, 149, 146, 146, 147, 144, 144, 155, 149,
+149, 155, 149, 149, 147, 145, 145, 149, 146, 146,
+147, 144, 144, 147, 145, 145, 148, 146, 146, 153,
+149, 149, 141, 140, 140, 142, 141, 141, 151, 147,
+147, 155, 150, 150, 154, 149, 149, 151, 147, 147,
+138, 137, 137, 142, 141, 141, 145, 144, 144, 148,
+145, 145, 145, 143, 143, 146, 145, 145, 155, 150,
+150, 154, 149, 149, 150, 147, 147, 142, 141, 141,
+144, 143, 143, 157, 151, 151, 157, 151, 151, 156,
+150, 150, 142, 141, 141, 145, 144, 144, 142, 142,
+142, 143, 142, 142, 149, 146, 146, 156, 151, 151,
+139, 138, 138, 144, 143, 143, 149, 147, 147, 144,
+143, 143, 158, 152, 152, 152, 149, 149, 144, 143,
+143, 146, 144, 144, 154, 150, 150, 145, 143, 143,
+143, 142, 142, 148, 145, 145, 154, 149, 149, 154,
+150, 150, 149, 147, 147, 154, 149, 149, 145, 143,
+143, 146, 144, 144, 156, 150, 150, 151, 148, 148,
+152, 149, 149, 147, 146, 146, 148, 146, 146, 158,
+152, 152, 165, 154, 154, 159, 151, 151, 161, 154,
+154, 152, 149, 149, 164, 152, 152, 169, 154, 154,
+149, 147, 147, 144, 143, 143, 147, 145, 145, 148,
+146, 146, 149, 147, 147, 150, 147, 147, 151, 148,
+148, 166, 155, 155, 169, 152, 152, 167, 154, 154,
+167, 154, 154, 165, 154, 154, 150, 147, 147, 136,
+135, 135, 139, 139, 139, 154, 150, 150, 168, 153,
+153, 145, 143, 143, 144, 143, 143, 140, 140, 140,
+146, 145, 145, 149, 147, 147, 154, 151, 151, 159,
+153, 153, 145, 143, 143, 153, 149, 149, 148, 146,
+146, 149, 147, 147, 152, 149, 149, 155, 150, 150,
+160, 152, 152, 145, 144, 144, 146, 144, 144, 154,
+150, 150, 159, 151, 151, 148, 146, 146, 145, 143,
+143, 156, 150, 150, 161, 152, 152, 173, 151, 151,
+170, 151, 151, 153, 149, 149, 154, 150, 150, 153,
+149, 149, 164, 153, 153, 161, 153, 153, 162, 153,
+153, 155, 150, 150, 139, 138, 138, 141, 140, 140,
+145, 143, 143, 146, 144, 144, 156, 151, 151, 156,
+151, 151, 152, 149, 149, 160, 152, 152, 158, 150,
+150, 148, 145, 145, 142, 141, 141, 141, 140, 140,
+152, 148, 148, 158, 151, 151, 155, 150, 150, 145,
+144, 144, 146, 144, 144, 147, 145, 145, 148, 146,
+146, 144, 143, 143, 138, 138, 138, 143, 142, 142,
+147, 145, 145, 148, 146, 146, 159, 151, 151, 157,
+151, 151, 153, 149, 149, 152, 148, 148, 150, 147,
+147, 149, 146, 146, 148, 145, 145, 149, 146, 146,
+148, 145, 145, 147, 144, 144, 148, 145, 145, 149,
+146, 146, 153, 149, 149, 153, 149, 149, 151, 147,
+147, 148, 146, 146, 150, 147, 147, 153, 149, 149,
+155, 150, 150, 153, 149, 149, 150, 147, 147, 146,
+144, 144, 142, 141, 141, 141, 140, 140, 145, 143,
+143, 147, 144, 144, 147, 145, 145, 147, 144, 144,
+144, 142, 142, 143, 141, 141, 143, 141, 141, 145,
+143, 143, 148, 145, 145, 150, 146, 146, 149, 146,
+146, 149, 146, 146, 147, 144, 144, 147, 144, 144,
+148, 145, 145, 149, 146, 146, 151, 147, 147, 149,
+146, 146, 147, 144, 144, 147, 144, 144, 148, 145,
+145, 149, 146, 146, 149, 145, 145, 147, 144, 144,
+143, 141, 141, 142, 140, 140, 143, 141, 141, 140,
+139, 139, 136, 136, 136, 141, 140, 140, 153, 148,
+148, 157, 150, 150, 155, 149, 149, 152, 147, 147,
+148, 145, 145, 146, 144, 144, 146, 143, 143, 146,
+144, 144, 147, 144, 144, 147, 144, 144, 145, 143,
+143, 137, 136, 136, 128, 128, 128, 123, 123, 123,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 120, 120, 120,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 123, 123, 123, 128,
+128, 128, 138, 137, 137, 147, 143, 143, 148, 144,
+144, 147, 144, 144, 148, 145, 145, 150, 146, 146,
+154, 148, 148, 154, 148, 148, 150, 146, 146, 148,
+145, 145, 148, 144, 144, 149, 145, 145, 149, 146,
+146, 150, 146, 146, 152, 148, 148, 151, 147, 147,
+150, 146, 146, 148, 145, 145, 145, 142, 142, 142,
+140, 140, 140, 139, 139, 140, 139, 139, 142, 141,
+141, 144, 142, 142, 146, 144, 144, 148, 145, 145,
+150, 146, 146, 152, 148, 148, 154, 149, 149, 154,
+149, 149, 153, 148, 148, 151, 147, 147, 150, 147,
+147, 146, 144, 144, 143, 142, 142, 144, 142, 142,
+146, 144, 144, 145, 143, 143, 145, 143, 143, 145,
+143, 143, 147, 145, 145, 150, 147, 147, 153, 148,
+148, 152, 148, 148, 152, 147, 147, 154, 149, 149,
+155, 150, 150, 155, 149, 149, 155, 149, 149, 151,
+147, 147, 148, 145, 145, 150, 146, 146, 152, 148,
+148, 155, 149, 149, 156, 150, 150, 151, 147, 147,
+147, 144, 144, 150, 147, 147, 154, 149, 149, 157,
+150, 150, 158, 151, 151, 150, 147, 147, 141, 140,
+140, 144, 143, 143, 148, 146, 146, 153, 149, 149,
+150, 147, 147, 141, 140, 140, 142, 141, 141, 150,
+147, 147, 148, 145, 145, 150, 147, 147, 149, 147,
+147, 150, 147, 147, 147, 145, 145, 154, 149, 149,
+154, 149, 149, 150, 147, 147, 141, 140, 140, 150,
+147, 147, 167, 154, 154, 156, 150, 150, 156, 150,
+150, 155, 150, 150, 155, 150, 150, 149, 146, 146,
+158, 151, 151, 150, 147, 147, 143, 142, 142, 141,
+140, 140, 148, 146, 146, 163, 154, 154, 161, 152,
+152, 155, 150, 150, 150, 147, 147, 145, 144, 144,
+148, 146, 146, 149, 147, 147, 145, 144, 144, 148,
+146, 146, 150, 147, 147, 149, 147, 147, 149, 147,
+147, 154, 150, 150, 156, 151, 151, 150, 147, 147,
+145, 144, 144, 139, 138, 138, 141, 140, 140, 147,
+145, 145, 150, 148, 148, 151, 148, 148, 150, 148,
+148, 151, 148, 148, 147, 145, 145, 152, 149, 149,
+144, 143, 143, 145, 144, 144, 145, 144, 144, 135,
+135, 135, 140, 139, 139, 158, 151, 151, 161, 152,
+152, 151, 148, 148, 163, 154, 154, 157, 151, 151,
+144, 143, 143, 150, 147, 147, 161, 152, 152, 160,
+152, 152, 161, 152, 152, 145, 144, 144, 148, 146,
+146, 172, 152, 152, 159, 151, 151, 157, 150, 150,
+165, 153, 153, 163, 153, 153, 148, 146, 146, 150,
+147, 147, 161, 153, 153, 169, 153, 153, 160, 153,
+153, 165, 156, 156, 152, 149, 149, 142, 141, 141,
+146, 144, 144, 150, 147, 147, 151, 148, 148, 147,
+145, 145, 154, 150, 150, 159, 152, 152, 159, 151,
+151, 160, 152, 152, 166, 155, 155, 163, 153, 153,
+162, 152, 152, 163, 153, 153, 159, 152, 152, 158,
+151, 151, 156, 151, 151, 159, 152, 152, 163, 154,
+154, 164, 154, 154, 156, 151, 151, 159, 152, 152,
+157, 151, 151, 151, 148, 148, 152, 149, 149, 161,
+153, 153, 158, 152, 152, 160, 152, 152, 162, 153,
+153, 161, 152, 152, 156, 150, 150, 157, 150, 150,
+157, 150, 150, 154, 149, 149, 153, 148, 148, 154,
+150, 150, 156, 151, 151, 157, 150, 150, 151, 147,
+147, 142, 141, 141, 141, 140, 140, 144, 143, 143,
+149, 146, 146, 152, 148, 148, 152, 148, 148, 148,
+145, 145, 149, 146, 146, 150, 147, 147, 153, 149,
+149, 154, 149, 149, 156, 150, 150, 153, 148, 148,
+151, 147, 147, 149, 146, 146, 151, 147, 147, 154,
+149, 149, 151, 147, 147, 149, 146, 146, 150, 147,
+147, 150, 147, 147, 152, 149, 149, 156, 151, 151,
+155, 150, 150, 154, 150, 150, 152, 148, 148, 149,
+146, 146, 153, 149, 149, 156, 151, 151, 151, 148,
+148, 147, 145, 145, 149, 146, 146, 151, 147, 147,
+145, 143, 143, 140, 139, 139, 145, 143, 143, 148,
+145, 145, 150, 146, 146, 151, 147, 147, 147, 145,
+145, 145, 143, 143, 147, 144, 144, 148, 145, 145,
+150, 146, 146, 150, 147, 147, 148, 145, 145, 148,
+145, 145, 149, 145, 145, 150, 146, 146, 150, 146,
+146, 148, 145, 145, 142, 140, 140, 140, 139, 139,
+145, 143, 143, 145, 143, 143, 140, 139, 139, 141,
+140, 140, 150, 146, 146, 153, 148, 148, 152, 147,
+147, 150, 146, 146, 148, 145, 145, 148, 145, 145,
+148, 145, 145, 148, 145, 145, 147, 145, 145, 147,
+144, 144, 144, 142, 142, 136, 135, 135, 127, 127,
+127, 123, 123, 123, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 123, 123, 123, 126, 126, 126, 136, 136,
+136, 147, 144, 144, 154, 148, 148, 156, 150, 150,
+154, 149, 149, 151, 147, 147, 150, 146, 146, 149,
+146, 146, 148, 145, 145, 146, 144, 144, 144, 142,
+142, 143, 142, 142, 144, 142, 142, 147, 145, 145,
+152, 148, 148, 155, 149, 149, 156, 150, 150, 152,
+148, 148, 145, 143, 143, 144, 143, 143, 143, 142,
+142, 144, 143, 143, 145, 143, 143, 149, 146, 146,
+154, 149, 149, 158, 151, 151, 161, 152, 152, 158,
+151, 151, 156, 150, 150, 154, 149, 149, 152, 148,
+148, 154, 150, 150, 156, 151, 151, 157, 151, 151,
+157, 151, 151, 154, 149, 149, 154, 149, 149, 158,
+152, 152, 160, 153, 153, 160, 152, 152, 158, 152,
+152, 153, 149, 149, 154, 149, 149, 158, 152, 152,
+155, 150, 150, 149, 147, 147, 145, 144, 144, 142,
+141, 141, 143, 142, 142, 142, 141, 141, 147, 145,
+145, 152, 149, 149, 149, 146, 146, 145, 143, 143,
+147, 145, 145, 148, 146, 146, 150, 147, 147, 153,
+149, 149, 158, 152, 152, 161, 154, 154, 160, 153,
+153, 155, 151, 151, 143, 142, 142, 140, 139, 139,
+156, 151, 151, 162, 154, 154, 162, 153, 153, 161,
+153, 153, 149, 146, 146, 147, 145, 145, 162, 154,
+154, 167, 155, 155, 161, 153, 153, 158, 152, 152,
+155, 150, 150, 150, 147, 147, 144, 143, 143, 139,
+138, 138, 136, 136, 136, 137, 136, 136, 134, 133,
+133, 135, 135, 135, 140, 140, 140, 148, 147, 147,
+150, 148, 148, 148, 146, 146, 144, 143, 143, 141,
+140, 140, 138, 137, 137, 136, 136, 136, 137, 137,
+137, 133, 132, 132, 142, 141, 141, 160, 153, 153,
+164, 155, 155, 166, 156, 156, 157, 152, 152, 158,
+152, 152, 149, 147, 147, 147, 145, 145, 146, 145,
+145, 149, 147, 147, 160, 154, 154, 155, 151, 151,
+155, 151, 151, 160, 154, 154, 157, 152, 152, 159,
+152, 152, 152, 149, 149, 151, 148, 148, 162, 154,
+154, 164, 154, 154, 165, 154, 154, 157, 152, 152,
+152, 149, 149, 152, 149, 149, 160, 153, 153, 165,
+156, 156, 162, 155, 155, 149, 147, 147, 155, 152,
+152, 170, 157, 157, 161, 154, 154, 170, 157, 157,
+168, 157, 157, 166, 156, 156, 166, 156, 156, 154,
+151, 151, 157, 152, 152, 162, 154, 154, 156, 152,
+152, 154, 150, 150, 154, 150, 150, 152, 149, 149,
+159, 153, 153, 169, 155, 155, 158, 153, 153, 162,
+155, 155, 165, 156, 156, 161, 154, 154, 163, 155,
+155, 162, 154, 154, 159, 153, 153, 150, 148, 148,
+143, 142, 142, 144, 143, 143, 161, 154, 154, 157,
+152, 152, 164, 155, 155, 147, 145, 145, 145, 144,
+144, 145, 144, 144, 151, 148, 148, 156, 151, 151,
+154, 150, 150, 155, 151, 151, 151, 148, 148, 146,
+144, 144, 145, 144, 144, 149, 147, 147, 148, 146,
+146, 151, 149, 149, 155, 151, 151, 160, 153, 153,
+163, 154, 154, 163, 154, 154, 160, 154, 154, 161,
+155, 155, 165, 156, 156, 160, 154, 154, 153, 149,
+149, 150, 147, 147, 159, 153, 153, 163, 153, 153,
+151, 148, 148, 139, 138, 138, 150, 147, 147, 155,
+151, 151, 151, 148, 148, 148, 145, 145, 141, 140,
+140, 142, 141, 141, 154, 150, 150, 161, 153, 153,
+160, 153, 153, 158, 152, 152, 154, 150, 150, 153,
+149, 149, 152, 149, 149, 157, 152, 152, 163, 154,
+154, 160, 153, 153, 157, 152, 152, 150, 147, 147,
+147, 145, 145, 150, 147, 147, 154, 149, 149, 156,
+151, 151, 156, 150, 150, 154, 150, 150, 152, 149,
+149, 156, 151, 151, 159, 152, 152, 160, 153, 153,
+160, 153, 153, 159, 152, 152, 160, 153, 153, 165,
+154, 154, 165, 154, 154, 160, 152, 152, 156, 151,
+151, 152, 148, 148, 151, 147, 147, 149, 146, 146,
+147, 145, 145, 144, 142, 142, 140, 139, 139, 136,
+136, 136, 137, 136, 136, 138, 137, 137, 145, 143,
+143, 154, 149, 149, 152, 148, 148, 150, 146, 146,
+152, 148, 148, 154, 149, 149, 153, 148, 148, 150,
+147, 147, 147, 144, 144, 142, 141, 141, 138, 137,
+137, 137, 136, 136, 146, 144, 144, 151, 147, 147,
+151, 147, 147, 150, 147, 147, 149, 146, 146, 150,
+146, 146, 152, 148, 148, 151, 147, 147, 150, 146,
+146, 150, 146, 146, 151, 147, 147, 152, 147, 147,
+153, 148, 148, 152, 148, 148, 147, 144, 144, 136,
+135, 135, 125, 125, 125, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 126, 126, 126, 135, 135, 135, 146, 144, 144,
+152, 147, 147, 153, 148, 148, 153, 148, 148, 152,
+148, 148, 150, 146, 146, 148, 145, 145, 148, 145,
+145, 147, 145, 145, 147, 144, 144, 147, 145, 145,
+148, 145, 145, 149, 146, 146, 151, 147, 147, 152,
+147, 147, 154, 149, 149, 153, 149, 149, 152, 148,
+148, 151, 147, 147, 150, 146, 146, 149, 146, 146,
+150, 146, 146, 154, 149, 149, 157, 151, 151, 159,
+152, 152, 159, 151, 151, 154, 149, 149, 153, 148,
+148, 156, 150, 150, 156, 150, 150, 155, 150, 150,
+154, 149, 149, 155, 150, 150, 154, 149, 149, 153,
+149, 149, 154, 149, 149, 153, 149, 149, 157, 151,
+151, 159, 151, 151, 153, 148, 148, 149, 146, 146,
+155, 150, 150, 158, 151, 151, 155, 150, 150, 153,
+149, 149, 152, 148, 148, 153, 148, 148, 155, 149,
+149, 156, 150, 150, 157, 151, 151, 156, 151, 151,
+152, 148, 148, 152, 148, 148, 153, 149, 149, 153,
+149, 149, 153, 149, 149, 155, 150, 150, 156, 151,
+151, 159, 152, 152, 158, 151, 151, 151, 148, 148,
+146, 144, 144, 149, 146, 146, 148, 146, 146, 151,
+148, 148, 151, 148, 148, 147, 145, 145, 150, 147,
+147, 155, 150, 150, 162, 153, 153, 160, 152, 152,
+158, 152, 152, 153, 150, 150, 149, 147, 147, 146,
+144, 144, 145, 144, 144, 145, 143, 143, 143, 142,
+142, 143, 142, 142, 149, 146, 146, 152, 149, 149,
+151, 148, 148, 149, 147, 147, 162, 153, 153, 156,
+151, 151, 152, 148, 148, 148, 145, 145, 143, 142,
+142, 143, 142, 142, 144, 143, 143, 148, 146, 146,
+154, 150, 150, 154, 150, 150, 154, 150, 150, 148,
+146, 146, 145, 144, 144, 150, 147, 147, 150, 147,
+147, 147, 145, 145, 145, 144, 144, 143, 142, 142,
+152, 149, 149, 158, 152, 152, 151, 148, 148, 160,
+153, 153, 163, 154, 154, 158, 153, 153, 158, 153,
+153, 161, 154, 154, 154, 150, 150, 159, 153, 153,
+160, 154, 154, 155, 151, 151, 157, 152, 152, 153,
+150, 150, 148, 146, 146, 150, 147, 147, 156, 151,
+151, 157, 152, 152, 155, 150, 150, 151, 148, 148,
+159, 153, 153, 155, 151, 151, 164, 156, 156, 153,
+150, 150, 148, 146, 146, 153, 149, 149, 156, 151,
+151, 156, 152, 152, 155, 151, 151, 158, 152, 152,
+152, 149, 149, 158, 153, 153, 164, 156, 156, 164,
+155, 155, 156, 151, 151, 166, 155, 155, 168, 155,
+155, 157, 151, 151, 162, 154, 154, 155, 150, 150,
+153, 150, 150, 152, 149, 149, 148, 146, 146, 148,
+146, 146, 150, 148, 148, 149, 147, 147, 145, 144,
+144, 151, 148, 148, 146, 144, 144, 142, 141, 141,
+145, 144, 144, 150, 147, 147, 145, 144, 144, 141,
+140, 140, 144, 142, 142, 147, 145, 145, 152, 149,
+149, 155, 150, 150, 152, 149, 149, 152, 148, 148,
+156, 151, 151, 156, 151, 151, 154, 150, 150, 156,
+151, 151, 163, 154, 154, 158, 153, 153, 151, 148,
+148, 149, 146, 146, 148, 146, 146, 145, 143, 143,
+139, 138, 138, 143, 142, 142, 151, 148, 148, 147,
+145, 145, 145, 144, 144, 144, 142, 142, 145, 143,
+143, 151, 148, 148, 153, 149, 149, 147, 145, 145,
+149, 146, 146, 150, 147, 147, 152, 148, 148, 155,
+150, 150, 155, 150, 150, 154, 150, 150, 154, 149,
+149, 152, 149, 149, 150, 147, 147, 149, 146, 146,
+150, 147, 147, 150, 147, 147, 154, 149, 149, 154,
+150, 150, 149, 146, 146, 147, 145, 145, 150, 147,
+147, 151, 148, 148, 152, 148, 148, 150, 147, 147,
+145, 144, 144, 150, 147, 147, 157, 151, 151, 158,
+151, 151, 159, 152, 152, 154, 149, 149, 150, 147,
+147, 153, 149, 149, 155, 150, 150, 150, 146, 146,
+146, 144, 144, 145, 143, 143, 145, 143, 143, 146,
+144, 144, 150, 147, 147, 154, 149, 149, 153, 149,
+149, 149, 146, 146, 148, 145, 145, 148, 145, 145,
+149, 146, 146, 150, 147, 147, 152, 148, 148, 153,
+148, 148, 148, 145, 145, 145, 143, 143, 148, 145,
+145, 151, 147, 147, 152, 148, 148, 152, 148, 148,
+149, 146, 146, 146, 144, 144, 145, 143, 143, 146,
+144, 144, 149, 145, 145, 150, 146, 146, 150, 146,
+146, 149, 146, 146, 149, 146, 146, 147, 144, 144,
+141, 140, 140, 133, 133, 133, 125, 125, 125, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 125, 125, 125,
+134, 134, 134, 145, 142, 142, 148, 145, 145, 148,
+145, 145, 152, 147, 147, 154, 149, 149, 152, 147,
+147, 150, 146, 146, 150, 146, 146, 150, 147, 147,
+151, 147, 147, 152, 147, 147, 153, 148, 148, 152,
+148, 148, 149, 146, 146, 148, 145, 145, 148, 145,
+145, 153, 148, 148, 156, 150, 150, 155, 149, 149,
+153, 148, 148, 153, 148, 148, 153, 148, 148, 154,
+149, 149, 155, 150, 150, 156, 150, 150, 154, 149,
+149, 150, 146, 146, 154, 148, 148, 160, 151, 151,
+157, 150, 150, 154, 149, 149, 151, 147, 147, 149,
+146, 146, 149, 146, 146, 149, 146, 146, 148, 146,
+146, 151, 147, 147, 157, 151, 151, 155, 150, 150,
+148, 145, 145, 151, 148, 148, 158, 151, 151, 159,
+151, 151, 159, 152, 152, 161, 152, 152, 163, 153,
+153, 166, 154, 154, 167, 154, 154, 161, 153, 153,
+159, 151, 151, 158, 151, 151, 157, 151, 151, 158,
+152, 152, 155, 150, 150, 154, 149, 149, 152, 148,
+148, 150, 147, 147, 153, 149, 149, 155, 150, 150,
+156, 150, 150, 151, 148, 148, 145, 144, 144, 144,
+142, 142, 149, 147, 147, 151, 148, 148, 155, 150,
+150, 152, 148, 148, 156, 151, 151, 152, 148, 148,
+151, 148, 148, 150, 148, 148, 148, 146, 146, 139,
+138, 138, 135, 135, 135, 146, 144, 144, 147, 145,
+145, 144, 142, 142, 145, 143, 143, 154, 150, 150,
+144, 143, 143, 136, 136, 136, 141, 140, 140, 155,
+150, 150, 156, 151, 151, 155, 150, 150, 149, 146,
+146, 144, 142, 142, 150, 147, 147, 147, 145, 145,
+151, 148, 148, 145, 144, 144, 143, 141, 141, 146,
+144, 144, 142, 141, 141, 138, 137, 137, 141, 140,
+140, 142, 141, 141, 146, 144, 144, 147, 145, 145,
+142, 141, 141, 138, 138, 138, 137, 137, 137, 141,
+140, 140, 143, 142, 142, 153, 149, 149, 165, 156,
+156, 143, 142, 142, 140, 140, 140, 143, 142, 142,
+153, 149, 149, 147, 145, 145, 139, 139, 139, 152,
+149, 149, 151, 148, 148, 145, 144, 144, 145, 144,
+144, 142, 141, 141, 140, 139, 139, 140, 140, 140,
+143, 142, 142, 152, 149, 149, 156, 152, 152, 157,
+152, 152, 155, 150, 150, 154, 150, 150, 147, 146,
+146, 139, 139, 139, 138, 138, 138, 141, 140, 140,
+152, 149, 149, 155, 151, 151, 164, 155, 155, 159,
+153, 153, 156, 152, 152, 154, 150, 150, 166, 155,
+155, 156, 151, 151, 151, 148, 148, 159, 153, 153,
+153, 149, 149, 144, 143, 143, 140, 140, 140, 136,
+136, 136, 139, 138, 138, 141, 140, 140, 147, 145,
+145, 154, 149, 149, 151, 148, 148, 153, 149, 149,
+162, 153, 153, 159, 152, 152, 145, 143, 143, 149,
+146, 146, 153, 149, 149, 145, 143, 143, 143, 142,
+142, 143, 141, 141, 147, 145, 145, 153, 149, 149,
+164, 153, 153, 152, 149, 149, 149, 147, 147, 154,
+150, 150, 150, 147, 147, 149, 147, 147, 142, 141,
+141, 136, 136, 136, 139, 138, 138, 140, 139, 139,
+139, 138, 138, 142, 141, 141, 147, 145, 145, 147,
+145, 145, 145, 144, 144, 146, 145, 145, 150, 147,
+147, 148, 146, 146, 141, 140, 140, 141, 140, 140,
+142, 141, 141, 147, 145, 145, 154, 149, 149, 151,
+148, 148, 147, 145, 145, 146, 144, 144, 146, 144,
+144, 147, 145, 145, 149, 146, 146, 149, 147, 147,
+152, 148, 148, 155, 150, 150, 149, 146, 146, 141,
+140, 140, 141, 140, 140, 144, 143, 143, 145, 143,
+143, 145, 143, 143, 139, 138, 138, 137, 136, 136,
+143, 141, 141, 148, 146, 146, 153, 149, 149, 153,
+149, 149, 149, 146, 146, 151, 148, 148, 158, 151,
+151, 156, 150, 150, 153, 149, 149, 154, 150, 150,
+156, 150, 150, 157, 151, 151, 158, 151, 151, 157,
+150, 150, 154, 149, 149, 148, 145, 145, 144, 142,
+142, 144, 142, 142, 146, 143, 143, 150, 146, 146,
+156, 150, 150, 161, 152, 152, 158, 150, 150, 154,
+148, 148, 151, 147, 147, 149, 146, 146, 152, 148,
+148, 151, 147, 147, 150, 146, 146, 147, 144, 144,
+143, 141, 141, 144, 142, 142, 149, 145, 145, 150,
+146, 146, 150, 146, 146, 148, 145, 145, 147, 144,
+144, 144, 142, 142, 138, 137, 137, 131, 131, 131,
+125, 125, 125, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 125, 125, 125, 133, 133, 133, 143,
+142, 142, 150, 146, 146, 150, 147, 147, 153, 149,
+149, 155, 150, 150, 156, 150, 150, 154, 149, 149,
+155, 150, 150, 153, 148, 148, 153, 149, 149, 153,
+148, 148, 153, 148, 148, 150, 147, 147, 147, 144,
+144, 147, 144, 144, 147, 144, 144, 150, 146, 146,
+151, 147, 147, 151, 148, 148, 152, 148, 148, 154,
+149, 149, 153, 149, 149, 153, 148, 148, 153, 148,
+148, 153, 148, 148, 154, 149, 149, 156, 151, 151,
+156, 150, 150, 156, 150, 150, 155, 151, 151, 155,
+150, 150, 153, 149, 149, 148, 146, 146, 143, 142,
+142, 150, 147, 147, 158, 152, 152, 163, 154, 154,
+165, 154, 154, 158, 152, 152, 154, 149, 149, 157,
+151, 151, 158, 152, 152, 157, 151, 151, 158, 151,
+151, 160, 153, 153, 161, 153, 153, 161, 153, 153,
+155, 150, 150, 150, 147, 147, 152, 149, 149, 156,
+151, 151, 166, 156, 156, 171, 157, 157, 169, 156,
+156, 163, 154, 154, 157, 151, 151, 155, 150, 150,
+153, 150, 150, 157, 151, 151, 160, 153, 153, 166,
+155, 155, 169, 156, 156, 161, 153, 153, 159, 151,
+151, 160, 153, 153, 158, 152, 152, 154, 151, 151,
+151, 148, 148, 146, 144, 144, 141, 140, 140, 142,
+141, 141, 133, 132, 132, 133, 132, 132, 147, 145,
+145, 158, 152, 152, 155, 151, 151, 156, 151, 151,
+167, 155, 155, 164, 155, 155, 157, 152, 152, 152,
+149, 149, 148, 146, 146, 157, 152, 152, 162, 154,
+154, 166, 156, 156, 165, 156, 156, 162, 155, 155,
+161, 154, 154, 163, 155, 155, 161, 154, 154, 159,
+153, 153, 162, 154, 154, 159, 153, 153, 162, 154,
+154, 158, 152, 152, 170, 156, 156, 166, 156, 156,
+163, 155, 155, 169, 158, 158, 172, 158, 158, 171,
+157, 157, 170, 157, 157, 164, 156, 156, 159, 154,
+154, 159, 154, 154, 160, 155, 155, 164, 155, 155,
+149, 147, 147, 156, 151, 151, 168, 156, 156, 157,
+153, 153, 152, 149, 149, 146, 145, 145, 163, 155,
+155, 165, 156, 156, 161, 155, 155, 160, 154, 154,
+162, 155, 155, 157, 152, 152, 151, 148, 148, 147,
+145, 145, 150, 147, 147, 154, 151, 151, 150, 148,
+148, 144, 143, 143, 149, 147, 147, 161, 154, 154,
+164, 155, 155, 152, 149, 149, 151, 148, 148, 150,
+147, 147, 150, 147, 147, 150, 148, 148, 154, 151,
+151, 163, 156, 156, 156, 152, 152, 158, 153, 153,
+166, 157, 157, 166, 156, 156, 167, 155, 155, 164,
+154, 154, 158, 152, 152, 151, 148, 148, 136, 136,
+136, 137, 137, 137, 149, 146, 146, 145, 144, 144,
+144, 142, 142, 152, 149, 149, 155, 151, 151, 157,
+152, 152, 155, 151, 151, 161, 154, 154, 160, 154,
+154, 158, 152, 152, 160, 153, 153, 158, 152, 152,
+154, 150, 150, 148, 146, 146, 145, 144, 144, 151,
+148, 148, 149, 147, 147, 158, 153, 153, 157, 152,
+152, 158, 153, 153, 157, 152, 152, 158, 152, 152,
+159, 153, 153, 157, 152, 152, 161, 154, 154, 162,
+154, 154, 160, 154, 154, 161, 154, 154, 165, 156,
+156, 168, 156, 156, 161, 154, 154, 152, 148, 148,
+148, 145, 145, 146, 144, 144, 148, 146, 146, 148,
+146, 146, 143, 142, 142, 143, 142, 142, 148, 145,
+145, 157, 152, 152, 170, 156, 156, 165, 155, 155,
+155, 151, 151, 147, 145, 145, 142, 141, 141, 149,
+147, 147, 154, 150, 150, 150, 147, 147, 151, 148,
+148, 158, 152, 152, 155, 151, 151, 148, 146, 146,
+147, 145, 145, 148, 146, 146, 147, 145, 145, 148,
+145, 145, 154, 149, 149, 156, 151, 151, 153, 149,
+149, 154, 150, 150, 161, 153, 153, 162, 154, 154,
+159, 152, 152, 156, 150, 150, 153, 149, 149, 147,
+145, 145, 143, 141, 141, 149, 146, 146, 153, 149,
+149, 152, 148, 148, 153, 149, 149, 156, 150, 150,
+157, 150, 150, 158, 151, 151, 154, 149, 149, 150,
+147, 147, 152, 148, 148, 153, 148, 148, 155, 150,
+150, 155, 150, 150, 152, 148, 148, 151, 147, 147,
+150, 146, 146, 153, 148, 148, 157, 151, 151, 155,
+150, 150, 153, 149, 149, 152, 148, 148, 144, 142,
+142, 133, 133, 133, 126, 126, 126, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 125,
+125, 125, 131, 130, 130, 140, 139, 139, 147, 144,
+144, 149, 146, 146, 152, 148, 148, 155, 149, 149,
+157, 150, 150, 157, 151, 151, 155, 150, 150, 153,
+148, 148, 150, 146, 146, 148, 145, 145, 146, 144,
+144, 146, 144, 144, 147, 145, 145, 148, 146, 146,
+150, 147, 147, 153, 148, 148, 154, 149, 149, 155,
+150, 150, 153, 149, 149, 150, 146, 146, 151, 147,
+147, 152, 148, 148, 150, 147, 147, 150, 147, 147,
+154, 150, 150, 154, 149, 149, 149, 147, 147, 150,
+147, 147, 153, 149, 149, 154, 149, 149, 153, 149,
+149, 147, 145, 145, 146, 144, 144, 153, 149, 149,
+156, 150, 150, 155, 150, 150, 154, 150, 150, 154,
+149, 149, 153, 149, 149, 152, 148, 148, 152, 148,
+148, 153, 149, 149, 157, 151, 151, 157, 151, 151,
+153, 149, 149, 150, 147, 147, 147, 145, 145, 151,
+148, 148, 155, 150, 150, 158, 152, 152, 159, 153,
+153, 160, 153, 153, 158, 152, 152, 156, 151, 151,
+154, 150, 150, 152, 149, 149, 154, 150, 150, 155,
+151, 151, 159, 153, 153, 162, 155, 155, 153, 150,
+150, 151, 148, 148, 157, 152, 152, 157, 152, 152,
+156, 151, 151, 152, 149, 149, 151, 148, 148, 149,
+146, 146, 147, 145, 145, 144, 143, 143, 146, 144,
+144, 153, 149, 149, 155, 151, 151, 154, 150, 150,
+161, 154, 154, 162, 155, 155, 159, 153, 153, 153,
+149, 149, 148, 146, 146, 146, 144, 144, 152, 149,
+149, 160, 153, 153, 168, 156, 156, 161, 154, 154,
+151, 148, 148, 156, 151, 151, 163, 155, 155, 158,
+153, 153, 154, 150, 150, 159, 153, 153, 158, 153,
+153, 151, 148, 148, 156, 152, 152, 161, 154, 154,
+166, 156, 156, 162, 154, 154, 158, 153, 153, 162,
+155, 155, 162, 155, 155, 157, 152, 152, 148, 146,
+146, 143, 142, 142, 142, 141, 141, 150, 148, 148,
+156, 152, 152, 160, 154, 154, 160, 154, 154, 152,
+150, 150, 158, 153, 153, 158, 153, 153, 153, 150,
+150, 157, 152, 152, 158, 153, 153, 160, 154, 154,
+162, 154, 154, 157, 152, 152, 146, 145, 145, 147,
+145, 145, 146, 145, 145, 146, 145, 145, 139, 139,
+139, 150, 147, 147, 154, 150, 150, 151, 148, 148,
+155, 151, 151, 159, 153, 153, 153, 150, 150, 152,
+149, 149, 156, 151, 151, 155, 151, 151, 148, 146,
+146, 155, 151, 151, 156, 152, 152, 158, 153, 153,
+155, 151, 151, 157, 152, 152, 163, 155, 155, 153,
+150, 150, 144, 143, 143, 144, 143, 143, 143, 141,
+141, 148, 146, 146, 146, 145, 145, 146, 144, 144,
+156, 151, 151, 162, 155, 155, 163, 155, 155, 160,
+153, 153, 156, 152, 152, 162, 154, 154, 151, 148,
+148, 151, 148, 148, 156, 151, 151, 154, 150, 150,
+151, 148, 148, 145, 144, 144, 144, 143, 143, 145,
+144, 144, 146, 144, 144, 149, 146, 146, 152, 149,
+149, 152, 149, 149, 151, 148, 148, 153, 149, 149,
+151, 148, 148, 152, 149, 149, 155, 151, 151, 153,
+150, 150, 152, 149, 149, 154, 150, 150, 160, 153,
+153, 159, 153, 153, 156, 151, 151, 150, 147, 147,
+146, 144, 144, 153, 149, 149, 154, 150, 150, 149,
+147, 147, 148, 146, 146, 148, 146, 146, 151, 148,
+148, 154, 150, 150, 155, 151, 151, 155, 150, 150,
+148, 146, 146, 147, 145, 145, 151, 148, 148, 154,
+150, 150, 156, 151, 151, 155, 150, 150, 153, 149,
+149, 149, 146, 146, 146, 144, 144, 148, 146, 146,
+148, 146, 146, 146, 144, 144, 146, 144, 144, 147,
+145, 145, 149, 146, 146, 151, 147, 147, 156, 151,
+151, 160, 152, 152, 158, 152, 152, 157, 151, 151,
+157, 151, 151, 154, 149, 149, 149, 146, 146, 147,
+144, 144, 146, 143, 143, 150, 147, 147, 153, 148,
+148, 151, 147, 147, 151, 147, 147, 155, 150, 150,
+155, 149, 149, 153, 148, 148, 155, 149, 149, 156,
+150, 150, 153, 149, 149, 152, 148, 148, 156, 151,
+151, 154, 149, 149, 146, 144, 144, 147, 145, 145,
+154, 149, 149, 155, 150, 150, 155, 150, 150, 151,
+147, 147, 142, 140, 140, 131, 131, 131, 125, 125,
+125, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 124, 124, 124, 130, 130,
+130, 139, 138, 138, 147, 144, 144, 147, 144, 144,
+149, 146, 146, 151, 147, 147, 151, 147, 147, 151,
+147, 147, 149, 145, 145, 148, 145, 145, 148, 145,
+145, 147, 144, 144, 144, 142, 142, 146, 143, 143,
+147, 145, 145, 149, 146, 146, 151, 147, 147, 152,
+147, 147, 153, 148, 148, 154, 149, 149, 149, 145,
+145, 145, 143, 143, 148, 145, 145, 150, 146, 146,
+149, 146, 146, 150, 147, 147, 150, 147, 147, 146,
+144, 144, 142, 141, 141, 149, 146, 146, 154, 149,
+149, 153, 148, 148, 150, 147, 147, 147, 145, 145,
+147, 145, 145, 149, 146, 146, 147, 144, 144, 147,
+144, 144, 151, 147, 147, 152, 148, 148, 149, 146,
+146, 148, 145, 145, 149, 146, 146, 152, 148, 148,
+153, 149, 149, 148, 145, 145, 146, 144, 144, 149,
+146, 146, 150, 147, 147, 150, 146, 146, 149, 146,
+146, 148, 145, 145, 150, 147, 147, 151, 147, 147,
+151, 147, 147, 152, 148, 148, 153, 149, 149, 153,
+148, 148, 153, 149, 149, 153, 149, 149, 151, 148,
+148, 145, 144, 144, 145, 143, 143, 149, 147, 147,
+154, 149, 149, 158, 151, 151, 153, 149, 149, 150,
+147, 147, 152, 148, 148, 152, 148, 148, 154, 149,
+149, 153, 149, 149, 154, 150, 150, 154, 150, 150,
+153, 149, 149, 154, 150, 150, 155, 150, 150, 150,
+147, 147, 149, 146, 146, 146, 144, 144, 148, 145,
+145, 150, 147, 147, 154, 150, 150, 155, 150, 150,
+149, 146, 146, 149, 146, 146, 149, 147, 147, 153,
+149, 149, 154, 150, 150, 151, 148, 148, 150, 147,
+147, 151, 148, 148, 155, 150, 150, 158, 152, 152,
+161, 153, 153, 162, 153, 153, 157, 151, 151, 156,
+151, 151, 164, 153, 153, 160, 152, 152, 150, 148,
+148, 151, 148, 148, 150, 147, 147, 150, 147, 147,
+147, 145, 145, 145, 144, 144, 145, 144, 144, 144,
+143, 143, 146, 144, 144, 151, 148, 148, 153, 149,
+149, 152, 149, 149, 153, 149, 149, 150, 148, 148,
+154, 150, 150, 163, 153, 153, 157, 151, 151, 155,
+150, 150, 154, 149, 149, 148, 146, 146, 144, 143,
+143, 149, 147, 147, 147, 145, 145, 146, 144, 144,
+145, 144, 144, 150, 147, 147, 148, 146, 146, 145,
+144, 144, 148, 146, 146, 145, 144, 144, 140, 139,
+139, 144, 143, 143, 152, 148, 148, 148, 146, 146,
+146, 145, 145, 153, 149, 149, 148, 146, 146, 144,
+143, 143, 142, 141, 141, 149, 147, 147, 149, 146,
+146, 152, 148, 148, 147, 145, 145, 146, 145, 145,
+154, 150, 150, 154, 149, 149, 151, 148, 148, 155,
+150, 150, 157, 151, 151, 150, 147, 147, 147, 145,
+145, 146, 145, 145, 149, 146, 146, 157, 151, 151,
+152, 148, 148, 144, 143, 143, 147, 145, 145, 150,
+147, 147, 150, 147, 147, 151, 147, 147, 152, 148,
+148, 150, 147, 147, 146, 144, 144, 147, 145, 145,
+147, 145, 145, 147, 145, 145, 146, 144, 144, 145,
+144, 144, 148, 146, 146, 152, 149, 149, 154, 149,
+149, 155, 150, 150, 150, 147, 147, 149, 146, 146,
+154, 149, 149, 154, 149, 149, 151, 147, 147, 151,
+147, 147, 151, 147, 147, 145, 143, 143, 144, 142,
+142, 153, 148, 148, 154, 149, 149, 148, 145, 145,
+149, 146, 146, 152, 148, 148, 156, 150, 150, 157,
+151, 151, 150, 147, 147, 146, 144, 144, 146, 144,
+144, 147, 145, 145, 148, 146, 146, 145, 143, 143,
+144, 142, 142, 145, 143, 143, 147, 145, 145, 148,
+145, 145, 150, 147, 147, 152, 148, 148, 153, 148,
+148, 154, 148, 148, 155, 149, 149, 156, 149, 149,
+154, 148, 148, 149, 146, 146, 142, 141, 141, 146,
+144, 144, 153, 148, 148, 148, 145, 145, 145, 143,
+143, 148, 145, 145, 150, 146, 146, 151, 146, 146,
+153, 148, 148, 155, 149, 149, 150, 146, 146, 146,
+143, 143, 150, 146, 146, 149, 146, 146, 144, 142,
+142, 146, 143, 143, 149, 145, 145, 149, 146, 146,
+149, 145, 145, 146, 143, 143, 138, 137, 137, 129,
+129, 129, 124, 124, 124, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 129, 129, 129, 141, 140, 140,
+151, 146, 146, 152, 147, 147, 149, 146, 146, 147,
+144, 144, 146, 143, 143, 145, 143, 143, 145, 143,
+143, 147, 144, 144, 152, 147, 147, 151, 147, 147,
+149, 146, 146, 148, 145, 145, 149, 146, 146, 151,
+147, 147, 151, 147, 147, 150, 146, 146, 152, 148,
+148, 152, 148, 148, 146, 144, 144, 143, 142, 142,
+145, 143, 143, 150, 147, 147, 157, 150, 150, 151,
+147, 147, 145, 143, 143, 142, 141, 141, 145, 143,
+143, 157, 150, 150, 157, 150, 150, 152, 148, 148,
+150, 147, 147, 149, 146, 146, 146, 144, 144, 148,
+145, 145, 150, 146, 146, 153, 148, 148, 156, 150,
+150, 153, 148, 148, 152, 148, 148, 153, 149, 149,
+153, 149, 149, 151, 148, 148, 146, 144, 144, 143,
+142, 142, 153, 149, 149, 154, 149, 149, 143, 142,
+142, 143, 142, 142, 147, 145, 145, 149, 146, 146,
+151, 148, 148, 151, 148, 148, 155, 150, 150, 161,
+153, 153, 159, 152, 152, 155, 150, 150, 151, 148,
+148, 149, 146, 146, 146, 144, 144, 148, 146, 146,
+155, 150, 150, 161, 152, 152, 164, 153, 153, 151,
+147, 147, 146, 144, 144, 157, 151, 151, 157, 151,
+151, 152, 148, 148, 153, 149, 149, 155, 150, 150,
+155, 150, 150, 157, 151, 151, 151, 148, 148, 153,
+149, 149, 154, 150, 150, 151, 147, 147, 150, 147,
+147, 151, 148, 148, 155, 150, 150, 159, 152, 152,
+150, 147, 147, 142, 141, 141, 138, 138, 138, 141,
+141, 141, 153, 150, 150, 156, 151, 151, 154, 150,
+150, 155, 151, 151, 158, 153, 153, 156, 152, 152,
+155, 151, 151, 154, 150, 150, 155, 151, 151, 155,
+151, 151, 149, 147, 147, 145, 144, 144, 148, 146,
+146, 145, 143, 143, 147, 145, 145, 146, 144, 144,
+144, 143, 143, 152, 149, 149, 161, 153, 153, 162,
+153, 153, 164, 154, 154, 164, 154, 154, 164, 154,
+154, 164, 155, 155, 159, 153, 153, 153, 150, 150,
+143, 142, 142, 145, 143, 143, 146, 145, 145, 143,
+142, 142, 149, 147, 147, 146, 145, 145, 146, 144,
+144, 146, 144, 144, 144, 143, 143, 144, 143, 143,
+148, 146, 146, 147, 145, 145, 158, 152, 152, 143,
+142, 142, 144, 143, 143, 146, 145, 145, 146, 145,
+145, 144, 143, 143, 142, 141, 141, 147, 145, 145,
+146, 144, 144, 151, 148, 148, 145, 143, 143, 143,
+142, 142, 152, 148, 148, 157, 151, 151, 140, 139,
+139, 139, 139, 139, 148, 146, 146, 151, 148, 148,
+151, 148, 148, 145, 143, 143, 146, 144, 144, 158,
+152, 152, 154, 150, 150, 151, 147, 147, 148, 146,
+146, 146, 144, 144, 154, 149, 149, 160, 152, 152,
+157, 151, 151, 156, 150, 150, 158, 152, 152, 156,
+151, 151, 155, 150, 150, 159, 152, 152, 157, 151,
+151, 153, 149, 149, 155, 150, 150, 157, 152, 152,
+155, 150, 150, 153, 149, 149, 153, 149, 149, 154,
+150, 150, 156, 151, 151, 157, 151, 151, 157, 151,
+151, 155, 150, 150, 154, 149, 149, 156, 150, 150,
+153, 149, 149, 149, 146, 146, 155, 150, 150, 158,
+151, 151, 151, 147, 147, 152, 148, 148, 159, 150,
+150, 153, 148, 148, 147, 144, 144, 156, 150, 150,
+160, 152, 152, 157, 151, 151, 154, 149, 149, 151,
+148, 148, 152, 148, 148, 152, 148, 148, 149, 146,
+146, 146, 144, 144, 144, 142, 142, 150, 147, 147,
+158, 151, 151, 154, 149, 149, 150, 147, 147, 151,
+147, 147, 152, 148, 148, 152, 148, 148, 153, 148,
+148, 155, 149, 149, 155, 149, 149, 153, 148, 148,
+147, 144, 144, 148, 145, 145, 155, 149, 149, 150,
+147, 147, 145, 143, 143, 146, 144, 144, 147, 144,
+144, 148, 145, 145, 151, 147, 147, 153, 148, 148,
+149, 146, 146, 145, 142, 142, 143, 141, 141, 145,
+142, 142, 149, 146, 146, 150, 146, 146, 148, 145,
+145, 146, 143, 143, 145, 143, 143, 146, 143, 143,
+138, 137, 137, 128, 128, 128, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
+128, 128, 128, 136, 136, 136, 145, 143, 143, 150,
+146, 146, 148, 145, 145, 144, 142, 142, 145, 142,
+142, 147, 144, 144, 150, 146, 146, 149, 146, 146,
+144, 142, 142, 143, 141, 141, 144, 142, 142, 145,
+143, 143, 147, 145, 145, 152, 147, 147, 150, 146,
+146, 147, 144, 144, 149, 146, 146, 151, 147, 147,
+152, 147, 147, 150, 146, 146, 146, 144, 144, 148,
+145, 145, 150, 146, 146, 153, 148, 148, 153, 148,
+148, 152, 147, 147, 150, 147, 147, 149, 146, 146,
+151, 147, 147, 153, 148, 148, 153, 148, 148, 153,
+149, 149, 154, 149, 149, 152, 148, 148, 151, 147,
+147, 152, 148, 148, 151, 147, 147, 150, 147, 147,
+151, 148, 148, 153, 149, 149, 156, 150, 150, 154,
+149, 149, 149, 146, 146, 149, 146, 146, 151, 147,
+147, 155, 150, 150, 154, 149, 149, 147, 145, 145,
+147, 145, 145, 150, 147, 147, 148, 145, 145, 144,
+142, 142, 138, 137, 137, 141, 140, 140, 148, 146,
+146, 147, 145, 145, 146, 145, 145, 150, 147, 147,
+152, 148, 148, 154, 149, 149, 148, 146, 146, 145,
+143, 143, 152, 148, 148, 156, 150, 150, 156, 150,
+150, 152, 148, 148, 147, 144, 144, 146, 144, 144,
+149, 147, 147, 159, 151, 151, 156, 150, 150, 148,
+146, 146, 148, 146, 146, 149, 146, 146, 151, 148,
+148, 152, 149, 149, 152, 148, 148, 155, 150, 150,
+156, 151, 151, 155, 150, 150, 152, 149, 149, 146,
+144, 144, 150, 147, 147, 157, 152, 152, 156, 151,
+151, 154, 150, 150, 152, 149, 149, 145, 144, 144,
+138, 138, 138, 133, 133, 133, 132, 132, 132, 138,
+138, 138, 149, 146, 146, 160, 152, 152, 163, 153,
+153, 163, 153, 153, 157, 152, 152, 155, 151, 151,
+156, 151, 151, 158, 152, 152, 157, 151, 151, 149,
+146, 146, 152, 148, 148, 158, 151, 151, 151, 148,
+148, 145, 144, 144, 148, 146, 146, 152, 149, 149,
+148, 146, 146, 146, 145, 145, 147, 145, 145, 142,
+142, 142, 140, 140, 140, 142, 142, 142, 149, 147,
+147, 148, 146, 146, 149, 146, 146, 152, 149, 149,
+164, 153, 153, 164, 154, 154, 157, 151, 151, 153,
+149, 149, 150, 147, 147, 158, 152, 152, 163, 154,
+154, 156, 151, 151, 151, 148, 148, 152, 149, 149,
+159, 152, 152, 162, 153, 153, 153, 149, 149, 153,
+149, 149, 158, 151, 151, 155, 150, 150, 152, 148,
+148, 157, 151, 151, 158, 152, 152, 157, 151, 151,
+154, 150, 150, 153, 149, 149, 153, 149, 149, 153,
+149, 149, 147, 144, 144, 147, 145, 145, 148, 146,
+146, 153, 149, 149, 157, 151, 151, 159, 152, 152,
+156, 150, 150, 149, 146, 146, 153, 149, 149, 158,
+152, 152, 163, 153, 153, 161, 152, 152, 150, 147,
+147, 147, 145, 145, 147, 145, 145, 152, 148, 148,
+155, 150, 150, 155, 150, 150, 153, 149, 149, 150,
+147, 147, 152, 148, 148, 151, 148, 148, 147, 145,
+145, 152, 148, 148, 163, 153, 153, 156, 150, 150,
+150, 147, 147, 155, 150, 150, 154, 149, 149, 149,
+146, 146, 150, 147, 147, 150, 147, 147, 151, 147,
+147, 152, 147, 147, 152, 148, 148, 150, 146, 146,
+147, 145, 145, 149, 146, 146, 149, 146, 146, 147,
+144, 144, 149, 146, 146, 152, 148, 148, 150, 147,
+147, 149, 146, 146, 149, 146, 146, 148, 145, 145,
+146, 144, 144, 148, 145, 145, 150, 147, 147, 148,
+145, 145, 149, 146, 146, 152, 148, 148, 157, 150,
+150, 160, 151, 151, 152, 148, 148, 148, 145, 145,
+150, 147, 147, 149, 146, 146, 146, 144, 144, 148,
+145, 145, 147, 145, 145, 140, 139, 139, 138, 138,
+138, 139, 138, 138, 144, 142, 142, 147, 144, 144,
+147, 144, 144, 148, 145, 145, 152, 147, 147, 153,
+148, 148, 151, 146, 146, 149, 145, 145, 148, 144,
+144, 146, 143, 143, 137, 137, 137, 128, 128, 128,
+124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 127, 127, 127, 135,
+135, 135, 144, 142, 142, 148, 145, 145, 148, 144,
+144, 146, 144, 144, 147, 144, 144, 150, 146, 146,
+153, 147, 147, 155, 148, 148, 155, 148, 148, 149,
+145, 145, 144, 142, 142, 146, 143, 143, 149, 146,
+146, 154, 149, 149, 151, 147, 147, 149, 146, 146,
+152, 148, 148, 153, 148, 148, 152, 148, 148, 150,
+146, 146, 147, 145, 145, 149, 146, 146, 149, 146,
+146, 146, 144, 144, 149, 146, 146, 149, 146, 146,
+141, 140, 140, 142, 141, 141, 147, 145, 145, 155,
+149, 149, 161, 151, 151, 152, 148, 148, 147, 144,
+144, 144, 143, 143, 147, 144, 144, 151, 147, 147,
+154, 149, 149, 152, 148, 148, 145, 143, 143, 144,
+142, 142, 144, 143, 143, 149, 146, 146, 151, 147,
+147, 152, 148, 148, 151, 148, 148, 152, 148, 148,
+155, 150, 150, 155, 150, 150, 151, 148, 148, 152,
+148, 148, 152, 148, 148, 153, 149, 149, 151, 148,
+148, 146, 144, 144, 150, 147, 147, 151, 148, 148,
+141, 141, 141, 143, 142, 142, 152, 148, 148, 146,
+144, 144, 143, 142, 142, 150, 147, 147, 152, 148,
+148, 151, 148, 148, 148, 146, 146, 146, 144, 144,
+146, 144, 144, 146, 144, 144, 148, 146, 146, 151,
+148, 148, 155, 150, 150, 157, 151, 151, 157, 151,
+151, 157, 151, 151, 151, 148, 148, 149, 147, 147,
+158, 152, 152, 157, 152, 152, 151, 148, 148, 157,
+151, 151, 160, 152, 152, 156, 151, 151, 153, 149,
+149, 150, 147, 147, 151, 148, 148, 151, 147, 147,
+156, 150, 150, 155, 150, 150, 152, 148, 148, 157,
+151, 151, 160, 152, 152, 156, 151, 151, 153, 149,
+149, 154, 150, 150, 156, 151, 151, 147, 145, 145,
+145, 144, 144, 146, 144, 144, 146, 144, 144, 146,
+144, 144, 149, 147, 147, 155, 150, 150, 157, 151,
+151, 155, 150, 150, 148, 146, 146, 157, 151, 151,
+160, 152, 152, 158, 151, 151, 159, 152, 152, 162,
+152, 152, 161, 152, 152, 156, 151, 151, 150, 147,
+147, 147, 145, 145, 149, 146, 146, 150, 147, 147,
+153, 149, 149, 160, 153, 153, 158, 152, 152, 156,
+151, 151, 158, 152, 152, 160, 153, 153, 157, 151,
+151, 146, 144, 144, 154, 150, 150, 156, 151, 151,
+145, 144, 144, 148, 146, 146, 149, 147, 147, 151,
+148, 148, 153, 149, 149, 152, 149, 149, 152, 148,
+148, 150, 147, 147, 154, 150, 150, 156, 151, 151,
+155, 150, 150, 155, 150, 150, 155, 151, 151, 145,
+144, 144, 144, 143, 143, 152, 148, 148, 158, 151,
+151, 160, 152, 152, 158, 151, 151, 158, 151, 151,
+159, 152, 152, 158, 151, 151, 155, 150, 150, 157,
+151, 151, 155, 150, 150, 147, 145, 145, 145, 143,
+143, 144, 143, 143, 146, 144, 144, 149, 146, 146,
+152, 148, 148, 150, 147, 147, 146, 144, 144, 147,
+145, 145, 149, 147, 147, 154, 149, 149, 157, 150,
+150, 159, 151, 151, 156, 150, 150, 155, 150, 150,
+156, 150, 150, 153, 149, 149, 149, 146, 146, 152,
+148, 148, 152, 148, 148, 148, 145, 145, 149, 146,
+146, 151, 147, 147, 149, 146, 146, 150, 146, 146,
+154, 149, 149, 153, 148, 148, 150, 147, 147, 149,
+146, 146, 149, 146, 146, 152, 148, 148, 153, 149,
+149, 153, 149, 149, 147, 145, 145, 144, 142, 142,
+149, 146, 146, 149, 146, 146, 148, 145, 145, 147,
+145, 145, 149, 146, 146, 151, 147, 147, 150, 146,
+146, 148, 145, 145, 147, 145, 145, 148, 145, 145,
+148, 145, 145, 148, 145, 145, 148, 145, 145, 151,
+147, 147, 153, 148, 148, 153, 148, 148, 151, 146,
+146, 150, 146, 146, 151, 147, 147, 153, 148, 148,
+155, 149, 149, 154, 149, 149, 152, 147, 147, 152,
+147, 147, 150, 146, 146, 145, 142, 142, 136, 135,
+135, 127, 127, 127, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 126, 126, 126, 134, 133, 133, 142, 140,
+140, 146, 144, 144, 147, 144, 144, 147, 144, 144,
+147, 144, 144, 149, 145, 145, 153, 147, 147, 157,
+150, 150, 158, 150, 150, 155, 149, 149, 151, 147,
+147, 151, 147, 147, 151, 147, 147, 151, 147, 147,
+148, 145, 145, 147, 145, 145, 151, 147, 147, 152,
+147, 147, 150, 146, 146, 149, 146, 146, 147, 145,
+145, 146, 144, 144, 147, 144, 144, 147, 144, 144,
+146, 144, 144, 145, 143, 143, 142, 141, 141, 144,
+143, 143, 150, 146, 146, 156, 150, 150, 158, 150,
+150, 153, 148, 148, 149, 146, 146, 146, 144, 144,
+147, 145, 145, 150, 146, 146, 151, 147, 147, 148,
+145, 145, 148, 145, 145, 151, 147, 147, 152, 148,
+148, 153, 149, 149, 154, 149, 149, 153, 148, 148,
+151, 148, 148, 150, 147, 147, 150, 147, 147, 151,
+147, 147, 148, 146, 146, 146, 144, 144, 147, 145,
+145, 145, 144, 144, 141, 140, 140, 142, 141, 141,
+143, 142, 142, 141, 140, 140, 142, 141, 141, 145,
+143, 143, 146, 145, 145, 148, 146, 146, 150, 147,
+147, 152, 148, 148, 154, 149, 149, 152, 148, 148,
+151, 148, 148, 150, 147, 147, 146, 144, 144, 144,
+143, 143, 144, 143, 143, 149, 146, 146, 155, 150,
+150, 152, 149, 149, 150, 147, 147, 148, 146, 146,
+150, 147, 147, 155, 150, 150, 150, 147, 147, 152,
+148, 148, 161, 153, 153, 157, 151, 151, 149, 147,
+147, 150, 147, 147, 152, 148, 148, 155, 149, 149,
+155, 150, 150, 155, 150, 150, 155, 150, 150, 154,
+149, 149, 154, 150, 150, 151, 147, 147, 148, 146,
+146, 146, 145, 145, 147, 145, 145, 146, 145, 145,
+146, 145, 145, 149, 146, 146, 148, 146, 146, 147,
+146, 146, 148, 146, 146, 155, 150, 150, 154, 149,
+149, 145, 144, 144, 146, 144, 144, 149, 146, 146,
+148, 146, 146, 153, 149, 149, 154, 150, 150, 157,
+151, 151, 155, 150, 150, 153, 149, 149, 150, 147,
+147, 149, 147, 147, 154, 149, 149, 156, 151, 151,
+153, 149, 149, 153, 149, 149, 152, 149, 149, 151,
+147, 147, 149, 147, 147, 148, 146, 146, 145, 144,
+144, 144, 143, 143, 147, 145, 145, 148, 146, 146,
+148, 146, 146, 148, 146, 146, 148, 146, 146, 146,
+144, 144, 149, 146, 146, 151, 148, 148, 150, 147,
+147, 151, 148, 148, 154, 149, 149, 157, 151, 151,
+159, 151, 151, 155, 150, 150, 150, 147, 147, 146,
+144, 144, 150, 147, 147, 153, 149, 149, 155, 151,
+151, 153, 149, 149, 152, 148, 148, 158, 151, 151,
+157, 151, 151, 152, 148, 148, 153, 149, 149, 153,
+149, 149, 150, 147, 147, 147, 145, 145, 143, 142,
+142, 143, 142, 142, 145, 144, 144, 150, 147, 147,
+150, 147, 147, 149, 146, 146, 153, 149, 149, 153,
+149, 149, 149, 146, 146, 153, 149, 149, 157, 151,
+151, 153, 148, 148, 151, 147, 147, 151, 148, 148,
+150, 147, 147, 149, 146, 146, 147, 145, 145, 146,
+144, 144, 147, 145, 145, 150, 147, 147, 150, 147,
+147, 147, 144, 144, 150, 146, 146, 153, 148, 148,
+152, 148, 148, 151, 147, 147, 152, 148, 148, 150,
+147, 147, 148, 146, 146, 148, 146, 146, 146, 144,
+144, 145, 143, 143, 148, 145, 145, 149, 146, 146,
+146, 143, 143, 149, 146, 146, 153, 148, 148, 150,
+146, 146, 147, 145, 145, 147, 144, 144, 146, 144,
+144, 147, 144, 144, 148, 145, 145, 149, 146, 146,
+150, 146, 146, 150, 146, 146, 151, 147, 147, 154,
+148, 148, 152, 147, 147, 150, 146, 146, 151, 147,
+147, 152, 147, 147, 152, 147, 147, 152, 147, 147,
+152, 147, 147, 151, 147, 147, 151, 146, 146, 145,
+142, 142, 135, 135, 135, 127, 127, 127, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 126, 126,
+126, 134, 133, 133, 143, 141, 141, 148, 145, 145,
+149, 145, 145, 150, 146, 146, 149, 146, 146, 149,
+145, 145, 152, 147, 147, 153, 148, 148, 151, 147,
+147, 151, 147, 147, 151, 147, 147, 152, 147, 147,
+151, 147, 147, 150, 146, 146, 147, 144, 144, 148,
+145, 145, 154, 148, 148, 152, 148, 148, 151, 147,
+147, 150, 147, 147, 149, 146, 146, 148, 145, 145,
+150, 146, 146, 150, 146, 146, 148, 145, 145, 147,
+145, 145, 146, 144, 144, 145, 144, 144, 149, 146,
+146, 153, 148, 148, 155, 149, 149, 154, 149, 149,
+151, 147, 147, 148, 145, 145, 148, 145, 145, 150,
+147, 147, 151, 147, 147, 151, 147, 147, 152, 148,
+148, 153, 149, 149, 153, 149, 149, 154, 150, 150,
+154, 149, 149, 153, 149, 149, 151, 148, 148, 148,
+146, 146, 150, 147, 147, 148, 146, 146, 144, 142,
+142, 143, 142, 142, 143, 141, 141, 142, 141, 141,
+141, 141, 141, 141, 140, 140, 145, 143, 143, 145,
+143, 143, 144, 142, 142, 152, 149, 149, 154, 150,
+150, 148, 145, 145, 150, 147, 147, 154, 149, 149,
+156, 151, 151, 155, 150, 150, 150, 147, 147, 146,
+144, 144, 144, 143, 143, 145, 144, 144, 148, 146,
+146, 150, 147, 147, 145, 143, 143, 145, 143, 143,
+147, 145, 145, 147, 145, 145, 144, 143, 143, 139,
+138, 138, 150, 147, 147, 158, 151, 151, 148, 146,
+146, 149, 147, 147, 156, 151, 151, 156, 151, 151,
+155, 151, 151, 155, 151, 151, 154, 150, 150, 152,
+149, 149, 147, 145, 145, 146, 144, 144, 146, 144,
+144, 149, 146, 146, 150, 147, 147, 153, 149, 149,
+153, 149, 149, 153, 149, 149, 157, 151, 151, 154,
+150, 150, 153, 149, 149, 153, 149, 149, 152, 149,
+149, 149, 147, 147, 150, 148, 148, 150, 148, 148,
+140, 140, 140, 148, 146, 146, 157, 151, 151, 155,
+150, 150, 153, 149, 149, 150, 147, 147, 151, 148,
+148, 152, 148, 148, 157, 151, 151, 158, 151, 151,
+156, 151, 151, 150, 147, 147, 146, 144, 144, 140,
+140, 140, 146, 145, 145, 151, 148, 148, 149, 147,
+147, 149, 147, 147, 150, 148, 148, 152, 149, 149,
+151, 148, 148, 148, 145, 145, 146, 144, 144, 145,
+144, 144, 149, 146, 146, 151, 147, 147, 152, 148,
+148, 154, 150, 150, 156, 151, 151, 158, 151, 151,
+154, 150, 150, 152, 149, 149, 155, 150, 150, 154,
+150, 150, 153, 149, 149, 154, 150, 150, 154, 150,
+150, 152, 149, 149, 156, 151, 151, 159, 152, 152,
+159, 152, 152, 157, 151, 151, 154, 149, 149, 154,
+149, 149, 153, 149, 149, 152, 148, 148, 151, 148,
+148, 152, 149, 149, 154, 150, 150, 154, 150, 150,
+154, 149, 149, 155, 150, 150, 149, 146, 146, 140,
+139, 139, 151, 148, 148, 156, 151, 151, 149, 147,
+147, 151, 148, 148, 154, 149, 149, 152, 148, 148,
+151, 148, 148, 150, 147, 147, 151, 148, 148, 151,
+148, 148, 152, 148, 148, 151, 147, 147, 151, 147,
+147, 153, 148, 148, 153, 148, 148, 150, 146, 146,
+147, 145, 145, 146, 144, 144, 145, 143, 143, 146,
+144, 144, 147, 145, 145, 143, 142, 142, 145, 143,
+143, 150, 147, 147, 147, 145, 145, 147, 145, 145,
+150, 147, 147, 150, 146, 146, 150, 147, 147, 150,
+146, 146, 150, 146, 146, 150, 146, 146, 149, 146,
+146, 150, 146, 146, 151, 147, 147, 151, 147, 147,
+150, 146, 146, 149, 146, 146, 149, 146, 146, 150,
+146, 146, 151, 147, 147, 151, 147, 147, 148, 145,
+145, 150, 146, 146, 149, 146, 146, 147, 144, 144,
+147, 144, 144, 142, 140, 140, 133, 133, 133, 126,
+126, 126, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 125, 125, 125, 133, 132, 132,
+143, 141, 141, 152, 147, 147, 151, 147, 147, 152,
+147, 147, 151, 147, 147, 149, 146, 146, 150, 146,
+146, 149, 146, 146, 147, 145, 145, 148, 145, 145,
+149, 146, 146, 151, 147, 147, 151, 147, 147, 152,
+147, 147, 152, 147, 147, 152, 147, 147, 152, 148,
+148, 151, 147, 147, 151, 147, 147, 150, 147, 147,
+152, 148, 148, 152, 148, 148, 149, 146, 146, 149,
+146, 146, 149, 146, 146, 149, 146, 146, 146, 144,
+144, 145, 143, 143, 146, 144, 144, 148, 145, 145,
+150, 147, 147, 150, 147, 147, 149, 146, 146, 148,
+145, 145, 152, 148, 148, 155, 149, 149, 156, 150,
+150, 154, 149, 149, 152, 148, 148, 152, 149, 149,
+152, 149, 149, 152, 148, 148, 152, 148, 148, 150,
+147, 147, 149, 146, 146, 146, 144, 144, 144, 143,
+143, 145, 143, 143, 146, 144, 144, 148, 146, 146,
+150, 147, 147, 149, 146, 146, 147, 145, 145, 150,
+147, 147, 150, 147, 147, 150, 147, 147, 156, 150,
+150, 156, 150, 150, 150, 147, 147, 154, 150, 150,
+156, 151, 151, 156, 151, 151, 151, 148, 148, 146,
+145, 145, 145, 144, 144, 150, 147, 147, 155, 150,
+150, 154, 149, 149, 151, 148, 148, 147, 145, 145,
+147, 145, 145, 147, 145, 145, 147, 145, 145, 145,
+144, 144, 147, 145, 145, 155, 150, 150, 153, 149,
+149, 149, 147, 147, 154, 150, 150, 155, 151, 151,
+153, 150, 150, 155, 151, 151, 153, 150, 150, 149,
+146, 146, 146, 144, 144, 144, 143, 143, 142, 141,
+141, 144, 143, 143, 147, 145, 145, 149, 147, 147,
+151, 148, 148, 153, 149, 149, 155, 150, 150, 155,
+150, 150, 151, 148, 148, 151, 148, 148, 153, 149,
+149, 156, 151, 151, 156, 151, 151, 152, 149, 149,
+143, 142, 142, 150, 147, 147, 162, 153, 153, 162,
+153, 153, 156, 151, 151, 149, 147, 147, 152, 149,
+149, 152, 149, 149, 149, 147, 147, 153, 149, 149,
+154, 150, 150, 148, 146, 146, 145, 143, 143, 144,
+143, 143, 154, 150, 150, 151, 148, 148, 143, 142,
+142, 146, 145, 145, 147, 145, 145, 144, 143, 143,
+144, 143, 143, 146, 144, 144, 149, 147, 147, 151,
+147, 147, 152, 148, 148, 154, 149, 149, 153, 149,
+149, 153, 149, 149, 156, 150, 150, 156, 150, 150,
+152, 149, 149, 153, 150, 150, 154, 150, 150, 153,
+149, 149, 155, 151, 151, 155, 151, 151, 149, 147,
+147, 150, 147, 147, 153, 149, 149, 155, 150, 150,
+156, 151, 151, 155, 150, 150, 157, 151, 151, 156,
+150, 150, 153, 149, 149, 152, 148, 148, 153, 149,
+149, 153, 149, 149, 154, 150, 150, 154, 149, 149,
+148, 146, 146, 144, 143, 143, 143, 141, 141, 148,
+146, 146, 149, 146, 146, 146, 145, 145, 151, 148,
+148, 153, 149, 149, 151, 148, 148, 152, 148, 148,
+151, 148, 148, 148, 145, 145, 147, 145, 145, 148,
+146, 146, 150, 147, 147, 153, 148, 148, 156, 150,
+150, 155, 149, 149, 150, 146, 146, 144, 142, 142,
+144, 142, 142, 145, 143, 143, 145, 143, 143, 142,
+141, 141, 141, 140, 140, 148, 145, 145, 150, 147,
+147, 148, 145, 145, 146, 144, 144, 147, 144, 144,
+151, 147, 147, 153, 148, 148, 153, 148, 148, 153,
+148, 148, 153, 148, 148, 152, 148, 148, 151, 147,
+147, 153, 148, 148, 155, 149, 149, 152, 147, 147,
+151, 147, 147, 151, 147, 147, 152, 148, 148, 150,
+146, 146, 146, 144, 144, 146, 144, 144, 146, 144,
+144, 144, 142, 142, 144, 142, 142, 138, 137, 137,
+130, 130, 130, 125, 125, 125, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+125, 125, 125, 132, 132, 132, 141, 140, 140, 149,
+146, 146, 149, 146, 146, 150, 146, 146, 150, 147,
+147, 150, 146, 146, 150, 147, 147, 150, 147, 147,
+150, 147, 147, 151, 147, 147, 150, 146, 146, 148,
+145, 145, 150, 146, 146, 151, 147, 147, 153, 148,
+148, 151, 147, 147, 149, 146, 146, 150, 147, 147,
+149, 146, 146, 149, 146, 146, 152, 148, 148, 151,
+147, 147, 150, 147, 147, 149, 146, 146, 151, 147,
+147, 152, 148, 148, 149, 146, 146, 147, 145, 145,
+145, 143, 143, 145, 143, 143, 147, 144, 144, 149,
+146, 146, 152, 148, 148, 153, 149, 149, 155, 150,
+150, 156, 151, 151, 156, 150, 150, 155, 150, 150,
+156, 151, 151, 155, 150, 150, 153, 149, 149, 152,
+148, 148, 152, 148, 148, 152, 149, 149, 150, 147,
+147, 149, 146, 146, 149, 146, 146, 151, 148, 148,
+153, 149, 149, 153, 149, 149, 151, 148, 148, 151,
+147, 147, 150, 147, 147, 152, 148, 148, 153, 149,
+149, 150, 148, 148, 150, 147, 147, 154, 149, 149,
+160, 153, 153, 160, 153, 153, 155, 150, 150, 151,
+148, 148, 148, 146, 146, 146, 145, 145, 149, 147,
+147, 152, 148, 148, 155, 150, 150, 154, 150, 150,
+152, 149, 149, 148, 146, 146, 146, 145, 145, 146,
+145, 145, 150, 147, 147, 153, 149, 149, 156, 150,
+150, 156, 151, 151, 155, 150, 150, 153, 149, 149,
+152, 148, 148, 151, 148, 148, 151, 148, 148, 150,
+147, 147, 150, 147, 147, 150, 147, 147, 148, 146,
+146, 144, 143, 143, 139, 138, 138, 144, 143, 143,
+148, 146, 146, 149, 147, 147, 146, 144, 144, 144,
+143, 143, 144, 143, 143, 152, 148, 148, 156, 151,
+151, 153, 149, 149, 150, 147, 147, 148, 146, 146,
+152, 148, 148, 154, 150, 150, 156, 151, 151, 156,
+151, 151, 153, 149, 149, 150, 147, 147, 151, 148,
+148, 150, 147, 147, 147, 145, 145, 152, 149, 149,
+155, 150, 150, 156, 151, 151, 155, 150, 150, 154,
+150, 150, 153, 149, 149, 148, 146, 146, 145, 144,
+144, 146, 144, 144, 147, 145, 145, 148, 146, 146,
+146, 144, 144, 146, 144, 144, 147, 145, 145, 149,
+147, 147, 151, 148, 148, 152, 149, 149, 151, 148,
+148, 155, 150, 150, 158, 152, 152, 152, 148, 148,
+150, 147, 147, 150, 148, 148, 150, 148, 148, 150,
+148, 148, 150, 147, 147, 146, 144, 144, 146, 144,
+144, 149, 147, 147, 150, 147, 147, 152, 149, 149,
+157, 152, 152, 158, 152, 152, 156, 151, 151, 147,
+145, 145, 149, 146, 146, 151, 148, 148, 151, 148,
+148, 150, 147, 147, 148, 145, 145, 148, 146, 146,
+151, 148, 148, 154, 149, 149, 151, 148, 148, 151,
+148, 148, 151, 148, 148, 149, 146, 146, 150, 147,
+147, 152, 148, 148, 149, 146, 146, 146, 144, 144,
+142, 141, 141, 144, 143, 143, 146, 145, 145, 148,
+145, 145, 152, 148, 148, 156, 150, 150, 157, 150,
+150, 154, 149, 149, 151, 147, 147, 151, 148, 148,
+147, 145, 145, 145, 143, 143, 146, 144, 144, 150,
+147, 147, 153, 148, 148, 154, 149, 149, 152, 148,
+148, 149, 146, 146, 149, 146, 146, 151, 147, 147,
+154, 149, 149, 154, 149, 149, 153, 148, 148, 152,
+147, 147, 151, 147, 147, 152, 148, 148, 153, 148,
+148, 150, 146, 146, 150, 146, 146, 151, 147, 147,
+152, 148, 148, 151, 147, 147, 149, 146, 146, 149,
+146, 146, 148, 145, 145, 148, 145, 145, 147, 144,
+144, 139, 138, 138, 131, 131, 131, 125, 125, 125,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 131,
+131, 131, 139, 138, 138, 148, 145, 145, 148, 145,
+145, 150, 146, 146, 151, 147, 147, 150, 146, 146,
+149, 146, 146, 149, 146, 146, 150, 146, 146, 151,
+147, 147, 149, 146, 146, 147, 144, 144, 150, 146,
+146, 151, 148, 148, 151, 147, 147, 148, 145, 145,
+148, 145, 145, 150, 147, 147, 150, 147, 147, 150,
+147, 147, 151, 147, 147, 153, 148, 148, 154, 149,
+149, 154, 149, 149, 155, 150, 150, 154, 149, 149,
+152, 148, 148, 152, 148, 148, 150, 147, 147, 149,
+146, 146, 154, 150, 150, 156, 151, 151, 154, 149,
+149, 150, 147, 147, 150, 147, 147, 152, 149, 149,
+152, 148, 148, 153, 149, 149, 154, 150, 150, 155,
+150, 150, 155, 150, 150, 156, 151, 151, 158, 151,
+151, 157, 151, 151, 156, 150, 150, 153, 149, 149,
+153, 149, 149, 152, 149, 149, 151, 148, 148, 151,
+147, 147, 150, 147, 147, 149, 147, 147, 152, 149,
+149, 154, 150, 150, 147, 145, 145, 143, 142, 142,
+146, 145, 145, 156, 151, 151, 159, 153, 153, 156,
+151, 151, 155, 150, 150, 152, 149, 149, 149, 146,
+146, 147, 145, 145, 146, 145, 145, 148, 146, 146,
+152, 149, 149, 152, 149, 149, 150, 148, 148, 149,
+147, 147, 149, 146, 146, 150, 147, 147, 156, 151,
+151, 158, 152, 152, 155, 150, 150, 151, 148, 148,
+150, 147, 147, 151, 148, 148, 152, 149, 149, 154,
+150, 150, 154, 150, 150, 150, 147, 147, 152, 149,
+149, 156, 151, 151, 155, 150, 150, 154, 150, 150,
+153, 149, 149, 150, 147, 147, 146, 144, 144, 143,
+142, 142, 145, 144, 144, 148, 146, 146, 151, 148,
+148, 149, 147, 147, 152, 149, 149, 155, 150, 150,
+152, 149, 149, 153, 150, 150, 154, 150, 150, 148,
+146, 146, 149, 147, 147, 151, 148, 148, 153, 149,
+149, 152, 148, 148, 151, 148, 148, 155, 150, 150,
+157, 151, 151, 159, 152, 152, 161, 154, 154, 158,
+152, 152, 155, 151, 151, 161, 153, 153, 161, 153,
+153, 159, 152, 152, 160, 153, 153, 155, 151, 151,
+151, 148, 148, 151, 148, 148, 150, 147, 147, 149,
+147, 147, 149, 147, 147, 151, 148, 148, 154, 150,
+150, 155, 150, 150, 154, 150, 150, 153, 149, 149,
+154, 150, 150, 151, 148, 148, 149, 147, 147, 149,
+147, 147, 151, 148, 148, 154, 150, 150, 155, 150,
+150, 156, 151, 151, 157, 151, 151, 156, 151, 151,
+154, 150, 150, 152, 149, 149, 151, 148, 148, 153,
+149, 149, 153, 150, 150, 148, 146, 146, 145, 144,
+144, 144, 143, 143, 145, 144, 144, 152, 148, 148,
+157, 151, 151, 156, 151, 151, 157, 151, 151, 155,
+150, 150, 150, 147, 147, 152, 149, 149, 154, 149,
+149, 152, 148, 148, 151, 148, 148, 150, 147, 147,
+152, 148, 148, 153, 149, 149, 154, 149, 149, 156,
+150, 150, 155, 150, 150, 152, 148, 148, 149, 147,
+147, 149, 146, 146, 151, 147, 147, 150, 147, 147,
+150, 147, 147, 151, 148, 148, 152, 148, 148, 153,
+148, 148, 151, 148, 148, 148, 145, 145, 146, 144,
+144, 149, 146, 146, 153, 149, 149, 156, 150, 150,
+154, 149, 149, 150, 147, 147, 149, 146, 146, 149,
+146, 146, 146, 144, 144, 145, 143, 143, 148, 145,
+145, 151, 147, 147, 154, 149, 149, 154, 149, 149,
+153, 149, 149, 154, 149, 149, 152, 148, 148, 149,
+146, 146, 147, 144, 144, 138, 138, 138, 131, 131,
+131, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 129, 129, 129, 137, 137,
+137, 145, 143, 143, 147, 145, 145, 148, 145, 145,
+149, 146, 146, 149, 146, 146, 150, 147, 147, 150,
+147, 147, 151, 148, 148, 152, 148, 148, 151, 147,
+147, 151, 147, 147, 151, 148, 148, 152, 148, 148,
+151, 147, 147, 150, 147, 147, 149, 146, 146, 148,
+145, 145, 150, 147, 147, 152, 148, 148, 154, 149,
+149, 154, 149, 149, 153, 148, 148, 150, 147, 147,
+147, 145, 145, 148, 145, 145, 151, 148, 148, 154,
+149, 149, 151, 148, 148, 153, 149, 149, 157, 151,
+151, 155, 150, 150, 152, 148, 148, 149, 146, 146,
+151, 147, 147, 153, 149, 149, 154, 149, 149, 152,
+149, 149, 151, 148, 148, 150, 147, 147, 151, 148,
+148, 151, 148, 148, 150, 147, 147, 147, 145, 145,
+151, 148, 148, 153, 149, 149, 152, 148, 148, 152,
+149, 149, 151, 148, 148, 150, 147, 147, 152, 149,
+149, 155, 151, 151, 157, 152, 152, 155, 151, 151,
+151, 148, 148, 151, 148, 148, 160, 153, 153, 160,
+153, 153, 157, 152, 152, 158, 152, 152, 155, 151,
+151, 153, 149, 149, 152, 149, 149, 152, 148, 148,
+152, 149, 149, 153, 149, 149, 152, 149, 149, 156,
+151, 151, 163, 154, 154, 159, 153, 153, 155, 150,
+150, 152, 149, 149, 153, 149, 149, 153, 149, 149,
+152, 148, 148, 150, 147, 147, 149, 147, 147, 149,
+147, 147, 150, 147, 147, 152, 149, 149, 153, 150,
+150, 154, 150, 150, 153, 149, 149, 154, 150, 150,
+155, 150, 150, 154, 150, 150, 154, 150, 150, 154,
+150, 150, 149, 147, 147, 149, 147, 147, 152, 149,
+149, 153, 150, 150, 157, 152, 152, 160, 153, 153,
+156, 151, 151, 155, 151, 151, 154, 150, 150, 155,
+151, 151, 155, 151, 151, 153, 150, 150, 149, 147,
+147, 149, 147, 147, 152, 149, 149, 156, 151, 151,
+154, 150, 150, 150, 148, 148, 146, 144, 144, 150,
+148, 148, 152, 149, 149, 152, 149, 149, 150, 147,
+147, 152, 149, 149, 154, 150, 150, 148, 146, 146,
+153, 149, 149, 159, 153, 153, 157, 152, 152, 153,
+150, 150, 151, 148, 148, 153, 149, 149, 156, 151,
+151, 158, 152, 152, 159, 152, 152, 152, 149, 149,
+147, 145, 145, 145, 144, 144, 151, 148, 148, 152,
+149, 149, 149, 146, 146, 147, 145, 145, 147, 145,
+145, 149, 146, 146, 154, 150, 150, 155, 150, 150,
+153, 150, 150, 154, 150, 150, 154, 150, 150, 152,
+149, 149, 150, 148, 148, 149, 147, 147, 149, 146,
+146, 150, 147, 147, 153, 149, 149, 152, 148, 148,
+149, 146, 146, 148, 145, 145, 147, 145, 145, 149,
+146, 146, 152, 148, 148, 153, 149, 149, 153, 149,
+149, 153, 149, 149, 154, 150, 150, 156, 151, 151,
+156, 150, 150, 155, 150, 150, 154, 149, 149, 149,
+146, 146, 149, 146, 146, 149, 146, 146, 150, 147,
+147, 151, 148, 148, 151, 147, 147, 152, 148, 148,
+150, 147, 147, 148, 145, 145, 147, 144, 144, 146,
+144, 144, 146, 144, 144, 148, 146, 146, 150, 146,
+146, 152, 148, 148, 153, 148, 148, 151, 147, 147,
+152, 148, 148, 151, 147, 147, 148, 145, 145, 149,
+146, 146, 153, 149, 149, 157, 151, 151, 158, 151,
+151, 157, 150, 150, 154, 149, 149, 155, 149, 149,
+154, 149, 149, 153, 148, 148, 149, 146, 146, 139,
+138, 138, 130, 130, 130, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 128, 128, 128, 134, 134, 134, 141, 140, 140,
+146, 144, 144, 147, 145, 145, 148, 145, 145, 151,
+147, 147, 153, 149, 149, 154, 150, 150, 152, 148,
+148, 149, 146, 146, 148, 145, 145, 151, 147, 147,
+155, 149, 149, 158, 150, 150, 156, 150, 150, 155,
+150, 150, 152, 148, 148, 149, 146, 146, 146, 144,
+144, 148, 145, 145, 150, 147, 147, 152, 148, 148,
+150, 147, 147, 149, 146, 146, 146, 145, 145, 145,
+144, 144, 149, 147, 147, 151, 147, 147, 148, 146,
+146, 151, 147, 147, 149, 146, 146, 149, 146, 146,
+154, 149, 149, 152, 148, 148, 151, 148, 148, 154,
+150, 150, 157, 151, 151, 155, 150, 150, 152, 149,
+149, 153, 149, 149, 152, 148, 148, 151, 147, 147,
+153, 149, 149, 155, 150, 150, 155, 151, 151, 152,
+149, 149, 151, 148, 148, 149, 147, 147, 148, 146,
+146, 149, 147, 147, 152, 149, 149, 154, 150, 150,
+154, 150, 150, 156, 151, 151, 159, 152, 152, 163,
+154, 154, 159, 152, 152, 156, 151, 151, 155, 150,
+150, 152, 149, 149, 151, 148, 148, 151, 148, 148,
+152, 149, 149, 155, 151, 151, 156, 151, 151, 151,
+148, 148, 154, 150, 150, 156, 151, 151, 155, 150,
+150, 153, 149, 149, 151, 148, 148, 152, 149, 149,
+158, 152, 152, 154, 149, 149, 149, 147, 147, 148,
+146, 146, 148, 146, 146, 153, 149, 149, 161, 154,
+154, 158, 153, 153, 157, 152, 152, 156, 151, 151,
+153, 150, 150, 154, 150, 150, 154, 150, 150, 149,
+147, 147, 151, 148, 148, 154, 150, 150, 154, 150,
+150, 150, 148, 148, 148, 146, 146, 149, 147, 147,
+155, 151, 151, 154, 150, 150, 152, 149, 149, 153,
+150, 150, 156, 151, 151, 158, 152, 152, 157, 152,
+152, 159, 152, 152, 158, 153, 153, 157, 152, 152,
+160, 153, 153, 157, 152, 152, 155, 151, 151, 157,
+152, 152, 155, 151, 151, 153, 150, 150, 151, 148,
+148, 151, 148, 148, 151, 148, 148, 151, 148, 148,
+153, 149, 149, 157, 152, 152, 157, 152, 152, 149,
+147, 147, 148, 146, 146, 148, 146, 146, 146, 145,
+145, 146, 144, 144, 146, 145, 145, 147, 146, 146,
+149, 147, 147, 150, 147, 147, 150, 147, 147, 149,
+146, 146, 147, 145, 145, 147, 145, 145, 149, 147,
+147, 152, 149, 149, 153, 149, 149, 151, 148, 148,
+153, 150, 150, 154, 150, 150, 154, 150, 150, 153,
+150, 150, 153, 149, 149, 155, 151, 151, 160, 153,
+153, 159, 152, 152, 153, 149, 149, 148, 145, 145,
+146, 144, 144, 149, 146, 146, 152, 148, 148, 154,
+149, 149, 153, 149, 149, 153, 148, 148, 153, 149,
+149, 152, 148, 148, 154, 149, 149, 156, 150, 150,
+156, 150, 150, 154, 149, 149, 152, 148, 148, 152,
+148, 148, 152, 148, 148, 149, 147, 147, 146, 145,
+145, 149, 146, 146, 150, 147, 147, 150, 147, 147,
+152, 148, 148, 151, 147, 147, 149, 146, 146, 146,
+144, 144, 148, 145, 145, 149, 146, 146, 149, 146,
+146, 151, 148, 148, 154, 149, 149, 155, 150, 150,
+154, 149, 149, 154, 150, 150, 157, 151, 151, 159,
+152, 152, 160, 152, 152, 157, 151, 151, 156, 150,
+150, 154, 149, 149, 154, 149, 149, 155, 149, 149,
+150, 146, 146, 139, 138, 138, 129, 129, 129, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 127, 127, 127,
+135, 134, 134, 143, 141, 141, 148, 146, 146, 149,
+146, 146, 150, 147, 147, 150, 147, 147, 150, 147,
+147, 151, 148, 148, 151, 148, 148, 150, 146, 146,
+150, 146, 146, 149, 146, 146, 148, 146, 146, 149,
+146, 146, 151, 148, 148, 153, 149, 149, 151, 148,
+148, 152, 148, 148, 153, 149, 149, 155, 150, 150,
+154, 149, 149, 155, 150, 150, 154, 149, 149, 152,
+148, 148, 153, 149, 149, 154, 149, 149, 153, 149,
+149, 151, 148, 148, 150, 147, 147, 149, 147, 147,
+147, 145, 145, 146, 144, 144, 148, 145, 145, 152,
+148, 148, 151, 148, 148, 151, 148, 148, 150, 147,
+147, 149, 147, 147, 150, 147, 147, 150, 147, 147,
+152, 149, 149, 153, 149, 149, 153, 149, 149, 153,
+149, 149, 152, 149, 149, 154, 149, 149, 154, 150,
+150, 152, 149, 149, 151, 148, 148, 152, 149, 149,
+152, 149, 149, 147, 145, 145, 150, 147, 147, 150,
+147, 147, 149, 147, 147, 151, 148, 148, 149, 146,
+146, 146, 144, 144, 143, 142, 142, 151, 148, 148,
+153, 149, 149, 152, 149, 149, 151, 148, 148, 153,
+149, 149, 155, 150, 150, 152, 149, 149, 147, 145,
+145, 150, 147, 147, 158, 152, 152, 158, 152, 152,
+156, 151, 151, 152, 149, 149, 146, 145, 145, 146,
+144, 144, 144, 143, 143, 142, 141, 141, 148, 146,
+146, 152, 149, 149, 153, 149, 149, 152, 149, 149,
+153, 149, 149, 153, 149, 149, 152, 148, 148, 152,
+148, 148, 146, 144, 144, 141, 141, 141, 142, 141,
+141, 151, 148, 148, 154, 150, 150, 155, 151, 151,
+157, 152, 152, 161, 153, 153, 161, 154, 154, 157,
+152, 152, 153, 150, 150, 147, 145, 145, 141, 140,
+140, 143, 142, 142, 150, 147, 147, 151, 148, 148,
+143, 142, 142, 150, 147, 147, 155, 151, 151, 157,
+152, 152, 149, 147, 147, 153, 149, 149, 154, 150,
+150, 149, 147, 147, 147, 145, 145, 149, 147, 147,
+153, 150, 150, 156, 151, 151, 152, 148, 148, 151,
+148, 148, 158, 152, 152, 156, 151, 151, 154, 150,
+150, 153, 149, 149, 151, 148, 148, 151, 148, 148,
+151, 148, 148, 150, 148, 148, 147, 145, 145, 150,
+147, 147, 152, 149, 149, 143, 142, 142, 142, 141,
+141, 144, 143, 143, 151, 148, 148, 150, 147, 147,
+152, 148, 148, 153, 149, 149, 152, 149, 149, 152,
+149, 149, 153, 150, 150, 155, 150, 150, 158, 152,
+152, 152, 149, 149, 146, 144, 144, 146, 144, 144,
+147, 145, 145, 149, 146, 146, 148, 146, 146, 150,
+147, 147, 148, 146, 146, 147, 145, 145, 152, 148,
+148, 152, 148, 148, 150, 147, 147, 149, 147, 147,
+145, 143, 143, 146, 144, 144, 148, 145, 145, 148,
+146, 146, 150, 147, 147, 151, 148, 148, 153, 149,
+149, 153, 149, 149, 154, 149, 149, 155, 150, 150,
+157, 151, 151, 154, 149, 149, 154, 149, 149, 156,
+150, 150, 154, 149, 149, 153, 148, 148, 153, 148,
+148, 154, 149, 149, 154, 149, 149, 154, 149, 149,
+154, 149, 149, 152, 148, 148, 152, 148, 148, 152,
+148, 148, 153, 148, 148, 153, 149, 149, 151, 148,
+148, 150, 147, 147, 144, 143, 143, 135, 135, 135,
+127, 127, 127, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 127, 127, 127, 135, 135, 135, 143,
+142, 142, 149, 146, 146, 149, 146, 146, 149, 146,
+146, 149, 146, 146, 149, 146, 146, 149, 146, 146,
+148, 145, 145, 147, 145, 145, 146, 144, 144, 145,
+144, 144, 145, 144, 144, 145, 143, 143, 146, 144,
+144, 147, 145, 145, 150, 147, 147, 155, 150, 150,
+158, 152, 152, 155, 150, 150, 152, 148, 148, 149,
+147, 147, 151, 148, 148, 153, 149, 149, 153, 149,
+149, 152, 149, 149, 152, 148, 148, 151, 148, 148,
+149, 146, 146, 149, 146, 146, 150, 147, 147, 150,
+147, 147, 151, 148, 148, 149, 147, 147, 148, 146,
+146, 149, 147, 147, 150, 147, 147, 152, 148, 148,
+153, 149, 149, 149, 147, 147, 149, 146, 146, 149,
+147, 147, 150, 147, 147, 150, 147, 147, 153, 149,
+149, 156, 151, 151, 158, 151, 151, 153, 149, 149,
+150, 148, 148, 151, 148, 148, 155, 151, 151, 152,
+149, 149, 151, 148, 148, 151, 148, 148, 152, 149,
+149, 151, 148, 148, 153, 149, 149, 156, 151, 151,
+148, 146, 146, 147, 145, 145, 148, 146, 146, 150,
+147, 147, 150, 147, 147, 152, 149, 149, 153, 149,
+149, 151, 148, 148, 153, 149, 149, 154, 150, 150,
+154, 150, 150, 151, 149, 149, 150, 147, 147, 151,
+148, 148, 152, 149, 149, 154, 150, 150, 157, 152,
+152, 155, 151, 151, 150, 147, 147, 156, 151, 151,
+157, 152, 152, 154, 150, 150, 151, 148, 148, 148,
+146, 146, 148, 146, 146, 148, 146, 146, 149, 147,
+147, 151, 148, 148, 151, 148, 148, 148, 146, 146,
+151, 148, 148, 150, 148, 148, 150, 148, 148, 153,
+149, 149, 155, 151, 151, 149, 147, 147, 143, 142,
+142, 144, 143, 143, 149, 147, 147, 154, 150, 150,
+157, 152, 152, 159, 153, 153, 157, 152, 152, 158,
+152, 152, 161, 153, 153, 159, 153, 153, 158, 152,
+152, 155, 151, 151, 151, 148, 148, 146, 144, 144,
+147, 145, 145, 151, 148, 148, 154, 150, 150, 159,
+152, 152, 157, 151, 151, 153, 149, 149, 151, 148,
+148, 153, 149, 149, 154, 150, 150, 153, 150, 150,
+152, 149, 149, 153, 150, 150, 154, 150, 150, 153,
+149, 149, 155, 150, 150, 151, 148, 148, 147, 145,
+145, 145, 143, 143, 150, 147, 147, 151, 148, 148,
+151, 149, 149, 151, 148, 148, 151, 148, 148, 152,
+148, 148, 151, 148, 148, 150, 147, 147, 148, 146,
+146, 147, 145, 145, 148, 146, 146, 151, 148, 148,
+151, 148, 148, 151, 148, 148, 152, 148, 148, 152,
+148, 148, 150, 147, 147, 148, 146, 146, 147, 145,
+145, 146, 144, 144, 147, 145, 145, 151, 148, 148,
+151, 148, 148, 152, 148, 148, 151, 148, 148, 149,
+146, 146, 150, 147, 147, 151, 148, 148, 151, 147,
+147, 150, 147, 147, 152, 148, 148, 153, 149, 149,
+154, 150, 150, 154, 149, 149, 154, 149, 149, 152,
+148, 148, 152, 148, 148, 152, 147, 147, 152, 147,
+147, 151, 148, 148, 150, 147, 147, 148, 145, 145,
+147, 145, 145, 148, 145, 145, 149, 146, 146, 149,
+146, 146, 149, 146, 146, 148, 146, 146, 142, 141,
+141, 134, 134, 134, 127, 127, 127, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 134, 134, 134, 142, 141, 141, 149, 146,
+146, 148, 145, 145, 147, 145, 145, 148, 145, 145,
+149, 146, 146, 150, 146, 146, 147, 144, 144, 144,
+142, 142, 142, 141, 141, 142, 141, 141, 142, 141,
+141, 143, 142, 142, 147, 145, 145, 148, 145, 145,
+148, 146, 146, 150, 147, 147, 149, 146, 146, 147,
+145, 145, 144, 143, 143, 144, 142, 142, 149, 146,
+146, 153, 149, 149, 154, 149, 149, 155, 150, 150,
+158, 151, 151, 158, 151, 151, 156, 151, 151, 153,
+149, 149, 149, 147, 147, 147, 145, 145, 148, 146,
+146, 150, 148, 148, 151, 148, 148, 147, 145, 145,
+143, 142, 142, 145, 143, 143, 149, 146, 146, 150,
+147, 147, 150, 147, 147, 152, 149, 149, 152, 149,
+149, 154, 150, 150, 154, 150, 150, 152, 149, 149,
+152, 149, 149, 152, 148, 148, 150, 148, 148, 147,
+145, 145, 151, 148, 148, 154, 150, 150, 156, 151,
+151, 155, 150, 150, 150, 147, 147, 149, 147, 147,
+151, 148, 148, 152, 148, 148, 148, 146, 146, 146,
+144, 144, 145, 144, 144, 149, 147, 147, 149, 147,
+147, 148, 146, 146, 150, 147, 147, 154, 150, 150,
+154, 150, 150, 151, 148, 148, 150, 147, 147, 151,
+148, 148, 149, 147, 147, 148, 146, 146, 152, 149,
+149, 157, 152, 152, 154, 150, 150, 151, 148, 148,
+151, 148, 148, 152, 149, 149, 150, 148, 148, 145,
+144, 144, 145, 144, 144, 149, 147, 147, 152, 148,
+148, 152, 149, 149, 152, 149, 149, 151, 148, 148,
+152, 148, 148, 155, 151, 151, 152, 149, 149, 146,
+144, 144, 145, 144, 144, 148, 146, 146, 149, 147,
+147, 150, 147, 147, 155, 151, 151, 157, 152, 152,
+157, 152, 152, 157, 152, 152, 158, 152, 152, 156,
+151, 151, 155, 150, 150, 154, 150, 150, 153, 149,
+149, 155, 150, 150, 152, 149, 149, 147, 145, 145,
+148, 146, 146, 149, 147, 147, 149, 147, 147, 149,
+147, 147, 154, 150, 150, 155, 150, 150, 154, 150,
+150, 153, 149, 149, 157, 151, 151, 154, 150, 150,
+152, 149, 149, 154, 149, 149, 157, 151, 151, 157,
+151, 151, 154, 150, 150, 152, 149, 149, 152, 149,
+149, 150, 147, 147, 148, 146, 146, 150, 147, 147,
+156, 150, 150, 154, 150, 150, 152, 149, 149, 152,
+149, 149, 153, 149, 149, 153, 149, 149, 153, 149,
+149, 153, 149, 149, 151, 148, 148, 150, 148, 148,
+151, 148, 148, 151, 148, 148, 152, 148, 148, 152,
+148, 148, 153, 149, 149, 151, 148, 148, 148, 146,
+146, 148, 146, 146, 147, 145, 145, 147, 145, 145,
+150, 147, 147, 152, 148, 148, 152, 148, 148, 149,
+146, 146, 143, 142, 142, 143, 142, 142, 147, 145,
+145, 150, 147, 147, 151, 148, 148, 152, 148, 148,
+151, 148, 148, 152, 148, 148, 153, 149, 149, 150,
+147, 147, 149, 146, 146, 148, 146, 146, 148, 145,
+145, 148, 145, 145, 149, 146, 146, 147, 145, 145,
+146, 144, 144, 146, 144, 144, 146, 144, 144, 146,
+144, 144, 140, 139, 139, 133, 133, 133, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 121, 121, 121, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 132, 132,
+132, 140, 139, 139, 148, 145, 145, 148, 145, 145,
+148, 145, 145, 149, 146, 146, 151, 147, 147, 153,
+148, 148, 150, 147, 147, 148, 145, 145, 147, 145,
+145, 147, 145, 145, 147, 145, 145, 148, 145, 145,
+149, 146, 146, 150, 147, 147, 151, 148, 148, 152,
+148, 148, 152, 148, 148, 151, 148, 148, 151, 147,
+147, 152, 148, 148, 154, 149, 149, 154, 149, 149,
+154, 149, 149, 154, 149, 149, 154, 149, 149, 154,
+150, 150, 154, 150, 150, 150, 147, 147, 145, 144,
+144, 145, 143, 143, 149, 147, 147, 153, 149, 149,
+151, 148, 148, 148, 146, 146, 148, 146, 146, 151,
+148, 148, 152, 149, 149, 152, 149, 149, 153, 150,
+150, 153, 149, 149, 153, 149, 149, 152, 149, 149,
+151, 148, 148, 150, 147, 147, 148, 146, 146, 149,
+147, 147, 151, 148, 148, 152, 149, 149, 153, 149,
+149, 152, 149, 149, 151, 148, 148, 151, 148, 148,
+152, 149, 149, 150, 147, 147, 148, 146, 146, 151,
+148, 148, 154, 150, 150, 154, 150, 150, 152, 149,
+149, 151, 148, 148, 151, 148, 148, 150, 148, 148,
+151, 148, 148, 152, 149, 149, 151, 148, 148, 152,
+149, 149, 155, 150, 150, 156, 151, 151, 155, 151,
+151, 156, 151, 151, 154, 150, 150, 153, 149, 149,
+152, 149, 149, 153, 150, 150, 151, 148, 148, 152,
+149, 149, 154, 150, 150, 151, 148, 148, 155, 151,
+151, 155, 151, 151, 154, 150, 150, 152, 149, 149,
+150, 148, 148, 152, 149, 149, 153, 150, 150, 155,
+151, 151, 155, 151, 151, 154, 150, 150, 155, 151,
+151, 156, 151, 151, 155, 151, 151, 157, 152, 152,
+154, 150, 150, 153, 150, 150, 155, 151, 151, 154,
+150, 150, 154, 150, 150, 154, 150, 150, 154, 150,
+150, 154, 150, 150, 151, 148, 148, 153, 150, 150,
+154, 150, 150, 152, 149, 149, 153, 149, 149, 151,
+148, 148, 154, 150, 150, 157, 152, 152, 156, 151,
+151, 155, 150, 150, 152, 148, 148, 151, 148, 148,
+156, 151, 151, 154, 150, 150, 155, 150, 150, 155,
+150, 150, 154, 150, 150, 154, 150, 150, 153, 149,
+149, 153, 149, 149, 152, 149, 149, 151, 148, 148,
+151, 148, 148, 151, 148, 148, 150, 148, 148, 150,
+147, 147, 151, 148, 148, 152, 149, 149, 150, 147,
+147, 148, 146, 146, 149, 147, 147, 149, 146, 146,
+148, 146, 146, 150, 147, 147, 152, 149, 149, 153,
+150, 150, 151, 148, 148, 150, 147, 147, 150, 147,
+147, 149, 146, 146, 149, 146, 146, 150, 147, 147,
+150, 147, 147, 150, 147, 147, 149, 147, 147, 149,
+146, 146, 150, 147, 147, 151, 148, 148, 151, 148,
+148, 153, 149, 149, 154, 149, 149, 153, 149, 149,
+152, 148, 148, 152, 148, 148, 152, 149, 149, 153,
+149, 149, 154, 149, 149, 155, 149, 149, 156, 150,
+150, 154, 149, 149, 152, 148, 148, 151, 147, 147,
+151, 147, 147, 151, 147, 147, 141, 140, 140, 133,
+133, 133, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 121, 121, 121, 121, 121, 121,
+121, 121, 121, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 127, 127, 127, 131, 131, 131, 139, 138, 138,
+147, 145, 145, 148, 146, 146, 148, 146, 146, 149,
+146, 146, 151, 148, 148, 154, 149, 149, 153, 149,
+149, 151, 148, 148, 151, 148, 148, 152, 148, 148,
+153, 149, 149, 151, 148, 148, 150, 147, 147, 152,
+148, 148, 153, 149, 149, 154, 149, 149, 155, 150,
+150, 155, 150, 150, 154, 150, 150, 155, 150, 150,
+157, 151, 151, 155, 150, 150, 153, 149, 149, 153,
+149, 149, 155, 150, 150, 156, 151, 151, 154, 150,
+150, 150, 147, 147, 147, 145, 145, 149, 147, 147,
+152, 149, 149, 154, 150, 150, 152, 149, 149, 151,
+148, 148, 152, 149, 149, 154, 150, 150, 153, 149,
+149, 155, 150, 150, 153, 150, 150, 153, 149, 149,
+154, 150, 150, 155, 150, 150, 152, 148, 148, 151,
+148, 148, 152, 149, 149, 154, 150, 150, 154, 150,
+150, 150, 148, 148, 149, 147, 147, 151, 148, 148,
+152, 149, 149, 153, 150, 150, 151, 148, 148, 150,
+148, 148, 151, 148, 148, 151, 148, 148, 155, 151,
+151, 153, 149, 149, 153, 150, 150, 155, 150, 150,
+154, 150, 150, 154, 150, 150, 151, 148, 148, 149,
+147, 147, 151, 148, 148, 155, 151, 151, 157, 152,
+152, 155, 151, 151, 152, 149, 149, 151, 148, 148,
+153, 150, 150, 152, 149, 149, 155, 150, 150, 156,
+151, 151, 155, 151, 151, 161, 154, 154, 160, 153,
+153, 155, 150, 150, 150, 148, 148, 150, 148, 148,
+156, 151, 151, 154, 150, 150, 152, 149, 149, 151,
+148, 148, 152, 149, 149, 154, 150, 150, 154, 150,
+150, 153, 149, 149, 153, 149, 149, 156, 151, 151,
+155, 150, 150, 154, 150, 150, 153, 150, 150, 152,
+149, 149, 154, 150, 150, 154, 150, 150, 154, 150,
+150, 153, 149, 149, 152, 149, 149, 151, 148, 148,
+148, 146, 146, 150, 148, 148, 154, 150, 150, 156,
+151, 151, 156, 151, 151, 157, 152, 152, 157, 152,
+152, 155, 151, 151, 154, 150, 150, 155, 151, 151,
+152, 149, 149, 152, 149, 149, 155, 150, 150, 156,
+151, 151, 153, 149, 149, 152, 149, 149, 153, 149,
+149, 153, 149, 149, 151, 148, 148, 150, 147, 147,
+150, 148, 148, 150, 148, 148, 150, 147, 147, 151,
+148, 148, 151, 148, 148, 151, 148, 148, 151, 148,
+148, 151, 148, 148, 149, 146, 146, 148, 146, 146,
+151, 148, 148, 155, 151, 151, 156, 151, 151, 152,
+149, 149, 150, 148, 148, 149, 146, 146, 148, 146,
+146, 147, 145, 145, 148, 146, 146, 150, 147, 147,
+150, 147, 147, 151, 147, 147, 151, 147, 147, 150,
+147, 147, 149, 146, 146, 152, 148, 148, 155, 150,
+150, 155, 150, 150, 153, 149, 149, 151, 148, 148,
+153, 149, 149, 155, 150, 150, 157, 151, 151, 158,
+152, 152, 160, 152, 152, 157, 151, 151, 155, 150,
+150, 154, 149, 149, 153, 149, 149, 152, 148, 148,
+141, 140, 140, 132, 132, 132, 127, 127, 127, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 121, 121, 121,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+130, 130, 130, 137, 137, 137, 147, 145, 145, 149,
+146, 146, 150, 147, 147, 151, 147, 147, 151, 148,
+148, 151, 148, 148, 151, 148, 148, 151, 148, 148,
+152, 149, 149, 155, 150, 150, 156, 151, 151, 155,
+150, 150, 152, 149, 149, 152, 148, 148, 153, 149,
+149, 154, 149, 149, 154, 150, 150, 155, 150, 150,
+156, 151, 151, 157, 151, 151, 158, 151, 151, 156,
+151, 151, 155, 150, 150, 154, 150, 150, 155, 150,
+150, 154, 150, 150, 151, 148, 148, 148, 146, 146,
+150, 148, 148, 153, 149, 149, 153, 150, 150, 152,
+149, 149, 150, 147, 147, 153, 149, 149, 156, 151,
+151, 158, 152, 152, 159, 153, 153, 160, 153, 153,
+158, 152, 152, 156, 151, 151, 155, 150, 150, 155,
+151, 151, 155, 150, 150, 156, 151, 151, 157, 152,
+152, 156, 151, 151, 156, 151, 151, 154, 150, 150,
+154, 150, 150, 154, 150, 150, 154, 150, 150, 154,
+150, 150, 155, 151, 151, 154, 150, 150, 152, 149,
+149, 156, 151, 151, 161, 153, 153, 160, 153, 153,
+159, 153, 153, 158, 152, 152, 154, 150, 150, 150,
+148, 148, 148, 146, 146, 153, 150, 150, 94, 90,
+90, 71, 67, 67, 68, 65, 65, 71, 67, 67,
+71, 67, 67, 73, 68, 68, 77, 72, 72, 81,
+74, 74, 75, 71, 71, 68, 65, 65, 68, 65,
+65, 69, 66, 66, 66, 63, 63, 66, 63, 63,
+70, 66, 66, 73, 69, 69, 72, 68, 68, 68,
+65, 65, 65, 63, 63, 67, 64, 64, 65, 62,
+62, 63, 60, 60, 58, 57, 57, 60, 58, 58,
+66, 63, 63, 67, 64, 64, 65, 62, 62, 108,
+105, 105, 153, 150, 150, 155, 151, 151, 155, 151,
+151, 153, 150, 150, 153, 149, 149, 157, 152, 152,
+163, 154, 154, 162, 154, 154, 160, 153, 153, 159,
+153, 153, 157, 152, 152, 156, 152, 152, 157, 152,
+152, 156, 152, 152, 157, 152, 152, 155, 151, 151,
+154, 150, 150, 153, 149, 149, 151, 148, 148, 151,
+148, 148, 152, 149, 149, 153, 149, 149, 154, 150,
+150, 154, 150, 150, 153, 150, 150, 152, 149, 149,
+150, 148, 148, 151, 148, 148, 153, 149, 149, 152,
+149, 149, 151, 148, 148, 149, 147, 147, 150, 147,
+147, 151, 148, 148, 154, 150, 150, 159, 152, 152,
+164, 154, 154, 158, 152, 152, 153, 149, 149, 150,
+148, 148, 149, 147, 147, 149, 147, 147, 151, 148,
+148, 152, 149, 149, 152, 149, 149, 152, 148, 148,
+151, 148, 148, 148, 146, 146, 146, 144, 144, 149,
+146, 146, 153, 149, 149, 156, 151, 151, 154, 150,
+150, 153, 149, 149, 153, 149, 149, 154, 150, 150,
+154, 150, 150, 156, 151, 151, 156, 151, 151, 156,
+150, 150, 155, 150, 150, 154, 149, 149, 151, 147,
+147, 147, 145, 145, 138, 137, 137, 131, 131, 131,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 130, 130, 130, 137,
+137, 137, 145, 144, 144, 149, 146, 146, 151, 148,
+148, 151, 148, 148, 151, 148, 148, 150, 147, 147,
+150, 147, 147, 149, 146, 146, 150, 147, 147, 152,
+148, 148, 153, 149, 149, 154, 150, 150, 156, 150,
+150, 154, 150, 150, 152, 149, 149, 151, 148, 148,
+150, 147, 147, 148, 146, 146, 150, 147, 147, 150,
+148, 148, 151, 148, 148, 151, 148, 148, 151, 148,
+148, 153, 149, 149, 155, 150, 150, 152, 149, 149,
+150, 147, 147, 150, 147, 147, 153, 149, 149, 154,
+150, 150, 152, 149, 149, 149, 147, 147, 149, 147,
+147, 150, 147, 147, 150, 148, 148, 151, 148, 148,
+152, 149, 149, 151, 148, 148, 151, 148, 148, 152,
+149, 149, 153, 149, 149, 154, 150, 150, 153, 150,
+150, 153, 149, 149, 152, 149, 149, 153, 149, 149,
+152, 149, 149, 153, 149, 149, 153, 150, 150, 151,
+148, 148, 150, 147, 147, 149, 147, 147, 150, 148,
+148, 150, 148, 148, 150, 148, 148, 107, 104, 104,
+65, 62, 62, 67, 64, 64, 67, 64, 64, 65,
+63, 63, 63, 61, 61, 64, 62, 62, 65, 63,
+63, 71, 67, 67, 80, 74, 74, 82, 75, 75,
+70, 66, 66, 62, 60, 60, 67, 64, 64, 73,
+69, 69, 73, 69, 69, 69, 66, 66, 64, 62,
+62, 61, 59, 59, 59, 57, 57, 67, 64, 64,
+71, 67, 67, 70, 66, 66, 70, 66, 66, 70,
+66, 66, 69, 65, 65, 69, 66, 66, 70, 66,
+66, 71, 67, 67, 73, 69, 69, 73, 69, 69,
+72, 67, 67, 72, 68, 68, 68, 65, 65, 66,
+63, 63, 67, 64, 64, 68, 65, 65, 68, 65,
+65, 67, 64, 64, 65, 62, 62, 64, 61, 61,
+109, 106, 106, 153, 150, 150, 154, 150, 150, 154,
+150, 150, 155, 151, 151, 154, 150, 150, 154, 150,
+150, 154, 150, 150, 153, 149, 149, 152, 149, 149,
+150, 148, 148, 148, 146, 146, 147, 145, 145, 148,
+146, 146, 148, 146, 146, 147, 145, 145, 147, 145,
+145, 146, 145, 145, 147, 145, 145, 147, 145, 145,
+148, 146, 146, 150, 147, 147, 152, 148, 148, 152,
+149, 149, 153, 149, 149, 155, 150, 150, 157, 151,
+151, 154, 150, 150, 151, 148, 148, 150, 147, 147,
+152, 149, 149, 155, 151, 151, 154, 150, 150, 153,
+149, 149, 153, 149, 149, 153, 149, 149, 152, 149,
+149, 152, 148, 148, 150, 147, 147, 154, 149, 149,
+158, 151, 151, 159, 152, 152, 157, 151, 151, 155,
+150, 150, 155, 150, 150, 155, 150, 150, 155, 150,
+150, 155, 150, 150, 155, 150, 150, 153, 149, 149,
+150, 147, 147, 150, 147, 147, 150, 147, 147, 150,
+147, 147, 151, 148, 148, 149, 147, 147, 139, 138,
+138, 131, 131, 131, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 129, 129, 129, 136, 136, 136, 143, 142,
+142, 148, 145, 145, 150, 147, 147, 150, 147, 147,
+151, 148, 148, 152, 148, 148, 151, 148, 148, 151,
+148, 148, 152, 148, 148, 153, 148, 148, 154, 149,
+149, 155, 150, 150, 156, 150, 150, 154, 149, 149,
+154, 149, 149, 153, 149, 149, 153, 149, 149, 153,
+149, 149, 152, 149, 149, 152, 148, 148, 152, 149,
+149, 153, 149, 149, 153, 149, 149, 154, 150, 150,
+154, 150, 150, 153, 149, 149, 152, 148, 148, 154,
+150, 150, 156, 150, 150, 154, 150, 150, 151, 148,
+148, 150, 147, 147, 151, 148, 148, 152, 148, 148,
+150, 147, 147, 149, 146, 146, 149, 146, 146, 149,
+147, 147, 150, 147, 147, 151, 148, 148, 151, 148,
+148, 151, 148, 148, 149, 147, 147, 149, 147, 147,
+150, 148, 148, 151, 148, 148, 153, 150, 150, 154,
+150, 150, 153, 149, 149, 88, 85, 85, 65, 62,
+62, 61, 59, 59, 62, 60, 60, 63, 60, 60,
+63, 60, 60, 63, 61, 61, 64, 62, 62, 67,
+64, 64, 68, 65, 65, 67, 64, 64, 66, 64,
+64, 67, 64, 64, 69, 65, 65, 70, 66, 66,
+69, 65, 65, 69, 65, 65, 70, 66, 66, 75,
+70, 70, 77, 71, 71, 68, 65, 65, 60, 59,
+59, 63, 61, 61, 64, 62, 62, 65, 63, 63,
+63, 60, 60, 63, 61, 61, 60, 58, 58, 60,
+58, 58, 65, 62, 62, 67, 64, 64, 66, 63,
+63, 60, 58, 58, 57, 56, 56, 63, 61, 61,
+68, 65, 65, 61, 59, 59, 54, 53, 53, 55,
+54, 54, 59, 58, 58, 62, 60, 60, 65, 62,
+62, 70, 66, 66, 68, 65, 65, 66, 63, 63,
+66, 63, 63, 67, 64, 64, 70, 66, 66, 73,
+68, 68, 136, 131, 131, 155, 150, 150, 153, 150,
+150, 153, 149, 149, 152, 149, 149, 152, 149, 149,
+152, 148, 148, 151, 148, 148, 150, 148, 148, 150,
+147, 147, 149, 147, 147, 148, 146, 146, 149, 147,
+147, 149, 147, 147, 151, 148, 148, 150, 147, 147,
+148, 146, 146, 148, 146, 146, 148, 146, 146, 149,
+147, 147, 151, 148, 148, 152, 148, 148, 150, 147,
+147, 148, 146, 146, 148, 146, 146, 147, 145, 145,
+149, 147, 147, 153, 149, 149, 155, 150, 150, 151,
+148, 148, 148, 146, 146, 147, 145, 145, 147, 146,
+146, 149, 147, 147, 152, 149, 149, 153, 149, 149,
+152, 148, 148, 151, 147, 147, 151, 147, 147, 150,
+147, 147, 150, 147, 147, 149, 146, 146, 149, 146,
+146, 150, 147, 147, 151, 148, 148, 152, 148, 148,
+152, 148, 148, 152, 148, 148, 151, 147, 147, 146,
+144, 144, 138, 137, 137, 130, 130, 130, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 136, 136, 136, 145, 143, 143, 149, 146, 146,
+148, 146, 146, 148, 146, 146, 149, 147, 147, 151,
+148, 148, 150, 147, 147, 150, 147, 147, 149, 146,
+146, 149, 146, 146, 149, 146, 146, 151, 148, 148,
+152, 148, 148, 153, 149, 149, 155, 150, 150, 154,
+150, 150, 153, 149, 149, 153, 149, 149, 154, 150,
+150, 153, 149, 149, 152, 148, 148, 151, 148, 148,
+151, 148, 148, 151, 148, 148, 152, 149, 149, 154,
+150, 150, 153, 149, 149, 152, 148, 148, 150, 147,
+147, 150, 147, 147, 149, 147, 147, 151, 148, 148,
+152, 149, 149, 153, 149, 149, 152, 148, 148, 151,
+148, 148, 150, 148, 148, 150, 148, 148, 152, 149,
+149, 154, 150, 150, 154, 150, 150, 154, 150, 150,
+154, 150, 150, 154, 150, 150, 130, 127, 127, 59,
+57, 57, 58, 56, 56, 61, 59, 59, 65, 62,
+62, 64, 62, 62, 64, 61, 61, 65, 62, 62,
+65, 63, 63, 66, 63, 63, 66, 63, 63, 67,
+64, 64, 69, 65, 65, 70, 67, 67, 68, 65,
+65, 65, 63, 63, 67, 64, 64, 70, 66, 66,
+73, 68, 68, 73, 69, 69, 74, 70, 70, 72,
+68, 68, 71, 67, 67, 69, 65, 65, 66, 63,
+63, 66, 63, 63, 68, 65, 65, 71, 67, 67,
+69, 65, 65, 69, 66, 66, 68, 65, 65, 65,
+63, 63, 64, 62, 62, 64, 62, 62, 67, 64,
+64, 69, 66, 66, 67, 64, 64, 63, 60, 60,
+62, 60, 60, 65, 63, 63, 68, 65, 65, 69,
+65, 65, 68, 65, 65, 68, 65, 65, 68, 65,
+65, 67, 64, 64, 65, 63, 63, 67, 64, 64,
+72, 68, 68, 76, 71, 71, 75, 70, 70, 74,
+69, 69, 70, 67, 67, 67, 64, 64, 68, 65,
+65, 115, 110, 110, 158, 152, 152, 155, 151, 151,
+153, 150, 150, 153, 150, 150, 153, 150, 150, 152,
+149, 149, 150, 147, 147, 150, 148, 148, 153, 150,
+150, 155, 151, 151, 154, 150, 150, 152, 149, 149,
+153, 149, 149, 153, 149, 149, 153, 149, 149, 152,
+149, 149, 151, 148, 148, 150, 147, 147, 149, 147,
+147, 150, 147, 147, 150, 147, 147, 151, 148, 148,
+152, 149, 149, 150, 147, 147, 146, 145, 145, 146,
+145, 145, 149, 146, 146, 151, 148, 148, 151, 148,
+148, 150, 147, 147, 152, 149, 149, 154, 149, 149,
+154, 150, 150, 152, 148, 148, 151, 148, 148, 149,
+146, 146, 147, 145, 145, 148, 146, 146, 149, 147,
+147, 150, 147, 147, 151, 148, 148, 151, 148, 148,
+150, 147, 147, 145, 143, 143, 136, 136, 136, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 129, 129, 129, 135, 135, 135,
+143, 142, 142, 149, 146, 146, 150, 147, 147, 150,
+147, 147, 150, 147, 147, 150, 147, 147, 149, 146,
+146, 148, 145, 145, 147, 145, 145, 146, 145, 145,
+148, 146, 146, 150, 148, 148, 152, 149, 149, 153,
+150, 150, 154, 150, 150, 155, 150, 150, 154, 150,
+150, 153, 149, 149, 151, 148, 148, 151, 148, 148,
+150, 148, 148, 150, 147, 147, 149, 147, 147, 150,
+148, 148, 153, 149, 149, 154, 150, 150, 152, 149,
+149, 151, 148, 148, 152, 149, 149, 154, 150, 150,
+154, 151, 151, 155, 151, 151, 156, 151, 151, 156,
+151, 151, 156, 151, 151, 155, 151, 151, 155, 151,
+151, 155, 151, 151, 155, 151, 151, 156, 151, 151,
+74, 70, 70, 71, 67, 67, 67, 64, 64, 66,
+63, 63, 66, 63, 63, 66, 63, 63, 70, 66,
+66, 69, 66, 66, 66, 63, 63, 65, 62, 62,
+67, 64, 64, 70, 67, 67, 69, 66, 66, 68,
+65, 65, 71, 67, 67, 72, 68, 68, 69, 66,
+66, 65, 62, 62, 63, 61, 61, 65, 62, 62,
+67, 64, 64, 72, 68, 68, 75, 70, 70, 73,
+68, 68, 71, 67, 67, 67, 64, 64, 64, 61,
+61, 65, 62, 62, 67, 64, 64, 70, 66, 66,
+72, 68, 68, 74, 69, 69, 73, 69, 69, 73,
+69, 69, 69, 66, 66, 65, 63, 63, 70, 66,
+66, 75, 71, 71, 72, 68, 68, 66, 63, 63,
+67, 64, 64, 73, 68, 68, 74, 70, 70, 71,
+67, 67, 68, 65, 65, 68, 65, 65, 67, 64,
+64, 68, 65, 65, 69, 66, 66, 68, 65, 65,
+67, 64, 64, 68, 65, 65, 70, 66, 66, 70,
+66, 66, 67, 64, 64, 66, 64, 64, 69, 66,
+66, 71, 67, 67, 70, 67, 67, 111, 108, 108,
+155, 151, 151, 157, 152, 152, 157, 152, 152, 155,
+151, 151, 155, 151, 151, 157, 152, 152, 159, 153,
+153, 158, 152, 152, 158, 152, 152, 159, 153, 153,
+159, 153, 153, 157, 152, 152, 156, 151, 151, 155,
+150, 150, 153, 150, 150, 152, 149, 149, 151, 148,
+148, 150, 148, 148, 150, 147, 147, 150, 148, 148,
+149, 146, 146, 148, 146, 146, 152, 149, 149, 155,
+151, 151, 157, 151, 151, 157, 152, 152, 157, 151,
+151, 156, 151, 151, 155, 150, 150, 154, 150, 150,
+153, 149, 149, 152, 149, 149, 151, 148, 148, 151,
+148, 148, 152, 148, 148, 151, 148, 148, 151, 147,
+147, 150, 147, 147, 150, 147, 147, 144, 142, 142,
+135, 135, 135, 129, 129, 129, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 133, 133, 133, 141, 140, 140, 148,
+146, 146, 150, 147, 147, 151, 148, 148, 153, 149,
+149, 154, 150, 150, 154, 150, 150, 153, 149, 149,
+152, 148, 148, 151, 148, 148, 151, 148, 148, 152,
+149, 149, 152, 149, 149, 153, 149, 149, 154, 150,
+150, 155, 150, 150, 154, 150, 150, 153, 149, 149,
+151, 148, 148, 151, 148, 148, 151, 148, 148, 152,
+149, 149, 152, 149, 149, 153, 149, 149, 153, 149,
+149, 152, 149, 149, 152, 149, 149, 151, 148, 148,
+151, 148, 148, 152, 149, 149, 152, 149, 149, 154,
+150, 150, 155, 151, 151, 155, 151, 151, 154, 150,
+150, 153, 149, 149, 152, 149, 149, 109, 106, 106,
+68, 65, 65, 69, 66, 66, 65, 62, 62, 61,
+59, 59, 67, 64, 64, 73, 69, 69, 72, 68,
+68, 69, 66, 66, 68, 65, 65, 67, 64, 64,
+71, 67, 67, 77, 72, 72, 78, 72, 72, 75,
+70, 70, 72, 68, 68, 68, 65, 65, 63, 61,
+61, 59, 57, 57, 56, 54, 54, 62, 60, 60,
+68, 65, 65, 68, 65, 65, 67, 64, 64, 66,
+64, 64, 66, 63, 63, 66, 64, 64, 67, 64,
+64, 70, 66, 66, 74, 69, 69, 74, 69, 69,
+71, 67, 67, 70, 66, 66, 72, 68, 68, 72,
+68, 68, 70, 66, 66, 69, 66, 66, 71, 67,
+67, 73, 69, 69, 70, 66, 66, 68, 65, 65,
+71, 67, 67, 74, 69, 69, 74, 70, 70, 74,
+69, 69, 72, 68, 68, 70, 66, 66, 68, 65,
+65, 67, 64, 64, 66, 63, 63, 64, 61, 61,
+65, 62, 62, 70, 66, 66, 73, 69, 69, 72,
+68, 68, 69, 66, 66, 69, 66, 66, 68, 65,
+65, 69, 66, 66, 70, 66, 66, 69, 66, 66,
+110, 107, 107, 152, 149, 149, 153, 150, 150, 154,
+150, 150, 154, 151, 151, 155, 151, 151, 156, 151,
+151, 156, 151, 151, 154, 151, 151, 153, 149, 149,
+152, 149, 149, 150, 148, 148, 151, 148, 148, 152,
+149, 149, 152, 149, 149, 151, 148, 148, 151, 148,
+148, 152, 149, 149, 152, 148, 148, 152, 148, 148,
+152, 149, 149, 154, 150, 150, 155, 151, 151, 156,
+151, 151, 156, 151, 151, 155, 150, 150, 154, 150,
+150, 153, 149, 149, 152, 148, 148, 152, 149, 149,
+152, 149, 149, 152, 149, 149, 152, 149, 149, 152,
+149, 149, 150, 147, 147, 151, 148, 148, 150, 147,
+147, 143, 142, 142, 134, 134, 134, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 133,
+133, 133, 139, 139, 139, 146, 144, 144, 150, 147,
+147, 151, 148, 148, 152, 148, 148, 153, 149, 149,
+153, 149, 149, 153, 149, 149, 152, 148, 148, 150,
+147, 147, 150, 147, 147, 150, 147, 147, 152, 148,
+148, 153, 149, 149, 155, 150, 150, 156, 151, 151,
+154, 150, 150, 151, 148, 148, 151, 148, 148, 151,
+148, 148, 151, 148, 148, 152, 148, 148, 152, 149,
+149, 151, 148, 148, 150, 148, 148, 151, 148, 148,
+150, 148, 148, 149, 147, 147, 150, 147, 147, 151,
+148, 148, 153, 150, 150, 154, 150, 150, 154, 150,
+150, 152, 149, 149, 109, 106, 106, 65, 62, 62,
+63, 61, 61, 62, 60, 60, 62, 60, 60, 62,
+60, 60, 63, 60, 60, 67, 64, 64, 71, 67,
+67, 71, 67, 67, 71, 67, 67, 69, 66, 66,
+69, 65, 65, 71, 67, 67, 75, 70, 70, 74,
+69, 69, 72, 68, 68, 72, 68, 68, 71, 67,
+67, 70, 66, 66, 68, 65, 65, 70, 66, 66,
+71, 67, 67, 71, 67, 67, 70, 66, 66, 66,
+63, 63, 62, 59, 59, 62, 60, 60, 64, 62,
+62, 68, 65, 65, 70, 67, 67, 71, 67, 67,
+69, 65, 65, 70, 66, 66, 72, 68, 68, 72,
+68, 68, 69, 66, 66, 67, 64, 64, 66, 63,
+63, 64, 62, 62, 60, 58, 58, 58, 56, 56,
+63, 61, 61, 68, 65, 65, 69, 66, 66, 71,
+67, 67, 68, 65, 65, 65, 63, 63, 66, 63,
+63, 66, 63, 63, 67, 64, 64, 68, 65, 65,
+70, 66, 66, 70, 66, 66, 68, 65, 65, 65,
+62, 62, 63, 61, 61, 63, 60, 60, 64, 62,
+62, 66, 63, 63, 67, 64, 64, 67, 64, 64,
+66, 63, 63, 108, 105, 105, 151, 148, 148, 152,
+149, 149, 152, 149, 149, 151, 148, 148, 150, 148,
+148, 148, 146, 146, 148, 146, 146, 148, 146, 146,
+149, 147, 147, 150, 148, 148, 151, 148, 148, 153,
+149, 149, 152, 149, 149, 153, 149, 149, 152, 149,
+149, 151, 148, 148, 151, 148, 148, 152, 149, 149,
+153, 149, 149, 153, 149, 149, 153, 149, 149, 153,
+149, 149, 152, 149, 149, 150, 147, 147, 150, 147,
+147, 150, 147, 147, 151, 148, 148, 152, 148, 148,
+152, 149, 149, 153, 149, 149, 153, 149, 149, 153,
+149, 149, 150, 147, 147, 142, 141, 141, 134, 134,
+134, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 133, 133, 133, 141, 140,
+140, 149, 146, 146, 153, 149, 149, 153, 149, 149,
+152, 149, 149, 152, 149, 149, 152, 149, 149, 152,
+148, 148, 151, 148, 148, 150, 147, 147, 149, 147,
+147, 149, 146, 146, 148, 146, 146, 148, 146, 146,
+150, 147, 147, 151, 148, 148, 151, 148, 148, 151,
+148, 148, 150, 148, 148, 150, 148, 148, 153, 149,
+149, 153, 150, 150, 151, 148, 148, 150, 148, 148,
+151, 148, 148, 152, 149, 149, 152, 149, 149, 152,
+149, 149, 152, 148, 148, 151, 148, 148, 152, 149,
+149, 130, 127, 127, 64, 61, 61, 63, 60, 60,
+64, 62, 62, 66, 63, 63, 65, 63, 63, 65,
+63, 63, 65, 63, 63, 64, 61, 61, 60, 58,
+58, 60, 58, 58, 66, 63, 63, 69, 65, 65,
+66, 63, 63, 65, 62, 62, 63, 60, 60, 62,
+60, 60, 65, 62, 62, 66, 63, 63, 67, 64,
+64, 67, 64, 64, 66, 63, 63, 65, 63, 63,
+66, 63, 63, 68, 65, 65, 71, 67, 67, 72,
+68, 68, 70, 66, 66, 70, 66, 66, 70, 67,
+67, 70, 66, 66, 67, 64, 64, 66, 63, 63,
+68, 65, 65, 69, 65, 65, 70, 66, 66, 68,
+65, 65, 65, 63, 63, 67, 64, 64, 73, 69,
+69, 73, 69, 69, 70, 66, 66, 67, 64, 64,
+66, 63, 63, 66, 63, 63, 66, 63, 63, 66,
+63, 63, 66, 63, 63, 66, 63, 63, 66, 63,
+63, 68, 65, 65, 73, 68, 68, 73, 68, 68,
+69, 66, 66, 67, 64, 64, 66, 63, 63, 67,
+64, 64, 70, 66, 66, 73, 69, 69, 75, 70,
+70, 73, 68, 68, 68, 65, 65, 63, 61, 61,
+61, 59, 59, 105, 103, 103, 151, 148, 148, 152,
+149, 149, 153, 149, 149, 153, 150, 150, 153, 149,
+149, 152, 149, 149, 151, 148, 148, 149, 147, 147,
+149, 147, 147, 150, 147, 147, 152, 149, 149, 152,
+149, 149, 152, 149, 149, 153, 149, 149, 152, 149,
+149, 152, 149, 149, 152, 149, 149, 153, 149, 149,
+154, 150, 150, 152, 149, 149, 151, 148, 148, 150,
+147, 147, 149, 146, 146, 149, 147, 147, 150, 147,
+147, 150, 148, 148, 151, 148, 148, 152, 149, 149,
+153, 149, 149, 151, 148, 148, 146, 144, 144, 139,
+138, 138, 133, 133, 133, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 133, 133, 133, 140, 139, 139, 147, 145, 145,
+153, 149, 149, 153, 149, 149, 153, 149, 149, 152,
+149, 149, 152, 149, 149, 151, 148, 148, 152, 148,
+148, 152, 148, 148, 152, 148, 148, 150, 147, 147,
+148, 146, 146, 146, 145, 145, 145, 144, 144, 148,
+146, 146, 151, 148, 148, 153, 150, 150, 154, 150,
+150, 153, 150, 150, 153, 149, 149, 153, 150, 150,
+153, 150, 150, 153, 150, 150, 153, 150, 150, 153,
+150, 150, 153, 150, 150, 153, 149, 149, 152, 149,
+149, 153, 149, 149, 110, 107, 107, 69, 66, 66,
+70, 66, 66, 71, 68, 68, 71, 68, 68, 69,
+66, 66, 68, 65, 65, 68, 65, 65, 69, 66,
+66, 71, 67, 67, 71, 67, 67, 70, 66, 66,
+70, 66, 66, 69, 66, 66, 69, 66, 66, 69,
+66, 66, 66, 63, 63, 64, 61, 61, 65, 63,
+63, 67, 64, 64, 65, 62, 62, 62, 60, 60,
+65, 62, 62, 66, 63, 63, 68, 65, 65, 69,
+66, 66, 68, 65, 65, 67, 64, 64, 68, 65,
+65, 68, 65, 65, 68, 65, 65, 67, 64, 64,
+65, 63, 63, 66, 63, 63, 70, 66, 66, 71,
+67, 67, 70, 66, 66, 69, 66, 66, 69, 66,
+66, 68, 65, 65, 69, 66, 66, 69, 66, 66,
+70, 66, 66, 71, 67, 67, 71, 67, 67, 70,
+66, 66, 70, 66, 66, 70, 66, 66, 70, 66,
+66, 69, 66, 66, 68, 65, 65, 66, 63, 63,
+65, 63, 63, 67, 64, 64, 71, 67, 67, 76,
+71, 71, 78, 72, 72, 75, 70, 70, 69, 66,
+66, 65, 62, 62, 64, 61, 61, 67, 64, 64,
+67, 64, 64, 109, 106, 106, 154, 150, 150, 157,
+152, 152, 155, 151, 151, 154, 150, 150, 152, 149,
+149, 152, 149, 149, 151, 148, 148, 150, 148, 148,
+152, 149, 149, 153, 150, 150, 153, 150, 150, 153,
+150, 150, 153, 150, 150, 154, 150, 150, 156, 151,
+151, 157, 151, 151, 156, 151, 151, 154, 150, 150,
+151, 148, 148, 149, 147, 147, 150, 148, 148, 151,
+148, 148, 152, 149, 149, 152, 149, 149, 152, 149,
+149, 152, 149, 149, 151, 148, 148, 152, 149, 149,
+147, 145, 145, 140, 139, 139, 133, 133, 133, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 132, 132, 132,
+139, 138, 138, 147, 145, 145, 152, 148, 148, 152,
+149, 149, 153, 149, 149, 154, 149, 149, 154, 150,
+150, 154, 150, 150, 154, 149, 149, 153, 149, 149,
+152, 149, 149, 152, 149, 149, 152, 149, 149, 150,
+147, 147, 150, 147, 147, 151, 148, 148, 153, 150,
+150, 154, 150, 150, 154, 150, 150, 154, 150, 150,
+154, 150, 150, 153, 150, 150, 153, 149, 149, 152,
+149, 149, 151, 148, 148, 150, 147, 147, 151, 148,
+148, 152, 149, 149, 152, 149, 149, 109, 106, 106,
+66, 63, 63, 66, 63, 63, 67, 64, 64, 67,
+64, 64, 68, 65, 65, 71, 67, 67, 75, 70,
+70, 74, 69, 69, 71, 67, 67, 70, 66, 66,
+70, 66, 66, 70, 66, 66, 69, 65, 65, 68,
+65, 65, 67, 64, 64, 67, 64, 64, 66, 63,
+63, 66, 63, 63, 66, 63, 63, 68, 65, 65,
+68, 65, 65, 67, 64, 64, 66, 63, 63, 66,
+63, 63, 62, 60, 60, 60, 58, 58, 64, 62,
+62, 69, 65, 65, 71, 67, 67, 72, 68, 68,
+74, 70, 70, 72, 68, 68, 65, 63, 63, 63,
+60, 60, 61, 59, 59, 61, 59, 59, 63, 60,
+60, 65, 63, 63, 67, 64, 64, 70, 66, 66,
+69, 65, 65, 65, 62, 62, 64, 62, 62, 66,
+63, 63, 67, 64, 64, 68, 65, 65, 68, 65,
+65, 69, 66, 66, 69, 65, 65, 70, 66, 66,
+69, 65, 65, 68, 65, 65, 68, 65, 65, 69,
+66, 66, 68, 65, 65, 67, 64, 64, 65, 63,
+63, 64, 62, 62, 65, 63, 63, 67, 64, 64,
+132, 129, 129, 153, 150, 150, 152, 149, 149, 151,
+148, 148, 150, 148, 148, 149, 147, 147, 150, 147,
+147, 152, 149, 149, 154, 150, 150, 154, 150, 150,
+152, 149, 149, 152, 149, 149, 152, 149, 149, 152,
+149, 149, 152, 149, 149, 153, 150, 150, 153, 150,
+150, 153, 149, 149, 153, 150, 150, 152, 149, 149,
+151, 148, 148, 152, 149, 149, 155, 150, 150, 155,
+150, 150, 154, 150, 150, 153, 149, 149, 154, 150,
+150, 154, 150, 150, 148, 146, 146, 139, 139, 139,
+132, 132, 132, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 132, 132, 132, 138, 137, 137, 144,
+143, 143, 152, 148, 148, 153, 149, 149, 153, 150,
+150, 154, 150, 150, 154, 150, 150, 154, 150, 150,
+154, 150, 150, 153, 150, 150, 153, 150, 150, 153,
+150, 150, 154, 150, 150, 154, 150, 150, 153, 149,
+149, 153, 149, 149, 152, 149, 149, 152, 149, 149,
+152, 149, 149, 153, 149, 149, 152, 149, 149, 152,
+149, 149, 152, 148, 148, 151, 148, 148, 150, 148,
+148, 151, 148, 148, 151, 148, 148, 151, 148, 148,
+152, 149, 149, 110, 106, 106, 67, 64, 64, 68,
+65, 65, 67, 64, 64, 65, 62, 62, 64, 61,
+61, 65, 63, 63, 65, 63, 63, 66, 63, 63,
+69, 65, 65, 70, 66, 66, 68, 65, 65, 67,
+64, 64, 67, 64, 64, 65, 63, 63, 63, 60,
+60, 64, 62, 62, 67, 64, 64, 68, 65, 65,
+69, 65, 65, 71, 67, 67, 69, 66, 66, 66,
+63, 63, 65, 62, 62, 64, 62, 62, 64, 62,
+62, 65, 63, 63, 69, 66, 66, 70, 66, 66,
+68, 65, 65, 68, 65, 65, 69, 65, 65, 67,
+64, 64, 64, 62, 62, 63, 61, 61, 65, 63,
+63, 69, 65, 65, 72, 68, 68, 71, 68, 68,
+69, 65, 65, 66, 63, 63, 64, 62, 62, 66,
+63, 63, 69, 66, 66, 70, 66, 66, 69, 66,
+66, 68, 65, 65, 66, 63, 63, 65, 62, 62,
+65, 63, 63, 64, 62, 62, 64, 61, 61, 63,
+60, 60, 64, 61, 61, 65, 63, 63, 66, 63,
+63, 68, 65, 65, 110, 107, 107, 153, 149, 149,
+153, 150, 150, 153, 149, 149, 151, 148, 148, 150,
+148, 148, 150, 148, 148, 151, 148, 148, 153, 149,
+149, 153, 150, 150, 153, 149, 149, 152, 149, 149,
+151, 148, 148, 151, 148, 148, 150, 148, 148, 150,
+148, 148, 149, 147, 147, 150, 147, 147, 152, 149,
+149, 153, 149, 149, 154, 150, 150, 154, 150, 150,
+153, 150, 150, 152, 148, 148, 152, 148, 148, 153,
+149, 149, 154, 150, 150, 154, 150, 150, 146, 144,
+144, 138, 138, 138, 132, 132, 132, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 130,
+130, 130, 136, 136, 136, 143, 142, 142, 151, 148,
+148, 153, 149, 149, 155, 151, 151, 156, 151, 151,
+156, 151, 151, 155, 151, 151, 153, 150, 150, 153,
+149, 149, 154, 150, 150, 155, 151, 151, 155, 151,
+151, 155, 151, 151, 154, 150, 150, 153, 150, 150,
+152, 149, 149, 152, 149, 149, 152, 149, 149, 152,
+149, 149, 152, 149, 149, 152, 149, 149, 153, 149,
+149, 152, 149, 149, 153, 149, 149, 153, 149, 149,
+152, 149, 149, 152, 149, 149, 154, 150, 150, 113,
+109, 109, 71, 68, 68, 69, 66, 66, 66, 63,
+63, 65, 62, 62, 65, 63, 63, 66, 63, 63,
+67, 64, 64, 67, 64, 64, 67, 64, 64, 68,
+65, 65, 70, 66, 66, 71, 67, 67, 70, 66,
+66, 69, 66, 66, 68, 65, 65, 69, 66, 66,
+71, 67, 67, 71, 67, 67, 69, 66, 66, 67,
+64, 64, 66, 63, 63, 68, 65, 65, 70, 66,
+66, 72, 68, 68, 72, 68, 68, 71, 67, 67,
+70, 66, 66, 69, 66, 66, 66, 63, 63, 65,
+63, 63, 65, 62, 62, 62, 60, 60, 65, 62,
+62, 71, 67, 67, 73, 68, 68, 71, 67, 67,
+69, 66, 66, 68, 65, 65, 69, 66, 66, 70,
+66, 66, 72, 68, 68, 71, 67, 67, 67, 64,
+64, 67, 64, 64, 67, 64, 64, 68, 65, 65,
+67, 64, 64, 65, 62, 62, 66, 63, 63, 66,
+63, 63, 67, 64, 64, 68, 65, 65, 132, 129,
+129, 153, 150, 150, 153, 150, 150, 153, 149, 149,
+152, 149, 149, 151, 148, 148, 151, 148, 148, 151,
+148, 148, 152, 149, 149, 152, 149, 149, 153, 149,
+149, 152, 149, 149, 151, 148, 148, 151, 148, 148,
+151, 148, 148, 150, 148, 148, 150, 148, 148, 151,
+148, 148, 152, 149, 149, 153, 150, 150, 154, 150,
+150, 154, 150, 150, 153, 150, 150, 153, 149, 149,
+153, 149, 149, 153, 150, 150, 153, 149, 149, 152,
+149, 149, 144, 143, 143, 137, 137, 137, 130, 130,
+130, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 135, 135,
+135, 139, 139, 139, 144, 143, 143, 146, 145, 145,
+147, 145, 145, 148, 146, 146, 148, 146, 146, 147,
+145, 145, 146, 144, 144, 146, 144, 144, 147, 145,
+145, 147, 146, 146, 148, 146, 146, 147, 145, 145,
+146, 145, 145, 145, 144, 144, 145, 144, 144, 146,
+144, 144, 147, 145, 145, 147, 145, 145, 146, 144,
+144, 146, 144, 144, 145, 144, 144, 145, 144, 144,
+145, 144, 144, 145, 144, 144, 147, 145, 145, 147,
+146, 146, 148, 146, 146, 148, 146, 146, 125, 124,
+124, 80, 78, 78, 57, 55, 55, 55, 54, 54,
+54, 53, 53, 54, 52, 52, 54, 53, 53, 57,
+55, 55, 59, 57, 57, 60, 58, 58, 60, 58,
+58, 60, 58, 58, 59, 58, 58, 60, 58, 58,
+60, 58, 58, 59, 57, 57, 57, 55, 55, 57,
+56, 56, 56, 55, 55, 55, 53, 53, 55, 54,
+54, 56, 55, 55, 56, 55, 55, 57, 56, 56,
+59, 57, 57, 59, 57, 57, 57, 56, 56, 55,
+54, 54, 53, 52, 52, 53, 52, 52, 54, 53,
+53, 57, 56, 56, 59, 57, 57, 60, 58, 58,
+62, 60, 60, 63, 61, 61, 64, 61, 61, 62,
+60, 60, 61, 59, 59, 60, 58, 58, 59, 57,
+57, 57, 55, 55, 57, 55, 55, 57, 55, 55,
+58, 56, 56, 59, 57, 57, 81, 79, 79, 125,
+124, 124, 147, 145, 145, 147, 145, 145, 147, 146,
+146, 147, 146, 146, 146, 145, 145, 146, 144, 144,
+145, 144, 144, 145, 144, 144, 145, 144, 144, 145,
+144, 144, 145, 144, 144, 145, 144, 144, 145, 144,
+144, 144, 143, 143, 144, 143, 143, 145, 144, 144,
+146, 144, 144, 146, 145, 145, 146, 144, 144, 146,
+144, 144, 145, 144, 144, 146, 144, 144, 147, 145,
+145, 147, 145, 145, 147, 145, 145, 147, 145, 145,
+146, 144, 144, 145, 144, 144, 139, 139, 139, 135,
+135, 135, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 104, 104, 104, 52, 52, 52, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 52, 52,
+52, 104, 104, 104, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+104, 104, 104, 78, 78, 78, 78, 78, 78, 78,
+78, 78, 78, 78, 78, 52, 52, 52, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 52, 52, 52, 78, 78, 78, 78, 78,
+78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+104, 104, 104, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
+122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
+122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
+123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
+124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 79, 79, 79, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 79, 79, 79, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 80, 80, 80, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 52, 52, 52, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 107, 107, 107,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+107, 107, 107, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 80, 80, 80, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 80, 80, 80, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 107, 107, 107, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 80, 80, 80, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 53, 53, 53, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 53, 53, 53, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 107, 107, 107,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+80, 80, 80, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 53, 53, 53, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 53, 53, 53, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
+125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
+125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
+127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
+128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 138, 138, 138, 138, 138, 138, 138,
+138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+138, 138, 138, 138, 138, 138, 138, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
+137, 137, 137, 137, 137, 137, 137, 137, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
+136, 136, 136, 136, 136, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
+135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
+132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
+131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
+130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
+129, 129, 129, 129, 128, 128, 128, 128, 128, 128};
+static unsigned char *projector_world_camera MAYBE_UNUSED
+= __projector_world_camera;
+
+#endif
diff --git a/test/integration/imu.cc b/test/integration/imu.cc
new file mode 100644
index 0000000..d3ea933
--- /dev/null
+++ b/test/integration/imu.cc
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "gazebo/common/common.hh"
+#include "helper_physics_generator.hh"
+
+// How tightly to compare for deterministic values
+#define IMU_TOL 1e-5
+
+using namespace gazebo;
+class ImuTest : public ServerFixture,
+                public testing::WithParamInterface<const char*>
+{
+  public: void Stationary_EmptyWorld(const std::string &_physicsEngine);
+  public: void Stationary_EmptyWorld_Noise(const std::string &_physicsEngine);
+  public: void Stationary_EmptyWorld_Bias(const std::string &_physicsEngine);
+  private: void GetGravity(const math::Quaternion& _rot, math::Vector3 &_g);
+  private: void GetImuData(sensors::ImuSensorPtr _imu, unsigned int _cnt,
+                           math::Vector3 &_rateMean,
+                           math::Vector3 &_accelMean,
+                           math::Quaternion &_orientation);
+};
+
+void ImuTest::GetGravity(const math::Quaternion &_rot, math::Vector3 &_g)
+{
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics);
+  // Rotate into IMU's frame
+  _g = _rot.GetInverse().RotateVector(physics->GetGravity());
+}
+
+void ImuTest::GetImuData(sensors::ImuSensorPtr _imu,
+                         unsigned int _cnt,
+                         math::Vector3 &_rateMean,
+                         math::Vector3 &_accelMean,
+                         math::Quaternion& _orientation)
+{
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+  // Collect a number of samples and return the average rate and accel values
+  math::Vector3 rateSum, accelSum;
+  for (unsigned int i = 0; i < _cnt; ++i)
+  {
+    world->Step(1);
+
+    int j = 0;
+    while (_imu->GetLastMeasurementTime() == gazebo::common::Time::Zero &&
+        j < 100)
+    {
+      _imu->Update(true);
+      gazebo::common::Time::MSleep(100);
+      ++j;
+    }
+
+    EXPECT_LT(j, 100);
+
+    rateSum += _imu->GetAngularVelocity();
+    accelSum += _imu->GetLinearAcceleration();
+  }
+  _rateMean = rateSum / _cnt;
+  _accelMean = accelSum / _cnt;
+  _orientation = _imu->GetOrientation();
+}
+
+void ImuTest::Stationary_EmptyWorld(const std::string &_physicsEngine)
+{
+  // static models not fully working in simbody yet
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test for Simbody, see issue #860.\n";
+    return;
+  }
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  std::string modelName = "imu_model";
+  std::string imuSensorName = "imu_sensor";
+  math::Pose testPose(math::Vector3(0, 0, 0.05),
+      math::Quaternion(0.5, -1.0, 0.2));
+
+  SpawnImuSensor(modelName, imuSensorName, testPose.pos,
+      testPose.rot.GetAsEuler());
+
+  sensors::ImuSensorPtr imu =
+    boost::static_pointer_cast<sensors::ImuSensor>(
+        sensors::SensorManager::Instance()->GetSensor(imuSensorName));
+
+  ASSERT_TRUE(imu);
+  imu->Init();
+  math::Vector3 rateMean, accelMean;
+  math::Quaternion orientation;
+  this->GetImuData(imu, 1, rateMean, accelMean, orientation);
+
+  EXPECT_NEAR(rateMean.x, 0.0, IMU_TOL);
+  EXPECT_NEAR(rateMean.y, 0.0, IMU_TOL);
+  EXPECT_NEAR(rateMean.z, 0.0, IMU_TOL);
+
+  math::Vector3 g;
+  this->GetGravity(testPose.rot, g);
+  EXPECT_NEAR(accelMean.x, -g.x, IMU_TOL);
+  EXPECT_NEAR(accelMean.y, -g.y, IMU_TOL);
+  EXPECT_NEAR(accelMean.z, -g.z, IMU_TOL);
+
+  // Orientation should be identity, since it is reported relative
+  // to reference pose.
+  EXPECT_NEAR(orientation.x, 0, IMU_TOL);
+  EXPECT_NEAR(orientation.y, 0, IMU_TOL);
+  EXPECT_NEAR(orientation.z, 0, IMU_TOL);
+  EXPECT_NEAR(orientation.w, 1, IMU_TOL);
+}
+
+TEST_P(ImuTest, EmptyWorld)
+{
+  Stationary_EmptyWorld(GetParam());
+}
+
+void ImuTest::Stationary_EmptyWorld_Noise(const std::string &_physicsEngine)
+{
+  // static models not fully working in simbody yet
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test for Simbody, see issue #860.\n";
+    return;
+  }
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  std::string modelName = "imu_model";
+  std::string imuSensorName = "imu_sensor";
+  math::Pose testPose(math::Vector3(0, 0, 0.05),
+      math::Quaternion(0.3, -1.4, 2.0));
+
+  double rateNoiseMean = 1.0;
+  double rateNoiseStddev = 0.1;
+  double rateBiasMean = 0.0;
+  double rateBiasStddev = 0.0;
+  double accelNoiseMean = -10.0;
+  double accelNoiseStddev = 0.1;
+  double accelBiasMean = 0.0;
+  double accelBiasStddev = 0.0;
+  SpawnImuSensor(modelName, imuSensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), "gaussian",
+      rateNoiseMean, rateNoiseStddev,
+      rateBiasMean, rateBiasStddev,
+      accelNoiseMean, accelNoiseStddev,
+      accelBiasMean, accelBiasStddev);
+
+  sensors::ImuSensorPtr imu =
+    boost::static_pointer_cast<sensors::ImuSensor>(
+        sensors::SensorManager::Instance()->GetSensor(imuSensorName));
+
+  ASSERT_TRUE(imu);
+  imu->Init();
+  math::Vector3 rateMean, accelMean;
+  math::Quaternion orientation;
+  this->GetImuData(imu, 1000, rateMean, accelMean, orientation);
+
+  double d1, d2;
+  // Have to account for the fact that the bias might be sampled as positive
+  // or negative
+  d1 = fabs(rateMean.x - (rateNoiseMean + rateBiasMean));
+  d2 = fabs(rateMean.x - (rateNoiseMean - rateBiasMean));
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*rateNoiseStddev + 3*rateBiasStddev);
+  d1 = fabs(rateMean.y - (rateNoiseMean + rateBiasMean));
+  d2 = fabs(rateMean.y - (rateNoiseMean - rateBiasMean));
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*rateNoiseStddev + 3*rateBiasStddev);
+  d1 = fabs(rateMean.z - (rateNoiseMean + rateBiasMean));
+  d2 = fabs(rateMean.z - (rateNoiseMean - rateBiasMean));
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*rateNoiseStddev + 3*rateBiasStddev);
+
+  math::Vector3 g;
+  this->GetGravity(testPose.rot, g);
+  // Have to account for the fact that the bias might be sampled as positive
+  // or negative
+  d1 = fabs(accelMean.x - (accelNoiseMean + accelBiasMean) + g.x);
+  d2 = fabs(accelMean.x - (accelNoiseMean - accelBiasMean) + g.x);
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*accelNoiseStddev + 3*accelBiasStddev);
+  d1 = fabs(accelMean.y - (accelNoiseMean + accelBiasMean) + g.y);
+  d2 = fabs(accelMean.y - (accelNoiseMean - accelBiasMean) + g.y);
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*accelNoiseStddev + 3*accelBiasStddev);
+  d1 = fabs(accelMean.z - (accelNoiseMean + accelBiasMean) + g.z);
+  d2 = fabs(accelMean.z - (accelNoiseMean - accelBiasMean) + g.z);
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*accelNoiseStddev + 3*accelBiasStddev);
+
+  // Orientation should be identity, since it is reported relative
+  // to reference pose.
+  EXPECT_NEAR(orientation.x, 0, IMU_TOL);
+  EXPECT_NEAR(orientation.y, 0, IMU_TOL);
+  EXPECT_NEAR(orientation.z, 0, IMU_TOL);
+  EXPECT_NEAR(orientation.w, 1, IMU_TOL);
+}
+
+TEST_P(ImuTest, EmptyWorldNoise)
+{
+  Stationary_EmptyWorld_Noise(GetParam());
+}
+
+void ImuTest::Stationary_EmptyWorld_Bias(const std::string &_physicsEngine)
+{
+  // static models not fully working in simbody yet
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test for Simbody, see issue #860.\n";
+    return;
+  }
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  std::string modelName = "imu_model";
+  std::string imuSensorName = "imu_sensor";
+  math::Pose testPose(math::Vector3(0, 0, 0.05),
+      math::Quaternion(-0.3, 0.5, 1.0));
+
+  double rateNoiseMean = 0.0;
+  double rateNoiseStddev = 0.0;
+  double rateBiasMean = 1.0;
+  double rateBiasStddev = 0.1;
+  double accelNoiseMean = 0.0;
+  double accelNoiseStddev = 0.0;
+  double accelBiasMean = 5.0;
+  double accelBiasStddev = 0.1;
+  SpawnImuSensor(modelName, imuSensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), "gaussian",
+      rateNoiseMean, rateNoiseStddev,
+      rateBiasMean, rateBiasStddev,
+      accelNoiseMean, accelNoiseStddev,
+      accelBiasMean, accelBiasStddev);
+
+  sensors::ImuSensorPtr imu =
+    boost::static_pointer_cast<sensors::ImuSensor>(
+        sensors::SensorManager::Instance()->GetSensor(imuSensorName));
+
+  ASSERT_TRUE(imu);
+  imu->Init();
+  math::Vector3 rateMean, accelMean;
+  math::Quaternion orientation;
+  this->GetImuData(imu, 1000, rateMean, accelMean, orientation);
+
+  double d1, d2;
+  // Have to account for the fact that the bias might be sampled as positive
+  // or negative
+  d1 = fabs(rateMean.x - (rateNoiseMean + rateBiasMean));
+  d2 = fabs(rateMean.x - (rateNoiseMean - rateBiasMean));
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*rateNoiseStddev + 3*rateBiasStddev);
+  d1 = fabs(rateMean.y - (rateNoiseMean + rateBiasMean));
+  d2 = fabs(rateMean.y - (rateNoiseMean - rateBiasMean));
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*rateNoiseStddev + 3*rateBiasStddev);
+  d1 = fabs(rateMean.z - (rateNoiseMean + rateBiasMean));
+  d2 = fabs(rateMean.z - (rateNoiseMean - rateBiasMean));
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*rateNoiseStddev + 3*rateBiasStddev);
+
+  math::Vector3 g;
+  this->GetGravity(testPose.rot, g);
+  // Have to account for the fact that the bias might be sampled as positive
+  // or negative
+  d1 = fabs(accelMean.x - (accelNoiseMean + accelBiasMean) + g.x);
+  d2 = fabs(accelMean.x - (accelNoiseMean - accelBiasMean) + g.x);
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*accelNoiseStddev + 3*accelBiasStddev);
+  d1 = fabs(accelMean.y - (accelNoiseMean + accelBiasMean) + g.y);
+  d2 = fabs(accelMean.y - (accelNoiseMean - accelBiasMean) + g.y);
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*accelNoiseStddev + 3*accelBiasStddev);
+  d1 = fabs(accelMean.z - (accelNoiseMean + accelBiasMean) + g.z);
+  d2 = fabs(accelMean.z - (accelNoiseMean - accelBiasMean) + g.z);
+  EXPECT_NEAR(0.0, std::min(d1, d2),
+              3*accelNoiseStddev + 3*accelBiasStddev);
+
+  // Orientation should be identity, since it is reported relative
+  // to reference pose.
+  EXPECT_NEAR(orientation.x, 0, IMU_TOL);
+  EXPECT_NEAR(orientation.y, 0, IMU_TOL);
+  EXPECT_NEAR(orientation.z, 0, IMU_TOL);
+  EXPECT_NEAR(orientation.w, 1, IMU_TOL);
+}
+
+TEST_P(ImuTest, EmptyWorldBias)
+{
+  Stationary_EmptyWorld_Bias(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, ImuTest, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  // Set a specific seed to avoid occasional test failures due to
+  // statistically unlikely, but possible results.
+  math::Rand::SetSeed(42);
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/joint_controller.cc b/test/integration/joint_controller.cc
new file mode 100644
index 0000000..fe9947f
--- /dev/null
+++ b/test/integration/joint_controller.cc
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/JointController.hh"
+#include "gazebo/common/PID.hh"
+#include "test/ServerFixture.hh"
+#include "test_config.h"
+
+using namespace gazebo;
+class JointControllerTest : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+TEST_F(JointControllerTest, PositionControl)
+{
+  Load("worlds/simple_arm_test.world", true);
+  gazebo::physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+  gazebo::physics::ModelPtr model = world->GetModel("simple_arm");
+  gazebo::physics::JointControllerPtr jointController =
+    model->GetJointController();
+
+  world->Step(100);
+
+  gazebo::transport::PublisherPtr pub =
+    this->node->Advertise<gazebo::msgs::JointCmd>(
+        "/gazebo/default/simple_arm/joint_cmd");
+
+  msgs::JointCmd msg;
+  msg.set_name("simple_arm::arm_shoulder_pan_joint");
+  msg.mutable_position()->set_target(1.0);
+  msg.mutable_position()->set_p_gain(10);
+  msg.mutable_position()->set_i_gain(0.1);
+  msg.mutable_position()->set_d_gain(4.5);
+  pub->Publish(msg);
+
+  world->Step(5000);
+
+  math::Angle angle = model->GetJoint("arm_shoulder_pan_joint")->GetAngle(0);
+
+  EXPECT_NEAR(angle.Radian(), 1.0, 0.1);
+}
+
+/////////////////////////////////////////////////
+TEST_F(JointControllerTest, VelocityControl)
+{
+  Load("worlds/simple_arm_test.world", true);
+  gazebo::physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+  gazebo::physics::ModelPtr model = world->GetModel("simple_arm");
+  gazebo::physics::JointControllerPtr jointController =
+    model->GetJointController();
+
+  world->Step(100);
+
+  gazebo::transport::PublisherPtr pub =
+    this->node->Advertise<gazebo::msgs::JointCmd>(
+        "/gazebo/default/simple_arm/joint_cmd");
+
+  msgs::JointCmd msg;
+  msg.set_name("simple_arm::arm_shoulder_pan_joint");
+  msg.mutable_velocity()->set_target(0.2);
+  msg.mutable_velocity()->set_p_gain(0.1);
+  msg.mutable_velocity()->set_i_gain(0.1);
+  msg.mutable_velocity()->set_d_gain(0.1);
+  pub->Publish(msg);
+
+  world->Step(5000);
+  double vel = model->GetJoint("arm_shoulder_pan_joint")->GetVelocity(0);
+
+  EXPECT_NEAR(vel, 0.2, 0.05);
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/joint_force_torque.cc b/test/integration/joint_force_torque.cc
new file mode 100644
index 0000000..ce3db27
--- /dev/null
+++ b/test/integration/joint_force_torque.cc
@@ -0,0 +1,530 @@
+/*
+ * Copyright (C) 2012-2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/physics/physics.hh"
+#include "gazebo/physics/Joint.hh"
+#include "test/ServerFixture.hh"
+#include "test/integration/helper_physics_generator.hh"
+
+#define TOL 1e-6
+#define TOL_CONT 2.0
+
+using namespace gazebo;
+
+class JointForceTorqueTest : public ServerFixture,
+                             public testing::WithParamInterface<const char*>
+{
+  /// \brief Load example world with a few joints
+  /// Measure / verify static force torques against analytical answers.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void ForceTorque1(const std::string &_physicsEngine);
+
+  /// \brief Load example world with a few joints
+  /// Measure / verify static force torques against analytical answers.
+  /// Change gravity to tip over the joints.
+  /// Wait until joint stops are hit and joint motion settles,
+  /// then check force torques values against analytical values.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void ForceTorque2(const std::string &_physicsEngine);
+
+  /// \brief Load example world with a few joints.
+  /// Servo the joints to a fixed target position using simple PID controller.
+  /// Measure / verify static force torques against analytical answers.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void GetForceTorqueWithAppliedForce(
+    const std::string &_physicsEngine);
+
+  /// \brief Create a hinge joint between link and world.
+  /// Apply force and check acceleration against analytical solution.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void JointTorqueTest(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void JointForceTorqueTest::ForceTorque1(const std::string &_physicsEngine)
+{
+  // Load our force torque test world
+  Load("worlds/force_torque_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics->SetGravity(math::Vector3(0, 0, -50));
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+
+  // get time step size
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  gzlog << "dt : " << dt << "\n";
+
+  // verify that time moves forward
+  EXPECT_DOUBLE_EQ(t, dt);
+  gzlog << "t after one step : " << t << "\n";
+
+  // get joint and get force torque
+  physics::ModelPtr model_1 = world->GetModel("model_1");
+  physics::LinkPtr link_1 = model_1->GetLink("link_1");
+  physics::LinkPtr link_2 = model_1->GetLink("link_2");
+  physics::JointPtr joint_01 = model_1->GetJoint("joint_01");
+  physics::JointPtr joint_12 = model_1->GetJoint("joint_12");
+
+  gzlog << "-------------------Test 1-------------------\n";
+  for (unsigned int i = 0; i < 10; ++i)
+  {
+    world->Step(1);
+    // test joint_01 wrench
+    physics::JointWrench wrench_01 = joint_01->GetForceTorque(0u);
+    EXPECT_DOUBLE_EQ(wrench_01.body1Force.x,    0.0);
+    EXPECT_DOUBLE_EQ(wrench_01.body1Force.y,    0.0);
+    EXPECT_DOUBLE_EQ(wrench_01.body1Force.z, 1000.0);
+    EXPECT_DOUBLE_EQ(wrench_01.body1Torque.x,   0.0);
+    EXPECT_DOUBLE_EQ(wrench_01.body1Torque.y,   0.0);
+    EXPECT_DOUBLE_EQ(wrench_01.body1Torque.z,   0.0);
+
+    EXPECT_DOUBLE_EQ(wrench_01.body2Force.x,  -wrench_01.body1Force.x);
+    EXPECT_DOUBLE_EQ(wrench_01.body2Force.y,  -wrench_01.body1Force.y);
+    EXPECT_DOUBLE_EQ(wrench_01.body2Force.z,  -wrench_01.body1Force.z);
+    EXPECT_DOUBLE_EQ(wrench_01.body2Torque.x, -wrench_01.body1Torque.x);
+    EXPECT_DOUBLE_EQ(wrench_01.body2Torque.y, -wrench_01.body1Torque.y);
+    EXPECT_DOUBLE_EQ(wrench_01.body2Torque.z, -wrench_01.body1Torque.z);
+
+    gzlog << "link_1 pose [" << link_1->GetWorldPose()
+          << "] velocity [" << link_1->GetWorldLinearVel()
+          << "]\n";
+    gzlog << "link_2 pose [" << link_2->GetWorldPose()
+          << "] velocity [" << link_2->GetWorldLinearVel()
+          << "]\n";
+    gzlog << "joint_01 force torque : "
+          << "force1 [" << wrench_01.body1Force
+          << " / 0 0 1000"
+          << "] torque1 [" << wrench_01.body1Torque
+          << " / 0 0 0"
+          << "] force2 [" << wrench_01.body2Force
+          << " / 0 0 -1000"
+          << "] torque2 [" << wrench_01.body2Torque
+          << " / 0 0 0"
+          << "]\n";
+
+    // test joint_12 wrench
+    physics::JointWrench wrench_12 = joint_12->GetForceTorque(0u);
+    EXPECT_DOUBLE_EQ(wrench_12.body1Force.x,    0.0);
+    EXPECT_DOUBLE_EQ(wrench_12.body1Force.y,    0.0);
+    EXPECT_DOUBLE_EQ(wrench_12.body1Force.z,  500.0);
+    EXPECT_DOUBLE_EQ(wrench_12.body1Torque.x,   0.0);
+    EXPECT_DOUBLE_EQ(wrench_12.body1Torque.y,   0.0);
+    EXPECT_DOUBLE_EQ(wrench_12.body1Torque.z,   0.0);
+
+    EXPECT_DOUBLE_EQ(wrench_12.body2Force.x,  -wrench_12.body1Force.x);
+    EXPECT_DOUBLE_EQ(wrench_12.body2Force.y,  -wrench_12.body1Force.y);
+    EXPECT_DOUBLE_EQ(wrench_12.body2Force.z,  -wrench_12.body1Force.z);
+    EXPECT_DOUBLE_EQ(wrench_12.body2Torque.x, -wrench_12.body1Torque.x);
+    EXPECT_DOUBLE_EQ(wrench_12.body2Torque.y, -wrench_12.body1Torque.y);
+    EXPECT_DOUBLE_EQ(wrench_12.body2Torque.z, -wrench_12.body1Torque.z);
+
+    gzlog << "link_1 pose [" << link_1->GetWorldPose()
+          << "] velocity [" << link_1->GetWorldLinearVel()
+          << "]\n";
+    gzlog << "link_2 pose [" << link_2->GetWorldPose()
+          << "] velocity [" << link_2->GetWorldLinearVel()
+          << "]\n";
+    gzlog << "joint_12 force torque : "
+          << "force1 [" << wrench_12.body1Force
+          << " / 0 0 500"
+          << "] torque1 [" << wrench_12.body1Torque
+          << " / 0 0 0"
+          << "] force2 [" << wrench_12.body2Force
+          << " / 0 0 -500"
+          << "] torque2 [" << wrench_12.body2Torque
+          << " / 0 0 0"
+          << "]\n";
+  }
+}
+
+/////////////////////////////////////////////////
+void JointForceTorqueTest::ForceTorque2(const std::string &_physicsEngine)
+{
+  // Load our force torque test world
+  Load("worlds/force_torque_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics->SetGravity(math::Vector3(0, 0, -50));
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+
+  // get time step size
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  gzlog << "dt : " << dt << "\n";
+
+  // verify that time moves forward
+  EXPECT_DOUBLE_EQ(t, dt);
+  gzlog << "t after one step : " << t << "\n";
+
+  // get joint and get force torque
+  physics::ModelPtr model_1 = world->GetModel("model_1");
+  physics::LinkPtr link_1 = model_1->GetLink("link_1");
+  physics::LinkPtr link_2 = model_1->GetLink("link_2");
+  physics::JointPtr joint_01 = model_1->GetJoint("joint_01");
+  physics::JointPtr joint_12 = model_1->GetJoint("joint_12");
+
+  // perturbe joints so top link topples over, then remeasure
+  physics->SetGravity(math::Vector3(-30, 10, -50));
+  // tune joint stop properties
+  joint_01->SetParam("stop_erp", 0, 0.02);
+  joint_12->SetParam("stop_erp", 0, 0.02);
+  // wait for dynamics to stabilize
+  world->Step(2000);
+  // check force torques in new system
+  gzlog << "\n-------------------Test 2-------------------\n";
+  for (unsigned int i = 0; i < 5; ++i)
+  {
+    world->Step(1);
+    // Dbg joint_01 force torque :
+    //   force1 [600 -200 999.99999600000001 / 600 -1000 -200]
+    //   torque1 [749.999819 82.840868 -450.00009699999998 / 750 450 0]
+    //   force2 [-600 999.99976200000003 200.00117299999999 / -600 1000 200]
+    //   torque2 [-749.999819 -450 -82.841396000000003 / -750 -450 0]
+    // Dbg joint_12 force torque :
+    //   force1 [300 -499.99987900000002 -100.000587 / 300 -500 -100]
+    //   torque1 [249.99994000000001 150 82.841396000000003 / 250 150 0]
+    //   force2 [-300.000407 499.99963500000001 100.000587 / -300 500 100]
+    //   torque2 [-249.999818 -150.000203 -82.841396000000003 / -250 -150 0]
+
+    // test joint_01 wrench
+    physics::JointWrench wrench_01 = joint_01->GetForceTorque(0u);
+    EXPECT_NEAR(wrench_01.body1Force.x,   600.0,  6.0);
+    EXPECT_NEAR(wrench_01.body1Force.y,  -200.0, 10.0);
+    EXPECT_NEAR(wrench_01.body1Force.z,  1000.0,  2.0);
+    EXPECT_NEAR(wrench_01.body1Torque.x,  750.0,  7.5);
+    EXPECT_NEAR(wrench_01.body1Torque.y,    0.0,  4.5);
+    EXPECT_NEAR(wrench_01.body1Torque.z, -450.0,  0.1);
+
+    EXPECT_NEAR(wrench_01.body2Force.x,  -600.0,  6.0);
+    EXPECT_NEAR(wrench_01.body2Force.y,  1000.0, 10.0);
+    if (_physicsEngine == "dart")
+    {
+      // DART needs greater tolerance due to joint limit violation
+      // Please see issue #902
+      EXPECT_NEAR(wrench_01.body2Force.z,   200.0,  8.6);
+    }
+    else
+    {
+      EXPECT_NEAR(wrench_01.body2Force.z,   200.0,  2.0);
+    }
+    EXPECT_NEAR(wrench_01.body2Torque.x, -750.0,  7.5);
+    EXPECT_NEAR(wrench_01.body2Torque.y, -450.0,  4.5);
+    EXPECT_NEAR(wrench_01.body2Torque.z,    0.0,  0.1);
+
+    gzlog << "joint_01 force torque : "
+          << "force1 [" << wrench_01.body1Force
+          << " / 600 -200 1000"
+          << "] torque1 [" << wrench_01.body1Torque
+          << " / 750 0 450"
+          << "] force2 [" << wrench_01.body2Force
+          << " / -600 1000 200"
+          << "] torque2 [" << wrench_01.body2Torque
+          << " / -750 -450 0"
+          << "]\n";
+
+    gzlog << "joint angle1[" << std::setprecision(17) << joint_01->GetAngle(0)
+          << "] angle2[" << joint_12->GetAngle(0) << "]\n";
+
+    // test joint_12 wrench
+    physics::JointWrench wrench_12 = joint_12->GetForceTorque(0u);
+    EXPECT_NEAR(wrench_12.body1Force.x,   300.0,  3.0);
+    EXPECT_NEAR(wrench_12.body1Force.y,  -500.0,  5.0);
+    if (_physicsEngine == "dart")
+    {
+      // DART needs greater tolerance due to joint limit violation
+      // Please see issue #902
+      EXPECT_NEAR(wrench_12.body1Force.z,  -100.0,  4.3);
+    }
+    else
+    {
+      EXPECT_NEAR(wrench_12.body1Force.z,  -100.0,  1.0);
+    }
+    EXPECT_NEAR(wrench_12.body1Torque.x,  250.0,  5.0);
+    EXPECT_NEAR(wrench_12.body1Torque.y,  150.0,  3.0);
+    EXPECT_NEAR(wrench_12.body1Torque.z,    0.0,  0.1);
+
+    // A good check is that
+    // the computed body1Torque shoud in fact be opposite of body1Torque
+    EXPECT_NEAR(wrench_12.body2Force.x,  -wrench_12.body1Force.x,  1e-1);
+    EXPECT_NEAR(wrench_12.body2Force.y,  -wrench_12.body1Force.y,  1e-1);
+    EXPECT_NEAR(wrench_12.body2Force.z,  -wrench_12.body1Force.z,  1e-1);
+    EXPECT_NEAR(wrench_12.body2Torque.x, -wrench_12.body1Torque.x, 1e-1);
+    EXPECT_NEAR(wrench_12.body2Torque.y, -wrench_12.body1Torque.y, 1e-1);
+    EXPECT_NEAR(wrench_12.body2Torque.z, -wrench_12.body1Torque.z, 1e-1);
+
+    gzlog << "joint_12 force torque : "
+          << "force1 [" << wrench_12.body1Force
+          << " / 300 -500 -100"
+          << "] torque1 [" << wrench_12.body1Torque
+          << " / 250 150 0"
+          << "] force2 [" << wrench_12.body2Force
+          << " / -300 500 100"
+          << "] torque2 [" << wrench_12.body2Torque
+          << " / -250 -150 0"
+          << "]\n";
+  }
+
+  // simulate a few steps
+  int steps = 20;
+  world->Step(steps);
+  t = world->GetSimTime().Double();
+  EXPECT_GT(t, 0.99*dt*static_cast<double>(steps+1));
+  gzdbg << "t after 20 steps : " << t << "\n";
+}
+
+/////////////////////////////////////////////////
+void JointForceTorqueTest::GetForceTorqueWithAppliedForce(
+  const std::string &_physicsEngine)
+{
+  // Explicit joint damping in bullet is causing this test to fail.
+  if (_physicsEngine == "bullet")
+  {
+    gzerr << "Aborting test for bullet, see issue #619.\n";
+    return;
+  }
+
+  // Load our force torque test world
+  Load("worlds/force_torque_test2.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics->SetGravity(math::Vector3(0, 0, -50));
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+
+  // get time step size
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  gzlog << "dt : " << dt << "\n";
+
+  // verify that time moves forward
+  EXPECT_GT(t, 0);
+  gzlog << "t after one step : " << t << "\n";
+
+  // get joint and get force torque
+  physics::ModelPtr model_1 = world->GetModel("boxes");
+  physics::JointPtr joint_01 = model_1->GetJoint("joint1");
+  physics::JointPtr joint_12 = model_1->GetJoint("joint2");
+
+  gzlog << "------------------- PD CONTROL -------------------\n";
+  static const double kp1 = 50000.0;
+  static const double kp2 = 10000.0;
+  static const double target1 = 0.0;
+  static const double target2 = -0.25*M_PI;
+  for (unsigned int i = 0; i < 3388; ++i)
+  {
+    // pd control
+    double j1State = joint_01->GetAngle(0u).Radian();
+    double j2State = joint_12->GetAngle(0u).Radian();
+    double p1Error = target1 - j1State;
+    double p2Error = target2 - j2State;
+    double effort1 = kp1 * p1Error;
+    double effort2 = kp2 * p2Error;
+    joint_01->SetForce(0u, effort1);
+    joint_12->SetForce(0u, effort2);
+
+    world->Step(1);
+    // test joint_01 wrench
+    physics::JointWrench wrench_01 = joint_01->GetForceTorque(0u);
+
+    if (i == 3387)
+    {
+      EXPECT_NEAR(wrench_01.body1Force.x,     0.0, TOL_CONT);
+      EXPECT_NEAR(wrench_01.body1Force.y,     0.0, TOL_CONT);
+      EXPECT_NEAR(wrench_01.body1Force.z,   300.0, TOL_CONT);
+      EXPECT_NEAR(wrench_01.body1Torque.x,   25.0, TOL_CONT);
+      EXPECT_NEAR(wrench_01.body1Torque.y, -175.0, TOL_CONT);
+      EXPECT_NEAR(wrench_01.body1Torque.z,    0.0, TOL_CONT);
+
+      EXPECT_NEAR(wrench_01.body2Force.x,  -wrench_01.body1Force.x,  TOL_CONT);
+      EXPECT_NEAR(wrench_01.body2Force.y,  -wrench_01.body1Force.y,  TOL_CONT);
+      EXPECT_NEAR(wrench_01.body2Force.z,  -wrench_01.body1Force.z,  TOL_CONT);
+      EXPECT_NEAR(wrench_01.body2Torque.x, -wrench_01.body1Torque.x, TOL_CONT);
+      EXPECT_NEAR(wrench_01.body2Torque.y, -wrench_01.body1Torque.y, TOL_CONT);
+      EXPECT_NEAR(wrench_01.body2Torque.z, -wrench_01.body1Torque.z, TOL_CONT);
+
+      gzlog << "joint_01 force torque : "
+            << "step [" << i
+            << "] GetForce [" << joint_01->GetForce(0u)
+            << "] command [" << effort1
+            << "] force1 [" << wrench_01.body1Force
+            << "] torque1 [" << wrench_01.body1Torque
+            << "] force2 [" << wrench_01.body2Force
+            << "] torque2 [" << wrench_01.body2Torque
+            << "]\n";
+    }
+
+    // test joint_12 wrench
+    physics::JointWrench wrench_12 = joint_12->GetForceTorque(0u);
+    if (i == 3387)
+    {
+      EXPECT_NEAR(wrench_12.body1Force.x,     0.0, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body1Force.y,     0.0, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body1Force.z,    50.0, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body1Torque.x,   25.0, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body1Torque.y,    0.0, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body1Torque.z,    0.0, TOL_CONT);
+
+      EXPECT_NEAR(wrench_12.body2Force.x,   -35.355, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body2Force.y,     0.000, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body2Force.z,   -35.355, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body2Torque.x,  -17.678, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body2Torque.y,    0.000, TOL_CONT);
+      EXPECT_NEAR(wrench_12.body2Torque.z,   17.678, TOL_CONT);
+
+      gzlog << "joint_12 force torque : "
+            << "step [" << i
+            << "] GetForce [" << joint_12->GetForce(0u)
+            << "] command [" << effort2
+            << "] force1 [" << wrench_12.body1Force
+            << "] torque1 [" << wrench_12.body1Torque
+            << "] force2 [" << wrench_12.body2Force
+            << "] torque2 [" << wrench_12.body2Torque
+            << "]\n";
+    }
+    gzlog << "angles[" << i << "] 1[" << joint_01->GetAngle(0)
+          << "] 2[" << joint_12->GetAngle(0)
+          << "]\n";
+  }
+}
+
+////////////////////////////////////////////////////////////////////////
+// Create a joint between link and world
+// Apply force and check acceleration for correctness
+////////////////////////////////////////////////////////////////////////
+void JointForceTorqueTest::JointTorqueTest(const std::string &_physicsEngine)
+{
+  // Load our inertial test world
+  Load("worlds/joint_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  {
+    // get model
+    physics::ModelPtr model = world->GetModel("model_1");
+    ASSERT_TRUE(model != NULL);
+    physics::LinkPtr link = model->GetLink("link_1");
+    ASSERT_TRUE(link != NULL);
+    physics::JointPtr joint = model->GetJoint("joint_01");
+
+    double lastV = 0;
+    double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+    for (unsigned int i = 0; i < 10; ++i)
+    {
+      double torque = 1.3;
+      joint->SetForce(0, torque);
+      world->Step(1);
+      double curV = joint->GetVelocity(0);
+      double accel = (curV - lastV) / dt;
+      gzdbg << i << " : " << curV << " : " << (curV - lastV) / dt << "\n";
+      lastV = curV;
+      EXPECT_NEAR(accel, torque / link->GetInertial()->GetIXX(), TOL);
+    }
+  }
+
+  {
+    // get model
+    physics::ModelPtr model = world->GetModel("model_2");
+    ASSERT_TRUE(model != NULL);
+    physics::LinkPtr link = model->GetLink("link_1");
+    ASSERT_TRUE(link != NULL);
+    physics::JointPtr joint = model->GetJoint("joint_01");
+
+    double lastV = 0;
+    double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+    for (unsigned int i = 0; i < 10; ++i)
+    {
+      double torque = 1.3;
+      joint->SetForce(0, torque);
+      world->Step(1);
+      double curV = joint->GetVelocity(0);
+      double accel = (curV - lastV) / dt;
+      gzdbg << i << " : " << curV << " : " << (curV - lastV) / dt << "\n";
+      lastV = curV;
+      EXPECT_NEAR(accel, torque / link->GetInertial()->GetIZZ(), TOL);
+    }
+  }
+}
+
+TEST_P(JointForceTorqueTest, ForceTorque1)
+{
+  ForceTorque1(GetParam());
+}
+
+TEST_P(JointForceTorqueTest, ForceTorque2)
+{
+  ForceTorque2(GetParam());
+}
+
+TEST_P(JointForceTorqueTest, GetForceTorqueWithAppliedForce)
+{
+  GetForceTorqueWithAppliedForce(GetParam());
+}
+
+TEST_P(JointForceTorqueTest, JointTorqueTest)
+{
+  JointTorqueTest(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, JointForceTorqueTest,
+                        PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/joint_gearbox.cc b/test/integration/joint_gearbox.cc
new file mode 100644
index 0000000..0c82153
--- /dev/null
+++ b/test/integration/joint_gearbox.cc
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/physics/physics.hh"
+#include "test/ServerFixture.hh"
+
+#define TOL 1e-6
+using namespace gazebo;
+
+class ODEGearboxJoint_TEST : public ServerFixture
+{
+  public: void GearboxTest(const std::string &_physicsEngine);
+  public: void SetGearboxRatio(const std::string &_physicsEngine);
+};
+
+////////////////////////////////////////////////////////////////////////
+// GearboxTest:
+// start gearbox.world, apply balancing forces across geared members,
+// check for equilibrium.
+////////////////////////////////////////////////////////////////////////
+void ODEGearboxJoint_TEST::GearboxTest(const std::string &_physicsEngine)
+{
+  // load gearbox world
+  Load("worlds/gearbox.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::ModelPtr model = world->GetModel("model_1");
+  physics::JointPtr joint1 = model->GetJoint("joint_12");
+  physics::JointPtr joint3 = model->GetJoint("joint_23");
+
+  physics::JointPtr gearboxJoint = model->GetJoint("joint_13");
+  ASSERT_TRUE(gearboxJoint != NULL);
+  ASSERT_TRUE(gearboxJoint->HasType(physics::Base::GEARBOX_JOINT));
+  double gearboxRatio = gearboxJoint->GetParam("gearbox_ratio", 0);
+  EXPECT_NEAR(gearboxRatio, -1.5, TOL);
+  double force3 = 1.0;
+  double force1 = force3 * gearboxRatio;
+
+  int steps = 10000;
+  for (int i = 0; i < steps; ++i)
+  {
+    joint1->SetForce(0, force1);
+    joint3->SetForce(0, force3);
+    world->Step(1);
+    if (i%1000 == 0)
+      gzdbg << "gearbox time [" << world->GetSimTime().Double()
+            << "] vel [" << joint1->GetVelocity(0)
+            << "] pose [" << joint1->GetAngle(0).Radian()
+            << "] vel [" << joint3->GetVelocity(0)
+            << "] pose [" << joint3->GetAngle(0).Radian()
+            << "]\n";
+    EXPECT_NEAR(joint1->GetVelocity(0), 0, 1e-6);
+    EXPECT_NEAR(joint3->GetVelocity(0), 0, 1e-6);
+    EXPECT_NEAR(joint1->GetAngle(0).Radian(), 0, 1e-6);
+    EXPECT_NEAR(joint3->GetAngle(0).Radian(), 0, 1e-6);
+  }
+
+  // slight imbalance
+  for (int i = 0; i < steps; ++i)
+  {
+    joint1->SetForce(0, -force3);
+    joint3->SetForce(0,  force3);
+    world->Step(1);
+    if (i%1000 == 0)
+      gzdbg << "gearbox time [" << world->GetSimTime().Double()
+            << "] vel [" << joint1->GetVelocity(0)
+            << "] pose [" << joint1->GetAngle(0).Radian()
+            << "] vel [" << joint3->GetVelocity(0)
+            << "] pose [" << joint3->GetAngle(0).Radian()
+            << "]\n";
+    EXPECT_GT(joint1->GetVelocity(0), 0);
+    EXPECT_GT(joint3->GetVelocity(0), 0);
+    EXPECT_GT(joint1->GetAngle(0).Radian(), 0);
+    EXPECT_GT(joint3->GetAngle(0).Radian(), 0);
+    EXPECT_NEAR(joint1->GetVelocity(0)*gearboxRatio, -joint3->GetVelocity(0),
+      TOL);
+    EXPECT_NEAR(joint1->GetAngle(0).Radian()*gearboxRatio,
+               -joint3->GetAngle(0).Radian(), TOL);
+  }
+}
+
+TEST_F(ODEGearboxJoint_TEST, GearboxTestODE)
+{
+  GearboxTest("ode");
+}
+
+////////////////////////////////////////////////////////////////////////
+// SetGearboxRatio:
+// start gearbox.world, set a new gear ratio,
+// apply balancing forces across geared members, and check for equilibrium.
+////////////////////////////////////////////////////////////////////////
+void ODEGearboxJoint_TEST::SetGearboxRatio(const std::string &_physicsEngine)
+{
+  // load gearbox world
+  Load("worlds/gearbox.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::ModelPtr model = world->GetModel("model_1");
+  physics::JointPtr joint1 = model->GetJoint("joint_12");
+  physics::JointPtr joint3 = model->GetJoint("joint_23");
+
+  physics::JointPtr gearboxJoint = model->GetJoint("joint_13");
+  ASSERT_TRUE(gearboxJoint != NULL);
+  ASSERT_TRUE(gearboxJoint->HasType(physics::Base::GEARBOX_JOINT));
+  double gearboxRatio = -2.5;
+  gearboxJoint->SetParam("gearbox_ratio", 0, gearboxRatio);
+  EXPECT_NEAR(gearboxRatio,
+    gearboxJoint->GetParam("gearbox_ratio", 0), TOL);
+  double force3 = 1.0;
+  double force1 = force3 * gearboxRatio;
+
+  int steps = 10000;
+  for (int i = 0; i < steps; ++i)
+  {
+    joint1->SetForce(0, force1);
+    joint3->SetForce(0, force3);
+    world->Step(1);
+    if (i%1000 == 0)
+      gzdbg << "gearbox time [" << world->GetSimTime().Double()
+            << "] vel [" << joint1->GetVelocity(0)
+            << "] pose [" << joint1->GetAngle(0).Radian()
+            << "] vel [" << joint3->GetVelocity(0)
+            << "] pose [" << joint3->GetAngle(0).Radian()
+            << "]\n";
+    EXPECT_NEAR(joint1->GetVelocity(0), 0, 1e-6);
+    EXPECT_NEAR(joint3->GetVelocity(0), 0, 1e-6);
+    EXPECT_NEAR(joint1->GetAngle(0).Radian(), 0, 1e-6);
+    EXPECT_NEAR(joint3->GetAngle(0).Radian(), 0, 1e-6);
+  }
+
+  // slight imbalance
+  for (int i = 0; i < steps; ++i)
+  {
+    joint1->SetForce(0, -force3);
+    joint3->SetForce(0,  force3);
+    world->Step(1);
+    if (i%1000 == 0)
+      gzdbg << "gearbox time [" << world->GetSimTime().Double()
+            << "] vel [" << joint1->GetVelocity(0)
+            << "] pose [" << joint1->GetAngle(0).Radian()
+            << "] vel [" << joint3->GetVelocity(0)
+            << "] pose [" << joint3->GetAngle(0).Radian()
+            << "]\n";
+    EXPECT_GT(joint1->GetVelocity(0), 0);
+    EXPECT_GT(joint3->GetVelocity(0), 0);
+    EXPECT_GT(joint1->GetAngle(0).Radian(), 0);
+    EXPECT_GT(joint3->GetAngle(0).Radian(), 0);
+    EXPECT_NEAR(joint1->GetVelocity(0)*gearboxRatio, -joint3->GetVelocity(0),
+      TOL);
+    EXPECT_NEAR(joint1->GetAngle(0).Radian()*gearboxRatio,
+               -joint3->GetAngle(0).Radian(), TOL);
+  }
+}
+
+TEST_F(ODEGearboxJoint_TEST, SetGearboxRatioODE)
+{
+  SetGearboxRatio("ode");
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/joint_revolute.cc b/test/integration/joint_revolute.cc
new file mode 100644
index 0000000..ae15172
--- /dev/null
+++ b/test/integration/joint_revolute.cc
@@ -0,0 +1,753 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "SimplePendulumIntegrator.hh"
+#include "helper_physics_generator.hh"
+#include "test/integration/joint_test.hh"
+
+using namespace gazebo;
+const double g_tolerance = 1e-2;
+
+class JointTestRevolute : public JointTest
+{
+  /// \brief Spawn single pendulum and test GetWorldEnergy functions.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void PendulumEnergy(const std::string &_physicsEngine);
+
+  /// \brief Spin joints several rotations and verify that the angles
+  /// wrap properly.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void WrapAngle(const std::string &_physicsEngine);
+
+  /// \brief Load 8 double pendulums arranged in a circle.
+  /// Measure angular velocity of links, and verify proper axis orientation.
+  /// Then set joint limits and verify that links remain within limits.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void RevoluteJoint(const std::string &_physicsEngine);
+
+  /// \brief Load a simple pendulum, simulate and compare to numerical
+  /// results from SimplePendulumIntegrator.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void SimplePendulum(const std::string &_physicsEngine);
+};
+
+////////////////////////////////////////////////////////////
+void JointTestRevolute::PendulumEnergy(const std::string &_physicsEngine)
+{
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  {
+    SpawnJointOptions opt;
+    opt.type = "revolute";
+    opt.worldParent = true;
+    double Am = M_PI / 4;
+    opt.modelPose.rot.SetFromEuler(0, 0, Am);
+    opt.childLinkPose.pos.z = 3.0;
+    opt.jointPose.pos.y = 1.5;
+    opt.axis.Set(1, 0, 0);
+
+    gzdbg << "SpawnJoint " << opt.type << " child world" << std::endl;
+    physics::JointPtr joint = SpawnJoint(opt);
+    ASSERT_TRUE(joint != NULL);
+
+    // Get initial energy
+    physics::LinkPtr link = joint->GetChild();
+    ASSERT_TRUE(link);
+    physics::ModelPtr model = link->GetModel();
+    ASSERT_TRUE(model);
+
+    double energy0 = model->GetWorldEnergy();
+    EXPECT_NEAR(model->GetWorldEnergyKinetic(), 0.0, g_tolerance);
+
+    unsigned int stepSize = 5;
+    unsigned int stepCount = 500;
+    for (unsigned int i = 0; i < stepCount; ++i)
+    {
+      world->Step(stepSize);
+      double energy = model->GetWorldEnergy();
+      EXPECT_NEAR(energy / energy0, 1.0, g_tolerance);
+    }
+  }
+}
+
+////////////////////////////////////////////////////////////
+void JointTestRevolute::WrapAngle(const std::string &_physicsEngine)
+{
+  /// \TODO: bullet hinge angles are wrapped (#1074)
+  if (_physicsEngine == "bullet")
+  {
+    gzerr << "Aborting test for bullet, see issues #1074.\n";
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  bool isOde = physics->GetType().compare("ode") == 0;
+
+  // disable gravity
+  physics->SetGravity(math::Vector3::Zero);
+
+  {
+    std::string jointType = "revolute";
+    gzdbg << "SpawnJoint " << jointType << " child world" << std::endl;
+    physics::JointPtr joint = SpawnJoint(jointType, false, true);
+    ASSERT_TRUE(joint != NULL);
+
+    // set velocity to 2 pi rad/s and step forward 1.5 seconds.
+    double vel = 2*M_PI;
+    unsigned int stepSize = 50;
+    unsigned int stepCount = 30;
+    joint->SetVelocity(0, vel);
+    if (isOde)
+      joint->SetMaxForce(0, 1e4);
+
+    // expect that joint velocity is constant
+    // and that joint angle is unwrapped
+    for (unsigned int i = 0; i < stepCount; ++i)
+    {
+      world->Step(stepSize);
+      EXPECT_NEAR(joint->GetVelocity(0), vel, g_tolerance);
+      double time = world->GetSimTime().Double();
+      EXPECT_NEAR(joint->GetAngle(0).Radian(), time*vel, g_tolerance);
+    }
+  }
+}
+
+
+////////////////////////////////////////////////////////////////////////
+void JointTestRevolute::RevoluteJoint(const std::string &_physicsEngine)
+{
+  math::Rand::SetSeed(0);
+  // Load world
+  Load("worlds/revolute_joint_test.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // Model names
+  std::vector<std::string> modelNames;
+  modelNames.push_back("pendulum_0deg");
+  modelNames.push_back("pendulum_45deg");
+  modelNames.push_back("pendulum_90deg");
+  modelNames.push_back("pendulum_135deg");
+  modelNames.push_back("pendulum_180deg");
+  modelNames.push_back("pendulum_225deg");
+  modelNames.push_back("pendulum_270deg");
+  modelNames.push_back("pendulum_315deg");
+
+  // Global axis
+  double sqrt1_2 = sqrt(2.0) / 2.0;
+  std::vector<math::Vector3> globalAxes;
+  globalAxes.push_back(math::Vector3(1, 0, 0));
+  globalAxes.push_back(math::Vector3(sqrt1_2, sqrt1_2, 0));
+  globalAxes.push_back(math::Vector3(0, 1, 0));
+  globalAxes.push_back(math::Vector3(-sqrt1_2, sqrt1_2, 0));
+  globalAxes.push_back(math::Vector3(-1, 0, 0));
+  globalAxes.push_back(math::Vector3(-sqrt1_2, -sqrt1_2, 0));
+  globalAxes.push_back(math::Vector3(0, -1, 0));
+  globalAxes.push_back(math::Vector3(sqrt1_2, -sqrt1_2, 0));
+
+  // Link names
+  std::vector<std::string> linkNames;
+  linkNames.push_back("lower_link");
+  linkNames.push_back("upper_link");
+
+  // Joint names
+  std::vector<std::string> jointNames;
+  jointNames.push_back("lower_joint");
+  jointNames.push_back("upper_joint");
+
+  physics::ModelPtr model;
+  physics::LinkPtr link;
+  std::vector<std::string>::iterator modelIter;
+  physics::JointPtr joint;
+
+  double energy0 = 1.0;
+  // Check global axes before simulation starts
+  std::vector<math::Vector3>::iterator axisIter;
+  axisIter = globalAxes.begin();
+  for (modelIter  = modelNames.begin();
+       modelIter != modelNames.end(); ++modelIter)
+  {
+    model = world->GetModel(*modelIter);
+    if (model)
+    {
+      energy0 = model->GetWorldEnergy();
+      gzdbg << "Check global axes of model " << *modelIter << '\n';
+      std::vector<std::string>::iterator jointIter;
+      for (jointIter  = jointNames.begin();
+           jointIter != jointNames.end(); ++jointIter)
+      {
+        joint = model->GetJoint(*jointIter);
+        if (joint)
+        {
+          math::Vector3 axis = joint->GetGlobalAxis(0);
+          EXPECT_NEAR(axis.x, (*axisIter).x, g_tolerance);
+          EXPECT_NEAR(axis.y, (*axisIter).y, g_tolerance);
+          EXPECT_NEAR(axis.z, (*axisIter).z, g_tolerance);
+        }
+        else
+        {
+          gzerr << "Error loading joint " << *jointIter
+                << " of model " << *modelIter << '\n';
+          EXPECT_TRUE(joint != NULL);
+        }
+      }
+    }
+    else
+    {
+      gzerr << "Error loading model " << *modelIter << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+    ++axisIter;
+  }
+
+  // Step forward 0.75 seconds
+  double dt = physics->GetMaxStepSize();
+  ASSERT_GT(dt, 0);
+  int steps = ceil(0.75 / dt);
+  world->Step(steps);
+
+  // Get global angular velocity of each link
+  math::Vector3 angVel;
+  for (modelIter  = modelNames.begin();
+       modelIter != modelNames.end(); ++modelIter)
+  {
+    model = world->GetModel(*modelIter);
+    if (model)
+    {
+      EXPECT_NEAR(model->GetWorldEnergy() / energy0, 1.0, g_tolerance);
+      gzdbg << "Check angular velocity of model " << *modelIter << '\n';
+      link = model->GetLink("base");
+      if (link)
+      {
+        // Expect stationary base
+        angVel = link->GetWorldAngularVel();
+        EXPECT_NEAR(angVel.x, 0, g_tolerance*10);
+        EXPECT_NEAR(angVel.y, 0, g_tolerance*10);
+        EXPECT_NEAR(angVel.z, 0, g_tolerance*10);
+      }
+      else
+      {
+        gzerr << "Error loading base link of model " << *modelIter << '\n';
+        EXPECT_TRUE(link != NULL);
+      }
+
+      std::vector<std::string>::iterator linkIter;
+      for (linkIter  = linkNames.begin();
+           linkIter != linkNames.end(); ++linkIter)
+      {
+        link = model->GetLink(*linkIter);
+        if (link)
+        {
+          // Expect relative angular velocity of pendulum links to be negative
+          // and along x axis.
+          angVel = link->GetRelativeAngularVel().Normalize();
+          EXPECT_NEAR(angVel.x, -1, g_tolerance);
+          EXPECT_NEAR(angVel.y,  0, 2*g_tolerance);
+          EXPECT_NEAR(angVel.z,  0, 2*g_tolerance);
+        }
+        else
+        {
+          gzerr << "Error loading link " << *linkIter
+                << " of model " << *modelIter << '\n';
+          EXPECT_TRUE(link != NULL);
+        }
+      }
+    }
+    else
+    {
+      gzerr << "Error loading model " << *modelIter << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+
+  // Keep stepping forward, verifying that joint angles move in the direction
+  // implied by the joint velocity
+  for (modelIter  = modelNames.begin();
+       modelIter != modelNames.end(); ++modelIter)
+  {
+    model = world->GetModel(*modelIter);
+    if (model)
+    {
+      EXPECT_NEAR(model->GetWorldEnergy() / energy0, 1.0, g_tolerance);
+      double jointVel1, jointVel2;
+      double angle1, angle2, angle3;
+
+      gzdbg << "Check angle measurement for " << *modelIter << '\n';
+      std::vector<std::string>::iterator jointIter;
+      for (jointIter  = jointNames.begin();
+           jointIter != jointNames.end(); ++jointIter)
+      {
+        joint = model->GetJoint(*jointIter);
+        if (joint)
+        {
+          // Get first joint angle
+          angle1 = joint->GetAngle(0).Radian();
+
+          // Get joint velocity and assume it is not too small
+          jointVel1 = joint->GetVelocity(0);
+          EXPECT_GT(fabs(jointVel1), 1e-1);
+
+          // Take 1 step and measure again
+          world->Step(1);
+
+          // Expect angle change in direction of joint velocity
+          angle2 = joint->GetAngle(0).Radian();
+          EXPECT_GT((angle2 - angle1) * math::clamp(jointVel1*1e4, -1.0, 1.0)
+                    , 0);
+
+          jointVel2 = joint->GetVelocity(0);
+          EXPECT_GT(fabs(jointVel2), 1e-1);
+
+          // Take 1 step and measure the last angle, expect decrease
+          world->Step(1);
+          angle3 = joint->GetAngle(0).Radian();
+          EXPECT_GT((angle3 - angle2) * math::clamp(jointVel2*1e4, -1.0, 1.0)
+                    , 0);
+        }
+        else
+        {
+          gzerr << "Error loading joint " << *jointIter
+                << " of model " << *modelIter << '\n';
+          EXPECT_TRUE(joint != NULL);
+        }
+      }
+    }
+    else
+    {
+      gzerr << "Error loading model " << *modelIter << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+
+
+  // Reset the world, and impose joint limits
+  world->Reset();
+
+  for (modelIter  = modelNames.begin();
+       modelIter != modelNames.end(); ++modelIter)
+  {
+    model = world->GetModel(*modelIter);
+    if (model)
+    {
+      std::vector<std::string>::iterator jointIter;
+      for (jointIter  = jointNames.begin();
+           jointIter != jointNames.end(); ++jointIter)
+      {
+        joint = model->GetJoint(*jointIter);
+        if (joint)
+        {
+          joint->SetLowStop(0, math::Angle(-0.1));
+          joint->SetHighStop(0, math::Angle(0.1));
+        }
+        else
+        {
+          gzerr << "Error loading joint " << *jointIter
+                << " of model " << *modelIter << '\n';
+          EXPECT_TRUE(joint != NULL);
+        }
+      }
+    }
+    else
+    {
+      gzerr << "Error loading model " << *modelIter << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+
+  // Step forward again for 0.75 seconds and check that joint angles
+  // are within limits
+  world->Step(steps);
+  for (modelIter  = modelNames.begin();
+       modelIter != modelNames.end(); ++modelIter)
+  {
+    model = world->GetModel(*modelIter);
+    if (model)
+    {
+      gzdbg << "Check angle limits and velocity of joints of model "
+            << *modelIter << '\n';
+      std::vector<std::string>::iterator jointIter;
+      for (jointIter  = jointNames.begin();
+           jointIter != jointNames.end(); ++jointIter)
+      {
+        joint = model->GetJoint(*jointIter);
+        if (joint)
+        {
+          EXPECT_NEAR(joint->GetAngle(0).Radian(), 0, 0.11);
+        }
+        else
+        {
+          gzerr << "Error loading joint " << *jointIter
+                << " of model " << *modelIter << '\n';
+          EXPECT_TRUE(joint != NULL);
+        }
+      }
+    }
+    else
+    {
+      gzerr << "Error loading model " << *modelIter << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+
+  // Reset world again, disable gravity, detach upper_joint
+  // Then apply torque at lower_joint and verify motion
+  world->Reset();
+  for (modelIter  = modelNames.begin();
+       modelIter != modelNames.end(); ++modelIter)
+  {
+    model = world->GetModel(*modelIter);
+    if (model)
+    {
+      gzdbg << "Check SetForce for model " << *modelIter << '\n';
+      std::vector<std::string>::iterator linkIter;
+      for (linkIter  = linkNames.begin();
+           linkIter != linkNames.end(); ++linkIter)
+      {
+        link = model->GetLink(*linkIter);
+        if (link)
+        {
+          // Disable gravity for links.
+          link->SetGravityMode(false);
+        }
+        else
+        {
+          gzerr << "Error loading link " << *linkIter
+                << " of model " << *modelIter << '\n';
+          EXPECT_TRUE(link != NULL);
+        }
+      }
+
+      joint = model->GetJoint("upper_joint");
+      if (joint)
+      {
+        if (_physicsEngine == "simbody" ||
+            _physicsEngine == "dart")
+        {
+          gzerr << "Skipping joint detachment per #862 / #903" << std::endl;
+          continue;
+        }
+        // Detach upper_joint.
+        joint->Detach();
+        // Simbody and DART will not easily detach joints,
+        // consider freezing joint limit instead
+        // math::Angle curAngle = joint->GetAngle(0u);
+        // joint->SetLowStop(0, curAngle);
+        // joint->SetHighStop(0, curAngle);
+      }
+      else
+      {
+        gzerr << "Error loading upper_joint "
+              << " of model " << *modelIter << '\n';
+        EXPECT_TRUE(joint != NULL);
+      }
+
+      // Step forward and let things settle a bit.
+      world->Step(100);
+
+      joint = model->GetJoint("lower_joint");
+      if (joint)
+      {
+        double oldVel, newVel, force;
+        oldVel = joint->GetVelocity(0);
+        // Apply positive torque to the lower_joint and step forward.
+        force = 1;
+
+        for (int i = 0; i < 10; ++i)
+        {
+          joint->SetForce(0, force);
+          world->Step(1);
+          joint->SetForce(0, force);
+          world->Step(1);
+          joint->SetForce(0, force);
+          world->Step(1);
+          newVel = joint->GetVelocity(0);
+
+          // gzdbg << "model " << *modelIter
+          //       << "  i " << i
+          //       << "  oldVel " << oldVel
+          //       << "  newVel " << newVel
+          //       << "  upper joint v "
+          //       << model->GetJoint("upper_joint")->GetVelocity(0)
+          //       << " joint " << joint->GetName() <<  "\n";
+
+          // Expect increasing velocities
+          EXPECT_GT(newVel, oldVel);
+          oldVel = newVel;
+
+          // Check that GetForce returns what we set
+          EXPECT_NEAR(joint->GetForce(0u), force, g_tolerance);
+
+          // Expect joint velocity to be near angular velocity difference
+          // of child and parent, along global axis
+          // jointVel == DOT(angVelChild - angVelParent, axis)
+          double jointVel = joint->GetVelocity(0);
+          math::Vector3 axis = joint->GetGlobalAxis(0);
+          angVel  = joint->GetChild()->GetWorldAngularVel();
+          angVel -= joint->GetParent()->GetWorldAngularVel();
+          EXPECT_NEAR(jointVel, axis.Dot(angVel), g_tolerance);
+        }
+        // Apply negative torque to lower_joint
+        force = -3;
+        for (int i = 0; i < 10; ++i)
+        {
+          joint->SetForce(0, force);
+          world->Step(1);
+          joint->SetForce(0, force);
+          world->Step(1);
+          joint->SetForce(0, force);
+          world->Step(1);
+          newVel = joint->GetVelocity(0);
+
+          // gzdbg << "model " << *modelIter
+          //       << "  i " << i
+          //       << "  oldVel " << oldVel
+          //       << "  newVel " << newVel
+          //       << "  upper joint v "
+          //       << model->GetJoint("upper_joint")->GetVelocity(0)
+          //       << " joint " << joint->GetName() <<  "\n";
+
+          // Expect decreasing velocities
+          EXPECT_LT(newVel, oldVel);
+
+          // Check that GetForce returns what we set
+          EXPECT_NEAR(joint->GetForce(0u), force, g_tolerance);
+
+          // Expect joint velocity to be near angular velocity difference
+          // of child and parent, along global axis
+          // jointVel == DOT(angVelChild - angVelParent, axis)
+          double jointVel = joint->GetVelocity(0);
+          math::Vector3 axis = joint->GetGlobalAxis(0);
+          angVel  = joint->GetChild()->GetWorldAngularVel();
+          angVel -= joint->GetParent()->GetWorldAngularVel();
+          EXPECT_NEAR(jointVel, axis.Dot(angVel), g_tolerance);
+        }
+      }
+      else
+      {
+        gzerr << "Error loading lower_joint "
+              << " of model " << *modelIter << '\n';
+        EXPECT_TRUE(joint != NULL);
+      }
+    }
+    else
+    {
+      gzerr << "Error loading model " << *modelIter << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+}
+
+////////////////////////////////////////////////////////////////////////
+void JointTestRevolute::SimplePendulum(const std::string &_physicsEngine)
+{
+  Load("worlds/simple_pendulums.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  int i = 0;
+  while (!this->HasEntity("model_1") && i < 20)
+  {
+    common::Time::MSleep(100);
+    ++i;
+  }
+
+  if (i > 20)
+    gzthrow("Unable to get model_1");
+
+  physics::PhysicsEnginePtr physicsEngine = world->GetPhysicsEngine();
+  EXPECT_TRUE(physicsEngine);
+  physics::ModelPtr model = world->GetModel("model_1");
+  EXPECT_TRUE(model);
+  physics::LinkPtr link = model->GetLink("link_2");  // sphere link at end
+  EXPECT_TRUE(link);
+
+  double g = 9.81;
+  double l = 10.0;
+  double m = 10.0;
+
+  double e_start;
+
+  {
+    // check velocity / energy
+    math::Vector3 vel = link->GetWorldLinearVel();
+    math::Pose pos = link->GetWorldPose();
+    double pe = g * m * pos.pos.z;
+    double ke = 0.5 * m * (vel.x*vel.x + vel.y*vel.y + vel.z*vel.z);
+    e_start = pe + ke;
+    // gzdbg << "total energy [" << e_start
+    //       << "] pe[" << pe
+    //       << "] ke[" << ke
+    //       << "] p[" << pos.pos.z
+    //       << "] v[" << vel
+    //       << "]\n";
+  }
+  physicsEngine->SetMaxStepSize(0.0001);
+  physicsEngine->SetParam("iters", 1000);
+
+  {
+    // test with global contact_max_correcting_vel at 0 as set by world file
+    //   here we expect significant energy loss as the velocity correction
+    //   is set to 0
+    int steps = 10;  // @todo: make this more general
+    for (int i = 0; i < steps; i ++)
+    {
+      world->Step(2000);
+      {
+        // check velocity / energy
+        math::Vector3 vel = link->GetWorldLinearVel();
+        math::Pose pos = link->GetWorldPose();
+        double pe = g * m * pos.pos.z;
+        double ke = 0.5 * m * (vel.x*vel.x + vel.y*vel.y + vel.z*vel.z);
+        double e = pe + ke;
+        double e_tol = 3.0*static_cast<double>(i+1)
+          / static_cast<double>(steps);
+        // gzdbg << "total energy [" << e
+        //       << "] pe[" << pe
+        //       << "] ke[" << ke
+        //       << "] p[" << pos.pos.z
+        //       << "] v[" << vel
+        //       << "] error[" << e - e_start
+        //       << "] tol[" << e_tol
+        //       << "]\n";
+
+        EXPECT_LT(fabs(e - e_start), e_tol);
+      }
+
+      physics::JointPtr joint = model->GetJoint("joint_0");
+      if (joint)
+      {
+        double integ_theta = (
+          PendulumAngle(g, l, 1.57079633, 0.0, world->GetSimTime().Double(),
+          0.000001) - 1.5707963);
+        double actual_theta = joint->GetAngle(0).Radian();
+        // gzdbg << "time [" << world->GetSimTime().Double()
+        //       << "] exact [" << integ_theta
+        //       << "] actual [" << actual_theta
+        //       << "] pose [" << model->GetWorldPose()
+        //       << "]\n";
+         EXPECT_LT(fabs(integ_theta - actual_theta) , 0.01);
+      }
+    }
+  }
+
+
+
+  {
+    // test with global contact_max_correcting_vel at 100
+    // here we expect much lower energy loss
+    world->Reset();
+    physicsEngine->SetContactMaxCorrectingVel(100);
+
+    int steps = 10;  // @todo: make this more general
+    for (int i = 0; i < steps; i ++)
+    {
+      world->Step(2000);
+      {
+        // check velocity / energy
+        math::Vector3 vel = link->GetWorldLinearVel();
+        math::Pose pos = link->GetWorldPose();
+        double pe = g * m * pos.pos.z;
+        double ke = 0.5 * m * (vel.x*vel.x + vel.y*vel.y + vel.z*vel.z);
+        double e = pe + ke;
+        double e_tol = 3.0*static_cast<double>(i+1)
+          / static_cast<double>(steps);
+        // gzdbg << "total energy [" << e
+        //       << "] pe[" << pe
+        //       << "] ke[" << ke
+        //       << "] p[" << pos.pos.z
+        //       << "] v[" << vel
+        //       << "] error[" << e - e_start
+        //       << "] tol[" << e_tol
+        //       << "]\n";
+
+        EXPECT_LT(fabs(e - e_start), e_tol);
+      }
+
+      physics::JointPtr joint = model->GetJoint("joint_0");
+      if (joint)
+      {
+        double integ_theta = (
+          PendulumAngle(g, l, 1.57079633, 0.0, world->GetSimTime().Double(),
+          0.000001) - 1.5707963);
+        double actual_theta = joint->GetAngle(0).Radian();
+        // gzdbg << "time [" << world->GetSimTime().Double()
+        //       << "] exact [" << integ_theta
+        //       << "] actual [" << actual_theta
+        //       << "] pose [" << model->GetWorldPose()
+        //       << "]\n";
+         EXPECT_LT(fabs(integ_theta - actual_theta) , 0.01);
+      }
+    }
+  }
+}
+
+TEST_P(JointTestRevolute, PendulumEnergy)
+{
+  PendulumEnergy(this->physicsEngine);
+}
+
+TEST_P(JointTestRevolute, RevoluteJoint)
+{
+  RevoluteJoint(this->physicsEngine);
+}
+
+TEST_P(JointTestRevolute, SimplePendulum)
+{
+  SimplePendulum(this->physicsEngine);
+}
+
+TEST_P(JointTestRevolute, WrapAngle)
+{
+  WrapAngle(this->physicsEngine);
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, JointTestRevolute,
+  ::testing::Combine(PHYSICS_ENGINE_VALUES,
+  ::testing::Values("revolute")));
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/joint_screw.cc b/test/integration/joint_screw.cc
new file mode 100644
index 0000000..496e25e
--- /dev/null
+++ b/test/integration/joint_screw.cc
@@ -0,0 +1,393 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/physics/physics.hh"
+// #include "gazebo/physics/Joint.hh"
+// #include "gazebo/physics/ScrewJoint.hh"
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+
+class JointTestScrew : public ServerFixture,
+                       public testing::WithParamInterface<const char*>
+{
+  /// \brief Test screw joint implementation with SetWorldPose.
+  /// Set link poses in world frame, check joint angles and joint axis.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void ScrewJointSetWorldPose(const std::string &_physicsEngine);
+
+  /// \brief Test screw joint implementation with forces.
+  /// Apply force to screw joint links, check velocity.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void ScrewJointForce(const std::string &_physicsEngine);
+};
+
+//////////////////////////////////////////////////
+void JointTestScrew::ScrewJointSetWorldPose(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "DART Screw Joint will not work with Link::SetWorldPose."
+          << " See issue #1096.\n";
+    return;
+  }
+
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Simbody Screw Joint will not work with Link::SetWorldPose."
+          << " See issue #857.\n";
+    return;
+  }
+
+  // Load our screw joint test world
+  Load("worlds/screw_joint_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics->SetGravity(math::Vector3(0, 0, 0));
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+
+  // get time step size
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  gzlog << "dt : " << dt << "\n";
+
+  // verify that time moves forward
+  EXPECT_DOUBLE_EQ(t, dt);
+  gzlog << "t after one step : " << t << "\n";
+
+  // get model, joints and get links
+  physics::ModelPtr model_1 = world->GetModel("model_1");
+  physics::LinkPtr link_00 = model_1->GetLink("link_00");
+  physics::LinkPtr link_01 = model_1->GetLink("link_01");
+  physics::JointPtr joint_00 = model_1->GetJoint("joint_00");
+  physics::JointPtr joint_01 = model_1->GetJoint("joint_01");
+
+  // both initial angles should be zero
+  EXPECT_EQ(joint_00->GetAngle(0), 0);
+  EXPECT_EQ(joint_00->GetAngle(1), 0);
+
+  // move child link to it's initial location
+  link_00->SetWorldPose(math::Pose(0, 0, 2, 0, 0, 0));
+  EXPECT_EQ(joint_00->GetAngle(0), 0);
+  EXPECT_EQ(joint_00->GetAngle(1), 0);
+  EXPECT_EQ(joint_00->GetGlobalAxis(0), math::Vector3(1, 0, 0));
+  EXPECT_EQ(joint_00->GetGlobalAxis(1), math::Vector3(1, 0, 0));
+  gzdbg << "joint angles [" << joint_00->GetAngle(0)
+        << ", " << joint_00->GetAngle(1)
+        << "] axis1 [" << joint_00->GetGlobalAxis(0)
+        << "] axis2 [" << joint_00->GetGlobalAxis(1)
+        << "]\n";
+
+  // move child link 45deg about x
+  double pitch_00 = joint_00->GetParam("thread_pitch", 0);
+  math::Pose pose_00 = math::Pose(-0.25*M_PI/pitch_00, 0, 2, 0.25*M_PI, 0, 0);
+  math::Pose pose_01 = math::Pose(0, 0, -1, 0, 0, 0) + pose_00;
+  link_00->SetWorldPose(pose_00);
+  link_01->SetWorldPose(pose_01);
+  EXPECT_EQ(joint_00->GetAngle(0), 0.25*M_PI);
+  EXPECT_EQ(joint_00->GetAngle(1), -0.25*M_PI/pitch_00);
+  EXPECT_EQ(joint_00->GetGlobalAxis(0), math::Vector3(1, 0, 0));
+  EXPECT_EQ(joint_00->GetGlobalAxis(1), math::Vector3(1, 0, 0));
+  gzdbg << "joint angles [" << joint_00->GetAngle(0)
+        << ", " << joint_00->GetAngle(1)
+        << "] axis1 [" << joint_00->GetGlobalAxis(0)
+        << "] axis2 [" << joint_00->GetGlobalAxis(1)
+        << "] pitch_00 [" << pitch_00
+        << "]\n";
+
+  // move child link 45deg about y
+  double pitch_01 = joint_01->GetParam("thread_pitch", 0);
+  link_00->SetWorldPose(math::Pose(0, 0, 2, 0, 0.25*M_PI, 0));
+  pose_00 = math::Pose(-0.25*M_PI/pitch_00, 0, 2, 0.25*M_PI, 0, 0);
+  pose_01 = math::Pose(-0.3*M_PI/pitch_01, 0, -1, 0.3*M_PI, 0, 0) + pose_00;
+  link_00->SetWorldPose(pose_00);
+  link_01->SetWorldPose(pose_01);
+  EXPECT_EQ(joint_00->GetAngle(0), 0.25*M_PI);
+  EXPECT_EQ(joint_00->GetAngle(1), -0.25*M_PI/pitch_00);
+  EXPECT_EQ(joint_01->GetAngle(0), 0.3*M_PI);
+  EXPECT_EQ(joint_01->GetAngle(1), -0.3*M_PI/pitch_01);
+  EXPECT_EQ(joint_00->GetGlobalAxis(0), math::Vector3(1, 0, 0));
+  EXPECT_EQ(joint_00->GetGlobalAxis(1), math::Vector3(1, 0, 0));
+  gzdbg << "joint angles [" << joint_00->GetAngle(0)
+        << ", " << joint_00->GetAngle(1)
+        << "] axis1 [" << joint_00->GetGlobalAxis(0)
+        << "] axis2 [" << joint_00->GetGlobalAxis(1)
+        << "] pitch_00 [" << pitch_00
+        << "] pitch_01 [" << pitch_01
+        << "]\n";
+
+  // new poses should not violate the constraint.  take a few steps
+  // and make sure nothing moves.
+  world->Step(10);
+
+  // move child link 90deg about both x and "rotated y axis" (z)
+  EXPECT_EQ(joint_00->GetAngle(0), 0.25*M_PI);
+  EXPECT_EQ(joint_00->GetAngle(1), -0.25*M_PI/pitch_00);
+  EXPECT_EQ(joint_01->GetAngle(0), 0.3*M_PI);
+  EXPECT_EQ(joint_01->GetAngle(1), -0.3*M_PI/pitch_01);
+  EXPECT_EQ(joint_00->GetGlobalAxis(0), math::Vector3(1, 0, 0));
+  EXPECT_EQ(joint_00->GetGlobalAxis(1), math::Vector3(1, 0, 0));
+  gzdbg << "joint angles [" << joint_00->GetAngle(0)
+        << ", " << joint_00->GetAngle(1)
+        << "] axis1 [" << joint_00->GetGlobalAxis(0)
+        << "] axis2 [" << joint_00->GetGlobalAxis(1)
+        << "] pitch_00 [" << pitch_00
+        << "] pitch_01 [" << pitch_01
+        << "]\n";
+}
+
+TEST_P(JointTestScrew, ScrewJointSetWorldPose)
+{
+  ScrewJointSetWorldPose(GetParam());
+}
+
+//////////////////////////////////////////////////
+void JointTestScrew::ScrewJointForce(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "bullet")
+  {
+    /// \TODO skipping bullet, see issue #1081
+    gzerr << "BulletScrewJoint::GetAngle() is one step behind (issue #1081).\n";
+    return;
+  }
+
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "DART Screw Joint not yet implemented.\n";
+    return;
+  }
+
+  // Load our screw joint test world
+  Load("worlds/screw_joint_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics->SetGravity(math::Vector3(0, 0, 0));
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+
+  // get time step size
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  gzlog << "dt : " << dt << "\n";
+
+  // verify that time moves forward
+  EXPECT_DOUBLE_EQ(t, dt);
+  gzlog << "t after one step : " << t << "\n";
+
+  // get model, joints and get links
+  physics::ModelPtr model_1 = world->GetModel("model_1");
+  physics::LinkPtr link_00 = model_1->GetLink("link_00");
+  physics::LinkPtr link_01 = model_1->GetLink("link_01");
+  physics::JointPtr joint_00 = model_1->GetJoint("joint_00");
+  physics::JointPtr joint_01 = model_1->GetJoint("joint_01");
+  double pitch_00 = joint_00->GetParam("thread_pitch", 0);
+  double pitch_01 = joint_01->GetParam("thread_pitch", 0);
+
+  // both initial angles should be zero
+  EXPECT_EQ(joint_00->GetAngle(0), 0);
+  EXPECT_EQ(joint_00->GetAngle(1), 0);
+
+  // set new upper limit for joint_00
+  joint_00->SetHighStop(0, 0.3);
+  bool once = false;
+  int count = 0;
+  int maxCount = 5000;
+  // push joint_00 till it hits new upper limit
+  while (count < maxCount && joint_00->GetAngle(0) < 0.3)
+  {
+    joint_00->SetForce(0, 0.1);
+    world->Step(1);
+    ++count;
+    // check link pose
+    double angle_00_angular = joint_00->GetAngle(0).Radian();
+    double angle_00_linear = joint_00->GetAngle(1).Radian();
+    double angle_01_linear = joint_01->GetAngle(1).Radian();
+    math::Pose pose_01 = link_01->GetWorldPose();
+    EXPECT_EQ(link_00->GetWorldPose(),
+      math::Pose(-angle_00_angular / pitch_00, 0, 2, angle_00_angular, 0, 0));
+
+    if (_physicsEngine == "simbody")
+    {
+      if (!once)
+      {
+        once = true;
+        gzerr << "skip test: issue #857 in simbody screw joint linear angle:"
+              << " joint_00 " << angle_00_linear
+              << " shoudl be 0.3\n";
+      }
+    }
+    else
+    {
+      EXPECT_NEAR(pose_01.pos.x, angle_00_linear + angle_01_linear, 1e-8);
+    }
+  }
+  gzdbg << "took [" << count << "] steps.\n";
+
+  // continue pushing for 1000 steps to make sure there is no overshoot
+  double maxOvershootRadians = 0.01;
+  for (unsigned int i = 0; i < 1000; ++i)
+  {
+    joint_00->SetForce(0, 0.1);
+    world->Step(1);
+    EXPECT_LT(joint_00->GetAngle(0), 0.3 + maxOvershootRadians);
+  }
+
+
+  // lock joint at this location by setting lower limit here too
+  joint_00->SetLowStop(0, 0.3);
+
+  // set joint_01 upper limit to 1.0
+  joint_01->SetHighStop(0, 1.0);
+
+  // push joint_01 until limit is reached
+  once = false;
+  count = 0;
+  while (count < maxCount && joint_01->GetAngle(0) < 1.0)
+  {
+    joint_01->SetForce(0, 0.1);
+    world->Step(1);
+    ++count;
+
+    // check link pose
+    math::Pose pose_00 = link_00->GetWorldPose();
+    math::Pose pose_01 = link_01->GetWorldPose();
+    double angle_00_angular = joint_00->GetAngle(0).Radian();
+    double angle_00_linear = joint_00->GetAngle(1).Radian();
+    double angle_01_angular = joint_01->GetAngle(0).Radian();
+    double angle_01_linear = joint_01->GetAngle(1).Radian();
+
+    EXPECT_EQ(pose_00, math::Pose(
+      -angle_00_angular / pitch_00, 0, 2, angle_00_angular, 0, 0));
+    if (_physicsEngine == "simbody")
+    {
+      if (!once)
+      {
+        once = true;
+        gzerr << "skip test: issue #857 in simbody screw joint linear angle:"
+              << " joint_00 " << angle_00_linear
+              << " should be 0.3. "
+              << " joint_01 " << angle_01_linear
+              << " is off too.\n";
+      }
+    }
+    else
+    {
+      EXPECT_NEAR(pose_01.pos.x, angle_00_linear + angle_01_linear, 1e-8);
+    }
+    EXPECT_NEAR(pose_01.pos.x,
+      -angle_00_angular / pitch_00 - angle_01_angular / pitch_01, 1e-8);
+    EXPECT_NEAR(pose_01.rot.GetAsEuler().x,
+      angle_00_angular + angle_01_angular, 1e-8);
+  }
+  gzdbg << "took [" << count << "] steps.\n";
+
+  // continue pushing for 1000 steps to make sure there is no overshoot
+  for (unsigned int i = 0; i < 1000; ++i)
+  {
+    joint_01->SetForce(0, 0.1);
+    world->Step(1);
+    EXPECT_LT(joint_01->GetAngle(0), 1.0 + maxOvershootRadians);
+  }
+
+  // push joint_01 the other way until -1 is reached
+  once = false;
+  count = 0;
+  while (count < maxCount && joint_01->GetAngle(0) > -1.0)
+  {
+    joint_01->SetForce(0, -0.1);
+    world->Step(1);
+    ++count;
+
+    // check link pose
+    math::Pose pose_00 = link_00->GetWorldPose();
+    math::Pose pose_01 = link_01->GetWorldPose();
+    double angle_00_angular = joint_00->GetAngle(0).Radian();
+    double angle_00_linear = joint_00->GetAngle(1).Radian();
+    double angle_01_angular = joint_01->GetAngle(0).Radian();
+    double angle_01_linear = joint_01->GetAngle(1).Radian();
+
+    EXPECT_EQ(pose_00, math::Pose(
+      -angle_00_angular / pitch_00, 0, 2, angle_00_angular, 0, 0));
+    if (_physicsEngine == "simbody")
+    {
+      if (!once)
+      {
+        once = true;
+        gzerr << "skip test: issue #857 in simbody screw joint linear angle:"
+              << " joint_00 " << angle_00_linear
+              << " should be 0.3. "
+              << " joint_01 " << angle_01_linear
+              << " is off too.\n";
+      }
+    }
+    else
+    {
+      EXPECT_NEAR(pose_01.pos.x, angle_00_linear + angle_01_linear, 1e-8);
+    }
+    EXPECT_NEAR(pose_01.pos.x,
+      -angle_00_angular / pitch_00 - angle_01_angular / pitch_01, 1e-8);
+    EXPECT_NEAR(pose_01.rot.GetAsEuler().x,
+      angle_00_angular + angle_01_angular, 1e-8);
+  }
+  gzdbg << "took [" << count << "] steps.\n";
+
+  // continue pushing for 1000 steps to make sure there is no overshoot
+  joint_01->SetLowStop(0, -1.0);
+  for (unsigned int i = 0; i < 1000; ++i)
+  {
+    joint_01->SetForce(0, -0.1);
+    world->Step(1);
+    EXPECT_GT(joint_01->GetAngle(0), -1.0 - maxOvershootRadians);
+  }
+}
+
+TEST_P(JointTestScrew, ScrewJointForce)
+{
+  ScrewJointForce(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, JointTestScrew,
+  PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/joint_spawn.cc b/test/integration/joint_spawn.cc
new file mode 100644
index 0000000..07b9703
--- /dev/null
+++ b/test/integration/joint_spawn.cc
@@ -0,0 +1,477 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/physics/physics.hh"
+#include "gazebo/physics/Joint.hh"
+#include "test/integration/helper_physics_generator.hh"
+#include "test/integration/joint_test.hh"
+
+#define TOL 1e-6
+#define TOL_CONT 2.0
+
+using namespace gazebo;
+
+const double g_tolerance = 1e-4;
+
+class JointSpawningTest : public JointTest
+{
+  /// \brief Spawn model with each type of joint.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  /// \param[in] _jointType Type of joint to spawn and test.
+  public: void SpawnJointTypes(const std::string &_physicsEngine,
+                               const std::string &_jointType);
+
+  /// \brief Spawn model with rotational joints. Set velocity on parent
+  ///        and make sure child follows.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  /// \param[in] _jointType Type of joint to spawn and test.
+  public: void SpawnJointRotational(const std::string &_physicsEngine,
+                                    const std::string &_jointType);
+
+  /// \brief Spawn model with rotational joints. Attach to world and make
+  ///        sure it doesn't fall.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  /// \param[in] _jointType Type of joint to spawn and test.
+  public: void SpawnJointRotationalWorld(const std::string &_physicsEngine,
+                                         const std::string &_jointType);
+
+  /// \brief Check joint properties.
+  /// \param[in] _index Joint angle index.
+  /// \param[in] _joint Joint to check.
+  public: void CheckJointProperties(unsigned int _index,
+                                    physics::JointPtr _joint);
+};
+
+// Fixture for testing all joint types.
+class JointSpawningTest_All : public JointSpawningTest {};
+
+// Fixture for testing rotational joints.
+class JointSpawningTest_Rotational : public JointSpawningTest {};
+
+// Fixture for testing rotational joints that can be attached to world.
+class JointSpawningTest_RotationalWorld : public JointSpawningTest {};
+
+////////////////////////////////////////////////////////////////////////
+// Test for spawning each joint type
+void JointSpawningTest::SpawnJointTypes(const std::string &_physicsEngine,
+                                        const std::string &_jointType)
+{
+  /// \TODO: simbody not complete for this test
+  if (_physicsEngine == "simbody")  // &&
+  //    _jointType != "revolute" && _jointType != "prismatic")
+  {
+    gzerr << "Aborting test for Simbody, see issues #859, #861.\n";
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // disable gravity
+  physics->SetGravity(math::Vector3::Zero);
+
+  {
+    gzdbg << "SpawnJoint " << _jointType << " child parent" << std::endl;
+    physics::JointPtr joint = SpawnJoint(_jointType, false, false);
+    ASSERT_TRUE(joint != NULL);
+    // Check child and parent links
+    physics::LinkPtr child = joint->GetChild();
+    physics::LinkPtr parent = joint->GetParent();
+    ASSERT_TRUE(child != NULL);
+    EXPECT_EQ(child->GetParentJoints().size(), 1u);
+    EXPECT_EQ(child->GetChildJoints().size(), 0u);
+    ASSERT_TRUE(parent != NULL);
+    EXPECT_EQ(parent->GetChildJoints().size(), 1u);
+    EXPECT_EQ(parent->GetParentJoints().size(), 0u);
+    for (unsigned int i = 0; i < joint->GetAngleCount(); ++i)
+    {
+      CheckJointProperties(i, joint);
+    }
+  }
+
+  if (_jointType == "gearbox")
+  {
+    gzerr << "Skip connect to world tests, since we aren't specifying "
+          << "the reference body."
+          << std::endl;
+    return;
+  }
+
+  {
+    gzdbg << "SpawnJoint " << _jointType << " child world" << std::endl;
+    physics::JointPtr joint = SpawnJoint(_jointType, false, true);
+    ASSERT_TRUE(joint != NULL);
+    // Check child link
+    physics::LinkPtr child = joint->GetChild();
+    physics::LinkPtr parent = joint->GetParent();
+    ASSERT_TRUE(child != NULL);
+    EXPECT_EQ(child->GetParentJoints().size(), 1u);
+    EXPECT_EQ(child->GetChildJoints().size(), 0u);
+    EXPECT_TRUE(parent == NULL);
+    for (unsigned int i = 0; i < joint->GetAngleCount(); ++i)
+    {
+      CheckJointProperties(i, joint);
+    }
+  }
+
+  if (_physicsEngine == "dart")
+  {
+    // DART assumes that: (i) every link has its parent joint (ii) root link
+    // is the only link that doesn't have parent link.
+    // Child world link breaks dart for now. Do we need to support it?
+    gzerr << "Skip tests for child world link cases "
+          << "since DART does not allow joint with world as child. "
+          << "Please see issue #914. "
+          << "(https://bitbucket.org/osrf/gazebo/issue/914)\n";
+    return;
+  }
+
+  {
+    gzdbg << "SpawnJoint " << _jointType << " world parent" << std::endl;
+    physics::JointPtr joint = SpawnJoint(_jointType, true, false);
+    ASSERT_TRUE(joint != NULL);
+    // Check parent link
+    physics::LinkPtr child = joint->GetChild();
+    physics::LinkPtr parent = joint->GetParent();
+    EXPECT_TRUE(child == NULL);
+    ASSERT_TRUE(parent != NULL);
+    EXPECT_EQ(parent->GetChildJoints().size(), 1u);
+    EXPECT_EQ(parent->GetParentJoints().size(), 0u);
+    for (unsigned int i = 0; i < joint->GetAngleCount(); ++i)
+    {
+      CheckJointProperties(i, joint);
+    }
+  }
+}
+
+////////////////////////////////////////////////////////////////////////
+// Test for non-translational joints.
+// Set velocity to parent and make sure child follows.
+void JointSpawningTest::SpawnJointRotational(const std::string &_physicsEngine,
+                                             const std::string &_jointType)
+{
+  /// \TODO: simbody not complete for this test
+  if (_physicsEngine == "simbody" && _jointType != "revolute")
+  {
+    gzerr << "Aborting test for Simbody, see issue #859.\n";
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  gzdbg << "SpawnJoint " << _jointType << std::endl;
+  physics::JointPtr joint = SpawnJoint(_jointType);
+  ASSERT_TRUE(joint != NULL);
+
+  physics::LinkPtr parent, child;
+  child = joint->GetChild();
+  parent = joint->GetParent();
+  ASSERT_TRUE(child != NULL);
+  ASSERT_TRUE(parent != NULL);
+
+  math::Vector3 pos(10, 10, 10);
+  math::Vector3 vel(10, 10, 10);
+  parent->SetWorldPose(math::Pose(pos, math::Quaternion()));
+  for (unsigned int i = 0; i < 10; ++i)
+  {
+    parent->SetLinearVel(vel);
+    world->Step(10);
+  }
+  world->Step(50);
+  math::Pose childPose = child->GetWorldPose();
+  math::Pose parentPose = parent->GetWorldPose();
+  EXPECT_TRUE(parentPose.pos != pos);
+  EXPECT_TRUE(parentPose.pos != math::Vector3::Zero);
+  EXPECT_TRUE(childPose.pos != math::Vector3::Zero);
+  EXPECT_TRUE(childPose.pos == parentPose.pos);
+  EXPECT_EQ(joint->GetWorldPose().pos, joint->GetParentWorldPose().pos);
+  EXPECT_EQ(joint->GetAnchorErrorPose().pos, math::Vector3::Zero);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Test for non-translational joints that can attach to world.
+// Attach to world and see if it doesn't fall.
+void JointSpawningTest::SpawnJointRotationalWorld(
+  const std::string &_physicsEngine,
+  const std::string &_jointType)
+{
+  /// \TODO: simbody not complete for this test
+  if (_physicsEngine == "simbody")  // && _jointType != "revolute")
+  {
+    gzerr << "Aborting test for Simbody, see issues #859, #861.\n";
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics::JointPtr joint;
+  for (unsigned int i = 0; i < 2; ++i)
+  {
+    if (_physicsEngine == "dart" && i == 0)
+    {
+      // DART assumes that: (i) every link has its parent joint (ii) root link
+      // is the only link that doesn't have parent link.
+      // Child world link breaks dart for now. Do we need to support it?
+      gzerr << "Skip tests for child world link cases "
+            << "since DART does not allow joint with world as child. "
+            << "Please see issue #914. "
+            << "(https://bitbucket.org/osrf/gazebo/issue/914)\n";
+      return;
+    }
+    bool worldChild = (i == 0);
+    bool worldParent = (i == 1);
+    std::string child = worldChild ? "world" : "child";
+    std::string parent = worldParent ? "world" : "parent";
+    gzdbg << "SpawnJoint " << _jointType << " "
+          << child << " "
+          << parent << std::endl;
+    joint = SpawnJoint(_jointType, worldChild, worldParent);
+    EXPECT_TRUE(joint != NULL);
+
+    physics::LinkPtr link;
+    if (!worldChild)
+      link = joint->GetChild();
+    else if (!worldParent)
+      link = joint->GetParent();
+    EXPECT_TRUE(link != NULL);
+
+    math::Pose initialPose = link->GetWorldPose();
+    world->Step(100);
+    math::Pose afterPose = link->GetWorldPose();
+    EXPECT_TRUE(initialPose.pos == afterPose.pos);
+    EXPECT_EQ(joint->GetWorldPose().pos, joint->GetParentWorldPose().pos);
+    EXPECT_EQ(joint->GetAnchorErrorPose().pos, math::Vector3::Zero);
+  }
+}
+
+/////////////////////////////////////////////////
+void JointSpawningTest::CheckJointProperties(unsigned int _index,
+                                        physics::JointPtr _joint)
+{
+  physics::WorldPtr world = physics::get_world();
+  ASSERT_TRUE(world != NULL);
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  bool isOde = physics->GetType().compare("ode") == 0;
+  bool isBullet = physics->GetType().compare("bullet") == 0;
+  bool isDart = physics->GetType().compare("dart") == 0;
+  double dt = physics->GetMaxStepSize();
+
+  if (_joint->HasType(physics::Base::SCREW_JOINT) && isDart)
+  {
+    gzerr << "This portion of the test fails for DARTScrewJoint" << std::endl;
+    return;
+  }
+  if (_joint->HasType(physics::Base::HINGE2_JOINT) ||
+      _joint->HasType(physics::Base::GEARBOX_JOINT) ||
+      _joint->HasType(physics::Base::SCREW_JOINT) ||
+      _joint->HasType(physics::Base::UNIVERSAL_JOINT))
+  {
+    gzerr << "This portion of the test fails for this joint type" << std::endl;
+    return;
+  }
+  if (!_joint->GetChild())
+  {
+    gzerr << "The rest of this test fails without a child link" << std::endl;
+    return;
+  }
+
+  double velocityMagnitude = 1.0;
+  double maxForce = velocityMagnitude / dt * 10.1;
+  std::vector<double> velocities;
+  velocities.push_back(velocityMagnitude);
+  velocities.push_back(0.0);
+  velocities.push_back(-velocityMagnitude);
+  for (std::vector<double>::iterator iter = velocities.begin();
+       iter != velocities.end(); ++iter)
+  {
+    // Use Joint::SetVelocity with different values
+    double vel = *iter;
+    _joint->SetVelocity(_index, vel);
+
+    // ODE requires maxForce to be non-zero for SetVelocity to work
+    // See issue #964 for discussion of consistent API
+    if (isOde)
+      _joint->SetMaxForce(_index, maxForce);
+
+    // Take a step and verify that Joint::GetVelocity returns the same value
+    world->Step(1);
+    EXPECT_NEAR(_joint->GetVelocity(_index), vel, g_tolerance);
+
+    // Take more steps and verify that it keeps spinning at same speed
+    world->Step(50);
+    EXPECT_NEAR(_joint->GetVelocity(_index), vel, g_tolerance);
+  }
+
+  if (isBullet && _joint->HasType(physics::Base::SLIDER_JOINT))
+  {
+    gzerr << "BulletSliderJoint fails the SetForce and axis limit tests"
+          << std::endl;
+    return;
+  }
+
+  // Test SetForce with positive value
+  {
+    // reset world and expect joint to be stopped at home position
+    world->Reset();
+    EXPECT_NEAR(_joint->GetAngle(_index).Radian(), 0.0, g_tolerance);
+    EXPECT_NEAR(_joint->GetVelocity(_index), 0.0, g_tolerance);
+
+    // set positive force
+    double angleStart = _joint->GetAngle(_index).Radian();
+    _joint->SetForce(_index, 5);
+    world->Step(1);
+    EXPECT_GT(_joint->GetVelocity(_index), 0.0);
+    world->Step(1);
+    EXPECT_GT(_joint->GetAngle(_index).Radian(), angleStart);
+  }
+
+  // Test SetForce with negative value
+  {
+    // reset world and expect joint to be stopped at home position
+    world->Reset();
+    EXPECT_NEAR(_joint->GetAngle(_index).Radian(), 0.0, g_tolerance);
+    EXPECT_NEAR(_joint->GetVelocity(_index), 0.0, g_tolerance);
+
+    // set negative force
+    double angleStart = _joint->GetAngle(_index).Radian();
+    _joint->SetForce(_index, -5);
+    world->Step(1);
+    EXPECT_LT(_joint->GetVelocity(_index), 0.0);
+    world->Step(1);
+    EXPECT_LT(_joint->GetAngle(_index).Radian(), angleStart);
+  }
+
+  if (isBullet && _joint->HasType(physics::Base::HINGE_JOINT))
+  {
+    gzerr << "BulletHingeJoint fails the joint limit tests" << std::endl;
+    return;
+  }
+
+  // SetHighStop
+  {
+    // reset world and expect joint to be stopped at home position
+    world->Reset();
+    EXPECT_NEAR(_joint->GetAngle(_index).Radian(), 0.0, g_tolerance);
+    EXPECT_NEAR(_joint->GetVelocity(_index), 0.0, g_tolerance);
+
+    unsigned int steps = 100;
+    double vel = 1.0;
+    math::Angle limit = math::Angle(steps * dt * vel * 0.5);
+    _joint->SetHighStop(_index, limit);
+    _joint->SetVelocity(_index, vel);
+    if (isOde)
+      _joint->SetMaxForce(_index, maxForce);
+    world->Step(steps);
+    EXPECT_NEAR(limit.Radian(), _joint->GetAngle(_index).Radian(), g_tolerance);
+    EXPECT_EQ(_joint->GetHighStop(_index), limit);
+  }
+
+  // SetLowStop
+  {
+    // reset world and expect joint to be stopped at home position
+    world->Reset();
+    EXPECT_NEAR(_joint->GetAngle(_index).Radian(), 0.0, g_tolerance);
+    EXPECT_NEAR(_joint->GetVelocity(_index), 0.0, g_tolerance);
+
+    unsigned int steps = 100;
+    double vel = -1.0;
+    math::Angle limit = math::Angle(steps * dt * vel * 0.5);
+    _joint->SetLowStop(_index, limit);
+    _joint->SetVelocity(_index, vel);
+    if (isOde)
+      _joint->SetMaxForce(_index, maxForce);
+    world->Step(steps);
+    EXPECT_NEAR(limit.Radian(), _joint->GetAngle(_index).Radian(), g_tolerance);
+    EXPECT_EQ(_joint->GetLowStop(_index), limit);
+  }
+}
+
+TEST_P(JointSpawningTest_All, SpawnJointTypes)
+{
+  if (this->jointType == "gearbox" && this->physicsEngine != "ode")
+  {
+    gzerr << "Skip test, gearbox is only supported in ODE."
+          << std::endl;
+    return;
+  }
+  SpawnJointTypes(this->physicsEngine, this->jointType);
+}
+
+TEST_P(JointSpawningTest_Rotational, SpawnJointRotational)
+{
+  SpawnJointRotational(this->physicsEngine, this->jointType);
+}
+
+TEST_P(JointSpawningTest_RotationalWorld, SpawnJointRotationalWorld)
+{
+  SpawnJointRotationalWorld(this->physicsEngine, this->jointType);
+}
+
+INSTANTIATE_TEST_CASE_P(TestRuns, JointSpawningTest_All,
+  ::testing::Combine(PHYSICS_ENGINE_VALUES,
+  ::testing::Values("revolute"
+                  , "prismatic"
+                  , "screw"
+                  , "universal"
+                  , "ball"
+                  , "revolute2"
+                  , "gearbox")));
+
+// Skip prismatic, screw, and revolute2 because they allow translation
+INSTANTIATE_TEST_CASE_P(TestRuns, JointSpawningTest_Rotational,
+  ::testing::Combine(PHYSICS_ENGINE_VALUES,
+  ::testing::Values("revolute"
+                  , "universal"
+                  , "ball")));
+
+// Skip prismatic, screw, and revolute2 because they allow translation
+// Skip universal because it can't be connected to world in bullet.
+INSTANTIATE_TEST_CASE_P(TestRuns, JointSpawningTest_RotationalWorld,
+  ::testing::Combine(PHYSICS_ENGINE_VALUES,
+  ::testing::Values("revolute"
+                  , "ball")));
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/joint_test.cc b/test/integration/joint_test.cc
new file mode 100644
index 0000000..cd5de42
--- /dev/null
+++ b/test/integration/joint_test.cc
@@ -0,0 +1,400 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/physics/physics.hh"
+#include "gazebo/physics/Joint.hh"
+#include "test/integration/helper_physics_generator.hh"
+#include "test/integration/joint_test.hh"
+
+#define TOL 1e-6
+#define TOL_CONT 2.0
+
+using namespace gazebo;
+
+//////////////////////////////////////////////////
+void JointTest::JointCreationDestructionTest(const std::string &_physicsEngine)
+{
+  /// \TODO: Disable for now until functionality is implemented
+  /// bullet collision parameters needs tweaking
+  if (_physicsEngine == "bullet")
+  {
+    gzerr << "Aborting test for bullet, see issue #590.\n";
+    return;
+  }
+  /// \TODO: simbody not complete for this test
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test for Simbody, see issue #862.\n";
+    return;
+  }
+  /// \TODO: dart not complete for this test
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Aborting test for DART, see issue #903.\n";
+    return;
+  }
+
+  // Load our inertial test world
+  Load("worlds/joint_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // create some fake links
+  physics::ModelPtr model = world->GetModel("model_1");
+  ASSERT_TRUE(model != NULL);
+  physics::LinkPtr link = model->GetLink("link_1");
+  ASSERT_TRUE(link != NULL);
+
+  physics::LinkPtr parentLink;
+  physics::LinkPtr childLink(link);
+  physics::JointPtr joint;
+  math::Pose anchor;
+  math::Vector3 axis(1, 0, 0);
+  double upper = M_PI;
+  double lower = -M_PI;
+
+  double residentLast = 0, shareLast = 0;
+  double residentCur = 0, shareCur = 0;
+
+  // The memory footprint on osx can take around 190 cycles to stabilize.
+  // So this test gives 250 cycles to stabilize and then verifies stability
+  // for another 250.
+  unsigned int cyclesMax = 500;
+  unsigned int cyclesStabilize = cyclesMax / 2;
+  for (unsigned int i = 0; i < cyclesMax; ++i)
+  {
+    // try creating a joint
+    {
+      joint = world->GetPhysicsEngine()->CreateJoint(
+        "revolute", model);
+      joint->Attach(parentLink, childLink);
+      // load adds the joint to a vector of shared pointers kept
+      // in parent and child links, preventing joint from being destroyed.
+      joint->Load(parentLink, childLink, anchor);
+      // joint->SetAnchor(0, anchor);
+      joint->SetAxis(0, axis);
+      joint->SetHighStop(0, upper);
+      joint->SetLowStop(0, lower);
+
+      if (parentLink)
+        joint->SetName(parentLink->GetName() + std::string("_") +
+                       childLink->GetName() + std::string("_joint"));
+      else
+        joint->SetName(std::string("world_") +
+                       childLink->GetName() + std::string("_joint"));
+      joint->Init();
+      joint->SetAxis(0, axis);
+    }
+
+    // remove the joint
+    {
+      bool paused = world->IsPaused();
+      world->SetPaused(true);
+      if (joint)
+      {
+        // reenable collision between the link pair
+        physics::LinkPtr parent = joint->GetParent();
+        physics::LinkPtr child = joint->GetChild();
+        if (parent)
+          parent->SetCollideMode("all");
+        if (child)
+          child->SetCollideMode("all");
+
+        joint->Detach();
+        joint.reset();
+      }
+      world->SetPaused(paused);
+    }
+
+    world->Step(200);
+
+    this->GetMemInfo(residentCur, shareCur);
+
+    // give it 2 cycles to stabilize
+    if (i > cyclesStabilize)
+    {
+      EXPECT_LE(residentCur, residentLast);
+      EXPECT_LE(shareCur, shareLast);
+    }
+    // gzdbg << "memory res[" << residentCur
+    //       << "] shr[" << shareCur
+    //       << "] res[" << residentLast
+    //       << "] shr[" << shareLast
+    //       << "]\n";
+    residentLast = residentCur;
+    shareLast = shareCur;
+  }
+}
+
+//////////////////////////////////////////////////
+void JointTest::GetInertiaRatio(const std::string &_physicsEngine)
+{
+  // Load our inertia ratio world
+  Load("worlds/inertia_ratio.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics::ModelPtr model = world->GetModel("double_pendulum");
+  ASSERT_TRUE(model != NULL);
+
+  {
+    physics::JointPtr joint = model->GetJoint("lower_joint");
+    ASSERT_TRUE(joint != NULL);
+
+    EXPECT_NEAR(joint->GetInertiaRatio(0), 3125, 1e-2);
+    EXPECT_NEAR(joint->GetInertiaRatio(math::Vector3::UnitX), 3125, 1e-2);
+    EXPECT_NEAR(joint->GetInertiaRatio(math::Vector3::UnitY), 87.50, 1e-2);
+  }
+}
+//////////////////////////////////////////////////
+void JointTest::SpringDamperTest(const std::string &_physicsEngine)
+{
+  /// SpringDamper implemented not yet released for dart
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Aborting test for dart, see issue #975.\n";
+    return;
+  }
+  /// bullet collision parameters needs tweaking
+  if (_physicsEngine == "bullet")
+  {
+    gzerr << "Aborting test for bullet, see issue #887.\n";
+    return;
+  }
+
+  // Load our inertial test world
+  Load("worlds/spring_damper_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // All models should oscillate with the same frequency
+  physics::ModelPtr modelPrismatic = world->GetModel("model_3_prismatic");
+  physics::ModelPtr modelRevolute = world->GetModel("model_3_revolute");
+  physics::ModelPtr modelPlugin = world->GetModel("model_4_prismatic_plugin");
+  physics::ModelPtr modelContact = world->GetModel("model_5_soft_contact");
+
+  ASSERT_TRUE(modelPrismatic != NULL);
+  ASSERT_TRUE(modelRevolute != NULL);
+  ASSERT_TRUE(modelPlugin != NULL);
+  ASSERT_TRUE(modelContact != NULL);
+
+  physics::LinkPtr linkPrismatic = modelPrismatic->GetLink("link_1");
+  physics::LinkPtr linkRevolute = modelRevolute->GetLink("link_1");
+  physics::LinkPtr linkPluginExplicit = modelPlugin->GetLink("link_1");
+  physics::LinkPtr linkPluginImplicit = modelPlugin->GetLink("link_2");
+  physics::LinkPtr linkContact = modelContact->GetLink("link_1");
+
+  ASSERT_TRUE(linkPrismatic != NULL);
+  ASSERT_TRUE(linkRevolute != NULL);
+  ASSERT_TRUE(linkPluginExplicit != NULL);
+  ASSERT_TRUE(linkPluginImplicit != NULL);
+  ASSERT_TRUE(linkContact != NULL);
+
+  physics::JointPtr jointPluginImplicit = modelPlugin->GetJoint("joint_1");
+  ASSERT_TRUE(jointPluginImplicit);
+
+  int cyclesPrismatic = 0;
+  int cyclesRevolute = 0;
+  int cyclesPluginExplicit = 0;
+  int cyclesPluginImplicit = 0;
+  int cyclesContact = 0;
+
+  double velPrismatic = 1.0;
+  double velRevolute = 1.0;
+  double velPluginExplicit = 1.0;
+  double velPluginImplicit = 1.0;
+  double velContact = 1.0;
+  const double vT = 0.01;
+
+  double energyPluginImplicit0 = linkPluginImplicit->GetWorldEnergy()
+        + jointPluginImplicit->GetWorldEnergyPotentialSpring(0);
+
+  // check number of oscillations for each of the setup.  They should all
+  // be the same.
+  // run 5000 steps, at which point, contact is the first one to damp out
+  // and lose it's oscillatory behavior due to larger dissipation in
+  // contact behavior.
+  for (int i = 0; i < 5000; ++i)
+  {
+    world->Step(1);
+
+    // count up and down cycles
+    if (linkPrismatic->GetWorldLinearVel().z > vT && velPrismatic < -vT)
+    {
+      cyclesPrismatic++;
+      velPrismatic = 1.0;
+    }
+    else if (linkPrismatic->GetWorldLinearVel().z < -vT && velPrismatic > vT)
+    {
+      cyclesPrismatic++;
+      velPrismatic = -1.0;
+    }
+    if (-linkRevolute->GetRelativeAngularVel().y > vT && velRevolute < -vT)
+    {
+      cyclesRevolute++;
+      velRevolute = 1.0;
+    }
+    else if (-linkRevolute->GetRelativeAngularVel().y < -vT && velRevolute > vT)
+    {
+      cyclesRevolute++;
+      velRevolute = -1.0;
+    }
+    if (linkPluginExplicit->GetWorldLinearVel().z > vT &&
+        velPluginExplicit < -vT)
+    {
+      cyclesPluginExplicit++;
+      velPluginExplicit = 1.0;
+    }
+    else if (linkPluginExplicit->GetWorldLinearVel().z < -vT &&
+             velPluginExplicit > vT)
+    {
+      cyclesPluginExplicit++;
+      velPluginExplicit = -1.0;
+    }
+    if (linkPluginImplicit->GetWorldLinearVel().z > vT &&
+             velPluginImplicit < -vT)
+    {
+      cyclesPluginImplicit++;
+      velPluginImplicit = 1.0;
+    }
+    else if (linkPluginImplicit->GetWorldLinearVel().z < -vT &&
+             velPluginImplicit > vT)
+    {
+      cyclesPluginImplicit++;
+      velPluginImplicit = -1.0;
+    }
+    if (linkContact->GetWorldLinearVel().z > vT && velContact < -vT)
+    {
+      cyclesContact++;
+      velContact = 1.0;
+    }
+    else if (linkContact->GetWorldLinearVel().z < -vT && velContact > vT)
+    {
+      cyclesContact++;
+      velContact = -1.0;
+    }
+
+    double energy = linkPluginImplicit->GetWorldEnergy() +
+                   jointPluginImplicit->GetWorldEnergyPotentialSpring(0);
+    EXPECT_NEAR(energy / energyPluginImplicit0, 1.0, 1e-3);
+    // gzdbg << i << "\n";
+    // gzdbg << cyclesPrismatic << " : "
+    //       << linkPrismatic->GetWorldLinearVel() << "\n";
+    // gzdbg << cyclesRevolute << " : "
+    //       << linkRevolute->GetRelativeAngularVel() << "\n";
+    // gzdbg << cyclesContact << " : "
+    //       << linkContact->GetWorldLinearVel() << "\n";
+  }
+  if (_physicsEngine.compare("ode") == 0)
+  {
+    gzdbg << "Extra tests for ode" << std::endl;
+    EXPECT_EQ(cyclesContact,        17);
+  }
+  EXPECT_EQ(cyclesPrismatic,      17);
+  EXPECT_EQ(cyclesRevolute,       17);
+  EXPECT_EQ(cyclesPluginExplicit, 17);
+  EXPECT_EQ(cyclesPluginImplicit, 17);
+}
+
+//////////////////////////////////////////////////
+TEST_F(JointTest, joint_SDF14)
+{
+  Load("worlds/SDF_1_4.world");
+
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+
+  int i = 0;
+  while (!this->HasEntity("joint14_model") && i < 20)
+  {
+    common::Time::MSleep(100);
+    ++i;
+  }
+
+  if (i > 20)
+    gzthrow("Unable to get joint14_model");
+
+  physics::PhysicsEnginePtr physicsEngine = world->GetPhysicsEngine();
+  EXPECT_TRUE(physicsEngine);
+  physics::ModelPtr model = world->GetModel("joint14_model");
+  EXPECT_TRUE(model);
+  physics::LinkPtr link1 = model->GetLink("body1");
+  EXPECT_TRUE(link1);
+  physics::LinkPtr link2 = model->GetLink("body2");
+  EXPECT_TRUE(link2);
+
+  EXPECT_EQ(model->GetJointCount(), 1u);
+  physics::JointPtr joint = model->GetJoint("joint14_revolute_joint");
+  EXPECT_TRUE(joint);
+
+  physics::LinkPtr parent = joint->GetParent();
+  EXPECT_TRUE(parent);
+  physics::LinkPtr child = joint->GetChild();
+  EXPECT_TRUE(child);
+  EXPECT_EQ(parent->GetName(), "body2");
+  EXPECT_EQ(child->GetName(), "body1");
+}
+
+TEST_P(JointTest, JointCreationDestructionTest)
+{
+  JointCreationDestructionTest(this->physicsEngine);
+}
+
+TEST_P(JointTest, GetInertiaRatio)
+{
+  GetInertiaRatio(this->physicsEngine);
+}
+
+TEST_P(JointTest, SpringDamperTest)
+{
+  SpringDamperTest(this->physicsEngine);
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, JointTest,
+  ::testing::Combine(PHYSICS_ENGINE_VALUES,
+  ::testing::Values("")));
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/joint_test.hh b/test/integration/joint_test.hh
new file mode 100644
index 0000000..45fdc3b
--- /dev/null
+++ b/test/integration/joint_test.hh
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef _JOINT_TEST_HH_
+#define _JOINT_TEST_HH_
+
+#include <string>
+#include <sstream>
+
+#include "test/ServerFixture.hh"
+
+#include "gazebo/common/Time.hh"
+#include "gazebo/physics/physics.hh"
+
+using namespace gazebo;
+
+typedef std::tr1::tuple<const char *, const char *> std_string2;
+
+class JointTest : public ServerFixture,
+                   public ::testing::WithParamInterface<std_string2>
+{
+  protected: JointTest() : ServerFixture(), spawnCount(0)
+             {
+             }
+
+  /// \brief Test Joint::GetInertiaRatio.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void GetInertiaRatio(const std::string &_physicsEngine);
+
+  /// \brief Test spring dampers
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void SpringDamperTest(const std::string &_physicsEngine);
+
+  /// \brief Create and destroy joints repeatedly, monitors memory usage.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void JointCreationDestructionTest(const std::string &_physicsEngine);
+
+  // Documentation inherited.
+  public: virtual void SetUp()
+          {
+            const ::testing::TestInfo *const test_info =
+              ::testing::UnitTest::GetInstance()->current_test_info();
+            if (test_info->value_param())
+            {
+              gzdbg << "Params: " << test_info->value_param() << std::endl;
+              this->physicsEngine = std::tr1::get<0>(GetParam());
+              this->jointType = std::tr1::get<1>(GetParam());
+            }
+          }
+
+  /// \brief Class to hold parameters for spawning joints.
+  public: class SpawnJointOptions
+  {
+    /// \brief Constructor.
+    public: SpawnJointOptions() : worldChild(false), worldParent(false),
+              wait(common::Time(99, 0)),
+              noLinkPose(false), axis(math::Vector3(1, 0, 0)),
+              useParentModelFrame(false)
+            {
+            }
+
+    /// \brief Destructor.
+    public: ~SpawnJointOptions()
+            {
+            }
+
+    /// \brief Type of joint to create.
+    public: std::string type;
+
+    /// \brief Flag to set child link to the world.
+    public: bool worldChild;
+
+    /// \brief Flag to set parent link to the world.
+    public: bool worldParent;
+
+    /// \brief Length of time to wait for model to spawn in order to return
+    ///        Joint pointer.
+    public: common::Time wait;
+
+    /// \brief Model pose for spawned model.
+    public: math::Pose modelPose;
+
+    /// \brief Child link pose for spawned model.
+    public: math::Pose childLinkPose;
+
+    /// \brief Parent link pose for spawned model.
+    public: math::Pose parentLinkPose;
+
+    /// \brief Flag to disable including link pose per issue #978.
+    public: bool noLinkPose;
+
+    /// \brief Joint pose for spawned joint.
+    public: math::Pose jointPose;
+
+    /// \brief Axis value for spawned joint.
+    public: math::Vector3 axis;
+
+    /// \brief Use parent model frame (#494)
+    public: bool useParentModelFrame;
+  };
+
+  /// \brief Spawn a model with a joint connecting to the world. The function
+  ///        will wait for duration _wait for the model to spawn and attempt
+  ///        to return a pointer to the spawned joint. This function is not
+  ///        guaranteed to return a valid JointPtr, so the output should be
+  ///        checked.
+  /// \param[in] _type Type of joint to create.
+  /// \param[in] _worldChild Flag to set child link to the world.
+  /// \param[in] _worldParent Flag to set parent link to the world.
+  /// \param[in] _wait Length of time to wait for model to spawn in order
+  ///                  to return Joint pointer.
+  public: physics::JointPtr SpawnJoint(const std::string &_type,
+                                       bool _worldChild = false,
+                                       bool _worldParent = false,
+                                   common::Time _wait = common::Time(99, 0))
+          {
+            SpawnJointOptions opt;
+            opt.type = _type;
+            opt.worldChild = _worldChild;
+            opt.worldParent = _worldParent;
+            opt.wait = _wait;
+            return SpawnJoint(opt);
+          }
+
+  /// \brief Spawn a model with a joint connecting to the world. The function
+  ///        will wait for duration _wait for the model to spawn and attempt
+  ///        to return a pointer to the spawned joint. This function is not
+  ///        guaranteed to return a valid JointPtr, so the output should be
+  ///        checked.
+  /// \param[in] _opt Options for spawned model and joint.
+  public: physics::JointPtr SpawnJoint(const SpawnJointOptions &_opt)
+          {
+            msgs::Factory msg;
+            std::ostringstream modelStr;
+            std::ostringstream modelName;
+            modelName << "joint_model" << this->spawnCount++;
+
+            modelStr
+              << "<sdf version='" << SDF_VERSION << "'>"
+              << "<model name ='" << modelName.str() << "'>"
+              << "  <pose>" << _opt.modelPose << "</pose>";
+            if (!_opt.worldParent)
+            {
+              modelStr << "  <link name='parent'>";
+              if (!_opt.noLinkPose)
+              {
+                modelStr << "    <pose>" << _opt.parentLinkPose << "</pose>";
+              }
+              modelStr << "  </link>";
+            }
+            if (!_opt.worldChild)
+            {
+              modelStr << "  <link name='child'>";
+              if (!_opt.noLinkPose)
+              {
+                modelStr << "    <pose>" << _opt.childLinkPose << "</pose>";
+              }
+              modelStr << "  </link>";
+            }
+            modelStr
+              << "  <joint name='joint' type='" << _opt.type << "'>"
+              << "    <pose>" << _opt.jointPose << "</pose>";
+            if (_opt.worldParent)
+              modelStr << "    <parent>world</parent>";
+            else
+              modelStr << "    <parent>parent</parent>";
+            if (_opt.worldChild)
+              modelStr << "    <child>world</child>";
+            else
+              modelStr << "    <child>child</child>";
+            modelStr
+              << "    <axis>"
+              << "      <xyz>" << _opt.axis << "</xyz>"
+              << "      <use_parent_model_frame>" << _opt.useParentModelFrame
+              << "      </use_parent_model_frame>"
+              << "    </axis>";
+            // Hack: hardcode a second axis for universal joints
+            if (_opt.type == "universal")
+            {
+              modelStr
+                << "  <axis2>"
+                << "    <xyz>" << math::Vector3(0, 1, 0) << "</xyz>"
+                << "    <use_parent_model_frame>" << _opt.useParentModelFrame
+                << "    </use_parent_model_frame>"
+                << "  </axis2>";
+            }
+            modelStr
+              << "  </joint>"
+              << "</model>";
+
+            msg.set_sdf(modelStr.str());
+            this->factoryPub->Publish(msg);
+
+            physics::JointPtr joint;
+            if (_opt.wait != common::Time::Zero)
+            {
+              common::Time wallStart = common::Time::GetWallTime();
+              unsigned int waitCount = 0;
+              while (_opt.wait > (common::Time::GetWallTime() - wallStart) &&
+                     !this->HasEntity(modelName.str()))
+              {
+                common::Time::MSleep(100);
+                if (++waitCount % 10 == 0)
+                {
+                  gzwarn << "Waiting " << waitCount / 10 << " seconds for "
+                         << _opt.type << " joint to spawn." << std::endl;
+                }
+              }
+              if (this->HasEntity(modelName.str()) && waitCount >= 10)
+                gzwarn << _opt.type << " joint has spawned." << std::endl;
+
+              physics::WorldPtr world = physics::get_world("default");
+              if (world != NULL)
+              {
+                physics::ModelPtr model = world->GetModel(modelName.str());
+                if (model != NULL)
+                  joint = model->GetJoint("joint");
+              }
+            }
+            return joint;
+          }
+
+  /// \brief Physics engine for test.
+  protected: std::string physicsEngine;
+
+  /// \brief Joint type for test.
+  protected: std::string jointType;
+
+  /// \brief Count of spawned models, used to ensure unique model names.
+  private: unsigned int spawnCount;
+};
+#endif
diff --git a/test/integration/joint_universal.cc b/test/integration/joint_universal.cc
new file mode 100644
index 0000000..72dbf5c
--- /dev/null
+++ b/test/integration/joint_universal.cc
@@ -0,0 +1,404 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string>
+
+#include "gazebo/physics/physics.hh"
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+
+const double g_tolerance = 1e-4;
+
+class JointTestUniversal : public ServerFixture,
+                        public testing::WithParamInterface<const char*>
+{
+  /// \brief Test setting and enforcing joint limits.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void Limits(const std::string &_physicsEngine);
+
+  /// \brief Test universal joint implementation with SetWorldPose.
+  /// Set links world poses then check joint angles.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void UniversalJointSetWorldPose(const std::string &_physicsEngine);
+
+  /// \brief Test universal joint implementation with forces.
+  /// Apply force to universal joint links, check position and/velocity.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void UniversalJointForce(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void JointTestUniversal::Limits(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "DART Universal Joint is not yet working.  See issue #1011.\n";
+    return;
+  }
+
+  // Load our universal joint test world
+  Load("worlds/universal_joint_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // get model and joints
+  physics::ModelPtr model = world->GetModel("model_1");
+  ASSERT_TRUE(model);
+  physics::JointPtr jointUpper = model->GetJoint("joint_00");
+  physics::JointPtr jointLower = model->GetJoint("joint_01");
+  ASSERT_TRUE(jointUpper);
+  ASSERT_TRUE(jointLower);
+  physics::LinkPtr linkLower = jointLower->GetChild();
+  ASSERT_TRUE(linkLower);
+
+  // freeze upper joint
+  jointUpper->SetHighStop(0, 1e-6);
+  jointUpper->SetHighStop(1, 1e-6);
+  jointUpper->SetLowStop(0, -1e-6);
+  jointUpper->SetLowStop(1, -1e-6);
+
+  // set asymmetric limits on lower joints
+  double hi0 =  0.4;
+  double hi1 =  0.2;
+  double lo0 = -0.1;
+  double lo1 = -0.3;
+  jointLower->SetHighStop(0, hi0);
+  jointLower->SetHighStop(1, hi1);
+  jointLower->SetLowStop(0, lo0);
+  jointLower->SetLowStop(1, lo1);
+  EXPECT_NEAR(hi0, jointLower->GetHighStop(0).Radian(), g_tolerance);
+  EXPECT_NEAR(hi1, jointLower->GetHighStop(1).Radian(), g_tolerance);
+  EXPECT_NEAR(lo0, jointLower->GetLowStop(0).Radian(), g_tolerance);
+  EXPECT_NEAR(lo1, jointLower->GetLowStop(1).Radian(), g_tolerance);
+
+  for (int i = 0; i < 4; ++i)
+  {
+    // toggle signs for gx, gy
+    //     gx gy
+    // i=0: +  +
+    // i=1: +  -
+    // i=2: -  +
+    // i=3: -  -
+    double gravityMag = 5.0;
+    double gx = pow(-1, i / 2) * gravityMag;
+    double gy = pow(-1, i % 2) * gravityMag;
+
+    // Set gravity to push horizontally
+    physics->SetGravity(math::Vector3(gx, gy, 0));
+    world->Step(1000);
+
+    // jointLower: axis[0] = {1, 0, 0}
+    // jointLower: axis[1] = {0, 1, 0}
+    // offset from anchor to c.g. is r = {0, 0, -L}
+    // gravity moment r x g
+
+    // a negative gy causes negative rotation about axis[0]
+    double des0 = (gy < 0) ? lo0 : hi0;
+
+    // a positive gx causes negative rotation about axis[1]
+    double des1 = (gx > 0) ? lo1 : hi1;
+
+    gzdbg << "Setting gravity "
+          << "gx " << gx << ' '
+          << "gy " << gy << ' '
+          << "pose " << jointLower->GetChild()->GetWorldPose()
+          << std::endl;
+    EXPECT_NEAR(des0, jointLower->GetAngle(0).Radian(), 1e-2);
+    EXPECT_NEAR(des1, jointLower->GetAngle(1).Radian(), 1e-2);
+
+    // Also test expected pose of body, math is approximate
+    math::Vector3 eulerAngles = linkLower->GetWorldPose().rot.GetAsEuler();
+    EXPECT_NEAR(des0, eulerAngles.x, 0.05);
+    EXPECT_NEAR(des1, eulerAngles.y, 0.05);
+  }
+}
+
+/////////////////////////////////////////////////
+void JointTestUniversal::UniversalJointSetWorldPose(
+  const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "DART Universal Joint is not yet working.  See issue #1011.\n";
+    return;
+  }
+
+  // Load our universal joint test world
+  Load("worlds/universal_joint_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics->SetGravity(math::Vector3(0, 0, 0));
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+
+  // get time step size
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  gzlog << "dt : " << dt << "\n";
+
+  // verify that time moves forward
+  EXPECT_DOUBLE_EQ(t, dt);
+  gzlog << "t after one step : " << t << "\n";
+
+  // get model, joint and links
+  physics::ModelPtr model_1 = world->GetModel("model_1");
+  physics::LinkPtr link_00 = model_1->GetLink("link_00");
+  physics::LinkPtr link_01 = model_1->GetLink("link_01");
+  physics::JointPtr joint_00 = model_1->GetJoint("joint_00");
+  physics::JointPtr joint_01 = model_1->GetJoint("joint_01");
+
+  // both initial angles should be zero
+  EXPECT_EQ(joint_00->GetAngle(0), 0);
+  EXPECT_EQ(joint_00->GetAngle(1), 0);
+
+  // move child link to it's initial location
+  link_00->SetWorldPose(math::Pose(0, 0, 2, 0, 0, 0));
+  EXPECT_EQ(joint_00->GetAngle(0), 0);
+  EXPECT_EQ(joint_00->GetAngle(1), 0);
+  EXPECT_EQ(joint_00->GetGlobalAxis(0), math::Vector3(1, 0, 0));
+  EXPECT_EQ(joint_00->GetGlobalAxis(1), math::Vector3(0, 1, 0));
+  gzdbg << "joint angles [" << joint_00->GetAngle(0)
+        << ", " << joint_00->GetAngle(1)
+        << "] axis1 [" << joint_00->GetGlobalAxis(0)
+        << "] axis2 [" << joint_00->GetGlobalAxis(1)
+        << "]\n";
+
+  // move child link 45deg about x
+  link_00->SetWorldPose(math::Pose(0, 0, 2, 0.25*M_PI, 0, 0));
+  EXPECT_EQ(joint_00->GetAngle(0), 0.25*M_PI);
+  EXPECT_EQ(joint_00->GetAngle(1), 0);
+  EXPECT_EQ(joint_00->GetGlobalAxis(0), math::Vector3(1, 0, 0));
+  EXPECT_EQ(joint_00->GetGlobalAxis(1),
+    math::Vector3(0, cos(0.25*M_PI), sin(0.25*M_PI)));
+  gzdbg << "joint angles [" << joint_00->GetAngle(0)
+        << ", " << joint_00->GetAngle(1)
+        << "] axis1 [" << joint_00->GetGlobalAxis(0)
+        << "] axis2 [" << joint_00->GetGlobalAxis(1)
+        << "]\n";
+
+  // move child link 45deg about y
+  link_00->SetWorldPose(math::Pose(0, 0, 2, 0, 0.25*M_PI, 0));
+  EXPECT_EQ(joint_00->GetAngle(0), 0);
+  EXPECT_EQ(joint_00->GetAngle(1), 0.25*M_PI);
+  EXPECT_EQ(joint_00->GetGlobalAxis(0), math::Vector3(1, 0, 0));
+  EXPECT_EQ(joint_00->GetGlobalAxis(1), math::Vector3(0, 1, 0));
+  gzdbg << "joint angles [" << joint_00->GetAngle(0)
+        << ", " << joint_00->GetAngle(1)
+        << "] axis1 [" << joint_00->GetGlobalAxis(0)
+        << "] axis2 [" << joint_00->GetGlobalAxis(1)
+        << "]\n";
+
+  // move child link 90deg about both x and "rotated y axis" (z)
+  link_00->SetWorldPose(math::Pose(0, 0, 2, 0.5*M_PI, 0, 0.5*M_PI));
+  EXPECT_EQ(joint_00->GetAngle(1), 0.5*M_PI);
+  EXPECT_EQ(joint_00->GetGlobalAxis(0), math::Vector3(1, 0, 0));
+  EXPECT_EQ(joint_00->GetGlobalAxis(1),
+    math::Vector3(0, cos(0.5*M_PI), sin(0.5*M_PI)));
+
+  gzdbg << "joint angles [" << joint_00->GetAngle(0)
+        << ", " << joint_00->GetAngle(1)
+        << "] axis1 [" << joint_00->GetGlobalAxis(0)
+        << "] axis2 [" << joint_00->GetGlobalAxis(1)
+        << "]\n";
+
+  if (_physicsEngine == "bullet")
+  {
+    gzerr << "Bullet Universal Joint dynamics broken, see issue #1081.\n";
+    return;
+  }
+  else
+  {
+    EXPECT_EQ(joint_00->GetAngle(0), 0.5*M_PI);
+  }
+}
+
+//////////////////////////////////////////////////
+void JointTestUniversal::UniversalJointForce(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "bullet")
+  {
+    gzerr << "Bullet Universal Joint dynamics broken, see issue #1081.\n";
+    return;
+  }
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "DART Universal Joint is not yet working.  See issue #1011.\n";
+    return;
+  }
+
+  // Load our universal joint test world
+  Load("worlds/universal_joint_test.world", true, _physicsEngine);
+
+  // Get a pointer to the world, make sure world loads
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics->SetGravity(math::Vector3(0, 0, 0));
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+
+  // get time step size
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  gzlog << "dt : " << dt << "\n";
+
+  // verify that time moves forward
+  EXPECT_DOUBLE_EQ(t, dt);
+  gzlog << "t after one step : " << t << "\n";
+
+  // get model, joints and get links
+  physics::ModelPtr model_1 = world->GetModel("model_1");
+  physics::LinkPtr link_00 = model_1->GetLink("link_00");
+  physics::LinkPtr link_01 = model_1->GetLink("link_01");
+  physics::JointPtr joint_00 = model_1->GetJoint("joint_00");
+  physics::JointPtr joint_01 = model_1->GetJoint("joint_01");
+
+  // both initial angles should be zero
+  EXPECT_EQ(joint_00->GetAngle(0), 0);
+  EXPECT_EQ(joint_00->GetAngle(1), 0);
+
+  // set new upper limit for joint_00
+  joint_00->SetHighStop(0, 0.3);
+  // push joint_00 till it hits new upper limit
+  int count = 0;
+  while (joint_00->GetAngle(0) < 0.4 && count < 1220)
+  {
+    count++;
+
+    joint_00->SetForce(0, 0.1);
+    world->Step(1);
+    // check link pose
+    double angle_00_0 = joint_00->GetAngle(0).Radian();
+    math::Pose pose_00 = link_00->GetWorldPose();
+    EXPECT_NEAR(pose_00.rot.GetAsEuler().x, angle_00_0, 1e-8);
+    EXPECT_LT(pose_00.rot.GetAsEuler().x, 0.35);
+  }
+
+  // push it back to 0 then lock
+  joint_00->SetLowStop(0, 0.0);
+  count = 0;
+  while (joint_00->GetAngle(0) > 0.1 && count < 1220)
+  {
+    count++;
+
+    joint_00->SetForce(0, -0.1);
+    world->Step(1);
+    // check link pose
+    double angle_00_0 = joint_00->GetAngle(0).Radian();
+    math::Pose pose_00 = link_00->GetWorldPose();
+    EXPECT_NEAR(pose_00.rot.GetAsEuler().x, angle_00_0, 1e-8);
+    EXPECT_GT(pose_00.rot.GetAsEuler().x, -0.05);
+  }
+  // lock joint at this location by setting lower limit here too
+  joint_00->SetHighStop(0, 0.0);
+
+  // set joint_01 upper limit to 1.0
+  joint_01->SetHighStop(0, 0.0);
+  joint_01->SetLowStop(0, 0.0);
+  joint_01->SetHighStop(1, 2.0);
+  // push joint_01 until limit is reached
+  count = 0;
+  while (joint_01->GetAngle(1) < 2.1 && count < 2700)
+  {
+    count++;
+
+    joint_01->SetForce(0, 0.1);
+    world->Step(1);
+
+    // check link pose
+    math::Pose pose_01 = link_01->GetWorldPose();
+    double angle_00_1 = joint_00->GetAngle(1).Radian();
+    double angle_01_1 = joint_01->GetAngle(1).Radian();
+
+    EXPECT_NEAR(pose_01.rot.GetAsEuler().y, angle_00_1 + angle_01_1, 1e-8);
+    EXPECT_LT(pose_01.rot.GetAsEuler().y, 2.05);
+  }
+
+  // push joint_01 the other way until -1 is reached
+  joint_01->SetLowStop(1, -1.0);
+  count = 0;
+  while (joint_01->GetAngle(1) > -1.1 && count < 2100)
+  {
+    count++;
+
+    joint_01->SetForce(1, -0.1);
+    world->Step(1);
+
+    // check link pose
+    math::Pose pose_01 = link_01->GetWorldPose();
+    double angle_00_0 = joint_00->GetAngle(0).Radian();
+    double angle_00_1 = joint_00->GetAngle(1).Radian();
+    double angle_01_0 = joint_01->GetAngle(0).Radian();
+    double angle_01_1 = joint_01->GetAngle(1).Radian();
+
+    EXPECT_NEAR(pose_01.rot.GetAsEuler().x, angle_00_0 + angle_01_0, 1e-6);
+    EXPECT_NEAR(pose_01.rot.GetAsEuler().y, angle_00_1 + angle_01_1, 1e-6);
+  }
+}
+
+/////////////////////////////////////////////////
+TEST_P(JointTestUniversal, Limits)
+{
+  Limits(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(JointTestUniversal, UniversalJointSetWorldPose)
+{
+  UniversalJointSetWorldPose(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(JointTestUniversal, UniversalJointForce)
+{
+  UniversalJointForce(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, JointTestUniversal,
+                        PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/laser.cc b/test/integration/laser.cc
new file mode 100644
index 0000000..a41bea6
--- /dev/null
+++ b/test/integration/laser.cc
@@ -0,0 +1,619 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "gazebo/common/common.hh"
+#include "scans_cmp.h"
+#include "helper_physics_generator.hh"
+
+#define LASER_TOL 1e-5
+#define DOUBLE_TOL 1e-6
+
+using namespace gazebo;
+class LaserTest : public ServerFixture,
+                  public testing::WithParamInterface<const char*>
+{
+  public: void Stationary_EmptyWorld(const std::string &_physicsEngine);
+  public: void GroundPlane(const std::string &_physicsEngine);
+  public: void LaserUnitBox(const std::string &_physicsEngine);
+  public: void LaserUnitNoise(const std::string &_physicsEngine);
+  public: void LaserVertical(const std::string &_physicsEngine);
+  public: void LaserScanResolution(const std::string &_physicsEngine);
+};
+
+void LaserTest::Stationary_EmptyWorld(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray shape, "
+          << "Please see issue #911. "
+          << "(https://bitbucket.org/osrf/gazebo/issue/911).\n";
+    return;
+  }
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  std::string modelName = "ray_model";
+  std::string raySensorName = "ray_sensor";
+  double hMinAngle = -2.27;
+  double hMaxAngle = 2.27;
+  double minRange = 0.0;
+  double maxRange = 10.0;
+  double rangeResolution = 0.01;
+  unsigned int samples = 640;
+  math::Pose testPose(math::Vector3(0, 0, 0.5),
+      math::Quaternion(0, 0, 0));
+
+  SpawnRaySensor(modelName, raySensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, 0, 0,
+      minRange, maxRange, rangeResolution, samples, 1, 1, 1);
+
+  sensors::RaySensorPtr laser =
+    boost::static_pointer_cast<sensors::RaySensor>(
+        sensors::SensorManager::Instance()->GetSensor(raySensorName));
+
+  ASSERT_TRUE(laser);
+  laser->Init();
+  laser->Update(true);
+
+  EXPECT_EQ(640, laser->GetRayCount());
+  EXPECT_EQ(640, laser->GetRangeCount());
+  EXPECT_NEAR(laser->GetAngleMin().Radian(), -2.27, DOUBLE_TOL);
+  EXPECT_NEAR(laser->GetAngleMax().Radian(), 2.27, DOUBLE_TOL);
+  EXPECT_NEAR(laser->GetRangeMin(), 0, DOUBLE_TOL);
+  EXPECT_NEAR(laser->GetRangeMax(), 10, DOUBLE_TOL);
+  EXPECT_NEAR(laser->GetRangeResolution(), 0.01, DOUBLE_TOL);
+
+
+  for (int i = 0; i < laser->GetRangeCount(); ++i)
+  {
+    EXPECT_EQ(10, laser->GetRange(i));
+  }
+
+  // Spawn a box and test for proper laser scan
+  {
+    SpawnBox("test_box", math::Vector3(1, 1, 1),
+        math::Vector3(2, 0, 0.5), math::Vector3(0, 0, 0));
+    common::Time::MSleep(1000);
+
+    laser->Update(true);
+
+    std::vector<double> scan;
+    laser->GetRanges(scan);
+
+    // run test against pre-recorded range data only in ode
+    if (_physicsEngine == "ode")
+    {
+      double diffMax, diffSum, diffAvg;
+      DoubleCompare(box_scan, &scan[0], 640, diffMax, diffSum, diffAvg);
+      EXPECT_LT(diffMax, 2e-6);
+      EXPECT_LT(diffSum, 1e-4);
+      EXPECT_LT(diffAvg, 2e-6);
+    }
+
+    // This line will print the current scan. Use this to generate
+    // a new test scan sample
+    // PrintScan("box_scan", &scan[0], 640);
+  }
+
+  // Move the laser to point down on the ground plane,
+  {
+    common::Time prevTime;
+    physics::WorldPtr world = physics::get_world("default");
+    ASSERT_TRUE(world);
+
+    physics::ModelPtr model = world->GetModel(modelName);
+
+    prevTime = laser->GetLastUpdateTime();
+    model->SetWorldPose(math::Pose(0, 0, 1.0, 0, M_PI*0.5, 0));
+
+    double diffMax, diffSum, diffAvg;
+
+    std::vector<double> scan, scan2;
+
+    laser->Update(false);
+    for (unsigned int j = 0; j < 5; ++j)
+    {
+      laser->Update(true);
+      laser->GetRanges(scan);
+      laser->Update(true);
+      laser->GetRanges(scan2);
+
+      DoubleCompare(&scan[0], &scan2[0], 640, diffMax, diffSum, diffAvg);
+      EXPECT_LT(diffMax, 1e-6);
+      EXPECT_LT(diffSum, 1e-6);
+      EXPECT_LT(diffAvg, 1e-6);
+    }
+    laser->Update(true);
+
+    // run test against pre-recorded range data only in ode
+    if (_physicsEngine == "ode")
+    {
+      DoubleCompare(plane_scan, &scan[0], 640, diffMax, diffSum, diffAvg);
+      EXPECT_LT(diffMax, 1e-6);
+      EXPECT_LT(diffSum, 1e-6);
+      EXPECT_LT(diffAvg, 1e-6);
+    }
+
+    // This line will print the current scan. Use this to generate
+    // a new test scan sample
+    // PrintScan("plane_scan", &scan[0], 640);
+  }
+}
+
+TEST_P(LaserTest, EmptyWorld)
+{
+  Stationary_EmptyWorld(GetParam());
+}
+
+void LaserTest::LaserUnitBox(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Abort test since simbody does not support ray sensor, "
+          << "Please see issue #867.\n";
+    return;
+  }
+
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray shape and sensor, "
+          << "Please see issue #911. "
+          << "(https://bitbucket.org/osrf/gazebo/issue/911).\n";
+    return;
+  }
+
+  // Test ray sensor with 3 boxes in the world.
+  // First place 2 of 3 boxes within range and verify range values, one of them
+  // being a static model to verify collision filtering is working,
+  // then move all 3 boxes out of range and verify range values
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  std::string modelName = "ray_model";
+  std::string raySensorName = "ray_sensor";
+  double hMinAngle = -M_PI/2.0;
+  double hMaxAngle = M_PI/2.0;
+  double minRange = 0.1;
+  double maxRange = 5.0;
+  double rangeResolution = 0.02;
+  unsigned int samples = 320;
+  math::Pose testPose(math::Vector3(0, 0, 0),
+      math::Quaternion(0, 0, 0));
+  if (_physicsEngine == "bullet" && LIBBULLET_VERSION >= 2.82)
+  {
+    testPose.pos.z = 0.1;
+    gzwarn << "Raising sensor for bullet as workaround for #934" << std::endl;
+  }
+
+  SpawnRaySensor(modelName, raySensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, 0, 0, minRange, maxRange,
+      rangeResolution, samples, 1, 1, 1);
+
+  std::string box01 = "box_01";
+  std::string box02 = "box_02";
+  std::string box03 = "box_03";
+
+  // box in front of ray sensor
+  math::Pose box01Pose(math::Vector3(1, 0, 0.5), math::Quaternion(0, 0, 0));
+  // box on the right of ray sensor
+  math::Pose box02Pose(math::Vector3(0, -1, 0.5), math::Quaternion(0, 0, 0));
+  // box on the left of the ray sensor but out of range
+  math::Pose box03Pose(math::Vector3(0, maxRange + 1, 0.5),
+      math::Quaternion(0, 0, 0));
+
+  SpawnBox(box01, math::Vector3(1, 1, 1), box01Pose.pos,
+      box01Pose.rot.GetAsEuler());
+
+  // box02 is static
+  SpawnBox(box02, math::Vector3(1, 1, 1), box02Pose.pos,
+      box02Pose.rot.GetAsEuler(), true);
+
+  SpawnBox(box03, math::Vector3(1, 1, 1), box03Pose.pos,
+      box03Pose.rot.GetAsEuler());
+
+  sensors::SensorPtr sensor = sensors::get_sensor(raySensorName);
+  sensors::RaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::RaySensor>(sensor);
+
+  raySensor->Init();
+  raySensor->Update(true);
+
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  EXPECT_TRUE(world->GetModel(box02)->IsStatic());
+
+  int mid = samples / 2;
+  double unitBoxSize = 1.0;
+  double expectedRangeAtMidPoint = box01Pose.pos.x - unitBoxSize/2;
+
+  EXPECT_NEAR(raySensor->GetRange(mid), expectedRangeAtMidPoint, LASER_TOL);
+  EXPECT_NEAR(raySensor->GetRange(0), expectedRangeAtMidPoint, LASER_TOL);
+
+  // WARNING: for readings of no return, gazebo returns max range rather
+  // than +inf. issue #124
+  EXPECT_NEAR(raySensor->GetRange(samples-1), maxRange, LASER_TOL);
+
+  // Move all boxes out of range
+  world->GetModel(box01)->SetWorldPose(
+      math::Pose(math::Vector3(maxRange + 1, 0, 0), math::Quaternion(0, 0, 0)));
+  world->GetModel(box02)->SetWorldPose(
+      math::Pose(math::Vector3(0, -(maxRange + 1), 0),
+      math::Quaternion(0, 0, 0)));
+  world->Step(1);
+  raySensor->Update(true);
+
+  for (int i = 0; i < raySensor->GetRayCount(); ++i)
+  {
+    EXPECT_NEAR(raySensor->GetRange(i), maxRange, LASER_TOL);
+  }
+}
+
+TEST_P(LaserTest, LaserBox)
+{
+  LaserUnitBox(GetParam());
+}
+
+void LaserTest::LaserVertical(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Abort test since simbody does not support ray sensor, "
+          << "Please see issue #867.\n";
+    return;
+  }
+
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray shape and sensor, "
+          << "Please see issue #911. "
+          << "(https://bitbucket.org/osrf/gazebo/issue/911).\n";
+    return;
+  }
+
+  // Test a ray sensor that has a vertical range component.
+  // Place a box within range and verify range values,
+  // then move the box out of range and verify range values
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  std::string modelName = "ray_model";
+  std::string raySensorName = "ray_sensor";
+  double hMinAngle = -M_PI/2.0;
+  double hMaxAngle = M_PI/2.0;
+  double vMinAngle = -0.1;
+  double vMaxAngle = 0.1;
+  double minRange = 0.0;
+  double maxRange = 5.0;
+  double rangeResolution = 0.02;
+  unsigned int samples = 640;
+  unsigned int vSamples = 3;
+  double vAngleStep = (vMaxAngle - vMinAngle) / (vSamples-1);
+  math::Pose testPose(math::Vector3(0.25, 0, 0.5),
+      math::Quaternion(0, 0, 0));
+
+  SpawnRaySensor(modelName, raySensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, vMinAngle, vMaxAngle,
+      minRange, maxRange, rangeResolution, samples, vSamples, 1, 1);
+
+  std::string box01 = "box_01";
+
+  // box in front of ray sensor
+  math::Pose box01Pose(math::Vector3(1, 0, 0.5), math::Quaternion(0, 0, 0));
+
+  SpawnBox(box01, math::Vector3(1, 1, 1), box01Pose.pos,
+      box01Pose.rot.GetAsEuler());
+
+  sensors::SensorPtr sensor = sensors::get_sensor(raySensorName);
+  sensors::RaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::RaySensor>(sensor);
+
+  raySensor->Init();
+  raySensor->Update(true);
+
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  unsigned int mid = samples / 2;
+  double unitBoxSize = 1.0;
+
+  double angleStep = vMinAngle;
+  // all vertical laser planes should sense box
+  for (unsigned int i = 0; i < vSamples; ++i)
+  {
+    double expectedRangeAtMidPoint = box01Pose.pos.x - unitBoxSize/2
+        - testPose.pos.x;
+    expectedRangeAtMidPoint = expectedRangeAtMidPoint / cos(angleStep);
+
+    EXPECT_NEAR(raySensor->GetRange(i*samples + mid),
+        expectedRangeAtMidPoint, LASER_TOL);
+
+    angleStep += vAngleStep;
+
+    // WARNING: for readings of no return, gazebo returns max range rather
+    // than +inf. issue #124
+    EXPECT_NEAR(raySensor->GetRange(i*samples), maxRange, LASER_TOL);
+    EXPECT_NEAR(raySensor->GetRange(i*samples + samples-1),
+        maxRange, LASER_TOL);
+  }
+
+  // Move box out of range
+  world->GetModel(box01)->SetWorldPose(
+      math::Pose(math::Vector3(maxRange + 1, 0, 0), math::Quaternion(0, 0, 0)));
+  world->Step(1);
+  raySensor->Update(true);
+
+  for (int j = 0; j < raySensor->GetVerticalRayCount(); ++j)
+  {
+    for (int i = 0; i < raySensor->GetRayCount(); ++i)
+    {
+      EXPECT_NEAR(raySensor->GetRange(j*raySensor->GetRayCount() + i),
+          maxRange, LASER_TOL);
+    }
+  }
+}
+
+TEST_P(LaserTest, LaserVertical)
+{
+  LaserVertical(GetParam());
+}
+
+void LaserTest::LaserScanResolution(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Abort test since simbody does not support ray sensor, "
+          << "Please see issue #867.\n";
+    return;
+  }
+
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray shape and sensor, "
+          << "Please see issue #911. "
+          << "(https://bitbucket.org/osrf/gazebo/issue/911).\n";
+    return;
+  }
+
+  // Test ray sensor scan resolution.
+  // Orient the sensor to face downwards and verify that the interpolated
+  // range values all intersect with ground plane at z = 0;
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  std::string modelName = "ray_model";
+  std::string raySensorName = "ray_sensor";
+  // use asymmetric horizontal angles to make test more difficult
+  double hMinAngle = -M_PI/4.0;
+  double hMaxAngle = M_PI/8.0;
+  double vMinAngle = -0.1;
+  double vMaxAngle = 0.1;
+  double vMidAngle = M_PI/2.0;
+  double minRange = 0.0;
+  double maxRange = 5.0;
+  double rangeResolution = 0.02;
+  unsigned int hSamples = 641;
+  unsigned int vSamples = 5;
+  double hResolution = 3;
+  double vResolution = 2;
+  double hAngleStep = (hMaxAngle - hMinAngle) / (hSamples*hResolution-1);
+  double vAngleStep = (vMaxAngle - vMinAngle) / (vSamples*vResolution-1);
+  double z0 = 0.5;
+  math::Pose testPose(math::Vector3(0.25, 0, z0),
+      math::Quaternion(0, vMidAngle, 0));
+
+  SpawnRaySensor(modelName, raySensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, vMinAngle, vMaxAngle,
+      minRange, maxRange, rangeResolution, hSamples, vSamples,
+      hResolution, vResolution);
+
+  sensors::SensorPtr sensor = sensors::get_sensor(raySensorName);
+  sensors::RaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::RaySensor>(sensor);
+
+  raySensor->Init();
+  raySensor->Update(true);
+
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  unsigned int h, v;
+
+  for (v = 0; v < vSamples*vResolution; ++v)
+  {
+    for (h = 0; h < hSamples*hResolution; ++h)
+    {
+      // pitch angle
+      double p = vMinAngle + v*vAngleStep;
+      // yaw angle
+      double y = hMinAngle + h*hAngleStep;
+      double R = raySensor->GetRange(v*hSamples*hResolution + h);
+
+      math::Quaternion rot(0.0, -p, y);
+      math::Vector3 axis = testPose.rot * rot * math::Vector3::UnitX;
+      math::Vector3 intersection = (axis * R) + testPose.pos;
+      EXPECT_NEAR(intersection.z, 0.0, rangeResolution);
+    }
+  }
+}
+
+TEST_P(LaserTest, LaserScanResolution)
+{
+  LaserScanResolution(GetParam());
+}
+
+void LaserTest::GroundPlane(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Abort test since simbody does not support ray sensor, "
+          << "Please see issue #867.\n";
+    return;
+  }
+
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray shape and sensor, "
+          << "Please see issue #911. "
+          << "(https://bitbucket.org/osrf/gazebo/issue/911).\n";
+    return;
+  }
+
+  // Test a ray sensor that has a vertical range component.
+  // Aim the sensor toward the ground and verify correct ranges.
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  std::string modelName = "ray_model";
+  std::string raySensorName = "ray_sensor";
+  // use asymmetric horizontal angles to make test more difficult
+  double hMinAngle = -M_PI/4.0;
+  double hMaxAngle = M_PI/8.0;
+  double vMinAngle = -0.1;
+  double vMaxAngle = 0.1;
+  double vMidAngle = 0.3;
+  double minRange = 0.0;
+  double maxRange = 5.0;
+  double rangeResolution = 0.02;
+  unsigned int hSamples = 641;
+  unsigned int vSamples = 5;
+  double hAngleStep = (hMaxAngle - hMinAngle) / (hSamples-1);
+  double vAngleStep = (vMaxAngle - vMinAngle) / (vSamples-1);
+  double z0 = 0.5;
+  math::Pose testPose(math::Vector3(0.25, 0, z0),
+      math::Quaternion(0, vMidAngle, 0));
+
+  SpawnRaySensor(modelName, raySensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, vMinAngle, vMaxAngle,
+      minRange, maxRange, rangeResolution, hSamples, vSamples, 1, 1);
+
+  sensors::SensorPtr sensor = sensors::get_sensor(raySensorName);
+  sensors::RaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::RaySensor>(sensor);
+
+  raySensor->Init();
+  raySensor->Update(true);
+
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  unsigned int h, v;
+
+  for (v = 0; v < vSamples; ++v)
+  {
+    for (h = 0; h < hSamples; ++h)
+    {
+      // pitch angle
+      double p = vMinAngle + v*vAngleStep;
+      // yaw angle
+      double y = hMinAngle + h*hAngleStep;
+      double R = raySensor->GetRange(v*hSamples + h);
+
+      math::Quaternion rot(0.0, -p, y);
+      math::Vector3 axis = testPose.rot * rot * math::Vector3::UnitX;
+      math::Vector3 intersection = (axis * R) + testPose.pos;
+      EXPECT_NEAR(intersection.z, 0.0, rangeResolution);
+    }
+  }
+}
+
+TEST_P(LaserTest, GroundPlane)
+{
+  GroundPlane(GetParam());
+}
+
+void LaserTest::LaserUnitNoise(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray shape and sensor, "
+          << "Please see issue #911. "
+          << "(https://bitbucket.org/osrf/gazebo/issue/911).\n";
+    return;
+  }
+
+  // Test ray sensor with noise applied
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  std::string modelName = "ray_model";
+  std::string raySensorName = "ray_sensor";
+  double hMinAngle = -M_PI/2.0;
+  double hMaxAngle = M_PI/2.0;
+  double minRange = 0.0;
+  double maxRange = 5.0;
+  double rangeResolution = 0.02;
+  unsigned int samples = 320;
+  std::string noiseType = "gaussian";
+  // Give negative bias so that we can see the effect (positive bias
+  // would be removed by clamp(minRange,maxRange).
+  double noiseMean = -1.0;
+  double noiseStdDev = 0.01;
+  math::Pose testPose(math::Vector3(0, 0, 0),
+      math::Quaternion(0, 0, 0));
+
+  SpawnRaySensor(modelName, raySensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, 0, 0,
+      minRange, maxRange, rangeResolution, samples, 1, 1, 1,
+      noiseType, noiseMean, noiseStdDev);
+
+  sensors::SensorPtr sensor = sensors::get_sensor(raySensorName);
+  sensors::RaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::RaySensor>(sensor);
+
+  EXPECT_TRUE(raySensor != NULL);
+
+  raySensor->Init();
+  raySensor->Update(true);
+
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Expect at least one value to be non-max (empty world), and expect the
+  // mean to be close to the max+noiseMean
+  double total = 0.0;
+  bool foundNoise = false;
+  for (int i = 0; i < raySensor->GetRayCount(); ++i)
+  {
+    if (fabs(raySensor->GetRange(i) - maxRange) > LASER_TOL)
+      foundNoise = true;
+    total += raySensor->GetRange(i);
+  }
+  EXPECT_TRUE(foundNoise);
+  double mean = total / raySensor->GetRayCount();
+  // The mean should be well within 3-sigma
+  EXPECT_NEAR(mean, maxRange + noiseMean, 3*noiseStdDev);
+}
+
+TEST_P(LaserTest, LaserNoise)
+{
+  LaserUnitNoise(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, LaserTest, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  // Set a specific seed to avoid occasional test failures due to
+  // statistically unlikely, but possible results.
+  math::Rand::SetSeed(42);
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/manpages.cc b/test/integration/manpages.cc
new file mode 100644
index 0000000..a62fe2b
--- /dev/null
+++ b/test/integration/manpages.cc
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string>
+#include <fstream>
+#include <gtest/gtest.h>
+#include <boost/filesystem.hpp>
+
+#include "test_config.h"
+
+boost::filesystem::path g_mkRonn;
+boost::filesystem::path g_gzRoff;
+boost::filesystem::path g_toolBinPath;
+boost::filesystem::path g_toolSrcPath;
+boost::filesystem::path g_serverBinPath;
+boost::filesystem::path g_serverSrcPath;
+boost::filesystem::path g_guiBinPath;
+boost::filesystem::path g_guiSrcPath;
+std::string g_gazeboPATH;
+
+/////////////////////////////////////////////////
+std::string customExec(std::string _cmd)
+{
+  _cmd += " 2>/dev/null";
+  FILE* pipe = popen(_cmd.c_str(), "r");
+
+  if (!pipe)
+    return "ERROR";
+
+  char buffer[128];
+  std::string result = "";
+
+  while (!feof(pipe))
+  {
+    if (fgets(buffer, 128, pipe) != NULL)
+      result += buffer;
+  }
+
+  pclose(pipe);
+  return result;
+}
+
+/////////////////////////////////////////////////
+std::string readFile(const std::string &_filename)
+{
+  std::string result;
+  std::string line;
+
+  std::ifstream ronnFile(_filename.c_str(), std::ios::in);
+  while (ronnFile)
+  {
+    std::getline(ronnFile, line);
+    if (ronnFile)
+      result += line + "\n";
+  }
+
+  return result;
+}
+
+/////////////////////////////////////////////////
+void toolTest(const std::string &_command)
+{
+  std::string ronnOut = customExec(g_mkRonn.string()
+      + " " + (g_toolBinPath / _command).string());
+
+  boost::filesystem::path origRonnFilename =
+    g_toolSrcPath / (_command + ".1.ronn");
+
+  std::string origRonn = readFile(origRonnFilename.string());
+
+  EXPECT_EQ(origRonn, ronnOut);
+}
+
+/////////////////////////////////////////////////
+void serverTest(const std::string &_command)
+{
+  std::string ronnOut = customExec(g_gazeboPATH + " " + g_mkRonn.string()
+      + " " + (g_serverBinPath / _command).string());
+
+  boost::filesystem::path origRonnFilename =
+    g_serverSrcPath / (_command + ".1.ronn");
+
+  std::string origRonn = readFile(origRonnFilename.string());
+
+  EXPECT_EQ(origRonn, ronnOut);
+}
+
+/////////////////////////////////////////////////
+void guiTest(const std::string &_command)
+{
+  std::string ronnOut = customExec(g_mkRonn.string()
+      + " " + (g_guiBinPath / _command).string());
+
+  boost::filesystem::path origRonnFilename =
+    g_guiSrcPath / (_command + ".1.ronn");
+
+  std::string origRonn = readFile(origRonnFilename.string());
+
+  EXPECT_EQ(origRonn, ronnOut);
+}
+
+/////////////////////////////////////////////////
+TEST(ManTest, gzclient)
+{
+  guiTest(::testing::UnitTest::GetInstance()->current_test_info()->name());
+}
+
+/////////////////////////////////////////////////
+TEST(ManTest, gzserver)
+{
+  serverTest(::testing::UnitTest::GetInstance()->current_test_info()->name());
+}
+
+/////////////////////////////////////////////////
+TEST(ManTest, gazebo)
+{
+  serverTest(::testing::UnitTest::GetInstance()->current_test_info()->name());
+}
+
+/////////////////////////////////////////////////
+TEST(ManTest, gzfactory)
+{
+  toolTest(::testing::UnitTest::GetInstance()->current_test_info()->name());
+}
+
+/////////////////////////////////////////////////
+TEST(ManTest, gzlog)
+{
+  toolTest(::testing::UnitTest::GetInstance()->current_test_info()->name());
+}
+
+/////////////////////////////////////////////////
+TEST(ManTest, gzsdf)
+{
+  toolTest(::testing::UnitTest::GetInstance()->current_test_info()->name());
+}
+
+/////////////////////////////////////////////////
+TEST(ManTest, gzstats)
+{
+  toolTest(::testing::UnitTest::GetInstance()->current_test_info()->name());
+}
+
+/////////////////////////////////////////////////
+TEST(ManTest, gztopic)
+{
+  toolTest(::testing::UnitTest::GetInstance()->current_test_info()->name());
+}
+
+/////////////////////////////////////////////////
+TEST(ManTest, gz)
+{
+  std::string command =
+    ::testing::UnitTest::GetInstance()->current_test_info()->name();
+
+  std::string roffOut = customExec(g_gzRoff.string()
+      + " " + (g_toolBinPath / command).string());
+
+  boost::filesystem::path origRoffFilename =
+    g_toolSrcPath / (command + ".1.roff");
+
+  std::string origRoff = readFile(origRoffFilename.string());
+
+  EXPECT_EQ(origRoff, roffOut);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  g_mkRonn = PROJECT_SOURCE_PATH;
+  g_mkRonn = g_mkRonn / "tools" / "make_ronn.py";
+
+  g_gzRoff = PROJECT_SOURCE_PATH;
+  g_gzRoff = g_gzRoff / "tools" / "gz_roff.py";
+
+  g_toolBinPath = PROJECT_BINARY_PATH;
+  g_toolBinPath = g_toolBinPath / "tools";
+
+  g_toolSrcPath = PROJECT_SOURCE_PATH;
+  g_toolSrcPath = g_toolSrcPath / "tools";
+
+  g_serverBinPath = PROJECT_BINARY_PATH;
+  g_serverBinPath = g_serverBinPath / "gazebo";
+
+  g_serverSrcPath = PROJECT_SOURCE_PATH;
+  g_serverSrcPath = g_serverSrcPath / "gazebo";
+
+  g_guiBinPath = g_serverBinPath / "gui";
+  g_guiSrcPath = g_serverSrcPath / "gui";
+
+  g_gazeboPATH = std::string("PATH=") + g_serverBinPath.string() + ":"
+      + g_guiBinPath.string() + ":$PATH";
+
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/model_database.cc b/test/integration/model_database.cc
new file mode 100644
index 0000000..399cc2b
--- /dev/null
+++ b/test/integration/model_database.cc
@@ -0,0 +1,161 @@
+ /*
+ * Copyright 2013 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <unistd.h>
+#include "gazebo/common/ModelDatabase.hh"
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+
+int g_onModels = 0;
+int g_onModels1 = 0;
+int g_onModels2 = 0;
+
+event::ConnectionPtr g_Connection;
+event::ConnectionPtr g_Connection1;
+event::ConnectionPtr g_Connection2;
+
+class ModelDatabaseTest : public ServerFixture
+{
+};
+
+void OnModels(const std::map<std::string, std::string> & /*_models*/)
+{
+  g_onModels++;
+  g_Connection.reset();
+}
+
+void OnModels1(const std::map<std::string, std::string> & /*_models*/)
+{
+  g_onModels1++;
+}
+
+void OnModels2(const std::map<std::string, std::string> & /*_models*/)
+{
+  g_onModels2++;
+}
+
+/////////////////////////////////////////////////
+// Check the the first callback is called once, and the second twice
+TEST_F(ModelDatabaseTest, GetModels)
+{
+  g_onModels = 0;
+  g_onModels1 = 0;
+
+  Load("worlds/empty.world");
+
+  g_Connection = common::ModelDatabase::Instance()->GetModels(
+        boost::bind(&OnModels, _1));
+
+  g_Connection1 = common::ModelDatabase::Instance()->GetModels(
+        boost::bind(&OnModels1, _1));
+
+  while (g_onModels == 0 || g_onModels1 == 0)
+    common::Time::MSleep(500);
+
+  EXPECT_EQ(g_onModels, 1);
+  EXPECT_EQ(g_onModels1, 1);
+}
+
+/////////////////////////////////////////////////
+// Check the the first callback is called once, and the second twice
+TEST_F(ModelDatabaseTest, GetModelsTwice)
+{
+  g_onModels = 0;
+  g_onModels1 = 0;
+
+  Load("worlds/empty.world");
+
+  g_Connection = common::ModelDatabase::Instance()->GetModels(
+        boost::bind(&OnModels, _1));
+
+  g_Connection1 = common::ModelDatabase::Instance()->GetModels(
+        boost::bind(&OnModels1, _1));
+
+  while (g_onModels == 0 || g_onModels1 == 0)
+    common::Time::MSleep(500);
+
+  EXPECT_EQ(g_onModels, 1);
+  EXPECT_EQ(g_onModels1, 1);
+
+  common::ModelDatabase::Instance()->GetModels(boost::bind(&OnModels, _1));
+
+  while (g_onModels1 == 1)
+    common::Time::MSleep(500);
+
+  EXPECT_EQ(g_onModels, 1);
+  EXPECT_EQ(g_onModels1, 2);
+}
+
+/////////////////////////////////////////////////
+// Check that the second and third callbacks are received three times
+TEST_F(ModelDatabaseTest, GetModelsThrice)
+{
+  g_onModels = 0;
+  g_onModels1 = 0;
+  g_onModels2 = 0;
+
+  Load("worlds/empty.world");
+
+  g_Connection = common::ModelDatabase::Instance()->GetModels(
+        boost::bind(&OnModels, _1));
+
+  g_Connection1 = common::ModelDatabase::Instance()->GetModels(
+        boost::bind(&OnModels1, _1));
+
+  g_Connection2 = common::ModelDatabase::Instance()->GetModels(
+        boost::bind(&OnModels2, _1));
+
+  while (g_onModels == 0 || g_onModels1 == 0 || g_onModels2 == 0)
+  {
+    common::Time::MSleep(1000);
+  }
+
+  EXPECT_EQ(g_onModels, 1);
+  EXPECT_EQ(g_onModels1, 1);
+  EXPECT_EQ(g_onModels2, 1);
+
+  common::ModelDatabase::Instance()->GetModels(
+      boost::bind(&OnModels, _1));
+
+  while (g_onModels1 == 1 || g_onModels2 == 1)
+    common::Time::MSleep(500);
+
+  EXPECT_EQ(g_onModels, 1);
+  EXPECT_EQ(g_onModels1, 2);
+  EXPECT_EQ(g_onModels2, 2);
+
+  // Reset bool reference, so now only g_onModels2 should increment
+  g_Connection1.reset();
+
+  common::ModelDatabase::Instance()->GetModels(
+      boost::bind(&OnModels, _1));
+
+  while (g_onModels2 == 2)
+    common::Time::MSleep(500);
+
+  EXPECT_EQ(g_onModels, 1);
+  EXPECT_EQ(g_onModels1, 2);
+  EXPECT_EQ(g_onModels2, 3);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/multicamera_sensor.cc b/test/integration/multicamera_sensor.cc
new file mode 100644
index 0000000..8d2914e
--- /dev/null
+++ b/test/integration/multicamera_sensor.cc
@@ -0,0 +1,321 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "gazebo/common/common.hh"
+#include "gazebo/common/Timer.hh"
+#include "gazebo/rendering/Camera.hh"
+#include "gazebo/sensors/MultiCameraSensor.hh"
+
+#include "ServerFixture.hh"
+#include "scans_cmp.h"
+
+using namespace gazebo;
+class MultiCameraSensor : public ServerFixture
+{
+};
+
+unsigned char* img0Left = NULL;
+unsigned char* imgt = NULL;
+unsigned char* img1Left = NULL;
+unsigned char* img2Left = NULL;
+unsigned char* img0Right = NULL;
+unsigned char* img1Right = NULL;
+unsigned char* img2Right = NULL;
+int imageCount0Left = 0;
+int imageCountt = 0;
+int imageCount1Left = 0;
+int imageCount2Left = 0;
+int imageCount0Right = 0;
+int imageCount1Right = 0;
+int imageCount2Right = 0;
+
+/////////////////////////////////////////////////
+void OnNewFrameTest(int* _imageCounter, unsigned char* _imageDest,
+                  const unsigned char *_image,
+                  unsigned int _width, unsigned int _height,
+                  unsigned int _depth,
+                  const std::string &/*_format*/)
+{
+  memcpy(_imageDest, _image, _width * _height * _depth);
+  *_imageCounter += 1;
+}
+
+/////////////////////////////////////////////////
+TEST_F(MultiCameraSensor, CameraRotationTest)
+{
+  Load("worlds/camera_rotation_test.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run camera test\n";
+    return;
+  }
+
+  // get two cameras, one with rotation and one without.
+  std::string cameraUnrotated = "multicamera_sensor_unrotated";
+  std::string cameraTranslated = "multicamera_sensor_translated";
+  std::string cameraRotated1 = "multicamera_sensor_rotated1";
+  std::string cameraRotated2 = "multicamera_sensor_rotated2";
+
+  sensors::SensorPtr sensor = sensors::get_sensor(cameraUnrotated);
+  sensors::MultiCameraSensorPtr camSensorUnrotated =
+    boost::dynamic_pointer_cast<sensors::MultiCameraSensor>(sensor);
+
+  sensor = sensors::get_sensor(cameraTranslated);
+  sensors::CameraSensorPtr camSensorTranslated =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+
+  sensor = sensors::get_sensor(cameraRotated1);
+  sensors::MultiCameraSensorPtr camSensorRotated1 =
+    boost::dynamic_pointer_cast<sensors::MultiCameraSensor>(sensor);
+
+  sensor = sensors::get_sensor(cameraRotated2);
+  sensors::MultiCameraSensorPtr camSensorRotated2 =
+    boost::dynamic_pointer_cast<sensors::MultiCameraSensor>(sensor);
+
+  unsigned int width  = 1024;
+  unsigned int height = 544;
+  unsigned int depth = 3;
+
+  // initialize global variables
+  imageCount0Left  = 0;
+  imageCountt  = 0;
+  imageCount1Left  = 0;
+  imageCount2Left  = 0;
+  imageCount0Right = 0;
+  imageCount1Right = 0;
+  imageCount2Right = 0;
+  img0Left = new unsigned char[width * height * depth];
+  imgt = new unsigned char[width * height * depth];
+  img1Left = new unsigned char[width * height * depth];
+  img2Left = new unsigned char[width * height * depth];
+  img0Right = new unsigned char[width * height * depth];
+  img1Right = new unsigned char[width * height * depth];
+  img2Right = new unsigned char[width * height * depth];
+
+  {
+    // connect to camera image updates
+    event::ConnectionPtr c0Left =
+      camSensorUnrotated->GetCamera(0)->ConnectNewImageFrame(
+          boost::bind(&::OnNewFrameTest, &imageCount0Left, img0Left,
+            _1, _2, _3, _4, _5));
+    event::ConnectionPtr ct =
+      camSensorTranslated->GetCamera()->ConnectNewImageFrame(
+          boost::bind(&::OnNewFrameTest, &imageCountt, imgt,
+            _1, _2, _3, _4, _5));
+    event::ConnectionPtr c1Left =
+      camSensorRotated1->GetCamera(0)->ConnectNewImageFrame(
+          boost::bind(&::OnNewFrameTest, &imageCount1Left, img1Left,
+            _1, _2, _3, _4, _5));
+    event::ConnectionPtr c2Left =
+      camSensorRotated2->GetCamera(0)->ConnectNewImageFrame(
+          boost::bind(&::OnNewFrameTest, &imageCount2Left, img2Left,
+            _1, _2, _3, _4, _5));
+
+    event::ConnectionPtr c0Right =
+      camSensorUnrotated->GetCamera(1)->ConnectNewImageFrame(
+          boost::bind(&::OnNewFrameTest, &imageCount0Right, img0Right,
+            _1, _2, _3, _4, _5));
+    event::ConnectionPtr c1Right =
+      camSensorRotated1->GetCamera(1)->ConnectNewImageFrame(
+          boost::bind(&::OnNewFrameTest, &imageCount1Right, img1Right,
+            _1, _2, _3, _4, _5));
+    event::ConnectionPtr c2Right =
+      camSensorRotated2->GetCamera(1)->ConnectNewImageFrame(
+          boost::bind(&::OnNewFrameTest, &imageCount2Right, img2Right,
+            _1, _2, _3, _4, _5));
+
+    // activate camera
+    camSensorUnrotated->SetActive(true);
+    camSensorTranslated->SetActive(true);
+    camSensorRotated1->SetActive(true);
+    camSensorRotated2->SetActive(true);
+
+    // Get at least 10 images from each camera
+    int waitCount = 0;
+    while (imageCount0Left < 10 || imageCountt < 10 ||
+           imageCount1Left < 10 || imageCount2Left < 10 ||
+           imageCount0Right < 10 ||
+           imageCount1Right < 10 || imageCount2Right < 10)
+    {
+      // wait at most 10 seconds sim time.
+      if (++waitCount >= 1000)
+        gzerr << "Err [" << imageCount0Left
+              << "/10, " << imageCountt
+              << "/10, " << imageCount1Left
+              << "/10, " << imageCount2Left
+              << "/10, " << imageCount0Right
+              << "/10, " << imageCount1Right
+              << "/10, " << imageCount2Right
+              << "/10] images received from cameras\n";
+      EXPECT_LT(waitCount, 1000);
+
+      common::Time::MSleep(10);
+    }
+
+    // compare unrotated left against translated left, both should be
+    // seeing the green block, if not, pose translation in <camera> tag
+    // is broken.
+    // Note, right camera of translated camera (imgtRight) should also
+    // see green block.
+    {
+      unsigned int diffMax = 0, diffSum = 0;
+      double diffAvg = 0.0;
+
+      // compare left images
+      this->ImageCompare(img0Left, imgt, width, height, depth,
+                         diffMax, diffSum, diffAvg);
+
+      // We expect that there will be some non-zero difference between the two
+      // images.
+      EXPECT_EQ(diffSum, 0u);
+
+      // We expect that the average difference will be well within 3-sigma.
+      EXPECT_NEAR(diffAvg/255., 0.0, 1e-16);
+    }
+
+    // compare unrotated left against translated left, both should be
+    // seeing the green block, if not, pose translation in <camera> tag
+    // is broken.
+    // Note, right camera of translated camera (imgtRight) should also
+    // see green block.
+    {
+      unsigned int diffMax = 0, diffSum = 0;
+      double diffAvg = -1.0;
+
+      // compare right of translated camera to
+      // right of unrotated/untranslated camera images
+      // the result should differ as former sees green block and latter
+      // sees red block.
+      this->ImageCompare(img0Right, imgt, width, height, depth,
+                         diffMax, diffSum, diffAvg);
+
+      // use below to construct test for rotated2 left camera offset
+      // math::Quaternion a(1.2, 1.3, 1.4);
+      // gzerr << "test: " << a.RotateVector(math::Vector3(0, 1, 0)) << "\n";
+
+      // We expect that there will be some non-zero difference between the two
+      // images.
+      EXPECT_GT(diffSum, 100u);
+
+      // We expect that the average difference will be well within 3-sigma.
+      EXPECT_GT(fabs(diffAvg)/255., 0.0549);
+    }
+
+    // compare unrotated against rotated1
+    {
+      unsigned int diffMax = 0, diffSum = 0;
+      double diffAvg = 0.0;
+
+      // compare left images
+      this->ImageCompare(img0Left, img1Left, width, height, depth,
+                         diffMax, diffSum, diffAvg);
+
+      // We expect that there will be some non-zero difference between the two
+      // images.
+      EXPECT_EQ(diffSum, 0u);
+
+      // We expect that the average difference will be well within 3-sigma.
+      EXPECT_NEAR(diffAvg/255., 0.0, 1e-16);
+    }
+
+    // compare unrotated against rotated1
+    {
+      unsigned int diffMax = 0, diffSum = 0;
+      double diffAvg = 0.0;
+      // compare right images
+      this->ImageCompare(img0Right, img1Right, width, height, depth,
+                         diffMax, diffSum, diffAvg);
+
+      // We expect that there will be some non-zero difference between the two
+      // images.
+      EXPECT_EQ(diffSum, 0u);
+
+      // We expect that the average difference will be well within 3-sigma.
+      EXPECT_NEAR(diffAvg/255., 0.0, 1e-16);
+    }
+
+    // compare unrotated against rotated2
+    {
+      unsigned int diffMax = 0, diffSum = 0;
+      double diffAvg = 0.0;
+
+      // compare left images
+      this->ImageCompare(img0Left, img2Left, width, height, depth,
+                         diffMax, diffSum, diffAvg);
+
+      // We expect that there will be some non-zero difference between the two
+      // images.
+      EXPECT_EQ(diffSum, 0u);
+
+      // We expect that the average difference will be well within 3-sigma.
+      EXPECT_NEAR(diffAvg/255., 0.0, 1e-16);
+    }
+
+    // compare unrotated against rotated2
+    {
+      unsigned int diffMax = 0, diffSum = 0;
+      double diffAvg = 0.0;
+
+      // compare right images
+      this->ImageCompare(img0Right, img2Right, width, height, depth,
+                         diffMax, diffSum, diffAvg);
+
+      // We expect that there will be some non-zero difference between the two
+      // images.
+      EXPECT_EQ(diffSum, 0u);
+
+      // We expect that the average difference will be well within 3-sigma.
+      EXPECT_NEAR(diffAvg/255., 0.0, 1e-16);
+    }
+
+    // activate camera
+    camSensorUnrotated->SetActive(false);
+    camSensorTranslated->SetActive(false);
+    camSensorRotated1->SetActive(false);
+    camSensorRotated2->SetActive(false);
+
+    // disconnect callbacks
+    camSensorUnrotated->GetCamera(0)->DisconnectNewImageFrame(c0Left);
+    camSensorTranslated->GetCamera()->DisconnectNewImageFrame(ct);
+    camSensorRotated1->GetCamera(0)->DisconnectNewImageFrame(c1Left);
+    camSensorRotated2->GetCamera(0)->DisconnectNewImageFrame(c2Left);
+    camSensorUnrotated->GetCamera(1)->DisconnectNewImageFrame(c0Right);
+    camSensorRotated1->GetCamera(1)->DisconnectNewImageFrame(c1Right);
+    camSensorRotated2->GetCamera(1)->DisconnectNewImageFrame(c2Right);
+  }
+
+  // cleanup
+  delete[] img0Left;
+  delete[] imgt;
+  delete[] img1Left;
+  delete[] img2Left;
+  delete[] img0Right;
+  delete[] img1Right;
+  delete[] img2Right;
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/noise.cc b/test/integration/noise.cc
new file mode 100644
index 0000000..5085021
--- /dev/null
+++ b/test/integration/noise.cc
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "gazebo/common/common.hh"
+#include "helper_physics_generator.hh"
+
+#define LASER_TOL 1e-5
+#define DOUBLE_TOL 1e-6
+
+using namespace gazebo;
+class NoiseTest : public ServerFixture,
+                  public testing::WithParamInterface<const char*>
+{
+  public: void NoisePlugin(const std::string &_physicsEngine);
+};
+
+
+void NoiseTest::NoisePlugin(const std::string &_physicsEngine)
+{
+  // Test ray sensor with noise applied
+  Load("worlds/empty.world", false, _physicsEngine);
+
+  std::string raySensorName = "raySensor";
+  std::string modelName = "rayModel";
+  std::string pluginFileName = "libRaySensorNoisePlugin.so";
+  double maxRange = 5.0;
+
+  msgs::Factory msg;
+  std::ostringstream newModelStr;
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='" << modelName << "'>"
+    << "<static>true</static>"
+    << "<pose> 0 0 0.5 0 0 0 </pose>"
+    << "<link name ='body'>"
+    << "<collision name='parent_collision'>"
+    << "  <geometry>"
+    << "    <cylinder>"
+    << "      <radius>0.02</radius>"
+    << "      <length>0.03</length>"
+    << "    </cylinder>"
+    << "  </geometry>"
+    << "</collision>"
+    << "  <sensor name ='" << raySensorName << "' type ='ray'>"
+    << "    <ray>"
+    << "      <scan>"
+    << "        <horizontal>"
+    << "          <samples>100</samples>"
+    << "          <resolution>1</resolution>"
+    << "          <min_angle>-1</min_angle>"
+    << "          <max_angle>1</max_angle>"
+    << "        </horizontal>"
+    << "      </scan>"
+    << "      <range>"
+    << "        <min>0.1</min>"
+    << "        <max>" << maxRange << "</max>"
+    << "      </range>"
+    << "      <noise>"
+    << "        <type>custom</type>"
+    << "      </noise>"
+    << "    </ray>"
+    << "    <plugin name ='laser' filename='" << pluginFileName << "'>"
+    << "  </sensor>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+
+  msg.set_sdf(newModelStr.str());
+  this->factoryPub->Publish(msg);
+
+  WaitUntilEntitySpawn(modelName, 100, 100);
+  WaitUntilSensorSpawn(raySensorName, 100, 100);
+
+  sensors::SensorPtr sensor = sensors::get_sensor(raySensorName);
+  sensors::RaySensorPtr raySensor =
+    boost::dynamic_pointer_cast<sensors::RaySensor>(sensor);
+
+  EXPECT_TRUE(raySensor != NULL);
+
+  raySensor->Init();
+  raySensor->Update(true);
+
+  // Expect at least one value to be non-max (empty world).
+  // Expect the range to be within (max-noise) < max < (max+noise), see
+  // custom noise model in RaySensorNoisePlugin.
+  // Noise rate value also taken directly from plugin.
+  bool foundNoise = false;
+  double fixedNoiseRate = 0.005;
+  double noise = maxRange*fixedNoiseRate;
+  for (int i = 0; i < raySensor->GetRayCount(); ++i)
+  {
+    double range = raySensor->GetRange(i);
+    if (fabs(range - maxRange) > LASER_TOL)
+      foundNoise = true;
+
+    EXPECT_TRUE(range >= maxRange - noise);
+    EXPECT_TRUE(range <= maxRange + noise);
+  }
+  EXPECT_TRUE(foundNoise);
+}
+
+TEST_P(NoiseTest, NoisePlugin)
+{
+  NoisePlugin(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, NoiseTest, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/nondefault_world.cc b/test/integration/nondefault_world.cc
new file mode 100644
index 0000000..993705a
--- /dev/null
+++ b/test/integration/nondefault_world.cc
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string.h>
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+class NonDefaultWorld : public ServerFixture,
+                        public testing::WithParamInterface<const char*>
+{
+  public: void Load(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void NonDefaultWorld::Load(const std::string &_physicsEngine)
+{
+  ServerFixture::Load("worlds/empty_different_name.world", false,
+    _physicsEngine);
+  physics::WorldPtr world = physics::get_world("not_the_default_world_name");
+  ASSERT_TRUE(world != NULL);
+
+  physics::ModelPtr model = world->GetModel("ground_plane");
+  ASSERT_TRUE(model);
+}
+
+TEST_P(NonDefaultWorld, Load)
+{
+  Load(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, NonDefaultWorld,
+                        PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/ogre_log.cc b/test/integration/ogre_log.cc
new file mode 100644
index 0000000..5a45ca7
--- /dev/null
+++ b/test/integration/ogre_log.cc
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <boost/filesystem.hpp>
+#include <fstream>
+
+#include "ServerFixture.hh"
+
+class OgreLog : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+TEST_F(OgreLog, PubSub)
+{
+  Load("worlds/empty.world");
+
+  boost::filesystem::path logPath =
+    common::SystemPaths::Instance()->GetLogPath();
+  logPath /= "ogre.log";
+  std::ifstream ogreLog(logPath.string().c_str(), std::ios::in);
+  ASSERT_TRUE(ogreLog.is_open());
+
+  while (!ogreLog.eof())
+  {
+    std::string line;
+    std::getline(ogreLog, line);
+    EXPECT_EQ(line.find("Error"), std::string::npos);
+    EXPECT_EQ(line.find("error"), std::string::npos);
+    EXPECT_EQ(line.find("ERROR"), std::string::npos);
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/physics.cc b/test/integration/physics.cc
new file mode 100644
index 0000000..2908043
--- /dev/null
+++ b/test/integration/physics.cc
@@ -0,0 +1,1352 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "SimplePendulumIntegrator.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "helper_physics_generator.hh"
+
+#define PHYSICS_TOL 1e-2
+using namespace gazebo;
+
+class PhysicsTest : public ServerFixture,
+                    public testing::WithParamInterface<const char*>
+{
+  public: void InelasticCollision(const std::string &_physicsEngine);
+  public: void EmptyWorld(const std::string &_physicsEngine);
+  public: void SpawnDrop(const std::string &_physicsEngine);
+  public: void SpawnDropCoGOffset(const std::string &_physicsEngine);
+  public: void SphereAtlasLargeError(const std::string &_physicsEngine);
+  public: void CollisionFiltering(const std::string &_physicsEngine);
+  public: void JointDampingTest(const std::string &_physicsEngine);
+  public: void DropStuff(const std::string &_physicsEngine);
+};
+
+////////////////////////////////////////////////////////////////////////
+// EmptyWorld:
+// Load a world, take a few steps, and verify that time is increasing.
+// This is the most basic physics engine test.
+////////////////////////////////////////////////////////////////////////
+void PhysicsTest::EmptyWorld(const std::string &_physicsEngine)
+{
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+  // verify that time moves forward
+  EXPECT_GT(t, 0);
+
+  // simulate a few steps
+  int steps = 20;
+  world->Step(steps);
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  t = world->GetSimTime().Double();
+  EXPECT_GT(t, 0.99*dt*static_cast<double>(steps+1));
+}
+
+TEST_P(PhysicsTest, EmptyWorld)
+{
+  EmptyWorld(GetParam());
+}
+
+////////////////////////////////////////////////////////////////////////
+// SpawnDrop:
+// Load a world, check that gravity points along z axis, spawn simple
+// shapes (box, sphere, cylinder), verify that they fall and hit the
+// ground plane. The test currently assumes inelastic collisions.
+////////////////////////////////////////////////////////////////////////
+void PhysicsTest::SpawnDrop(const std::string &_physicsEngine)
+{
+  // load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // check the gravity vector
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  math::Vector3 g = physics->GetGravity();
+  // Assume gravity vector points down z axis only.
+  EXPECT_EQ(g.x, 0);
+  EXPECT_EQ(g.y, 0);
+  EXPECT_LE(g.z, -9.8);
+
+  // get physics time step
+  double dt = physics->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+
+  // spawn some simple shapes and check to see that they start falling
+  double z0 = 3;
+  std::map<std::string, math::Vector3> modelPos;
+  modelPos["test_box"] = math::Vector3(0, 0, z0);
+  modelPos["test_sphere"] = math::Vector3(4, 0, z0);
+  modelPos["test_cylinder"] = math::Vector3(8, 0, z0);
+  modelPos["test_empty"] = math::Vector3(12, 0, z0);
+  modelPos["link_offset_box"] = math::Vector3(0, 0, z0);
+
+  // FIXME Trimesh drop test passes in bullet but fails in ode because
+  // the mesh bounces to the side when it hits the ground.
+  // See issue #513. Uncomment test when issue is resolved.
+  // modelPos["test_trimesh"] = math::Vector3(16, 0, z0);
+
+  SpawnBox("test_box", math::Vector3(1, 1, 1), modelPos["test_box"],
+      math::Vector3::Zero);
+  SpawnSphere("test_sphere", modelPos["test_sphere"], math::Vector3::Zero);
+  SpawnCylinder("test_cylinder", modelPos["test_cylinder"],
+      math::Vector3::Zero);
+  SpawnEmptyLink("test_empty", modelPos["test_empty"], math::Vector3::Zero);
+
+  std::ostringstream linkOffsetStream;
+  math::Pose linkOffsetPose1(0, 0, z0, 0, 0, 0);
+  math::Pose linkOffsetPose2(1000, 1000, 0, 0, 0, 0);
+  math::Vector3 linkOffsetSize(1, 1, 1);
+  linkOffsetStream << "<sdf version='" << SDF_VERSION << "'>"
+    << "<model name ='link_offset_box'>"
+    << "<pose>" << linkOffsetPose1 << "</pose>"
+    << "<allow_auto_disable>false</allow_auto_disable>"
+    << "<link name ='body'>"
+    << "  <pose>" << linkOffsetPose2 << "</pose>"
+    << "  <inertial>"
+    << "    <mass>4.0</mass>"
+    << "    <inertia>"
+    << "      <ixx>0.1667</ixx> <ixy>0.0</ixy> <ixz>0.0</ixz>"
+    << "      <iyy>0.1667</iyy> <iyz>0.0</iyz>"
+    << "      <izz>0.1667</izz>"
+    << "    </inertia>"
+    << "  </inertial>"
+    << "  <collision name ='geom'>"
+    << "    <geometry>"
+    << "      <box><size>" << linkOffsetSize << "</size></box>"
+    << "    </geometry>"
+    << "  </collision>"
+    << "  <visual name ='visual'>"
+    << "    <geometry>"
+    << "      <box><size>" << linkOffsetSize << "</size></box>"
+    << "    </geometry>"
+    << "  </visual>"
+    << "</link>"
+    << "</model>"
+    << "</sdf>";
+  SpawnSDF(linkOffsetStream.str());
+
+  /// \TODO: bullet needs this to pass
+  if (physics->GetType()  == "bullet")
+    physics->SetParam("iters", 300);
+
+  // std::string trimeshPath =
+  //    "file://media/models/cube_20k/meshes/cube_20k.stl";
+  // SpawnTrimesh("test_trimesh", trimeshPath, math::Vector3(0.5, 0.5, 0.5),
+  //    modelPos["test_trimesh"], math::Vector3::Zero);
+
+  int steps = 2;
+  physics::ModelPtr model;
+  math::Pose pose1, pose2;
+  math::Vector3 vel1, vel2;
+
+  double t, x0 = 0;
+  // This loop steps the world forward and makes sure that each model falls,
+  // expecting downward z velocity and decreasing z position.
+  for (std::map<std::string, math::Vector3>::iterator iter = modelPos.begin();
+    iter != modelPos.end(); ++iter)
+  {
+    std::string name = iter->first;
+    // Make sure the model is loaded
+    model = world->GetModel(name);
+    if (model != NULL)
+    {
+      gzdbg << "Check freefall of model " << name << '\n';
+      // Step once and check downward z velocity
+      world->Step(1);
+      vel1 = model->GetWorldLinearVel();
+      t = world->GetSimTime().Double();
+      EXPECT_EQ(vel1.x, 0);
+      EXPECT_EQ(vel1.y, 0);
+      EXPECT_NEAR(vel1.z, g.z*t, -g.z*t*PHYSICS_TOL);
+      // Need to step at least twice to check decreasing z position
+      world->Step(steps - 1);
+      pose1 = model->GetWorldPose();
+      x0 = modelPos[name].x;
+      EXPECT_EQ(pose1.pos.x, x0);
+      EXPECT_EQ(pose1.pos.y, 0);
+      EXPECT_NEAR(pose1.pos.z, z0 + g.z/2*t*t, (z0+g.z/2*t*t)*PHYSICS_TOL);
+      // Check once more and just make sure they keep falling
+      world->Step(steps);
+      vel2 = model->GetWorldLinearVel();
+      pose2 = model->GetWorldPose();
+      EXPECT_LT(vel2.z, vel1.z);
+      EXPECT_LT(pose2.pos.z, pose1.pos.z);
+
+      // if (physics->GetType()  == "bullet")
+      // {
+      //   gzerr << "m[" << model->GetName()
+      //         << "] p[" << model->GetWorldPose()
+      //         << "] v[" << model->GetWorldLinearVel()
+      //         << "]\n";
+
+      //   gzerr << "wait: ";
+      //   getchar();
+      // }
+    }
+    else
+    {
+      gzerr << "Error loading model " << name << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+
+  // Predict time of contact with ground plane.
+  double tHit = sqrt(2*(z0-0.5) / (-g.z));
+  // Time to advance, allow 0.5 s settling time.
+  // This assumes inelastic collisions with the ground.
+  double dtHit = tHit+0.5 - world->GetSimTime().Double();
+  steps = ceil(dtHit / dt);
+  EXPECT_GT(steps, 0);
+
+  world->Step(steps);
+
+  // debug
+  // for (int i = 0; i < steps; ++i)
+  // {
+  //   world->Step(1);
+  //   if (physics->GetType()  == "bullet")
+  //   {
+  //     model = world->GetModel("link_offset_box");
+  //     gzerr << "m[" << model->GetName()
+  //           << "] i[" << i << "/" << steps
+  //           << "] pm[" << model->GetWorldPose()
+  //           << "] pb[" << model->GetLink("body")->GetWorldPose()
+  //           << "] v[" << model->GetWorldLinearVel()
+  //           << "]\n";
+
+  //     if (model->GetWorldPose().pos.z < 0.6)
+  //     {
+  //       gzerr << "wait: ";
+  //       getchar();
+  //     }
+  //   }
+  // }
+
+  // This loop checks the velocity and pose of each model 0.5 seconds
+  // after the time of predicted ground contact. The velocity is expected
+  // to be small, and the pose is expected to be underneath the initial pose.
+  for (std::map<std::string, math::Vector3>::iterator iter = modelPos.begin();
+    iter != modelPos.end(); ++iter)
+  {
+    std::string name = iter->first;
+    // Make sure the model is loaded
+    model = world->GetModel(name);
+    if (model != NULL)
+    {
+      gzdbg << "Check ground contact of model " << name << '\n';
+      // Check that velocity is small
+      vel1 = model->GetWorldLinearVel();
+      t = world->GetSimTime().Double();
+      EXPECT_NEAR(vel1.x, 0, PHYSICS_TOL);
+      EXPECT_NEAR(vel1.y, 0, PHYSICS_TOL);
+      if (name == "test_empty")
+        EXPECT_NEAR(vel1.z, g.z*t, -g.z*t*PHYSICS_TOL);
+      else
+        EXPECT_NEAR(vel1.z, 0, PHYSICS_TOL);
+
+      // Check that model is resting on ground
+      pose1 = model->GetWorldPose();
+      x0 = modelPos[name].x;
+      // issue \#848: failure with bullet 2.81
+      // make this if statement unconditional when \#848 is resolved
+      if (!(name == "link_offset_box" && _physicsEngine == "bullet"
+          && LIBBULLET_VERSION < 2.82))
+      {
+        EXPECT_NEAR(pose1.pos.x, x0, PHYSICS_TOL);
+        EXPECT_NEAR(pose1.pos.y, 0, PHYSICS_TOL);
+      }
+
+      // debug
+      // if (physics->GetType()  == "bullet")
+      // {
+      //   gzerr << "m[" << model->GetName()
+      //         << "] p[" << model->GetWorldPose()
+      //         << "] v[" << model->GetWorldLinearVel()
+      //         << "]\n";
+
+      //   gzerr << "wait: ";
+      //   getchar();
+      // }
+
+      if (name == "test_empty")
+      {
+        EXPECT_NEAR(pose1.pos.z, z0+g.z/2*t*t,
+            fabs((z0+g.z/2*t*t)*PHYSICS_TOL));
+      }
+      else
+        EXPECT_NEAR(pose1.pos.z, 0.5, PHYSICS_TOL);
+    }
+    else
+    {
+      gzerr << "Error loading model " << name << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+
+  // Compute and check link pose of link_offset_box
+  gzdbg << "Check link pose of link_offset_box\n";
+  model = world->GetModel("link_offset_box");
+  ASSERT_TRUE(model);
+  physics::LinkPtr link = model->GetLink();
+  ASSERT_TRUE(link);
+  // relative pose of link in linkOffsetPose2
+  for (int i = 0; i < 20; ++i)
+  {
+    pose1 = model->GetWorldPose();
+    pose2 = linkOffsetPose2 + pose1;
+    EXPECT_NEAR(pose2.pos.x, linkOffsetPose2.pos.x, PHYSICS_TOL);
+    EXPECT_NEAR(pose2.pos.y, linkOffsetPose2.pos.y, PHYSICS_TOL);
+    EXPECT_NEAR(pose2.pos.z, 0.5, PHYSICS_TOL);
+    world->Step(1);
+  }
+}
+
+TEST_P(PhysicsTest, SpawnDrop)
+{
+  SpawnDrop(GetParam());
+}
+
+////////////////////////////////////////////////////////////////////////
+// SpawnDropCoGOffset:
+// Load a world, check that gravity points along z axis, spawn several
+// spheres of varying radii and center of gravity (cg) location.
+//  sphere1: smaller radius, centered cg
+//  sphere2: larger radius, centered cg
+//  sphere3: larger radius, lowered cg
+//  sphere4: larger radius, raised cg
+//  sphere5: larger radius, y offset cg
+//  sphere6: larger radius, x offset cg
+//  sphere7: larger radius, 45 deg offset cg
+//  sphere8: larger radius, -30 deg offset cg
+// The bottom of each sphere is at the same height, and it is verified
+// that they hit the ground at the same time. Also, sphere5 should start
+// rolling to the side when it hits the ground.
+////////////////////////////////////////////////////////////////////////
+void PhysicsTest::SpawnDropCoGOffset(const std::string &_physicsEngine)
+{
+  // load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // check the gravity vector
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  math::Vector3 g = physics->GetGravity();
+  // Assume gravity vector points down z axis only.
+  EXPECT_EQ(g.x, 0);
+  EXPECT_EQ(g.y, 0);
+  EXPECT_LT(g.z, 0);
+
+  // get physics time step
+  double dt = physics->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+
+  // spawn some spheres and check to see that they start falling
+  double z0 = 3;
+  double r1 = 0.5, r2 = 1.5;
+  math::Vector3 v30 = math::Vector3::Zero;
+  math::Vector3 cog;
+  math::Angle angle;
+
+  std::vector<std::string> modelNames;
+  std::vector<double> x0s;
+  std::vector<double> y0s;
+  std::vector<double> radii;
+  std::vector<math::Vector3> cogs;
+
+  // sphere1 and sphere2 have c.g. at center of sphere, different sizes
+  modelNames.push_back("small_centered_sphere");
+  x0s.push_back(0);
+  y0s.push_back(0);
+  radii.push_back(r1);
+  cogs.push_back(v30);
+
+  modelNames.push_back("large_centered_sphere");
+  x0s.push_back(4);
+  y0s.push_back(0);
+  radii.push_back(r2);
+  cogs.push_back(v30);
+
+  // sphere3 has c.g. below the center
+  modelNames.push_back("lowered_cog_sphere");
+  x0s.push_back(8);
+  y0s.push_back(0);
+  radii.push_back(r2);
+  cogs.push_back(math::Vector3(0, 0, -r1));
+
+  // sphere4 has c.g. above the center
+  modelNames.push_back("raised_cog_sphere");
+  x0s.push_back(-4);
+  y0s.push_back(0);
+  radii.push_back(r2);
+  cogs.push_back(math::Vector3(0, 0, r1));
+
+  // sphere5 has c.g. to the side along y axis; it will roll
+  modelNames.push_back("cog_y_offset_sphere");
+  x0s.push_back(-8);
+  y0s.push_back(0);
+  radii.push_back(r2);
+  cogs.push_back(math::Vector3(0, r1, 0));
+
+  // sphere6 has c.g. to the side along x axis; it will roll
+  modelNames.push_back("cog_x_offset_sphere");
+  x0s.push_back(15);
+  y0s.push_back(0);
+  radii.push_back(r2);
+  cogs.push_back(math::Vector3(r1, 0, 0));
+
+  // sphere7 has c.g. to the side diagonally; it will roll
+  modelNames.push_back("cog_xy_45deg_offset_sphere");
+  x0s.push_back(0);
+  y0s.push_back(8);
+  radii.push_back(r2);
+  angle.SetFromDegree(45);
+  cogs.push_back(math::Vector3(r1*cos(angle.Radian()),
+                               r1*sin(angle.Radian()), 0));
+
+  // sphere8 has c.g. to the side diagonally; it will roll
+  modelNames.push_back("cog_xy_-30deg_offset_sphere");
+  x0s.push_back(0);
+  y0s.push_back(-8);
+  radii.push_back(r2);
+  angle.SetFromDegree(-30);
+  cogs.push_back(math::Vector3(r1*cos(angle.Radian()),
+                               r1*sin(angle.Radian()), 0));
+
+  unsigned int i;
+  for (i = 0; i < modelNames.size(); ++i)
+  {
+    SpawnSphere(modelNames[i], math::Vector3(x0s[i], y0s[i], z0+radii[i]),
+                v30, cogs[i], radii[i]);
+  }
+
+  int steps = 2;
+  physics::ModelPtr model;
+  math::Pose pose1, pose2;
+  math::Vector3 vel1, vel2;
+
+  double t, x0 = 0, y0 = 0, radius;
+  // This loop steps the world forward and makes sure that each model falls,
+  // expecting downward z velocity and decreasing z position.
+  for (i = 0; i < modelNames.size(); ++i)
+  {
+    // Make sure the model is loaded
+    model = world->GetModel(modelNames[i]);
+    x0 = x0s[i];
+    y0 = y0s[i];
+    radius = radii[i];
+    if (model != NULL)
+    {
+      gzdbg << "Check freefall of model " << modelNames[i] << '\n';
+      // Step once and check downward z velocity
+      world->Step(1);
+      vel1 = model->GetWorldLinearVel();
+      t = world->GetSimTime().Double();
+      EXPECT_NEAR(vel1.x, 0, 1e-16);
+      EXPECT_NEAR(vel1.y, 0, 1e-16);
+      EXPECT_NEAR(vel1.z, g.z*t, -g.z*t*PHYSICS_TOL);
+      // Need to step at least twice to check decreasing z position
+      world->Step(steps - 1);
+      pose1 = model->GetWorldPose();
+      EXPECT_NEAR(pose1.pos.x, x0, PHYSICS_TOL*PHYSICS_TOL);
+      EXPECT_NEAR(pose1.pos.y, y0, PHYSICS_TOL*PHYSICS_TOL);
+      EXPECT_NEAR(pose1.pos.z, z0+radius + g.z/2*t*t,
+                  (z0+radius+g.z/2*t*t)*PHYSICS_TOL);
+
+      // Check once more and just make sure they keep falling
+      world->Step(steps);
+      vel2 = model->GetWorldLinearVel();
+      pose2 = model->GetWorldPose();
+      EXPECT_LT(vel2.z, vel1.z);
+      EXPECT_LT(pose2.pos.z, pose1.pos.z);
+    }
+    else
+    {
+      gzerr << "Error loading model " << modelNames[i] << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+
+  // Predict time of contact with ground plane.
+  double tHit = sqrt(2*(z0-0.5) / (-g.z));
+  // Time to advance, allow 0.5 s settling time.
+  // This assumes inelastic collisions with the ground.
+  double dtHit = tHit+0.5 - world->GetSimTime().Double();
+  steps = ceil(dtHit / dt);
+  EXPECT_GT(steps, 0);
+  world->Step(steps);
+
+  // This loop checks the velocity and pose of each model 0.5 seconds
+  // after the time of predicted ground contact. Except for sphere5,
+  // the velocity is expected to be small, and the pose is expected
+  // to be underneath the initial pose. sphere5 is expected to be rolling.
+  for (i = 0; i < modelNames.size(); ++i)
+  {
+    // Make sure the model is loaded
+    model = world->GetModel(modelNames[i]);
+    x0 = x0s[i];
+    y0 = y0s[i];
+    radius = radii[i];
+    cog = cogs[i];
+    if (model != NULL)
+    {
+      gzdbg << "Check ground contact and roll without slip of model "
+            << modelNames[i] << '\n';
+
+      // Check that velocity is small
+      vel1 = model->GetWorldLinearVel();
+      vel2 = model->GetWorldAngularVel();
+
+      // vertical component of linear and angular velocity should be small
+      EXPECT_NEAR(vel1.z, 0, PHYSICS_TOL);
+      EXPECT_NEAR(vel2.z, 0, PHYSICS_TOL);
+
+      // expect small values for directions with no offset
+      if (cog.x == 0)
+      {
+        EXPECT_NEAR(vel1.x, 0, PHYSICS_TOL);
+        EXPECT_NEAR(vel2.y, 0, PHYSICS_TOL);
+      }
+      // expect rolling in direction of cog offset
+      else
+      {
+        EXPECT_GT(vel1.x*cog.x, 0.2*cog.x*cog.x);
+        EXPECT_GT(vel2.y*cog.x, 0.2*cog.x*cog.x);
+      }
+
+      if (cog.y == 0)
+      {
+        EXPECT_NEAR(vel1.y, 0, PHYSICS_TOL);
+        EXPECT_NEAR(vel2.x, 0, PHYSICS_TOL);
+      }
+      else
+      {
+        EXPECT_GT(vel1.y*cog.y,  0.2*cog.y*cog.y);
+        EXPECT_LT(vel2.x*cog.y, -0.2*cog.y*cog.y);
+      }
+
+      // Expect roll without slip
+      EXPECT_NEAR(vel1.x,  vel2.y*radius, PHYSICS_TOL);
+      EXPECT_NEAR(vel1.y, -vel2.x*radius, PHYSICS_TOL);
+
+      // Use GetWorldLinearVel with global offset to check roll without slip
+      // Expect small linear velocity at contact point
+      math::Vector3 vel3 = model->GetLink()->GetWorldLinearVel(
+          math::Vector3(0, 0, -radius), math::Quaternion(0, 0, 0));
+      EXPECT_NEAR(vel3.x, 0, PHYSICS_TOL);
+      EXPECT_NEAR(vel3.y, 0, PHYSICS_TOL);
+      EXPECT_NEAR(vel3.z, 0, PHYSICS_TOL);
+      // Expect speed at top of sphere to be double the speed at center
+      math::Vector3 vel4 = model->GetLink()->GetWorldLinearVel(
+          math::Vector3(0, 0, radius), math::Quaternion(0, 0, 0));
+      EXPECT_NEAR(vel4.y, 2*vel1.y, PHYSICS_TOL);
+      EXPECT_NEAR(vel4.x, 2*vel1.x, PHYSICS_TOL);
+      EXPECT_NEAR(vel4.z, 0, PHYSICS_TOL);
+
+      // Check that model is resting on ground
+      pose1 = model->GetWorldPose();
+      EXPECT_NEAR(pose1.pos.z, radius, PHYSICS_TOL);
+
+      // expect no pose change for directions with no offset
+      if (cog.x == 0)
+      {
+        EXPECT_NEAR(pose1.pos.x, x0, PHYSICS_TOL);
+      }
+      // expect rolling in direction of cog offset
+      else
+      {
+        EXPECT_GT((pose1.pos.x-x0) * cog.x, cog.x * cog.x);
+      }
+
+      // expect no pose change for directions with no offset
+      if (cog.y == 0)
+      {
+        EXPECT_NEAR(pose1.pos.y, y0, PHYSICS_TOL);
+      }
+      // expect rolling in direction of cog offset
+      else
+      {
+        EXPECT_GT((pose1.pos.y-y0) * cog.y, cog.y * cog.y);
+      }
+    }
+    else
+    {
+      gzerr << "Error loading model " << modelNames[i] << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+}
+
+TEST_P(PhysicsTest, SpawnDropCoGOffset)
+{
+  SpawnDropCoGOffset(GetParam());
+}
+
+/// \TODO: Redo state test
+// TEST_F(PhysicsTest, State)
+// {
+  /*
+  Load("worlds/empty.world");
+  physics::WorldPtr world = physics::get_world("default");
+  EXPECT_TRUE(world != NULL);
+
+  physics::WorldState worldState = world->GetState();
+  physics::ModelState modelState = worldState.GetModelState(0);
+  physics::LinkState linkState = modelState.GetLinkState(0);
+  physics::CollisionState collisionState = linkState.GetCollisionState(0);
+
+  math::Pose pose;
+  EXPECT_EQ(1u, worldState.GetModelStateCount());
+  EXPECT_EQ(1u, modelState.GetLinkStateCount());
+  EXPECT_EQ(1u, linkState.GetCollisionStateCount());
+  EXPECT_EQ(pose, modelState.GetPose());
+  EXPECT_EQ(pose, linkState.GetPose());
+  EXPECT_EQ(pose, collisionState.GetPose());
+
+  Unload();
+  Load("worlds/shapes.world");
+  world = physics::get_world("default");
+  EXPECT_TRUE(world != NULL);
+  worldState = world->GetState();
+
+  for (unsigned int i = 0; i < worldState.GetModelStateCount(); ++i)
+  {
+    modelState = worldState.GetModelState(i);
+    if (modelState.GetName() == "plane")
+      pose.Set(math::Vector3(0, 0, 0), math::Quaternion(0, 0, 0));
+    else if (modelState.GetName() == "box")
+      pose.Set(math::Vector3(0, 0, 0.5), math::Quaternion(0, 0, 0));
+    else if (modelState.GetName() == "sphere")
+      pose.Set(math::Vector3(0, 1.5, 0.5), math::Quaternion(0, 0, 0));
+    else if (modelState.GetName() == "cylinder")
+      pose.Set(math::Vector3(0, -1.5, 0.5), math::Quaternion(0, 0, 0));
+
+    EXPECT_TRUE(pose == modelState.GetPose());
+  }
+
+  // Move the box
+  world->GetModel("box")->SetWorldPose(
+      math::Pose(math::Vector3(1, 2, 0.5), math::Quaternion(0, 0, 0)));
+
+  gazebo::common::Time::MSleep(10);
+
+  // Make sure the box has been moved
+  physics::ModelState modelState2 = world->GetState().GetModelState("box");
+  pose.Set(math::Vector3(1, 2, 0.5), math::Quaternion(0, 0, 0));
+  EXPECT_TRUE(pose == modelState2.GetPose());
+
+  // Reset world state, and check for correctness
+  world->SetState(worldState);
+  modelState2 = world->GetState().GetModelState("box");
+  pose.Set(math::Vector3(0, 0, 0.5), math::Quaternion(0, 0, 0));
+  EXPECT_TRUE(pose == modelState2.GetPose());
+  Unload();
+  */
+// }
+
+void PhysicsTest::JointDampingTest(const std::string &_physicsEngine)
+{
+  // Random seed is set to prevent brittle failures (gazebo issue #479)
+  math::Rand::SetSeed(18420503);
+  Load("worlds/damp_test.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  int i = 0;
+  while (!this->HasEntity("model_4_mass_1_ixx_1_damping_10") && i < 20)
+  {
+    common::Time::MSleep(100);
+    ++i;
+  }
+
+  if (i > 20)
+    gzthrow("Unable to get model_4_mass_1_ixx_1_damping_10");
+
+  physics::ModelPtr model = world->GetModel("model_4_mass_1_ixx_1_damping_10");
+  EXPECT_TRUE(model != NULL);
+
+  {
+    // compare against recorded data only
+    double test_duration = 1.5;
+    double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+    int steps = test_duration/dt;
+
+    for (int i = 0; i < steps; ++i)
+    {
+      world->Step(1);  // theoretical contact, but
+      // gzdbg << "box time [" << world->GetSimTime().Double()
+      //       << "] vel [" << model->GetWorldLinearVel()
+      //       << "] pose [" << model->GetWorldPose()
+      //       << "]\n";
+    }
+
+    EXPECT_EQ(world->GetSimTime().Double(), 1.5);
+
+    // This test expects a linear velocity at the CoG
+    math::Vector3 vel = model->GetLink()->GetWorldCoGLinearVel();
+    math::Pose pose = model->GetWorldPose();
+
+    EXPECT_EQ(vel.x, 0.0);
+
+    if (_physicsEngine == "dart")
+    {
+      // DART needs greater tolerance. The reason is not sure yet.
+      // Please see issue #904
+      EXPECT_NEAR(vel.y, -10.2009, 0.012);
+      EXPECT_NEAR(vel.z, -6.51755, 0.012);
+    }
+    else
+    {
+      EXPECT_NEAR(vel.y, -10.2009, PHYSICS_TOL);
+      EXPECT_NEAR(vel.z, -6.51755, PHYSICS_TOL);
+    }
+
+    EXPECT_DOUBLE_EQ(pose.pos.x, 3.0);
+    EXPECT_NEAR(pose.pos.y, 0.0, PHYSICS_TOL);
+    EXPECT_NEAR(pose.pos.z, 10.099, PHYSICS_TOL);
+    EXPECT_NEAR(pose.rot.GetAsEuler().x, 0.567334, PHYSICS_TOL);
+    EXPECT_DOUBLE_EQ(pose.rot.GetAsEuler().y, 0.0);
+    EXPECT_DOUBLE_EQ(pose.rot.GetAsEuler().z, 0.0);
+  }
+}
+
+TEST_P(PhysicsTest, JointDampingTest)
+{
+  JointDampingTest(GetParam());
+}
+
+void PhysicsTest::DropStuff(const std::string &_physicsEngine)
+{
+  Load("worlds/drop_test.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  EXPECT_TRUE(world != NULL);
+
+  int i = 0;
+  while (!this->HasEntity("cylinder") && i < 20)
+  {
+    common::Time::MSleep(100);
+    ++i;
+  }
+
+  if (i > 20)
+    gzthrow("Unable to get cylinder");
+
+  {
+    // todo: get parameters from drop_test.world
+    double test_duration = 1.5;
+    double z = 10.5;
+    double v = 0.0;
+    double g = -10.0;
+    double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+
+    // world->Step(1428);  // theoretical contact, but
+    // world->Step(100);  // integration error requires few more steps
+
+    int steps = test_duration/dt;
+    bool post_contact_correction = false;
+
+    for (int i = 0; i < steps; ++i)
+    {
+      // integrate here to see when the collision should happen
+      v = v + dt * g;
+      z = z + dt * v;
+
+      world->Step(1);  // theoretical contact, but
+      {
+        physics::ModelPtr box_model = world->GetModel("box");
+        if (box_model)
+        {
+          math::Vector3 vel = box_model->GetWorldLinearVel();
+          math::Pose pose = box_model->GetWorldPose();
+          // gzdbg << "box time [" << world->GetSimTime().Double()
+          //      << "] sim z [" << pose.pos.z
+          //      << "] exact z [" << z
+          //      << "] sim vz [" << vel.z
+          //      << "] exact vz [" << v << "]\n";
+          if (z > 0.5 || !post_contact_correction)
+          {
+            EXPECT_LT(fabs(vel.z - v) , 0.0001);
+            EXPECT_LT(fabs(pose.pos.z - z) , 0.0001);
+          }
+          else
+          {
+            EXPECT_LT(fabs(vel.z), 0.0101);  // sometimes -0.01, why?
+            if (_physicsEngine == "dart")
+            {
+              // DART needs more tolerance until supports 'correction for
+              // penetration' feature.
+              // Please see issue #902
+              EXPECT_LT(fabs(pose.pos.z - 0.5), 0.00410);
+            }
+            else
+            {
+              EXPECT_LT(fabs(pose.pos.z - 0.5), 0.00001);
+            }
+          }
+        }
+
+        physics::ModelPtr sphere_model = world->GetModel("sphere");
+        if (sphere_model)
+        {
+          math::Vector3 vel = sphere_model->GetWorldLinearVel();
+          math::Pose pose = sphere_model->GetWorldPose();
+          // gzdbg << "sphere time [" << world->GetSimTime().Double()
+          //       << "] sim z [" << pose.pos.z
+          //       << "] exact z [" << z
+          //       << "] sim vz [" << vel.z
+          //       << "] exact vz [" << v << "]\n";
+          if (z > 0.5 || !post_contact_correction)
+          {
+            EXPECT_LT(fabs(vel.z - v), 0.0001);
+            EXPECT_LT(fabs(pose.pos.z - z), 0.0001);
+          }
+          else
+          {
+            if (_physicsEngine == "dart")
+            {
+              // DART needs more tolerance until supports 'correction for
+              // penetration' feature.
+              // Please see issue #902
+              EXPECT_LT(fabs(vel.z), 0.015);
+              EXPECT_LT(fabs(pose.pos.z - 0.5), 0.00410);
+            }
+            else
+            {
+              EXPECT_LT(fabs(vel.z), 3e-5);
+              EXPECT_LT(fabs(pose.pos.z - 0.5), 0.00001);
+            }
+          }
+        }
+
+        physics::ModelPtr cylinder_model = world->GetModel("cylinder");
+        if (cylinder_model)
+        {
+          math::Vector3 vel = cylinder_model->GetWorldLinearVel();
+          math::Pose pose = cylinder_model->GetWorldPose();
+          // gzdbg << "cylinder time [" << world->GetSimTime().Double()
+          //       << "] sim z [" << pose.pos.z
+          //       << "] exact z [" << z
+          //       << "] sim vz [" << vel.z
+          //       << "] exact vz [" << v << "]\n";
+          if (z > 0.5 || !post_contact_correction)
+          {
+            EXPECT_LT(fabs(vel.z - v), 0.0001);
+            EXPECT_LT(fabs(pose.pos.z - z), 0.0001);
+          }
+          else
+          {
+            EXPECT_LT(fabs(vel.z), 0.011);
+            if (_physicsEngine == "dart")
+            {
+              // DART needs more tolerance until supports 'correction for
+              // penetration' feature.
+              // Please see issue #902
+              EXPECT_LT(fabs(pose.pos.z - 0.5), 0.0041);
+            }
+            else
+            {
+              EXPECT_LT(fabs(pose.pos.z - 0.5), 0.0001);
+            }
+          }
+        }
+      }
+      if (z < 0.5) post_contact_correction = true;
+    }
+  }
+}
+
+// This test doesn't pass yet in Bullet or Simbody
+TEST_F(PhysicsTest, DropStuffODE)
+{
+  DropStuff("ode");
+}
+
+#ifdef HAVE_DART
+TEST_F(PhysicsTest, DropStuffDART)
+{
+  DropStuff("dart");
+}
+#endif  // HAVE_DART
+
+void PhysicsTest::InelasticCollision(const std::string &_physicsEngine)
+{
+  // check conservation of mementum for linear inelastic collision
+  Load("worlds/collision_test.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  EXPECT_TRUE(world != NULL);
+
+  int i = 0;
+  while (!this->HasEntity("sphere") && i < 20)
+  {
+    common::Time::MSleep(100);
+    ++i;
+  }
+
+  if (i > 20)
+    gzthrow("Unable to get sphere");
+
+  {
+    // todo: get parameters from drop_test.world
+    double test_duration = 1.1;
+    double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+
+    physics::ModelPtr box_model = world->GetModel("box");
+    physics::LinkPtr box_link = box_model->GetLink("link");
+    double f = 1000.0;
+    double v = 0;
+    double x = 0;
+    double m = box_link->GetInertial()->GetMass();
+
+    int steps = test_duration/dt;
+
+    for (int i = 0; i < steps; ++i)
+    {
+      double t = world->GetSimTime().Double();
+
+      world->Step(1);  // theoretical contact, but
+      {
+        if (box_model)
+        {
+          math::Vector3 vel = box_model->GetWorldLinearVel();
+          math::Pose pose = box_model->GetWorldPose();
+
+          // gzdbg << "box time [" << t
+          //      << "] sim x [" << pose.pos.x
+          //      << "] ideal x [" << x
+          //      << "] sim vx [" << vel.x
+          //      << "] ideal vx [" << v
+          //      << "]\n";
+
+          if (i == 0)
+          {
+            box_model->GetLink("link")->SetForce(math::Vector3(f, 0, 0));
+            EXPECT_TRUE(box_model->GetLink("link")->GetWorldForce() ==
+              math::Vector3(f, 0, 0));
+          }
+
+          if (t > 1.000 && t < 1.01)
+          {
+            // collision transition, do nothing
+          }
+          else
+          {
+            // collision happened
+            EXPECT_NEAR(pose.pos.x, x, PHYSICS_TOL);
+            EXPECT_NEAR(vel.x, v, PHYSICS_TOL);
+          }
+        }
+
+        physics::ModelPtr sphere_model = world->GetModel("sphere");
+        if (sphere_model)
+        {
+          math::Vector3 vel = sphere_model->GetWorldLinearVel();
+          math::Pose pose = sphere_model->GetWorldPose();
+          // gzdbg << "sphere time [" << world->GetSimTime().Double()
+          //      << "] sim x [" << pose.pos.x
+          //      << "] ideal x [" << x
+          //      << "] sim vx [" << vel.x
+          //      << "] ideal vx [" << v
+          //      << "]\n";
+          if (t > 1.000 && t < 1.01)
+          {
+            // collision transition, do nothing
+          }
+          else if (t <= 1.00)
+          {
+            // no collision
+            EXPECT_EQ(pose.pos.x, 2);
+            EXPECT_EQ(vel.x, 0);
+          }
+          else
+          {
+            // collision happened
+            EXPECT_NEAR(pose.pos.x, x + 1.0, PHYSICS_TOL);
+            EXPECT_NEAR(vel.x, v, PHYSICS_TOL);
+          }
+        }
+      }
+
+/*
+      // integrate here to see when the collision should happen
+      double impulse = dt*f;
+      if (i == 0) v = v + impulse;
+      else if (t >= 1.0) v = dt*f/ 2.0;  // inelastic col. w/ eqal mass.
+      x = x + dt * v;
+*/
+
+      // integrate here to see when the collision should happen
+      double vold = v;
+      if (i == 0)
+        v = vold + dt* (f / m);
+      else if (t >= 1.0)
+        v = dt*f/ 2.0;  // inelastic col. w/ eqal mass.
+      x = x + dt * (v + vold) / 2.0;
+    }
+  }
+}
+
+TEST_P(PhysicsTest, InelasticCollision)
+{
+  InelasticCollision(GetParam());
+}
+
+////////////////////////////////////////////////////////////////////////
+// SphereAtlasLargeError:
+// Check algorithm's ability to re-converge after a large LCP error is
+// introduced.
+// In this test, a model with similar dynamics properties to Atlas V3
+// is pinned to the world by both feet.  Robot is moved by a large
+// distance, violating the joints between world and feet temporarily.
+// Robot is then allowed to settle.  Check to see that the LCP solution
+// does not become unstable.
+////////////////////////////////////////////////////////////////////////
+void PhysicsTest::SphereAtlasLargeError(const std::string &_physicsEngine)
+{
+  if (_physicsEngine != "ode")
+  {
+    gzerr << "Skipping SphereAtlasLargeError for physics engine ["
+          << _physicsEngine
+          << "] as this test only works for ODE for now.\n";
+    return;
+  }
+
+  Load("worlds/sphere_atlas_demo.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics->SetGravity(math::Vector3(0, 0, 0));
+
+  int i = 0;
+  while (!this->HasEntity("sphere_atlas") && i < 20)
+  {
+    common::Time::MSleep(100);
+    ++i;
+  }
+
+  if (i > 20)
+    gzthrow("Unable to get sphere_atlas");
+
+  physics::ModelPtr model = world->GetModel("sphere_atlas");
+  EXPECT_TRUE(model);
+  physics::LinkPtr head = model->GetLink("head");
+  EXPECT_TRUE(head);
+
+  {
+    gzdbg << "Testing large perturbation with PID controller active.\n";
+    // Test:  With Robot PID controller active, introduce a large
+    //        constraint error by breaking some model joints to the world
+    model->SetWorldPose(math::Pose(1000, 0, 0, 0, 0, 0));
+
+    // let model settle
+    world->Step(1000);
+
+    for (unsigned int n = 0; n < 10; ++n)
+    {
+      world->Step(1);
+      // manually check joint constraint violation for each joint
+      physics::Link_V links = model->GetLinks();
+      for (unsigned int i = 0; i < links.size(); ++i)
+      {
+        math::Pose childInWorld = links[i]->GetWorldPose();
+
+        physics::Joint_V parentJoints = links[i]->GetParentJoints();
+        for (unsigned int j = 0; j < parentJoints.size(); ++j)
+        {
+          // anchor position in world frame
+          math::Vector3 anchorPos = parentJoints[j]->GetAnchor(0);
+
+          // anchor pose in child link frame
+          math::Pose anchorInChild =
+            math::Pose(anchorPos, math::Quaternion()) - childInWorld;
+
+          // initial anchor pose in child link frame
+          math::Pose anchorInitialInChild =
+            parentJoints[j]->GetInitialAnchorPose();
+
+          physics::LinkPtr parent = parentJoints[j]->GetParent();
+          if (parent)
+          {
+            // compare everything in the parent frame
+            math::Pose childInitialInParent =
+              links[i]->GetInitialRelativePose() -  // rel to model
+              parent->GetInitialRelativePose();  // rel to model
+
+            math::Pose parentInWorld = parent->GetWorldPose();
+            math::Pose childInParent = childInWorld - parentInWorld;
+            math::Pose anchorInParent = anchorInChild + childInParent;
+            math::Pose anchorInitialInParent =
+              anchorInitialInChild + childInitialInParent;
+            math::Pose jointError = anchorInParent - anchorInitialInParent;
+
+            // joint constraint violation must be less than...
+            EXPECT_LT(jointError.pos.GetSquaredLength(), PHYSICS_TOL);
+
+            // debug
+            if (jointError.pos.GetSquaredLength() >= PHYSICS_TOL)
+              gzdbg << "i [" << n
+                    << "] link [" << links[i]->GetName()
+                    // << "] parent[" << parent->GetName()
+                    << "] error[" << jointError.pos.GetSquaredLength()
+                    // << "] pose[" << childInWorld
+                    << "] anchor[" << anchorInChild
+                    << "] cinp[" << childInParent
+                    << "] ainp0[" << anchorInitialInParent
+                    << "] ainp[" << anchorInParent
+                    << "] diff[" << jointError
+                    << "]\n";
+          }
+        }
+      }
+    }
+  }
+
+  {
+    gzdbg << "Testing large perturbation with PID controller disabled.\n";
+    // Test:  Turn off Robot PID controller, then introduce a large
+    //        constraint error by breaking some model joints to the world
+
+    // special hook in SphereAtlasTestPlugin disconnects
+    // PID controller on Reset.
+    world->Reset();
+    world->Step(1);
+
+    model->SetWorldPose(math::Pose(1000, 0, 0, 0, 0, 0));
+
+    // let model settle
+    world->Step(1000);
+
+    for (unsigned int n = 0; n < 10; ++n)
+    {
+      world->Step(1);
+      // manually check joint constraint violation for each joint
+      physics::Link_V links = model->GetLinks();
+      for (unsigned int i = 0; i < links.size(); ++i)
+      {
+        math::Pose childInWorld = links[i]->GetWorldPose();
+
+        physics::Joint_V parentJoints = links[i]->GetParentJoints();
+        for (unsigned int j = 0; j < parentJoints.size(); ++j)
+        {
+          // anchor position in world frame
+          math::Vector3 anchorPos = parentJoints[j]->GetAnchor(0);
+
+          // anchor pose in child link frame
+          math::Pose anchorInChild =
+            math::Pose(anchorPos, math::Quaternion()) - childInWorld;
+
+          // initial anchor pose in child link frame
+          math::Pose anchorInitialInChild =
+            parentJoints[j]->GetInitialAnchorPose();
+
+          physics::LinkPtr parent = parentJoints[j]->GetParent();
+          if (parent)
+          {
+            // compare everything in the parent frame
+            math::Pose childInitialInParent =
+              links[i]->GetInitialRelativePose() -  // rel to model
+              parent->GetInitialRelativePose();  // rel to model
+
+            math::Pose parentInWorld = parent->GetWorldPose();
+            math::Pose childInParent = childInWorld - parentInWorld;
+            math::Pose anchorInParent = anchorInChild + childInParent;
+            math::Pose anchorInitialInParent =
+              anchorInitialInChild + childInitialInParent;
+            math::Pose jointError = anchorInParent - anchorInitialInParent;
+
+            // joint constraint violation must be less than...
+            EXPECT_LT(jointError.pos.GetSquaredLength(), PHYSICS_TOL);
+
+            // debug
+            if (jointError.pos.GetSquaredLength() >= PHYSICS_TOL)
+              gzdbg << "i [" << n
+                    << "] link [" << links[i]->GetName()
+                    // << "] parent[" << parent->GetName()
+                    << "] error[" << jointError.pos.GetSquaredLength()
+                    // << "] pose[" << childInWorld
+                    << "] anchor[" << anchorInChild
+                    << "] cinp[" << childInParent
+                    << "] ainp0[" << anchorInitialInParent
+                    << "] ainp[" << anchorInParent
+                    << "] diff[" << jointError
+                    << "]\n";
+          }
+        }
+      }
+    }
+  }
+}
+
+TEST_P(PhysicsTest, SphereAtlasLargeError)
+{
+  SphereAtlasLargeError(GetParam());
+}
+
+////////////////////////////////////////////////////////////////////////
+// CollisionFiltering:
+// Load a world, spawn a model with two overlapping links. By default,
+// the links should not collide with each other as they have the same
+// parent model. Check the x and y velocities to see if they are 0
+////////////////////////////////////////////////////////////////////////
+void PhysicsTest::CollisionFiltering(const std::string &_physicsEngine)
+{
+  // load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  std::stringstream newModelStr;
+
+  std::string modelName = "multiLinkModel";
+  math::Pose modelPose(0, 0, 2, 0, 0, 0);
+  math::Pose link01Pose(0, 0.1, 0, 0, 0, 0);
+  math::Pose link02Pose(0, -0.1, 0, 0, 0, 0);
+
+  // A model composed of two overlapping links at fixed y offset from origin
+  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+              << "<model name ='" << modelName << "'>"
+              << "<pose>" << modelPose.pos.x << " "
+                         << modelPose.pos.y << " "
+                         << modelPose.pos.z << " "
+                         << modelPose.rot.GetAsEuler().x << " "
+                         << modelPose.rot.GetAsEuler().y << " "
+                         << modelPose.rot.GetAsEuler().z << "</pose>"
+              << "<link name ='link01'>"
+              << "  <pose>" << link01Pose.pos.x << " "
+                         << link01Pose.pos.y << " "
+                         << link01Pose.pos.z << " "
+                         << link01Pose.rot.GetAsEuler().x << " "
+                         << link01Pose.rot.GetAsEuler().y << " "
+                         << link01Pose.rot.GetAsEuler().z << "</pose>"
+              << "  <collision name ='geom'>"
+              << "    <geometry>"
+              << "      <box><size>1 1 1</size></box>"
+              << "    </geometry>"
+              << "  </collision>"
+              << "  <visual name ='visual'>"
+              << "    <geometry>"
+              << "      <box><size>1 1 1</size></box>"
+              << "    </geometry>"
+              << "  </visual>"
+              << "</link>"
+              << "<link name ='link02'>"
+              << "  <pose>" << link02Pose.pos.x << " "
+                         << link02Pose.pos.y << " "
+                         << link02Pose.pos.z << " "
+                         << link02Pose.rot.GetAsEuler().x << " "
+                         << link02Pose.rot.GetAsEuler().y << " "
+                         << link02Pose.rot.GetAsEuler().z << "</pose>"
+              << "  <collision name ='geom'>"
+              << "    <geometry>"
+              << "      <box><size>1 1 1</size></box>"
+              << "    </geometry>"
+              << "  </collision>"
+              << "  <visual name ='visual'>"
+              << "    <geometry>"
+              << "      <box><size>1 1 1</size></box>"
+              << "    </geometry>"
+              << "  </visual>"
+              << "</link>"
+              << "</model>"
+              << "</sdf>";
+
+  SpawnSDF(newModelStr.str());
+
+  // Wait for the entity to spawn
+  int i = 0;
+  while (!this->HasEntity(modelName) && i < 20)
+  {
+    common::Time::MSleep(100);
+    ++i;
+  }
+  if (i > 20)
+    gzthrow("Unable to spawn model");
+
+  world->Step(5);
+  physics::ModelPtr model = world->GetModel(modelName);
+
+  math::Vector3 vel;
+
+  physics::Link_V links = model->GetLinks();
+  EXPECT_EQ(links.size(), 2u);
+  for (physics::Link_V::const_iterator iter = links.begin();
+      iter != links.end(); ++iter)
+  {
+    std::cout << "LinkName[" << (*iter)->GetScopedName() << "]\n";
+    // Links should not repel each other hence expecting zero x, y vel
+    vel = (*iter)->GetWorldLinearVel();
+    EXPECT_EQ(vel.x, 0);
+    EXPECT_EQ(vel.y, 0);
+
+    // Model should be falling
+    EXPECT_LT(vel.z, 0);
+  }
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsTest, CollisionFiltering)
+{
+  CollisionFiltering(GetParam());
+}
+
+/////////////////////////////////////////////////
+// This test verifies that gazebo doesn't crash when collisions occur
+// and the <world><physics><ode><max_contacts> value is zero.
+// The crash was reported in issue #593 on bitbucket
+TEST_F(PhysicsTest, ZeroMaxContactsODE)
+{
+  // Load an empty world
+  Load("worlds/zero_max_contacts.world");
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::ModelPtr model = world->GetModel("ground_plane");
+  ASSERT_TRUE(model);
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, PhysicsTest, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/physics_friction.cc b/test/integration/physics_friction.cc
new file mode 100644
index 0000000..0ab94d6
--- /dev/null
+++ b/test/integration/physics_friction.cc
@@ -0,0 +1,679 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string.h>
+
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/physics/ode/ODESurfaceParams.hh"
+#include "gazebo/physics/ode/ODETypes.hh"
+
+#ifdef HAVE_BULLET
+#include "gazebo/physics/bullet/BulletSurfaceParams.hh"
+#include "gazebo/physics/bullet/BulletTypes.hh"
+#endif
+
+#include "gazebo/transport/transport.hh"
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+
+const double g_friction_tolerance = 1e-3;
+
+class PhysicsFrictionTest : public ServerFixture,
+                        public testing::WithParamInterface<const char*>
+{
+  protected: PhysicsFrictionTest() : ServerFixture(), spawnCount(0)
+             {
+             }
+
+  /// \brief Data structure to hold model pointer and friction parameter
+  ///        for each test model in friction demo world.
+  class FrictionDemoBox
+  {
+    public: FrictionDemoBox(physics::WorldPtr _world, const std::string &_name)
+            : modelName(_name), world(_world), friction(0.0)
+            {
+              // Get the model pointer
+              model = world->GetModel(modelName);
+
+              // Get the friction coefficient
+              physics::LinkPtr link = model->GetLink();
+              physics::Collision_V collisions = link->GetCollisions();
+              physics::Collision_V::iterator iter = collisions.begin();
+              if (iter != collisions.end())
+              {
+                physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+                if (physics->GetType() == "ode")
+                {
+                  physics::ODESurfaceParamsPtr surface =
+                    boost::dynamic_pointer_cast<physics::ODESurfaceParams>(
+                    (*iter)->GetSurface());
+                  // Average the mu1 and mu2 values
+                  this->friction = (surface->frictionPyramid.GetMuPrimary()
+                                  + surface->frictionPyramid.GetMuSecondary())
+                                  / 2.0;
+                }
+#ifdef HAVE_BULLET
+                else if (physics->GetType() == "bullet")
+                {
+                  physics::BulletSurfaceParamsPtr surface =
+                    boost::dynamic_pointer_cast<physics::BulletSurfaceParams>(
+                    (*iter)->GetSurface());
+                  // Average the mu1 and mu2 values
+                  this->friction = (surface->frictionPyramid.GetMuPrimary()
+                                  + surface->frictionPyramid.GetMuSecondary())
+                                  / 2.0;
+                }
+#endif
+              }
+            }
+    public: ~FrictionDemoBox() {}
+    public: std::string modelName;
+    public: physics::WorldPtr world;
+    public: physics::ModelPtr model;
+    public: double friction;
+  };
+
+  /// \brief Class to hold parameters for spawning joints.
+  public: class SpawnFrictionBoxOptions
+  {
+    /// \brief Constructor.
+    public: SpawnFrictionBoxOptions() : mass(1.0),
+              friction1(1.0), friction2(1.0)
+            {
+            }
+
+    /// \brief Destructor.
+    public: ~SpawnFrictionBoxOptions()
+            {
+            }
+
+    /// \brief Size of box to spawn.
+    public: math::Vector3 size;
+
+    /// \brief Mass of box to spawn (inertia computed automatically).
+    public: double mass;
+
+    /// \brief Model pose.
+    public: math::Pose modelPose;
+
+    /// \brief Link pose.
+    public: math::Pose linkPose;
+
+    /// \brief Inertial pose.
+    public: math::Pose inertialPose;
+
+    /// \brief Collision pose.
+    public: math::Pose collisionPose;
+
+    /// \brief Friction coefficient in primary direction.
+    public: double friction1;
+
+    /// \brief Friction coefficient in secondary direction.
+    public: double friction2;
+
+    /// \brief Primary friction direction.
+    public: math::Vector3 direction1;
+  };
+
+  /// \brief Spawn a box with friction coefficients and direction.
+  /// \param[in] _opt Options for friction box.
+  public: physics::ModelPtr SpawnBox(const SpawnFrictionBoxOptions &_opt)
+          {
+            msgs::Factory msg;
+            std::ostringstream modelStr;
+            std::ostringstream modelName;
+            modelName << "box_model" << this->spawnCount++;
+
+            double dx = _opt.size.x;
+            double dy = _opt.size.y;
+            double dz = _opt.size.z;
+            double ixx = _opt.mass/12.0 * (dy*dy + dz*dz);
+            double iyy = _opt.mass/12.0 * (dz*dz + dx*dx);
+            double izz = _opt.mass/12.0 * (dx*dx + dy*dy);
+
+            modelStr
+              << "<sdf version='" << SDF_VERSION << "'>"
+              << "<model name ='" << modelName.str() << "'>"
+              << "  <pose>" << _opt.modelPose << "</pose>"
+              << "  <link name='link'>"
+              << "    <pose>" << _opt.linkPose << "</pose>"
+              << "    <inertial>"
+              << "      <pose>" << _opt.inertialPose << "</pose>"
+              << "      <mass>" << _opt.mass << "</mass>"
+              << "      <inertia>"
+              << "        <ixx>" << ixx << "</ixx>"
+              << "        <iyy>" << iyy << "</iyy>"
+              << "        <izz>" << izz << "</izz>"
+              << "        <ixy>" << 0.0 << "</ixy>"
+              << "        <ixz>" << 0.0 << "</ixz>"
+              << "        <iyz>" << 0.0 << "</iyz>"
+              << "      </inertia>"
+              << "    </inertial>"
+              << "    <collision name='collision'>"
+              << "      <pose>" << _opt.collisionPose << "</pose>"
+              << "      <geometry>"
+              << "        <box><size>" << _opt.size << "</size></box>"
+              << "      </geometry>"
+              << "      <surface>"
+              << "        <friction>"
+              << "          <ode>"
+              << "            <mu>" << _opt.friction1 << "</mu>"
+              << "            <mu2>" << _opt.friction2 << "</mu2>"
+              << "            <fdir1>" << _opt.direction1 << "</fdir1>"
+              << "          </ode>"
+              << "        </friction>"
+              << "      </surface>"
+              << "    </collision>"
+              << "    <visual name='visual'>"
+              << "      <pose>" << _opt.collisionPose << "</pose>"
+              << "      <geometry>"
+              << "        <box><size>" << _opt.size << "</size></box>"
+              << "      </geometry>"
+              << "    </visual>"
+              << "  </link>"
+              << "</model>";
+
+            physics::WorldPtr world = physics::get_world("default");
+            world->InsertModelString(modelStr.str());
+
+            physics::ModelPtr model;
+            common::Time wait(100, 0);
+
+            common::Time wallStart = common::Time::GetWallTime();
+            unsigned int waitCount = 0;
+            while (wait > (common::Time::GetWallTime() - wallStart) &&
+                   !this->HasEntity(modelName.str()))
+            {
+              common::Time::MSleep(10);
+              if (++waitCount % 100 == 0)
+              {
+                gzwarn << "Waiting " << waitCount / 100 << " seconds for "
+                       << "box to spawn." << std::endl;
+              }
+            }
+            if (this->HasEntity(modelName.str()) && waitCount >= 100)
+              gzwarn << "box has spawned." << std::endl;
+
+            if (world != NULL)
+              model = world->GetModel(modelName.str());
+
+            return model;
+          }
+
+  /// \brief Use the friction_demo world.
+  /// \param[in] _physicsEngine Physics engine to use.
+  public: void FrictionDemo(const std::string &_physicsEngine);
+
+  /// \brief Test friction directions for friction pyramid with boxes.
+  /// \param[in] _physicsEngine Physics engine to use.
+  public: void BoxDirectionRing(const std::string &_physicsEngine);
+
+  /// \brief Use frictionDirection parallel to normal to make sure
+  /// no NaN's are generated.
+  /// \param[in] _physicsEngine Physics engine to use.
+  public: void DirectionNaN(const std::string &_physicsEngine);
+
+  /// \brief Test Link::GetWorldInertia* functions.
+  /// \TODO: move the SpawnBox function to ServerFixture,
+  /// and then move this test to a different file.
+  /// \param[in] _physicsEngine Physics engine to use.
+  public: void LinkGetWorldInertia(const std::string &_physicsEngine);
+
+  /// \brief Count of spawned models, used to ensure unique model names.
+  private: unsigned int spawnCount;
+};
+
+/////////////////////////////////////////////////
+// FrictionDemo test:
+// Uses the test_friction world, which has a bunch of boxes on the ground
+// with a gravity vector to simulate a 45-degree inclined plane. Each
+// box has a different coefficient of friction. These friction coefficients
+// are chosen to be close to the value that would prevent sliding according
+// to the Coulomb model.
+void PhysicsFrictionTest::FrictionDemo(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test since there's an issue with simbody's friction"
+          << " parameters (#989)"
+          << std::endl;
+    return;
+  }
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Aborting test since there's an issue with dart's friction"
+          << " parameters (#1000)"
+          << std::endl;
+    return;
+  }
+
+  Load("worlds/friction_demo.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // check the gravity vector
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  math::Vector3 g = physics->GetGravity();
+
+  // Custom gravity vector for this demo world.
+  EXPECT_DOUBLE_EQ(g.x, 0);
+  EXPECT_DOUBLE_EQ(g.y, -1.0);
+  EXPECT_DOUBLE_EQ(g.z, -1.0);
+
+  std::vector<PhysicsFrictionTest::FrictionDemoBox> boxes;
+  std::vector<PhysicsFrictionTest::FrictionDemoBox>::iterator box;
+  boxes.push_back(PhysicsFrictionTest::FrictionDemoBox(world, "box_01_model"));
+  boxes.push_back(PhysicsFrictionTest::FrictionDemoBox(world, "box_02_model"));
+  boxes.push_back(PhysicsFrictionTest::FrictionDemoBox(world, "box_03_model"));
+  boxes.push_back(PhysicsFrictionTest::FrictionDemoBox(world, "box_04_model"));
+  boxes.push_back(PhysicsFrictionTest::FrictionDemoBox(world, "box_05_model"));
+  boxes.push_back(PhysicsFrictionTest::FrictionDemoBox(world, "box_06_model"));
+
+  // Verify box data structure
+  for (box = boxes.begin(); box != boxes.end(); ++box)
+  {
+    ASSERT_TRUE(box->model != NULL);
+    ASSERT_GT(box->friction, 0.0);
+  }
+
+  common::Time t = world->GetSimTime();
+  while (t.sec < 10)
+  {
+    world->Step(500);
+    t = world->GetSimTime();
+
+    for (box = boxes.begin(); box != boxes.end(); ++box)
+    {
+      math::Vector3 vel = box->model->GetWorldLinearVel();
+      EXPECT_NEAR(vel.x, 0, g_friction_tolerance);
+      EXPECT_NEAR(vel.z, 0, g_friction_tolerance);
+
+      // Coulomb friction model
+      if (box->friction >= 1.0)
+      {
+        // Friction is large enough to prevent motion
+        EXPECT_NEAR(vel.y, 0, g_friction_tolerance);
+      }
+      else
+      {
+        // Friction is small enough to allow motion
+        // Expect velocity = acceleration * time
+        EXPECT_NEAR(vel.y, (g.y + box->friction) * t.Double(),
+                    g_friction_tolerance);
+      }
+    }
+  }
+  for (box = boxes.begin(); box != boxes.end(); ++box)
+  {
+    ASSERT_TRUE(box->model != NULL);
+  }
+}
+
+/////////////////////////////////////////////////
+// BoxDirectionRing:
+// Spawn several boxes with different friction direction parameters.
+void PhysicsFrictionTest::BoxDirectionRing(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "bullet")
+  {
+    gzerr << "Aborting test since there's an issue with bullet's friction"
+          << " parameters (#1045)"
+          << std::endl;
+    return;
+  }
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test since there's an issue with simbody's friction"
+          << " parameters (#989)"
+          << std::endl;
+    return;
+  }
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Aborting test since there's an issue with dart's friction"
+          << " parameters (#1000)"
+          << std::endl;
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // set the gravity vector
+  // small positive y component
+  math::Vector3 g(0.0, 1.0, -9.81);
+  physics->SetGravity(g);
+
+  // Spawn concentric semi-circles of boxes
+  int boxes = 10;
+  double dx = 0.5;
+  double dy = 0.5;
+  double dz = 0.2;
+  std::map<physics::ModelPtr, double> modelAngles;
+
+  for (int ring = 0; ring < 4; ++ring)
+  {
+    gzdbg << "Spawn ring " << ring+1 << " of boxes" << std::endl;
+    for (int i = 0; i <= boxes; ++i)
+    {
+      // Set box size and anisotropic friction
+      SpawnFrictionBoxOptions opt;
+      opt.size.Set(dx, dy, dz);
+      opt.friction1 = 100.0;
+      opt.friction2 = 0.0;
+
+      // Compute angle for each box
+      double radius = 5.0 + ring;
+      double angle = M_PI*static_cast<double>(i) / static_cast<double>(boxes);
+      opt.modelPose.pos.Set(radius*cos(angle), radius*sin(angle), dz/2);
+
+      if (ring == 0)
+        opt.direction1 = math::Vector3(-sin(angle), cos(angle), 0);
+      else
+        opt.direction1 = math::Vector3(0.0, 1.0, 0.0);
+
+      if (ring == 1)
+        opt.collisionPose.rot.SetFromEuler(0.0, 0.0, angle);
+
+      if (ring == 2)
+        opt.linkPose.rot.SetFromEuler(0.0, 0.0, angle);
+
+      if (ring == 3)
+        opt.modelPose.rot.SetFromEuler(0.0, 0.0, angle);
+
+      physics::ModelPtr model = SpawnBox(opt);
+      ASSERT_TRUE(model != NULL);
+      modelAngles[model] = angle;
+    }
+  }
+
+  // Step forward
+  world->Step(1500);
+  double t = world->GetSimTime().Double();
+
+  gzdbg << "Checking velocity after " << t << " seconds" << std::endl;
+  std::map<physics::ModelPtr, double>::iterator iter;
+  for (iter = modelAngles.begin(); iter != modelAngles.end(); ++iter)
+  {
+    double cosAngle = cos(iter->second);
+    double sinAngle = sin(iter->second);
+    double velMag = g.y * sinAngle * t;
+    math::Vector3 vel = iter->first->GetWorldLinearVel();
+    EXPECT_NEAR(velMag*cosAngle, vel.x, 5*g_friction_tolerance);
+    EXPECT_NEAR(velMag*sinAngle, vel.y, 5*g_friction_tolerance);
+  }
+}
+
+/////////////////////////////////////////////////
+// DirectionNaN:
+// Spawn box with vertical friction direction and make sure there's no NaN's
+void PhysicsFrictionTest::DirectionNaN(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "bullet")
+  {
+    gzerr << "Aborting test since there's an issue with bullet's friction"
+          << " parameters (#1045)"
+          << std::endl;
+    return;
+  }
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test since there's an issue with simbody's friction"
+          << " parameters (#989)"
+          << std::endl;
+    return;
+  }
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Aborting test since there's an issue with dart's friction"
+          << " parameters (#1000)"
+          << std::endl;
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // set the gravity vector
+  // small positive y component
+  math::Vector3 g(0.0, 1.5, -1.0);
+  physics->SetGravity(g);
+
+  // Spawn a single box
+  double dx = 0.5;
+  double dy = 0.5;
+  double dz = 0.2;
+
+  // Set box size and anisotropic friction
+  SpawnFrictionBoxOptions opt;
+  opt.size.Set(dx, dy, dz);
+  opt.direction1 = math::Vector3(0.0, 0.0, 1.0);
+  opt.modelPose.pos.z = dz/2;
+
+  physics::ModelPtr model = SpawnBox(opt);
+  ASSERT_TRUE(model != NULL);
+
+  // Step forward
+  world->Step(1500);
+  double t = world->GetSimTime().Double();
+
+  gzdbg << "Checking velocity after " << t << " seconds" << std::endl;
+  double velMag = (g.y+g.z) * t;
+  math::Vector3 vel = model->GetWorldLinearVel();
+  EXPECT_NEAR(0.0, vel.x, g_friction_tolerance);
+  EXPECT_NEAR(velMag, vel.y, g_friction_tolerance);
+}
+
+/////////////////////////////////////////////////
+// LinkGetWorldInertia:
+// Spawn boxes and verify Link::GetWorldInertia* functions
+void PhysicsFrictionTest::LinkGetWorldInertia(const std::string &_physicsEngine)
+{
+  // Load a blank world (no ground plane)
+  Load("worlds/blank.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // disable gravity
+  physics->SetGravity(math::Vector3::Zero);
+
+  // Box size
+  double dx = 1.0;
+  double dy = 4.0;
+  double dz = 9.0;
+  double mass = 10.0;
+  double angle = M_PI / 3.0;
+
+  const unsigned int testCases = 4;
+  for (unsigned int i = 0; i < testCases; ++i)
+  {
+    // Set box size and position
+    SpawnFrictionBoxOptions opt;
+    opt.size.Set(dx, dy, dz);
+    opt.mass = mass;
+    opt.modelPose.pos.x = i * dz;
+    opt.modelPose.pos.z = dz;
+
+    // i=0: rotated model pose
+    //  expect inertial pose to match model pose
+    if (i == 0)
+    {
+      opt.modelPose.rot.SetFromEuler(0.0, 0.0, angle);
+    }
+    // i=1: rotated link pose
+    //  expect inertial pose to match link pose
+    else if (i == 1)
+    {
+      opt.linkPose.rot.SetFromEuler(0.0, 0.0, angle);
+    }
+    // i=2: rotated inertial pose
+    //  expect inertial pose to differ from link pose
+    else if (i == 2)
+    {
+      opt.inertialPose.rot.SetFromEuler(0.0, 0.0, angle);
+    }
+    // i=3: offset inertial pose
+    //  expect inertial pose to differ from link pose
+    else if (i == 3)
+    {
+      opt.inertialPose.pos.Set(1, 1, 1);
+    }
+
+    physics::ModelPtr model = SpawnBox(opt);
+    ASSERT_TRUE(model != NULL);
+
+    physics::LinkPtr link = model->GetLink();
+    ASSERT_TRUE(link != NULL);
+
+    EXPECT_EQ(model->GetWorldPose(), opt.modelPose);
+    EXPECT_EQ(link->GetWorldPose(), opt.linkPose + opt.modelPose);
+    EXPECT_EQ(link->GetWorldInertialPose(),
+              opt.inertialPose + opt.linkPose + opt.modelPose);
+
+    // i=0: rotated model pose
+    //  expect inertial pose to match model pose
+    if (i == 0)
+    {
+      EXPECT_EQ(model->GetWorldPose(),
+                link->GetWorldInertialPose());
+    }
+    // i=1: rotated link pose
+    //  expect inertial pose to match link pose
+    else if (i == 1)
+    {
+      EXPECT_EQ(link->GetWorldPose(),
+                link->GetWorldInertialPose());
+    }
+    // i=2: offset and rotated inertial pose
+    //  expect inertial pose to differ from link pose
+    else if (i == 2)
+    {
+      EXPECT_EQ(link->GetWorldPose().pos,
+                link->GetWorldInertialPose().pos);
+    }
+    // i=3: offset inertial pose
+    //  expect inertial pose to differ from link pose
+    else if (i == 3)
+    {
+      EXPECT_EQ(link->GetWorldPose().pos + opt.inertialPose.pos,
+                link->GetWorldInertialPose().pos);
+    }
+
+    // Expect rotated inertia matrix
+    math::Matrix3 inertia = link->GetWorldInertiaMatrix();
+    if (i == 3)
+    {
+      EXPECT_NEAR(inertia[0][0], 80.8333, 1e-4);
+      EXPECT_NEAR(inertia[1][1], 68.3333, 1e-4);
+      EXPECT_NEAR(inertia[2][2], 14.1667, 1e-4);
+      for (int row = 0; row < 3; ++row)
+        for (int col = 0; col < 3; ++col)
+          if (row != col)
+            EXPECT_NEAR(inertia[row][col], 0.0, g_friction_tolerance);
+    }
+    else
+    {
+      EXPECT_NEAR(inertia[0][0], 71.4583, 1e-4);
+      EXPECT_NEAR(inertia[1][1], 77.7083, 1e-4);
+      EXPECT_NEAR(inertia[2][2], 14.1667, 1e-4);
+      EXPECT_NEAR(inertia[0][1],  5.4126, 1e-4);
+      EXPECT_NEAR(inertia[1][0],  5.4126, 1e-4);
+      EXPECT_NEAR(inertia[0][2], 0, g_friction_tolerance);
+      EXPECT_NEAR(inertia[2][0], 0, g_friction_tolerance);
+      EXPECT_NEAR(inertia[1][2], 0, g_friction_tolerance);
+      EXPECT_NEAR(inertia[2][1], 0, g_friction_tolerance);
+    }
+
+    // For 0-2, apply torque and expect equivalent response
+    if (i <= 2)
+    {
+      for (int step = 0; step < 50; ++step)
+      {
+        link->SetTorque(math::Vector3(100, 0, 0));
+        world->Step(1);
+      }
+      if (_physicsEngine.compare("dart") == 0)
+      {
+        gzerr << "Dart fails this portion of the test (#1090)" << std::endl;
+      }
+      else
+      {
+        math::Vector3 vel = link->GetWorldAngularVel();
+        EXPECT_NEAR(vel.x,  0.0703, g_friction_tolerance);
+        EXPECT_NEAR(vel.y, -0.0049, g_friction_tolerance);
+        EXPECT_NEAR(vel.z,  0.0000, g_friction_tolerance);
+      }
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsFrictionTest, FrictionDemo)
+{
+  FrictionDemo(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsFrictionTest, BoxDirectionRing)
+{
+  BoxDirectionRing(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsFrictionTest, DirectionNaN)
+{
+  DirectionNaN(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsFrictionTest, LinkGetWorldInertia)
+{
+  LinkGetWorldInertia(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, PhysicsFrictionTest,
+                        PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/physics_link.cc b/test/integration/physics_link.cc
new file mode 100644
index 0000000..a57ceec
--- /dev/null
+++ b/test/integration/physics_link.cc
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string.h>
+
+#include "gazebo/physics/physics.hh"
+#include "test/ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+
+const double g_tolerance = 1e-4;
+
+class PhysicsLinkTest : public ServerFixture,
+                        public testing::WithParamInterface<const char*>
+{
+  /// \brief Test GetWorldEnergy* functions.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void GetWorldEnergy(const std::string &_physicsEngine);
+
+  /// \brief Test velocity setting functions.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void SetVelocity(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void PhysicsLinkTest::GetWorldEnergy(const std::string &_physicsEngine)
+{
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // check the physics engine
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  double dt = physics->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+
+  // Get gravity magnitude
+  double g = physics->GetGravity().GetLength();
+
+  // Spawn a box
+  double z0 = 10.0;
+  math::Vector3 size(1, 1, 1);
+  math::Vector3 pos0(0, 0, z0 + size.z / 2);
+  SpawnBox("box", size, pos0, math::Vector3::Zero, false);
+  physics::ModelPtr model = world->GetModel("box");
+  ASSERT_TRUE(model != NULL);
+  physics::LinkPtr link = model->GetLink();
+  ASSERT_TRUE(link != NULL);
+
+  // Get initial energy
+  double energy0 = link->GetWorldEnergy();
+  EXPECT_NEAR(link->GetWorldEnergyKinetic(), 0, g_tolerance);
+
+  double totalTime = sqrt(2*z0/g)*0.95;
+  unsigned int stepSize = 10;
+  unsigned int steps = floor(totalTime / (dt*stepSize));
+  for (unsigned int i = 0; i < steps; ++i)
+  {
+    world->Step(stepSize);
+    double energy = link->GetWorldEnergy();
+    EXPECT_NEAR(energy / energy0, 1.0, g_tolerance * 10);
+  }
+}
+
+/////////////////////////////////////////////////
+void PhysicsLinkTest::SetVelocity(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "SimbodyLink::SetLinearVel, SetAngularVel aren't working (#1080)"
+          << std::endl;
+    return;
+  }
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "DARTLink::SetLinearVel, SetAngularVel aren't working (#1079)"
+          << std::endl;
+    return;
+  }
+
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // check the physics engine
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  double dt = physics->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+
+  // disable gravity
+  physics->SetGravity(math::Vector3::Zero);
+
+  // Spawn a box
+  math::Vector3 size(1, 1, 1);
+  math::Vector3 pos0(0, 0, 1);
+  SpawnBox("box", size, pos0, math::Vector3::Zero, false);
+  physics::ModelPtr model = world->GetModel("box");
+  ASSERT_TRUE(model != NULL);
+  physics::LinkPtr link = model->GetLink();
+  ASSERT_TRUE(link != NULL);
+
+  // Set upward velocity and check
+  math::Vector3 vel(0, 0, 1);
+  link->SetLinearVel(vel);
+  world->Step(1);
+  EXPECT_EQ(vel, link->GetWorldLinearVel());
+  EXPECT_EQ(math::Vector3::Zero, link->GetWorldAngularVel());
+
+  // Step forward and check velocity again
+  world->Step(44);
+  double time = world->GetSimTime().Double();
+  EXPECT_EQ(vel, link->GetWorldLinearVel());
+  EXPECT_EQ(math::Vector3::Zero, link->GetWorldAngularVel());
+
+  // check position
+  math::Vector3 pos = link->GetWorldPose().pos;
+  if (_physicsEngine.compare("bullet") == 0)
+  {
+    /// \TODO skipping bullet, see issue #1081
+    gzerr << "Bullet seems to be off by one time step (#1081)"
+          << std::endl;
+    time -= dt;
+  }
+  EXPECT_EQ(pos0 + time*vel, pos);
+
+  // Set velocity to zero
+  link->SetLinearVel(math::Vector3::Zero);
+  world->Step(1);
+  EXPECT_EQ(math::Vector3::Zero, link->GetWorldLinearVel());
+  EXPECT_EQ(math::Vector3::Zero, link->GetWorldAngularVel());
+  EXPECT_EQ(pos0 + time*vel, pos);
+
+  // Start translating and rotating
+  vel.Set(1, 1, 0);
+  math::Vector3 vel2(0, 2.0, 0);
+  link->SetLinearVel(vel);
+  link->SetAngularVel(vel2);
+
+  // Step once
+  world->Step(1);
+  EXPECT_EQ(vel, link->GetWorldLinearVel());
+  EXPECT_EQ(vel2, link->GetWorldAngularVel());
+
+  // test linear velocity at specific point in space
+  math::Vector3 offset(0, 0, -0.5);
+  math::Vector3 vel3 = link->GetWorldLinearVel(offset, math::Quaternion());
+  EXPECT_NEAR(vel3.x, 0.0, g_tolerance);
+  EXPECT_NEAR(vel3.y, 1.0, g_tolerance);
+  EXPECT_NEAR(vel3.z, 0.0, g_tolerance);
+
+  // check rotation
+  if (_physicsEngine.compare("bullet") == 0)
+  {
+    gzerr << "Bullet seems to be off by one time step (#1081)"
+          << std::endl;
+    world->Step(1);
+  }
+  math::Vector3 rpy = link->GetWorldPose().rot.GetAsEuler();
+  EXPECT_NEAR(rpy.x, 0.0, g_tolerance);
+  EXPECT_NEAR(rpy.y, vel2.y*dt, g_tolerance);
+  EXPECT_NEAR(rpy.z, 0.0, g_tolerance);
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsLinkTest, GetWorldEnergy)
+{
+  GetWorldEnergy(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsLinkTest, SetVelocity)
+{
+  SetVelocity(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, PhysicsLinkTest,
+                        PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/physics_msgs.cc b/test/integration/physics_msgs.cc
new file mode 100644
index 0000000..93579df
--- /dev/null
+++ b/test/integration/physics_msgs.cc
@@ -0,0 +1,569 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string.h>
+
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/transport.hh"
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+#define PHYSICS_TOL 1e-2
+using namespace gazebo;
+
+class PhysicsMsgsTest : public ServerFixture,
+                        public testing::WithParamInterface<const char*>
+{
+  public: void MoveTool(const std::string &_physicsEngine);
+  public: void SetGravity(const std::string &_physicsEngine);
+  public: void LinkProperties(const std::string &_physicsEngine);
+  public: void LinkPose(const std::string &_physicsEngine);
+  public: void SimpleShapeResize(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void PhysicsMsgsTest::SetGravity(const std::string &_physicsEngine)
+{
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // check the gravity vector
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  math::Vector3 g = physics->GetGravity();
+
+  // Assume gravity vector points down z axis only.
+  EXPECT_EQ(g.x, 0);
+  EXPECT_EQ(g.y, 0);
+  EXPECT_LE(g.z, -9.8);
+
+  // Set Gravity by publishing to "~/physics"
+  transport::PublisherPtr physicsPub =
+    this->node->Advertise<msgs::Physics>("~/physics");
+  msgs::Physics msg;
+  // it doesn't actually seem to matter what type you set
+  msg.set_type(msgs::Physics::Type_MIN);
+
+  std::vector<math::Vector3> gravity;
+  gravity.push_back(math::Vector3(0, 0, 9.81));
+  gravity.push_back(math::Vector3(0, 0, -20));
+  gravity.push_back(math::Vector3(0, 0, 20));
+  gravity.push_back(math::Vector3(0, 0, 0));
+  gravity.push_back(math::Vector3(0, 0, -9.81));
+  gravity.push_back(math::Vector3(1, 1, 9.81));
+  gravity.push_back(math::Vector3(2, 3, -20));
+  gravity.push_back(math::Vector3(2, -3, 20));
+  gravity.push_back(math::Vector3(-2, 3, 0));
+  gravity.push_back(math::Vector3(-2, -3, -9.81));
+
+  for (std::vector<math::Vector3>::iterator iter = gravity.begin();
+       iter != gravity.end(); ++iter)
+  {
+    msgs::Set(msg.mutable_gravity(), *iter);
+    physicsPub->Publish(msg);
+
+    while (*iter != physics->GetGravity())
+    {
+      world->Step(1);
+      common::Time::MSleep(1);
+    }
+
+    EXPECT_EQ(*iter, physics->GetGravity());
+  }
+}
+
+/////////////////////////////////////////////////
+void PhysicsMsgsTest::MoveTool(const std::string &_physicsEngine)
+{
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // set gravity to zero
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  physics->SetGravity(math::Vector3::Zero);
+
+  // spawn a box
+  std::string name = "test_box";
+  double z0 = 5;
+  math::Vector3 pos = math::Vector3(0, 0, z0);
+  math::Vector3 size = math::Vector3(1, 1, 1);
+  SpawnBox(name, size, pos, math::Vector3::Zero);
+  gzdbg << "SpawnBox called" << std::endl;
+
+  // advertise on "~/model/modify"
+  transport::PublisherPtr modelPub =
+    this->node->Advertise<msgs::Model>("~/model/modify");
+
+  // list of poses to move to
+  std::vector<math::Pose> poses;
+  poses.push_back(math::Pose(5, 0, z0, 0, 0, 0));
+  poses.push_back(math::Pose(0, 8, z0, 0, 0, 0));
+  poses.push_back(math::Pose(-99, 0, z0, 0, 0, 0));
+  poses.push_back(math::Pose(0, 999, z0, 0, 0, 0));
+  poses.push_back(math::Pose(123.456, 456.123, z0*10, 0.1, -0.2, 0.3));
+  poses.push_back(math::Pose(-123.456, 456.123, z0*10, 0.2, 0.4, -0.6));
+  poses.push_back(math::Pose(123.456, -456.123, z0*10, 0.3, -0.6, 0.9));
+  poses.push_back(math::Pose(-123.456, -456.123, z0*10, -0.4, 0.8, -1.2));
+
+  physics::ModelPtr model = world->GetModel(name);
+  ASSERT_TRUE(model != NULL);
+
+  {
+    math::Pose initialPose = model->GetWorldPose();
+    EXPECT_EQ(pos, initialPose.pos);
+  }
+
+  {
+    msgs::Model msg;
+    msg.set_name(name);
+    msg.set_id(model->GetId());
+
+    for (std::vector<math::Pose>::iterator iter = poses.begin();
+         iter != poses.end(); ++iter)
+    {
+      msgs::Set(msg.mutable_pose(), *iter);
+      modelPub->Publish(msg);
+
+      while (*iter != model->GetWorldPose())
+      {
+        world->Step(1);
+        common::Time::MSleep(1);
+      }
+
+      // Take a few steps to verify the correct model pose.
+      // dart has a failure mode that was not exposed without
+      // this change to the test.
+      world->Step(10);
+
+      EXPECT_EQ(*iter, model->GetWorldPose());
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void PhysicsMsgsTest::LinkProperties(const std::string &_physicsEngine)
+{
+  // TODO simbody currently fails this test
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting LinkProperties test for Simbody" << std::endl;
+    return;
+  }
+
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // spawn a box
+  std::string name = "test_box";
+  double z0 = 5;
+  math::Vector3 pos = math::Vector3(0, 0, z0);
+  math::Vector3 size = math::Vector3(1, 1, 1);
+  SpawnBox(name, size, pos, math::Vector3::Zero);
+
+  // advertise on "~/model/modify"
+  transport::PublisherPtr modelPub =
+    this->node->Advertise<msgs::Model>("~/model/modify");
+
+  physics::ModelPtr model = world->GetModel(name);
+  ASSERT_TRUE(model != NULL);
+
+  // change gravity mode and verify the msg gets through
+  physics::LinkPtr link = model->GetLink();
+  ASSERT_TRUE(link != NULL);
+
+  // check default link gravity and kinematic properties
+  {
+    // gravity mode should be enabled by default
+    EXPECT_TRUE(link->GetGravityMode());
+
+    // TODO Bullet currently fails this test
+    if (_physicsEngine != "bullet")
+    {
+      // kinematic mode should be disabled by default
+      EXPECT_TRUE(!link->GetKinematic());
+    }
+    else
+    {
+      gzerr << "Skipping LinkProperties's kinematic test for Bullet" <<
+          std::endl;
+    }
+
+    // self collide mode should be disabled by default
+    EXPECT_TRUE(!link->GetSelfCollide());
+  }
+
+  {
+    // change gravity mode and verify the msg gets through
+    msgs::Model msg;
+    msg.set_name(name);
+    msg.set_id(model->GetId());
+
+    msgs::Link *linkMsg = msg.add_link();
+    linkMsg->set_id(link->GetId());
+    linkMsg->set_name(link->GetScopedName());
+
+    bool newGravityMode = false;
+    EXPECT_TRUE(newGravityMode != link->GetGravityMode());
+    linkMsg->set_gravity(newGravityMode);
+    modelPub->Publish(msg);
+
+    int sleep = 0;
+    int maxSleep = 50;
+    while (link->GetGravityMode() != newGravityMode && sleep < maxSleep)
+    {
+      world->Step(1);
+      common::Time::MSleep(100);
+      sleep++;
+    }
+    ASSERT_TRUE(link->GetGravityMode() == newGravityMode);
+  }
+
+  // TODO Bullet and DART currently fail this test
+  if (_physicsEngine != "bullet" && _physicsEngine != "dart")
+  {
+    // change kinematic mode and verify the msg gets through
+    msgs::Model msg;
+    msg.set_name(name);
+    msg.set_id(model->GetId());
+
+    msgs::Link *linkMsg = msg.add_link();
+    linkMsg->set_id(link->GetId());
+    linkMsg->set_name(link->GetScopedName());
+
+    bool newKinematicMode = true;
+    EXPECT_TRUE(newKinematicMode != link->GetKinematic());
+    linkMsg->set_kinematic(newKinematicMode);
+    modelPub->Publish(msg);
+
+    int sleep = 0;
+    int maxSleep = 50;
+    while (link->GetKinematic() != newKinematicMode && sleep < maxSleep)
+    {
+      world->Step(1);
+      common::Time::MSleep(100);
+      sleep++;
+    }
+    EXPECT_TRUE(link->GetKinematic() == newKinematicMode);
+  }
+  else
+  {
+    gzerr << "Skipping LinkProperties's kinematic test for Bullet" <<
+        std::endl;
+  }
+
+  {
+    // change self collide mode and verify the msg gets through
+    msgs::Model msg;
+    msg.set_name(name);
+    msg.set_id(model->GetId());
+
+    msgs::Link *linkMsg = msg.add_link();
+    linkMsg->set_id(link->GetId());
+    linkMsg->set_name(link->GetName());
+
+    bool newSelfCollideMode = true;
+    EXPECT_TRUE(newSelfCollideMode != link->GetSelfCollide());
+    linkMsg->set_self_collide(newSelfCollideMode);
+    modelPub->Publish(msg);
+
+    int sleep = 0;
+    int maxSleep = 50;
+    while (link->GetSelfCollide() != newSelfCollideMode && sleep < maxSleep)
+    {
+      world->Step(1);
+      common::Time::MSleep(100);
+      sleep++;
+    }
+    EXPECT_TRUE(link->GetSelfCollide() == newSelfCollideMode);
+  }
+}
+
+/////////////////////////////////////////////////
+void PhysicsMsgsTest::LinkPose(const std::string &_physicsEngine)
+{
+  Load("worlds/multilink_shape.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // set gravity to zero
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  physics->SetGravity(math::Vector3::Zero);
+
+  // advertise on "~/model/modify"
+  transport::PublisherPtr modelPub =
+    this->node->Advertise<msgs::Model>("~/model/modify");
+
+  double z0 = 5;
+  // list of poses to move to
+  std::vector<math::Pose> poses;
+  poses.push_back(math::Pose(5, 0, z0, 0, 0, 0));
+  poses.push_back(math::Pose(0, 8, z0, 0, 0, 0));
+  poses.push_back(math::Pose(-99, 0, z0, 0, 0, 0));
+  poses.push_back(math::Pose(0, 999, z0, 0, 0, 0));
+  poses.push_back(math::Pose(123.456, 456.123, z0*10, 0.1, -0.2, 0.3));
+  poses.push_back(math::Pose(-123.456, 456.123, z0*10, 0.2, 0.4, -0.6));
+  poses.push_back(math::Pose(123.456, -456.123, z0*10, 0.3, -0.6, 0.9));
+  poses.push_back(math::Pose(-123.456, -456.123, z0*10, -0.4, 0.8, -1.2));
+
+  std::string name = "multilink";
+  physics::ModelPtr model = world->GetModel(name);
+  ASSERT_TRUE(model != NULL);
+
+  {
+    for (unsigned int i = 0; i < model->GetLinks().size(); ++i)
+    {
+      physics::LinkPtr link = model->GetLinks()[i];
+      ASSERT_TRUE(link != NULL);
+
+      if (link->IsCanonicalLink())
+        continue;
+
+      for (std::vector<math::Pose>::iterator iter = poses.begin();
+           iter != poses.end(); ++iter)
+      {
+        msgs::Model msg;
+        msg.set_name(name);
+        msg.set_id(model->GetId());
+
+        msgs::Link *linkMsg = msg.add_link();
+        linkMsg->set_id(link->GetId());
+        linkMsg->set_name(link->GetScopedName());
+
+        msgs::Set(linkMsg->mutable_pose(), *iter);
+        modelPub->Publish(msg);
+
+        int sleep = 0;
+        int maxSleep = 50;
+        while (*iter != link->GetRelativePose() && sleep < maxSleep)
+        {
+          world->Step(1);
+          common::Time::MSleep(1);
+        }
+
+        // Take a few steps to verify the correct link pose.
+        // dart has a failure mode that was not exposed without
+        // this change to the test.
+        world->Step(10);
+
+        EXPECT_EQ(*iter, link->GetRelativePose());
+      }
+    }
+  }
+}
+
+////////////////////////////////////////////////////////////////////////
+// SimpleShapeResize: (Test adapted from PhysicsTest::SpawnDrop)
+// Load a world, check that gravity points along z axis, spawn simple
+// shapes (box, sphere, cylinder), resize them to be smaller, verify that they
+// then start falling.
+////////////////////////////////////////////////////////////////////////
+void PhysicsMsgsTest::SimpleShapeResize(const std::string &_physicsEngine)
+{
+  // load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // check the gravity vector
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  math::Vector3 g = physics->GetGravity();
+  // Assume gravity vector points down z axis only.
+  EXPECT_EQ(g.x, 0);
+  EXPECT_EQ(g.y, 0);
+  EXPECT_LE(g.z, -9.8);
+
+  // get physics time step
+  double dt = physics->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+
+  // spawn some simple shapes with unit size
+  double z0 = 0.5;
+  std::map<std::string, math::Vector3> modelPos;
+  modelPos["test_box"] = math::Vector3(0, 0, z0);
+  modelPos["test_sphere"] = math::Vector3(4, 0, z0);
+  modelPos["test_cylinder"] = math::Vector3(8, 0, z0);
+
+  SpawnBox("test_box", math::Vector3(1, 1, 1), modelPos["test_box"],
+      math::Vector3::Zero);
+  SpawnSphere("test_sphere", modelPos["test_sphere"], math::Vector3::Zero);
+  SpawnCylinder("test_cylinder", modelPos["test_cylinder"],
+      math::Vector3::Zero);
+
+  // spawn another set of shapes and use messages to resize these
+  modelPos["test_box2"] = math::Vector3(0, 9, z0);
+  modelPos["test_sphere2"] = math::Vector3(4, 9, z0);
+  modelPos["test_cylinder2"] = math::Vector3(8, 9, z0);
+
+  SpawnBox("test_box2", math::Vector3(1, 1, 1), modelPos["test_box2"],
+      math::Vector3::Zero);
+  SpawnSphere("test_sphere2", modelPos["test_sphere2"], math::Vector3::Zero);
+  SpawnCylinder("test_cylinder2", modelPos["test_cylinder2"],
+      math::Vector3::Zero);
+
+  // advertise on "~/model/modify" to generate resize messages
+  transport::PublisherPtr modelPub =
+    this->node->Advertise<msgs::Model>("~/model/modify");
+
+  int steps = 2;
+  physics::ModelPtr model;
+  math::Pose pose1, pose2;
+  math::Vector3 vel1, vel2;
+  double x0, y0;
+
+  // Allow objects to settle on ground_plane
+  world->Step(100);
+
+  // Verify the initial model pose is where we set it to be.
+  for (std::map<std::string, math::Vector3>::iterator iter = modelPos.begin();
+    iter != modelPos.end(); ++iter)
+  {
+    std::string name = iter->first;
+    // Make sure the model is loaded
+    model = world->GetModel(name);
+    EXPECT_TRUE(model != NULL);
+
+    pose1 = model->GetWorldPose();
+    x0 = modelPos[name].x;
+    y0 = modelPos[name].y;
+
+    EXPECT_NEAR(pose1.pos.x, x0, PHYSICS_TOL);
+    EXPECT_NEAR(pose1.pos.y, y0, PHYSICS_TOL);
+    EXPECT_NEAR(pose1.pos.z, z0, PHYSICS_TOL);
+  }
+
+  // resize model to half of it's size
+  double scaleFactor = 0.5;
+  for (std::map<std::string, math::Vector3>::iterator iter = modelPos.begin();
+    iter != modelPos.end(); ++iter)
+  {
+    std::string name = iter->first;
+    model = world->GetModel(name);
+    if (*(name.rbegin()) == '2')
+    {
+      // Use a message to resize this one
+      msgs::Model msg;
+      msg.set_name(name);
+      msg.set_id(model->GetId());
+      msgs::Set(msg.mutable_scale(), scaleFactor * math::Vector3::One);
+      modelPub->Publish(msg);
+    }
+    else
+    {
+      // Use physics API to resize
+      model->SetScale(scaleFactor * math::Vector3::One);
+    }
+  }
+
+  // Predict time of contact with ground plane.
+  double tHit = sqrt(2*(z0-0.5*scaleFactor) / (-g.z));
+  // Time to advance, allow 0.5 s settling time.
+  // This assumes inelastic collisions with the ground.
+  double dtHit = tHit+0.5 - world->GetSimTime().Double();
+  steps = ceil(dtHit / dt);
+  EXPECT_GT(steps, 0);
+  world->Step(steps);
+
+  // Issue #856, simbody doesn't support shape resizes.
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test since simbody doesn't support shape resizes (#856)"
+          << std::endl;
+    return;
+  }
+
+  // This loop checks the velocity and pose of each model 0.5 seconds
+  // after the time of predicted ground contact. The pose is expected to be
+  // underneath the initial pose.
+  for (std::map<std::string, math::Vector3>::iterator iter = modelPos.begin();
+    iter != modelPos.end(); ++iter)
+  {
+    std::string name = iter->first;
+    // Make sure the model is loaded
+    model = world->GetModel(name);
+    if (model != NULL)
+    {
+      gzdbg << "Check ground contact of model " << name << '\n';
+      // Check that model is resting on ground
+      pose1 = model->GetWorldPose();
+      x0 = modelPos[name].x;
+      y0 = modelPos[name].y;
+      EXPECT_NEAR(pose1.pos.x, x0, PHYSICS_TOL);
+      EXPECT_NEAR(pose1.pos.y, y0, PHYSICS_TOL);
+      EXPECT_NEAR(pose1.pos.z, 0.5*scaleFactor, PHYSICS_TOL);
+    }
+    else
+    {
+      gzerr << "Error loading model " << name << '\n';
+      EXPECT_TRUE(model != NULL);
+    }
+  }
+}
+
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsMsgsTest, SetGravity)
+{
+  SetGravity(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsMsgsTest, MoveTool)
+{
+  MoveTool(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsMsgsTest, LinkProperties)
+{
+  LinkProperties(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsMsgsTest, LinkPose)
+{
+  LinkPose(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsMsgsTest, SimpleShapeResize)
+{
+  SimpleShapeResize(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, PhysicsMsgsTest,
+                        PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/physics_thread_safe.cc b/test/integration/physics_thread_safe.cc
new file mode 100644
index 0000000..b48d7ea
--- /dev/null
+++ b/test/integration/physics_thread_safe.cc
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string.h>
+
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/transport.hh"
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+#define PHYSICS_TOL 1e-2
+using namespace gazebo;
+
+class PhysicsThreadSafeTest : public ServerFixture,
+                        public testing::WithParamInterface<const char*>
+{
+  /// \brief Load a blank world and try to change gravity.
+  /// The test passes if it doesn't seg-fault.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void BlankWorld(const std::string &_physicsEngine);
+
+  /// \brief Load the revolute joint test world, unthrottle the update rate,
+  /// and repeately call Link::Get* functions to verify thread safety.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  public: void LinkGet(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void PhysicsThreadSafeTest::BlankWorld(const std::string &_physicsEngine)
+{
+  Load("worlds/blank.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // The following lines cause a seg-fault on revision 031749b
+  // This test passes if it doesn't seg-fault.
+  math::Vector3 g = physics->GetGravity();
+  physics->SetGravity(g);
+}
+
+/////////////////////////////////////////////////
+void PhysicsThreadSafeTest::LinkGet(const std::string &_physicsEngine)
+{
+  Load("worlds/revolute_joint_test.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // Unthrottle the update rate
+  physics->SetRealTimeUpdateRate(0);
+
+  std::string modelName = "pendulum_0deg";
+  std::string linkName = "lower_link";
+
+  physics::ModelPtr model = world->GetModel(modelName);
+  ASSERT_TRUE(model != NULL);
+
+  physics::LinkPtr link = model->GetLink(linkName);
+  ASSERT_TRUE(link != NULL);
+
+  // Start the simulation
+  world->SetPaused(false);
+
+  // Run for 5 seconds of sim time
+  while (world->GetSimTime().sec < 5)
+  {
+    // Call these functions repeatedly
+    // Test passes if it doesn't abort early
+    math::Vector3 vel = link->GetWorldLinearVel();
+    vel += link->GetWorldLinearVel(math::Vector3());
+    vel += link->GetWorldLinearVel(math::Vector3(), math::Quaternion());
+    vel += link->GetWorldCoGLinearVel();
+    vel += link->GetWorldAngularVel();
+  }
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsThreadSafeTest, BlankWorld)
+{
+  BlankWorld(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(PhysicsThreadSafeTest, LinkGet)
+{
+  LinkGet(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, PhysicsThreadSafeTest,
+                        PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/pioneer2dx.cc b/test/integration/pioneer2dx.cc
new file mode 100644
index 0000000..ec2ea81
--- /dev/null
+++ b/test/integration/pioneer2dx.cc
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/common/Time.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+class Pioneer2dx : public ServerFixture,
+                   public testing::WithParamInterface<const char*>
+{
+  public: void StraightLine(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void Pioneer2dx::StraightLine(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Abort test since simbody does not handle pioneer2dx model yet, "
+          << "Please see issue #866.\n";
+    return;
+  }
+
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not handle pioneer2dx model yet.\n"
+          << "Please see issue #912. "
+          << "(https://bitbucket.org/osrf/gazebo/issue/912)\n";
+    return;
+  }
+
+  Load("worlds/pioneer2dx.world", false, _physicsEngine);
+  transport::PublisherPtr velPub = this->node->Advertise<gazebo::msgs::Pose>(
+      "~/pioneer2dx/vel_cmd");
+
+  int i = 0;
+  for (i = 0; i < 1000 && !this->HasEntity("pioneer2dx"); ++i)
+    common::Time::MSleep(500);
+  ASSERT_LT(i, 1000);
+
+  gazebo::msgs::Pose msg;
+  gazebo::msgs::Set(msg.mutable_position(),
+      gazebo::math::Vector3(0.2, 0, 0));
+  gazebo::msgs::Set(msg.mutable_orientation(),
+      gazebo::math::Quaternion(0, 0, 0));
+  velPub->Publish(msg);
+
+  math::Pose startPose, endPose;
+  startPose = this->poses["pioneer2dx"];
+
+  common::Time startTime = this->simTime;
+  common::Time currTime = this->simTime;
+
+  /*struct timespec interval;
+  struct timespec remainder;
+  interval.tv_sec = 1 / 1000;
+  interval.tv_nsec = (1 % 1000) * 1000000;
+  */
+  while (currTime - startTime < common::Time(20, 0))
+  {
+    // nanosleep(&interval, &remainder);
+    common::Time::MSleep(100);
+    currTime = this->simTime;
+  }
+
+  endPose = this->poses["pioneer2dx"];
+
+  double dist = (currTime - startTime).Double() * 0.2;
+  std::cout << "Dist[" << dist << "]\n";
+  std::cout << "EndPose.x[" << endPose.pos.x << "]\n";
+  EXPECT_LT(fabs(endPose.pos.x - dist), 0.1);
+  EXPECT_LT(fabs(endPose.pos.y), 0.5);
+  EXPECT_LT(fabs(endPose.pos.z), 0.01);
+}
+
+
+TEST_P(Pioneer2dx, StraightLine)
+{
+  StraightLine(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, Pioneer2dx, PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/player/CMakeLists.txt b/test/integration/player/CMakeLists.txt
new file mode 100644
index 0000000..bd517ff
--- /dev/null
+++ b/test/integration/player/CMakeLists.txt
@@ -0,0 +1,37 @@
+include_directories (
+  ${ODE_INCLUDE_DIRS}
+  ${OPENGL_INCLUDE_DIR}
+  ${OGRE_INCLUDE_DIRS}
+  ${Boost_INCLUDE_DIRS}
+  ${PLAYER_INCLUDE_DIRS} 
+  ${PROTOBUF_INCLUDE_DIR}
+)
+
+link_directories(  
+  ${OGRE_LIBRARY_PATH}
+  ${Boost_LIBRARY_DIRS} 
+  ${ODE_LIBRARY_DIRS}
+  ${PLAYER_LINK_DIRS}
+)
+
+find_package(GTest REQUIRED)
+include_directories( ${GTEST_INCLUDE_DIRS} )
+
+set (gtest_sources player.cc)
+
+foreach(GTEST_SOURCE_file ${gtest_sources})
+  string(REGEX REPLACE ".cc" "" BINARY_NAME ${GTEST_SOURCE_file})
+  add_executable(${BINARY_NAME} ${GTEST_SOURCE_file} ${PROJECT_SOURCE_DIR}/gazebo/Server.cc ${PROJECT_SOURCE_DIR}/gazebo/Master.cc ${PROJECT_SOURCE_DIR}/gazebo/gazebo.cc)
+
+  target_link_libraries(${BINARY_NAME} ${GTEST_BOTH_LIBRARIES} 
+    gazebo_common
+    gazebo_transport
+    gazebo_physics
+    gazebo_sensors
+    gazebo_rendering
+    gazebo_msgs
+    ${PLAYER_LINK_LIBS}
+    )
+
+  add_test(${BINARY_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME})
+endforeach()
diff --git a/test/integration/player/player.cc b/test/integration/player/player.cc
new file mode 100644
index 0000000..3ed791f
--- /dev/null
+++ b/test/integration/player/player.cc
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <libplayerc++/playerc++.h>
+
+int main(int /*argc*/, char ** /*argv*/)
+{
+  PlayerCc::PlayerClient client(PlayerCc::PLAYER_HOSTNAME,
+                                PlayerCc::PLAYER_PORTNUM);
+  PlayerCc::SimulationProxy sp(&client, 0);
+  PlayerCc::Position2dProxy pp(&client, 0);
+
+  sp.SetPose2d(const_cast<char*>("box_model1"), 1, 1, 0);
+  sp.SetPose3d(const_cast<char*>("box_model1"), -1, -1, 1, 0, 0, 0.707);
+
+  return 1;
+}
+
diff --git a/test/integration/pr2.cc b/test/integration/pr2.cc
new file mode 100644
index 0000000..38576e5
--- /dev/null
+++ b/test/integration/pr2.cc
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/filesystem.hpp>
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+class PR2Test : public ServerFixture,
+                public testing::WithParamInterface<const char*>
+{
+  public: void LoadPR2(std::string _physicsEngine);
+  public: void ScrewJoint(std::string _physicsEngine);
+  public: void StaticPR2(std::string _physicsEngine);
+};
+
+////////////////////////////////////////////////////////////////////////
+void PR2Test::LoadPR2(std::string _physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray sensor in PR2, "
+          << "Please see issue #911.\n";
+    return;
+  }
+
+  // Cleanup test directory.
+  common::SystemPaths *paths = common::SystemPaths::Instance();
+  boost::filesystem::remove_all(paths->GetDefaultTestPath());
+  boost::filesystem::create_directories(paths->GetDefaultTestPath());
+
+  ServerFixture::Load("worlds/empty.world", false, _physicsEngine);
+  SpawnModel("model://pr2");
+
+  int i;
+  for (i = 0; i < 1000 && !this->HasEntity("pr2"); ++i)
+    common::Time::MSleep(1000);
+  EXPECT_LT(i, 1000);
+
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+    return;
+
+
+  sensors::SensorPtr sensor =
+    sensors::get_sensor("narrow_stereo_gazebo_l_stereo_camera_sensor");
+  EXPECT_TRUE(sensor);
+
+  sensors::CameraSensorPtr camSensor =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+  EXPECT_TRUE(camSensor);
+
+  while (!camSensor->SaveFrame(paths->GetDefaultTestPath() + "/frame_10.jpg"))
+    common::Time::MSleep(100);
+
+  physics::get_world("default")->GetPhysicsEngine()->SetGravity(
+      math::Vector3(-0.5, 0, -0.1));
+  for (int i = 11; i < 200; i++)
+  {
+    std::ostringstream filename;
+    filename << paths->GetDefaultTestPath() << "/frame_" << i << ".jpg";
+    camSensor->SaveFrame(filename.str());
+    common::Time::MSleep(100);
+  }
+
+  // Cleanup test directory.
+  boost::filesystem::remove_all(paths->GetDefaultTestPath());
+}
+
+TEST_P(PR2Test, LoadPR2)
+{
+  LoadPR2(GetParam());
+}
+
+////////////////////////////////////////////////////////////////////////
+void PR2Test::ScrewJoint(std::string _physicsEngine)
+{
+  if (_physicsEngine == "bullet")
+  {
+    gzerr << "Abort test since bullet screw joints don't work yet\n";
+    return;
+  }
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray sensor in PR2, "
+          << "Please see issue #911.\n";
+    return;
+  }
+
+  ServerFixture::Load("worlds/pr2.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // check the physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  physics::ModelPtr model = world->GetModel("pr2");
+  ASSERT_TRUE(model != NULL);
+
+  physics::LinkPtr link = model->GetLink("torso_lift_link");
+  ASSERT_TRUE(link != NULL);
+
+  physics::JointPtr motor = model->GetJoint("torso_lift_motor_screw_joint");
+  ASSERT_TRUE(motor != NULL);
+  motor->SetEffortLimit(0, 1000);
+
+  physics::JointPtr screw =
+    model->GetJoint("torso_lift_screw_torso_lift_joint");
+  ASSERT_TRUE(screw != NULL);
+
+  // Let it settle a bit
+  world->Step(300);
+
+  // Set a fixed velocity on revolute joint that connects to the screw joint
+  unsigned int steps = 1000;
+  for (unsigned int i = 0; i < steps; ++i)
+  {
+    motor->SetForce(0, 10);
+    world->Step(1);
+  }
+
+  // Expect torso to lift at least 1 mm/s
+  gzdbg << "motor " << motor->GetVelocity(0) << std::endl;
+  gzdbg << "screw " << screw->GetVelocity(0) << std::endl;
+  gzdbg << "link  " << link->GetWorldLinearVel() << std::endl;
+  EXPECT_GT(link->GetWorldLinearVel().z, 1e-3);
+}
+
+////////////////////////////////////////////////////////////////////////
+// StaticPR2:
+// Issue #586 noted a segfault when loading a pr2 as static and stepping
+// physics forward. This test loads a world with several objects and
+// steps time forward.
+////////////////////////////////////////////////////////////////////////
+void PR2Test::StaticPR2(std::string _physicsEngine)
+{
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Abort test since simbody does not support screw joints in PR2, "
+          << "Please see issue #857.\n";
+    return;
+  }
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray sensor in PR2, "
+          << "Please see issue #911.\n";
+    return;
+  }
+
+  ServerFixture::Load("worlds/static_pr2.world", true, _physicsEngine);
+
+  // The body of this is copied from PhysicsTest::EmptyWorld
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // simulate 1 step
+  world->Step(1);
+  double t = world->GetSimTime().Double();
+  // verify that time moves forward
+  EXPECT_GT(t, 0);
+
+  // simulate a few steps
+  int steps = 20;
+  world->Step(steps);
+  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+  t = world->GetSimTime().Double();
+  EXPECT_GT(t, 0.99*dt*static_cast<double>(steps+1));
+}
+
+TEST_P(PR2Test, ScrewJoint)
+{
+  ScrewJoint(GetParam());
+}
+
+TEST_P(PR2Test, StaticPR2)
+{
+  StaticPR2(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, PR2Test, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/projector.cc b/test/integration/projector.cc
new file mode 100644
index 0000000..87df6fc
--- /dev/null
+++ b/test/integration/projector.cc
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include "ServerFixture.hh"
+#include "images_cmp.h"
+
+using namespace gazebo;
+class ProjectorTest : public ServerFixture
+{
+};
+
+TEST_F(ProjectorTest, Projector)
+{
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+    return;
+
+  Load("worlds/projector.world");
+  SpawnCamera("camera_model", "camera_sensor", math::Vector3(-4, 0, 1),
+              math::Vector3(0, GZ_DTOR(10), 0));
+
+  unsigned char *img = NULL;
+  unsigned int width;
+  unsigned int height;
+  GetFrame("camera_sensor", &img, width, height);
+  ASSERT_EQ(width, static_cast<unsigned int>(320));
+  ASSERT_EQ(height, static_cast<unsigned int>(240));
+
+  unsigned int diffMax = 0;
+  unsigned int diffSum = 0;
+  double diffAvg = 0;
+  ImageCompare(img, projector_world_camera,
+      width, height, 3, diffMax, diffSum, diffAvg);
+  // PrintImage("projector_world_camera", &img, width, height, 3);
+  ASSERT_EQ(diffSum, static_cast<unsigned int>(0));
+  ASSERT_EQ(diffMax, static_cast<unsigned int>(0));
+  ASSERT_EQ(diffAvg, 0.0);
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/rendering_sensor.cc b/test/integration/rendering_sensor.cc
new file mode 100644
index 0000000..24d8a3b
--- /dev/null
+++ b/test/integration/rendering_sensor.cc
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class RenderingSensorTest : public ServerFixture
+{
+};
+
+
+common::Time lastTimestamp;
+std::vector<common::Time> gpuRayTimeStamps;
+std::vector<common::Time> cam1TimeStamps;
+std::vector<common::Time> cam2TimeStamps;
+
+// Collects gpu ray sensor's data timestamps for the TimeStamp test
+void OnReceiveGpuRayMsg(ConstLaserScanStampedPtr &_msg)
+{
+  gpuRayTimeStamps.push_back(
+      common::Time(_msg->time().sec(), _msg->time().nsec()));
+}
+
+// Collects camera sensor's data timestamps for the TimeStamp test
+void OnReceiveCamera1Msg(ConstImageStampedPtr &_msg)
+{
+  cam1TimeStamps.push_back(
+      common::Time(_msg->time().sec(), _msg->time().nsec()));
+}
+
+// Collects camera sensor2's data timestamps for the TimeStamp test
+void OnReceiveCamera2Msg(ConstImageStampedPtr &_msg)
+{
+  cam2TimeStamps.push_back(
+      common::Time(_msg->time().sec(), _msg->time().nsec()));
+}
+
+/////////////////////////////////////////////////
+/// \brief Create mulitiple rendering sensors so that there's some contention
+/// for gpu resources. Verify delays do not cause duplicate timestamps
+TEST_F(RenderingSensorTest, Timestamp)
+{
+  Load("worlds/empty_test.world");
+
+  // Make sure the render engine is available.
+  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
+      rendering::RenderEngine::NONE)
+  {
+    gzerr << "No rendering engine, unable to run camera test\n";
+    return;
+  }
+
+  // Spawn multiple camera sensors with reasonably high resolution and
+  // framerate. The long update time needed for these camera sensors cause
+  // delays to other rendering sensors updates, resulting in the sensors trying
+  // to catch up in order to achieve their target update rate. The test verifies
+  // that this update strategy does not produce duplicate timestamped data and
+  // are in the right order.
+  std::string modelName = "camera_model";
+  std::string cameraName = "camera_sensor";
+  unsigned int width  = 800;
+  unsigned int height = 800;
+  double updateRate = 30;
+  math::Pose camPose(
+      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
+  SpawnCamera(modelName, cameraName, camPose.pos,
+      camPose.rot.GetAsEuler(), width, height, updateRate);
+
+  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
+  EXPECT_TRUE(sensor != NULL);
+
+  sensors::CameraSensorPtr camSensor1 =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
+  EXPECT_TRUE(camSensor1 != NULL);
+
+  std::string modelName2 = "camera_model2";
+  std::string cameraName2 = "camera_sensor2";
+  math::Pose camPose2(
+      math::Vector3(5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
+  SpawnCamera(modelName2, cameraName2, camPose2.pos,
+      camPose2.rot.GetAsEuler(), width, height, updateRate);
+
+  sensors::SensorPtr sensor2 = sensors::get_sensor(cameraName2);
+  EXPECT_TRUE(sensor2 != NULL);
+
+  sensors::CameraSensorPtr camSensor2 =
+    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor2);
+  EXPECT_TRUE(camSensor2 != NULL);
+
+  // spawn gpu ray sensor
+  std::string modelName3 = "gpu_ray_model";
+  std::string raySensorName = "gpu_ray_sensor";
+  double hMinAngle = -2.0;
+  double hMaxAngle = 2.0;
+  double minRange = 0.1;
+  double maxRange = 5.0;
+  double rangeResolution = 0.02;
+  unsigned int samples = 640;
+  math::Pose testPose(math::Vector3(0, 0, 0.1),
+      math::Quaternion(0, 0, 0));
+
+  SpawnGpuRaySensor(modelName3, raySensorName, testPose.pos,
+      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, minRange, maxRange,
+      rangeResolution, samples);
+
+  sensors::SensorPtr sensor3 = sensors::get_sensor(raySensorName);
+  ASSERT_TRUE(sensor3 != NULL);
+
+  sensors::GpuRaySensorPtr gpuRaySensor =
+    boost::dynamic_pointer_cast<sensors::GpuRaySensor>(sensor3);
+  EXPECT_TRUE(gpuRaySensor != NULL);
+
+  camSensor1->SetActive(true);
+  camSensor2->SetActive(true);
+  gpuRaySensor->SetActive(true);
+
+  transport::NodePtr node = transport::NodePtr(new transport::Node());
+  node->Init();
+
+  transport::SubscriberPtr cam1Sub = node->Subscribe(camSensor1->GetTopic(),
+      &OnReceiveCamera1Msg);
+  transport::SubscriberPtr cam2Sub = node->Subscribe(camSensor2->GetTopic(),
+      &OnReceiveCamera2Msg);
+  transport::SubscriberPtr gpuRaySub = node->Subscribe(gpuRaySensor->GetTopic(),
+      &OnReceiveGpuRayMsg);
+
+  unsigned int numTimestamps = 100;
+  // wait for a few laser scans
+  gpuRayTimeStamps.clear();
+  cam1TimeStamps.clear();
+  cam2TimeStamps.clear();
+  int i = 0;
+  while ((gpuRayTimeStamps.size() < numTimestamps ||
+      cam1TimeStamps.size() < numTimestamps ||
+      cam2TimeStamps.size() < numTimestamps) && i < 500)
+  {
+    common::Time::MSleep(100);
+    i++;
+  }
+  ASSERT_LT(i, 500);
+
+  // Verify that there are no duplicate timestamps
+  for (unsigned int j = 0; j < numTimestamps - 1; ++j)
+  {
+    EXPECT_TRUE (gpuRayTimeStamps[j] < gpuRayTimeStamps[j+1]);
+    EXPECT_TRUE (cam1TimeStamps[j] < cam1TimeStamps[j+1]);
+    EXPECT_TRUE (cam2TimeStamps[j] < cam2TimeStamps[j+1]);
+  }
+
+  gpuRayTimeStamps.clear();
+  cam1TimeStamps.clear();
+  cam2TimeStamps.clear();
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/scans_cmp.h b/test/integration/scans_cmp.h
new file mode 100644
index 0000000..fee3c98
--- /dev/null
+++ b/test/integration/scans_cmp.h
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef TEST_SCANS_CMP_H_
+#define TEST_SCANS_CMP_H_
+
+#ifdef __GNUC__
+    #define MAYBE_UNUSED __attribute__((used))
+#elif defined _MSC_VER
+    #pragma warning(disable: Cxxxxx)
+    #define MAYBE_UNUSED
+#else
+    #define MAYBE_UNUSED
+#endif
+
+static double __box_scan[] = {
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+1.5782253900,  1.5746053417,  1.5710809871,  1.5676513303,  1.5643154072,
+1.5610722851,  1.5579210616,  1.5548608639,  1.5518908487,  1.5490102012,
+1.5462181345,  1.5435138895,  1.5408967337,  1.5383659613,  1.5359208926,
+1.5335608733,  1.5312852740,  1.5290934905,  1.5269849423,  1.5249590733,
+1.5230153506,  1.5211532647,  1.5193723288,  1.5176720787,  1.5160520724,
+1.5145118900,  1.5130511332,  1.5116694251,  1.5103664100,  1.5091417531,
+1.5079951406,  1.5069262791,  1.5059348955,  1.5050207370,  1.5041835708,
+1.5034231841,  1.5027393839,  1.5021319965,  1.5016008682,  1.5011458645,
+1.5007668702,  1.5004637896,  1.5002365461,  1.5000850823,  1.5000093600,
+1.5000093600,  1.5000850823,  1.5002365461,  1.5004637896,  1.5007668702,
+1.5011458645,  1.5016008682,  1.5021319965,  1.5027393839,  1.5034231841,
+1.5041835708,  1.5050207370,  1.5059348955,  1.5069262791,  1.5079951406,
+1.5091417531,  1.5103664099,  1.5116694251,  1.5130511332,  1.5145118900,
+1.5160520724,  1.5176720786,  1.5193723287,  1.5211532647,  1.5230153506,
+1.5249590733,  1.5269849423,  1.5290934904,  1.5312852740,  1.5335608732,
+1.5359208926,  1.5383659613,  1.5408967337,  1.5435138894,  1.5462181345,
+1.5490102012,  1.5518908487,  1.5548608639,  1.5579210616,  1.5610722851,
+1.5643154072,  1.5676513302,  1.5710809871,  1.5746053417,  1.5782253899,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000};
+static double *box_scan MAYBE_UNUSED = __box_scan;
+
+static double __plane_scan[] = {
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000,  9.6656585634,  9.0478807252,
+8.5047324589,  8.0234841835,  7.5941456600,  7.2087667472,  6.8609419394,
+6.5454526113,  6.2580042926,  5.9950307712,  5.7535460007,  5.5310307326,
+5.3253447326,  5.1346580881,  4.9573969333,  4.7922001805,  4.6378847381,
+4.4934173364,  4.3578915401,  4.2305088671,  4.1105631832,  3.9974277273,
+3.8905442644,  3.7894139705,  3.6935897344,  3.6026696258,  3.5162913303,
+3.4341273861,  3.3558810921,  3.2812829795,  3.2100877580,  3.1420716642,
+3.0770301506,  3.0147758675,  2.9551368928,  2.8979551762,  2.8430851689,
+2.7903926111,  2.7397534594,  2.6910529333,  2.6441846666,  2.5990499509,
+2.5555570588,  2.5136206380,  2.4731611670,  2.4341044661,  2.3963812565,
+2.3599267625,  2.3246803517,  2.2905852094,  2.2575880428,  2.2256388129,
+2.1946904899,  2.1646988309,  2.1356221764,  2.1074212653,  2.0800590642,
+2.0535006127,  2.0277128801,  2.0026646344,  1.9783263219,  1.9546699563,
+1.9316690161,  1.9092983502,  1.8875340914,  1.8663535750,  1.8457352644,
+1.8256586826,  1.8061043472,  1.7870537115,  1.7684891092,  1.7503937029,
+1.7327514359,  1.7155469886,  1.6987657360,  1.6823937094,  1.6664175601,
+1.6508245260,  1.6356023991,  1.6207394968,  1.6062246337,  1.5920470957,
+1.5781966157,  1.5646633508,  1.5514378607,  1.5385110875,  1.5258743370,
+1.5135192604,  1.5014378379,  1.4896223627,  1.4780654261,  1.4667599035,
+1.4556989409,  1.4448759425,  1.4342845592,  1.4239186765,  1.4137724050,
+1.4038400696,  1.3941162003,  1.3845955233,  1.3752729523,  1.3661435806,
+1.3572026733,  1.3484456602,  1.3398681287,  1.3314658175,  1.3232346102,
+1.3151705296,  1.3072697317,  1.2995285007,  1.2919432439,  1.2845104866,
+1.2772268677,  1.2700891354,  1.2630941425,  1.2562388432,  1.2495202886,
+1.2429356234,  1.2364820824,  1.2301569870,  1.2239577424,  1.2178818341,
+1.2119268257,  1.2060903552,  1.2003701333,  1.1947639402,  1.1892696236,
+1.1838850960,  1.1786083331,  1.1734373709,  1.1683703044,  1.1634052849,
+1.1585405190,  1.1537742661,  1.1491048371,  1.1445305925,  1.1400499409,
+1.1356613378,  1.1313632835,  1.1271543224,  1.1230330412,  1.1189980678,
+1.1150480699,  1.1111817542,  1.1073978648,  1.1036951824,  1.1000725232,
+1.0965287377,  1.0930627101,  1.0896733570,  1.0863596268,  1.0831204985,
+1.0799549813,  1.0768621133,  1.0738409614,  1.0708906196,  1.0680102095,
+1.0651988785,  1.0624557997,  1.0597801715,  1.0571712163,  1.0546281804,
+1.0521503335,  1.0497369679,  1.0473873979,  1.0451009599,  1.0428770110,
+1.0407149295,  1.0386141136,  1.0365739817,  1.0345939715,  1.0326735396,
+1.0308121617,  1.0290093316,  1.0272645609,  1.0255773792,  1.0239473333,
+1.0223739870,  1.0208569207,  1.0193957316,  1.0179900327,  1.0166394533,
+1.0153436380,  1.0141022473,  1.0129149566,  1.0117814565,  1.0107014523,
+1.0096746639,  1.0087008260,  1.0077796872,  1.0069110104,  1.0060945724,
+1.0053301640,  1.0046175896,  1.0039566671,  1.0033472281,  1.0027891173,
+1.0022821928,  1.0018263259,  1.0014214010,  1.0010673155,  1.0007639796,
+1.0005113168,  1.0003092630,  1.0001577673,  1.0000567915,  1.0000063099,
+1.0000063099,  1.0000567915,  1.0001577673,  1.0003092630,  1.0005113168,
+1.0007639796,  1.0010673155,  1.0014214010,  1.0018263259,  1.0022821928,
+1.0027891173,  1.0033472281,  1.0039566671,  1.0046175896,  1.0053301640,
+1.0060945724,  1.0069110104,  1.0077796872,  1.0087008260,  1.0096746639,
+1.0107014523,  1.0117814565,  1.0129149566,  1.0141022473,  1.0153436380,
+1.0166394533,  1.0179900327,  1.0193957316,  1.0208569207,  1.0223739870,
+1.0239473333,  1.0255773792,  1.0272645609,  1.0290093316,  1.0308121617,
+1.0326735396,  1.0345939715,  1.0365739817,  1.0386141136,  1.0407149295,
+1.0428770110,  1.0451009599,  1.0473873979,  1.0497369679,  1.0521503335,
+1.0546281804,  1.0571712163,  1.0597801715,  1.0624557997,  1.0651988785,
+1.0680102095,  1.0708906196,  1.0738409614,  1.0768621133,  1.0799549813,
+1.0831204985,  1.0863596268,  1.0896733570,  1.0930627101,  1.0965287377,
+1.1000725232,  1.1036951824,  1.1073978648,  1.1111817542,  1.1150480699,
+1.1189980678,  1.1230330412,  1.1271543224,  1.1313632835,  1.1356613378,
+1.1400499409,  1.1445305925,  1.1491048371,  1.1537742661,  1.1585405190,
+1.1634052849,  1.1683703044,  1.1734373709,  1.1786083331,  1.1838850960,
+1.1892696236,  1.1947639402,  1.2003701333,  1.2060903552,  1.2119268257,
+1.2178818341,  1.2239577424,  1.2301569870,  1.2364820824,  1.2429356234,
+1.2495202886,  1.2562388432,  1.2630941425,  1.2700891354,  1.2772268677,
+1.2845104866,  1.2919432439,  1.2995285007,  1.3072697317,  1.3151705296,
+1.3232346102,  1.3314658175,  1.3398681287,  1.3484456602,  1.3572026733,
+1.3661435806,  1.3752729523,  1.3845955233,  1.3941162003,  1.4038400696,
+1.4137724050,  1.4239186765,  1.4342845592,  1.4448759425,  1.4556989409,
+1.4667599035,  1.4780654261,  1.4896223627,  1.5014378379,  1.5135192604,
+1.5258743370,  1.5385110875,  1.5514378607,  1.5646633508,  1.5781966157,
+1.5920470957,  1.6062246337,  1.6207394968,  1.6356023991,  1.6508245260,
+1.6664175601,  1.6823937094,  1.6987657360,  1.7155469886,  1.7327514359,
+1.7503937029,  1.7684891092,  1.7870537115,  1.8061043472,  1.8256586826,
+1.8457352644,  1.8663535750,  1.8875340914,  1.9092983502,  1.9316690161,
+1.9546699563,  1.9783263219,  2.0026646344,  2.0277128801,  2.0535006127,
+2.0800590642,  2.1074212653,  2.1356221764,  2.1646988309,  2.1946904899,
+2.2256388129,  2.2575880428,  2.2905852094,  2.3246803517,  2.3599267625,
+2.3963812565,  2.4341044661,  2.4731611670,  2.5136206380,  2.5555570588,
+2.5990499509,  2.6441846666,  2.6910529333,  2.7397534594,  2.7903926111,
+2.8430851689,  2.8979551762,  2.9551368928,  3.0147758675,  3.0770301506,
+3.1420716642,  3.2100877580,  3.2812829795,  3.3558810921,  3.4341273861,
+3.5162913303,  3.6026696258,  3.6935897344,  3.7894139705,  3.8905442644,
+3.9974277273,  4.1105631832,  4.2305088671,  4.3578915401,  4.4934173364,
+4.6378847381,  4.7922001805,  4.9573969333,  5.1346580881,  5.3253447326,
+5.5310307326,  5.7535460007,  5.9950307712,  6.2580042926,  6.5454526113,
+6.8609419394,  7.2087667472,  7.5941456600,  8.0234841835,  8.5047324589,
+9.0478807252,  9.6656585634, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
+10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000};
+static double *plane_scan MAYBE_UNUSED = __plane_scan;
+
+#endif
diff --git a/test/integration/sdf.cc b/test/integration/sdf.cc
new file mode 100644
index 0000000..bef0c99
--- /dev/null
+++ b/test/integration/sdf.cc
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class SDFTest : public ServerFixture
+{
+};
+
+TEST_F(PR2Test, Param)
+{
+  sdf::ParamT<char> charP("c", 'a', 0);
+  sdf::ParamT<bool> boolP("b", true, 0);
+  sdf::ParamT<float> floatP("f", 1.0, 0);
+  sdf::ParamT<double> doubleP("d", 1.0, 0);
+  sdf::ParamT<int> intP("i", 1, 0);
+  sdf::ParamT<unsigned int> uintP("ui", 1, 0);
+  sdf::ParamT<std::string> stringP("s", "default", 0);
+  sdf::ParamT<common::Color> colorP("c", common::Color(.1, .2, .3, 1), 0);
+  sdf::ParamT<math::Vector3> vec3P("v3", math::Vector3(1, 2, 3), 0);
+  sdf::ParamT<math::Pose> poseP("v3", math::Pose(math::Vector3(1, 2, 3),
+        math::Quaternion(0, 0, M_PI)), 0);
+
+  EXPECT_TRUE(boolP.IsBool());
+  EXPECT_TRUE(intP.IsInt());
+  EXPECT_TRUE(uintP.IsUInt());
+  EXPECT_TRUE(floatP.IsFloat());
+  EXPECT_TRUE(doubleP.IsDouble());
+  EXPECT_TRUE(doubleP.IsDouble());
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/server_fixture.cc b/test/integration/server_fixture.cc
new file mode 100644
index 0000000..129a066
--- /dev/null
+++ b/test/integration/server_fixture.cc
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+class ServerFixtureTest : public ServerFixture,
+                          public testing::WithParamInterface<const char*>
+{
+  public: void LoadPaused(const std::string &_physicsType);
+  public: void LoadEmptyOfType(const std::string &_physicsType);
+  public: void SpawnSDF(const std::string &_physicsType);
+};
+
+////////////////////////////////////////////////////////////////////////
+// LoadPaused:
+// Verify that ServerFixture can load world in paused state
+// Gazebo issue #334
+////////////////////////////////////////////////////////////////////////
+void ServerFixtureTest::LoadPaused(const std::string &_physicsType)
+{
+  // Note the second argument of Load sets the pause state
+  Load("worlds/empty.world", true, _physicsType);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+  gzdbg << "Check IsPaused with no delay\n";
+  EXPECT_TRUE(world->IsPaused());
+
+  common::Time::MSleep(100);
+  gzdbg << "Check IsPaused with 100 ms delay\n";
+  EXPECT_TRUE(world->IsPaused());
+
+  common::Time::MSleep(900);
+  gzdbg << "Check IsPaused with 1000 ms delay\n";
+  EXPECT_TRUE(world->IsPaused());
+}
+
+TEST_P(ServerFixtureTest, LoadPaused)
+{
+  LoadPaused(GetParam());
+}
+
+////////////////////////////////////////////////////////////////////////
+// LoadEmptyOfType:
+// Verify that ServerFixture can load empty world with different types
+// of physics engines (issue #486)
+////////////////////////////////////////////////////////////////////////
+void ServerFixtureTest::LoadEmptyOfType(const std::string &_physicsType)
+{
+  // Note the second argument of Load sets the pause state
+  Load("worlds/empty.world", true, _physicsType);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsType);
+}
+
+TEST_P(ServerFixtureTest, LoadEmptyOfType)
+{
+  LoadEmptyOfType(GetParam());
+}
+
+////////////////////////////////////////////////////////////////////////
+// SpawnSDF:
+// Verify that the SpawnSDF function does not get stuck in a loop
+// Gazebo issue #530
+////////////////////////////////////////////////////////////////////////
+void ServerFixtureTest::SpawnSDF(const std::string &_physicsType)
+{
+  // Note the second argument of Load sets the pause state
+  Load("worlds/blank.world", true, _physicsType);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+  EXPECT_TRUE(world->IsPaused());
+
+  std::stringstream sdfStr;
+  math::Pose pose(1, 2, 3, 0, 0, 0);
+  sdfStr << "<sdf version='" << SDF_VERSION << "'>"
+         << "<model name='box'>"
+         << "  <pose>" << pose << "</pose>"
+         << "  <link name='link'>"
+         << "    <collision name='col'>"
+         << "      <geometry>"
+         << "        <box><size>1 1 1</size></box>"
+         << "      </geometry>"
+         << "    </collision>"
+         << "    <visual name='vis'>"
+         << "      <geometry>"
+         << "        <box><size>1 1 1</size></box>"
+         << "      </geometry>"
+         << "    </visual>"
+         << "  </link>"
+         << "</model>"
+         << "</sdf>";
+  ServerFixture::SpawnSDF(sdfStr.str());
+
+  physics::ModelPtr model;
+  model = world->GetModel("box");
+  ASSERT_TRUE(model != NULL);
+
+  EXPECT_EQ(pose.pos, model->GetWorldPose().pos);
+}
+
+TEST_P(ServerFixtureTest, SpawnSDF)
+{
+  SpawnSDF(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, ServerFixtureTest,
+                        PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/set_joint.cc b/test/integration/set_joint.cc
new file mode 100644
index 0000000..ab87dea
--- /dev/null
+++ b/test/integration/set_joint.cc
@@ -0,0 +1,691 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+
+using namespace gazebo;
+class PhysicsTest : public ServerFixture
+{
+};
+
+
+TEST_F(PhysicsTest, State)
+{
+  {
+    // intentionally break the joint using Link::SetWorldPose
+    // let it conflict with Physics pose updates and make sure
+    // internal model state stays consistent
+
+    Load("worlds/empty.world");
+    physics::WorldPtr world = physics::get_world("default");
+    world->SetPaused(true);
+    EXPECT_TRUE(world != NULL);
+
+    world->GetPhysicsEngine()->SetGravity(math::Vector3(0, 0, 0));
+
+    physics::WorldState worldState = world->GetState();
+    physics::ModelState modelState = worldState.GetModelState(0);
+    physics::LinkState linkState = modelState.GetLinkState(0);
+
+
+    {
+      msgs::Factory msg;
+
+      std::ostringstream newModelStr;
+
+      math::Pose pose(0, 0, 3, 0, 0, 0);
+      math::Vector3 size(1.0, 0.1, 0.1);
+      newModelStr
+        << "<gazebo version='" << SDF_VERSION << "'>\n"
+        << "  <model name='model_1'>\n"
+        << "    <pose>" << pose << "</pose>\n"
+        << "    <link name='link_1'>\n"
+        << "      <pose>0 0 0 0 0 0</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <link name='link_2'>\n"
+        << "      <pose>1 0 0 0 0 0</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_01' type='revolute'>\n"
+        << "      <parent>world</parent>\n"
+        << "      <child>link_1</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>1 1 0</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <joint name='joint_12' type='revolute'>\n"
+        << "      <parent>link_1</parent>\n"
+        << "      <child>link_2</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>1 -1 0</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+
+        << "    <link name='link_2a'>\n"  // opposite of link_5
+        << "      <pose>1 -1 0 0 0 " << 0.5*M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_2a2' type='revolute'>\n"
+        << "      <parent>link_2a</parent>\n"
+        << "      <child>link_2</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+
+        << "    <link name='link_2b'>\n"  // second loop start
+        << "      <pose>1 -1 0 0 0 " << 0.0*M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_2a2b' type='revolute'>\n"
+        << "      <parent>link_2a</parent>\n"
+        << "      <child>link_2b</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+
+        << "    <link name='link_3a'>\n"  // second branch
+        << "      <pose>2 -1 0 0 0 " << -0.5*M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_2a3a' type='revolute'>\n"
+        << "      <parent>link_2b</parent>\n"
+        << "      <child>link_3a</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+
+        << "    <link name='link_4a'>\n"  // second branch
+        << "      <pose>2 -2 0 0 0 " << -1.0*M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_3a4a' type='revolute'>\n"
+        << "      <parent>link_3a</parent>\n"
+        << "      <child>link_4a</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+
+        << "    <link name='link_5a'>\n"  // second branch
+        << "      <pose>1 -2 0 0 0 " << 0.5*M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_4a5a' type='revolute'>\n"
+        << "      <parent>link_4a</parent>\n"
+        << "      <child>link_5a</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <joint name='joint_5a2b' type='revolute'>\n"  // loop closer
+        << "      <parent>link_5a</parent>\n"
+        << "      <child>link_2b</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+
+        << "    <link name='link_3'>\n"
+        << "      <pose>2 0 0 0 0 " << 0.5*M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_23' type='revolute'>\n"
+        << "      <parent>link_2</parent>\n"
+        << "      <child>link_3</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+
+        << "    <link name='link_4'>\n"
+        << "      <pose>2 1 0 0 0 " << M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_34' type='revolute'>\n"
+        << "      <parent>link_3</parent>\n"
+        << "      <child>link_4</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <link name='link_5'>\n"
+        << "      <pose>1 1 0 0 0 " << 1.5*M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_45' type='revolute'>\n"
+        << "      <parent>link_4</parent>\n"
+        << "      <child>link_5</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <joint name='joint_52' type='revolute'>\n"
+        << "      <parent>link_5</parent>\n"
+        << "      <child>link_2</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "  </model>\n"
+        << "</gazebo>\n";
+
+      msg.set_sdf(newModelStr.str());
+
+      transport::PublisherPtr factoryPub
+        = this->node->Advertise<msgs::Factory>("~/factory");
+      this->factoryPub->Publish(msg);
+    }
+
+    sleep(5);
+
+    world->EnablePhysicsEngine(false);
+
+    physics::ModelPtr model = world->GetModel("model_1");
+    while (!model)
+    {
+      model = world->GetModel("model_1");
+      gzdbg << "waiting for model_1 to spawn\n";
+      sleep(1);
+    }
+    world->SetPaused(false);
+
+    physics::JointPtr joint_01 = model->GetJoint("model_1::joint_01");
+    physics::JointPtr joint_12 = model->GetJoint("model_1::joint_12");
+    physics::JointPtr joint_23 = model->GetJoint("model_1::joint_23");
+    physics::JointPtr joint_34 = model->GetJoint("model_1::joint_34");
+    physics::JointPtr joint_45 = model->GetJoint("model_1::joint_45");
+    physics::JointPtr joint_52 = model->GetJoint("model_1::joint_52");
+    physics::JointPtr joint_2a2 = model->GetJoint("model_1::joint_2a2");
+    physics::JointPtr joint_2a2b = model->GetJoint("model_1::joint_2a2b");
+    physics::JointPtr joint_2a3a = model->GetJoint("model_1::joint_2a3a");
+    physics::JointPtr joint_3a4a = model->GetJoint("model_1::joint_3a4a");
+    physics::JointPtr joint_4a5a = model->GetJoint("model_1::joint_4a5a");
+    physics::JointPtr joint_5a2b = model->GetJoint("model_1::joint_5a2b");
+
+    EXPECT_TRUE(joint_01   != NULL);
+    EXPECT_TRUE(joint_12   != NULL);
+    EXPECT_TRUE(joint_23   != NULL);
+    EXPECT_TRUE(joint_34   != NULL);
+    EXPECT_TRUE(joint_45   != NULL);
+    EXPECT_TRUE(joint_52   != NULL);
+    EXPECT_TRUE(joint_2a2  != NULL);
+    EXPECT_TRUE(joint_2a2b != NULL);
+    EXPECT_TRUE(joint_2a3a != NULL);
+    EXPECT_TRUE(joint_3a4a != NULL);
+    EXPECT_TRUE(joint_4a5a != NULL);
+    EXPECT_TRUE(joint_5a2b != NULL);
+
+
+    double start_time;
+    double start_wall_time;
+    double test_duration;
+    double pub_rate;
+    double last_update_time;
+    double elapsed_wall_time;
+
+    srand_r(seed)(time(NULL));
+    int seed = time(NULL);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 5;
+    pub_rate = 1.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Joint::SetAngle at ["
+      << pub_rate << "] Hz in real time, to all joint, should diverge.\n";
+    last_update_time = start_wall_time;
+    while (world->GetRealTime().Double() < start_wall_time + test_duration)
+      if (world->GetRealTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetRealTime().Double();
+
+        int n = model->GetJointCount();
+        for (int i = 0; i < n; ++i)
+          model->GetJoint(i)->SetAngle(0,
+              0.1*static_cast<double>(rand_r(seed)())/
+              static_cast<double>(RAND_MAX));
+      }
+    test_duration = world->GetSimTime().Double() - start_time;
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+
+
+
+
+
+
+
+    world->EnablePhysicsEngine(true);
+
+
+    /* set all link velocities to 0
+       std::vector<physics::LinkPtr> links = model->GetAllLinks();
+       for (unsigned i = 0; i < links.size(); ++i)
+       {
+       links[i]->SetLinearVel(math::Vector3(0, 0, 0));
+       links[i]->SetAngularVel(math::Vector3(0, 0, 0));
+       } */
+
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 20;
+    pub_rate = 0.5;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Joint::SetAngle at ["
+      << pub_rate << "] Hz to non-loop joints, should have no violation.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        double a = 0.50*(2.0*
+            static_cast<double>(rand_r(seed)())/
+            static_cast<double>(RAND_MAX) - 1.0);
+        joint_01->SetAngle(0, a);
+        // joint_12->SetAngle(0, a);
+        // joint_23->SetAngle(0, a);
+        // joint_2a2->SetAngle(0, a);
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+    // EXPECT_EQ(joint_5a2b->GetAngle(0).Radian(), 0.0);
+    Unload();
+  }
+}
+
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/set_pose.cc b/test/integration/set_pose.cc
new file mode 100644
index 0000000..6e6819b
--- /dev/null
+++ b/test/integration/set_pose.cc
@@ -0,0 +1,635 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// #include <signal.h>
+// #include "gazebo/gui/GuiIface.hh"
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+
+using namespace gazebo;
+class PhysicsTest : public ServerFixture
+{
+};
+
+
+TEST_F(PhysicsTest, State)
+{
+  srand(time(NULL));
+  int seed = time(NULL);
+
+  // pid_t pid = fork();
+  // if (pid)
+  // {
+  //   gazebo::gui::run(0, NULL);
+  //   kill(pid, SIGINT);
+  // }
+  // else
+  {
+    // intentionally break the joint using Link::SetWorldPose
+    // let it conflict with Physics pose updates and make sure
+    // internal model state stays consistent
+
+    Load("worlds/empty.world");
+    physics::WorldPtr world = physics::get_world("default");
+    world->SetPaused(true);
+    EXPECT_TRUE(world != NULL);
+
+    physics::WorldState worldState = world->GetState();
+    physics::ModelState modelState = worldState.GetModelState(0);
+    physics::LinkState linkState = modelState.GetLinkState(0);
+
+    {
+      msgs::Factory msg;
+
+      std::ostringstream newModelStr;
+
+      math::Pose pose(0, 0, 3, 0, 0, 0);
+      math::Vector3 size(1.0, 0.1, 0.1);
+      newModelStr
+        << "<gazebo version='" << SDF_VERSION << "'>\n"
+        << "  <model name='model_1'>\n"
+        << "    <pose>" << pose << "</pose>\n"
+        << "    <link name='link_1'>\n"
+        << "      <pose>0 0 0 0 0 0</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <link name='link_2'>\n"
+        << "      <pose>1 0 0 0 0 0</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_01' type='revolute'>\n"
+        << "      <parent>world</parent>\n"
+        << "      <child>link_1</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>1 1 0</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>-0.7071</upper>\n"
+        << "          <lower>0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <joint name='joint_12' type='revolute'>\n"
+        << "      <parent>link_1</parent>\n"
+        << "      <child>link_2</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>1 -1 0</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>-0.7071</upper>\n"
+        << "          <lower>0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <link name='link_3'>\n"
+        << "      <pose>2 0 0 0 0 0</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_23' type='revolute'>\n"
+        << "      <parent>link_2</parent>\n"
+        << "      <child>link_3</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>-0.7071</upper>\n"
+        << "          <lower>0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "  </model>\n"
+        << "</gazebo>\n";
+
+      msg.set_sdf(newModelStr.str());
+
+      transport::PublisherPtr factoryPub
+        = this->node->Advertise<msgs::Factory>("~/factory");
+      this->factoryPub->Publish(msg);
+    }
+    physics::ModelPtr model = world->GetModel("model_1");
+    while (!model)
+    {
+      model = world->GetModel("model_1");
+      gzdbg << "waiting for model_1 to spawn\n";
+      sleep(1);
+    }
+    world->SetPaused(false);
+
+    physics::LinkPtr link_1 = model->GetLink("link_1");
+    physics::LinkPtr link_2 = model->GetLink("link_2");
+    physics::LinkPtr link_3 = model->GetLink("link_3");
+
+
+    EXPECT_TRUE(link_1 != NULL);
+    EXPECT_TRUE(link_2 != NULL);
+    EXPECT_TRUE(link_3 != NULL);
+
+
+
+
+    double start_time;
+    double start_wall_time;
+    double test_duration;
+    double pub_rate;
+    double last_update_time;
+    double elapsed_wall_time;
+
+
+    physics::JointPtr joint_01 = model->GetJoint("model_1::joint_01");
+    physics::JointPtr joint_12 = model->GetJoint("model_1::joint_12");
+    physics::JointPtr joint_23 = model->GetJoint("model_1::joint_23");
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 50;
+    pub_rate = 10.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Joint::SetAngle at ["
+      << pub_rate << "] Hz.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        joint_01->SetAngle(0, 0.707*(2*
+              static_cast<double>(rand_r(seed))/
+              static_cast<double>(RAND_MAX)-1));
+        joint_12->SetAngle(0, 0.707*(2*
+              static_cast<double>(rand_r(seed))/
+              static_cast<double>(RAND_MAX)-1));
+        joint_23->SetAngle(0, 0.707*(2*
+              static_cast<double>(rand_r(seed))/
+              static_cast<double>(RAND_MAX)-1));
+        sleep(1);
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+
+
+    world->EnablePhysicsEngine(false);
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 10;
+    pub_rate = 10.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Joint::SetAngle as fast as possible, unthrottled.\n";
+    last_update_time = start_wall_time;
+    while (world->GetRealTime().Double() < start_wall_time + test_duration)
+      // if (world->GetRealTime().Double() - last_update_time >= (1.0/pub_rate))
+    {
+      last_update_time = world->GetRealTime().Double();
+      joint_01->SetAngle(0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      joint_12->SetAngle(0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      joint_23->SetAngle(0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+    }
+    test_duration = world->GetSimTime().Double() - start_time;
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+    world->EnablePhysicsEngine(true);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 10;
+    pub_rate = 2.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing SetWorld Pose at ["
+      << pub_rate << "] Hz without constraint violation.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        // gzdbg << "setting link poses without violation\n";
+        // double cur_time = world->GetSimTime().Double();
+        last_update_time = world->GetSimTime().Double();
+        link_1->SetWorldPose(math::Pose(0,    0, 3, 0, 0, 0));
+        link_2->SetWorldPose(math::Pose(1.00, 0, 3, 0, 0, 0));
+        link_3->SetWorldPose(math::Pose(2.00, 0, 3, 0, 0, 0));
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 30;
+    pub_rate = 1.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing SetWorld Pose at ["
+      << pub_rate << "] Hz without constraint violation.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        // gzdbg << "setting link poses without violation\n";
+        // double cur_time = world->GetSimTime().Double();
+        link_1->SetWorldPose(math::Pose(0,    0, 3, 0, 0, 0));
+        link_2->SetWorldPose(math::Pose(1.00, 0, 3, 0, 0, 0));
+        link_3->SetWorldPose(math::Pose(2.00, 0, 3, 0, 0, 0));
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+    // set random pose within joint limit
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 30;
+    pub_rate = 2.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing SetWorld Pose at ["
+      << pub_rate << "] Hz with small constraint violation.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      // if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+    {
+      last_update_time = world->GetSimTime().Double();
+      math::Pose p;
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_1->SetWorldPose(p);
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_2->SetWorldPose(p);
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 2.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_3->SetWorldPose(p);
+
+      math::Vector3 v;
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_1->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_1->SetLinearVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_2->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_2->SetLinearVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_3->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_3->SetLinearVel(v);
+    }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+
+    // set random pose outside of joint limit
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 30;
+    pub_rate = 2.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing SetWorld Pose at ["
+      << pub_rate << "] Hz with more constraint violation.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      // if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+    {
+      last_update_time = world->GetSimTime().Double();
+      math::Pose p;
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/
+          static_cast<double>(RAND_MAX) + 1.57079,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_1->SetWorldPose(p);
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 2.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/
+          static_cast<double>(RAND_MAX) + 1.57079,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_2->SetWorldPose(p);
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/
+          static_cast<double>(RAND_MAX) + 1.57079,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_3->SetWorldPose(p);
+
+      math::Vector3 v;
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_1->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_1->SetLinearVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_2->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_2->SetLinearVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_3->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_3->SetLinearVel(v);
+    }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 30;
+    pub_rate = 1000.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Set*Vel at ["
+      << pub_rate << "] Hz with random values.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        // gzdbg << "setting link poses with violation\n";
+        math::Vector3 v;
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_1->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_1->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_2->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_2->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_3->SetAngularVel(v);
+        v = math::Vector3(
+            stastic_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_3->SetLinearVel(v);
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 20;
+    pub_rate = 500.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Set*Vel at ["
+      << pub_rate << "] Hz with velocity decay.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        // gzdbg << "setting link poses with violation\n";
+        link_1->SetAngularVel(link_1->GetWorldAngularVel() * 0.999);
+        link_1->SetLinearVel(link_1->GetWorldLinearVel()  * 0.999);
+        link_2->SetAngularVel(link_2->GetWorldAngularVel() * 0.999);
+        link_2->SetLinearVel(link_2->GetWorldLinearVel()  * 0.999);
+        link_3->SetAngularVel(link_3->GetWorldAngularVel() * 0.999);
+        link_3->SetLinearVel(link_3->GetWorldLinearVel()  * 0.999);
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+    EXPECT_EQ(link_3->GetWorldPose(),
+        math::Pose(0.292968, 0.612084, 1.43649, -2.07141, 1.50881, -1.19487));
+    Unload();
+  }
+}
+
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/set_pose_loop.cc b/test/integration/set_pose_loop.cc
new file mode 100644
index 0000000..d58f398
--- /dev/null
+++ b/test/integration/set_pose_loop.cc
@@ -0,0 +1,835 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+
+using namespace gazebo;
+class PhysicsTest : public ServerFixture
+{
+};
+
+
+TEST_F(PhysicsTest, State)
+{
+  srand(time(NULL));
+  int seed = time(NULL);
+  {
+    // intentionally break the joint using Link::SetWorldPose
+    // let it conflict with Physics pose updates and make sure
+    // internal model state stays consistent
+
+    Load("worlds/empty.world");
+    physics::WorldPtr world = physics::get_world("default");
+    world->SetPaused(true);
+    EXPECT_TRUE(world != NULL);
+
+    physics::WorldState worldState = world->GetState();
+    physics::ModelState modelState = worldState.GetModelState(0);
+    physics::LinkState linkState = modelState.GetLinkState(0);
+
+
+    {
+      msgs::Factory msg;
+
+      std::ostringstream newModelStr;
+
+      math::Pose pose(0, 0, 3, 0, 0, 0);
+      math::Vector3 size(1.0, 0.1, 0.1);
+      newModelStr
+        << "<gazebo version='" << SDF_VERSION << "'>\n"
+        << "  <model name='model_1'>\n"
+        << "    <pose>" << pose << "</pose>\n"
+        << "    <link name='link_1'>\n"
+        << "      <pose>0 0 0 0 0 0</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <link name='link_2'>\n"
+        << "      <pose>1 0 0 0 0 0</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_01' type='revolute'>\n"
+        << "      <parent>world</parent>\n"
+        << "      <child>link_1</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>1 1 0</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <joint name='joint_12' type='revolute'>\n"
+        << "      <parent>link_1</parent>\n"
+        << "      <child>link_2</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>1 -1 0</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <link name='link_3'>\n"
+        << "      <pose>2 0 0 0 0 " << 0.5*M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_23' type='revolute'>\n"
+        << "      <parent>link_2</parent>\n"
+        << "      <child>link_3</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <link name='link_4'>\n"
+        << "      <pose>2 1 0 0 0 " << M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_34' type='revolute'>\n"
+        << "      <parent>link_3</parent>\n"
+        << "      <child>link_4</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <link name='link_5'>\n"
+        << "      <pose>1 1 0 0 0 " << 1.5*M_PI << "</pose>\n"
+        << "      <inertial>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <mass>1</mass>\n"
+        << "        <inertia>\n"
+        << "          <ixx>1</ixx>\n"
+        << "          <ixy>0</ixy>\n"
+        << "          <ixz>0</ixz>\n"
+        << "          <iyy>1</iyy>\n"
+        << "          <iyz>0</iyz>\n"
+        << "          <izz>1</izz>\n"
+        << "        </inertia>\n"
+        << "      </inertial>\n"
+        << "      <collision name ='collision'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "      </collision>\n"
+        << "      <visual name ='visual'>\n"
+        << "        <pose>0.5 0 0 0 0 0</pose>\n"
+        << "        <geometry>\n"
+        << "          <box>\n"
+        << "            <size>" << size.x << " " << size.y << " "
+        << size.z << "</size>\n"
+        << "          </box>\n"
+        << "        </geometry>\n"
+        << "        <material><script>Gazebo/Grey</script></material>\n"
+        << "      </visual>\n"
+        << "    </link>\n"
+        << "    <joint name='joint_45' type='revolute'>\n"
+        << "      <parent>link_4</parent>\n"
+        << "      <child>link_5</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "    <joint name='joint_52' type='revolute'>\n"
+        << "      <parent>link_5</parent>\n"
+        << "      <child>link_2</child>\n"
+        << "      <axis>\n"
+        << "        <xyz>0 0 1</xyz>\n"
+        << "        <limit>\n"
+        << "          <upper>0.7071</upper>\n"
+        << "          <lower>-0.7071</lower>\n"
+        << "        </limit>\n"
+        << "      </axis>\n"
+        << "    </joint>\n"
+        << "  </model>\n"
+        << "</gazebo>\n";
+
+      msg.set_sdf(newModelStr.str());
+
+      transport::PublisherPtr factoryPub
+        = this->node->Advertise<msgs::Factory>("~/factory");
+      this->factoryPub->Publish(msg);
+    }
+    physics::ModelPtr model = world->GetModel("model_1");
+    while (!model)
+    {
+      model = world->GetModel("model_1");
+      gzdbg << "waiting for model_1 to spawn\n";
+      sleep(1);
+    }
+    world->SetPaused(false);
+
+
+    double start_time;
+    double start_wall_time;
+    double test_duration;
+    double pub_rate;
+    double last_update_time;
+    double elapsed_wall_time;
+
+
+    physics::JointPtr joint_01 = model->GetJoint("model_1::joint_01");
+    physics::JointPtr joint_12 = model->GetJoint("model_1::joint_12");
+    physics::JointPtr joint_23 = model->GetJoint("model_1::joint_23");
+    physics::JointPtr joint_34 = model->GetJoint("model_1::joint_34");
+    physics::JointPtr joint_45 = model->GetJoint("model_1::joint_45");
+    physics::JointPtr joint_52 = model->GetJoint("model_1::joint_52");
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 10;
+    pub_rate = 10.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Joint::SetAngle at ["
+      << pub_rate << "] Hz.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        // gzdbg << "setting link poses without violation\n";
+        // double cur_time = world->GetSimTime().Double();
+        joint_01->SetAngle(0, 0.1);
+        joint_12->SetAngle(0, 0.1);
+        joint_23->SetAngle(0, 0.1);
+        joint_34->SetAngle(0, 0.1);
+        joint_45->SetAngle(0, 0.1);
+        joint_52->SetAngle(0, 0.1);
+
+        joint_01->SetAngle(0, 0.2);
+        joint_12->SetAngle(0, 0.2);
+        joint_23->SetAngle(0, 0.2);
+        joint_34->SetAngle(0, 0.2);
+        joint_45->SetAngle(0, 0.2);
+        joint_52->SetAngle(0, 0.2);
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+
+
+    world->EnablePhysicsEngine(false);
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 20;
+    pub_rate = 10.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Joint::SetAngle at ["
+      << pub_rate << "] Hz with real time duration.\n";
+    last_update_time = start_wall_time;
+    while (world->GetRealTime().Double() < start_wall_time + test_duration)
+      if (world->GetRealTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetRealTime().Double();
+        joint_01->SetAngle(0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        joint_12->SetAngle(0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        joint_23->SetAngle(0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        joint_34->SetAngle(0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        joint_45->SetAngle(0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        joint_52->SetAngle(0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        sleep(1);
+      }
+    test_duration = world->GetSimTime().Double() - start_time;
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+    world->EnablePhysicsEngine(true);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    physics::LinkPtr link_1 = model->GetLink("link_1");
+    physics::LinkPtr link_2 = model->GetLink("link_2");
+    physics::LinkPtr link_3 = model->GetLink("link_3");
+    physics::LinkPtr link_4 = model->GetLink("link_4");
+    physics::LinkPtr link_5 = model->GetLink("link_5");
+
+    EXPECT_TRUE(link_1 != NULL);
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 10;
+    pub_rate = 2.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing SetWorld Pose at ["
+      << pub_rate << "] Hz without constraint violation.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        // gzdbg << "setting link poses without violation\n";
+        // double cur_time = world->GetSimTime().Double();
+        last_update_time = world->GetSimTime().Double();
+        link_1->SetWorldPose(math::Pose(0,    0, 3, 0,        0, 0));
+        link_2->SetWorldPose(math::Pose(1.00, 0, 3, 0,        0, 0));
+        link_3->SetWorldPose(math::Pose(2.00, 0, 3, 0, 0.5*M_PI, 0));
+        link_4->SetWorldPose(math::Pose(2.00, 1, 3, 0, 1.0*M_PI, 0));
+        link_5->SetWorldPose(math::Pose(1.00, 1, 3, 0, 1.5*M_PI, 0));
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 10;
+    pub_rate = 1.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing SetWorld Pose at ["
+      << pub_rate << "] Hz without constraint violation.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        // gzdbg << "setting link poses without violation\n";
+        // double cur_time = world->GetSimTime().Double();
+        link_1->SetWorldPose(math::Pose(0,    0, 3, 0, 0, 0));
+        link_2->SetWorldPose(math::Pose(1.00, 0, 3, 0, 0, 0));
+        link_3->SetWorldPose(math::Pose(2.00, 0, 3, 0, 0.5*M_PI, 0));
+        link_4->SetWorldPose(math::Pose(2.00, 1, 3, 0, 1.0*M_PI, 0));
+        link_5->SetWorldPose(math::Pose(1.00, 1, 3, 0, 1.5*M_PI, 0));
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+
+
+    // set random pose within joint limit
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 20;
+    pub_rate = 2.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing SetWorld Pose at ["
+      << pub_rate << "] Hz with less constraint violation.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      // if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+    {
+      last_update_time = world->GetSimTime().Double();
+      math::Pose p;
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_1->SetWorldPose(p);
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_2->SetWorldPose(p);
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 2.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/
+          static_cast<double>(RAND_MAX) + 3.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/
+          static_cast<double>(RAND_MAX) + 0.5*M_PI,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_3->SetWorldPose(p);
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 2.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/
+          static_cast<double>(RAND_MAX) + M_PI,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_4->SetWorldPose(p);
+      p = math::Pose(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
+          static_cast<double>(rand_r(seed))/
+          static_cast<double>(RAND_MAX) + 1.5*M_PI,
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_5->SetWorldPose(p);
+
+      math::Vector3 v;
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_1->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_1->SetLinearVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_2->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_2->SetLinearVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_3->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_3->SetLinearVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_4->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_4->SetLinearVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_5->SetAngularVel(v);
+      v = math::Vector3(
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+      link_5->SetLinearVel(v);
+    }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+
+    // set random pose outside of joint limit
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 20;
+    pub_rate = 1000.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing SetWorld Pose at ["
+      << pub_rate << "] Hz with more random constraint violation.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        math::Pose p;
+        p = math::Pose(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 3.0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 1.57079,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_1->SetWorldPose(p);
+        p = math::Pose(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 2.0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 1.57079,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_2->SetWorldPose(p);
+        p = math::Pose(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 1.0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 1.57079,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_3->SetWorldPose(p);
+        p = math::Pose(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 1.0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 1.57079,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_4->SetWorldPose(p);
+        p = math::Pose(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 1.0,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/
+            static_cast<double>(RAND_MAX) + 1.57079,
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_5->SetWorldPose(p);
+
+        math::Vector3 v;
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_1->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_1->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_2->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_2->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_3->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_3->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_4->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_4->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_5->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_5->SetLinearVel(v);
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 10;
+    pub_rate = 1000.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Set*Vel at ["
+      << pub_rate << "] Hz with random velocities.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        // gzdbg << "setting link poses with violation\n";
+        math::Vector3 v;
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_1->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_1->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_2->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_2->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_3->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_3->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_4->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_4->SetLinearVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_5->SetAngularVel(v);
+        v = math::Vector3(
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
+            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
+        link_5->SetLinearVel(v);
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+    start_time = world->GetSimTime().Double();
+    start_wall_time = world->GetRealTime().Double();
+    test_duration = 20;
+    pub_rate = 500.0;
+    gzdbg << " -------------------------------------------------------------\n";
+    gzdbg << " Publishing Set*Vel at ["
+      << pub_rate << "] Hz with velocity decay.\n";
+    last_update_time = start_time;
+    while (world->GetSimTime().Double() < start_time + test_duration)
+      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
+      {
+        last_update_time = world->GetSimTime().Double();
+        // gzdbg << "setting link poses with violation\n";
+        link_1->SetAngularVel(link_1->GetWorldAngularVel() * 0.999);
+        link_1->SetLinearVel(link_1->GetWorldLinearVel()  * 0.999);
+        link_2->SetAngularVel(link_2->GetWorldAngularVel() * 0.999);
+        link_2->SetLinearVel(link_2->GetWorldLinearVel()  * 0.999);
+        link_3->SetAngularVel(link_3->GetWorldAngularVel() * 0.999);
+        link_3->SetLinearVel(link_3->GetWorldLinearVel()  * 0.999);
+        link_4->SetAngularVel(link_4->GetWorldAngularVel() * 0.999);
+        link_4->SetLinearVel(link_4->GetWorldLinearVel()  * 0.999);
+        link_5->SetAngularVel(link_5->GetWorldAngularVel() * 0.999);
+        link_5->SetLinearVel(link_5->GetWorldLinearVel()  * 0.999);
+      }
+    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
+    gzdbg << "  elapsed sim time [" << test_duration
+      << "] elapsed wall time [" << elapsed_wall_time
+      << "] sim performance [" << test_duration / elapsed_wall_time
+      << "]\n";
+
+    EXPECT_EQ(link_3->GetWorldPose(),
+        math::Pose(0.292968, 0.612084, 1.43649, -2.07141, 1.50881, -1.19487));
+    Unload();
+  }
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/speed.cc b/test/integration/speed.cc
new file mode 100644
index 0000000..fd40cfe
--- /dev/null
+++ b/test/integration/speed.cc
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+class SpeedTest : public ServerFixture,
+                  public testing::WithParamInterface<const char*>
+{
+  public: void BallTest(const std::string &_physicsEngine);
+  public: void ShapesWorld(const std::string &_physicsEngine);
+};
+
+void SpeedTest::BallTest(const std::string &_physicsEngine)
+{
+  Load("worlds/empty.world", false, _physicsEngine);
+  double emptySpeed;
+  while ((emptySpeed = GetPercentRealTime()) == 0)
+    common::Time::MSleep(100);
+  common::Time::MSleep(2000);
+  emptySpeed = GetPercentRealTime();
+
+  // Load 500 spheres into the world
+  std::string name = "sphere";
+  math::Vector3 pos(0, 0, 5);
+
+  for (int i = 0; i < 500; ++i)
+  {
+    pos.z += i;
+    SpawnSphere(name + boost::lexical_cast<std::string>(i),
+        pos, math::Vector3(0, 0, 0), i == 499);
+  }
+
+  common::Time::MSleep(2000);
+  double loadedSpeed = GetPercentRealTime();
+
+  double speedRatio = loadedSpeed / emptySpeed;
+
+  std::cout << "Speed: Empty[" << emptySpeed << "] Loaded["
+            << loadedSpeed << "] Ratio[" << speedRatio << "]\n";
+
+#ifdef BUILD_TYPE_RELEASE
+  EXPECT_GT(speedRatio, 0.02);
+#else
+  EXPECT_GT(speedRatio, 0.01);
+#endif
+}
+
+TEST_P(SpeedTest, BallTest)
+{
+  BallTest(GetParam());
+}
+
+void SpeedTest::ShapesWorld(const std::string &_physicsEngine)
+{
+  Load("worlds/shapes.world", false, _physicsEngine);
+  double emptySpeed;
+  while ((emptySpeed = GetPercentRealTime()) == 0)
+    common::Time::MSleep(100);
+  common::Time::MSleep(2000);
+  emptySpeed = GetPercentRealTime();
+
+  // Load 500 spheres into the world
+  std::string name = "sphere";
+  math::Vector3 pos(0, 0, 5);
+  for (int i = 0; i < 500; ++i)
+  {
+    pos.z += i;
+    SpawnSphere(name + boost::lexical_cast<std::string>(i),
+        pos, math::Vector3(0, 0, 0), i == 499);
+  }
+  common::Time::MSleep(2000);
+
+  double loadedSpeed = GetPercentRealTime();
+  double speedRatio = loadedSpeed / emptySpeed;
+
+  std::cout << "Speed: Empty[" << emptySpeed << "] Loaded["
+            << loadedSpeed << "] Ratio[" << speedRatio << "]\n";
+
+#ifdef BUILD_TYPE_RELEASE
+  EXPECT_GT(speedRatio, 0.08);
+#else
+  EXPECT_GT(speedRatio, 0.01);
+#endif
+}
+
+TEST_P(SpeedTest, ShapesWorld)
+{
+  ShapesWorld(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, SpeedTest, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/speed_pr2.cc b/test/integration/speed_pr2.cc
new file mode 100644
index 0000000..ea05540
--- /dev/null
+++ b/test/integration/speed_pr2.cc
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+class SpeedPR2Test : public ServerFixture,
+                     public testing::WithParamInterface<const char*>
+{
+  public: void PR2World(const std::string &_physicsEngine);
+};
+
+void SpeedPR2Test::PR2World(const std::string &_physicsEngine)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray sensor in PR2, "
+          << "Please see issue #911.\n";
+    return;
+  }
+
+  Load("worlds/empty.world", false, _physicsEngine);
+  double emptySpeed;
+  while ((emptySpeed = GetPercentRealTime()) == 0)
+    common::Time::MSleep(100);
+  common::Time::MSleep(2000);
+  emptySpeed = GetPercentRealTime();
+
+  // Load the pr2into the world
+  SpawnModel("model://pr2");
+  common::Time::MSleep(2000);
+  double loadedSpeed = GetPercentRealTime();
+
+  double speedRatio = loadedSpeed / emptySpeed;
+
+  std::cout << "Speed: Empty[" << emptySpeed << "] Loaded["
+            << loadedSpeed << "] Ratio[" << speedRatio << "]\n";
+
+#ifdef BUILD_TYPE_RELEASE
+  EXPECT_GT(speedRatio, 0.5);
+#else
+  EXPECT_GT(speedRatio, 0.3);
+#endif
+}
+
+TEST_P(SpeedPR2Test, PR2World)
+{
+  PR2World(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, SpeedPR2Test, PHYSICS_ENGINE_VALUES);
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/state_log.cc b/test/integration/state_log.cc
new file mode 100644
index 0000000..2dc2b86
--- /dev/null
+++ b/test/integration/state_log.cc
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/filesystem.hpp>
+#include "gazebo/common/Assert.hh"
+#include "gazebo/common/SystemPaths.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "gazebo/transport/transport.hh"
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class StateLogTest : public ServerFixture
+{
+};
+
+double g_pr2LGripperXStart = -1;
+double g_pr2LGripperXEnd = -1;
+int g_msgCount = 0;
+
+/////////////////////////////////////////////////
+// Pose callback. We are just getting one link from the pr2 for simplicity.
+void onPoseInfo(ConstPose_VPtr &_msg)
+{
+  for (int i = 0; i < _msg->pose_size(); ++i)
+  {
+    if (_msg->pose(i).name() == "pr2::l_gripper_r_parallel_link")
+    {
+      if (g_pr2LGripperXStart < 0)
+        g_pr2LGripperXStart = _msg->pose(i).position().x();
+
+      g_pr2LGripperXEnd = _msg->pose(i).position().x();
+    }
+  }
+
+  ++g_msgCount;
+}
+
+/////////////////////////////////////////////////
+/// Record a log file
+TEST(StateLogTest, PR2Record)
+{
+  common::SystemPaths *paths = common::SystemPaths::Instance();
+  custom_exec(("gzserver -r --record_path " + paths->GetDefaultTestPath()
+    + " --iters 1000 --seed 12345 worlds/pr2.world").c_str());
+
+  boost::filesystem::path path = paths->GetDefaultTestPath() + "/state.log";
+  EXPECT_TRUE(boost::filesystem::exists(path) != false);
+}
+
+/////////////////////////////////////////////////
+// Playback a log file
+TEST(StateLogTest, PR2PlaybackZipped)
+{
+  // Cleanup...not the best
+  custom_exec("killall -9 gzserver");
+
+  // Run playback
+  common::SystemPaths *paths = common::SystemPaths::Instance();
+  boost::thread *play = new boost::thread(boost::bind(&custom_exec,
+    ("gzserver -u -p " + paths->GetDefaultTestPath() "/state.log").c_str()));
+
+  // Setup transportation
+  gazebo::transport::init();
+  gazebo::transport::run();
+
+  gazebo::transport::NodePtr node(new gazebo::transport::Node());
+  node->Init();
+
+  // Create a publisher to unpause gzserver
+  gazebo::transport::PublisherPtr pub =
+    node->Advertise<gazebo::msgs::WorldControl>(
+        "/gazebo/default/world_control");
+  pub->WaitForConnection();
+
+  // Subscribe to pose info
+  gazebo::transport::SubscriberPtr sub = node->Subscribe(
+      "/gazebo/default/pose/info", &onPoseInfo);
+
+  // Unpause gzserver
+  gazebo::msgs::WorldControl msg;
+  msg.set_pause(false);
+  pub->Publish(msg);
+
+  int i = 0;
+  // Wait for messages to arrive
+  while (g_msgCount < 120 && i < 100)
+  {
+    gzdbg << "Pose Msg Count = " << g_msgCount  << std::endl;
+    gazebo::common::Time::MSleep(100);
+    ++i;
+  }
+
+  // Kill gserver
+  play->interrupt();
+  delete play;
+
+  // Cleanup...not the best
+  custom_exec("killall -9 gzserver");
+
+  gazebo::transport::fini();
+
+  if (g_msgCount >= 120)
+  {
+    // Make sure the values are correct.
+    EXPECT_NEAR(g_pr2LGripperXStart, 0.83, 0.05);
+    EXPECT_NEAR(g_pr2LGripperXEnd, 0.76, 0.05);
+  }
+}
+
+/////////////////////////////////////////////////
+// Playback a log file
+TEST(StateLogTest, PR2PlaybackTxt)
+{
+  // Cleanup...not the best
+  custom_exec("killall -9 gzserver");
+
+  g_pr2LGripperXStart = -1;
+  g_pr2LGripperXEnd = -1;
+  g_msgCount = 0;
+
+  // Convert the zipped state to txt and set a Hz filter.
+  common::SystemPaths *paths = common::SystemPaths::Instance();
+  custom_exec(("gzlog echo " + paths->GetDefaultTestPath() + "/state.log" +
+    " -z 30 > " + paths->GetDefaultTestPath() + "/state_txt.log").c_str());
+
+  // Run playback
+  boost::thread *play = new boost::thread(boost::bind(&custom_exec,
+    ("gzserver -u -p " + paths->GetDefaultTestPath() "/state.log").c_str()));
+
+  // Setup transportation
+  gazebo::transport::init();
+  gazebo::transport::run();
+
+  gazebo::transport::NodePtr node(new gazebo::transport::Node());
+  node->Init();
+
+  // Create a publisher to unpause gzserver
+  gazebo::transport::PublisherPtr pub =
+    node->Advertise<gazebo::msgs::WorldControl>(
+        "/gazebo/default/world_control");
+  pub->WaitForConnection();
+
+  // Subscribe to pose info
+  gazebo::transport::SubscriberPtr sub = node->Subscribe(
+      "/gazebo/default/pose/info", &onPoseInfo);
+
+  // Unpause gzserver
+  gazebo::msgs::WorldControl msg;
+  msg.set_pause(false);
+  pub->Publish(msg);
+
+  int i = 0;
+  // Wait for messages to arrive
+  while (g_msgCount < 120 && i < 100)
+  {
+    gzdbg << "Pose Msg Count = " << g_msgCount  << std::endl;
+    gazebo::common::Time::MSleep(100);
+    ++i;
+  }
+
+  // Kill gserver
+  play->interrupt();
+  delete play;
+
+  // Cleanup...not the best
+  custom_exec("killall -9 gzserver");
+
+  gazebo::transport::fini();
+
+  if (g_msgCount > 100)
+  {
+  // Make sure the values are correct.
+  EXPECT_NEAR(g_pr2LGripperXStart, 0.83, 0.05);
+  EXPECT_NEAR(g_pr2LGripperXEnd, 0.76, 0.05);
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  // Cleanup test directory and create a new one.
+  common::SystemPaths *paths = common::SystemPaths::Instance();
+  boost::filesystem::remove_all(paths->GetDefaultTestPath());
+  boost::filesystem::create_directories(paths->GetDefaultTestPath());
+
+  ::testing::InitGoogleTest(&argc, argv);
+  int result = RUN_ALL_TESTS();
+
+  // Cleanup test directory.
+  boost::filesystem::remove_all(paths->GetDefaultTestPath());
+
+  return result;
+}
diff --git a/test/integration/stress_spawn_models.cc b/test/integration/stress_spawn_models.cc
new file mode 100644
index 0000000..4e92383
--- /dev/null
+++ b/test/integration/stress_spawn_models.cc
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "gazebo/common/common.hh"
+
+using namespace gazebo;
+
+class SpawnModels : public ServerFixture,
+                    public testing::WithParamInterface<const char*>
+{
+};
+
+/////////////////////////////////////////////////
+TEST_P(SpawnModels, WirelessTransmitters)
+{
+  double gain = 2.6;
+  double power = 14.5;
+
+  Load("worlds/empty.world", true, GetParam());
+
+  for (int i = 0; i < 10; ++i)
+  {
+    for (int j = 0; j < 10; ++j)
+    {
+      std::string modelName = "tx" +
+         boost::lexical_cast<std::string>(i) +
+         boost::lexical_cast<std::string>(j);
+      std::string sensorName = "WirelessTransmitter" +
+         boost::lexical_cast<std::string>(i) +
+         boost::lexical_cast<std::string>(j);
+
+      SpawnWirelessTransmitterSensor(modelName, sensorName,
+          math::Vector3(i, j, 0.25), math::Vector3(0, 0, 0),
+          "osrf", 2450.0, power, gain);
+
+      sensors::WirelessTransmitterPtr tx =
+        boost::static_pointer_cast<sensors::WirelessTransmitter>(
+          sensors::SensorManager::Instance()->GetSensor(sensorName));
+
+      EXPECT_TRUE(this->HasEntity(modelName));
+      EXPECT_TRUE(tx);
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+INSTANTIATE_TEST_CASE_P(TestTransceiverODE, SpawnModels,
+    ::testing::Values("ode"));
+
+/////////////////////////////////////////////////
+#ifdef HAVE_BULLET
+INSTANTIATE_TEST_CASE_P(TestTransceiverBullet, SpawnModels,
+    ::testing::Values("bullet"));
+#endif  // HAVE_BULLET
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/surface_properties.cc b/test/integration/surface_properties.cc
new file mode 100644
index 0000000..ef7c512
--- /dev/null
+++ b/test/integration/surface_properties.cc
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/msgs/msgs.hh"
+#include "helper_physics_generator.hh"
+
+const double g_physics_tol = 1e-2;
+
+using namespace gazebo;
+
+class SurfaceTest : public ServerFixture,
+                    public testing::WithParamInterface<const char*>
+{
+  public: void CollideWithoutContact(const std::string &_physicsEngine);
+};
+
+////////////////////////////////////////////////////////////////////////
+// CollideWithoutContact:
+// Load the collide_without_contact test world. It drops two boxes onto
+// a larger static box with a contact sensor. One of the boxes should be
+// detected by the contact sensor but not experience contact forces.
+////////////////////////////////////////////////////////////////////////
+void SurfaceTest::CollideWithoutContact(const std::string &_physicsEngine)
+{
+  // load an empty world
+  Load("worlds/collide_without_contact.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // check the gravity vector
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+  math::Vector3 g = physics->GetGravity();
+  // Assume gravity vector points down z axis only.
+  EXPECT_EQ(g.x, 0);
+  EXPECT_EQ(g.y, 0);
+  EXPECT_LE(g.z, -9.8);
+
+  // get physics time step
+  double dt = physics->GetMaxStepSize();
+  EXPECT_GT(dt, 0);
+
+  // get pointers to the falling boxes.
+  physics::ModelPtr contactBox, collideBox;
+  contactBox = world->GetModel("contact_box");
+  collideBox = world->GetModel("collide_box");
+  ASSERT_TRUE(contactBox != NULL);
+  ASSERT_TRUE(collideBox != NULL);
+
+  // get the contact sensor
+  sensors::SensorPtr sensor = sensors::get_sensor("box_contact");
+  sensors::ContactSensorPtr contactSensor =
+      boost::dynamic_pointer_cast<sensors::ContactSensor>(sensor);
+  ASSERT_TRUE(contactSensor);
+
+  // Step forward 0.2 s
+  double stepTime = 0.2;
+  unsigned int steps = floor(stepTime / dt);
+  world->Step(steps);
+
+  // Expect boxes to be falling
+  double fallVelocity = g.z * stepTime;
+  EXPECT_LT(contactBox->GetWorldLinearVel().z, fallVelocity*(1-g_physics_tol));
+  EXPECT_LT(collideBox->GetWorldLinearVel().z, fallVelocity*(1-g_physics_tol));
+
+  // Step forward another 0.2 s
+  world->Step(steps);
+  fallVelocity = g.z * 2*stepTime;
+  // Expect contactBox to be resting on contact sensor box
+  EXPECT_NEAR(contactBox->GetWorldLinearVel().z, 0.0, g_physics_tol);
+  // Expect collideBox to still be falling
+  EXPECT_LT(collideBox->GetWorldLinearVel().z, fallVelocity*(1-g_physics_tol));
+
+  {
+    // Step forward until we get a contacts message from the contact sensor
+    msgs::Contacts contacts;
+    while (contacts.contact_size() == 0 && --steps > 0)
+    {
+      world->Step(1);
+      contacts = contactSensor->GetContacts();
+    }
+
+    // Verify that both objects are recognized by contact sensor
+    int i;
+    msgs::Contact contact;
+    bool collideBoxHit = false;
+    bool contactBoxHit = false;
+    for (i = 0; i < contacts.contact_size(); ++i)
+    {
+      contact = contacts.contact(i);
+      if (contact.collision1() == "contact_box::link::collision" ||
+          contact.collision2() == "contact_box::link::collision")
+      {
+        contactBoxHit = true;
+      }
+      if (contact.collision1() == "collide_box::link::collision" ||
+          contact.collision2() == "collide_box::link::collision")
+      {
+        collideBoxHit = true;
+      }
+    }
+    EXPECT_TRUE(contactBoxHit);
+    EXPECT_TRUE(collideBoxHit);
+  }
+
+  // Step forward another 0.4 s
+  // The collideBox should have fallen through the ground and not
+  // be in contact with the sensor
+  world->Step(steps*2);
+  fallVelocity = g.z * 4*stepTime;
+  // Expect contactBox to still be resting on contact sensor box
+  EXPECT_NEAR(contactBox->GetWorldLinearVel().z, 0.0, g_physics_tol);
+  // Expect collideBox to still be falling
+  EXPECT_LT(collideBox->GetWorldLinearVel().z, fallVelocity*(1-g_physics_tol));
+
+  {
+    // Step forward until we get a contacts message from the contact sensor
+    msgs::Contacts contacts;
+    while (contacts.contact_size() == 0 && --steps > 0)
+    {
+      world->Step(1);
+      contacts = contactSensor->GetContacts();
+    }
+
+    // Verify that only contactBox is recognized by contact sensor
+    int i;
+    msgs::Contact contact;
+    bool collideBoxHit = false;
+    bool contactBoxHit = false;
+    for (i = 0; i < contacts.contact_size(); ++i)
+    {
+      contact = contacts.contact(i);
+      if (contact.collision1() == "contact_box::link::collision" ||
+          contact.collision2() == "contact_box::link::collision")
+      {
+        contactBoxHit = true;
+      }
+      if (contact.collision1() == "collide_box::link::collision" ||
+          contact.collision2() == "collide_box::link::collision")
+      {
+        collideBoxHit = true;
+      }
+    }
+    EXPECT_TRUE(contactBoxHit);
+    EXPECT_FALSE(collideBoxHit);
+  }
+}
+
+TEST_P(SurfaceTest, CollideWithoutContact)
+{
+  CollideWithoutContact(GetParam());
+}
+
+// This test doesn't yet work in bullet, so we'll declare it only for ode.
+// Issue #1038
+// INSTANTIATE_TEST_CASE_P(PhysicsEngines, SurfaceTest, PHYSICS_ENGINE_VALUES);
+INSTANTIATE_TEST_CASE_P(TestODE, SurfaceTest, ::testing::Values("ode"));
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/transceiver.cc b/test/integration/transceiver.cc
new file mode 100644
index 0000000..66ee942
--- /dev/null
+++ b/test/integration/transceiver.cc
@@ -0,0 +1,427 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/foreach.hpp>
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/sensors/sensors.hh"
+#include "gazebo/common/common.hh"
+#include "test/integration/helper_physics_generator.hh"
+
+using namespace gazebo;
+
+class TransceiverTest : public ServerFixture,
+                        public testing::WithParamInterface<const char*>
+{
+  public: TransceiverTest();
+  public: void TxRxEmptySpace(const std::string &_physicsEngine);
+  public: void TxRxObstacle(const std::string &_physicsEngine);
+  public: void TxRxFreqOutOfBounds(const std::string &_physicsEngine);
+  private: void RxMsg(const ConstWirelessNodesPtr &_msg);
+
+  private: static const double MinFreq;
+  private: static const double MaxFreq;
+  private: static const double Gain;
+  private: static const double Power;
+  private: static const double Sensitivity;
+  private: static const double MaxPos;
+
+  private: boost::mutex mutex;
+  private: std::vector<int> num_msgs;
+  private: std::vector<common::Time> elapsed_time;
+  private: boost::shared_ptr<msgs::WirelessNodes const> nodesMsg;
+  private: bool receivedMsg;
+};
+
+const double TransceiverTest::MinFreq = 2412.0;
+const double TransceiverTest::MaxFreq = 2484.0;
+const double TransceiverTest::Gain = 2.6;
+const double TransceiverTest::Power = 14.5;
+const double TransceiverTest::Sensitivity = -90.0;
+const double TransceiverTest::MaxPos = 10.0;
+
+/////////////////////////////////////////////////
+TransceiverTest::TransceiverTest()
+{
+  this->receivedMsg = false;
+}
+
+/////////////////////////////////////////////////
+void TransceiverTest::RxMsg(const ConstWirelessNodesPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(mutex);
+  // Just copy the message
+  this->nodesMsg = _msg;
+  this->receivedMsg = true;
+}
+
+/////////////////////////////////////////////////
+void TransceiverTest::TxRxEmptySpace(const std::string &_physicsEngine)
+{
+  typedef std::map<std::string, sensors::WirelessTransmitterPtr> trans_map_type;
+  trans_map_type transmitters;
+
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  // Generate a random number [1-10] of transmitters
+  int nTransmitters = math::Rand::GetIntUniform(1, 10);
+
+  for (int i = 0; i < nTransmitters; ++i)
+  {
+    double txFreq = math::Rand::GetDblUniform(this->MinFreq, this->MaxFreq);
+    std::ostringstream convert;
+    convert << i;
+    std::string txModelName = "tx" + convert.str();
+    std::string txSensorName = "wirelessTransmitter" + convert.str();
+    std::string txEssid = "osrf" + convert.str();
+    double x = math::Rand::GetDblUniform(-this->MaxPos, this->MaxPos);
+    double y = math::Rand::GetDblUniform(-this->MaxPos, this->MaxPos);
+    math::Pose txPose(math::Vector3(x, y, 0.055), math::Quaternion(0, 0, 0));
+
+    SpawnWirelessTransmitterSensor(txModelName, txSensorName, txPose.pos,
+        txPose.rot.GetAsEuler(), txEssid, txFreq, this->Power, this->Gain);
+
+    sensors::WirelessTransmitterPtr tx =
+        boost::static_pointer_cast<sensors::WirelessTransmitter>(
+          sensors::SensorManager::Instance()->GetSensor(txSensorName));
+
+    // Store the new transmitter sensor in the map
+    transmitters[txEssid] = tx;
+
+    ASSERT_TRUE(tx);
+  }
+
+  // Wireless Receiver - rx
+  std::string rxModelName = "rx";
+  std::string rxSensorName = "wirelessReceiver";
+  math::Pose rxPose(math::Vector3(0, 2, 0.055),
+      math::Quaternion(0, 0, 0));
+
+  // Spawn rx
+  SpawnWirelessReceiverSensor(rxModelName, rxSensorName, rxPose.pos,
+      rxPose.rot.GetAsEuler(), this->MinFreq, this->MaxFreq, this->Power,
+      this->Gain, this->Sensitivity);
+
+  sensors::WirelessReceiverPtr rx =
+    boost::static_pointer_cast<sensors::WirelessReceiver>(
+        sensors::SensorManager::Instance()->GetSensor(rxSensorName));
+
+  ASSERT_TRUE(rx);
+
+  // Initialize gazebo transport layer
+  transport::NodePtr node(new transport::Node());
+  node->Init("default");
+
+  std::string rxTopic = "/gazebo/default/rx/link/wirelessReceiver/transceiver";
+  transport::SubscriberPtr sub = node->Subscribe(rxTopic,
+      &TransceiverTest::RxMsg, this);
+  this->receivedMsg = false;
+
+  // Loop a max. of ~5 seconds
+  for (int i = 0; i < 50; ++i)
+  {
+    // Update all the transmitter sensors
+    BOOST_FOREACH(const trans_map_type::value_type& myPair, transmitters)
+    {
+      myPair.second->Update(true);
+    }
+
+    // Update the receiver sensor
+    rx->Update(true);
+
+    common::Time::MSleep(100);
+    boost::mutex::scoped_lock lock(this->mutex);
+
+    if (this->nodesMsg && this->receivedMsg)
+    {
+      this->receivedMsg = false;
+      gazebo::msgs::WirelessNodes txNodes;
+      int numTxNodes = nodesMsg->node_size();
+
+      for (int i = 0; i < numTxNodes; ++i)
+      {
+        gazebo::msgs::WirelessNode txNode = nodesMsg->node(i);
+        std::string essid = txNode.essid();
+        EXPECT_EQ(transmitters[essid]->GetESSID(), essid);
+        EXPECT_EQ(transmitters[essid]->GetFreq(), txNode.frequency());
+        EXPECT_LE(txNode.signal_level(), 0);
+        EXPECT_GE(txNode.signal_level(), rx->GetSensitivity());
+      }
+      return;
+    }
+  }
+  FAIL();
+}
+
+/////////////////////////////////////////////////
+void TransceiverTest::TxRxFreqOutOfBounds(const std::string &_physicsEngine)
+{
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  double txFreq = this->MinFreq - 1.0;
+  std::string tx1ModelName = "tx1";
+  std::string tx1SensorName = "wirelessTransmitter1";
+  std::string tx2ModelName = "tx2";
+  std::string tx2SensorName = "wirelessTransmitter2";
+  std::string txEssid = "osrf";
+  double x = math::Rand::GetDblUniform(-this->MaxPos, this->MaxPos);
+  double y = math::Rand::GetDblUniform(-this->MaxPos, this->MaxPos);
+  math::Pose txPose(math::Vector3(x, y, 0.055), math::Quaternion(0, 0, 0));
+
+  SpawnWirelessTransmitterSensor(tx1ModelName, tx1SensorName, txPose.pos,
+      txPose.rot.GetAsEuler(), txEssid, txFreq, this->Power, this->Gain);
+
+  sensors::WirelessTransmitterPtr tx1 =
+      boost::static_pointer_cast<sensors::WirelessTransmitter>(
+        sensors::SensorManager::Instance()->GetSensor(tx1SensorName));
+
+  ASSERT_TRUE(tx1);
+
+  txFreq = this->MaxFreq + 1.0;
+  SpawnWirelessTransmitterSensor(tx2ModelName, tx2SensorName, txPose.pos,
+      txPose.rot.GetAsEuler(), txEssid, txFreq, this->Power, this->Gain);
+
+  sensors::WirelessTransmitterPtr tx2 =
+      boost::static_pointer_cast<sensors::WirelessTransmitter>(
+        sensors::SensorManager::Instance()->GetSensor(tx2SensorName));
+
+  ASSERT_TRUE(tx2);
+
+  // Wireless Receiver - rx
+  std::string rxModelName = "rx";
+  std::string rxSensorName = "wirelessReceiver";
+  math::Pose rxPose(math::Vector3(0, 2, 0.055),
+      math::Quaternion(0, 0, 0));
+
+  // Spawn rx
+  SpawnWirelessReceiverSensor(rxModelName, rxSensorName, rxPose.pos,
+      rxPose.rot.GetAsEuler(), this->MinFreq, this->MaxFreq, this->Power,
+      this->Gain, this->Sensitivity);
+
+  sensors::WirelessReceiverPtr rx =
+    boost::static_pointer_cast<sensors::WirelessReceiver>(
+        sensors::SensorManager::Instance()->GetSensor(rxSensorName));
+
+  ASSERT_TRUE(rx);
+
+  // Initialize gazebo transport layer
+  transport::NodePtr node(new transport::Node());
+  node->Init("default");
+
+  std::string rxTopic = "/gazebo/default/rx/link/wirelessReceiver/transceiver";
+  transport::SubscriberPtr sub = node->Subscribe(rxTopic,
+      &TransceiverTest::RxMsg, this);
+  this->receivedMsg = false;
+
+  // Loop a max. of ~5 seconds
+  for (int i = 0; i < 50; ++i)
+  {
+    // Update the sensors
+    tx1->Update(true);
+    tx2->Update(true);
+    rx->Update(true);
+
+    common::Time::MSleep(100);
+    boost::mutex::scoped_lock lock(this->mutex);
+  }
+
+  EXPECT_FALSE(this->receivedMsg);
+}
+
+/////////////////////////////////////////////////
+void TransceiverTest::TxRxObstacle(const std::string &_physicsEngine)
+{
+  Load("worlds/empty.world", true, _physicsEngine);
+
+  double avgSignalLevelEmpty = 0.0;
+  double avgSignalLevelObstacle = 0.0;
+  int samples = 0;
+
+  // Wireless Transmitter - tx
+  std::string txModelName = "tx";
+  std::string txSensorName = "wirelessTx";
+  math::Pose txPose(math::Vector3(0, 0, 0.5),
+      math::Quaternion(0, 0, 0));
+
+  // Spawn tx
+  SpawnWirelessTransmitterSensor(txModelName, txSensorName, txPose.pos,
+      txPose.rot.GetAsEuler(), "osrf", 2450.0, this->Power, this->Gain);
+
+  sensors::WirelessTransmitterPtr tx =
+      boost::static_pointer_cast<sensors::WirelessTransmitter>(
+        sensors::SensorManager::Instance()->GetSensor(txSensorName));
+
+  ASSERT_TRUE(tx);
+
+  // Wireless Receiver - rx1
+  std::string rx1ModelName = "rx1";
+  std::string rx1SensorName = "wirelessRx1";
+  math::Pose rx1Pose(math::Vector3(3, 0, 0.5),
+      math::Quaternion(0, 0, 0));
+
+  // Spawn rx1
+  SpawnWirelessReceiverSensor(rx1ModelName, rx1SensorName, rx1Pose.pos,
+      rx1Pose.rot.GetAsEuler(), this->MinFreq, this->MaxFreq, this->Power,
+      this->Gain, this->Sensitivity);
+
+  sensors::WirelessReceiverPtr rx1 =
+      boost::static_pointer_cast<sensors::WirelessReceiver>(
+        sensors::SensorManager::Instance()->GetSensor(rx1SensorName));
+
+  ASSERT_TRUE(rx1);
+
+  // Wireless Receiver - rx2
+  std::string rx2ModelName = "rx2";
+  std::string rx2SensorName = "wirelessRx2";
+  math::Pose rx2Pose(math::Vector3(-2, 0, 0.5), math::Quaternion(0, 0, 0));
+
+  // Spawn rx2
+  SpawnWirelessReceiverSensor(rx2ModelName, rx2SensorName, rx2Pose.pos,
+      rx2Pose.rot.GetAsEuler(), this->MinFreq, this->MaxFreq, this->Power,
+      this->Gain, this->Sensitivity);
+
+  sensors::WirelessReceiverPtr rx2 =
+      boost::static_pointer_cast<sensors::WirelessReceiver>(
+        sensors::SensorManager::Instance()->GetSensor(rx2SensorName));
+
+  ASSERT_TRUE(rx2);
+
+  // Spawn an obstacle between the transmitter and the receiver
+  SpawnBox("Box", math::Vector3(1, 1, 1), math::Vector3(-1, 0, 0.5),
+      math::Vector3(0, 0, 0), true);
+
+  // Initialize gazebo transport layer
+  transport::NodePtr node(new transport::Node());
+  node->Init("default");
+
+  std::string rx1Topic = "/gazebo/default/rx1/link/wirelessRx1/transceiver";
+  transport::SubscriberPtr sub = node->Subscribe(rx1Topic,
+      &TransceiverTest::RxMsg, this);
+
+  this->receivedMsg = false;
+
+  // Loop until you have 10 samples or timeout after ~5secs
+  int iters = 0;
+  while (samples < 10 && iters < 50)
+  {
+    // Update all the sensors
+    tx->Update(true);
+    rx1->Update(true);
+
+    common::Time::MSleep(100);
+    boost::mutex::scoped_lock lock(this->mutex);
+
+    if (this->nodesMsg && this->receivedMsg)
+    {
+      this->receivedMsg = false;
+      gazebo::msgs::WirelessNodes txNodes;
+      int numTxNodes = nodesMsg->node_size();
+
+      for (int i = 0; i < numTxNodes; ++i)
+      {
+        gazebo::msgs::WirelessNode txNode = nodesMsg->node(i);
+        double signalLevel = txNode.signal_level();
+
+        ++samples;
+        avgSignalLevelEmpty += signalLevel;
+      }
+    }
+    ++iters;
+  }
+
+  samples = 0;
+  iters = 0;
+
+  std::string rx2Topic = "/gazebo/default/rx2/link/wirelessRx2/transceiver";
+  sub = node->Subscribe(rx2Topic, &TransceiverTest::RxMsg, this);
+
+  this->receivedMsg = false;
+
+  // Loop until you have 10 samples or timeout after ~5secs
+  while (samples < 10 && iters < 50)
+  {
+    // Update all the sensors
+    tx->Update(true);
+    rx2->Update(true);
+
+    common::Time::MSleep(100);
+    boost::mutex::scoped_lock lock(this->mutex);
+
+    if (this->nodesMsg && this->receivedMsg)
+    {
+      this->receivedMsg = false;
+      gazebo::msgs::WirelessNodes txNodes;
+      int numTxNodes = nodesMsg->node_size();
+
+      for (int i = 0; i < numTxNodes; ++i)
+      {
+        gazebo::msgs::WirelessNode txNode = nodesMsg->node(i);
+        double signalLevel = txNode.signal_level();
+
+        ++samples;
+        avgSignalLevelObstacle += signalLevel;
+      }
+    }
+    ++iters;
+  }
+
+  // Check that the signal level in the not-occluded receiver is higher than
+  // the signal received by the occluded receiver
+  EXPECT_GT(avgSignalLevelEmpty / samples, avgSignalLevelObstacle / samples);
+}
+
+/////////////////////////////////////////////////
+TEST_P(TransceiverTest, EmptyWorld)
+{
+  TxRxEmptySpace(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(TransceiverTest, Obstacle)
+{
+  if (std::string(GetParam()) == "simbody")
+  {
+    gzerr << "Abort test since this test frequently fails with simbody, "
+          << " see (issues #867)" << std::endl;
+    return;
+  }
+  if (std::string(GetParam()) == "dart")
+  {
+    gzerr << "Abort test since this test frequently fails with dart, "
+          << " see (issues #911)" << std::endl;
+    return;
+  }
+
+  TxRxObstacle(GetParam());
+}
+
+/////////////////////////////////////////////////
+TEST_P(TransceiverTest, FreqOutOfBounds)
+{
+  TxRxFreqOutOfBounds(GetParam());
+}
+
+/////////////////////////////////////////////////
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, TransceiverTest,
+                        PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/transport.cc b/test/integration/transport.cc
new file mode 100644
index 0000000..bb63b9e
--- /dev/null
+++ b/test/integration/transport.cc
@@ -0,0 +1,490 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <unistd.h>
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+
+class TransportTest : public ServerFixture
+{
+};
+
+bool g_worldStatsMsg2 = false;
+bool g_sceneMsg = false;
+bool g_worldStatsMsg = false;
+bool g_worldStatsDebugMsg = false;
+bool g_stringMsg = false;
+bool g_stringMsg2 = false;
+bool g_stringMsg3 = false;
+bool g_stringMsg4 = false;
+
+void ReceiveStringMsg(ConstGzStringPtr &/*_msg*/)
+{
+  g_stringMsg = true;
+}
+
+void ReceiveStringMsg2(ConstGzStringPtr &/*_msg*/)
+{
+  g_stringMsg2 = true;
+}
+
+void ReceiveStringMsg3(ConstGzStringPtr &/*_msg*/)
+{
+  g_stringMsg3 = true;
+}
+
+void ReceiveStringMsg4(ConstGzStringPtr &/*_msg*/)
+{
+  g_stringMsg4 = true;
+}
+
+void ReceiveSceneMsg(ConstScenePtr &/*_msg*/)
+{
+  g_sceneMsg = true;
+}
+
+void ReceiveWorldStatsMsg(ConstWorldStatisticsPtr &/*_msg*/)
+{
+  g_worldStatsMsg = true;
+}
+
+void ReceiveWorldStatsMsg2(ConstWorldStatisticsPtr &/*_msg*/)
+{
+  g_worldStatsMsg2 = true;
+}
+
+void ReceiveWorldStatsDebugMsg(ConstGzStringPtr &/*_data*/)
+{
+  g_worldStatsDebugMsg = true;
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, Load)
+{
+  for (unsigned int i = 0; i < 2; ++i)
+  {
+    Load("worlds/empty.world");
+    Unload();
+  }
+}
+
+/////////////////////////////////////////////////
+// Standard pub/sub
+TEST_F(TransportTest, PubSub)
+{
+  Load("worlds/empty.world");
+
+  transport::NodePtr node = transport::NodePtr(new transport::Node());
+  node->Init();
+  transport::PublisherPtr scenePub = node->Advertise<msgs::Scene>("~/scene");
+  transport::SubscriberPtr sceneSub = node->Subscribe("~/scene",
+      &ReceiveSceneMsg);
+
+  msgs::Scene msg;
+  msgs::Init(msg, "test");
+  msg.set_name("default");
+
+  scenePub->Publish(msg);
+
+  std::vector<transport::PublisherPtr> pubs;
+  std::vector<transport::SubscriberPtr> subs;
+
+  for (unsigned int i = 0; i < 10; ++i)
+  {
+    pubs.push_back(node->Advertise<msgs::Scene>("~/scene"));
+    subs.push_back(node->Subscribe("~/scene", &ReceiveSceneMsg));
+    scenePub->Publish(msg);
+  }
+
+  pubs.clear();
+  subs.clear();
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, DirectPublish)
+{
+  Load("worlds/empty.world");
+
+  g_sceneMsg = false;
+
+  msgs::Scene msg;
+  msgs::Init(msg, "test");
+  msg.set_name("default");
+
+  transport::NodePtr node = transport::NodePtr(new transport::Node());
+  node->Init();
+
+  transport::SubscriberPtr sceneSub = node->Subscribe("~/scene",
+      &ReceiveSceneMsg);
+  transport::publish<msgs::Scene>("~/scene", msg);
+
+  // Not nice to time check here but 10 seconds should be 'safe' to check
+  // against
+  int timeout = 1000;
+  while (not g_sceneMsg)
+  {
+    common::Time::MSleep(10);
+
+    timeout--;
+    if (timeout == 0)
+      break;
+  }
+
+  ASSERT_GT(timeout, 0) << "Not received a message in 10 seconds";
+}
+
+/////////////////////////////////////////////////
+void SinglePub()
+{
+  transport::NodePtr node(new transport::Node());
+  node->Init();
+
+  transport::PublisherPtr pub = node->Advertise<msgs::GzString>("~/test");
+
+  msgs::GzString msg;
+  msg.set_data("Child process sending message.");
+  pub->Publish(msg);
+}
+
+
+/////////////////////////////////////////////////
+// This test creates a child process to test interprocess communication
+TEST_F(TransportTest, ThreadedSinglePubSub)
+{
+  g_stringMsg = false;
+
+  Load("worlds/empty.world");
+
+  transport::NodePtr node(new transport::Node());
+  node->Init();
+
+  transport::SubscriberPtr sub =
+    node->Subscribe("~/test", &ReceiveStringMsg, true);
+
+  EXPECT_STREQ("gazebo.msgs.GzString",
+      node->GetMsgType("/gazebo/default/test").c_str());
+
+  boost::thread *thread = new boost::thread(boost::bind(&SinglePub));
+
+  for (int i = 0; i < 10 && !g_stringMsg; ++i)
+    common::Time::MSleep(100);
+
+  EXPECT_TRUE(g_stringMsg);
+
+  thread->join();
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, ThreadedMultiSubSinglePub)
+{
+  g_stringMsg = false;
+  g_stringMsg2 = false;
+
+  Load("worlds/empty.world");
+
+  transport::NodePtr node(new transport::Node());
+  node->Init();
+
+  transport::SubscriberPtr sub =
+    node->Subscribe("~/test", &ReceiveStringMsg, true);
+
+  transport::SubscriberPtr sub2 =
+    node->Subscribe("~/test", &ReceiveStringMsg2, true);
+
+  EXPECT_STREQ("gazebo.msgs.GzString",
+      node->GetMsgType("/gazebo/default/test").c_str());
+
+  boost::thread *thread = new boost::thread(boost::bind(&SinglePub));
+
+  for (int i = 0; i < 10 && !g_stringMsg && !g_stringMsg2; ++i)
+    common::Time::MSleep(100);
+
+  EXPECT_TRUE(g_stringMsg);
+
+  thread->join();
+}
+
+/////////////////////////////////////////////////
+void MultiPub()
+{
+  transport::NodePtr node(new transport::Node());
+  node->Init();
+
+  transport::PublisherPtr pub = node->Advertise<msgs::GzString>("~/test");
+  transport::PublisherPtr pub2 = node->Advertise<msgs::GzString>("~/test");
+
+  msgs::GzString msg;
+  msg.set_data("Child process sending message.");
+  pub->Publish(msg);
+  pub2->Publish(msg);
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, ThreadedMultiPubSub)
+{
+  g_stringMsg = false;
+  g_stringMsg2 = false;
+
+  Load("worlds/empty.world");
+
+  transport::NodePtr node(new transport::Node());
+  node->Init();
+
+  transport::SubscriberPtr sub =
+    node->Subscribe("~/test", &ReceiveStringMsg, true);
+
+  transport::SubscriberPtr sub2 =
+    node->Subscribe("~/test", &ReceiveStringMsg2, true);
+
+  EXPECT_STREQ("gazebo.msgs.GzString",
+      node->GetMsgType("/gazebo/default/test").c_str());
+
+  boost::thread *thread = new boost::thread(boost::bind(&MultiPub));
+
+  for (int i = 0; i < 10 && !g_stringMsg && !g_stringMsg2; ++i)
+    common::Time::MSleep(100);
+
+  EXPECT_TRUE(g_stringMsg);
+
+  thread->join();
+}
+
+/////////////////////////////////////////////////
+void MultiPubSub()
+{
+  transport::NodePtr node(new transport::Node());
+  node->Init("default");
+
+  transport::PublisherPtr pub = node->Advertise<msgs::GzString>("~/test");
+  transport::PublisherPtr pub2 = node->Advertise<msgs::GzString>("~/test");
+
+  transport::SubscriberPtr sub =
+    node->Subscribe("~/testO", &ReceiveStringMsg3, true);
+
+  transport::SubscriberPtr sub2 =
+    node->Subscribe("~/testO", &ReceiveStringMsg4, true);
+
+  EXPECT_STREQ("gazebo.msgs.GzString",
+      node->GetMsgType("/gazebo/default/testO").c_str());
+
+  msgs::GzString msg;
+  msg.set_data("Child process sending message.");
+  pub->Publish(msg);
+  pub2->Publish(msg);
+
+  int i = 0;
+  for (; i < 10 && (!g_stringMsg3 && !g_stringMsg4); ++i)
+    common::Time::MSleep(100);
+
+  EXPECT_TRUE(g_stringMsg3);
+  EXPECT_TRUE(g_stringMsg4);
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, ThreadedMultiPubSubBidirectional)
+{
+  Load("worlds/empty.world");
+
+  g_stringMsg = false;
+  g_stringMsg2 = false;
+  g_stringMsg3 = false;
+  g_stringMsg4 = false;
+
+  transport::NodePtr node(new transport::Node());
+  node->Init("default");
+
+  transport::SubscriberPtr sub =
+    node->Subscribe("~/test", &ReceiveStringMsg, true);
+  transport::SubscriberPtr sub2 =
+    node->Subscribe("~/test", &ReceiveStringMsg2, true);
+
+  transport::PublisherPtr pub = node->Advertise<msgs::GzString>("~/testO");
+  transport::PublisherPtr pub2 = node->Advertise<msgs::GzString>("~/testO");
+
+  EXPECT_STREQ("gazebo.msgs.GzString",
+      node->GetMsgType("/gazebo/default/test").c_str());
+
+  msgs::GzString msg;
+  msg.set_data("Parent send message");
+  pub->Publish(msg);
+  pub2->Publish(msg);
+
+  boost::thread *thread = new boost::thread(boost::bind(&MultiPubSub));
+
+  for (int i = 0; i < 10 && !g_stringMsg && !g_stringMsg2; ++i)
+    common::Time::MSleep(100);
+
+  EXPECT_TRUE(g_stringMsg);
+  EXPECT_TRUE(g_stringMsg2);
+
+  thread->join();
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, PublicationTransportNoConnection)
+{
+  Load("worlds/empty.world");
+  transport::PublicationTransport pubTransport("~/no_topic", "msg::Scene");
+  ASSERT_EQ("~/no_topic", pubTransport.GetTopic());
+  ASSERT_EQ("msg::Scene", pubTransport.GetMsgType());
+
+  ASSERT_NO_THROW(pubTransport.Fini());
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, PublicationTransportFiniConnection)
+{
+  Load("worlds/empty.world");
+  transport::PublicationTransport pubTransport("~/no_topic", "msg::Scene");
+  ASSERT_EQ("~/no_topic", pubTransport.GetTopic());
+  ASSERT_EQ("msg::Scene", pubTransport.GetMsgType());
+
+  transport::ConnectionPtr conn(new transport::Connection);
+  ASSERT_NO_THROW(pubTransport.Init(conn, false));
+
+  ASSERT_NO_THROW(pubTransport.Fini());
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, IfaceGetMsgTyp)
+{
+  Load("worlds/empty.world");
+  std::string type;
+
+  type = transport::getTopicMsgType("/gazebo/default/world_stats");
+  EXPECT_EQ(type, "gazebo.msgs.WorldStatistics");
+
+  type = transport::getTopicMsgType("garbage");
+  EXPECT_TRUE(type.empty());
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, IfaceGetTopicNameSpaces)
+{
+  Load("worlds/empty.world");
+  std::list<std::string> ns;
+
+  transport::get_topic_namespaces(ns);
+  EXPECT_FALSE(ns.empty());
+}
+
+/////////////////////////////////////////////////
+TEST_F(TransportTest, IfaceGetAdvertisedTopics)
+{
+  Load("worlds/empty.world");
+  std::list<std::string> topics;
+
+  topics = transport::getAdvertisedTopics("");
+  EXPECT_FALSE(topics.empty());
+
+  topics = transport::getAdvertisedTopics("no_msgs_of_this_type");
+  EXPECT_TRUE(topics.empty());
+
+  topics = transport::getAdvertisedTopics("gazebo.msgs.WorldStatistics");
+  EXPECT_FALSE(topics.empty());
+  EXPECT_EQ(topics.size(), 1u);
+
+  topics = transport::getAdvertisedTopics("gazebo.msgs.PosesStamped");
+  EXPECT_FALSE(topics.empty());
+  EXPECT_EQ(topics.size(), 2u);
+
+  std::map<std::string, std::list<std::string> > topicMap =
+    transport::getAdvertisedTopics();
+
+  EXPECT_FALSE(topics.empty());
+  EXPECT_TRUE(topicMap.find("gazebo.msgs.PosesStamped") != topicMap.end());
+}
+
+/////////////////////////////////////////////////
+// Test error cases
+TEST_F(TransportTest, Errors)
+{
+  Load("worlds/empty.world");
+  transport::NodePtr testNode = transport::NodePtr(new transport::Node());
+  testNode->Init("default");
+  transport::PublisherPtr scenePub;
+
+  transport::SubscriberPtr statsSub =
+    testNode->Subscribe("~/world_stats", &ReceiveWorldStatsMsg);
+  EXPECT_STREQ("/gazebo/default/world_stats", statsSub->GetTopic().c_str());
+
+  // This generates a warning message
+  // EXPECT_THROW(testNode->Advertise<math::Vector3>("~/scene"),
+  //             common::Exception);
+
+  scenePub = testNode->Advertise<msgs::Scene>("~/scene");
+  EXPECT_THROW(testNode->Advertise<msgs::Factory>("~/scene"),
+               common::Exception);
+
+  transport::PublisherPtr factoryPub =
+    testNode->Advertise<msgs::Factory>("~/factory");
+  factoryPub->WaitForConnection();
+  EXPECT_EQ(static_cast<unsigned int>(0), factoryPub->GetOutgoingCount());
+  EXPECT_STREQ("/gazebo/default/factory", factoryPub->GetTopic().c_str());
+  EXPECT_STREQ("gazebo.msgs.Factory", factoryPub->GetMsgType().c_str());
+
+  EXPECT_STREQ("default", testNode->GetTopicNamespace().c_str());
+  EXPECT_STREQ("/gazebo/default/factory",
+               testNode->DecodeTopicName("~/factory").c_str());
+  EXPECT_STREQ("~/factory",
+               testNode->EncodeTopicName("/gazebo/default/factory").c_str());
+
+  // Get the original URI
+  char *uri = getenv("GAZEBO_MASTER_URI");
+  std::string origURI = "GAZEBO_MASTER_URI=";
+  if (uri)
+    origURI += uri;
+
+  int i = 0;
+  while (!g_worldStatsMsg && !g_sceneMsg && !g_worldStatsDebugMsg && i < 20)
+  {
+    common::Time::MSleep(100);
+    ++i;
+  }
+  EXPECT_LT(i, 20);
+
+  putenv(const_cast<char*>("GAZEBO_MASTER_URI="));
+  std::string masterHost;
+  unsigned int masterPort;
+  EXPECT_FALSE(transport::get_master_uri(masterHost, masterPort));
+  EXPECT_STREQ("localhost", masterHost.c_str());
+  EXPECT_EQ(static_cast<unsigned int>(11345), masterPort);
+
+  // restore original URI
+  putenv(const_cast<char*>(origURI.c_str()));
+
+  transport::clear_buffers();
+  transport::pause_incoming(true);
+  transport::TopicManager::Instance()->ProcessNodes();
+  transport::pause_incoming(false);
+
+  transport::stop();
+  EXPECT_TRUE(transport::init(masterHost, masterPort));
+
+  scenePub.reset();
+  statsSub.reset();
+  testNode.reset();
+}
+
+/////////////////////////////////////////////////
+// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/transport_stress_nodes.cc b/test/integration/transport_stress_nodes.cc
new file mode 100644
index 0000000..61679ec
--- /dev/null
+++ b/test/integration/transport_stress_nodes.cc
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/thread.hpp>
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+
+class TransportStressTestNodes : public ServerFixture
+{
+};
+
+boost::mutex g_mutex;
+
+unsigned int g_localPublishMessageCount = 0;
+unsigned int g_localPublishCount = 0;
+unsigned int g_totalExpectedMsgCount = 0;
+common::Time g_localPublishEndTime;
+
+void LocalPublishCB(ConstImagePtr & /*_msg*/)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+
+  if (g_localPublishCount+1 >= g_totalExpectedMsgCount)
+    g_localPublishEndTime = common::Time::GetWallTime();
+  g_localPublishCount++;
+}
+
+/////////////////////////////////////////////////
+// Create a lot of nodes, each with a publisher and subscriber. Then send
+// out a few large messages.
+TEST_F(TransportStressTestNodes, ManyNodes)
+{
+  Load("worlds/empty.world");
+
+  // Storage for all the nodes, subscribers, and publishers
+  std::list<transport::NodePtr> nodes;
+  std::list<transport::SubscriberPtr> subs;
+  std::list<transport::PublisherPtr> pubs;
+
+  // The number of nodes to create
+  unsigned int nodeCount = 2000;
+
+  // The number of messages to send
+  g_localPublishMessageCount = 10;
+
+  // The expected number of messages to receive
+  g_totalExpectedMsgCount = nodeCount * nodeCount * g_localPublishMessageCount;
+
+  // Reset the received message counter
+  g_localPublishCount = 0;
+
+  // Create all the nodes.
+  for (unsigned int i = 0; i < nodeCount; ++i)
+  {
+    nodes.push_back(transport::NodePtr(new transport::Node()));
+    nodes.back()->Init();
+
+    pubs.push_back(nodes.back()->Advertise<msgs::Image>(
+          "~/test/local_publish2__", nodeCount * g_localPublishMessageCount));
+
+    subs.push_back(nodes.back()->Subscribe("~/test/local_publish2__",
+          &LocalPublishCB));
+  }
+
+  // Use a 2048x2048 image as the message
+  unsigned int width = 2048;
+  unsigned int height = 2048;
+  unsigned char *fakeData = new unsigned char[width * height];
+
+  // Create a large image message with fake data
+  msgs::Image fakeMsg;
+  fakeMsg.set_width(width);
+  fakeMsg.set_height(height);
+  fakeMsg.set_pixel_format(0);
+  fakeMsg.set_step(1);
+  fakeMsg.set_data(fakeData, width*height);
+
+  // Get the start time
+  common::Time startTime = common::Time::GetWallTime();
+
+  // Publish the messages many times
+  for (unsigned int i = 0; i < g_localPublishMessageCount; ++i)
+  {
+    for (std::list<transport::PublisherPtr>::iterator iter = pubs.begin();
+        iter != pubs.end(); ++iter)
+    {
+      (*iter)->Publish(fakeMsg);
+    }
+  }
+  common::Time publishTime = common::Time::GetWallTime();
+  gzmsg << "Publish complete" << std::endl;
+
+  // Wait for all the messages
+  int waitCount = 0;
+  while (g_localPublishCount < g_totalExpectedMsgCount && waitCount < 50)
+  {
+    common::Time::MSleep(1000);
+    waitCount++;
+  }
+
+  // Time it took to publish the messages.
+  common::Time pubDiff = publishTime - startTime;
+
+  // Time it took to received the messages.
+  common::Time receiveDiff = g_localPublishEndTime - startTime;
+
+  EXPECT_LT(waitCount, 50);
+
+  // Make sure we received all the messages.
+  EXPECT_EQ(g_totalExpectedMsgCount, g_localPublishCount);
+
+  // The total publish duration should always be very short.
+  // The calculation here is the number of messages published multiplied by
+  // the expected time to publish a single image message.
+  EXPECT_LT(static_cast<unsigned int>(pubDiff.nsec),
+      (g_localPublishMessageCount * nodes.size()) * 1500);
+
+  // The total receive duration will be longer.
+  EXPECT_LT(receiveDiff.sec, g_localPublishCount * 1e-6);
+
+  // Out time time for human testing purposes
+  gzmsg << "Time to publish " << g_localPublishMessageCount * nodes.size()
+    << " = " << pubDiff << std::endl;
+
+  gzmsg << "Time to receive " << g_localPublishCount << " = "
+    << receiveDiff << std::endl;
+
+  delete [] fakeData;
+}
+
+/////////////////////////////////////////////////
+// Main function
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/world.cc b/test/integration/world.cc
new file mode 100644
index 0000000..c2afd8a
--- /dev/null
+++ b/test/integration/world.cc
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+
+class WorldTest : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+TEST_F(WorldTest, ClearEmptyWorld)
+{
+  Load("worlds/blank.world");
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  EXPECT_EQ(world->GetModelCount(), 0u);
+
+  world->Clear();
+
+  // Wait some bit of time since World::Clear is not immediate.
+  for (unsigned int i = 0; i < 20; ++i)
+    common::Time::MSleep(500);
+
+  EXPECT_EQ(world->GetModelCount(), 0u);
+
+  // Now spawn something, and the model count should increase
+  SpawnSphere("sphere", math::Vector3(0, 0, 1), math::Vector3(0, 0, 0));
+  EXPECT_EQ(world->GetModelCount(), 1u);
+}
+
+/////////////////////////////////////////////////
+TEST_F(WorldTest, Clear)
+{
+  Load("worlds/pioneer2dx.world");
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  EXPECT_EQ(world->GetModelCount(), 2u);
+
+  world->Clear();
+  while (world->GetModelCount() > 0u)
+    common::Time::MSleep(1000);
+
+  EXPECT_EQ(world->GetModelCount(), 0u);
+
+  SpawnSphere("sphere", math::Vector3(0, 0, 1), math::Vector3(0, 0, 0));
+
+  EXPECT_EQ(world->GetModelCount(), 1u);
+}
+
+/////////////////////////////////////////////////
+TEST_F(WorldTest, ModifyLight)
+{
+  Load("worlds/empty.world");
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+  msgs::Scene sceneMsg = world->GetSceneMsg();
+
+  // Make sure there is only one light, and it is named "sun"
+  EXPECT_EQ(sceneMsg.light_size(), 1);
+  EXPECT_STREQ(sceneMsg.light(0).name().c_str(), "sun");
+
+  transport::PublisherPtr lightPub = this->node->Advertise<msgs::Light>(
+        "~/light");
+
+  // Set the light to be green
+  msgs::Light lightMsg;
+  lightMsg.set_name("sun");
+  msgs::Set(lightMsg.mutable_diffuse(), common::Color(0, 1, 0));
+  lightPub->Publish(lightMsg);
+
+  // Allow the world time to process the messages
+  world->Step(10);
+
+  // Get the new scene, and make sure the color of the "sun" light is
+  // correct.
+  msgs::Scene sceneMsg2 = world->GetSceneMsg();
+  EXPECT_EQ(sceneMsg2.light_size(), 1);
+  EXPECT_STREQ(sceneMsg2.light(0).name().c_str(), "sun");
+  EXPECT_EQ(sceneMsg2.light(0).diffuse().r(), 0);
+  EXPECT_EQ(sceneMsg2.light(0).diffuse().g(), 1);
+  EXPECT_EQ(sceneMsg2.light(0).diffuse().b(), 0);
+
+  // Add a new light
+  lightMsg.set_name("test_light");
+  msgs::Set(lightMsg.mutable_diffuse(), common::Color(1, 0, 1));
+  lightMsg.set_type(msgs::Light::POINT);
+  lightPub->Publish(lightMsg);
+
+  // Allow the world time to process the messages
+  world->Step(10);
+
+  sceneMsg2 = world->GetSceneMsg();
+  EXPECT_EQ(sceneMsg2.light_size(), 2);
+  EXPECT_STREQ(sceneMsg2.light(1).name().c_str(), "test_light");
+  EXPECT_EQ(sceneMsg2.light(1).diffuse().r(), 1);
+  EXPECT_EQ(sceneMsg2.light(1).diffuse().g(), 0);
+  EXPECT_EQ(sceneMsg2.light(1).diffuse().b(), 1);
+  EXPECT_EQ(sceneMsg2.light(1).type(), msgs::Light::POINT);
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/world_entity_below_point.cc b/test/integration/world_entity_below_point.cc
new file mode 100644
index 0000000..fc9b1d5
--- /dev/null
+++ b/test/integration/world_entity_below_point.cc
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/physics/PhysicsIface.hh"
+#include "gazebo/common/Time.hh"
+#include "test/ServerFixture.hh"
+#include "test/integration/helper_physics_generator.hh"
+
+using namespace gazebo;
+class WorldTest : public ServerFixture,
+                  public testing::WithParamInterface<const char*>
+{
+  /// \brief Test World::GetEntityBelowPoint
+  /// \param[in] _physicsEngine Type of physics engine to test.
+  public: void GetEntityBelowPoint(const std::string &_physicsEngine);
+};
+
+/////////////////////////////////////////////////
+void WorldTest::GetEntityBelowPoint(const std::string &_physicsEngine)
+{
+  // Load in a world with lasers
+  Load("worlds/shapes.world", false, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  std::vector<std::string> modelNames;
+  modelNames.push_back("box");
+  modelNames.push_back("cylinder");
+  modelNames.push_back("sphere");
+
+  std::vector<std::string>::iterator iter;
+  math::Vector3 pos, testPos;
+  physics::ModelPtr model;
+  physics::EntityPtr entity;
+  for (iter = modelNames.begin(); iter != modelNames.end(); ++iter)
+  {
+    model = world->GetModel(*iter);
+    ASSERT_TRUE(model != NULL);
+    pos = model->GetWorldPose().pos;
+    pos.z += 10;
+
+    entity = world->GetEntityBelowPoint(pos);
+    if (entity)
+    {
+      gzdbg << "hit: " << entity->GetScopedName()
+            << ", expected: " << model->GetScopedName()
+            << std::endl;
+      EXPECT_EQ(entity->GetParentModel()->GetName(), model->GetName());
+    }
+    else
+    {
+      // Give a failure since we expected to get a return
+      EXPECT_TRUE(entity != NULL);
+    }
+
+    testPos = pos;
+    testPos.z = pos.z + 5;
+    entity = world->GetEntityBelowPoint(testPos);
+    if (entity)
+    {
+      gzdbg << "hit: " << entity->GetScopedName()
+            << ", expected: " << model->GetScopedName()
+            << std::endl;
+      EXPECT_EQ(entity->GetParentModel(), model);
+    }
+    else
+    {
+      // Give a failure since we expected to get a return
+      EXPECT_TRUE(entity != NULL);
+    }
+  }
+
+  // Ground plane
+  pos.Set(25, 25, 1);
+  entity = world->GetEntityBelowPoint(pos);
+  if (entity)
+  {
+    gzdbg << "hit: " << entity->GetScopedName()
+          << ", expected: " << model->GetScopedName()
+          << std::endl;
+    EXPECT_EQ(entity->GetParentModel()->GetName(), "ground_plane");
+  }
+  else
+  {
+    // Give a failure since we expected to get a return
+    EXPECT_TRUE(entity != NULL);
+  }
+
+  // Expect no hit
+  pos.Set(25, 25, -1);
+  entity = world->GetEntityBelowPoint(pos);
+  EXPECT_TRUE(entity == NULL);
+}
+
+/////////////////////////////////////////////////
+TEST_P(WorldTest, GetEntityBelowPoint)
+{
+  if (std::string(GetParam()) != "ode" &&
+      std::string(GetParam()) != "bullet")
+  {
+    gzerr << "GetEntityBelowPoint not implemented for " << GetParam() << "\n";
+  }
+  else
+  {
+    GetEntityBelowPoint(GetParam());
+  }
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, WorldTest, PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/world_reset.cc b/test/integration/world_reset.cc
new file mode 100644
index 0000000..b36f60d
--- /dev/null
+++ b/test/integration/world_reset.cc
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <string.h>
+
+#include "gazebo/physics/physics.hh"
+#include "ServerFixture.hh"
+#include "helper_physics_generator.hh"
+
+using namespace gazebo;
+
+typedef std::tr1::tuple<const char *, const char *, int> string2_int;
+
+class WorldResetTest : public ServerFixture,
+                       public ::testing::WithParamInterface<string2_int>
+{
+  public: void WorldName(const std::string &_physicsEngine,
+                         const std::string &_world, int _resets);
+};
+
+/////////////////////////////////////////////////
+void WorldResetTest::WorldName(const std::string &_physicsEngine,
+                               const std::string &_world, int _resets)
+{
+  if (_physicsEngine == "dart")
+  {
+    gzerr << "Abort test since dart does not support ray sensor in PR2, "
+          << "Please see issue #911.\n";
+    return;
+  }
+
+  Load(_world, true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  double dt = physics->GetMaxStepSize();
+  unsigned int steps = 250;
+
+  // Step forward, verify time increasing
+  world->Step(steps);
+  double simTime = world->GetSimTime().Double();
+  EXPECT_NEAR(simTime, dt*steps, dt);
+
+  // Reset world repeatedly
+  for (int i = 0; i < _resets; ++i)
+  {
+    // Reset world, verify time == 0
+    world->Reset();
+    simTime = world->GetSimTime().Double();
+    EXPECT_NEAR(simTime, 0.0, dt);
+
+    // Step forward, verify time increasing
+    world->Step(steps);
+    simTime = world->GetSimTime().Double();
+    EXPECT_NEAR(simTime, dt*steps, dt);
+  }
+}
+
+/////////////////////////////////////////////////
+TEST_P(WorldResetTest, WorldName)
+{
+  std::string physics = std::tr1::get<0>(GetParam());
+  std::string worldName = std::tr1::get<1>(GetParam());
+  int resets = std::tr1::get<2>(GetParam());
+  gzdbg << "Physics engine [" << physics << "] "
+        << "world name [" << worldName << "] "
+        << "reset count [" << resets << "]"
+        << std::endl;
+  WorldName(physics, worldName, resets);
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, WorldResetTest,
+  ::testing::Combine(PHYSICS_ENGINE_VALUES,
+  ::testing::Values("worlds/empty.world"
+                  , "worlds/pr2.world"),
+  ::testing::Range(1, 3)));
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/integration/worlds_installed.cc b/test/integration/worlds_installed.cc
new file mode 100644
index 0000000..e4bdda2
--- /dev/null
+++ b/test/integration/worlds_installed.cc
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <boost/algorithm/string/find.hpp>
+#include <boost/filesystem.hpp>
+#include <string>
+#include <gtest/gtest.h>
+
+#include "test_config.h"
+
+/////////////////////////////////////////////////
+std::string customExec(std::string _cmd)
+{
+  _cmd += " 2>/dev/null";
+  FILE* pipe = popen(_cmd.c_str(), "r");
+
+  if (!pipe)
+    return "ERROR";
+
+  char buffer[128];
+  std::string result = "";
+
+  while (!feof(pipe))
+  {
+    if (fgets(buffer, 128, pipe) != NULL)
+      result += buffer;
+  }
+
+  pclose(pipe);
+  return result;
+}
+
+
+/////////////////////////////////////////////////
+TEST(WorldsInstalled, checkWorlds)
+{
+  // Setup the path containing the worlds.
+  boost::filesystem::path worldsPath(PROJECT_SOURCE_PATH);
+  worldsPath /= "worlds";
+
+  if (!boost::filesystem::exists(worldsPath) ||
+      !boost::filesystem::is_directory(worldsPath))
+  {
+    std::cerr << "The worlds directory [" << worldsPath
+              << "] does not exist or it's not a directory." << std::endl;
+    FAIL();
+  }
+
+  // Iterate over the list of world files.
+  boost::filesystem::directory_iterator end_iter;
+  for (boost::filesystem::directory_iterator dir_itr(worldsPath);
+          dir_itr != end_iter; ++dir_itr )
+  {
+    if (dir_itr->path().filename().extension() == ".world")
+    {
+      std::string cmd = "gzsdf check " + dir_itr->path().string();
+      std::string result = customExec(cmd);
+
+      bool success = boost::algorithm::find_first(result, "Success");
+      EXPECT_TRUE(success);
+      if (!success)
+        std::cerr << "World file [" << dir_itr->path()
+                  << "] is going to be installed but it's not SDF compliant.\n";
+      }
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/regression/media/materials/textures/invalid_size.png b/test/media/materials/textures/invalid_size.png
similarity index 100%
rename from test/regression/media/materials/textures/invalid_size.png
rename to test/media/materials/textures/invalid_size.png
diff --git a/test/regression/media/materials/textures/not_square.png b/test/media/materials/textures/not_square.png
similarity index 100%
rename from test/regression/media/materials/textures/not_square.png
rename to test/media/materials/textures/not_square.png
diff --git a/test/regression/media/materials/textures/white_alpha.png b/test/media/materials/textures/white_alpha.png
similarity index 100%
rename from test/regression/media/materials/textures/white_alpha.png
rename to test/media/materials/textures/white_alpha.png
diff --git a/test/regression/media/materials/textures/white_no_alpha.png b/test/media/materials/textures/white_no_alpha.png
similarity index 100%
rename from test/regression/media/materials/textures/white_no_alpha.png
rename to test/media/materials/textures/white_no_alpha.png
diff --git a/test/regression/media/models/cube_20k/meshes/cube_20k.stl b/test/media/models/cube_20k/meshes/cube_20k.stl
similarity index 100%
rename from test/regression/media/models/cube_20k/meshes/cube_20k.stl
rename to test/media/models/cube_20k/meshes/cube_20k.stl
diff --git a/test/models/box.sdf b/test/models/box.sdf
new file mode 100644
index 0000000..cbc698c
--- /dev/null
+++ b/test/models/box.sdf
@@ -0,0 +1,25 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <model name="box">
+    <pose>0 0 0.5 0 0 0</pose>
+    <link name="link">
+      <collision name="collision">
+        <geometry>
+          <box>
+            <size>1 1 1</size>
+          </box>
+        </geometry>
+      </collision>
+      <visual name="visual">
+        <geometry>
+          <box>
+            <size>1 1 1</size>
+          </box>
+        </geometry>
+        <material>
+          <script>Gazebo/WoodPallet</script>
+        </material>
+      </visual>
+    </link>
+  </model>
+</sdf>
diff --git a/test/performance/CMakeLists.txt b/test/performance/CMakeLists.txt
new file mode 100644
index 0000000..7ce1ed5
--- /dev/null
+++ b/test/performance/CMakeLists.txt
@@ -0,0 +1,31 @@
+include_directories (
+  ${ODE_INCLUDE_DIRS}
+  ${OPENGL_INCLUDE_DIR}
+  ${OGRE_INCLUDE_DIRS}
+  ${Boost_INCLUDE_DIRS}
+  ${PROTOBUF_INCLUDE_DIR}
+)
+
+link_directories(
+  ${ogre_library_dirs}
+  ${Boost_LIBRARY_DIRS}
+  ${ODE_LIBRARY_DIRS}
+)
+
+if (HAVE_BULLET)
+  include_directories ( ${BULLET_INCLUDE_DIRS} )
+  link_directories ( ${BULLET_LIBRARY_DIRS} )
+endif()
+
+# Per issue #802, these tests are not yet portable
+if (NOT APPLE)
+  set(tests
+    RAMLibrary_TEST.cc
+    factory_stress.cc
+    gz_stress.cc
+    sensor_stress.cc
+    transport_stress.cc
+  )
+  
+  gz_build_tests(${tests})
+endif()
diff --git a/test/performance/RAMLibrary.hh b/test/performance/RAMLibrary.hh
new file mode 100644
index 0000000..ad31f12
--- /dev/null
+++ b/test/performance/RAMLibrary.hh
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#ifndef TEST_CHECKFREERAM_HH
+#define TEST_CHECKFREERAM_HH 1
+
+#ifdef _WIN32
+#elif __APPLE__
+#elif __linux
+#include <unistd.h>
+#include <iostream>
+#include <fstream>
+#include <limits>
+#include <string>
+#include <inttypes.h>
+
+namespace gazebo
+{
+  namespace test
+  {
+    namespace memory
+    {
+      /// \brief Parse the /proc/meminfo and return the value corresponding to
+      ///        key given.
+      /// \param[in] _key string represent keys in meminfo ended with a colon
+      ///        example: "MemFree:"
+      uint64_t ParseProcMeminfo(const std::string &_key)
+      {
+          std::string token;
+          std::ifstream file("/proc/meminfo");
+          while (file >> token)
+          {
+              if (token == _key)
+              {
+                  uint64_t mem;
+                  if (file >> mem)
+                      return mem;
+                  else
+                      return 0;
+              }
+              // ignore rest of the line
+              file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+          }
+          return 0;  // nothing found
+      }
+
+      /// \brief Get the RAM memory available at the moment
+      /// \return RAM ammount in Megabytes
+      uint64_t GetMemoryAvailable()
+      {
+          return ParseProcMeminfo("MemFree:") / 1024;
+      }
+
+      /// \brief Get the total RAM memory present in the system
+      /// \return RAM ammount in Megabytes
+      uint64_t GetTotalMemory()
+      {
+          return ParseProcMeminfo("MemTotal:") / 1024;
+      }
+
+      typedef uint64_t megabyte;
+
+      /// \brief Check if a given ammount of RAM is available at the system
+      /// \param[in] _ammount ammount of RAM desired for checking
+      bool IsMemoryAvailable(const megabyte ammount)
+      {
+        return (GetMemoryAvailable() > ammount);
+      }
+    }
+  }
+}
+#endif
+#endif
diff --git a/test/performance/RAMLibrary_TEST.cc b/test/performance/RAMLibrary_TEST.cc
new file mode 100644
index 0000000..ee239cb
--- /dev/null
+++ b/test/performance/RAMLibrary_TEST.cc
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <gtest/gtest.h>
+
+#include "RAMLibrary.hh"
+
+using namespace gazebo::test::memory;
+
+TEST(RAMLibrary, GetMemoryAvailable_NoZero)
+{
+  ASSERT_GT(GetMemoryAvailable(), 0.0);
+}
+
+TEST(RAMLibrary, GetTotalMemory_NoZero)
+{
+  ASSERT_GT(GetTotalMemory(), 0.0);
+}
+
+TEST(RAMLibrary, GetTotalMemory_GreaterThanAvailable)
+{
+  ASSERT_GT(GetTotalMemory(), GetMemoryAvailable());
+}
+
+TEST(RAMLibrary, IsMemoryAvailable_OneMegabyte_True)
+{
+  ASSERT_TRUE(IsMemoryAvailable(1));
+}
+
+TEST(RAMLibrary, IsMemoryAvailable_TotalMem_False)
+{
+  ASSERT_FALSE(IsMemoryAvailable(GetTotalMemory()));
+}
+
+TEST(RAMLibrary, IsMemoryAvailable_CrazyHighNumber_False)
+{
+  ASSERT_FALSE(IsMemoryAvailable(9999999999));
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/performance/factory_stress.cc b/test/performance/factory_stress.cc
new file mode 100644
index 0000000..937d83c
--- /dev/null
+++ b/test/performance/factory_stress.cc
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+class FactoryStressTest : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+void OnWorldStats(ConstWorldStatisticsPtr &/*_msg*/)
+{
+}
+
+/////////////////////////////////////////////////
+TEST_F(FactoryStressTest, Bookshelf)
+{
+  Load("worlds/empty.world");
+
+  gazebo::transport::SubscriberPtr sub =
+    this->node->Subscribe("~/world_stats", &OnWorldStats);
+
+  for (int i = 0; i < 100; ++i)
+  {
+    SpawnModel("model://bookshelf");
+    gazebo::common::Time::MSleep(500);
+    RemoveModel("bookshelf");
+  }
+
+  sub.reset();
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/performance/gz_stress.cc b/test/performance/gz_stress.cc
new file mode 100644
index 0000000..0347f10
--- /dev/null
+++ b/test/performance/gz_stress.cc
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/filesystem.hpp>
+
+#include <gazebo/common/CommonIface.hh>
+#include <gazebo/msgs/msgs.hh>
+#include <gazebo/transport/transport.hh>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string>
+
+#include "test/util.hh"
+#include "test_config.h"
+
+class gzTest : public gazebo::testing::AutoLogFixture { };
+
+std::string g_msgDebugOut;
+boost::mutex g_mutex;
+pid_t g_pid = -1;
+boost::condition_variable g_msgCondition;
+
+/////////////////////////////////////////////////
+void WorldControlCB(ConstWorldControlPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut = _msg->DebugString();
+  g_msgCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+bool custom_exec(std::string _cmd)
+{
+  return system(_cmd.c_str()) >= 0;
+}
+
+/////////////////////////////////////////////////
+std::string custom_exec_str(std::string _cmd)
+{
+  _cmd += " 2>&1";
+  FILE *pipe = popen(_cmd.c_str(), "r");
+
+  if (!pipe)
+    return "ERROR";
+
+  char buffer[128];
+  std::string result = "";
+
+  while (!feof(pipe))
+  {
+    if (fgets(buffer, 128, pipe) != NULL)
+      result += buffer;
+  }
+
+  pclose(pipe);
+  return result;
+}
+
+/////////////////////////////////////////////////
+void waitForMsg(const std::string &_cmd)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut.clear();
+
+  bool good = false;
+  int iters = 0;
+  while (!good && iters < 20)
+  {
+    custom_exec(_cmd);
+
+    good = g_msgCondition.timed_wait(lock,
+        boost::posix_time::milliseconds(1000));
+    ++iters;
+  }
+
+  EXPECT_LT(iters, 20);
+  EXPECT_TRUE(!g_msgDebugOut.empty());
+}
+
+/////////////////////////////////////////////////
+void init()
+{
+  g_pid = fork();
+
+  if (!g_pid)
+  {
+    boost::filesystem::path worldFilePath = TEST_PATH;
+    worldFilePath = worldFilePath / "worlds" / "simple_arm_test.world";
+    if (execlp("gzserver", worldFilePath.string().c_str(),
+        "--iters", "60000", NULL) < 0)
+    {
+      gzerr << "Failed to start the gazebo server.\n";
+    }
+    return;
+  }
+
+  EXPECT_TRUE(gazebo::transport::init());
+}
+
+/////////////////////////////////////////////////
+void fini()
+{
+  gazebo::transport::fini();
+  if (kill(g_pid, SIGINT) < 0)
+    gzerr << "Failed to kill the gazebo server.\n";
+
+  int status;
+  int p1 = 0;
+  for (unsigned int i = 0; i < 5 && p1 != g_pid; ++i)
+    p1 = waitpid(g_pid, &status, WNOHANG);
+  if (p1 != g_pid)
+  {
+    kill(g_pid, SIGKILL);
+    waitpid(g_pid, &status, 0);
+  }
+
+  g_pid = -1;
+}
+
+/////////////////////////////////////////////////
+TEST_F(gzTest, Stress)
+{
+  init();
+
+  gazebo::transport::NodePtr node(new gazebo::transport::Node());
+  node->Init();
+  gazebo::transport::SubscriberPtr sub =
+    node->Subscribe("~/world_control", &WorldControlCB, true);
+
+  // Run the transport loop: starts a new thread
+  gazebo::transport::run();
+
+  // Test world reset time
+  for (unsigned int i = 0; i < 100; ++i)
+  {
+    waitForMsg("gz world -w default -t");
+
+    gazebo::msgs::WorldControl msg;
+    msg.mutable_reset()->set_time_only(true);
+    ASSERT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  fini();
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/performance/sensor_stress.cc b/test/performance/sensor_stress.cc
new file mode 100644
index 0000000..f3aba49
--- /dev/null
+++ b/test/performance/sensor_stress.cc
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include "gazebo/physics/PhysicsIface.hh"
+#include "gazebo/common/Time.hh"
+#include "test/ServerFixture.hh"
+
+using namespace gazebo;
+class SensorStress_TEST : public ServerFixture
+{
+};
+
+boost::condition_variable g_countCondition;
+
+// global variable and callback for tracking hokuyo sensor messages
+unsigned int g_hokuyoMsgCount;
+void ReceiveHokuyoMsg(ConstLaserScanStampedPtr &/*_msg*/)
+{
+  g_hokuyoMsgCount++;
+  if (g_hokuyoMsgCount >= 20)
+    g_countCondition.notify_one();
+}
+
+/////////////////////////////////////////////////
+/// \brief Reset world a bunch of times and verify that no assertions happen
+/// The assert "SensorManager.cc(479): Took negative time to update a sensor."
+/// has been observed in Jenkins testing.
+TEST_F(SensorStress_TEST, ResetWorldStressTest)
+{
+  // Load in a world with lasers
+  Load("worlds/ray_test.world");
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // get the sensor manager
+  sensors::SensorManager *mgr = sensors::SensorManager::Instance();
+  EXPECT_TRUE(mgr->SensorsInitialized());
+
+  // get the hokuyo sensor
+  sensors::SensorPtr sensor;
+  sensor = mgr->GetSensor("default::hokuyo::link::laser");
+  ASSERT_TRUE(sensor != NULL);
+
+  // set update rate to unlimited
+  double updateRate = 0.0;
+  sensor->SetUpdateRate(updateRate);
+  gzdbg << sensor->GetScopedName() << " loaded with update rate of "
+        << sensor->GetUpdateRate() << " Hz\n";
+
+  g_hokuyoMsgCount = 0;
+
+  // Subscribe to hokuyo laser scan messages
+  transport::NodePtr node = transport::NodePtr(new transport::Node());
+  node->Init();
+  transport::SubscriberPtr sceneSub = node->Subscribe(
+      "~/hokuyo/link/laser/scan", &ReceiveHokuyoMsg);
+
+  // Wait for messages to arrive
+  {
+    boost::mutex countMutex;
+    boost::mutex::scoped_lock lock(countMutex);
+    g_countCondition.wait(lock);
+    gzdbg << "counted " << g_hokuyoMsgCount << " hokuyo messages\n";
+  }
+
+  EXPECT_GT(g_hokuyoMsgCount, 19u);
+
+  // Send reset world message
+  transport::PublisherPtr worldControlPub =
+    node->Advertise<msgs::WorldControl>("~/world_control");
+
+  // Copied from MainWindow::OnResetWorld
+  msgs::WorldControl msg;
+  msg.mutable_reset()->set_all(true);
+  worldControlPub->Publish(msg);
+
+  common::Time::MSleep(300);
+
+  int i;
+  for (i = 0; i < 20; ++i)
+  {
+    worldControlPub->Publish(msg);
+    gzdbg << "counted " << g_hokuyoMsgCount << " hokuyo messages\n";
+    common::Time::MSleep(200);
+  }
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/performance/transport_stress.cc b/test/performance/transport_stress.cc
new file mode 100644
index 0000000..4660561
--- /dev/null
+++ b/test/performance/transport_stress.cc
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/thread.hpp>
+#include "ServerFixture.hh"
+#include "RAMLibrary.hh"
+
+using namespace gazebo;
+
+class TransportStressTest : public ServerFixture
+{
+};
+
+boost::mutex g_mutex;
+
+unsigned int g_localPublishMessageCount = 0;
+unsigned int g_localPublishCount = 0;
+unsigned int g_totalExpectedMsgCount = 0;
+common::Time g_localPublishEndTime;
+
+void LocalPublishCB(ConstImagePtr & /*_msg*/)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+
+  if (g_localPublishCount+1 >= g_totalExpectedMsgCount)
+    g_localPublishEndTime = common::Time::GetWallTime();
+  g_localPublishCount++;
+}
+
+/////////////////////////////////////////////////
+// Test for local publication. This test will create a large image and
+// publish it to a local subscriber. Serialization should be bypassed,
+// resulting fast publication.
+TEST_F(TransportStressTest, LocalPublish)
+{
+  Load("worlds/empty.world");
+
+  // Number of messages to publish
+  g_localPublishMessageCount = 1000000;
+
+  /// Expected number of messages to receive
+  g_totalExpectedMsgCount = g_localPublishMessageCount;
+
+  // Reset the received message counter
+  g_localPublishCount = 0;
+
+  transport::NodePtr testNode = transport::NodePtr(new transport::Node());
+  testNode->Init("default");
+
+  transport::PublisherPtr pub = testNode->Advertise<msgs::Image>(
+      "~/test/local_publish__", g_localPublishMessageCount);
+
+  transport::SubscriberPtr sub = testNode->Subscribe("~/test/local_publish__",
+      &LocalPublishCB);
+
+  unsigned int width = 2048;
+  unsigned int height = 2048;
+  unsigned char *fakeData = new unsigned char[width * height];
+
+  // Create a large image message with fake data
+  msgs::Image fakeMsg;
+  fakeMsg.set_width(width);
+  fakeMsg.set_height(height);
+  fakeMsg.set_pixel_format(0);
+  fakeMsg.set_step(1);
+  fakeMsg.set_data(fakeData, width*height);
+
+  // Get the start time
+  common::Time startTime = common::Time::GetWallTime();
+
+  // Publish the messages many times
+  for (unsigned int i = 0; i < g_localPublishMessageCount; ++i)
+  {
+    pub->Publish(fakeMsg);
+  }
+  gzmsg << "Publish Complete" << std::endl;
+
+  // Wait for all the messages
+  int waitCount = 0;
+  while (g_localPublishCount < g_totalExpectedMsgCount && waitCount < 50)
+  {
+    common::Time::MSleep(1000);
+    waitCount++;
+  }
+
+  // Time it took to publish the messages.
+  common::Time diff = g_localPublishEndTime - startTime;
+
+  EXPECT_LT(waitCount, 50);
+
+  // Make sure we received all the messages.
+  EXPECT_EQ(g_totalExpectedMsgCount, g_localPublishCount);
+
+  // The total duration should always be very short.
+  EXPECT_LT(diff.sec, g_localPublishMessageCount * 0.0008);
+
+  // Out time time for human testing purposes
+  gzmsg << "Time to publish " << g_localPublishCount  << " messages = "
+    << diff << "\n";
+
+  delete [] fakeData;
+}
+
+/////////////////////////////////////////////////
+// Create a lot of nodes, each with a publisher and subscriber. Then send
+// out a few large messages.
+TEST_F(TransportStressTest, ManyNodes)
+{
+  Load("worlds/empty.world");
+
+  // Storage for all the nodes, subscribers, and publishers
+  std::list<transport::NodePtr> nodes;
+  std::list<transport::SubscriberPtr> subs;
+  std::list<transport::PublisherPtr> pubs;
+
+  // The number of nodes to create.
+  #ifdef USE_LOW_MEMORY_TESTS
+    // 1k nodes publish 10 times needs about 400Mb of RAM
+    unsigned int nodeCount = 500;
+    unsigned int requiredMB = 400;
+  #else
+    // 2k nodes publish 10 times needs about 1.7Gb of RAM
+    unsigned int nodeCount = 1000;
+    unsigned int requiredMB = 1700;
+  #endif
+
+  // Check if there is enough memory available
+  if (!gazebo::test::memory::IsMemoryAvailable(requiredMB))
+  {
+    gzdbg << "Skipped test since " << requiredMB <<
+              "Mb of RAM were not available \n";
+    SUCCEED();
+    return;
+  }
+
+  // The number of messages to send
+  g_localPublishMessageCount = 10;
+
+  // The expected number of messages to receive
+  g_totalExpectedMsgCount = nodeCount * nodeCount * g_localPublishMessageCount;
+
+  // Reset the received message counter
+  g_localPublishCount = 0;
+
+  // Create all the nodes.
+  for (unsigned int i = 0; i < nodeCount; ++i)
+  {
+    nodes.push_back(transport::NodePtr(new transport::Node()));
+    nodes.back()->Init();
+
+    pubs.push_back(nodes.back()->Advertise<msgs::Image>(
+          "~/test/local_publish2__", nodeCount * g_localPublishMessageCount));
+
+    subs.push_back(nodes.back()->Subscribe("~/test/local_publish2__",
+          &LocalPublishCB));
+  }
+
+  // Use a 2048x2048 image as the message
+  unsigned int width = 2048;
+  unsigned int height = 2048;
+  unsigned char *fakeData = new unsigned char[width * height];
+
+  // Create a large image message with fake data
+  msgs::Image fakeMsg;
+  fakeMsg.set_width(width);
+  fakeMsg.set_height(height);
+  fakeMsg.set_pixel_format(0);
+  fakeMsg.set_step(1);
+  fakeMsg.set_data(fakeData, width*height);
+
+  // Get the start time
+  common::Time startTime = common::Time::GetWallTime();
+
+  // Publish the messages many times
+  for (unsigned int i = 0; i < g_localPublishMessageCount; ++i)
+  {
+    for (std::list<transport::PublisherPtr>::iterator iter = pubs.begin();
+        iter != pubs.end(); ++iter)
+    {
+      (*iter)->Publish(fakeMsg);
+    }
+  }
+  common::Time publishTime = common::Time::GetWallTime();
+  gzmsg << "Publish complete" << std::endl;
+
+  // Wait for all the messages
+  int waitCount = 0;
+  while (g_localPublishCount < g_totalExpectedMsgCount && waitCount < 100)
+  {
+    common::Time::MSleep(1000);
+    waitCount++;
+  }
+
+  // Time it took to publish the messages.
+  common::Time pubDiff = publishTime - startTime;
+
+  // Time it took to received the messages.
+  common::Time receiveDiff = g_localPublishEndTime - startTime;
+
+  EXPECT_LT(waitCount, 100);
+
+  // Make sure we received all the messages.
+  EXPECT_EQ(g_totalExpectedMsgCount, g_localPublishCount);
+
+  // The total publish duration should always be very short.
+  // The calculation here is the number of messages published multiplied by
+  // the expected time to publish a single image message.
+  // We used to check against 1 sec. However, the time can occasionally jump
+  // depending on the system and its usage.
+  EXPECT_LE(pubDiff.sec, 2);
+
+  // The total receive duration will be longer.
+  EXPECT_LT(receiveDiff.sec, g_localPublishCount * 1e-5);
+
+  // Out time time for human testing purposes
+  gzmsg << "Time to publish " << g_localPublishMessageCount * nodes.size()
+    << " = " << pubDiff << std::endl;
+
+  gzmsg << "Time to receive " << g_localPublishCount << " = "
+    << receiveDiff << std::endl;
+
+  delete [] fakeData;
+}
+
+/////////////////////////////////////////////////
+// Main function
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/pkgconfig/CMakeLists.txt b/test/pkgconfig/CMakeLists.txt
new file mode 100644
index 0000000..5ccf41d
--- /dev/null
+++ b/test/pkgconfig/CMakeLists.txt
@@ -0,0 +1,3 @@
+set (tests config-pkgconfig.cc)
+add_definitions("-DSOURCE_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}/plugin\"")
+gz_build_tests(${tests})
diff --git a/test/pkgconfig/config-pkgconfig.cc b/test/pkgconfig/config-pkgconfig.cc
new file mode 100644
index 0000000..81310c1
--- /dev/null
+++ b/test/pkgconfig/config-pkgconfig.cc
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#include <gtest/gtest.h>
+#include <stdio.h>
+
+TEST(PkgConfig, Config)
+{
+  char cmd[1024];
+
+  snprintf(cmd, sizeof(cmd), "cmake %s", SOURCE_DIR);
+  ASSERT_EQ(system(cmd), 0);
+  snprintf(cmd, sizeof(cmd), "make");
+  ASSERT_EQ(system(cmd), 0);
+}
+
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/pkgconfig/plugin/CMakeLists.txt b/test/pkgconfig/plugin/CMakeLists.txt
new file mode 100644
index 0000000..60b7af8
--- /dev/null
+++ b/test/pkgconfig/plugin/CMakeLists.txt
@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+
+find_package(Boost REQUIRED COMPONENTS system)
+include_directories(${Boost_INCLUDE_DIRS})
+link_directories(${Boost_LIBRARY_DIRS})
+
+include (FindPkgConfig)
+if (PKG_CONFIG_FOUND)
+  pkg_check_modules(GAZEBO gazebo)
+endif()
+include_directories(${GAZEBO_INCLUDE_DIRS})
+link_directories(${GAZEBO_LIBRARY_DIRS})
+
+add_library(hello_world SHARED ../../testfiles/hello_world.cc)
+target_link_libraries(hello_world ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})
diff --git a/test/plugins/CMakeLists.txt b/test/plugins/CMakeLists.txt
new file mode 100644
index 0000000..471fe68
--- /dev/null
+++ b/test/plugins/CMakeLists.txt
@@ -0,0 +1,25 @@
+include_directories(
+  ${PROJECT_SOURCE_DIR}
+  ${PROTOBUF_INCLUDE_DIR}
+  ${SDF_INCLUDE_DIRS}
+  ${OGRE_INCLUDE_DIRS}
+)
+
+link_directories(
+  ${SDF_LIBRARY_DIRS}
+)
+
+if (HAVE_BULLET)
+  link_directories(${BULLET_LIBRARY_DIRS})
+endif()
+
+set (plugins
+  ForceTorqueModelRemovalTestPlugin
+  ModelTrajectoryTestPlugin
+  SpringTestPlugin
+)
+
+foreach (src ${plugins})
+  add_library(${src} SHARED ${src}.cc)
+  target_link_libraries(${src} libgazebo gazebo_sensors ${ogre_libraries})
+endforeach (src ${plugins})
diff --git a/test/plugins/ForceTorqueModelRemovalTestPlugin.cc b/test/plugins/ForceTorqueModelRemovalTestPlugin.cc
new file mode 100644
index 0000000..eba4e2a
--- /dev/null
+++ b/test/plugins/ForceTorqueModelRemovalTestPlugin.cc
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "plugins/ForceTorqueModelRemovalTestPlugin.hh"
+
+#include "gazebo/sensors/ForceTorqueSensor.hh"
+
+
+using namespace gazebo;
+
+GZ_REGISTER_SENSOR_PLUGIN(ForceTorqueModelRemovalTestPlugin)
+
+/////////////////////////////////////////////////
+ForceTorqueModelRemovalTestPlugin::ForceTorqueModelRemovalTestPlugin()
+  : SensorPlugin(), parentSensor(0)
+{
+}
+
+/////////////////////////////////////////////////
+void ForceTorqueModelRemovalTestPlugin::Init()
+{
+}
+
+/////////////////////////////////////////////////
+ForceTorqueModelRemovalTestPlugin::~ForceTorqueModelRemovalTestPlugin()
+{
+  if (this->updateConnection.get())
+  {
+    event::Events::DisconnectWorldUpdateBegin(this->updateConnection);
+    this->updateConnection = gazebo::event::ConnectionPtr();
+  }
+
+  parentSensor = 0;
+}
+
+void ForceTorqueModelRemovalTestPlugin::Load(sensors::SensorPtr _sensor,
+                                             sdf::ElementPtr /*_sdf*/)
+{
+  _sensor->SetActive(true);
+
+  parentSensor =
+    (gazebo::sensors::ForceTorqueSensor*) boost::get_pointer(_sensor);
+
+  // Create connection
+  this->updateConnection = gazebo::event::Events::ConnectWorldUpdateBegin(
+       boost::bind(&ForceTorqueModelRemovalTestPlugin::onUpdate, this, _1));
+}
+
+void ForceTorqueModelRemovalTestPlugin::onUpdate(
+    const gazebo::common::UpdateInfo & /*_info*/)
+{
+  gazebo::math::Vector3 force;
+  gazebo::math::Vector3 torque;
+
+  if ( parentSensor )
+  {
+    force = this->parentSensor->GetForce();
+    torque = this->parentSensor->GetTorque();
+
+    int i = 0;
+
+    for (i = 0; i < 3; ++i)
+    {
+      forcetorque_data[0+i] = force[i];
+    }
+
+    for (i = 0; i < 3; ++i)
+    {
+      forcetorque_data[3+i] = torque[i];
+    }
+  }
+
+  return;
+}
diff --git a/test/plugins/ForceTorqueModelRemovalTestPlugin.hh b/test/plugins/ForceTorqueModelRemovalTestPlugin.hh
new file mode 100644
index 0000000..976a04b
--- /dev/null
+++ b/test/plugins/ForceTorqueModelRemovalTestPlugin.hh
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef _GAZEBO_FORCETORQUE_MODEL_REMOVAL_TEST_PLUGIN_HH_
+#define _GAZEBO_FORCETORQUE_MODEL_REMOVAL_TEST_PLUGIN_HH_
+
+#include <gazebo/gazebo.hh>
+#include <string>
+
+namespace gazebo
+{
+  namespace sensors {
+    class ForceTorqueSensor;
+  }
+
+  class GAZEBO_VISIBLE ForceTorqueModelRemovalTestPlugin : public SensorPlugin
+  {
+    public: ForceTorqueModelRemovalTestPlugin();
+    public: virtual ~ForceTorqueModelRemovalTestPlugin();
+
+    public: virtual void Load(sensors::SensorPtr _sensor, sdf::ElementPtr _sdf);
+    public: void onUpdate(const gazebo::common::UpdateInfo & /*_info*/);
+
+    private: virtual void Init();
+
+    private: sensors::ForceTorqueSensor* parentSensor;
+
+    private: std::string sensorName;
+    private: double forcetorque_data[6];
+
+    private: gazebo::event::ConnectionPtr updateConnection;
+  };
+}
+
+#endif
diff --git a/test/plugins/ModelTrajectoryTestPlugin.cc b/test/plugins/ModelTrajectoryTestPlugin.cc
new file mode 100644
index 0000000..39d7ffd
--- /dev/null
+++ b/test/plugins/ModelTrajectoryTestPlugin.cc
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/transport.hh"
+#include "plugins/ModelTrajectoryTestPlugin.hh"
+
+using namespace gazebo;
+
+GZ_REGISTER_MODEL_PLUGIN(ModelTrajectoryTestPlugin)
+
+/////////////////////////////////////////////////
+ModelTrajectoryTestPlugin::ModelTrajectoryTestPlugin()
+{
+}
+
+/////////////////////////////////////////////////
+void ModelTrajectoryTestPlugin::Load(physics::ModelPtr _model,
+                           sdf::ElementPtr /*_sdf*/)
+{
+  this->model = _model;
+
+  this->node = transport::NodePtr(new transport::Node());
+  this->node->Init(this->model->GetWorld()->GetName());
+
+  this->trajSub = this->node->Subscribe(std::string("~/") +
+      this->model->GetName() + "/pose_trajectory",
+      &ModelTrajectoryTestPlugin::OnPoseTrajectoryMsg, this);
+
+  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
+          boost::bind(&ModelTrajectoryTestPlugin::OnUpdate, this));
+}
+
+/////////////////////////////////////////////////
+void ModelTrajectoryTestPlugin::Init()
+{
+}
+
+/////////////////////////////////////////////////
+void ModelTrajectoryTestPlugin::OnPoseTrajectoryMsg(
+    ConstPoseTrajectoryPtr &/*_msg*/)
+{
+}
+
+/////////////////////////////////////////////////
+void ModelTrajectoryTestPlugin::OnUpdate()
+{
+  common::Time currTime = this->model->GetWorld()->GetSimTime();
+  common::Time stepTime = currTime - this->prevUpdateTime;
+  this->prevUpdateTime = currTime;
+
+  {
+    // ignore everything else, get position and force only
+    math::Pose pose;
+    this->model->SetWorldPose(pose);
+  }
+}
diff --git a/test/plugins/ModelTrajectoryTestPlugin.hh b/test/plugins/ModelTrajectoryTestPlugin.hh
new file mode 100644
index 0000000..9d70a9b
--- /dev/null
+++ b/test/plugins/ModelTrajectoryTestPlugin.hh
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_MODEL_TRAJECTORY_TEST_PLUGIN_HH_
+#define _GAZEBO_MODEL_TRAJECTORY_TEST_PLUGIN_HH_
+
+#include "gazebo/common/common.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  class GAZEBO_VISIBLE ModelTrajectoryTestPlugin : public ModelPlugin
+  {
+    public: ModelTrajectoryTestPlugin();
+    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
+    public: virtual void Init();
+
+    private: void OnUpdate();
+
+    private: void OnPoseTrajectoryMsg(ConstPoseTrajectoryPtr &_msg);
+
+    private: transport::NodePtr node;
+    private: transport::SubscriberPtr trajSub;
+
+    private: event::ConnectionPtr updateConnection;
+
+    private: physics::ModelPtr model;
+
+    private: common::Time prevUpdateTime;
+  };
+}
+#endif
diff --git a/test/plugins/SpringTestPlugin.cc b/test/plugins/SpringTestPlugin.cc
new file mode 100644
index 0000000..1f7463f
--- /dev/null
+++ b/test/plugins/SpringTestPlugin.cc
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "gazebo/physics/physics.hh"
+#include "plugins/SpringTestPlugin.hh"
+
+using namespace gazebo;
+
+GZ_REGISTER_MODEL_PLUGIN(SpringTestPlugin)
+
+/////////////////////////////////////////////////
+SpringTestPlugin::SpringTestPlugin()
+{
+}
+
+/////////////////////////////////////////////////
+void SpringTestPlugin::Load(physics::ModelPtr _model,
+                           sdf::ElementPtr _sdf)
+{
+  this->model = _model;
+
+  // hardcoded params for this test
+  this->jointExplicitName = _sdf->Get<std::string>("joint_explicit");
+
+  this->kpExplicit = _sdf->Get<double>("kp_explicit");
+
+  this->kdExplicit = _sdf->Get<double>("kd_explicit");
+
+  this->jointImplicitName = _sdf->Get<std::string>("joint_implicit");
+
+  this->kpImplicit = _sdf->Get<double>("kp_implicit");
+
+  this->kdImplicit = _sdf->Get<double>("kd_implicit");
+}
+
+/////////////////////////////////////////////////
+void SpringTestPlugin::Init()
+{
+  this->jointImplicit = this->model->GetJoint(this->jointImplicitName);
+  this->jointExplicit = this->model->GetJoint(this->jointExplicitName);
+
+  this->jointImplicit->SetStiffnessDamping(0, this->kpImplicit,
+    this->kdImplicit);
+
+  this->updateConnection = event::Events::ConnectWorldUpdateBegin(
+          boost::bind(&SpringTestPlugin::ExplicitUpdate, this));
+}
+
+/////////////////////////////////////////////////
+void SpringTestPlugin::ExplicitUpdate()
+{
+  common::Time currTime = this->model->GetWorld()->GetSimTime();
+  common::Time stepTime = currTime - this->prevUpdateTime;
+  this->prevUpdateTime = currTime;
+
+  double pos = this->jointExplicit->GetAngle(0).Radian();
+  double vel = this->jointExplicit->GetVelocity(0);
+  double force = -this->kpExplicit * pos
+                 -this->kdExplicit * vel;
+  this->jointExplicit->SetForce(0, force);
+}
diff --git a/test/plugins/SpringTestPlugin.hh b/test/plugins/SpringTestPlugin.hh
new file mode 100644
index 0000000..13b715b
--- /dev/null
+++ b/test/plugins/SpringTestPlugin.hh
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef __GAZEBO_SPRING_TEST_PLUGIN_HH__
+#define __GAZEBO_SPRING_TEST_PLUGIN_HH__
+
+#include <string>
+
+#include "gazebo/common/common.hh"
+#include "gazebo/physics/physics.hh"
+#include "gazebo/gazebo.hh"
+#include "gazebo/util/system.hh"
+
+namespace gazebo
+{
+  class GAZEBO_VISIBLE SpringTestPlugin : public ModelPlugin
+  {
+    public: SpringTestPlugin();
+    public: virtual void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf);
+    public: virtual void Init();
+
+    private: void ExplicitUpdate();
+
+    private: event::ConnectionPtr updateConnection;
+
+    private: physics::ModelPtr model;
+
+    private: common::Time prevUpdateTime;
+
+    private: physics::JointPtr jointExplicit;
+    private: std::string jointExplicitName;
+
+    /// \brief simulate spring/damper with ExplicitUpdate function
+    private: double kpExplicit;
+
+    /// \brief simulate spring/damper with ExplicitUpdate function
+    private: double kdExplicit;
+
+    private: physics::JointPtr jointImplicit;
+    private: std::string jointImplicitName;
+
+    /// \brief simulate spring/damper with Joint::SetStiffnessDamping
+    private: double kpImplicit;
+
+    /// \brief simulate spring/damper with Joint::SetStiffnessDamping
+    private: double kdImplicit;
+  };
+}
+#endif
diff --git a/test/regression/1082_pid_limits.cc b/test/regression/1082_pid_limits.cc
new file mode 100644
index 0000000..e0c14f7
--- /dev/null
+++ b/test/regression/1082_pid_limits.cc
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+
+#include "gazebo/physics/World.hh"
+#include "gazebo/physics/Model.hh"
+#include "gazebo/physics/JointController.hh"
+#include "gazebo/common/PID.hh"
+#include "test/ServerFixture.hh"
+#include "test_config.h"
+
+using namespace gazebo;
+class Issue1082Test : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+TEST_F(Issue1082Test, PIDLimitsVelocity)
+{
+  Load("worlds/simple_arm_test.world", true);
+  gazebo::physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+  gazebo::physics::ModelPtr model = world->GetModel("simple_arm");
+  gazebo::physics::JointControllerPtr jointController =
+    model->GetJointController();
+
+  world->Step(100);
+
+  gazebo::transport::PublisherPtr pub =
+    this->node->Advertise<gazebo::msgs::JointCmd>(
+        "/gazebo/default/simple_arm/joint_cmd");
+
+  math::Pose startPose = model->GetLink("arm_elbow_pan")->GetWorldPose();
+
+  msgs::JointCmd msg;
+  msg.set_name("simple_arm::arm_shoulder_pan_joint");
+  msg.mutable_velocity()->set_target(10);
+  msg.mutable_velocity()->set_p_gain(1);
+  msg.mutable_velocity()->set_i_gain(.1);
+  msg.mutable_velocity()->set_d_gain(.01);
+  msg.mutable_velocity()->set_i_max(0.5);
+  msg.mutable_velocity()->set_i_min(0.1);
+  msg.mutable_velocity()->set_limit(0.001);
+  pub->Publish(msg);
+
+  world->Step(500);
+
+  math::Pose endPose = model->GetLink("arm_elbow_pan")->GetWorldPose();
+
+  double diffDist = (startPose - endPose).pos.GetLength();
+
+  gzdbg << "Start[" << startPose << "] End[" << endPose << "] Dist["
+        << diffDist << "]\n";
+
+  // 0.002 chosen arbitrarily.
+  EXPECT_LT(diffDist, 0.002);
+  EXPECT_GT(diffDist, -0.002);
+}
+
+/////////////////////////////////////////////////
+TEST_F(Issue1082Test, PIDLimitsPosition)
+{
+  // Load an empty world
+  Load("worlds/simple_arm_test.world", true);
+  gazebo::physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+  gazebo::physics::ModelPtr model = world->GetModel("simple_arm");
+  gazebo::physics::JointControllerPtr jointController =
+    model->GetJointController();
+
+  gazebo::transport::PublisherPtr pub =
+    this->node->Advertise<gazebo::msgs::JointCmd>(
+        "/gazebo/default/simple_arm/joint_cmd");
+
+  math::Pose startPose = model->GetLink("arm_elbow_pan")->GetWorldPose();
+
+  msgs::JointCmd msg;
+  msg.set_name("simple_arm::arm_shoulder_pan_joint");
+  msg.mutable_position()->set_target(10);
+  msg.mutable_position()->set_p_gain(1);
+  msg.mutable_position()->set_i_gain(.1);
+  msg.mutable_position()->set_d_gain(.01);
+  msg.mutable_position()->set_i_max(0.5);
+  msg.mutable_position()->set_i_min(0.1);
+  msg.mutable_position()->set_limit(0.001);
+  pub->Publish(msg);
+
+  world->Step(500);
+
+  math::Pose endPose = model->GetLink("arm_elbow_pan")->GetWorldPose();
+
+  gzdbg << "Start Pose[" << startPose << "]\n";
+  gzdbg << "End Pose[" << endPose << "]\n";
+
+  double diffDist = (startPose - endPose).pos.GetLength();
+
+  EXPECT_LT(diffDist, 0.002);
+  EXPECT_GT(diffDist, -0.002);
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/regression/1112_force_torque_model_removal.cc b/test/regression/1112_force_torque_model_removal.cc
new file mode 100644
index 0000000..a3aad6b
--- /dev/null
+++ b/test/regression/1112_force_torque_model_removal.cc
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+
+using namespace gazebo;
+
+class Issue1112Test : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+// \brief Test for issue #1112
+TEST_F(Issue1112Test, Reset)
+{
+  Load("worlds/force_torque_model_removal_test.world");
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  // Remove everything
+  world->Clear();
+
+  // Wait some bit of time since World::Clear is not immediate.
+  int sleepCount = 20;
+  int sleep = 0;
+  while (world->GetModelCount() > 0u && sleep < sleepCount)
+  {
+    common::Time::MSleep(100);
+    sleep++;
+  }
+
+  // Expecting that the world is empty (and the simulation did not crash)
+  EXPECT_EQ(world->GetModelCount(), 0u);
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/regression/1146_collision_bounding_box.cc b/test/regression/1146_collision_bounding_box.cc
new file mode 100644
index 0000000..b7caee6
--- /dev/null
+++ b/test/regression/1146_collision_bounding_box.cc
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/math/Box.hh"
+
+using namespace gazebo;
+
+class Issue1146Test : public ServerFixture
+{
+};
+
+/////////////////////////////////////////////////
+// \brief Test for issue #1146
+TEST_F(Issue1146Test, Reset)
+{
+  Load("worlds/box_plane_low_friction_test.world", true);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  physics::ModelPtr model = world->GetModel("box");
+  ASSERT_TRUE(model);
+
+  physics::LinkPtr link = model->GetLink("link");
+  ASSERT_TRUE(link);
+
+  physics::CollisionPtr coll = link->GetCollision("collision");
+  ASSERT_TRUE(coll);
+
+  EXPECT_EQ(coll->GetCollisionBoundingBox(),
+      math::Box(math::Vector3(-0.5, -0.5, 0), math::Vector3(0.5, 0.5, 1)));
+
+  // Move the box
+  model->SetWorldPose(math::Pose(10, 15, 20, 0, 0, 0));
+
+  EXPECT_EQ(coll->GetCollisionBoundingBox(),
+      math::Box(math::Vector3(9.5, 14.5, 19.5),
+                math::Vector3(10.5, 15.5, 20.5)));
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/regression/494_joint_axis_frame.cc b/test/regression/494_joint_axis_frame.cc
new file mode 100644
index 0000000..fcd9172
--- /dev/null
+++ b/test/regression/494_joint_axis_frame.cc
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "test/integration/helper_physics_generator.hh"
+#include "test/integration/joint_test.hh"
+
+using namespace gazebo;
+
+const double g_tolerance = 1e-4;
+class Issue494Test : public JointTest
+{
+  /// \brief Test for issue #494, using proper joint axis frame.
+  /// Also test basic joint properties.
+  /// \param[in] _physicsEngine Type of physics engine to use.
+  /// \param[in] _jointType Type of joint to test.
+  public: void CheckAxisFrame(const std::string &_physicsEngine,
+                              const std::string &_jointType);
+
+  /// \brief Check joint properties.
+  /// \param[in] _joint Joint to check.
+  /// \param[in] _axis Expected axis vector in global frame.
+  public: void CheckJointProperties(physics::JointPtr _joint,
+                                    const math::Vector3 &_axis);
+};
+
+
+/////////////////////////////////////////////////
+void Issue494Test::CheckAxisFrame(const std::string &_physicsEngine,
+                                  const std::string &_jointType)
+{
+  if (!((_physicsEngine == "ode" || _physicsEngine == "bullet")))
+  {
+    gzerr << "This test doesn't yet work for [" << _physicsEngine
+          << "] with joint type [" << _jointType << "]"
+          << std::endl;
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // disable gravity
+  physics->SetGravity(math::Vector3::Zero);
+
+  SpawnJointOptions opt;
+  opt.type = _jointType;
+  double Am = M_PI / 12;
+  double Al = M_PI / 12;
+  double Aj = M_PI / 12;
+  opt.modelPose.rot.SetFromEuler(0, 0, Am);
+  opt.childLinkPose.rot.SetFromEuler(0, 0, Al);
+  opt.jointPose.rot.SetFromEuler(0, 0, Aj);
+  opt.axis.Set(1, 0, 0);
+
+  // i = 0: child parent
+  // i = 1: child world
+  // i = 2: world parent
+  for (int i = 0; i < 3; ++i)
+  {
+    gzdbg << "SpawnJoint " << _jointType;
+    if (i / 2)
+    {
+      opt.worldChild = true;
+      std::cout << " world";
+    }
+    else
+    {
+      opt.worldChild = false;
+      std::cout << " child";
+    }
+    if (i % 2)
+    {
+      opt.worldParent = true;
+      std::cout << " world";
+    }
+    else
+    {
+      opt.worldParent = false;
+      std::cout << " parent";
+    }
+    std::cout << std::endl;
+
+    // parent model frame
+    {
+      opt.useParentModelFrame = true;
+      physics::JointPtr jointUseParentModelFrame = SpawnJoint(opt);
+      ASSERT_TRUE(jointUseParentModelFrame != NULL);
+
+      if (opt.worldParent)
+      {
+        this->CheckJointProperties(jointUseParentModelFrame, opt.axis);
+      }
+      else
+      {
+        this->CheckJointProperties(jointUseParentModelFrame,
+          math::Vector3(cos(Am), sin(Am), 0));
+      }
+    }
+
+    // joint frame
+    {
+      opt.useParentModelFrame = false;
+      physics::JointPtr joint = SpawnJoint(opt);
+      ASSERT_TRUE(joint != NULL);
+
+      if (opt.worldChild)
+      {
+        this->CheckJointProperties(joint,
+          math::Vector3(cos(Aj), sin(Aj), 0));
+      }
+      else
+      {
+        this->CheckJointProperties(joint,
+          math::Vector3(cos(Am+Al+Aj), sin(Am+Al+Aj), 0));
+      }
+    }
+  }
+}
+
+/////////////////////////////////////////////////
+void Issue494Test::CheckJointProperties(physics::JointPtr _joint,
+                                        const math::Vector3 &_axis)
+{
+  physics::WorldPtr world = physics::get_world();
+  ASSERT_TRUE(world != NULL);
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  bool isOde = physics->GetType().compare("ode") == 0;
+  double dt = physics->GetMaxStepSize();
+
+  // Check that Joint::GetGlobalAxis matches _axis
+  EXPECT_EQ(_axis, _joint->GetGlobalAxis(0));
+
+  if (!_joint->GetChild())
+  {
+    gzerr << "The rest of this test fails without a child link" << std::endl;
+    return;
+  }
+
+  double velocityMagnitude = 1.0;
+  double maxForce = velocityMagnitude / dt * 10.1;
+  std::vector<double> velocities;
+  velocities.push_back(velocityMagnitude);
+  velocities.push_back(0.0);
+  velocities.push_back(-velocityMagnitude);
+  for (std::vector<double>::iterator iter = velocities.begin();
+       iter != velocities.end(); ++iter)
+  {
+    // Use Joint::SetVelocity with different values
+    double vel = *iter;
+    _joint->SetVelocity(0, vel);
+
+    // ODE requires maxForce to be non-zero for SetVelocity to work
+    // See issue #964 for discussion of consistent API
+    if (isOde)
+      _joint->SetMaxForce(0, maxForce);
+
+    // Take a step and verify that Joint::GetVelocity returns the same value
+    world->Step(1);
+    EXPECT_NEAR(_joint->GetVelocity(0), vel, g_tolerance);
+
+    // Also verify that relative body motions match expected joint behavior
+    math::Vector3 childVelocity, parentVelocity;
+    {
+      physics::LinkPtr child = _joint->GetChild();
+      if (child)
+      {
+        if (_joint->HasType(physics::Base::HINGE_JOINT))
+          childVelocity = child->GetWorldAngularVel();
+        else if (_joint->HasType(physics::Base::SLIDER_JOINT)
+              || _joint->HasType(physics::Base::SCREW_JOINT))
+        {
+          childVelocity = child->GetWorldLinearVel();
+        }
+      }
+    }
+    {
+      physics::LinkPtr parent = _joint->GetParent();
+      if (parent)
+      {
+        if (_joint->HasType(physics::Base::HINGE_JOINT))
+          parentVelocity = parent->GetWorldAngularVel();
+        else if (_joint->HasType(physics::Base::SLIDER_JOINT)
+              || _joint->HasType(physics::Base::SCREW_JOINT))
+        {
+          parentVelocity = parent->GetWorldLinearVel();
+        }
+      }
+    }
+    EXPECT_NEAR(vel, _axis.Dot(childVelocity - parentVelocity), g_tolerance);
+  }
+}
+
+TEST_P(Issue494Test, CheckAxisFrame)
+{
+  CheckAxisFrame(this->physicsEngine, this->jointType);
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, Issue494Test,
+  ::testing::Combine(PHYSICS_ENGINE_VALUES,
+  ::testing::Values("revolute")));
+//  ::testing::Values("revolute", "prismatic", "screw")));
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/regression/624_collision_world_pose.cc b/test/regression/624_collision_world_pose.cc
new file mode 100644
index 0000000..017a163
--- /dev/null
+++ b/test/regression/624_collision_world_pose.cc
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/physics/physics.hh"
+#include "test/integration/helper_physics_generator.hh"
+
+using namespace gazebo;
+
+class Issue624Test : public ServerFixture,
+                     public testing::WithParamInterface<const char*>
+{
+  public: void CollisionWorldPose(const std::string &_physicsEngine);
+};
+
+
+/////////////////////////////////////////////////
+// \brief Test for issue #624
+void Issue624Test::CollisionWorldPose(const std::string &_physicsEngine)
+{
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  // add a link with a collision body in it
+
+  // Spawn some custom model
+  {
+    msgs::Factory msg;
+    std::ostringstream newModelStr;
+
+    std::string name = "box_1";
+
+    newModelStr << "<sdf version='" << SDF_VERSION << "'>"
+      << "<model name ='" << name << "'>"
+      << "<static>false</static>"
+      << "<pose>1 2 3 0.5 0.5 0.5</pose>"
+      << "<link name ='body'>"
+      << "  <pose>2 3 4 0.6 0.6 0.6</pose>"
+      << "  <collision name ='col1'>"
+      << "    <pose>3 4 5 0.7 0.7 0.7</pose>"
+      << "    <geometry>"
+      << "      <box><size>1 1 1</size></box>"
+      << "    </geometry>"
+      << "  </collision>"
+      << "  <visual name ='vis1'>"
+      << "    <pose>3 4 5 0.7 0.7 0.7</pose>"
+      << "    <geometry>"
+      << "      <box><size>1 1 1</size></box>"
+      << "    </geometry>"
+      << "  </visual>"
+      << "  <collision name ='col2'>"
+      << "    <pose>6 7 8 0.8 0.8 0.8</pose>"
+      << "    <geometry>"
+      << "      <box><size>1 1 1</size></box>"
+      << "    </geometry>"
+      << "  </collision>"
+      << "  <visual name ='vis2'>"
+      << "    <pose>6 7 8 0.8 0.8 0.8</pose>"
+      << "    <geometry>"
+      << "      <box><size>1 1 1</size></box>"
+      << "    </geometry>"
+      << "  </visual>"
+      << "</link>"
+      << "</model>"
+      << "</sdf>";
+
+    msg.set_sdf(newModelStr.str());
+    this->factoryPub->Publish(msg);
+
+    // Wait for the entity to spawn
+    while (!this->HasEntity(name))
+      common::Time::MSleep(100);
+  }
+  physics::ModelPtr model = world->GetModel("box_1");
+
+  physics::Link_V links = model->GetLinks();
+  for (physics::Link_V::iterator li = links.begin(); li != links.end(); ++li)
+  {
+    physics::LinkPtr link = *li;
+    physics::Collision_V collisions = link->GetCollisions();
+    for (physics::Collision_V::iterator ci = collisions.begin();
+       ci != collisions.end(); ++ci)
+    {
+      gzdbg << "name [" << (*ci)->GetName()
+            << "] abs pose [" << (*ci)->GetWorldPose()
+            << "] rel pose [" << (*ci)->GetRelativePose() << "]\n";
+      if ((*ci)->GetName() == "col1")
+      {
+        EXPECT_EQ((*ci)->GetWorldPose(),
+          math::Pose(3, 4, 5, 0.7, 0.7, 0.7) +
+          math::Pose(2, 3, 4, 0.6, 0.6, 0.6) +
+          math::Pose(1, 2, 3, 0.5, 0.5, 0.5));
+        EXPECT_EQ((*ci)->GetRelativePose(),
+          math::Pose(3, 4, 5, 0.7, 0.7, 0.7));
+      }
+      else if ((*ci)->GetName() == "col2")
+      {
+        EXPECT_EQ((*ci)->GetWorldPose(),
+          math::Pose(6, 7, 8, 0.8, 0.8, 0.8) +
+          math::Pose(2, 3, 4, 0.6, 0.6, 0.6) +
+          math::Pose(1, 2, 3, 0.5, 0.5, 0.5));
+        EXPECT_EQ((*ci)->GetRelativePose(),
+          math::Pose(6, 7, 8, 0.8, 0.8, 0.8));
+      }
+    }
+  }
+}
+
+TEST_P(Issue624Test, CollisionWorldPose)
+{
+  CollisionWorldPose(GetParam());
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, Issue624Test, PHYSICS_ENGINE_VALUES);
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/regression/846_typo_in_camera.cc b/test/regression/846_typo_in_camera.cc
new file mode 100644
index 0000000..c589ad0
--- /dev/null
+++ b/test/regression/846_typo_in_camera.cc
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <gazebo/rendering/rendering.hh>
+#include "ServerFixture.hh"
+
+class Issue846Test : public ServerFixture
+{
+};
+
+
+/////////////////////////////////////////////////
+// \brief Test for issue #846
+TEST_F(Issue846Test, CaptureData)
+{
+  Load("worlds/empty.world");
+
+  gazebo::rendering::CameraPtr camera(new gazebo::rendering::Camera("",
+        this->GetScene(), false));
+
+  EXPECT_FALSE(camera->GetCaptureData());
+  camera->EnableSaveFrame(true);
+  EXPECT_TRUE(camera->GetCaptureData());
+  camera->EnableSaveFrame(false);
+  EXPECT_FALSE(camera->GetCaptureData());
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/regression/876_random_number_generator.cc b/test/regression/876_random_number_generator.cc
new file mode 100644
index 0000000..175a173
--- /dev/null
+++ b/test/regression/876_random_number_generator.cc
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "gazebo/math/Rand.hh"
+
+using namespace gazebo;
+
+class Issue876Test : public ServerFixture
+{
+};
+
+
+/////////////////////////////////////////////////
+// \brief Test for issue #876
+TEST_F(Issue876Test, Reset)
+{
+  Load("worlds/empty.world");
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world);
+
+  math::Rand::SetSeed(math::Rand::GetSeed());
+
+  int sampleCount = 500;
+
+  std::vector<int> num;
+  for (int i = 0; i < sampleCount; ++i)
+    num.push_back(math::Rand::GetIntUniform(-10, 10));
+
+  for (int j = 0; j < 1000; ++j)
+  {
+    world->Reset();
+
+    std::vector<int> numReset;
+    for (int i = 0; i < sampleCount; ++i)
+      numReset.push_back(math::Rand::GetIntUniform(-10, 10));
+
+    // Using ASSERT_EQ to prevent spamming of similar errors.
+    for (int i = 0; i < sampleCount; ++i)
+      ASSERT_EQ(num[i], numReset[i]);
+  }
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/regression/978_joint_anchor.cc b/test/regression/978_joint_anchor.cc
new file mode 100644
index 0000000..5c79f41
--- /dev/null
+++ b/test/regression/978_joint_anchor.cc
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include "ServerFixture.hh"
+#include "test/integration/helper_physics_generator.hh"
+#include "test/integration/joint_test.hh"
+
+using namespace gazebo;
+
+class Issue978Test : public JointTest
+{
+  public: void JointAnchor(const std::string &_physicsEngine);
+};
+
+
+/////////////////////////////////////////////////
+// \brief Test for issue #978
+void Issue978Test::JointAnchor(const std::string &_physicsEngine)
+{
+  // Abort test for simbody, since SimbodyJoint::GetAnchor isn't implemented
+  if (_physicsEngine == "simbody")
+  {
+    gzerr << "Aborting test for Simbody, see issue #979.\n";
+    return;
+  }
+
+  // Load an empty world
+  Load("worlds/empty.world", true, _physicsEngine);
+  physics::WorldPtr world = physics::get_world("default");
+  ASSERT_TRUE(world != NULL);
+
+  // Verify physics engine type
+  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
+  ASSERT_TRUE(physics != NULL);
+  EXPECT_EQ(physics->GetType(), _physicsEngine);
+
+  std::string _jointType = "revolute";
+  {
+    gzdbg << "SpawnJoint " << _jointType << " child parent" << std::endl;
+    SpawnJointOptions opt;
+    opt.type = _jointType;
+    opt.worldChild = false;
+    opt.worldParent = false;
+    opt.noLinkPose = true;
+    opt.modelPose = math::Pose(1, 2, 3, 0, 0, 0);
+
+    physics::JointPtr joint = SpawnJoint(opt);
+    ASSERT_TRUE(joint != NULL);
+
+    // Check child and parent links
+    physics::LinkPtr child = joint->GetChild();
+    physics::LinkPtr parent = joint->GetParent();
+    ASSERT_TRUE(child != NULL);
+    EXPECT_EQ(child->GetParentJoints().size(), 1u);
+    EXPECT_EQ(child->GetChildJoints().size(), 0u);
+    ASSERT_TRUE(parent != NULL);
+    EXPECT_EQ(parent->GetChildJoints().size(), 1u);
+    EXPECT_EQ(parent->GetParentJoints().size(), 0u);
+
+    // Check anchor location
+    EXPECT_EQ(joint->GetAnchor(0), opt.modelPose.pos);
+  }
+}
+
+TEST_P(Issue978Test, JointAnchor)
+{
+  JointAnchor(this->physicsEngine);
+}
+
+INSTANTIATE_TEST_CASE_P(PhysicsEngines, Issue978Test,
+  ::testing::Combine(PHYSICS_ENGINE_VALUES,
+  ::testing::Values("")));
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/test/regression/CMakeLists.txt b/test/regression/CMakeLists.txt
index b324495..bd02026 100644
--- a/test/regression/CMakeLists.txt
+++ b/test/regression/CMakeLists.txt
@@ -1,6 +1,4 @@
 include_directories (
-  ${PROJECT_SOURCE_DIR}/gazebo
-  ${PROJECT_BINARY_DIR}/gazebo
   ${ODE_INCLUDE_DIRS}
   ${OPENGL_INCLUDE_DIR}
   ${OGRE_INCLUDE_DIRS}
@@ -14,51 +12,35 @@ link_directories(
   ${ODE_LIBRARY_DIRS}
 )
 
-# Disable the player test for now, until we figure out a better way to test them
-#if (INCLUDE_PLAYER)
-#  add_subdirectory(player)
-#endif()
-
 if(HAVE_BULLET)
   include_directories ( ${BULLET_INCLUDE_DIRS} )
   link_directories ( ${BULLET_LIBRARY_DIRS} )
 endif()
+if(HAVE_DART)
+  include_directories ( ${DART_INCLUDE_DIRS} )
+  link_directories ( ${DART_LIBRARY_DIRS} )
+endif()
 
 set(tests
-  bandwidth.cc
-  contact_sensor.cc
-  factory.cc
-  file_handling.cc
-  imu.cc
-  laser.cc
-  physics.cc
-  pioneer2dx.cc
-  transport.cc
-  transport_stress.cc
-  server_fixture.cc
-  speed.cc
-  )
+  494_joint_axis_frame.cc
+  624_collision_world_pose.cc
+  876_random_number_generator.cc
+  978_joint_anchor.cc
+  1082_pid_limits.cc
+  1112_force_torque_model_removal.cc
+  1146_collision_bounding_box.cc
+)
 
-set (GZ_BUILD_TESTS_EXTRA_EXE_SRCS
-    "${PROJECT_SOURCE_DIR}/gazebo/Server.cc;${PROJECT_SOURCE_DIR}/gazebo/Master.cc;${PROJECT_SOURCE_DIR}/gazebo/gazebo.cc")
 gz_build_tests(${tests})
 
 set(display_tests
 )
 
 # Build the display tests (need extra sources to compile)
-set (GZ_BUILD_TESTS_EXTRA_EXE_SRCS
-    "${PROJECT_SOURCE_DIR}/gazebo/Server.cc;${PROJECT_SOURCE_DIR}/gazebo/Master.cc;${PROJECT_SOURCE_DIR}/gazebo/gazebo.cc")
 gz_build_display_tests(${display_tests})
 
 set(dri_tests
-  camera_sensor.cc
-  heightmap.cc
-  pr2.cc
-  projector.cc
-  speed_pr2.cc
+  846_typo_in_camera.cc
 )
 
-set (GZ_BUILD_TESTS_EXTRA_EXE_SRCS
-    "${PROJECT_SOURCE_DIR}/gazebo/Server.cc;${PROJECT_SOURCE_DIR}/gazebo/Master.cc;${PROJECT_SOURCE_DIR}/gazebo/gazebo.cc")
 gz_build_dri_tests(${dri_tests})
diff --git a/test/regression/SimplePendulumIntegrator.hh b/test/regression/SimplePendulumIntegrator.hh
deleted file mode 100644
index 74f50aa..0000000
--- a/test/regression/SimplePendulumIntegrator.hh
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-/* Desc: Simple pendulum motion integrator
- * Author: John Hsu
- * Date: 2012/04/20
- */
-
-#include <math.h>
-
-// integrate d^2 theta / dt^2 = - g * sin(theta) / l
-// by discretizing via central differencing (requires very small dt)
-//   (theta_2 - 2*theta_1 + theta_2) / dt^2 = -g * sin(theta_1) / l
-//
-//   or euler + 3-4-1 backward Euler is 2nd order:
-//
-//   (2*theta_2 - 5*theta_1 + 4*theta_2 -theta_3) / dt^2
-//     = -g * sin(theta_1) / l
-//
-// where thata_3 is theta(t - 3*dt)
-//       thata_2 is theta(t - 2*dt)
-//       thata_1 is theta(t -   dt)
-//       and
-//       thata_f or theta(t_f) is the solution returned
-//
-// If pendulum starts out stationary, one can assume
-//   theta_3 = theta_2 = theta_1 = theta_i
-//
-double PendulumAngle(double g, double l, double theta_i,
-                     double t_i, double t_f , double dt)
-{
-  double theta_3 = theta_i;
-  double theta_2 = theta_i;
-  double theta_1 = theta_i;
-  double theta_f = theta_i;
-  int steps = ceil((t_f - t_i) / dt);
-  double t = t_i;
-  for (int i = 0 ; i < steps; i++)
-  {
-    t += dt;
-    theta_f = (-dt*dt*g*sin(theta_1)/l
-                + theta_3
-                - 4.0*theta_2
-                + 5.0*theta_1)/2.0;
-    /*
-    theta_f = (-dt*dt*g*sin(theta_1)/l
-                - 1.0*theta_2
-                + 2.0*theta_1);
-    */
-    // next step
-    theta_3 = theta_2;
-    theta_2 = theta_1;
-    theta_1 = theta_f;
-    // printf("debug t[%f] t_f[%f] theta_f[%f]\n", t, t_f, theta_f);
-  }
-  if (fabs(t - t_f) > 0.000001)
-    printf("time mismatch t[%f] t_f[%f] theta_f[%f]\n", t, t_f, theta_f);
-
-  return theta_f;
-}
diff --git a/test/regression/bandwidth.cc b/test/regression/bandwidth.cc
deleted file mode 100644
index 0d92c1d..0000000
--- a/test/regression/bandwidth.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <unistd.h>
-
-#include "ServerFixture.hh"
-
-using namespace gazebo;
-
-class BandwidthTest : public ServerFixture
-{
-};
-
-boost::mutex g_mutex;
-std::vector<int> g_bwBytes;
-std::vector<common::Time> g_bwTime;
-
-
-void BandwidthMsg(const std::string &_msg)
-{
-  boost::mutex::scoped_lock lock(g_mutex);
-  g_bwBytes.push_back(_msg.size());
-  g_bwTime.push_back(common::Time::GetWallTime());
-}
-
-TEST_F(BandwidthTest, Bandwidth)
-{
-  Load("worlds/pr2.world");
-
-  transport::NodePtr node(new transport::Node());
-  node->Init("default");
-
-  std::string topic = "/gazebo/default/pose/info";
-
-  transport::SubscriberPtr sub = node->Subscribe(topic, BandwidthMsg);
-
-  while (true)
-  {
-    common::Time::MSleep(100);
-    {
-      boost::mutex::scoped_lock lock(g_mutex);
-      if (g_bwBytes.size() >= 100)
-      {
-        std::sort(g_bwBytes.begin(), g_bwBytes.end());
-
-        float sumSize = 0;
-        unsigned int count = g_bwBytes.size();
-        common::Time dt = g_bwTime[count - 1] - g_bwTime[0];
-
-        for (unsigned int i = 0; i < count; ++i)
-          sumSize += g_bwBytes[i];
-
-        float meanSize = sumSize / count;
-        float totalBw = sumSize / dt.Double();
-
-        printf("Bandwidth:\n");
-        printf("  Total[%6.2f B/s] Mean[%6.2f B] Messages[%d] Time[%4.2fs]\n",
-               totalBw, meanSize, count, dt.Double());
-
-        EXPECT_GT(totalBw, 1000.0);
-        g_bwBytes.clear();
-        g_bwTime.clear();
-
-        break;
-      }
-    }
-  }
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/camera_sensor.cc b/test/regression/camera_sensor.cc
deleted file mode 100644
index d2c9e70..0000000
--- a/test/regression/camera_sensor.cc
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "ServerFixture.hh"
-#include "physics/physics.hh"
-#include "sensors/sensors.hh"
-#include "common/common.hh"
-#include "common/Timer.hh"
-#include "scans_cmp.h"
-#include "rendering/Camera.hh"
-#include "sensors/CameraSensor.hh"
-
-using namespace gazebo;
-class CameraSensor : public ServerFixture
-{
-};
-
-unsigned char* img = NULL;
-unsigned char* img2 = NULL;
-int imageCount = 0;
-int imageCount2 = 0;
-void OnNewCameraFrame(int* _imageCounter, unsigned char* _imageDest,
-                  const unsigned char *_image,
-                  unsigned int _width, unsigned int _height,
-                  unsigned int _depth,
-                  const std::string &/*_format*/)
-{
-  memcpy(_imageDest, _image, _width * _height * _depth);
-  *_imageCounter += 1;
-}
-
-TEST_F(CameraSensor, CheckThrottle)
-{
-  Load("worlds/empty_test.world");
-
-  // Make sure the render engine is available.
-  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
-      rendering::RenderEngine::NONE)
-  {
-    gzerr << "No rendering engine, unable to run camera test\n";
-    return;
-  }
-
-  // spawn sensors of various sizes to test speed
-  std::string modelName = "camera_model";
-  std::string cameraName = "camera_sensor";
-  unsigned int width  = 320;
-  unsigned int height = 240;  // 106 fps
-  double updateRate = 10;
-  math::Pose setPose, testPose(
-      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
-  SpawnCamera(modelName, cameraName, setPose.pos,
-      setPose.rot.GetAsEuler(), width, height, updateRate);
-  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
-  sensors::CameraSensorPtr camSensor =
-    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
-  imageCount = 0;
-  img = new unsigned char[width * height*3];
-  event::ConnectionPtr c =
-    camSensor->GetCamera()->ConnectNewImageFrame(
-        boost::bind(&::OnNewCameraFrame, &imageCount, img,
-          _1, _2, _3, _4, _5));
-  common::Timer timer;
-  timer.Start();
-
-  // time how long it takes to get 50 images @ 10Hz
-  int total_images = 50;
-
-  while (imageCount < total_images)
-    common::Time::MSleep(10);
-  common::Time dt = timer.GetElapsed();
-  double rate = static_cast<double>(total_images)/dt.Double();
-  gzdbg << "timer [" << dt.Double() << "] seconds rate [" << rate << "] fps\n";
-  EXPECT_GT(rate, 7.0);
-  EXPECT_LT(rate, 11.0);
-  camSensor->GetCamera()->DisconnectNewImageFrame(c);
-  delete img;
-}
-
-TEST_F(CameraSensor, UnlimitedTest)
-{
-  Load("worlds/empty_test.world");
-
-  // Make sure the render engine is available.
-  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
-      rendering::RenderEngine::NONE)
-  {
-    gzerr << "No rendering engine, unable to run camera test\n";
-    return;
-  }
-
-  // spawn sensors of various sizes to test speed
-  std::string modelName = "camera_model";
-  std::string cameraName = "camera_sensor";
-
-  // test resolution, my machine gets about 106 fps
-  unsigned int width  = 320;
-  unsigned int height = 240;
-  double updateRate = 0;
-  math::Pose setPose, testPose(
-      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
-  SpawnCamera(modelName, cameraName, setPose.pos,
-      setPose.rot.GetAsEuler(), width, height, updateRate);
-  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
-  sensors::CameraSensorPtr camSensor =
-    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
-  imageCount = 0;
-  img = new unsigned char[width * height*3];
-  event::ConnectionPtr c =
-    camSensor->GetCamera()->ConnectNewImageFrame(
-        boost::bind(&::OnNewCameraFrame, &imageCount, img,
-          _1, _2, _3, _4, _5));
-  common::Timer timer;
-  timer.Start();
-  // time how long it takes to get N images
-  int total_images = 500;
-  while (imageCount < total_images)
-    common::Time::MSleep(10);
-  common::Time dt = timer.GetElapsed();
-  double rate = static_cast<double>(total_images)/dt.Double();
-  gzdbg << "timer [" << dt.Double() << "] seconds rate [" << rate << "] fps\n";
-  camSensor->GetCamera()->DisconnectNewImageFrame(c);
-  EXPECT_GT(rate, 30.0);
-
-  delete img;
-}
-
-TEST_F(CameraSensor, MultiSenseHigh)
-{
-  // This test is disabled because it does not work on machines with
-  // limited rendering capabilities.
-  return;
-
-  Load("worlds/empty_test.world");
-
-  // Make sure the render engine is available.
-  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
-      rendering::RenderEngine::NONE)
-  {
-    gzerr << "No rendering engine, unable to run camera test\n";
-    return;
-  }
-
-  // spawn sensors of various sizes to test speed
-  std::string modelName = "camera_model";
-  std::string cameraName = "camera_sensor";
-
-  // nominal resolution of multisense
-  unsigned int width  = 2048;
-  unsigned int height = 1088;
-  double updateRate = 25;
-  math::Pose setPose, testPose(
-      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
-  SpawnCamera(modelName, cameraName, setPose.pos,
-      setPose.rot.GetAsEuler(), width, height, updateRate);
-  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
-  sensors::CameraSensorPtr camSensor =
-    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
-  imageCount = 0;
-  img = new unsigned char[width * height*3];
-  event::ConnectionPtr c =
-    camSensor->GetCamera()->ConnectNewImageFrame(
-        boost::bind(&::OnNewCameraFrame, &imageCount, img,
-          _1, _2, _3, _4, _5));
-  common::Timer timer;
-  timer.Start();
-  // time how long it takes to get N images
-  int total_images = 500;
-  while (imageCount < total_images)
-    common::Time::MSleep(10);
-  common::Time dt = timer.GetElapsed();
-  double rate = static_cast<double>(total_images)/dt.Double();
-  gzdbg << "timer [" << dt.Double() << "] seconds rate [" << rate << "] fps\n";
-  camSensor->GetCamera()->DisconnectNewImageFrame(c);
-  EXPECT_GT(rate, 24.0);
-  EXPECT_LT(rate, 25.0);
-
-  delete img;
-}
-
-TEST_F(CameraSensor, MultiSenseLow)
-{
-  // This test is disabled because it does not work on machines with
-  // limited rendering capabilities.
-  return;
-
-  Load("worlds/empty_test.world");
-
-  // Make sure the render engine is available.
-  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
-      rendering::RenderEngine::NONE)
-  {
-    gzerr << "No rendering engine, unable to run camera test\n";
-    return;
-  }
-
-  // spawn sensors of various sizes to test speed
-  std::string modelName = "camera_model";
-  std::string cameraName = "camera_sensor";
-
-  // lower resolution of multisense
-  unsigned int width  = 1024;
-  unsigned int height = 544;
-  double updateRate = 25;
-  math::Pose setPose, testPose(
-      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
-  SpawnCamera(modelName, cameraName, setPose.pos,
-      setPose.rot.GetAsEuler(), width, height, updateRate);
-  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
-  sensors::CameraSensorPtr camSensor =
-    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
-  imageCount = 0;
-  img = new unsigned char[width * height*3];
-  event::ConnectionPtr c =
-    camSensor->GetCamera()->ConnectNewImageFrame(
-        boost::bind(&::OnNewCameraFrame, &imageCount, img,
-          _1, _2, _3, _4, _5));
-  common::Timer timer;
-  timer.Start();
-  // time how long it takes to get N images
-  int total_images = 500;
-  while (imageCount < total_images)
-    common::Time::MSleep(10);
-  common::Time dt = timer.GetElapsed();
-  double rate = static_cast<double>(total_images)/dt.Double();
-  gzdbg << "timer [" << dt.Double() << "] seconds rate [" << rate << "] fps\n";
-  camSensor->GetCamera()->DisconnectNewImageFrame(c);
-  EXPECT_GT(rate, 24.0);
-  EXPECT_LT(rate, 25.0);
-
-  delete img;
-  Unload();
-}
-
-TEST_F(CameraSensor, CheckNoise)
-{
-  Load("worlds/empty_test.world");
-
-  // Make sure the render engine is available.
-  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
-      rendering::RenderEngine::NONE)
-  {
-    gzerr << "No rendering engine, unable to run camera test\n";
-    return;
-  }
-
-  // Spawn two cameras in the same location, one with noise and one without.
-  std::string modelName = "camera_model";
-  std::string cameraName = "camera_sensor";
-  std::string modelNameNoisy = "camera_model_noisy";
-  std::string cameraNameNoisy = "camera_sensor_noisy";
-  unsigned int width  = 320;
-  unsigned int height = 240;
-  double updateRate = 10;
-  double noiseMean = 0.1;
-  double noiseStdDev = 0.01;
-  math::Pose setPose, testPose(
-      math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
-  SpawnCamera(modelName, cameraName, setPose.pos,
-      setPose.rot.GetAsEuler(), width, height, updateRate);
-  SpawnCamera(modelNameNoisy, cameraNameNoisy, setPose.pos,
-      setPose.rot.GetAsEuler(), width, height, updateRate,
-      "gaussian", noiseMean, noiseStdDev);
-  sensors::SensorPtr sensor = sensors::get_sensor(cameraName);
-  sensors::CameraSensorPtr camSensor =
-    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
-  sensor = sensors::get_sensor(cameraNameNoisy);
-  sensors::CameraSensorPtr camSensorNoisy =
-    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
-
-  imageCount = 0;
-  imageCount2 = 0;
-  img = new unsigned char[width * height*3];
-  img2 = new unsigned char[width * height*3];
-  event::ConnectionPtr c =
-    camSensor->GetCamera()->ConnectNewImageFrame(
-        boost::bind(&::OnNewCameraFrame, &imageCount, img,
-          _1, _2, _3, _4, _5));
-  event::ConnectionPtr c2 =
-    camSensorNoisy->GetCamera()->ConnectNewImageFrame(
-        boost::bind(&::OnNewCameraFrame, &imageCount2, img2,
-          _1, _2, _3, _4, _5));
-
-  // Get some images
-  while (imageCount < 10 || imageCount2 < 10)
-    common::Time::MSleep(10);
-
-  unsigned int diffMax = 0, diffSum = 0;
-  double diffAvg = 0.0;
-  this->ImageCompare(img, img2, width, height, 3,
-                     diffMax, diffSum, diffAvg);
-  // We expect that there will be some non-zero difference between the two
-  // images.
-  EXPECT_NE(diffSum, 0u);
-  // We expect that the average difference will be well within 3-sigma.
-  EXPECT_NEAR(diffAvg/255., noiseMean, 3*noiseStdDev);
-  delete[] img;
-  delete[] img2;
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/contact_sensor.cc b/test/regression/contact_sensor.cc
deleted file mode 100644
index 71f856d..0000000
--- a/test/regression/contact_sensor.cc
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "ServerFixture.hh"
-#include "physics/physics.hh"
-#include "sensors/sensors.hh"
-#include "common/common.hh"
-#include "scans_cmp.h"
-
-#define TOL 1e-4
-
-using namespace gazebo;
-class ContactSensor : public ServerFixture
-{
-  public: void StackTest(const std::string &_physicsEngine);
-  public: void TorqueTest(const std::string &_physicsEngine);
-};
-
-TEST_F(ContactSensor, EmptyWorld)
-{
-  Load("worlds/empty.world");
-}
-
-////////////////////////////////////////////////////////////////////////
-// Test contact sensor using two configurations. Both place a sphere over
-// a box collision contact sensor. It is expected that there is one point of
-// contact in the negative z direction (world frame). The second contact sensor
-// model differ from the first in that it is rotated by 90 degrees about the
-// y axis. The test verifies that the feedback is given in the correct
-// reference frame
-////////////////////////////////////////////////////////////////////////
-void ContactSensor::StackTest(const std::string &_physicsEngine)
-{
-  // Load an empty world
-  Load("worlds/empty.world", true, _physicsEngine);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // Verify physics engine type
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), _physicsEngine);
-
-  std::string modelName01 = "contactModel01";
-  std::string contactSensorName01 = "contactSensor01";
-  math::Pose modelPose01(0, 0, 0.5, 0, 0, 0);
-
-  std::string modelName02 = "contactModel02";
-  std::string contactSensorName02 = "contactSensor02";
-  math::Pose modelPose02(0, 2, 0.5, 0, M_PI/2.0, 0);
-
-  std::string sphereName01 = "sphere01";
-  math::Pose spherePose01(0, 0, 1.5, 0, 0, 0);
-
-  std::string sphereName02 = "sphere02";
-  math::Pose spherePose02(0, 2, 1.5, 0, 0, 0);
-
-  // spawn two contact sensors
-  SpawnUnitContactSensor(modelName01, contactSensorName01,
-      "box", modelPose01.pos, modelPose01.rot.GetAsEuler());
-  SpawnUnitContactSensor(modelName02, contactSensorName02,
-      "box", modelPose02.pos, modelPose02.rot.GetAsEuler());
-
-  // spawn two spheres, each sphere rests on top of one contact sensor
-  SpawnSphere(sphereName01, spherePose01.pos, spherePose01.rot.GetAsEuler());
-  SpawnSphere(sphereName02, spherePose02.pos, spherePose02.rot.GetAsEuler());
-
-  sensors::SensorPtr sensor01 = sensors::get_sensor(contactSensorName01);
-  sensors::ContactSensorPtr contactSensor01 =
-      boost::dynamic_pointer_cast<sensors::ContactSensor>(sensor01);
-
-  ASSERT_TRUE(contactSensor01);
-
-  sensors::SensorPtr sensor02 = sensors::get_sensor(contactSensorName02);
-  sensors::ContactSensorPtr contactSensor02 =
-      boost::dynamic_pointer_cast<sensors::ContactSensor>(sensor02);
-
-  ASSERT_TRUE(contactSensor02);
-
-  sensors::SensorManager::Instance()->Init();
-  sensors::SensorManager::Instance()->RunThreads();
-
-  EXPECT_FALSE(contactSensor01->IsActive());
-  EXPECT_FALSE(contactSensor02->IsActive());
-
-  unsigned int expectedColCount = 1;
-  EXPECT_EQ(contactSensor01->GetCollisionCount(), expectedColCount);
-  EXPECT_EQ(contactSensor02->GetCollisionCount(), expectedColCount);
-
-  // make sure the sensors are active and publishing
-  contactSensor01->SetActive(true);
-  contactSensor02->SetActive(true);
-
-  EXPECT_TRUE(contactSensor01->IsActive());
-  EXPECT_TRUE(contactSensor02->IsActive());
-
-  physics::ModelPtr contactModel01 = world->GetModel(modelName01);
-  physics::ModelPtr contactModel02 = world->GetModel(modelName02);
-  ASSERT_TRUE(contactModel01);
-  ASSERT_TRUE(contactModel02);
-
-  std::vector<physics::ModelPtr> models;
-  models.push_back(contactModel01);
-  models.push_back(contactModel02);
-
-  double gravityZ = -9.8;
-  physics->SetGravity(math::Vector3(0, 0, gravityZ));
-
-  msgs::Contacts contacts01;
-  msgs::Contacts contacts02;
-
-  // let objects stablize
-  world->StepWorld(1000);
-
-  int steps = 1000;
-  while ((contacts01.contact_size() == 0 || contacts02.contact_size() == 0)
-      && --steps > 0)
-  {
-    world->StepWorld(1);
-    contacts01 = contactSensor01->GetContacts();
-    contacts02 = contactSensor02->GetContacts();
-  }
-  EXPECT_GT(steps, 0);
-
-  std::vector<msgs::Contacts> contacts;
-  contacts.push_back(contacts01);
-  contacts.push_back(contacts02);
-
-  math::Vector3 expectedForce;
-  math::Vector3 expectedTorque;
-
-  // double tolPercentage = 0.1;
-  // double tol = 1e-2;
-  // double tolX, tolY, tolZ;
-
-  // Run the test once for each contact sensor
-  for (unsigned int k = 0; k < contacts.size(); ++k)
-  {
-    double mass = models[k]->GetLink()->GetInertial()->GetMass();
-    expectedForce = models[k]->GetLink()->GetWorldCoGPose().rot.GetInverse()
-        * math::Vector3(0, 0, (gravityZ * mass));
-    expectedTorque = math::Vector3(0, 0, 0);
-
-    unsigned int ColInd = 0;
-    physics::CollisionPtr col = models[k]->GetLink()->GetCollision(ColInd);
-    ASSERT_TRUE(col);
-
-    // calculate tolerance based on magnitude of force
-    // Uncomment lines below once we are able to accurately determine the
-    // expected force output, see issue #565
-    // tolX = std::max(tolPercentage*expectedForce.x, tol);
-    // tolY = std::max(tolPercentage*expectedForce.y, tol);
-    // tolZ = std::max(tolPercentage*expectedForce.z, tol);
-
-    // loop through contact collision pairs
-    for (int i = 0; i < contacts[k].contact_size(); ++i)
-    {
-      bool body1 = true;
-      if (contacts[k].contact(i).collision1() == col->GetScopedName())
-        body1 = true;
-      else if (contacts[k].contact(i).collision2() == col->GetScopedName())
-        body1 = false;
-      else
-      {
-        FAIL();
-      }
-
-      math::Vector3 actualForce;
-      math::Vector3 actualTorque;
-
-      // loop through all contact points between the two collisions
-      for (int j = 0; j < contacts[k].contact(i).position_size(); ++j)
-      {
-        // Contact between the sphere and the contact sensor occurs at z=1.0
-        // Skip other contact points with the ground plane
-        if (!math::equal(contacts[k].contact(i).position(j).z(), 1.0))
-          continue;
-
-        EXPECT_NEAR(contacts[k].contact(i).position(j).x(),
-            models[k]->GetLink()->GetWorldCoGPose().pos.x, TOL);
-        EXPECT_NEAR(contacts[k].contact(i).position(j).y(),
-            models[k]->GetLink()->GetWorldCoGPose().pos.y, TOL);
-
-        EXPECT_NEAR(contacts[k].contact(i).normal(j).x(), 0, TOL);
-        EXPECT_NEAR(contacts[k].contact(i).normal(j).y(), 0, TOL);
-        EXPECT_NEAR(contacts[k].contact(i).normal(j).z(), 1, TOL);
-
-        if (body1)
-        {
-          actualForce.x = contacts[k].contact(i).wrench(j).body_1_force().x();
-          actualForce.y = contacts[k].contact(i).wrench(j).body_1_force().y();
-          actualForce.z = contacts[k].contact(i).wrench(j).body_1_force().z();
-
-          actualTorque.x = contacts[k].contact(i).wrench(j).body_1_torque().x();
-          actualTorque.y = contacts[k].contact(i).wrench(j).body_1_torque().y();
-          actualTorque.z = contacts[k].contact(i).wrench(j).body_1_torque().z();
-        }
-        else
-        {
-          actualForce.x = contacts[k].contact(i).wrench(j).body_2_force().x();
-          actualForce.y = contacts[k].contact(i).wrench(j).body_2_force().y();
-          actualForce.z = contacts[k].contact(i).wrench(j).body_2_force().z();
-
-          actualTorque.x = contacts[k].contact(i).wrench(j).body_2_torque().x();
-          actualTorque.y = contacts[k].contact(i).wrench(j).body_2_torque().y();
-          actualTorque.z = contacts[k].contact(i).wrench(j).body_2_torque().z();
-        }
-
-        // Find the dominant force vector component and verify the value has
-        // the correct sign.
-        // Force and torque are given in the link frame, see issue #545
-        int vi = (fabs(expectedForce.x) > fabs(expectedForce.y))
-            ? 0 : 1;
-        vi = (fabs(expectedForce[vi]) > fabs(expectedForce.z))
-            ? vi : 2;
-        EXPECT_EQ((expectedForce[vi] < 0), (actualForce[vi] < 0));
-
-        // Verify torque with a large tolerance
-        double odeTorqueTol = 1;
-        EXPECT_TRUE(fabs(actualTorque.x) < odeTorqueTol);
-        EXPECT_TRUE(fabs(actualTorque.y) < odeTorqueTol);
-        EXPECT_TRUE(fabs(actualTorque.z) < odeTorqueTol);
-
-        // TODO: ODE and bullet produce slightly different results
-        // In ODE the force and torque on an object seem to be affected by other
-        // components like friction, e.g. It is found that the stationary sphere
-        // exerts non-zero x and y forces on the contact sensor when only
-        // negative z forces are expected.
-        // The tests below pass in bullet but fail in ode, see issue #565
-        // EXPECT_NEAR(expectedForce.x, actualForce.x, tolX);
-        // EXPECT_NEAR(expectedForce.y, actualForce.y, tolY);
-        // EXPECT_NEAR(expectedForce.z, actualForce.z, tolZ);
-        // EXPECT_NEAR(expectedTorque.x, actualTorque.x, tolX);
-        // EXPECT_NEAR(expectedTorque.y, actualTorque.y, tolY);
-        // EXPECT_NEAR(expectedTorque.z, actualTorque.z, tolZ);
-      }
-    }
-  }
-}
-
-TEST_F(ContactSensor, StackTestODE)
-{
-  StackTest("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(ContactSensor, StackTestBullet)
-{
-  StackTest("bullet");
-}
-#endif  // HAVE_BULLET
-
-////////////////////////////////////////////////////////////////////////
-// Test contact sensor torque feedback. Rest one x-rotated cylinder over
-// a y-rotated cylinder so they form a cross shape. Position the top cylinder
-// slightly to the -y direction so it begins to topple when simulation starts,
-// then verify it's torque
-////////////////////////////////////////////////////////////////////////
-void ContactSensor::TorqueTest(const std::string &_physicsEngine)
-{
-  // Load an empty world
-  Load("worlds/empty.world", true, _physicsEngine);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // Verify physics engine type
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), _physicsEngine);
-
-  std::string modelName = "contactModel";
-  std::string contactSensorName = "contactSensor";
-  math::Pose modelPose(0, -0.3, 1.5, M_PI/2.0, 0, 0);
-
-  std::string cylinderName = "cylinder";
-  math::Pose cylinderPose(0, 0, 0.5, 0, M_PI/2.0, 0);
-
-  SpawnUnitContactSensor(modelName, contactSensorName,
-      "cylinder", modelPose.pos, modelPose.rot.GetAsEuler());
-
-  SpawnCylinder(cylinderName, cylinderPose.pos, cylinderPose.rot.GetAsEuler());
-
-  sensors::SensorPtr sensor = sensors::get_sensor(contactSensorName);
-  sensors::ContactSensorPtr contactSensor =
-      boost::dynamic_pointer_cast<sensors::ContactSensor>(sensor);
-
-  ASSERT_TRUE(contactSensor);
-
-  sensors::SensorManager::Instance()->Init();
-  sensors::SensorManager::Instance()->RunThreads();
-
-  EXPECT_FALSE(contactSensor->IsActive());
-
-  unsigned int expectedColCount = 1;
-  EXPECT_EQ(contactSensor->GetCollisionCount(), expectedColCount);
-
-  contactSensor->SetActive(true);
-
-  EXPECT_TRUE(contactSensor->IsActive());
-
-  physics::ModelPtr contactModel = world->GetModel(modelName);
-  ASSERT_TRUE(contactModel);
-
-  double gravityZ = -9.8;
-  physics->SetGravity(math::Vector3(0, 0, gravityZ));
-
-  msgs::Contacts contacts;
-
-  world->StepWorld(1);
-
-  // run simulation until contacts occur
-  int steps = 2000;
-  while (contacts.contact_size() == 0 && --steps > 0)
-  {
-    world->StepWorld(1);
-    contacts = contactSensor->GetContacts();
-  }
-
-  EXPECT_GT(steps, 0);
-
-  contacts = contactSensor->GetContacts();
-
-  unsigned int ColInd = 0;
-  physics::CollisionPtr col = contactModel->GetLink()->GetCollision(ColInd);
-  ASSERT_TRUE(col);
-
-  double tol = 1e-2;
-  // loop through contact collision pairs
-  for (int i = 0; i < contacts.contact_size(); ++i)
-  {
-    bool body1 = true;
-    if (contacts.contact(i).collision1() == col->GetScopedName())
-      body1 = true;
-    else if (contacts.contact(i).collision2() == col->GetScopedName())
-      body1 = false;
-    else
-    {
-      FAIL();
-    }
-    math::Vector3 actualTorque;
-
-    // loop through all contact points between the two collisions
-    for (int j = 0; j < contacts.contact(i).position_size(); ++j)
-    {
-      if (contacts.contact(i).position(j).z() < 0.5)
-        continue;
-
-      if (body1)
-      {
-        actualTorque.x = contacts.contact(i).wrench(j).body_1_torque().x();
-        actualTorque.y = contacts.contact(i).wrench(j).body_1_torque().y();
-        actualTorque.z = contacts.contact(i).wrench(j).body_1_torque().z();
-      }
-      else
-      {
-        actualTorque.x = contacts.contact(i).wrench(j).body_2_torque().x();
-        actualTorque.y = contacts.contact(i).wrench(j).body_2_torque().y();
-        actualTorque.z = contacts.contact(i).wrench(j).body_2_torque().z();
-      }
-      // contact sensor should have positive x torque and relatively large
-      // compared to y and z
-      EXPECT_GT(actualTorque.x, 0);
-      EXPECT_TRUE(actualTorque.x > fabs(actualTorque.y));
-      EXPECT_TRUE(actualTorque.x > fabs(actualTorque.z));
-      EXPECT_TRUE(fabs(actualTorque.y) < tol);
-      EXPECT_TRUE(fabs(actualTorque.z) < tol);
-    }
-  }
-}
-
-TEST_F(ContactSensor, TorqueTestODE)
-{
-  TorqueTest("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(ContactSensor, TorqueTestBullet)
-{
-  TorqueTest("bullet");
-}
-#endif  // HAVE_BULLET
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/factory.cc b/test/regression/factory.cc
deleted file mode 100644
index 1df523d..0000000
--- a/test/regression/factory.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <string.h>
-#include "math/Helpers.hh"
-#include "transport/TransportTypes.hh"
-#include "transport/Node.hh"
-
-#include "rendering/RenderEngine.hh"
-#include "rendering/Camera.hh"
-#include "sensors/Sensors.hh"
-#include "sensors/CameraSensor.hh"
-#include "ServerFixture.hh"
-#include "images_cmp.h"
-
-
-using namespace gazebo;
-class FactoryTest : public ServerFixture
-{
-};
-
-TEST_F(FactoryTest, Box)
-{
-  math::Pose setPose, testPose;
-  Load("worlds/empty.world");
-  SetPause(true);
-
-  for (unsigned int i = 0; i < 100; i++)
-  {
-    std::ostringstream name;
-    name << "test_box_" << i;
-    setPose.Set(math::Vector3(0, 0, i+0.5), math::Quaternion(0, 0, 0));
-    SpawnBox(name.str(), math::Vector3(1, 1, 1), setPose.pos,
-        setPose.rot.GetAsEuler());
-    testPose = GetEntityPose(name.str());
-    EXPECT_TRUE(math::equal(testPose.pos.x, setPose.pos.x, 0.1));
-    EXPECT_TRUE(math::equal(testPose.pos.y, setPose.pos.y, 0.1));
-    EXPECT_TRUE(math::equal(testPose.pos.z, setPose.pos.z, 0.1));
-  }
-}
-
-TEST_F(FactoryTest, Sphere)
-{
-  math::Pose setPose, testPose;
-  Load("worlds/empty.world");
-  SetPause(true);
-
-  for (unsigned int i = 0; i < 100; i++)
-  {
-    std::ostringstream name;
-    name << "test_sphere_" << i;
-    setPose.Set(math::Vector3(0, 0, i+0.5), math::Quaternion(0, 0, 0));
-    SpawnSphere(name.str(), setPose.pos, setPose.rot.GetAsEuler());
-    testPose = GetEntityPose(name.str());
-    EXPECT_TRUE(math::equal(testPose.pos.x, setPose.pos.x, 0.1));
-    EXPECT_TRUE(math::equal(testPose.pos.y, setPose.pos.y, 0.1));
-    EXPECT_TRUE(math::equal(testPose.pos.z, setPose.pos.z, 0.1));
-  }
-}
-
-TEST_F(FactoryTest, Cylinder)
-{
-  math::Pose setPose, testPose;
-  Load("worlds/empty.world");
-  SetPause(true);
-
-  for (unsigned int i = 0; i < 100; i++)
-  {
-    std::ostringstream name;
-    name << "test_cylinder_" << i;
-    setPose.Set(math::Vector3(0, 0, i+0.5), math::Quaternion(0, 0, 0));
-    SpawnCylinder(name.str(), setPose.pos, setPose.rot.GetAsEuler());
-    testPose = GetEntityPose(name.str());
-    EXPECT_TRUE(math::equal(testPose.pos.x, setPose.pos.x, 0.1));
-    EXPECT_TRUE(math::equal(testPose.pos.y, setPose.pos.y, 0.1));
-    EXPECT_TRUE(math::equal(testPose.pos.z, setPose.pos.z, 0.1));
-  }
-}
-
-TEST_F(FactoryTest, Camera)
-{
-  // Disabling this test for now. Different machines return different
-  // camera images. Need a better way to evaluate rendered content.
-/*
-  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
-      rendering::RenderEngine::NONE)
-    return;
-
-  math::Pose setPose, testPose;
-  Load("worlds/empty.world");
-  setPose.Set(math::Vector3(-5, 0, 5), math::Quaternion(0, GZ_DTOR(15), 0));
-  SpawnCamera("camera_model", "camera_sensor2", setPose.pos,
-      setPose.rot.GetAsEuler());
-
-  unsigned char *img = NULL;
-  unsigned int width;
-  unsigned int height;
-  GetFrame("camera_sensor2", &img, width, height);
-  ASSERT_EQ(width, static_cast<unsigned int>(320));
-  ASSERT_EQ(height, static_cast<unsigned int>(240));
-
-  unsigned int diffMax = 0;
-  unsigned int diffSum = 0;
-  double diffAvg = 0;
-  ImageCompare(&img, &empty_world_camera1,
-      width, height, 3, diffMax, diffSum, diffAvg);
-  // PrintImage("empty_world_camera1", &img, width, height, 3);
-  ASSERT_LT(diffSum, static_cast<unsigned int>(100));
-  ASSERT_EQ(static_cast<unsigned int>(0), diffMax);
-  ASSERT_EQ(0.0, diffAvg);
-  */
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/file_handling.cc b/test/regression/file_handling.cc
deleted file mode 100644
index 59ea42f..0000000
--- a/test/regression/file_handling.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "ServerFixture.hh"
-#include "common/common.hh"
-
-using namespace gazebo;
-class FileHandling : public ServerFixture
-{
-};
-
-TEST_F(FileHandling, Save)
-{
-  Load("worlds/empty.world");
-
-  transport::PublisherPtr serverControlPub =
-    node->Advertise<msgs::ServerControl>("/gazebo/server/control");
-
-  transport::PublisherPtr requestPub =
-    node->Advertise<msgs::Request>("~/request");
-
-
-  // Find a valid filename
-  FILE *file = NULL;
-  std::ostringstream filename;
-  int i = 0;
-  do
-  {
-    filename.str("");
-    filename << "/tmp/test_" << i << ".world";
-    i++;
-  } while ((file = fopen(filename.str().c_str(), "r")) != NULL);
-
-  msgs::ServerControl msg;
-  msg.set_save_world_name("default");
-  msg.set_save_filename(filename.str());
-  serverControlPub->Publish(msg);
-
-  // Wait until the file exists
-  i = 0;
-  while (i < 10 && (file = fopen(filename.str().c_str(), "r")) == NULL)
-  {
-    i++;
-    common::Time::MSleep(100);
-  }
-  fclose(file);
-
-  EXPECT_LT(i, 10);
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/heightmap.cc b/test/regression/heightmap.cc
deleted file mode 100644
index eab664a..0000000
--- a/test/regression/heightmap.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <string.h>
-
-#include "gazebo/rendering/Rendering.hh"
-#include "gazebo/rendering/Scene.hh"
-#include "ServerFixture.hh"
-#include "images_cmp.h"
-#include "heights_cmp.h"
-
-using namespace gazebo;
-class HeightmapTest : public ServerFixture
-{
-};
-
-/////////////////////////////////////////////////
-TEST_F(HeightmapTest, Heights)
-{
-  Load("worlds/heightmap_test.world");
-
-  // Make sure the render engine is available.
-  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
-      rendering::RenderEngine::NONE)
-  {
-    gzerr << "No rendering engine, unable to run heights test\n";
-    return;
-  }
-
-  // Make sure we can get a valid pointer to the scene.
-  rendering::ScenePtr scene = GetScene();
-
-  rendering::Heightmap *heightmap = NULL;
-
-  // Wait for the heightmap to get loaded by the scene.
-  {
-    int i = 0;
-    while (i < 20 && (heightmap = scene->GetHeightmap()) == NULL)
-    {
-      // Make sure to PreRender so that the Scene can process its messages
-      scene->PreRender();
-
-      common::Time::MSleep(100);
-      i++;
-    }
-
-    if (i >= 20)
-      gzthrow("Unable to get heightmap");
-  }
-
-  physics::ModelPtr model = GetModel("heightmap");
-  EXPECT_TRUE(model);
-
-  physics::CollisionPtr collision =
-    model->GetLink("link")->GetCollision("collision");
-
-  physics::HeightmapShapePtr shape =
-    boost::dynamic_pointer_cast<physics::HeightmapShape>(collision->GetShape());
-
-  EXPECT_TRUE(shape);
-  EXPECT_TRUE(shape->HasType(physics::Base::HEIGHTMAP_SHAPE));
-
-  EXPECT_TRUE(shape->GetPos() == math::Vector3(0, 0, 0));
-  EXPECT_TRUE(shape->GetSize() == math::Vector3(129, 129, 10));
-
-  // float diffMax, diffSum, diffAvg;
-  std::vector<float> physicsTest;
-  std::vector<float> renderTest;
-
-  float x, y;
-
-  for (y = 0; y < shape->GetSize().y; y += 0.2)
-  {
-    for (x = 0; x < shape->GetSize().x; x += 0.2)
-    {
-      // Compute the proper physics test point.
-      int xi = rint(x);
-      if (xi >= shape->GetSize().x)
-        xi = shape->GetSize().x - 1.0;
-      int yi = rint(y);
-      if (yi >= shape->GetSize().y)
-        yi = shape->GetSize().y - 1.0;
-
-      // Compute the proper render test point.
-      double xd = xi - floor(shape->GetSize().x) * 0.5;
-      double yd = floor((shape->GetSize().y)*0.5) - yi;
-
-      // The shape->GetHeight function requires a point relative to the
-      // bottom left of the heightmap image
-      physicsTest.push_back(shape->GetHeight(xi, yi));
-
-      // The render test requires a point relative to the center of the
-      // heightmap.
-      renderTest.push_back(heightmap->GetHeight(xd, yd));
-
-      // Debug output
-      if (fabs(physicsTest.back() - renderTest.back()) >= 0.13)
-      {
-        std::cout << "XY[" << xd << " " << yd << "][" << xi
-          << " " << yi << "] P[" << physicsTest.back() << "] R["
-          << renderTest.back() << "]\n";
-      }
-
-      // Test to see if the physics height is equal to the render engine
-      // height.
-      EXPECT_TRUE(math::equal(physicsTest.back(), renderTest.back(), 0.13f));
-    }
-  }
-
-  // FloatCompare(heights, &test[0], test.size(), diffMax, diffSum, diffAvg);
-  // printf("Max[%f] Sum[%f] Avg[%f]\n", diffMax, diffSum, diffAvg);
-
-  // This will print the heights
-  /*printf("static float __heights[] = {");
-  unsigned int i=0;
-  for (y = 0; y < shape->GetVertexCount().y; ++y)
-  {
-    for (x = 0; x < shape->GetVertexCount().x; ++x)
-    {
-      if (y == shape->GetVertexCount().y && x == shape->GetVertexCount().x)
-        break;
-
-      if (i % 7 == 0)
-        printf("\n");
-      else
-        printf(" ");
-      printf("%f,", shape->GetHeight(x, y));
-      i++;
-    }
-  }
-  printf(" %f};\nstatic float *heights = __heights;\n", shape->GetHeight(x,y));
-  */
-}
-
-/////////////////////////////////////////////////
-TEST_F(HeightmapTest, WhiteAlpha)
-{
-  Load("worlds/white_alpha_heightmap.world");
-  physics::ModelPtr model = GetModel("heightmap");
-  EXPECT_TRUE(model);
-
-  physics::CollisionPtr collision =
-    model->GetLink("link")->GetCollision("collision");
-
-  physics::HeightmapShapePtr shape =
-    boost::dynamic_pointer_cast<physics::HeightmapShape>(collision->GetShape());
-
-  EXPECT_TRUE(shape);
-  EXPECT_TRUE(shape->HasType(physics::Base::HEIGHTMAP_SHAPE));
-
-  int x, y;
-  for (y = 0; y < shape->GetVertexCount().y; ++y)
-  {
-    for (x = 0; x < shape->GetVertexCount().x; ++x)
-    {
-      EXPECT_EQ(shape->GetHeight(x, y), 10.0);
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-TEST_F(HeightmapTest, WhiteNoAlpha)
-{
-  Load("worlds/white_no_alpha_heightmap.world");
-  physics::ModelPtr model = GetModel("heightmap");
-  EXPECT_TRUE(model);
-
-  physics::CollisionPtr collision =
-    model->GetLink("link")->GetCollision("collision");
-
-  physics::HeightmapShapePtr shape =
-    boost::dynamic_pointer_cast<physics::HeightmapShape>(collision->GetShape());
-
-  EXPECT_TRUE(shape);
-  EXPECT_TRUE(shape->HasType(physics::Base::HEIGHTMAP_SHAPE));
-
-  int x, y;
-  for (y = 0; y < shape->GetVertexCount().y; ++y)
-  {
-    for (x = 0; x < shape->GetVertexCount().x; ++x)
-    {
-      EXPECT_EQ(shape->GetHeight(x, y), 10.0);
-    }
-  }
-}
-
-/////////////////////////////////////////////////
-TEST_F(HeightmapTest, NotSquareImage)
-{
-  common::SystemPaths::Instance()->AddGazeboPaths(
-      TEST_REGRESSION_PATH);
-
-  this->server = new Server();
-  EXPECT_THROW(this->server->LoadFile("worlds/not_square_heightmap.world"),
-               common::Exception);
-
-  this->server->Fini();
-  delete this->server;
-}
-
-/////////////////////////////////////////////////
-/*TEST_F(HeightmapTest, InvalidSizeImage)
-{
-  common::SystemPaths::Instance()->AddGazeboPaths(
-      TEST_REGRESSION_PATH);
-
-  this->server = new Server();
-  EXPECT_THROW(this->server->Load("worlds/invalid_size_heightmap.world"),
-               common::Exception);
-
-  this->server->Fini();
-  delete this->server;
-}*/
-
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/heights_cmp.h b/test/regression/heights_cmp.h
deleted file mode 100644
index cd55965..0000000
--- a/test/regression/heights_cmp.h
+++ /dev/null
@@ -1,2411 +0,0 @@
-/*
- * Copyright 2011 Nate Koenig & Andrew Howard
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#ifndef TEST_HEIGHTS_CMP_H_
-#define TEST_HEIGHTS_CMP_H_
-
-#ifdef __GNUC__
-    #define MAYBE_UNUSED __attribute__((used))
-#elif defined _MSC_VER
-    #pragma warning(disable: Cxxxxx)
-    #define MAYBE_UNUSED
-#else
-    #define MAYBE_UNUSED
-#endif
-
-static float __heights[] = {
-0.000000, 0.019685, 0.039370, 0.059055, 0.078740, 0.098425, 0.118110,
-0.137795, 0.157480, 0.177165, 0.196850, 0.216535, 0.236220, 0.255906,
-0.275591, 0.295276, 0.314961, 0.334646, 0.354331, 0.374016, 0.393701,
-0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
-0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291,
-0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087,
-0.826772, 0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.944882,
-0.964567, 0.984252, 1.003937, 1.023622, 1.043307, 1.062992, 1.082677,
-1.102362, 1.122047, 1.141732, 1.161417, 1.181102, 1.200787, 1.220472,
-1.240157, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.348425,
-1.358268, 1.368110, 1.377953, 1.407480, 1.437008, 1.466535, 1.496063,
-1.505906, 1.515748, 1.525591, 1.535433, 1.564961, 1.594488, 1.624016,
-1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.742126, 1.751969,
-1.761811, 1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079,
-1.889764, 1.909449, 1.929134, 1.958661, 1.988189, 2.017717, 2.047244,
-2.066929, 2.086614, 2.106299, 2.125984, 2.135827, 2.145669, 2.155512,
-2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.273622, 2.303150,
-2.332677, 2.362205, 2.372047, 2.381890, 2.391732, 2.401575, 2.431102,
-2.460630, 2.490157, 2.519685, 0.019685, 0.034449, 0.049213, 0.063976,
-0.078740, 0.098425, 0.118110, 0.137795, 0.157480, 0.177165, 0.196850,
-0.216535, 0.236220, 0.255906, 0.275591, 0.295276, 0.314961, 0.334646,
-0.354331, 0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441,
-0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236,
-0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031,
-0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827,
-0.905512, 0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622,
-1.043307, 1.062992, 1.082677, 1.102362, 1.119587, 1.136811, 1.154035,
-1.171260, 1.193406, 1.215551, 1.237697, 1.259843, 1.279528, 1.299213,
-1.318898, 1.338583, 1.350886, 1.363189, 1.375492, 1.387795, 1.412402,
-1.437008, 1.461614, 1.486220, 1.498524, 1.510827, 1.523130, 1.535433,
-1.562500, 1.589567, 1.616634, 1.643701, 1.665846, 1.687992, 1.710138,
-1.732283, 1.744587, 1.756890, 1.769193, 1.781496, 1.798720, 1.815945,
-1.833169, 1.850394, 1.872539, 1.894685, 1.916831, 1.938976, 1.963583,
-1.988189, 2.012795, 2.037402, 2.059547, 2.081693, 2.103839, 2.125984,
-2.135827, 2.145669, 2.155512, 2.165354, 2.185039, 2.204724, 2.224410,
-2.244095, 2.271161, 2.298228, 2.325295, 2.352362, 2.364665, 2.376969,
-2.389272, 2.401575, 2.428642, 2.455709, 2.482776, 2.509843, 0.039370,
-0.049213, 0.059055, 0.068898, 0.078740, 0.098425, 0.118110, 0.137795,
-0.157480, 0.177165, 0.196850, 0.216535, 0.236220, 0.255906, 0.275591,
-0.295276, 0.314961, 0.334646, 0.354331, 0.374016, 0.393701, 0.413386,
-0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181,
-0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291, 0.688976,
-0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.826772,
-0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567,
-0.984252, 1.003937, 1.023622, 1.043307, 1.062992, 1.082677, 1.102362,
-1.117126, 1.131890, 1.146654, 1.161417, 1.186024, 1.210630, 1.235236,
-1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.353346, 1.368110,
-1.382874, 1.397638, 1.417323, 1.437008, 1.456693, 1.476378, 1.491142,
-1.505906, 1.520669, 1.535433, 1.560039, 1.584646, 1.609252, 1.633858,
-1.658465, 1.683071, 1.707677, 1.732283, 1.747047, 1.761811, 1.776575,
-1.791339, 1.806102, 1.820866, 1.835630, 1.850394, 1.875000, 1.899606,
-1.924213, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.052165,
-2.076772, 2.101378, 2.125984, 2.135827, 2.145669, 2.155512, 2.165354,
-2.185039, 2.204724, 2.224410, 2.244095, 2.268701, 2.293307, 2.317913,
-2.342520, 2.357284, 2.372047, 2.386811, 2.401575, 2.426181, 2.450787,
-2.475394, 2.500000, 0.059055, 0.063976, 0.068898, 0.073819, 0.078740,
-0.098425, 0.118110, 0.137795, 0.157480, 0.177165, 0.196850, 0.216535,
-0.236220, 0.255906, 0.275591, 0.295276, 0.314961, 0.334646, 0.354331,
-0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126,
-0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921,
-0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717,
-0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827, 0.905512,
-0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.043307,
-1.062992, 1.082677, 1.102362, 1.114665, 1.126969, 1.139272, 1.151575,
-1.178642, 1.205709, 1.232776, 1.259843, 1.279528, 1.299213, 1.318898,
-1.338583, 1.355807, 1.373032, 1.390256, 1.407480, 1.422244, 1.437008,
-1.451772, 1.466535, 1.483760, 1.500984, 1.518209, 1.535433, 1.557579,
-1.579724, 1.601870, 1.624016, 1.651083, 1.678150, 1.705217, 1.732283,
-1.749508, 1.766732, 1.783957, 1.801181, 1.813484, 1.825787, 1.838091,
-1.850394, 1.877461, 1.904528, 1.931594, 1.958661, 1.973425, 1.988189,
-2.002953, 2.017717, 2.044784, 2.071851, 2.098917, 2.125984, 2.135827,
-2.145669, 2.155512, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
-2.266240, 2.288386, 2.310532, 2.332677, 2.349902, 2.367126, 2.384350,
-2.401575, 2.423720, 2.445866, 2.468012, 2.490158, 0.078740, 0.078740,
-0.078740, 0.078740, 0.078740, 0.098425, 0.118110, 0.137795, 0.157480,
-0.177165, 0.196850, 0.216535, 0.236220, 0.255906, 0.275591, 0.295276,
-0.314961, 0.334646, 0.354331, 0.374016, 0.393701, 0.413386, 0.433071,
-0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866,
-0.590551, 0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661,
-0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.826772, 0.846457,
-0.866142, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567, 0.984252,
-1.003937, 1.023622, 1.043307, 1.062992, 1.082677, 1.102362, 1.112205,
-1.122047, 1.131890, 1.141732, 1.171260, 1.200787, 1.230315, 1.259843,
-1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638,
-1.417323, 1.427165, 1.437008, 1.446850, 1.456693, 1.476378, 1.496063,
-1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.643701,
-1.673228, 1.702756, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024,
-1.820866, 1.830709, 1.840551, 1.850394, 1.879921, 1.909449, 1.938976,
-1.968504, 1.978346, 1.988189, 1.998031, 2.007874, 2.037402, 2.066929,
-2.096457, 2.125984, 2.135827, 2.145669, 2.155512, 2.165354, 2.185039,
-2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
-2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630,
-2.480315, 0.098425, 0.098425, 0.098425, 0.098425, 0.098425, 0.113189,
-0.127953, 0.142717, 0.157480, 0.177165, 0.196850, 0.216535, 0.236220,
-0.255906, 0.275591, 0.295276, 0.314961, 0.334646, 0.354331, 0.374016,
-0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811,
-0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606,
-0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402,
-0.804626, 0.821850, 0.839075, 0.856299, 0.875984, 0.895669, 0.915354,
-0.935039, 0.957185, 0.979331, 1.001476, 1.023622, 1.040846, 1.058071,
-1.075295, 1.092520, 1.107283, 1.122047, 1.136811, 1.151575, 1.176181,
-1.200787, 1.225394, 1.250000, 1.269685, 1.289370, 1.309055, 1.328740,
-1.348425, 1.368110, 1.387795, 1.407480, 1.422244, 1.437008, 1.451772,
-1.466535, 1.483760, 1.500984, 1.518209, 1.535433, 1.557579, 1.579724,
-1.601870, 1.624016, 1.651083, 1.678150, 1.705217, 1.732283, 1.751969,
-1.771654, 1.791339, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394,
-1.877461, 1.904528, 1.931594, 1.958661, 1.970965, 1.983268, 1.995571,
-2.007874, 2.034941, 2.062008, 2.089075, 2.116142, 2.130906, 2.145669,
-2.160433, 2.175197, 2.192421, 2.209646, 2.226870, 2.244095, 2.263780,
-2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575,
-2.421260, 2.440945, 2.460630, 2.480315, 0.118110, 0.118110, 0.118110,
-0.118110, 0.118110, 0.127953, 0.137795, 0.147638, 0.157480, 0.177165,
-0.196850, 0.216535, 0.236220, 0.255906, 0.275591, 0.295276, 0.314961,
-0.334646, 0.354331, 0.374016, 0.393701, 0.413386, 0.433071, 0.452756,
-0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551,
-0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346,
-0.748031, 0.767717, 0.787402, 0.802165, 0.816929, 0.831693, 0.846457,
-0.866142, 0.885827, 0.905512, 0.925197, 0.949803, 0.974409, 0.999016,
-1.023622, 1.038386, 1.053150, 1.067913, 1.082677, 1.102362, 1.122047,
-1.141732, 1.161417, 1.181102, 1.200787, 1.220472, 1.240157, 1.259843,
-1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638,
-1.417323, 1.437008, 1.456693, 1.476378, 1.491142, 1.505906, 1.520669,
-1.535433, 1.560039, 1.584646, 1.609252, 1.633858, 1.658465, 1.683071,
-1.707677, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.820866,
-1.830709, 1.840551, 1.850394, 1.875000, 1.899606, 1.924213, 1.948819,
-1.963583, 1.978346, 1.993110, 2.007874, 2.032480, 2.057087, 2.081693,
-2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.199803, 2.214567,
-2.229331, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
-2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
-0.137795, 0.137795, 0.137795, 0.137795, 0.137795, 0.142717, 0.147638,
-0.152559, 0.157480, 0.177165, 0.196850, 0.216535, 0.236220, 0.255906,
-0.275591, 0.295276, 0.314961, 0.334646, 0.354331, 0.374016, 0.393701,
-0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
-0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291,
-0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.799705,
-0.812008, 0.824311, 0.836614, 0.856299, 0.875984, 0.895669, 0.915354,
-0.942421, 0.969488, 0.996555, 1.023622, 1.035925, 1.048228, 1.060531,
-1.072835, 1.097441, 1.122047, 1.146654, 1.171260, 1.186024, 1.200787,
-1.215551, 1.230315, 1.250000, 1.269685, 1.289370, 1.309055, 1.328740,
-1.348425, 1.368110, 1.387795, 1.412402, 1.437008, 1.461614, 1.486220,
-1.498524, 1.510827, 1.523130, 1.535433, 1.562500, 1.589567, 1.616634,
-1.643701, 1.665846, 1.687992, 1.710138, 1.732283, 1.751969, 1.771654,
-1.791339, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.872539,
-1.894685, 1.916831, 1.938976, 1.956201, 1.973425, 1.990650, 2.007874,
-2.030020, 2.052165, 2.074311, 2.096457, 2.121063, 2.145669, 2.170276,
-2.194882, 2.207185, 2.219488, 2.231791, 2.244095, 2.263780, 2.283465,
-2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260,
-2.440945, 2.460630, 2.480315, 0.157480, 0.157480, 0.157480, 0.157480,
-0.157480, 0.157480, 0.157480, 0.157480, 0.157480, 0.177165, 0.196850,
-0.216535, 0.236220, 0.255906, 0.275591, 0.295276, 0.314961, 0.334646,
-0.354331, 0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441,
-0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236,
-0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031,
-0.767717, 0.787402, 0.797244, 0.807087, 0.816929, 0.826772, 0.846457,
-0.866142, 0.885827, 0.905512, 0.935039, 0.964567, 0.994094, 1.023622,
-1.033465, 1.043307, 1.053150, 1.062992, 1.092520, 1.122047, 1.151575,
-1.181102, 1.190945, 1.200787, 1.210630, 1.220472, 1.240157, 1.259843,
-1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.407480,
-1.437008, 1.466535, 1.496063, 1.505906, 1.515748, 1.525591, 1.535433,
-1.564961, 1.594488, 1.624016, 1.653543, 1.673228, 1.692913, 1.712598,
-1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.820866, 1.830709,
-1.840551, 1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.948819,
-1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
-2.116142, 2.145669, 2.175197, 2.204724, 2.214567, 2.224410, 2.234252,
-2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
-2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 0.177165,
-0.177165, 0.177165, 0.177165, 0.177165, 0.177165, 0.177165, 0.177165,
-0.177165, 0.194390, 0.211614, 0.228839, 0.246063, 0.268209, 0.290354,
-0.312500, 0.334646, 0.354331, 0.374016, 0.393701, 0.413386, 0.433071,
-0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866,
-0.590551, 0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661,
-0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.816929, 0.826772,
-0.836614, 0.846457, 0.868602, 0.890748, 0.912894, 0.935039, 0.962106,
-0.989173, 1.016240, 1.043307, 1.053150, 1.062992, 1.072835, 1.082677,
-1.112205, 1.141732, 1.171260, 1.200787, 1.213091, 1.225394, 1.237697,
-1.250000, 1.269685, 1.289370, 1.309055, 1.328740, 1.345965, 1.363189,
-1.380413, 1.397638, 1.427165, 1.456693, 1.486220, 1.515748, 1.528051,
-1.540354, 1.552657, 1.564961, 1.592028, 1.619094, 1.646161, 1.673228,
-1.692913, 1.712598, 1.732283, 1.751969, 1.769193, 1.786417, 1.803642,
-1.820866, 1.835630, 1.850394, 1.865157, 1.879921, 1.899606, 1.919291,
-1.938976, 1.958661, 1.975886, 1.993110, 2.010335, 2.027559, 2.047244,
-2.066929, 2.086614, 2.106299, 2.133366, 2.160433, 2.187500, 2.214567,
-2.226870, 2.239173, 2.251476, 2.263780, 2.283465, 2.303150, 2.322835,
-2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630,
-2.480315, 2.500000, 0.196850, 0.196850, 0.196850, 0.196850, 0.196850,
-0.196850, 0.196850, 0.196850, 0.196850, 0.211614, 0.226378, 0.241142,
-0.255906, 0.280512, 0.305118, 0.329724, 0.354331, 0.374016, 0.393701,
-0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
-0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291,
-0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087,
-0.826772, 0.836614, 0.846457, 0.856299, 0.866142, 0.890748, 0.915354,
-0.939961, 0.964567, 0.989173, 1.013780, 1.038386, 1.062992, 1.072835,
-1.082677, 1.092520, 1.102362, 1.131890, 1.161417, 1.190945, 1.220472,
-1.235236, 1.250000, 1.264764, 1.279528, 1.299213, 1.318898, 1.338583,
-1.358268, 1.373032, 1.387795, 1.402559, 1.417323, 1.446850, 1.476378,
-1.505906, 1.535433, 1.550197, 1.564961, 1.579724, 1.594488, 1.619094,
-1.643701, 1.668307, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654,
-1.786417, 1.801181, 1.815945, 1.830709, 1.850394, 1.870079, 1.889764,
-1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.002953, 2.017717,
-2.032480, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.150591,
-2.175197, 2.199803, 2.224410, 2.239173, 2.253937, 2.268701, 2.283465,
-2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260,
-2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 0.216535, 0.216535,
-0.216535, 0.216535, 0.216535, 0.216535, 0.216535, 0.216535, 0.216535,
-0.228839, 0.241142, 0.253445, 0.265748, 0.292815, 0.319882, 0.346949,
-0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126,
-0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921,
-0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717,
-0.787402, 0.807087, 0.826772, 0.846457, 0.856299, 0.866142, 0.875984,
-0.885827, 0.912894, 0.939961, 0.967028, 0.994094, 1.016240, 1.038386,
-1.060531, 1.082677, 1.092520, 1.102362, 1.112205, 1.122047, 1.151575,
-1.181102, 1.210630, 1.240157, 1.257382, 1.274606, 1.291831, 1.309055,
-1.328740, 1.348425, 1.368110, 1.387795, 1.400098, 1.412402, 1.424705,
-1.437008, 1.466535, 1.496063, 1.525591, 1.555118, 1.572343, 1.589567,
-1.606791, 1.624016, 1.646161, 1.668307, 1.690453, 1.712598, 1.732283,
-1.751969, 1.771654, 1.791339, 1.803642, 1.815945, 1.828248, 1.840551,
-1.865157, 1.889764, 1.914370, 1.938976, 1.958661, 1.978346, 1.998031,
-2.017717, 2.030020, 2.042323, 2.054626, 2.066929, 2.086614, 2.106299,
-2.125984, 2.145669, 2.167815, 2.189961, 2.212106, 2.234252, 2.251476,
-2.268701, 2.285925, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890,
-2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685,
-2.539370, 0.236220, 0.236220, 0.236220, 0.236220, 0.236220, 0.236220,
-0.236220, 0.236220, 0.236220, 0.246063, 0.255906, 0.265748, 0.275591,
-0.305118, 0.334646, 0.364173, 0.393701, 0.413386, 0.433071, 0.452756,
-0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551,
-0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346,
-0.748031, 0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142,
-0.875984, 0.885827, 0.895669, 0.905512, 0.935039, 0.964567, 0.994094,
-1.023622, 1.043307, 1.062992, 1.082677, 1.102362, 1.112205, 1.122047,
-1.131890, 1.141732, 1.171260, 1.200787, 1.230315, 1.259843, 1.279528,
-1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323,
-1.427165, 1.437008, 1.446850, 1.456693, 1.486220, 1.515748, 1.545276,
-1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
-1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.820866,
-1.830709, 1.840551, 1.850394, 1.879921, 1.909449, 1.938976, 1.968504,
-1.988189, 2.007874, 2.027559, 2.047244, 2.057087, 2.066929, 2.076772,
-2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
-2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
-2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 0.255906, 0.255906, 0.255906,
-0.255906, 0.255906, 0.255906, 0.255906, 0.255906, 0.255906, 0.263287,
-0.270669, 0.278051, 0.285433, 0.312500, 0.339567, 0.366634, 0.393701,
-0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
-0.551181, 0.568406, 0.585630, 0.602854, 0.620079, 0.642224, 0.664370,
-0.686516, 0.708661, 0.725886, 0.743110, 0.760335, 0.777559, 0.799705,
-0.821850, 0.843996, 0.866142, 0.878445, 0.890748, 0.903051, 0.915354,
-0.942421, 0.969488, 0.996555, 1.023622, 1.040846, 1.058071, 1.075295,
-1.092520, 1.107283, 1.122047, 1.136811, 1.151575, 1.176181, 1.200787,
-1.225394, 1.250000, 1.269685, 1.289370, 1.309055, 1.328740, 1.348425,
-1.368110, 1.387795, 1.407480, 1.419783, 1.432087, 1.444390, 1.456693,
-1.486220, 1.515748, 1.545276, 1.574803, 1.592028, 1.609252, 1.626476,
-1.643701, 1.665846, 1.687992, 1.710138, 1.732283, 1.749508, 1.766732,
-1.783957, 1.801181, 1.815945, 1.830709, 1.845472, 1.860236, 1.884843,
-1.909449, 1.934055, 1.958661, 1.978346, 1.998031, 2.017717, 2.037402,
-2.052165, 2.066929, 2.081693, 2.096457, 2.113681, 2.130906, 2.148130,
-2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465,
-2.303150, 2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.428642,
-2.445866, 2.463091, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
-0.275591, 0.275591, 0.275591, 0.275591, 0.275591, 0.275591, 0.275591,
-0.275591, 0.275591, 0.280512, 0.285433, 0.290354, 0.295276, 0.319882,
-0.344488, 0.369094, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441,
-0.492126, 0.511811, 0.531496, 0.551181, 0.565945, 0.580709, 0.595472,
-0.610236, 0.634843, 0.659449, 0.684055, 0.708661, 0.723425, 0.738189,
-0.752953, 0.767717, 0.792323, 0.816929, 0.841535, 0.866142, 0.880906,
-0.895669, 0.910433, 0.925197, 0.949803, 0.974409, 0.999016, 1.023622,
-1.038386, 1.053150, 1.067913, 1.082677, 1.102362, 1.122047, 1.141732,
-1.161417, 1.181102, 1.200787, 1.220472, 1.240157, 1.259843, 1.279528,
-1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.412402,
-1.427165, 1.441929, 1.456693, 1.486220, 1.515748, 1.545276, 1.574803,
-1.589567, 1.604331, 1.619094, 1.633858, 1.658465, 1.683071, 1.707677,
-1.732283, 1.747047, 1.761811, 1.776575, 1.791339, 1.811024, 1.830709,
-1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.948819, 1.968504,
-1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299,
-2.121063, 2.135827, 2.150591, 2.165354, 2.185039, 2.204724, 2.224410,
-2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.347441, 2.372047,
-2.396654, 2.421260, 2.436024, 2.450787, 2.465551, 2.480315, 2.500000,
-2.519685, 2.539370, 2.559055, 0.295276, 0.295276, 0.295276, 0.295276,
-0.295276, 0.295276, 0.295276, 0.295276, 0.295276, 0.297736, 0.300197,
-0.302657, 0.305118, 0.327264, 0.349409, 0.371555, 0.393701, 0.413386,
-0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181,
-0.563484, 0.575787, 0.588091, 0.600394, 0.627461, 0.654528, 0.681595,
-0.708661, 0.720965, 0.733268, 0.745571, 0.757874, 0.784941, 0.812008,
-0.839075, 0.866142, 0.883366, 0.900591, 0.917815, 0.935039, 0.957185,
-0.979331, 1.001476, 1.023622, 1.035925, 1.048228, 1.060531, 1.072835,
-1.097441, 1.122047, 1.146654, 1.171260, 1.186024, 1.200787, 1.215551,
-1.230315, 1.250000, 1.269685, 1.289370, 1.309055, 1.328740, 1.348425,
-1.368110, 1.387795, 1.405020, 1.422244, 1.439469, 1.456693, 1.486220,
-1.515748, 1.545276, 1.574803, 1.587106, 1.599409, 1.611713, 1.624016,
-1.651083, 1.678150, 1.705217, 1.732283, 1.744587, 1.756890, 1.769193,
-1.781496, 1.806102, 1.830709, 1.855315, 1.879921, 1.894685, 1.909449,
-1.924213, 1.938976, 1.958661, 1.978346, 1.998031, 2.017717, 2.042323,
-2.066929, 2.091536, 2.116142, 2.128445, 2.140748, 2.153051, 2.165354,
-2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
-2.322835, 2.349902, 2.376969, 2.404035, 2.431102, 2.443406, 2.455709,
-2.468012, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 0.314961,
-0.314961, 0.314961, 0.314961, 0.314961, 0.314961, 0.314961, 0.314961,
-0.314961, 0.314961, 0.314961, 0.314961, 0.314961, 0.334646, 0.354331,
-0.374016, 0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126,
-0.511811, 0.531496, 0.551181, 0.561024, 0.570866, 0.580709, 0.590551,
-0.620079, 0.649606, 0.679134, 0.708661, 0.718504, 0.728346, 0.738189,
-0.748031, 0.777559, 0.807087, 0.836614, 0.866142, 0.885827, 0.905512,
-0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.033465,
-1.043307, 1.053150, 1.062992, 1.092520, 1.122047, 1.151575, 1.181102,
-1.190945, 1.200787, 1.210630, 1.220472, 1.240157, 1.259843, 1.279528,
-1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323,
-1.437008, 1.456693, 1.486220, 1.515748, 1.545276, 1.574803, 1.584646,
-1.594488, 1.604331, 1.614173, 1.643701, 1.673228, 1.702756, 1.732283,
-1.742126, 1.751969, 1.761811, 1.771654, 1.801181, 1.830709, 1.860236,
-1.889764, 1.899606, 1.909449, 1.919291, 1.929134, 1.948819, 1.968504,
-1.988189, 2.007874, 2.037402, 2.066929, 2.096457, 2.125984, 2.135827,
-2.145669, 2.155512, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
-2.263780, 2.283465, 2.303150, 2.322835, 2.352362, 2.381890, 2.411417,
-2.440945, 2.450787, 2.460630, 2.470472, 2.480315, 2.500000, 2.519685,
-2.539370, 2.559055, 0.334646, 0.334646, 0.334646, 0.334646, 0.334646,
-0.334646, 0.334646, 0.334646, 0.334646, 0.334646, 0.334646, 0.334646,
-0.334646, 0.349409, 0.364173, 0.378937, 0.393701, 0.413386, 0.433071,
-0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.563484,
-0.575787, 0.588091, 0.600394, 0.627461, 0.654528, 0.681595, 0.708661,
-0.720965, 0.733268, 0.745571, 0.757874, 0.784941, 0.812008, 0.839075,
-0.866142, 0.883366, 0.900591, 0.917815, 0.935039, 0.957185, 0.979331,
-1.001476, 1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.092520,
-1.122047, 1.151575, 1.181102, 1.193406, 1.205709, 1.218012, 1.230315,
-1.250000, 1.269685, 1.289370, 1.309055, 1.326280, 1.343504, 1.360728,
-1.377953, 1.400098, 1.422244, 1.444390, 1.466535, 1.493602, 1.520669,
-1.547736, 1.574803, 1.587106, 1.599409, 1.611713, 1.624016, 1.651083,
-1.678150, 1.705217, 1.732283, 1.744587, 1.756890, 1.769193, 1.781496,
-1.806102, 1.830709, 1.855315, 1.879921, 1.892224, 1.904528, 1.916831,
-1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.034941, 2.062008,
-2.089075, 2.116142, 2.128445, 2.140748, 2.153051, 2.165354, 2.187500,
-2.209646, 2.231791, 2.253937, 2.271161, 2.288386, 2.305610, 2.322835,
-2.352362, 2.381890, 2.411417, 2.440945, 2.450787, 2.460630, 2.470472,
-2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 0.354331, 0.354331,
-0.354331, 0.354331, 0.354331, 0.354331, 0.354331, 0.354331, 0.354331,
-0.354331, 0.354331, 0.354331, 0.354331, 0.364173, 0.374016, 0.383858,
-0.393701, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811,
-0.531496, 0.551181, 0.565945, 0.580709, 0.595472, 0.610236, 0.634843,
-0.659449, 0.684055, 0.708661, 0.723425, 0.738189, 0.752953, 0.767717,
-0.792323, 0.816929, 0.841535, 0.866142, 0.880906, 0.895669, 0.910433,
-0.925197, 0.949803, 0.974409, 0.999016, 1.023622, 1.033465, 1.043307,
-1.053150, 1.062992, 1.092520, 1.122047, 1.151575, 1.181102, 1.195866,
-1.210630, 1.225394, 1.240157, 1.259843, 1.279528, 1.299213, 1.318898,
-1.333661, 1.348425, 1.363189, 1.377953, 1.402559, 1.427165, 1.451772,
-1.476378, 1.500984, 1.525591, 1.550197, 1.574803, 1.589567, 1.604331,
-1.619094, 1.633858, 1.658465, 1.683071, 1.707677, 1.732283, 1.747047,
-1.761811, 1.776575, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079,
-1.884843, 1.899606, 1.914370, 1.929134, 1.948819, 1.968504, 1.988189,
-2.007874, 2.032480, 2.057087, 2.081693, 2.106299, 2.121063, 2.135827,
-2.150591, 2.165354, 2.189961, 2.214567, 2.239173, 2.263780, 2.278543,
-2.293307, 2.308071, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945,
-2.450787, 2.460630, 2.470472, 2.480315, 2.500000, 2.519685, 2.539370,
-2.559055, 0.374016, 0.374016, 0.374016, 0.374016, 0.374016, 0.374016,
-0.374016, 0.374016, 0.374016, 0.374016, 0.374016, 0.374016, 0.374016,
-0.378937, 0.383858, 0.388780, 0.393701, 0.413386, 0.433071, 0.452756,
-0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.568406, 0.585630,
-0.602854, 0.620079, 0.642224, 0.664370, 0.686516, 0.708661, 0.725886,
-0.743110, 0.760335, 0.777559, 0.799705, 0.821850, 0.843996, 0.866142,
-0.878445, 0.890748, 0.903051, 0.915354, 0.942421, 0.969488, 0.996555,
-1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.092520, 1.122047,
-1.151575, 1.181102, 1.198327, 1.215551, 1.232776, 1.250000, 1.269685,
-1.289370, 1.309055, 1.328740, 1.341043, 1.353346, 1.365650, 1.377953,
-1.405020, 1.432087, 1.459154, 1.486220, 1.508366, 1.530512, 1.552657,
-1.574803, 1.592028, 1.609252, 1.626476, 1.643701, 1.665846, 1.687992,
-1.710138, 1.732283, 1.749508, 1.766732, 1.783957, 1.801181, 1.815945,
-1.830709, 1.845472, 1.860236, 1.877461, 1.894685, 1.911909, 1.929134,
-1.948819, 1.968504, 1.988189, 2.007874, 2.030020, 2.052165, 2.074311,
-2.096457, 2.113681, 2.130906, 2.148130, 2.165354, 2.192421, 2.219488,
-2.246555, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.352362,
-2.381890, 2.411417, 2.440945, 2.450787, 2.460630, 2.470472, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 0.393701, 0.393701, 0.393701,
-0.393701, 0.393701, 0.393701, 0.393701, 0.393701, 0.393701, 0.393701,
-0.393701, 0.393701, 0.393701, 0.393701, 0.393701, 0.393701, 0.393701,
-0.413386, 0.433071, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496,
-0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291,
-0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087,
-0.826772, 0.846457, 0.866142, 0.875984, 0.885827, 0.895669, 0.905512,
-0.935039, 0.964567, 0.994094, 1.023622, 1.033465, 1.043307, 1.053150,
-1.062992, 1.092520, 1.122047, 1.151575, 1.181102, 1.200787, 1.220472,
-1.240157, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.348425,
-1.358268, 1.368110, 1.377953, 1.407480, 1.437008, 1.466535, 1.496063,
-1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858,
-1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654,
-1.791339, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.870079,
-1.889764, 1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874,
-2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
-2.165354, 2.194882, 2.224410, 2.253937, 2.283465, 2.293307, 2.303150,
-2.312992, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945, 2.450787,
-2.460630, 2.470472, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
-0.413386, 0.410925, 0.408465, 0.406004, 0.403543, 0.406004, 0.408465,
-0.410925, 0.413386, 0.413386, 0.413386, 0.413386, 0.413386, 0.413386,
-0.413386, 0.413386, 0.413386, 0.433071, 0.452756, 0.472441, 0.492126,
-0.511811, 0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921,
-0.649606, 0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717,
-0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827, 0.895669,
-0.905512, 0.915354, 0.925197, 0.954724, 0.984252, 1.013780, 1.043307,
-1.053150, 1.062992, 1.072835, 1.082677, 1.109744, 1.136811, 1.163878,
-1.190945, 1.213091, 1.235236, 1.257382, 1.279528, 1.296752, 1.313976,
-1.331201, 1.348425, 1.363189, 1.377953, 1.392717, 1.407480, 1.432087,
-1.456693, 1.481299, 1.505906, 1.528051, 1.550197, 1.572343, 1.594488,
-1.614173, 1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283,
-1.751969, 1.771654, 1.791339, 1.811024, 1.830709, 1.843012, 1.855315,
-1.867618, 1.879921, 1.897146, 1.914370, 1.931594, 1.948819, 1.968504,
-1.988189, 2.007874, 2.027559, 2.049705, 2.071851, 2.093996, 2.116142,
-2.133366, 2.150591, 2.167815, 2.185039, 2.212106, 2.239173, 2.266240,
-2.293307, 2.305610, 2.317913, 2.330217, 2.342520, 2.369587, 2.396654,
-2.423720, 2.450787, 2.465551, 2.480315, 2.495079, 2.509843, 2.529528,
-2.549213, 2.568898, 2.588583, 0.433071, 0.428150, 0.423228, 0.418307,
-0.413386, 0.418307, 0.423228, 0.428150, 0.433071, 0.433071, 0.433071,
-0.433071, 0.433071, 0.433071, 0.433071, 0.433071, 0.433071, 0.452756,
-0.472441, 0.492126, 0.511811, 0.531496, 0.551181, 0.570866, 0.590551,
-0.610236, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.728346,
-0.748031, 0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142,
-0.885827, 0.905512, 0.915354, 0.925197, 0.935039, 0.944882, 0.974409,
-1.003937, 1.033465, 1.062992, 1.072835, 1.082677, 1.092520, 1.102362,
-1.126969, 1.151575, 1.176181, 1.200787, 1.225394, 1.250000, 1.274606,
-1.299213, 1.313976, 1.328740, 1.343504, 1.358268, 1.377953, 1.397638,
-1.417323, 1.437008, 1.456693, 1.476378, 1.496063, 1.515748, 1.540354,
-1.564961, 1.589567, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
-1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.830709,
-1.850394, 1.865157, 1.879921, 1.894685, 1.909449, 1.924213, 1.938976,
-1.953740, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.071851,
-2.096457, 2.121063, 2.145669, 2.160433, 2.175197, 2.189961, 2.204724,
-2.229331, 2.253937, 2.278543, 2.303150, 2.317913, 2.332677, 2.347441,
-2.362205, 2.386811, 2.411417, 2.436024, 2.460630, 2.480315, 2.500000,
-2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 0.452756,
-0.445374, 0.437992, 0.430610, 0.423228, 0.430610, 0.437992, 0.445374,
-0.452756, 0.452756, 0.452756, 0.452756, 0.452756, 0.452756, 0.452756,
-0.452756, 0.452756, 0.472441, 0.492126, 0.511811, 0.531496, 0.551181,
-0.570866, 0.590551, 0.610236, 0.629921, 0.649606, 0.669291, 0.688976,
-0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.826772,
-0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.935039, 0.944882,
-0.954724, 0.964567, 0.994094, 1.023622, 1.053150, 1.082677, 1.092520,
-1.102362, 1.112205, 1.122047, 1.144193, 1.166339, 1.188484, 1.210630,
-1.237697, 1.264764, 1.291831, 1.318898, 1.331201, 1.343504, 1.355807,
-1.368110, 1.392717, 1.417323, 1.441929, 1.466535, 1.481299, 1.496063,
-1.510827, 1.525591, 1.552657, 1.579724, 1.606791, 1.633858, 1.653543,
-1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339,
-1.811024, 1.830709, 1.850394, 1.870079, 1.887303, 1.904528, 1.921752,
-1.938976, 1.951280, 1.963583, 1.975886, 1.988189, 2.007874, 2.027559,
-2.047244, 2.066929, 2.093996, 2.121063, 2.148130, 2.175197, 2.187500,
-2.199803, 2.212106, 2.224410, 2.246555, 2.268701, 2.290847, 2.312992,
-2.330217, 2.347441, 2.364665, 2.381890, 2.404035, 2.426181, 2.448327,
-2.470472, 2.495079, 2.519685, 2.544291, 2.568898, 2.588583, 2.608268,
-2.627953, 2.647638, 0.472441, 0.462598, 0.452756, 0.442913, 0.433071,
-0.442913, 0.452756, 0.462598, 0.472441, 0.472441, 0.472441, 0.472441,
-0.472441, 0.472441, 0.472441, 0.472441, 0.472441, 0.492126, 0.511811,
-0.531496, 0.551181, 0.570866, 0.590551, 0.610236, 0.629921, 0.649606,
-0.669291, 0.688976, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402,
-0.807087, 0.826772, 0.846457, 0.866142, 0.885827, 0.905512, 0.925197,
-0.944882, 0.954724, 0.964567, 0.974409, 0.984252, 1.013780, 1.043307,
-1.072835, 1.102362, 1.112205, 1.122047, 1.131890, 1.141732, 1.161417,
-1.181102, 1.200787, 1.220472, 1.250000, 1.279528, 1.309055, 1.338583,
-1.348425, 1.358268, 1.368110, 1.377953, 1.407480, 1.437008, 1.466535,
-1.496063, 1.505906, 1.515748, 1.525591, 1.535433, 1.564961, 1.594488,
-1.624016, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969,
-1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764,
-1.909449, 1.929134, 1.948819, 1.968504, 1.978346, 1.988189, 1.998031,
-2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.116142, 2.145669,
-2.175197, 2.204724, 2.214567, 2.224410, 2.234252, 2.244095, 2.263780,
-2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575,
-2.421260, 2.440945, 2.460630, 2.480315, 2.509843, 2.539370, 2.568898,
-2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 0.492126, 0.484744,
-0.477362, 0.469980, 0.462598, 0.469980, 0.477362, 0.484744, 0.492126,
-0.489665, 0.487205, 0.484744, 0.482283, 0.484744, 0.487205, 0.489665,
-0.492126, 0.506890, 0.521654, 0.536417, 0.551181, 0.568406, 0.585630,
-0.602854, 0.620079, 0.642224, 0.664370, 0.686516, 0.708661, 0.728346,
-0.748031, 0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142,
-0.885827, 0.905512, 0.925197, 0.944882, 0.957185, 0.969488, 0.981791,
-0.994094, 1.021161, 1.048228, 1.075295, 1.102362, 1.114665, 1.126969,
-1.139272, 1.151575, 1.171260, 1.190945, 1.210630, 1.230315, 1.257382,
-1.284449, 1.311516, 1.338583, 1.348425, 1.358268, 1.368110, 1.377953,
-1.405020, 1.432087, 1.459154, 1.486220, 1.500984, 1.515748, 1.530512,
-1.545276, 1.569882, 1.594488, 1.619094, 1.643701, 1.663386, 1.683071,
-1.702756, 1.722441, 1.742126, 1.761811, 1.781496, 1.801181, 1.820866,
-1.840551, 1.860236, 1.879921, 1.899606, 1.919291, 1.938976, 1.958661,
-1.973425, 1.988189, 2.002953, 2.017717, 2.037402, 2.057087, 2.076772,
-2.096457, 2.121063, 2.145669, 2.170276, 2.194882, 2.209646, 2.224410,
-2.239173, 2.253937, 2.273622, 2.293307, 2.312992, 2.332677, 2.349902,
-2.367126, 2.384350, 2.401575, 2.423720, 2.445866, 2.468012, 2.490158,
-2.514764, 2.539370, 2.563976, 2.588583, 2.610729, 2.632874, 2.655020,
-2.677166, 0.511811, 0.506890, 0.501969, 0.497047, 0.492126, 0.497047,
-0.501969, 0.506890, 0.511811, 0.506890, 0.501969, 0.497047, 0.492126,
-0.497047, 0.501969, 0.506890, 0.511811, 0.521654, 0.531496, 0.541339,
-0.551181, 0.565945, 0.580709, 0.595472, 0.610236, 0.634843, 0.659449,
-0.684055, 0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087,
-0.826772, 0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.944882,
-0.959646, 0.974409, 0.989173, 1.003937, 1.028543, 1.053150, 1.077756,
-1.102362, 1.117126, 1.131890, 1.146654, 1.161417, 1.181102, 1.200787,
-1.220472, 1.240157, 1.264764, 1.289370, 1.313976, 1.338583, 1.348425,
-1.358268, 1.368110, 1.377953, 1.402559, 1.427165, 1.451772, 1.476378,
-1.496063, 1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173,
-1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969,
-1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764,
-1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559,
-2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354,
-2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
-2.322835, 2.342520, 2.357284, 2.372047, 2.386811, 2.401575, 2.426181,
-2.450787, 2.475394, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
-2.603347, 2.627953, 2.652559, 2.677166, 0.531496, 0.529035, 0.526575,
-0.524114, 0.521654, 0.524114, 0.526575, 0.529035, 0.531496, 0.524114,
-0.516732, 0.509350, 0.501969, 0.509350, 0.516732, 0.524114, 0.531496,
-0.536417, 0.541339, 0.546260, 0.551181, 0.563484, 0.575787, 0.588091,
-0.600394, 0.627461, 0.654528, 0.681595, 0.708661, 0.728346, 0.748031,
-0.767717, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827,
-0.905512, 0.925197, 0.944882, 0.962106, 0.979331, 0.996555, 1.013780,
-1.035925, 1.058071, 1.080217, 1.102362, 1.119587, 1.136811, 1.154035,
-1.171260, 1.190945, 1.210630, 1.230315, 1.250000, 1.272146, 1.294291,
-1.316437, 1.338583, 1.348425, 1.358268, 1.368110, 1.377953, 1.400098,
-1.422244, 1.444390, 1.466535, 1.491142, 1.515748, 1.540354, 1.564961,
-1.579724, 1.594488, 1.609252, 1.624016, 1.643701, 1.663386, 1.683071,
-1.702756, 1.722441, 1.742126, 1.761811, 1.781496, 1.801181, 1.820866,
-1.840551, 1.860236, 1.879921, 1.899606, 1.919291, 1.938976, 1.963583,
-1.988189, 2.012795, 2.037402, 2.057087, 2.076772, 2.096457, 2.116142,
-2.130906, 2.145669, 2.160433, 2.175197, 2.199803, 2.224410, 2.249016,
-2.273622, 2.293307, 2.312992, 2.332677, 2.352362, 2.364665, 2.376969,
-2.389272, 2.401575, 2.428642, 2.455709, 2.482776, 2.509843, 2.524606,
-2.539370, 2.554134, 2.568898, 2.595965, 2.623032, 2.650099, 2.677166,
-0.551181, 0.551181, 0.551181, 0.551181, 0.551181, 0.551181, 0.551181,
-0.551181, 0.551181, 0.541339, 0.531496, 0.521654, 0.511811, 0.521654,
-0.531496, 0.541339, 0.551181, 0.551181, 0.551181, 0.551181, 0.551181,
-0.561024, 0.570866, 0.580709, 0.590551, 0.620079, 0.649606, 0.679134,
-0.708661, 0.728346, 0.748031, 0.767717, 0.787402, 0.807087, 0.826772,
-0.846457, 0.866142, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567,
-0.984252, 1.003937, 1.023622, 1.043307, 1.062992, 1.082677, 1.102362,
-1.122047, 1.141732, 1.161417, 1.181102, 1.200787, 1.220472, 1.240157,
-1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.348425, 1.358268,
-1.368110, 1.377953, 1.397638, 1.417323, 1.437008, 1.456693, 1.486220,
-1.515748, 1.545276, 1.574803, 1.584646, 1.594488, 1.604331, 1.614173,
-1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969,
-1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764,
-1.909449, 1.929134, 1.958661, 1.988189, 2.017717, 2.047244, 2.066929,
-2.086614, 2.106299, 2.125984, 2.135827, 2.145669, 2.155512, 2.165354,
-2.194882, 2.224410, 2.253937, 2.283465, 2.303150, 2.322835, 2.342520,
-2.362205, 2.372047, 2.381890, 2.391732, 2.401575, 2.431102, 2.460630,
-2.490157, 2.519685, 2.529528, 2.539370, 2.549213, 2.559055, 2.588583,
-2.618110, 2.647638, 2.677166, 0.570866, 0.570866, 0.570866, 0.570866,
-0.570866, 0.570866, 0.570866, 0.570866, 0.570866, 0.563484, 0.556102,
-0.548720, 0.541339, 0.548720, 0.556102, 0.563484, 0.570866, 0.570866,
-0.570866, 0.570866, 0.570866, 0.578248, 0.585630, 0.593012, 0.600394,
-0.627461, 0.654528, 0.681595, 0.708661, 0.725886, 0.743110, 0.760335,
-0.777559, 0.799705, 0.821850, 0.843996, 0.866142, 0.885827, 0.905512,
-0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.043307,
-1.062992, 1.082677, 1.102362, 1.122047, 1.141732, 1.161417, 1.181102,
-1.198327, 1.215551, 1.232776, 1.250000, 1.269685, 1.289370, 1.309055,
-1.328740, 1.343504, 1.358268, 1.373032, 1.387795, 1.405020, 1.422244,
-1.439469, 1.456693, 1.483760, 1.510827, 1.537894, 1.564961, 1.579724,
-1.594488, 1.609252, 1.624016, 1.641240, 1.658465, 1.675689, 1.692913,
-1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.830709,
-1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.956201, 1.983268,
-2.010335, 2.037402, 2.057087, 2.076772, 2.096457, 2.116142, 2.128445,
-2.140748, 2.153051, 2.165354, 2.194882, 2.224410, 2.253937, 2.283465,
-2.303150, 2.322835, 2.342520, 2.362205, 2.372047, 2.381890, 2.391732,
-2.401575, 2.428642, 2.455709, 2.482776, 2.509843, 2.522146, 2.534449,
-2.546752, 2.559055, 2.588583, 2.618110, 2.647638, 2.677166, 0.590551,
-0.590551, 0.590551, 0.590551, 0.590551, 0.590551, 0.590551, 0.590551,
-0.590551, 0.585630, 0.580709, 0.575787, 0.570866, 0.575787, 0.580709,
-0.585630, 0.590551, 0.590551, 0.590551, 0.590551, 0.590551, 0.595472,
-0.600394, 0.605315, 0.610236, 0.634843, 0.659449, 0.684055, 0.708661,
-0.723425, 0.738189, 0.752953, 0.767717, 0.792323, 0.816929, 0.841535,
-0.866142, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567, 0.984252,
-1.003937, 1.023622, 1.043307, 1.062992, 1.082677, 1.102362, 1.122047,
-1.141732, 1.161417, 1.181102, 1.195866, 1.210630, 1.225394, 1.240157,
-1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953,
-1.397638, 1.412402, 1.427165, 1.441929, 1.456693, 1.481299, 1.505906,
-1.530512, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.648622,
-1.663386, 1.678150, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654,
-1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764, 1.909449,
-1.929134, 1.953740, 1.978346, 2.002953, 2.027559, 2.047244, 2.066929,
-2.086614, 2.106299, 2.121063, 2.135827, 2.150591, 2.165354, 2.194882,
-2.224410, 2.253937, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
-2.372047, 2.381890, 2.391732, 2.401575, 2.426181, 2.450787, 2.475394,
-2.500000, 2.514764, 2.529528, 2.544291, 2.559055, 2.588583, 2.618110,
-2.647638, 2.677166, 0.610236, 0.610236, 0.610236, 0.610236, 0.610236,
-0.610236, 0.610236, 0.610236, 0.610236, 0.607776, 0.605315, 0.602854,
-0.600394, 0.602854, 0.605315, 0.607776, 0.610236, 0.610236, 0.610236,
-0.610236, 0.610236, 0.612697, 0.615157, 0.617618, 0.620079, 0.642224,
-0.664370, 0.686516, 0.708661, 0.720965, 0.733268, 0.745571, 0.757874,
-0.784941, 0.812008, 0.839075, 0.866142, 0.885827, 0.905512, 0.925197,
-0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.043307, 1.062992,
-1.082677, 1.102362, 1.122047, 1.141732, 1.161417, 1.181102, 1.193406,
-1.205709, 1.218012, 1.230315, 1.250000, 1.269685, 1.289370, 1.309055,
-1.333661, 1.358268, 1.382874, 1.407480, 1.419783, 1.432087, 1.444390,
-1.456693, 1.478839, 1.500984, 1.523130, 1.545276, 1.569882, 1.594488,
-1.619094, 1.643701, 1.656004, 1.668307, 1.680610, 1.692913, 1.712598,
-1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.830709, 1.850394,
-1.870079, 1.889764, 1.909449, 1.929134, 1.951280, 1.973425, 1.995571,
-2.017717, 2.037402, 2.057087, 2.076772, 2.096457, 2.113681, 2.130906,
-2.148130, 2.165354, 2.194882, 2.224410, 2.253937, 2.283465, 2.303150,
-2.322835, 2.342520, 2.362205, 2.372047, 2.381890, 2.391732, 2.401575,
-2.423720, 2.445866, 2.468012, 2.490158, 2.507382, 2.524606, 2.541831,
-2.559055, 2.588583, 2.618110, 2.647638, 2.677166, 0.629921, 0.629921,
-0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921,
-0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921,
-0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921, 0.629921,
-0.629921, 0.629921, 0.649606, 0.669291, 0.688976, 0.708661, 0.718504,
-0.728346, 0.738189, 0.748031, 0.777559, 0.807087, 0.836614, 0.866142,
-0.885827, 0.905512, 0.925197, 0.944882, 0.964567, 0.984252, 1.003937,
-1.023622, 1.043307, 1.062992, 1.082677, 1.102362, 1.122047, 1.141732,
-1.161417, 1.181102, 1.190945, 1.200787, 1.210630, 1.220472, 1.240157,
-1.259843, 1.279528, 1.299213, 1.328740, 1.358268, 1.387795, 1.417323,
-1.427165, 1.437008, 1.446850, 1.456693, 1.476378, 1.496063, 1.515748,
-1.535433, 1.564961, 1.594488, 1.624016, 1.653543, 1.663386, 1.673228,
-1.683071, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339,
-1.811024, 1.830709, 1.850394, 1.870079, 1.889764, 1.909449, 1.929134,
-1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.066929,
-2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.194882, 2.224410,
-2.253937, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.372047,
-2.381890, 2.391732, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110, 2.647638,
-2.677166, 0.649606, 0.649606, 0.649606, 0.649606, 0.649606, 0.649606,
-0.649606, 0.649606, 0.649606, 0.647146, 0.644685, 0.642224, 0.639764,
-0.642224, 0.644685, 0.647146, 0.649606, 0.647146, 0.644685, 0.642224,
-0.639764, 0.639764, 0.639764, 0.639764, 0.639764, 0.661909, 0.684055,
-0.706201, 0.728346, 0.740650, 0.752953, 0.765256, 0.777559, 0.802165,
-0.826772, 0.851378, 0.875984, 0.898130, 0.920276, 0.942421, 0.964567,
-0.981791, 0.999016, 1.016240, 1.033465, 1.053150, 1.072835, 1.092520,
-1.112205, 1.134350, 1.156496, 1.178642, 1.200787, 1.213091, 1.225394,
-1.237697, 1.250000, 1.267224, 1.284449, 1.301673, 1.318898, 1.345965,
-1.373032, 1.400098, 1.427165, 1.439469, 1.451772, 1.464075, 1.476378,
-1.496063, 1.515748, 1.535433, 1.555118, 1.584646, 1.614173, 1.643701,
-1.673228, 1.685531, 1.697835, 1.710138, 1.722441, 1.739665, 1.756890,
-1.774114, 1.791339, 1.813484, 1.835630, 1.857776, 1.879921, 1.899606,
-1.919291, 1.938976, 1.958661, 1.975886, 1.993110, 2.010335, 2.027559,
-2.049705, 2.071851, 2.093996, 2.116142, 2.133366, 2.150591, 2.167815,
-2.185039, 2.212106, 2.239173, 2.266240, 2.293307, 2.315453, 2.337598,
-2.359744, 2.381890, 2.391732, 2.401575, 2.411417, 2.421260, 2.440945,
-2.460630, 2.480315, 2.500000, 2.522146, 2.544291, 2.566437, 2.588583,
-2.613189, 2.637795, 2.662402, 2.687008, 0.669291, 0.669291, 0.669291,
-0.669291, 0.669291, 0.669291, 0.669291, 0.669291, 0.669291, 0.664370,
-0.659449, 0.654528, 0.649606, 0.654528, 0.659449, 0.664370, 0.669291,
-0.664370, 0.659449, 0.654528, 0.649606, 0.649606, 0.649606, 0.649606,
-0.649606, 0.674213, 0.698819, 0.723425, 0.748031, 0.762795, 0.777559,
-0.792323, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827, 0.910433,
-0.935039, 0.959646, 0.984252, 0.999016, 1.013780, 1.028543, 1.043307,
-1.062992, 1.082677, 1.102362, 1.122047, 1.146654, 1.171260, 1.195866,
-1.220472, 1.235236, 1.250000, 1.264764, 1.279528, 1.294291, 1.309055,
-1.323819, 1.338583, 1.363189, 1.387795, 1.412402, 1.437008, 1.451772,
-1.466535, 1.481299, 1.496063, 1.515748, 1.535433, 1.555118, 1.574803,
-1.604331, 1.633858, 1.663386, 1.692913, 1.707677, 1.722441, 1.737205,
-1.751969, 1.766732, 1.781496, 1.796260, 1.811024, 1.835630, 1.860236,
-1.884843, 1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.002953,
-2.017717, 2.032480, 2.047244, 2.071851, 2.096457, 2.121063, 2.145669,
-2.160433, 2.175197, 2.189961, 2.204724, 2.229331, 2.253937, 2.278543,
-2.303150, 2.327756, 2.352362, 2.376969, 2.401575, 2.411417, 2.421260,
-2.431102, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.544291,
-2.568898, 2.593504, 2.618110, 2.637795, 2.657480, 2.677165, 2.696851,
-0.688976, 0.688976, 0.688976, 0.688976, 0.688976, 0.688976, 0.688976,
-0.688976, 0.688976, 0.681595, 0.674213, 0.666831, 0.659449, 0.666831,
-0.674213, 0.681595, 0.688976, 0.681595, 0.674213, 0.666831, 0.659449,
-0.659449, 0.659449, 0.659449, 0.659449, 0.686516, 0.713583, 0.740650,
-0.767717, 0.784941, 0.802165, 0.819390, 0.836614, 0.851378, 0.866142,
-0.880906, 0.895669, 0.922736, 0.949803, 0.976870, 1.003937, 1.016240,
-1.028543, 1.040846, 1.053150, 1.072835, 1.092520, 1.112205, 1.131890,
-1.158957, 1.186024, 1.213091, 1.240157, 1.257382, 1.274606, 1.291831,
-1.309055, 1.321358, 1.333661, 1.345965, 1.358268, 1.380413, 1.402559,
-1.424705, 1.446850, 1.464075, 1.481299, 1.498524, 1.515748, 1.535433,
-1.555118, 1.574803, 1.594488, 1.624016, 1.653543, 1.683071, 1.712598,
-1.729823, 1.747047, 1.764272, 1.781496, 1.793799, 1.806102, 1.818406,
-1.830709, 1.857776, 1.884843, 1.911909, 1.938976, 1.958661, 1.978346,
-1.998031, 2.017717, 2.030020, 2.042323, 2.054626, 2.066929, 2.093996,
-2.121063, 2.148130, 2.175197, 2.187500, 2.199803, 2.212106, 2.224410,
-2.246555, 2.268701, 2.290847, 2.312992, 2.340059, 2.367126, 2.394193,
-2.421260, 2.431102, 2.440945, 2.450787, 2.460630, 2.480315, 2.500000,
-2.519685, 2.539370, 2.566437, 2.593504, 2.620571, 2.647638, 2.662402,
-2.677166, 2.691929, 2.706693, 0.708661, 0.708661, 0.708661, 0.708661,
-0.708661, 0.708661, 0.708661, 0.708661, 0.708661, 0.698819, 0.688976,
-0.679134, 0.669291, 0.679134, 0.688976, 0.698819, 0.708661, 0.698819,
-0.688976, 0.679134, 0.669291, 0.669291, 0.669291, 0.669291, 0.669291,
-0.698819, 0.728346, 0.757874, 0.787402, 0.807087, 0.826772, 0.846457,
-0.866142, 0.875984, 0.885827, 0.895669, 0.905512, 0.935039, 0.964567,
-0.994094, 1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.082677,
-1.102362, 1.122047, 1.141732, 1.171260, 1.200787, 1.230315, 1.259843,
-1.279528, 1.299213, 1.318898, 1.338583, 1.348425, 1.358268, 1.368110,
-1.377953, 1.397638, 1.417323, 1.437008, 1.456693, 1.476378, 1.496063,
-1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.643701,
-1.673228, 1.702756, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024,
-1.820866, 1.830709, 1.840551, 1.850394, 1.879921, 1.909449, 1.938976,
-1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.057087, 2.066929,
-2.076772, 2.086614, 2.116142, 2.145669, 2.175197, 2.204724, 2.214567,
-2.224410, 2.234252, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
-2.352362, 2.381890, 2.411417, 2.440945, 2.450787, 2.460630, 2.470472,
-2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110,
-2.647638, 2.677166, 2.687008, 2.696851, 2.706693, 2.716536, 0.728346,
-0.728346, 0.728346, 0.728346, 0.728346, 0.728346, 0.728346, 0.728346,
-0.728346, 0.720965, 0.713583, 0.706201, 0.698819, 0.706201, 0.713583,
-0.720965, 0.728346, 0.720965, 0.713583, 0.706201, 0.698819, 0.698819,
-0.698819, 0.698819, 0.698819, 0.720965, 0.743110, 0.765256, 0.787402,
-0.807087, 0.826772, 0.846457, 0.866142, 0.878445, 0.890748, 0.903051,
-0.915354, 0.942421, 0.969488, 0.996555, 1.023622, 1.033465, 1.043307,
-1.053150, 1.062992, 1.085138, 1.107283, 1.129429, 1.151575, 1.178642,
-1.205709, 1.232776, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583,
-1.350886, 1.363189, 1.375492, 1.387795, 1.405020, 1.422244, 1.439469,
-1.456693, 1.478839, 1.500984, 1.523130, 1.545276, 1.564961, 1.584646,
-1.604331, 1.624016, 1.648622, 1.673228, 1.697835, 1.722441, 1.744587,
-1.766732, 1.788878, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394,
-1.877461, 1.904528, 1.931594, 1.958661, 1.980807, 2.002953, 2.025099,
-2.047244, 2.059547, 2.071851, 2.084154, 2.096457, 2.121063, 2.145669,
-2.170276, 2.194882, 2.209646, 2.224410, 2.239173, 2.253937, 2.271161,
-2.288386, 2.305610, 2.322835, 2.349902, 2.376969, 2.404035, 2.431102,
-2.443406, 2.455709, 2.468012, 2.480315, 2.500000, 2.519685, 2.539370,
-2.559055, 2.586122, 2.613189, 2.640256, 2.667323, 2.679626, 2.691929,
-2.704232, 2.716536, 0.748031, 0.748031, 0.748031, 0.748031, 0.748031,
-0.748031, 0.748031, 0.748031, 0.748031, 0.743110, 0.738189, 0.733268,
-0.728346, 0.733268, 0.738189, 0.743110, 0.748031, 0.743110, 0.738189,
-0.733268, 0.728346, 0.728346, 0.728346, 0.728346, 0.728346, 0.743110,
-0.757874, 0.772638, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142,
-0.880906, 0.895669, 0.910433, 0.925197, 0.949803, 0.974409, 0.999016,
-1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.087598, 1.112205,
-1.136811, 1.161417, 1.186024, 1.210630, 1.235236, 1.259843, 1.279528,
-1.299213, 1.318898, 1.338583, 1.353346, 1.368110, 1.382874, 1.397638,
-1.412402, 1.427165, 1.441929, 1.456693, 1.481299, 1.505906, 1.530512,
-1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228,
-1.692913, 1.712598, 1.737205, 1.761811, 1.786417, 1.811024, 1.820866,
-1.830709, 1.840551, 1.850394, 1.875000, 1.899606, 1.924213, 1.948819,
-1.973425, 1.998031, 2.022638, 2.047244, 2.062008, 2.076772, 2.091536,
-2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410,
-2.244095, 2.263780, 2.278543, 2.293307, 2.308071, 2.322835, 2.347441,
-2.372047, 2.396654, 2.421260, 2.436024, 2.450787, 2.465551, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.583662, 2.608268, 2.632874,
-2.657480, 2.672244, 2.687008, 2.701772, 2.716536, 0.767717, 0.767717,
-0.767717, 0.767717, 0.767717, 0.767717, 0.767717, 0.767717, 0.767717,
-0.765256, 0.762795, 0.760335, 0.757874, 0.760335, 0.762795, 0.765256,
-0.767717, 0.765256, 0.762795, 0.760335, 0.757874, 0.757874, 0.757874,
-0.757874, 0.757874, 0.765256, 0.772638, 0.780020, 0.787402, 0.807087,
-0.826772, 0.846457, 0.866142, 0.883366, 0.900591, 0.917815, 0.935039,
-0.957185, 0.979331, 1.001476, 1.023622, 1.033465, 1.043307, 1.053150,
-1.062992, 1.090059, 1.117126, 1.144193, 1.171260, 1.193406, 1.215551,
-1.237697, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.355807,
-1.373032, 1.390256, 1.407480, 1.419783, 1.432087, 1.444390, 1.456693,
-1.483760, 1.510827, 1.537894, 1.564961, 1.584646, 1.604331, 1.624016,
-1.643701, 1.658465, 1.673228, 1.687992, 1.702756, 1.729823, 1.756890,
-1.783957, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.872539,
-1.894685, 1.916831, 1.938976, 1.966043, 1.993110, 2.020177, 2.047244,
-2.064469, 2.081693, 2.098917, 2.116142, 2.130906, 2.145669, 2.160433,
-2.175197, 2.199803, 2.224410, 2.249016, 2.273622, 2.285925, 2.298228,
-2.310532, 2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.428642,
-2.445866, 2.463091, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
-2.581201, 2.603347, 2.625492, 2.647638, 2.664862, 2.682087, 2.699311,
-2.716536, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402,
-0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402,
-0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402,
-0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402, 0.787402,
-0.787402, 0.787402, 0.807087, 0.826772, 0.846457, 0.866142, 0.885827,
-0.905512, 0.925197, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622,
-1.033465, 1.043307, 1.053150, 1.062992, 1.092520, 1.122047, 1.151575,
-1.181102, 1.200787, 1.220472, 1.240157, 1.259843, 1.279528, 1.299213,
-1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323, 1.427165,
-1.437008, 1.446850, 1.456693, 1.486220, 1.515748, 1.545276, 1.574803,
-1.594488, 1.614173, 1.633858, 1.653543, 1.663386, 1.673228, 1.683071,
-1.692913, 1.722441, 1.751969, 1.781496, 1.811024, 1.820866, 1.830709,
-1.840551, 1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.958661,
-1.988189, 2.017717, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984,
-2.135827, 2.145669, 2.155512, 2.165354, 2.194882, 2.224410, 2.253937,
-2.283465, 2.293307, 2.303150, 2.312992, 2.322835, 2.342520, 2.362205,
-2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
-2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
-2.657480, 2.677166, 2.696851, 2.716536, 0.807087, 0.804626, 0.802165,
-0.799705, 0.797244, 0.799705, 0.802165, 0.804626, 0.807087, 0.804626,
-0.802165, 0.799705, 0.797244, 0.797244, 0.797244, 0.797244, 0.797244,
-0.797244, 0.797244, 0.797244, 0.797244, 0.799705, 0.802165, 0.804626,
-0.807087, 0.807087, 0.807087, 0.807087, 0.807087, 0.819390, 0.831693,
-0.843996, 0.856299, 0.878445, 0.900591, 0.922736, 0.944882, 0.964567,
-0.984252, 1.003937, 1.023622, 1.033465, 1.043307, 1.053150, 1.062992,
-1.090059, 1.117126, 1.144193, 1.171260, 1.193406, 1.215551, 1.237697,
-1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.355807, 1.373032,
-1.390256, 1.407480, 1.419783, 1.432087, 1.444390, 1.456693, 1.486220,
-1.515748, 1.545276, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543,
-1.663386, 1.673228, 1.683071, 1.692913, 1.722441, 1.751969, 1.781496,
-1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.872539, 1.894685,
-1.916831, 1.938976, 1.963583, 1.988189, 2.012795, 2.037402, 2.057087,
-2.076772, 2.096457, 2.116142, 2.130906, 2.145669, 2.160433, 2.175197,
-2.199803, 2.224410, 2.249016, 2.273622, 2.285925, 2.298228, 2.310532,
-2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.431102, 2.450787,
-2.470472, 2.490158, 2.509843, 2.529528, 2.549213, 2.568898, 2.586122,
-2.603347, 2.620571, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
-0.826772, 0.821850, 0.816929, 0.812008, 0.807087, 0.812008, 0.816929,
-0.821850, 0.826772, 0.821850, 0.816929, 0.812008, 0.807087, 0.807087,
-0.807087, 0.807087, 0.807087, 0.807087, 0.807087, 0.807087, 0.807087,
-0.812008, 0.816929, 0.821850, 0.826772, 0.826772, 0.826772, 0.826772,
-0.826772, 0.831693, 0.836614, 0.841535, 0.846457, 0.871063, 0.895669,
-0.920276, 0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.033465,
-1.043307, 1.053150, 1.062992, 1.087598, 1.112205, 1.136811, 1.161417,
-1.186024, 1.210630, 1.235236, 1.259843, 1.279528, 1.299213, 1.318898,
-1.338583, 1.353346, 1.368110, 1.382874, 1.397638, 1.412402, 1.427165,
-1.441929, 1.456693, 1.486220, 1.515748, 1.545276, 1.574803, 1.594488,
-1.614173, 1.633858, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913,
-1.722441, 1.751969, 1.781496, 1.811024, 1.820866, 1.830709, 1.840551,
-1.850394, 1.875000, 1.899606, 1.924213, 1.948819, 1.968504, 1.988189,
-2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984,
-2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780,
-2.278543, 2.293307, 2.308071, 2.322835, 2.347441, 2.372047, 2.396654,
-2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370,
-2.559055, 2.578740, 2.593504, 2.608268, 2.623032, 2.637795, 2.657480,
-2.677166, 2.696851, 2.716536, 0.846457, 0.839075, 0.831693, 0.824311,
-0.816929, 0.824311, 0.831693, 0.839075, 0.846457, 0.839075, 0.831693,
-0.824311, 0.816929, 0.816929, 0.816929, 0.816929, 0.816929, 0.816929,
-0.816929, 0.816929, 0.816929, 0.824311, 0.831693, 0.839075, 0.846457,
-0.846457, 0.846457, 0.846457, 0.846457, 0.843996, 0.841535, 0.839075,
-0.836614, 0.863681, 0.890748, 0.917815, 0.944882, 0.964567, 0.984252,
-1.003937, 1.023622, 1.033465, 1.043307, 1.053150, 1.062992, 1.085138,
-1.107283, 1.129429, 1.151575, 1.178642, 1.205709, 1.232776, 1.259843,
-1.279528, 1.299213, 1.318898, 1.338583, 1.350886, 1.363189, 1.375492,
-1.387795, 1.405020, 1.422244, 1.439469, 1.456693, 1.486220, 1.515748,
-1.545276, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.663386,
-1.673228, 1.683071, 1.692913, 1.722441, 1.751969, 1.781496, 1.811024,
-1.820866, 1.830709, 1.840551, 1.850394, 1.877461, 1.904528, 1.931594,
-1.958661, 1.973425, 1.988189, 2.002953, 2.017717, 2.037402, 2.057087,
-2.076772, 2.096457, 2.121063, 2.145669, 2.170276, 2.194882, 2.209646,
-2.224410, 2.239173, 2.253937, 2.271161, 2.288386, 2.305610, 2.322835,
-2.349902, 2.376969, 2.404035, 2.431102, 2.450787, 2.470472, 2.490157,
-2.509843, 2.529528, 2.549213, 2.568898, 2.588583, 2.600886, 2.613189,
-2.625492, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 0.866142,
-0.856299, 0.846457, 0.836614, 0.826772, 0.836614, 0.846457, 0.856299,
-0.866142, 0.856299, 0.846457, 0.836614, 0.826772, 0.826772, 0.826772,
-0.826772, 0.826772, 0.826772, 0.826772, 0.826772, 0.826772, 0.836614,
-0.846457, 0.856299, 0.866142, 0.866142, 0.866142, 0.866142, 0.866142,
-0.856299, 0.846457, 0.836614, 0.826772, 0.856299, 0.885827, 0.915354,
-0.944882, 0.964567, 0.984252, 1.003937, 1.023622, 1.033465, 1.043307,
-1.053150, 1.062992, 1.082677, 1.102362, 1.122047, 1.141732, 1.171260,
-1.200787, 1.230315, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583,
-1.348425, 1.358268, 1.368110, 1.377953, 1.397638, 1.417323, 1.437008,
-1.456693, 1.486220, 1.515748, 1.545276, 1.574803, 1.594488, 1.614173,
-1.633858, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913, 1.722441,
-1.751969, 1.781496, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394,
-1.879921, 1.909449, 1.938976, 1.968504, 1.978346, 1.988189, 1.998031,
-2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.116142, 2.145669,
-2.175197, 2.204724, 2.214567, 2.224410, 2.234252, 2.244095, 2.263780,
-2.283465, 2.303150, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945,
-2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
-2.598425, 2.608268, 2.618110, 2.627953, 2.637795, 2.657480, 2.677166,
-2.696851, 2.716536, 0.875984, 0.868602, 0.861220, 0.853839, 0.846457,
-0.853839, 0.861220, 0.868602, 0.875984, 0.871063, 0.866142, 0.861220,
-0.856299, 0.856299, 0.856299, 0.856299, 0.856299, 0.856299, 0.856299,
-0.856299, 0.856299, 0.863681, 0.871063, 0.878445, 0.885827, 0.885827,
-0.885827, 0.885827, 0.885827, 0.878445, 0.871063, 0.863681, 0.856299,
-0.880906, 0.905512, 0.930118, 0.954724, 0.976870, 0.999016, 1.021161,
-1.043307, 1.053150, 1.062992, 1.072835, 1.082677, 1.104823, 1.126969,
-1.149114, 1.171260, 1.198327, 1.225394, 1.252461, 1.279528, 1.299213,
-1.318898, 1.338583, 1.358268, 1.370571, 1.382874, 1.395177, 1.407480,
-1.427165, 1.446850, 1.466535, 1.486220, 1.510827, 1.535433, 1.560039,
-1.584646, 1.604331, 1.624016, 1.643701, 1.663386, 1.678150, 1.692913,
-1.707677, 1.722441, 1.747047, 1.771654, 1.796260, 1.820866, 1.833169,
-1.845472, 1.857776, 1.870079, 1.899606, 1.929134, 1.958661, 1.988189,
-2.000492, 2.012795, 2.025099, 2.037402, 2.054626, 2.071851, 2.089075,
-2.106299, 2.133366, 2.160433, 2.187500, 2.214567, 2.226870, 2.239173,
-2.251476, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.369587,
-2.396654, 2.423720, 2.450787, 2.470472, 2.490158, 2.509843, 2.529528,
-2.549213, 2.568898, 2.588583, 2.608268, 2.623031, 2.637795, 2.652559,
-2.667323, 2.684547, 2.701772, 2.718996, 2.736221, 0.885827, 0.880906,
-0.875984, 0.871063, 0.866142, 0.871063, 0.875984, 0.880906, 0.885827,
-0.885827, 0.885827, 0.885827, 0.885827, 0.885827, 0.885827, 0.885827,
-0.885827, 0.885827, 0.885827, 0.885827, 0.885827, 0.890748, 0.895669,
-0.900591, 0.905512, 0.905512, 0.905512, 0.905512, 0.905512, 0.900591,
-0.895669, 0.890748, 0.885827, 0.905512, 0.925197, 0.944882, 0.964567,
-0.989173, 1.013780, 1.038386, 1.062992, 1.072835, 1.082677, 1.092520,
-1.102362, 1.126969, 1.151575, 1.176181, 1.200787, 1.225394, 1.250000,
-1.274606, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.392717,
-1.407480, 1.422244, 1.437008, 1.456693, 1.476378, 1.496063, 1.515748,
-1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543,
-1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339,
-1.811024, 1.830709, 1.845472, 1.860236, 1.875000, 1.889764, 1.919291,
-1.948819, 1.978346, 2.007874, 2.022638, 2.037402, 2.052165, 2.066929,
-2.081693, 2.096457, 2.111221, 2.125984, 2.150591, 2.175197, 2.199803,
-2.224410, 2.239173, 2.253937, 2.268701, 2.283465, 2.303150, 2.322835,
-2.342520, 2.362205, 2.386811, 2.411417, 2.436024, 2.460630, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
-2.637795, 2.657480, 2.677165, 2.696851, 2.711614, 2.726378, 2.741142,
-2.755906, 0.895669, 0.893209, 0.890748, 0.888287, 0.885827, 0.888287,
-0.890748, 0.893209, 0.895669, 0.900591, 0.905512, 0.910433, 0.915354,
-0.915354, 0.915354, 0.915354, 0.915354, 0.915354, 0.915354, 0.915354,
-0.915354, 0.917815, 0.920276, 0.922736, 0.925197, 0.925197, 0.925197,
-0.925197, 0.925197, 0.922736, 0.920276, 0.917815, 0.915354, 0.930118,
-0.944882, 0.959646, 0.974409, 1.001476, 1.028543, 1.055610, 1.082677,
-1.092520, 1.102362, 1.112205, 1.122047, 1.149114, 1.176181, 1.203248,
-1.230315, 1.252461, 1.274606, 1.296752, 1.318898, 1.338583, 1.358268,
-1.377953, 1.397638, 1.414862, 1.432087, 1.449311, 1.466535, 1.486220,
-1.505906, 1.525591, 1.545276, 1.560039, 1.574803, 1.589567, 1.604331,
-1.624016, 1.643701, 1.663386, 1.683071, 1.707677, 1.732283, 1.756890,
-1.781496, 1.796260, 1.811024, 1.825787, 1.840551, 1.857776, 1.875000,
-1.892224, 1.909449, 1.938976, 1.968504, 1.998031, 2.027559, 2.044784,
-2.062008, 2.079232, 2.096457, 2.108760, 2.121063, 2.133366, 2.145669,
-2.167815, 2.189961, 2.212106, 2.234252, 2.251476, 2.268701, 2.285925,
-2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.404035, 2.426181,
-2.448327, 2.470472, 2.490157, 2.509843, 2.529528, 2.549213, 2.568898,
-2.588583, 2.608268, 2.627953, 2.652559, 2.677166, 2.701772, 2.726378,
-2.738681, 2.750984, 2.763287, 2.775591, 0.905512, 0.905512, 0.905512,
-0.905512, 0.905512, 0.905512, 0.905512, 0.905512, 0.905512, 0.915354,
-0.925197, 0.935039, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882,
-0.944882, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882,
-0.944882, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882, 0.944882,
-0.944882, 0.944882, 0.954724, 0.964567, 0.974409, 0.984252, 1.013780,
-1.043307, 1.072835, 1.102362, 1.112205, 1.122047, 1.131890, 1.141732,
-1.171260, 1.200787, 1.230315, 1.259843, 1.279528, 1.299213, 1.318898,
-1.338583, 1.358268, 1.377953, 1.397638, 1.417323, 1.437008, 1.456693,
-1.476378, 1.496063, 1.515748, 1.535433, 1.555118, 1.574803, 1.584646,
-1.594488, 1.604331, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
-1.722441, 1.751969, 1.781496, 1.811024, 1.820866, 1.830709, 1.840551,
-1.850394, 1.870079, 1.889764, 1.909449, 1.929134, 1.958661, 1.988189,
-2.017717, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.135827,
-2.145669, 2.155512, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
-2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890,
-2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685,
-2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.667323,
-2.696851, 2.726378, 2.755906, 2.765748, 2.775591, 2.785433, 2.795276,
-0.935039, 0.935039, 0.935039, 0.935039, 0.935039, 0.935039, 0.935039,
-0.935039, 0.935039, 0.942421, 0.949803, 0.957185, 0.964567, 0.962106,
-0.959646, 0.957185, 0.954724, 0.957185, 0.959646, 0.962106, 0.964567,
-0.964567, 0.964567, 0.964567, 0.964567, 0.962106, 0.959646, 0.957185,
-0.954724, 0.957185, 0.959646, 0.962106, 0.964567, 0.971949, 0.979331,
-0.986713, 0.994094, 1.021161, 1.048228, 1.075295, 1.102362, 1.112205,
-1.122047, 1.131890, 1.141732, 1.168799, 1.195866, 1.222933, 1.250000,
-1.269685, 1.289370, 1.309055, 1.328740, 1.348425, 1.368110, 1.387795,
-1.407480, 1.429626, 1.451772, 1.473917, 1.496063, 1.515748, 1.535433,
-1.555118, 1.574803, 1.587106, 1.599409, 1.611713, 1.624016, 1.643701,
-1.663386, 1.683071, 1.702756, 1.727362, 1.751969, 1.776575, 1.801181,
-1.815945, 1.830709, 1.845472, 1.860236, 1.879921, 1.899606, 1.919291,
-1.938976, 1.963583, 1.988189, 2.012795, 2.037402, 2.059547, 2.081693,
-2.103839, 2.125984, 2.138287, 2.150591, 2.162894, 2.175197, 2.194882,
-2.214567, 2.234252, 2.253937, 2.271161, 2.288386, 2.305610, 2.322835,
-2.344980, 2.367126, 2.389272, 2.411417, 2.428642, 2.445866, 2.463091,
-2.480315, 2.502461, 2.524606, 2.546752, 2.568898, 2.588583, 2.608268,
-2.627953, 2.647638, 2.672244, 2.696851, 2.721457, 2.746063, 2.758366,
-2.770669, 2.782973, 2.795276, 0.964567, 0.964567, 0.964567, 0.964567,
-0.964567, 0.964567, 0.964567, 0.964567, 0.964567, 0.969488, 0.974409,
-0.979331, 0.984252, 0.979331, 0.974409, 0.969488, 0.964567, 0.969488,
-0.974409, 0.979331, 0.984252, 0.984252, 0.984252, 0.984252, 0.984252,
-0.979331, 0.974409, 0.969488, 0.964567, 0.969488, 0.974409, 0.979331,
-0.984252, 0.989173, 0.994094, 0.999016, 1.003937, 1.028543, 1.053150,
-1.077756, 1.102362, 1.112205, 1.122047, 1.131890, 1.141732, 1.166339,
-1.190945, 1.215551, 1.240157, 1.259843, 1.279528, 1.299213, 1.318898,
-1.338583, 1.358268, 1.377953, 1.397638, 1.422244, 1.446850, 1.471457,
-1.496063, 1.515748, 1.535433, 1.555118, 1.574803, 1.589567, 1.604331,
-1.619094, 1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283,
-1.751969, 1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079,
-1.889764, 1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874,
-2.027559, 2.052165, 2.076772, 2.101378, 2.125984, 2.140748, 2.155512,
-2.170276, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.278543,
-2.293307, 2.308071, 2.322835, 2.347441, 2.372047, 2.396654, 2.421260,
-2.436024, 2.450787, 2.465551, 2.480315, 2.504921, 2.529528, 2.554134,
-2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677165, 2.696851,
-2.716535, 2.736221, 2.750984, 2.765748, 2.780512, 2.795276, 0.994094,
-0.994094, 0.994094, 0.994094, 0.994094, 0.994094, 0.994094, 0.994094,
-0.994094, 0.996555, 0.999016, 1.001476, 1.003937, 0.996555, 0.989173,
-0.981791, 0.974409, 0.981791, 0.989173, 0.996555, 1.003937, 1.003937,
-1.003937, 1.003937, 1.003937, 0.996555, 0.989173, 0.981791, 0.974409,
-0.981791, 0.989173, 0.996555, 1.003937, 1.006398, 1.008858, 1.011319,
-1.013780, 1.035925, 1.058071, 1.080217, 1.102362, 1.112205, 1.122047,
-1.131890, 1.141732, 1.163878, 1.186024, 1.208169, 1.230315, 1.250000,
-1.269685, 1.289370, 1.309055, 1.328740, 1.348425, 1.368110, 1.387795,
-1.414862, 1.441929, 1.468996, 1.496063, 1.515748, 1.535433, 1.555118,
-1.574803, 1.592028, 1.609252, 1.626476, 1.643701, 1.663386, 1.683071,
-1.702756, 1.722441, 1.737205, 1.751969, 1.766732, 1.781496, 1.806102,
-1.830709, 1.855315, 1.879921, 1.899606, 1.919291, 1.938976, 1.958661,
-1.973425, 1.988189, 2.002953, 2.017717, 2.044784, 2.071851, 2.098917,
-2.125984, 2.143209, 2.160433, 2.177658, 2.194882, 2.214567, 2.234252,
-2.253937, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.349902,
-2.376969, 2.404035, 2.431102, 2.443406, 2.455709, 2.468012, 2.480315,
-2.507382, 2.534449, 2.561516, 2.588583, 2.608268, 2.627953, 2.647638,
-2.667323, 2.682087, 2.696851, 2.711614, 2.726378, 2.743603, 2.760827,
-2.778051, 2.795276, 1.023622, 1.023622, 1.023622, 1.023622, 1.023622,
-1.023622, 1.023622, 1.023622, 1.023622, 1.023622, 1.023622, 1.023622,
-1.023622, 1.013780, 1.003937, 0.994094, 0.984252, 0.994094, 1.003937,
-1.013780, 1.023622, 1.023622, 1.023622, 1.023622, 1.023622, 1.013780,
-1.003937, 0.994094, 0.984252, 0.994094, 1.003937, 1.013780, 1.023622,
-1.023622, 1.023622, 1.023622, 1.023622, 1.043307, 1.062992, 1.082677,
-1.102362, 1.112205, 1.122047, 1.131890, 1.141732, 1.161417, 1.181102,
-1.200787, 1.220472, 1.240157, 1.259843, 1.279528, 1.299213, 1.318898,
-1.338583, 1.358268, 1.377953, 1.407480, 1.437008, 1.466535, 1.496063,
-1.515748, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858,
-1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.742126, 1.751969,
-1.761811, 1.771654, 1.801181, 1.830709, 1.860236, 1.889764, 1.909449,
-1.929134, 1.948819, 1.968504, 1.978346, 1.988189, 1.998031, 2.007874,
-2.037402, 2.066929, 2.096457, 2.125984, 2.145669, 2.165354, 2.185039,
-2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.293307, 2.303150,
-2.312992, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945, 2.450787,
-2.460630, 2.470472, 2.480315, 2.509843, 2.539370, 2.568898, 2.598425,
-2.618110, 2.637795, 2.657480, 2.677166, 2.687008, 2.696851, 2.706693,
-2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 1.043307, 1.040846,
-1.038386, 1.035925, 1.033465, 1.035925, 1.038386, 1.040846, 1.043307,
-1.043307, 1.043307, 1.043307, 1.043307, 1.035925, 1.028543, 1.021161,
-1.013780, 1.018701, 1.023622, 1.028543, 1.033465, 1.035925, 1.038386,
-1.040846, 1.043307, 1.035925, 1.028543, 1.021161, 1.013780, 1.018701,
-1.023622, 1.028543, 1.033465, 1.035925, 1.038386, 1.040846, 1.043307,
-1.058071, 1.072835, 1.087598, 1.102362, 1.114665, 1.126969, 1.139272,
-1.151575, 1.168799, 1.186024, 1.203248, 1.220472, 1.242618, 1.264764,
-1.286910, 1.309055, 1.326280, 1.343504, 1.360728, 1.377953, 1.407480,
-1.437008, 1.466535, 1.496063, 1.515748, 1.535433, 1.555118, 1.574803,
-1.594488, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913, 1.712598,
-1.732283, 1.744587, 1.756890, 1.769193, 1.781496, 1.806102, 1.830709,
-1.855315, 1.879921, 1.899606, 1.919291, 1.938976, 1.958661, 1.970965,
-1.983268, 1.995571, 2.007874, 2.034941, 2.062008, 2.089075, 2.116142,
-2.138287, 2.160433, 2.182579, 2.204724, 2.221949, 2.239173, 2.256398,
-2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.349902, 2.376969,
-2.404035, 2.431102, 2.445866, 2.460630, 2.475394, 2.490158, 2.514764,
-2.539370, 2.563976, 2.588583, 2.608268, 2.627953, 2.647638, 2.667323,
-2.679626, 2.691929, 2.704232, 2.716536, 2.736221, 2.755906, 2.775591,
-2.795276, 1.062992, 1.058071, 1.053150, 1.048228, 1.043307, 1.048228,
-1.053150, 1.058071, 1.062992, 1.062992, 1.062992, 1.062992, 1.062992,
-1.058071, 1.053150, 1.048228, 1.043307, 1.043307, 1.043307, 1.043307,
-1.043307, 1.048228, 1.053150, 1.058071, 1.062992, 1.058071, 1.053150,
-1.048228, 1.043307, 1.043307, 1.043307, 1.043307, 1.043307, 1.048228,
-1.053150, 1.058071, 1.062992, 1.072835, 1.082677, 1.092520, 1.102362,
-1.117126, 1.131890, 1.146654, 1.161417, 1.176181, 1.190945, 1.205709,
-1.220472, 1.245079, 1.269685, 1.294291, 1.318898, 1.333661, 1.348425,
-1.363189, 1.377953, 1.407480, 1.437008, 1.466535, 1.496063, 1.515748,
-1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543,
-1.673228, 1.692913, 1.712598, 1.732283, 1.747047, 1.761811, 1.776575,
-1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764, 1.909449,
-1.929134, 1.948819, 1.963583, 1.978346, 1.993110, 2.007874, 2.032480,
-2.057087, 2.081693, 2.106299, 2.130906, 2.155512, 2.180118, 2.204724,
-2.219488, 2.234252, 2.249016, 2.263780, 2.278543, 2.293307, 2.308071,
-2.322835, 2.347441, 2.372047, 2.396654, 2.421260, 2.440945, 2.460630,
-2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
-2.618110, 2.637795, 2.657480, 2.672244, 2.687008, 2.701772, 2.716536,
-2.736221, 2.755906, 2.775591, 2.795276, 1.082677, 1.075295, 1.067913,
-1.060531, 1.053150, 1.060531, 1.067913, 1.075295, 1.082677, 1.082677,
-1.082677, 1.082677, 1.082677, 1.080217, 1.077756, 1.075295, 1.072835,
-1.067913, 1.062992, 1.058071, 1.053150, 1.060531, 1.067913, 1.075295,
-1.082677, 1.080217, 1.077756, 1.075295, 1.072835, 1.067913, 1.062992,
-1.058071, 1.053150, 1.060531, 1.067913, 1.075295, 1.082677, 1.087598,
-1.092520, 1.097441, 1.102362, 1.119587, 1.136811, 1.154035, 1.171260,
-1.183563, 1.195866, 1.208169, 1.220472, 1.247539, 1.274606, 1.301673,
-1.328740, 1.341043, 1.353346, 1.365650, 1.377953, 1.407480, 1.437008,
-1.466535, 1.496063, 1.515748, 1.535433, 1.555118, 1.574803, 1.594488,
-1.614173, 1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283,
-1.749508, 1.766732, 1.783957, 1.801181, 1.815945, 1.830709, 1.845472,
-1.860236, 1.879921, 1.899606, 1.919291, 1.938976, 1.956201, 1.973425,
-1.990650, 2.007874, 2.030020, 2.052165, 2.074311, 2.096457, 2.123524,
-2.150591, 2.177658, 2.204724, 2.217028, 2.229331, 2.241634, 2.253937,
-2.271161, 2.288386, 2.305610, 2.322835, 2.344980, 2.367126, 2.389272,
-2.411417, 2.436024, 2.460630, 2.485236, 2.509843, 2.524606, 2.539370,
-2.554134, 2.568898, 2.588583, 2.608268, 2.627953, 2.647638, 2.664862,
-2.682087, 2.699311, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
-1.102362, 1.092520, 1.082677, 1.072835, 1.062992, 1.072835, 1.082677,
-1.092520, 1.102362, 1.102362, 1.102362, 1.102362, 1.102362, 1.102362,
-1.102362, 1.102362, 1.102362, 1.092520, 1.082677, 1.072835, 1.062992,
-1.072835, 1.082677, 1.092520, 1.102362, 1.102362, 1.102362, 1.102362,
-1.102362, 1.092520, 1.082677, 1.072835, 1.062992, 1.072835, 1.082677,
-1.092520, 1.102362, 1.102362, 1.102362, 1.102362, 1.102362, 1.122047,
-1.141732, 1.161417, 1.181102, 1.190945, 1.200787, 1.210630, 1.220472,
-1.250000, 1.279528, 1.309055, 1.338583, 1.348425, 1.358268, 1.368110,
-1.377953, 1.407480, 1.437008, 1.466535, 1.496063, 1.515748, 1.535433,
-1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228,
-1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024,
-1.820866, 1.830709, 1.840551, 1.850394, 1.870079, 1.889764, 1.909449,
-1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244,
-2.066929, 2.086614, 2.116142, 2.145669, 2.175197, 2.204724, 2.214567,
-2.224410, 2.234252, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
-2.342520, 2.362205, 2.381890, 2.401575, 2.431102, 2.460630, 2.490157,
-2.519685, 2.529528, 2.539370, 2.549213, 2.559055, 2.578740, 2.598425,
-2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221,
-2.755906, 2.775591, 2.795276, 1.122047, 1.114665, 1.107283, 1.099902,
-1.092520, 1.099902, 1.107283, 1.114665, 1.122047, 1.122047, 1.122047,
-1.122047, 1.122047, 1.122047, 1.122047, 1.122047, 1.122047, 1.114665,
-1.107283, 1.099902, 1.092520, 1.097441, 1.102362, 1.107283, 1.112205,
-1.114665, 1.117126, 1.119587, 1.122047, 1.112205, 1.102362, 1.092520,
-1.082677, 1.092520, 1.102362, 1.112205, 1.122047, 1.122047, 1.122047,
-1.122047, 1.122047, 1.141732, 1.161417, 1.181102, 1.200787, 1.213091,
-1.225394, 1.237697, 1.250000, 1.277067, 1.304134, 1.331201, 1.358268,
-1.370571, 1.382874, 1.395177, 1.407480, 1.434547, 1.461614, 1.488681,
-1.515748, 1.532972, 1.550197, 1.567421, 1.584646, 1.606791, 1.628937,
-1.651083, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.769193,
-1.786417, 1.803642, 1.820866, 1.833169, 1.845472, 1.857776, 1.870079,
-1.889764, 1.909449, 1.929134, 1.948819, 1.970965, 1.993110, 2.015256,
-2.037402, 2.057087, 2.076772, 2.096457, 2.116142, 2.143209, 2.170276,
-2.197343, 2.224410, 2.236713, 2.249016, 2.261319, 2.273622, 2.293307,
-2.312992, 2.332677, 2.352362, 2.372047, 2.391732, 2.411417, 2.431103,
-2.458169, 2.485236, 2.512303, 2.539370, 2.549213, 2.559055, 2.568898,
-2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851,
-2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 1.141732,
-1.136811, 1.131890, 1.126969, 1.122047, 1.126969, 1.131890, 1.136811,
-1.141732, 1.141732, 1.141732, 1.141732, 1.141732, 1.141732, 1.141732,
-1.141732, 1.141732, 1.136811, 1.131890, 1.126969, 1.122047, 1.122047,
-1.122047, 1.122047, 1.122047, 1.126969, 1.131890, 1.136811, 1.141732,
-1.131890, 1.122047, 1.112205, 1.102362, 1.112205, 1.122047, 1.131890,
-1.141732, 1.141732, 1.141732, 1.141732, 1.141732, 1.161417, 1.181102,
-1.200787, 1.220472, 1.235236, 1.250000, 1.264764, 1.279528, 1.304134,
-1.328740, 1.353346, 1.377953, 1.392717, 1.407480, 1.422244, 1.437008,
-1.461614, 1.486220, 1.510827, 1.535433, 1.550197, 1.564961, 1.579724,
-1.594488, 1.619094, 1.643701, 1.668307, 1.692913, 1.712598, 1.732283,
-1.751969, 1.771654, 1.786417, 1.801181, 1.815945, 1.830709, 1.845472,
-1.860236, 1.875000, 1.889764, 1.909449, 1.929134, 1.948819, 1.968504,
-1.993110, 2.017717, 2.042323, 2.066929, 2.086614, 2.106299, 2.125984,
-2.145669, 2.170276, 2.194882, 2.219488, 2.244095, 2.258858, 2.273622,
-2.288386, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575,
-2.421260, 2.440945, 2.460630, 2.485236, 2.509843, 2.534449, 2.559055,
-2.568898, 2.578740, 2.588583, 2.598425, 2.618110, 2.637795, 2.657480,
-2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
-2.814961, 2.834646, 1.161417, 1.158957, 1.156496, 1.154035, 1.151575,
-1.154035, 1.156496, 1.158957, 1.161417, 1.161417, 1.161417, 1.161417,
-1.161417, 1.161417, 1.161417, 1.161417, 1.161417, 1.158957, 1.156496,
-1.154035, 1.151575, 1.146654, 1.141732, 1.136811, 1.131890, 1.139272,
-1.146654, 1.154035, 1.161417, 1.151575, 1.141732, 1.131890, 1.122047,
-1.131890, 1.141732, 1.151575, 1.161417, 1.161417, 1.161417, 1.161417,
-1.161417, 1.181102, 1.200787, 1.220472, 1.240157, 1.257382, 1.274606,
-1.291831, 1.309055, 1.331201, 1.353346, 1.375492, 1.397638, 1.414862,
-1.432087, 1.449311, 1.466535, 1.488681, 1.510827, 1.532972, 1.555118,
-1.567421, 1.579724, 1.592028, 1.604331, 1.631398, 1.658465, 1.685531,
-1.712598, 1.732283, 1.751969, 1.771654, 1.791339, 1.803642, 1.815945,
-1.828248, 1.840551, 1.857776, 1.875000, 1.892224, 1.909449, 1.929134,
-1.948819, 1.968504, 1.988189, 2.015256, 2.042323, 2.069390, 2.096457,
-2.116142, 2.135827, 2.155512, 2.175197, 2.197343, 2.219488, 2.241634,
-2.263780, 2.281004, 2.298228, 2.315453, 2.332677, 2.352362, 2.372047,
-2.391732, 2.411417, 2.431102, 2.450787, 2.470472, 2.490158, 2.512303,
-2.534449, 2.556595, 2.578740, 2.588583, 2.598425, 2.608268, 2.618110,
-2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906,
-2.775591, 2.795276, 2.814961, 2.834646, 2.854331, 1.181102, 1.181102,
-1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.181102,
-1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.181102,
-1.181102, 1.181102, 1.181102, 1.181102, 1.181102, 1.171260, 1.161417,
-1.151575, 1.141732, 1.151575, 1.161417, 1.171260, 1.181102, 1.171260,
-1.161417, 1.151575, 1.141732, 1.151575, 1.161417, 1.171260, 1.181102,
-1.181102, 1.181102, 1.181102, 1.181102, 1.200787, 1.220472, 1.240157,
-1.259843, 1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953,
-1.397638, 1.417323, 1.437008, 1.456693, 1.476378, 1.496063, 1.515748,
-1.535433, 1.555118, 1.574803, 1.584646, 1.594488, 1.604331, 1.614173,
-1.643701, 1.673228, 1.702756, 1.732283, 1.751969, 1.771654, 1.791339,
-1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.870079, 1.889764,
-1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.037402,
-2.066929, 2.096457, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
-2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
-2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.608268,
-2.618110, 2.627953, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
-2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331,
-2.874016, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
-1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
-1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
-1.200787, 1.193406, 1.186024, 1.178642, 1.171260, 1.176181, 1.181102,
-1.186024, 1.190945, 1.186024, 1.181102, 1.176181, 1.171260, 1.178642,
-1.186024, 1.193406, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
-1.215551, 1.230315, 1.245079, 1.259843, 1.279528, 1.299213, 1.318898,
-1.338583, 1.358268, 1.377953, 1.397638, 1.417323, 1.434547, 1.451772,
-1.468996, 1.486220, 1.505906, 1.525591, 1.545276, 1.564961, 1.579724,
-1.594488, 1.609252, 1.624016, 1.648622, 1.673228, 1.697835, 1.722441,
-1.742126, 1.761811, 1.781496, 1.801181, 1.815945, 1.830709, 1.845472,
-1.860236, 1.877461, 1.894685, 1.911909, 1.929134, 1.948819, 1.968504,
-1.988189, 2.007874, 2.037402, 2.066929, 2.096457, 2.125984, 2.143209,
-2.160433, 2.177658, 2.194882, 2.214567, 2.234252, 2.253937, 2.273622,
-2.295768, 2.317913, 2.340059, 2.362205, 2.379429, 2.396654, 2.413878,
-2.431102, 2.450787, 2.470472, 2.490157, 2.509843, 2.529528, 2.549213,
-2.568898, 2.588583, 2.603346, 2.618110, 2.632874, 2.647638, 2.667323,
-2.687008, 2.706693, 2.726378, 2.743603, 2.760827, 2.778051, 2.795276,
-2.814961, 2.834646, 2.854331, 2.874016, 1.220472, 1.220472, 1.220472,
-1.220472, 1.220472, 1.220472, 1.220472, 1.220472, 1.220472, 1.220472,
-1.220472, 1.220472, 1.220472, 1.220472, 1.220472, 1.220472, 1.220472,
-1.220472, 1.220472, 1.220472, 1.220472, 1.215551, 1.210630, 1.205709,
-1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787, 1.200787,
-1.200787, 1.200787, 1.205709, 1.210630, 1.215551, 1.220472, 1.220472,
-1.220472, 1.220472, 1.220472, 1.230315, 1.240157, 1.250000, 1.259843,
-1.279528, 1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638,
-1.417323, 1.432087, 1.446850, 1.461614, 1.476378, 1.496063, 1.515748,
-1.535433, 1.555118, 1.574803, 1.594488, 1.614173, 1.633858, 1.653543,
-1.673228, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.791339,
-1.811024, 1.830709, 1.850394, 1.870079, 1.884843, 1.899606, 1.914370,
-1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.037402, 2.066929,
-2.096457, 2.125984, 2.140748, 2.155512, 2.170276, 2.185039, 2.204724,
-2.224410, 2.244095, 2.263780, 2.288386, 2.312992, 2.337598, 2.362205,
-2.376969, 2.391732, 2.406496, 2.421260, 2.440945, 2.460630, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
-2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.750984,
-2.765748, 2.780512, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016,
-1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157,
-1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157,
-1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157,
-1.237697, 1.235236, 1.232776, 1.230315, 1.225394, 1.220472, 1.215551,
-1.210630, 1.215551, 1.220472, 1.225394, 1.230315, 1.232776, 1.235236,
-1.237697, 1.240157, 1.240157, 1.240157, 1.240157, 1.240157, 1.245079,
-1.250000, 1.254921, 1.259843, 1.279528, 1.299213, 1.318898, 1.338583,
-1.358268, 1.377953, 1.397638, 1.417323, 1.429626, 1.441929, 1.454232,
-1.466535, 1.486220, 1.505906, 1.525591, 1.545276, 1.569882, 1.594488,
-1.619094, 1.643701, 1.658465, 1.673228, 1.687992, 1.702756, 1.722441,
-1.742126, 1.761811, 1.781496, 1.806102, 1.830709, 1.855315, 1.879921,
-1.892224, 1.904528, 1.916831, 1.929134, 1.948819, 1.968504, 1.988189,
-2.007874, 2.037402, 2.066929, 2.096457, 2.125984, 2.138287, 2.150591,
-2.162894, 2.175197, 2.194882, 2.214567, 2.234252, 2.253937, 2.281004,
-2.308071, 2.335138, 2.362205, 2.374508, 2.386811, 2.399114, 2.411417,
-2.431102, 2.450787, 2.470472, 2.490158, 2.509843, 2.529528, 2.549213,
-2.568898, 2.593504, 2.618110, 2.642716, 2.667323, 2.687008, 2.706693,
-2.726378, 2.746063, 2.758366, 2.770669, 2.782973, 2.795276, 2.814961,
-2.834646, 2.854331, 2.874016, 1.259843, 1.259843, 1.259843, 1.259843,
-1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843,
-1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843,
-1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843,
-1.250000, 1.240157, 1.230315, 1.220472, 1.230315, 1.240157, 1.250000,
-1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843,
-1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.259843, 1.279528,
-1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323,
-1.427165, 1.437008, 1.446850, 1.456693, 1.476378, 1.496063, 1.515748,
-1.535433, 1.564961, 1.594488, 1.624016, 1.653543, 1.663386, 1.673228,
-1.683071, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.801181,
-1.830709, 1.860236, 1.889764, 1.899606, 1.909449, 1.919291, 1.929134,
-1.948819, 1.968504, 1.988189, 2.007874, 2.037402, 2.066929, 2.096457,
-2.125984, 2.135827, 2.145669, 2.155512, 2.165354, 2.185039, 2.204724,
-2.224410, 2.244095, 2.273622, 2.303150, 2.332677, 2.362205, 2.372047,
-2.381890, 2.391732, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110, 2.647638,
-2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.765748, 2.775591,
-2.785433, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 1.279528,
-1.279528, 1.279528, 1.279528, 1.279528, 1.279528, 1.279528, 1.279528,
-1.279528, 1.277067, 1.274606, 1.272146, 1.269685, 1.272146, 1.274606,
-1.277067, 1.279528, 1.279528, 1.279528, 1.279528, 1.279528, 1.279528,
-1.279528, 1.279528, 1.279528, 1.269685, 1.259843, 1.250000, 1.240157,
-1.250000, 1.259843, 1.269685, 1.279528, 1.277067, 1.274606, 1.272146,
-1.269685, 1.272146, 1.274606, 1.277067, 1.279528, 1.279528, 1.279528,
-1.279528, 1.279528, 1.291831, 1.304134, 1.316437, 1.328740, 1.348425,
-1.368110, 1.387795, 1.407480, 1.419783, 1.432087, 1.444390, 1.456693,
-1.476378, 1.496063, 1.515748, 1.535433, 1.562500, 1.589567, 1.616634,
-1.643701, 1.656004, 1.668307, 1.680610, 1.692913, 1.712598, 1.732283,
-1.751969, 1.771654, 1.801181, 1.830709, 1.860236, 1.889764, 1.902067,
-1.914370, 1.926673, 1.938976, 1.958661, 1.978346, 1.998031, 2.017717,
-2.042323, 2.066929, 2.091536, 2.116142, 2.128445, 2.140748, 2.153051,
-2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.271161, 2.298228,
-2.325295, 2.352362, 2.364665, 2.376969, 2.389272, 2.401575, 2.421260,
-2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
-2.586122, 2.613189, 2.640256, 2.667323, 2.689469, 2.711614, 2.733760,
-2.755906, 2.768209, 2.780512, 2.792815, 2.805118, 2.822343, 2.839567,
-2.856791, 2.874016, 1.299213, 1.299213, 1.299213, 1.299213, 1.299213,
-1.299213, 1.299213, 1.299213, 1.299213, 1.294291, 1.289370, 1.284449,
-1.279528, 1.284449, 1.289370, 1.294291, 1.299213, 1.299213, 1.299213,
-1.299213, 1.299213, 1.299213, 1.299213, 1.299213, 1.299213, 1.289370,
-1.279528, 1.269685, 1.259843, 1.269685, 1.279528, 1.289370, 1.299213,
-1.294291, 1.289370, 1.284449, 1.279528, 1.284449, 1.289370, 1.294291,
-1.299213, 1.299213, 1.299213, 1.299213, 1.299213, 1.304134, 1.309055,
-1.313976, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.412402,
-1.427165, 1.441929, 1.456693, 1.476378, 1.496063, 1.515748, 1.535433,
-1.560039, 1.584646, 1.609252, 1.633858, 1.648622, 1.663386, 1.678150,
-1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.801181, 1.830709,
-1.860236, 1.889764, 1.904528, 1.919291, 1.934055, 1.948819, 1.968504,
-1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299,
-2.121063, 2.135827, 2.150591, 2.165354, 2.185039, 2.204724, 2.224410,
-2.244095, 2.268701, 2.293307, 2.317913, 2.342520, 2.357284, 2.372047,
-2.386811, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
-2.519685, 2.539370, 2.559055, 2.583662, 2.608268, 2.632874, 2.657480,
-2.682087, 2.706693, 2.731299, 2.755906, 2.770669, 2.785433, 2.800197,
-2.814961, 2.829725, 2.844488, 2.859252, 2.874016, 1.318898, 1.318898,
-1.318898, 1.318898, 1.318898, 1.318898, 1.318898, 1.318898, 1.318898,
-1.311516, 1.304134, 1.296752, 1.289370, 1.296752, 1.304134, 1.311516,
-1.318898, 1.318898, 1.318898, 1.318898, 1.318898, 1.318898, 1.318898,
-1.318898, 1.318898, 1.309055, 1.299213, 1.289370, 1.279528, 1.289370,
-1.299213, 1.309055, 1.318898, 1.311516, 1.304134, 1.296752, 1.289370,
-1.296752, 1.304134, 1.311516, 1.318898, 1.318898, 1.318898, 1.318898,
-1.318898, 1.316437, 1.313976, 1.311516, 1.309055, 1.328740, 1.348425,
-1.368110, 1.387795, 1.405020, 1.422244, 1.439469, 1.456693, 1.476378,
-1.496063, 1.515748, 1.535433, 1.557579, 1.579724, 1.601870, 1.624016,
-1.641240, 1.658465, 1.675689, 1.692913, 1.712598, 1.732283, 1.751969,
-1.771654, 1.801181, 1.830709, 1.860236, 1.889764, 1.906988, 1.924213,
-1.941437, 1.958661, 1.978346, 1.998031, 2.017717, 2.037402, 2.052165,
-2.066929, 2.081693, 2.096457, 2.113681, 2.130906, 2.148130, 2.165354,
-2.185039, 2.204724, 2.224410, 2.244095, 2.266240, 2.288386, 2.310532,
-2.332677, 2.349902, 2.367126, 2.384350, 2.401575, 2.421260, 2.440945,
-2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.581201,
-2.603347, 2.625492, 2.647638, 2.674705, 2.701772, 2.728839, 2.755906,
-2.773130, 2.790354, 2.807579, 2.824803, 2.837106, 2.849410, 2.861713,
-2.874016, 1.338583, 1.338583, 1.338583, 1.338583, 1.338583, 1.338583,
-1.338583, 1.338583, 1.338583, 1.328740, 1.318898, 1.309055, 1.299213,
-1.309055, 1.318898, 1.328740, 1.338583, 1.338583, 1.338583, 1.338583,
-1.338583, 1.338583, 1.338583, 1.338583, 1.338583, 1.328740, 1.318898,
-1.309055, 1.299213, 1.309055, 1.318898, 1.328740, 1.338583, 1.328740,
-1.318898, 1.309055, 1.299213, 1.309055, 1.318898, 1.328740, 1.338583,
-1.338583, 1.338583, 1.338583, 1.338583, 1.328740, 1.318898, 1.309055,
-1.299213, 1.318898, 1.338583, 1.358268, 1.377953, 1.397638, 1.417323,
-1.437008, 1.456693, 1.476378, 1.496063, 1.515748, 1.535433, 1.555118,
-1.574803, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
-1.712598, 1.732283, 1.751969, 1.771654, 1.801181, 1.830709, 1.860236,
-1.889764, 1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874,
-2.027559, 2.047244, 2.057087, 2.066929, 2.076772, 2.086614, 2.106299,
-2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
-2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890,
-2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685,
-2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.667323,
-2.696851, 2.726378, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646,
-2.844488, 2.854331, 2.864173, 2.874016, 1.358268, 1.358268, 1.358268,
-1.358268, 1.358268, 1.358268, 1.358268, 1.358268, 1.358268, 1.350886,
-1.343504, 1.336122, 1.328740, 1.333661, 1.338583, 1.343504, 1.348425,
-1.350886, 1.353346, 1.355807, 1.358268, 1.355807, 1.353346, 1.350886,
-1.348425, 1.343504, 1.338583, 1.333661, 1.328740, 1.336122, 1.343504,
-1.350886, 1.358268, 1.350886, 1.343504, 1.336122, 1.328740, 1.336122,
-1.343504, 1.350886, 1.358268, 1.358268, 1.358268, 1.358268, 1.358268,
-1.350886, 1.343504, 1.336122, 1.328740, 1.348425, 1.368110, 1.387795,
-1.407480, 1.424705, 1.441929, 1.459154, 1.476378, 1.498524, 1.520669,
-1.542815, 1.564961, 1.582185, 1.599409, 1.616634, 1.633858, 1.653543,
-1.673228, 1.692913, 1.712598, 1.734744, 1.756890, 1.779035, 1.801181,
-1.825787, 1.850394, 1.875000, 1.899606, 1.919291, 1.938976, 1.958661,
-1.978346, 1.998031, 2.017717, 2.037402, 2.057087, 2.071851, 2.086614,
-2.101378, 2.116142, 2.133366, 2.150591, 2.167815, 2.185039, 2.204724,
-2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
-2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
-2.637795, 2.657480, 2.684547, 2.711614, 2.738681, 2.765748, 2.785433,
-2.805118, 2.824803, 2.844488, 2.856791, 2.869095, 2.881398, 2.893701,
-1.377953, 1.377953, 1.377953, 1.377953, 1.377953, 1.377953, 1.377953,
-1.377953, 1.377953, 1.373032, 1.368110, 1.363189, 1.358268, 1.358268,
-1.358268, 1.358268, 1.358268, 1.363189, 1.368110, 1.373032, 1.377953,
-1.373032, 1.368110, 1.363189, 1.358268, 1.358268, 1.358268, 1.358268,
-1.358268, 1.363189, 1.368110, 1.373032, 1.377953, 1.373032, 1.368110,
-1.363189, 1.358268, 1.363189, 1.368110, 1.373032, 1.377953, 1.377953,
-1.377953, 1.377953, 1.377953, 1.373032, 1.368110, 1.363189, 1.358268,
-1.377953, 1.397638, 1.417323, 1.437008, 1.451772, 1.466535, 1.481299,
-1.496063, 1.520669, 1.545276, 1.569882, 1.594488, 1.609252, 1.624016,
-1.638780, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.756890,
-1.781496, 1.806102, 1.830709, 1.850394, 1.870079, 1.889764, 1.909449,
-1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244,
-2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.160433, 2.175197,
-2.189961, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
-2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945,
-2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
-2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.701772, 2.726378,
-2.750984, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331, 2.869095,
-2.883858, 2.898622, 2.913386, 1.397638, 1.397638, 1.397638, 1.397638,
-1.397638, 1.397638, 1.397638, 1.397638, 1.397638, 1.395177, 1.392717,
-1.390256, 1.387795, 1.382874, 1.377953, 1.373032, 1.368110, 1.375492,
-1.382874, 1.390256, 1.397638, 1.390256, 1.382874, 1.375492, 1.368110,
-1.373032, 1.377953, 1.382874, 1.387795, 1.390256, 1.392717, 1.395177,
-1.397638, 1.395177, 1.392717, 1.390256, 1.387795, 1.390256, 1.392717,
-1.395177, 1.397638, 1.397638, 1.397638, 1.397638, 1.397638, 1.395177,
-1.392717, 1.390256, 1.387795, 1.407480, 1.427165, 1.446850, 1.466535,
-1.478839, 1.491142, 1.503445, 1.515748, 1.542815, 1.569882, 1.596949,
-1.624016, 1.636319, 1.648622, 1.660925, 1.673228, 1.692913, 1.712598,
-1.732283, 1.751969, 1.779035, 1.806102, 1.833169, 1.860236, 1.875000,
-1.889764, 1.904528, 1.919291, 1.938976, 1.958661, 1.978346, 1.998031,
-2.017717, 2.037402, 2.057087, 2.076772, 2.101378, 2.125984, 2.150591,
-2.175197, 2.187500, 2.199803, 2.212106, 2.224410, 2.244095, 2.263780,
-2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575,
-2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370,
-2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677166,
-2.696851, 2.718996, 2.741142, 2.763288, 2.785433, 2.805118, 2.824803,
-2.844488, 2.864173, 2.881398, 2.898622, 2.915847, 2.933071, 1.417323,
-1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323,
-1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.407480, 1.397638,
-1.387795, 1.377953, 1.387795, 1.397638, 1.407480, 1.417323, 1.407480,
-1.397638, 1.387795, 1.377953, 1.387795, 1.397638, 1.407480, 1.417323,
-1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323,
-1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323,
-1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.417323, 1.437008,
-1.456693, 1.476378, 1.496063, 1.505906, 1.515748, 1.525591, 1.535433,
-1.564961, 1.594488, 1.624016, 1.653543, 1.663386, 1.673228, 1.683071,
-1.692913, 1.712598, 1.732283, 1.751969, 1.771654, 1.801181, 1.830709,
-1.860236, 1.889764, 1.899606, 1.909449, 1.919291, 1.929134, 1.948819,
-1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
-2.116142, 2.145669, 2.175197, 2.204724, 2.214567, 2.224410, 2.234252,
-2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
-2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
-2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
-2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
-2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
-2.933071, 2.952756, 1.427165, 1.427165, 1.427165, 1.427165, 1.427165,
-1.429626, 1.432087, 1.434547, 1.437008, 1.437008, 1.437008, 1.437008,
-1.437008, 1.427165, 1.417323, 1.407480, 1.397638, 1.407480, 1.417323,
-1.427165, 1.437008, 1.429626, 1.422244, 1.414862, 1.407480, 1.412402,
-1.417323, 1.422244, 1.427165, 1.429626, 1.432087, 1.434547, 1.437008,
-1.434547, 1.432087, 1.429626, 1.427165, 1.429626, 1.432087, 1.434547,
-1.437008, 1.434547, 1.432087, 1.429626, 1.427165, 1.427165, 1.427165,
-1.427165, 1.427165, 1.444390, 1.461614, 1.478839, 1.496063, 1.505906,
-1.515748, 1.525591, 1.535433, 1.564961, 1.594488, 1.624016, 1.653543,
-1.663386, 1.673228, 1.683071, 1.692913, 1.712598, 1.732283, 1.751969,
-1.771654, 1.798720, 1.825787, 1.852854, 1.879921, 1.894685, 1.909449,
-1.924213, 1.938976, 1.956201, 1.973425, 1.990650, 2.007874, 2.030020,
-2.052165, 2.074311, 2.096457, 2.121063, 2.145669, 2.170276, 2.194882,
-2.209646, 2.224410, 2.239173, 2.253937, 2.271161, 2.288386, 2.305610,
-2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.428642, 2.445866,
-2.463091, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
-2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
-2.736221, 2.755906, 2.775591, 2.795276, 2.817421, 2.839567, 2.861713,
-2.883858, 2.901083, 2.918307, 2.935532, 2.952756, 1.437008, 1.437008,
-1.437008, 1.437008, 1.437008, 1.441929, 1.446850, 1.451772, 1.456693,
-1.456693, 1.456693, 1.456693, 1.456693, 1.446850, 1.437008, 1.427165,
-1.417323, 1.427165, 1.437008, 1.446850, 1.456693, 1.451772, 1.446850,
-1.441929, 1.437008, 1.437008, 1.437008, 1.437008, 1.437008, 1.441929,
-1.446850, 1.451772, 1.456693, 1.451772, 1.446850, 1.441929, 1.437008,
-1.441929, 1.446850, 1.451772, 1.456693, 1.451772, 1.446850, 1.441929,
-1.437008, 1.437008, 1.437008, 1.437008, 1.437008, 1.451772, 1.466535,
-1.481299, 1.496063, 1.505906, 1.515748, 1.525591, 1.535433, 1.564961,
-1.594488, 1.624016, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913,
-1.712598, 1.732283, 1.751969, 1.771654, 1.796260, 1.820866, 1.845472,
-1.870079, 1.889764, 1.909449, 1.929134, 1.948819, 1.963583, 1.978346,
-1.993110, 2.007874, 2.032480, 2.057087, 2.081693, 2.106299, 2.125984,
-2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780,
-2.278543, 2.293307, 2.308071, 2.322835, 2.347441, 2.372047, 2.396654,
-2.421260, 2.436024, 2.450787, 2.465551, 2.480315, 2.500000, 2.519685,
-2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.657480,
-2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
-2.819882, 2.844488, 2.869095, 2.893701, 2.908465, 2.923229, 2.937992,
-2.952756, 1.446850, 1.446850, 1.446850, 1.446850, 1.446850, 1.454232,
-1.461614, 1.468996, 1.476378, 1.476378, 1.476378, 1.476378, 1.476378,
-1.466535, 1.456693, 1.446850, 1.437008, 1.446850, 1.456693, 1.466535,
-1.476378, 1.473917, 1.471457, 1.468996, 1.466535, 1.461614, 1.456693,
-1.451772, 1.446850, 1.454232, 1.461614, 1.468996, 1.476378, 1.468996,
-1.461614, 1.454232, 1.446850, 1.454232, 1.461614, 1.468996, 1.476378,
-1.468996, 1.461614, 1.454232, 1.446850, 1.446850, 1.446850, 1.446850,
-1.446850, 1.459154, 1.471457, 1.483760, 1.496063, 1.505906, 1.515748,
-1.525591, 1.535433, 1.564961, 1.594488, 1.624016, 1.653543, 1.663386,
-1.673228, 1.683071, 1.692913, 1.712598, 1.732283, 1.751969, 1.771654,
-1.793799, 1.815945, 1.838091, 1.860236, 1.884843, 1.909449, 1.934055,
-1.958661, 1.970965, 1.983268, 1.995571, 2.007874, 2.034941, 2.062008,
-2.089075, 2.116142, 2.130906, 2.145669, 2.160433, 2.175197, 2.199803,
-2.224410, 2.249016, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835,
-2.349902, 2.376969, 2.404035, 2.431102, 2.443406, 2.455709, 2.468012,
-2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
-2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221,
-2.755906, 2.775591, 2.795276, 2.822343, 2.849410, 2.876476, 2.903543,
-2.915847, 2.928150, 2.940453, 2.952756, 1.456693, 1.456693, 1.456693,
-1.456693, 1.456693, 1.466535, 1.476378, 1.486220, 1.496063, 1.496063,
-1.496063, 1.496063, 1.496063, 1.486220, 1.476378, 1.466535, 1.456693,
-1.466535, 1.476378, 1.486220, 1.496063, 1.496063, 1.496063, 1.496063,
-1.496063, 1.486220, 1.476378, 1.466535, 1.456693, 1.466535, 1.476378,
-1.486220, 1.496063, 1.486220, 1.476378, 1.466535, 1.456693, 1.466535,
-1.476378, 1.486220, 1.496063, 1.486220, 1.476378, 1.466535, 1.456693,
-1.456693, 1.456693, 1.456693, 1.456693, 1.466535, 1.476378, 1.486220,
-1.496063, 1.505906, 1.515748, 1.525591, 1.535433, 1.564961, 1.594488,
-1.624016, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913, 1.712598,
-1.732283, 1.751969, 1.771654, 1.791339, 1.811024, 1.830709, 1.850394,
-1.879921, 1.909449, 1.938976, 1.968504, 1.978346, 1.988189, 1.998031,
-2.007874, 2.037402, 2.066929, 2.096457, 2.125984, 2.135827, 2.145669,
-2.155512, 2.165354, 2.194882, 2.224410, 2.253937, 2.283465, 2.293307,
-2.303150, 2.312992, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945,
-2.450787, 2.460630, 2.470472, 2.480315, 2.500000, 2.519685, 2.539370,
-2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677166,
-2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.824803,
-2.854331, 2.883858, 2.913386, 2.923228, 2.933071, 2.942913, 2.952756,
-1.476378, 1.476378, 1.476378, 1.476378, 1.476378, 1.486220, 1.496063,
-1.505906, 1.515748, 1.515748, 1.515748, 1.515748, 1.515748, 1.508366,
-1.500984, 1.493602, 1.486220, 1.493602, 1.500984, 1.508366, 1.515748,
-1.515748, 1.515748, 1.515748, 1.515748, 1.505906, 1.496063, 1.486220,
-1.476378, 1.483760, 1.491142, 1.498524, 1.505906, 1.500984, 1.496063,
-1.491142, 1.486220, 1.493602, 1.500984, 1.508366, 1.515748, 1.508366,
-1.500984, 1.493602, 1.486220, 1.483760, 1.481299, 1.478839, 1.476378,
-1.483760, 1.491142, 1.498524, 1.505906, 1.513287, 1.520669, 1.528051,
-1.535433, 1.562500, 1.589567, 1.616634, 1.643701, 1.658465, 1.673228,
-1.687992, 1.702756, 1.722441, 1.742126, 1.761811, 1.781496, 1.801181,
-1.820866, 1.840551, 1.860236, 1.884843, 1.909449, 1.934055, 1.958661,
-1.973425, 1.988189, 2.002953, 2.017717, 2.042323, 2.066929, 2.091536,
-2.116142, 2.128445, 2.140748, 2.153051, 2.165354, 2.192421, 2.219488,
-2.246555, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.349902,
-2.376969, 2.404035, 2.431102, 2.443406, 2.455709, 2.468012, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
-2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906,
-2.775591, 2.795276, 2.822343, 2.849410, 2.876476, 2.903543, 2.915847,
-2.928150, 2.940453, 2.952756, 1.496063, 1.496063, 1.496063, 1.496063,
-1.496063, 1.505906, 1.515748, 1.525591, 1.535433, 1.535433, 1.535433,
-1.535433, 1.535433, 1.530512, 1.525591, 1.520669, 1.515748, 1.520669,
-1.525591, 1.530512, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433,
-1.525591, 1.515748, 1.505906, 1.496063, 1.500984, 1.505906, 1.510827,
-1.515748, 1.515748, 1.515748, 1.515748, 1.515748, 1.520669, 1.525591,
-1.530512, 1.535433, 1.530512, 1.525591, 1.520669, 1.515748, 1.510827,
-1.505906, 1.500984, 1.496063, 1.500984, 1.505906, 1.510827, 1.515748,
-1.520669, 1.525591, 1.530512, 1.535433, 1.560039, 1.584646, 1.609252,
-1.633858, 1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.751969,
-1.771654, 1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.889764,
-1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559,
-2.047244, 2.066929, 2.086614, 2.106299, 2.121063, 2.135827, 2.150591,
-2.165354, 2.189961, 2.214567, 2.239173, 2.263780, 2.278543, 2.293307,
-2.308071, 2.322835, 2.347441, 2.372047, 2.396654, 2.421260, 2.436024,
-2.450787, 2.465551, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
-2.578740, 2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851,
-2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.819882, 2.844488,
-2.869095, 2.893701, 2.908465, 2.923229, 2.937992, 2.952756, 1.515748,
-1.515748, 1.515748, 1.515748, 1.515748, 1.525591, 1.535433, 1.545276,
-1.555118, 1.555118, 1.555118, 1.555118, 1.555118, 1.552657, 1.550197,
-1.547736, 1.545276, 1.547736, 1.550197, 1.552657, 1.555118, 1.555118,
-1.555118, 1.555118, 1.555118, 1.545276, 1.535433, 1.525591, 1.515748,
-1.518209, 1.520669, 1.523130, 1.525591, 1.530512, 1.535433, 1.540354,
-1.545276, 1.547736, 1.550197, 1.552657, 1.555118, 1.552657, 1.550197,
-1.547736, 1.545276, 1.537894, 1.530512, 1.523130, 1.515748, 1.518209,
-1.520669, 1.523130, 1.525591, 1.528051, 1.530512, 1.532972, 1.535433,
-1.557579, 1.579724, 1.601870, 1.624016, 1.648622, 1.673228, 1.697835,
-1.722441, 1.742126, 1.761811, 1.781496, 1.801181, 1.820866, 1.840551,
-1.860236, 1.879921, 1.894685, 1.909449, 1.924213, 1.938976, 1.963583,
-1.988189, 2.012795, 2.037402, 2.052165, 2.066929, 2.081693, 2.096457,
-2.113681, 2.130906, 2.148130, 2.165354, 2.187500, 2.209646, 2.231791,
-2.253937, 2.271161, 2.288386, 2.305610, 2.322835, 2.344980, 2.367126,
-2.389272, 2.411417, 2.428642, 2.445866, 2.463091, 2.480315, 2.500000,
-2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
-2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
-2.795276, 2.817421, 2.839567, 2.861713, 2.883858, 2.901083, 2.918307,
-2.935532, 2.952756, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433,
-1.545276, 1.555118, 1.564961, 1.574803, 1.574803, 1.574803, 1.574803,
-1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.574803,
-1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.564961,
-1.555118, 1.545276, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433,
-1.545276, 1.555118, 1.564961, 1.574803, 1.574803, 1.574803, 1.574803,
-1.574803, 1.574803, 1.574803, 1.574803, 1.574803, 1.564961, 1.555118,
-1.545276, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433, 1.535433,
-1.535433, 1.535433, 1.535433, 1.555118, 1.574803, 1.594488, 1.614173,
-1.643701, 1.673228, 1.702756, 1.732283, 1.751969, 1.771654, 1.791339,
-1.811024, 1.830709, 1.850394, 1.870079, 1.889764, 1.899606, 1.909449,
-1.919291, 1.929134, 1.958661, 1.988189, 2.017717, 2.047244, 2.057087,
-2.066929, 2.076772, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354,
-2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
-2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945,
-2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
-2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
-2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331,
-2.874016, 2.893701, 2.913386, 2.933071, 2.952756, 1.564961, 1.564961,
-1.564961, 1.564961, 1.564961, 1.569882, 1.574803, 1.579724, 1.584646,
-1.587106, 1.589567, 1.592028, 1.594488, 1.592028, 1.589567, 1.587106,
-1.584646, 1.587106, 1.589567, 1.592028, 1.594488, 1.594488, 1.594488,
-1.594488, 1.594488, 1.587106, 1.579724, 1.572343, 1.564961, 1.564961,
-1.564961, 1.564961, 1.564961, 1.572343, 1.579724, 1.587106, 1.594488,
-1.594488, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488,
-1.594488, 1.584646, 1.574803, 1.564961, 1.555118, 1.557579, 1.560039,
-1.562500, 1.564961, 1.564961, 1.564961, 1.564961, 1.564961, 1.584646,
-1.604331, 1.624016, 1.643701, 1.668307, 1.692913, 1.717520, 1.742126,
-1.764272, 1.786417, 1.808563, 1.830709, 1.847933, 1.865157, 1.882382,
-1.899606, 1.911909, 1.924213, 1.936516, 1.948819, 1.975886, 2.002953,
-2.030020, 2.057087, 2.069390, 2.081693, 2.093996, 2.106299, 2.125984,
-2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780,
-2.283465, 2.303150, 2.322835, 2.342520, 2.364665, 2.386811, 2.408957,
-2.431103, 2.450788, 2.470473, 2.490158, 2.509843, 2.529528, 2.549213,
-2.568898, 2.588583, 2.605807, 2.623032, 2.640256, 2.657480, 2.677166,
-2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.814961,
-2.834646, 2.854331, 2.874016, 2.893701, 2.915847, 2.937992, 2.960138,
-2.982284, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488,
-1.594488, 1.594488, 1.594488, 1.599409, 1.604331, 1.609252, 1.614173,
-1.609252, 1.604331, 1.599409, 1.594488, 1.599409, 1.604331, 1.609252,
-1.614173, 1.614173, 1.614173, 1.614173, 1.614173, 1.609252, 1.604331,
-1.599409, 1.594488, 1.594488, 1.594488, 1.594488, 1.594488, 1.599409,
-1.604331, 1.609252, 1.614173, 1.614173, 1.614173, 1.614173, 1.614173,
-1.614173, 1.614173, 1.614173, 1.614173, 1.604331, 1.594488, 1.584646,
-1.574803, 1.579724, 1.584646, 1.589567, 1.594488, 1.594488, 1.594488,
-1.594488, 1.594488, 1.614173, 1.633858, 1.653543, 1.673228, 1.692913,
-1.712598, 1.732283, 1.751969, 1.776575, 1.801181, 1.825787, 1.850394,
-1.865157, 1.879921, 1.894685, 1.909449, 1.924213, 1.938976, 1.953740,
-1.968504, 1.993110, 2.017717, 2.042323, 2.066929, 2.081693, 2.096457,
-2.111221, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410,
-2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
-2.386811, 2.411417, 2.436024, 2.460630, 2.480315, 2.500000, 2.519685,
-2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.632874, 2.647638,
-2.662402, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
-2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
-2.937992, 2.962599, 2.987205, 3.011811, 1.624016, 1.624016, 1.624016,
-1.624016, 1.624016, 1.619094, 1.614173, 1.609252, 1.604331, 1.611713,
-1.619094, 1.626476, 1.633858, 1.626476, 1.619094, 1.611713, 1.604331,
-1.611713, 1.619094, 1.626476, 1.633858, 1.633858, 1.633858, 1.633858,
-1.633858, 1.631398, 1.628937, 1.626476, 1.624016, 1.624016, 1.624016,
-1.624016, 1.624016, 1.626476, 1.628937, 1.631398, 1.633858, 1.633858,
-1.633858, 1.633858, 1.633858, 1.633858, 1.633858, 1.633858, 1.633858,
-1.624016, 1.614173, 1.604331, 1.594488, 1.601870, 1.609252, 1.616634,
-1.624016, 1.624016, 1.624016, 1.624016, 1.624016, 1.643701, 1.663386,
-1.683071, 1.702756, 1.717520, 1.732283, 1.747047, 1.761811, 1.788878,
-1.815945, 1.843012, 1.870079, 1.882382, 1.894685, 1.906988, 1.919291,
-1.936516, 1.953740, 1.970965, 1.988189, 2.010335, 2.032480, 2.054626,
-2.076772, 2.093996, 2.111221, 2.128445, 2.145669, 2.165354, 2.185039,
-2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
-2.342520, 2.362205, 2.381890, 2.408957, 2.436024, 2.463091, 2.490158,
-2.509843, 2.529528, 2.549213, 2.568898, 2.588583, 2.608268, 2.627953,
-2.647638, 2.659941, 2.672244, 2.684547, 2.696851, 2.716536, 2.736221,
-2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016,
-2.893701, 2.913386, 2.933071, 2.960138, 2.987205, 3.014272, 3.041339,
-1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.643701, 1.633858,
-1.624016, 1.614173, 1.624016, 1.633858, 1.643701, 1.653543, 1.643701,
-1.633858, 1.624016, 1.614173, 1.624016, 1.633858, 1.643701, 1.653543,
-1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543,
-1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543,
-1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543, 1.653543,
-1.653543, 1.653543, 1.653543, 1.643701, 1.633858, 1.624016, 1.614173,
-1.624016, 1.633858, 1.643701, 1.653543, 1.653543, 1.653543, 1.653543,
-1.653543, 1.673228, 1.692913, 1.712598, 1.732283, 1.742126, 1.751969,
-1.761811, 1.771654, 1.801181, 1.830709, 1.860236, 1.889764, 1.899606,
-1.909449, 1.919291, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874,
-2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
-2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465,
-2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.431102,
-2.460630, 2.490157, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
-2.618110, 2.637795, 2.657480, 2.677166, 2.687008, 2.696851, 2.706693,
-2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646,
-2.854331, 2.874016, 2.893701, 2.913386, 2.933071, 2.952756, 2.982283,
-3.011811, 3.041338, 3.070866, 1.663386, 1.665846, 1.668307, 1.670768,
-1.673228, 1.665846, 1.658465, 1.651083, 1.643701, 1.651083, 1.658465,
-1.665846, 1.673228, 1.663386, 1.653543, 1.643701, 1.633858, 1.643701,
-1.653543, 1.663386, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
-1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
-1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
-1.673228, 1.673228, 1.670768, 1.668307, 1.665846, 1.663386, 1.658465,
-1.653543, 1.648622, 1.643701, 1.648622, 1.653543, 1.658465, 1.663386,
-1.663386, 1.663386, 1.663386, 1.663386, 1.680610, 1.697835, 1.715059,
-1.732283, 1.744587, 1.756890, 1.769193, 1.781496, 1.806102, 1.830709,
-1.855315, 1.879921, 1.892224, 1.904528, 1.916831, 1.929134, 1.948819,
-1.968504, 1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
-2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410,
-2.244095, 2.266240, 2.288386, 2.310532, 2.332677, 2.349902, 2.367126,
-2.384350, 2.401575, 2.428642, 2.455709, 2.482776, 2.509843, 2.529528,
-2.549213, 2.568898, 2.588583, 2.610729, 2.632874, 2.655020, 2.677166,
-2.689469, 2.701772, 2.714075, 2.726378, 2.746063, 2.765748, 2.785433,
-2.805118, 2.824803, 2.844488, 2.864173, 2.883858, 2.903543, 2.923229,
-2.942914, 2.962599, 2.987205, 3.011811, 3.036417, 3.061024, 1.673228,
-1.678150, 1.683071, 1.687992, 1.692913, 1.687992, 1.683071, 1.678150,
-1.673228, 1.678150, 1.683071, 1.687992, 1.692913, 1.683071, 1.673228,
-1.663386, 1.653543, 1.663386, 1.673228, 1.683071, 1.692913, 1.692913,
-1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913,
-1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913,
-1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.687992, 1.683071,
-1.678150, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
-1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228, 1.673228,
-1.687992, 1.702756, 1.717520, 1.732283, 1.747047, 1.761811, 1.776575,
-1.791339, 1.811024, 1.830709, 1.850394, 1.870079, 1.884843, 1.899606,
-1.914370, 1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559,
-2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354,
-2.185039, 2.204724, 2.224410, 2.244095, 2.268701, 2.293307, 2.317913,
-2.342520, 2.357284, 2.372047, 2.386811, 2.401575, 2.426181, 2.450787,
-2.475394, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.603347,
-2.627953, 2.652559, 2.677166, 2.691929, 2.706693, 2.721457, 2.736221,
-2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016,
-2.893701, 2.913386, 2.933071, 2.952756, 2.972441, 2.992126, 3.011811,
-3.031496, 3.051181, 1.683071, 1.690453, 1.697835, 1.705217, 1.712598,
-1.710138, 1.707677, 1.705217, 1.702756, 1.705217, 1.707677, 1.710138,
-1.712598, 1.702756, 1.692913, 1.683071, 1.673228, 1.683071, 1.692913,
-1.702756, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598,
-1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598,
-1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598, 1.712598,
-1.712598, 1.705217, 1.697835, 1.690453, 1.683071, 1.687992, 1.692913,
-1.697835, 1.702756, 1.697835, 1.692913, 1.687992, 1.683071, 1.683071,
-1.683071, 1.683071, 1.683071, 1.695374, 1.707677, 1.719980, 1.732283,
-1.749508, 1.766732, 1.783957, 1.801181, 1.815945, 1.830709, 1.845472,
-1.860236, 1.877461, 1.894685, 1.911909, 1.929134, 1.948819, 1.968504,
-1.988189, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299,
-2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
-2.271161, 2.298228, 2.325295, 2.352362, 2.364665, 2.376969, 2.389272,
-2.401575, 2.423720, 2.445866, 2.468012, 2.490158, 2.509843, 2.529528,
-2.549213, 2.568898, 2.595965, 2.623032, 2.650099, 2.677166, 2.694390,
-2.711614, 2.728839, 2.746063, 2.765748, 2.785433, 2.805118, 2.824803,
-2.844488, 2.864173, 2.883858, 2.903543, 2.923229, 2.942914, 2.962599,
-2.982284, 2.997047, 3.011811, 3.026575, 3.041339, 1.692913, 1.702756,
-1.712598, 1.722441, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283,
-1.732283, 1.732283, 1.732283, 1.732283, 1.722441, 1.712598, 1.702756,
-1.692913, 1.702756, 1.712598, 1.722441, 1.732283, 1.732283, 1.732283,
-1.732283, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283,
-1.732283, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283, 1.732283,
-1.732283, 1.732283, 1.732283, 1.732283, 1.722441, 1.712598, 1.702756,
-1.692913, 1.702756, 1.712598, 1.722441, 1.732283, 1.722441, 1.712598,
-1.702756, 1.692913, 1.692913, 1.692913, 1.692913, 1.692913, 1.702756,
-1.712598, 1.722441, 1.732283, 1.751969, 1.771654, 1.791339, 1.811024,
-1.820866, 1.830709, 1.840551, 1.850394, 1.870079, 1.889764, 1.909449,
-1.929134, 1.948819, 1.968504, 1.988189, 2.007874, 2.027559, 2.047244,
-2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039,
-2.204724, 2.224410, 2.244095, 2.273622, 2.303150, 2.332677, 2.362205,
-2.372047, 2.381890, 2.391732, 2.401575, 2.421260, 2.440945, 2.460630,
-2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110,
-2.647638, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
-2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
-2.933071, 2.952756, 2.972441, 2.992126, 3.001968, 3.011811, 3.021653,
-3.031496, 1.712598, 1.719980, 1.727362, 1.734744, 1.742126, 1.742126,
-1.742126, 1.742126, 1.742126, 1.742126, 1.742126, 1.742126, 1.742126,
-1.737205, 1.732283, 1.727362, 1.722441, 1.729823, 1.737205, 1.744587,
-1.751969, 1.749508, 1.747047, 1.744587, 1.742126, 1.744587, 1.747047,
-1.749508, 1.751969, 1.749508, 1.747047, 1.744587, 1.742126, 1.742126,
-1.742126, 1.742126, 1.742126, 1.744587, 1.747047, 1.749508, 1.751969,
-1.744587, 1.737205, 1.729823, 1.722441, 1.729823, 1.737205, 1.744587,
-1.751969, 1.744587, 1.737205, 1.729823, 1.722441, 1.719980, 1.717520,
-1.715059, 1.712598, 1.722441, 1.732283, 1.742126, 1.751969, 1.766732,
-1.781496, 1.796260, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394,
-1.872539, 1.894685, 1.916831, 1.938976, 1.956201, 1.973425, 1.990650,
-2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984,
-2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.271161,
-2.298228, 2.325295, 2.352362, 2.364665, 2.376969, 2.389272, 2.401575,
-2.423720, 2.445866, 2.468012, 2.490158, 2.507382, 2.524606, 2.541831,
-2.559055, 2.586122, 2.613189, 2.640256, 2.667323, 2.687008, 2.706693,
-2.726378, 2.746063, 2.765748, 2.785433, 2.805118, 2.824803, 2.844488,
-2.864173, 2.883858, 2.903543, 2.923229, 2.942914, 2.962599, 2.982284,
-2.994587, 3.006890, 3.019193, 3.031496, 1.732283, 1.737205, 1.742126,
-1.747047, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969,
-1.751969, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969,
-1.756890, 1.761811, 1.766732, 1.771654, 1.766732, 1.761811, 1.756890,
-1.751969, 1.756890, 1.761811, 1.766732, 1.771654, 1.766732, 1.761811,
-1.756890, 1.751969, 1.751969, 1.751969, 1.751969, 1.751969, 1.756890,
-1.761811, 1.766732, 1.771654, 1.766732, 1.761811, 1.756890, 1.751969,
-1.756890, 1.761811, 1.766732, 1.771654, 1.766732, 1.761811, 1.756890,
-1.751969, 1.747047, 1.742126, 1.737205, 1.732283, 1.742126, 1.751969,
-1.761811, 1.771654, 1.781496, 1.791339, 1.801181, 1.811024, 1.820866,
-1.830709, 1.840551, 1.850394, 1.875000, 1.899606, 1.924213, 1.948819,
-1.963583, 1.978346, 1.993110, 2.007874, 2.027559, 2.047244, 2.066929,
-2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
-2.224410, 2.244095, 2.268701, 2.293307, 2.317913, 2.342520, 2.357284,
-2.372047, 2.386811, 2.401575, 2.426181, 2.450787, 2.475394, 2.500000,
-2.514764, 2.529528, 2.544291, 2.559055, 2.583662, 2.608268, 2.632874,
-2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
-2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
-2.933071, 2.952756, 2.972441, 2.987205, 3.001969, 3.016732, 3.031496,
-1.751969, 1.754429, 1.756890, 1.759350, 1.761811, 1.761811, 1.761811,
-1.761811, 1.761811, 1.761811, 1.761811, 1.761811, 1.761811, 1.766732,
-1.771654, 1.776575, 1.781496, 1.783957, 1.786417, 1.788878, 1.791339,
-1.783957, 1.776575, 1.769193, 1.761811, 1.769193, 1.776575, 1.783957,
-1.791339, 1.783957, 1.776575, 1.769193, 1.761811, 1.761811, 1.761811,
-1.761811, 1.761811, 1.769193, 1.776575, 1.783957, 1.791339, 1.788878,
-1.786417, 1.783957, 1.781496, 1.783957, 1.786417, 1.788878, 1.791339,
-1.788878, 1.786417, 1.783957, 1.781496, 1.774114, 1.766732, 1.759350,
-1.751969, 1.761811, 1.771654, 1.781496, 1.791339, 1.796260, 1.801181,
-1.806102, 1.811024, 1.820866, 1.830709, 1.840551, 1.850394, 1.877461,
-1.904528, 1.931594, 1.958661, 1.970965, 1.983268, 1.995571, 2.007874,
-2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
-2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.266240, 2.288386,
-2.310532, 2.332677, 2.349902, 2.367126, 2.384350, 2.401575, 2.428642,
-2.455709, 2.482776, 2.509843, 2.522146, 2.534449, 2.546752, 2.559055,
-2.581201, 2.603347, 2.625492, 2.647638, 2.667323, 2.687008, 2.706693,
-2.726378, 2.746063, 2.765748, 2.785433, 2.805118, 2.824803, 2.844488,
-2.864173, 2.883858, 2.903543, 2.923229, 2.942914, 2.962599, 2.979823,
-2.997047, 3.014272, 3.031496, 1.771654, 1.771654, 1.771654, 1.771654,
-1.771654, 1.771654, 1.771654, 1.771654, 1.771654, 1.771654, 1.771654,
-1.771654, 1.771654, 1.781496, 1.791339, 1.801181, 1.811024, 1.811024,
-1.811024, 1.811024, 1.811024, 1.801181, 1.791339, 1.781496, 1.771654,
-1.781496, 1.791339, 1.801181, 1.811024, 1.801181, 1.791339, 1.781496,
-1.771654, 1.771654, 1.771654, 1.771654, 1.771654, 1.781496, 1.791339,
-1.801181, 1.811024, 1.811024, 1.811024, 1.811024, 1.811024, 1.811024,
-1.811024, 1.811024, 1.811024, 1.811024, 1.811024, 1.811024, 1.811024,
-1.801181, 1.791339, 1.781496, 1.771654, 1.781496, 1.791339, 1.801181,
-1.811024, 1.811024, 1.811024, 1.811024, 1.811024, 1.820866, 1.830709,
-1.840551, 1.850394, 1.879921, 1.909449, 1.938976, 1.968504, 1.978346,
-1.988189, 1.998031, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
-2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410,
-2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205,
-2.381890, 2.401575, 2.431102, 2.460630, 2.490157, 2.519685, 2.529528,
-2.539370, 2.549213, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
-2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591,
-2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
-2.933071, 2.952756, 2.972441, 2.992126, 3.011811, 3.031496, 1.801181,
-1.798720, 1.796260, 1.793799, 1.791339, 1.793799, 1.796260, 1.798720,
-1.801181, 1.798720, 1.796260, 1.793799, 1.791339, 1.798720, 1.806102,
-1.813484, 1.820866, 1.820866, 1.820866, 1.820866, 1.820866, 1.815945,
-1.811024, 1.806102, 1.801181, 1.808563, 1.815945, 1.823327, 1.830709,
-1.823327, 1.815945, 1.808563, 1.801181, 1.798720, 1.796260, 1.793799,
-1.791339, 1.801181, 1.811024, 1.820866, 1.830709, 1.830709, 1.830709,
-1.830709, 1.830709, 1.830709, 1.830709, 1.830709, 1.830709, 1.830709,
-1.830709, 1.830709, 1.830709, 1.823327, 1.815945, 1.808563, 1.801181,
-1.806102, 1.811024, 1.815945, 1.820866, 1.820866, 1.820866, 1.820866,
-1.820866, 1.835630, 1.850394, 1.865157, 1.879921, 1.904528, 1.929134,
-1.953740, 1.978346, 1.990650, 2.002953, 2.015256, 2.027559, 2.047244,
-2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039,
-2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835,
-2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.450787, 2.480315,
-2.509843, 2.539370, 2.549213, 2.559055, 2.568898, 2.578740, 2.600886,
-2.623032, 2.645177, 2.667323, 2.684547, 2.701772, 2.718996, 2.736221,
-2.758366, 2.780512, 2.802658, 2.824803, 2.844488, 2.864173, 2.883858,
-2.903543, 2.920768, 2.937992, 2.955217, 2.972441, 2.992126, 3.011811,
-3.031496, 3.051181, 1.830709, 1.825787, 1.820866, 1.815945, 1.811024,
-1.815945, 1.820866, 1.825787, 1.830709, 1.825787, 1.820866, 1.815945,
-1.811024, 1.815945, 1.820866, 1.825787, 1.830709, 1.830709, 1.830709,
-1.830709, 1.830709, 1.830709, 1.830709, 1.830709, 1.830709, 1.835630,
-1.840551, 1.845472, 1.850394, 1.845472, 1.840551, 1.835630, 1.830709,
-1.825787, 1.820866, 1.815945, 1.811024, 1.820866, 1.830709, 1.840551,
-1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394,
-1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.845472,
-1.840551, 1.835630, 1.830709, 1.830709, 1.830709, 1.830709, 1.830709,
-1.830709, 1.830709, 1.830709, 1.830709, 1.850394, 1.870079, 1.889764,
-1.909449, 1.929134, 1.948819, 1.968504, 1.988189, 2.002953, 2.017717,
-2.032480, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
-2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465,
-2.303150, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260,
-2.440945, 2.470472, 2.500000, 2.529528, 2.559055, 2.568898, 2.578740,
-2.588583, 2.598425, 2.623032, 2.647638, 2.672244, 2.696851, 2.711614,
-2.726378, 2.741142, 2.755906, 2.780512, 2.805118, 2.829725, 2.854331,
-2.874016, 2.893701, 2.913386, 2.933071, 2.947835, 2.962599, 2.977362,
-2.992126, 3.011811, 3.031496, 3.051181, 3.070866, 1.860236, 1.852854,
-1.845472, 1.838091, 1.830709, 1.838091, 1.845472, 1.852854, 1.860236,
-1.852854, 1.845472, 1.838091, 1.830709, 1.833169, 1.835630, 1.838091,
-1.840551, 1.840551, 1.840551, 1.840551, 1.840551, 1.845472, 1.850394,
-1.855315, 1.860236, 1.862697, 1.865157, 1.867618, 1.870079, 1.867618,
-1.865157, 1.862697, 1.860236, 1.852854, 1.845472, 1.838091, 1.830709,
-1.840551, 1.850394, 1.860236, 1.870079, 1.870079, 1.870079, 1.870079,
-1.870079, 1.870079, 1.870079, 1.870079, 1.870079, 1.870079, 1.870079,
-1.870079, 1.870079, 1.867618, 1.865157, 1.862697, 1.860236, 1.855315,
-1.850394, 1.845472, 1.840551, 1.840551, 1.840551, 1.840551, 1.840551,
-1.865157, 1.889764, 1.914370, 1.938976, 1.953740, 1.968504, 1.983268,
-1.998031, 2.015256, 2.032480, 2.049705, 2.066929, 2.086614, 2.106299,
-2.125984, 2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095,
-2.263780, 2.283465, 2.303150, 2.322835, 2.342520, 2.362205, 2.381890,
-2.401575, 2.421260, 2.440945, 2.460630, 2.490157, 2.519685, 2.549213,
-2.578740, 2.588583, 2.598425, 2.608268, 2.618110, 2.645177, 2.672244,
-2.699311, 2.726378, 2.738681, 2.750984, 2.763287, 2.775591, 2.802658,
-2.829725, 2.856791, 2.883858, 2.903543, 2.923229, 2.942914, 2.962599,
-2.974902, 2.987205, 2.999508, 3.011811, 3.031496, 3.051181, 3.070866,
-3.090551, 1.889764, 1.879921, 1.870079, 1.860236, 1.850394, 1.860236,
-1.870079, 1.879921, 1.889764, 1.879921, 1.870079, 1.860236, 1.850394,
-1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394, 1.850394,
-1.850394, 1.860236, 1.870079, 1.879921, 1.889764, 1.889764, 1.889764,
-1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.879921,
-1.870079, 1.860236, 1.850394, 1.860236, 1.870079, 1.879921, 1.889764,
-1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764,
-1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764, 1.889764,
-1.889764, 1.889764, 1.879921, 1.870079, 1.860236, 1.850394, 1.850394,
-1.850394, 1.850394, 1.850394, 1.879921, 1.909449, 1.938976, 1.968504,
-1.978346, 1.988189, 1.998031, 2.007874, 2.027559, 2.047244, 2.066929,
-2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
-2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.342520,
-2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
-2.509843, 2.539370, 2.568898, 2.598425, 2.608268, 2.618110, 2.627953,
-2.637795, 2.667323, 2.696851, 2.726378, 2.755906, 2.765748, 2.775591,
-2.785433, 2.795276, 2.824803, 2.854331, 2.883858, 2.913386, 2.933071,
-2.952756, 2.972441, 2.992126, 3.001968, 3.011811, 3.021653, 3.031496,
-3.051181, 3.070866, 3.090551, 3.110236, 1.909449, 1.899606, 1.889764,
-1.879921, 1.870079, 1.879921, 1.889764, 1.899606, 1.909449, 1.899606,
-1.889764, 1.879921, 1.870079, 1.872539, 1.875000, 1.877461, 1.879921,
-1.877461, 1.875000, 1.872539, 1.870079, 1.877461, 1.884843, 1.892224,
-1.899606, 1.902067, 1.904528, 1.906988, 1.909449, 1.909449, 1.909449,
-1.909449, 1.909449, 1.902067, 1.894685, 1.887303, 1.879921, 1.884843,
-1.889764, 1.894685, 1.899606, 1.902067, 1.904528, 1.906988, 1.909449,
-1.906988, 1.904528, 1.902067, 1.899606, 1.899606, 1.899606, 1.899606,
-1.899606, 1.899606, 1.899606, 1.899606, 1.899606, 1.894685, 1.889764,
-1.884843, 1.879921, 1.879921, 1.879921, 1.879921, 1.879921, 1.902067,
-1.924213, 1.946358, 1.968504, 1.978346, 1.988189, 1.998031, 2.007874,
-2.027559, 2.047244, 2.066929, 2.086614, 2.108760, 2.130906, 2.153051,
-2.175197, 2.192421, 2.209646, 2.226870, 2.244095, 2.263780, 2.283465,
-2.303150, 2.322835, 2.344980, 2.367126, 2.389272, 2.411417, 2.428642,
-2.445866, 2.463091, 2.480315, 2.507382, 2.534449, 2.561516, 2.588583,
-2.600886, 2.613189, 2.625492, 2.637795, 2.664862, 2.691929, 2.718996,
-2.746063, 2.758366, 2.770669, 2.782973, 2.795276, 2.822343, 2.849410,
-2.876476, 2.903543, 2.923229, 2.942914, 2.962599, 2.982284, 2.994587,
-3.006890, 3.019193, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236,
-1.929134, 1.919291, 1.909449, 1.899606, 1.889764, 1.899606, 1.909449,
-1.919291, 1.929134, 1.919291, 1.909449, 1.899606, 1.889764, 1.894685,
-1.899606, 1.904528, 1.909449, 1.904528, 1.899606, 1.894685, 1.889764,
-1.894685, 1.899606, 1.904528, 1.909449, 1.914370, 1.919291, 1.924213,
-1.929134, 1.929134, 1.929134, 1.929134, 1.929134, 1.924213, 1.919291,
-1.914370, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.914370,
-1.919291, 1.924213, 1.929134, 1.924213, 1.919291, 1.914370, 1.909449,
-1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449,
-1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449, 1.909449,
-1.909449, 1.909449, 1.924213, 1.938976, 1.953740, 1.968504, 1.978346,
-1.988189, 1.998031, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614,
-2.111221, 2.135827, 2.160433, 2.185039, 2.199803, 2.214567, 2.229331,
-2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.347441, 2.372047,
-2.396654, 2.421260, 2.436024, 2.450787, 2.465551, 2.480315, 2.504921,
-2.529528, 2.554134, 2.578740, 2.593504, 2.608268, 2.623032, 2.637795,
-2.662402, 2.687008, 2.711614, 2.736221, 2.750984, 2.765748, 2.780512,
-2.795276, 2.819882, 2.844488, 2.869095, 2.893701, 2.913386, 2.933071,
-2.952756, 2.972441, 2.987205, 3.001969, 3.016732, 3.031496, 3.051181,
-3.070866, 3.090551, 3.110236, 1.948819, 1.938976, 1.929134, 1.919291,
-1.909449, 1.919291, 1.929134, 1.938976, 1.948819, 1.938976, 1.929134,
-1.919291, 1.909449, 1.916831, 1.924213, 1.931594, 1.938976, 1.931594,
-1.924213, 1.916831, 1.909449, 1.911909, 1.914370, 1.916831, 1.919291,
-1.926673, 1.934055, 1.941437, 1.948819, 1.948819, 1.948819, 1.948819,
-1.948819, 1.946358, 1.943898, 1.941437, 1.938976, 1.934055, 1.929134,
-1.924213, 1.919291, 1.926673, 1.934055, 1.941437, 1.948819, 1.941437,
-1.934055, 1.926673, 1.919291, 1.919291, 1.919291, 1.919291, 1.919291,
-1.919291, 1.919291, 1.919291, 1.919291, 1.924213, 1.929134, 1.934055,
-1.938976, 1.938976, 1.938976, 1.938976, 1.938976, 1.946358, 1.953740,
-1.961122, 1.968504, 1.978346, 1.988189, 1.998031, 2.007874, 2.027559,
-2.047244, 2.066929, 2.086614, 2.113681, 2.140748, 2.167815, 2.194882,
-2.207185, 2.219488, 2.231791, 2.244095, 2.263780, 2.283465, 2.303150,
-2.322835, 2.349902, 2.376969, 2.404035, 2.431102, 2.443406, 2.455709,
-2.468012, 2.480315, 2.502461, 2.524606, 2.546752, 2.568898, 2.586122,
-2.603347, 2.620571, 2.637795, 2.659941, 2.682087, 2.704232, 2.726378,
-2.743603, 2.760827, 2.778051, 2.795276, 2.817421, 2.839567, 2.861713,
-2.883858, 2.903543, 2.923229, 2.942914, 2.962599, 2.979823, 2.997047,
-3.014272, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 1.968504,
-1.958661, 1.948819, 1.938976, 1.929134, 1.938976, 1.948819, 1.958661,
-1.968504, 1.958661, 1.948819, 1.938976, 1.929134, 1.938976, 1.948819,
-1.958661, 1.968504, 1.958661, 1.948819, 1.938976, 1.929134, 1.929134,
-1.929134, 1.929134, 1.929134, 1.938976, 1.948819, 1.958661, 1.968504,
-1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.968504,
-1.968504, 1.958661, 1.948819, 1.938976, 1.929134, 1.938976, 1.948819,
-1.958661, 1.968504, 1.958661, 1.948819, 1.938976, 1.929134, 1.929134,
-1.929134, 1.929134, 1.929134, 1.929134, 1.929134, 1.929134, 1.929134,
-1.938976, 1.948819, 1.958661, 1.968504, 1.968504, 1.968504, 1.968504,
-1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.978346, 1.988189,
-1.998031, 2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.116142,
-2.145669, 2.175197, 2.204724, 2.214567, 2.224410, 2.234252, 2.244095,
-2.263780, 2.283465, 2.303150, 2.322835, 2.352362, 2.381890, 2.411417,
-2.440945, 2.450787, 2.460630, 2.470472, 2.480315, 2.500000, 2.519685,
-2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.657480,
-2.677166, 2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
-2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386, 2.933071,
-2.952756, 2.972441, 2.992126, 3.011811, 3.031496, 3.051181, 3.070866,
-3.090551, 3.110236, 1.978346, 1.970965, 1.963583, 1.956201, 1.948819,
-1.956201, 1.963583, 1.970965, 1.978346, 1.973425, 1.968504, 1.963583,
-1.958661, 1.963583, 1.968504, 1.973425, 1.978346, 1.970965, 1.963583,
-1.956201, 1.948819, 1.948819, 1.948819, 1.948819, 1.948819, 1.956201,
-1.963583, 1.970965, 1.978346, 1.978346, 1.978346, 1.978346, 1.978346,
-1.978346, 1.978346, 1.978346, 1.978346, 1.970965, 1.963583, 1.956201,
-1.948819, 1.958661, 1.968504, 1.978346, 1.988189, 1.978346, 1.968504,
-1.958661, 1.948819, 1.948819, 1.948819, 1.948819, 1.948819, 1.948819,
-1.948819, 1.948819, 1.948819, 1.958661, 1.968504, 1.978346, 1.988189,
-1.985728, 1.983268, 1.980807, 1.978346, 1.978346, 1.978346, 1.978346,
-1.978346, 1.985728, 1.993110, 2.000492, 2.007874, 2.027559, 2.047244,
-2.066929, 2.086614, 2.113681, 2.140748, 2.167815, 2.194882, 2.209646,
-2.224410, 2.239173, 2.253937, 2.271161, 2.288386, 2.305610, 2.322835,
-2.349902, 2.376969, 2.404035, 2.431102, 2.445866, 2.460630, 2.475394,
-2.490158, 2.509843, 2.529528, 2.549213, 2.568898, 2.586122, 2.603347,
-2.620571, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221,
-2.755906, 2.775591, 2.795276, 2.817421, 2.839567, 2.861713, 2.883858,
-2.901083, 2.918307, 2.935532, 2.952756, 2.972441, 2.992126, 3.011811,
-3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 1.988189, 1.983268,
-1.978346, 1.973425, 1.968504, 1.973425, 1.978346, 1.983268, 1.988189,
-1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189,
-1.988189, 1.983268, 1.978346, 1.973425, 1.968504, 1.968504, 1.968504,
-1.968504, 1.968504, 1.973425, 1.978346, 1.983268, 1.988189, 1.988189,
-1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189,
-1.983268, 1.978346, 1.973425, 1.968504, 1.978346, 1.988189, 1.998031,
-2.007874, 1.998031, 1.988189, 1.978346, 1.968504, 1.968504, 1.968504,
-1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.968504, 1.978346,
-1.988189, 1.998031, 2.007874, 2.002953, 1.998031, 1.993110, 1.988189,
-1.988189, 1.988189, 1.988189, 1.988189, 1.993110, 1.998031, 2.002953,
-2.007874, 2.027559, 2.047244, 2.066929, 2.086614, 2.111221, 2.135827,
-2.160433, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.278543,
-2.293307, 2.308071, 2.322835, 2.347441, 2.372047, 2.396654, 2.421260,
-2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
-2.578740, 2.593504, 2.608268, 2.623032, 2.637795, 2.657480, 2.677166,
-2.696851, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.819882,
-2.844488, 2.869095, 2.893701, 2.908465, 2.923229, 2.937992, 2.952756,
-2.972441, 2.992126, 3.011811, 3.031496, 3.051181, 3.070866, 3.090551,
-3.110236, 1.998031, 1.995571, 1.993110, 1.990650, 1.988189, 1.990650,
-1.993110, 1.995571, 1.998031, 2.002953, 2.007874, 2.012795, 2.017717,
-2.012795, 2.007874, 2.002953, 1.998031, 1.995571, 1.993110, 1.990650,
-1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.990650, 1.993110,
-1.995571, 1.998031, 1.998031, 1.998031, 1.998031, 1.998031, 1.998031,
-1.998031, 1.998031, 1.998031, 1.995571, 1.993110, 1.990650, 1.988189,
-1.998031, 2.007874, 2.017717, 2.027559, 2.017717, 2.007874, 1.998031,
-1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189, 1.988189,
-1.988189, 1.988189, 1.998031, 2.007874, 2.017717, 2.027559, 2.020177,
-2.012795, 2.005414, 1.998031, 1.998031, 1.998031, 1.998031, 1.998031,
-2.000492, 2.002953, 2.005414, 2.007874, 2.027559, 2.047244, 2.066929,
-2.086614, 2.108760, 2.130906, 2.153051, 2.175197, 2.199803, 2.224410,
-2.249016, 2.273622, 2.285925, 2.298228, 2.310532, 2.322835, 2.344980,
-2.367126, 2.389272, 2.411417, 2.436024, 2.460630, 2.485236, 2.509843,
-2.529528, 2.549213, 2.568898, 2.588583, 2.600886, 2.613189, 2.625492,
-2.637795, 2.657480, 2.677166, 2.696851, 2.716536, 2.736221, 2.755906,
-2.775591, 2.795276, 2.822343, 2.849410, 2.876476, 2.903543, 2.915847,
-2.928150, 2.940453, 2.952756, 2.972441, 2.992126, 3.011811, 3.031496,
-3.051181, 3.070866, 3.090551, 3.110236, 2.007874, 2.007874, 2.007874,
-2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.017717,
-2.027559, 2.037402, 2.047244, 2.037402, 2.027559, 2.017717, 2.007874,
-2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874,
-2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874,
-2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874,
-2.007874, 2.007874, 2.007874, 2.017717, 2.027559, 2.037402, 2.047244,
-2.037402, 2.027559, 2.017717, 2.007874, 2.007874, 2.007874, 2.007874,
-2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.017717, 2.027559,
-2.037402, 2.047244, 2.037402, 2.027559, 2.017717, 2.007874, 2.007874,
-2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874, 2.007874,
-2.027559, 2.047244, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669,
-2.165354, 2.194882, 2.224410, 2.253937, 2.283465, 2.293307, 2.303150,
-2.312992, 2.322835, 2.342520, 2.362205, 2.381890, 2.401575, 2.431102,
-2.460630, 2.490157, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
-2.608268, 2.618110, 2.627953, 2.637795, 2.657480, 2.677166, 2.696851,
-2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.824803, 2.854331,
-2.883858, 2.913386, 2.923228, 2.933071, 2.942913, 2.952756, 2.972441,
-2.992126, 3.011811, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236,
-2.027559, 2.030020, 2.032480, 2.034941, 2.037402, 2.037402, 2.037402,
-2.037402, 2.037402, 2.044784, 2.052165, 2.059547, 2.066929, 2.059547,
-2.052165, 2.044784, 2.037402, 2.034941, 2.032480, 2.030020, 2.027559,
-2.027559, 2.027559, 2.027559, 2.027559, 2.030020, 2.032480, 2.034941,
-2.037402, 2.037402, 2.037402, 2.037402, 2.037402, 2.034941, 2.032480,
-2.030020, 2.027559, 2.027559, 2.027559, 2.027559, 2.027559, 2.037402,
-2.047244, 2.057087, 2.066929, 2.057087, 2.047244, 2.037402, 2.027559,
-2.030020, 2.032480, 2.034941, 2.037402, 2.037402, 2.037402, 2.037402,
-2.037402, 2.042323, 2.047244, 2.052165, 2.057087, 2.052165, 2.047244,
-2.042323, 2.037402, 2.037402, 2.037402, 2.037402, 2.037402, 2.034941,
-2.032480, 2.030020, 2.027559, 2.047244, 2.066929, 2.086614, 2.106299,
-2.125984, 2.145669, 2.165354, 2.185039, 2.212106, 2.239173, 2.266240,
-2.293307, 2.308071, 2.322835, 2.337598, 2.352362, 2.372047, 2.391732,
-2.411417, 2.431103, 2.458169, 2.485236, 2.512303, 2.539370, 2.559055,
-2.578740, 2.598425, 2.618110, 2.630414, 2.642717, 2.655020, 2.667323,
-2.684547, 2.701772, 2.718996, 2.736221, 2.755906, 2.775591, 2.795276,
-2.814961, 2.844488, 2.874016, 2.903543, 2.933071, 2.942913, 2.952756,
-2.962598, 2.972441, 2.992126, 3.011811, 3.031496, 3.051181, 3.070866,
-3.090551, 3.110236, 3.129921, 2.047244, 2.052165, 2.057087, 2.062008,
-2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.071851, 2.076772,
-2.081693, 2.086614, 2.081693, 2.076772, 2.071851, 2.066929, 2.062008,
-2.057087, 2.052165, 2.047244, 2.047244, 2.047244, 2.047244, 2.047244,
-2.052165, 2.057087, 2.062008, 2.066929, 2.066929, 2.066929, 2.066929,
-2.066929, 2.062008, 2.057087, 2.052165, 2.047244, 2.047244, 2.047244,
-2.047244, 2.047244, 2.057087, 2.066929, 2.076772, 2.086614, 2.076772,
-2.066929, 2.057087, 2.047244, 2.052165, 2.057087, 2.062008, 2.066929,
-2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.066929,
-2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.066929,
-2.066929, 2.066929, 2.062008, 2.057087, 2.052165, 2.047244, 2.066929,
-2.086614, 2.106299, 2.125984, 2.145669, 2.165354, 2.185039, 2.204724,
-2.229331, 2.253937, 2.278543, 2.303150, 2.322835, 2.342520, 2.362205,
-2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.485236, 2.509843,
-2.534449, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.652559,
-2.667323, 2.682087, 2.696851, 2.711614, 2.726378, 2.741142, 2.755906,
-2.775591, 2.795276, 2.814961, 2.834646, 2.864173, 2.893701, 2.923228,
-2.952756, 2.962598, 2.972441, 2.982283, 2.992126, 3.011811, 3.031496,
-3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606, 2.066929,
-2.074311, 2.081693, 2.089075, 2.096457, 2.096457, 2.096457, 2.096457,
-2.096457, 2.098917, 2.101378, 2.103839, 2.106299, 2.103839, 2.101378,
-2.098917, 2.096457, 2.089075, 2.081693, 2.074311, 2.066929, 2.066929,
-2.066929, 2.066929, 2.066929, 2.074311, 2.081693, 2.089075, 2.096457,
-2.096457, 2.096457, 2.096457, 2.096457, 2.089075, 2.081693, 2.074311,
-2.066929, 2.066929, 2.066929, 2.066929, 2.066929, 2.076772, 2.086614,
-2.096457, 2.106299, 2.096457, 2.086614, 2.076772, 2.066929, 2.074311,
-2.081693, 2.089075, 2.096457, 2.096457, 2.096457, 2.096457, 2.096457,
-2.091536, 2.086614, 2.081693, 2.076772, 2.081693, 2.086614, 2.091536,
-2.096457, 2.096457, 2.096457, 2.096457, 2.096457, 2.089075, 2.081693,
-2.074311, 2.066929, 2.086614, 2.106299, 2.125984, 2.145669, 2.165354,
-2.185039, 2.204724, 2.224410, 2.246555, 2.268701, 2.290847, 2.312992,
-2.337598, 2.362205, 2.386811, 2.411417, 2.431102, 2.450787, 2.470472,
-2.490158, 2.512303, 2.534449, 2.556595, 2.578740, 2.598425, 2.618110,
-2.637795, 2.657480, 2.674705, 2.691929, 2.709154, 2.726378, 2.738681,
-2.750984, 2.763287, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331,
-2.883858, 2.913386, 2.942913, 2.972441, 2.982283, 2.992126, 3.001968,
-3.011811, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921,
-3.149606, 3.169291, 2.086614, 2.096457, 2.106299, 2.116142, 2.125984,
-2.125984, 2.125984, 2.125984, 2.125984, 2.125984, 2.125984, 2.125984,
-2.125984, 2.125984, 2.125984, 2.125984, 2.125984, 2.116142, 2.106299,
-2.096457, 2.086614, 2.086614, 2.086614, 2.086614, 2.086614, 2.096457,
-2.106299, 2.116142, 2.125984, 2.125984, 2.125984, 2.125984, 2.125984,
-2.116142, 2.106299, 2.096457, 2.086614, 2.086614, 2.086614, 2.086614,
-2.086614, 2.096457, 2.106299, 2.116142, 2.125984, 2.116142, 2.106299,
-2.096457, 2.086614, 2.096457, 2.106299, 2.116142, 2.125984, 2.125984,
-2.125984, 2.125984, 2.125984, 2.116142, 2.106299, 2.096457, 2.086614,
-2.096457, 2.106299, 2.116142, 2.125984, 2.125984, 2.125984, 2.125984,
-2.125984, 2.116142, 2.106299, 2.096457, 2.086614, 2.106299, 2.125984,
-2.145669, 2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780,
-2.283465, 2.303150, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945,
-2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
-2.598425, 2.618110, 2.637795, 2.657480, 2.677166, 2.696851, 2.716536,
-2.736221, 2.755906, 2.765748, 2.775591, 2.785433, 2.795276, 2.814961,
-2.834646, 2.854331, 2.874016, 2.903543, 2.933071, 2.962598, 2.992126,
-3.001968, 3.011811, 3.021653, 3.031496, 3.051181, 3.070866, 3.090551,
-3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 2.116142, 2.121063,
-2.125984, 2.130906, 2.135827, 2.135827, 2.135827, 2.135827, 2.135827,
-2.138287, 2.140748, 2.143209, 2.145669, 2.145669, 2.145669, 2.145669,
-2.145669, 2.135827, 2.125984, 2.116142, 2.106299, 2.108760, 2.111221,
-2.113681, 2.116142, 2.123524, 2.130906, 2.138287, 2.145669, 2.145669,
-2.145669, 2.145669, 2.145669, 2.135827, 2.125984, 2.116142, 2.106299,
-2.106299, 2.106299, 2.106299, 2.106299, 2.116142, 2.125984, 2.135827,
-2.145669, 2.138287, 2.130906, 2.123524, 2.116142, 2.123524, 2.130906,
-2.138287, 2.145669, 2.143209, 2.140748, 2.138287, 2.135827, 2.128445,
-2.121063, 2.113681, 2.106299, 2.116142, 2.125984, 2.135827, 2.145669,
-2.143209, 2.140748, 2.138287, 2.135827, 2.130906, 2.125984, 2.121063,
-2.116142, 2.128445, 2.140748, 2.153051, 2.165354, 2.185039, 2.204724,
-2.224410, 2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.352362,
-2.381890, 2.411417, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685,
-2.536910, 2.554134, 2.571358, 2.588583, 2.610729, 2.632874, 2.655020,
-2.677166, 2.694390, 2.711614, 2.728839, 2.746063, 2.758366, 2.770669,
-2.782973, 2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.901083,
-2.928150, 2.955217, 2.982284, 2.994587, 3.006890, 3.019193, 3.031496,
-3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606, 3.169291,
-3.188977, 2.145669, 2.145669, 2.145669, 2.145669, 2.145669, 2.145669,
-2.145669, 2.145669, 2.145669, 2.150591, 2.155512, 2.160433, 2.165354,
-2.165354, 2.165354, 2.165354, 2.165354, 2.155512, 2.145669, 2.135827,
-2.125984, 2.130906, 2.135827, 2.140748, 2.145669, 2.150591, 2.155512,
-2.160433, 2.165354, 2.165354, 2.165354, 2.165354, 2.165354, 2.155512,
-2.145669, 2.135827, 2.125984, 2.125984, 2.125984, 2.125984, 2.125984,
-2.135827, 2.145669, 2.155512, 2.165354, 2.160433, 2.155512, 2.150591,
-2.145669, 2.150591, 2.155512, 2.160433, 2.165354, 2.160433, 2.155512,
-2.150591, 2.145669, 2.140748, 2.135827, 2.130906, 2.125984, 2.135827,
-2.145669, 2.155512, 2.165354, 2.160433, 2.155512, 2.150591, 2.145669,
-2.145669, 2.145669, 2.145669, 2.145669, 2.150591, 2.155512, 2.160433,
-2.165354, 2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465,
-2.303150, 2.322835, 2.352362, 2.381890, 2.411417, 2.440945, 2.460630,
-2.480315, 2.500000, 2.519685, 2.534449, 2.549213, 2.563977, 2.578740,
-2.603347, 2.627953, 2.652559, 2.677166, 2.691929, 2.706693, 2.721457,
-2.736221, 2.750984, 2.765748, 2.780512, 2.795276, 2.814961, 2.834646,
-2.854331, 2.874016, 2.898622, 2.923229, 2.947835, 2.972441, 2.987205,
-3.001969, 3.016732, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236,
-3.129921, 3.149606, 3.169291, 3.188977, 2.175197, 2.170276, 2.165354,
-2.160433, 2.155512, 2.155512, 2.155512, 2.155512, 2.155512, 2.162894,
-2.170276, 2.177658, 2.185039, 2.185039, 2.185039, 2.185039, 2.185039,
-2.175197, 2.165354, 2.155512, 2.145669, 2.153051, 2.160433, 2.167815,
-2.175197, 2.177658, 2.180118, 2.182579, 2.185039, 2.185039, 2.185039,
-2.185039, 2.185039, 2.175197, 2.165354, 2.155512, 2.145669, 2.145669,
-2.145669, 2.145669, 2.145669, 2.155512, 2.165354, 2.175197, 2.185039,
-2.182579, 2.180118, 2.177658, 2.175197, 2.177658, 2.180118, 2.182579,
-2.185039, 2.177658, 2.170276, 2.162894, 2.155512, 2.153051, 2.150591,
-2.148130, 2.145669, 2.155512, 2.165354, 2.175197, 2.185039, 2.177658,
-2.170276, 2.162894, 2.155512, 2.160433, 2.165354, 2.170276, 2.175197,
-2.172736, 2.170276, 2.167815, 2.165354, 2.185039, 2.204724, 2.224410,
-2.244095, 2.263780, 2.283465, 2.303150, 2.322835, 2.352362, 2.381890,
-2.411417, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.531988,
-2.544291, 2.556595, 2.568898, 2.595965, 2.623032, 2.650099, 2.677166,
-2.689469, 2.701772, 2.714075, 2.726378, 2.743603, 2.760827, 2.778051,
-2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.896162, 2.918307,
-2.940453, 2.962599, 2.979823, 2.997047, 3.014272, 3.031496, 3.051181,
-3.070866, 3.090551, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977,
-2.204724, 2.194882, 2.185039, 2.175197, 2.165354, 2.165354, 2.165354,
-2.165354, 2.165354, 2.175197, 2.185039, 2.194882, 2.204724, 2.204724,
-2.204724, 2.204724, 2.204724, 2.194882, 2.185039, 2.175197, 2.165354,
-2.175197, 2.185039, 2.194882, 2.204724, 2.204724, 2.204724, 2.204724,
-2.204724, 2.204724, 2.204724, 2.204724, 2.204724, 2.194882, 2.185039,
-2.175197, 2.165354, 2.165354, 2.165354, 2.165354, 2.165354, 2.175197,
-2.185039, 2.194882, 2.204724, 2.204724, 2.204724, 2.204724, 2.204724,
-2.204724, 2.204724, 2.204724, 2.204724, 2.194882, 2.185039, 2.175197,
-2.165354, 2.165354, 2.165354, 2.165354, 2.165354, 2.175197, 2.185039,
-2.194882, 2.204724, 2.194882, 2.185039, 2.175197, 2.165354, 2.175197,
-2.185039, 2.194882, 2.204724, 2.194882, 2.185039, 2.175197, 2.165354,
-2.185039, 2.204724, 2.224410, 2.244095, 2.263780, 2.283465, 2.303150,
-2.322835, 2.352362, 2.381890, 2.411417, 2.440945, 2.460630, 2.480315,
-2.500000, 2.519685, 2.529528, 2.539370, 2.549213, 2.559055, 2.588583,
-2.618110, 2.647638, 2.677166, 2.687008, 2.696851, 2.706693, 2.716536,
-2.736221, 2.755906, 2.775591, 2.795276, 2.814961, 2.834646, 2.854331,
-2.874016, 2.893701, 2.913386, 2.933071, 2.952756, 2.972441, 2.992126,
-3.011811, 3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921,
-3.149606, 3.169291, 3.188977, 2.224410, 2.217028, 2.209646, 2.202264,
-2.194882, 2.194882, 2.194882, 2.194882, 2.194882, 2.199803, 2.204724,
-2.209646, 2.214567, 2.214567, 2.214567, 2.214567, 2.214567, 2.209646,
-2.204724, 2.199803, 2.194882, 2.199803, 2.204724, 2.209646, 2.214567,
-2.217028, 2.219488, 2.221949, 2.224410, 2.224410, 2.224410, 2.224410,
-2.224410, 2.214567, 2.204724, 2.194882, 2.185039, 2.185039, 2.185039,
-2.185039, 2.185039, 2.194882, 2.204724, 2.214567, 2.224410, 2.224410,
-2.224410, 2.224410, 2.224410, 2.221949, 2.219488, 2.217028, 2.214567,
-2.209646, 2.204724, 2.199803, 2.194882, 2.194882, 2.194882, 2.194882,
-2.194882, 2.199803, 2.204724, 2.209646, 2.214567, 2.207185, 2.199803,
-2.192421, 2.185039, 2.194882, 2.204724, 2.214567, 2.224410, 2.214567,
-2.204724, 2.194882, 2.185039, 2.202264, 2.219488, 2.236713, 2.253937,
-2.271161, 2.288386, 2.305610, 2.322835, 2.349902, 2.376969, 2.404035,
-2.431102, 2.450787, 2.470472, 2.490157, 2.509843, 2.522146, 2.534449,
-2.546752, 2.559055, 2.588583, 2.618110, 2.647638, 2.677166, 2.687008,
-2.696851, 2.706693, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276,
-2.817421, 2.839567, 2.861713, 2.883858, 2.903543, 2.923229, 2.942914,
-2.962599, 2.979823, 2.997047, 3.014272, 3.031496, 3.051181, 3.070866,
-3.090551, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 2.244095,
-2.239173, 2.234252, 2.229331, 2.224410, 2.224410, 2.224410, 2.224410,
-2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410,
-2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410,
-2.224410, 2.224410, 2.224410, 2.229331, 2.234252, 2.239173, 2.244095,
-2.244095, 2.244095, 2.244095, 2.244095, 2.234252, 2.224410, 2.214567,
-2.204724, 2.204724, 2.204724, 2.204724, 2.204724, 2.214567, 2.224410,
-2.234252, 2.244095, 2.244095, 2.244095, 2.244095, 2.244095, 2.239173,
-2.234252, 2.229331, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410,
-2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410, 2.224410,
-2.224410, 2.219488, 2.214567, 2.209646, 2.204724, 2.214567, 2.224410,
-2.234252, 2.244095, 2.234252, 2.224410, 2.214567, 2.204724, 2.219488,
-2.234252, 2.249016, 2.263780, 2.278543, 2.293307, 2.308071, 2.322835,
-2.347441, 2.372047, 2.396654, 2.421260, 2.440945, 2.460630, 2.480315,
-2.500000, 2.514764, 2.529528, 2.544291, 2.559055, 2.588583, 2.618110,
-2.647638, 2.677166, 2.687008, 2.696851, 2.706693, 2.716536, 2.736221,
-2.755906, 2.775591, 2.795276, 2.819882, 2.844488, 2.869095, 2.893701,
-2.913386, 2.933071, 2.952756, 2.972441, 2.987205, 3.001969, 3.016732,
-3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606,
-3.169291, 3.188977, 2.263780, 2.261319, 2.258858, 2.256398, 2.253937,
-2.253937, 2.253937, 2.253937, 2.253937, 2.249016, 2.244095, 2.239173,
-2.234252, 2.234252, 2.234252, 2.234252, 2.234252, 2.239173, 2.244095,
-2.249016, 2.253937, 2.249016, 2.244095, 2.239173, 2.234252, 2.241634,
-2.249016, 2.256398, 2.263780, 2.263780, 2.263780, 2.263780, 2.263780,
-2.253937, 2.244095, 2.234252, 2.224410, 2.224410, 2.224410, 2.224410,
-2.224410, 2.234252, 2.244095, 2.253937, 2.263780, 2.263780, 2.263780,
-2.263780, 2.263780, 2.256398, 2.249016, 2.241634, 2.234252, 2.239173,
-2.244095, 2.249016, 2.253937, 2.253937, 2.253937, 2.253937, 2.253937,
-2.249016, 2.244095, 2.239173, 2.234252, 2.231791, 2.229331, 2.226870,
-2.224410, 2.234252, 2.244095, 2.253937, 2.263780, 2.253937, 2.244095,
-2.234252, 2.224410, 2.236713, 2.249016, 2.261319, 2.273622, 2.285925,
-2.298228, 2.310532, 2.322835, 2.344980, 2.367126, 2.389272, 2.411417,
-2.431102, 2.450787, 2.470472, 2.490158, 2.507382, 2.524606, 2.541831,
-2.559055, 2.588583, 2.618110, 2.647638, 2.677166, 2.687008, 2.696851,
-2.706693, 2.716536, 2.736221, 2.755906, 2.775591, 2.795276, 2.822343,
-2.849410, 2.876476, 2.903543, 2.923229, 2.942914, 2.962599, 2.982284,
-2.994587, 3.006890, 3.019193, 3.031496, 3.051181, 3.070866, 3.090551,
-3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 2.283465, 2.283465,
-2.283465, 2.283465, 2.283465, 2.283465, 2.283465, 2.283465, 2.283465,
-2.273622, 2.263780, 2.253937, 2.244095, 2.244095, 2.244095, 2.244095,
-2.244095, 2.253937, 2.263780, 2.273622, 2.283465, 2.273622, 2.263780,
-2.253937, 2.244095, 2.253937, 2.263780, 2.273622, 2.283465, 2.283465,
-2.283465, 2.283465, 2.283465, 2.273622, 2.263780, 2.253937, 2.244095,
-2.244095, 2.244095, 2.244095, 2.244095, 2.253937, 2.263780, 2.273622,
-2.283465, 2.283465, 2.283465, 2.283465, 2.283465, 2.273622, 2.263780,
-2.253937, 2.244095, 2.253937, 2.263780, 2.273622, 2.283465, 2.283465,
-2.283465, 2.283465, 2.283465, 2.273622, 2.263780, 2.253937, 2.244095,
-2.244095, 2.244095, 2.244095, 2.244095, 2.253937, 2.263780, 2.273622,
-2.283465, 2.273622, 2.263780, 2.253937, 2.244095, 2.253937, 2.263780,
-2.273622, 2.283465, 2.293307, 2.303150, 2.312992, 2.322835, 2.342520,
-2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.588583, 2.618110, 2.647638,
-2.677166, 2.687008, 2.696851, 2.706693, 2.716536, 2.736221, 2.755906,
-2.775591, 2.795276, 2.824803, 2.854331, 2.883858, 2.913386, 2.933071,
-2.952756, 2.972441, 2.992126, 3.001968, 3.011811, 3.021653, 3.031496,
-3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606, 3.169291,
-3.188977, 2.303150, 2.300689, 2.298228, 2.295768, 2.293307, 2.295768,
-2.298228, 2.300689, 2.303150, 2.293307, 2.283465, 2.273622, 2.263780,
-2.263780, 2.263780, 2.263780, 2.263780, 2.273622, 2.283465, 2.293307,
-2.303150, 2.295768, 2.288386, 2.281004, 2.273622, 2.278543, 2.283465,
-2.288386, 2.293307, 2.293307, 2.293307, 2.293307, 2.293307, 2.288386,
-2.283465, 2.278543, 2.273622, 2.271161, 2.268701, 2.266240, 2.263780,
-2.271161, 2.278543, 2.285925, 2.293307, 2.293307, 2.293307, 2.293307,
-2.293307, 2.285925, 2.278543, 2.271161, 2.263780, 2.271161, 2.278543,
-2.285925, 2.293307, 2.293307, 2.293307, 2.293307, 2.293307, 2.288386,
-2.283465, 2.278543, 2.273622, 2.273622, 2.273622, 2.273622, 2.273622,
-2.278543, 2.283465, 2.288386, 2.293307, 2.285925, 2.278543, 2.271161,
-2.263780, 2.271161, 2.278543, 2.285925, 2.293307, 2.305610, 2.317913,
-2.330217, 2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945,
-2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740,
-2.608268, 2.637795, 2.667323, 2.696851, 2.709154, 2.721457, 2.733760,
-2.746063, 2.765748, 2.785433, 2.805118, 2.824803, 2.851870, 2.878937,
-2.906004, 2.933071, 2.950295, 2.967520, 2.984744, 3.001969, 3.014272,
-3.026575, 3.038878, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921,
-3.149606, 3.169291, 3.188977, 3.208662, 2.322835, 2.317913, 2.312992,
-2.308071, 2.303150, 2.308071, 2.312992, 2.317913, 2.322835, 2.312992,
-2.303150, 2.293307, 2.283465, 2.283465, 2.283465, 2.283465, 2.283465,
-2.293307, 2.303150, 2.312992, 2.322835, 2.317913, 2.312992, 2.308071,
-2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150,
-2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.298228,
-2.293307, 2.288386, 2.283465, 2.288386, 2.293307, 2.298228, 2.303150,
-2.303150, 2.303150, 2.303150, 2.303150, 2.298228, 2.293307, 2.288386,
-2.283465, 2.288386, 2.293307, 2.298228, 2.303150, 2.303150, 2.303150,
-2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150,
-2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150, 2.303150,
-2.298228, 2.293307, 2.288386, 2.283465, 2.288386, 2.293307, 2.298228,
-2.303150, 2.317913, 2.332677, 2.347441, 2.362205, 2.381890, 2.401575,
-2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370,
-2.559055, 2.578740, 2.598425, 2.627953, 2.657480, 2.687008, 2.716536,
-2.731299, 2.746063, 2.760827, 2.775591, 2.795276, 2.814961, 2.834646,
-2.854331, 2.878937, 2.903543, 2.928150, 2.952756, 2.967520, 2.982284,
-2.997047, 3.011811, 3.026575, 3.041339, 3.056103, 3.070866, 3.090551,
-3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 3.208662, 3.228347,
-2.342520, 2.335138, 2.327756, 2.320374, 2.312992, 2.320374, 2.327756,
-2.335138, 2.342520, 2.332677, 2.322835, 2.312992, 2.303150, 2.303150,
-2.303150, 2.303150, 2.303150, 2.312992, 2.322835, 2.332677, 2.342520,
-2.340059, 2.337598, 2.335138, 2.332677, 2.327756, 2.322835, 2.317913,
-2.312992, 2.312992, 2.312992, 2.312992, 2.312992, 2.317913, 2.322835,
-2.327756, 2.332677, 2.325295, 2.317913, 2.310532, 2.303150, 2.305610,
-2.308071, 2.310532, 2.312992, 2.312992, 2.312992, 2.312992, 2.312992,
-2.310532, 2.308071, 2.305610, 2.303150, 2.305610, 2.308071, 2.310532,
-2.312992, 2.312992, 2.312992, 2.312992, 2.312992, 2.317913, 2.322835,
-2.327756, 2.332677, 2.332677, 2.332677, 2.332677, 2.332677, 2.327756,
-2.322835, 2.317913, 2.312992, 2.310532, 2.308071, 2.305610, 2.303150,
-2.305610, 2.308071, 2.310532, 2.312992, 2.330217, 2.347441, 2.364665,
-2.381890, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
-2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.647638,
-2.677166, 2.706693, 2.736221, 2.753445, 2.770669, 2.787894, 2.805118,
-2.824803, 2.844488, 2.864173, 2.883858, 2.906004, 2.928150, 2.950295,
-2.972441, 2.984744, 2.997047, 3.009350, 3.021654, 3.038878, 3.056103,
-3.073327, 3.090551, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977,
-3.208662, 3.228347, 3.248032, 2.362205, 2.352362, 2.342520, 2.332677,
-2.322835, 2.332677, 2.342520, 2.352362, 2.362205, 2.352362, 2.342520,
-2.332677, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.332677,
-2.342520, 2.352362, 2.362205, 2.362205, 2.362205, 2.362205, 2.362205,
-2.352362, 2.342520, 2.332677, 2.322835, 2.322835, 2.322835, 2.322835,
-2.322835, 2.332677, 2.342520, 2.352362, 2.362205, 2.352362, 2.342520,
-2.332677, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835,
-2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835,
-2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835,
-2.322835, 2.332677, 2.342520, 2.352362, 2.362205, 2.362205, 2.362205,
-2.362205, 2.362205, 2.352362, 2.342520, 2.332677, 2.322835, 2.322835,
-2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835, 2.322835,
-2.342520, 2.362205, 2.381890, 2.401575, 2.421260, 2.440945, 2.460630,
-2.480315, 2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425,
-2.618110, 2.637795, 2.667323, 2.696851, 2.726378, 2.755906, 2.775591,
-2.795276, 2.814961, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386,
-2.933071, 2.952756, 2.972441, 2.992126, 3.001968, 3.011811, 3.021653,
-3.031496, 3.051181, 3.070866, 3.090551, 3.110236, 3.129921, 3.149606,
-3.169291, 3.188977, 3.208662, 3.228347, 3.248032, 3.267717, 2.381890,
-2.374508, 2.367126, 2.359744, 2.352362, 2.357284, 2.362205, 2.367126,
-2.372047, 2.367126, 2.362205, 2.357284, 2.352362, 2.349902, 2.347441,
-2.344980, 2.342520, 2.352362, 2.362205, 2.372047, 2.381890, 2.381890,
-2.381890, 2.381890, 2.381890, 2.374508, 2.367126, 2.359744, 2.352362,
-2.349902, 2.347441, 2.344980, 2.342520, 2.349902, 2.357284, 2.364665,
-2.372047, 2.364665, 2.357284, 2.349902, 2.342520, 2.344980, 2.347441,
-2.349902, 2.352362, 2.352362, 2.352362, 2.352362, 2.352362, 2.349902,
-2.347441, 2.344980, 2.342520, 2.342520, 2.342520, 2.342520, 2.342520,
-2.342520, 2.342520, 2.342520, 2.342520, 2.349902, 2.357284, 2.364665,
-2.372047, 2.374508, 2.376969, 2.379429, 2.381890, 2.372047, 2.362205,
-2.352362, 2.342520, 2.344980, 2.347441, 2.349902, 2.352362, 2.349902,
-2.347441, 2.344980, 2.342520, 2.357284, 2.372047, 2.386811, 2.401575,
-2.421260, 2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370,
-2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.664862, 2.691929,
-2.718996, 2.746063, 2.768209, 2.790354, 2.812500, 2.834646, 2.854331,
-2.874016, 2.893701, 2.913386, 2.930610, 2.947835, 2.965059, 2.982284,
-2.997047, 3.011811, 3.026575, 3.041339, 3.058563, 3.075788, 3.093012,
-3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 3.208662, 3.228347,
-3.248032, 3.267717, 2.401575, 2.396654, 2.391732, 2.386811, 2.381890,
-2.381890, 2.381890, 2.381890, 2.381890, 2.381890, 2.381890, 2.381890,
-2.381890, 2.376969, 2.372047, 2.367126, 2.362205, 2.372047, 2.381890,
-2.391732, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.396654,
-2.391732, 2.386811, 2.381890, 2.376969, 2.372047, 2.367126, 2.362205,
-2.367126, 2.372047, 2.376969, 2.381890, 2.376969, 2.372047, 2.367126,
-2.362205, 2.367126, 2.372047, 2.376969, 2.381890, 2.381890, 2.381890,
-2.381890, 2.381890, 2.376969, 2.372047, 2.367126, 2.362205, 2.362205,
-2.362205, 2.362205, 2.362205, 2.362205, 2.362205, 2.362205, 2.362205,
-2.367126, 2.372047, 2.376969, 2.381890, 2.386811, 2.391732, 2.396654,
-2.401575, 2.391732, 2.381890, 2.372047, 2.362205, 2.367126, 2.372047,
-2.376969, 2.381890, 2.376969, 2.372047, 2.367126, 2.362205, 2.372047,
-2.381890, 2.391732, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315,
-2.500000, 2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110,
-2.637795, 2.662402, 2.687008, 2.711614, 2.736221, 2.760827, 2.785433,
-2.810040, 2.834646, 2.854331, 2.874016, 2.893701, 2.913386, 2.928150,
-2.942914, 2.957677, 2.972441, 2.992126, 3.011811, 3.031496, 3.051181,
-3.065945, 3.080709, 3.095473, 3.110236, 3.129921, 3.149606, 3.169291,
-3.188977, 3.208662, 3.228347, 3.248032, 3.267717, 2.421260, 2.418799,
-2.416339, 2.413878, 2.411417, 2.406496, 2.401575, 2.396654, 2.391732,
-2.396654, 2.401575, 2.406496, 2.411417, 2.404035, 2.396654, 2.389272,
-2.381890, 2.391732, 2.401575, 2.411417, 2.421260, 2.421260, 2.421260,
-2.421260, 2.421260, 2.418799, 2.416339, 2.413878, 2.411417, 2.404035,
-2.396654, 2.389272, 2.381890, 2.384350, 2.386811, 2.389272, 2.391732,
-2.389272, 2.386811, 2.384350, 2.381890, 2.389272, 2.396654, 2.404035,
-2.411417, 2.411417, 2.411417, 2.411417, 2.411417, 2.404035, 2.396654,
-2.389272, 2.381890, 2.381890, 2.381890, 2.381890, 2.381890, 2.381890,
-2.381890, 2.381890, 2.381890, 2.384350, 2.386811, 2.389272, 2.391732,
-2.399114, 2.406496, 2.413878, 2.421260, 2.411417, 2.401575, 2.391732,
-2.381890, 2.389272, 2.396654, 2.404035, 2.411417, 2.404035, 2.396654,
-2.389272, 2.381890, 2.386811, 2.391732, 2.396654, 2.401575, 2.421260,
-2.440945, 2.460630, 2.480315, 2.500000, 2.519685, 2.539370, 2.559055,
-2.578740, 2.598425, 2.618110, 2.637795, 2.659941, 2.682087, 2.704232,
-2.726378, 2.753445, 2.780512, 2.807579, 2.834646, 2.854331, 2.874016,
-2.893701, 2.913386, 2.925689, 2.937992, 2.950295, 2.962599, 2.987205,
-3.011811, 3.036417, 3.061024, 3.073327, 3.085630, 3.097933, 3.110236,
-3.129921, 3.149606, 3.169291, 3.188977, 3.208662, 3.228347, 3.248032,
-3.267717, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.431102,
-2.421260, 2.411417, 2.401575, 2.411417, 2.421260, 2.431102, 2.440945,
-2.431102, 2.421260, 2.411417, 2.401575, 2.411417, 2.421260, 2.431102,
-2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945,
-2.440945, 2.440945, 2.431102, 2.421260, 2.411417, 2.401575, 2.401575,
-2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575,
-2.411417, 2.421260, 2.431102, 2.440945, 2.440945, 2.440945, 2.440945,
-2.440945, 2.431102, 2.421260, 2.411417, 2.401575, 2.401575, 2.401575,
-2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575, 2.401575,
-2.401575, 2.401575, 2.401575, 2.411417, 2.421260, 2.431102, 2.440945,
-2.431102, 2.421260, 2.411417, 2.401575, 2.411417, 2.421260, 2.431102,
-2.440945, 2.431102, 2.421260, 2.411417, 2.401575, 2.401575, 2.401575,
-2.401575, 2.401575, 2.421260, 2.440945, 2.460630, 2.480315, 2.500000,
-2.519685, 2.539370, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795,
-2.657480, 2.677166, 2.696851, 2.716536, 2.746063, 2.775591, 2.805118,
-2.834646, 2.854331, 2.874016, 2.893701, 2.913386, 2.923228, 2.933071,
-2.942913, 2.952756, 2.982283, 3.011811, 3.041338, 3.070866, 3.080709,
-3.090551, 3.100394, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977,
-3.208662, 3.228347, 3.248032, 3.267717, 2.460630, 2.460630, 2.460630,
-2.460630, 2.460630, 2.450787, 2.440945, 2.431102, 2.421260, 2.428642,
-2.436024, 2.443406, 2.450787, 2.445866, 2.440945, 2.436024, 2.431103,
-2.436024, 2.440945, 2.445866, 2.450787, 2.450787, 2.450787, 2.450787,
-2.450787, 2.450787, 2.450787, 2.450787, 2.450787, 2.445866, 2.440945,
-2.436024, 2.431103, 2.431103, 2.431103, 2.431103, 2.431103, 2.431103,
-2.431103, 2.431103, 2.431103, 2.436024, 2.440945, 2.445866, 2.450787,
-2.453248, 2.455709, 2.458169, 2.460630, 2.453248, 2.445866, 2.438484,
-2.431103, 2.428642, 2.426181, 2.423720, 2.421260, 2.421260, 2.421260,
-2.421260, 2.421260, 2.421260, 2.421260, 2.421260, 2.421260, 2.431102,
-2.440945, 2.450787, 2.460630, 2.450787, 2.440945, 2.431102, 2.421260,
-2.431102, 2.440945, 2.450787, 2.460630, 2.453248, 2.445866, 2.438484,
-2.431103, 2.431103, 2.431103, 2.431103, 2.431103, 2.445866, 2.460630,
-2.475394, 2.490158, 2.507382, 2.524606, 2.541831, 2.559055, 2.578740,
-2.598425, 2.618110, 2.637795, 2.659941, 2.682087, 2.704232, 2.726378,
-2.750984, 2.775591, 2.800197, 2.824803, 2.844488, 2.864173, 2.883858,
-2.903543, 2.915847, 2.928150, 2.940453, 2.952756, 2.979823, 3.006890,
-3.033957, 3.061024, 3.073327, 3.085630, 3.097933, 3.110236, 3.129921,
-3.149606, 3.169291, 3.188977, 3.208662, 3.228347, 3.248032, 3.267717,
-2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.470472, 2.460630,
-2.450787, 2.440945, 2.445866, 2.450787, 2.455709, 2.460630, 2.460630,
-2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630,
-2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630,
-2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630,
-2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.460630,
-2.460630, 2.460630, 2.460630, 2.465551, 2.470472, 2.475394, 2.480315,
-2.475394, 2.470473, 2.465551, 2.460630, 2.455709, 2.450787, 2.445866,
-2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945, 2.440945,
-2.440945, 2.440945, 2.450787, 2.460630, 2.470472, 2.480315, 2.470472,
-2.460630, 2.450787, 2.440945, 2.450787, 2.460630, 2.470472, 2.480315,
-2.475394, 2.470473, 2.465551, 2.460630, 2.460630, 2.460630, 2.460630,
-2.460630, 2.470473, 2.480315, 2.490158, 2.500000, 2.514764, 2.529528,
-2.544291, 2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.662402,
-2.687008, 2.711614, 2.736221, 2.755905, 2.775591, 2.795276, 2.814961,
-2.834646, 2.854331, 2.874016, 2.893701, 2.908465, 2.923229, 2.937992,
-2.952756, 2.977362, 3.001969, 3.026575, 3.051181, 3.065945, 3.080709,
-3.095473, 3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 3.208662,
-3.228347, 3.248032, 3.267717, 2.500000, 2.500000, 2.500000, 2.500000,
-2.500000, 2.490157, 2.480315, 2.470472, 2.460630, 2.463091, 2.465551,
-2.468012, 2.470472, 2.475394, 2.480315, 2.485236, 2.490158, 2.485236,
-2.480315, 2.475394, 2.470472, 2.470472, 2.470472, 2.470472, 2.470472,
-2.470472, 2.470472, 2.470472, 2.470472, 2.475394, 2.480315, 2.485236,
-2.490158, 2.490158, 2.490158, 2.490158, 2.490158, 2.490158, 2.490158,
-2.490158, 2.490158, 2.485236, 2.480315, 2.475394, 2.470472, 2.477854,
-2.485236, 2.492618, 2.500000, 2.497540, 2.495079, 2.492618, 2.490158,
-2.482776, 2.475394, 2.468012, 2.460630, 2.460630, 2.460630, 2.460630,
-2.460630, 2.460630, 2.460630, 2.460630, 2.460630, 2.470472, 2.480315,
-2.490157, 2.500000, 2.490157, 2.480315, 2.470472, 2.460630, 2.470472,
-2.480315, 2.490157, 2.500000, 2.497540, 2.495079, 2.492618, 2.490158,
-2.490158, 2.490158, 2.490158, 2.490158, 2.495079, 2.500000, 2.504921,
-2.509843, 2.522146, 2.534449, 2.546752, 2.559055, 2.578740, 2.598425,
-2.618110, 2.637795, 2.664862, 2.691929, 2.718996, 2.746063, 2.760827,
-2.775591, 2.790354, 2.805118, 2.824803, 2.844488, 2.864173, 2.883858,
-2.901083, 2.918307, 2.935532, 2.952756, 2.974902, 2.997047, 3.019193,
-3.041339, 3.058563, 3.075788, 3.093012, 3.110236, 3.129921, 3.149606,
-3.169291, 3.188977, 3.208662, 3.228347, 3.248032, 3.267717, 2.519685,
-2.519685, 2.519685, 2.519685, 2.519685, 2.509843, 2.500000, 2.490157,
-2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.490157, 2.500000,
-2.509843, 2.519685, 2.509843, 2.500000, 2.490157, 2.480315, 2.480315,
-2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.480315,
-2.490157, 2.500000, 2.509843, 2.519685, 2.519685, 2.519685, 2.519685,
-2.519685, 2.519685, 2.519685, 2.519685, 2.519685, 2.509843, 2.500000,
-2.490157, 2.480315, 2.490157, 2.500000, 2.509843, 2.519685, 2.519685,
-2.519685, 2.519685, 2.519685, 2.509843, 2.500000, 2.490157, 2.480315,
-2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.480315, 2.480315,
-2.480315, 2.490157, 2.500000, 2.509843, 2.519685, 2.509843, 2.500000,
-2.490157, 2.480315, 2.490157, 2.500000, 2.509843, 2.519685, 2.519685,
-2.519685, 2.519685, 2.519685, 2.519685, 2.519685, 2.519685, 2.519685,
-2.519685, 2.519685, 2.519685, 2.519685, 2.529528, 2.539370, 2.549213,
-2.559055, 2.578740, 2.598425, 2.618110, 2.637795, 2.667323, 2.696851,
-2.726378, 2.755906, 2.765748, 2.775591, 2.785433, 2.795276, 2.814961,
-2.834646, 2.854331, 2.874016, 2.893701, 2.913386, 2.933071, 2.952756,
-2.972441, 2.992126, 3.011811, 3.031496, 3.051181, 3.070866, 3.090551,
-3.110236, 3.129921, 3.149606, 3.169291, 3.188977, 3.208662, 3.228347,
-3.248032, 3.267717, 3.314469};
-static float *heights MAYBE_UNUSED = __heights;
-
-#endif
diff --git a/test/regression/images_cmp.h b/test/regression/images_cmp.h
deleted file mode 100644
index 1b8b514..0000000
--- a/test/regression/images_cmp.h
+++ /dev/null
@@ -1,46117 +0,0 @@
-/*
- * Copyright 2011 Nate Koenig & Andrew Howard
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#ifndef _TEST_IMAGES_CMP_H_
-#define _TEST_IMAGES_CMP_H_
-
-#ifdef __GNUC__
-    #define MAYBE_UNUSED __attribute__((used))
-#elif defined _MSC_VER
-    #pragma warning(disable: Cxxxxx)
-    #define MAYBE_UNUSED
-#else
-    #define MAYBE_UNUSED
-#endif
-
-static unsigned char __empty_world_camera1[] = {
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 155,
-155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
-156, 157, 157, 157, 157, 157, 157, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 159, 159, 159, 159,
-159, 159, 160, 160, 160, 160, 160, 160, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 157, 157, 157,
-157, 157, 157, 156, 156, 156, 156, 156, 156, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 154, 154,
-154, 154, 154, 154, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 153, 153, 153, 154, 154,
-154, 155, 155, 155, 155, 155, 155, 156, 156, 156,
-157, 157, 157, 157, 157, 157, 158, 158, 158, 159,
-159, 159, 160, 160, 160, 160, 160, 160, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 152, 152, 152, 152, 152, 152, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 161,
-161, 161, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 165, 165, 165, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 171, 171, 171, 172, 172,
-172, 173, 173, 173, 174, 174, 174, 175, 175, 175,
-176, 176, 176, 177, 177, 177, 178, 178, 178, 179,
-179, 179, 180, 180, 180, 181, 181, 181, 182, 182,
-182, 183, 183, 183, 184, 184, 184, 185, 185, 185,
-187, 187, 187, 188, 188, 188, 189, 189, 189, 189,
-189, 189, 190, 190, 190, 191, 191, 191, 192, 192,
-192, 192, 192, 192, 193, 193, 193, 194, 194, 194,
-194, 194, 194, 195, 195, 195, 196, 196, 196, 196,
-196, 196, 197, 197, 197, 198, 198, 198, 198, 198,
-198, 199, 199, 199, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
-200, 199, 199, 199, 199, 199, 199, 199, 199, 199,
-198, 198, 198, 198, 198, 198, 198, 198, 198, 197,
-197, 197, 197, 197, 197, 197, 197, 197, 196, 196,
-196, 196, 196, 196, 196, 196, 196, 195, 195, 195,
-195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-195, 195, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 194, 194, 194, 193, 193, 193, 193, 193, 193,
-151, 151, 151, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 154, 154, 154, 154, 154, 154, 155,
-155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
-156, 157, 157, 157, 157, 157, 157, 158, 158, 158,
-158, 158, 158, 159, 159, 159, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 158, 158, 158, 158, 158, 158, 157, 157, 157,
-157, 157, 157, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 155, 155, 155, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 153, 153, 153, 153, 153, 153,
-152, 152, 152, 152, 152, 152, 151, 151, 151, 151,
-151, 151, 152, 152, 152, 153, 153, 153, 154, 154,
-154, 154, 154, 154, 155, 155, 155, 156, 156, 156,
-157, 157, 157, 157, 157, 157, 158, 158, 158, 159,
-159, 159, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 154, 154, 154, 154, 154, 154, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 151, 151, 151,
-151, 151, 151, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 149, 149, 149, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 157, 157, 157,
-157, 157, 157, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 161,
-161, 161, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 165, 165, 165, 166, 166, 166,
-167, 167, 167, 168, 168, 168, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 171, 171, 171, 172, 172,
-172, 173, 173, 173, 174, 174, 174, 175, 175, 175,
-176, 176, 176, 177, 177, 177, 178, 178, 178, 179,
-179, 179, 180, 180, 180, 182, 182, 182, 183, 183,
-183, 184, 184, 184, 185, 185, 185, 186, 186, 186,
-187, 187, 187, 188, 188, 188, 189, 189, 189, 190,
-190, 190, 190, 190, 190, 191, 191, 191, 192, 192,
-192, 192, 192, 192, 193, 193, 193, 194, 194, 194,
-194, 194, 194, 195, 195, 195, 196, 196, 196, 197,
-197, 197, 197, 197, 197, 198, 198, 198, 199, 199,
-199, 199, 199, 199, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 201, 201, 201, 201, 201, 201, 201,
-201, 201, 200, 200, 200, 200, 200, 200, 200, 200,
-200, 200, 200, 200, 199, 199, 199, 199, 199, 199,
-199, 199, 199, 198, 198, 198, 198, 198, 198, 198,
-198, 198, 197, 197, 197, 197, 197, 197, 197, 197,
-197, 196, 196, 196, 196, 196, 196, 196, 196, 196,
-195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-195, 195, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 194, 194, 194, 194, 194, 194, 193, 193, 193,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-154, 154, 154, 154, 154, 154, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
-156, 157, 157, 157, 157, 157, 157, 158, 158, 158,
-158, 158, 158, 159, 159, 159, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-157, 157, 157, 157, 157, 157, 156, 156, 156, 156,
-156, 156, 155, 155, 155, 155, 155, 155, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 153, 153, 153,
-153, 153, 153, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 153, 153, 153, 154, 154,
-154, 155, 155, 155, 155, 155, 155, 156, 156, 156,
-157, 157, 157, 158, 158, 158, 158, 158, 158, 159,
-159, 159, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
-154, 154, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
-150, 150, 150, 150, 150, 150, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 162, 162, 162, 163, 163, 163, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 168, 168, 168, 169,
-169, 169, 170, 170, 170, 171, 171, 171, 171, 171,
-171, 172, 172, 172, 173, 173, 173, 174, 174, 174,
-175, 175, 175, 177, 177, 177, 178, 178, 178, 179,
-179, 179, 180, 180, 180, 181, 181, 181, 182, 182,
-182, 183, 183, 183, 184, 184, 184, 185, 185, 185,
-186, 186, 186, 187, 187, 187, 188, 188, 188, 188,
-188, 188, 189, 189, 189, 190, 190, 190, 190, 190,
-190, 191, 191, 191, 192, 192, 192, 192, 192, 192,
-193, 193, 193, 194, 194, 194, 195, 195, 195, 195,
-195, 195, 196, 196, 196, 197, 197, 197, 197, 197,
-197, 198, 198, 198, 198, 198, 198, 198, 198, 198,
-199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
-199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
-199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
-199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
-199, 199, 199, 199, 199, 199, 199, 199, 199, 199,
-199, 199, 199, 199, 198, 198, 198, 198, 198, 198,
-198, 198, 198, 197, 197, 197, 197, 197, 197, 197,
-197, 197, 197, 197, 197, 196, 196, 196, 196, 196,
-196, 196, 196, 196, 195, 195, 195, 195, 195, 195,
-195, 195, 195, 195, 195, 195, 195, 195, 195, 194,
-194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 194, 194, 194, 193, 193, 193, 193, 193, 193,
-152, 152, 152, 152, 152, 152, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 155, 155, 155, 155,
-155, 155, 156, 156, 156, 156, 156, 156, 157, 157,
-157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 156,
-156, 156, 156, 156, 156, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 154, 154, 154, 154, 154, 154,
-153, 153, 153, 153, 153, 153, 152, 152, 152, 152,
-152, 152, 153, 153, 153, 154, 154, 154, 154, 154,
-154, 155, 155, 155, 156, 156, 156, 156, 156, 156,
-157, 157, 157, 158, 158, 158, 159, 159, 159, 159,
-159, 159, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 157, 157, 157, 157, 157,
-157, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 150, 150,
-150, 150, 150, 150, 150, 150, 150, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 163, 163, 163, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 166, 166, 166,
-166, 166, 166, 167, 167, 167, 168, 168, 168, 168,
-168, 168, 169, 169, 169, 170, 170, 170, 171, 171,
-171, 171, 171, 171, 173, 173, 173, 174, 174, 174,
-175, 175, 175, 175, 175, 175, 176, 176, 176, 177,
-177, 177, 178, 178, 178, 179, 179, 179, 180, 180,
-180, 181, 181, 181, 182, 182, 182, 183, 183, 183,
-184, 184, 184, 185, 185, 185, 186, 186, 186, 187,
-187, 187, 187, 187, 187, 188, 188, 188, 189, 189,
-189, 189, 189, 189, 190, 190, 190, 191, 191, 191,
-191, 191, 191, 192, 192, 192, 193, 193, 193, 193,
-193, 193, 194, 194, 194, 194, 194, 194, 195, 195,
-195, 196, 196, 196, 196, 196, 196, 196, 196, 196,
-197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
-197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
-197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
-198, 198, 198, 198, 198, 198, 198, 198, 198, 198,
-198, 198, 198, 198, 198, 198, 198, 198, 197, 197,
-197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
-196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
-196, 196, 196, 196, 196, 195, 195, 195, 195, 195,
-195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 156, 156, 156, 156, 156, 156, 157, 157,
-157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 157, 157, 157, 157, 157, 157, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 154, 154, 154,
-154, 154, 154, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 154, 154, 154, 155, 155,
-155, 155, 155, 155, 156, 156, 156, 157, 157, 157,
-157, 157, 157, 158, 158, 158, 159, 159, 159, 159,
-159, 159, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 155, 155, 155, 155,
-155, 155, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 151, 151, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 167, 167, 167, 167, 167, 167, 168,
-168, 168, 169, 169, 169, 169, 169, 169, 170, 170,
-170, 171, 171, 171, 172, 172, 172, 173, 173, 173,
-174, 174, 174, 175, 175, 175, 176, 176, 176, 176,
-176, 176, 177, 177, 177, 178, 178, 178, 179, 179,
-179, 180, 180, 180, 181, 181, 181, 182, 182, 182,
-183, 183, 183, 184, 184, 184, 185, 185, 185, 185,
-185, 185, 186, 186, 186, 187, 187, 187, 187, 187,
-187, 188, 188, 188, 188, 188, 188, 189, 189, 189,
-190, 190, 190, 190, 190, 190, 191, 191, 191, 192,
-192, 192, 192, 192, 192, 193, 193, 193, 194, 194,
-194, 194, 194, 194, 195, 195, 195, 195, 195, 195,
-195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-195, 195, 196, 196, 196, 196, 196, 196, 196, 196,
-196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
-196, 196, 196, 196, 196, 196, 197, 197, 197, 197,
-197, 197, 197, 197, 197, 196, 196, 196, 196, 196,
-196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
-196, 196, 196, 195, 195, 195, 195, 195, 195, 195,
-195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-195, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 194, 194, 194, 194, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 156,
-156, 156, 156, 156, 156, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
-156, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 153,
-153, 153, 154, 154, 154, 154, 154, 154, 155, 155,
-155, 156, 156, 156, 156, 156, 156, 157, 157, 157,
-158, 158, 158, 158, 158, 158, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 151, 151, 151, 151, 151,
-151, 151, 151, 151, 151, 151, 151, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 167, 167, 167, 168,
-168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
-169, 170, 170, 170, 171, 171, 171, 172, 172, 172,
-173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
-175, 175, 176, 176, 176, 177, 177, 177, 178, 178,
-178, 179, 179, 179, 180, 180, 180, 180, 180, 180,
-181, 181, 181, 182, 182, 182, 183, 183, 183, 183,
-183, 183, 184, 184, 184, 185, 185, 185, 185, 185,
-185, 186, 186, 186, 187, 187, 187, 187, 187, 187,
-188, 188, 188, 189, 189, 189, 189, 189, 189, 190,
-190, 190, 190, 190, 190, 191, 191, 191, 192, 192,
-192, 192, 192, 192, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
-194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-194, 194, 194, 194, 194, 194, 194, 194, 194, 194,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 156, 156, 156, 156,
-156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 155, 155, 155, 156, 156,
-156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
-158, 158, 158, 158, 158, 158, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 152, 152, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
-169, 169, 169, 169, 170, 170, 170, 171, 171, 171,
-172, 172, 172, 172, 172, 172, 173, 173, 173, 174,
-174, 174, 175, 175, 175, 176, 176, 176, 176, 176,
-176, 177, 177, 177, 178, 178, 178, 179, 179, 179,
-180, 180, 180, 180, 180, 180, 181, 181, 181, 182,
-182, 182, 182, 182, 182, 183, 183, 183, 184, 184,
-184, 184, 184, 184, 185, 185, 185, 185, 185, 185,
-186, 186, 186, 187, 187, 187, 187, 187, 187, 188,
-188, 188, 188, 188, 188, 189, 189, 189, 190, 190,
-190, 190, 190, 190, 191, 191, 191, 191, 191, 191,
-191, 191, 191, 191, 191, 191, 191, 191, 191, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-154, 154, 154, 154, 154, 154, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 155, 155, 155, 155, 155, 155, 154,
-154, 154, 155, 155, 155, 156, 156, 156, 156, 156,
-156, 157, 157, 157, 157, 157, 157, 158, 158, 158,
-158, 158, 158, 159, 159, 159, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 152, 152,
-152, 152, 152, 152, 152, 152, 152, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 167, 167, 167, 167, 167, 167, 168, 168,
-168, 168, 168, 168, 169, 169, 169, 170, 170, 170,
-171, 171, 171, 171, 171, 171, 172, 172, 172, 173,
-173, 173, 174, 174, 174, 174, 174, 174, 175, 175,
-175, 176, 176, 176, 176, 176, 176, 177, 177, 177,
-178, 178, 178, 179, 179, 179, 179, 179, 179, 180,
-180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
-182, 182, 182, 182, 183, 183, 183, 184, 184, 184,
-184, 184, 184, 185, 185, 185, 185, 185, 185, 186,
-186, 186, 186, 186, 186, 187, 187, 187, 188, 188,
-188, 188, 188, 188, 189, 189, 189, 189, 189, 189,
-189, 189, 189, 189, 189, 189, 190, 190, 190, 190,
-190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
-190, 191, 191, 191, 191, 191, 191, 191, 191, 191,
-191, 191, 191, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 155, 155, 155, 155,
-155, 155, 156, 156, 156, 156, 156, 156, 157, 157,
-157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-153, 153, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 168, 168, 168, 168, 168, 168, 169, 169, 169,
-170, 170, 170, 170, 170, 170, 171, 171, 171, 172,
-172, 172, 172, 172, 172, 173, 173, 173, 174, 174,
-174, 174, 174, 174, 175, 175, 175, 176, 176, 176,
-176, 176, 176, 177, 177, 177, 178, 178, 178, 178,
-178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
-180, 180, 180, 180, 181, 181, 181, 182, 182, 182,
-182, 182, 182, 183, 183, 183, 183, 183, 183, 184,
-184, 184, 185, 185, 185, 185, 185, 185, 186, 186,
-186, 186, 186, 186, 187, 187, 187, 187, 187, 187,
-187, 187, 187, 187, 187, 187, 188, 188, 188, 188,
-188, 188, 188, 188, 188, 188, 188, 188, 189, 189,
-189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
-190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
-190, 190, 190, 190, 190, 191, 191, 191, 191, 191,
-191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
-191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
-191, 191, 191, 191, 191, 191, 191, 191, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-155, 155, 155, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 157, 157, 157, 157, 157,
-157, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 153, 153,
-153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 167, 167, 167, 168, 168, 168, 168, 168, 168,
-169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
-170, 170, 171, 171, 171, 172, 172, 172, 172, 172,
-172, 173, 173, 173, 174, 174, 174, 174, 174, 174,
-175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
-176, 176, 177, 177, 177, 178, 178, 178, 178, 178,
-178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
-180, 180, 180, 181, 181, 181, 182, 182, 182, 182,
-182, 182, 183, 183, 183, 183, 183, 183, 184, 184,
-184, 184, 184, 184, 185, 185, 185, 185, 185, 185,
-185, 185, 185, 186, 186, 186, 186, 186, 186, 186,
-186, 186, 186, 186, 186, 187, 187, 187, 187, 187,
-187, 187, 187, 187, 187, 187, 187, 188, 188, 188,
-188, 188, 188, 188, 188, 188, 189, 189, 189, 189,
-189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
-189, 189, 189, 189, 190, 190, 190, 190, 190, 190,
-190, 190, 190, 190, 190, 190, 190, 190, 190, 190,
-190, 190, 191, 191, 191, 191, 191, 191, 191, 191,
-191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
-191, 191, 191, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 193, 193, 193,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 156,
-156, 156, 157, 157, 157, 157, 157, 157, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
-166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
-168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
-171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
-175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
-176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
-179, 179, 179, 179, 179, 179, 180, 180, 180, 180,
-180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
-182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
-183, 183, 183, 184, 184, 184, 184, 184, 184, 184,
-184, 184, 185, 185, 185, 185, 185, 185, 185, 185,
-185, 185, 185, 185, 186, 186, 186, 186, 186, 186,
-186, 186, 186, 187, 187, 187, 187, 187, 187, 187,
-187, 187, 188, 188, 188, 188, 188, 188, 188, 188,
-188, 188, 188, 188, 188, 188, 188, 189, 189, 189,
-189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
-189, 189, 190, 190, 190, 190, 190, 190, 190, 190,
-190, 190, 190, 190, 191, 191, 191, 191, 191, 191,
-191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
-191, 191, 192, 192, 192, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 193, 193, 193,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 154, 154,
-154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
-168, 168, 169, 169, 169, 169, 169, 169, 170, 170,
-170, 170, 170, 170, 171, 171, 171, 171, 171, 171,
-171, 171, 171, 172, 172, 172, 173, 173, 173, 173,
-173, 173, 174, 174, 174, 174, 174, 174, 175, 175,
-175, 175, 175, 175, 176, 176, 176, 176, 176, 176,
-177, 177, 177, 177, 177, 177, 178, 178, 178, 178,
-178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
-180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
-181, 181, 181, 182, 182, 182, 182, 182, 182, 182,
-182, 182, 183, 183, 183, 183, 183, 183, 183, 183,
-183, 184, 184, 184, 184, 184, 184, 184, 184, 184,
-185, 185, 185, 185, 185, 185, 185, 185, 185, 186,
-186, 186, 186, 186, 186, 186, 186, 186, 187, 187,
-187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
-188, 188, 188, 188, 188, 188, 188, 188, 188, 189,
-189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
-189, 190, 190, 190, 190, 190, 190, 190, 190, 190,
-190, 190, 190, 191, 191, 191, 191, 191, 191, 191,
-191, 191, 191, 191, 191, 192, 192, 192, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 193, 193, 193,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 155, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
-168, 169, 169, 169, 169, 169, 169, 170, 170, 170,
-170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
-171, 171, 172, 172, 172, 172, 172, 172, 173, 173,
-173, 173, 173, 173, 174, 174, 174, 174, 174, 174,
-175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
-176, 176, 177, 177, 177, 177, 177, 177, 178, 178,
-178, 178, 178, 178, 179, 179, 179, 179, 179, 179,
-179, 179, 179, 180, 180, 180, 180, 180, 180, 181,
-181, 181, 181, 181, 181, 181, 181, 181, 182, 182,
-182, 182, 182, 182, 182, 182, 182, 183, 183, 183,
-183, 183, 183, 184, 184, 184, 184, 184, 184, 184,
-184, 184, 185, 185, 185, 185, 185, 185, 185, 185,
-185, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-187, 187, 187, 187, 187, 187, 187, 187, 187, 188,
-188, 188, 188, 188, 188, 188, 188, 188, 189, 189,
-189, 189, 189, 189, 189, 189, 189, 190, 190, 190,
-190, 190, 190, 190, 190, 190, 191, 191, 191, 191,
-191, 191, 191, 191, 191, 191, 191, 191, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 193, 193, 193,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 158,
-158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 155, 155, 155, 155, 155, 155, 155, 155, 155,
-155, 155, 155, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 169, 169, 169, 169, 169, 169, 170,
-170, 170, 170, 170, 170, 170, 170, 170, 171, 171,
-171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-173, 173, 173, 173, 173, 173, 174, 174, 174, 174,
-174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
-176, 176, 176, 176, 177, 177, 177, 177, 177, 177,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 179,
-179, 179, 179, 179, 179, 180, 180, 180, 180, 180,
-180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
-182, 182, 182, 182, 182, 182, 182, 182, 182, 183,
-183, 183, 183, 183, 183, 184, 184, 184, 184, 184,
-184, 184, 184, 184, 185, 185, 185, 185, 185, 185,
-186, 186, 186, 186, 186, 186, 186, 186, 186, 187,
-187, 187, 187, 187, 187, 188, 188, 188, 188, 188,
-188, 188, 188, 188, 189, 189, 189, 189, 189, 189,
-190, 190, 190, 190, 190, 190, 190, 190, 190, 191,
-191, 191, 191, 191, 191, 191, 191, 191, 192, 192,
-192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 168,
-168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
-169, 170, 170, 170, 170, 170, 170, 171, 171, 171,
-171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
-173, 173, 173, 173, 173, 174, 174, 174, 174, 174,
-174, 174, 174, 174, 175, 175, 175, 175, 175, 175,
-176, 176, 176, 176, 176, 176, 177, 177, 177, 177,
-177, 177, 177, 177, 177, 178, 178, 178, 178, 178,
-178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
-180, 180, 180, 181, 181, 181, 181, 181, 181, 181,
-181, 181, 182, 182, 182, 182, 182, 182, 183, 183,
-183, 183, 183, 183, 184, 184, 184, 184, 184, 184,
-185, 185, 185, 185, 185, 185, 186, 186, 186, 186,
-186, 186, 186, 186, 186, 187, 187, 187, 187, 187,
-187, 188, 188, 188, 188, 188, 188, 189, 189, 189,
-189, 189, 189, 189, 189, 189, 190, 190, 190, 190,
-190, 190, 191, 191, 191, 191, 191, 191, 191, 191,
-191, 192, 192, 192, 192, 192, 192, 193, 193, 193,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
-156, 156, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 167, 167, 167, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 167, 167, 167, 167, 167, 167, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 169, 169, 169,
-169, 169, 169, 170, 170, 170, 170, 170, 170, 171,
-171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
-172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
-174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
-175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
-177, 177, 177, 177, 178, 178, 178, 178, 178, 178,
-179, 179, 179, 179, 179, 179, 180, 180, 180, 180,
-180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
-182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
-184, 184, 184, 184, 184, 184, 185, 185, 185, 185,
-185, 185, 186, 186, 186, 186, 186, 186, 187, 187,
-187, 187, 187, 187, 188, 188, 188, 188, 188, 188,
-189, 189, 189, 189, 189, 189, 189, 189, 189, 190,
-190, 190, 190, 190, 190, 191, 191, 191, 191, 191,
-191, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 168, 168, 168, 169,
-169, 169, 169, 169, 169, 169, 169, 169, 169, 169,
-169, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-167, 167, 167, 167, 167, 167, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
-165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 165, 165, 165, 165, 165, 165, 166, 166,
-166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 169,
-169, 169, 169, 169, 169, 170, 170, 170, 170, 170,
-170, 170, 170, 170, 171, 171, 171, 172, 172, 172,
-172, 172, 172, 173, 173, 173, 173, 173, 173, 174,
-174, 174, 174, 174, 174, 174, 174, 174, 175, 175,
-175, 175, 175, 175, 176, 176, 176, 177, 177, 177,
-177, 177, 177, 178, 178, 178, 178, 178, 178, 179,
-179, 179, 179, 179, 179, 180, 180, 180, 180, 180,
-180, 181, 181, 181, 181, 181, 181, 182, 182, 182,
-183, 183, 183, 183, 183, 183, 184, 184, 184, 184,
-184, 184, 185, 185, 185, 186, 186, 186, 186, 186,
-186, 187, 187, 187, 187, 187, 187, 188, 188, 188,
-188, 188, 188, 189, 189, 189, 189, 189, 189, 190,
-190, 190, 190, 190, 190, 191, 191, 191, 191, 191,
-191, 192, 192, 192, 192, 192, 192, 192, 192, 192,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
-157, 157, 157, 157, 157, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 166, 166, 166, 167, 167, 167,
-167, 167, 167, 168, 168, 168, 169, 169, 169, 170,
-170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
-170, 169, 169, 169, 169, 169, 169, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 167, 167, 167, 167,
-167, 167, 166, 166, 166, 166, 166, 166, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
-167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
-168, 169, 169, 169, 169, 169, 169, 170, 170, 170,
-170, 170, 170, 171, 171, 171, 171, 171, 171, 172,
-172, 172, 172, 172, 172, 173, 173, 173, 173, 173,
-173, 174, 174, 174, 174, 174, 174, 175, 175, 175,
-175, 175, 175, 176, 176, 176, 176, 176, 176, 177,
-177, 177, 178, 178, 178, 179, 179, 179, 179, 179,
-179, 180, 180, 180, 180, 180, 180, 181, 181, 181,
-182, 182, 182, 182, 182, 182, 183, 183, 183, 184,
-184, 184, 184, 184, 184, 185, 185, 185, 186, 186,
-186, 186, 186, 186, 187, 187, 187, 187, 187, 187,
-188, 188, 188, 188, 188, 188, 189, 189, 189, 189,
-189, 189, 190, 190, 190, 191, 191, 191, 191, 191,
-191, 192, 192, 192, 192, 192, 192, 193, 193, 193,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 167, 167, 167,
-168, 168, 168, 168, 168, 168, 169, 169, 169, 170,
-170, 170, 171, 171, 171, 170, 170, 170, 170, 170,
-170, 169, 169, 169, 169, 169, 169, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 167, 167, 167, 167,
-167, 167, 166, 166, 166, 166, 166, 166, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 168, 168, 168, 169, 169, 169,
-169, 169, 169, 170, 170, 170, 170, 170, 170, 171,
-171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
-172, 173, 173, 173, 173, 173, 173, 174, 174, 174,
-174, 174, 174, 175, 175, 175, 176, 176, 176, 176,
-176, 176, 177, 177, 177, 177, 177, 177, 178, 178,
-178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
-181, 181, 181, 181, 181, 181, 182, 182, 182, 183,
-183, 183, 184, 184, 184, 184, 184, 184, 185, 185,
-185, 185, 185, 185, 186, 186, 186, 187, 187, 187,
-187, 187, 187, 188, 188, 188, 188, 188, 188, 189,
-189, 189, 189, 189, 189, 190, 190, 190, 190, 190,
-190, 191, 191, 191, 191, 191, 191, 192, 192, 192,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 167, 167, 167,
-167, 167, 167, 168, 168, 168, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 170, 170, 170, 169, 169,
-169, 169, 169, 169, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 167, 167, 167, 167, 167, 167, 166,
-166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
-167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
-169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
-170, 170, 171, 171, 171, 171, 171, 171, 172, 172,
-172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
-174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
-175, 175, 176, 176, 176, 177, 177, 177, 177, 177,
-177, 178, 178, 178, 179, 179, 179, 179, 179, 179,
-180, 180, 180, 181, 181, 181, 181, 181, 181, 182,
-182, 182, 183, 183, 183, 183, 183, 183, 184, 184,
-184, 184, 184, 184, 185, 185, 185, 186, 186, 186,
-186, 186, 186, 187, 187, 187, 187, 187, 187, 188,
-188, 188, 188, 188, 188, 189, 189, 189, 189, 189,
-189, 190, 190, 190, 191, 191, 191, 191, 191, 191,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 168, 168, 168, 168, 168, 168, 169,
-169, 169, 170, 170, 170, 169, 169, 169, 169, 169,
-169, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-167, 167, 167, 167, 167, 167, 166, 166, 166, 166,
-166, 166, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 166, 166, 166, 166, 166, 166, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 168, 168, 168,
-168, 168, 168, 169, 169, 169, 169, 169, 169, 170,
-170, 170, 170, 170, 170, 171, 171, 171, 171, 171,
-171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
-175, 175, 175, 175, 175, 176, 176, 176, 177, 177,
-177, 178, 178, 178, 178, 178, 178, 179, 179, 179,
-179, 179, 179, 180, 180, 180, 181, 181, 181, 181,
-181, 181, 182, 182, 182, 183, 183, 183, 183, 183,
-183, 184, 184, 184, 184, 184, 184, 185, 185, 185,
-185, 185, 185, 186, 186, 186, 187, 187, 187, 187,
-187, 187, 188, 188, 188, 188, 188, 188, 189, 189,
-189, 189, 189, 189, 190, 190, 190, 190, 190, 190,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
-168, 168, 169, 169, 169, 169, 169, 169, 168, 168,
-168, 168, 168, 168, 167, 167, 167, 167, 167, 167,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 166, 166, 166, 166, 166,
-166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
-171, 171, 171, 171, 172, 172, 172, 172, 172, 172,
-173, 173, 173, 173, 173, 173, 174, 174, 174, 174,
-174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
-176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
-179, 179, 179, 179, 179, 179, 180, 180, 180, 181,
-181, 181, 181, 181, 181, 182, 182, 182, 182, 182,
-182, 183, 183, 183, 184, 184, 184, 184, 184, 184,
-185, 185, 185, 185, 185, 185, 186, 186, 186, 186,
-186, 186, 187, 187, 187, 187, 187, 187, 188, 188,
-188, 188, 188, 188, 189, 189, 189, 189, 189, 189,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-166, 166, 166, 167, 167, 167, 167, 167, 167, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 167, 167, 167, 167, 167, 167, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
-164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
-166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 169,
-169, 169, 169, 169, 169, 170, 170, 170, 170, 170,
-170, 171, 171, 171, 171, 171, 171, 172, 172, 172,
-172, 172, 172, 172, 172, 172, 173, 173, 173, 173,
-173, 173, 174, 174, 174, 175, 175, 175, 175, 175,
-175, 176, 176, 176, 177, 177, 177, 177, 177, 177,
-178, 178, 178, 178, 178, 178, 179, 179, 179, 180,
-180, 180, 180, 180, 180, 181, 181, 181, 182, 182,
-182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
-184, 184, 184, 184, 184, 184, 185, 185, 185, 185,
-185, 185, 186, 186, 186, 186, 186, 186, 187, 187,
-187, 187, 187, 187, 188, 188, 188, 188, 188, 188,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 167, 167, 167, 167, 167,
-167, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 166, 166, 166, 166, 166, 166, 167, 167, 167,
-167, 167, 167, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 169, 169, 169, 169, 169, 169, 170, 170,
-170, 170, 170, 170, 171, 171, 171, 171, 171, 171,
-171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
-173, 173, 173, 173, 173, 174, 174, 174, 175, 175,
-175, 175, 175, 175, 176, 176, 176, 176, 176, 176,
-177, 177, 177, 178, 178, 178, 178, 178, 178, 179,
-179, 179, 179, 179, 179, 180, 180, 180, 181, 181,
-181, 181, 181, 181, 182, 182, 182, 182, 182, 182,
-183, 183, 183, 183, 183, 183, 184, 184, 184, 184,
-184, 184, 185, 185, 185, 185, 185, 185, 186, 186,
-186, 186, 186, 186, 187, 187, 187, 187, 187, 187,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 168,
-168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
-169, 169, 169, 169, 170, 170, 170, 170, 170, 170,
-171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
-172, 172, 173, 173, 173, 173, 173, 173, 174, 174,
-174, 174, 174, 174, 175, 175, 175, 176, 176, 176,
-176, 176, 176, 177, 177, 177, 177, 177, 177, 178,
-178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
-180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
-182, 182, 182, 182, 182, 182, 183, 183, 183, 183,
-183, 183, 184, 184, 184, 184, 184, 184, 185, 185,
-185, 185, 185, 185, 186, 186, 186, 186, 186, 186,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
-169, 169, 169, 169, 169, 169, 169, 170, 170, 170,
-170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
-171, 171, 172, 172, 172, 173, 173, 173, 173, 173,
-173, 174, 174, 174, 174, 174, 174, 175, 175, 175,
-175, 175, 175, 176, 176, 176, 177, 177, 177, 177,
-177, 177, 178, 178, 178, 178, 178, 178, 179, 179,
-179, 179, 179, 179, 180, 180, 180, 180, 180, 180,
-181, 181, 181, 181, 181, 181, 182, 182, 182, 182,
-182, 182, 183, 183, 183, 183, 183, 183, 184, 184,
-184, 184, 184, 184, 185, 185, 185, 185, 185, 185,
-163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 169, 169, 169, 169, 169, 169,
-169, 169, 169, 170, 170, 170, 170, 170, 170, 171,
-171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
-172, 173, 173, 173, 173, 173, 173, 174, 174, 174,
-175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
-176, 176, 177, 177, 177, 177, 177, 177, 178, 178,
-178, 178, 178, 178, 179, 179, 179, 179, 179, 179,
-180, 180, 180, 180, 180, 180, 181, 181, 181, 181,
-181, 181, 182, 182, 182, 182, 182, 182, 183, 183,
-183, 183, 183, 183, 184, 184, 184, 184, 184, 184,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
-170, 170, 171, 171, 171, 171, 171, 171, 172, 172,
-172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
-174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
-175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
-177, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-179, 179, 179, 179, 179, 179, 180, 180, 180, 180,
-180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
-182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 158, 158, 158, 158, 158, 158, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
-171, 171, 171, 171, 172, 172, 172, 173, 173, 173,
-173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
-175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
-176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
-178, 178, 178, 179, 179, 179, 179, 179, 179, 179,
-179, 179, 180, 180, 180, 180, 180, 180, 181, 181,
-181, 181, 181, 181, 182, 182, 182, 182, 182, 182,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 168, 168, 168, 168, 168, 168, 169,
-169, 169, 169, 169, 169, 170, 170, 170, 170, 170,
-170, 171, 171, 171, 171, 171, 171, 172, 172, 172,
-172, 172, 172, 173, 173, 173, 173, 173, 173, 174,
-174, 174, 174, 174, 174, 175, 175, 175, 175, 175,
-175, 176, 176, 176, 176, 176, 176, 177, 177, 177,
-177, 177, 177, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
-180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 168,
-168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
-169, 170, 170, 170, 170, 170, 170, 171, 171, 171,
-171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
-173, 173, 173, 173, 173, 174, 174, 174, 174, 174,
-174, 175, 175, 175, 175, 175, 175, 175, 175, 175,
-176, 176, 176, 176, 176, 176, 177, 177, 177, 177,
-177, 177, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
-169, 169, 169, 169, 170, 170, 170, 170, 170, 170,
-170, 170, 170, 171, 171, 171, 171, 171, 171, 172,
-172, 172, 172, 172, 172, 173, 173, 173, 173, 173,
-173, 174, 174, 174, 174, 174, 174, 175, 175, 175,
-175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
-176, 176, 177, 177, 177, 177, 177, 177, 177, 177,
-177, 178, 178, 178, 178, 178, 178, 179, 179, 179,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 167, 167, 167, 167, 167, 167, 168, 168,
-168, 168, 168, 168, 169, 169, 169, 169, 169, 169,
-170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
-171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
-172, 173, 173, 173, 173, 173, 173, 174, 174, 174,
-174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
-175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
-177, 177, 177, 177, 177, 177, 177, 178, 178, 178,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
-170, 170, 171, 171, 171, 171, 171, 171, 172, 172,
-172, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-173, 173, 173, 174, 174, 174, 174, 174, 174, 174,
-174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
-176, 176, 176, 176, 176, 176, 176, 177, 177, 177,
-165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
-167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
-169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
-170, 170, 170, 170, 170, 171, 171, 171, 171, 171,
-171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-173, 173, 173, 173, 173, 173, 174, 174, 174, 174,
-174, 174, 174, 174, 174, 175, 175, 175, 175, 175,
-175, 176, 176, 176, 176, 176, 176, 176, 176, 176,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 168, 168, 168, 168, 168, 168, 169, 169, 169,
-169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
-170, 170, 171, 171, 171, 171, 171, 171, 172, 172,
-172, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
-175, 175, 175, 175, 175, 175, 175, 175, 176, 176,
-176, 176, 176, 176, 177, 177, 177, 177, 177, 177,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 168, 168, 168, 168, 168, 168, 169, 169, 169,
-169, 169, 169, 170, 170, 170, 170, 170, 170, 171,
-171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
-172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
-174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
-175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
-176, 177, 177, 177, 177, 177, 177, 177, 177, 177,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 166, 166, 166, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 167, 167, 167, 167, 167, 167, 168, 168,
-168, 168, 168, 168, 169, 169, 169, 169, 169, 169,
-170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
-171, 171, 171, 171, 171, 172, 172, 172, 172, 172,
-172, 173, 173, 173, 173, 173, 173, 174, 174, 174,
-174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
-175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
-177, 177, 177, 177, 177, 177, 177, 178, 178, 178,
-163, 163, 163, 163, 163, 163, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 167,
-167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 169, 169, 169, 169, 169, 169,
-170, 170, 170, 170, 170, 170, 171, 171, 171, 171,
-171, 171, 172, 172, 172, 172, 172, 172, 173, 173,
-173, 173, 173, 173, 174, 174, 174, 174, 174, 174,
-175, 175, 175, 175, 175, 175, 175, 175, 175, 176,
-176, 176, 176, 176, 176, 177, 177, 177, 177, 177,
-177, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
-165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
-167, 167, 167, 167, 167, 168, 168, 168, 168, 168,
-168, 169, 169, 169, 169, 169, 169, 170, 170, 170,
-170, 170, 170, 171, 171, 171, 171, 171, 171, 172,
-172, 172, 172, 172, 172, 173, 173, 173, 173, 173,
-173, 173, 173, 173, 174, 174, 174, 174, 174, 174,
-175, 175, 175, 175, 175, 175, 176, 176, 176, 176,
-176, 176, 177, 177, 177, 177, 177, 177, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 179, 179, 179,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
-165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
-169, 169, 169, 169, 169, 169, 169, 170, 170, 170,
-171, 171, 171, 171, 171, 171, 171, 171, 171, 172,
-172, 172, 172, 172, 172, 173, 173, 173, 173, 173,
-173, 174, 174, 174, 174, 174, 174, 175, 175, 175,
-175, 175, 175, 176, 176, 176, 176, 176, 176, 177,
-177, 177, 177, 177, 177, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 179, 179, 179, 179, 179, 179,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 160, 160, 160, 160,
-160, 160, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 168, 168, 168, 169, 169,
-169, 169, 169, 169, 170, 170, 170, 170, 170, 170,
-171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
-172, 172, 173, 173, 173, 173, 173, 173, 174, 174,
-174, 174, 174, 174, 175, 175, 175, 175, 175, 175,
-176, 176, 176, 176, 176, 176, 177, 177, 177, 177,
-177, 177, 177, 177, 177, 178, 178, 178, 178, 178,
-178, 179, 179, 179, 179, 179, 179, 180, 180, 180,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 158, 158, 158,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 167, 167, 167, 167, 167, 167, 168,
-168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
-169, 170, 170, 170, 170, 170, 170, 171, 171, 171,
-171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
-173, 173, 173, 173, 173, 174, 174, 174, 174, 174,
-174, 175, 175, 175, 175, 175, 175, 176, 176, 176,
-176, 176, 176, 176, 176, 176, 177, 177, 177, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 179, 179,
-179, 179, 179, 179, 180, 180, 180, 180, 180, 180,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 167, 167, 167, 167, 167, 167, 168,
-168, 168, 168, 168, 168, 169, 169, 169, 169, 169,
-169, 170, 170, 170, 170, 170, 170, 171, 171, 171,
-171, 171, 171, 172, 172, 172, 172, 172, 172, 173,
-173, 173, 174, 174, 174, 174, 174, 174, 174, 174,
-174, 175, 175, 175, 175, 175, 175, 176, 176, 176,
-176, 176, 176, 177, 177, 177, 177, 177, 177, 178,
-178, 178, 178, 178, 178, 179, 179, 179, 179, 179,
-179, 180, 180, 180, 180, 180, 180, 181, 181, 181,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 166, 166, 166, 166, 166, 166,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
-168, 168, 169, 169, 169, 169, 169, 169, 170, 170,
-170, 170, 170, 170, 171, 171, 171, 171, 171, 171,
-172, 172, 172, 172, 172, 172, 173, 173, 173, 173,
-173, 173, 174, 174, 174, 174, 174, 174, 175, 175,
-175, 175, 175, 175, 176, 176, 176, 176, 176, 176,
-177, 177, 177, 177, 177, 177, 178, 178, 178, 178,
-178, 178, 179, 179, 179, 179, 179, 179, 180, 180,
-180, 180, 180, 180, 181, 181, 181, 181, 181, 181,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
-168, 168, 169, 169, 169, 170, 170, 170, 170, 170,
-170, 171, 171, 171, 171, 171, 171, 172, 172, 172,
-172, 172, 172, 173, 173, 173, 173, 173, 173, 174,
-174, 174, 174, 174, 174, 175, 175, 175, 175, 175,
-175, 176, 176, 176, 176, 176, 176, 177, 177, 177,
-177, 177, 177, 178, 178, 178, 178, 178, 178, 179,
-179, 179, 179, 179, 179, 180, 180, 180, 180, 180,
-180, 181, 181, 181, 181, 181, 181, 182, 182, 182,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 158, 158, 158, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 168, 168, 168, 168, 168, 168, 169,
-169, 169, 169, 169, 169, 170, 170, 170, 170, 170,
-170, 171, 171, 171, 171, 171, 171, 172, 172, 172,
-172, 172, 172, 173, 173, 173, 173, 173, 173, 174,
-174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
-176, 176, 176, 176, 177, 177, 177, 177, 177, 177,
-178, 178, 178, 178, 178, 178, 179, 179, 179, 179,
-179, 179, 180, 180, 180, 180, 180, 180, 181, 181,
-181, 181, 181, 181, 182, 182, 182, 182, 182, 182,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 159, 159, 159, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 168, 168, 168, 168, 168, 168, 169,
-169, 169, 169, 169, 169, 170, 170, 170, 171, 171,
-171, 171, 171, 171, 172, 172, 172, 172, 172, 172,
-173, 173, 173, 173, 173, 173, 174, 174, 174, 174,
-174, 174, 175, 175, 175, 175, 175, 175, 176, 176,
-176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
-178, 178, 178, 179, 179, 179, 179, 179, 179, 180,
-180, 180, 180, 180, 180, 181, 181, 181, 181, 181,
-181, 182, 182, 182, 182, 182, 182, 183, 183, 183,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
-171, 171, 171, 171, 172, 172, 172, 173, 173, 173,
-173, 173, 173, 174, 174, 174, 174, 174, 174, 175,
-175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
-176, 177, 177, 177, 177, 177, 177, 178, 178, 178,
-179, 179, 179, 179, 179, 179, 180, 180, 180, 180,
-180, 180, 181, 181, 181, 181, 181, 181, 182, 182,
-182, 182, 182, 182, 183, 183, 183, 183, 183, 183,
-157, 157, 157, 157, 157, 157, 157, 157, 157, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
-158, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 167, 167, 167, 167, 167, 167,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-168, 168, 168, 168, 168, 168, 169, 169, 169, 170,
-170, 170, 170, 170, 170, 171, 171, 171, 171, 171,
-171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-173, 173, 173, 174, 174, 174, 175, 175, 175, 175,
-175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
-177, 177, 177, 177, 178, 178, 178, 178, 178, 178,
-179, 179, 179, 179, 179, 179, 180, 180, 180, 181,
-181, 181, 181, 181, 181, 182, 182, 182, 182, 182,
-182, 183, 183, 183, 183, 183, 183, 184, 184, 184,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 159, 159, 159, 159, 159,
-159, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 168, 168, 168, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
-158, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 167, 167, 167,
-167, 167, 167, 168, 168, 168, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-166, 166, 166, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 159, 159, 159, 159, 159, 159, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
-158, 158, 158, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 171, 171, 171, 171, 171,
-171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
-175, 175, 176, 176, 176, 176, 176, 176, 177, 177,
-177, 178, 178, 178, 178, 178, 178, 179, 179, 179,
-179, 179, 179, 180, 180, 180, 180, 180, 180, 181,
-181, 181, 181, 181, 181, 182, 182, 182, 183, 183,
-183, 183, 183, 183, 184, 184, 184, 184, 184, 184,
-158, 158, 158, 158, 158, 158, 158, 158, 158, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 158, 158, 158, 158, 158,
-158, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 166, 166, 166,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-168, 168, 168, 168, 168, 168, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 171, 171, 171, 171, 171,
-171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-174, 174, 174, 174, 174, 174, 175, 175, 175, 175,
-175, 175, 176, 176, 176, 177, 177, 177, 177, 177,
-177, 178, 178, 178, 178, 178, 178, 179, 179, 179,
-180, 180, 180, 180, 180, 180, 181, 181, 181, 181,
-181, 181, 182, 182, 182, 182, 182, 182, 183, 183,
-183, 184, 184, 184, 184, 184, 184, 185, 185, 185,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 161, 161, 161, 161, 161, 161, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 164, 164,
-164, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 162, 162, 162, 162, 162,
-162, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 160, 160, 160, 160, 160, 160,
-161, 161, 161, 162, 162, 162, 162, 162, 162, 163,
-163, 163, 163, 163, 163, 164, 164, 164, 165, 165,
-165, 165, 165, 165, 166, 166, 166, 166, 166, 166,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
-168, 168, 168, 168, 168, 168, 168, 168, 168, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 167, 167, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-165, 165, 165, 165, 165, 165, 164, 164, 164, 164,
-164, 164, 163, 163, 163, 163, 163, 163, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 161, 161, 161,
-161, 161, 161, 160, 160, 160, 160, 160, 160, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 159, 159, 159,
-159, 159, 159, 159, 159, 159, 159, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
-160, 160, 160, 160, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
-161, 161, 161, 161, 161, 161, 161, 161, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 162, 162, 162, 162, 162,
-162, 162, 162, 162, 162, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
-163, 163, 163, 163, 163, 163, 163, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
-164, 164, 164, 164, 165, 165, 165, 165, 165, 165,
-165, 165, 165, 165, 165, 165, 165, 165, 165, 166,
-166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
-166, 166, 166, 166, 167, 167, 167, 167, 167, 167,
-167, 167, 167, 168, 168, 168, 169, 169, 169, 169,
-169, 169, 170, 170, 170, 170, 170, 170, 171, 171,
-171, 172, 172, 172, 172, 172, 172, 173, 173, 173,
-174, 174, 174, 174, 174, 174, 175, 175, 175, 176,
-176, 176, 176, 176, 176, 177, 177, 177, 177, 177,
-177, 178, 178, 178, 179, 179, 179, 179, 179, 179,
-180, 180, 180, 180, 180, 180, 181, 181, 181, 182,
-182, 182, 182, 182, 182, 183, 183, 183, 183, 183,
-183, 184, 184, 184, 185, 185, 185, 185, 185, 185,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
-113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
-113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
-113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
-113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
-113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
-113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
-113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
-113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-95, 95, 95, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 81, 81, 81, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 81, 81,
-81, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 81, 81, 81, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 81, 81, 81, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 81,
-81, 81, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 81, 81, 81, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
-113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
-113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
-113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
-113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-95, 95, 95, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
-113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
-113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 113, 113, 113, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 113, 113, 113, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 113,
-113, 113, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 113, 113,
-113, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 113, 113, 113, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 113, 113, 113, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 113, 113, 113, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 113, 113, 113, 94, 94, 94,
-113, 113, 113, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-81, 81, 81, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 81, 81, 81, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 81, 81, 81, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 81, 81, 81,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 95, 95, 95, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 95, 95, 95, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 95, 95, 95,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 95, 95, 95, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 101, 101, 101,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 95, 95, 95, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-95, 95, 95, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 95, 95, 95, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 95, 95, 95, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 81, 81, 81, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 81,
-81, 81, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 81, 81, 81, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 81, 81, 81, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 81, 81,
-81, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 81, 81, 81, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 85, 85, 85, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 85, 85, 85, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 85, 85, 85, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 85, 85, 85, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 85, 85, 85, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 85, 85, 85, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 81, 81, 81, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 81, 81, 81, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 81, 81, 81, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 95, 95, 95,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 81, 81, 81, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 81, 81, 81, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 81, 81, 81, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-85, 85, 85, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 113, 113, 113,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 85,
-85, 85, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 85, 85,
-85, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 85, 85, 85,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
-94, 94, 94, 94, 94, 94, 94, 94, 94, 94};
-static unsigned char *empty_world_camera1 MAYBE_UNUSED = __empty_world_camera1;
-
-static unsigned char __projector_world_camera[] = {
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 142, 140, 140, 139, 136,
-136, 143, 138, 138, 140, 137, 137, 132, 130, 130,
-145, 140, 140, 140, 137, 137, 139, 136, 136, 139,
-136, 136, 145, 142, 142, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 132, 130, 130, 142, 134, 134, 121,
-120, 120, 122, 120, 120, 134, 130, 130, 130, 127,
-127, 140, 133, 133, 140, 133, 133, 122, 121, 121,
-140, 133, 133, 133, 129, 129, 129, 126, 126, 125,
-123, 123, 129, 126, 126, 119, 118, 118, 132, 128,
-128, 131, 128, 128, 136, 133, 133, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 130, 124, 124,
-120, 117, 117, 105, 105, 105, 131, 123, 123, 116,
-113, 113, 109, 108, 108, 103, 102, 102, 107, 107,
-107, 118, 115, 115, 126, 121, 121, 132, 124, 124,
-118, 115, 115, 117, 114, 114, 114, 112, 112, 112,
-111, 111, 117, 114, 114, 117, 114, 114, 117, 114,
-114, 119, 116, 116, 118, 115, 115, 135, 127, 127,
-136, 128, 128, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 128, 122, 122, 112, 109, 109, 108, 105, 105,
-114, 110, 110, 107, 105, 105, 115, 110, 110, 110,
-107, 107, 105, 103, 103, 102, 100, 100, 104, 102,
-102, 111, 107, 107, 120, 114, 114, 116, 111, 111,
-106, 104, 104, 104, 102, 102, 104, 102, 102, 124,
-115, 115, 122, 115, 115, 114, 110, 110, 118, 112,
-112, 122, 114, 114, 114, 110, 110, 123, 116, 116,
-124, 117, 117, 126, 119, 119, 139, 127, 127, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 98, 98, 98, 112, 109,
-109, 117, 111, 111, 89, 88, 88, 83, 83, 83,
-86, 86, 86, 109, 103, 103, 109, 103, 103, 104,
-100, 100, 92, 91, 91, 98, 96, 96, 79, 79,
-79, 87, 86, 86, 119, 110, 110, 116, 108, 108,
-103, 99, 99, 104, 100, 100, 91, 90, 90, 101,
-98, 98, 106, 101, 101, 104, 100, 100, 104, 100,
-100, 122, 109, 109, 96, 95, 95, 106, 102, 102,
-123, 112, 112, 120, 111, 111, 125, 116, 116, 101,
-100, 100, 93, 93, 93, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 89, 88, 88, 85, 85, 85, 99, 97,
-97, 97, 94, 94, 78, 78, 78, 82, 81, 81,
-63, 63, 63, 98, 94, 94, 114, 103, 103, 107,
-100, 100, 111, 102, 102, 113, 104, 104, 79, 79,
-79, 79, 78, 78, 103, 97, 97, 105, 98, 98,
-85, 83, 83, 93, 90, 90, 108, 100, 100, 108,
-101, 101, 104, 97, 97, 98, 94, 94, 102, 97,
-97, 106, 99, 99, 90, 88, 88, 113, 104, 104,
-108, 101, 101, 105, 99, 99, 103, 99, 99, 93,
-91, 91, 102, 99, 99, 123, 115, 115, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 106, 104, 104, 104,
-100, 100, 98, 95, 95, 95, 92, 92, 97, 92,
-92, 88, 85, 85, 78, 77, 77, 63, 63, 63,
-51, 51, 51, 59, 58, 58, 97, 90, 90, 99,
-91, 91, 74, 73, 73, 77, 76, 76, 98, 90,
-90, 96, 89, 89, 80, 78, 78, 86, 83, 83,
-89, 85, 85, 90, 85, 85, 80, 78, 78, 70,
-69, 69, 74, 73, 73, 70, 69, 69, 87, 83,
-83, 95, 89, 89, 74, 73, 73, 85, 82, 82,
-81, 79, 79, 99, 93, 93, 89, 86, 86, 93,
-89, 89, 94, 91, 91, 96, 94, 94, 104, 101,
-101, 118, 112, 112, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 122, 113, 113, 114, 104, 104, 93,
-90, 90, 97, 91, 91, 93, 88, 88, 86, 82,
-82, 80, 77, 77, 90, 83, 83, 78, 75, 75,
-58, 57, 57, 53, 52, 52, 64, 63, 63, 79,
-75, 75, 81, 76, 76, 85, 80, 80, 99, 86,
-86, 93, 84, 84, 81, 77, 77, 83, 78, 78,
-81, 76, 76, 68, 66, 66, 69, 68, 68, 57,
-57, 57, 51, 51, 51, 51, 51, 51, 60, 60,
-60, 82, 77, 77, 74, 72, 72, 88, 83, 83,
-94, 86, 86, 97, 90, 90, 81, 79, 79, 87,
-84, 84, 92, 87, 87, 96, 92, 92, 102, 96,
-96, 93, 91, 91, 122, 112, 112, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-96, 95, 95, 96, 93, 93, 89, 86, 86, 80,
-78, 78, 83, 80, 80, 79, 76, 76, 74, 72,
-72, 54, 54, 54, 57, 56, 56, 89, 82, 82,
-111, 90, 90, 94, 82, 82, 83, 76, 76, 79,
-74, 74, 74, 70, 70, 41, 41, 41, 47, 47,
-47, 45, 44, 44, 49, 49, 49, 60, 58, 58,
-67, 64, 64, 56, 55, 55, 47, 46, 46, 71,
-67, 67, 75, 70, 70, 91, 79, 79, 79, 72,
-72, 77, 71, 71, 96, 84, 84, 67, 65, 65,
-75, 72, 72, 96, 87, 87, 84, 79, 79, 91,
-85, 85, 102, 92, 92, 91, 87, 87, 90, 86,
-86, 84, 82, 82, 95, 93, 93, 103, 101, 101,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 89, 88, 88,
-78, 77, 77, 77, 76, 76, 99, 91, 91, 72,
-70, 70, 80, 76, 76, 84, 78, 78, 85, 78,
-78, 60, 58, 58, 65, 62, 62, 62, 60, 60,
-90, 79, 79, 73, 68, 68, 78, 73, 73, 68,
-65, 65, 68, 65, 65, 50, 49, 49, 50, 49,
-49, 47, 46, 46, 51, 50, 50, 79, 73, 73,
-91, 81, 81, 52, 51, 51, 65, 62, 62, 56,
-55, 55, 61, 59, 59, 81, 73, 73, 74, 69,
-69, 70, 66, 66, 75, 71, 71, 58, 57, 57,
-76, 71, 71, 61, 59, 59, 70, 68, 68, 62,
-61, 61, 75, 72, 72, 71, 69, 69, 68, 67,
-67, 79, 76, 76, 80, 78, 78, 89, 86, 86,
-96, 94, 94, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 102, 99, 99, 89, 86, 86,
-75, 73, 73, 62, 61, 61, 70, 68, 68, 63,
-62, 62, 71, 68, 68, 85, 77, 77, 82, 75,
-75, 66, 63, 63, 76, 70, 70, 77, 71, 71,
-87, 78, 78, 81, 74, 74, 71, 67, 67, 57,
-56, 56, 60, 58, 58, 62, 60, 60, 56, 55,
-55, 61, 59, 59, 56, 55, 55, 60, 58, 58,
-67, 64, 64, 71, 67, 67, 65, 62, 62, 74,
-69, 69, 69, 65, 65, 64, 62, 62, 87, 77,
-77, 71, 67, 67, 61, 59, 59, 54, 52, 52,
-60, 58, 58, 60, 58, 58, 64, 61, 61, 49,
-49, 49, 70, 67, 67, 61, 59, 59, 58, 57,
-57, 79, 75, 75, 72, 70, 70, 83, 80, 80,
-94, 90, 90, 105, 101, 101, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 92, 88, 88, 93, 87, 87,
-98, 88, 88, 91, 83, 83, 45, 45, 45, 61,
-59, 59, 58, 57, 57, 69, 66, 66, 74, 70,
-70, 85, 77, 77, 72, 68, 68, 71, 67, 67,
-72, 68, 68, 78, 73, 73, 78, 72, 72, 74,
-69, 69, 79, 72, 72, 67, 64, 64, 55, 53,
-53, 67, 64, 64, 69, 66, 66, 61, 59, 59,
-66, 63, 63, 65, 62, 62, 76, 70, 70, 83,
-76, 76, 56, 54, 54, 74, 69, 69, 65, 63,
-63, 68, 65, 65, 70, 66, 66, 66, 63, 63,
-66, 62, 62, 67, 64, 64, 72, 68, 68, 69,
-66, 66, 76, 71, 71, 73, 69, 69, 48, 48,
-48, 91, 82, 82, 83, 78, 78, 112, 96, 96,
-94, 88, 88, 71, 71, 71, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 99, 94, 94, 74, 72, 72, 65, 64, 64,
-64, 63, 63, 62, 60, 60, 39, 39, 39, 58,
-56, 56, 65, 62, 62, 75, 70, 70, 72, 69,
-69, 94, 83, 83, 89, 80, 80, 72, 68, 68,
-75, 70, 70, 95, 84, 84, 87, 79, 79, 76,
-71, 71, 60, 58, 58, 91, 80, 80, 57, 56,
-56, 72, 68, 68, 100, 86, 86, 89, 80, 80,
-102, 86, 86, 66, 63, 63, 53, 52, 52, 61,
-59, 59, 46, 45, 45, 73, 68, 68, 64, 62,
-62, 46, 45, 45, 67, 64, 64, 63, 61, 61,
-69, 66, 66, 64, 61, 61, 63, 61, 61, 75,
-70, 70, 63, 61, 61, 61, 59, 59, 45, 44,
-44, 72, 68, 68, 66, 63, 63, 62, 60, 60,
-82, 78, 78, 60, 59, 59, 106, 98, 98, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 95, 91,
-91, 91, 86, 86, 85, 79, 79, 81, 74, 74,
-87, 78, 78, 90, 79, 79, 95, 82, 82, 63,
-61, 61, 47, 47, 47, 51, 50, 50, 56, 55,
-55, 62, 60, 60, 74, 69, 69, 65, 62, 62,
-70, 66, 66, 76, 71, 71, 72, 68, 68, 73,
-68, 68, 58, 56, 56, 68, 65, 65, 56, 54,
-54, 64, 61, 61, 82, 75, 75, 65, 62, 62,
-83, 75, 75, 64, 61, 61, 56, 54, 54, 56,
-54, 54, 65, 63, 63, 83, 75, 75, 67, 64,
-64, 60, 58, 58, 66, 64, 64, 73, 68, 68,
-75, 70, 70, 62, 60, 60, 60, 58, 58, 77,
-72, 72, 77, 72, 72, 80, 73, 73, 70, 67,
-67, 49, 49, 49, 46, 45, 45, 50, 49, 49,
-77, 72, 72, 67, 65, 65, 77, 75, 75, 91,
-88, 88, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 104, 94,
-94, 82, 77, 77, 78, 73, 73, 64, 61, 61,
-64, 61, 61, 77, 71, 71, 85, 77, 77, 77,
-72, 72, 51, 50, 50, 54, 53, 53, 64, 61,
-61, 64, 61, 61, 70, 66, 66, 80, 73, 73,
-79, 72, 72, 62, 59, 59, 59, 57, 57, 57,
-55, 55, 50, 49, 49, 56, 54, 54, 57, 56,
-56, 68, 65, 65, 73, 69, 69, 57, 55, 55,
-57, 56, 56, 48, 47, 47, 52, 51, 51, 51,
-50, 50, 78, 72, 72, 102, 85, 85, 85, 76,
-76, 67, 64, 64, 55, 53, 53, 79, 72, 72,
-72, 68, 68, 68, 65, 65, 76, 70, 70, 85,
-77, 77, 86, 78, 78, 67, 64, 64, 62, 60,
-60, 40, 40, 40, 72, 68, 68, 94, 83, 83,
-63, 60, 60, 82, 76, 76, 79, 75, 75, 86,
-82, 82, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 89, 85, 85, 102, 90,
-90, 72, 68, 68, 83, 76, 76, 60, 58, 58,
-93, 82, 82, 98, 85, 85, 88, 79, 79, 65,
-63, 63, 81, 75, 75, 58, 57, 57, 56, 54,
-54, 62, 60, 60, 85, 77, 77, 87, 79, 79,
-65, 62, 62, 64, 61, 61, 77, 72, 72, 83,
-76, 76, 81, 74, 74, 80, 73, 73, 51, 50,
-50, 63, 61, 61, 73, 68, 68, 73, 68, 68,
-76, 71, 71, 68, 65, 65, 60, 58, 58, 67,
-64, 64, 69, 66, 66, 64, 62, 62, 73, 68,
-68, 75, 70, 70, 75, 70, 70, 63, 60, 60,
-81, 74, 74, 76, 71, 71, 60, 58, 58, 60,
-58, 58, 57, 56, 56, 53, 52, 52, 89, 79,
-79, 98, 84, 84, 69, 66, 66, 61, 59, 59,
-58, 57, 57, 51, 50, 50, 59, 58, 58, 57,
-56, 56, 80, 78, 78, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 73, 70, 70, 83, 77,
-77, 74, 69, 69, 78, 73, 73, 74, 69, 69,
-74, 69, 69, 84, 77, 77, 68, 65, 65, 95,
-83, 83, 70, 67, 67, 77, 72, 72, 92, 81,
-81, 99, 84, 84, 76, 71, 71, 85, 78, 78,
-73, 68, 68, 77, 72, 72, 84, 77, 77, 93,
-83, 83, 97, 84, 84, 103, 85, 85, 71, 67,
-67, 63, 61, 61, 92, 82, 82, 99, 85, 85,
-76, 71, 71, 76, 71, 71, 74, 70, 70, 75,
-71, 71, 90, 81, 81, 63, 61, 61, 65, 63,
-63, 84, 77, 77, 68, 65, 65, 53, 52, 52,
-95, 83, 83, 89, 80, 80, 89, 80, 80, 85,
-78, 78, 84, 77, 77, 73, 69, 69, 61, 59,
-59, 81, 75, 75, 95, 83, 83, 89, 80, 80,
-78, 72, 72, 58, 57, 57, 73, 69, 69, 83,
-77, 77, 92, 85, 85, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 92, 85, 85, 63, 61, 61, 59, 57,
-57, 72, 68, 68, 89, 80, 80, 97, 84, 84,
-75, 69, 69, 82, 75, 75, 60, 58, 58, 65,
-62, 62, 90, 79, 79, 94, 82, 82, 67, 64,
-64, 71, 67, 67, 67, 64, 64, 70, 66, 66,
-70, 67, 67, 76, 71, 71, 89, 80, 80, 88,
-79, 79, 99, 84, 84, 92, 81, 81, 67, 64,
-64, 57, 56, 56, 57, 56, 56, 64, 61, 61,
-63, 60, 60, 86, 78, 78, 76, 71, 71, 68,
-65, 65, 68, 65, 65, 57, 56, 56, 64, 61,
-61, 56, 54, 54, 60, 58, 58, 86, 78, 78,
-61, 59, 59, 65, 62, 62, 64, 61, 61, 45,
-44, 44, 50, 49, 49, 58, 57, 57, 65, 63,
-63, 72, 68, 68, 67, 64, 64, 72, 67, 67,
-70, 66, 66, 70, 66, 66, 74, 69, 69, 90,
-80, 80, 88, 80, 80, 85, 82, 82, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 65, 64, 64, 79, 73, 73, 82, 75,
-75, 63, 61, 61, 67, 64, 64, 73, 68, 68,
-66, 63, 63, 82, 75, 75, 68, 65, 65, 57,
-56, 56, 63, 61, 61, 75, 70, 70, 80, 74,
-74, 63, 60, 60, 73, 68, 68, 72, 68, 68,
-73, 68, 68, 85, 78, 78, 77, 72, 72, 86,
-78, 78, 72, 68, 68, 76, 70, 70, 56, 54,
-54, 58, 57, 57, 76, 71, 71, 76, 71, 71,
-66, 63, 63, 62, 60, 60, 63, 61, 61, 70,
-66, 66, 79, 72, 72, 70, 66, 66, 63, 61,
-61, 67, 64, 64, 68, 65, 65, 66, 64, 64,
-58, 57, 57, 78, 73, 73, 69, 66, 66, 52,
-51, 51, 49, 49, 49, 70, 66, 66, 76, 71,
-71, 82, 75, 75, 66, 63, 63, 63, 60, 60,
-79, 73, 73, 84, 77, 77, 47, 46, 46, 57,
-56, 56, 69, 65, 65, 64, 62, 62, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 90,
-84, 84, 67, 65, 65, 46, 45, 45, 59, 57,
-57, 76, 71, 71, 80, 74, 74, 76, 71, 71,
-83, 76, 76, 90, 80, 80, 77, 72, 72, 75,
-70, 70, 79, 73, 73, 68, 65, 65, 74, 70,
-70, 72, 68, 68, 55, 54, 54, 50, 49, 49,
-77, 72, 72, 80, 74, 74, 70, 66, 66, 68,
-65, 65, 59, 57, 57, 69, 65, 65, 56, 55,
-55, 103, 103, 103, 102, 102, 102, 103, 103, 103,
-103, 103, 103, 103, 103, 103, 103, 103, 103, 61,
-59, 59, 67, 64, 64, 69, 65, 65, 49, 49,
-49, 48, 48, 48, 46, 45, 45, 54, 53, 53,
-70, 66, 66, 98, 85, 85, 86, 78, 78, 74,
-69, 69, 70, 67, 67, 104, 87, 87, 87, 78,
-78, 90, 79, 79, 80, 74, 74, 59, 57, 57,
-77, 72, 72, 105, 87, 87, 65, 62, 62, 39,
-39, 39, 83, 76, 76, 108, 90, 90, 107, 96,
-96, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 74,
-70, 70, 54, 53, 53, 75, 70, 70, 59, 58,
-58, 68, 65, 65, 58, 57, 57, 52, 51, 51,
-53, 52, 52, 57, 56, 56, 52, 51, 51, 53,
-52, 52, 75, 70, 70, 74, 70, 70, 65, 62,
-62, 70, 66, 66, 60, 58, 58, 47, 46, 46,
-65, 62, 62, 80, 74, 74, 78, 72, 72, 73,
-69, 69, 60, 58, 58, 78, 78, 78, 73, 73,
-73, 71, 71, 71, 70, 70, 70, 70, 70, 70,
-70, 70, 70, 70, 70, 70, 71, 71, 71, 73,
-73, 73, 79, 79, 79, 64, 62, 62, 55, 54,
-54, 66, 64, 64, 69, 66, 66, 61, 59, 59,
-73, 68, 68, 87, 79, 79, 85, 77, 77, 78,
-72, 72, 71, 67, 67, 72, 67, 67, 54, 53,
-53, 64, 62, 62, 75, 69, 69, 65, 63, 63,
-68, 65, 65, 57, 56, 56, 88, 79, 79, 51,
-50, 50, 38, 37, 37, 66, 63, 63, 49, 49,
-49, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 49,
-48, 48, 39, 39, 39, 52, 51, 51, 70, 66,
-66, 45, 44, 44, 57, 55, 55, 48, 48, 48,
-50, 49, 49, 56, 54, 54, 40, 40, 40, 34,
-34, 34, 46, 46, 46, 84, 76, 76, 71, 67,
-67, 65, 62, 62, 71, 67, 67, 64, 61, 61,
-66, 63, 63, 78, 72, 72, 83, 75, 75, 79,
-79, 79, 58, 58, 58, 49, 49, 49, 45, 45,
-45, 43, 43, 43, 42, 42, 42, 41, 41, 41,
-41, 41, 41, 42, 42, 42, 44, 44, 44, 46,
-46, 46, 50, 50, 50, 59, 59, 59, 80, 80,
-80, 67, 64, 64, 79, 74, 74, 55, 53, 53,
-85, 76, 76, 72, 68, 68, 80, 73, 73, 71,
-66, 66, 58, 57, 57, 62, 60, 60, 39, 39,
-39, 55, 54, 54, 98, 83, 83, 78, 71, 71,
-56, 55, 55, 39, 39, 39, 52, 51, 51, 73,
-68, 68, 77, 71, 71, 78, 72, 72, 69, 65,
-65, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 67,
-64, 64, 71, 67, 67, 72, 68, 68, 78, 72,
-72, 73, 69, 69, 72, 67, 67, 77, 71, 71,
-54, 53, 53, 47, 46, 46, 55, 53, 53, 76,
-70, 70, 76, 70, 70, 56, 55, 55, 55, 54,
-54, 68, 65, 65, 85, 77, 77, 78, 72, 72,
-55, 54, 54, 56, 55, 55, 74, 74, 74, 46,
-46, 46, 35, 35, 35, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 28, 28, 28, 35, 35, 35, 47, 47,
-47, 75, 75, 75, 68, 65, 65, 58, 57, 57,
-79, 73, 73, 50, 49, 49, 62, 60, 60, 81,
-73, 73, 52, 51, 51, 77, 71, 71, 87, 77,
-77, 81, 74, 74, 65, 63, 63, 47, 47, 47,
-55, 53, 53, 49, 48, 48, 40, 40, 40, 61,
-59, 59, 67, 64, 64, 72, 68, 68, 64, 62,
-62, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 57, 56, 56, 48,
-48, 48, 83, 77, 77, 73, 69, 69, 71, 68,
-68, 80, 74, 74, 86, 78, 78, 81, 74, 74,
-89, 78, 78, 52, 51, 51, 47, 46, 46, 60,
-59, 59, 81, 74, 74, 58, 56, 56, 78, 73,
-73, 86, 78, 78, 87, 79, 79, 73, 69, 69,
-51, 50, 50, 58, 56, 56, 40, 40, 40, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 26, 26,
-26, 41, 41, 41, 60, 58, 58, 48, 48, 48,
-66, 63, 63, 46, 45, 45, 63, 60, 60, 70,
-66, 66, 73, 69, 69, 75, 70, 70, 93, 81,
-81, 85, 77, 77, 68, 65, 65, 58, 56, 56,
-78, 73, 73, 79, 73, 73, 57, 56, 56, 76,
-70, 70, 76, 71, 71, 76, 71, 71, 94, 82,
-82, 85, 78, 78, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 56, 55, 55, 52,
-51, 51, 57, 56, 56, 60, 58, 58, 69, 65,
-65, 61, 59, 59, 58, 56, 56, 64, 61, 61,
-83, 75, 75, 65, 62, 62, 64, 61, 61, 86,
-77, 77, 92, 79, 79, 64, 61, 61, 56, 55,
-55, 42, 42, 42, 42, 42, 42, 50, 49, 49,
-58, 56, 56, 41, 41, 41, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 42, 42, 42, 54, 53, 53,
-69, 65, 65, 84, 75, 75, 71, 66, 66, 64,
-61, 61, 68, 65, 65, 79, 73, 73, 75, 70,
-70, 68, 64, 64, 64, 61, 61, 75, 69, 69,
-55, 53, 53, 53, 52, 52, 75, 69, 69, 84,
-75, 75, 55, 53, 53, 47, 46, 46, 66, 64,
-64, 61, 59, 59, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 70, 66, 66, 56,
-54, 54, 54, 53, 53, 82, 74, 74, 83, 75,
-75, 68, 65, 65, 65, 62, 62, 62, 60, 60,
-81, 74, 74, 60, 58, 58, 60, 58, 58, 73,
-69, 69, 82, 74, 74, 83, 76, 76, 59, 57,
-57, 57, 55, 55, 60, 58, 58, 69, 66, 66,
-54, 53, 53, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 81, 74, 74,
-66, 63, 63, 91, 81, 81, 84, 76, 76, 67,
-64, 64, 65, 62, 62, 73, 68, 68, 67, 64,
-64, 70, 66, 66, 67, 64, 64, 69, 66, 66,
-67, 64, 64, 49, 49, 49, 58, 56, 56, 85,
-76, 76, 77, 72, 72, 65, 62, 62, 71, 67,
-67, 80, 74, 74, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 38, 38, 38, 36,
-36, 36, 40, 40, 40, 67, 64, 64, 87, 78,
-78, 92, 81, 81, 90, 80, 80, 85, 78, 78,
-85, 78, 78, 76, 72, 72, 57, 56, 56, 71,
-67, 67, 71, 67, 67, 85, 77, 77, 72, 68,
-68, 57, 55, 55, 70, 66, 66, 85, 77, 77,
-39, 39, 39, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 40, 40, 40,
-74, 70, 70, 94, 83, 83, 83, 76, 76, 82,
-75, 75, 76, 71, 71, 72, 68, 68, 56, 54,
-54, 69, 66, 66, 77, 72, 72, 75, 71, 71,
-73, 69, 69, 60, 58, 58, 60, 58, 58, 91,
-81, 81, 87, 78, 78, 64, 61, 61, 97, 84,
-84, 71, 67, 67, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 83, 75, 75, 83,
-75, 75, 84, 76, 76, 63, 61, 61, 51, 50,
-50, 76, 70, 70, 58, 56, 56, 51, 50, 50,
-49, 49, 49, 52, 51, 51, 51, 50, 50, 63,
-60, 60, 89, 79, 79, 50, 49, 49, 50, 49,
-49, 63, 60, 60, 70, 66, 66, 80, 74, 74,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-80, 74, 74, 99, 85, 85, 62, 60, 60, 48,
-48, 48, 49, 49, 49, 66, 63, 63, 61, 59,
-59, 52, 51, 51, 49, 49, 49, 78, 72, 72,
-71, 67, 67, 78, 72, 72, 61, 59, 59, 58,
-57, 57, 59, 57, 57, 63, 60, 60, 80, 74,
-74, 85, 77, 77, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 83, 76, 76, 88,
-79, 79, 105, 87, 87, 93, 82, 82, 83, 75,
-75, 87, 78, 78, 76, 70, 70, 69, 66, 66,
-53, 52, 52, 57, 56, 56, 66, 63, 63, 73,
-69, 69, 79, 73, 73, 62, 60, 60, 43, 43,
-43, 48, 47, 47, 56, 54, 54, 74, 69, 69,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-65, 63, 63, 73, 68, 68, 69, 65, 65, 45,
-44, 44, 57, 56, 56, 57, 56, 56, 91, 80,
-80, 82, 74, 74, 59, 57, 57, 52, 51, 51,
-67, 64, 64, 94, 83, 83, 110, 88, 88, 70,
-67, 67, 62, 60, 60, 68, 65, 65, 83, 75,
-75, 64, 61, 61, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 27, 27, 27, 32,
-32, 32, 50, 49, 49, 42, 42, 42, 33, 33,
-33, 47, 46, 46, 65, 62, 62, 54, 53, 53,
-29, 29, 29, 28, 28, 28, 44, 44, 44, 66,
-64, 64, 60, 58, 58, 71, 67, 67, 70, 67,
-67, 73, 69, 69, 105, 89, 89, 90, 80, 80,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-79, 73, 73, 85, 77, 77, 81, 75, 75, 76,
-71, 71, 79, 73, 73, 71, 67, 67, 53, 52,
-52, 71, 67, 67, 82, 75, 75, 60, 58, 58,
-85, 77, 77, 92, 81, 81, 85, 77, 77, 68,
-65, 65, 95, 84, 84, 85, 78, 78, 57, 56,
-56, 52, 51, 51, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 45, 44, 44, 38,
-37, 37, 45, 44, 44, 42, 42, 42, 39, 38,
-38, 66, 64, 64, 77, 72, 72, 58, 57, 57,
-54, 53, 53, 42, 42, 42, 51, 50, 50, 77,
-72, 72, 77, 72, 72, 69, 66, 66, 76, 70,
-70, 75, 70, 70, 75, 70, 70, 87, 79, 79,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-59, 57, 57, 77, 72, 72, 78, 73, 73, 74,
-70, 70, 73, 69, 69, 71, 68, 68, 74, 69,
-69, 73, 69, 69, 80, 74, 74, 75, 70, 70,
-83, 76, 76, 98, 84, 84, 83, 76, 76, 55,
-53, 53, 67, 64, 64, 77, 72, 72, 66, 63,
-63, 50, 49, 49, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 79, 73, 73, 62,
-60, 60, 74, 69, 69, 64, 61, 61, 54, 53,
-53, 80, 74, 74, 71, 67, 67, 70, 67, 67,
-77, 72, 72, 64, 61, 61, 64, 61, 61, 64,
-61, 61, 64, 61, 61, 69, 66, 66, 72, 67,
-67, 54, 52, 52, 39, 38, 38, 58, 57, 57,
-57, 56, 56, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 66, 63, 63,
-48, 47, 47, 66, 63, 63, 75, 70, 70, 79,
-73, 73, 68, 65, 65, 60, 58, 58, 70, 67,
-67, 76, 70, 70, 54, 53, 53, 69, 66, 66,
-79, 73, 73, 76, 71, 71, 66, 63, 63, 57,
-56, 56, 49, 49, 49, 48, 47, 47, 77, 71,
-71, 77, 72, 72, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 58, 56, 56, 58,
-56, 56, 70, 66, 66, 84, 76, 76, 72, 68,
-68, 74, 70, 70, 68, 65, 65, 71, 67, 67,
-79, 73, 73, 62, 60, 60, 82, 75, 75, 80,
-74, 74, 74, 69, 69, 65, 62, 62, 65, 62,
-62, 66, 63, 63, 76, 71, 71, 82, 75, 75,
-69, 66, 66, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 71, 67, 67,
-64, 61, 61, 90, 80, 80, 87, 78, 78, 88,
-80, 80, 90, 79, 79, 86, 77, 77, 89, 79,
-79, 76, 70, 70, 70, 67, 67, 67, 64, 64,
-75, 70, 70, 80, 74, 74, 60, 58, 58, 50,
-49, 49, 69, 65, 65, 62, 60, 60, 49, 49,
-49, 52, 51, 51, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 67, 64, 64, 83,
-77, 77, 73, 70, 70, 96, 85, 85, 80, 75,
-75, 87, 79, 79, 65, 63, 63, 50, 49, 49,
-66, 64, 64, 88, 80, 80, 79, 73, 73, 72,
-68, 68, 57, 56, 56, 86, 79, 79, 59, 57,
-57, 49, 49, 49, 76, 71, 71, 89, 80, 80,
-89, 81, 81, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 96, 84, 84,
-90, 81, 81, 87, 79, 79, 85, 78, 78, 102,
-86, 86, 82, 76, 76, 84, 77, 77, 91, 80,
-80, 91, 81, 81, 85, 78, 78, 97, 84, 84,
-83, 76, 76, 75, 70, 70, 69, 66, 66, 36,
-36, 36, 46, 45, 45, 70, 67, 67, 82, 76,
-76, 78, 73, 73, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 56,
-55, 55, 65, 63, 63, 54, 53, 53, 48, 48,
-48, 76, 71, 71, 78, 73, 73, 39, 39, 39,
-40, 40, 40, 68, 65, 65, 70, 66, 66, 91,
-80, 80, 57, 56, 56, 48, 47, 47, 63, 60,
-60, 60, 58, 58, 52, 51, 51, 48, 48, 48,
-49, 49, 49, 73, 68, 68, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 96, 84, 84, 85, 76, 76,
-53, 52, 52, 54, 52, 52, 57, 56, 56, 78,
-72, 72, 84, 76, 76, 76, 71, 71, 66, 64,
-64, 57, 56, 56, 48, 47, 47, 41, 41, 41,
-75, 71, 71, 82, 75, 75, 59, 57, 57, 80,
-73, 73, 80, 73, 73, 79, 72, 72, 76, 70,
-70, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 67,
-64, 64, 86, 77, 77, 92, 81, 81, 73, 68,
-68, 60, 58, 58, 60, 58, 58, 46, 45, 45,
-64, 62, 62, 96, 83, 83, 76, 71, 71, 61,
-59, 59, 68, 64, 64, 65, 62, 62, 57, 55,
-55, 64, 62, 62, 58, 56, 56, 58, 56, 56,
-70, 66, 66, 65, 62, 62, 80, 73, 73, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 70, 66, 66, 78, 72, 72, 71, 67, 67,
-63, 61, 61, 64, 61, 61, 67, 64, 64, 71,
-67, 67, 74, 69, 69, 65, 62, 62, 52, 51,
-51, 62, 60, 60, 65, 62, 62, 58, 56, 56,
-74, 69, 69, 62, 60, 60, 59, 57, 57, 62,
-60, 60, 40, 40, 40, 48, 47, 47, 71, 67,
-67, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
-134, 134, 134, 141, 139, 139, 149, 145, 145, 152,
-146, 146, 152, 146, 146, 153, 147, 147, 153, 147,
-147, 152, 147, 147, 152, 146, 146, 149, 144, 144,
-150, 145, 145, 149, 144, 144, 148, 144, 144, 149,
-145, 145, 149, 145, 145, 150, 146, 146, 164, 152,
-152, 169, 152, 152, 162, 150, 150, 147, 144, 144,
-137, 136, 136, 134, 134, 134, 134, 133, 133, 138,
-137, 137, 143, 141, 141, 145, 142, 142, 151, 146,
-146, 153, 147, 147, 147, 143, 143, 145, 142, 142,
-142, 140, 140, 136, 135, 135, 144, 141, 141, 151,
-146, 146, 157, 148, 148, 155, 148, 148, 157, 148,
-148, 163, 150, 150, 157, 149, 149, 150, 145, 145,
-142, 140, 140, 140, 139, 139, 146, 143, 143, 155,
-148, 148, 153, 147, 147, 149, 146, 146, 144, 142,
-142, 135, 135, 135, 134, 134, 134, 136, 136, 136,
-137, 136, 136, 141, 139, 139, 145, 143, 143, 149,
-145, 145, 152, 147, 147, 155, 149, 149, 159, 151,
-151, 149, 145, 145, 146, 143, 143, 151, 146, 146,
-155, 148, 148, 154, 148, 148, 149, 145, 145, 138,
-137, 137, 130, 130, 130, 128, 128, 128, 145, 142,
-142, 153, 147, 147, 157, 150, 150, 151, 147, 147,
-149, 146, 146, 143, 141, 141, 127, 127, 127, 135,
-134, 134, 139, 138, 138, 131, 131, 131, 141, 140,
-140, 148, 145, 145, 148, 145, 145, 147, 144, 144,
-150, 146, 146, 158, 150, 150, 154, 148, 148, 144,
-142, 142, 132, 132, 132, 140, 139, 139, 143, 141,
-141, 143, 141, 141, 141, 140, 140, 140, 139, 139,
-144, 142, 142, 155, 149, 149, 154, 149, 149, 148,
-145, 145, 141, 140, 140, 146, 143, 143, 149, 146,
-146, 153, 149, 149, 146, 143, 143, 145, 143, 143,
-141, 140, 140, 148, 145, 145, 152, 148, 148, 166,
-154, 154, 153, 148, 148, 146, 144, 144, 141, 140,
-140, 147, 144, 144, 163, 152, 152, 176, 153, 153,
-140, 139, 139, 134, 134, 134, 136, 136, 136, 137,
-137, 137, 139, 138, 138, 141, 140, 140, 138, 137,
-137, 139, 138, 138, 145, 143, 143, 161, 153, 153,
-158, 151, 151, 153, 149, 149, 156, 151, 151, 156,
-151, 151, 144, 142, 142, 154, 149, 149, 174, 152,
-152, 181, 146, 146, 181, 145, 145, 179, 147, 147,
-163, 152, 152, 140, 139, 139, 138, 137, 137, 51,
-50, 50, 38, 38, 38, 39, 39, 39, 46, 45,
-45, 55, 54, 54, 65, 62, 62, 69, 65, 65,
-82, 75, 75, 94, 84, 84, 78, 72, 72, 74,
-69, 69, 65, 62, 62, 71, 67, 67, 68, 65,
-65, 65, 62, 62, 55, 54, 54, 60, 58, 58,
-73, 68, 68, 73, 68, 68, 77, 71, 71, 88,
-77, 77, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 79, 72,
-72, 77, 72, 72, 60, 59, 59, 58, 57, 57,
-73, 69, 69, 73, 69, 69, 74, 69, 69, 78,
-73, 73, 84, 76, 76, 69, 66, 66, 62, 60,
-60, 51, 50, 50, 53, 52, 52, 77, 71, 71,
-76, 71, 71, 89, 79, 79, 63, 60, 60, 58,
-56, 56, 62, 60, 60, 86, 77, 77, 84, 76,
-76, 157, 151, 151, 153, 148, 148, 160, 152, 152,
-168, 157, 157, 154, 149, 149, 164, 154, 154, 152,
-148, 148, 156, 150, 150, 158, 151, 151, 157, 151,
-151, 161, 153, 153, 158, 152, 152, 146, 144, 144,
-148, 145, 145, 172, 152, 152, 165, 153, 153, 136,
-136, 136, 131, 131, 131, 134, 134, 134, 148, 145,
-145, 154, 149, 149, 166, 154, 154, 170, 156, 156,
-168, 154, 154, 151, 147, 147, 148, 145, 145, 152,
-147, 147, 157, 150, 150, 155, 149, 149, 136, 136,
-136, 135, 135, 135, 133, 133, 133, 132, 132, 132,
-134, 134, 134, 136, 136, 136, 138, 137, 137, 138,
-137, 137, 140, 139, 139, 141, 140, 140, 138, 138,
-138, 137, 136, 136, 139, 138, 138, 152, 148, 148,
-149, 145, 145, 154, 149, 149, 178, 152, 152, 167,
-152, 152, 155, 148, 148, 156, 149, 149, 153, 147,
-147, 152, 147, 147, 154, 149, 149, 133, 133, 133,
-129, 129, 129, 140, 139, 139, 151, 147, 147, 150,
-146, 146, 143, 141, 141, 155, 149, 149, 162, 151,
-151, 162, 150, 150, 149, 145, 145, 145, 142, 142,
-144, 142, 142, 139, 138, 138, 139, 138, 138, 139,
-138, 138, 131, 131, 131, 135, 134, 134, 142, 140,
-140, 147, 144, 144, 148, 145, 145, 147, 144, 144,
-142, 140, 140, 142, 140, 140, 144, 142, 142, 149,
-145, 145, 145, 143, 143, 143, 141, 141, 144, 142,
-142, 143, 141, 141, 144, 142, 142, 145, 143, 143,
-140, 139, 139, 140, 139, 139, 145, 143, 143, 157,
-149, 149, 151, 146, 146, 140, 139, 139, 135, 134,
-134, 142, 140, 140, 147, 143, 143, 139, 138, 138,
-140, 139, 139, 143, 140, 140, 145, 142, 142, 144,
-141, 141, 147, 144, 144, 153, 148, 148, 146, 143,
-143, 146, 143, 143, 153, 147, 147, 152, 147, 147,
-152, 146, 146, 152, 147, 147, 153, 147, 147, 150,
-145, 145, 144, 141, 141, 141, 139, 139, 138, 137,
-137, 138, 137, 137, 140, 138, 138, 139, 138, 138,
-138, 137, 137, 137, 136, 136, 135, 135, 135, 134,
-133, 133, 133, 132, 132, 142, 139, 139, 146, 143,
-143, 145, 142, 142, 144, 141, 141, 142, 139, 139,
-139, 138, 138, 140, 138, 138, 145, 142, 142, 150,
-145, 145, 146, 143, 143, 141, 139, 139, 139, 138,
-138, 140, 138, 138, 142, 140, 140, 143, 140, 140,
-147, 144, 144, 144, 141, 141, 141, 139, 139, 145,
-142, 142, 150, 145, 145, 153, 147, 147, 151, 146,
-146, 155, 148, 148, 160, 150, 150, 164, 151, 151,
-166, 151, 151, 164, 150, 150, 160, 150, 150, 157,
-148, 148, 157, 149, 149, 159, 150, 150, 154, 148,
-148, 156, 149, 149, 167, 152, 152, 167, 151, 151,
-156, 148, 148, 142, 140, 140, 142, 140, 140, 140,
-139, 139, 137, 136, 136, 133, 133, 133, 132, 131,
-131, 135, 134, 134, 142, 140, 140, 148, 144, 144,
-154, 146, 146, 158, 149, 149, 153, 146, 146, 144,
-142, 142, 138, 137, 137, 151, 146, 146, 154, 148,
-148, 146, 143, 143, 150, 146, 146, 153, 147, 147,
-153, 146, 146, 145, 142, 142, 145, 142, 142, 150,
-146, 146, 161, 150, 150, 165, 151, 151, 165, 151,
-151, 165, 153, 153, 151, 147, 147, 143, 141, 141,
-142, 141, 141, 143, 142, 142, 144, 143, 143, 144,
-142, 142, 136, 135, 135, 139, 138, 138, 147, 144,
-144, 156, 150, 150, 150, 146, 146, 148, 144, 144,
-160, 150, 150, 172, 150, 150, 174, 149, 149, 159,
-150, 150, 143, 141, 141, 132, 132, 132, 127, 127,
-127, 131, 131, 131, 136, 135, 135, 140, 139, 139,
-139, 138, 138, 137, 136, 136, 132, 132, 132, 126,
-126, 126, 127, 127, 127, 132, 131, 131, 139, 138,
-138, 152, 146, 146, 159, 150, 150, 159, 150, 150,
-154, 148, 148, 161, 151, 151, 175, 149, 149, 172,
-152, 152, 155, 149, 149, 138, 137, 137, 141, 140,
-140, 143, 141, 141, 145, 143, 143, 150, 147, 147,
-146, 144, 144, 142, 141, 141, 138, 137, 137, 132,
-132, 132, 130, 130, 130, 132, 132, 132, 141, 140,
-140, 154, 148, 148, 165, 151, 151, 148, 145, 145,
-143, 142, 142, 140, 139, 139, 130, 130, 130, 149,
-146, 146, 165, 153, 153, 168, 155, 155, 161, 153,
-153, 148, 145, 145, 138, 137, 137, 158, 152, 152,
-155, 150, 150, 152, 148, 148, 160, 152, 152, 164,
-153, 153, 167, 155, 155, 167, 155, 155, 152, 148,
-148, 136, 136, 136, 150, 147, 147, 170, 153, 153,
-180, 147, 147, 170, 152, 152, 156, 149, 149, 163,
-152, 152, 176, 151, 151, 138, 137, 137, 137, 137,
-137, 151, 147, 147, 151, 146, 146, 153, 148, 148,
-163, 151, 151, 170, 153, 153, 168, 155, 155, 117,
-88, 88, 104, 84, 84, 59, 57, 57, 69, 66,
-66, 81, 74, 74, 66, 63, 63, 67, 64, 64,
-82, 75, 75, 81, 74, 74, 75, 70, 70, 73,
-69, 69, 61, 59, 59, 62, 60, 60, 61, 59,
-59, 62, 60, 60, 57, 56, 56, 49, 48, 48,
-66, 63, 63, 63, 60, 60, 66, 63, 63, 77,
-71, 71, 77, 71, 71, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 66, 63, 63, 67, 64,
-64, 66, 63, 63, 60, 58, 58, 49, 48, 48,
-77, 72, 72, 64, 61, 61, 60, 58, 58, 61,
-59, 59, 64, 62, 62, 71, 67, 67, 67, 63,
-63, 63, 60, 60, 57, 56, 56, 57, 55, 55,
-66, 63, 63, 82, 75, 75, 69, 65, 65, 82,
-75, 75, 93, 81, 81, 83, 75, 75, 115, 87,
-87, 169, 154, 154, 154, 148, 148, 170, 152, 152,
-164, 153, 153, 158, 152, 152, 175, 154, 154, 171,
-153, 153, 175, 148, 148, 165, 149, 149, 179, 147,
-147, 179, 149, 149, 169, 150, 150, 144, 142, 142,
-150, 146, 146, 172, 154, 154, 146, 144, 144, 140,
-139, 139, 140, 139, 139, 141, 140, 140, 146, 144,
-144, 157, 151, 151, 160, 152, 152, 158, 151, 151,
-146, 144, 144, 129, 129, 129, 128, 128, 128, 138,
-137, 137, 157, 150, 150, 161, 152, 152, 160, 152,
-152, 153, 149, 149, 137, 136, 136, 137, 137, 137,
-141, 141, 141, 142, 141, 141, 141, 140, 140, 141,
-140, 140, 143, 142, 142, 135, 134, 134, 129, 129,
-129, 127, 127, 127, 148, 145, 145, 160, 151, 151,
-167, 151, 151, 167, 153, 153, 158, 151, 151, 145,
-143, 143, 145, 143, 143, 139, 138, 138, 134, 134,
-134, 140, 139, 139, 131, 131, 131, 127, 127, 127,
-135, 134, 134, 163, 150, 150, 170, 150, 150, 157,
-149, 149, 161, 152, 152, 156, 149, 149, 147, 144,
-144, 148, 145, 145, 152, 147, 147, 158, 150, 150,
-159, 151, 151, 166, 152, 152, 163, 152, 152, 143,
-141, 141, 158, 150, 150, 167, 152, 152, 163, 152,
-152, 166, 152, 152, 167, 153, 153, 169, 153, 153,
-169, 152, 152, 168, 152, 152, 164, 152, 152, 148,
-145, 145, 152, 148, 148, 157, 150, 150, 146, 143,
-143, 149, 145, 145, 152, 147, 147, 147, 144, 144,
-139, 138, 138, 139, 138, 138, 148, 144, 144, 147,
-144, 144, 147, 144, 144, 150, 146, 146, 160, 150,
-150, 162, 151, 151, 160, 150, 150, 161, 151, 151,
-155, 148, 148, 148, 145, 145, 144, 141, 141, 144,
-142, 142, 145, 143, 143, 145, 143, 143, 146, 143,
-143, 146, 143, 143, 144, 142, 142, 144, 142, 142,
-151, 146, 146, 159, 150, 150, 152, 147, 147, 147,
-144, 144, 147, 144, 144, 152, 147, 147, 155, 148,
-148, 156, 148, 148, 153, 147, 147, 152, 146, 146,
-150, 145, 145, 144, 141, 141, 133, 132, 132, 128,
-128, 128, 133, 132, 132, 142, 139, 139, 147, 143,
-143, 148, 143, 143, 142, 140, 140, 142, 139, 139,
-148, 144, 144, 160, 149, 149, 156, 148, 148, 148,
-145, 145, 146, 143, 143, 145, 143, 143, 141, 139,
-139, 136, 135, 135, 139, 138, 138, 143, 141, 141,
-144, 142, 142, 146, 143, 143, 150, 145, 145, 151,
-146, 146, 150, 146, 146, 153, 148, 148, 155, 148,
-148, 157, 149, 149, 162, 151, 151, 163, 151, 151,
-161, 151, 151, 160, 150, 150, 165, 150, 150, 163,
-151, 151, 157, 149, 149, 154, 148, 148, 156, 149,
-149, 160, 151, 151, 160, 151, 151, 164, 151, 151,
-169, 151, 151, 172, 150, 150, 158, 149, 149, 152,
-147, 147, 157, 149, 149, 148, 145, 145, 140, 138,
-138, 134, 133, 133, 133, 133, 133, 136, 135, 135,
-141, 140, 140, 146, 142, 142, 148, 144, 144, 146,
-143, 143, 141, 139, 139, 134, 133, 133, 142, 140,
-140, 158, 150, 150, 159, 150, 150, 153, 147, 147,
-148, 144, 144, 156, 149, 149, 149, 145, 145, 145,
-142, 142, 151, 146, 146, 155, 148, 148, 157, 149,
-149, 159, 150, 150, 163, 153, 153, 158, 151, 151,
-151, 147, 147, 150, 146, 146, 153, 149, 149, 156,
-150, 150, 157, 150, 150, 152, 147, 147, 146, 144,
-144, 143, 142, 142, 146, 144, 144, 143, 141, 141,
-140, 139, 139, 159, 150, 150, 165, 151, 151, 167,
-151, 151, 167, 151, 151, 158, 150, 150, 152, 148,
-148, 149, 146, 146, 148, 145, 145, 150, 146, 146,
-153, 148, 148, 153, 148, 148, 150, 146, 146, 144,
-142, 142, 134, 134, 134, 132, 132, 132, 135, 134,
-134, 143, 141, 141, 150, 146, 146, 157, 150, 150,
-162, 152, 152, 164, 153, 153, 166, 153, 153, 169,
-152, 152, 177, 154, 154, 163, 153, 153, 150, 146,
-146, 149, 146, 146, 140, 139, 139, 146, 143, 143,
-165, 154, 154, 161, 153, 153, 159, 151, 151, 156,
-150, 150, 150, 147, 147, 149, 147, 147, 152, 148,
-148, 156, 150, 150, 156, 149, 149, 150, 146, 146,
-135, 135, 135, 152, 148, 148, 150, 147, 147, 141,
-140, 140, 156, 151, 151, 167, 154, 154, 170, 154,
-154, 159, 152, 152, 153, 149, 149, 155, 150, 150,
-154, 150, 150, 147, 145, 145, 152, 148, 148, 150,
-147, 147, 154, 149, 149, 159, 152, 152, 165, 155,
-155, 154, 150, 150, 151, 148, 148, 158, 151, 151,
-166, 152, 152, 162, 151, 151, 151, 147, 147, 136,
-135, 135, 169, 152, 152, 153, 148, 148, 146, 145,
-145, 152, 149, 149, 144, 143, 143, 135, 135, 135,
-137, 136, 136, 151, 147, 147, 155, 149, 149, 168,
-154, 154, 76, 71, 71, 58, 57, 57, 40, 40,
-40, 74, 69, 69, 96, 82, 82, 85, 76, 76,
-77, 71, 71, 68, 65, 65, 56, 55, 55, 52,
-51, 51, 48, 48, 48, 62, 60, 60, 83, 75,
-75, 63, 60, 60, 56, 55, 55, 38, 38, 38,
-70, 66, 66, 63, 60, 60, 65, 62, 62, 63,
-61, 61, 68, 65, 65, 55, 54, 54, 48, 48,
-48, 62, 60, 60, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 58, 57, 57, 65,
-63, 63, 71, 67, 67, 67, 64, 64, 79, 72,
-72, 64, 61, 61, 48, 47, 47, 46, 45, 45,
-73, 69, 69, 76, 70, 70, 66, 63, 63, 56,
-54, 54, 58, 57, 57, 66, 63, 63, 68, 65,
-65, 65, 62, 62, 76, 70, 70, 74, 69, 69,
-53, 52, 52, 54, 53, 53, 92, 80, 80, 87,
-77, 77, 68, 64, 64, 62, 60, 60, 171, 155,
-155, 157, 151, 151, 152, 148, 148, 163, 153, 153,
-168, 154, 154, 179, 151, 151, 181, 152, 152, 158,
-150, 150, 155, 149, 149, 149, 146, 146, 183, 150,
-150, 175, 150, 150, 162, 151, 151, 149, 146, 146,
-167, 155, 155, 169, 156, 156, 161, 154, 154, 168,
-154, 154, 163, 153, 153, 159, 153, 153, 163, 155,
-155, 159, 152, 152, 156, 151, 151, 168, 156, 156,
-141, 140, 140, 128, 128, 128, 127, 127, 127, 139,
-138, 138, 147, 144, 144, 152, 148, 148, 165, 154,
-154, 155, 150, 150, 154, 150, 150, 157, 151, 151,
-154, 150, 150, 154, 150, 150, 155, 149, 149, 160,
-152, 152, 158, 151, 151, 148, 146, 146, 130, 130,
-130, 148, 145, 145, 164, 153, 153, 156, 149, 149,
-160, 152, 152, 158, 152, 152, 151, 147, 147, 152,
-148, 148, 141, 140, 140, 132, 132, 132, 151, 148,
-148, 151, 148, 148, 149, 146, 146, 153, 148, 148,
-156, 149, 149, 154, 147, 147, 146, 143, 143, 160,
-152, 152, 154, 149, 149, 136, 135, 135, 139, 138,
-138, 146, 144, 144, 154, 149, 149, 157, 151, 151,
-169, 154, 154, 170, 154, 154, 153, 149, 149, 163,
-153, 153, 162, 152, 152, 153, 147, 147, 159, 150,
-150, 163, 152, 152, 165, 152, 152, 167, 151, 151,
-163, 152, 152, 157, 150, 150, 149, 146, 146, 149,
-145, 145, 144, 142, 142, 137, 136, 136, 141, 140,
-140, 141, 140, 140, 137, 136, 136, 131, 131, 131,
-133, 133, 133, 139, 138, 138, 145, 143, 143, 147,
-144, 144, 153, 148, 148, 163, 152, 152, 158, 150,
-150, 156, 149, 149, 156, 149, 149, 155, 149, 149,
-156, 149, 149, 156, 149, 149, 154, 149, 149, 152,
-148, 148, 151, 147, 147, 150, 146, 146, 147, 144,
-144, 142, 140, 140, 140, 138, 138, 151, 146, 146,
-156, 150, 150, 154, 149, 149, 151, 147, 147, 148,
-145, 145, 150, 145, 145, 155, 148, 148, 155, 148,
-148, 152, 146, 146, 148, 144, 144, 153, 148, 148,
-142, 140, 140, 126, 126, 126, 125, 125, 125, 134,
-133, 133, 143, 140, 140, 148, 144, 144, 145, 142,
-142, 145, 142, 142, 151, 146, 146, 164, 150, 150,
-165, 151, 151, 155, 148, 148, 153, 147, 147, 151,
-147, 147, 147, 144, 144, 138, 137, 137, 138, 137,
-137, 141, 140, 140, 145, 142, 142, 141, 139, 139,
-150, 146, 146, 146, 143, 143, 143, 141, 141, 143,
-141, 141, 152, 146, 146, 155, 148, 148, 156, 149,
-149, 158, 150, 150, 157, 149, 149, 162, 151, 151,
-174, 151, 151, 163, 151, 151, 154, 148, 148, 150,
-145, 145, 158, 149, 149, 155, 148, 148, 149, 145,
-145, 145, 142, 142, 151, 147, 147, 159, 150, 150,
-167, 152, 152, 165, 151, 151, 171, 151, 151, 172,
-151, 151, 159, 149, 149, 166, 151, 151, 166, 152,
-152, 154, 149, 149, 145, 143, 143, 141, 140, 140,
-140, 139, 139, 141, 140, 140, 139, 138, 138, 137,
-136, 136, 132, 132, 132, 130, 130, 130, 128, 128,
-128, 133, 132, 132, 152, 147, 147, 167, 151, 151,
-169, 153, 153, 145, 142, 142, 153, 148, 148, 155,
-149, 149, 143, 141, 141, 149, 145, 145, 149, 145,
-145, 144, 142, 142, 142, 141, 141, 150, 146, 146,
-156, 150, 150, 159, 152, 152, 158, 151, 151, 162,
-153, 153, 169, 156, 156, 171, 153, 153, 170, 152,
-152, 164, 152, 152, 146, 144, 144, 139, 138, 138,
-134, 134, 134, 130, 130, 130, 153, 147, 147, 154,
-148, 148, 146, 144, 144, 168, 153, 153, 173, 153,
-153, 173, 155, 155, 174, 156, 156, 172, 154, 154,
-172, 153, 153, 174, 155, 155, 175, 156, 156, 171,
-155, 155, 162, 153, 153, 145, 144, 144, 142, 142,
-142, 143, 142, 142, 144, 143, 143, 144, 143, 143,
-151, 149, 149, 164, 156, 156, 176, 157, 157, 164,
-154, 154, 159, 153, 153, 178, 156, 156, 171, 156,
-156, 162, 153, 153, 154, 150, 150, 133, 132, 132,
-151, 147, 147, 180, 154, 154, 181, 153, 153, 186,
-147, 147, 188, 147, 147, 181, 157, 157, 179, 155,
-155, 177, 153, 153, 172, 153, 153, 146, 144, 144,
-130, 130, 130, 137, 136, 136, 173, 153, 153, 167,
-155, 155, 159, 153, 153, 159, 154, 154, 173, 155,
-155, 166, 155, 155, 158, 153, 153, 179, 157, 157,
-168, 156, 156, 152, 149, 149, 144, 143, 143, 131,
-131, 131, 125, 125, 125, 128, 128, 128, 145, 144,
-144, 171, 157, 157, 177, 157, 157, 155, 151, 151,
-153, 149, 149, 152, 149, 149, 147, 145, 145, 130,
-130, 130, 133, 133, 133, 142, 141, 141, 173, 154,
-154, 179, 156, 156, 172, 158, 158, 135, 135, 135,
-127, 127, 127, 125, 125, 125, 127, 127, 127, 148,
-145, 145, 102, 86, 86, 75, 71, 71, 58, 57,
-57, 56, 54, 54, 87, 78, 78, 70, 66, 66,
-70, 66, 66, 86, 78, 78, 67, 65, 65, 65,
-62, 62, 84, 78, 78, 81, 75, 75, 74, 69,
-69, 71, 67, 67, 72, 68, 68, 36, 36, 36,
-74, 69, 69, 85, 78, 78, 71, 67, 67, 84,
-77, 77, 96, 85, 85, 87, 79, 79, 71, 67,
-67, 64, 61, 61, 67, 64, 64, 79, 73, 73,
-76, 71, 71, 88, 79, 79, 82, 75, 75, 79,
-73, 73, 83, 76, 76, 74, 70, 70, 95, 83,
-83, 98, 84, 84, 95, 84, 84, 84, 77, 77,
-71, 67, 67, 67, 64, 64, 81, 75, 75, 84,
-76, 76, 98, 84, 84, 61, 59, 59, 67, 64,
-64, 60, 58, 58, 57, 56, 56, 79, 73, 73,
-66, 63, 63, 68, 65, 65, 93, 82, 82, 80,
-74, 74, 71, 67, 67, 72, 68, 68, 164, 156,
-156, 166, 155, 155, 160, 154, 154, 162, 155, 155,
-187, 145, 145, 171, 156, 156, 159, 154, 154, 144,
-143, 143, 144, 143, 143, 160, 154, 154, 175, 157,
-157, 166, 152, 152, 173, 151, 151, 174, 154, 154,
-167, 157, 157, 166, 156, 156, 184, 152, 152, 195,
-141, 141, 166, 155, 155, 166, 155, 155, 161, 153,
-153, 144, 143, 143, 179, 157, 157, 171, 157, 157,
-137, 136, 136, 128, 128, 128, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 150, 147, 147, 166, 155,
-155, 171, 157, 157, 169, 153, 153, 166, 152, 152,
-163, 153, 153, 170, 155, 155, 178, 153, 153, 182,
-149, 149, 182, 151, 151, 146, 144, 144, 150, 146,
-146, 174, 154, 154, 143, 142, 142, 147, 145, 145,
-158, 151, 151, 162, 153, 153, 162, 153, 153, 150,
-147, 147, 132, 132, 132, 167, 155, 155, 178, 156,
-156, 178, 156, 156, 178, 155, 155, 148, 145, 145,
-126, 126, 126, 126, 126, 126, 155, 150, 150, 152,
-148, 148, 128, 128, 128, 127, 127, 127, 136, 136,
-136, 145, 144, 144, 146, 145, 145, 165, 154, 154,
-170, 154, 154, 162, 153, 153, 158, 151, 151, 146,
-144, 144, 135, 135, 135, 143, 141, 141, 148, 144,
-144, 152, 147, 147, 156, 149, 149, 148, 145, 145,
-148, 145, 145, 152, 147, 147, 134, 134, 134, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-134, 134, 134, 143, 141, 141, 144, 142, 142, 151,
-147, 147, 152, 148, 148, 143, 141, 141, 140, 139,
-139, 146, 143, 143, 158, 150, 150, 168, 151, 151,
-169, 153, 153, 164, 153, 153, 157, 150, 150, 158,
-151, 151, 156, 149, 149, 150, 146, 146, 138, 137,
-137, 140, 139, 139, 149, 146, 146, 159, 151, 151,
-155, 149, 149, 146, 143, 143, 135, 134, 134, 143,
-141, 141, 147, 143, 143, 147, 144, 144, 137, 136,
-136, 148, 144, 144, 155, 149, 149, 135, 134, 134,
-127, 127, 127, 131, 130, 130, 138, 137, 137, 144,
-141, 141, 145, 143, 143, 146, 143, 143, 154, 148,
-148, 164, 151, 151, 167, 151, 151, 159, 150, 150,
-157, 149, 149, 158, 150, 150, 156, 149, 149, 145,
-142, 142, 140, 139, 139, 143, 141, 141, 146, 143,
-143, 145, 142, 142, 141, 139, 139, 137, 136, 136,
-153, 147, 147, 155, 148, 148, 155, 149, 149, 153,
-147, 147, 148, 145, 145, 146, 143, 143, 146, 143,
-143, 147, 143, 143, 146, 143, 143, 145, 142, 142,
-144, 141, 141, 147, 143, 143, 150, 145, 145, 145,
-142, 142, 142, 140, 140, 144, 141, 141, 150, 145,
-145, 153, 147, 147, 150, 145, 145, 149, 145, 145,
-154, 148, 148, 152, 146, 146, 150, 145, 145, 151,
-146, 146, 163, 150, 150, 159, 150, 150, 152, 147,
-147, 154, 148, 148, 155, 149, 149, 153, 148, 148,
-150, 146, 146, 149, 146, 146, 148, 145, 145, 149,
-145, 145, 149, 145, 145, 148, 144, 144, 146, 142,
-142, 144, 142, 142, 141, 140, 140, 153, 147, 147,
-163, 151, 151, 155, 148, 148, 144, 142, 142, 141,
-140, 140, 146, 143, 143, 138, 137, 137, 136, 135,
-135, 138, 137, 137, 135, 134, 134, 149, 145, 145,
-158, 150, 150, 160, 151, 151, 158, 151, 151, 160,
-151, 151, 163, 152, 152, 169, 153, 153, 155, 150,
-150, 149, 145, 145, 154, 148, 148, 153, 148, 148,
-149, 146, 146, 142, 141, 141, 130, 130, 130, 148,
-144, 144, 156, 149, 149, 146, 144, 144, 147, 145,
-145, 147, 144, 144, 148, 145, 145, 154, 149, 149,
-149, 146, 146, 148, 146, 146, 155, 150, 150, 148,
-145, 145, 158, 151, 151, 169, 152, 152, 159, 151,
-151, 156, 150, 150, 157, 150, 150, 163, 152, 152,
-164, 152, 152, 163, 153, 153, 162, 153, 153, 164,
-154, 154, 150, 147, 147, 151, 147, 147, 171, 154,
-154, 167, 153, 153, 161, 153, 153, 154, 150, 150,
-153, 148, 148, 156, 150, 150, 155, 149, 149, 148,
-145, 145, 158, 151, 151, 155, 150, 150, 147, 145,
-145, 147, 145, 145, 156, 150, 150, 155, 150, 150,
-137, 137, 137, 128, 128, 128, 134, 134, 134, 147,
-145, 145, 152, 149, 149, 155, 150, 150, 151, 148,
-148, 147, 145, 145, 139, 138, 138, 144, 143, 143,
-159, 153, 153, 178, 155, 155, 169, 156, 156, 152,
-149, 149, 125, 125, 125, 125, 125, 125, 129, 129,
-129, 141, 140, 140, 164, 154, 154, 147, 145, 145,
-140, 139, 139, 153, 149, 149, 173, 153, 153, 161,
-152, 152, 140, 139, 139, 131, 131, 131, 140, 139,
-139, 149, 147, 147, 154, 150, 150, 146, 144, 144,
-140, 139, 139, 135, 134, 134, 128, 128, 128, 132,
-132, 132, 144, 143, 143, 73, 69, 69, 68, 65,
-65, 56, 54, 54, 51, 50, 50, 65, 62, 62,
-85, 77, 77, 74, 69, 69, 84, 76, 76, 76,
-71, 71, 57, 56, 56, 65, 62, 62, 73, 68,
-68, 77, 72, 72, 69, 66, 66, 48, 47, 47,
-78, 72, 72, 71, 67, 67, 80, 74, 74, 67,
-64, 64, 70, 67, 67, 74, 69, 69, 63, 60,
-60, 66, 63, 63, 67, 64, 64, 64, 61, 61,
-56, 54, 54, 72, 68, 68, 68, 65, 65, 72,
-67, 67, 79, 72, 72, 68, 65, 65, 83, 76,
-76, 82, 75, 75, 85, 77, 77, 73, 68, 68,
-82, 75, 75, 82, 75, 75, 86, 78, 78, 91,
-81, 81, 98, 85, 85, 65, 62, 62, 70, 66,
-66, 69, 65, 65, 67, 64, 64, 58, 57, 57,
-56, 54, 54, 57, 56, 56, 67, 64, 64, 60,
-58, 58, 53, 52, 52, 146, 145, 145, 141, 140,
-140, 143, 142, 142, 137, 136, 136, 150, 147, 147,
-160, 152, 152, 174, 157, 157, 170, 156, 156, 165,
-155, 155, 165, 154, 154, 172, 156, 156, 169, 155,
-155, 160, 153, 153, 162, 153, 153, 146, 144, 144,
-138, 138, 138, 141, 140, 140, 152, 148, 148, 144,
-143, 143, 144, 142, 142, 166, 155, 155, 159, 152,
-152, 159, 152, 152, 159, 152, 152, 144, 143, 143,
-146, 144, 144, 152, 148, 148, 152, 148, 148, 147,
-145, 145, 152, 147, 147, 159, 152, 152, 155, 150,
-150, 152, 148, 148, 151, 147, 147, 144, 143, 143,
-143, 142, 142, 150, 147, 147, 159, 152, 152, 153,
-149, 149, 150, 147, 147, 154, 149, 149, 168, 153,
-153, 157, 150, 150, 146, 144, 144, 138, 137, 137,
-139, 138, 138, 140, 139, 139, 137, 136, 136, 128,
-128, 128, 144, 142, 142, 160, 153, 153, 171, 155,
-155, 169, 154, 154, 152, 148, 148, 135, 134, 134,
-126, 126, 126, 149, 146, 146, 154, 148, 148, 142,
-141, 141, 142, 141, 141, 156, 150, 150, 164, 153,
-153, 155, 149, 149, 169, 153, 153, 171, 153, 153,
-164, 152, 152, 162, 152, 152, 157, 150, 150, 151,
-147, 147, 145, 143, 143, 143, 141, 141, 151, 147,
-147, 163, 152, 152, 156, 149, 149, 155, 148, 148,
-153, 147, 147, 141, 140, 140, 145, 142, 142, 147,
-143, 143, 145, 143, 143, 145, 142, 142, 144, 142,
-142, 143, 141, 141, 143, 141, 141, 148, 145, 145,
-145, 142, 142, 139, 138, 138, 158, 151, 151, 153,
-149, 149, 143, 142, 142, 146, 143, 143, 155, 148,
-148, 159, 150, 150, 159, 150, 150, 151, 147, 147,
-151, 147, 147, 156, 149, 149, 164, 152, 152, 159,
-150, 150, 152, 147, 147, 149, 145, 145, 158, 151,
-151, 159, 151, 151, 150, 146, 146, 142, 140, 140,
-132, 132, 132, 134, 133, 133, 142, 140, 140, 143,
-141, 141, 137, 136, 136, 135, 135, 135, 153, 148,
-148, 148, 145, 145, 142, 140, 140, 140, 139, 139,
-144, 142, 142, 155, 148, 148, 161, 151, 151, 160,
-150, 150, 154, 148, 148, 154, 148, 148, 159, 149,
-149, 152, 147, 147, 152, 146, 146, 153, 147, 147,
-149, 145, 145, 143, 141, 141, 139, 138, 138, 140,
-138, 138, 147, 143, 143, 146, 143, 143, 142, 140,
-140, 143, 141, 141, 143, 141, 141, 143, 141, 141,
-153, 147, 147, 154, 148, 148, 159, 149, 149, 161,
-150, 150, 159, 149, 149, 157, 148, 148, 153, 146,
-146, 148, 144, 144, 143, 141, 141, 144, 142, 142,
-142, 140, 140, 140, 138, 138, 138, 137, 137, 138,
-137, 137, 137, 136, 136, 138, 137, 137, 139, 137,
-137, 142, 140, 140, 148, 144, 144, 155, 148, 148,
-152, 146, 146, 152, 146, 146, 153, 146, 146, 144,
-141, 141, 145, 142, 142, 151, 146, 146, 158, 150,
-150, 150, 146, 146, 145, 142, 142, 147, 144, 144,
-157, 149, 149, 155, 149, 149, 152, 147, 147, 150,
-146, 146, 152, 147, 147, 154, 147, 147, 155, 148,
-148, 156, 148, 148, 152, 146, 146, 149, 145, 145,
-153, 148, 148, 163, 150, 150, 151, 146, 146, 140,
-138, 138, 138, 137, 137, 140, 139, 139, 138, 137,
-137, 133, 133, 133, 131, 131, 131, 129, 129, 129,
-140, 139, 139, 156, 149, 149, 155, 149, 149, 153,
-148, 148, 153, 148, 148, 157, 149, 149, 163, 151,
-151, 151, 147, 147, 134, 134, 134, 144, 142, 142,
-153, 148, 148, 156, 150, 150, 151, 147, 147, 140,
-139, 139, 146, 143, 143, 154, 148, 148, 150, 146,
-146, 141, 139, 139, 134, 133, 133, 132, 132, 132,
-140, 138, 138, 133, 133, 133, 132, 132, 132, 145,
-143, 143, 136, 135, 135, 147, 144, 144, 164, 151,
-151, 163, 151, 151, 160, 150, 150, 161, 150, 150,
-167, 150, 150, 170, 152, 152, 165, 152, 152, 157,
-150, 150, 155, 150, 150, 142, 140, 140, 143, 141,
-141, 157, 150, 150, 160, 151, 151, 154, 149, 149,
-153, 149, 149, 164, 153, 153, 149, 146, 146, 135,
-135, 135, 129, 129, 129, 145, 143, 143, 138, 137,
-137, 133, 133, 133, 134, 134, 134, 150, 146, 146,
-149, 146, 146, 141, 140, 140, 132, 132, 132, 133,
-133, 133, 137, 137, 137, 145, 143, 143, 153, 148,
-148, 143, 141, 141, 134, 133, 133, 133, 132, 132,
-134, 133, 133, 157, 151, 151, 181, 155, 155, 158,
-152, 152, 136, 136, 136, 125, 125, 125, 126, 126,
-126, 131, 131, 131, 143, 141, 141, 148, 145, 145,
-132, 132, 132, 148, 146, 146, 162, 153, 153, 176,
-151, 151, 168, 152, 152, 145, 143, 143, 131, 131,
-131, 131, 131, 131, 133, 133, 133, 155, 150, 150,
-167, 153, 153, 163, 152, 152, 139, 138, 138, 132,
-131, 131, 132, 131, 131, 62, 60, 60, 76, 70,
-70, 73, 68, 68, 70, 66, 66, 48, 47, 47,
-67, 64, 64, 76, 71, 71, 64, 61, 61, 66,
-63, 63, 79, 72, 72, 55, 53, 53, 70, 66,
-66, 76, 70, 70, 68, 65, 65, 60, 58, 58,
-112, 88, 88, 80, 73, 73, 56, 55, 55, 46,
-45, 45, 58, 56, 56, 56, 55, 55, 42, 42,
-42, 53, 52, 52, 77, 72, 72, 58, 56, 56,
-55, 53, 53, 69, 66, 66, 62, 59, 59, 58,
-56, 56, 56, 55, 55, 42, 42, 42, 56, 54,
-54, 78, 72, 72, 79, 73, 73, 57, 56, 56,
-65, 61, 61, 56, 54, 54, 62, 60, 60, 63,
-61, 61, 62, 60, 60, 72, 67, 67, 46, 45,
-45, 51, 50, 50, 69, 66, 66, 80, 73, 73,
-92, 80, 80, 93, 81, 81, 85, 76, 76, 76,
-70, 70, 68, 65, 65, 132, 131, 131, 132, 131,
-131, 132, 131, 131, 133, 133, 133, 155, 151, 151,
-168, 156, 156, 179, 156, 156, 153, 149, 149, 152,
-148, 148, 151, 148, 148, 149, 146, 146, 144, 143,
-143, 143, 141, 141, 139, 139, 139, 132, 131, 131,
-132, 131, 131, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 150, 147, 147, 170, 155, 155, 166, 154,
-154, 148, 145, 145, 146, 144, 144, 152, 148, 148,
-168, 153, 153, 166, 154, 154, 161, 152, 152, 158,
-151, 151, 160, 151, 151, 153, 148, 148, 150, 146,
-146, 151, 147, 147, 144, 142, 142, 137, 136, 136,
-135, 135, 135, 147, 144, 144, 137, 137, 137, 140,
-140, 140, 154, 149, 149, 157, 150, 150, 160, 151,
-151, 154, 149, 149, 134, 134, 134, 133, 133, 133,
-134, 133, 133, 133, 133, 133, 134, 133, 133, 136,
-136, 136, 148, 146, 146, 168, 153, 153, 161, 152,
-152, 152, 148, 148, 141, 140, 140, 127, 127, 127,
-142, 140, 140, 152, 147, 147, 153, 148, 148, 151,
-147, 147, 164, 152, 152, 170, 151, 151, 160, 151,
-151, 164, 152, 152, 166, 152, 152, 164, 152, 152,
-162, 151, 151, 159, 150, 150, 152, 147, 147, 142,
-141, 141, 143, 141, 141, 153, 148, 148, 161, 151,
-151, 154, 148, 148, 152, 147, 147, 151, 146, 146,
-153, 147, 147, 161, 150, 150, 158, 149, 149, 154,
-147, 147, 151, 146, 146, 149, 145, 145, 148, 145,
-145, 149, 145, 145, 152, 147, 147, 143, 141, 141,
-145, 143, 143, 162, 152, 152, 145, 143, 143, 143,
-141, 141, 148, 145, 145, 153, 147, 147, 148, 145,
-145, 142, 140, 140, 137, 136, 136, 144, 141, 141,
-156, 149, 149, 160, 150, 150, 153, 147, 147, 151,
-146, 146, 159, 151, 151, 168, 155, 155, 153, 148,
-148, 139, 138, 138, 128, 128, 128, 126, 126, 126,
-132, 132, 132, 135, 135, 135, 134, 134, 134, 129,
-129, 129, 139, 138, 138, 146, 144, 144, 147, 144,
-144, 147, 143, 143, 150, 146, 146, 159, 149, 149,
-169, 152, 152, 168, 151, 151, 161, 150, 150, 150,
-145, 145, 150, 145, 145, 144, 141, 141, 145, 142,
-142, 152, 146, 146, 149, 144, 144, 145, 142, 142,
-142, 140, 140, 141, 139, 139, 146, 143, 143, 146,
-143, 143, 142, 140, 140, 143, 141, 141, 143, 141,
-141, 145, 142, 142, 147, 143, 143, 147, 143, 143,
-145, 142, 142, 145, 142, 142, 145, 142, 142, 148,
-144, 144, 158, 149, 149, 162, 150, 150, 158, 148,
-148, 156, 147, 147, 153, 146, 146, 149, 144, 144,
-146, 142, 142, 152, 145, 145, 151, 145, 145, 148,
-144, 144, 146, 143, 143, 146, 142, 142, 145, 142,
-142, 146, 143, 143, 147, 143, 143, 149, 144, 144,
-152, 146, 146, 155, 147, 147, 154, 147, 147, 155,
-147, 147, 153, 146, 146, 153, 146, 146, 160, 149,
-149, 158, 149, 149, 154, 147, 147, 151, 146, 146,
-147, 143, 143, 155, 147, 147, 158, 148, 148, 143,
-141, 141, 139, 138, 138, 143, 141, 141, 149, 145,
-145, 147, 143, 143, 153, 146, 146, 149, 144, 144,
-139, 138, 138, 151, 146, 146, 151, 146, 146, 150,
-146, 146, 148, 145, 145, 140, 138, 138, 143, 141,
-141, 149, 145, 145, 149, 145, 145, 141, 140, 140,
-134, 133, 133, 129, 129, 129, 134, 134, 134, 135,
-134, 134, 135, 135, 135, 135, 135, 135, 137, 136,
-136, 147, 144, 144, 149, 146, 146, 139, 138, 138,
-149, 145, 145, 155, 148, 148, 157, 150, 150, 153,
-148, 148, 153, 147, 147, 150, 146, 146, 147, 144,
-144, 154, 147, 147, 154, 147, 147, 147, 144, 144,
-139, 138, 138, 140, 139, 139, 133, 133, 133, 133,
-133, 133, 154, 148, 148, 148, 145, 145, 141, 140,
-140, 139, 138, 138, 151, 146, 146, 149, 145, 145,
-148, 145, 145, 150, 147, 147, 151, 147, 147, 149,
-145, 145, 151, 147, 147, 158, 151, 151, 141, 140,
-140, 134, 133, 133, 136, 135, 135, 147, 144, 144,
-141, 140, 140, 142, 141, 141, 147, 144, 144, 144,
-142, 142, 132, 132, 132, 136, 135, 135, 158, 150,
-150, 155, 149, 149, 155, 149, 149, 156, 149, 149,
-159, 150, 150, 158, 149, 149, 156, 149, 149, 156,
-149, 149, 157, 150, 150, 149, 146, 146, 154, 149,
-149, 175, 153, 153, 165, 153, 153, 158, 150, 150,
-149, 146, 146, 135, 134, 134, 151, 147, 147, 151,
-147, 147, 140, 139, 139, 126, 126, 126, 125, 125,
-125, 139, 138, 138, 164, 152, 152, 182, 150, 150,
-163, 152, 152, 152, 147, 147, 148, 145, 145, 136,
-136, 136, 138, 137, 137, 156, 149, 149, 163, 151,
-151, 163, 152, 152, 148, 145, 145, 128, 128, 128,
-131, 130, 130, 147, 145, 145, 165, 152, 152, 166,
-152, 152, 167, 152, 152, 167, 152, 152, 47, 46,
-46, 42, 42, 42, 55, 53, 53, 57, 55, 55,
-48, 48, 48, 56, 54, 54, 83, 76, 76, 63,
-60, 60, 69, 66, 66, 62, 60, 60, 58, 57,
-57, 63, 60, 60, 66, 63, 63, 54, 53, 53,
-82, 74, 74, 85, 77, 77, 71, 67, 67, 75,
-70, 70, 66, 63, 63, 74, 70, 70, 79, 73,
-73, 72, 68, 68, 88, 79, 79, 83, 76, 76,
-73, 68, 68, 71, 67, 67, 56, 54, 54, 54,
-53, 53, 72, 68, 68, 76, 71, 71, 71, 67,
-67, 76, 71, 71, 76, 71, 71, 60, 58, 58,
-73, 69, 69, 54, 53, 53, 71, 67, 67, 76,
-71, 71, 61, 59, 59, 67, 64, 64, 63, 61,
-61, 56, 55, 55, 71, 67, 67, 70, 67, 67,
-83, 75, 75, 86, 77, 77, 58, 57, 57, 52,
-51, 51, 167, 152, 152, 167, 152, 152, 167, 152,
-152, 167, 152, 152, 167, 152, 152, 169, 152, 152,
-161, 154, 154, 143, 142, 142, 156, 150, 150, 148,
-145, 145, 134, 133, 133, 129, 129, 129, 132, 132,
-132, 153, 148, 148, 161, 151, 151, 162, 151, 151,
-160, 151, 151, 148, 145, 145, 138, 137, 137, 146,
-143, 143, 159, 151, 151, 143, 142, 142, 136, 136,
-136, 141, 140, 140, 153, 148, 148, 150, 147, 147,
-142, 141, 141, 132, 132, 132, 131, 131, 131, 140,
-139, 139, 152, 148, 148, 161, 150, 150, 171, 150,
-150, 169, 152, 152, 162, 153, 153, 155, 149, 149,
-158, 150, 150, 150, 146, 146, 138, 138, 138, 132,
-132, 132, 141, 140, 140, 152, 147, 147, 160, 150,
-150, 156, 149, 149, 155, 148, 148, 155, 148, 148,
-154, 149, 149, 154, 148, 148, 151, 147, 147, 154,
-149, 149, 175, 151, 151, 156, 150, 150, 145, 143,
-143, 140, 139, 139, 129, 129, 129, 134, 133, 133,
-146, 143, 143, 156, 148, 148, 148, 145, 145, 152,
-147, 147, 156, 149, 149, 158, 149, 149, 144, 142,
-142, 149, 145, 145, 160, 151, 151, 154, 149, 149,
-141, 140, 140, 136, 135, 135, 140, 139, 139, 152,
-147, 147, 149, 145, 145, 142, 140, 140, 135, 134,
-134, 134, 134, 134, 146, 143, 143, 161, 150, 150,
-169, 149, 149, 153, 147, 147, 144, 142, 142, 138,
-137, 137, 134, 134, 134, 133, 133, 133, 137, 136,
-136, 145, 142, 142, 150, 146, 146, 149, 145, 145,
-144, 142, 142, 136, 135, 135, 135, 135, 135, 136,
-135, 135, 136, 135, 135, 134, 134, 134, 132, 132,
-132, 133, 132, 132, 137, 136, 136, 146, 143, 143,
-140, 139, 139, 134, 134, 134, 139, 138, 138, 162,
-151, 151, 164, 152, 152, 147, 144, 144, 129, 129,
-129, 125, 125, 125, 127, 127, 127, 128, 128, 128,
-129, 129, 129, 128, 128, 128, 129, 129, 129, 133,
-133, 133, 135, 135, 135, 140, 138, 138, 147, 144,
-144, 156, 148, 148, 158, 150, 150, 159, 149, 149,
-159, 149, 149, 154, 147, 147, 146, 142, 142, 136,
-135, 135, 137, 136, 136, 150, 145, 145, 157, 148,
-148, 155, 147, 147, 149, 144, 144, 148, 143, 143,
-145, 142, 142, 144, 141, 141, 142, 140, 140, 138,
-137, 137, 136, 135, 135, 137, 136, 136, 139, 137,
-137, 139, 138, 138, 138, 137, 137, 135, 135, 135,
-143, 140, 140, 146, 143, 143, 143, 141, 141, 144,
-141, 141, 144, 141, 141, 146, 143, 143, 153, 147,
-147, 155, 147, 147, 152, 146, 146, 148, 144, 144,
-149, 144, 144, 144, 141, 141, 142, 139, 139, 146,
-142, 142, 149, 144, 144, 148, 144, 144, 145, 142,
-142, 142, 140, 140, 144, 141, 141, 146, 142, 142,
-145, 142, 142, 145, 142, 142, 147, 143, 143, 148,
-144, 144, 148, 144, 144, 149, 145, 145, 151, 146,
-146, 151, 145, 145, 149, 145, 145, 147, 144, 144,
-145, 142, 142, 146, 143, 143, 149, 145, 145, 152,
-146, 146, 148, 143, 143, 144, 141, 141, 143, 141,
-141, 145, 142, 142, 143, 141, 141, 145, 142, 142,
-153, 146, 146, 142, 140, 140, 146, 143, 143, 155,
-148, 148, 156, 148, 148, 158, 149, 149, 150, 146,
-146, 146, 143, 143, 156, 149, 149, 158, 149, 149,
-157, 149, 149, 152, 146, 146, 142, 140, 140, 140,
-139, 139, 142, 141, 141, 143, 141, 141, 143, 142,
-142, 144, 142, 142, 147, 144, 144, 149, 145, 145,
-138, 137, 137, 139, 138, 138, 147, 144, 144, 156,
-149, 149, 151, 147, 147, 152, 147, 147, 152, 147,
-147, 143, 141, 141, 147, 144, 144, 148, 145, 145,
-145, 142, 142, 134, 134, 134, 138, 137, 137, 144,
-142, 142, 149, 145, 145, 152, 147, 147, 153, 148,
-148, 149, 145, 145, 144, 141, 141, 147, 144, 144,
-144, 142, 142, 146, 144, 144, 151, 147, 147, 152,
-147, 147, 147, 144, 144, 147, 145, 145, 152, 148,
-148, 154, 148, 148, 148, 145, 145, 145, 143, 143,
-152, 147, 147, 148, 145, 145, 145, 143, 143, 144,
-142, 142, 144, 142, 142, 142, 141, 141, 147, 144,
-144, 151, 146, 146, 148, 145, 145, 147, 145, 145,
-154, 148, 148, 159, 150, 150, 159, 149, 149, 159,
-149, 149, 159, 150, 150, 157, 150, 150, 138, 137,
-137, 147, 145, 145, 153, 148, 148, 149, 146, 146,
-146, 144, 144, 136, 136, 136, 135, 134, 134, 146,
-144, 144, 155, 149, 149, 149, 146, 146, 146, 144,
-144, 152, 147, 147, 155, 149, 149, 171, 154, 154,
-178, 154, 154, 153, 148, 148, 153, 148, 148, 147,
-145, 145, 145, 143, 143, 140, 140, 140, 150, 147,
-147, 155, 149, 149, 152, 148, 148, 141, 140, 140,
-139, 139, 139, 142, 141, 141, 146, 144, 144, 142,
-141, 141, 140, 139, 139, 140, 139, 139, 71, 67,
-67, 76, 71, 71, 67, 64, 64, 100, 85, 85,
-80, 74, 74, 67, 64, 64, 71, 67, 67, 70,
-67, 67, 88, 79, 79, 78, 73, 73, 58, 57,
-57, 51, 50, 50, 81, 75, 75, 85, 77, 77,
-75, 71, 71, 83, 76, 76, 83, 77, 77, 72,
-68, 68, 78, 73, 73, 82, 76, 76, 91, 82,
-82, 87, 79, 79, 76, 71, 71, 86, 79, 79,
-69, 66, 66, 75, 71, 71, 67, 64, 64, 60,
-58, 58, 66, 63, 63, 82, 75, 75, 64, 62,
-62, 76, 72, 72, 88, 80, 80, 72, 68, 68,
-73, 69, 69, 64, 61, 61, 83, 76, 76, 100,
-87, 87, 76, 71, 71, 73, 69, 69, 84, 78,
-78, 77, 72, 72, 80, 74, 74, 77, 72, 72,
-61, 59, 59, 52, 51, 51, 94, 83, 83, 99,
-84, 84, 140, 139, 139, 140, 139, 139, 141, 140,
-140, 141, 140, 140, 141, 140, 140, 141, 140, 140,
-143, 142, 142, 146, 144, 144, 143, 142, 142, 143,
-142, 142, 155, 150, 150, 145, 143, 143, 145, 143,
-143, 147, 145, 145, 156, 149, 149, 150, 147, 147,
-157, 150, 150, 162, 151, 151, 146, 143, 143, 155,
-149, 149, 153, 148, 148, 150, 146, 146, 151, 147,
-147, 149, 146, 146, 145, 143, 143, 138, 137, 137,
-131, 130, 130, 138, 137, 137, 146, 144, 144, 153,
-148, 148, 160, 150, 150, 157, 150, 150, 153, 148,
-148, 149, 146, 146, 149, 146, 146, 150, 147, 147,
-151, 147, 147, 151, 147, 147, 144, 142, 142, 138,
-138, 138, 139, 138, 138, 152, 148, 148, 147, 144,
-144, 145, 142, 142, 144, 142, 142, 145, 143, 143,
-145, 143, 143, 143, 141, 141, 142, 141, 141, 152,
-147, 147, 148, 145, 145, 147, 144, 144, 147, 145,
-145, 132, 132, 132, 132, 132, 132, 139, 138, 138,
-145, 143, 143, 143, 141, 141, 151, 146, 146, 161,
-149, 149, 170, 148, 148, 151, 146, 146, 146, 144,
-144, 146, 144, 144, 143, 141, 141, 143, 141, 141,
-145, 142, 142, 148, 145, 145, 149, 145, 145, 140,
-139, 139, 139, 138, 138, 139, 138, 138, 132, 132,
-132, 141, 140, 140, 150, 146, 146, 154, 147, 147,
-151, 146, 146, 147, 144, 144, 142, 140, 140, 136,
-136, 136, 130, 130, 130, 137, 136, 136, 143, 141,
-141, 144, 142, 142, 144, 142, 142, 145, 143, 143,
-148, 145, 145, 151, 146, 146, 152, 147, 147, 147,
-144, 144, 143, 141, 141, 144, 141, 141, 141, 140,
-140, 141, 140, 140, 137, 136, 136, 131, 131, 131,
-133, 133, 133, 144, 142, 142, 155, 149, 149, 154,
-148, 148, 146, 143, 143, 140, 139, 139, 140, 139,
-139, 138, 137, 137, 138, 137, 137, 138, 137, 137,
-138, 137, 137, 139, 138, 138, 141, 139, 139, 143,
-140, 140, 143, 141, 141, 148, 144, 144, 149, 145,
-145, 148, 144, 144, 149, 144, 144, 147, 143, 143,
-141, 139, 139, 133, 133, 133, 131, 131, 131, 141,
-139, 139, 149, 144, 144, 148, 144, 144, 144, 141,
-141, 148, 144, 144, 148, 144, 144, 146, 142, 142,
-146, 142, 142, 143, 140, 140, 141, 139, 139, 142,
-140, 140, 146, 142, 142, 146, 142, 142, 144, 141,
-141, 144, 141, 141, 144, 142, 142, 146, 142, 142,
-136, 135, 135, 134, 133, 133, 138, 137, 137, 144,
-141, 141, 142, 140, 140, 145, 142, 142, 144, 141,
-141, 144, 141, 141, 148, 144, 144, 149, 145, 145,
-146, 143, 143, 143, 141, 141, 146, 143, 143, 139,
-138, 138, 135, 135, 135, 139, 138, 138, 147, 143,
-143, 145, 142, 142, 140, 139, 139, 137, 136, 136,
-143, 141, 141, 144, 142, 142, 143, 141, 141, 143,
-141, 141, 141, 139, 139, 142, 140, 140, 143, 141,
-141, 146, 144, 144, 149, 145, 145, 139, 137, 137,
-135, 134, 134, 140, 138, 138, 136, 136, 136, 147,
-143, 143, 147, 143, 143, 142, 140, 140, 146, 142,
-142, 148, 143, 143, 146, 143, 143, 141, 139, 139,
-137, 136, 136, 148, 144, 144, 149, 144, 144, 145,
-142, 142, 151, 147, 147, 161, 149, 149, 167, 150,
-150, 161, 149, 149, 149, 145, 145, 155, 148, 148,
-162, 151, 151, 163, 151, 151, 165, 151, 151, 156,
-148, 148, 151, 146, 146, 152, 147, 147, 154, 148,
-148, 156, 149, 149, 153, 147, 147, 151, 145, 145,
-153, 147, 147, 140, 139, 139, 131, 131, 131, 136,
-136, 136, 154, 148, 148, 149, 145, 145, 147, 144,
-144, 150, 146, 146, 141, 140, 140, 139, 138, 138,
-138, 137, 137, 136, 135, 135, 127, 127, 127, 133,
-133, 133, 152, 146, 146, 166, 149, 149, 150, 146,
-146, 155, 148, 148, 158, 149, 149, 154, 147, 147,
-145, 143, 143, 143, 141, 141, 148, 145, 145, 156,
-148, 148, 155, 149, 149, 149, 146, 146, 145, 143,
-143, 148, 145, 145, 168, 150, 150, 162, 151, 151,
-159, 151, 151, 161, 152, 152, 158, 149, 149, 151,
-147, 147, 147, 145, 145, 148, 145, 145, 157, 148,
-148, 148, 145, 145, 139, 138, 138, 134, 133, 133,
-135, 135, 135, 149, 146, 146, 156, 148, 148, 155,
-148, 148, 155, 148, 148, 157, 149, 149, 149, 146,
-146, 133, 133, 133, 132, 132, 132, 129, 129, 129,
-129, 129, 129, 131, 131, 131, 133, 132, 132, 134,
-134, 134, 145, 143, 143, 159, 150, 150, 157, 149,
-149, 166, 151, 151, 168, 151, 151, 156, 150, 150,
-180, 157, 157, 150, 147, 147, 140, 139, 139, 147,
-145, 145, 156, 150, 150, 146, 144, 144, 154, 148,
-148, 160, 150, 150, 161, 150, 150, 162, 151, 151,
-163, 152, 152, 162, 152, 152, 159, 151, 151, 138,
-137, 137, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 107, 89, 89, 79, 73, 73, 80, 74, 74,
-80, 74, 74, 63, 61, 61, 69, 66, 66, 71,
-67, 67, 77, 72, 72, 86, 78, 78, 78, 72,
-72, 58, 57, 57, 77, 72, 72, 76, 70, 70,
-69, 66, 66, 71, 67, 67, 58, 57, 57, 52,
-51, 51, 72, 68, 68, 70, 67, 67, 65, 62,
-62, 66, 63, 63, 56, 54, 54, 58, 57, 57,
-67, 64, 64, 66, 63, 63, 57, 55, 55, 50,
-49, 49, 60, 58, 58, 79, 73, 73, 82, 76,
-76, 58, 57, 57, 56, 54, 54, 69, 66, 66,
-75, 70, 70, 57, 56, 56, 63, 61, 61, 76,
-70, 70, 67, 64, 64, 79, 73, 73, 81, 75,
-75, 69, 65, 65, 73, 68, 68, 65, 62, 62,
-67, 64, 64, 58, 57, 57, 39, 39, 39, 131,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 143, 142, 142,
-161, 153, 153, 162, 151, 151, 148, 145, 145, 167,
-150, 150, 169, 148, 148, 151, 146, 146, 143, 142,
-142, 154, 149, 149, 154, 149, 149, 143, 141, 141,
-185, 142, 142, 161, 151, 151, 142, 141, 141, 148,
-146, 146, 162, 151, 151, 164, 151, 151, 157, 150,
-150, 141, 140, 140, 139, 138, 138, 139, 138, 138,
-147, 145, 145, 161, 152, 152, 162, 151, 151, 163,
-150, 150, 152, 148, 148, 130, 130, 130, 130, 130,
-130, 133, 133, 133, 138, 138, 138, 144, 143, 143,
-155, 150, 150, 156, 149, 149, 145, 143, 143, 128,
-128, 128, 142, 141, 141, 137, 137, 137, 132, 132,
-132, 134, 133, 133, 135, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 132, 132, 132, 140,
-139, 139, 151, 147, 147, 157, 149, 149, 139, 139,
-139, 137, 136, 136, 138, 137, 137, 138, 137, 137,
-143, 141, 141, 155, 148, 148, 169, 147, 147, 179,
-141, 141, 163, 149, 149, 147, 144, 144, 137, 136,
-136, 138, 137, 137, 151, 146, 146, 158, 148, 148,
-155, 148, 148, 142, 140, 140, 138, 137, 137, 146,
-144, 144, 147, 144, 144, 134, 134, 134, 133, 133,
-133, 136, 136, 136, 145, 143, 143, 154, 148, 148,
-153, 147, 147, 148, 144, 144, 139, 138, 138, 130,
-130, 130, 140, 139, 139, 139, 138, 138, 140, 139,
-139, 149, 145, 145, 154, 148, 148, 163, 150, 150,
-170, 149, 149, 170, 150, 150, 161, 150, 150, 156,
-148, 148, 153, 147, 147, 149, 145, 145, 140, 138,
-138, 133, 133, 133, 132, 132, 132, 137, 137, 137,
-140, 139, 139, 148, 145, 145, 152, 146, 146, 153,
-146, 146, 153, 146, 146, 150, 144, 144, 148, 143,
-143, 146, 142, 142, 146, 143, 143, 146, 143, 143,
-148, 144, 144, 151, 145, 145, 147, 144, 144, 144,
-141, 141, 143, 141, 141, 142, 141, 141, 142, 140,
-140, 142, 140, 140, 137, 136, 136, 129, 129, 129,
-129, 129, 129, 135, 134, 134, 140, 138, 138, 140,
-139, 139, 138, 137, 137, 145, 142, 142, 150, 144,
-144, 148, 143, 143, 148, 143, 143, 147, 143, 143,
-146, 142, 142, 148, 144, 144, 153, 146, 146, 152,
-146, 146, 151, 145, 145, 152, 147, 147, 153, 147,
-147, 148, 144, 144, 144, 141, 141, 144, 142, 142,
-149, 144, 144, 146, 143, 143, 143, 140, 140, 136,
-135, 135, 137, 136, 136, 141, 139, 139, 145, 142,
-142, 144, 141, 141, 143, 140, 140, 143, 140, 140,
-148, 144, 144, 151, 145, 145, 148, 143, 143, 146,
-142, 142, 149, 144, 144, 146, 142, 142, 139, 137,
-137, 138, 137, 137, 143, 141, 141, 147, 144, 144,
-143, 141, 141, 145, 142, 142, 153, 147, 147, 145,
-142, 142, 149, 145, 145, 152, 146, 146, 153, 147,
-147, 154, 147, 147, 155, 148, 148, 152, 146, 146,
-143, 141, 141, 133, 133, 133, 138, 137, 137, 142,
-140, 140, 145, 142, 142, 149, 144, 144, 142, 140,
-140, 137, 135, 135, 136, 135, 135, 139, 137, 137,
-147, 144, 144, 147, 143, 143, 145, 142, 142, 146,
-143, 143, 143, 141, 141, 142, 140, 140, 148, 144,
-144, 157, 147, 147, 159, 149, 149, 147, 144, 144,
-139, 138, 138, 143, 141, 141, 147, 144, 144, 149,
-145, 145, 144, 142, 142, 142, 140, 140, 143, 141,
-141, 145, 143, 143, 150, 146, 146, 151, 146, 146,
-139, 137, 137, 147, 144, 144, 147, 144, 144, 143,
-141, 141, 142, 141, 141, 153, 147, 147, 148, 145,
-145, 139, 138, 138, 141, 139, 139, 133, 133, 133,
-131, 131, 131, 130, 130, 130, 129, 129, 129, 126,
-126, 126, 127, 127, 127, 139, 138, 138, 153, 147,
-147, 153, 147, 147, 156, 149, 149, 154, 148, 148,
-146, 143, 143, 140, 139, 139, 151, 146, 146, 154,
-147, 147, 150, 145, 145, 141, 140, 140, 151, 147,
-147, 150, 146, 146, 143, 141, 141, 141, 140, 140,
-146, 144, 144, 156, 150, 150, 160, 151, 151, 149,
-145, 145, 161, 151, 151, 160, 151, 151, 154, 148,
-148, 151, 146, 146, 144, 142, 142, 135, 134, 134,
-131, 131, 131, 137, 137, 137, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 138, 138, 138, 152, 147,
-147, 164, 150, 150, 167, 150, 150, 160, 149, 149,
-141, 140, 140, 150, 146, 146, 164, 152, 152, 167,
-152, 152, 141, 140, 140, 135, 134, 134, 133, 132,
-132, 133, 133, 133, 136, 135, 135, 163, 152, 152,
-175, 152, 152, 173, 156, 156, 151, 148, 148, 165,
-153, 153, 156, 150, 150, 149, 145, 145, 146, 144,
-144, 142, 140, 140, 145, 143, 143, 147, 144, 144,
-147, 145, 145, 141, 140, 140, 148, 145, 145, 152,
-148, 148, 149, 146, 146, 146, 144, 144, 143, 142,
-142, 65, 62, 62, 76, 71, 71, 103, 87, 87,
-90, 80, 80, 70, 66, 66, 74, 69, 69, 81,
-74, 74, 76, 71, 71, 66, 63, 63, 70, 66,
-66, 72, 67, 67, 56, 54, 54, 60, 58, 58,
-70, 66, 66, 84, 76, 76, 57, 55, 55, 49,
-49, 49, 79, 73, 73, 76, 71, 71, 70, 66,
-66, 72, 68, 68, 72, 67, 67, 61, 59, 59,
-72, 68, 68, 66, 64, 64, 60, 58, 58, 50,
-49, 49, 61, 59, 59, 70, 66, 66, 58, 56,
-56, 71, 67, 67, 79, 73, 73, 63, 61, 61,
-71, 67, 67, 47, 46, 46, 47, 46, 46, 61,
-59, 59, 59, 57, 57, 62, 60, 60, 79, 73,
-73, 76, 71, 71, 58, 56, 56, 60, 58, 58,
-57, 55, 55, 90, 81, 81, 91, 81, 81, 172,
-151, 151, 173, 153, 153, 174, 155, 155, 173, 152,
-152, 174, 151, 151, 174, 151, 151, 175, 151, 151,
-165, 151, 151, 145, 143, 143, 137, 136, 136, 154,
-148, 148, 140, 140, 140, 132, 132, 132, 132, 132,
-132, 144, 143, 143, 136, 136, 136, 139, 138, 138,
-141, 140, 140, 129, 129, 129, 162, 154, 154, 172,
-153, 153, 164, 152, 152, 141, 140, 140, 132, 132,
-132, 145, 143, 143, 160, 152, 152, 165, 152, 152,
-157, 150, 150, 167, 150, 150, 175, 145, 145, 174,
-144, 144, 152, 147, 147, 148, 145, 145, 144, 142,
-142, 140, 139, 139, 139, 139, 139, 144, 143, 143,
-143, 142, 142, 137, 136, 136, 128, 128, 128, 146,
-144, 144, 155, 149, 149, 156, 150, 150, 161, 150,
-150, 167, 152, 152, 166, 152, 152, 162, 152, 152,
-162, 151, 151, 152, 147, 147, 152, 148, 148, 158,
-150, 150, 161, 150, 150, 161, 151, 151, 167, 150,
-150, 169, 149, 149, 162, 149, 149, 161, 149, 149,
-169, 148, 148, 165, 149, 149, 151, 146, 146, 163,
-147, 147, 162, 150, 150, 159, 151, 151, 158, 149,
-149, 151, 146, 146, 161, 149, 149, 163, 150, 150,
-157, 150, 150, 159, 150, 150, 161, 151, 151, 156,
-149, 149, 148, 145, 145, 142, 140, 140, 134, 134,
-134, 139, 138, 138, 147, 145, 145, 149, 146, 146,
-144, 142, 142, 134, 134, 134, 134, 134, 134, 145,
-142, 142, 153, 147, 147, 159, 149, 149, 156, 148,
-148, 144, 142, 142, 152, 146, 146, 160, 149, 149,
-160, 150, 150, 157, 149, 149, 153, 147, 147, 159,
-149, 149, 158, 149, 149, 147, 144, 144, 136, 135,
-135, 133, 132, 132, 134, 133, 133, 138, 137, 137,
-145, 143, 143, 144, 141, 141, 143, 140, 140, 142,
-140, 140, 143, 141, 141, 138, 137, 137, 136, 135,
-135, 136, 135, 135, 138, 137, 137, 143, 140, 140,
-152, 146, 146, 156, 148, 148, 154, 148, 148, 153,
-147, 147, 152, 147, 147, 152, 147, 147, 148, 144,
-144, 132, 132, 132, 132, 132, 132, 142, 140, 140,
-149, 145, 145, 150, 145, 145, 143, 141, 141, 142,
-139, 139, 144, 141, 141, 144, 140, 140, 145, 141,
-141, 143, 140, 140, 140, 138, 138, 143, 140, 140,
-144, 141, 141, 145, 141, 141, 146, 143, 143, 148,
-144, 144, 152, 146, 146, 151, 145, 145, 149, 144,
-144, 149, 144, 144, 148, 144, 144, 148, 144, 144,
-151, 145, 145, 149, 144, 144, 147, 143, 143, 145,
-142, 142, 143, 141, 141, 138, 137, 137, 138, 137,
-137, 141, 139, 139, 145, 142, 142, 147, 143, 143,
-146, 142, 142, 145, 142, 142, 147, 143, 143, 148,
-144, 144, 144, 141, 141, 144, 141, 141, 146, 142,
-142, 147, 142, 142, 144, 140, 140, 143, 141, 141,
-143, 141, 141, 148, 144, 144, 144, 142, 142, 150,
-145, 145, 152, 146, 146, 148, 144, 144, 151, 145,
-145, 150, 145, 145, 149, 145, 145, 151, 145, 145,
-152, 146, 146, 147, 143, 143, 139, 137, 137, 135,
-134, 134, 144, 141, 141, 146, 143, 143, 149, 145,
-145, 149, 145, 145, 147, 143, 143, 142, 139, 139,
-142, 140, 140, 145, 142, 142, 147, 144, 144, 146,
-143, 143, 143, 141, 141, 143, 141, 141, 143, 141,
-141, 142, 140, 140, 148, 144, 144, 152, 146, 146,
-148, 144, 144, 140, 139, 139, 144, 142, 142, 149,
-145, 145, 152, 147, 147, 151, 145, 145, 148, 144,
-144, 149, 144, 144, 148, 145, 145, 145, 143, 143,
-149, 145, 145, 140, 139, 139, 144, 142, 142, 147,
-144, 144, 144, 142, 142, 143, 141, 141, 150, 146,
-146, 152, 147, 147, 146, 143, 143, 145, 142, 142,
-141, 140, 140, 137, 137, 137, 134, 134, 134, 134,
-133, 133, 133, 133, 133, 130, 130, 130, 135, 135,
-135, 149, 145, 145, 157, 149, 149, 159, 150, 150,
-158, 150, 150, 153, 147, 147, 145, 142, 142, 145,
-143, 143, 145, 143, 143, 141, 140, 140, 139, 138,
-138, 148, 145, 145, 153, 149, 149, 153, 147, 147,
-149, 145, 145, 155, 148, 148, 158, 150, 150, 152,
-147, 147, 142, 141, 141, 154, 149, 149, 156, 151,
-151, 151, 147, 147, 146, 143, 143, 143, 141, 141,
-137, 136, 136, 138, 137, 137, 139, 138, 138, 136,
-136, 136, 133, 133, 133, 135, 135, 135, 140, 139,
-139, 151, 146, 146, 165, 150, 150, 162, 150, 150,
-154, 148, 148, 144, 142, 142, 145, 143, 143, 163,
-153, 153, 162, 151, 151, 155, 148, 148, 147, 144,
-144, 143, 142, 142, 143, 141, 141, 151, 147, 147,
-164, 152, 152, 165, 154, 154, 153, 149, 149, 154,
-149, 149, 162, 152, 152, 161, 152, 152, 156, 148,
-148, 153, 147, 147, 141, 140, 140, 145, 143, 143,
-142, 141, 141, 137, 137, 137, 138, 138, 138, 153,
-148, 148, 159, 153, 153, 158, 151, 151, 154, 148,
-148, 151, 147, 147, 54, 53, 53, 73, 68, 68,
-85, 77, 77, 82, 75, 75, 64, 61, 61, 58,
-57, 57, 67, 64, 64, 66, 63, 63, 59, 57,
-57, 64, 61, 61, 50, 49, 49, 44, 43, 43,
-73, 69, 69, 88, 80, 80, 75, 70, 70, 70,
-67, 67, 77, 73, 73, 71, 68, 68, 75, 71,
-71, 76, 71, 71, 73, 69, 69, 78, 73, 73,
-70, 67, 67, 69, 66, 66, 72, 68, 68, 66,
-63, 63, 60, 58, 58, 69, 66, 66, 57, 56,
-56, 59, 57, 57, 74, 69, 69, 85, 77, 77,
-94, 82, 82, 81, 75, 75, 68, 65, 65, 79,
-73, 73, 79, 73, 73, 66, 64, 64, 71, 67,
-67, 78, 72, 72, 76, 71, 71, 61, 59, 59,
-47, 47, 47, 39, 38, 38, 157, 150, 150, 154,
-149, 149, 153, 149, 149, 152, 149, 149, 155, 150,
-150, 158, 151, 151, 153, 149, 149, 151, 148, 148,
-149, 147, 147, 145, 143, 143, 150, 146, 146, 158,
-149, 149, 145, 142, 142, 143, 142, 142, 144, 142,
-142, 141, 140, 140, 136, 136, 136, 138, 137, 137,
-132, 132, 132, 138, 138, 138, 154, 150, 150, 159,
-151, 151, 159, 151, 151, 154, 148, 148, 154, 148,
-148, 166, 152, 152, 160, 150, 150, 154, 148, 148,
-153, 148, 148, 161, 151, 151, 159, 149, 149, 162,
-149, 149, 159, 149, 149, 151, 146, 146, 144, 142,
-142, 146, 144, 144, 149, 146, 146, 149, 146, 146,
-146, 143, 143, 137, 136, 136, 146, 144, 144, 154,
-150, 150, 151, 147, 147, 151, 147, 147, 164, 151,
-151, 165, 151, 151, 156, 149, 149, 155, 149, 149,
-150, 147, 147, 153, 148, 148, 155, 149, 149, 150,
-146, 146, 150, 147, 147, 157, 150, 150, 158, 149,
-149, 153, 148, 148, 151, 147, 147, 159, 150, 150,
-156, 148, 148, 145, 143, 143, 156, 148, 148, 152,
-148, 148, 148, 145, 145, 146, 143, 143, 139, 138,
-138, 149, 145, 145, 152, 147, 147, 152, 147, 147,
-151, 147, 147, 153, 148, 148, 151, 147, 147, 149,
-145, 145, 147, 144, 144, 140, 138, 138, 145, 143,
-143, 150, 146, 146, 150, 146, 146, 147, 144, 144,
-143, 141, 141, 146, 143, 143, 150, 145, 145, 153,
-147, 147, 159, 149, 149, 151, 146, 146, 144, 142,
-142, 144, 142, 142, 154, 148, 148, 155, 149, 149,
-156, 149, 149, 156, 148, 148, 158, 149, 149, 152,
-147, 147, 148, 144, 144, 145, 142, 142, 142, 140,
-140, 141, 139, 139, 140, 138, 138, 137, 137, 137,
-134, 133, 133, 132, 132, 132, 137, 136, 136, 138,
-137, 137, 136, 135, 135, 136, 135, 135, 134, 133,
-133, 136, 135, 135, 141, 139, 139, 149, 145, 145,
-149, 145, 145, 149, 145, 145, 150, 145, 145, 151,
-146, 146, 146, 143, 143, 141, 139, 139, 137, 136,
-136, 142, 140, 140, 148, 144, 144, 149, 145, 145,
-144, 141, 141, 139, 138, 138, 142, 140, 140, 146,
-141, 141, 146, 142, 142, 143, 140, 140, 141, 139,
-139, 143, 140, 140, 144, 141, 141, 145, 141, 141,
-145, 141, 141, 143, 140, 140, 145, 142, 142, 147,
-143, 143, 147, 143, 143, 144, 141, 141, 143, 141,
-141, 144, 142, 142, 142, 140, 140, 139, 137, 137,
-147, 143, 143, 146, 142, 142, 145, 142, 142, 145,
-141, 141, 144, 140, 140, 142, 139, 139, 141, 139,
-139, 140, 139, 139, 141, 139, 139, 142, 140, 140,
-146, 142, 142, 150, 144, 144, 150, 144, 144, 146,
-143, 143, 144, 141, 141, 141, 139, 139, 141, 139,
-139, 141, 139, 139, 143, 141, 141, 148, 143, 143,
-150, 145, 145, 145, 142, 142, 142, 140, 140, 145,
-142, 142, 146, 143, 143, 149, 145, 145, 151, 145,
-145, 150, 145, 145, 147, 143, 143, 143, 140, 140,
-141, 139, 139, 144, 141, 141, 148, 143, 143, 145,
-142, 142, 139, 137, 137, 140, 138, 138, 146, 143,
-143, 149, 144, 144, 152, 147, 147, 153, 147, 147,
-152, 146, 146, 150, 145, 145, 151, 146, 146, 147,
-144, 144, 144, 142, 142, 140, 138, 138, 138, 137,
-137, 143, 141, 141, 142, 140, 140, 144, 142, 142,
-148, 144, 144, 144, 142, 142, 143, 141, 141, 146,
-143, 143, 153, 147, 147, 157, 148, 148, 159, 148,
-148, 158, 148, 148, 157, 148, 148, 153, 147, 147,
-144, 142, 142, 143, 141, 141, 144, 142, 142, 145,
-143, 143, 144, 142, 142, 140, 139, 139, 139, 138,
-138, 144, 142, 142, 150, 146, 146, 153, 147, 147,
-151, 146, 146, 148, 144, 144, 146, 143, 143, 143,
-140, 140, 142, 140, 140, 142, 140, 140, 138, 138,
-138, 139, 138, 138, 150, 146, 146, 158, 150, 150,
-158, 150, 150, 158, 150, 150, 160, 149, 149, 150,
-146, 146, 140, 139, 139, 134, 133, 133, 134, 134,
-134, 142, 141, 141, 143, 142, 142, 155, 149, 149,
-163, 151, 151, 163, 149, 149, 166, 149, 149, 157,
-149, 149, 144, 142, 142, 137, 137, 137, 141, 140,
-140, 149, 146, 146, 146, 144, 144, 144, 142, 142,
-144, 143, 143, 144, 142, 142, 144, 142, 142, 143,
-141, 141, 139, 139, 139, 135, 135, 135, 141, 140,
-140, 143, 141, 141, 148, 145, 145, 155, 148, 148,
-153, 149, 149, 148, 145, 145, 136, 135, 135, 131,
-131, 131, 145, 144, 144, 168, 152, 152, 173, 150,
-150, 168, 151, 151, 161, 151, 151, 164, 151, 151,
-154, 149, 149, 153, 148, 148, 151, 147, 147, 145,
-143, 143, 148, 145, 145, 156, 150, 150, 157, 151,
-151, 152, 147, 147, 146, 144, 144, 141, 140, 140,
-147, 145, 145, 149, 146, 146, 147, 144, 144, 139,
-139, 139, 141, 140, 140, 142, 141, 141, 141, 140,
-140, 140, 139, 139, 135, 134, 134, 78, 72, 72,
-79, 73, 73, 83, 76, 76, 64, 62, 62, 83,
-77, 77, 77, 72, 72, 74, 70, 70, 81, 75,
-75, 79, 73, 73, 51, 50, 50, 48, 47, 47,
-65, 62, 62, 72, 68, 68, 72, 68, 68, 76,
-71, 71, 81, 74, 74, 77, 72, 72, 76, 71,
-71, 86, 78, 78, 71, 67, 67, 81, 74, 74,
-79, 73, 73, 72, 68, 68, 67, 64, 64, 72,
-68, 68, 69, 66, 66, 78, 72, 72, 56, 55,
-55, 64, 61, 61, 79, 73, 73, 79, 73, 73,
-69, 65, 65, 82, 75, 75, 69, 66, 66, 56,
-54, 54, 66, 64, 64, 83, 76, 76, 73, 69,
-69, 76, 71, 71, 94, 82, 82, 71, 67, 67,
-50, 49, 49, 162, 152, 152, 149, 145, 145, 139,
-138, 138, 133, 133, 133, 133, 132, 132, 133, 133,
-133, 132, 132, 132, 130, 130, 130, 137, 137, 137,
-145, 143, 143, 157, 149, 149, 155, 150, 150, 157,
-149, 149, 158, 148, 148, 160, 150, 150, 153, 148,
-148, 150, 147, 147, 149, 146, 146, 146, 144, 144,
-138, 137, 137, 131, 131, 131, 136, 136, 136, 156,
-149, 149, 178, 148, 148, 170, 149, 149, 167, 150,
-150, 155, 148, 148, 146, 143, 143, 146, 144, 144,
-141, 140, 140, 136, 136, 136, 149, 146, 146, 168,
-150, 150, 153, 148, 148, 147, 145, 145, 151, 146,
-146, 155, 148, 148, 156, 149, 149, 153, 147, 147,
-145, 142, 142, 146, 144, 144, 153, 149, 149, 147,
-144, 144, 137, 137, 137, 145, 143, 143, 153, 147,
-147, 140, 139, 139, 137, 137, 137, 139, 138, 138,
-144, 143, 143, 147, 144, 144, 134, 134, 134, 133,
-133, 133, 139, 138, 138, 141, 140, 140, 138, 138,
-138, 136, 136, 136, 145, 143, 143, 149, 145, 145,
-148, 145, 145, 145, 143, 143, 136, 135, 135, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 137, 137, 137, 137, 136, 136, 135, 134, 134,
-143, 142, 142, 141, 140, 140, 147, 144, 144, 150,
-146, 146, 147, 144, 144, 149, 145, 145, 150, 145,
-145, 151, 146, 146, 153, 147, 147, 153, 146, 146,
-154, 147, 147, 149, 145, 145, 147, 143, 143, 149,
-145, 145, 147, 144, 144, 140, 138, 138, 141, 139,
-139, 149, 145, 145, 152, 147, 147, 159, 149, 149,
-154, 148, 148, 149, 145, 145, 148, 145, 145, 154,
-147, 147, 152, 146, 146, 148, 144, 144, 141, 139,
-139, 132, 132, 132, 127, 127, 127, 125, 125, 125,
-130, 130, 130, 136, 135, 135, 138, 137, 137, 140,
-138, 138, 139, 138, 138, 135, 134, 134, 134, 133,
-133, 137, 136, 136, 140, 139, 139, 143, 141, 141,
-143, 141, 141, 146, 143, 143, 140, 138, 138, 141,
-139, 139, 144, 141, 141, 142, 140, 140, 143, 141,
-141, 145, 142, 142, 142, 140, 140, 138, 137, 137,
-140, 138, 138, 147, 143, 143, 148, 143, 143, 144,
-141, 141, 143, 140, 140, 142, 140, 140, 143, 140,
-140, 146, 142, 142, 144, 141, 141, 139, 137, 137,
-139, 137, 137, 141, 139, 139, 142, 140, 140, 138,
-137, 137, 137, 136, 136, 138, 137, 137, 142, 139,
-139, 144, 141, 141, 144, 141, 141, 142, 140, 140,
-150, 144, 144, 148, 144, 144, 147, 143, 143, 146,
-142, 142, 145, 142, 142, 146, 143, 143, 147, 143,
-143, 145, 141, 141, 144, 141, 141, 145, 142, 142,
-146, 142, 142, 147, 143, 143, 148, 144, 144, 149,
-144, 144, 150, 144, 144, 145, 142, 142, 139, 138,
-138, 142, 140, 140, 147, 143, 143, 147, 143, 143,
-148, 144, 144, 150, 145, 145, 144, 141, 141, 141,
-140, 140, 140, 139, 139, 142, 140, 140, 144, 142,
-142, 147, 143, 143, 147, 143, 143, 148, 144, 144,
-147, 144, 144, 143, 140, 140, 143, 141, 141, 150,
-145, 145, 155, 147, 147, 151, 145, 145, 143, 140,
-140, 147, 144, 144, 150, 146, 146, 149, 145, 145,
-146, 143, 143, 148, 144, 144, 147, 144, 144, 149,
-145, 145, 152, 147, 147, 150, 146, 146, 139, 138,
-138, 134, 134, 134, 138, 137, 137, 141, 140, 140,
-141, 140, 140, 150, 145, 145, 143, 141, 141, 140,
-139, 139, 142, 140, 140, 143, 141, 141, 144, 142,
-142, 149, 145, 145, 149, 145, 145, 146, 143, 143,
-148, 144, 144, 145, 143, 143, 144, 142, 142, 146,
-144, 144, 151, 147, 147, 148, 145, 145, 139, 138,
-138, 134, 134, 134, 135, 135, 135, 135, 135, 135,
-144, 142, 142, 143, 141, 141, 140, 138, 138, 139,
-137, 137, 147, 144, 144, 146, 143, 143, 144, 142,
-142, 146, 143, 143, 156, 148, 148, 166, 149, 149,
-153, 147, 147, 143, 142, 142, 141, 140, 140, 147,
-144, 144, 149, 145, 145, 153, 148, 148, 148, 145,
-145, 141, 140, 140, 142, 141, 141, 144, 142, 142,
-145, 143, 143, 145, 143, 143, 147, 144, 144, 158,
-150, 150, 161, 151, 151, 151, 147, 147, 142, 141,
-141, 142, 141, 141, 150, 147, 147, 145, 143, 143,
-147, 145, 145, 149, 146, 146, 147, 145, 145, 147,
-145, 145, 142, 141, 141, 137, 137, 137, 137, 137,
-137, 143, 142, 142, 144, 142, 142, 163, 150, 150,
-174, 148, 148, 167, 152, 152, 143, 142, 142, 129,
-129, 129, 127, 127, 127, 138, 137, 137, 158, 152,
-152, 170, 153, 153, 158, 151, 151, 158, 151, 151,
-158, 151, 151, 152, 148, 148, 153, 149, 149, 147,
-144, 144, 139, 138, 138, 131, 131, 131, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 131, 131, 131,
-144, 142, 142, 169, 154, 154, 178, 146, 146, 156,
-150, 150, 143, 142, 142, 143, 142, 142, 143, 141,
-141, 138, 137, 137, 130, 130, 130, 136, 136, 136,
-57, 55, 55, 82, 75, 75, 77, 71, 71, 81,
-74, 74, 58, 56, 56, 47, 46, 46, 48, 47,
-47, 44, 44, 44, 57, 55, 55, 59, 57, 57,
-48, 48, 48, 47, 46, 46, 49, 49, 49, 60,
-58, 58, 65, 62, 62, 67, 64, 64, 65, 62,
-62, 71, 67, 67, 63, 61, 61, 76, 70, 70,
-71, 67, 67, 66, 63, 63, 59, 57, 57, 59,
-58, 58, 66, 63, 63, 74, 69, 69, 67, 64,
-64, 71, 66, 66, 67, 64, 64, 56, 54, 54,
-55, 53, 53, 63, 60, 60, 80, 74, 74, 76,
-70, 70, 48, 48, 48, 48, 47, 47, 71, 67,
-67, 88, 79, 79, 76, 70, 70, 81, 74, 74,
-141, 140, 140, 152, 148, 148, 166, 152, 152, 164,
-151, 151, 162, 150, 150, 156, 149, 149, 146, 144,
-144, 142, 141, 141, 142, 141, 141, 143, 142, 142,
-144, 143, 143, 144, 143, 143, 145, 144, 144, 144,
-143, 143, 140, 139, 139, 142, 141, 141, 152, 148,
-148, 168, 153, 153, 168, 151, 151, 157, 150, 150,
-147, 145, 145, 141, 140, 140, 137, 136, 136, 146,
-144, 144, 149, 146, 146, 152, 147, 147, 154, 149,
-149, 155, 149, 149, 155, 150, 150, 140, 139, 139,
-128, 128, 128, 132, 132, 132, 152, 148, 148, 150,
-147, 147, 146, 144, 144, 144, 143, 143, 146, 144,
-144, 146, 144, 144, 141, 140, 140, 134, 134, 134,
-139, 138, 138, 166, 151, 151, 165, 151, 151, 154,
-148, 148, 147, 145, 145, 149, 146, 146, 149, 146,
-146, 143, 142, 142, 139, 138, 138, 135, 134, 134,
-131, 131, 131, 130, 130, 130, 146, 144, 144, 154,
-148, 148, 154, 148, 148, 153, 147, 147, 148, 144,
-144, 151, 148, 148, 157, 150, 150, 158, 149, 149,
-149, 146, 146, 143, 141, 141, 140, 139, 139, 140,
-139, 139, 138, 138, 138, 133, 132, 132, 135, 134,
-134, 136, 135, 135, 142, 140, 140, 150, 146, 146,
-136, 135, 135, 146, 143, 143, 148, 145, 145, 143,
-141, 141, 136, 136, 136, 140, 139, 139, 145, 143,
-143, 148, 145, 145, 151, 146, 146, 156, 148, 148,
-148, 145, 145, 143, 141, 141, 139, 137, 137, 134,
-134, 134, 131, 131, 131, 138, 137, 137, 143, 141,
-141, 151, 147, 147, 160, 150, 150, 159, 149, 149,
-155, 148, 148, 147, 143, 143, 141, 139, 139, 141,
-139, 139, 135, 134, 134, 131, 131, 131, 129, 129,
-129, 127, 127, 127, 128, 128, 128, 131, 131, 131,
-137, 136, 136, 144, 141, 141, 147, 144, 144, 143,
-141, 141, 138, 137, 137, 140, 138, 138, 146, 142,
-142, 147, 144, 144, 150, 145, 145, 147, 143, 143,
-142, 140, 140, 141, 140, 140, 144, 141, 141, 144,
-142, 142, 145, 142, 142, 148, 144, 144, 149, 144,
-144, 142, 140, 140, 142, 140, 140, 148, 144, 144,
-150, 145, 145, 143, 141, 141, 140, 138, 138, 137,
-136, 136, 137, 136, 136, 137, 136, 136, 140, 138,
-138, 141, 139, 139, 138, 137, 137, 138, 137, 137,
-138, 137, 137, 138, 137, 137, 138, 137, 137, 139,
-137, 137, 143, 141, 141, 148, 144, 144, 148, 143,
-143, 144, 141, 141, 143, 141, 141, 145, 142, 142,
-139, 137, 137, 149, 145, 145, 148, 144, 144, 148,
-144, 144, 147, 144, 144, 147, 144, 144, 148, 144,
-144, 150, 145, 145, 154, 147, 147, 152, 146, 146,
-150, 145, 145, 148, 144, 144, 147, 143, 143, 147,
-143, 143, 147, 143, 143, 148, 144, 144, 151, 146,
-146, 150, 146, 146, 150, 145, 145, 149, 145, 145,
-146, 143, 143, 142, 140, 140, 141, 139, 139, 140,
-139, 139, 142, 140, 140, 148, 144, 144, 150, 146,
-146, 147, 143, 143, 143, 141, 141, 143, 141, 141,
-143, 141, 141, 151, 146, 146, 153, 147, 147, 151,
-146, 146, 147, 144, 144, 146, 143, 143, 147, 143,
-143, 143, 141, 141, 141, 140, 140, 143, 141, 141,
-142, 140, 140, 143, 141, 141, 146, 143, 143, 148,
-144, 144, 148, 145, 145, 148, 145, 145, 154, 149,
-149, 155, 149, 149, 152, 147, 147, 151, 147, 147,
-153, 148, 148, 149, 145, 145, 145, 142, 142, 144,
-141, 141, 147, 144, 144, 143, 141, 141, 146, 144,
-144, 146, 144, 144, 145, 142, 142, 147, 144, 144,
-157, 150, 150, 159, 150, 150, 159, 150, 150, 157,
-150, 150, 155, 149, 149, 159, 150, 150, 156, 149,
-149, 144, 142, 142, 133, 133, 133, 135, 134, 134,
-134, 134, 134, 145, 142, 142, 146, 143, 143, 142,
-141, 141, 137, 137, 137, 144, 142, 142, 157, 150,
-150, 153, 148, 148, 145, 143, 143, 151, 147, 147,
-163, 151, 151, 165, 152, 152, 160, 152, 152, 152,
-148, 148, 144, 143, 143, 140, 139, 139, 154, 149,
-149, 154, 148, 148, 147, 144, 144, 144, 142, 142,
-147, 144, 144, 162, 152, 152, 158, 152, 152, 152,
-148, 148, 156, 150, 150, 155, 150, 150, 151, 147,
-147, 141, 140, 140, 138, 137, 137, 146, 144, 144,
-148, 146, 146, 152, 148, 148, 152, 148, 148, 147,
-145, 145, 143, 142, 142, 139, 139, 139, 153, 149,
-149, 161, 153, 153, 158, 152, 152, 148, 145, 145,
-157, 150, 150, 167, 154, 154, 167, 155, 155, 161,
-153, 153, 153, 149, 149, 140, 139, 139, 141, 140,
-140, 156, 150, 150, 163, 152, 152, 148, 145, 145,
-153, 148, 148, 149, 146, 146, 159, 151, 151, 164,
-154, 154, 149, 146, 146, 140, 140, 140, 134, 134,
-134, 145, 144, 144, 159, 153, 153, 161, 154, 154,
-161, 153, 153, 155, 151, 151, 162, 153, 153, 162,
-152, 152, 152, 148, 148, 147, 144, 144, 156, 150,
-150, 149, 146, 146, 131, 131, 131, 130, 130, 130,
-163, 152, 152, 88, 78, 78, 63, 61, 61, 82,
-74, 74, 70, 66, 66, 73, 68, 68, 74, 69,
-69, 50, 49, 49, 71, 67, 67, 61, 59, 59,
-55, 53, 53, 58, 57, 57, 63, 60, 60, 69,
-65, 65, 69, 65, 65, 68, 65, 65, 75, 70,
-70, 71, 67, 67, 66, 63, 63, 71, 67, 67,
-76, 71, 71, 69, 65, 65, 69, 65, 65, 59,
-57, 57, 67, 64, 64, 65, 62, 62, 64, 62,
-62, 68, 65, 65, 72, 67, 67, 65, 62, 62,
-63, 60, 60, 66, 63, 63, 64, 61, 61, 63,
-60, 60, 44, 44, 44, 37, 37, 37, 44, 44,
-44, 60, 58, 58, 63, 61, 61, 146, 144, 144,
-142, 141, 141, 138, 137, 137, 139, 138, 138, 144,
-143, 143, 154, 149, 149, 161, 153, 153, 155, 150,
-150, 161, 152, 152, 170, 153, 153, 159, 151, 151,
-147, 144, 144, 146, 144, 144, 148, 145, 145, 146,
-144, 144, 136, 135, 135, 143, 142, 142, 144, 143,
-143, 154, 149, 149, 165, 152, 152, 162, 152, 152,
-147, 144, 144, 152, 148, 148, 161, 153, 153, 169,
-155, 155, 172, 154, 154, 155, 150, 150, 151, 147,
-147, 149, 146, 146, 150, 147, 147, 159, 153, 153,
-160, 153, 153, 168, 155, 155, 162, 153, 153, 151,
-147, 147, 152, 147, 147, 153, 148, 148, 150, 147,
-147, 157, 150, 150, 164, 153, 153, 158, 151, 151,
-154, 149, 149, 153, 148, 148, 153, 149, 149, 153,
-149, 149, 151, 147, 147, 150, 147, 147, 158, 151,
-151, 161, 153, 153, 158, 152, 152, 157, 151, 151,
-155, 150, 150, 162, 152, 152, 154, 149, 149, 142,
-140, 140, 139, 138, 138, 136, 136, 136, 140, 139,
-139, 145, 143, 143, 147, 144, 144, 145, 142, 142,
-146, 143, 143, 147, 144, 144, 149, 146, 146, 150,
-146, 146, 149, 146, 146, 157, 150, 150, 157, 151,
-151, 154, 148, 148, 149, 145, 145, 145, 143, 143,
-151, 147, 147, 157, 150, 150, 157, 150, 150, 156,
-150, 150, 157, 150, 150, 154, 149, 149, 157, 150,
-150, 160, 151, 151, 162, 151, 151, 158, 150, 150,
-156, 150, 150, 153, 148, 148, 143, 141, 141, 134,
-134, 134, 140, 139, 139, 147, 144, 144, 152, 147,
-147, 153, 147, 147, 153, 147, 147, 154, 148, 148,
-146, 143, 143, 144, 142, 142, 143, 141, 141, 141,
-139, 139, 140, 139, 139, 139, 138, 138, 139, 138,
-138, 140, 139, 139, 142, 141, 141, 145, 143, 143,
-147, 144, 144, 146, 144, 144, 144, 142, 142, 143,
-141, 141, 146, 143, 143, 147, 143, 143, 149, 145,
-145, 146, 143, 143, 140, 139, 139, 140, 139, 139,
-145, 142, 142, 150, 145, 145, 149, 145, 145, 148,
-144, 144, 147, 143, 143, 145, 142, 142, 144, 142,
-142, 150, 145, 145, 155, 147, 147, 153, 146, 146,
-146, 143, 143, 142, 140, 140, 138, 137, 137, 133,
-133, 133, 133, 132, 132, 135, 134, 134, 136, 135,
-135, 137, 136, 136, 137, 136, 136, 138, 137, 137,
-140, 138, 138, 142, 140, 140, 144, 141, 141, 148,
-144, 144, 148, 144, 144, 145, 142, 142, 145, 142,
-142, 148, 144, 144, 152, 146, 146, 142, 139, 139,
-120, 120, 120, 127, 127, 127, 137, 136, 136, 147,
-144, 144, 147, 144, 144, 148, 144, 144, 148, 144,
-144, 149, 145, 145, 150, 146, 146, 155, 148, 148,
-159, 149, 149, 157, 149, 149, 155, 148, 148, 152,
-147, 147, 150, 146, 146, 149, 145, 145, 149, 145,
-145, 149, 145, 145, 149, 145, 145, 152, 147, 147,
-154, 148, 148, 149, 145, 145, 145, 143, 143, 139,
-138, 138, 134, 134, 134, 130, 130, 130, 139, 138,
-138, 149, 145, 145, 151, 146, 146, 144, 141, 141,
-138, 137, 137, 139, 137, 137, 140, 139, 139, 148,
-144, 144, 152, 147, 147, 155, 149, 149, 153, 148,
-148, 149, 145, 145, 148, 144, 144, 147, 144, 144,
-143, 141, 141, 139, 137, 137, 135, 134, 134, 142,
-140, 140, 151, 146, 146, 154, 148, 148, 154, 148,
-148, 156, 150, 150, 160, 152, 152, 155, 149, 149,
-156, 149, 149, 154, 148, 148, 150, 146, 146, 145,
-143, 143, 139, 138, 138, 145, 142, 142, 150, 146,
-146, 156, 150, 150, 155, 149, 149, 149, 146, 146,
-144, 142, 142, 154, 148, 148, 160, 151, 151, 162,
-152, 152, 165, 152, 152, 157, 150, 150, 157, 150,
-150, 161, 151, 151, 151, 147, 147, 132, 132, 132,
-133, 133, 133, 143, 141, 141, 155, 149, 149, 157,
-150, 150, 154, 149, 149, 146, 144, 144, 141, 140,
-140, 154, 149, 149, 153, 148, 148, 141, 140, 140,
-141, 140, 140, 152, 148, 148, 158, 150, 150, 156,
-150, 150, 153, 149, 149, 148, 145, 145, 137, 136,
-136, 147, 145, 145, 148, 145, 145, 144, 142, 142,
-148, 145, 145, 159, 152, 152, 171, 155, 155, 159,
-152, 152, 149, 146, 146, 155, 150, 150, 166, 153,
-153, 162, 153, 153, 152, 147, 147, 143, 141, 141,
-141, 140, 140, 145, 143, 143, 150, 147, 147, 157,
-151, 151, 159, 152, 152, 156, 150, 150, 152, 148,
-148, 165, 154, 154, 163, 153, 153, 150, 147, 147,
-140, 139, 139, 143, 142, 142, 157, 152, 152, 157,
-152, 152, 156, 151, 151, 154, 150, 150, 148, 146,
-146, 138, 138, 138, 150, 146, 146, 147, 144, 144,
-147, 145, 145, 152, 148, 148, 158, 151, 151, 164,
-154, 154, 159, 153, 153, 156, 151, 151, 154, 150,
-150, 152, 149, 149, 155, 150, 150, 158, 152, 152,
-160, 153, 153, 160, 152, 152, 149, 146, 146, 156,
-150, 150, 153, 149, 149, 151, 148, 148, 152, 148,
-148, 155, 151, 151, 133, 133, 133, 128, 128, 128,
-142, 141, 141, 157, 151, 151, 52, 51, 51, 71,
-67, 67, 80, 73, 73, 79, 72, 72, 92, 80,
-80, 60, 58, 58, 55, 53, 53, 50, 49, 49,
-46, 46, 46, 63, 61, 61, 68, 65, 65, 69,
-65, 65, 67, 64, 64, 76, 71, 71, 82, 75,
-75, 79, 73, 73, 77, 72, 72, 86, 78, 78,
-70, 66, 66, 83, 76, 76, 71, 67, 67, 73,
-68, 68, 60, 58, 58, 47, 47, 47, 57, 55,
-55, 67, 64, 64, 73, 68, 68, 63, 60, 60,
-69, 66, 66, 65, 62, 62, 58, 56, 56, 87,
-77, 77, 91, 80, 80, 69, 65, 65, 65, 62,
-62, 72, 68, 68, 168, 154, 154, 164, 154, 154,
-161, 153, 153, 150, 147, 147, 148, 146, 146, 160,
-153, 153, 166, 154, 154, 160, 153, 153, 160, 152,
-152, 176, 154, 154, 176, 154, 154, 160, 152, 152,
-144, 143, 143, 137, 136, 136, 159, 151, 151, 149,
-146, 146, 149, 146, 146, 151, 148, 148, 137, 137,
-137, 149, 146, 146, 154, 149, 149, 147, 144, 144,
-143, 142, 142, 154, 150, 150, 160, 153, 153, 162,
-153, 153, 151, 148, 148, 143, 142, 142, 142, 141,
-141, 138, 137, 137, 152, 148, 148, 157, 151, 151,
-163, 154, 154, 166, 154, 154, 155, 150, 150, 151,
-147, 147, 160, 152, 152, 163, 153, 153, 160, 152,
-152, 161, 152, 152, 162, 153, 153, 154, 149, 149,
-148, 146, 146, 150, 147, 147, 157, 150, 150, 159,
-152, 152, 157, 150, 150, 157, 150, 150, 161, 153,
-153, 162, 154, 154, 157, 151, 151, 155, 149, 149,
-163, 153, 153, 160, 152, 152, 148, 145, 145, 140,
-139, 139, 130, 130, 130, 133, 132, 132, 144, 142,
-142, 152, 148, 148, 153, 148, 148, 158, 150, 150,
-160, 152, 152, 163, 153, 153, 165, 153, 153, 164,
-153, 153, 161, 152, 152, 165, 154, 154, 165, 153,
-153, 163, 152, 152, 156, 149, 149, 148, 145, 145,
-157, 150, 150, 162, 152, 152, 160, 152, 152, 156,
-150, 150, 155, 149, 149, 160, 151, 151, 163, 151,
-151, 164, 151, 151, 159, 150, 150, 155, 149, 149,
-151, 147, 147, 139, 138, 138, 134, 134, 134, 143,
-141, 141, 152, 147, 147, 152, 148, 148, 152, 147,
-147, 155, 148, 148, 153, 148, 148, 150, 146, 146,
-149, 146, 146, 149, 145, 145, 149, 146, 146, 151,
-146, 146, 152, 147, 147, 152, 147, 147, 154, 148,
-148, 152, 147, 147, 150, 146, 146, 149, 146, 146,
-149, 146, 146, 149, 145, 145, 149, 145, 145, 150,
-146, 146, 153, 147, 147, 147, 144, 144, 138, 137,
-137, 136, 135, 135, 146, 143, 143, 154, 147, 147,
-150, 145, 145, 146, 143, 143, 143, 141, 141, 146,
-143, 143, 148, 144, 144, 151, 146, 146, 156, 148,
-148, 157, 148, 148, 152, 147, 147, 148, 145, 145,
-139, 138, 138, 129, 129, 129, 128, 128, 128, 132,
-131, 131, 135, 134, 134, 134, 133, 133, 135, 134,
-134, 136, 135, 135, 141, 139, 139, 144, 141, 141,
-146, 143, 143, 148, 144, 144, 148, 144, 144, 146,
-143, 143, 146, 143, 143, 153, 147, 147, 159, 149,
-149, 144, 141, 141, 129, 129, 129, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 126,
-126, 126, 136, 135, 135, 149, 144, 144, 147, 144,
-144, 145, 142, 142, 145, 142, 142, 146, 143, 143,
-146, 143, 143, 150, 145, 145, 153, 146, 146, 152,
-146, 146, 153, 147, 147, 152, 146, 146, 150, 145,
-145, 148, 144, 144, 146, 143, 143, 144, 142, 142,
-143, 141, 141, 148, 144, 144, 151, 146, 146, 148,
-144, 144, 146, 143, 143, 144, 142, 142, 140, 139,
-139, 138, 137, 137, 141, 140, 140, 145, 142, 142,
-144, 142, 142, 140, 139, 139, 140, 138, 138, 141,
-139, 139, 142, 140, 140, 145, 142, 142, 149, 145,
-145, 154, 148, 148, 153, 147, 147, 151, 147, 147,
-151, 146, 146, 149, 145, 145, 145, 142, 142, 138,
-137, 137, 139, 137, 137, 147, 144, 144, 153, 147,
-147, 153, 147, 147, 155, 149, 149, 156, 150, 150,
-151, 146, 146, 149, 145, 145, 151, 146, 146, 144,
-142, 142, 144, 142, 142, 143, 141, 141, 141, 139,
-139, 147, 144, 144, 163, 152, 152, 163, 152, 152,
-156, 149, 149, 149, 146, 146, 148, 145, 145, 148,
-145, 145, 150, 146, 146, 156, 150, 150, 150, 146,
-146, 145, 143, 143, 149, 145, 145, 153, 148, 148,
-137, 136, 136, 139, 138, 138, 154, 149, 149, 165,
-153, 153, 164, 153, 153, 161, 152, 152, 154, 149,
-149, 141, 140, 140, 142, 141, 141, 146, 144, 144,
-142, 141, 141, 141, 140, 140, 144, 142, 142, 144,
-142, 142, 145, 143, 143, 151, 147, 147, 155, 149,
-149, 143, 142, 142, 144, 142, 142, 142, 140, 140,
-143, 142, 142, 153, 149, 149, 167, 155, 155, 161,
-154, 154, 153, 149, 149, 145, 143, 143, 153, 148,
-148, 171, 152, 152, 164, 154, 154, 163, 153, 153,
-150, 146, 146, 142, 141, 141, 143, 141, 141, 149,
-146, 146, 164, 153, 153, 168, 154, 154, 164, 154,
-154, 158, 152, 152, 154, 149, 149, 152, 147, 147,
-139, 138, 138, 137, 136, 136, 142, 141, 141, 144,
-143, 143, 137, 136, 136, 142, 141, 141, 155, 150,
-150, 151, 147, 147, 140, 139, 139, 137, 137, 137,
-144, 143, 143, 147, 145, 145, 164, 153, 153, 160,
-152, 152, 154, 150, 150, 162, 152, 152, 161, 151,
-151, 166, 154, 154, 146, 144, 144, 135, 135, 135,
-140, 139, 139, 147, 145, 145, 147, 145, 145, 153,
-148, 148, 156, 150, 150, 159, 153, 153, 160, 153,
-153, 152, 149, 149, 143, 142, 142, 139, 138, 138,
-141, 140, 140, 146, 144, 144, 141, 140, 140, 139,
-138, 138, 52, 51, 51, 79, 72, 72, 98, 82,
-82, 73, 68, 68, 63, 61, 61, 68, 65, 65,
-67, 64, 64, 72, 68, 68, 77, 72, 72, 77,
-72, 72, 57, 56, 56, 60, 59, 59, 65, 63,
-63, 68, 65, 65, 84, 76, 76, 88, 78, 78,
-84, 76, 76, 69, 65, 65, 56, 54, 54, 70,
-66, 66, 74, 69, 69, 56, 55, 55, 60, 58,
-58, 68, 65, 65, 75, 70, 70, 65, 62, 62,
-74, 70, 70, 77, 72, 72, 67, 64, 64, 56,
-55, 55, 50, 49, 49, 50, 49, 49, 164, 153,
-153, 150, 147, 147, 149, 146, 146, 158, 151, 151,
-173, 155, 155, 174, 155, 155, 168, 155, 155, 179,
-152, 152, 167, 154, 154, 165, 154, 154, 169, 154,
-154, 168, 156, 156, 173, 157, 157, 160, 152, 152,
-139, 138, 138, 143, 142, 142, 164, 151, 151, 150,
-147, 147, 164, 152, 152, 153, 149, 149, 144, 142,
-142, 141, 140, 140, 142, 141, 141, 142, 141, 141,
-143, 142, 142, 144, 142, 142, 141, 140, 140, 138,
-137, 137, 140, 139, 139, 142, 141, 141, 140, 139,
-139, 137, 137, 137, 138, 137, 137, 141, 140, 140,
-148, 146, 146, 152, 149, 149, 144, 142, 142, 151,
-148, 148, 164, 155, 155, 161, 153, 153, 141, 140,
-140, 147, 144, 144, 154, 149, 149, 152, 148, 148,
-147, 145, 145, 153, 148, 148, 158, 151, 151, 158,
-150, 150, 149, 145, 145, 144, 143, 143, 150, 147,
-147, 139, 138, 138, 137, 136, 136, 149, 146, 146,
-159, 151, 151, 160, 152, 152, 153, 148, 148, 138,
-138, 138, 139, 138, 138, 151, 147, 147, 159, 151,
-151, 158, 151, 151, 163, 152, 152, 166, 154, 154,
-164, 153, 153, 164, 153, 153, 160, 151, 151, 148,
-145, 145, 157, 150, 150, 167, 152, 152, 166, 152,
-152, 152, 147, 147, 140, 139, 139, 145, 143, 143,
-155, 150, 150, 149, 146, 146, 148, 145, 145, 152,
-147, 147, 155, 149, 149, 157, 149, 149, 155, 148,
-148, 149, 145, 145, 144, 142, 142, 141, 140, 140,
-137, 137, 137, 136, 135, 135, 148, 145, 145, 155,
-149, 149, 155, 148, 148, 154, 148, 148, 153, 148,
-148, 150, 146, 146, 149, 145, 145, 150, 146, 146,
-150, 146, 146, 150, 146, 146, 150, 146, 146, 149,
-145, 145, 151, 146, 146, 153, 147, 147, 152, 147,
-147, 151, 147, 147, 153, 147, 147, 152, 147, 147,
-152, 146, 146, 153, 147, 147, 154, 148, 148, 152,
-146, 146, 142, 140, 140, 138, 137, 137, 144, 141,
-141, 151, 146, 146, 148, 144, 144, 145, 142, 142,
-144, 142, 142, 146, 143, 143, 147, 143, 143, 148,
-144, 144, 150, 145, 145, 151, 146, 146, 148, 144,
-144, 146, 143, 143, 143, 140, 140, 138, 137, 137,
-139, 137, 137, 144, 141, 141, 147, 143, 143, 143,
-141, 141, 139, 138, 138, 139, 138, 138, 141, 139,
-139, 142, 140, 140, 142, 139, 139, 141, 139, 139,
-143, 140, 140, 144, 141, 141, 148, 143, 143, 153,
-147, 147, 158, 148, 148, 140, 138, 138, 127, 127,
-127, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 124, 124, 124, 136, 135,
-135, 150, 145, 145, 148, 143, 143, 143, 141, 141,
-141, 139, 139, 141, 139, 139, 142, 139, 139, 144,
-142, 142, 146, 143, 143, 148, 144, 144, 149, 145,
-145, 149, 144, 144, 148, 144, 144, 146, 142, 142,
-141, 139, 139, 136, 135, 135, 138, 137, 137, 147,
-143, 143, 151, 146, 146, 148, 144, 144, 147, 144,
-144, 149, 145, 145, 154, 147, 147, 154, 146, 146,
-149, 145, 145, 146, 143, 143, 146, 143, 143, 147,
-144, 144, 151, 146, 146, 153, 147, 147, 153, 147,
-147, 154, 148, 148, 153, 147, 147, 142, 140, 140,
-140, 138, 138, 138, 137, 137, 138, 137, 137, 141,
-140, 140, 145, 143, 143, 145, 142, 142, 145, 142,
-142, 143, 141, 141, 141, 139, 139, 140, 138, 138,
-139, 138, 138, 142, 140, 140, 148, 145, 145, 159,
-150, 150, 157, 149, 149, 153, 147, 147, 153, 147,
-147, 150, 146, 146, 144, 142, 142, 153, 148, 148,
-153, 148, 148, 151, 147, 147, 153, 148, 148, 151,
-147, 147, 145, 143, 143, 143, 141, 141, 144, 142,
-142, 147, 144, 144, 148, 145, 145, 140, 138, 138,
-137, 136, 136, 149, 145, 145, 158, 150, 150, 162,
-151, 151, 160, 151, 151, 154, 149, 149, 144, 142,
-142, 138, 137, 137, 135, 135, 135, 139, 138, 138,
-151, 147, 147, 157, 149, 149, 158, 150, 150, 156,
-149, 149, 155, 149, 149, 163, 152, 152, 169, 152,
-152, 157, 149, 149, 156, 149, 149, 157, 149, 149,
-163, 151, 151, 162, 151, 151, 154, 148, 148, 148,
-145, 145, 153, 149, 149, 162, 153, 153, 145, 143,
-143, 133, 132, 132, 133, 132, 132, 134, 134, 134,
-147, 144, 144, 165, 152, 152, 163, 152, 152, 157,
-150, 150, 155, 149, 149, 150, 147, 147, 139, 138,
-138, 147, 144, 144, 146, 143, 143, 155, 148, 148,
-169, 150, 150, 159, 150, 150, 160, 151, 151, 160,
-151, 151, 159, 151, 151, 159, 151, 151, 159, 151,
-151, 159, 151, 151, 160, 151, 151, 159, 150, 150,
-151, 147, 147, 137, 137, 137, 136, 135, 135, 161,
-153, 153, 168, 156, 156, 163, 153, 153, 146, 144,
-144, 136, 136, 136, 142, 141, 141, 163, 152, 152,
-176, 147, 147, 166, 153, 153, 150, 147, 147, 156,
-150, 150, 174, 151, 151, 168, 153, 153, 143, 141,
-141, 149, 146, 146, 158, 151, 151, 161, 152, 152,
-170, 152, 152, 195, 129, 129, 169, 154, 154, 144,
-143, 143, 145, 143, 143, 69, 65, 65, 59, 57,
-57, 54, 53, 53, 53, 52, 52, 72, 68, 68,
-81, 74, 74, 70, 66, 66, 74, 69, 69, 71,
-67, 67, 55, 54, 54, 51, 50, 50, 53, 52,
-52, 73, 68, 68, 75, 70, 70, 82, 75, 75,
-70, 66, 66, 73, 68, 68, 71, 66, 66, 63,
-61, 61, 82, 73, 73, 72, 68, 68, 74, 68,
-68, 74, 70, 70, 64, 62, 62, 72, 67, 67,
-68, 64, 64, 67, 64, 64, 64, 62, 62, 80,
-73, 73, 58, 56, 56, 159, 152, 152, 155, 150,
-150, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 130, 129, 129, 136, 136, 136, 136,
-135, 135, 144, 142, 142, 149, 147, 147, 140, 139,
-139, 137, 136, 136, 147, 145, 145, 158, 149, 149,
-130, 130, 130, 132, 132, 132, 139, 139, 139, 147,
-145, 145, 153, 148, 148, 154, 150, 150, 161, 152,
-152, 162, 152, 152, 172, 153, 153, 175, 153, 153,
-170, 154, 154, 168, 152, 152, 168, 153, 153, 168,
-154, 154, 167, 153, 153, 164, 152, 152, 160, 151,
-151, 160, 152, 152, 161, 152, 152, 150, 146, 146,
-137, 137, 137, 131, 130, 130, 131, 130, 130, 131,
-131, 131, 134, 133, 133, 153, 148, 148, 160, 150,
-150, 155, 148, 148, 144, 142, 142, 132, 132, 132,
-145, 143, 143, 139, 138, 138, 140, 139, 139, 140,
-139, 139, 143, 141, 141, 157, 150, 150, 147, 144,
-144, 137, 136, 136, 134, 133, 133, 135, 135, 135,
-141, 140, 140, 154, 149, 149, 157, 150, 150, 157,
-151, 151, 148, 145, 145, 137, 136, 136, 134, 134,
-134, 144, 142, 142, 153, 148, 148, 150, 146, 146,
-149, 145, 145, 149, 145, 145, 146, 143, 143, 140,
-139, 139, 139, 138, 138, 137, 137, 137, 139, 138,
-138, 137, 136, 136, 142, 140, 140, 167, 153, 153,
-157, 149, 149, 156, 148, 148, 156, 149, 149, 151,
-147, 147, 146, 144, 144, 157, 149, 149, 156, 149,
-149, 154, 148, 148, 149, 145, 145, 141, 139, 139,
-139, 138, 138, 151, 147, 147, 158, 150, 150, 153,
-147, 147, 150, 146, 146, 146, 143, 143, 139, 138,
-138, 140, 139, 139, 141, 139, 139, 142, 140, 140,
-138, 137, 137, 132, 132, 132, 134, 133, 133, 141,
-140, 140, 148, 144, 144, 147, 144, 144, 151, 146,
-146, 152, 147, 147, 151, 146, 146, 152, 147, 147,
-153, 147, 147, 153, 147, 147, 149, 145, 145, 145,
-142, 142, 143, 141, 141, 144, 142, 142, 148, 144,
-144, 151, 146, 146, 151, 146, 146, 145, 142, 142,
-142, 140, 140, 143, 140, 140, 148, 144, 144, 151,
-145, 145, 146, 143, 143, 141, 139, 139, 143, 141,
-141, 149, 144, 144, 153, 147, 147, 160, 149, 149,
-165, 150, 150, 156, 148, 148, 146, 143, 143, 143,
-141, 141, 143, 140, 140, 141, 139, 139, 137, 136,
-136, 132, 132, 132, 137, 136, 136, 143, 140, 140,
-148, 143, 143, 152, 146, 146, 154, 146, 146, 138,
-136, 136, 125, 125, 125, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 123, 123, 123, 134, 133, 133, 147, 143, 143,
-148, 143, 143, 144, 141, 141, 142, 140, 140, 142,
-140, 140, 142, 140, 140, 144, 141, 141, 146, 142,
-142, 147, 143, 143, 148, 144, 144, 148, 144, 144,
-146, 142, 142, 144, 141, 141, 140, 139, 139, 137,
-136, 136, 141, 140, 140, 149, 145, 145, 155, 147,
-147, 153, 147, 147, 151, 145, 145, 152, 146, 146,
-155, 147, 147, 152, 146, 146, 147, 144, 144, 143,
-141, 141, 144, 142, 142, 146, 143, 143, 147, 144,
-144, 148, 144, 144, 148, 145, 145, 149, 145, 145,
-150, 145, 145, 147, 144, 144, 143, 141, 141, 143,
-141, 141, 143, 141, 141, 140, 138, 138, 139, 138,
-138, 139, 138, 138, 139, 138, 138, 140, 139, 139,
-146, 143, 143, 145, 143, 143, 146, 143, 143, 150,
-146, 146, 152, 147, 147, 151, 146, 146, 150, 146,
-146, 148, 144, 144, 147, 144, 144, 148, 145, 145,
-154, 148, 148, 161, 151, 151, 163, 151, 151, 156,
-149, 149, 145, 143, 143, 147, 144, 144, 142, 140,
-140, 137, 136, 136, 137, 137, 137, 142, 140, 140,
-148, 145, 145, 150, 146, 146, 149, 145, 145, 147,
-144, 144, 147, 144, 144, 155, 149, 149, 168, 153,
-153, 157, 149, 149, 157, 149, 149, 152, 147, 147,
-143, 141, 141, 145, 143, 143, 158, 151, 151, 159,
-151, 151, 152, 147, 147, 143, 141, 141, 144, 142,
-142, 150, 147, 147, 146, 144, 144, 146, 144, 144,
-146, 144, 144, 143, 142, 142, 139, 138, 138, 144,
-142, 142, 155, 150, 150, 151, 148, 148, 140, 139,
-139, 143, 142, 142, 148, 145, 145, 150, 147, 147,
-148, 145, 145, 138, 137, 137, 158, 151, 151, 150,
-146, 146, 140, 139, 139, 143, 141, 141, 148, 146,
-146, 143, 142, 142, 146, 144, 144, 136, 135, 135,
-137, 137, 137, 144, 143, 143, 144, 143, 143, 141,
-140, 140, 153, 149, 149, 137, 137, 137, 135, 134,
-134, 135, 134, 134, 135, 134, 134, 135, 134, 134,
-138, 137, 137, 157, 150, 150, 134, 133, 133, 132,
-131, 131, 134, 133, 133, 137, 136, 136, 146, 144,
-144, 170, 152, 152, 156, 150, 150, 139, 138, 138,
-142, 141, 141, 142, 141, 141, 131, 131, 131, 130,
-130, 130, 134, 133, 133, 140, 139, 139, 165, 153,
-153, 161, 152, 152, 140, 139, 139, 133, 132, 132,
-134, 133, 133, 175, 153, 153, 171, 154, 154, 160,
-152, 152, 155, 150, 150, 146, 144, 144, 129, 128,
-128, 47, 46, 46, 58, 56, 56, 66, 63, 63,
-70, 66, 66, 78, 72, 72, 80, 73, 73, 65,
-62, 62, 60, 58, 58, 76, 71, 71, 73, 69,
-69, 70, 67, 67, 89, 79, 79, 91, 80, 80,
-88, 79, 79, 85, 78, 78, 72, 68, 68, 77,
-72, 72, 74, 70, 70, 74, 69, 69, 69, 66,
-66, 91, 80, 80, 69, 66, 66, 83, 76, 76,
-81, 74, 74, 87, 79, 79, 65, 63, 63, 144,
-142, 142, 166, 154, 154, 165, 154, 154, 158, 151,
-151, 155, 150, 150, 161, 153, 153, 177, 153, 153,
-162, 152, 152, 148, 145, 145, 151, 147, 147, 158,
-151, 151, 152, 148, 148, 140, 139, 139, 175, 156,
-156, 142, 141, 141, 148, 145, 145, 155, 149, 149,
-141, 140, 140, 128, 128, 128, 130, 130, 130, 137,
-137, 137, 153, 149, 149, 154, 149, 149, 152, 148,
-148, 162, 153, 153, 164, 153, 153, 163, 153, 153,
-149, 146, 146, 139, 138, 138, 137, 136, 136, 136,
-136, 136, 139, 138, 138, 153, 149, 149, 140, 139,
-139, 144, 143, 143, 159, 151, 151, 167, 153, 153,
-160, 152, 152, 159, 151, 151, 162, 150, 150, 140,
-139, 139, 135, 134, 134, 150, 146, 146, 165, 151,
-151, 156, 149, 149, 148, 145, 145, 136, 136, 136,
-138, 137, 137, 150, 146, 146, 153, 148, 148, 139,
-138, 138, 141, 140, 140, 153, 148, 148, 153, 148,
-148, 151, 147, 147, 158, 151, 151, 165, 153, 153,
-159, 152, 152, 160, 152, 152, 161, 153, 153, 149,
-146, 146, 137, 136, 136, 135, 135, 135, 143, 141,
-141, 138, 137, 137, 136, 135, 135, 137, 137, 137,
-153, 147, 147, 165, 151, 151, 161, 151, 151, 157,
-150, 150, 149, 146, 146, 142, 141, 141, 136, 135,
-135, 138, 138, 138, 146, 144, 144, 150, 146, 146,
-146, 144, 144, 159, 150, 150, 160, 150, 150, 158,
-150, 150, 156, 149, 149, 154, 148, 148, 144, 142,
-142, 139, 138, 138, 135, 135, 135, 139, 137, 137,
-143, 141, 141, 142, 140, 140, 140, 139, 139, 140,
-139, 139, 147, 144, 144, 151, 147, 147, 155, 148,
-148, 156, 149, 149, 147, 144, 144, 135, 135, 135,
-132, 132, 132, 135, 135, 135, 142, 140, 140, 147,
-144, 144, 151, 146, 146, 151, 146, 146, 152, 147,
-147, 150, 145, 145, 151, 146, 146, 150, 146, 146,
-150, 146, 146, 153, 147, 147, 152, 146, 146, 145,
-142, 142, 142, 140, 140, 149, 145, 145, 156, 149,
-149, 154, 147, 147, 147, 144, 144, 145, 142, 142,
-144, 142, 142, 144, 142, 142, 142, 140, 140, 138,
-137, 137, 143, 141, 141, 151, 146, 146, 159, 149,
-149, 166, 150, 150, 171, 150, 150, 161, 150, 150,
-150, 146, 146, 146, 143, 143, 144, 142, 142, 142,
-140, 140, 138, 137, 137, 134, 133, 133, 140, 138,
-138, 146, 143, 143, 149, 144, 144, 152, 146, 146,
-149, 143, 143, 135, 134, 134, 123, 123, 123, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 121, 121, 121,
-132, 131, 131, 144, 141, 141, 148, 144, 144, 147,
-144, 144, 146, 143, 143, 147, 143, 143, 146, 143,
-143, 148, 144, 144, 149, 145, 145, 150, 145, 145,
-150, 146, 146, 150, 146, 146, 148, 144, 144, 146,
-143, 143, 148, 144, 144, 151, 146, 146, 152, 147,
-147, 152, 147, 147, 152, 147, 147, 154, 147, 147,
-155, 148, 148, 157, 149, 149, 160, 149, 149, 159,
-150, 150, 157, 149, 149, 156, 149, 149, 156, 149,
-149, 157, 149, 149, 159, 150, 150, 159, 150, 150,
-158, 150, 150, 155, 149, 149, 149, 145, 145, 143,
-141, 141, 138, 137, 137, 139, 138, 138, 141, 140,
-140, 146, 143, 143, 147, 144, 144, 149, 145, 145,
-152, 148, 148, 151, 147, 147, 143, 141, 141, 136,
-135, 135, 139, 138, 138, 150, 146, 146, 148, 145,
-145, 155, 149, 149, 158, 150, 150, 148, 145, 145,
-139, 137, 137, 142, 140, 140, 150, 146, 146, 158,
-151, 151, 162, 152, 152, 163, 152, 152, 155, 149,
-149, 143, 141, 141, 140, 139, 139, 141, 140, 140,
-148, 145, 145, 152, 148, 148, 153, 148, 148, 154,
-149, 149, 154, 149, 149, 158, 151, 151, 159, 152,
-152, 154, 149, 149, 146, 143, 143, 142, 140, 140,
-145, 143, 143, 147, 144, 144, 144, 142, 142, 153,
-148, 148, 148, 145, 145, 148, 145, 145, 151, 147,
-147, 154, 149, 149, 157, 151, 151, 157, 150, 150,
-156, 150, 150, 156, 150, 150, 153, 149, 149, 147,
-145, 145, 145, 143, 143, 149, 146, 146, 149, 146,
-146, 149, 146, 146, 143, 142, 142, 139, 138, 138,
-144, 143, 143, 147, 145, 145, 142, 141, 141, 147,
-145, 145, 137, 137, 137, 134, 133, 133, 136, 135,
-135, 138, 137, 137, 144, 143, 143, 158, 152, 152,
-158, 152, 152, 154, 149, 149, 150, 147, 147, 148,
-146, 146, 157, 152, 152, 165, 155, 155, 161, 152,
-152, 151, 148, 148, 151, 148, 148, 151, 147, 147,
-144, 143, 143, 147, 144, 144, 160, 151, 151, 168,
-153, 153, 153, 149, 149, 151, 147, 147, 148, 146,
-146, 156, 150, 150, 152, 148, 148, 137, 137, 137,
-134, 133, 133, 155, 150, 150, 143, 142, 142, 163,
-154, 154, 158, 152, 152, 140, 139, 139, 137, 137,
-137, 151, 148, 148, 147, 145, 145, 129, 129, 129,
-127, 127, 127, 138, 137, 137, 159, 152, 152, 173,
-154, 154, 160, 153, 153, 147, 145, 145, 161, 153,
-153, 166, 155, 155, 164, 155, 155, 65, 62, 62,
-74, 69, 69, 85, 76, 76, 88, 79, 79, 84,
-77, 77, 82, 76, 76, 73, 69, 69, 57, 56,
-56, 67, 64, 64, 76, 71, 71, 66, 63, 63,
-69, 66, 66, 79, 73, 73, 79, 73, 73, 84,
-76, 76, 82, 75, 75, 68, 66, 66, 81, 75,
-75, 88, 80, 80, 76, 71, 71, 96, 84, 84,
-79, 73, 73, 162, 154, 154, 157, 152, 152, 149,
-146, 146, 152, 148, 148, 152, 148, 148, 148, 145,
-145, 142, 141, 141, 148, 145, 145, 160, 152, 152,
-137, 137, 137, 133, 132, 132, 137, 136, 136, 155,
-150, 150, 161, 153, 153, 153, 149, 149, 141, 140,
-140, 127, 127, 127, 137, 136, 136, 160, 153, 153,
-158, 152, 152, 156, 151, 151, 154, 150, 150, 149,
-146, 146, 161, 152, 152, 157, 151, 151, 154, 150,
-150, 144, 143, 143, 146, 144, 144, 157, 151, 151,
-165, 154, 154, 169, 153, 153, 157, 151, 151, 152,
-148, 148, 155, 150, 150, 155, 150, 150, 150, 147,
-147, 146, 144, 144, 147, 144, 144, 159, 152, 152,
-158, 151, 151, 158, 151, 151, 154, 149, 149, 149,
-146, 146, 150, 147, 147, 153, 148, 148, 150, 147,
-147, 159, 152, 152, 158, 151, 151, 152, 148, 148,
-150, 146, 146, 155, 149, 149, 158, 151, 151, 167,
-153, 153, 161, 151, 151, 159, 151, 151, 150, 147,
-147, 149, 146, 146, 159, 151, 151, 148, 146, 146,
-145, 144, 144, 154, 149, 149, 160, 151, 151, 157,
-150, 150, 157, 150, 150, 165, 153, 153, 156, 150,
-150, 148, 145, 145, 139, 138, 138, 156, 149, 149,
-159, 151, 151, 149, 145, 145, 145, 143, 143, 140,
-139, 139, 155, 149, 149, 152, 147, 147, 151, 147,
-147, 153, 148, 148, 154, 149, 149, 152, 148, 148,
-151, 147, 147, 152, 147, 147, 146, 143, 143, 150,
-146, 146, 156, 150, 150, 156, 150, 150, 152, 147,
-147, 150, 146, 146, 151, 147, 147, 151, 147, 147,
-150, 146, 146, 149, 146, 146, 150, 146, 146, 150,
-146, 146, 147, 144, 144, 153, 148, 148, 149, 145,
-145, 149, 145, 145, 150, 146, 146, 151, 147, 147,
-152, 146, 146, 151, 146, 146, 154, 148, 148, 153,
-148, 148, 152, 147, 147, 149, 145, 145, 148, 145,
-145, 148, 144, 144, 148, 145, 145, 147, 143, 143,
-146, 143, 143, 147, 143, 143, 149, 145, 145, 152,
-147, 147, 153, 148, 148, 152, 147, 147, 151, 146,
-146, 149, 145, 145, 151, 147, 147, 152, 146, 146,
-149, 145, 145, 146, 143, 143, 148, 145, 145, 150,
-145, 145, 154, 148, 148, 161, 150, 150, 167, 151,
-151, 158, 149, 149, 151, 146, 146, 148, 145, 145,
-148, 144, 144, 148, 144, 144, 147, 144, 144, 146,
-143, 143, 149, 145, 145, 152, 147, 147, 153, 147,
-147, 152, 147, 147, 146, 143, 143, 133, 132, 132,
-121, 121, 121, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-121, 121, 121, 122, 122, 122, 130, 130, 130, 140,
-138, 138, 146, 143, 143, 149, 145, 145, 150, 146,
-146, 150, 146, 146, 150, 146, 146, 151, 146, 146,
-152, 147, 147, 153, 147, 147, 154, 148, 148, 153,
-147, 147, 150, 146, 146, 148, 144, 144, 155, 149,
-149, 162, 151, 151, 159, 151, 151, 153, 148, 148,
-152, 147, 147, 156, 149, 149, 158, 149, 149, 159,
-150, 150, 161, 150, 150, 162, 151, 151, 163, 152,
-152, 164, 153, 153, 166, 153, 153, 165, 153, 153,
-164, 152, 152, 164, 152, 152, 162, 152, 152, 161,
-151, 151, 151, 147, 147, 143, 141, 141, 137, 136,
-136, 138, 137, 137, 143, 141, 141, 147, 144, 144,
-148, 145, 145, 151, 147, 147, 155, 150, 150, 152,
-148, 148, 139, 138, 138, 129, 129, 129, 136, 135,
-135, 142, 140, 140, 148, 145, 145, 159, 151, 151,
-156, 150, 150, 144, 142, 142, 135, 135, 135, 142,
-140, 140, 148, 145, 145, 153, 148, 148, 161, 152,
-152, 168, 154, 154, 156, 150, 150, 153, 149, 149,
-156, 150, 150, 162, 152, 152, 158, 151, 151, 153,
-148, 148, 153, 148, 148, 156, 150, 150, 153, 148,
-148, 156, 150, 150, 156, 150, 150, 151, 147, 147,
-144, 142, 142, 140, 139, 139, 146, 144, 144, 153,
-149, 149, 159, 152, 152, 159, 152, 152, 157, 151,
-151, 158, 152, 152, 160, 152, 152, 161, 153, 153,
-167, 154, 154, 168, 153, 153, 165, 153, 153, 160,
-152, 152, 153, 149, 149, 148, 146, 146, 145, 144,
-144, 142, 141, 141, 142, 140, 140, 135, 135, 135,
-131, 131, 131, 137, 136, 136, 140, 139, 139, 142,
-141, 141, 149, 146, 146, 155, 150, 150, 155, 151,
-151, 156, 150, 150, 150, 147, 147, 156, 151, 151,
-158, 151, 151, 153, 149, 149, 154, 149, 149, 157,
-151, 151, 159, 153, 153, 165, 155, 155, 163, 154,
-154, 157, 152, 152, 154, 150, 150, 157, 151, 151,
-166, 155, 155, 168, 155, 155, 148, 145, 145, 161,
-153, 153, 159, 152, 152, 153, 149, 149, 150, 147,
-147, 147, 145, 145, 151, 148, 148, 160, 153, 153,
-145, 144, 144, 162, 153, 153, 162, 154, 154, 157,
-152, 152, 154, 150, 150, 145, 144, 144, 128, 128,
-128, 138, 138, 138, 162, 154, 154, 161, 154, 154,
-161, 153, 153, 161, 153, 153, 155, 151, 151, 151,
-148, 148, 168, 156, 156, 158, 152, 152, 164, 155,
-155, 159, 153, 153, 160, 153, 153, 157, 152, 152,
-150, 147, 147, 72, 68, 68, 80, 74, 74, 80,
-74, 74, 69, 66, 66, 69, 66, 66, 62, 60,
-60, 71, 67, 67, 72, 67, 67, 68, 65, 65,
-80, 73, 73, 85, 77, 77, 65, 62, 62, 62,
-59, 59, 70, 66, 66, 68, 65, 65, 79, 73,
-73, 71, 68, 68, 83, 76, 76, 171, 155, 155,
-154, 150, 150, 145, 144, 144, 151, 148, 148, 155,
-151, 151, 158, 153, 153, 170, 156, 156, 163, 154,
-154, 151, 148, 148, 155, 151, 151, 155, 151, 151,
-147, 145, 145, 148, 145, 145, 152, 148, 148, 175,
-155, 155, 173, 157, 157, 163, 155, 155, 157, 152,
-152, 155, 151, 151, 155, 150, 150, 161, 153, 153,
-163, 154, 154, 150, 147, 147, 156, 151, 151, 159,
-152, 152, 155, 151, 151, 152, 148, 148, 149, 146,
-146, 141, 140, 140, 138, 137, 137, 148, 146, 146,
-159, 152, 152, 158, 152, 152, 154, 150, 150, 152,
-148, 148, 152, 149, 149, 152, 149, 149, 153, 150,
-150, 156, 151, 151, 164, 154, 154, 164, 153, 153,
-156, 150, 150, 151, 148, 148, 154, 150, 150, 150,
-148, 148, 144, 142, 142, 153, 149, 149, 161, 153,
-153, 156, 151, 151, 147, 145, 145, 143, 141, 141,
-145, 143, 143, 149, 146, 146, 159, 151, 151, 160,
-151, 151, 159, 152, 152, 157, 151, 151, 158, 150,
-150, 161, 151, 151, 149, 146, 146, 149, 146, 146,
-153, 148, 148, 161, 152, 152, 166, 152, 152, 169,
-153, 153, 172, 155, 155, 162, 152, 152, 145, 143,
-143, 136, 135, 135, 146, 144, 144, 145, 143, 143,
-141, 140, 140, 137, 137, 137, 140, 139, 139, 156,
-150, 150, 159, 152, 152, 154, 149, 149, 154, 149,
-149, 157, 151, 151, 155, 149, 149, 147, 145, 145,
-147, 145, 145, 150, 147, 147, 154, 149, 149, 163,
-153, 153, 160, 152, 152, 159, 150, 150, 160, 151,
-151, 158, 151, 151, 157, 151, 151, 157, 150, 150,
-153, 148, 148, 151, 147, 147, 148, 145, 145, 153,
-148, 148, 155, 148, 148, 155, 149, 149, 160, 151,
-151, 160, 151, 151, 158, 150, 150, 155, 149, 149,
-156, 150, 150, 154, 149, 149, 151, 147, 147, 147,
-144, 144, 146, 143, 143, 147, 144, 144, 148, 145,
-145, 143, 141, 141, 139, 138, 138, 143, 141, 141,
-149, 145, 145, 153, 148, 148, 153, 148, 148, 151,
-147, 147, 150, 147, 147, 150, 147, 147, 154, 148,
-148, 158, 150, 150, 158, 150, 150, 156, 150, 150,
-153, 148, 148, 150, 146, 146, 150, 146, 146, 156,
-149, 149, 162, 151, 151, 157, 149, 149, 151, 146,
-146, 150, 146, 146, 152, 147, 147, 154, 148, 148,
-156, 149, 149, 157, 149, 149, 156, 149, 149, 156,
-148, 148, 154, 148, 148, 151, 146, 146, 142, 140,
-140, 131, 131, 131, 122, 122, 122, 121, 121, 121,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
-122, 122, 130, 129, 129, 141, 139, 139, 150, 146,
-146, 151, 147, 147, 152, 147, 147, 150, 146, 146,
-148, 145, 145, 149, 146, 146, 150, 146, 146, 153,
-147, 147, 155, 149, 149, 156, 149, 149, 154, 148,
-148, 151, 147, 147, 156, 149, 149, 161, 152, 152,
-160, 151, 151, 157, 150, 150, 155, 149, 149, 154,
-148, 148, 153, 147, 147, 154, 148, 148, 155, 149,
-149, 157, 150, 150, 159, 151, 151, 158, 151, 151,
-156, 150, 150, 155, 149, 149, 163, 152, 152, 166,
-153, 153, 166, 153, 153, 164, 153, 153, 156, 150,
-150, 150, 146, 146, 148, 145, 145, 147, 144, 144,
-146, 144, 144, 146, 143, 143, 146, 144, 144, 147,
-145, 145, 150, 147, 147, 153, 148, 148, 149, 146,
-146, 148, 145, 145, 148, 145, 145, 147, 144, 144,
-150, 147, 147, 154, 149, 149, 150, 146, 146, 143,
-142, 142, 142, 140, 140, 142, 141, 141, 143, 142,
-142, 145, 143, 143, 153, 148, 148, 151, 147, 147,
-147, 145, 145, 150, 147, 147, 155, 149, 149, 157,
-151, 151, 155, 149, 149, 151, 147, 147, 161, 153,
-153, 158, 151, 151, 149, 146, 146, 147, 144, 144,
-148, 145, 145, 143, 141, 141, 135, 135, 135, 135,
-135, 135, 144, 143, 143, 153, 149, 149, 161, 153,
-153, 159, 152, 152, 157, 151, 151, 157, 151, 151,
-154, 149, 149, 162, 153, 153, 161, 153, 153, 155,
-150, 150, 156, 151, 151, 151, 148, 148, 150, 147,
-147, 152, 148, 148, 152, 149, 149, 151, 147, 147,
-153, 149, 149, 155, 150, 150, 151, 148, 148, 151,
-148, 148, 148, 146, 146, 148, 145, 145, 153, 150,
-150, 154, 150, 150, 159, 153, 153, 154, 150, 150,
-165, 155, 155, 162, 153, 153, 155, 150, 150, 156,
-151, 151, 165, 155, 155, 169, 156, 156, 159, 153,
-153, 151, 148, 148, 148, 146, 146, 146, 144, 144,
-150, 147, 147, 159, 152, 152, 159, 153, 153, 157,
-152, 152, 167, 156, 156, 163, 154, 154, 151, 148,
-148, 145, 144, 144, 147, 145, 145, 158, 152, 152,
-156, 152, 152, 153, 150, 150, 166, 156, 156, 170,
-156, 156, 154, 150, 150, 156, 151, 151, 147, 145,
-145, 139, 138, 138, 157, 152, 152, 177, 158, 158,
-176, 157, 157, 173, 157, 157, 166, 156, 156, 141,
-141, 141, 158, 153, 153, 159, 153, 153, 153, 150,
-150, 146, 144, 144, 147, 146, 146, 163, 156, 156,
-158, 153, 153, 158, 154, 154, 159, 154, 154, 158,
-153, 153, 166, 156, 156, 68, 65, 65, 66, 63,
-63, 66, 62, 62, 62, 59, 59, 60, 58, 58,
-74, 69, 69, 80, 74, 74, 64, 61, 61, 54,
-52, 52, 67, 64, 64, 158, 153, 153, 149, 147,
-147, 136, 136, 136, 153, 150, 150, 165, 157, 157,
-154, 150, 150, 152, 149, 149, 149, 147, 147, 147,
-146, 146, 150, 147, 147, 160, 153, 153, 166, 156,
-156, 166, 156, 156, 162, 155, 155, 163, 156, 156,
-159, 154, 154, 156, 152, 152, 162, 155, 155, 172,
-157, 157, 165, 156, 156, 165, 156, 156, 165, 156,
-156, 168, 156, 156, 159, 152, 152, 163, 155, 155,
-158, 152, 152, 146, 144, 144, 156, 151, 151, 151,
-148, 148, 148, 146, 146, 151, 148, 148, 159, 153,
-153, 156, 151, 151, 148, 146, 146, 144, 142, 142,
-142, 141, 141, 139, 139, 139, 142, 142, 142, 157,
-153, 153, 163, 155, 155, 163, 154, 154, 163, 154,
-154, 167, 155, 155, 170, 156, 156, 164, 154, 154,
-151, 148, 148, 161, 154, 154, 159, 153, 153, 161,
-153, 153, 162, 154, 154, 163, 155, 155, 157, 151,
-151, 145, 143, 143, 142, 141, 141, 146, 144, 144,
-152, 148, 148, 156, 151, 151, 156, 150, 150, 150,
-147, 147, 151, 148, 148, 161, 153, 153, 162, 153,
-153, 152, 149, 149, 153, 149, 149, 151, 148, 148,
-149, 146, 146, 150, 147, 147, 158, 152, 152, 164,
-155, 155, 159, 152, 152, 149, 146, 146, 146, 144,
-144, 156, 150, 150, 154, 149, 149, 153, 149, 149,
-148, 145, 145, 146, 144, 144, 149, 146, 146, 157,
-151, 151, 151, 148, 148, 151, 147, 147, 155, 150,
-150, 151, 147, 147, 147, 145, 145, 145, 143, 143,
-149, 146, 146, 151, 147, 147, 155, 150, 150, 148,
-145, 145, 151, 147, 147, 151, 147, 147, 151, 147,
-147, 154, 149, 149, 155, 150, 150, 150, 147, 147,
-149, 146, 146, 151, 147, 147, 155, 149, 149, 154,
-149, 149, 156, 150, 150, 158, 152, 152, 156, 150,
-150, 153, 148, 148, 152, 147, 147, 150, 147, 147,
-146, 144, 144, 143, 141, 141, 141, 140, 140, 147,
-144, 144, 151, 147, 147, 148, 145, 145, 143, 141,
-141, 145, 143, 143, 145, 143, 143, 149, 145, 145,
-154, 149, 149, 154, 149, 149, 150, 146, 146, 146,
-144, 144, 149, 145, 145, 150, 146, 146, 153, 148,
-148, 155, 149, 149, 154, 149, 149, 149, 146, 146,
-148, 145, 145, 154, 148, 148, 160, 151, 151, 156,
-149, 149, 150, 146, 146, 149, 145, 145, 152, 147,
-147, 153, 148, 148, 154, 148, 148, 154, 148, 148,
-151, 146, 146, 149, 145, 145, 147, 144, 144, 144,
-142, 142, 137, 136, 136, 128, 128, 128, 122, 122,
-122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 122, 122, 122, 129, 129,
-129, 140, 139, 139, 151, 146, 146, 152, 147, 147,
-152, 148, 148, 149, 145, 145, 145, 143, 143, 146,
-143, 143, 148, 145, 145, 151, 146, 146, 155, 148,
-148, 157, 149, 149, 156, 150, 150, 155, 149, 149,
-156, 150, 150, 157, 150, 150, 159, 151, 151, 160,
-151, 151, 156, 149, 149, 151, 146, 146, 147, 144,
-144, 148, 144, 144, 148, 145, 145, 150, 146, 146,
-152, 147, 147, 148, 145, 145, 144, 142, 142, 151,
-146, 146, 162, 152, 152, 167, 153, 153, 166, 153,
-153, 164, 153, 153, 160, 152, 152, 157, 151, 151,
-154, 149, 149, 149, 146, 146, 147, 144, 144, 147,
-144, 144, 147, 144, 144, 144, 142, 142, 147, 144,
-144, 158, 151, 151, 166, 155, 155, 160, 152, 152,
-153, 148, 148, 151, 147, 147, 150, 146, 146, 149,
-146, 146, 146, 144, 144, 144, 142, 142, 141, 140,
-140, 141, 140, 140, 142, 141, 141, 144, 142, 142,
-140, 139, 139, 136, 135, 135, 134, 134, 134, 139,
-138, 138, 148, 145, 145, 153, 148, 148, 153, 148,
-148, 161, 152, 152, 170, 154, 154, 154, 149, 149,
-136, 136, 136, 134, 133, 133, 134, 133, 133, 133,
-133, 133, 129, 129, 129, 129, 129, 129, 135, 135,
-135, 148, 145, 145, 155, 150, 150, 156, 150, 150,
-154, 149, 149, 146, 144, 144, 149, 146, 146, 153,
-148, 148, 141, 140, 140, 148, 146, 146, 147, 145,
-145, 149, 146, 146, 156, 151, 151, 161, 153, 153,
-170, 155, 155, 170, 155, 155, 169, 156, 156, 157,
-151, 151, 159, 152, 152, 150, 147, 147, 145, 143,
-143, 143, 142, 142, 144, 143, 143, 145, 144, 144,
-149, 147, 147, 165, 154, 154, 174, 154, 154, 161,
-154, 154, 153, 149, 149, 165, 154, 154, 166, 155,
-155, 155, 151, 151, 150, 147, 147, 148, 145, 145,
-152, 148, 148, 146, 144, 144, 148, 145, 145, 152,
-148, 148, 166, 155, 155, 173, 156, 156, 165, 154,
-154, 155, 150, 150, 151, 148, 148, 153, 149, 149,
-160, 152, 152, 153, 149, 149, 154, 150, 150, 164,
-154, 154, 161, 153, 153, 159, 153, 153, 162, 154,
-154, 156, 151, 151, 143, 142, 142, 156, 151, 151,
-159, 152, 152, 152, 149, 149, 150, 147, 147, 156,
-151, 151, 159, 152, 152, 153, 149, 149, 142, 141,
-141, 134, 134, 134, 138, 138, 138, 158, 153, 153,
-154, 150, 150, 154, 150, 150, 154, 150, 150, 149,
-147, 147, 148, 146, 146, 153, 149, 149, 151, 148,
-148, 142, 141, 141, 142, 141, 141, 143, 142, 142,
-156, 150, 150, 154, 150, 150, 151, 148, 148, 147,
-145, 145, 146, 144, 144, 142, 141, 141, 135, 134,
-134, 136, 136, 136, 159, 153, 153, 159, 153, 153,
-158, 153, 153, 159, 153, 153, 153, 149, 149, 146,
-144, 144, 145, 143, 143, 147, 145, 145, 148, 146,
-146, 154, 150, 150, 160, 153, 153, 149, 147, 147,
-140, 139, 139, 136, 136, 136, 146, 144, 144, 150,
-147, 147, 148, 145, 145, 146, 144, 144, 148, 146,
-146, 154, 150, 150, 159, 152, 152, 165, 154, 154,
-158, 152, 152, 150, 147, 147, 145, 143, 143, 148,
-145, 145, 147, 145, 145, 146, 144, 144, 156, 151,
-151, 157, 152, 152, 151, 148, 148, 146, 144, 144,
-138, 137, 137, 135, 134, 134, 147, 145, 145, 161,
-153, 153, 165, 154, 154, 162, 152, 152, 156, 151,
-151, 155, 151, 151, 156, 151, 151, 154, 150, 150,
-155, 150, 150, 161, 153, 153, 168, 155, 155, 166,
-155, 155, 160, 154, 154, 160, 153, 153, 153, 149,
-149, 150, 147, 147, 150, 147, 147, 158, 152, 152,
-159, 153, 153, 154, 150, 150, 141, 140, 140, 135,
-134, 134, 147, 145, 145, 156, 151, 151, 157, 151,
-151, 155, 150, 150, 148, 146, 146, 135, 134, 134,
-131, 131, 131, 148, 145, 145, 163, 154, 154, 163,
-154, 154, 162, 153, 153, 160, 152, 152, 167, 154,
-154, 158, 151, 151, 154, 149, 149, 152, 148, 148,
-147, 144, 144, 147, 144, 144, 150, 147, 147, 151,
-147, 147, 149, 146, 146, 151, 147, 147, 151, 147,
-147, 143, 142, 142, 140, 139, 139, 141, 140, 140,
-147, 144, 144, 148, 145, 145, 145, 143, 143, 145,
-143, 143, 146, 144, 144, 148, 145, 145, 153, 148,
-148, 154, 148, 148, 152, 147, 147, 150, 146, 146,
-148, 145, 145, 146, 144, 144, 148, 145, 145, 152,
-148, 148, 155, 150, 150, 153, 148, 148, 150, 146,
-146, 146, 144, 144, 142, 141, 141, 139, 138, 138,
-136, 135, 135, 143, 142, 142, 150, 147, 147, 150,
-147, 147, 147, 144, 144, 145, 143, 143, 144, 142,
-142, 144, 142, 142, 150, 146, 146, 155, 150, 150,
-150, 146, 146, 145, 143, 143, 143, 141, 141, 143,
-141, 141, 145, 143, 143, 151, 147, 147, 152, 148,
-148, 148, 144, 144, 144, 142, 142, 150, 146, 146,
-156, 149, 149, 153, 147, 147, 148, 144, 144, 148,
-144, 144, 150, 146, 146, 150, 146, 146, 149, 145,
-145, 147, 144, 144, 143, 141, 141, 139, 138, 138,
-138, 137, 137, 136, 135, 135, 131, 131, 131, 125,
-125, 125, 122, 122, 122, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 122, 122, 122, 126, 126, 126, 137, 136, 136,
-149, 145, 145, 152, 147, 147, 155, 148, 148, 153,
-148, 148, 151, 147, 147, 152, 147, 147, 152, 147,
-147, 153, 147, 147, 152, 147, 147, 152, 147, 147,
-153, 148, 148, 154, 148, 148, 153, 148, 148, 153,
-148, 148, 155, 149, 149, 157, 150, 150, 155, 148,
-148, 150, 146, 146, 146, 143, 143, 142, 141, 141,
-141, 140, 140, 147, 144, 144, 151, 147, 147, 148,
-145, 145, 145, 143, 143, 148, 145, 145, 153, 148,
-148, 159, 151, 151, 165, 153, 153, 164, 153, 153,
-158, 151, 151, 156, 150, 150, 154, 149, 149, 151,
-147, 147, 146, 144, 144, 143, 141, 141, 145, 143,
-143, 145, 143, 143, 147, 145, 145, 156, 150, 150,
-157, 151, 151, 149, 146, 146, 150, 147, 147, 147,
-144, 144, 145, 143, 143, 146, 143, 143, 145, 143,
-143, 145, 143, 143, 148, 145, 145, 149, 146, 146,
-150, 147, 147, 150, 146, 146, 150, 146, 146, 146,
-143, 143, 146, 144, 144, 149, 145, 145, 150, 147,
-147, 151, 147, 147, 154, 149, 149, 158, 151, 151,
-156, 150, 150, 146, 144, 144, 143, 141, 141, 144,
-142, 142, 144, 143, 143, 143, 142, 142, 144, 142,
-142, 143, 141, 141, 147, 145, 145, 156, 150, 150,
-159, 152, 152, 157, 151, 151, 145, 144, 144, 147,
-145, 145, 156, 149, 149, 143, 142, 142, 148, 145,
-145, 148, 145, 145, 152, 148, 148, 150, 147, 147,
-149, 146, 146, 157, 151, 151, 155, 150, 150, 153,
-149, 149, 147, 145, 145, 156, 151, 151, 157, 151,
-151, 152, 148, 148, 150, 147, 147, 148, 145, 145,
-145, 144, 144, 148, 145, 145, 155, 150, 150, 161,
-153, 153, 155, 150, 150, 138, 137, 137, 153, 149,
-149, 163, 154, 154, 161, 153, 153, 153, 149, 149,
-152, 148, 148, 153, 149, 149, 153, 148, 148, 149,
-146, 146, 142, 141, 141, 153, 149, 149, 159, 152,
-152, 167, 155, 155, 161, 153, 153, 154, 150, 150,
-158, 152, 152, 158, 152, 152, 157, 151, 151, 153,
-150, 150, 144, 143, 143, 137, 136, 136, 140, 139,
-139, 156, 150, 150, 152, 148, 148, 140, 139, 139,
-139, 138, 138, 142, 141, 141, 145, 144, 144, 156,
-151, 151, 167, 156, 156, 164, 154, 154, 144, 143,
-143, 137, 136, 136, 135, 135, 135, 157, 152, 152,
-158, 153, 153, 158, 153, 153, 158, 152, 152, 156,
-151, 151, 151, 148, 148, 154, 150, 150, 161, 153,
-153, 157, 151, 151, 156, 151, 151, 140, 139, 139,
-159, 153, 153, 147, 145, 145, 152, 149, 149, 153,
-149, 149, 151, 148, 148, 144, 143, 143, 137, 136,
-136, 140, 139, 139, 154, 150, 150, 150, 147, 147,
-128, 128, 128, 139, 139, 139, 155, 150, 150, 153,
-149, 149, 160, 153, 153, 154, 150, 150, 148, 145,
-145, 153, 149, 149, 159, 152, 152, 149, 146, 146,
-138, 138, 138, 137, 137, 137, 151, 148, 148, 155,
-150, 150, 157, 152, 152, 150, 148, 148, 144, 143,
-143, 150, 148, 148, 156, 151, 151, 155, 150, 150,
-158, 152, 152, 154, 150, 150, 147, 145, 145, 148,
-146, 146, 137, 137, 137, 141, 140, 140, 146, 144,
-144, 148, 146, 146, 150, 147, 147, 149, 146, 146,
-145, 143, 143, 141, 140, 140, 140, 139, 139, 145,
-144, 144, 157, 151, 151, 155, 150, 150, 143, 142,
-142, 139, 139, 139, 147, 145, 145, 146, 144, 144,
-143, 142, 142, 147, 145, 145, 149, 147, 147, 155,
-151, 151, 158, 153, 153, 150, 147, 147, 154, 150,
-150, 149, 146, 146, 150, 147, 147, 150, 147, 147,
-149, 146, 146, 144, 142, 142, 139, 138, 138, 145,
-143, 143, 155, 150, 150, 160, 152, 152, 159, 152,
-152, 153, 149, 149, 147, 145, 145, 141, 140, 140,
-153, 148, 148, 160, 152, 152, 158, 151, 151, 158,
-151, 151, 154, 149, 149, 158, 152, 152, 158, 152,
-152, 149, 146, 146, 145, 144, 144, 157, 151, 151,
-154, 149, 149, 151, 147, 147, 148, 145, 145, 146,
-144, 144, 147, 144, 144, 147, 144, 144, 143, 142,
-142, 147, 144, 144, 149, 145, 145, 156, 150, 150,
-152, 147, 147, 148, 145, 145, 149, 146, 146, 150,
-147, 147, 151, 147, 147, 152, 148, 148, 151, 147,
-147, 149, 146, 146, 148, 145, 145, 154, 149, 149,
-152, 148, 148, 151, 148, 148, 153, 149, 149, 153,
-148, 148, 150, 146, 146, 148, 145, 145, 147, 145,
-145, 146, 143, 143, 143, 141, 141, 144, 142, 142,
-148, 145, 145, 151, 147, 147, 151, 147, 147, 150,
-146, 146, 150, 146, 146, 151, 146, 146, 155, 149,
-149, 161, 152, 152, 154, 148, 148, 144, 142, 142,
-141, 140, 140, 143, 141, 141, 146, 144, 144, 153,
-148, 148, 158, 150, 150, 153, 147, 147, 147, 144,
-144, 151, 147, 147, 155, 149, 149, 150, 146, 146,
-143, 141, 141, 143, 141, 141, 149, 146, 146, 151,
-146, 146, 150, 146, 146, 149, 145, 145, 145, 142,
-142, 141, 140, 140, 142, 140, 140, 142, 140, 140,
-134, 133, 133, 125, 125, 125, 122, 122, 122, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 122, 122, 122,
-125, 125, 125, 134, 134, 134, 145, 142, 142, 151,
-146, 146, 155, 148, 148, 157, 149, 149, 159, 151,
-151, 158, 151, 151, 158, 150, 150, 154, 148, 148,
-147, 144, 144, 145, 143, 143, 149, 146, 146, 152,
-147, 147, 150, 146, 146, 149, 145, 145, 151, 147,
-147, 153, 148, 148, 153, 148, 148, 151, 147, 147,
-145, 143, 143, 136, 136, 136, 138, 137, 137, 146,
-143, 143, 150, 147, 147, 151, 147, 147, 149, 146,
-146, 145, 143, 143, 141, 140, 140, 154, 149, 149,
-166, 153, 153, 164, 153, 153, 161, 152, 152, 160,
-152, 152, 158, 151, 151, 152, 148, 148, 141, 140,
-140, 138, 137, 137, 145, 143, 143, 147, 145, 145,
-147, 144, 144, 148, 145, 145, 149, 146, 146, 151,
-147, 147, 145, 143, 143, 137, 136, 136, 136, 136,
-136, 143, 141, 141, 146, 144, 144, 149, 146, 146,
-152, 148, 148, 153, 149, 149, 154, 150, 150, 157,
-151, 151, 158, 151, 151, 157, 150, 150, 152, 148,
-148, 149, 146, 146, 152, 147, 147, 155, 150, 150,
-155, 150, 150, 155, 150, 150, 154, 150, 150, 149,
-146, 146, 150, 147, 147, 151, 148, 148, 157, 150,
-150, 163, 153, 153, 159, 152, 152, 153, 149, 149,
-157, 152, 152, 163, 154, 154, 160, 153, 153, 152,
-149, 149, 149, 146, 146, 147, 145, 145, 144, 142,
-142, 148, 145, 145, 145, 143, 143, 155, 150, 150,
-160, 153, 153, 150, 147, 147, 143, 142, 142, 147,
-145, 145, 153, 149, 149, 156, 151, 151, 167, 156,
-156, 161, 153, 153, 151, 148, 148, 149, 147, 147,
-150, 147, 147, 155, 150, 150, 157, 151, 151, 157,
-151, 151, 157, 151, 151, 154, 150, 150, 151, 148,
-148, 158, 152, 152, 169, 156, 156, 162, 154, 154,
-156, 151, 151, 139, 138, 138, 132, 131, 131, 136,
-136, 136, 138, 138, 138, 148, 146, 146, 156, 151,
-151, 160, 152, 152, 164, 155, 155, 159, 153, 153,
-146, 144, 144, 145, 144, 144, 149, 147, 147, 154,
-150, 150, 151, 148, 148, 153, 150, 150, 150, 148,
-148, 150, 148, 148, 155, 151, 151, 149, 146, 146,
-135, 135, 135, 132, 132, 132, 143, 142, 142, 155,
-151, 151, 163, 155, 155, 168, 158, 158, 157, 152,
-152, 155, 151, 151, 153, 150, 150, 153, 150, 150,
-158, 153, 153, 155, 151, 151, 153, 150, 150, 154,
-150, 150, 157, 152, 152, 158, 153, 153, 153, 149,
-149, 152, 149, 149, 155, 151, 151, 159, 153, 153,
-153, 150, 150, 151, 148, 148, 149, 147, 147, 161,
-154, 154, 156, 151, 151, 152, 149, 149, 153, 150,
-150, 148, 146, 146, 146, 144, 144, 151, 148, 148,
-146, 144, 144, 143, 142, 142, 144, 143, 143, 148,
-146, 146, 156, 151, 151, 153, 149, 149, 168, 155,
-155, 167, 155, 155, 174, 155, 155, 171, 156, 156,
-156, 152, 152, 153, 149, 149, 156, 150, 150, 160,
-152, 152, 165, 156, 156, 153, 150, 150, 159, 153,
-153, 152, 149, 149, 160, 153, 153, 156, 151, 151,
-165, 154, 154, 162, 154, 154, 149, 146, 146, 143,
-142, 142, 149, 146, 146, 156, 151, 151, 162, 153,
-153, 162, 154, 154, 158, 152, 152, 161, 153, 153,
-161, 153, 153, 155, 151, 151, 152, 149, 149, 152,
-149, 149, 152, 148, 148, 144, 143, 143, 136, 135,
-135, 139, 139, 139, 147, 145, 145, 149, 147, 147,
-149, 147, 147, 150, 148, 148, 152, 149, 149, 159,
-153, 153, 156, 151, 151, 159, 152, 152, 159, 152,
-152, 160, 153, 153, 155, 150, 150, 150, 147, 147,
-149, 146, 146, 149, 147, 147, 152, 148, 148, 153,
-149, 149, 157, 151, 151, 157, 151, 151, 159, 152,
-152, 165, 153, 153, 159, 151, 151, 154, 150, 150,
-146, 144, 144, 145, 143, 143, 148, 145, 145, 156,
-151, 151, 166, 155, 155, 166, 154, 154, 155, 150,
-150, 151, 147, 147, 171, 155, 155, 170, 155, 155,
-152, 148, 148, 141, 140, 140, 136, 136, 136, 133,
-133, 133, 139, 138, 138, 146, 144, 144, 154, 148,
-148, 159, 151, 151, 158, 151, 151, 153, 148, 148,
-151, 148, 148, 151, 147, 147, 151, 147, 147, 148,
-145, 145, 146, 143, 143, 144, 142, 142, 141, 140,
-140, 154, 149, 149, 168, 155, 155, 161, 152, 152,
-155, 150, 150, 150, 147, 147, 145, 143, 143, 146,
-143, 143, 149, 146, 146, 150, 146, 146, 150, 146,
-146, 148, 145, 145, 149, 146, 146, 149, 146, 146,
-152, 148, 148, 155, 149, 149, 157, 150, 150, 158,
-151, 151, 163, 153, 153, 167, 153, 153, 160, 151,
-151, 145, 142, 142, 138, 138, 138, 142, 140, 140,
-147, 144, 144, 155, 149, 149, 163, 151, 151, 158,
-150, 150, 153, 148, 148, 154, 148, 148, 154, 149,
-149, 147, 144, 144, 137, 136, 136, 139, 138, 138,
-149, 145, 145, 154, 148, 148, 154, 148, 148, 152,
-147, 147, 149, 145, 145, 147, 143, 143, 148, 145,
-145, 148, 145, 145, 136, 135, 135, 125, 125, 125,
-122, 122, 122, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 124, 124, 124, 134,
-133, 133, 145, 143, 143, 150, 146, 146, 153, 147,
-147, 152, 147, 147, 151, 147, 147, 153, 148, 148,
-155, 149, 149, 154, 148, 148, 150, 146, 146, 150,
-146, 146, 154, 148, 148, 155, 149, 149, 149, 145,
-145, 144, 142, 142, 144, 142, 142, 144, 142, 142,
-148, 145, 145, 150, 146, 146, 147, 144, 144, 142,
-140, 140, 146, 144, 144, 152, 148, 148, 152, 148,
-148, 148, 145, 145, 145, 143, 143, 143, 141, 141,
-143, 141, 141, 150, 146, 146, 156, 149, 149, 155,
-149, 149, 154, 148, 148, 153, 148, 148, 152, 148,
-148, 146, 144, 144, 139, 138, 138, 144, 142, 142,
-154, 149, 149, 155, 150, 150, 150, 147, 147, 150,
-147, 147, 152, 148, 148, 150, 147, 147, 148, 145,
-145, 143, 142, 142, 145, 143, 143, 148, 145, 145,
-152, 148, 148, 157, 151, 151, 156, 150, 150, 153,
-149, 149, 154, 149, 149, 152, 148, 148, 147, 145,
-145, 149, 146, 146, 149, 146, 146, 153, 149, 149,
-157, 151, 151, 156, 150, 150, 155, 150, 150, 154,
-150, 150, 150, 147, 147, 149, 146, 146, 150, 147,
-147, 154, 149, 149, 156, 150, 150, 153, 149, 149,
-151, 147, 147, 155, 150, 150, 162, 153, 153, 158,
-152, 152, 156, 151, 151, 156, 151, 151, 145, 143,
-143, 142, 141, 141, 147, 145, 145, 141, 140, 140,
-152, 148, 148, 160, 153, 153, 156, 151, 151, 150,
-148, 148, 151, 148, 148, 149, 147, 147, 151, 148,
-148, 161, 153, 153, 160, 153, 153, 157, 151, 151,
-156, 151, 151, 157, 152, 152, 157, 152, 152, 158,
-152, 152, 158, 153, 153, 156, 152, 152, 161, 153,
-153, 161, 153, 153, 159, 153, 153, 152, 149, 149,
-150, 147, 147, 147, 145, 145, 137, 136, 136, 132,
-131, 131, 134, 133, 133, 144, 142, 142, 154, 150,
-150, 154, 150, 150, 141, 140, 140, 160, 154, 154,
-161, 153, 153, 159, 153, 153, 167, 155, 155, 162,
-154, 154, 151, 148, 148, 148, 146, 146, 153, 150,
-150, 158, 152, 152, 160, 154, 154, 155, 151, 151,
-138, 137, 137, 131, 130, 130, 138, 138, 138, 150,
-147, 147, 146, 144, 144, 155, 151, 151, 159, 153,
-153, 159, 152, 152, 163, 154, 154, 169, 156, 156,
-169, 156, 156, 165, 154, 154, 164, 155, 155, 163,
-155, 155, 166, 156, 156, 180, 155, 155, 171, 157,
-157, 156, 152, 152, 161, 153, 153, 170, 156, 156,
-168, 156, 156, 165, 155, 155, 153, 149, 149, 165,
-156, 156, 148, 146, 146, 158, 152, 152, 165, 156,
-156, 159, 153, 153, 160, 154, 154, 163, 154, 154,
-151, 148, 148, 135, 135, 135, 142, 142, 142, 162,
-155, 155, 160, 154, 154, 147, 145, 145, 166, 156,
-156, 142, 141, 141, 156, 151, 151, 159, 152, 152,
-159, 152, 152, 152, 148, 148, 148, 146, 146, 149,
-146, 146, 148, 146, 146, 155, 150, 150, 162, 154,
-154, 162, 153, 153, 170, 154, 154, 152, 149, 149,
-164, 154, 154, 160, 153, 153, 152, 149, 149, 160,
-153, 153, 145, 143, 143, 139, 138, 138, 150, 147,
-147, 159, 153, 153, 161, 154, 154, 166, 155, 155,
-165, 155, 155, 161, 153, 153, 156, 151, 151, 155,
-150, 150, 163, 153, 153, 143, 142, 142, 138, 138,
-138, 140, 140, 140, 148, 146, 146, 154, 150, 150,
-154, 150, 150, 152, 149, 149, 157, 152, 152, 157,
-152, 152, 155, 150, 150, 157, 151, 151, 157, 151,
-151, 150, 147, 147, 145, 144, 144, 150, 147, 147,
-148, 146, 146, 152, 148, 148, 152, 148, 148, 155,
-150, 150, 156, 151, 151, 152, 149, 149, 162, 152,
-152, 164, 153, 153, 158, 152, 152, 155, 150, 150,
-157, 151, 151, 159, 152, 152, 163, 153, 153, 166,
-155, 155, 163, 154, 154, 156, 150, 150, 153, 149,
-149, 167, 154, 154, 166, 154, 154, 153, 148, 148,
-146, 144, 144, 142, 141, 141, 141, 140, 140, 141,
-140, 140, 144, 143, 143, 156, 150, 150, 162, 152,
-152, 158, 151, 151, 154, 149, 149, 152, 148, 148,
-149, 147, 147, 150, 147, 147, 150, 147, 147, 147,
-144, 144, 146, 144, 144, 145, 143, 143, 159, 152,
-152, 156, 151, 151, 148, 146, 146, 143, 142, 142,
-137, 137, 137, 136, 136, 136, 147, 144, 144, 154,
-149, 149, 156, 150, 150, 157, 150, 150, 155, 149,
-149, 153, 148, 148, 153, 148, 148, 154, 148, 148,
-154, 148, 148, 153, 148, 148, 154, 148, 148, 157,
-150, 150, 156, 149, 149, 148, 145, 145, 143, 141,
-141, 147, 144, 144, 152, 147, 147, 154, 148, 148,
-156, 149, 149, 154, 148, 148, 153, 148, 148, 153,
-148, 148, 153, 148, 148, 150, 146, 146, 145, 143,
-143, 147, 144, 144, 153, 147, 147, 155, 149, 149,
-153, 147, 147, 151, 146, 146, 151, 146, 146, 151,
-146, 146, 149, 146, 146, 145, 143, 143, 133, 133,
-133, 123, 123, 123, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 124, 124, 124, 134, 134, 134, 145, 143,
-143, 149, 145, 145, 148, 145, 145, 146, 143, 143,
-142, 141, 141, 144, 142, 142, 150, 146, 146, 153,
-147, 147, 155, 148, 148, 156, 149, 149, 159, 150,
-150, 157, 149, 149, 148, 144, 144, 140, 139, 139,
-137, 136, 136, 137, 136, 136, 143, 141, 141, 151,
-147, 147, 152, 147, 147, 153, 148, 148, 154, 149,
-149, 156, 150, 150, 151, 147, 147, 145, 143, 143,
-143, 141, 141, 143, 141, 141, 143, 141, 141, 144,
-142, 142, 144, 142, 142, 144, 142, 142, 144, 142,
-142, 144, 142, 142, 143, 141, 141, 143, 141, 141,
-146, 144, 144, 158, 151, 151, 168, 153, 153, 159,
-151, 151, 151, 147, 147, 151, 147, 147, 150, 147,
-147, 151, 147, 147, 152, 148, 148, 152, 148, 148,
-154, 149, 149, 156, 150, 150, 158, 151, 151, 156,
-150, 150, 148, 145, 145, 149, 146, 146, 144, 143,
-143, 144, 142, 142, 145, 143, 143, 148, 145, 145,
-150, 147, 147, 152, 148, 148, 151, 147, 147, 148,
-145, 145, 147, 145, 145, 149, 146, 146, 147, 145,
-145, 145, 144, 144, 152, 148, 148, 156, 150, 150,
-149, 146, 146, 148, 145, 145, 149, 146, 146, 149,
-146, 146, 144, 142, 142, 140, 139, 139, 143, 142,
-142, 147, 145, 145, 152, 148, 148, 146, 144, 144,
-144, 143, 143, 146, 144, 144, 149, 146, 146, 153,
-149, 149, 152, 149, 149, 152, 148, 148, 153, 149,
-149, 155, 150, 150, 153, 148, 148, 147, 144, 144,
-145, 143, 143, 145, 143, 143, 144, 142, 142, 145,
-143, 143, 149, 146, 146, 143, 142, 142, 133, 133,
-133, 142, 141, 141, 137, 136, 136, 136, 136, 136,
-147, 145, 145, 148, 146, 146, 145, 143, 143, 144,
-143, 143, 145, 143, 143, 150, 147, 147, 162, 153,
-153, 164, 154, 154, 151, 148, 148, 147, 145, 145,
-160, 152, 152, 163, 153, 153, 150, 147, 147, 159,
-151, 151, 147, 145, 145, 145, 143, 143, 144, 142,
-142, 143, 142, 142, 140, 139, 139, 134, 134, 134,
-146, 144, 144, 156, 150, 150, 147, 145, 145, 144,
-142, 142, 138, 138, 138, 139, 138, 138, 138, 138,
-138, 141, 140, 140, 147, 145, 145, 155, 151, 151,
-154, 150, 150, 150, 147, 147, 154, 150, 150, 152,
-149, 149, 154, 150, 150, 164, 154, 154, 156, 151,
-151, 143, 142, 142, 154, 150, 150, 157, 152, 152,
-161, 153, 153, 155, 151, 151, 154, 150, 150, 158,
-152, 152, 140, 139, 139, 151, 148, 148, 151, 148,
-148, 153, 149, 149, 154, 150, 150, 154, 150, 150,
-150, 147, 147, 149, 146, 146, 154, 149, 149, 151,
-148, 148, 149, 146, 146, 144, 143, 143, 144, 143,
-143, 144, 143, 143, 145, 144, 144, 153, 149, 149,
-160, 153, 153, 157, 152, 152, 153, 149, 149, 139,
-139, 139, 130, 130, 130, 137, 136, 136, 145, 144,
-144, 153, 149, 149, 154, 150, 150, 147, 145, 145,
-145, 143, 143, 148, 146, 146, 157, 151, 151, 153,
-149, 149, 134, 133, 133, 129, 129, 129, 131, 131,
-131, 141, 140, 140, 153, 149, 149, 160, 152, 152,
-156, 151, 151, 152, 149, 149, 138, 137, 137, 164,
-154, 154, 158, 152, 152, 154, 150, 150, 156, 150,
-150, 153, 149, 149, 145, 143, 143, 135, 134, 134,
-138, 138, 138, 149, 147, 147, 151, 148, 148, 147,
-145, 145, 145, 143, 143, 146, 144, 144, 146, 144,
-144, 146, 144, 144, 149, 146, 146, 149, 146, 146,
-149, 146, 146, 156, 150, 150, 155, 149, 149, 144,
-142, 142, 146, 144, 144, 152, 148, 148, 163, 153,
-153, 167, 154, 154, 169, 154, 154, 168, 154, 154,
-163, 153, 153, 158, 151, 151, 158, 152, 152, 159,
-152, 152, 157, 151, 151, 153, 149, 149, 153, 149,
-149, 154, 149, 149, 153, 148, 148, 151, 148, 148,
-154, 149, 149, 152, 148, 148, 142, 141, 141, 142,
-141, 141, 155, 149, 149, 156, 150, 150, 154, 148,
-148, 150, 146, 146, 144, 142, 142, 144, 143, 143,
-153, 149, 149, 158, 150, 150, 153, 148, 148, 148,
-145, 145, 148, 145, 145, 149, 146, 146, 140, 139,
-139, 131, 131, 131, 128, 128, 128, 125, 125, 125,
-136, 136, 136, 153, 148, 148, 161, 151, 151, 165,
-152, 152, 164, 152, 152, 159, 151, 151, 156, 149,
-149, 155, 149, 149, 152, 147, 147, 147, 144, 144,
-144, 142, 142, 144, 142, 142, 145, 142, 142, 148,
-145, 145, 151, 147, 147, 155, 149, 149, 160, 151,
-151, 154, 148, 148, 147, 144, 144, 149, 145, 145,
-151, 147, 147, 152, 147, 147, 151, 146, 146, 154,
-148, 148, 157, 149, 149, 158, 150, 150, 158, 150,
-150, 156, 149, 149, 151, 146, 146, 149, 145, 145,
-152, 147, 147, 152, 147, 147, 147, 144, 144, 140,
-139, 139, 132, 131, 131, 124, 124, 124, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 120, 120, 120, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 124, 124,
-124, 132, 132, 132, 143, 141, 141, 147, 144, 144,
-147, 144, 144, 147, 144, 144, 147, 144, 144, 148,
-145, 145, 150, 146, 146, 151, 147, 147, 152, 147,
-147, 153, 148, 148, 155, 149, 149, 155, 148, 148,
-150, 146, 146, 147, 144, 144, 145, 142, 142, 143,
-141, 141, 146, 144, 144, 149, 145, 145, 150, 146,
-146, 151, 147, 147, 153, 148, 148, 155, 150, 150,
-149, 146, 146, 143, 141, 141, 145, 143, 143, 147,
-145, 145, 149, 146, 146, 151, 147, 147, 151, 147,
-147, 151, 147, 147, 150, 146, 146, 149, 146, 146,
-149, 146, 146, 150, 146, 146, 150, 146, 146, 151,
-147, 147, 149, 146, 146, 145, 143, 143, 146, 144,
-144, 146, 144, 144, 149, 146, 146, 148, 146, 146,
-152, 148, 148, 156, 150, 150, 158, 151, 151, 154,
-149, 149, 153, 149, 149, 152, 148, 148, 148, 145,
-145, 145, 143, 143, 143, 142, 142, 149, 146, 146,
-156, 150, 150, 150, 147, 147, 147, 145, 145, 150,
-147, 147, 149, 146, 146, 150, 147, 147, 154, 149,
-149, 152, 148, 148, 147, 145, 145, 146, 144, 144,
-147, 145, 145, 151, 147, 147, 147, 145, 145, 151,
-147, 147, 154, 149, 149, 153, 148, 148, 149, 146,
-146, 147, 145, 145, 149, 147, 147, 161, 153, 153,
-144, 143, 143, 144, 142, 142, 143, 142, 142, 143,
-141, 141, 144, 143, 143, 146, 144, 144, 153, 149,
-149, 158, 151, 151, 158, 151, 151, 152, 148, 148,
-149, 146, 146, 150, 147, 147, 158, 152, 152, 158,
-152, 152, 155, 150, 150, 158, 151, 151, 151, 148,
-148, 142, 141, 141, 144, 143, 143, 147, 145, 145,
-150, 147, 147, 156, 151, 151, 151, 148, 148, 148,
-145, 145, 151, 148, 148, 154, 150, 150, 160, 153,
-153, 152, 149, 149, 141, 140, 140, 142, 141, 141,
-145, 143, 143, 149, 146, 146, 139, 138, 138, 150,
-147, 147, 160, 152, 152, 160, 152, 152, 160, 152,
-152, 161, 152, 152, 157, 151, 151, 143, 141, 141,
-144, 142, 142, 155, 150, 150, 152, 148, 148, 145,
-143, 143, 149, 147, 147, 152, 149, 149, 150, 147,
-147, 150, 147, 147, 152, 148, 148, 151, 148, 148,
-144, 143, 143, 152, 149, 149, 147, 145, 145, 148,
-146, 146, 148, 146, 146, 148, 146, 146, 151, 148,
-148, 149, 147, 147, 147, 145, 145, 155, 150, 150,
-158, 152, 152, 150, 147, 147, 144, 143, 143, 151,
-148, 148, 147, 145, 145, 140, 139, 139, 147, 145,
-145, 153, 149, 149, 153, 149, 149, 164, 152, 152,
-157, 151, 151, 154, 150, 150, 155, 150, 150, 155,
-150, 150, 155, 150, 150, 153, 149, 149, 150, 147,
-147, 146, 144, 144, 147, 145, 145, 146, 144, 144,
-150, 147, 147, 160, 153, 153, 158, 152, 152, 153,
-149, 149, 145, 144, 144, 145, 144, 144, 148, 146,
-146, 157, 152, 152, 146, 144, 144, 143, 142, 142,
-153, 149, 149, 150, 147, 147, 150, 147, 147, 148,
-146, 146, 146, 144, 144, 136, 136, 136, 134, 134,
-134, 146, 144, 144, 156, 150, 150, 155, 150, 150,
-150, 147, 147, 146, 145, 145, 144, 143, 143, 151,
-148, 148, 156, 150, 150, 154, 149, 149, 153, 149,
-149, 150, 147, 147, 145, 143, 143, 142, 141, 141,
-145, 143, 143, 157, 151, 151, 160, 153, 153, 157,
-151, 151, 153, 149, 149, 157, 151, 151, 151, 148,
-148, 145, 143, 143, 155, 150, 150, 154, 149, 149,
-161, 152, 152, 158, 151, 151, 153, 149, 149, 150,
-147, 147, 146, 144, 144, 152, 148, 148, 157, 151,
-151, 157, 151, 151, 155, 150, 150, 154, 149, 149,
-150, 147, 147, 153, 149, 149, 150, 147, 147, 151,
-148, 148, 151, 148, 148, 154, 149, 149, 157, 150,
-150, 157, 150, 150, 151, 148, 148, 150, 147, 147,
-152, 148, 148, 153, 148, 148, 154, 149, 149, 156,
-150, 150, 153, 148, 148, 148, 145, 145, 144, 142,
-142, 136, 136, 136, 140, 139, 139, 148, 145, 145,
-150, 146, 146, 150, 146, 146, 148, 145, 145, 140,
-139, 139, 140, 139, 139, 143, 141, 141, 144, 142,
-142, 140, 139, 139, 140, 139, 139, 143, 142, 142,
-147, 145, 145, 152, 148, 148, 156, 150, 150, 155,
-149, 149, 154, 149, 149, 154, 148, 148, 153, 148,
-148, 150, 146, 146, 147, 144, 144, 146, 143, 143,
-145, 142, 142, 145, 142, 142, 144, 143, 143, 148,
-145, 145, 153, 148, 148, 149, 145, 145, 144, 142,
-142, 144, 142, 142, 146, 143, 143, 150, 146, 146,
-155, 149, 149, 158, 150, 150, 158, 150, 150, 157,
-149, 149, 154, 148, 148, 151, 146, 146, 148, 145,
-145, 147, 144, 144, 150, 146, 146, 151, 147, 147,
-147, 144, 144, 140, 139, 139, 131, 130, 130, 124,
-124, 124, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 120, 120, 120, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 120, 120, 120, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 124, 124, 124, 130, 130, 130,
-141, 139, 139, 146, 143, 143, 146, 143, 143, 147,
-144, 144, 152, 147, 147, 153, 148, 148, 151, 146,
-146, 149, 146, 146, 150, 146, 146, 151, 146, 146,
-151, 147, 147, 153, 148, 148, 154, 149, 149, 154,
-148, 148, 151, 147, 147, 148, 145, 145, 147, 144,
-144, 147, 144, 144, 147, 144, 144, 148, 145, 145,
-151, 147, 147, 151, 148, 148, 146, 144, 144, 143,
-142, 142, 148, 145, 145, 152, 148, 148, 154, 149,
-149, 157, 150, 150, 158, 150, 150, 157, 150, 150,
-155, 149, 149, 152, 148, 148, 153, 148, 148, 154,
-148, 148, 144, 142, 142, 134, 134, 134, 136, 136,
-136, 139, 138, 138, 142, 141, 141, 145, 143, 143,
-148, 145, 145, 151, 148, 148, 158, 151, 151, 164,
-152, 152, 157, 150, 150, 148, 146, 146, 148, 145,
-145, 147, 145, 145, 144, 142, 142, 141, 140, 140,
-149, 146, 146, 161, 152, 152, 156, 150, 150, 143,
-142, 142, 145, 144, 144, 148, 146, 146, 150, 147,
-147, 150, 147, 147, 153, 149, 149, 150, 147, 147,
-152, 148, 148, 144, 143, 143, 147, 145, 145, 146,
-144, 144, 152, 148, 148, 154, 149, 149, 150, 147,
-147, 147, 145, 145, 146, 144, 144, 144, 143, 143,
-154, 149, 149, 145, 144, 144, 148, 146, 146, 140,
-139, 139, 133, 132, 132, 135, 134, 134, 141, 140,
-140, 149, 146, 146, 151, 148, 148, 155, 150, 150,
-155, 151, 151, 144, 142, 142, 145, 143, 143, 153,
-150, 150, 158, 152, 152, 155, 150, 150, 155, 150,
-150, 162, 152, 152, 164, 153, 153, 155, 150, 150,
-159, 153, 153, 166, 154, 154, 164, 154, 154, 157,
-152, 152, 152, 149, 149, 150, 147, 147, 155, 150,
-150, 157, 151, 151, 143, 142, 142, 132, 131, 131,
-133, 133, 133, 137, 137, 137, 142, 141, 141, 150,
-148, 148, 159, 152, 152, 159, 151, 151, 148, 146,
-146, 161, 152, 152, 174, 151, 151, 166, 154, 154,
-153, 149, 149, 149, 147, 147, 148, 146, 146, 142,
-142, 142, 134, 134, 134, 144, 143, 143, 149, 147,
-147, 155, 150, 150, 149, 147, 147, 152, 149, 149,
-154, 150, 150, 151, 148, 148, 156, 151, 151, 160,
-152, 152, 162, 153, 153, 162, 153, 153, 157, 152,
-152, 157, 152, 152, 161, 153, 153, 167, 156, 156,
-148, 146, 146, 160, 152, 152, 167, 155, 155, 152,
-149, 149, 155, 150, 150, 156, 151, 151, 152, 149,
-149, 143, 142, 142, 137, 137, 137, 140, 139, 139,
-148, 146, 146, 150, 147, 147, 161, 153, 153, 159,
-152, 152, 144, 142, 142, 157, 152, 152, 161, 154,
-154, 159, 152, 152, 159, 152, 152, 150, 147, 147,
-149, 147, 147, 152, 148, 148, 152, 149, 149, 147,
-145, 145, 144, 143, 143, 143, 142, 142, 153, 149,
-149, 164, 152, 152, 164, 153, 153, 165, 154, 154,
-164, 153, 153, 163, 152, 152, 163, 153, 153, 163,
-153, 153, 156, 151, 151, 143, 142, 142, 135, 135,
-135, 137, 137, 137, 142, 141, 141, 144, 143, 143,
-142, 141, 141, 137, 137, 137, 141, 140, 140, 154,
-149, 149, 155, 150, 150, 154, 150, 150, 146, 144,
-144, 142, 141, 141, 143, 142, 142, 139, 138, 138,
-150, 147, 147, 169, 154, 154, 173, 153, 153, 164,
-153, 153, 153, 149, 149, 146, 144, 144, 145, 144,
-144, 157, 151, 151, 152, 149, 149, 146, 144, 144,
-150, 147, 147, 161, 151, 151, 159, 151, 151, 159,
-151, 151, 156, 150, 150, 155, 151, 151, 154, 150,
-150, 152, 148, 148, 152, 148, 148, 146, 144, 144,
-149, 146, 146, 150, 147, 147, 151, 147, 147, 157,
-150, 150, 159, 151, 151, 161, 151, 151, 160, 151,
-151, 152, 148, 148, 150, 147, 147, 157, 150, 150,
-162, 152, 152, 158, 151, 151, 154, 150, 150, 148,
-145, 145, 140, 139, 139, 135, 134, 134, 131, 131,
-131, 135, 135, 135, 141, 140, 140, 149, 146, 146,
-154, 148, 148, 141, 140, 140, 129, 129, 129, 143,
-141, 141, 155, 149, 149, 153, 148, 148, 150, 146,
-146, 144, 142, 142, 137, 136, 136, 141, 140, 140,
-146, 144, 144, 149, 146, 146, 152, 148, 148, 152,
-148, 148, 152, 148, 148, 151, 147, 147, 150, 147,
-147, 149, 145, 145, 147, 144, 144, 144, 142, 142,
-141, 140, 140, 142, 141, 141, 145, 143, 143, 144,
-142, 142, 140, 139, 139, 139, 138, 138, 140, 139,
-139, 147, 144, 144, 158, 150, 150, 161, 151, 151,
-159, 150, 150, 155, 149, 149, 150, 146, 146, 147,
-144, 144, 146, 143, 143, 146, 143, 143, 149, 145,
-145, 149, 145, 145, 147, 144, 144, 140, 139, 139,
-130, 130, 130, 124, 124, 124, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 120, 120, 120, 120, 120, 120,
-120, 120, 120, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-123, 123, 123, 129, 129, 129, 140, 138, 138, 146,
-143, 143, 145, 143, 143, 145, 142, 142, 148, 144,
-144, 151, 146, 146, 153, 148, 148, 153, 147, 147,
-151, 146, 146, 150, 146, 146, 151, 147, 147, 152,
-147, 147, 153, 148, 148, 153, 148, 148, 152, 147,
-147, 150, 146, 146, 148, 145, 145, 146, 144, 144,
-145, 143, 143, 144, 142, 142, 143, 142, 142, 142,
-141, 141, 141, 140, 140, 142, 140, 140, 144, 142,
-142, 147, 145, 145, 149, 146, 146, 152, 147, 147,
-154, 149, 149, 155, 149, 149, 153, 148, 148, 152,
-147, 147, 150, 147, 147, 147, 144, 144, 139, 138,
-138, 137, 136, 136, 140, 139, 139, 141, 140, 140,
-141, 140, 140, 142, 140, 140, 144, 142, 142, 148,
-145, 145, 154, 149, 149, 155, 149, 149, 151, 147,
-147, 149, 146, 146, 153, 148, 148, 154, 149, 149,
-155, 149, 149, 156, 150, 150, 154, 149, 149, 155,
-149, 149, 149, 146, 146, 147, 144, 144, 155, 149,
-149, 155, 149, 149, 147, 145, 145, 149, 146, 146,
-147, 144, 144, 147, 145, 145, 148, 146, 146, 153,
-149, 149, 141, 140, 140, 142, 141, 141, 151, 147,
-147, 155, 150, 150, 154, 149, 149, 151, 147, 147,
-138, 137, 137, 142, 141, 141, 145, 144, 144, 148,
-145, 145, 145, 143, 143, 146, 145, 145, 155, 150,
-150, 154, 149, 149, 150, 147, 147, 142, 141, 141,
-144, 143, 143, 157, 151, 151, 157, 151, 151, 156,
-150, 150, 142, 141, 141, 145, 144, 144, 142, 142,
-142, 143, 142, 142, 149, 146, 146, 156, 151, 151,
-139, 138, 138, 144, 143, 143, 149, 147, 147, 144,
-143, 143, 158, 152, 152, 152, 149, 149, 144, 143,
-143, 146, 144, 144, 154, 150, 150, 145, 143, 143,
-143, 142, 142, 148, 145, 145, 154, 149, 149, 154,
-150, 150, 149, 147, 147, 154, 149, 149, 145, 143,
-143, 146, 144, 144, 156, 150, 150, 151, 148, 148,
-152, 149, 149, 147, 146, 146, 148, 146, 146, 158,
-152, 152, 165, 154, 154, 159, 151, 151, 161, 154,
-154, 152, 149, 149, 164, 152, 152, 169, 154, 154,
-149, 147, 147, 144, 143, 143, 147, 145, 145, 148,
-146, 146, 149, 147, 147, 150, 147, 147, 151, 148,
-148, 166, 155, 155, 169, 152, 152, 167, 154, 154,
-167, 154, 154, 165, 154, 154, 150, 147, 147, 136,
-135, 135, 139, 139, 139, 154, 150, 150, 168, 153,
-153, 145, 143, 143, 144, 143, 143, 140, 140, 140,
-146, 145, 145, 149, 147, 147, 154, 151, 151, 159,
-153, 153, 145, 143, 143, 153, 149, 149, 148, 146,
-146, 149, 147, 147, 152, 149, 149, 155, 150, 150,
-160, 152, 152, 145, 144, 144, 146, 144, 144, 154,
-150, 150, 159, 151, 151, 148, 146, 146, 145, 143,
-143, 156, 150, 150, 161, 152, 152, 173, 151, 151,
-170, 151, 151, 153, 149, 149, 154, 150, 150, 153,
-149, 149, 164, 153, 153, 161, 153, 153, 162, 153,
-153, 155, 150, 150, 139, 138, 138, 141, 140, 140,
-145, 143, 143, 146, 144, 144, 156, 151, 151, 156,
-151, 151, 152, 149, 149, 160, 152, 152, 158, 150,
-150, 148, 145, 145, 142, 141, 141, 141, 140, 140,
-152, 148, 148, 158, 151, 151, 155, 150, 150, 145,
-144, 144, 146, 144, 144, 147, 145, 145, 148, 146,
-146, 144, 143, 143, 138, 138, 138, 143, 142, 142,
-147, 145, 145, 148, 146, 146, 159, 151, 151, 157,
-151, 151, 153, 149, 149, 152, 148, 148, 150, 147,
-147, 149, 146, 146, 148, 145, 145, 149, 146, 146,
-148, 145, 145, 147, 144, 144, 148, 145, 145, 149,
-146, 146, 153, 149, 149, 153, 149, 149, 151, 147,
-147, 148, 146, 146, 150, 147, 147, 153, 149, 149,
-155, 150, 150, 153, 149, 149, 150, 147, 147, 146,
-144, 144, 142, 141, 141, 141, 140, 140, 145, 143,
-143, 147, 144, 144, 147, 145, 145, 147, 144, 144,
-144, 142, 142, 143, 141, 141, 143, 141, 141, 145,
-143, 143, 148, 145, 145, 150, 146, 146, 149, 146,
-146, 149, 146, 146, 147, 144, 144, 147, 144, 144,
-148, 145, 145, 149, 146, 146, 151, 147, 147, 149,
-146, 146, 147, 144, 144, 147, 144, 144, 148, 145,
-145, 149, 146, 146, 149, 145, 145, 147, 144, 144,
-143, 141, 141, 142, 140, 140, 143, 141, 141, 140,
-139, 139, 136, 136, 136, 141, 140, 140, 153, 148,
-148, 157, 150, 150, 155, 149, 149, 152, 147, 147,
-148, 145, 145, 146, 144, 144, 146, 143, 143, 146,
-144, 144, 147, 144, 144, 147, 144, 144, 145, 143,
-143, 137, 136, 136, 128, 128, 128, 123, 123, 123,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 120, 120, 120,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 123, 123, 123, 128,
-128, 128, 138, 137, 137, 147, 143, 143, 148, 144,
-144, 147, 144, 144, 148, 145, 145, 150, 146, 146,
-154, 148, 148, 154, 148, 148, 150, 146, 146, 148,
-145, 145, 148, 144, 144, 149, 145, 145, 149, 146,
-146, 150, 146, 146, 152, 148, 148, 151, 147, 147,
-150, 146, 146, 148, 145, 145, 145, 142, 142, 142,
-140, 140, 140, 139, 139, 140, 139, 139, 142, 141,
-141, 144, 142, 142, 146, 144, 144, 148, 145, 145,
-150, 146, 146, 152, 148, 148, 154, 149, 149, 154,
-149, 149, 153, 148, 148, 151, 147, 147, 150, 147,
-147, 146, 144, 144, 143, 142, 142, 144, 142, 142,
-146, 144, 144, 145, 143, 143, 145, 143, 143, 145,
-143, 143, 147, 145, 145, 150, 147, 147, 153, 148,
-148, 152, 148, 148, 152, 147, 147, 154, 149, 149,
-155, 150, 150, 155, 149, 149, 155, 149, 149, 151,
-147, 147, 148, 145, 145, 150, 146, 146, 152, 148,
-148, 155, 149, 149, 156, 150, 150, 151, 147, 147,
-147, 144, 144, 150, 147, 147, 154, 149, 149, 157,
-150, 150, 158, 151, 151, 150, 147, 147, 141, 140,
-140, 144, 143, 143, 148, 146, 146, 153, 149, 149,
-150, 147, 147, 141, 140, 140, 142, 141, 141, 150,
-147, 147, 148, 145, 145, 150, 147, 147, 149, 147,
-147, 150, 147, 147, 147, 145, 145, 154, 149, 149,
-154, 149, 149, 150, 147, 147, 141, 140, 140, 150,
-147, 147, 167, 154, 154, 156, 150, 150, 156, 150,
-150, 155, 150, 150, 155, 150, 150, 149, 146, 146,
-158, 151, 151, 150, 147, 147, 143, 142, 142, 141,
-140, 140, 148, 146, 146, 163, 154, 154, 161, 152,
-152, 155, 150, 150, 150, 147, 147, 145, 144, 144,
-148, 146, 146, 149, 147, 147, 145, 144, 144, 148,
-146, 146, 150, 147, 147, 149, 147, 147, 149, 147,
-147, 154, 150, 150, 156, 151, 151, 150, 147, 147,
-145, 144, 144, 139, 138, 138, 141, 140, 140, 147,
-145, 145, 150, 148, 148, 151, 148, 148, 150, 148,
-148, 151, 148, 148, 147, 145, 145, 152, 149, 149,
-144, 143, 143, 145, 144, 144, 145, 144, 144, 135,
-135, 135, 140, 139, 139, 158, 151, 151, 161, 152,
-152, 151, 148, 148, 163, 154, 154, 157, 151, 151,
-144, 143, 143, 150, 147, 147, 161, 152, 152, 160,
-152, 152, 161, 152, 152, 145, 144, 144, 148, 146,
-146, 172, 152, 152, 159, 151, 151, 157, 150, 150,
-165, 153, 153, 163, 153, 153, 148, 146, 146, 150,
-147, 147, 161, 153, 153, 169, 153, 153, 160, 153,
-153, 165, 156, 156, 152, 149, 149, 142, 141, 141,
-146, 144, 144, 150, 147, 147, 151, 148, 148, 147,
-145, 145, 154, 150, 150, 159, 152, 152, 159, 151,
-151, 160, 152, 152, 166, 155, 155, 163, 153, 153,
-162, 152, 152, 163, 153, 153, 159, 152, 152, 158,
-151, 151, 156, 151, 151, 159, 152, 152, 163, 154,
-154, 164, 154, 154, 156, 151, 151, 159, 152, 152,
-157, 151, 151, 151, 148, 148, 152, 149, 149, 161,
-153, 153, 158, 152, 152, 160, 152, 152, 162, 153,
-153, 161, 152, 152, 156, 150, 150, 157, 150, 150,
-157, 150, 150, 154, 149, 149, 153, 148, 148, 154,
-150, 150, 156, 151, 151, 157, 150, 150, 151, 147,
-147, 142, 141, 141, 141, 140, 140, 144, 143, 143,
-149, 146, 146, 152, 148, 148, 152, 148, 148, 148,
-145, 145, 149, 146, 146, 150, 147, 147, 153, 149,
-149, 154, 149, 149, 156, 150, 150, 153, 148, 148,
-151, 147, 147, 149, 146, 146, 151, 147, 147, 154,
-149, 149, 151, 147, 147, 149, 146, 146, 150, 147,
-147, 150, 147, 147, 152, 149, 149, 156, 151, 151,
-155, 150, 150, 154, 150, 150, 152, 148, 148, 149,
-146, 146, 153, 149, 149, 156, 151, 151, 151, 148,
-148, 147, 145, 145, 149, 146, 146, 151, 147, 147,
-145, 143, 143, 140, 139, 139, 145, 143, 143, 148,
-145, 145, 150, 146, 146, 151, 147, 147, 147, 145,
-145, 145, 143, 143, 147, 144, 144, 148, 145, 145,
-150, 146, 146, 150, 147, 147, 148, 145, 145, 148,
-145, 145, 149, 145, 145, 150, 146, 146, 150, 146,
-146, 148, 145, 145, 142, 140, 140, 140, 139, 139,
-145, 143, 143, 145, 143, 143, 140, 139, 139, 141,
-140, 140, 150, 146, 146, 153, 148, 148, 152, 147,
-147, 150, 146, 146, 148, 145, 145, 148, 145, 145,
-148, 145, 145, 148, 145, 145, 147, 145, 145, 147,
-144, 144, 144, 142, 142, 136, 135, 135, 127, 127,
-127, 123, 123, 123, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 123, 123, 123, 126, 126, 126, 136, 136,
-136, 147, 144, 144, 154, 148, 148, 156, 150, 150,
-154, 149, 149, 151, 147, 147, 150, 146, 146, 149,
-146, 146, 148, 145, 145, 146, 144, 144, 144, 142,
-142, 143, 142, 142, 144, 142, 142, 147, 145, 145,
-152, 148, 148, 155, 149, 149, 156, 150, 150, 152,
-148, 148, 145, 143, 143, 144, 143, 143, 143, 142,
-142, 144, 143, 143, 145, 143, 143, 149, 146, 146,
-154, 149, 149, 158, 151, 151, 161, 152, 152, 158,
-151, 151, 156, 150, 150, 154, 149, 149, 152, 148,
-148, 154, 150, 150, 156, 151, 151, 157, 151, 151,
-157, 151, 151, 154, 149, 149, 154, 149, 149, 158,
-152, 152, 160, 153, 153, 160, 152, 152, 158, 152,
-152, 153, 149, 149, 154, 149, 149, 158, 152, 152,
-155, 150, 150, 149, 147, 147, 145, 144, 144, 142,
-141, 141, 143, 142, 142, 142, 141, 141, 147, 145,
-145, 152, 149, 149, 149, 146, 146, 145, 143, 143,
-147, 145, 145, 148, 146, 146, 150, 147, 147, 153,
-149, 149, 158, 152, 152, 161, 154, 154, 160, 153,
-153, 155, 151, 151, 143, 142, 142, 140, 139, 139,
-156, 151, 151, 162, 154, 154, 162, 153, 153, 161,
-153, 153, 149, 146, 146, 147, 145, 145, 162, 154,
-154, 167, 155, 155, 161, 153, 153, 158, 152, 152,
-155, 150, 150, 150, 147, 147, 144, 143, 143, 139,
-138, 138, 136, 136, 136, 137, 136, 136, 134, 133,
-133, 135, 135, 135, 140, 140, 140, 148, 147, 147,
-150, 148, 148, 148, 146, 146, 144, 143, 143, 141,
-140, 140, 138, 137, 137, 136, 136, 136, 137, 137,
-137, 133, 132, 132, 142, 141, 141, 160, 153, 153,
-164, 155, 155, 166, 156, 156, 157, 152, 152, 158,
-152, 152, 149, 147, 147, 147, 145, 145, 146, 145,
-145, 149, 147, 147, 160, 154, 154, 155, 151, 151,
-155, 151, 151, 160, 154, 154, 157, 152, 152, 159,
-152, 152, 152, 149, 149, 151, 148, 148, 162, 154,
-154, 164, 154, 154, 165, 154, 154, 157, 152, 152,
-152, 149, 149, 152, 149, 149, 160, 153, 153, 165,
-156, 156, 162, 155, 155, 149, 147, 147, 155, 152,
-152, 170, 157, 157, 161, 154, 154, 170, 157, 157,
-168, 157, 157, 166, 156, 156, 166, 156, 156, 154,
-151, 151, 157, 152, 152, 162, 154, 154, 156, 152,
-152, 154, 150, 150, 154, 150, 150, 152, 149, 149,
-159, 153, 153, 169, 155, 155, 158, 153, 153, 162,
-155, 155, 165, 156, 156, 161, 154, 154, 163, 155,
-155, 162, 154, 154, 159, 153, 153, 150, 148, 148,
-143, 142, 142, 144, 143, 143, 161, 154, 154, 157,
-152, 152, 164, 155, 155, 147, 145, 145, 145, 144,
-144, 145, 144, 144, 151, 148, 148, 156, 151, 151,
-154, 150, 150, 155, 151, 151, 151, 148, 148, 146,
-144, 144, 145, 144, 144, 149, 147, 147, 148, 146,
-146, 151, 149, 149, 155, 151, 151, 160, 153, 153,
-163, 154, 154, 163, 154, 154, 160, 154, 154, 161,
-155, 155, 165, 156, 156, 160, 154, 154, 153, 149,
-149, 150, 147, 147, 159, 153, 153, 163, 153, 153,
-151, 148, 148, 139, 138, 138, 150, 147, 147, 155,
-151, 151, 151, 148, 148, 148, 145, 145, 141, 140,
-140, 142, 141, 141, 154, 150, 150, 161, 153, 153,
-160, 153, 153, 158, 152, 152, 154, 150, 150, 153,
-149, 149, 152, 149, 149, 157, 152, 152, 163, 154,
-154, 160, 153, 153, 157, 152, 152, 150, 147, 147,
-147, 145, 145, 150, 147, 147, 154, 149, 149, 156,
-151, 151, 156, 150, 150, 154, 150, 150, 152, 149,
-149, 156, 151, 151, 159, 152, 152, 160, 153, 153,
-160, 153, 153, 159, 152, 152, 160, 153, 153, 165,
-154, 154, 165, 154, 154, 160, 152, 152, 156, 151,
-151, 152, 148, 148, 151, 147, 147, 149, 146, 146,
-147, 145, 145, 144, 142, 142, 140, 139, 139, 136,
-136, 136, 137, 136, 136, 138, 137, 137, 145, 143,
-143, 154, 149, 149, 152, 148, 148, 150, 146, 146,
-152, 148, 148, 154, 149, 149, 153, 148, 148, 150,
-147, 147, 147, 144, 144, 142, 141, 141, 138, 137,
-137, 137, 136, 136, 146, 144, 144, 151, 147, 147,
-151, 147, 147, 150, 147, 147, 149, 146, 146, 150,
-146, 146, 152, 148, 148, 151, 147, 147, 150, 146,
-146, 150, 146, 146, 151, 147, 147, 152, 147, 147,
-153, 148, 148, 152, 148, 148, 147, 144, 144, 136,
-135, 135, 125, 125, 125, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 126, 126, 126, 135, 135, 135, 146, 144, 144,
-152, 147, 147, 153, 148, 148, 153, 148, 148, 152,
-148, 148, 150, 146, 146, 148, 145, 145, 148, 145,
-145, 147, 145, 145, 147, 144, 144, 147, 145, 145,
-148, 145, 145, 149, 146, 146, 151, 147, 147, 152,
-147, 147, 154, 149, 149, 153, 149, 149, 152, 148,
-148, 151, 147, 147, 150, 146, 146, 149, 146, 146,
-150, 146, 146, 154, 149, 149, 157, 151, 151, 159,
-152, 152, 159, 151, 151, 154, 149, 149, 153, 148,
-148, 156, 150, 150, 156, 150, 150, 155, 150, 150,
-154, 149, 149, 155, 150, 150, 154, 149, 149, 153,
-149, 149, 154, 149, 149, 153, 149, 149, 157, 151,
-151, 159, 151, 151, 153, 148, 148, 149, 146, 146,
-155, 150, 150, 158, 151, 151, 155, 150, 150, 153,
-149, 149, 152, 148, 148, 153, 148, 148, 155, 149,
-149, 156, 150, 150, 157, 151, 151, 156, 151, 151,
-152, 148, 148, 152, 148, 148, 153, 149, 149, 153,
-149, 149, 153, 149, 149, 155, 150, 150, 156, 151,
-151, 159, 152, 152, 158, 151, 151, 151, 148, 148,
-146, 144, 144, 149, 146, 146, 148, 146, 146, 151,
-148, 148, 151, 148, 148, 147, 145, 145, 150, 147,
-147, 155, 150, 150, 162, 153, 153, 160, 152, 152,
-158, 152, 152, 153, 150, 150, 149, 147, 147, 146,
-144, 144, 145, 144, 144, 145, 143, 143, 143, 142,
-142, 143, 142, 142, 149, 146, 146, 152, 149, 149,
-151, 148, 148, 149, 147, 147, 162, 153, 153, 156,
-151, 151, 152, 148, 148, 148, 145, 145, 143, 142,
-142, 143, 142, 142, 144, 143, 143, 148, 146, 146,
-154, 150, 150, 154, 150, 150, 154, 150, 150, 148,
-146, 146, 145, 144, 144, 150, 147, 147, 150, 147,
-147, 147, 145, 145, 145, 144, 144, 143, 142, 142,
-152, 149, 149, 158, 152, 152, 151, 148, 148, 160,
-153, 153, 163, 154, 154, 158, 153, 153, 158, 153,
-153, 161, 154, 154, 154, 150, 150, 159, 153, 153,
-160, 154, 154, 155, 151, 151, 157, 152, 152, 153,
-150, 150, 148, 146, 146, 150, 147, 147, 156, 151,
-151, 157, 152, 152, 155, 150, 150, 151, 148, 148,
-159, 153, 153, 155, 151, 151, 164, 156, 156, 153,
-150, 150, 148, 146, 146, 153, 149, 149, 156, 151,
-151, 156, 152, 152, 155, 151, 151, 158, 152, 152,
-152, 149, 149, 158, 153, 153, 164, 156, 156, 164,
-155, 155, 156, 151, 151, 166, 155, 155, 168, 155,
-155, 157, 151, 151, 162, 154, 154, 155, 150, 150,
-153, 150, 150, 152, 149, 149, 148, 146, 146, 148,
-146, 146, 150, 148, 148, 149, 147, 147, 145, 144,
-144, 151, 148, 148, 146, 144, 144, 142, 141, 141,
-145, 144, 144, 150, 147, 147, 145, 144, 144, 141,
-140, 140, 144, 142, 142, 147, 145, 145, 152, 149,
-149, 155, 150, 150, 152, 149, 149, 152, 148, 148,
-156, 151, 151, 156, 151, 151, 154, 150, 150, 156,
-151, 151, 163, 154, 154, 158, 153, 153, 151, 148,
-148, 149, 146, 146, 148, 146, 146, 145, 143, 143,
-139, 138, 138, 143, 142, 142, 151, 148, 148, 147,
-145, 145, 145, 144, 144, 144, 142, 142, 145, 143,
-143, 151, 148, 148, 153, 149, 149, 147, 145, 145,
-149, 146, 146, 150, 147, 147, 152, 148, 148, 155,
-150, 150, 155, 150, 150, 154, 150, 150, 154, 149,
-149, 152, 149, 149, 150, 147, 147, 149, 146, 146,
-150, 147, 147, 150, 147, 147, 154, 149, 149, 154,
-150, 150, 149, 146, 146, 147, 145, 145, 150, 147,
-147, 151, 148, 148, 152, 148, 148, 150, 147, 147,
-145, 144, 144, 150, 147, 147, 157, 151, 151, 158,
-151, 151, 159, 152, 152, 154, 149, 149, 150, 147,
-147, 153, 149, 149, 155, 150, 150, 150, 146, 146,
-146, 144, 144, 145, 143, 143, 145, 143, 143, 146,
-144, 144, 150, 147, 147, 154, 149, 149, 153, 149,
-149, 149, 146, 146, 148, 145, 145, 148, 145, 145,
-149, 146, 146, 150, 147, 147, 152, 148, 148, 153,
-148, 148, 148, 145, 145, 145, 143, 143, 148, 145,
-145, 151, 147, 147, 152, 148, 148, 152, 148, 148,
-149, 146, 146, 146, 144, 144, 145, 143, 143, 146,
-144, 144, 149, 145, 145, 150, 146, 146, 150, 146,
-146, 149, 146, 146, 149, 146, 146, 147, 144, 144,
-141, 140, 140, 133, 133, 133, 125, 125, 125, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 125, 125, 125,
-134, 134, 134, 145, 142, 142, 148, 145, 145, 148,
-145, 145, 152, 147, 147, 154, 149, 149, 152, 147,
-147, 150, 146, 146, 150, 146, 146, 150, 147, 147,
-151, 147, 147, 152, 147, 147, 153, 148, 148, 152,
-148, 148, 149, 146, 146, 148, 145, 145, 148, 145,
-145, 153, 148, 148, 156, 150, 150, 155, 149, 149,
-153, 148, 148, 153, 148, 148, 153, 148, 148, 154,
-149, 149, 155, 150, 150, 156, 150, 150, 154, 149,
-149, 150, 146, 146, 154, 148, 148, 160, 151, 151,
-157, 150, 150, 154, 149, 149, 151, 147, 147, 149,
-146, 146, 149, 146, 146, 149, 146, 146, 148, 146,
-146, 151, 147, 147, 157, 151, 151, 155, 150, 150,
-148, 145, 145, 151, 148, 148, 158, 151, 151, 159,
-151, 151, 159, 152, 152, 161, 152, 152, 163, 153,
-153, 166, 154, 154, 167, 154, 154, 161, 153, 153,
-159, 151, 151, 158, 151, 151, 157, 151, 151, 158,
-152, 152, 155, 150, 150, 154, 149, 149, 152, 148,
-148, 150, 147, 147, 153, 149, 149, 155, 150, 150,
-156, 150, 150, 151, 148, 148, 145, 144, 144, 144,
-142, 142, 149, 147, 147, 151, 148, 148, 155, 150,
-150, 152, 148, 148, 156, 151, 151, 152, 148, 148,
-151, 148, 148, 150, 148, 148, 148, 146, 146, 139,
-138, 138, 135, 135, 135, 146, 144, 144, 147, 145,
-145, 144, 142, 142, 145, 143, 143, 154, 150, 150,
-144, 143, 143, 136, 136, 136, 141, 140, 140, 155,
-150, 150, 156, 151, 151, 155, 150, 150, 149, 146,
-146, 144, 142, 142, 150, 147, 147, 147, 145, 145,
-151, 148, 148, 145, 144, 144, 143, 141, 141, 146,
-144, 144, 142, 141, 141, 138, 137, 137, 141, 140,
-140, 142, 141, 141, 146, 144, 144, 147, 145, 145,
-142, 141, 141, 138, 138, 138, 137, 137, 137, 141,
-140, 140, 143, 142, 142, 153, 149, 149, 165, 156,
-156, 143, 142, 142, 140, 140, 140, 143, 142, 142,
-153, 149, 149, 147, 145, 145, 139, 139, 139, 152,
-149, 149, 151, 148, 148, 145, 144, 144, 145, 144,
-144, 142, 141, 141, 140, 139, 139, 140, 140, 140,
-143, 142, 142, 152, 149, 149, 156, 152, 152, 157,
-152, 152, 155, 150, 150, 154, 150, 150, 147, 146,
-146, 139, 139, 139, 138, 138, 138, 141, 140, 140,
-152, 149, 149, 155, 151, 151, 164, 155, 155, 159,
-153, 153, 156, 152, 152, 154, 150, 150, 166, 155,
-155, 156, 151, 151, 151, 148, 148, 159, 153, 153,
-153, 149, 149, 144, 143, 143, 140, 140, 140, 136,
-136, 136, 139, 138, 138, 141, 140, 140, 147, 145,
-145, 154, 149, 149, 151, 148, 148, 153, 149, 149,
-162, 153, 153, 159, 152, 152, 145, 143, 143, 149,
-146, 146, 153, 149, 149, 145, 143, 143, 143, 142,
-142, 143, 141, 141, 147, 145, 145, 153, 149, 149,
-164, 153, 153, 152, 149, 149, 149, 147, 147, 154,
-150, 150, 150, 147, 147, 149, 147, 147, 142, 141,
-141, 136, 136, 136, 139, 138, 138, 140, 139, 139,
-139, 138, 138, 142, 141, 141, 147, 145, 145, 147,
-145, 145, 145, 144, 144, 146, 145, 145, 150, 147,
-147, 148, 146, 146, 141, 140, 140, 141, 140, 140,
-142, 141, 141, 147, 145, 145, 154, 149, 149, 151,
-148, 148, 147, 145, 145, 146, 144, 144, 146, 144,
-144, 147, 145, 145, 149, 146, 146, 149, 147, 147,
-152, 148, 148, 155, 150, 150, 149, 146, 146, 141,
-140, 140, 141, 140, 140, 144, 143, 143, 145, 143,
-143, 145, 143, 143, 139, 138, 138, 137, 136, 136,
-143, 141, 141, 148, 146, 146, 153, 149, 149, 153,
-149, 149, 149, 146, 146, 151, 148, 148, 158, 151,
-151, 156, 150, 150, 153, 149, 149, 154, 150, 150,
-156, 150, 150, 157, 151, 151, 158, 151, 151, 157,
-150, 150, 154, 149, 149, 148, 145, 145, 144, 142,
-142, 144, 142, 142, 146, 143, 143, 150, 146, 146,
-156, 150, 150, 161, 152, 152, 158, 150, 150, 154,
-148, 148, 151, 147, 147, 149, 146, 146, 152, 148,
-148, 151, 147, 147, 150, 146, 146, 147, 144, 144,
-143, 141, 141, 144, 142, 142, 149, 145, 145, 150,
-146, 146, 150, 146, 146, 148, 145, 145, 147, 144,
-144, 144, 142, 142, 138, 137, 137, 131, 131, 131,
-125, 125, 125, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 125, 125, 125, 133, 133, 133, 143,
-142, 142, 150, 146, 146, 150, 147, 147, 153, 149,
-149, 155, 150, 150, 156, 150, 150, 154, 149, 149,
-155, 150, 150, 153, 148, 148, 153, 149, 149, 153,
-148, 148, 153, 148, 148, 150, 147, 147, 147, 144,
-144, 147, 144, 144, 147, 144, 144, 150, 146, 146,
-151, 147, 147, 151, 148, 148, 152, 148, 148, 154,
-149, 149, 153, 149, 149, 153, 148, 148, 153, 148,
-148, 153, 148, 148, 154, 149, 149, 156, 151, 151,
-156, 150, 150, 156, 150, 150, 155, 151, 151, 155,
-150, 150, 153, 149, 149, 148, 146, 146, 143, 142,
-142, 150, 147, 147, 158, 152, 152, 163, 154, 154,
-165, 154, 154, 158, 152, 152, 154, 149, 149, 157,
-151, 151, 158, 152, 152, 157, 151, 151, 158, 151,
-151, 160, 153, 153, 161, 153, 153, 161, 153, 153,
-155, 150, 150, 150, 147, 147, 152, 149, 149, 156,
-151, 151, 166, 156, 156, 171, 157, 157, 169, 156,
-156, 163, 154, 154, 157, 151, 151, 155, 150, 150,
-153, 150, 150, 157, 151, 151, 160, 153, 153, 166,
-155, 155, 169, 156, 156, 161, 153, 153, 159, 151,
-151, 160, 153, 153, 158, 152, 152, 154, 151, 151,
-151, 148, 148, 146, 144, 144, 141, 140, 140, 142,
-141, 141, 133, 132, 132, 133, 132, 132, 147, 145,
-145, 158, 152, 152, 155, 151, 151, 156, 151, 151,
-167, 155, 155, 164, 155, 155, 157, 152, 152, 152,
-149, 149, 148, 146, 146, 157, 152, 152, 162, 154,
-154, 166, 156, 156, 165, 156, 156, 162, 155, 155,
-161, 154, 154, 163, 155, 155, 161, 154, 154, 159,
-153, 153, 162, 154, 154, 159, 153, 153, 162, 154,
-154, 158, 152, 152, 170, 156, 156, 166, 156, 156,
-163, 155, 155, 169, 158, 158, 172, 158, 158, 171,
-157, 157, 170, 157, 157, 164, 156, 156, 159, 154,
-154, 159, 154, 154, 160, 155, 155, 164, 155, 155,
-149, 147, 147, 156, 151, 151, 168, 156, 156, 157,
-153, 153, 152, 149, 149, 146, 145, 145, 163, 155,
-155, 165, 156, 156, 161, 155, 155, 160, 154, 154,
-162, 155, 155, 157, 152, 152, 151, 148, 148, 147,
-145, 145, 150, 147, 147, 154, 151, 151, 150, 148,
-148, 144, 143, 143, 149, 147, 147, 161, 154, 154,
-164, 155, 155, 152, 149, 149, 151, 148, 148, 150,
-147, 147, 150, 147, 147, 150, 148, 148, 154, 151,
-151, 163, 156, 156, 156, 152, 152, 158, 153, 153,
-166, 157, 157, 166, 156, 156, 167, 155, 155, 164,
-154, 154, 158, 152, 152, 151, 148, 148, 136, 136,
-136, 137, 137, 137, 149, 146, 146, 145, 144, 144,
-144, 142, 142, 152, 149, 149, 155, 151, 151, 157,
-152, 152, 155, 151, 151, 161, 154, 154, 160, 154,
-154, 158, 152, 152, 160, 153, 153, 158, 152, 152,
-154, 150, 150, 148, 146, 146, 145, 144, 144, 151,
-148, 148, 149, 147, 147, 158, 153, 153, 157, 152,
-152, 158, 153, 153, 157, 152, 152, 158, 152, 152,
-159, 153, 153, 157, 152, 152, 161, 154, 154, 162,
-154, 154, 160, 154, 154, 161, 154, 154, 165, 156,
-156, 168, 156, 156, 161, 154, 154, 152, 148, 148,
-148, 145, 145, 146, 144, 144, 148, 146, 146, 148,
-146, 146, 143, 142, 142, 143, 142, 142, 148, 145,
-145, 157, 152, 152, 170, 156, 156, 165, 155, 155,
-155, 151, 151, 147, 145, 145, 142, 141, 141, 149,
-147, 147, 154, 150, 150, 150, 147, 147, 151, 148,
-148, 158, 152, 152, 155, 151, 151, 148, 146, 146,
-147, 145, 145, 148, 146, 146, 147, 145, 145, 148,
-145, 145, 154, 149, 149, 156, 151, 151, 153, 149,
-149, 154, 150, 150, 161, 153, 153, 162, 154, 154,
-159, 152, 152, 156, 150, 150, 153, 149, 149, 147,
-145, 145, 143, 141, 141, 149, 146, 146, 153, 149,
-149, 152, 148, 148, 153, 149, 149, 156, 150, 150,
-157, 150, 150, 158, 151, 151, 154, 149, 149, 150,
-147, 147, 152, 148, 148, 153, 148, 148, 155, 150,
-150, 155, 150, 150, 152, 148, 148, 151, 147, 147,
-150, 146, 146, 153, 148, 148, 157, 151, 151, 155,
-150, 150, 153, 149, 149, 152, 148, 148, 144, 142,
-142, 133, 133, 133, 126, 126, 126, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 125,
-125, 125, 131, 130, 130, 140, 139, 139, 147, 144,
-144, 149, 146, 146, 152, 148, 148, 155, 149, 149,
-157, 150, 150, 157, 151, 151, 155, 150, 150, 153,
-148, 148, 150, 146, 146, 148, 145, 145, 146, 144,
-144, 146, 144, 144, 147, 145, 145, 148, 146, 146,
-150, 147, 147, 153, 148, 148, 154, 149, 149, 155,
-150, 150, 153, 149, 149, 150, 146, 146, 151, 147,
-147, 152, 148, 148, 150, 147, 147, 150, 147, 147,
-154, 150, 150, 154, 149, 149, 149, 147, 147, 150,
-147, 147, 153, 149, 149, 154, 149, 149, 153, 149,
-149, 147, 145, 145, 146, 144, 144, 153, 149, 149,
-156, 150, 150, 155, 150, 150, 154, 150, 150, 154,
-149, 149, 153, 149, 149, 152, 148, 148, 152, 148,
-148, 153, 149, 149, 157, 151, 151, 157, 151, 151,
-153, 149, 149, 150, 147, 147, 147, 145, 145, 151,
-148, 148, 155, 150, 150, 158, 152, 152, 159, 153,
-153, 160, 153, 153, 158, 152, 152, 156, 151, 151,
-154, 150, 150, 152, 149, 149, 154, 150, 150, 155,
-151, 151, 159, 153, 153, 162, 155, 155, 153, 150,
-150, 151, 148, 148, 157, 152, 152, 157, 152, 152,
-156, 151, 151, 152, 149, 149, 151, 148, 148, 149,
-146, 146, 147, 145, 145, 144, 143, 143, 146, 144,
-144, 153, 149, 149, 155, 151, 151, 154, 150, 150,
-161, 154, 154, 162, 155, 155, 159, 153, 153, 153,
-149, 149, 148, 146, 146, 146, 144, 144, 152, 149,
-149, 160, 153, 153, 168, 156, 156, 161, 154, 154,
-151, 148, 148, 156, 151, 151, 163, 155, 155, 158,
-153, 153, 154, 150, 150, 159, 153, 153, 158, 153,
-153, 151, 148, 148, 156, 152, 152, 161, 154, 154,
-166, 156, 156, 162, 154, 154, 158, 153, 153, 162,
-155, 155, 162, 155, 155, 157, 152, 152, 148, 146,
-146, 143, 142, 142, 142, 141, 141, 150, 148, 148,
-156, 152, 152, 160, 154, 154, 160, 154, 154, 152,
-150, 150, 158, 153, 153, 158, 153, 153, 153, 150,
-150, 157, 152, 152, 158, 153, 153, 160, 154, 154,
-162, 154, 154, 157, 152, 152, 146, 145, 145, 147,
-145, 145, 146, 145, 145, 146, 145, 145, 139, 139,
-139, 150, 147, 147, 154, 150, 150, 151, 148, 148,
-155, 151, 151, 159, 153, 153, 153, 150, 150, 152,
-149, 149, 156, 151, 151, 155, 151, 151, 148, 146,
-146, 155, 151, 151, 156, 152, 152, 158, 153, 153,
-155, 151, 151, 157, 152, 152, 163, 155, 155, 153,
-150, 150, 144, 143, 143, 144, 143, 143, 143, 141,
-141, 148, 146, 146, 146, 145, 145, 146, 144, 144,
-156, 151, 151, 162, 155, 155, 163, 155, 155, 160,
-153, 153, 156, 152, 152, 162, 154, 154, 151, 148,
-148, 151, 148, 148, 156, 151, 151, 154, 150, 150,
-151, 148, 148, 145, 144, 144, 144, 143, 143, 145,
-144, 144, 146, 144, 144, 149, 146, 146, 152, 149,
-149, 152, 149, 149, 151, 148, 148, 153, 149, 149,
-151, 148, 148, 152, 149, 149, 155, 151, 151, 153,
-150, 150, 152, 149, 149, 154, 150, 150, 160, 153,
-153, 159, 153, 153, 156, 151, 151, 150, 147, 147,
-146, 144, 144, 153, 149, 149, 154, 150, 150, 149,
-147, 147, 148, 146, 146, 148, 146, 146, 151, 148,
-148, 154, 150, 150, 155, 151, 151, 155, 150, 150,
-148, 146, 146, 147, 145, 145, 151, 148, 148, 154,
-150, 150, 156, 151, 151, 155, 150, 150, 153, 149,
-149, 149, 146, 146, 146, 144, 144, 148, 146, 146,
-148, 146, 146, 146, 144, 144, 146, 144, 144, 147,
-145, 145, 149, 146, 146, 151, 147, 147, 156, 151,
-151, 160, 152, 152, 158, 152, 152, 157, 151, 151,
-157, 151, 151, 154, 149, 149, 149, 146, 146, 147,
-144, 144, 146, 143, 143, 150, 147, 147, 153, 148,
-148, 151, 147, 147, 151, 147, 147, 155, 150, 150,
-155, 149, 149, 153, 148, 148, 155, 149, 149, 156,
-150, 150, 153, 149, 149, 152, 148, 148, 156, 151,
-151, 154, 149, 149, 146, 144, 144, 147, 145, 145,
-154, 149, 149, 155, 150, 150, 155, 150, 150, 151,
-147, 147, 142, 140, 140, 131, 131, 131, 125, 125,
-125, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 124, 124, 124, 130, 130,
-130, 139, 138, 138, 147, 144, 144, 147, 144, 144,
-149, 146, 146, 151, 147, 147, 151, 147, 147, 151,
-147, 147, 149, 145, 145, 148, 145, 145, 148, 145,
-145, 147, 144, 144, 144, 142, 142, 146, 143, 143,
-147, 145, 145, 149, 146, 146, 151, 147, 147, 152,
-147, 147, 153, 148, 148, 154, 149, 149, 149, 145,
-145, 145, 143, 143, 148, 145, 145, 150, 146, 146,
-149, 146, 146, 150, 147, 147, 150, 147, 147, 146,
-144, 144, 142, 141, 141, 149, 146, 146, 154, 149,
-149, 153, 148, 148, 150, 147, 147, 147, 145, 145,
-147, 145, 145, 149, 146, 146, 147, 144, 144, 147,
-144, 144, 151, 147, 147, 152, 148, 148, 149, 146,
-146, 148, 145, 145, 149, 146, 146, 152, 148, 148,
-153, 149, 149, 148, 145, 145, 146, 144, 144, 149,
-146, 146, 150, 147, 147, 150, 146, 146, 149, 146,
-146, 148, 145, 145, 150, 147, 147, 151, 147, 147,
-151, 147, 147, 152, 148, 148, 153, 149, 149, 153,
-148, 148, 153, 149, 149, 153, 149, 149, 151, 148,
-148, 145, 144, 144, 145, 143, 143, 149, 147, 147,
-154, 149, 149, 158, 151, 151, 153, 149, 149, 150,
-147, 147, 152, 148, 148, 152, 148, 148, 154, 149,
-149, 153, 149, 149, 154, 150, 150, 154, 150, 150,
-153, 149, 149, 154, 150, 150, 155, 150, 150, 150,
-147, 147, 149, 146, 146, 146, 144, 144, 148, 145,
-145, 150, 147, 147, 154, 150, 150, 155, 150, 150,
-149, 146, 146, 149, 146, 146, 149, 147, 147, 153,
-149, 149, 154, 150, 150, 151, 148, 148, 150, 147,
-147, 151, 148, 148, 155, 150, 150, 158, 152, 152,
-161, 153, 153, 162, 153, 153, 157, 151, 151, 156,
-151, 151, 164, 153, 153, 160, 152, 152, 150, 148,
-148, 151, 148, 148, 150, 147, 147, 150, 147, 147,
-147, 145, 145, 145, 144, 144, 145, 144, 144, 144,
-143, 143, 146, 144, 144, 151, 148, 148, 153, 149,
-149, 152, 149, 149, 153, 149, 149, 150, 148, 148,
-154, 150, 150, 163, 153, 153, 157, 151, 151, 155,
-150, 150, 154, 149, 149, 148, 146, 146, 144, 143,
-143, 149, 147, 147, 147, 145, 145, 146, 144, 144,
-145, 144, 144, 150, 147, 147, 148, 146, 146, 145,
-144, 144, 148, 146, 146, 145, 144, 144, 140, 139,
-139, 144, 143, 143, 152, 148, 148, 148, 146, 146,
-146, 145, 145, 153, 149, 149, 148, 146, 146, 144,
-143, 143, 142, 141, 141, 149, 147, 147, 149, 146,
-146, 152, 148, 148, 147, 145, 145, 146, 145, 145,
-154, 150, 150, 154, 149, 149, 151, 148, 148, 155,
-150, 150, 157, 151, 151, 150, 147, 147, 147, 145,
-145, 146, 145, 145, 149, 146, 146, 157, 151, 151,
-152, 148, 148, 144, 143, 143, 147, 145, 145, 150,
-147, 147, 150, 147, 147, 151, 147, 147, 152, 148,
-148, 150, 147, 147, 146, 144, 144, 147, 145, 145,
-147, 145, 145, 147, 145, 145, 146, 144, 144, 145,
-144, 144, 148, 146, 146, 152, 149, 149, 154, 149,
-149, 155, 150, 150, 150, 147, 147, 149, 146, 146,
-154, 149, 149, 154, 149, 149, 151, 147, 147, 151,
-147, 147, 151, 147, 147, 145, 143, 143, 144, 142,
-142, 153, 148, 148, 154, 149, 149, 148, 145, 145,
-149, 146, 146, 152, 148, 148, 156, 150, 150, 157,
-151, 151, 150, 147, 147, 146, 144, 144, 146, 144,
-144, 147, 145, 145, 148, 146, 146, 145, 143, 143,
-144, 142, 142, 145, 143, 143, 147, 145, 145, 148,
-145, 145, 150, 147, 147, 152, 148, 148, 153, 148,
-148, 154, 148, 148, 155, 149, 149, 156, 149, 149,
-154, 148, 148, 149, 146, 146, 142, 141, 141, 146,
-144, 144, 153, 148, 148, 148, 145, 145, 145, 143,
-143, 148, 145, 145, 150, 146, 146, 151, 146, 146,
-153, 148, 148, 155, 149, 149, 150, 146, 146, 146,
-143, 143, 150, 146, 146, 149, 146, 146, 144, 142,
-142, 146, 143, 143, 149, 145, 145, 149, 146, 146,
-149, 145, 145, 146, 143, 143, 138, 137, 137, 129,
-129, 129, 124, 124, 124, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 129, 129, 129, 141, 140, 140,
-151, 146, 146, 152, 147, 147, 149, 146, 146, 147,
-144, 144, 146, 143, 143, 145, 143, 143, 145, 143,
-143, 147, 144, 144, 152, 147, 147, 151, 147, 147,
-149, 146, 146, 148, 145, 145, 149, 146, 146, 151,
-147, 147, 151, 147, 147, 150, 146, 146, 152, 148,
-148, 152, 148, 148, 146, 144, 144, 143, 142, 142,
-145, 143, 143, 150, 147, 147, 157, 150, 150, 151,
-147, 147, 145, 143, 143, 142, 141, 141, 145, 143,
-143, 157, 150, 150, 157, 150, 150, 152, 148, 148,
-150, 147, 147, 149, 146, 146, 146, 144, 144, 148,
-145, 145, 150, 146, 146, 153, 148, 148, 156, 150,
-150, 153, 148, 148, 152, 148, 148, 153, 149, 149,
-153, 149, 149, 151, 148, 148, 146, 144, 144, 143,
-142, 142, 153, 149, 149, 154, 149, 149, 143, 142,
-142, 143, 142, 142, 147, 145, 145, 149, 146, 146,
-151, 148, 148, 151, 148, 148, 155, 150, 150, 161,
-153, 153, 159, 152, 152, 155, 150, 150, 151, 148,
-148, 149, 146, 146, 146, 144, 144, 148, 146, 146,
-155, 150, 150, 161, 152, 152, 164, 153, 153, 151,
-147, 147, 146, 144, 144, 157, 151, 151, 157, 151,
-151, 152, 148, 148, 153, 149, 149, 155, 150, 150,
-155, 150, 150, 157, 151, 151, 151, 148, 148, 153,
-149, 149, 154, 150, 150, 151, 147, 147, 150, 147,
-147, 151, 148, 148, 155, 150, 150, 159, 152, 152,
-150, 147, 147, 142, 141, 141, 138, 138, 138, 141,
-141, 141, 153, 150, 150, 156, 151, 151, 154, 150,
-150, 155, 151, 151, 158, 153, 153, 156, 152, 152,
-155, 151, 151, 154, 150, 150, 155, 151, 151, 155,
-151, 151, 149, 147, 147, 145, 144, 144, 148, 146,
-146, 145, 143, 143, 147, 145, 145, 146, 144, 144,
-144, 143, 143, 152, 149, 149, 161, 153, 153, 162,
-153, 153, 164, 154, 154, 164, 154, 154, 164, 154,
-154, 164, 155, 155, 159, 153, 153, 153, 150, 150,
-143, 142, 142, 145, 143, 143, 146, 145, 145, 143,
-142, 142, 149, 147, 147, 146, 145, 145, 146, 144,
-144, 146, 144, 144, 144, 143, 143, 144, 143, 143,
-148, 146, 146, 147, 145, 145, 158, 152, 152, 143,
-142, 142, 144, 143, 143, 146, 145, 145, 146, 145,
-145, 144, 143, 143, 142, 141, 141, 147, 145, 145,
-146, 144, 144, 151, 148, 148, 145, 143, 143, 143,
-142, 142, 152, 148, 148, 157, 151, 151, 140, 139,
-139, 139, 139, 139, 148, 146, 146, 151, 148, 148,
-151, 148, 148, 145, 143, 143, 146, 144, 144, 158,
-152, 152, 154, 150, 150, 151, 147, 147, 148, 146,
-146, 146, 144, 144, 154, 149, 149, 160, 152, 152,
-157, 151, 151, 156, 150, 150, 158, 152, 152, 156,
-151, 151, 155, 150, 150, 159, 152, 152, 157, 151,
-151, 153, 149, 149, 155, 150, 150, 157, 152, 152,
-155, 150, 150, 153, 149, 149, 153, 149, 149, 154,
-150, 150, 156, 151, 151, 157, 151, 151, 157, 151,
-151, 155, 150, 150, 154, 149, 149, 156, 150, 150,
-153, 149, 149, 149, 146, 146, 155, 150, 150, 158,
-151, 151, 151, 147, 147, 152, 148, 148, 159, 150,
-150, 153, 148, 148, 147, 144, 144, 156, 150, 150,
-160, 152, 152, 157, 151, 151, 154, 149, 149, 151,
-148, 148, 152, 148, 148, 152, 148, 148, 149, 146,
-146, 146, 144, 144, 144, 142, 142, 150, 147, 147,
-158, 151, 151, 154, 149, 149, 150, 147, 147, 151,
-147, 147, 152, 148, 148, 152, 148, 148, 153, 148,
-148, 155, 149, 149, 155, 149, 149, 153, 148, 148,
-147, 144, 144, 148, 145, 145, 155, 149, 149, 150,
-147, 147, 145, 143, 143, 146, 144, 144, 147, 144,
-144, 148, 145, 145, 151, 147, 147, 153, 148, 148,
-149, 146, 146, 145, 142, 142, 143, 141, 141, 145,
-142, 142, 149, 146, 146, 150, 146, 146, 148, 145,
-145, 146, 143, 143, 145, 143, 143, 146, 143, 143,
-138, 137, 137, 128, 128, 128, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
-128, 128, 128, 136, 136, 136, 145, 143, 143, 150,
-146, 146, 148, 145, 145, 144, 142, 142, 145, 142,
-142, 147, 144, 144, 150, 146, 146, 149, 146, 146,
-144, 142, 142, 143, 141, 141, 144, 142, 142, 145,
-143, 143, 147, 145, 145, 152, 147, 147, 150, 146,
-146, 147, 144, 144, 149, 146, 146, 151, 147, 147,
-152, 147, 147, 150, 146, 146, 146, 144, 144, 148,
-145, 145, 150, 146, 146, 153, 148, 148, 153, 148,
-148, 152, 147, 147, 150, 147, 147, 149, 146, 146,
-151, 147, 147, 153, 148, 148, 153, 148, 148, 153,
-149, 149, 154, 149, 149, 152, 148, 148, 151, 147,
-147, 152, 148, 148, 151, 147, 147, 150, 147, 147,
-151, 148, 148, 153, 149, 149, 156, 150, 150, 154,
-149, 149, 149, 146, 146, 149, 146, 146, 151, 147,
-147, 155, 150, 150, 154, 149, 149, 147, 145, 145,
-147, 145, 145, 150, 147, 147, 148, 145, 145, 144,
-142, 142, 138, 137, 137, 141, 140, 140, 148, 146,
-146, 147, 145, 145, 146, 145, 145, 150, 147, 147,
-152, 148, 148, 154, 149, 149, 148, 146, 146, 145,
-143, 143, 152, 148, 148, 156, 150, 150, 156, 150,
-150, 152, 148, 148, 147, 144, 144, 146, 144, 144,
-149, 147, 147, 159, 151, 151, 156, 150, 150, 148,
-146, 146, 148, 146, 146, 149, 146, 146, 151, 148,
-148, 152, 149, 149, 152, 148, 148, 155, 150, 150,
-156, 151, 151, 155, 150, 150, 152, 149, 149, 146,
-144, 144, 150, 147, 147, 157, 152, 152, 156, 151,
-151, 154, 150, 150, 152, 149, 149, 145, 144, 144,
-138, 138, 138, 133, 133, 133, 132, 132, 132, 138,
-138, 138, 149, 146, 146, 160, 152, 152, 163, 153,
-153, 163, 153, 153, 157, 152, 152, 155, 151, 151,
-156, 151, 151, 158, 152, 152, 157, 151, 151, 149,
-146, 146, 152, 148, 148, 158, 151, 151, 151, 148,
-148, 145, 144, 144, 148, 146, 146, 152, 149, 149,
-148, 146, 146, 146, 145, 145, 147, 145, 145, 142,
-142, 142, 140, 140, 140, 142, 142, 142, 149, 147,
-147, 148, 146, 146, 149, 146, 146, 152, 149, 149,
-164, 153, 153, 164, 154, 154, 157, 151, 151, 153,
-149, 149, 150, 147, 147, 158, 152, 152, 163, 154,
-154, 156, 151, 151, 151, 148, 148, 152, 149, 149,
-159, 152, 152, 162, 153, 153, 153, 149, 149, 153,
-149, 149, 158, 151, 151, 155, 150, 150, 152, 148,
-148, 157, 151, 151, 158, 152, 152, 157, 151, 151,
-154, 150, 150, 153, 149, 149, 153, 149, 149, 153,
-149, 149, 147, 144, 144, 147, 145, 145, 148, 146,
-146, 153, 149, 149, 157, 151, 151, 159, 152, 152,
-156, 150, 150, 149, 146, 146, 153, 149, 149, 158,
-152, 152, 163, 153, 153, 161, 152, 152, 150, 147,
-147, 147, 145, 145, 147, 145, 145, 152, 148, 148,
-155, 150, 150, 155, 150, 150, 153, 149, 149, 150,
-147, 147, 152, 148, 148, 151, 148, 148, 147, 145,
-145, 152, 148, 148, 163, 153, 153, 156, 150, 150,
-150, 147, 147, 155, 150, 150, 154, 149, 149, 149,
-146, 146, 150, 147, 147, 150, 147, 147, 151, 147,
-147, 152, 147, 147, 152, 148, 148, 150, 146, 146,
-147, 145, 145, 149, 146, 146, 149, 146, 146, 147,
-144, 144, 149, 146, 146, 152, 148, 148, 150, 147,
-147, 149, 146, 146, 149, 146, 146, 148, 145, 145,
-146, 144, 144, 148, 145, 145, 150, 147, 147, 148,
-145, 145, 149, 146, 146, 152, 148, 148, 157, 150,
-150, 160, 151, 151, 152, 148, 148, 148, 145, 145,
-150, 147, 147, 149, 146, 146, 146, 144, 144, 148,
-145, 145, 147, 145, 145, 140, 139, 139, 138, 138,
-138, 139, 138, 138, 144, 142, 142, 147, 144, 144,
-147, 144, 144, 148, 145, 145, 152, 147, 147, 153,
-148, 148, 151, 146, 146, 149, 145, 145, 148, 144,
-144, 146, 143, 143, 137, 137, 137, 128, 128, 128,
-124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 127, 127, 127, 135,
-135, 135, 144, 142, 142, 148, 145, 145, 148, 144,
-144, 146, 144, 144, 147, 144, 144, 150, 146, 146,
-153, 147, 147, 155, 148, 148, 155, 148, 148, 149,
-145, 145, 144, 142, 142, 146, 143, 143, 149, 146,
-146, 154, 149, 149, 151, 147, 147, 149, 146, 146,
-152, 148, 148, 153, 148, 148, 152, 148, 148, 150,
-146, 146, 147, 145, 145, 149, 146, 146, 149, 146,
-146, 146, 144, 144, 149, 146, 146, 149, 146, 146,
-141, 140, 140, 142, 141, 141, 147, 145, 145, 155,
-149, 149, 161, 151, 151, 152, 148, 148, 147, 144,
-144, 144, 143, 143, 147, 144, 144, 151, 147, 147,
-154, 149, 149, 152, 148, 148, 145, 143, 143, 144,
-142, 142, 144, 143, 143, 149, 146, 146, 151, 147,
-147, 152, 148, 148, 151, 148, 148, 152, 148, 148,
-155, 150, 150, 155, 150, 150, 151, 148, 148, 152,
-148, 148, 152, 148, 148, 153, 149, 149, 151, 148,
-148, 146, 144, 144, 150, 147, 147, 151, 148, 148,
-141, 141, 141, 143, 142, 142, 152, 148, 148, 146,
-144, 144, 143, 142, 142, 150, 147, 147, 152, 148,
-148, 151, 148, 148, 148, 146, 146, 146, 144, 144,
-146, 144, 144, 146, 144, 144, 148, 146, 146, 151,
-148, 148, 155, 150, 150, 157, 151, 151, 157, 151,
-151, 157, 151, 151, 151, 148, 148, 149, 147, 147,
-158, 152, 152, 157, 152, 152, 151, 148, 148, 157,
-151, 151, 160, 152, 152, 156, 151, 151, 153, 149,
-149, 150, 147, 147, 151, 148, 148, 151, 147, 147,
-156, 150, 150, 155, 150, 150, 152, 148, 148, 157,
-151, 151, 160, 152, 152, 156, 151, 151, 153, 149,
-149, 154, 150, 150, 156, 151, 151, 147, 145, 145,
-145, 144, 144, 146, 144, 144, 146, 144, 144, 146,
-144, 144, 149, 147, 147, 155, 150, 150, 157, 151,
-151, 155, 150, 150, 148, 146, 146, 157, 151, 151,
-160, 152, 152, 158, 151, 151, 159, 152, 152, 162,
-152, 152, 161, 152, 152, 156, 151, 151, 150, 147,
-147, 147, 145, 145, 149, 146, 146, 150, 147, 147,
-153, 149, 149, 160, 153, 153, 158, 152, 152, 156,
-151, 151, 158, 152, 152, 160, 153, 153, 157, 151,
-151, 146, 144, 144, 154, 150, 150, 156, 151, 151,
-145, 144, 144, 148, 146, 146, 149, 147, 147, 151,
-148, 148, 153, 149, 149, 152, 149, 149, 152, 148,
-148, 150, 147, 147, 154, 150, 150, 156, 151, 151,
-155, 150, 150, 155, 150, 150, 155, 151, 151, 145,
-144, 144, 144, 143, 143, 152, 148, 148, 158, 151,
-151, 160, 152, 152, 158, 151, 151, 158, 151, 151,
-159, 152, 152, 158, 151, 151, 155, 150, 150, 157,
-151, 151, 155, 150, 150, 147, 145, 145, 145, 143,
-143, 144, 143, 143, 146, 144, 144, 149, 146, 146,
-152, 148, 148, 150, 147, 147, 146, 144, 144, 147,
-145, 145, 149, 147, 147, 154, 149, 149, 157, 150,
-150, 159, 151, 151, 156, 150, 150, 155, 150, 150,
-156, 150, 150, 153, 149, 149, 149, 146, 146, 152,
-148, 148, 152, 148, 148, 148, 145, 145, 149, 146,
-146, 151, 147, 147, 149, 146, 146, 150, 146, 146,
-154, 149, 149, 153, 148, 148, 150, 147, 147, 149,
-146, 146, 149, 146, 146, 152, 148, 148, 153, 149,
-149, 153, 149, 149, 147, 145, 145, 144, 142, 142,
-149, 146, 146, 149, 146, 146, 148, 145, 145, 147,
-145, 145, 149, 146, 146, 151, 147, 147, 150, 146,
-146, 148, 145, 145, 147, 145, 145, 148, 145, 145,
-148, 145, 145, 148, 145, 145, 148, 145, 145, 151,
-147, 147, 153, 148, 148, 153, 148, 148, 151, 146,
-146, 150, 146, 146, 151, 147, 147, 153, 148, 148,
-155, 149, 149, 154, 149, 149, 152, 147, 147, 152,
-147, 147, 150, 146, 146, 145, 142, 142, 136, 135,
-135, 127, 127, 127, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 126, 126, 126, 134, 133, 133, 142, 140,
-140, 146, 144, 144, 147, 144, 144, 147, 144, 144,
-147, 144, 144, 149, 145, 145, 153, 147, 147, 157,
-150, 150, 158, 150, 150, 155, 149, 149, 151, 147,
-147, 151, 147, 147, 151, 147, 147, 151, 147, 147,
-148, 145, 145, 147, 145, 145, 151, 147, 147, 152,
-147, 147, 150, 146, 146, 149, 146, 146, 147, 145,
-145, 146, 144, 144, 147, 144, 144, 147, 144, 144,
-146, 144, 144, 145, 143, 143, 142, 141, 141, 144,
-143, 143, 150, 146, 146, 156, 150, 150, 158, 150,
-150, 153, 148, 148, 149, 146, 146, 146, 144, 144,
-147, 145, 145, 150, 146, 146, 151, 147, 147, 148,
-145, 145, 148, 145, 145, 151, 147, 147, 152, 148,
-148, 153, 149, 149, 154, 149, 149, 153, 148, 148,
-151, 148, 148, 150, 147, 147, 150, 147, 147, 151,
-147, 147, 148, 146, 146, 146, 144, 144, 147, 145,
-145, 145, 144, 144, 141, 140, 140, 142, 141, 141,
-143, 142, 142, 141, 140, 140, 142, 141, 141, 145,
-143, 143, 146, 145, 145, 148, 146, 146, 150, 147,
-147, 152, 148, 148, 154, 149, 149, 152, 148, 148,
-151, 148, 148, 150, 147, 147, 146, 144, 144, 144,
-143, 143, 144, 143, 143, 149, 146, 146, 155, 150,
-150, 152, 149, 149, 150, 147, 147, 148, 146, 146,
-150, 147, 147, 155, 150, 150, 150, 147, 147, 152,
-148, 148, 161, 153, 153, 157, 151, 151, 149, 147,
-147, 150, 147, 147, 152, 148, 148, 155, 149, 149,
-155, 150, 150, 155, 150, 150, 155, 150, 150, 154,
-149, 149, 154, 150, 150, 151, 147, 147, 148, 146,
-146, 146, 145, 145, 147, 145, 145, 146, 145, 145,
-146, 145, 145, 149, 146, 146, 148, 146, 146, 147,
-146, 146, 148, 146, 146, 155, 150, 150, 154, 149,
-149, 145, 144, 144, 146, 144, 144, 149, 146, 146,
-148, 146, 146, 153, 149, 149, 154, 150, 150, 157,
-151, 151, 155, 150, 150, 153, 149, 149, 150, 147,
-147, 149, 147, 147, 154, 149, 149, 156, 151, 151,
-153, 149, 149, 153, 149, 149, 152, 149, 149, 151,
-147, 147, 149, 147, 147, 148, 146, 146, 145, 144,
-144, 144, 143, 143, 147, 145, 145, 148, 146, 146,
-148, 146, 146, 148, 146, 146, 148, 146, 146, 146,
-144, 144, 149, 146, 146, 151, 148, 148, 150, 147,
-147, 151, 148, 148, 154, 149, 149, 157, 151, 151,
-159, 151, 151, 155, 150, 150, 150, 147, 147, 146,
-144, 144, 150, 147, 147, 153, 149, 149, 155, 151,
-151, 153, 149, 149, 152, 148, 148, 158, 151, 151,
-157, 151, 151, 152, 148, 148, 153, 149, 149, 153,
-149, 149, 150, 147, 147, 147, 145, 145, 143, 142,
-142, 143, 142, 142, 145, 144, 144, 150, 147, 147,
-150, 147, 147, 149, 146, 146, 153, 149, 149, 153,
-149, 149, 149, 146, 146, 153, 149, 149, 157, 151,
-151, 153, 148, 148, 151, 147, 147, 151, 148, 148,
-150, 147, 147, 149, 146, 146, 147, 145, 145, 146,
-144, 144, 147, 145, 145, 150, 147, 147, 150, 147,
-147, 147, 144, 144, 150, 146, 146, 153, 148, 148,
-152, 148, 148, 151, 147, 147, 152, 148, 148, 150,
-147, 147, 148, 146, 146, 148, 146, 146, 146, 144,
-144, 145, 143, 143, 148, 145, 145, 149, 146, 146,
-146, 143, 143, 149, 146, 146, 153, 148, 148, 150,
-146, 146, 147, 145, 145, 147, 144, 144, 146, 144,
-144, 147, 144, 144, 148, 145, 145, 149, 146, 146,
-150, 146, 146, 150, 146, 146, 151, 147, 147, 154,
-148, 148, 152, 147, 147, 150, 146, 146, 151, 147,
-147, 152, 147, 147, 152, 147, 147, 152, 147, 147,
-152, 147, 147, 151, 147, 147, 151, 146, 146, 145,
-142, 142, 135, 135, 135, 127, 127, 127, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 126, 126,
-126, 134, 133, 133, 143, 141, 141, 148, 145, 145,
-149, 145, 145, 150, 146, 146, 149, 146, 146, 149,
-145, 145, 152, 147, 147, 153, 148, 148, 151, 147,
-147, 151, 147, 147, 151, 147, 147, 152, 147, 147,
-151, 147, 147, 150, 146, 146, 147, 144, 144, 148,
-145, 145, 154, 148, 148, 152, 148, 148, 151, 147,
-147, 150, 147, 147, 149, 146, 146, 148, 145, 145,
-150, 146, 146, 150, 146, 146, 148, 145, 145, 147,
-145, 145, 146, 144, 144, 145, 144, 144, 149, 146,
-146, 153, 148, 148, 155, 149, 149, 154, 149, 149,
-151, 147, 147, 148, 145, 145, 148, 145, 145, 150,
-147, 147, 151, 147, 147, 151, 147, 147, 152, 148,
-148, 153, 149, 149, 153, 149, 149, 154, 150, 150,
-154, 149, 149, 153, 149, 149, 151, 148, 148, 148,
-146, 146, 150, 147, 147, 148, 146, 146, 144, 142,
-142, 143, 142, 142, 143, 141, 141, 142, 141, 141,
-141, 141, 141, 141, 140, 140, 145, 143, 143, 145,
-143, 143, 144, 142, 142, 152, 149, 149, 154, 150,
-150, 148, 145, 145, 150, 147, 147, 154, 149, 149,
-156, 151, 151, 155, 150, 150, 150, 147, 147, 146,
-144, 144, 144, 143, 143, 145, 144, 144, 148, 146,
-146, 150, 147, 147, 145, 143, 143, 145, 143, 143,
-147, 145, 145, 147, 145, 145, 144, 143, 143, 139,
-138, 138, 150, 147, 147, 158, 151, 151, 148, 146,
-146, 149, 147, 147, 156, 151, 151, 156, 151, 151,
-155, 151, 151, 155, 151, 151, 154, 150, 150, 152,
-149, 149, 147, 145, 145, 146, 144, 144, 146, 144,
-144, 149, 146, 146, 150, 147, 147, 153, 149, 149,
-153, 149, 149, 153, 149, 149, 157, 151, 151, 154,
-150, 150, 153, 149, 149, 153, 149, 149, 152, 149,
-149, 149, 147, 147, 150, 148, 148, 150, 148, 148,
-140, 140, 140, 148, 146, 146, 157, 151, 151, 155,
-150, 150, 153, 149, 149, 150, 147, 147, 151, 148,
-148, 152, 148, 148, 157, 151, 151, 158, 151, 151,
-156, 151, 151, 150, 147, 147, 146, 144, 144, 140,
-140, 140, 146, 145, 145, 151, 148, 148, 149, 147,
-147, 149, 147, 147, 150, 148, 148, 152, 149, 149,
-151, 148, 148, 148, 145, 145, 146, 144, 144, 145,
-144, 144, 149, 146, 146, 151, 147, 147, 152, 148,
-148, 154, 150, 150, 156, 151, 151, 158, 151, 151,
-154, 150, 150, 152, 149, 149, 155, 150, 150, 154,
-150, 150, 153, 149, 149, 154, 150, 150, 154, 150,
-150, 152, 149, 149, 156, 151, 151, 159, 152, 152,
-159, 152, 152, 157, 151, 151, 154, 149, 149, 154,
-149, 149, 153, 149, 149, 152, 148, 148, 151, 148,
-148, 152, 149, 149, 154, 150, 150, 154, 150, 150,
-154, 149, 149, 155, 150, 150, 149, 146, 146, 140,
-139, 139, 151, 148, 148, 156, 151, 151, 149, 147,
-147, 151, 148, 148, 154, 149, 149, 152, 148, 148,
-151, 148, 148, 150, 147, 147, 151, 148, 148, 151,
-148, 148, 152, 148, 148, 151, 147, 147, 151, 147,
-147, 153, 148, 148, 153, 148, 148, 150, 146, 146,
-147, 145, 145, 146, 144, 144, 145, 143, 143, 146,
-144, 144, 147, 145, 145, 143, 142, 142, 145, 143,
-143, 150, 147, 147, 147, 145, 145, 147, 145, 145,
-150, 147, 147, 150, 146, 146, 150, 147, 147, 150,
-146, 146, 150, 146, 146, 150, 146, 146, 149, 146,
-146, 150, 146, 146, 151, 147, 147, 151, 147, 147,
-150, 146, 146, 149, 146, 146, 149, 146, 146, 150,
-146, 146, 151, 147, 147, 151, 147, 147, 148, 145,
-145, 150, 146, 146, 149, 146, 146, 147, 144, 144,
-147, 144, 144, 142, 140, 140, 133, 133, 133, 126,
-126, 126, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 125, 125, 125, 133, 132, 132,
-143, 141, 141, 152, 147, 147, 151, 147, 147, 152,
-147, 147, 151, 147, 147, 149, 146, 146, 150, 146,
-146, 149, 146, 146, 147, 145, 145, 148, 145, 145,
-149, 146, 146, 151, 147, 147, 151, 147, 147, 152,
-147, 147, 152, 147, 147, 152, 147, 147, 152, 148,
-148, 151, 147, 147, 151, 147, 147, 150, 147, 147,
-152, 148, 148, 152, 148, 148, 149, 146, 146, 149,
-146, 146, 149, 146, 146, 149, 146, 146, 146, 144,
-144, 145, 143, 143, 146, 144, 144, 148, 145, 145,
-150, 147, 147, 150, 147, 147, 149, 146, 146, 148,
-145, 145, 152, 148, 148, 155, 149, 149, 156, 150,
-150, 154, 149, 149, 152, 148, 148, 152, 149, 149,
-152, 149, 149, 152, 148, 148, 152, 148, 148, 150,
-147, 147, 149, 146, 146, 146, 144, 144, 144, 143,
-143, 145, 143, 143, 146, 144, 144, 148, 146, 146,
-150, 147, 147, 149, 146, 146, 147, 145, 145, 150,
-147, 147, 150, 147, 147, 150, 147, 147, 156, 150,
-150, 156, 150, 150, 150, 147, 147, 154, 150, 150,
-156, 151, 151, 156, 151, 151, 151, 148, 148, 146,
-145, 145, 145, 144, 144, 150, 147, 147, 155, 150,
-150, 154, 149, 149, 151, 148, 148, 147, 145, 145,
-147, 145, 145, 147, 145, 145, 147, 145, 145, 145,
-144, 144, 147, 145, 145, 155, 150, 150, 153, 149,
-149, 149, 147, 147, 154, 150, 150, 155, 151, 151,
-153, 150, 150, 155, 151, 151, 153, 150, 150, 149,
-146, 146, 146, 144, 144, 144, 143, 143, 142, 141,
-141, 144, 143, 143, 147, 145, 145, 149, 147, 147,
-151, 148, 148, 153, 149, 149, 155, 150, 150, 155,
-150, 150, 151, 148, 148, 151, 148, 148, 153, 149,
-149, 156, 151, 151, 156, 151, 151, 152, 149, 149,
-143, 142, 142, 150, 147, 147, 162, 153, 153, 162,
-153, 153, 156, 151, 151, 149, 147, 147, 152, 149,
-149, 152, 149, 149, 149, 147, 147, 153, 149, 149,
-154, 150, 150, 148, 146, 146, 145, 143, 143, 144,
-143, 143, 154, 150, 150, 151, 148, 148, 143, 142,
-142, 146, 145, 145, 147, 145, 145, 144, 143, 143,
-144, 143, 143, 146, 144, 144, 149, 147, 147, 151,
-147, 147, 152, 148, 148, 154, 149, 149, 153, 149,
-149, 153, 149, 149, 156, 150, 150, 156, 150, 150,
-152, 149, 149, 153, 150, 150, 154, 150, 150, 153,
-149, 149, 155, 151, 151, 155, 151, 151, 149, 147,
-147, 150, 147, 147, 153, 149, 149, 155, 150, 150,
-156, 151, 151, 155, 150, 150, 157, 151, 151, 156,
-150, 150, 153, 149, 149, 152, 148, 148, 153, 149,
-149, 153, 149, 149, 154, 150, 150, 154, 149, 149,
-148, 146, 146, 144, 143, 143, 143, 141, 141, 148,
-146, 146, 149, 146, 146, 146, 145, 145, 151, 148,
-148, 153, 149, 149, 151, 148, 148, 152, 148, 148,
-151, 148, 148, 148, 145, 145, 147, 145, 145, 148,
-146, 146, 150, 147, 147, 153, 148, 148, 156, 150,
-150, 155, 149, 149, 150, 146, 146, 144, 142, 142,
-144, 142, 142, 145, 143, 143, 145, 143, 143, 142,
-141, 141, 141, 140, 140, 148, 145, 145, 150, 147,
-147, 148, 145, 145, 146, 144, 144, 147, 144, 144,
-151, 147, 147, 153, 148, 148, 153, 148, 148, 153,
-148, 148, 153, 148, 148, 152, 148, 148, 151, 147,
-147, 153, 148, 148, 155, 149, 149, 152, 147, 147,
-151, 147, 147, 151, 147, 147, 152, 148, 148, 150,
-146, 146, 146, 144, 144, 146, 144, 144, 146, 144,
-144, 144, 142, 142, 144, 142, 142, 138, 137, 137,
-130, 130, 130, 125, 125, 125, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-125, 125, 125, 132, 132, 132, 141, 140, 140, 149,
-146, 146, 149, 146, 146, 150, 146, 146, 150, 147,
-147, 150, 146, 146, 150, 147, 147, 150, 147, 147,
-150, 147, 147, 151, 147, 147, 150, 146, 146, 148,
-145, 145, 150, 146, 146, 151, 147, 147, 153, 148,
-148, 151, 147, 147, 149, 146, 146, 150, 147, 147,
-149, 146, 146, 149, 146, 146, 152, 148, 148, 151,
-147, 147, 150, 147, 147, 149, 146, 146, 151, 147,
-147, 152, 148, 148, 149, 146, 146, 147, 145, 145,
-145, 143, 143, 145, 143, 143, 147, 144, 144, 149,
-146, 146, 152, 148, 148, 153, 149, 149, 155, 150,
-150, 156, 151, 151, 156, 150, 150, 155, 150, 150,
-156, 151, 151, 155, 150, 150, 153, 149, 149, 152,
-148, 148, 152, 148, 148, 152, 149, 149, 150, 147,
-147, 149, 146, 146, 149, 146, 146, 151, 148, 148,
-153, 149, 149, 153, 149, 149, 151, 148, 148, 151,
-147, 147, 150, 147, 147, 152, 148, 148, 153, 149,
-149, 150, 148, 148, 150, 147, 147, 154, 149, 149,
-160, 153, 153, 160, 153, 153, 155, 150, 150, 151,
-148, 148, 148, 146, 146, 146, 145, 145, 149, 147,
-147, 152, 148, 148, 155, 150, 150, 154, 150, 150,
-152, 149, 149, 148, 146, 146, 146, 145, 145, 146,
-145, 145, 150, 147, 147, 153, 149, 149, 156, 150,
-150, 156, 151, 151, 155, 150, 150, 153, 149, 149,
-152, 148, 148, 151, 148, 148, 151, 148, 148, 150,
-147, 147, 150, 147, 147, 150, 147, 147, 148, 146,
-146, 144, 143, 143, 139, 138, 138, 144, 143, 143,
-148, 146, 146, 149, 147, 147, 146, 144, 144, 144,
-143, 143, 144, 143, 143, 152, 148, 148, 156, 151,
-151, 153, 149, 149, 150, 147, 147, 148, 146, 146,
-152, 148, 148, 154, 150, 150, 156, 151, 151, 156,
-151, 151, 153, 149, 149, 150, 147, 147, 151, 148,
-148, 150, 147, 147, 147, 145, 145, 152, 149, 149,
-155, 150, 150, 156, 151, 151, 155, 150, 150, 154,
-150, 150, 153, 149, 149, 148, 146, 146, 145, 144,
-144, 146, 144, 144, 147, 145, 145, 148, 146, 146,
-146, 144, 144, 146, 144, 144, 147, 145, 145, 149,
-147, 147, 151, 148, 148, 152, 149, 149, 151, 148,
-148, 155, 150, 150, 158, 152, 152, 152, 148, 148,
-150, 147, 147, 150, 148, 148, 150, 148, 148, 150,
-148, 148, 150, 147, 147, 146, 144, 144, 146, 144,
-144, 149, 147, 147, 150, 147, 147, 152, 149, 149,
-157, 152, 152, 158, 152, 152, 156, 151, 151, 147,
-145, 145, 149, 146, 146, 151, 148, 148, 151, 148,
-148, 150, 147, 147, 148, 145, 145, 148, 146, 146,
-151, 148, 148, 154, 149, 149, 151, 148, 148, 151,
-148, 148, 151, 148, 148, 149, 146, 146, 150, 147,
-147, 152, 148, 148, 149, 146, 146, 146, 144, 144,
-142, 141, 141, 144, 143, 143, 146, 145, 145, 148,
-145, 145, 152, 148, 148, 156, 150, 150, 157, 150,
-150, 154, 149, 149, 151, 147, 147, 151, 148, 148,
-147, 145, 145, 145, 143, 143, 146, 144, 144, 150,
-147, 147, 153, 148, 148, 154, 149, 149, 152, 148,
-148, 149, 146, 146, 149, 146, 146, 151, 147, 147,
-154, 149, 149, 154, 149, 149, 153, 148, 148, 152,
-147, 147, 151, 147, 147, 152, 148, 148, 153, 148,
-148, 150, 146, 146, 150, 146, 146, 151, 147, 147,
-152, 148, 148, 151, 147, 147, 149, 146, 146, 149,
-146, 146, 148, 145, 145, 148, 145, 145, 147, 144,
-144, 139, 138, 138, 131, 131, 131, 125, 125, 125,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 131,
-131, 131, 139, 138, 138, 148, 145, 145, 148, 145,
-145, 150, 146, 146, 151, 147, 147, 150, 146, 146,
-149, 146, 146, 149, 146, 146, 150, 146, 146, 151,
-147, 147, 149, 146, 146, 147, 144, 144, 150, 146,
-146, 151, 148, 148, 151, 147, 147, 148, 145, 145,
-148, 145, 145, 150, 147, 147, 150, 147, 147, 150,
-147, 147, 151, 147, 147, 153, 148, 148, 154, 149,
-149, 154, 149, 149, 155, 150, 150, 154, 149, 149,
-152, 148, 148, 152, 148, 148, 150, 147, 147, 149,
-146, 146, 154, 150, 150, 156, 151, 151, 154, 149,
-149, 150, 147, 147, 150, 147, 147, 152, 149, 149,
-152, 148, 148, 153, 149, 149, 154, 150, 150, 155,
-150, 150, 155, 150, 150, 156, 151, 151, 158, 151,
-151, 157, 151, 151, 156, 150, 150, 153, 149, 149,
-153, 149, 149, 152, 149, 149, 151, 148, 148, 151,
-147, 147, 150, 147, 147, 149, 147, 147, 152, 149,
-149, 154, 150, 150, 147, 145, 145, 143, 142, 142,
-146, 145, 145, 156, 151, 151, 159, 153, 153, 156,
-151, 151, 155, 150, 150, 152, 149, 149, 149, 146,
-146, 147, 145, 145, 146, 145, 145, 148, 146, 146,
-152, 149, 149, 152, 149, 149, 150, 148, 148, 149,
-147, 147, 149, 146, 146, 150, 147, 147, 156, 151,
-151, 158, 152, 152, 155, 150, 150, 151, 148, 148,
-150, 147, 147, 151, 148, 148, 152, 149, 149, 154,
-150, 150, 154, 150, 150, 150, 147, 147, 152, 149,
-149, 156, 151, 151, 155, 150, 150, 154, 150, 150,
-153, 149, 149, 150, 147, 147, 146, 144, 144, 143,
-142, 142, 145, 144, 144, 148, 146, 146, 151, 148,
-148, 149, 147, 147, 152, 149, 149, 155, 150, 150,
-152, 149, 149, 153, 150, 150, 154, 150, 150, 148,
-146, 146, 149, 147, 147, 151, 148, 148, 153, 149,
-149, 152, 148, 148, 151, 148, 148, 155, 150, 150,
-157, 151, 151, 159, 152, 152, 161, 154, 154, 158,
-152, 152, 155, 151, 151, 161, 153, 153, 161, 153,
-153, 159, 152, 152, 160, 153, 153, 155, 151, 151,
-151, 148, 148, 151, 148, 148, 150, 147, 147, 149,
-147, 147, 149, 147, 147, 151, 148, 148, 154, 150,
-150, 155, 150, 150, 154, 150, 150, 153, 149, 149,
-154, 150, 150, 151, 148, 148, 149, 147, 147, 149,
-147, 147, 151, 148, 148, 154, 150, 150, 155, 150,
-150, 156, 151, 151, 157, 151, 151, 156, 151, 151,
-154, 150, 150, 152, 149, 149, 151, 148, 148, 153,
-149, 149, 153, 150, 150, 148, 146, 146, 145, 144,
-144, 144, 143, 143, 145, 144, 144, 152, 148, 148,
-157, 151, 151, 156, 151, 151, 157, 151, 151, 155,
-150, 150, 150, 147, 147, 152, 149, 149, 154, 149,
-149, 152, 148, 148, 151, 148, 148, 150, 147, 147,
-152, 148, 148, 153, 149, 149, 154, 149, 149, 156,
-150, 150, 155, 150, 150, 152, 148, 148, 149, 147,
-147, 149, 146, 146, 151, 147, 147, 150, 147, 147,
-150, 147, 147, 151, 148, 148, 152, 148, 148, 153,
-148, 148, 151, 148, 148, 148, 145, 145, 146, 144,
-144, 149, 146, 146, 153, 149, 149, 156, 150, 150,
-154, 149, 149, 150, 147, 147, 149, 146, 146, 149,
-146, 146, 146, 144, 144, 145, 143, 143, 148, 145,
-145, 151, 147, 147, 154, 149, 149, 154, 149, 149,
-153, 149, 149, 154, 149, 149, 152, 148, 148, 149,
-146, 146, 147, 144, 144, 138, 138, 138, 131, 131,
-131, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 129, 129, 129, 137, 137,
-137, 145, 143, 143, 147, 145, 145, 148, 145, 145,
-149, 146, 146, 149, 146, 146, 150, 147, 147, 150,
-147, 147, 151, 148, 148, 152, 148, 148, 151, 147,
-147, 151, 147, 147, 151, 148, 148, 152, 148, 148,
-151, 147, 147, 150, 147, 147, 149, 146, 146, 148,
-145, 145, 150, 147, 147, 152, 148, 148, 154, 149,
-149, 154, 149, 149, 153, 148, 148, 150, 147, 147,
-147, 145, 145, 148, 145, 145, 151, 148, 148, 154,
-149, 149, 151, 148, 148, 153, 149, 149, 157, 151,
-151, 155, 150, 150, 152, 148, 148, 149, 146, 146,
-151, 147, 147, 153, 149, 149, 154, 149, 149, 152,
-149, 149, 151, 148, 148, 150, 147, 147, 151, 148,
-148, 151, 148, 148, 150, 147, 147, 147, 145, 145,
-151, 148, 148, 153, 149, 149, 152, 148, 148, 152,
-149, 149, 151, 148, 148, 150, 147, 147, 152, 149,
-149, 155, 151, 151, 157, 152, 152, 155, 151, 151,
-151, 148, 148, 151, 148, 148, 160, 153, 153, 160,
-153, 153, 157, 152, 152, 158, 152, 152, 155, 151,
-151, 153, 149, 149, 152, 149, 149, 152, 148, 148,
-152, 149, 149, 153, 149, 149, 152, 149, 149, 156,
-151, 151, 163, 154, 154, 159, 153, 153, 155, 150,
-150, 152, 149, 149, 153, 149, 149, 153, 149, 149,
-152, 148, 148, 150, 147, 147, 149, 147, 147, 149,
-147, 147, 150, 147, 147, 152, 149, 149, 153, 150,
-150, 154, 150, 150, 153, 149, 149, 154, 150, 150,
-155, 150, 150, 154, 150, 150, 154, 150, 150, 154,
-150, 150, 149, 147, 147, 149, 147, 147, 152, 149,
-149, 153, 150, 150, 157, 152, 152, 160, 153, 153,
-156, 151, 151, 155, 151, 151, 154, 150, 150, 155,
-151, 151, 155, 151, 151, 153, 150, 150, 149, 147,
-147, 149, 147, 147, 152, 149, 149, 156, 151, 151,
-154, 150, 150, 150, 148, 148, 146, 144, 144, 150,
-148, 148, 152, 149, 149, 152, 149, 149, 150, 147,
-147, 152, 149, 149, 154, 150, 150, 148, 146, 146,
-153, 149, 149, 159, 153, 153, 157, 152, 152, 153,
-150, 150, 151, 148, 148, 153, 149, 149, 156, 151,
-151, 158, 152, 152, 159, 152, 152, 152, 149, 149,
-147, 145, 145, 145, 144, 144, 151, 148, 148, 152,
-149, 149, 149, 146, 146, 147, 145, 145, 147, 145,
-145, 149, 146, 146, 154, 150, 150, 155, 150, 150,
-153, 150, 150, 154, 150, 150, 154, 150, 150, 152,
-149, 149, 150, 148, 148, 149, 147, 147, 149, 146,
-146, 150, 147, 147, 153, 149, 149, 152, 148, 148,
-149, 146, 146, 148, 145, 145, 147, 145, 145, 149,
-146, 146, 152, 148, 148, 153, 149, 149, 153, 149,
-149, 153, 149, 149, 154, 150, 150, 156, 151, 151,
-156, 150, 150, 155, 150, 150, 154, 149, 149, 149,
-146, 146, 149, 146, 146, 149, 146, 146, 150, 147,
-147, 151, 148, 148, 151, 147, 147, 152, 148, 148,
-150, 147, 147, 148, 145, 145, 147, 144, 144, 146,
-144, 144, 146, 144, 144, 148, 146, 146, 150, 146,
-146, 152, 148, 148, 153, 148, 148, 151, 147, 147,
-152, 148, 148, 151, 147, 147, 148, 145, 145, 149,
-146, 146, 153, 149, 149, 157, 151, 151, 158, 151,
-151, 157, 150, 150, 154, 149, 149, 155, 149, 149,
-154, 149, 149, 153, 148, 148, 149, 146, 146, 139,
-138, 138, 130, 130, 130, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 128, 128, 128, 134, 134, 134, 141, 140, 140,
-146, 144, 144, 147, 145, 145, 148, 145, 145, 151,
-147, 147, 153, 149, 149, 154, 150, 150, 152, 148,
-148, 149, 146, 146, 148, 145, 145, 151, 147, 147,
-155, 149, 149, 158, 150, 150, 156, 150, 150, 155,
-150, 150, 152, 148, 148, 149, 146, 146, 146, 144,
-144, 148, 145, 145, 150, 147, 147, 152, 148, 148,
-150, 147, 147, 149, 146, 146, 146, 145, 145, 145,
-144, 144, 149, 147, 147, 151, 147, 147, 148, 146,
-146, 151, 147, 147, 149, 146, 146, 149, 146, 146,
-154, 149, 149, 152, 148, 148, 151, 148, 148, 154,
-150, 150, 157, 151, 151, 155, 150, 150, 152, 149,
-149, 153, 149, 149, 152, 148, 148, 151, 147, 147,
-153, 149, 149, 155, 150, 150, 155, 151, 151, 152,
-149, 149, 151, 148, 148, 149, 147, 147, 148, 146,
-146, 149, 147, 147, 152, 149, 149, 154, 150, 150,
-154, 150, 150, 156, 151, 151, 159, 152, 152, 163,
-154, 154, 159, 152, 152, 156, 151, 151, 155, 150,
-150, 152, 149, 149, 151, 148, 148, 151, 148, 148,
-152, 149, 149, 155, 151, 151, 156, 151, 151, 151,
-148, 148, 154, 150, 150, 156, 151, 151, 155, 150,
-150, 153, 149, 149, 151, 148, 148, 152, 149, 149,
-158, 152, 152, 154, 149, 149, 149, 147, 147, 148,
-146, 146, 148, 146, 146, 153, 149, 149, 161, 154,
-154, 158, 153, 153, 157, 152, 152, 156, 151, 151,
-153, 150, 150, 154, 150, 150, 154, 150, 150, 149,
-147, 147, 151, 148, 148, 154, 150, 150, 154, 150,
-150, 150, 148, 148, 148, 146, 146, 149, 147, 147,
-155, 151, 151, 154, 150, 150, 152, 149, 149, 153,
-150, 150, 156, 151, 151, 158, 152, 152, 157, 152,
-152, 159, 152, 152, 158, 153, 153, 157, 152, 152,
-160, 153, 153, 157, 152, 152, 155, 151, 151, 157,
-152, 152, 155, 151, 151, 153, 150, 150, 151, 148,
-148, 151, 148, 148, 151, 148, 148, 151, 148, 148,
-153, 149, 149, 157, 152, 152, 157, 152, 152, 149,
-147, 147, 148, 146, 146, 148, 146, 146, 146, 145,
-145, 146, 144, 144, 146, 145, 145, 147, 146, 146,
-149, 147, 147, 150, 147, 147, 150, 147, 147, 149,
-146, 146, 147, 145, 145, 147, 145, 145, 149, 147,
-147, 152, 149, 149, 153, 149, 149, 151, 148, 148,
-153, 150, 150, 154, 150, 150, 154, 150, 150, 153,
-150, 150, 153, 149, 149, 155, 151, 151, 160, 153,
-153, 159, 152, 152, 153, 149, 149, 148, 145, 145,
-146, 144, 144, 149, 146, 146, 152, 148, 148, 154,
-149, 149, 153, 149, 149, 153, 148, 148, 153, 149,
-149, 152, 148, 148, 154, 149, 149, 156, 150, 150,
-156, 150, 150, 154, 149, 149, 152, 148, 148, 152,
-148, 148, 152, 148, 148, 149, 147, 147, 146, 145,
-145, 149, 146, 146, 150, 147, 147, 150, 147, 147,
-152, 148, 148, 151, 147, 147, 149, 146, 146, 146,
-144, 144, 148, 145, 145, 149, 146, 146, 149, 146,
-146, 151, 148, 148, 154, 149, 149, 155, 150, 150,
-154, 149, 149, 154, 150, 150, 157, 151, 151, 159,
-152, 152, 160, 152, 152, 157, 151, 151, 156, 150,
-150, 154, 149, 149, 154, 149, 149, 155, 149, 149,
-150, 146, 146, 139, 138, 138, 129, 129, 129, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 127, 127, 127,
-135, 134, 134, 143, 141, 141, 148, 146, 146, 149,
-146, 146, 150, 147, 147, 150, 147, 147, 150, 147,
-147, 151, 148, 148, 151, 148, 148, 150, 146, 146,
-150, 146, 146, 149, 146, 146, 148, 146, 146, 149,
-146, 146, 151, 148, 148, 153, 149, 149, 151, 148,
-148, 152, 148, 148, 153, 149, 149, 155, 150, 150,
-154, 149, 149, 155, 150, 150, 154, 149, 149, 152,
-148, 148, 153, 149, 149, 154, 149, 149, 153, 149,
-149, 151, 148, 148, 150, 147, 147, 149, 147, 147,
-147, 145, 145, 146, 144, 144, 148, 145, 145, 152,
-148, 148, 151, 148, 148, 151, 148, 148, 150, 147,
-147, 149, 147, 147, 150, 147, 147, 150, 147, 147,
-152, 149, 149, 153, 149, 149, 153, 149, 149, 153,
-149, 149, 152, 149, 149, 154, 149, 149, 154, 150,
-150, 152, 149, 149, 151, 148, 148, 152, 149, 149,
-152, 149, 149, 147, 145, 145, 150, 147, 147, 150,
-147, 147, 149, 147, 147, 151, 148, 148, 149, 146,
-146, 146, 144, 144, 143, 142, 142, 151, 148, 148,
-153, 149, 149, 152, 149, 149, 151, 148, 148, 153,
-149, 149, 155, 150, 150, 152, 149, 149, 147, 145,
-145, 150, 147, 147, 158, 152, 152, 158, 152, 152,
-156, 151, 151, 152, 149, 149, 146, 145, 145, 146,
-144, 144, 144, 143, 143, 142, 141, 141, 148, 146,
-146, 152, 149, 149, 153, 149, 149, 152, 149, 149,
-153, 149, 149, 153, 149, 149, 152, 148, 148, 152,
-148, 148, 146, 144, 144, 141, 141, 141, 142, 141,
-141, 151, 148, 148, 154, 150, 150, 155, 151, 151,
-157, 152, 152, 161, 153, 153, 161, 154, 154, 157,
-152, 152, 153, 150, 150, 147, 145, 145, 141, 140,
-140, 143, 142, 142, 150, 147, 147, 151, 148, 148,
-143, 142, 142, 150, 147, 147, 155, 151, 151, 157,
-152, 152, 149, 147, 147, 153, 149, 149, 154, 150,
-150, 149, 147, 147, 147, 145, 145, 149, 147, 147,
-153, 150, 150, 156, 151, 151, 152, 148, 148, 151,
-148, 148, 158, 152, 152, 156, 151, 151, 154, 150,
-150, 153, 149, 149, 151, 148, 148, 151, 148, 148,
-151, 148, 148, 150, 148, 148, 147, 145, 145, 150,
-147, 147, 152, 149, 149, 143, 142, 142, 142, 141,
-141, 144, 143, 143, 151, 148, 148, 150, 147, 147,
-152, 148, 148, 153, 149, 149, 152, 149, 149, 152,
-149, 149, 153, 150, 150, 155, 150, 150, 158, 152,
-152, 152, 149, 149, 146, 144, 144, 146, 144, 144,
-147, 145, 145, 149, 146, 146, 148, 146, 146, 150,
-147, 147, 148, 146, 146, 147, 145, 145, 152, 148,
-148, 152, 148, 148, 150, 147, 147, 149, 147, 147,
-145, 143, 143, 146, 144, 144, 148, 145, 145, 148,
-146, 146, 150, 147, 147, 151, 148, 148, 153, 149,
-149, 153, 149, 149, 154, 149, 149, 155, 150, 150,
-157, 151, 151, 154, 149, 149, 154, 149, 149, 156,
-150, 150, 154, 149, 149, 153, 148, 148, 153, 148,
-148, 154, 149, 149, 154, 149, 149, 154, 149, 149,
-154, 149, 149, 152, 148, 148, 152, 148, 148, 152,
-148, 148, 153, 148, 148, 153, 149, 149, 151, 148,
-148, 150, 147, 147, 144, 143, 143, 135, 135, 135,
-127, 127, 127, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 127, 127, 127, 135, 135, 135, 143,
-142, 142, 149, 146, 146, 149, 146, 146, 149, 146,
-146, 149, 146, 146, 149, 146, 146, 149, 146, 146,
-148, 145, 145, 147, 145, 145, 146, 144, 144, 145,
-144, 144, 145, 144, 144, 145, 143, 143, 146, 144,
-144, 147, 145, 145, 150, 147, 147, 155, 150, 150,
-158, 152, 152, 155, 150, 150, 152, 148, 148, 149,
-147, 147, 151, 148, 148, 153, 149, 149, 153, 149,
-149, 152, 149, 149, 152, 148, 148, 151, 148, 148,
-149, 146, 146, 149, 146, 146, 150, 147, 147, 150,
-147, 147, 151, 148, 148, 149, 147, 147, 148, 146,
-146, 149, 147, 147, 150, 147, 147, 152, 148, 148,
-153, 149, 149, 149, 147, 147, 149, 146, 146, 149,
-147, 147, 150, 147, 147, 150, 147, 147, 153, 149,
-149, 156, 151, 151, 158, 151, 151, 153, 149, 149,
-150, 148, 148, 151, 148, 148, 155, 151, 151, 152,
-149, 149, 151, 148, 148, 151, 148, 148, 152, 149,
-149, 151, 148, 148, 153, 149, 149, 156, 151, 151,
-148, 146, 146, 147, 145, 145, 148, 146, 146, 150,
-147, 147, 150, 147, 147, 152, 149, 149, 153, 149,
-149, 151, 148, 148, 153, 149, 149, 154, 150, 150,
-154, 150, 150, 151, 149, 149, 150, 147, 147, 151,
-148, 148, 152, 149, 149, 154, 150, 150, 157, 152,
-152, 155, 151, 151, 150, 147, 147, 156, 151, 151,
-157, 152, 152, 154, 150, 150, 151, 148, 148, 148,
-146, 146, 148, 146, 146, 148, 146, 146, 149, 147,
-147, 151, 148, 148, 151, 148, 148, 148, 146, 146,
-151, 148, 148, 150, 148, 148, 150, 148, 148, 153,
-149, 149, 155, 151, 151, 149, 147, 147, 143, 142,
-142, 144, 143, 143, 149, 147, 147, 154, 150, 150,
-157, 152, 152, 159, 153, 153, 157, 152, 152, 158,
-152, 152, 161, 153, 153, 159, 153, 153, 158, 152,
-152, 155, 151, 151, 151, 148, 148, 146, 144, 144,
-147, 145, 145, 151, 148, 148, 154, 150, 150, 159,
-152, 152, 157, 151, 151, 153, 149, 149, 151, 148,
-148, 153, 149, 149, 154, 150, 150, 153, 150, 150,
-152, 149, 149, 153, 150, 150, 154, 150, 150, 153,
-149, 149, 155, 150, 150, 151, 148, 148, 147, 145,
-145, 145, 143, 143, 150, 147, 147, 151, 148, 148,
-151, 149, 149, 151, 148, 148, 151, 148, 148, 152,
-148, 148, 151, 148, 148, 150, 147, 147, 148, 146,
-146, 147, 145, 145, 148, 146, 146, 151, 148, 148,
-151, 148, 148, 151, 148, 148, 152, 148, 148, 152,
-148, 148, 150, 147, 147, 148, 146, 146, 147, 145,
-145, 146, 144, 144, 147, 145, 145, 151, 148, 148,
-151, 148, 148, 152, 148, 148, 151, 148, 148, 149,
-146, 146, 150, 147, 147, 151, 148, 148, 151, 147,
-147, 150, 147, 147, 152, 148, 148, 153, 149, 149,
-154, 150, 150, 154, 149, 149, 154, 149, 149, 152,
-148, 148, 152, 148, 148, 152, 147, 147, 152, 147,
-147, 151, 148, 148, 150, 147, 147, 148, 145, 145,
-147, 145, 145, 148, 145, 145, 149, 146, 146, 149,
-146, 146, 149, 146, 146, 148, 146, 146, 142, 141,
-141, 134, 134, 134, 127, 127, 127, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 121, 121, 121, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 134, 134, 134, 142, 141, 141, 149, 146,
-146, 148, 145, 145, 147, 145, 145, 148, 145, 145,
-149, 146, 146, 150, 146, 146, 147, 144, 144, 144,
-142, 142, 142, 141, 141, 142, 141, 141, 142, 141,
-141, 143, 142, 142, 147, 145, 145, 148, 145, 145,
-148, 146, 146, 150, 147, 147, 149, 146, 146, 147,
-145, 145, 144, 143, 143, 144, 142, 142, 149, 146,
-146, 153, 149, 149, 154, 149, 149, 155, 150, 150,
-158, 151, 151, 158, 151, 151, 156, 151, 151, 153,
-149, 149, 149, 147, 147, 147, 145, 145, 148, 146,
-146, 150, 148, 148, 151, 148, 148, 147, 145, 145,
-143, 142, 142, 145, 143, 143, 149, 146, 146, 150,
-147, 147, 150, 147, 147, 152, 149, 149, 152, 149,
-149, 154, 150, 150, 154, 150, 150, 152, 149, 149,
-152, 149, 149, 152, 148, 148, 150, 148, 148, 147,
-145, 145, 151, 148, 148, 154, 150, 150, 156, 151,
-151, 155, 150, 150, 150, 147, 147, 149, 147, 147,
-151, 148, 148, 152, 148, 148, 148, 146, 146, 146,
-144, 144, 145, 144, 144, 149, 147, 147, 149, 147,
-147, 148, 146, 146, 150, 147, 147, 154, 150, 150,
-154, 150, 150, 151, 148, 148, 150, 147, 147, 151,
-148, 148, 149, 147, 147, 148, 146, 146, 152, 149,
-149, 157, 152, 152, 154, 150, 150, 151, 148, 148,
-151, 148, 148, 152, 149, 149, 150, 148, 148, 145,
-144, 144, 145, 144, 144, 149, 147, 147, 152, 148,
-148, 152, 149, 149, 152, 149, 149, 151, 148, 148,
-152, 148, 148, 155, 151, 151, 152, 149, 149, 146,
-144, 144, 145, 144, 144, 148, 146, 146, 149, 147,
-147, 150, 147, 147, 155, 151, 151, 157, 152, 152,
-157, 152, 152, 157, 152, 152, 158, 152, 152, 156,
-151, 151, 155, 150, 150, 154, 150, 150, 153, 149,
-149, 155, 150, 150, 152, 149, 149, 147, 145, 145,
-148, 146, 146, 149, 147, 147, 149, 147, 147, 149,
-147, 147, 154, 150, 150, 155, 150, 150, 154, 150,
-150, 153, 149, 149, 157, 151, 151, 154, 150, 150,
-152, 149, 149, 154, 149, 149, 157, 151, 151, 157,
-151, 151, 154, 150, 150, 152, 149, 149, 152, 149,
-149, 150, 147, 147, 148, 146, 146, 150, 147, 147,
-156, 150, 150, 154, 150, 150, 152, 149, 149, 152,
-149, 149, 153, 149, 149, 153, 149, 149, 153, 149,
-149, 153, 149, 149, 151, 148, 148, 150, 148, 148,
-151, 148, 148, 151, 148, 148, 152, 148, 148, 152,
-148, 148, 153, 149, 149, 151, 148, 148, 148, 146,
-146, 148, 146, 146, 147, 145, 145, 147, 145, 145,
-150, 147, 147, 152, 148, 148, 152, 148, 148, 149,
-146, 146, 143, 142, 142, 143, 142, 142, 147, 145,
-145, 150, 147, 147, 151, 148, 148, 152, 148, 148,
-151, 148, 148, 152, 148, 148, 153, 149, 149, 150,
-147, 147, 149, 146, 146, 148, 146, 146, 148, 145,
-145, 148, 145, 145, 149, 146, 146, 147, 145, 145,
-146, 144, 144, 146, 144, 144, 146, 144, 144, 146,
-144, 144, 140, 139, 139, 133, 133, 133, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 121, 121, 121, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 121, 121, 121, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 132, 132,
-132, 140, 139, 139, 148, 145, 145, 148, 145, 145,
-148, 145, 145, 149, 146, 146, 151, 147, 147, 153,
-148, 148, 150, 147, 147, 148, 145, 145, 147, 145,
-145, 147, 145, 145, 147, 145, 145, 148, 145, 145,
-149, 146, 146, 150, 147, 147, 151, 148, 148, 152,
-148, 148, 152, 148, 148, 151, 148, 148, 151, 147,
-147, 152, 148, 148, 154, 149, 149, 154, 149, 149,
-154, 149, 149, 154, 149, 149, 154, 149, 149, 154,
-150, 150, 154, 150, 150, 150, 147, 147, 145, 144,
-144, 145, 143, 143, 149, 147, 147, 153, 149, 149,
-151, 148, 148, 148, 146, 146, 148, 146, 146, 151,
-148, 148, 152, 149, 149, 152, 149, 149, 153, 150,
-150, 153, 149, 149, 153, 149, 149, 152, 149, 149,
-151, 148, 148, 150, 147, 147, 148, 146, 146, 149,
-147, 147, 151, 148, 148, 152, 149, 149, 153, 149,
-149, 152, 149, 149, 151, 148, 148, 151, 148, 148,
-152, 149, 149, 150, 147, 147, 148, 146, 146, 151,
-148, 148, 154, 150, 150, 154, 150, 150, 152, 149,
-149, 151, 148, 148, 151, 148, 148, 150, 148, 148,
-151, 148, 148, 152, 149, 149, 151, 148, 148, 152,
-149, 149, 155, 150, 150, 156, 151, 151, 155, 151,
-151, 156, 151, 151, 154, 150, 150, 153, 149, 149,
-152, 149, 149, 153, 150, 150, 151, 148, 148, 152,
-149, 149, 154, 150, 150, 151, 148, 148, 155, 151,
-151, 155, 151, 151, 154, 150, 150, 152, 149, 149,
-150, 148, 148, 152, 149, 149, 153, 150, 150, 155,
-151, 151, 155, 151, 151, 154, 150, 150, 155, 151,
-151, 156, 151, 151, 155, 151, 151, 157, 152, 152,
-154, 150, 150, 153, 150, 150, 155, 151, 151, 154,
-150, 150, 154, 150, 150, 154, 150, 150, 154, 150,
-150, 154, 150, 150, 151, 148, 148, 153, 150, 150,
-154, 150, 150, 152, 149, 149, 153, 149, 149, 151,
-148, 148, 154, 150, 150, 157, 152, 152, 156, 151,
-151, 155, 150, 150, 152, 148, 148, 151, 148, 148,
-156, 151, 151, 154, 150, 150, 155, 150, 150, 155,
-150, 150, 154, 150, 150, 154, 150, 150, 153, 149,
-149, 153, 149, 149, 152, 149, 149, 151, 148, 148,
-151, 148, 148, 151, 148, 148, 150, 148, 148, 150,
-147, 147, 151, 148, 148, 152, 149, 149, 150, 147,
-147, 148, 146, 146, 149, 147, 147, 149, 146, 146,
-148, 146, 146, 150, 147, 147, 152, 149, 149, 153,
-150, 150, 151, 148, 148, 150, 147, 147, 150, 147,
-147, 149, 146, 146, 149, 146, 146, 150, 147, 147,
-150, 147, 147, 150, 147, 147, 149, 147, 147, 149,
-146, 146, 150, 147, 147, 151, 148, 148, 151, 148,
-148, 153, 149, 149, 154, 149, 149, 153, 149, 149,
-152, 148, 148, 152, 148, 148, 152, 149, 149, 153,
-149, 149, 154, 149, 149, 155, 149, 149, 156, 150,
-150, 154, 149, 149, 152, 148, 148, 151, 147, 147,
-151, 147, 147, 151, 147, 147, 141, 140, 140, 133,
-133, 133, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 121, 121, 121, 121, 121, 121,
-121, 121, 121, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 127, 127, 127, 131, 131, 131, 139, 138, 138,
-147, 145, 145, 148, 146, 146, 148, 146, 146, 149,
-146, 146, 151, 148, 148, 154, 149, 149, 153, 149,
-149, 151, 148, 148, 151, 148, 148, 152, 148, 148,
-153, 149, 149, 151, 148, 148, 150, 147, 147, 152,
-148, 148, 153, 149, 149, 154, 149, 149, 155, 150,
-150, 155, 150, 150, 154, 150, 150, 155, 150, 150,
-157, 151, 151, 155, 150, 150, 153, 149, 149, 153,
-149, 149, 155, 150, 150, 156, 151, 151, 154, 150,
-150, 150, 147, 147, 147, 145, 145, 149, 147, 147,
-152, 149, 149, 154, 150, 150, 152, 149, 149, 151,
-148, 148, 152, 149, 149, 154, 150, 150, 153, 149,
-149, 155, 150, 150, 153, 150, 150, 153, 149, 149,
-154, 150, 150, 155, 150, 150, 152, 148, 148, 151,
-148, 148, 152, 149, 149, 154, 150, 150, 154, 150,
-150, 150, 148, 148, 149, 147, 147, 151, 148, 148,
-152, 149, 149, 153, 150, 150, 151, 148, 148, 150,
-148, 148, 151, 148, 148, 151, 148, 148, 155, 151,
-151, 153, 149, 149, 153, 150, 150, 155, 150, 150,
-154, 150, 150, 154, 150, 150, 151, 148, 148, 149,
-147, 147, 151, 148, 148, 155, 151, 151, 157, 152,
-152, 155, 151, 151, 152, 149, 149, 151, 148, 148,
-153, 150, 150, 152, 149, 149, 155, 150, 150, 156,
-151, 151, 155, 151, 151, 161, 154, 154, 160, 153,
-153, 155, 150, 150, 150, 148, 148, 150, 148, 148,
-156, 151, 151, 154, 150, 150, 152, 149, 149, 151,
-148, 148, 152, 149, 149, 154, 150, 150, 154, 150,
-150, 153, 149, 149, 153, 149, 149, 156, 151, 151,
-155, 150, 150, 154, 150, 150, 153, 150, 150, 152,
-149, 149, 154, 150, 150, 154, 150, 150, 154, 150,
-150, 153, 149, 149, 152, 149, 149, 151, 148, 148,
-148, 146, 146, 150, 148, 148, 154, 150, 150, 156,
-151, 151, 156, 151, 151, 157, 152, 152, 157, 152,
-152, 155, 151, 151, 154, 150, 150, 155, 151, 151,
-152, 149, 149, 152, 149, 149, 155, 150, 150, 156,
-151, 151, 153, 149, 149, 152, 149, 149, 153, 149,
-149, 153, 149, 149, 151, 148, 148, 150, 147, 147,
-150, 148, 148, 150, 148, 148, 150, 147, 147, 151,
-148, 148, 151, 148, 148, 151, 148, 148, 151, 148,
-148, 151, 148, 148, 149, 146, 146, 148, 146, 146,
-151, 148, 148, 155, 151, 151, 156, 151, 151, 152,
-149, 149, 150, 148, 148, 149, 146, 146, 148, 146,
-146, 147, 145, 145, 148, 146, 146, 150, 147, 147,
-150, 147, 147, 151, 147, 147, 151, 147, 147, 150,
-147, 147, 149, 146, 146, 152, 148, 148, 155, 150,
-150, 155, 150, 150, 153, 149, 149, 151, 148, 148,
-153, 149, 149, 155, 150, 150, 157, 151, 151, 158,
-152, 152, 160, 152, 152, 157, 151, 151, 155, 150,
-150, 154, 149, 149, 153, 149, 149, 152, 148, 148,
-141, 140, 140, 132, 132, 132, 127, 127, 127, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 121, 121, 121,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-130, 130, 130, 137, 137, 137, 147, 145, 145, 149,
-146, 146, 150, 147, 147, 151, 147, 147, 151, 148,
-148, 151, 148, 148, 151, 148, 148, 151, 148, 148,
-152, 149, 149, 155, 150, 150, 156, 151, 151, 155,
-150, 150, 152, 149, 149, 152, 148, 148, 153, 149,
-149, 154, 149, 149, 154, 150, 150, 155, 150, 150,
-156, 151, 151, 157, 151, 151, 158, 151, 151, 156,
-151, 151, 155, 150, 150, 154, 150, 150, 155, 150,
-150, 154, 150, 150, 151, 148, 148, 148, 146, 146,
-150, 148, 148, 153, 149, 149, 153, 150, 150, 152,
-149, 149, 150, 147, 147, 153, 149, 149, 156, 151,
-151, 158, 152, 152, 159, 153, 153, 160, 153, 153,
-158, 152, 152, 156, 151, 151, 155, 150, 150, 155,
-151, 151, 155, 150, 150, 156, 151, 151, 157, 152,
-152, 156, 151, 151, 156, 151, 151, 154, 150, 150,
-154, 150, 150, 154, 150, 150, 154, 150, 150, 154,
-150, 150, 155, 151, 151, 154, 150, 150, 152, 149,
-149, 156, 151, 151, 161, 153, 153, 160, 153, 153,
-159, 153, 153, 158, 152, 152, 154, 150, 150, 150,
-148, 148, 148, 146, 146, 153, 150, 150, 94, 90,
-90, 71, 67, 67, 68, 65, 65, 71, 67, 67,
-71, 67, 67, 73, 68, 68, 77, 72, 72, 81,
-74, 74, 75, 71, 71, 68, 65, 65, 68, 65,
-65, 69, 66, 66, 66, 63, 63, 66, 63, 63,
-70, 66, 66, 73, 69, 69, 72, 68, 68, 68,
-65, 65, 65, 63, 63, 67, 64, 64, 65, 62,
-62, 63, 60, 60, 58, 57, 57, 60, 58, 58,
-66, 63, 63, 67, 64, 64, 65, 62, 62, 108,
-105, 105, 153, 150, 150, 155, 151, 151, 155, 151,
-151, 153, 150, 150, 153, 149, 149, 157, 152, 152,
-163, 154, 154, 162, 154, 154, 160, 153, 153, 159,
-153, 153, 157, 152, 152, 156, 152, 152, 157, 152,
-152, 156, 152, 152, 157, 152, 152, 155, 151, 151,
-154, 150, 150, 153, 149, 149, 151, 148, 148, 151,
-148, 148, 152, 149, 149, 153, 149, 149, 154, 150,
-150, 154, 150, 150, 153, 150, 150, 152, 149, 149,
-150, 148, 148, 151, 148, 148, 153, 149, 149, 152,
-149, 149, 151, 148, 148, 149, 147, 147, 150, 147,
-147, 151, 148, 148, 154, 150, 150, 159, 152, 152,
-164, 154, 154, 158, 152, 152, 153, 149, 149, 150,
-148, 148, 149, 147, 147, 149, 147, 147, 151, 148,
-148, 152, 149, 149, 152, 149, 149, 152, 148, 148,
-151, 148, 148, 148, 146, 146, 146, 144, 144, 149,
-146, 146, 153, 149, 149, 156, 151, 151, 154, 150,
-150, 153, 149, 149, 153, 149, 149, 154, 150, 150,
-154, 150, 150, 156, 151, 151, 156, 151, 151, 156,
-150, 150, 155, 150, 150, 154, 149, 149, 151, 147,
-147, 147, 145, 145, 138, 137, 137, 131, 131, 131,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 130, 130, 130, 137,
-137, 137, 145, 144, 144, 149, 146, 146, 151, 148,
-148, 151, 148, 148, 151, 148, 148, 150, 147, 147,
-150, 147, 147, 149, 146, 146, 150, 147, 147, 152,
-148, 148, 153, 149, 149, 154, 150, 150, 156, 150,
-150, 154, 150, 150, 152, 149, 149, 151, 148, 148,
-150, 147, 147, 148, 146, 146, 150, 147, 147, 150,
-148, 148, 151, 148, 148, 151, 148, 148, 151, 148,
-148, 153, 149, 149, 155, 150, 150, 152, 149, 149,
-150, 147, 147, 150, 147, 147, 153, 149, 149, 154,
-150, 150, 152, 149, 149, 149, 147, 147, 149, 147,
-147, 150, 147, 147, 150, 148, 148, 151, 148, 148,
-152, 149, 149, 151, 148, 148, 151, 148, 148, 152,
-149, 149, 153, 149, 149, 154, 150, 150, 153, 150,
-150, 153, 149, 149, 152, 149, 149, 153, 149, 149,
-152, 149, 149, 153, 149, 149, 153, 150, 150, 151,
-148, 148, 150, 147, 147, 149, 147, 147, 150, 148,
-148, 150, 148, 148, 150, 148, 148, 107, 104, 104,
-65, 62, 62, 67, 64, 64, 67, 64, 64, 65,
-63, 63, 63, 61, 61, 64, 62, 62, 65, 63,
-63, 71, 67, 67, 80, 74, 74, 82, 75, 75,
-70, 66, 66, 62, 60, 60, 67, 64, 64, 73,
-69, 69, 73, 69, 69, 69, 66, 66, 64, 62,
-62, 61, 59, 59, 59, 57, 57, 67, 64, 64,
-71, 67, 67, 70, 66, 66, 70, 66, 66, 70,
-66, 66, 69, 65, 65, 69, 66, 66, 70, 66,
-66, 71, 67, 67, 73, 69, 69, 73, 69, 69,
-72, 67, 67, 72, 68, 68, 68, 65, 65, 66,
-63, 63, 67, 64, 64, 68, 65, 65, 68, 65,
-65, 67, 64, 64, 65, 62, 62, 64, 61, 61,
-109, 106, 106, 153, 150, 150, 154, 150, 150, 154,
-150, 150, 155, 151, 151, 154, 150, 150, 154, 150,
-150, 154, 150, 150, 153, 149, 149, 152, 149, 149,
-150, 148, 148, 148, 146, 146, 147, 145, 145, 148,
-146, 146, 148, 146, 146, 147, 145, 145, 147, 145,
-145, 146, 145, 145, 147, 145, 145, 147, 145, 145,
-148, 146, 146, 150, 147, 147, 152, 148, 148, 152,
-149, 149, 153, 149, 149, 155, 150, 150, 157, 151,
-151, 154, 150, 150, 151, 148, 148, 150, 147, 147,
-152, 149, 149, 155, 151, 151, 154, 150, 150, 153,
-149, 149, 153, 149, 149, 153, 149, 149, 152, 149,
-149, 152, 148, 148, 150, 147, 147, 154, 149, 149,
-158, 151, 151, 159, 152, 152, 157, 151, 151, 155,
-150, 150, 155, 150, 150, 155, 150, 150, 155, 150,
-150, 155, 150, 150, 155, 150, 150, 153, 149, 149,
-150, 147, 147, 150, 147, 147, 150, 147, 147, 150,
-147, 147, 151, 148, 148, 149, 147, 147, 139, 138,
-138, 131, 131, 131, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 129, 129, 129, 136, 136, 136, 143, 142,
-142, 148, 145, 145, 150, 147, 147, 150, 147, 147,
-151, 148, 148, 152, 148, 148, 151, 148, 148, 151,
-148, 148, 152, 148, 148, 153, 148, 148, 154, 149,
-149, 155, 150, 150, 156, 150, 150, 154, 149, 149,
-154, 149, 149, 153, 149, 149, 153, 149, 149, 153,
-149, 149, 152, 149, 149, 152, 148, 148, 152, 149,
-149, 153, 149, 149, 153, 149, 149, 154, 150, 150,
-154, 150, 150, 153, 149, 149, 152, 148, 148, 154,
-150, 150, 156, 150, 150, 154, 150, 150, 151, 148,
-148, 150, 147, 147, 151, 148, 148, 152, 148, 148,
-150, 147, 147, 149, 146, 146, 149, 146, 146, 149,
-147, 147, 150, 147, 147, 151, 148, 148, 151, 148,
-148, 151, 148, 148, 149, 147, 147, 149, 147, 147,
-150, 148, 148, 151, 148, 148, 153, 150, 150, 154,
-150, 150, 153, 149, 149, 88, 85, 85, 65, 62,
-62, 61, 59, 59, 62, 60, 60, 63, 60, 60,
-63, 60, 60, 63, 61, 61, 64, 62, 62, 67,
-64, 64, 68, 65, 65, 67, 64, 64, 66, 64,
-64, 67, 64, 64, 69, 65, 65, 70, 66, 66,
-69, 65, 65, 69, 65, 65, 70, 66, 66, 75,
-70, 70, 77, 71, 71, 68, 65, 65, 60, 59,
-59, 63, 61, 61, 64, 62, 62, 65, 63, 63,
-63, 60, 60, 63, 61, 61, 60, 58, 58, 60,
-58, 58, 65, 62, 62, 67, 64, 64, 66, 63,
-63, 60, 58, 58, 57, 56, 56, 63, 61, 61,
-68, 65, 65, 61, 59, 59, 54, 53, 53, 55,
-54, 54, 59, 58, 58, 62, 60, 60, 65, 62,
-62, 70, 66, 66, 68, 65, 65, 66, 63, 63,
-66, 63, 63, 67, 64, 64, 70, 66, 66, 73,
-68, 68, 136, 131, 131, 155, 150, 150, 153, 150,
-150, 153, 149, 149, 152, 149, 149, 152, 149, 149,
-152, 148, 148, 151, 148, 148, 150, 148, 148, 150,
-147, 147, 149, 147, 147, 148, 146, 146, 149, 147,
-147, 149, 147, 147, 151, 148, 148, 150, 147, 147,
-148, 146, 146, 148, 146, 146, 148, 146, 146, 149,
-147, 147, 151, 148, 148, 152, 148, 148, 150, 147,
-147, 148, 146, 146, 148, 146, 146, 147, 145, 145,
-149, 147, 147, 153, 149, 149, 155, 150, 150, 151,
-148, 148, 148, 146, 146, 147, 145, 145, 147, 146,
-146, 149, 147, 147, 152, 149, 149, 153, 149, 149,
-152, 148, 148, 151, 147, 147, 151, 147, 147, 150,
-147, 147, 150, 147, 147, 149, 146, 146, 149, 146,
-146, 150, 147, 147, 151, 148, 148, 152, 148, 148,
-152, 148, 148, 152, 148, 148, 151, 147, 147, 146,
-144, 144, 138, 137, 137, 130, 130, 130, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 136, 136, 136, 145, 143, 143, 149, 146, 146,
-148, 146, 146, 148, 146, 146, 149, 147, 147, 151,
-148, 148, 150, 147, 147, 150, 147, 147, 149, 146,
-146, 149, 146, 146, 149, 146, 146, 151, 148, 148,
-152, 148, 148, 153, 149, 149, 155, 150, 150, 154,
-150, 150, 153, 149, 149, 153, 149, 149, 154, 150,
-150, 153, 149, 149, 152, 148, 148, 151, 148, 148,
-151, 148, 148, 151, 148, 148, 152, 149, 149, 154,
-150, 150, 153, 149, 149, 152, 148, 148, 150, 147,
-147, 150, 147, 147, 149, 147, 147, 151, 148, 148,
-152, 149, 149, 153, 149, 149, 152, 148, 148, 151,
-148, 148, 150, 148, 148, 150, 148, 148, 152, 149,
-149, 154, 150, 150, 154, 150, 150, 154, 150, 150,
-154, 150, 150, 154, 150, 150, 130, 127, 127, 59,
-57, 57, 58, 56, 56, 61, 59, 59, 65, 62,
-62, 64, 62, 62, 64, 61, 61, 65, 62, 62,
-65, 63, 63, 66, 63, 63, 66, 63, 63, 67,
-64, 64, 69, 65, 65, 70, 67, 67, 68, 65,
-65, 65, 63, 63, 67, 64, 64, 70, 66, 66,
-73, 68, 68, 73, 69, 69, 74, 70, 70, 72,
-68, 68, 71, 67, 67, 69, 65, 65, 66, 63,
-63, 66, 63, 63, 68, 65, 65, 71, 67, 67,
-69, 65, 65, 69, 66, 66, 68, 65, 65, 65,
-63, 63, 64, 62, 62, 64, 62, 62, 67, 64,
-64, 69, 66, 66, 67, 64, 64, 63, 60, 60,
-62, 60, 60, 65, 63, 63, 68, 65, 65, 69,
-65, 65, 68, 65, 65, 68, 65, 65, 68, 65,
-65, 67, 64, 64, 65, 63, 63, 67, 64, 64,
-72, 68, 68, 76, 71, 71, 75, 70, 70, 74,
-69, 69, 70, 67, 67, 67, 64, 64, 68, 65,
-65, 115, 110, 110, 158, 152, 152, 155, 151, 151,
-153, 150, 150, 153, 150, 150, 153, 150, 150, 152,
-149, 149, 150, 147, 147, 150, 148, 148, 153, 150,
-150, 155, 151, 151, 154, 150, 150, 152, 149, 149,
-153, 149, 149, 153, 149, 149, 153, 149, 149, 152,
-149, 149, 151, 148, 148, 150, 147, 147, 149, 147,
-147, 150, 147, 147, 150, 147, 147, 151, 148, 148,
-152, 149, 149, 150, 147, 147, 146, 145, 145, 146,
-145, 145, 149, 146, 146, 151, 148, 148, 151, 148,
-148, 150, 147, 147, 152, 149, 149, 154, 149, 149,
-154, 150, 150, 152, 148, 148, 151, 148, 148, 149,
-146, 146, 147, 145, 145, 148, 146, 146, 149, 147,
-147, 150, 147, 147, 151, 148, 148, 151, 148, 148,
-150, 147, 147, 145, 143, 143, 136, 136, 136, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 129, 129, 129, 135, 135, 135,
-143, 142, 142, 149, 146, 146, 150, 147, 147, 150,
-147, 147, 150, 147, 147, 150, 147, 147, 149, 146,
-146, 148, 145, 145, 147, 145, 145, 146, 145, 145,
-148, 146, 146, 150, 148, 148, 152, 149, 149, 153,
-150, 150, 154, 150, 150, 155, 150, 150, 154, 150,
-150, 153, 149, 149, 151, 148, 148, 151, 148, 148,
-150, 148, 148, 150, 147, 147, 149, 147, 147, 150,
-148, 148, 153, 149, 149, 154, 150, 150, 152, 149,
-149, 151, 148, 148, 152, 149, 149, 154, 150, 150,
-154, 151, 151, 155, 151, 151, 156, 151, 151, 156,
-151, 151, 156, 151, 151, 155, 151, 151, 155, 151,
-151, 155, 151, 151, 155, 151, 151, 156, 151, 151,
-74, 70, 70, 71, 67, 67, 67, 64, 64, 66,
-63, 63, 66, 63, 63, 66, 63, 63, 70, 66,
-66, 69, 66, 66, 66, 63, 63, 65, 62, 62,
-67, 64, 64, 70, 67, 67, 69, 66, 66, 68,
-65, 65, 71, 67, 67, 72, 68, 68, 69, 66,
-66, 65, 62, 62, 63, 61, 61, 65, 62, 62,
-67, 64, 64, 72, 68, 68, 75, 70, 70, 73,
-68, 68, 71, 67, 67, 67, 64, 64, 64, 61,
-61, 65, 62, 62, 67, 64, 64, 70, 66, 66,
-72, 68, 68, 74, 69, 69, 73, 69, 69, 73,
-69, 69, 69, 66, 66, 65, 63, 63, 70, 66,
-66, 75, 71, 71, 72, 68, 68, 66, 63, 63,
-67, 64, 64, 73, 68, 68, 74, 70, 70, 71,
-67, 67, 68, 65, 65, 68, 65, 65, 67, 64,
-64, 68, 65, 65, 69, 66, 66, 68, 65, 65,
-67, 64, 64, 68, 65, 65, 70, 66, 66, 70,
-66, 66, 67, 64, 64, 66, 64, 64, 69, 66,
-66, 71, 67, 67, 70, 67, 67, 111, 108, 108,
-155, 151, 151, 157, 152, 152, 157, 152, 152, 155,
-151, 151, 155, 151, 151, 157, 152, 152, 159, 153,
-153, 158, 152, 152, 158, 152, 152, 159, 153, 153,
-159, 153, 153, 157, 152, 152, 156, 151, 151, 155,
-150, 150, 153, 150, 150, 152, 149, 149, 151, 148,
-148, 150, 148, 148, 150, 147, 147, 150, 148, 148,
-149, 146, 146, 148, 146, 146, 152, 149, 149, 155,
-151, 151, 157, 151, 151, 157, 152, 152, 157, 151,
-151, 156, 151, 151, 155, 150, 150, 154, 150, 150,
-153, 149, 149, 152, 149, 149, 151, 148, 148, 151,
-148, 148, 152, 148, 148, 151, 148, 148, 151, 147,
-147, 150, 147, 147, 150, 147, 147, 144, 142, 142,
-135, 135, 135, 129, 129, 129, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 133, 133, 133, 141, 140, 140, 148,
-146, 146, 150, 147, 147, 151, 148, 148, 153, 149,
-149, 154, 150, 150, 154, 150, 150, 153, 149, 149,
-152, 148, 148, 151, 148, 148, 151, 148, 148, 152,
-149, 149, 152, 149, 149, 153, 149, 149, 154, 150,
-150, 155, 150, 150, 154, 150, 150, 153, 149, 149,
-151, 148, 148, 151, 148, 148, 151, 148, 148, 152,
-149, 149, 152, 149, 149, 153, 149, 149, 153, 149,
-149, 152, 149, 149, 152, 149, 149, 151, 148, 148,
-151, 148, 148, 152, 149, 149, 152, 149, 149, 154,
-150, 150, 155, 151, 151, 155, 151, 151, 154, 150,
-150, 153, 149, 149, 152, 149, 149, 109, 106, 106,
-68, 65, 65, 69, 66, 66, 65, 62, 62, 61,
-59, 59, 67, 64, 64, 73, 69, 69, 72, 68,
-68, 69, 66, 66, 68, 65, 65, 67, 64, 64,
-71, 67, 67, 77, 72, 72, 78, 72, 72, 75,
-70, 70, 72, 68, 68, 68, 65, 65, 63, 61,
-61, 59, 57, 57, 56, 54, 54, 62, 60, 60,
-68, 65, 65, 68, 65, 65, 67, 64, 64, 66,
-64, 64, 66, 63, 63, 66, 64, 64, 67, 64,
-64, 70, 66, 66, 74, 69, 69, 74, 69, 69,
-71, 67, 67, 70, 66, 66, 72, 68, 68, 72,
-68, 68, 70, 66, 66, 69, 66, 66, 71, 67,
-67, 73, 69, 69, 70, 66, 66, 68, 65, 65,
-71, 67, 67, 74, 69, 69, 74, 70, 70, 74,
-69, 69, 72, 68, 68, 70, 66, 66, 68, 65,
-65, 67, 64, 64, 66, 63, 63, 64, 61, 61,
-65, 62, 62, 70, 66, 66, 73, 69, 69, 72,
-68, 68, 69, 66, 66, 69, 66, 66, 68, 65,
-65, 69, 66, 66, 70, 66, 66, 69, 66, 66,
-110, 107, 107, 152, 149, 149, 153, 150, 150, 154,
-150, 150, 154, 151, 151, 155, 151, 151, 156, 151,
-151, 156, 151, 151, 154, 151, 151, 153, 149, 149,
-152, 149, 149, 150, 148, 148, 151, 148, 148, 152,
-149, 149, 152, 149, 149, 151, 148, 148, 151, 148,
-148, 152, 149, 149, 152, 148, 148, 152, 148, 148,
-152, 149, 149, 154, 150, 150, 155, 151, 151, 156,
-151, 151, 156, 151, 151, 155, 150, 150, 154, 150,
-150, 153, 149, 149, 152, 148, 148, 152, 149, 149,
-152, 149, 149, 152, 149, 149, 152, 149, 149, 152,
-149, 149, 150, 147, 147, 151, 148, 148, 150, 147,
-147, 143, 142, 142, 134, 134, 134, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 133,
-133, 133, 139, 139, 139, 146, 144, 144, 150, 147,
-147, 151, 148, 148, 152, 148, 148, 153, 149, 149,
-153, 149, 149, 153, 149, 149, 152, 148, 148, 150,
-147, 147, 150, 147, 147, 150, 147, 147, 152, 148,
-148, 153, 149, 149, 155, 150, 150, 156, 151, 151,
-154, 150, 150, 151, 148, 148, 151, 148, 148, 151,
-148, 148, 151, 148, 148, 152, 148, 148, 152, 149,
-149, 151, 148, 148, 150, 148, 148, 151, 148, 148,
-150, 148, 148, 149, 147, 147, 150, 147, 147, 151,
-148, 148, 153, 150, 150, 154, 150, 150, 154, 150,
-150, 152, 149, 149, 109, 106, 106, 65, 62, 62,
-63, 61, 61, 62, 60, 60, 62, 60, 60, 62,
-60, 60, 63, 60, 60, 67, 64, 64, 71, 67,
-67, 71, 67, 67, 71, 67, 67, 69, 66, 66,
-69, 65, 65, 71, 67, 67, 75, 70, 70, 74,
-69, 69, 72, 68, 68, 72, 68, 68, 71, 67,
-67, 70, 66, 66, 68, 65, 65, 70, 66, 66,
-71, 67, 67, 71, 67, 67, 70, 66, 66, 66,
-63, 63, 62, 59, 59, 62, 60, 60, 64, 62,
-62, 68, 65, 65, 70, 67, 67, 71, 67, 67,
-69, 65, 65, 70, 66, 66, 72, 68, 68, 72,
-68, 68, 69, 66, 66, 67, 64, 64, 66, 63,
-63, 64, 62, 62, 60, 58, 58, 58, 56, 56,
-63, 61, 61, 68, 65, 65, 69, 66, 66, 71,
-67, 67, 68, 65, 65, 65, 63, 63, 66, 63,
-63, 66, 63, 63, 67, 64, 64, 68, 65, 65,
-70, 66, 66, 70, 66, 66, 68, 65, 65, 65,
-62, 62, 63, 61, 61, 63, 60, 60, 64, 62,
-62, 66, 63, 63, 67, 64, 64, 67, 64, 64,
-66, 63, 63, 108, 105, 105, 151, 148, 148, 152,
-149, 149, 152, 149, 149, 151, 148, 148, 150, 148,
-148, 148, 146, 146, 148, 146, 146, 148, 146, 146,
-149, 147, 147, 150, 148, 148, 151, 148, 148, 153,
-149, 149, 152, 149, 149, 153, 149, 149, 152, 149,
-149, 151, 148, 148, 151, 148, 148, 152, 149, 149,
-153, 149, 149, 153, 149, 149, 153, 149, 149, 153,
-149, 149, 152, 149, 149, 150, 147, 147, 150, 147,
-147, 150, 147, 147, 151, 148, 148, 152, 148, 148,
-152, 149, 149, 153, 149, 149, 153, 149, 149, 153,
-149, 149, 150, 147, 147, 142, 141, 141, 134, 134,
-134, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 133, 133, 133, 141, 140,
-140, 149, 146, 146, 153, 149, 149, 153, 149, 149,
-152, 149, 149, 152, 149, 149, 152, 149, 149, 152,
-148, 148, 151, 148, 148, 150, 147, 147, 149, 147,
-147, 149, 146, 146, 148, 146, 146, 148, 146, 146,
-150, 147, 147, 151, 148, 148, 151, 148, 148, 151,
-148, 148, 150, 148, 148, 150, 148, 148, 153, 149,
-149, 153, 150, 150, 151, 148, 148, 150, 148, 148,
-151, 148, 148, 152, 149, 149, 152, 149, 149, 152,
-149, 149, 152, 148, 148, 151, 148, 148, 152, 149,
-149, 130, 127, 127, 64, 61, 61, 63, 60, 60,
-64, 62, 62, 66, 63, 63, 65, 63, 63, 65,
-63, 63, 65, 63, 63, 64, 61, 61, 60, 58,
-58, 60, 58, 58, 66, 63, 63, 69, 65, 65,
-66, 63, 63, 65, 62, 62, 63, 60, 60, 62,
-60, 60, 65, 62, 62, 66, 63, 63, 67, 64,
-64, 67, 64, 64, 66, 63, 63, 65, 63, 63,
-66, 63, 63, 68, 65, 65, 71, 67, 67, 72,
-68, 68, 70, 66, 66, 70, 66, 66, 70, 67,
-67, 70, 66, 66, 67, 64, 64, 66, 63, 63,
-68, 65, 65, 69, 65, 65, 70, 66, 66, 68,
-65, 65, 65, 63, 63, 67, 64, 64, 73, 69,
-69, 73, 69, 69, 70, 66, 66, 67, 64, 64,
-66, 63, 63, 66, 63, 63, 66, 63, 63, 66,
-63, 63, 66, 63, 63, 66, 63, 63, 66, 63,
-63, 68, 65, 65, 73, 68, 68, 73, 68, 68,
-69, 66, 66, 67, 64, 64, 66, 63, 63, 67,
-64, 64, 70, 66, 66, 73, 69, 69, 75, 70,
-70, 73, 68, 68, 68, 65, 65, 63, 61, 61,
-61, 59, 59, 105, 103, 103, 151, 148, 148, 152,
-149, 149, 153, 149, 149, 153, 150, 150, 153, 149,
-149, 152, 149, 149, 151, 148, 148, 149, 147, 147,
-149, 147, 147, 150, 147, 147, 152, 149, 149, 152,
-149, 149, 152, 149, 149, 153, 149, 149, 152, 149,
-149, 152, 149, 149, 152, 149, 149, 153, 149, 149,
-154, 150, 150, 152, 149, 149, 151, 148, 148, 150,
-147, 147, 149, 146, 146, 149, 147, 147, 150, 147,
-147, 150, 148, 148, 151, 148, 148, 152, 149, 149,
-153, 149, 149, 151, 148, 148, 146, 144, 144, 139,
-138, 138, 133, 133, 133, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 133, 133, 133, 140, 139, 139, 147, 145, 145,
-153, 149, 149, 153, 149, 149, 153, 149, 149, 152,
-149, 149, 152, 149, 149, 151, 148, 148, 152, 148,
-148, 152, 148, 148, 152, 148, 148, 150, 147, 147,
-148, 146, 146, 146, 145, 145, 145, 144, 144, 148,
-146, 146, 151, 148, 148, 153, 150, 150, 154, 150,
-150, 153, 150, 150, 153, 149, 149, 153, 150, 150,
-153, 150, 150, 153, 150, 150, 153, 150, 150, 153,
-150, 150, 153, 150, 150, 153, 149, 149, 152, 149,
-149, 153, 149, 149, 110, 107, 107, 69, 66, 66,
-70, 66, 66, 71, 68, 68, 71, 68, 68, 69,
-66, 66, 68, 65, 65, 68, 65, 65, 69, 66,
-66, 71, 67, 67, 71, 67, 67, 70, 66, 66,
-70, 66, 66, 69, 66, 66, 69, 66, 66, 69,
-66, 66, 66, 63, 63, 64, 61, 61, 65, 63,
-63, 67, 64, 64, 65, 62, 62, 62, 60, 60,
-65, 62, 62, 66, 63, 63, 68, 65, 65, 69,
-66, 66, 68, 65, 65, 67, 64, 64, 68, 65,
-65, 68, 65, 65, 68, 65, 65, 67, 64, 64,
-65, 63, 63, 66, 63, 63, 70, 66, 66, 71,
-67, 67, 70, 66, 66, 69, 66, 66, 69, 66,
-66, 68, 65, 65, 69, 66, 66, 69, 66, 66,
-70, 66, 66, 71, 67, 67, 71, 67, 67, 70,
-66, 66, 70, 66, 66, 70, 66, 66, 70, 66,
-66, 69, 66, 66, 68, 65, 65, 66, 63, 63,
-65, 63, 63, 67, 64, 64, 71, 67, 67, 76,
-71, 71, 78, 72, 72, 75, 70, 70, 69, 66,
-66, 65, 62, 62, 64, 61, 61, 67, 64, 64,
-67, 64, 64, 109, 106, 106, 154, 150, 150, 157,
-152, 152, 155, 151, 151, 154, 150, 150, 152, 149,
-149, 152, 149, 149, 151, 148, 148, 150, 148, 148,
-152, 149, 149, 153, 150, 150, 153, 150, 150, 153,
-150, 150, 153, 150, 150, 154, 150, 150, 156, 151,
-151, 157, 151, 151, 156, 151, 151, 154, 150, 150,
-151, 148, 148, 149, 147, 147, 150, 148, 148, 151,
-148, 148, 152, 149, 149, 152, 149, 149, 152, 149,
-149, 152, 149, 149, 151, 148, 148, 152, 149, 149,
-147, 145, 145, 140, 139, 139, 133, 133, 133, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 132, 132, 132,
-139, 138, 138, 147, 145, 145, 152, 148, 148, 152,
-149, 149, 153, 149, 149, 154, 149, 149, 154, 150,
-150, 154, 150, 150, 154, 149, 149, 153, 149, 149,
-152, 149, 149, 152, 149, 149, 152, 149, 149, 150,
-147, 147, 150, 147, 147, 151, 148, 148, 153, 150,
-150, 154, 150, 150, 154, 150, 150, 154, 150, 150,
-154, 150, 150, 153, 150, 150, 153, 149, 149, 152,
-149, 149, 151, 148, 148, 150, 147, 147, 151, 148,
-148, 152, 149, 149, 152, 149, 149, 109, 106, 106,
-66, 63, 63, 66, 63, 63, 67, 64, 64, 67,
-64, 64, 68, 65, 65, 71, 67, 67, 75, 70,
-70, 74, 69, 69, 71, 67, 67, 70, 66, 66,
-70, 66, 66, 70, 66, 66, 69, 65, 65, 68,
-65, 65, 67, 64, 64, 67, 64, 64, 66, 63,
-63, 66, 63, 63, 66, 63, 63, 68, 65, 65,
-68, 65, 65, 67, 64, 64, 66, 63, 63, 66,
-63, 63, 62, 60, 60, 60, 58, 58, 64, 62,
-62, 69, 65, 65, 71, 67, 67, 72, 68, 68,
-74, 70, 70, 72, 68, 68, 65, 63, 63, 63,
-60, 60, 61, 59, 59, 61, 59, 59, 63, 60,
-60, 65, 63, 63, 67, 64, 64, 70, 66, 66,
-69, 65, 65, 65, 62, 62, 64, 62, 62, 66,
-63, 63, 67, 64, 64, 68, 65, 65, 68, 65,
-65, 69, 66, 66, 69, 65, 65, 70, 66, 66,
-69, 65, 65, 68, 65, 65, 68, 65, 65, 69,
-66, 66, 68, 65, 65, 67, 64, 64, 65, 63,
-63, 64, 62, 62, 65, 63, 63, 67, 64, 64,
-132, 129, 129, 153, 150, 150, 152, 149, 149, 151,
-148, 148, 150, 148, 148, 149, 147, 147, 150, 147,
-147, 152, 149, 149, 154, 150, 150, 154, 150, 150,
-152, 149, 149, 152, 149, 149, 152, 149, 149, 152,
-149, 149, 152, 149, 149, 153, 150, 150, 153, 150,
-150, 153, 149, 149, 153, 150, 150, 152, 149, 149,
-151, 148, 148, 152, 149, 149, 155, 150, 150, 155,
-150, 150, 154, 150, 150, 153, 149, 149, 154, 150,
-150, 154, 150, 150, 148, 146, 146, 139, 139, 139,
-132, 132, 132, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 132, 132, 132, 138, 137, 137, 144,
-143, 143, 152, 148, 148, 153, 149, 149, 153, 150,
-150, 154, 150, 150, 154, 150, 150, 154, 150, 150,
-154, 150, 150, 153, 150, 150, 153, 150, 150, 153,
-150, 150, 154, 150, 150, 154, 150, 150, 153, 149,
-149, 153, 149, 149, 152, 149, 149, 152, 149, 149,
-152, 149, 149, 153, 149, 149, 152, 149, 149, 152,
-149, 149, 152, 148, 148, 151, 148, 148, 150, 148,
-148, 151, 148, 148, 151, 148, 148, 151, 148, 148,
-152, 149, 149, 110, 106, 106, 67, 64, 64, 68,
-65, 65, 67, 64, 64, 65, 62, 62, 64, 61,
-61, 65, 63, 63, 65, 63, 63, 66, 63, 63,
-69, 65, 65, 70, 66, 66, 68, 65, 65, 67,
-64, 64, 67, 64, 64, 65, 63, 63, 63, 60,
-60, 64, 62, 62, 67, 64, 64, 68, 65, 65,
-69, 65, 65, 71, 67, 67, 69, 66, 66, 66,
-63, 63, 65, 62, 62, 64, 62, 62, 64, 62,
-62, 65, 63, 63, 69, 66, 66, 70, 66, 66,
-68, 65, 65, 68, 65, 65, 69, 65, 65, 67,
-64, 64, 64, 62, 62, 63, 61, 61, 65, 63,
-63, 69, 65, 65, 72, 68, 68, 71, 68, 68,
-69, 65, 65, 66, 63, 63, 64, 62, 62, 66,
-63, 63, 69, 66, 66, 70, 66, 66, 69, 66,
-66, 68, 65, 65, 66, 63, 63, 65, 62, 62,
-65, 63, 63, 64, 62, 62, 64, 61, 61, 63,
-60, 60, 64, 61, 61, 65, 63, 63, 66, 63,
-63, 68, 65, 65, 110, 107, 107, 153, 149, 149,
-153, 150, 150, 153, 149, 149, 151, 148, 148, 150,
-148, 148, 150, 148, 148, 151, 148, 148, 153, 149,
-149, 153, 150, 150, 153, 149, 149, 152, 149, 149,
-151, 148, 148, 151, 148, 148, 150, 148, 148, 150,
-148, 148, 149, 147, 147, 150, 147, 147, 152, 149,
-149, 153, 149, 149, 154, 150, 150, 154, 150, 150,
-153, 150, 150, 152, 148, 148, 152, 148, 148, 153,
-149, 149, 154, 150, 150, 154, 150, 150, 146, 144,
-144, 138, 138, 138, 132, 132, 132, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 130,
-130, 130, 136, 136, 136, 143, 142, 142, 151, 148,
-148, 153, 149, 149, 155, 151, 151, 156, 151, 151,
-156, 151, 151, 155, 151, 151, 153, 150, 150, 153,
-149, 149, 154, 150, 150, 155, 151, 151, 155, 151,
-151, 155, 151, 151, 154, 150, 150, 153, 150, 150,
-152, 149, 149, 152, 149, 149, 152, 149, 149, 152,
-149, 149, 152, 149, 149, 152, 149, 149, 153, 149,
-149, 152, 149, 149, 153, 149, 149, 153, 149, 149,
-152, 149, 149, 152, 149, 149, 154, 150, 150, 113,
-109, 109, 71, 68, 68, 69, 66, 66, 66, 63,
-63, 65, 62, 62, 65, 63, 63, 66, 63, 63,
-67, 64, 64, 67, 64, 64, 67, 64, 64, 68,
-65, 65, 70, 66, 66, 71, 67, 67, 70, 66,
-66, 69, 66, 66, 68, 65, 65, 69, 66, 66,
-71, 67, 67, 71, 67, 67, 69, 66, 66, 67,
-64, 64, 66, 63, 63, 68, 65, 65, 70, 66,
-66, 72, 68, 68, 72, 68, 68, 71, 67, 67,
-70, 66, 66, 69, 66, 66, 66, 63, 63, 65,
-63, 63, 65, 62, 62, 62, 60, 60, 65, 62,
-62, 71, 67, 67, 73, 68, 68, 71, 67, 67,
-69, 66, 66, 68, 65, 65, 69, 66, 66, 70,
-66, 66, 72, 68, 68, 71, 67, 67, 67, 64,
-64, 67, 64, 64, 67, 64, 64, 68, 65, 65,
-67, 64, 64, 65, 62, 62, 66, 63, 63, 66,
-63, 63, 67, 64, 64, 68, 65, 65, 132, 129,
-129, 153, 150, 150, 153, 150, 150, 153, 149, 149,
-152, 149, 149, 151, 148, 148, 151, 148, 148, 151,
-148, 148, 152, 149, 149, 152, 149, 149, 153, 149,
-149, 152, 149, 149, 151, 148, 148, 151, 148, 148,
-151, 148, 148, 150, 148, 148, 150, 148, 148, 151,
-148, 148, 152, 149, 149, 153, 150, 150, 154, 150,
-150, 154, 150, 150, 153, 150, 150, 153, 149, 149,
-153, 149, 149, 153, 150, 150, 153, 149, 149, 152,
-149, 149, 144, 143, 143, 137, 137, 137, 130, 130,
-130, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 135, 135,
-135, 139, 139, 139, 144, 143, 143, 146, 145, 145,
-147, 145, 145, 148, 146, 146, 148, 146, 146, 147,
-145, 145, 146, 144, 144, 146, 144, 144, 147, 145,
-145, 147, 146, 146, 148, 146, 146, 147, 145, 145,
-146, 145, 145, 145, 144, 144, 145, 144, 144, 146,
-144, 144, 147, 145, 145, 147, 145, 145, 146, 144,
-144, 146, 144, 144, 145, 144, 144, 145, 144, 144,
-145, 144, 144, 145, 144, 144, 147, 145, 145, 147,
-146, 146, 148, 146, 146, 148, 146, 146, 125, 124,
-124, 80, 78, 78, 57, 55, 55, 55, 54, 54,
-54, 53, 53, 54, 52, 52, 54, 53, 53, 57,
-55, 55, 59, 57, 57, 60, 58, 58, 60, 58,
-58, 60, 58, 58, 59, 58, 58, 60, 58, 58,
-60, 58, 58, 59, 57, 57, 57, 55, 55, 57,
-56, 56, 56, 55, 55, 55, 53, 53, 55, 54,
-54, 56, 55, 55, 56, 55, 55, 57, 56, 56,
-59, 57, 57, 59, 57, 57, 57, 56, 56, 55,
-54, 54, 53, 52, 52, 53, 52, 52, 54, 53,
-53, 57, 56, 56, 59, 57, 57, 60, 58, 58,
-62, 60, 60, 63, 61, 61, 64, 61, 61, 62,
-60, 60, 61, 59, 59, 60, 58, 58, 59, 57,
-57, 57, 55, 55, 57, 55, 55, 57, 55, 55,
-58, 56, 56, 59, 57, 57, 81, 79, 79, 125,
-124, 124, 147, 145, 145, 147, 145, 145, 147, 146,
-146, 147, 146, 146, 146, 145, 145, 146, 144, 144,
-145, 144, 144, 145, 144, 144, 145, 144, 144, 145,
-144, 144, 145, 144, 144, 145, 144, 144, 145, 144,
-144, 144, 143, 143, 144, 143, 143, 145, 144, 144,
-146, 144, 144, 146, 145, 145, 146, 144, 144, 146,
-144, 144, 145, 144, 144, 146, 144, 144, 147, 145,
-145, 147, 145, 145, 147, 145, 145, 147, 145, 145,
-146, 144, 144, 145, 144, 144, 139, 139, 139, 135,
-135, 135, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 104, 104, 104, 52, 52, 52, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 52, 52,
-52, 104, 104, 104, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-104, 104, 104, 78, 78, 78, 78, 78, 78, 78,
-78, 78, 78, 78, 78, 52, 52, 52, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 52, 52, 52, 78, 78, 78, 78, 78,
-78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
-104, 104, 104, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 122, 122, 122, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 122, 122, 122, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 122, 122, 122, 122, 122, 122,
-122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
-122, 122, 122, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 122, 122, 122,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 123, 123, 123, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 123, 123, 123, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 123, 123, 123, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 123, 123, 123, 123, 123, 123,
-123, 123, 123, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 123, 123, 123,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 124, 124, 124, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 124, 124, 124, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 124, 124, 124, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 124, 124, 124, 124, 124, 124,
-124, 124, 124, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 124, 124, 124,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 79, 79, 79, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 79, 79, 79, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 80, 80, 80, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 52, 52, 52, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 107, 107, 107,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-107, 107, 107, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 80, 80, 80, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 80, 80, 80, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 107, 107, 107, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 80, 80, 80, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 53, 53, 53, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 53, 53, 53, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 107, 107, 107,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-80, 80, 80, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 125, 125, 125, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 125, 125, 125, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 125, 125, 125, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 53, 53, 53, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 53, 53, 53, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 125, 125, 125, 125, 125, 125,
-125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
-125, 125, 125, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 125, 125, 125,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 126, 126, 126, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 126, 126, 126, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 126, 126, 126, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-126, 126, 126, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 126, 126, 126,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 127, 127, 127, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 127, 127, 127, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 127, 127, 127, 127, 127, 127,
-127, 127, 127, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 127, 127, 127,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 138, 138, 138, 138, 138, 138, 138,
-138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
-138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
-138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
-138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
-138, 138, 138, 138, 138, 138, 138, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 137, 137,
-137, 137, 137, 137, 137, 137, 137, 137, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
-136, 136, 136, 136, 136, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-135, 135, 135, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
-134, 134, 134, 134, 134, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
-133, 133, 133, 133, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
-132, 132, 132, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 131,
-131, 131, 131, 131, 131, 131, 131, 131, 131, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
-130, 130, 130, 130, 130, 130, 130, 130, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
-129, 129, 129, 129, 128, 128, 128, 128, 128, 128};
-static unsigned char *projector_world_camera MAYBE_UNUSED
-= __projector_world_camera;
-
-#endif
diff --git a/test/regression/imu.cc b/test/regression/imu.cc
deleted file mode 100644
index c90fa72..0000000
--- a/test/regression/imu.cc
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright 2013 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "ServerFixture.hh"
-#include "sensors/sensors.hh"
-#include "common/common.hh"
-
-// How tightly to compare for deterministic values
-#define IMU_TOL 1e-5
-
-using namespace gazebo;
-class ImuTest : public ServerFixture
-{
-  public: void Stationary_EmptyWorld(const std::string &_physicsEngine);
-  public: void Stationary_EmptyWorld_Noise(const std::string &_physicsEngine);
-  public: void Stationary_EmptyWorld_Bias(const std::string &_physicsEngine);
-  private: void GetGravity(const math::Quaternion& _rot, math::Vector3 &_g);
-  private: void GetImuData(sensors::ImuSensorPtr _imu, unsigned int _cnt,
-                           math::Vector3 &_rateMean,
-                           math::Vector3 &_accelMean,
-                           math::Quaternion &_orientation);
-};
-
-void ImuTest::GetGravity(const math::Quaternion &_rot, math::Vector3 &_g)
-{
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world);
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics);
-  // Rotate into IMU's frame
-  _g = _rot.GetInverse().RotateVector(physics->GetGravity());
-}
-
-void ImuTest::GetImuData(sensors::ImuSensorPtr _imu,
-                         unsigned int _cnt,
-                         math::Vector3 &_rateMean,
-                         math::Vector3 &_accelMean,
-                         math::Quaternion& _orientation)
-{
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world);
-  // Collect a number of samples and return the average rate and accel values
-  math::Vector3 rateSum, accelSum;
-  for (unsigned int i = 0; i < _cnt; ++i)
-  {
-    world->StepWorld(1);
-    _imu->Update(true);
-    rateSum += _imu->GetAngularVelocity();
-    accelSum += _imu->GetLinearAcceleration();
-  }
-  _rateMean = rateSum / _cnt;
-  _accelMean = accelSum / _cnt;
-  _orientation = _imu->GetOrientation();
-}
-
-void ImuTest::Stationary_EmptyWorld(const std::string &_physicsEngine)
-{
-  Load("worlds/empty.world", true, _physicsEngine);
-
-  std::string modelName = "imu_model";
-  std::string imuSensorName = "imu_sensor";
-  math::Pose testPose(math::Vector3(0, 0, 0.05),
-      math::Quaternion(0.5, -1.0, 0.2));
-
-  SpawnImuSensor(modelName, imuSensorName, testPose.pos,
-      testPose.rot.GetAsEuler());
-
-  sensors::ImuSensorPtr imu =
-    boost::static_pointer_cast<sensors::ImuSensor>(
-        sensors::SensorManager::Instance()->GetSensor(imuSensorName));
-
-  ASSERT_TRUE(imu);
-  imu->Init();
-  math::Vector3 rateMean, accelMean;
-  math::Quaternion orientation;
-  this->GetImuData(imu, 1, rateMean, accelMean, orientation);
-
-  EXPECT_NEAR(rateMean.x, 0.0, IMU_TOL);
-  EXPECT_NEAR(rateMean.y, 0.0, IMU_TOL);
-  EXPECT_NEAR(rateMean.z, 0.0, IMU_TOL);
-
-  math::Vector3 g;
-  this->GetGravity(testPose.rot, g);
-  EXPECT_NEAR(accelMean.x, -g.x, IMU_TOL);
-  EXPECT_NEAR(accelMean.y, -g.y, IMU_TOL);
-  EXPECT_NEAR(accelMean.z, -g.z, IMU_TOL);
-
-  EXPECT_NEAR(orientation.x, testPose.rot.x, IMU_TOL);
-  EXPECT_NEAR(orientation.y, testPose.rot.y, IMU_TOL);
-  EXPECT_NEAR(orientation.z, testPose.rot.z, IMU_TOL);
-  EXPECT_NEAR(orientation.w, testPose.rot.w, IMU_TOL);
-}
-
-TEST_F(ImuTest, EmptyWorldODE)
-{
-  Stationary_EmptyWorld("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(ImuTest, EmptyWorldBullet)
-{
-  Stationary_EmptyWorld("bullet");
-}
-#endif
-
-void ImuTest::Stationary_EmptyWorld_Noise(const std::string &_physicsEngine)
-{
-  Load("worlds/empty.world", true, _physicsEngine);
-
-  std::string modelName = "imu_model";
-  std::string imuSensorName = "imu_sensor";
-  math::Pose testPose(math::Vector3(0, 0, 0.05),
-      math::Quaternion(0.3, -1.4, 2.0));
-
-  double rateNoiseMean = 1.0;
-  double rateNoiseStddev = 0.1;
-  double rateBiasMean = 0.0;
-  double rateBiasStddev = 0.0;
-  double accelNoiseMean = -10.0;
-  double accelNoiseStddev = 0.1;
-  double accelBiasMean = 0.0;
-  double accelBiasStddev = 0.0;
-  SpawnImuSensor(modelName, imuSensorName, testPose.pos,
-      testPose.rot.GetAsEuler(), "gaussian",
-      rateNoiseMean, rateNoiseStddev,
-      rateBiasMean, rateBiasStddev,
-      accelNoiseMean, accelNoiseStddev,
-      accelBiasMean, accelBiasStddev);
-
-  sensors::ImuSensorPtr imu =
-    boost::static_pointer_cast<sensors::ImuSensor>(
-        sensors::SensorManager::Instance()->GetSensor(imuSensorName));
-
-  ASSERT_TRUE(imu);
-  imu->Init();
-  math::Vector3 rateMean, accelMean;
-  math::Quaternion orientation;
-  this->GetImuData(imu, 1000, rateMean, accelMean, orientation);
-
-  double d1, d2;
-  // Have to account for the fact that the bias might be sampled as positive
-  // or negative
-  d1 = fabs(rateMean.x - (rateNoiseMean + rateBiasMean));
-  d2 = fabs(rateMean.x - (rateNoiseMean - rateBiasMean));
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*rateNoiseStddev + 3*rateBiasStddev);
-  d1 = fabs(rateMean.y - (rateNoiseMean + rateBiasMean));
-  d2 = fabs(rateMean.y - (rateNoiseMean - rateBiasMean));
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*rateNoiseStddev + 3*rateBiasStddev);
-  d1 = fabs(rateMean.z - (rateNoiseMean + rateBiasMean));
-  d2 = fabs(rateMean.z - (rateNoiseMean - rateBiasMean));
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*rateNoiseStddev + 3*rateBiasStddev);
-
-  math::Vector3 g;
-  this->GetGravity(testPose.rot, g);
-  // Have to account for the fact that the bias might be sampled as positive
-  // or negative
-  d1 = fabs(accelMean.x - (accelNoiseMean + accelBiasMean) + g.x);
-  d2 = fabs(accelMean.x - (accelNoiseMean - accelBiasMean) + g.x);
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*accelNoiseStddev + 3*accelBiasStddev);
-  d1 = fabs(accelMean.y - (accelNoiseMean + accelBiasMean) + g.y);
-  d2 = fabs(accelMean.y - (accelNoiseMean - accelBiasMean) + g.y);
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*accelNoiseStddev + 3*accelBiasStddev);
-  d1 = fabs(accelMean.z - (accelNoiseMean + accelBiasMean) + g.z);
-  d2 = fabs(accelMean.z - (accelNoiseMean - accelBiasMean) + g.z);
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*accelNoiseStddev + 3*accelBiasStddev);
-
-  EXPECT_NEAR(orientation.x, testPose.rot.x, IMU_TOL);
-  EXPECT_NEAR(orientation.y, testPose.rot.y, IMU_TOL);
-  EXPECT_NEAR(orientation.z, testPose.rot.z, IMU_TOL);
-  EXPECT_NEAR(orientation.w, testPose.rot.w, IMU_TOL);
-}
-
-TEST_F(ImuTest, EmptyWorldNoiseODE)
-{
-  Stationary_EmptyWorld_Noise("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(ImuTest, EmptyWorldNoiseBullet)
-{
-  Stationary_EmptyWorld_Noise("bullet");
-}
-#endif
-
-void ImuTest::Stationary_EmptyWorld_Bias(const std::string &_physicsEngine)
-{
-  Load("worlds/empty.world", true, _physicsEngine);
-
-  std::string modelName = "imu_model";
-  std::string imuSensorName = "imu_sensor";
-  math::Pose testPose(math::Vector3(0, 0, 0.05),
-      math::Quaternion(-0.3, 0.5, 1.0));
-
-  double rateNoiseMean = 0.0;
-  double rateNoiseStddev = 0.0;
-  double rateBiasMean = 1.0;
-  double rateBiasStddev = 0.1;
-  double accelNoiseMean = 0.0;
-  double accelNoiseStddev = 0.0;
-  double accelBiasMean = 5.0;
-  double accelBiasStddev = 0.1;
-  SpawnImuSensor(modelName, imuSensorName, testPose.pos,
-      testPose.rot.GetAsEuler(), "gaussian",
-      rateNoiseMean, rateNoiseStddev,
-      rateBiasMean, rateBiasStddev,
-      accelNoiseMean, accelNoiseStddev,
-      accelBiasMean, accelBiasStddev);
-
-  sensors::ImuSensorPtr imu =
-    boost::static_pointer_cast<sensors::ImuSensor>(
-        sensors::SensorManager::Instance()->GetSensor(imuSensorName));
-
-  ASSERT_TRUE(imu);
-  imu->Init();
-  math::Vector3 rateMean, accelMean;
-  math::Quaternion orientation;
-  this->GetImuData(imu, 1000, rateMean, accelMean, orientation);
-
-  double d1, d2;
-  // Have to account for the fact that the bias might be sampled as positive
-  // or negative
-  d1 = fabs(rateMean.x - (rateNoiseMean + rateBiasMean));
-  d2 = fabs(rateMean.x - (rateNoiseMean - rateBiasMean));
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*rateNoiseStddev + 3*rateBiasStddev);
-  d1 = fabs(rateMean.y - (rateNoiseMean + rateBiasMean));
-  d2 = fabs(rateMean.y - (rateNoiseMean - rateBiasMean));
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*rateNoiseStddev + 3*rateBiasStddev);
-  d1 = fabs(rateMean.z - (rateNoiseMean + rateBiasMean));
-  d2 = fabs(rateMean.z - (rateNoiseMean - rateBiasMean));
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*rateNoiseStddev + 3*rateBiasStddev);
-
-  math::Vector3 g;
-  this->GetGravity(testPose.rot, g);
-  // Have to account for the fact that the bias might be sampled as positive
-  // or negative
-  d1 = fabs(accelMean.x - (accelNoiseMean + accelBiasMean) + g.x);
-  d2 = fabs(accelMean.x - (accelNoiseMean - accelBiasMean) + g.x);
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*accelNoiseStddev + 3*accelBiasStddev);
-  d1 = fabs(accelMean.y - (accelNoiseMean + accelBiasMean) + g.y);
-  d2 = fabs(accelMean.y - (accelNoiseMean - accelBiasMean) + g.y);
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*accelNoiseStddev + 3*accelBiasStddev);
-  d1 = fabs(accelMean.z - (accelNoiseMean + accelBiasMean) + g.z);
-  d2 = fabs(accelMean.z - (accelNoiseMean - accelBiasMean) + g.z);
-  EXPECT_NEAR(0.0, std::min(d1, d2),
-              3*accelNoiseStddev + 3*accelBiasStddev);
-
-  EXPECT_NEAR(orientation.x, testPose.rot.x, IMU_TOL);
-  EXPECT_NEAR(orientation.y, testPose.rot.y, IMU_TOL);
-  EXPECT_NEAR(orientation.z, testPose.rot.z, IMU_TOL);
-  EXPECT_NEAR(orientation.w, testPose.rot.w, IMU_TOL);
-}
-
-TEST_F(ImuTest, EmptyWorldBiasODE)
-{
-  Stationary_EmptyWorld_Bias("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(ImuTest, EmptyWorldBiasBullet)
-{
-  Stationary_EmptyWorld_Bias("bullet");
-}
-#endif
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/laser.cc b/test/regression/laser.cc
deleted file mode 100644
index 3f280ec..0000000
--- a/test/regression/laser.cc
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "ServerFixture.hh"
-#include "physics/physics.hh"
-#include "sensors/sensors.hh"
-#include "common/common.hh"
-#include "scans_cmp.h"
-
-#define LASER_TOL 1e-5
-#define DOUBLE_TOL 1e-6
-
-using namespace gazebo;
-class LaserTest : public ServerFixture
-{
-  public: void Stationary_EmptyWorld(const std::string &_physicsEngine);
-  public: void LaserUnitBox(const std::string &_physicsEngine);
-  public: void LaserUnitNoise(const std::string &_physicsEngine);
-};
-
-void LaserTest::Stationary_EmptyWorld(const std::string &_physicsEngine)
-{
-  Load("worlds/empty.world", true, _physicsEngine);
-
-  std::string modelName = "ray_model";
-  std::string raySensorName = "ray_sensor";
-  double hMinAngle = -2.27;
-  double hMaxAngle = 2.27;
-  double minRange = 0.0;
-  double maxRange = 10.0;
-  double rangeResolution = 0.01;
-  unsigned int samples = 640;
-  math::Pose testPose(math::Vector3(0, 0, 0.5),
-      math::Quaternion(0, 0, 0));
-
-  SpawnRaySensor(modelName, raySensorName, testPose.pos,
-      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, minRange, maxRange,
-      rangeResolution, samples);
-
-  sensors::RaySensorPtr laser =
-    boost::static_pointer_cast<sensors::RaySensor>(
-        sensors::SensorManager::Instance()->GetSensor(raySensorName));
-
-  ASSERT_TRUE(laser);
-  laser->Init();
-  laser->Update(true);
-
-  EXPECT_EQ(640, laser->GetRayCount());
-  EXPECT_EQ(640, laser->GetRangeCount());
-  EXPECT_NEAR(laser->GetAngleMin().Radian(), -2.27, DOUBLE_TOL);
-  EXPECT_NEAR(laser->GetAngleMax().Radian(), 2.27, DOUBLE_TOL);
-  EXPECT_NEAR(laser->GetRangeMin(), 0, DOUBLE_TOL);
-  EXPECT_NEAR(laser->GetRangeMax(), 10, DOUBLE_TOL);
-  EXPECT_NEAR(laser->GetRangeResolution(), 0.01, DOUBLE_TOL);
-
-
-  for (int i = 0; i < laser->GetRangeCount(); ++i)
-  {
-    EXPECT_EQ(10, laser->GetRange(i));
-  }
-
-  // Spawn a box and test for proper laser scan
-  {
-    SpawnBox("test_box", math::Vector3(1, 1, 1),
-        math::Vector3(2, 0, 0.5), math::Vector3(0, 0, 0));
-    common::Time::MSleep(1000);
-
-    laser->Update(true);
-
-    std::vector<double> scan;
-    laser->GetRanges(scan);
-
-    // run test against pre-recorded range data only in ode
-    if (_physicsEngine == "ode")
-    {
-      double diffMax, diffSum, diffAvg;
-      DoubleCompare(box_scan, &scan[0], 640, diffMax, diffSum, diffAvg);
-      EXPECT_LT(diffMax, 2e-6);
-      EXPECT_LT(diffSum, 1e-4);
-      EXPECT_LT(diffAvg, 2e-6);
-    }
-
-    // This line will print the current scan. Use this to generate
-    // a new test scan sample
-    // PrintScan("box_scan", &scan[0], 640);
-  }
-
-  // Move the laser to point down on the ground plane,
-  {
-    common::Time prevTime;
-    physics::WorldPtr world = physics::get_world("default");
-    ASSERT_TRUE(world);
-
-    physics::ModelPtr model = world->GetModel(modelName);
-
-    prevTime = laser->GetLastUpdateTime();
-    model->SetWorldPose(math::Pose(0, 0, 1.0, 0, M_PI*0.5, 0));
-
-    double diffMax, diffSum, diffAvg;
-
-    std::vector<double> scan, scan2;
-
-    laser->Update(false);
-    for (unsigned int j = 0; j < 5; ++j)
-    {
-      laser->Update(true);
-      laser->GetRanges(scan);
-      laser->Update(true);
-      laser->GetRanges(scan2);
-
-      DoubleCompare(&scan[0], &scan2[0], 640, diffMax, diffSum, diffAvg);
-      EXPECT_LT(diffMax, 1e-6);
-      EXPECT_LT(diffSum, 1e-6);
-      EXPECT_LT(diffAvg, 1e-6);
-    }
-    laser->Update(true);
-
-    // run test against pre-recorded range data only in ode
-    if (_physicsEngine == "ode")
-    {
-      DoubleCompare(plane_scan, &scan[0], 640, diffMax, diffSum, diffAvg);
-      EXPECT_LT(diffMax, 1e-6);
-      EXPECT_LT(diffSum, 1e-6);
-      EXPECT_LT(diffAvg, 1e-6);
-    }
-
-    // This line will print the current scan. Use this to generate
-    // a new test scan sample
-    // PrintScan("plane_scan", &scan[0], 640);
-  }
-}
-
-TEST_F(LaserTest, EmptyWorldODE)
-{
-  Stationary_EmptyWorld("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(LaserTest, EmptyWorldBullet)
-{
-  Stationary_EmptyWorld("bullet");
-}
-#endif
-
-void LaserTest::LaserUnitBox(const std::string &_physicsEngine)
-{
-  // Test ray sensor with 3 boxes in the world.
-  // First place 2 of 3 boxes within range and verify range values, one of them
-  // being a static model to verify collision filtering is working,
-  // then move all 3 boxes out of range and verify range values
-
-  Load("worlds/empty.world", true, _physicsEngine);
-
-  std::string modelName = "ray_model";
-  std::string raySensorName = "ray_sensor";
-  double hMinAngle = -M_PI/2.0;
-  double hMaxAngle = M_PI/2.0;
-  double minRange = 0.0;
-  double maxRange = 5.0;
-  double rangeResolution = 0.02;
-  unsigned int samples = 320;
-  math::Pose testPose(math::Vector3(0, 0, 0),
-      math::Quaternion(0, 0, 0));
-
-  SpawnRaySensor(modelName, raySensorName, testPose.pos,
-      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, minRange, maxRange,
-      rangeResolution, samples);
-
-  std::string box01 = "box_01";
-  std::string box02 = "box_02";
-  std::string box03 = "box_03";
-
-  // box in front of ray sensor
-  math::Pose box01Pose(math::Vector3(1, 0, 0.5), math::Quaternion(0, 0, 0));
-  // box on the right of ray sensor
-  math::Pose box02Pose(math::Vector3(0, -1, 0.5), math::Quaternion(0, 0, 0));
-  // box on the left of the ray sensor but out of range
-  math::Pose box03Pose(math::Vector3(0, maxRange + 1, 0.5),
-      math::Quaternion(0, 0, 0));
-
-  SpawnBox(box01, math::Vector3(1, 1, 1), box01Pose.pos,
-      box01Pose.rot.GetAsEuler());
-
-  // box02 is static
-  SpawnBox(box02, math::Vector3(1, 1, 1), box02Pose.pos,
-      box02Pose.rot.GetAsEuler(), true);
-
-  SpawnBox(box03, math::Vector3(1, 1, 1), box03Pose.pos,
-      box03Pose.rot.GetAsEuler());
-
-  sensors::SensorPtr sensor = sensors::get_sensor(raySensorName);
-  sensors::RaySensorPtr raySensor =
-    boost::dynamic_pointer_cast<sensors::RaySensor>(sensor);
-
-  raySensor->Init();
-  raySensor->Update(true);
-
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  EXPECT_TRUE(world->GetModel(box02)->IsStatic());
-
-  int mid = samples / 2;
-  double unitBoxSize = 1.0;
-  double expectedRangeAtMidPoint = box01Pose.pos.x - unitBoxSize/2;
-
-  // WARNING: gazebo returns distance to object from min range
-  // issue #503
-  expectedRangeAtMidPoint -= minRange;
-
-  EXPECT_NEAR(raySensor->GetRange(mid), expectedRangeAtMidPoint, LASER_TOL);
-  EXPECT_NEAR(raySensor->GetRange(0), expectedRangeAtMidPoint, LASER_TOL);
-
-  // WARNING: for readings of no return, gazebo returns max range rather
-  // than +inf. issue #124
-  EXPECT_NEAR(raySensor->GetRange(samples-1), maxRange, LASER_TOL);
-
-  // Move all boxes out of range
-  world->GetModel(box01)->SetWorldPose(
-      math::Pose(math::Vector3(maxRange + 1, 0, 0), math::Quaternion(0, 0, 0)));
-  world->GetModel(box02)->SetWorldPose(
-      math::Pose(math::Vector3(0, -(maxRange + 1), 0),
-      math::Quaternion(0, 0, 0)));
-  world->StepWorld(1);
-  raySensor->Update(true);
-
-  for (int i = 0; i < raySensor->GetRayCount(); ++i)
-  {
-    EXPECT_NEAR(raySensor->GetRange(i), maxRange, LASER_TOL);
-  }
-}
-
-TEST_F(LaserTest, LaserBoxODE)
-{
-  LaserUnitBox("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(LaserTest, LaserBoxBullet)
-{
-  LaserUnitBox("bullet");
-}
-#endif  // HAVE_BULLET
-
-void LaserTest::LaserUnitNoise(const std::string &_physicsEngine)
-{
-  // Test ray sensor with noise applied
-
-  Load("worlds/empty.world", true, _physicsEngine);
-
-  std::string modelName = "ray_model";
-  std::string raySensorName = "ray_sensor";
-  double hMinAngle = -M_PI/2.0;
-  double hMaxAngle = M_PI/2.0;
-  double minRange = 0.0;
-  double maxRange = 5.0;
-  double rangeResolution = 0.02;
-  unsigned int samples = 320;
-  std::string noiseType = "gaussian";
-  // Give negative bias so that we can see the effect (positive bias
-  // would be removed by clamp(minRange,maxRange).
-  double noiseMean = -1.0;
-  double noiseStdDev = 0.01;
-  math::Pose testPose(math::Vector3(0, 0, 0),
-      math::Quaternion(0, 0, 0));
-
-  SpawnRaySensor(modelName, raySensorName, testPose.pos,
-      testPose.rot.GetAsEuler(), hMinAngle, hMaxAngle, minRange, maxRange,
-      rangeResolution, samples,
-      noiseType, noiseMean, noiseStdDev);
-
-  sensors::SensorPtr sensor = sensors::get_sensor(raySensorName);
-  sensors::RaySensorPtr raySensor =
-    boost::dynamic_pointer_cast<sensors::RaySensor>(sensor);
-
-  raySensor->Init();
-  raySensor->Update(true);
-
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // Expect at least one value to be non-max (empty world), and expect the
-  // mean to be close to the max+noiseMean
-  double total = 0.0;
-  bool foundNoise = false;
-  for (int i = 0; i < raySensor->GetRayCount(); ++i)
-  {
-    if (fabs(raySensor->GetRange(i) - maxRange) > LASER_TOL)
-      foundNoise = true;
-    total += raySensor->GetRange(i);
-  }
-  EXPECT_TRUE(foundNoise);
-  double mean = total / raySensor->GetRayCount();
-  // The mean should be well within 3-sigma
-  EXPECT_NEAR(mean, maxRange + noiseMean, 3*noiseStdDev);
-}
-
-TEST_F(LaserTest, LaserNoiseODE)
-{
-  LaserUnitNoise("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(LaserTest, LaserNoiseBullet)
-{
-  LaserUnitNoise("bullet");
-}
-#endif  // HAVE_BULLET
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/physics.cc b/test/regression/physics.cc
deleted file mode 100644
index edc19ff..0000000
--- a/test/regression/physics.cc
+++ /dev/null
@@ -1,1531 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "ServerFixture.hh"
-#include "physics/physics.hh"
-#include "SimplePendulumIntegrator.hh"
-#include "gazebo/msgs/msgs.hh"
-
-#define PHYSICS_TOL 1e-2
-using namespace gazebo;
-
-class PhysicsTest : public ServerFixture
-{
-  public: void EmptyWorld(const std::string &_physicsEngine);
-  public: void SpawnDrop(const std::string &_physicsEngine);
-  public: void SpawnDropCoGOffset(const std::string &_physicsEngine);
-  public: void RevoluteJoint(const std::string &_physicsEngine);
-  public: void SimplePendulum(const std::string &_physicsEngine);
-  public: void CollisionFiltering(const std::string &_physicsEngine);
-};
-
-////////////////////////////////////////////////////////////////////////
-// EmptyWorld:
-// Load a world, take a few steps, and verify that time is increasing.
-// This is the most basic physics engine test.
-////////////////////////////////////////////////////////////////////////
-void PhysicsTest::EmptyWorld(const std::string &_physicsEngine)
-{
-  // Load an empty world
-  Load("worlds/empty.world", true, _physicsEngine);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // Verify physics engine type
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), _physicsEngine);
-
-  // simulate 1 step
-  world->StepWorld(1);
-  double t = world->GetSimTime().Double();
-  // verify that time moves forward
-  EXPECT_GT(t, 0);
-
-  // simulate a few steps
-  int steps = 20;
-  world->StepWorld(steps);
-  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
-  EXPECT_GT(dt, 0);
-  t = world->GetSimTime().Double();
-  EXPECT_GT(t, 0.99*dt*static_cast<double>(steps+1));
-}
-
-TEST_F(PhysicsTest, EmptyWorldODE)
-{
-  EmptyWorld("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(PhysicsTest, EmptyWorldBullet)
-{
-  EmptyWorld("bullet");
-}
-#endif  // HAVE_BULLET
-
-////////////////////////////////////////////////////////////////////////
-// SpawnDrop:
-// Load a world, check that gravity points along z axis, spawn simple
-// shapes (box, sphere, cylinder), verify that they fall and hit the
-// ground plane. The test currently assumes inelastic collisions.
-////////////////////////////////////////////////////////////////////////
-void PhysicsTest::SpawnDrop(const std::string &_physicsEngine)
-{
-  // load an empty world
-  Load("worlds/empty.world", true, _physicsEngine);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // check the gravity vector
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), _physicsEngine);
-  math::Vector3 g = physics->GetGravity();
-  // Assume gravity vector points down z axis only.
-  EXPECT_EQ(g.x, 0);
-  EXPECT_EQ(g.y, 0);
-  EXPECT_LE(g.z, -9.8);
-
-  // get physics time step
-  double dt = physics->GetMaxStepSize();
-  EXPECT_GT(dt, 0);
-
-  // spawn some simple shapes and check to see that they start falling
-  double z0 = 3;
-  std::map<std::string, math::Vector3> modelPos;
-  modelPos["test_box"] = math::Vector3(0, 0, z0);
-  modelPos["test_sphere"] = math::Vector3(4, 0, z0);
-  modelPos["test_cylinder"] = math::Vector3(8, 0, z0);
-  modelPos["test_empty"] = math::Vector3(12, 0, z0);
-
-  // FIXME Trimesh drop test passes in bullet but fails in ode because
-  // the mesh bounces to the side when it hits the ground.
-  // See issue #513. Uncomment test when issue is resolved.
-  // modelPos["test_trimesh"] = math::Vector3(16, 0, z0);
-
-  SpawnBox("test_box", math::Vector3(1, 1, 1), modelPos["test_box"],
-      math::Vector3::Zero);
-  SpawnSphere("test_sphere", modelPos["test_sphere"], math::Vector3::Zero);
-  SpawnCylinder("test_cylinder", modelPos["test_cylinder"],
-      math::Vector3::Zero);
-  SpawnEmptyLink("test_empty", modelPos["test_empty"], math::Vector3::Zero);
-  // std::string trimeshPath =
-  //    "file://media/models/cube_20k/meshes/cube_20k.stl";
-  // SpawnTrimesh("test_trimesh", trimeshPath, math::Vector3(0.5, 0.5, 0.5),
-  //    modelPos["test_trimesh"], math::Vector3::Zero);
-
-  int steps = 2;
-  physics::ModelPtr model;
-  math::Pose pose1, pose2;
-  math::Vector3 vel1, vel2;
-
-  double t, x0 = 0;
-  // This loop steps the world forward and makes sure that each model falls,
-  // expecting downward z velocity and decreasing z position.
-  for (std::map<std::string, math::Vector3>::iterator iter = modelPos.begin();
-    iter != modelPos.end(); ++iter)
-  {
-    std::string name = iter->first;
-    // Make sure the model is loaded
-    model = world->GetModel(name);
-    if (model != NULL)
-    {
-      gzdbg << "Check freefall of model " << name << '\n';
-      // Step once and check downward z velocity
-      world->StepWorld(1);
-      vel1 = model->GetWorldLinearVel();
-      t = world->GetSimTime().Double();
-      EXPECT_EQ(vel1.x, 0);
-      EXPECT_EQ(vel1.y, 0);
-      EXPECT_NEAR(vel1.z, g.z*t, -g.z*t*PHYSICS_TOL);
-      // Need to step at least twice to check decreasing z position
-      world->StepWorld(steps - 1);
-      pose1 = model->GetWorldPose();
-      x0 = modelPos[name].x;
-      EXPECT_EQ(pose1.pos.x, x0);
-      EXPECT_EQ(pose1.pos.y, 0);
-      EXPECT_NEAR(pose1.pos.z, z0 + g.z/2*t*t, (z0+g.z/2*t*t)*PHYSICS_TOL);
-      // Check once more and just make sure they keep falling
-      world->StepWorld(steps);
-      vel2 = model->GetWorldLinearVel();
-      pose2 = model->GetWorldPose();
-      EXPECT_LT(vel2.z, vel1.z);
-      EXPECT_LT(pose2.pos.z, pose1.pos.z);
-    }
-    else
-    {
-      gzerr << "Error loading model " << name << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-  }
-
-  // Predict time of contact with ground plane.
-  double tHit = sqrt(2*(z0-0.5) / (-g.z));
-  // Time to advance, allow 0.5 s settling time.
-  // This assumes inelastic collisions with the ground.
-  double dtHit = tHit+0.5 - world->GetSimTime().Double();
-  steps = ceil(dtHit / dt);
-  EXPECT_GT(steps, 0);
-  world->StepWorld(steps);
-
-  // This loop checks the velocity and pose of each model 0.5 seconds
-  // after the time of predicted ground contact. The velocity is expected
-  // to be small, and the pose is expected to be underneath the initial pose.
-  for (std::map<std::string, math::Vector3>::iterator iter = modelPos.begin();
-    iter != modelPos.end(); ++iter)
-  {
-    std::string name = iter->first;
-    // Make sure the model is loaded
-    model = world->GetModel(name);
-    if (model != NULL)
-    {
-      gzdbg << "Check ground contact of model " << name << '\n';
-      // Check that velocity is small
-      vel1 = model->GetWorldLinearVel();
-      t = world->GetSimTime().Double();
-      EXPECT_NEAR(vel1.x, 0, PHYSICS_TOL);
-      EXPECT_NEAR(vel1.y, 0, PHYSICS_TOL);
-      if (name == "test_empty")
-        EXPECT_NEAR(vel1.z, g.z*t, -g.z*t*PHYSICS_TOL);
-      else
-        EXPECT_NEAR(vel1.z, 0, PHYSICS_TOL);
-
-      // Check that model is resting on ground
-      pose1 = model->GetWorldPose();
-      x0 = modelPos[name].x;
-      EXPECT_NEAR(pose1.pos.x, x0, PHYSICS_TOL);
-      EXPECT_NEAR(pose1.pos.y, 0, PHYSICS_TOL);
-      if (name == "test_empty")
-      {
-        EXPECT_NEAR(pose1.pos.z, z0+g.z/2*t*t,
-            fabs((z0+g.z/2*t*t)*PHYSICS_TOL));
-      }
-      else
-        EXPECT_NEAR(pose1.pos.z, 0.5, PHYSICS_TOL);
-    }
-    else
-    {
-      gzerr << "Error loading model " << name << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-  }
-}
-
-TEST_F(PhysicsTest, SpawnDropODE)
-{
-  SpawnDrop("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(PhysicsTest, SpawnDropBullet)
-{
-  SpawnDrop("bullet");
-}
-#endif  // HAVE_BULLET
-
-////////////////////////////////////////////////////////////////////////
-// SpawnDropCoGOffset:
-// Load a world, check that gravity points along z axis, spawn several
-// spheres of varying radii and center of gravity (cg) location.
-//  sphere1: smaller radius, centered cg
-//  sphere2: larger radius, centered cg
-//  sphere3: larger radius, lowered cg
-//  sphere4: larger radius, raised cg
-//  sphere5: larger radius, y offset cg
-//  sphere6: larger radius, x offset cg
-//  sphere7: larger radius, 45 deg offset cg
-//  sphere8: larger radius, -30 deg offset cg
-// The bottom of each sphere is at the same height, and it is verified
-// that they hit the ground at the same time. Also, sphere5 should start
-// rolling to the side when it hits the ground.
-////////////////////////////////////////////////////////////////////////
-void PhysicsTest::SpawnDropCoGOffset(const std::string &_physicsEngine)
-{
-  // load an empty world
-  Load("worlds/empty.world", true, _physicsEngine);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // check the gravity vector
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), _physicsEngine);
-  math::Vector3 g = physics->GetGravity();
-  // Assume gravity vector points down z axis only.
-  EXPECT_EQ(g.x, 0);
-  EXPECT_EQ(g.y, 0);
-  EXPECT_LT(g.z, 0);
-
-  // get physics time step
-  double dt = physics->GetMaxStepSize();
-  EXPECT_GT(dt, 0);
-
-  // spawn some spheres and check to see that they start falling
-  double z0 = 3;
-  double r1 = 0.5, r2 = 1.5;
-  math::Vector3 v30 = math::Vector3::Zero;
-  math::Vector3 cog;
-  math::Angle angle;
-
-  std::vector<std::string> modelNames;
-  std::vector<double> x0s;
-  std::vector<double> y0s;
-  std::vector<double> radii;
-  std::vector<math::Vector3> cogs;
-
-  // sphere1 and sphere2 have c.g. at center of sphere, different sizes
-  modelNames.push_back("small_centered_sphere");
-  x0s.push_back(0);
-  y0s.push_back(0);
-  radii.push_back(r1);
-  cogs.push_back(v30);
-
-  modelNames.push_back("large_centered_sphere");
-  x0s.push_back(4);
-  y0s.push_back(0);
-  radii.push_back(r2);
-  cogs.push_back(v30);
-
-  // sphere3 has c.g. below the center
-  modelNames.push_back("lowered_cog_sphere");
-  x0s.push_back(8);
-  y0s.push_back(0);
-  radii.push_back(r2);
-  cogs.push_back(math::Vector3(0, 0, -r1));
-
-  // sphere4 has c.g. above the center
-  modelNames.push_back("raised_cog_sphere");
-  x0s.push_back(-4);
-  y0s.push_back(0);
-  radii.push_back(r2);
-  cogs.push_back(math::Vector3(0, 0, r1));
-
-  // sphere5 has c.g. to the side along y axis; it will roll
-  modelNames.push_back("cog_y_offset_sphere");
-  x0s.push_back(-8);
-  y0s.push_back(0);
-  radii.push_back(r2);
-  cogs.push_back(math::Vector3(0, r1, 0));
-
-  // sphere6 has c.g. to the side along x axis; it will roll
-  modelNames.push_back("cog_x_offset_sphere");
-  x0s.push_back(15);
-  y0s.push_back(0);
-  radii.push_back(r2);
-  cogs.push_back(math::Vector3(r1, 0, 0));
-
-  // sphere7 has c.g. to the side diagonally; it will roll
-  modelNames.push_back("cog_xy_45deg_offset_sphere");
-  x0s.push_back(0);
-  y0s.push_back(8);
-  radii.push_back(r2);
-  angle.SetFromDegree(45);
-  cogs.push_back(math::Vector3(r1*cos(angle.Radian()),
-                               r1*sin(angle.Radian()), 0));
-
-  // sphere8 has c.g. to the side diagonally; it will roll
-  modelNames.push_back("cog_xy_-30deg_offset_sphere");
-  x0s.push_back(0);
-  y0s.push_back(-8);
-  radii.push_back(r2);
-  angle.SetFromDegree(-30);
-  cogs.push_back(math::Vector3(r1*cos(angle.Radian()),
-                               r1*sin(angle.Radian()), 0));
-
-  unsigned int i;
-  for (i = 0; i < modelNames.size(); ++i)
-  {
-    SpawnSphere(modelNames[i], math::Vector3(x0s[i], y0s[i], z0+radii[i]),
-                v30, cogs[i], radii[i]);
-  }
-
-  int steps = 2;
-  physics::ModelPtr model;
-  math::Pose pose1, pose2;
-  math::Vector3 vel1, vel2;
-
-  double t, x0 = 0, y0 = 0, radius;
-  // This loop steps the world forward and makes sure that each model falls,
-  // expecting downward z velocity and decreasing z position.
-  for (i = 0; i < modelNames.size(); ++i)
-  {
-    // Make sure the model is loaded
-    model = world->GetModel(modelNames[i]);
-    x0 = x0s[i];
-    y0 = y0s[i];
-    radius = radii[i];
-    if (model != NULL)
-    {
-      gzdbg << "Check freefall of model " << modelNames[i] << '\n';
-      // Step once and check downward z velocity
-      world->StepWorld(1);
-      vel1 = model->GetWorldLinearVel();
-      t = world->GetSimTime().Double();
-      EXPECT_EQ(vel1.x, 0);
-      EXPECT_EQ(vel1.y, 0);
-      EXPECT_NEAR(vel1.z, g.z*t, -g.z*t*PHYSICS_TOL);
-      // Need to step at least twice to check decreasing z position
-      world->StepWorld(steps - 1);
-      pose1 = model->GetWorldPose();
-      EXPECT_NEAR(pose1.pos.x, x0, PHYSICS_TOL*PHYSICS_TOL);
-      EXPECT_NEAR(pose1.pos.y, y0, PHYSICS_TOL*PHYSICS_TOL);
-      EXPECT_NEAR(pose1.pos.z, z0+radius + g.z/2*t*t,
-                  (z0+radius+g.z/2*t*t)*PHYSICS_TOL);
-
-      // Check once more and just make sure they keep falling
-      world->StepWorld(steps);
-      vel2 = model->GetWorldLinearVel();
-      pose2 = model->GetWorldPose();
-      EXPECT_LT(vel2.z, vel1.z);
-      EXPECT_LT(pose2.pos.z, pose1.pos.z);
-    }
-    else
-    {
-      gzerr << "Error loading model " << modelNames[i] << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-  }
-
-  // Predict time of contact with ground plane.
-  double tHit = sqrt(2*(z0-0.5) / (-g.z));
-  // Time to advance, allow 0.5 s settling time.
-  // This assumes inelastic collisions with the ground.
-  double dtHit = tHit+0.5 - world->GetSimTime().Double();
-  steps = ceil(dtHit / dt);
-  EXPECT_GT(steps, 0);
-  world->StepWorld(steps);
-
-  // This loop checks the velocity and pose of each model 0.5 seconds
-  // after the time of predicted ground contact. Except for sphere5,
-  // the velocity is expected to be small, and the pose is expected
-  // to be underneath the initial pose. sphere5 is expected to be rolling.
-  for (i = 0; i < modelNames.size(); ++i)
-  {
-    // Make sure the model is loaded
-    model = world->GetModel(modelNames[i]);
-    x0 = x0s[i];
-    y0 = y0s[i];
-    radius = radii[i];
-    cog = cogs[i];
-    if (model != NULL)
-    {
-      gzdbg << "Check ground contact and roll without slip of model "
-            << modelNames[i] << '\n';
-
-      // Check that velocity is small
-      vel1 = model->GetWorldLinearVel();
-      vel2 = model->GetWorldAngularVel();
-
-      // vertical component of linear and angular velocity should be small
-      EXPECT_NEAR(vel1.z, 0, PHYSICS_TOL);
-      EXPECT_NEAR(vel2.z, 0, PHYSICS_TOL);
-
-      // expect small values for directions with no offset
-      if (cog.x == 0)
-      {
-        EXPECT_NEAR(vel1.x, 0, PHYSICS_TOL);
-        EXPECT_NEAR(vel2.y, 0, PHYSICS_TOL);
-      }
-      // expect rolling in direction of cog offset
-      else
-      {
-        EXPECT_GT(vel1.x*cog.x, 0.2*cog.x*cog.x);
-        EXPECT_GT(vel2.y*cog.x, 0.2*cog.x*cog.x);
-      }
-
-      if (cog.y == 0)
-      {
-        EXPECT_NEAR(vel1.y, 0, PHYSICS_TOL);
-        EXPECT_NEAR(vel2.x, 0, PHYSICS_TOL);
-      }
-      else
-      {
-        EXPECT_GT(vel1.y*cog.y,  0.2*cog.y*cog.y);
-        EXPECT_LT(vel2.x*cog.y, -0.2*cog.y*cog.y);
-      }
-
-      // Expect roll without slip
-      EXPECT_NEAR(vel1.x,  vel2.y*radius, PHYSICS_TOL);
-      EXPECT_NEAR(vel1.y, -vel2.x*radius, PHYSICS_TOL);
-
-      // Use GetWorldLinearVel with global offset to check roll without slip
-      // Expect small linear velocity at contact point
-      math::Vector3 vel3 = model->GetLink()->GetWorldLinearVel(
-          math::Vector3(0, 0, -radius), math::Quaternion(0, 0, 0));
-      EXPECT_NEAR(vel3.x, 0, PHYSICS_TOL);
-      EXPECT_NEAR(vel3.y, 0, PHYSICS_TOL);
-      EXPECT_NEAR(vel3.z, 0, PHYSICS_TOL);
-      // Expect speed at top of sphere to be double the speed at center
-      math::Vector3 vel4 = model->GetLink()->GetWorldLinearVel(
-          math::Vector3(0, 0, radius), math::Quaternion(0, 0, 0));
-      EXPECT_NEAR(vel4.y, 2*vel1.y, PHYSICS_TOL);
-      EXPECT_NEAR(vel4.x, 2*vel1.x, PHYSICS_TOL);
-      EXPECT_NEAR(vel4.z, 0, PHYSICS_TOL);
-
-      // Check that model is resting on ground
-      pose1 = model->GetWorldPose();
-      EXPECT_NEAR(pose1.pos.z, radius, PHYSICS_TOL);
-
-      // expect no pose change for directions with no offset
-      if (cog.x == 0)
-      {
-        EXPECT_NEAR(pose1.pos.x, x0, PHYSICS_TOL);
-      }
-      // expect rolling in direction of cog offset
-      else
-      {
-        EXPECT_GT((pose1.pos.x-x0) * cog.x, cog.x * cog.x);
-      }
-
-      // expect no pose change for directions with no offset
-      if (cog.y == 0)
-      {
-        EXPECT_NEAR(pose1.pos.y, y0, PHYSICS_TOL);
-      }
-      // expect rolling in direction of cog offset
-      else
-      {
-        EXPECT_GT((pose1.pos.y-y0) * cog.y, cog.y * cog.y);
-      }
-    }
-    else
-    {
-      gzerr << "Error loading model " << modelNames[i] << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-  }
-}
-
-TEST_F(PhysicsTest, SpawnDropCoGOffsetODE)
-{
-  SpawnDropCoGOffset("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(PhysicsTest, SpawnDropCoGOffsetBullet)
-{
-  SpawnDropCoGOffset("bullet");
-}
-#endif  // HAVE_BULLET
-
-////////////////////////////////////////////////////////////////////////
-// RevoluteJoint:
-// Load 8 double pendulums arranged in a circle.
-// Measure angular velocity of links, and verify proper axis orientation.
-// Then set joint limits and verify that links remain within limits.
-////////////////////////////////////////////////////////////////////////
-void PhysicsTest::RevoluteJoint(const std::string &_physicsEngine)
-{
-  math::Rand::SetSeed(0);
-  // Load world
-  Load("worlds/revolute_joint_test.world", true, _physicsEngine);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // Verify physics engine type
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), _physicsEngine);
-
-  // Model names
-  std::vector<std::string> modelNames;
-  modelNames.push_back("pendulum_0deg");
-  modelNames.push_back("pendulum_45deg");
-  modelNames.push_back("pendulum_90deg");
-  modelNames.push_back("pendulum_135deg");
-  modelNames.push_back("pendulum_180deg");
-  modelNames.push_back("pendulum_225deg");
-  modelNames.push_back("pendulum_270deg");
-  modelNames.push_back("pendulum_315deg");
-
-  // Global axis
-  double sqrt1_2 = sqrt(2.0) / 2.0;
-  std::vector<math::Vector3> globalAxes;
-  globalAxes.push_back(math::Vector3(1, 0, 0));
-  globalAxes.push_back(math::Vector3(sqrt1_2, sqrt1_2, 0));
-  globalAxes.push_back(math::Vector3(0, 1, 0));
-  globalAxes.push_back(math::Vector3(-sqrt1_2, sqrt1_2, 0));
-  globalAxes.push_back(math::Vector3(-1, 0, 0));
-  globalAxes.push_back(math::Vector3(-sqrt1_2, -sqrt1_2, 0));
-  globalAxes.push_back(math::Vector3(0, -1, 0));
-  globalAxes.push_back(math::Vector3(sqrt1_2, -sqrt1_2, 0));
-
-  // Link names
-  std::vector<std::string> linkNames;
-  linkNames.push_back("lower_link");
-  linkNames.push_back("upper_link");
-
-  // Link names
-  std::vector<std::string> jointNames;
-  jointNames.push_back("lower_joint");
-  jointNames.push_back("upper_joint");
-
-  physics::ModelPtr model;
-  physics::LinkPtr link;
-  std::vector<std::string>::iterator modelIter;
-  physics::JointPtr joint;
-
-  // Check global axes before simulation starts
-  std::vector<math::Vector3>::iterator axisIter;
-  axisIter = globalAxes.begin();
-  for (modelIter  = modelNames.begin();
-       modelIter != modelNames.end(); ++modelIter)
-  {
-    model = world->GetModel(*modelIter);
-    if (model)
-    {
-      gzdbg << "Check global axes of model " << *modelIter << '\n';
-      std::vector<std::string>::iterator jointIter;
-      for (jointIter  = jointNames.begin();
-           jointIter != jointNames.end(); ++jointIter)
-      {
-        joint = model->GetJoint(*jointIter);
-        if (joint)
-        {
-          math::Vector3 axis = joint->GetGlobalAxis(0);
-          EXPECT_NEAR(axis.x, (*axisIter).x, PHYSICS_TOL);
-          EXPECT_NEAR(axis.y, (*axisIter).y, PHYSICS_TOL);
-          EXPECT_NEAR(axis.z, (*axisIter).z, PHYSICS_TOL);
-        }
-        else
-        {
-          gzerr << "Error loading joint " << *jointIter
-                << " of model " << *modelIter << '\n';
-          EXPECT_TRUE(joint != NULL);
-        }
-      }
-    }
-    else
-    {
-      gzerr << "Error loading model " << *modelIter << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-    ++axisIter;
-  }
-
-  // Step forward 0.75 seconds
-  double dt = physics->GetMaxStepSize();
-  EXPECT_GT(dt, 0);
-  int steps = ceil(0.75 / dt);
-  world->StepWorld(steps);
-
-  // Get global angular velocity of each link
-  math::Vector3 angVel;
-  for (modelIter  = modelNames.begin();
-       modelIter != modelNames.end(); ++modelIter)
-  {
-    model = world->GetModel(*modelIter);
-    if (model)
-    {
-      gzdbg << "Check angular velocity of model " << *modelIter << '\n';
-      link = model->GetLink("base");
-      if (link)
-      {
-        // Expect stationary base
-        angVel = link->GetWorldAngularVel();
-        EXPECT_NEAR(angVel.x, 0, PHYSICS_TOL*10);
-        EXPECT_NEAR(angVel.y, 0, PHYSICS_TOL*10);
-        EXPECT_NEAR(angVel.z, 0, PHYSICS_TOL*10);
-      }
-      else
-      {
-        gzerr << "Error loading base link of model " << *modelIter << '\n';
-        EXPECT_TRUE(link != NULL);
-      }
-
-      std::vector<std::string>::iterator linkIter;
-      for (linkIter  = linkNames.begin();
-           linkIter != linkNames.end(); ++linkIter)
-      {
-        link = model->GetLink(*linkIter);
-        if (link)
-        {
-          // Expect relative angular velocity of pendulum links to be negative
-          // and along x axis.
-          angVel = link->GetRelativeAngularVel().Normalize();
-          EXPECT_NEAR(angVel.x, -1, PHYSICS_TOL);
-          EXPECT_NEAR(angVel.y,  0, 2*PHYSICS_TOL);
-          EXPECT_NEAR(angVel.z,  0, 2*PHYSICS_TOL);
-        }
-        else
-        {
-          gzerr << "Error loading link " << *linkIter
-                << " of model " << *modelIter << '\n';
-          EXPECT_TRUE(link != NULL);
-        }
-      }
-    }
-    else
-    {
-      gzerr << "Error loading model " << *modelIter << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-  }
-
-  // Keep stepping forward, verifying that joint angles move in the direction
-  // implied by the joint velocity
-  for (modelIter  = modelNames.begin();
-       modelIter != modelNames.end(); ++modelIter)
-  {
-    model = world->GetModel(*modelIter);
-    if (model)
-    {
-      double jointVel1, jointVel2;
-      double angle1, angle2, angle3;
-
-      gzdbg << "Check angle measurement for " << *modelIter << '\n';
-      std::vector<std::string>::iterator jointIter;
-      for (jointIter  = jointNames.begin();
-           jointIter != jointNames.end(); ++jointIter)
-      {
-        joint = model->GetJoint(*jointIter);
-        if (joint)
-        {
-          // Get first joint angle
-          angle1 = joint->GetAngle(0).Radian();
-
-          // Get joint velocity and assume it is not too small
-          jointVel1 = joint->GetVelocity(0);
-          EXPECT_GT(fabs(jointVel1), 1e-1);
-
-          // Take 1 step and measure again
-          world->StepWorld(1);
-
-          // Expect angle change in direction of joint velocity
-          angle2 = joint->GetAngle(0).Radian();
-          EXPECT_GT((angle2 - angle1) * math::clamp(jointVel1*1e4, -1.0, 1.0)
-                    , 0);
-
-          jointVel2 = joint->GetVelocity(0);
-          EXPECT_GT(fabs(jointVel2), 1e-1);
-
-          // Take 1 step and measure the last angle, expect decrease
-          world->StepWorld(1);
-          angle3 = joint->GetAngle(0).Radian();
-          EXPECT_GT((angle3 - angle2) * math::clamp(jointVel2*1e4, -1.0, 1.0)
-                    , 0);
-        }
-        else
-        {
-          gzerr << "Error loading joint " << *jointIter
-                << " of model " << *modelIter << '\n';
-          EXPECT_TRUE(joint != NULL);
-        }
-      }
-    }
-    else
-    {
-      gzerr << "Error loading model " << *modelIter << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-  }
-
-
-  // Reset the world, and impose joint limits
-  world->Reset();
-  for (modelIter  = modelNames.begin();
-       modelIter != modelNames.end(); ++modelIter)
-  {
-    model = world->GetModel(*modelIter);
-    if (model)
-    {
-      std::vector<std::string>::iterator jointIter;
-      for (jointIter  = jointNames.begin();
-           jointIter != jointNames.end(); ++jointIter)
-      {
-        joint = model->GetJoint(*jointIter);
-        if (joint)
-        {
-          joint->SetLowStop(0, math::Angle(-0.1));
-          joint->SetHighStop(0, math::Angle(0.1));
-        }
-        else
-        {
-          gzerr << "Error loading joint " << *jointIter
-                << " of model " << *modelIter << '\n';
-          EXPECT_TRUE(joint != NULL);
-        }
-      }
-    }
-    else
-    {
-      gzerr << "Error loading model " << *modelIter << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-  }
-
-  // Step forward again for 0.75 seconds and check that joint angles
-  // are within limits
-  world->StepWorld(steps);
-  for (modelIter  = modelNames.begin();
-       modelIter != modelNames.end(); ++modelIter)
-  {
-    model = world->GetModel(*modelIter);
-    if (model)
-    {
-      gzdbg << "Check angle limits and velocity of joints of model "
-            << *modelIter << '\n';
-      std::vector<std::string>::iterator jointIter;
-      for (jointIter  = jointNames.begin();
-           jointIter != jointNames.end(); ++jointIter)
-      {
-        joint = model->GetJoint(*jointIter);
-        if (joint)
-        {
-          EXPECT_NEAR(joint->GetAngle(0).Radian(), 0, 0.11);
-        }
-        else
-        {
-          gzerr << "Error loading joint " << *jointIter
-                << " of model " << *modelIter << '\n';
-          EXPECT_TRUE(joint != NULL);
-        }
-      }
-    }
-    else
-    {
-      gzerr << "Error loading model " << *modelIter << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-  }
-
-  // Reset world again, disable gravity, detach upper_joint
-  // Then apply torque at lower_joint and verify motion
-  world->Reset();
-  for (modelIter  = modelNames.begin();
-       modelIter != modelNames.end(); ++modelIter)
-  {
-    model = world->GetModel(*modelIter);
-    if (model)
-    {
-      gzdbg << "Check SetForce for model " << *modelIter << '\n';
-      std::vector<std::string>::iterator linkIter;
-      for (linkIter  = linkNames.begin();
-           linkIter != linkNames.end(); ++linkIter)
-      {
-        link = model->GetLink(*linkIter);
-        if (link)
-        {
-          // Disable gravity for links.
-          link->SetGravityMode(false);
-        }
-        else
-        {
-          gzerr << "Error loading link " << *linkIter
-                << " of model " << *modelIter << '\n';
-          EXPECT_TRUE(link != NULL);
-        }
-      }
-
-      joint = model->GetJoint("upper_joint");
-      if (joint)
-      {
-        // Detach upper_joint.
-        joint->Detach();
-      }
-      else
-      {
-        gzerr << "Error loading upper_joint "
-              << " of model " << *modelIter << '\n';
-        EXPECT_TRUE(joint != NULL);
-      }
-
-      // Step forward and let things settle a bit.
-      world->StepWorld(100);
-
-      joint = model->GetJoint("lower_joint");
-      if (joint)
-      {
-        double oldVel, newVel, force;
-        oldVel = joint->GetVelocity(0);
-        // Apply positive torque to the lower_joint and step forward.
-        force = 1;
-        for (int i = 0; i < 10; ++i)
-        {
-          joint->SetForce(0, force);
-          world->StepWorld(1);
-          joint->SetForce(0, force);
-          world->StepWorld(1);
-          joint->SetForce(0, force);
-          world->StepWorld(1);
-          newVel = joint->GetVelocity(0);
-          // Expect increasing velocities
-          EXPECT_GT(newVel, oldVel);
-          oldVel = newVel;
-
-          // Check that GetForce returns what we set
-          EXPECT_NEAR(joint->GetForce(0u), force, PHYSICS_TOL);
-
-          // Expect joint velocity to be near angular velocity difference
-          // of child and parent, along global axis
-          // jointVel == DOT(angVelChild - angVelParent, axis)
-          double jointVel = joint->GetVelocity(0);
-          math::Vector3 axis = joint->GetGlobalAxis(0);
-          angVel  = joint->GetChild()->GetWorldAngularVel();
-          angVel -= joint->GetParent()->GetWorldAngularVel();
-          EXPECT_NEAR(jointVel, axis.Dot(angVel), PHYSICS_TOL);
-        }
-        // Apply negative torque to lower_joint
-        force = -3;
-        for (int i = 0; i < 10; ++i)
-        {
-          joint->SetForce(0, force);
-          world->StepWorld(1);
-          joint->SetForce(0, force);
-          world->StepWorld(1);
-          joint->SetForce(0, force);
-          world->StepWorld(1);
-          newVel = joint->GetVelocity(0);
-          // Expect decreasing velocities
-          EXPECT_LT(newVel, oldVel);
-
-          // Check that GetForce returns what we set
-          EXPECT_NEAR(joint->GetForce(0u), force, PHYSICS_TOL);
-
-          // Expect joint velocity to be near angular velocity difference
-          // of child and parent, along global axis
-          // jointVel == DOT(angVelChild - angVelParent, axis)
-          double jointVel = joint->GetVelocity(0);
-          math::Vector3 axis = joint->GetGlobalAxis(0);
-          angVel  = joint->GetChild()->GetWorldAngularVel();
-          angVel -= joint->GetParent()->GetWorldAngularVel();
-          EXPECT_NEAR(jointVel, axis.Dot(angVel), PHYSICS_TOL);
-        }
-      }
-      else
-      {
-        gzerr << "Error loading lower_joint "
-              << " of model " << *modelIter << '\n';
-        EXPECT_TRUE(joint != NULL);
-      }
-    }
-    else
-    {
-      gzerr << "Error loading model " << *modelIter << '\n';
-      EXPECT_TRUE(model != NULL);
-    }
-  }
-}
-
-TEST_F(PhysicsTest, RevoluteJointODE)
-{
-  RevoluteJoint("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(PhysicsTest, RevoluteJointBullet)
-{
-  RevoluteJoint("bullet");
-}
-#endif  // HAVE_BULLET
-
-TEST_F(PhysicsTest, State)
-{
-  /// \TODO: Redo state test
-  /*
-  Load("worlds/empty.world");
-  physics::WorldPtr world = physics::get_world("default");
-  EXPECT_TRUE(world != NULL);
-
-  physics::WorldState worldState = world->GetState();
-  physics::ModelState modelState = worldState.GetModelState(0);
-  physics::LinkState linkState = modelState.GetLinkState(0);
-  physics::CollisionState collisionState = linkState.GetCollisionState(0);
-
-  math::Pose pose;
-  EXPECT_EQ(1u, worldState.GetModelStateCount());
-  EXPECT_EQ(1u, modelState.GetLinkStateCount());
-  EXPECT_EQ(1u, linkState.GetCollisionStateCount());
-  EXPECT_EQ(pose, modelState.GetPose());
-  EXPECT_EQ(pose, linkState.GetPose());
-  EXPECT_EQ(pose, collisionState.GetPose());
-
-  Unload();
-  Load("worlds/shapes.world");
-  world = physics::get_world("default");
-  EXPECT_TRUE(world != NULL);
-  worldState = world->GetState();
-
-  for (unsigned int i = 0; i < worldState.GetModelStateCount(); ++i)
-  {
-    modelState = worldState.GetModelState(i);
-    if (modelState.GetName() == "plane")
-      pose.Set(math::Vector3(0, 0, 0), math::Quaternion(0, 0, 0));
-    else if (modelState.GetName() == "box")
-      pose.Set(math::Vector3(0, 0, 0.5), math::Quaternion(0, 0, 0));
-    else if (modelState.GetName() == "sphere")
-      pose.Set(math::Vector3(0, 1.5, 0.5), math::Quaternion(0, 0, 0));
-    else if (modelState.GetName() == "cylinder")
-      pose.Set(math::Vector3(0, -1.5, 0.5), math::Quaternion(0, 0, 0));
-
-    EXPECT_TRUE(pose == modelState.GetPose());
-  }
-
-  // Move the box
-  world->GetModel("box")->SetWorldPose(
-      math::Pose(math::Vector3(1, 2, 0.5), math::Quaternion(0, 0, 0)));
-
-  gazebo::common::Time::MSleep(10);
-
-  // Make sure the box has been moved
-  physics::ModelState modelState2 = world->GetState().GetModelState("box");
-  pose.Set(math::Vector3(1, 2, 0.5), math::Quaternion(0, 0, 0));
-  EXPECT_TRUE(pose == modelState2.GetPose());
-
-  // Reset world state, and check for correctness
-  world->SetState(worldState);
-  modelState2 = world->GetState().GetModelState("box");
-  pose.Set(math::Vector3(0, 0, 0.5), math::Quaternion(0, 0, 0));
-  EXPECT_TRUE(pose == modelState2.GetPose());
-  Unload();
-  */
-}
-
-TEST_F(PhysicsTest, JointDampingTest)
-{
-  // Random seed is set to prevent brittle failures (gazebo issue #479)
-  math::Rand::SetSeed(18420503);
-  Load("worlds/damp_test.world", true);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  int i = 0;
-  while (!this->HasEntity("model_4_mass_1_ixx_1_damping_10") && i < 20)
-  {
-    common::Time::MSleep(100);
-    ++i;
-  }
-
-  if (i > 20)
-    gzthrow("Unable to get model_4_mass_1_ixx_1_damping_10");
-
-  physics::ModelPtr model = world->GetModel("model_4_mass_1_ixx_1_damping_10");
-  EXPECT_TRUE(model != NULL);
-
-  {
-    // compare against recorded data only
-    double test_duration = 1.5;
-    double dt = world->GetPhysicsEngine()->GetMaxStepSize();
-    int steps = test_duration/dt;
-
-    for (int i = 0; i < steps; ++i)
-    {
-      world->StepWorld(1);  // theoretical contact, but
-      // gzdbg << "box time [" << world->GetSimTime().Double()
-      //       << "] vel [" << model->GetWorldLinearVel()
-      //       << "] pose [" << model->GetWorldPose()
-      //       << "]\n";
-    }
-
-    EXPECT_EQ(world->GetSimTime().Double(), 1.5);
-
-    // This test expects a linear velocity at the CoG
-    math::Vector3 vel = model->GetLink()->GetWorldCoGLinearVel();
-    math::Pose pose = model->GetWorldPose();
-
-    EXPECT_EQ(vel.x, 0.0);
-
-    EXPECT_LT(vel.y, -10.2006);
-    EXPECT_GT(vel.y, -10.2008);
-    EXPECT_LT(vel.z, -6.51766);
-    EXPECT_GT(vel.z, -6.51768);
-
-    EXPECT_EQ(pose.pos.x, 3.0);
-    EXPECT_LT(pose.pos.y, 5.0e-6);
-    EXPECT_GT(pose.pos.y, 0.0);
-    EXPECT_GT(pose.pos.z, 10.099);
-    EXPECT_LT(pose.pos.z, 10.101);
-    EXPECT_GT(pose.rot.GetAsEuler().x, 0.567336);
-    EXPECT_LT(pose.rot.GetAsEuler().x, 0.567338);
-    EXPECT_EQ(pose.rot.GetAsEuler().y, 0.0);
-    EXPECT_EQ(pose.rot.GetAsEuler().z, 0.0);
-  }
-}
-
-TEST_F(PhysicsTest, DropStuff)
-{
-  Load("worlds/drop_test.world", true);
-  physics::WorldPtr world = physics::get_world("default");
-  EXPECT_TRUE(world != NULL);
-
-  int i = 0;
-  while (!this->HasEntity("cylinder") && i < 20)
-  {
-    common::Time::MSleep(100);
-    ++i;
-  }
-
-  if (i > 20)
-    gzthrow("Unable to get cylinder");
-
-  {
-    // todo: get parameters from drop_test.world
-    double test_duration = 1.5;
-    double z = 10.5;
-    double v = 0.0;
-    double g = -10.0;
-    double dt = world->GetPhysicsEngine()->GetMaxStepSize();
-
-    // world->StepWorld(1428);  // theoretical contact, but
-    // world->StepWorld(100);  // integration error requires few more steps
-
-    int steps = test_duration/dt;
-    bool post_contact_correction = false;
-
-    for (int i = 0; i < steps; ++i)
-    {
-      // integrate here to see when the collision should happen
-      v = v + dt * g;
-      z = z + dt * v;
-
-      world->StepWorld(1);  // theoretical contact, but
-      {
-        physics::ModelPtr box_model = world->GetModel("box");
-        if (box_model)
-        {
-          math::Vector3 vel = box_model->GetWorldLinearVel();
-          math::Pose pose = box_model->GetWorldPose();
-          // gzdbg << "box time [" << world->GetSimTime().Double()
-          //      << "] sim z [" << pose.pos.z
-          //      << "] exact z [" << z
-          //      << "] sim vz [" << vel.z
-          //      << "] exact vz [" << v << "]\n";
-          if (z > 0.5 || !post_contact_correction)
-          {
-            EXPECT_LT(fabs(vel.z - v) , 0.0001);
-            EXPECT_LT(fabs(pose.pos.z - z) , 0.0001);
-          }
-          else
-          {
-            EXPECT_LT(fabs(vel.z), 0.0101);  // sometimes -0.01, why?
-            EXPECT_LT(fabs(pose.pos.z - 0.5), 0.00001);
-          }
-        }
-
-        physics::ModelPtr sphere_model = world->GetModel("sphere");
-        if (sphere_model)
-        {
-          math::Vector3 vel = sphere_model->GetWorldLinearVel();
-          math::Pose pose = sphere_model->GetWorldPose();
-          // gzdbg << "sphere time [" << world->GetSimTime().Double()
-          //       << "] sim z [" << pose.pos.z
-          //       << "] exact z [" << z
-          //       << "] sim vz [" << vel.z
-          //       << "] exact vz [" << v << "]\n";
-          if (z > 0.5 || !post_contact_correction)
-          {
-            EXPECT_LT(fabs(vel.z - v), 0.0001);
-            EXPECT_LT(fabs(pose.pos.z - z), 0.0001);
-          }
-          else
-          {
-            EXPECT_LT(fabs(vel.z), 3e-5);
-            EXPECT_LT(fabs(pose.pos.z - 0.5), 0.00001);
-          }
-        }
-
-        physics::ModelPtr cylinder_model = world->GetModel("cylinder");
-        if (cylinder_model)
-        {
-          math::Vector3 vel = cylinder_model->GetWorldLinearVel();
-          math::Pose pose = cylinder_model->GetWorldPose();
-          // gzdbg << "cylinder time [" << world->GetSimTime().Double()
-          //       << "] sim z [" << pose.pos.z
-          //       << "] exact z [" << z
-          //       << "] sim vz [" << vel.z
-          //       << "] exact vz [" << v << "]\n";
-          if (z > 0.5 || !post_contact_correction)
-          {
-            EXPECT_LT(fabs(vel.z - v), 0.0001);
-            EXPECT_LT(fabs(pose.pos.z - z), 0.0001);
-          }
-          else
-          {
-            EXPECT_LT(fabs(vel.z), 0.011);
-            EXPECT_LT(fabs(pose.pos.z - 0.5), 0.0001);
-          }
-        }
-      }
-      if (z < 0.5) post_contact_correction = true;
-    }
-  }
-}
-
-
-TEST_F(PhysicsTest, CollisionTest)
-{
-  // check conservation of mementum for linear inelastic collision
-  Load("worlds/collision_test.world", true);
-  physics::WorldPtr world = physics::get_world("default");
-  EXPECT_TRUE(world != NULL);
-
-  int i = 0;
-  while (!this->HasEntity("sphere") && i < 20)
-  {
-    common::Time::MSleep(100);
-    ++i;
-  }
-
-  if (i > 20)
-    gzthrow("Unable to get sphere");
-
-  {
-    // todo: get parameters from drop_test.world
-    double test_duration = 1.1;
-    double dt = world->GetPhysicsEngine()->GetMaxStepSize();
-
-    double f = 1000.0;
-    double v = 0;
-    double x = 0;
-
-    int steps = test_duration/dt;
-
-    for (int i = 0; i < steps; ++i)
-    {
-      double t = world->GetSimTime().Double();
-
-      world->StepWorld(1);  // theoretical contact, but
-      {
-        physics::ModelPtr box_model = world->GetModel("box");
-        if (box_model)
-        {
-          math::Vector3 vel = box_model->GetWorldLinearVel();
-          math::Pose pose = box_model->GetWorldPose();
-          // gzdbg << "box time [" << t
-          //      << "] sim x [" << pose.pos.x
-          //      << "] ideal x [" << x
-          //      << "] sim vx [" << vel.x
-          //      << "] ideal vx [" << v
-          //      << "]\n";
-
-          if (i == 0)
-            box_model->GetLink("link")->SetForce(math::Vector3(1000, 0, 0));
-          EXPECT_LT(fabs(pose.pos.x - x), 0.00001);
-          EXPECT_LT(fabs(vel.x - v), 0.00001);
-        }
-
-        physics::ModelPtr sphere_model = world->GetModel("sphere");
-        if (sphere_model)
-        {
-          math::Vector3 vel = sphere_model->GetWorldLinearVel();
-          math::Pose pose = sphere_model->GetWorldPose();
-          // gzdbg << "sphere time [" << world->GetSimTime().Double()
-          //      << "] sim x [" << pose.pos.x
-          //      << "] ideal x [" << x
-          //      << "] sim vx [" << vel.x
-          //      << "] ideal vx [" << v
-          //      << "]\n";
-          if (t < 1.001)
-          {
-            EXPECT_EQ(pose.pos.x, 2);
-            EXPECT_EQ(vel.x, 0);
-          }
-          else
-          {
-            EXPECT_LT(fabs(pose.pos.x - x - 1.0), 0.00001);
-            EXPECT_LT(fabs(vel.x - v), 0.00001);
-          }
-        }
-      }
-
-      // integrate here to see when the collision should happen
-      double impulse = dt*f;
-      if (i == 0) v = v + impulse;
-      else if (t >= 1.0) v = dt*f/ 2.0;  // inelastic col. w/ eqal mass.
-      x = x + dt * v;
-    }
-  }
-}
-
-
-TEST_F(PhysicsTest, SimplePendulumODE)
-{
-  SimplePendulum("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(PhysicsTest, SimplePendulumBullet)
-{
-  SimplePendulum("bullet");
-}
-#endif  // HAVE_BULLET
-
-void PhysicsTest::SimplePendulum(const std::string &_physicsEngine)
-{
-  Load("worlds/simple_pendulums.world", true, _physicsEngine);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), _physicsEngine);
-
-  int i = 0;
-  while (!this->HasEntity("model_1") && i < 20)
-  {
-    common::Time::MSleep(100);
-    ++i;
-  }
-
-  if (i > 20)
-    gzthrow("Unable to get model_1");
-
-  physics::PhysicsEnginePtr physicsEngine = world->GetPhysicsEngine();
-  EXPECT_TRUE(physicsEngine);
-  physics::ModelPtr model = world->GetModel("model_1");
-  EXPECT_TRUE(model);
-  physics::LinkPtr link = model->GetLink("link_2");  // sphere link at end
-  EXPECT_TRUE(link);
-
-  double g = 9.81;
-  double l = 10.0;
-  double m = 10.0;
-
-  double e_start;
-
-  {
-    // check velocity / energy
-    math::Vector3 vel = link->GetWorldLinearVel();
-    math::Pose pos = link->GetWorldPose();
-    double pe = 9.81 * m * pos.pos.z;
-    double ke = 0.5 * m * (vel.x*vel.x + vel.y*vel.y + vel.z*vel.z);
-    e_start = pe + ke;
-    // gzdbg << "total energy [" << e_start
-    //       << "] pe[" << pe
-    //       << "] ke[" << ke
-    //       << "] p[" << pos.pos.z
-    //       << "] v[" << vel
-    //       << "]\n";
-  }
-  physicsEngine->SetMaxStepSize(0.0001);
-  physicsEngine->SetSORPGSIters(1000);
-
-  {
-    // test with global contact_max_correcting_vel at 0 as set by world file
-    //   here we expect significant energy loss as the velocity correction
-    //   is set to 0
-    int steps = 10;  // @todo: make this more general
-    for (int i = 0; i < steps; i ++)
-    {
-      world->StepWorld(2000);
-      {
-        // check velocity / energy
-        math::Vector3 vel = link->GetWorldLinearVel();
-        math::Pose pos = link->GetWorldPose();
-        double pe = 9.81 * m * pos.pos.z;
-        double ke = 0.5 * m * (vel.x*vel.x + vel.y*vel.y + vel.z*vel.z);
-        double e = pe + ke;
-        double e_tol = 3.0*static_cast<double>(i+1)
-          / static_cast<double>(steps);
-        // gzdbg << "total energy [" << e
-        //       << "] pe[" << pe
-        //       << "] ke[" << ke
-        //       << "] p[" << pos.pos.z
-        //       << "] v[" << vel
-        //       << "] error[" << e - e_start
-        //       << "] tol[" << e_tol
-        //       << "]\n";
-
-        EXPECT_LT(fabs(e - e_start), e_tol);
-      }
-
-      physics::JointPtr joint = model->GetJoint("joint_0");
-      if (joint)
-      {
-        double integ_theta = (
-          PendulumAngle(g, l, 1.57079633, 0.0, world->GetSimTime().Double(),
-          0.000001) - 1.5707963);
-        double actual_theta = joint->GetAngle(0).Radian();
-        // gzdbg << "time [" << world->GetSimTime().Double()
-        //       << "] exact [" << integ_theta
-        //       << "] actual [" << actual_theta
-        //       << "] pose [" << model->GetWorldPose()
-        //       << "]\n";
-         EXPECT_LT(fabs(integ_theta - actual_theta) , 0.01);
-      }
-    }
-  }
-
-
-
-  {
-    // test with global contact_max_correcting_vel at 100
-    // here we expect much lower energy loss
-    world->Reset();
-    physicsEngine->SetContactMaxCorrectingVel(100);
-
-    int steps = 10;  // @todo: make this more general
-    for (int i = 0; i < steps; i ++)
-    {
-      world->StepWorld(2000);
-      {
-        // check velocity / energy
-        math::Vector3 vel = link->GetWorldLinearVel();
-        math::Pose pos = link->GetWorldPose();
-        double pe = 9.81 * m * pos.pos.z;
-        double ke = 0.5 * m * (vel.x*vel.x + vel.y*vel.y + vel.z*vel.z);
-        double e = pe + ke;
-        double e_tol = 3.0*static_cast<double>(i+1)
-          / static_cast<double>(steps);
-        // gzdbg << "total energy [" << e
-        //       << "] pe[" << pe
-        //       << "] ke[" << ke
-        //       << "] p[" << pos.pos.z
-        //       << "] v[" << vel
-        //       << "] error[" << e - e_start
-        //       << "] tol[" << e_tol
-        //       << "]\n";
-
-        EXPECT_LT(fabs(e - e_start), e_tol);
-      }
-
-      physics::JointPtr joint = model->GetJoint("joint_0");
-      if (joint)
-      {
-        double integ_theta = (
-          PendulumAngle(g, l, 1.57079633, 0.0, world->GetSimTime().Double(),
-          0.000001) - 1.5707963);
-        double actual_theta = joint->GetAngle(0).Radian();
-        // gzdbg << "time [" << world->GetSimTime().Double()
-        //       << "] exact [" << integ_theta
-        //       << "] actual [" << actual_theta
-        //       << "] pose [" << model->GetWorldPose()
-        //       << "]\n";
-         EXPECT_LT(fabs(integ_theta - actual_theta) , 0.01);
-      }
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-// CollisionFiltering:
-// Load a world, spawn a model with two overlapping links. By default,
-// the links should not collide with each other as they have the same
-// parent model. Check the x and y velocities to see if they are 0
-////////////////////////////////////////////////////////////////////////
-void PhysicsTest::CollisionFiltering(const std::string &_physicsEngine)
-{
-  // load an empty world
-  Load("worlds/empty.world", true, _physicsEngine);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  std::stringstream newModelStr;
-
-  std::string modelName = "multiLinkModel";
-  math::Pose modelPose(0, 0, 2, 0, 0, 0);
-  math::Pose link01Pose(0, 0.1, 0, 0, 0, 0);
-  math::Pose link02Pose(0, -0.1, 0, 0, 0, 0);
-
-  // A model composed of two overlapping links at fixed y offset from origin
-  newModelStr << "<sdf version='" << SDF_VERSION << "'>"
-              << "<model name ='" << modelName << "'>"
-              << "<pose>" << modelPose.pos.x << " "
-                         << modelPose.pos.y << " "
-                         << modelPose.pos.z << " "
-                         << modelPose.rot.GetAsEuler().x << " "
-                         << modelPose.rot.GetAsEuler().y << " "
-                         << modelPose.rot.GetAsEuler().z << "</pose>"
-              << "<link name ='link01'>"
-              << "  <pose>" << link01Pose.pos.x << " "
-                         << link01Pose.pos.y << " "
-                         << link01Pose.pos.z << " "
-                         << link01Pose.rot.GetAsEuler().x << " "
-                         << link01Pose.rot.GetAsEuler().y << " "
-                         << link01Pose.rot.GetAsEuler().z << "</pose>"
-              << "  <collision name ='geom'>"
-              << "    <geometry>"
-              << "      <box><size>1 1 1</size></box>"
-              << "    </geometry>"
-              << "  </collision>"
-              << "  <visual name ='visual'>"
-              << "    <geometry>"
-              << "      <box><size>1 1 1</size></box>"
-              << "    </geometry>"
-              << "  </visual>"
-              << "</link>"
-              << "<link name ='link02'>"
-              << "  <pose>" << link02Pose.pos.x << " "
-                         << link02Pose.pos.y << " "
-                         << link02Pose.pos.z << " "
-                         << link02Pose.rot.GetAsEuler().x << " "
-                         << link02Pose.rot.GetAsEuler().y << " "
-                         << link02Pose.rot.GetAsEuler().z << "</pose>"
-              << "  <collision name ='geom'>"
-              << "    <geometry>"
-              << "      <box><size>1 1 1</size></box>"
-              << "    </geometry>"
-              << "  </collision>"
-              << "  <visual name ='visual'>"
-              << "    <geometry>"
-              << "      <box><size>1 1 1</size></box>"
-              << "    </geometry>"
-              << "  </visual>"
-              << "</link>"
-              << "</model>"
-              << "</sdf>";
-
-  SpawnSDF(newModelStr.str());
-
-  // Wait for the entity to spawn
-  int i = 0;
-  while (!this->HasEntity(modelName) && i < 20)
-  {
-    common::Time::MSleep(100);
-    ++i;
-  }
-  if (i > 20)
-    gzthrow("Unable to spawn model");
-
-  world->StepWorld(5);
-  physics::ModelPtr model = world->GetModel(modelName);
-
-  math::Vector3 vel;
-
-  physics::Link_V links = model->GetLinks();
-  unsigned int linkCount = 2;
-  EXPECT_EQ(links.size(), linkCount);
-  for (physics::Link_V::const_iterator iter = links.begin();
-      iter != links.end(); ++iter)
-  {
-    // Links should not repel each other hence expecting zero x, y vel
-    vel = (*iter)->GetWorldLinearVel();
-    EXPECT_EQ(vel.x, 0);
-    EXPECT_EQ(vel.y, 0);
-
-    // Model should be falling
-    EXPECT_LT(vel.z, 0);
-  }
-}
-
-TEST_F(PhysicsTest, CollisionFilteringODE)
-{
-  CollisionFiltering("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(PhysicsTest, CollisionFilteringBullet)
-{
-  CollisionFiltering("bullet");
-}
-#endif  // HAVE_BULLET
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/pioneer2dx.cc b/test/regression/pioneer2dx.cc
deleted file mode 100644
index ff5465f..0000000
--- a/test/regression/pioneer2dx.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include "ServerFixture.hh"
-#include "physics/physics.hh"
-#include "common/Time.hh"
-
-using namespace gazebo;
-class Pioneer2dx : public ServerFixture
-{
-};
-
-/////////////////////////////////////////////////
-TEST_F(Pioneer2dx, StraightLine)
-{
-  Load("worlds/pioneer2dx.world");
-  transport::PublisherPtr velPub = this->node->Advertise<gazebo::msgs::Pose>(
-      "~/pioneer2dx/vel_cmd");
-
-  int i = 0;
-  while (!this->HasEntity("pioneer2dx") && i < 20)
-  {
-    common::Time::MSleep(100);
-    ++i;
-  }
-
-  if (i > 20)
-    gzthrow("Unable to get pioneer2dx");
-
-  gazebo::msgs::Pose msg;
-  gazebo::msgs::Set(msg.mutable_position(),
-      gazebo::math::Vector3(0.2, 0, 0));
-  gazebo::msgs::Set(msg.mutable_orientation(),
-      gazebo::math::Quaternion(0, 0, 0));
-  velPub->Publish(msg);
-
-  math::Pose startPose, endPose;
-  startPose = this->poses["pioneer2dx"];
-
-  common::Time startTime = this->simTime;
-  common::Time currTime = this->simTime;
-
-  /*struct timespec interval;
-  struct timespec remainder;
-  interval.tv_sec = 1 / 1000;
-  interval.tv_nsec = (1 % 1000) * 1000000;
-  */
-
-  while (currTime - startTime < common::Time(100, 0))
-  {
-    // nanosleep(&interval, &remainder);
-    common::Time::MSleep(100);
-    currTime = this->simTime;
-  }
-  endPose = this->poses["pioneer2dx"];
-
-  double dist = (currTime - startTime).Double() * 0.2;
-  std::cout << "DIst[" << dist << "]\n";
-  std::cout << "EnPose.x[" << endPose.pos.x << "]\n";
-  EXPECT_LT(fabs(endPose.pos.x - dist), 0.1);
-  EXPECT_LT(fabs(endPose.pos.y), 0.5);
-  EXPECT_LT(fabs(endPose.pos.z), 0.01);
-}
-
-/////////////////////////////////////////////////
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/player/CMakeLists.txt b/test/regression/player/CMakeLists.txt
deleted file mode 100644
index fb9d513..0000000
--- a/test/regression/player/CMakeLists.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-include_directories (
-  ${PROJECT_SOURCE_DIR}/gazebo 
-  ${PROJECT_BINARY_DIR}/gazebo 
-  ${ODE_INCLUDE_DIRS}
-  ${OPENGL_INCLUDE_DIR}
-  ${OGRE_INCLUDE_DIRS}
-  ${Boost_INCLUDE_DIRS}
-  ${PLAYER_INCLUDE_DIRS} 
-  ${PROTOBUF_INCLUDE_DIR}
-)
-
-link_directories(  
-  ${OGRE_LIBRARY_PATH}
-  ${Boost_LIBRARY_DIRS} 
-  ${ODE_LIBRARY_DIRS}
-  ${PLAYER_LINK_DIRS}
-)
-
-find_package(GTest REQUIRED)
-include_directories( ${GTEST_INCLUDE_DIRS} )
-
-set (gtest_sources player.cc)
-
-foreach(GTEST_SOURCE_file ${gtest_sources})
-  string(REGEX REPLACE ".cc" "" BINARY_NAME ${GTEST_SOURCE_file})
-  add_executable(${BINARY_NAME} ${GTEST_SOURCE_file} ${PROJECT_SOURCE_DIR}/gazebo/Server.cc ${PROJECT_SOURCE_DIR}/gazebo/Master.cc ${PROJECT_SOURCE_DIR}/gazebo/gazebo.cc)
-
-  target_link_libraries(${BINARY_NAME} ${GTEST_BOTH_LIBRARIES} 
-    gazebo_common
-    gazebo_sdf_interface
-    gazebo_transport
-    gazebo_physics
-    gazebo_sensors
-    gazebo_rendering
-    gazebo_msgs
-    pthread
-    ${tinyxml_libraries}
-    ${PLAYER_LINK_LIBS}
-    )
-  add_test(${BINARY_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME})
-endforeach()
diff --git a/test/regression/player/player.cc b/test/regression/player/player.cc
deleted file mode 100644
index 54f0bea..0000000
--- a/test/regression/player/player.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include <libplayerc++/playerc++.h>
-
-int main(int /*argc*/, char ** /*argv*/)
-{
-  PlayerCc::PlayerClient client(PlayerCc::PLAYER_HOSTNAME,
-                                PlayerCc::PLAYER_PORTNUM);
-  PlayerCc::SimulationProxy sp(&client, 0);
-  PlayerCc::Position2dProxy pp(&client, 0);
-
-  sp.SetPose2d(const_cast<char*>("box_model1"), 1, 1, 0);
-  sp.SetPose3d(const_cast<char*>("box_model1"), -1, -1, 1, 0, 0, 0.707);
-
-  return 1;
-}
-
diff --git a/test/regression/pr2.cc b/test/regression/pr2.cc
deleted file mode 100644
index 575bb87..0000000
--- a/test/regression/pr2.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include "ServerFixture.hh"
-#include "physics/physics.hh"
-
-using namespace gazebo;
-class PR2Test : public ServerFixture
-{
-  public: void StaticPR2(std::string _physicsEngine);
-};
-
-TEST_F(PR2Test, Load)
-{
-  Load("worlds/empty.world");
-  SpawnModel("model://pr2");
-
-  int i;
-  for (i = 0; i < 200 && !this->HasEntity("pr2"); ++i)
-    common::Time::MSleep(200);
-  EXPECT_LT(i, 200);
-
-  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
-      rendering::RenderEngine::NONE)
-    return;
-
-
-  sensors::SensorPtr sensor =
-    sensors::get_sensor("narrow_stereo_gazebo_l_stereo_camera_sensor");
-  EXPECT_TRUE(sensor);
-
-  sensors::CameraSensorPtr camSensor =
-    boost::dynamic_pointer_cast<sensors::CameraSensor>(sensor);
-  EXPECT_TRUE(camSensor);
-
-  while (!camSensor->SaveFrame("/tmp/frame_10.jpg"))
-    common::Time::MSleep(100);
-
-  physics::get_world("default")->GetPhysicsEngine()->SetGravity(
-      math::Vector3(-0.5, 0, -0.1));
-  for (int i = 11; i < 200; i++)
-  {
-    std::ostringstream filename;
-    filename << "/tmp/frame_" << i << ".jpg";
-    camSensor->SaveFrame(filename.str());
-    common::Time::MSleep(100);
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-// StaticPR2:
-// Issue #586 noted a segfault when loading a pr2 as static and stepping
-// physics forward. This test loads a world with several objects and
-// steps time forward.
-////////////////////////////////////////////////////////////////////////
-void PR2Test::StaticPR2(std::string _physicsEngine)
-{
-  Load("worlds/static_pr2.world", true, _physicsEngine);
-
-  // The body of this is copied from PhysicsTest::EmptyWorld
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  // Verify physics engine type
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), _physicsEngine);
-
-  // simulate 1 step
-  world->StepWorld(1);
-  double t = world->GetSimTime().Double();
-  // verify that time moves forward
-  EXPECT_GT(t, 0);
-
-  // simulate a few steps
-  int steps = 20;
-  world->StepWorld(steps);
-  double dt = world->GetPhysicsEngine()->GetMaxStepSize();
-  EXPECT_GT(dt, 0);
-  t = world->GetSimTime().Double();
-  EXPECT_GT(t, 0.99*dt*static_cast<double>(steps+1));
-}
-
-TEST_F(PR2Test, StaticPR2ODE)
-{
-  StaticPR2("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(PR2Test, StaticPR2Bullet)
-{
-  StaticPR2("bullet");
-}
-#endif  // HAVE_BULLET
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/projector.cc b/test/regression/projector.cc
deleted file mode 100644
index 4a943e0..0000000
--- a/test/regression/projector.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include "ServerFixture.hh"
-#include "images_cmp.h"
-
-using namespace gazebo;
-class ProjectorTest : public ServerFixture
-{
-};
-
-TEST_F(ProjectorTest, Projector)
-{
-  if (rendering::RenderEngine::Instance()->GetRenderPathType() ==
-      rendering::RenderEngine::NONE)
-    return;
-
-  Load("worlds/projector.world");
-  SpawnCamera("camera_model", "camera_sensor", math::Vector3(-4, 0, 1),
-              math::Vector3(0, GZ_DTOR(10), 0));
-
-  unsigned char *img = NULL;
-  unsigned int width;
-  unsigned int height;
-  GetFrame("camera_sensor", &img, width, height);
-  ASSERT_EQ(width, static_cast<unsigned int>(320));
-  ASSERT_EQ(height, static_cast<unsigned int>(240));
-
-  unsigned int diffMax = 0;
-  unsigned int diffSum = 0;
-  double diffAvg = 0;
-  ImageCompare(img, projector_world_camera,
-      width, height, 3, diffMax, diffSum, diffAvg);
-  // PrintImage("projector_world_camera", &img, width, height, 3);
-  ASSERT_EQ(diffSum, static_cast<unsigned int>(0));
-  ASSERT_EQ(diffMax, static_cast<unsigned int>(0));
-  ASSERT_EQ(diffAvg, 0.0);
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/scans_cmp.h b/test/regression/scans_cmp.h
deleted file mode 100644
index 1196a27..0000000
--- a/test/regression/scans_cmp.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright 2011 Nate Koenig & Andrew Howard
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#ifndef TEST_SCANS_CMP_H_
-#define TEST_SCANS_CMP_H_
-
-#ifdef __GNUC__
-    #define MAYBE_UNUSED __attribute__((used))
-#elif defined _MSC_VER
-    #pragma warning(disable: Cxxxxx)
-    #define MAYBE_UNUSED
-#else
-    #define MAYBE_UNUSED
-#endif
-
-static double __box_scan[] = {
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-1.5782253900,  1.5746053417,  1.5710809871,  1.5676513303,  1.5643154072,
-1.5610722851,  1.5579210616,  1.5548608639,  1.5518908487,  1.5490102012,
-1.5462181345,  1.5435138895,  1.5408967337,  1.5383659613,  1.5359208926,
-1.5335608733,  1.5312852740,  1.5290934905,  1.5269849423,  1.5249590733,
-1.5230153506,  1.5211532647,  1.5193723288,  1.5176720787,  1.5160520724,
-1.5145118900,  1.5130511332,  1.5116694251,  1.5103664100,  1.5091417531,
-1.5079951406,  1.5069262791,  1.5059348955,  1.5050207370,  1.5041835708,
-1.5034231841,  1.5027393839,  1.5021319965,  1.5016008682,  1.5011458645,
-1.5007668702,  1.5004637896,  1.5002365461,  1.5000850823,  1.5000093600,
-1.5000093600,  1.5000850823,  1.5002365461,  1.5004637896,  1.5007668702,
-1.5011458645,  1.5016008682,  1.5021319965,  1.5027393839,  1.5034231841,
-1.5041835708,  1.5050207370,  1.5059348955,  1.5069262791,  1.5079951406,
-1.5091417531,  1.5103664099,  1.5116694251,  1.5130511332,  1.5145118900,
-1.5160520724,  1.5176720786,  1.5193723287,  1.5211532647,  1.5230153506,
-1.5249590733,  1.5269849423,  1.5290934904,  1.5312852740,  1.5335608732,
-1.5359208926,  1.5383659613,  1.5408967337,  1.5435138894,  1.5462181345,
-1.5490102012,  1.5518908487,  1.5548608639,  1.5579210616,  1.5610722851,
-1.5643154072,  1.5676513302,  1.5710809871,  1.5746053417,  1.5782253899,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000};
-static double *box_scan MAYBE_UNUSED = __box_scan;
-
-static double __plane_scan[] = {
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000,  9.6656585634,  9.0478807252,
-8.5047324589,  8.0234841835,  7.5941456600,  7.2087667472,  6.8609419394,
-6.5454526113,  6.2580042926,  5.9950307712,  5.7535460007,  5.5310307326,
-5.3253447326,  5.1346580881,  4.9573969333,  4.7922001805,  4.6378847381,
-4.4934173364,  4.3578915401,  4.2305088671,  4.1105631832,  3.9974277273,
-3.8905442644,  3.7894139705,  3.6935897344,  3.6026696258,  3.5162913303,
-3.4341273861,  3.3558810921,  3.2812829795,  3.2100877580,  3.1420716642,
-3.0770301506,  3.0147758675,  2.9551368928,  2.8979551762,  2.8430851689,
-2.7903926111,  2.7397534594,  2.6910529333,  2.6441846666,  2.5990499509,
-2.5555570588,  2.5136206380,  2.4731611670,  2.4341044661,  2.3963812565,
-2.3599267625,  2.3246803517,  2.2905852094,  2.2575880428,  2.2256388129,
-2.1946904899,  2.1646988309,  2.1356221764,  2.1074212653,  2.0800590642,
-2.0535006127,  2.0277128801,  2.0026646344,  1.9783263219,  1.9546699563,
-1.9316690161,  1.9092983502,  1.8875340914,  1.8663535750,  1.8457352644,
-1.8256586826,  1.8061043472,  1.7870537115,  1.7684891092,  1.7503937029,
-1.7327514359,  1.7155469886,  1.6987657360,  1.6823937094,  1.6664175601,
-1.6508245260,  1.6356023991,  1.6207394968,  1.6062246337,  1.5920470957,
-1.5781966157,  1.5646633508,  1.5514378607,  1.5385110875,  1.5258743370,
-1.5135192604,  1.5014378379,  1.4896223627,  1.4780654261,  1.4667599035,
-1.4556989409,  1.4448759425,  1.4342845592,  1.4239186765,  1.4137724050,
-1.4038400696,  1.3941162003,  1.3845955233,  1.3752729523,  1.3661435806,
-1.3572026733,  1.3484456602,  1.3398681287,  1.3314658175,  1.3232346102,
-1.3151705296,  1.3072697317,  1.2995285007,  1.2919432439,  1.2845104866,
-1.2772268677,  1.2700891354,  1.2630941425,  1.2562388432,  1.2495202886,
-1.2429356234,  1.2364820824,  1.2301569870,  1.2239577424,  1.2178818341,
-1.2119268257,  1.2060903552,  1.2003701333,  1.1947639402,  1.1892696236,
-1.1838850960,  1.1786083331,  1.1734373709,  1.1683703044,  1.1634052849,
-1.1585405190,  1.1537742661,  1.1491048371,  1.1445305925,  1.1400499409,
-1.1356613378,  1.1313632835,  1.1271543224,  1.1230330412,  1.1189980678,
-1.1150480699,  1.1111817542,  1.1073978648,  1.1036951824,  1.1000725232,
-1.0965287377,  1.0930627101,  1.0896733570,  1.0863596268,  1.0831204985,
-1.0799549813,  1.0768621133,  1.0738409614,  1.0708906196,  1.0680102095,
-1.0651988785,  1.0624557997,  1.0597801715,  1.0571712163,  1.0546281804,
-1.0521503335,  1.0497369679,  1.0473873979,  1.0451009599,  1.0428770110,
-1.0407149295,  1.0386141136,  1.0365739817,  1.0345939715,  1.0326735396,
-1.0308121617,  1.0290093316,  1.0272645609,  1.0255773792,  1.0239473333,
-1.0223739870,  1.0208569207,  1.0193957316,  1.0179900327,  1.0166394533,
-1.0153436380,  1.0141022473,  1.0129149566,  1.0117814565,  1.0107014523,
-1.0096746639,  1.0087008260,  1.0077796872,  1.0069110104,  1.0060945724,
-1.0053301640,  1.0046175896,  1.0039566671,  1.0033472281,  1.0027891173,
-1.0022821928,  1.0018263259,  1.0014214010,  1.0010673155,  1.0007639796,
-1.0005113168,  1.0003092630,  1.0001577673,  1.0000567915,  1.0000063099,
-1.0000063099,  1.0000567915,  1.0001577673,  1.0003092630,  1.0005113168,
-1.0007639796,  1.0010673155,  1.0014214010,  1.0018263259,  1.0022821928,
-1.0027891173,  1.0033472281,  1.0039566671,  1.0046175896,  1.0053301640,
-1.0060945724,  1.0069110104,  1.0077796872,  1.0087008260,  1.0096746639,
-1.0107014523,  1.0117814565,  1.0129149566,  1.0141022473,  1.0153436380,
-1.0166394533,  1.0179900327,  1.0193957316,  1.0208569207,  1.0223739870,
-1.0239473333,  1.0255773792,  1.0272645609,  1.0290093316,  1.0308121617,
-1.0326735396,  1.0345939715,  1.0365739817,  1.0386141136,  1.0407149295,
-1.0428770110,  1.0451009599,  1.0473873979,  1.0497369679,  1.0521503335,
-1.0546281804,  1.0571712163,  1.0597801715,  1.0624557997,  1.0651988785,
-1.0680102095,  1.0708906196,  1.0738409614,  1.0768621133,  1.0799549813,
-1.0831204985,  1.0863596268,  1.0896733570,  1.0930627101,  1.0965287377,
-1.1000725232,  1.1036951824,  1.1073978648,  1.1111817542,  1.1150480699,
-1.1189980678,  1.1230330412,  1.1271543224,  1.1313632835,  1.1356613378,
-1.1400499409,  1.1445305925,  1.1491048371,  1.1537742661,  1.1585405190,
-1.1634052849,  1.1683703044,  1.1734373709,  1.1786083331,  1.1838850960,
-1.1892696236,  1.1947639402,  1.2003701333,  1.2060903552,  1.2119268257,
-1.2178818341,  1.2239577424,  1.2301569870,  1.2364820824,  1.2429356234,
-1.2495202886,  1.2562388432,  1.2630941425,  1.2700891354,  1.2772268677,
-1.2845104866,  1.2919432439,  1.2995285007,  1.3072697317,  1.3151705296,
-1.3232346102,  1.3314658175,  1.3398681287,  1.3484456602,  1.3572026733,
-1.3661435806,  1.3752729523,  1.3845955233,  1.3941162003,  1.4038400696,
-1.4137724050,  1.4239186765,  1.4342845592,  1.4448759425,  1.4556989409,
-1.4667599035,  1.4780654261,  1.4896223627,  1.5014378379,  1.5135192604,
-1.5258743370,  1.5385110875,  1.5514378607,  1.5646633508,  1.5781966157,
-1.5920470957,  1.6062246337,  1.6207394968,  1.6356023991,  1.6508245260,
-1.6664175601,  1.6823937094,  1.6987657360,  1.7155469886,  1.7327514359,
-1.7503937029,  1.7684891092,  1.7870537115,  1.8061043472,  1.8256586826,
-1.8457352644,  1.8663535750,  1.8875340914,  1.9092983502,  1.9316690161,
-1.9546699563,  1.9783263219,  2.0026646344,  2.0277128801,  2.0535006127,
-2.0800590642,  2.1074212653,  2.1356221764,  2.1646988309,  2.1946904899,
-2.2256388129,  2.2575880428,  2.2905852094,  2.3246803517,  2.3599267625,
-2.3963812565,  2.4341044661,  2.4731611670,  2.5136206380,  2.5555570588,
-2.5990499509,  2.6441846666,  2.6910529333,  2.7397534594,  2.7903926111,
-2.8430851689,  2.8979551762,  2.9551368928,  3.0147758675,  3.0770301506,
-3.1420716642,  3.2100877580,  3.2812829795,  3.3558810921,  3.4341273861,
-3.5162913303,  3.6026696258,  3.6935897344,  3.7894139705,  3.8905442644,
-3.9974277273,  4.1105631832,  4.2305088671,  4.3578915401,  4.4934173364,
-4.6378847381,  4.7922001805,  4.9573969333,  5.1346580881,  5.3253447326,
-5.5310307326,  5.7535460007,  5.9950307712,  6.2580042926,  6.5454526113,
-6.8609419394,  7.2087667472,  7.5941456600,  8.0234841835,  8.5047324589,
-9.0478807252,  9.6656585634, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000,
-10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000, 10.0000000000};
-static double *plane_scan MAYBE_UNUSED = __plane_scan;
-
-#endif
diff --git a/test/regression/sdf.cc b/test/regression/sdf.cc
deleted file mode 100644
index 9644f84..0000000
--- a/test/regression/sdf.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include "ServerFixture.hh"
-
-using namespace gazebo;
-class SDFTest : public ServerFixture
-{
-};
-
-TEST_F(PR2Test, Param)
-{
-  sdf::ParamT<char> charP("c", 'a', 0);
-  sdf::ParamT<bool> boolP("b", true, 0);
-  sdf::ParamT<float> floatP("f", 1.0, 0);
-  sdf::ParamT<double> doubleP("d", 1.0, 0);
-  sdf::ParamT<int> intP("i", 1, 0);
-  sdf::ParamT<unsigned int> uintP("ui", 1, 0);
-  sdf::ParamT<std::string> stringP("s", "default", 0);
-  sdf::ParamT<common::Color> colorP("c", common::Color(.1, .2, .3, 1), 0);
-  sdf::ParamT<math::Vector3> vec3P("v3", math::Vector3(1, 2, 3), 0);
-  sdf::ParamT<math::Pose> poseP("v3", math::Pose(math::Vector3(1, 2, 3),
-        math::Quaternion(0, 0, M_PI)), 0);
-
-  EXPECT_TRUE(boolP.IsBool());
-  EXPECT_TRUE(intP.IsInt());
-  EXPECT_TRUE(uintP.IsUInt());
-  EXPECT_TRUE(floatP.IsFloat());
-  EXPECT_TRUE(doubleP.IsDouble());
-  EXPECT_TRUE(doubleP.IsDouble());
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/server_fixture.cc b/test/regression/server_fixture.cc
deleted file mode 100644
index 7e688c1..0000000
--- a/test/regression/server_fixture.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include "ServerFixture.hh"
-
-using namespace gazebo;
-class ServerFixtureTest : public ServerFixture
-{
-  public: void LoadEmptyOfType(const std::string &_physicsType);
-};
-
-////////////////////////////////////////////////////////////////////////
-// LoadPaused:
-// Verify that ServerFixture can load world in paused state
-// Gazebo issue #334
-////////////////////////////////////////////////////////////////////////
-TEST_F(ServerFixtureTest, LoadPaused)
-{
-  // Note the second argument of Load sets the pause state
-  Load("worlds/empty.world", true);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-  gzdbg << "Check IsPaused with no delay\n";
-  EXPECT_TRUE(world->IsPaused());
-
-  common::Time::MSleep(100);
-  gzdbg << "Check IsPaused with 100 ms delay\n";
-  EXPECT_TRUE(world->IsPaused());
-
-  common::Time::MSleep(900);
-  gzdbg << "Check IsPaused with 1000 ms delay\n";
-  EXPECT_TRUE(world->IsPaused());
-}
-
-////////////////////////////////////////////////////////////////////////
-// LoadEmptyOfType:
-// Verify that ServerFixture can load empty world with different types
-// of physics engines (issue #486)
-////////////////////////////////////////////////////////////////////////
-void ServerFixtureTest::LoadEmptyOfType(const std::string &_physicsType)
-{
-  // Note the second argument of Load sets the pause state
-  Load("worlds/empty.world", true, _physicsType);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-
-  physics::PhysicsEnginePtr physics = world->GetPhysicsEngine();
-  ASSERT_TRUE(physics != NULL);
-  EXPECT_EQ(physics->GetType(), _physicsType);
-}
-
-TEST_F(ServerFixtureTest, LoadODE)
-{
-  LoadEmptyOfType("ode");
-}
-
-#ifdef HAVE_BULLET
-TEST_F(ServerFixtureTest, LoadBullet)
-{
-  LoadEmptyOfType("bullet");
-}
-#endif  // HAVE_BULLET
-
-////////////////////////////////////////////////////////////////////////
-// SpawnSDF:
-// Verify that the SpawnSDF function does not get stuck in a loop
-// Gazebo issue #530
-////////////////////////////////////////////////////////////////////////
-TEST_F(ServerFixtureTest, SpawnSDF)
-{
-  // Note the second argument of Load sets the pause state
-  Load("worlds/blank.world", true);
-  physics::WorldPtr world = physics::get_world("default");
-  ASSERT_TRUE(world != NULL);
-  EXPECT_TRUE(world->IsPaused());
-
-  std::stringstream sdfStr;
-  math::Pose pose(1, 2, 3, 0, 0, 0);
-  sdfStr << "<sdf version='" << SDF_VERSION << "'>"
-         << "<model name='box'>"
-         << "  <pose>" << pose << "</pose>"
-         << "  <link name='link'>"
-         << "    <collision name='col'>"
-         << "      <geometry>"
-         << "        <box><size>1 1 1</size></box>"
-         << "      </geometry>"
-         << "    </collision>"
-         << "    <visual name='vis'>"
-         << "      <geometry>"
-         << "        <box><size>1 1 1</size></box>"
-         << "      </geometry>"
-         << "    </visual>"
-         << "  </link>"
-         << "</model>"
-         << "</sdf>";
-  SpawnSDF(sdfStr.str());
-
-  physics::ModelPtr model;
-  model = world->GetModel("box");
-  ASSERT_TRUE(model != NULL);
-
-  EXPECT_EQ(pose.pos, model->GetWorldPose().pos);
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/set_joint.cc b/test/regression/set_joint.cc
deleted file mode 100644
index 422a057..0000000
--- a/test/regression/set_joint.cc
+++ /dev/null
@@ -1,691 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "ServerFixture.hh"
-#include "physics/physics.hh"
-
-using namespace gazebo;
-class PhysicsTest : public ServerFixture
-{
-};
-
-
-TEST_F(PhysicsTest, State)
-{
-  {
-    // intentionally break the joint using Link::SetWorldPose
-    // let it conflict with Physics pose updates and make sure
-    // internal model state stays consistent
-
-    Load("worlds/empty.world");
-    physics::WorldPtr world = physics::get_world("default");
-    world->SetPaused(true);
-    EXPECT_TRUE(world != NULL);
-
-    world->GetPhysicsEngine()->SetGravity(math::Vector3(0, 0, 0));
-
-    physics::WorldState worldState = world->GetState();
-    physics::ModelState modelState = worldState.GetModelState(0);
-    physics::LinkState linkState = modelState.GetLinkState(0);
-
-
-    {
-      msgs::Factory msg;
-
-      std::ostringstream newModelStr;
-
-      math::Pose pose(0, 0, 3, 0, 0, 0);
-      math::Vector3 size(1.0, 0.1, 0.1);
-      newModelStr
-        << "<gazebo version='" << SDF_VERSION << "'>\n"
-        << "  <model name='model_1'>\n"
-        << "    <pose>" << pose << "</pose>\n"
-        << "    <link name='link_1'>\n"
-        << "      <pose>0 0 0 0 0 0</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <link name='link_2'>\n"
-        << "      <pose>1 0 0 0 0 0</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_01' type='revolute'>\n"
-        << "      <parent>world</parent>\n"
-        << "      <child>link_1</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>1 1 0</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <joint name='joint_12' type='revolute'>\n"
-        << "      <parent>link_1</parent>\n"
-        << "      <child>link_2</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>1 -1 0</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-
-        << "    <link name='link_2a'>\n"  // opposite of link_5
-        << "      <pose>1 -1 0 0 0 " << 0.5*M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_2a2' type='revolute'>\n"
-        << "      <parent>link_2a</parent>\n"
-        << "      <child>link_2</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-
-        << "    <link name='link_2b'>\n"  // second loop start
-        << "      <pose>1 -1 0 0 0 " << 0.0*M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_2a2b' type='revolute'>\n"
-        << "      <parent>link_2a</parent>\n"
-        << "      <child>link_2b</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-
-        << "    <link name='link_3a'>\n"  // second branch
-        << "      <pose>2 -1 0 0 0 " << -0.5*M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_2a3a' type='revolute'>\n"
-        << "      <parent>link_2b</parent>\n"
-        << "      <child>link_3a</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-
-        << "    <link name='link_4a'>\n"  // second branch
-        << "      <pose>2 -2 0 0 0 " << -1.0*M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_3a4a' type='revolute'>\n"
-        << "      <parent>link_3a</parent>\n"
-        << "      <child>link_4a</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-
-        << "    <link name='link_5a'>\n"  // second branch
-        << "      <pose>1 -2 0 0 0 " << 0.5*M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_4a5a' type='revolute'>\n"
-        << "      <parent>link_4a</parent>\n"
-        << "      <child>link_5a</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <joint name='joint_5a2b' type='revolute'>\n"  // loop closer
-        << "      <parent>link_5a</parent>\n"
-        << "      <child>link_2b</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-
-        << "    <link name='link_3'>\n"
-        << "      <pose>2 0 0 0 0 " << 0.5*M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_23' type='revolute'>\n"
-        << "      <parent>link_2</parent>\n"
-        << "      <child>link_3</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-
-        << "    <link name='link_4'>\n"
-        << "      <pose>2 1 0 0 0 " << M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_34' type='revolute'>\n"
-        << "      <parent>link_3</parent>\n"
-        << "      <child>link_4</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <link name='link_5'>\n"
-        << "      <pose>1 1 0 0 0 " << 1.5*M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_45' type='revolute'>\n"
-        << "      <parent>link_4</parent>\n"
-        << "      <child>link_5</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <joint name='joint_52' type='revolute'>\n"
-        << "      <parent>link_5</parent>\n"
-        << "      <child>link_2</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "  </model>\n"
-        << "</gazebo>\n";
-
-      msg.set_sdf(newModelStr.str());
-
-      transport::PublisherPtr factoryPub
-        = this->node->Advertise<msgs::Factory>("~/factory");
-      this->factoryPub->Publish(msg);
-    }
-
-    sleep(5);
-
-    world->EnablePhysicsEngine(false);
-
-    physics::ModelPtr model = world->GetModel("model_1");
-    while (!model)
-    {
-      model = world->GetModel("model_1");
-      gzdbg << "waiting for model_1 to spawn\n";
-      sleep(1);
-    }
-    world->SetPaused(false);
-
-    physics::JointPtr joint_01 = model->GetJoint("model_1::joint_01");
-    physics::JointPtr joint_12 = model->GetJoint("model_1::joint_12");
-    physics::JointPtr joint_23 = model->GetJoint("model_1::joint_23");
-    physics::JointPtr joint_34 = model->GetJoint("model_1::joint_34");
-    physics::JointPtr joint_45 = model->GetJoint("model_1::joint_45");
-    physics::JointPtr joint_52 = model->GetJoint("model_1::joint_52");
-    physics::JointPtr joint_2a2 = model->GetJoint("model_1::joint_2a2");
-    physics::JointPtr joint_2a2b = model->GetJoint("model_1::joint_2a2b");
-    physics::JointPtr joint_2a3a = model->GetJoint("model_1::joint_2a3a");
-    physics::JointPtr joint_3a4a = model->GetJoint("model_1::joint_3a4a");
-    physics::JointPtr joint_4a5a = model->GetJoint("model_1::joint_4a5a");
-    physics::JointPtr joint_5a2b = model->GetJoint("model_1::joint_5a2b");
-
-    EXPECT_TRUE(joint_01   != NULL);
-    EXPECT_TRUE(joint_12   != NULL);
-    EXPECT_TRUE(joint_23   != NULL);
-    EXPECT_TRUE(joint_34   != NULL);
-    EXPECT_TRUE(joint_45   != NULL);
-    EXPECT_TRUE(joint_52   != NULL);
-    EXPECT_TRUE(joint_2a2  != NULL);
-    EXPECT_TRUE(joint_2a2b != NULL);
-    EXPECT_TRUE(joint_2a3a != NULL);
-    EXPECT_TRUE(joint_3a4a != NULL);
-    EXPECT_TRUE(joint_4a5a != NULL);
-    EXPECT_TRUE(joint_5a2b != NULL);
-
-
-    double start_time;
-    double start_wall_time;
-    double test_duration;
-    double pub_rate;
-    double last_update_time;
-    double elapsed_wall_time;
-
-    srand_r(seed)(time(NULL));
-    int seed = time(NULL);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 5;
-    pub_rate = 1.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Joint::SetAngle at ["
-      << pub_rate << "] Hz in real time, to all joint, should diverge.\n";
-    last_update_time = start_wall_time;
-    while (world->GetRealTime().Double() < start_wall_time + test_duration)
-      if (world->GetRealTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetRealTime().Double();
-
-        int n = model->GetJointCount();
-        for (int i = 0; i < n; ++i)
-          model->GetJoint(i)->SetAngle(0,
-              0.1*static_cast<double>(rand_r(seed)())/
-              static_cast<double>(RAND_MAX));
-      }
-    test_duration = world->GetSimTime().Double() - start_time;
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-
-
-
-
-
-
-
-    world->EnablePhysicsEngine(true);
-
-
-    /* set all link velocities to 0
-       std::vector<physics::LinkPtr> links = model->GetAllLinks();
-       for (unsigned i = 0; i < links.size(); ++i)
-       {
-       links[i]->SetLinearVel(math::Vector3(0, 0, 0));
-       links[i]->SetAngularVel(math::Vector3(0, 0, 0));
-       } */
-
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 20;
-    pub_rate = 0.5;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Joint::SetAngle at ["
-      << pub_rate << "] Hz to non-loop joints, should have no violation.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        double a = 0.50*(2.0*
-            static_cast<double>(rand_r(seed)())/
-            static_cast<double>(RAND_MAX) - 1.0);
-        joint_01->SetAngle(0, a);
-        // joint_12->SetAngle(0, a);
-        // joint_23->SetAngle(0, a);
-        // joint_2a2->SetAngle(0, a);
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-    // EXPECT_EQ(joint_5a2b->GetAngle(0).Radian(), 0.0);
-    Unload();
-  }
-}
-
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/set_pose.cc b/test/regression/set_pose.cc
deleted file mode 100644
index e4e922b..0000000
--- a/test/regression/set_pose.cc
+++ /dev/null
@@ -1,635 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// #include <signal.h>
-// #include "gui/Gui.hh"
-#include "ServerFixture.hh"
-#include "physics/physics.hh"
-
-using namespace gazebo;
-class PhysicsTest : public ServerFixture
-{
-};
-
-
-TEST_F(PhysicsTest, State)
-{
-  srand(time(NULL));
-  int seed = time(NULL);
-
-  // pid_t pid = fork();
-  // if (pid)
-  // {
-  //   gazebo::gui::run(0, NULL);
-  //   kill(pid, SIGINT);
-  // }
-  // else
-  {
-    // intentionally break the joint using Link::SetWorldPose
-    // let it conflict with Physics pose updates and make sure
-    // internal model state stays consistent
-
-    Load("worlds/empty.world");
-    physics::WorldPtr world = physics::get_world("default");
-    world->SetPaused(true);
-    EXPECT_TRUE(world != NULL);
-
-    physics::WorldState worldState = world->GetState();
-    physics::ModelState modelState = worldState.GetModelState(0);
-    physics::LinkState linkState = modelState.GetLinkState(0);
-
-    {
-      msgs::Factory msg;
-
-      std::ostringstream newModelStr;
-
-      math::Pose pose(0, 0, 3, 0, 0, 0);
-      math::Vector3 size(1.0, 0.1, 0.1);
-      newModelStr
-        << "<gazebo version='" << SDF_VERSION << "'>\n"
-        << "  <model name='model_1'>\n"
-        << "    <pose>" << pose << "</pose>\n"
-        << "    <link name='link_1'>\n"
-        << "      <pose>0 0 0 0 0 0</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <link name='link_2'>\n"
-        << "      <pose>1 0 0 0 0 0</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_01' type='revolute'>\n"
-        << "      <parent>world</parent>\n"
-        << "      <child>link_1</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>1 1 0</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>-0.7071</upper>\n"
-        << "          <lower>0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <joint name='joint_12' type='revolute'>\n"
-        << "      <parent>link_1</parent>\n"
-        << "      <child>link_2</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>1 -1 0</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>-0.7071</upper>\n"
-        << "          <lower>0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <link name='link_3'>\n"
-        << "      <pose>2 0 0 0 0 0</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_23' type='revolute'>\n"
-        << "      <parent>link_2</parent>\n"
-        << "      <child>link_3</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>-0.7071</upper>\n"
-        << "          <lower>0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "  </model>\n"
-        << "</gazebo>\n";
-
-      msg.set_sdf(newModelStr.str());
-
-      transport::PublisherPtr factoryPub
-        = this->node->Advertise<msgs::Factory>("~/factory");
-      this->factoryPub->Publish(msg);
-    }
-    physics::ModelPtr model = world->GetModel("model_1");
-    while (!model)
-    {
-      model = world->GetModel("model_1");
-      gzdbg << "waiting for model_1 to spawn\n";
-      sleep(1);
-    }
-    world->SetPaused(false);
-
-    physics::LinkPtr link_1 = model->GetLink("link_1");
-    physics::LinkPtr link_2 = model->GetLink("link_2");
-    physics::LinkPtr link_3 = model->GetLink("link_3");
-
-
-    EXPECT_TRUE(link_1 != NULL);
-    EXPECT_TRUE(link_2 != NULL);
-    EXPECT_TRUE(link_3 != NULL);
-
-
-
-
-    double start_time;
-    double start_wall_time;
-    double test_duration;
-    double pub_rate;
-    double last_update_time;
-    double elapsed_wall_time;
-
-
-    physics::JointPtr joint_01 = model->GetJoint("model_1::joint_01");
-    physics::JointPtr joint_12 = model->GetJoint("model_1::joint_12");
-    physics::JointPtr joint_23 = model->GetJoint("model_1::joint_23");
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 50;
-    pub_rate = 10.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Joint::SetAngle at ["
-      << pub_rate << "] Hz.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        joint_01->SetAngle(0, 0.707*(2*
-              static_cast<double>(rand_r(seed))/
-              static_cast<double>(RAND_MAX)-1));
-        joint_12->SetAngle(0, 0.707*(2*
-              static_cast<double>(rand_r(seed))/
-              static_cast<double>(RAND_MAX)-1));
-        joint_23->SetAngle(0, 0.707*(2*
-              static_cast<double>(rand_r(seed))/
-              static_cast<double>(RAND_MAX)-1));
-        sleep(1);
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-
-
-    world->EnablePhysicsEngine(false);
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 10;
-    pub_rate = 10.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Joint::SetAngle as fast as possible, unthrottled.\n";
-    last_update_time = start_wall_time;
-    while (world->GetRealTime().Double() < start_wall_time + test_duration)
-      // if (world->GetRealTime().Double() - last_update_time >= (1.0/pub_rate))
-    {
-      last_update_time = world->GetRealTime().Double();
-      joint_01->SetAngle(0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      joint_12->SetAngle(0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      joint_23->SetAngle(0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-    }
-    test_duration = world->GetSimTime().Double() - start_time;
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-    world->EnablePhysicsEngine(true);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 10;
-    pub_rate = 2.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing SetWorld Pose at ["
-      << pub_rate << "] Hz without constraint violation.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        // gzdbg << "setting link poses without violation\n";
-        // double cur_time = world->GetSimTime().Double();
-        last_update_time = world->GetSimTime().Double();
-        link_1->SetWorldPose(math::Pose(0,    0, 3, 0, 0, 0));
-        link_2->SetWorldPose(math::Pose(1.00, 0, 3, 0, 0, 0));
-        link_3->SetWorldPose(math::Pose(2.00, 0, 3, 0, 0, 0));
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 30;
-    pub_rate = 1.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing SetWorld Pose at ["
-      << pub_rate << "] Hz without constraint violation.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        // gzdbg << "setting link poses without violation\n";
-        // double cur_time = world->GetSimTime().Double();
-        link_1->SetWorldPose(math::Pose(0,    0, 3, 0, 0, 0));
-        link_2->SetWorldPose(math::Pose(1.00, 0, 3, 0, 0, 0));
-        link_3->SetWorldPose(math::Pose(2.00, 0, 3, 0, 0, 0));
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-    // set random pose within joint limit
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 30;
-    pub_rate = 2.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing SetWorld Pose at ["
-      << pub_rate << "] Hz with small constraint violation.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      // if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-    {
-      last_update_time = world->GetSimTime().Double();
-      math::Pose p;
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_1->SetWorldPose(p);
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_2->SetWorldPose(p);
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 2.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_3->SetWorldPose(p);
-
-      math::Vector3 v;
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_1->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_1->SetLinearVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_2->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_2->SetLinearVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_3->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_3->SetLinearVel(v);
-    }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-
-    // set random pose outside of joint limit
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 30;
-    pub_rate = 2.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing SetWorld Pose at ["
-      << pub_rate << "] Hz with more constraint violation.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      // if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-    {
-      last_update_time = world->GetSimTime().Double();
-      math::Pose p;
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/
-          static_cast<double>(RAND_MAX) + 1.57079,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_1->SetWorldPose(p);
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 2.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/
-          static_cast<double>(RAND_MAX) + 1.57079,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_2->SetWorldPose(p);
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/
-          static_cast<double>(RAND_MAX) + 1.57079,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_3->SetWorldPose(p);
-
-      math::Vector3 v;
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_1->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_1->SetLinearVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_2->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_2->SetLinearVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_3->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_3->SetLinearVel(v);
-    }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 30;
-    pub_rate = 1000.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Set*Vel at ["
-      << pub_rate << "] Hz with random values.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        // gzdbg << "setting link poses with violation\n";
-        math::Vector3 v;
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_1->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_1->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_2->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_2->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_3->SetAngularVel(v);
-        v = math::Vector3(
-            stastic_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_3->SetLinearVel(v);
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 20;
-    pub_rate = 500.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Set*Vel at ["
-      << pub_rate << "] Hz with velocity decay.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        // gzdbg << "setting link poses with violation\n";
-        link_1->SetAngularVel(link_1->GetWorldAngularVel() * 0.999);
-        link_1->SetLinearVel(link_1->GetWorldLinearVel()  * 0.999);
-        link_2->SetAngularVel(link_2->GetWorldAngularVel() * 0.999);
-        link_2->SetLinearVel(link_2->GetWorldLinearVel()  * 0.999);
-        link_3->SetAngularVel(link_3->GetWorldAngularVel() * 0.999);
-        link_3->SetLinearVel(link_3->GetWorldLinearVel()  * 0.999);
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-    EXPECT_EQ(link_3->GetWorldPose(),
-        math::Pose(0.292968, 0.612084, 1.43649, -2.07141, 1.50881, -1.19487));
-    Unload();
-  }
-}
-
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/set_pose_loop.cc b/test/regression/set_pose_loop.cc
deleted file mode 100644
index a3dabcc..0000000
--- a/test/regression/set_pose_loop.cc
+++ /dev/null
@@ -1,835 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include "ServerFixture.hh"
-#include "physics/physics.hh"
-
-using namespace gazebo;
-class PhysicsTest : public ServerFixture
-{
-};
-
-
-TEST_F(PhysicsTest, State)
-{
-  srand(time(NULL));
-  int seed = time(NULL);
-  {
-    // intentionally break the joint using Link::SetWorldPose
-    // let it conflict with Physics pose updates and make sure
-    // internal model state stays consistent
-
-    Load("worlds/empty.world");
-    physics::WorldPtr world = physics::get_world("default");
-    world->SetPaused(true);
-    EXPECT_TRUE(world != NULL);
-
-    physics::WorldState worldState = world->GetState();
-    physics::ModelState modelState = worldState.GetModelState(0);
-    physics::LinkState linkState = modelState.GetLinkState(0);
-
-
-    {
-      msgs::Factory msg;
-
-      std::ostringstream newModelStr;
-
-      math::Pose pose(0, 0, 3, 0, 0, 0);
-      math::Vector3 size(1.0, 0.1, 0.1);
-      newModelStr
-        << "<gazebo version='" << SDF_VERSION << "'>\n"
-        << "  <model name='model_1'>\n"
-        << "    <pose>" << pose << "</pose>\n"
-        << "    <link name='link_1'>\n"
-        << "      <pose>0 0 0 0 0 0</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <link name='link_2'>\n"
-        << "      <pose>1 0 0 0 0 0</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_01' type='revolute'>\n"
-        << "      <parent>world</parent>\n"
-        << "      <child>link_1</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>1 1 0</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <joint name='joint_12' type='revolute'>\n"
-        << "      <parent>link_1</parent>\n"
-        << "      <child>link_2</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>1 -1 0</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <link name='link_3'>\n"
-        << "      <pose>2 0 0 0 0 " << 0.5*M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_23' type='revolute'>\n"
-        << "      <parent>link_2</parent>\n"
-        << "      <child>link_3</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <link name='link_4'>\n"
-        << "      <pose>2 1 0 0 0 " << M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_34' type='revolute'>\n"
-        << "      <parent>link_3</parent>\n"
-        << "      <child>link_4</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <link name='link_5'>\n"
-        << "      <pose>1 1 0 0 0 " << 1.5*M_PI << "</pose>\n"
-        << "      <inertial>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <mass>1</mass>\n"
-        << "        <inertia>\n"
-        << "          <ixx>1</ixx>\n"
-        << "          <ixy>0</ixy>\n"
-        << "          <ixz>0</ixz>\n"
-        << "          <iyy>1</iyy>\n"
-        << "          <iyz>0</iyz>\n"
-        << "          <izz>1</izz>\n"
-        << "        </inertia>\n"
-        << "      </inertial>\n"
-        << "      <collision name ='collision'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "      </collision>\n"
-        << "      <visual name ='visual'>\n"
-        << "        <pose>0.5 0 0 0 0 0</pose>\n"
-        << "        <geometry>\n"
-        << "          <box>\n"
-        << "            <size>" << size.x << " " << size.y << " "
-        << size.z << "</size>\n"
-        << "          </box>\n"
-        << "        </geometry>\n"
-        << "        <material><script>Gazebo/Grey</script></material>\n"
-        << "      </visual>\n"
-        << "    </link>\n"
-        << "    <joint name='joint_45' type='revolute'>\n"
-        << "      <parent>link_4</parent>\n"
-        << "      <child>link_5</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "    <joint name='joint_52' type='revolute'>\n"
-        << "      <parent>link_5</parent>\n"
-        << "      <child>link_2</child>\n"
-        << "      <axis>\n"
-        << "        <xyz>0 0 1</xyz>\n"
-        << "        <limit>\n"
-        << "          <upper>0.7071</upper>\n"
-        << "          <lower>-0.7071</lower>\n"
-        << "        </limit>\n"
-        << "      </axis>\n"
-        << "    </joint>\n"
-        << "  </model>\n"
-        << "</gazebo>\n";
-
-      msg.set_sdf(newModelStr.str());
-
-      transport::PublisherPtr factoryPub
-        = this->node->Advertise<msgs::Factory>("~/factory");
-      this->factoryPub->Publish(msg);
-    }
-    physics::ModelPtr model = world->GetModel("model_1");
-    while (!model)
-    {
-      model = world->GetModel("model_1");
-      gzdbg << "waiting for model_1 to spawn\n";
-      sleep(1);
-    }
-    world->SetPaused(false);
-
-
-    double start_time;
-    double start_wall_time;
-    double test_duration;
-    double pub_rate;
-    double last_update_time;
-    double elapsed_wall_time;
-
-
-    physics::JointPtr joint_01 = model->GetJoint("model_1::joint_01");
-    physics::JointPtr joint_12 = model->GetJoint("model_1::joint_12");
-    physics::JointPtr joint_23 = model->GetJoint("model_1::joint_23");
-    physics::JointPtr joint_34 = model->GetJoint("model_1::joint_34");
-    physics::JointPtr joint_45 = model->GetJoint("model_1::joint_45");
-    physics::JointPtr joint_52 = model->GetJoint("model_1::joint_52");
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 10;
-    pub_rate = 10.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Joint::SetAngle at ["
-      << pub_rate << "] Hz.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        // gzdbg << "setting link poses without violation\n";
-        // double cur_time = world->GetSimTime().Double();
-        joint_01->SetAngle(0, 0.1);
-        joint_12->SetAngle(0, 0.1);
-        joint_23->SetAngle(0, 0.1);
-        joint_34->SetAngle(0, 0.1);
-        joint_45->SetAngle(0, 0.1);
-        joint_52->SetAngle(0, 0.1);
-
-        joint_01->SetAngle(0, 0.2);
-        joint_12->SetAngle(0, 0.2);
-        joint_23->SetAngle(0, 0.2);
-        joint_34->SetAngle(0, 0.2);
-        joint_45->SetAngle(0, 0.2);
-        joint_52->SetAngle(0, 0.2);
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-
-
-    world->EnablePhysicsEngine(false);
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 20;
-    pub_rate = 10.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Joint::SetAngle at ["
-      << pub_rate << "] Hz with real time duration.\n";
-    last_update_time = start_wall_time;
-    while (world->GetRealTime().Double() < start_wall_time + test_duration)
-      if (world->GetRealTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetRealTime().Double();
-        joint_01->SetAngle(0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        joint_12->SetAngle(0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        joint_23->SetAngle(0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        joint_34->SetAngle(0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        joint_45->SetAngle(0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        joint_52->SetAngle(0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        sleep(1);
-      }
-    test_duration = world->GetSimTime().Double() - start_time;
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-    world->EnablePhysicsEngine(true);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    physics::LinkPtr link_1 = model->GetLink("link_1");
-    physics::LinkPtr link_2 = model->GetLink("link_2");
-    physics::LinkPtr link_3 = model->GetLink("link_3");
-    physics::LinkPtr link_4 = model->GetLink("link_4");
-    physics::LinkPtr link_5 = model->GetLink("link_5");
-
-    EXPECT_TRUE(link_1 != NULL);
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 10;
-    pub_rate = 2.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing SetWorld Pose at ["
-      << pub_rate << "] Hz without constraint violation.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        // gzdbg << "setting link poses without violation\n";
-        // double cur_time = world->GetSimTime().Double();
-        last_update_time = world->GetSimTime().Double();
-        link_1->SetWorldPose(math::Pose(0,    0, 3, 0,        0, 0));
-        link_2->SetWorldPose(math::Pose(1.00, 0, 3, 0,        0, 0));
-        link_3->SetWorldPose(math::Pose(2.00, 0, 3, 0, 0.5*M_PI, 0));
-        link_4->SetWorldPose(math::Pose(2.00, 1, 3, 0, 1.0*M_PI, 0));
-        link_5->SetWorldPose(math::Pose(1.00, 1, 3, 0, 1.5*M_PI, 0));
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 10;
-    pub_rate = 1.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing SetWorld Pose at ["
-      << pub_rate << "] Hz without constraint violation.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        // gzdbg << "setting link poses without violation\n";
-        // double cur_time = world->GetSimTime().Double();
-        link_1->SetWorldPose(math::Pose(0,    0, 3, 0, 0, 0));
-        link_2->SetWorldPose(math::Pose(1.00, 0, 3, 0, 0, 0));
-        link_3->SetWorldPose(math::Pose(2.00, 0, 3, 0, 0.5*M_PI, 0));
-        link_4->SetWorldPose(math::Pose(2.00, 1, 3, 0, 1.0*M_PI, 0));
-        link_5->SetWorldPose(math::Pose(1.00, 1, 3, 0, 1.5*M_PI, 0));
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-
-
-    // set random pose within joint limit
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 20;
-    pub_rate = 2.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing SetWorld Pose at ["
-      << pub_rate << "] Hz with less constraint violation.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      // if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-    {
-      last_update_time = world->GetSimTime().Double();
-      math::Pose p;
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_1->SetWorldPose(p);
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_2->SetWorldPose(p);
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 2.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/
-          static_cast<double>(RAND_MAX) + 3.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/
-          static_cast<double>(RAND_MAX) + 0.5*M_PI,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_3->SetWorldPose(p);
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 2.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/
-          static_cast<double>(RAND_MAX) + M_PI,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_4->SetWorldPose(p);
-      p = math::Pose(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 1.0,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX) + 3.0,
-          static_cast<double>(rand_r(seed))/
-          static_cast<double>(RAND_MAX) + 1.5*M_PI,
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_5->SetWorldPose(p);
-
-      math::Vector3 v;
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_1->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_1->SetLinearVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_2->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_2->SetLinearVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_3->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_3->SetLinearVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_4->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_4->SetLinearVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_5->SetAngularVel(v);
-      v = math::Vector3(
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-          static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-      link_5->SetLinearVel(v);
-    }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-
-    // set random pose outside of joint limit
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 20;
-    pub_rate = 1000.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing SetWorld Pose at ["
-      << pub_rate << "] Hz with more random constraint violation.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        math::Pose p;
-        p = math::Pose(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 3.0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 1.57079,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_1->SetWorldPose(p);
-        p = math::Pose(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 2.0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 1.57079,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_2->SetWorldPose(p);
-        p = math::Pose(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 1.0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 1.57079,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_3->SetWorldPose(p);
-        p = math::Pose(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 1.0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 1.57079,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_4->SetWorldPose(p);
-        p = math::Pose(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 1.0,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/
-            static_cast<double>(RAND_MAX) + 1.57079,
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_5->SetWorldPose(p);
-
-        math::Vector3 v;
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_1->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_1->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_2->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_2->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_3->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_3->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_4->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_4->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_5->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_5->SetLinearVel(v);
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 10;
-    pub_rate = 1000.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Set*Vel at ["
-      << pub_rate << "] Hz with random velocities.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        // gzdbg << "setting link poses with violation\n";
-        math::Vector3 v;
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_1->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_1->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_2->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_2->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_3->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_3->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_4->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_4->SetLinearVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_5->SetAngularVel(v);
-        v = math::Vector3(
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX),
-            static_cast<double>(rand_r(seed))/static_cast<double>(RAND_MAX));
-        link_5->SetLinearVel(v);
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-    start_time = world->GetSimTime().Double();
-    start_wall_time = world->GetRealTime().Double();
-    test_duration = 20;
-    pub_rate = 500.0;
-    gzdbg << " -------------------------------------------------------------\n";
-    gzdbg << " Publishing Set*Vel at ["
-      << pub_rate << "] Hz with velocity decay.\n";
-    last_update_time = start_time;
-    while (world->GetSimTime().Double() < start_time + test_duration)
-      if (world->GetSimTime().Double() - last_update_time >= (1.0/pub_rate))
-      {
-        last_update_time = world->GetSimTime().Double();
-        // gzdbg << "setting link poses with violation\n";
-        link_1->SetAngularVel(link_1->GetWorldAngularVel() * 0.999);
-        link_1->SetLinearVel(link_1->GetWorldLinearVel()  * 0.999);
-        link_2->SetAngularVel(link_2->GetWorldAngularVel() * 0.999);
-        link_2->SetLinearVel(link_2->GetWorldLinearVel()  * 0.999);
-        link_3->SetAngularVel(link_3->GetWorldAngularVel() * 0.999);
-        link_3->SetLinearVel(link_3->GetWorldLinearVel()  * 0.999);
-        link_4->SetAngularVel(link_4->GetWorldAngularVel() * 0.999);
-        link_4->SetLinearVel(link_4->GetWorldLinearVel()  * 0.999);
-        link_5->SetAngularVel(link_5->GetWorldAngularVel() * 0.999);
-        link_5->SetLinearVel(link_5->GetWorldLinearVel()  * 0.999);
-      }
-    elapsed_wall_time = world->GetRealTime().Double() - start_wall_time;
-    gzdbg << "  elapsed sim time [" << test_duration
-      << "] elapsed wall time [" << elapsed_wall_time
-      << "] sim performance [" << test_duration / elapsed_wall_time
-      << "]\n";
-
-    EXPECT_EQ(link_3->GetWorldPose(),
-        math::Pose(0.292968, 0.612084, 1.43649, -2.07141, 1.50881, -1.19487));
-    Unload();
-  }
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/speed.cc b/test/regression/speed.cc
deleted file mode 100644
index 17ee384..0000000
--- a/test/regression/speed.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include "ServerFixture.hh"
-
-using namespace gazebo;
-class SpeedTest : public ServerFixture
-{
-};
-
-TEST_F(SpeedTest, BallTest)
-{
-  Load("worlds/empty.world");
-  double emptySpeed;
-  while ((emptySpeed = GetPercentRealTime()) == 0)
-    common::Time::MSleep(100);
-  common::Time::MSleep(2000);
-  emptySpeed = GetPercentRealTime();
-
-  // Load 500 spheres into the world
-  std::string name = "sphere";
-  math::Vector3 pos(0, 0, 5);
-
-  for (int i = 0; i < 500; ++i)
-  {
-    pos.z += i;
-    SpawnSphere(name + boost::lexical_cast<std::string>(i),
-        pos, math::Vector3(0, 0, 0), i == 499);
-  }
-
-  common::Time::MSleep(2000);
-  double loadedSpeed = GetPercentRealTime();
-
-  double speedRatio = loadedSpeed / emptySpeed;
-
-  std::cout << "Speed: Empty[" << emptySpeed << "] Loaded["
-            << loadedSpeed << "] Ratio[" << speedRatio << "]\n";
-
-#ifdef BUILD_TYPE_RELEASE
-  EXPECT_GT(speedRatio, 0.02);
-#else
-  EXPECT_GT(speedRatio, 0.01);
-#endif
-}
-
-TEST_F(SpeedTest, ShapesWorld)
-{
-  Load("worlds/shapes.world");
-  double emptySpeed;
-  while ((emptySpeed = GetPercentRealTime()) == 0)
-    common::Time::MSleep(100);
-  common::Time::MSleep(2000);
-  emptySpeed = GetPercentRealTime();
-
-  // Load 500 spheres into the world
-  std::string name = "sphere";
-  math::Vector3 pos(0, 0, 5);
-  for (int i = 0; i < 500; ++i)
-  {
-    pos.z += i;
-    SpawnSphere(name + boost::lexical_cast<std::string>(i),
-        pos, math::Vector3(0, 0, 0), i == 499);
-  }
-  common::Time::MSleep(2000);
-
-  double loadedSpeed = GetPercentRealTime();
-  double speedRatio = loadedSpeed / emptySpeed;
-
-  std::cout << "Speed: Empty[" << emptySpeed << "] Loaded["
-            << loadedSpeed << "] Ratio[" << speedRatio << "]\n";
-
-#ifdef BUILD_TYPE_RELEASE
-  EXPECT_GT(speedRatio, 0.08);
-#else
-  EXPECT_GT(speedRatio, 0.01);
-#endif
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/speed_pr2.cc b/test/regression/speed_pr2.cc
deleted file mode 100644
index 151156d..0000000
--- a/test/regression/speed_pr2.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-#include "ServerFixture.hh"
-
-using namespace gazebo;
-class SpeedTest : public ServerFixture
-{
-};
-
-
-TEST_F(SpeedTest, PR2World)
-{
-  Load("worlds/empty.world");
-  double emptySpeed;
-  while ((emptySpeed = GetPercentRealTime()) == 0)
-    common::Time::MSleep(100);
-  common::Time::MSleep(2000);
-  emptySpeed = GetPercentRealTime();
-
-  // Load the pr2into the world
-  SpawnModel("model://pr2");
-  common::Time::MSleep(2000);
-  double loadedSpeed = GetPercentRealTime();
-
-  double speedRatio = loadedSpeed / emptySpeed;
-
-  std::cout << "Speed: Empty[" << emptySpeed << "] Loaded["
-            << loadedSpeed << "] Ratio[" << speedRatio << "]\n";
-
-#ifdef BUILD_TYPE_RELEASE
-  EXPECT_GT(speedRatio, 0.5);
-#else
-  EXPECT_GT(speedRatio, 0.3);
-#endif
-}
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/transport.cc b/test/regression/transport.cc
deleted file mode 100644
index bfaa719..0000000
--- a/test/regression/transport.cc
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <unistd.h>
-#include "ServerFixture.hh"
-
-using namespace gazebo;
-
-class TransportTest : public ServerFixture
-{
-};
-
-bool g_worldStatsMsg2 = false;
-bool g_sceneMsg = false;
-bool g_worldStatsMsg = false;
-bool g_worldStatsDebugMsg = false;
-
-void ReceiveStringMsg(ConstGzStringPtr &/*_msg*/)
-{
-}
-
-void ReceiveSceneMsg(ConstScenePtr &/*_msg*/)
-{
-  g_sceneMsg = true;
-}
-
-void ReceiveWorldStatsMsg(ConstWorldStatisticsPtr &/*_msg*/)
-{
-  g_worldStatsMsg = true;
-}
-
-void ReceiveWorldStatsMsg2(ConstWorldStatisticsPtr &/*_msg*/)
-{
-  g_worldStatsMsg2 = true;
-}
-
-void ReceiveWorldStatsDebugMsg(ConstGzStringPtr &/*_data*/)
-{
-  g_worldStatsDebugMsg = true;
-}
-
-
-TEST_F(TransportTest, Load)
-{
-  for (unsigned int i = 0; i < 2; ++i)
-  {
-    Load("worlds/empty.world");
-    Unload();
-  }
-}
-
-TEST_F(TransportTest, PubSub)
-{
-  Load("worlds/empty.world");
-
-  transport::NodePtr node = transport::NodePtr(new transport::Node());
-  node->Init();
-  transport::PublisherPtr scenePub = node->Advertise<msgs::Scene>("~/scene");
-  transport::SubscriberPtr sceneSub = node->Subscribe("~/scene",
-      &ReceiveSceneMsg);
-
-  msgs::Scene msg;
-  msgs::Init(msg, "test");
-  msg.set_name("default");
-
-  scenePub->Publish(msg);
-
-  std::vector<transport::PublisherPtr> pubs;
-  std::vector<transport::SubscriberPtr> subs;
-
-  for (unsigned int i = 0; i < 10; ++i)
-  {
-    pubs.push_back(node->Advertise<msgs::Scene>("~/scene"));
-    subs.push_back(node->Subscribe("~/scene", &ReceiveSceneMsg));
-    scenePub->Publish(msg);
-  }
-
-  pubs.clear();
-  subs.clear();
-}
-
-TEST_F(TransportTest, Errors)
-{
-  Load("worlds/empty.world");
-  transport::NodePtr testNode = transport::NodePtr(new transport::Node());
-  testNode->Init("default");
-  transport::PublisherPtr scenePub;
-
-  transport::SubscriberPtr statsSub =
-    testNode->Subscribe("~/world_stats", &ReceiveWorldStatsMsg);
-  EXPECT_STREQ("/gazebo/default/world_stats", statsSub->GetTopic().c_str());
-
-  // This generates a warning message
-  // EXPECT_THROW(testNode->Advertise<math::Vector3>("~/scene"),
-  //             common::Exception);
-
-  scenePub = testNode->Advertise<msgs::Scene>("~/scene");
-  EXPECT_THROW(testNode->Advertise<msgs::Factory>("~/scene"),
-               common::Exception);
-  EXPECT_TRUE(scenePub->GetPrevMsg().empty());
-
-  transport::PublisherPtr factoryPub =
-    testNode->Advertise<msgs::Factory>("~/factory");
-  factoryPub->WaitForConnection();
-  EXPECT_EQ(static_cast<unsigned int>(0), factoryPub->GetOutgoingCount());
-  EXPECT_STREQ("/gazebo/default/factory", factoryPub->GetTopic().c_str());
-  EXPECT_STREQ("gazebo.msgs.Factory", factoryPub->GetMsgType().c_str());
-
-  EXPECT_STREQ("default", testNode->GetTopicNamespace().c_str());
-  EXPECT_STREQ("/gazebo/default/factory",
-               testNode->DecodeTopicName("~/factory").c_str());
-  EXPECT_STREQ("~/factory",
-               testNode->EncodeTopicName("/gazebo/default/factory").c_str());
-
-  // Get the original URI
-  char *uri = getenv("GAZEBO_MASTER_URI");
-  std::string origURI = "GAZEBO_MASTER_URI=";
-  if (uri)
-    origURI += uri;
-
-  int i = 0;
-  while (!g_worldStatsMsg && !g_sceneMsg && !g_worldStatsDebugMsg && i < 20)
-  {
-    common::Time::MSleep(100);
-    ++i;
-  }
-  EXPECT_LT(i, 20);
-
-  putenv(const_cast<char*>("GAZEBO_MASTER_URI="));
-  std::string masterHost;
-  unsigned int masterPort;
-  EXPECT_FALSE(transport::get_master_uri(masterHost, masterPort));
-  EXPECT_STREQ("localhost", masterHost.c_str());
-  EXPECT_EQ(static_cast<unsigned int>(11345), masterPort);
-
-  // restore original URI
-  putenv(const_cast<char*>(origURI.c_str()));
-
-  transport::clear_buffers();
-  transport::pause_incoming(true);
-  transport::TopicManager::Instance()->ProcessNodes();
-  transport::pause_incoming(false);
-
-  transport::stop();
-  EXPECT_TRUE(transport::init(masterHost, masterPort));
-
-  scenePub.reset();
-  statsSub.reset();
-  testNode.reset();
-}
-
-// This test creates a child process to test interprocess communication
-// TODO: This test needs to be fixed
-/*TEST_F(TransportTest, Processes)
-{
-  pid_t pid = fork();
-  if (pid == 0)
-  {
-    common::Time::MSleep(1);
-    transport::init();
-    transport::run();
-
-    transport::NodePtr node(new transport::Node());
-    node->Init();
-
-    transport::PublisherPtr pub = node->Advertise<msgs::GzString>("~/test");
-
-    transport::SubscriberPtr sub =
-      node->Subscribe("~/world_stats", &ReceiveWorldStatsMsg2);
-    transport::SubscriberPtr sub2 =
-      node->Subscribe("~/test", &ReceiveStringMsg, true);
-
-    transport::PublisherPtr pub2 = node->Advertise<msgs::GzString>("~/test");
-
-    EXPECT_STREQ("gazebo.msgs.WorldStatistics",
-                 node->GetMsgType("/gazebo/default/world_stats").c_str());
-
-    msgs::GzString msg;
-    msg.set_data("Waiting for message");
-    pub->Publish(msg);
-    pub2->Publish(msg);
-
-    int i = 0;
-    while (!g_worldStatsMsg2 && i < 20)
-    {
-      common::Time::MSleep(100);
-      ++i;
-    }
-    EXPECT_LT(i, 20);
-
-    pub.reset();
-    sub.reset();
-    node.reset();
-    transport::fini();
-    common::Time::MSleep(5);
-  }
-  else if (pid < 0)
-    printf("Fork failed\n");
-  else
-  {
-    Load("worlds/empty.world");
-
-    transport::NodePtr node(new transport::Node());
-    node->Init();
-
-    transport::PublisherPtr pub = node->Advertise<msgs::GzString>("~/test");
-    transport::SubscriberPtr sub =
-      node->Subscribe("~/test", &ReceiveStringMsg, true);
-
-    transport::PublisherPtr pub2 = node->Advertise<msgs::GzString>("~/test");
-    transport::SubscriberPtr sub2 =
-      node->Subscribe("~/test", &ReceiveStringMsg, true);
-
-    EXPECT_STREQ("gazebo.msgs.String",
-                 node->GetMsgType("/gazebo/default/test").c_str());
-
-    msgs::GzString msg;
-    msg.set_data("Waiting for message");
-    pub->Publish(msg);
-    pub2->Publish(msg);
-
-    for (int i = 0; i < 5; ++i)
-      common::Time::MSleep(100);
-
-    sub.reset();
-    sub2.reset();
-    kill(pid, SIGKILL);
-  }
-}*/
-
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/transport_stress.cc b/test/regression/transport_stress.cc
deleted file mode 100644
index 4fd38df..0000000
--- a/test/regression/transport_stress.cc
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <boost/thread.hpp>
-#include "ServerFixture.hh"
-
-using namespace gazebo;
-
-class TransportStressTest : public ServerFixture
-{
-};
-
-boost::mutex g_mutex;
-
-unsigned int g_localPublishMessageCount = 0;
-unsigned int g_localPublishCount = 0;
-unsigned int g_totalExpectedMsgCount = 0;
-common::Time g_localPublishEndTime;
-
-void LocalPublishCB(ConstImagePtr & /*_msg*/)
-{
-  boost::mutex::scoped_lock lock(g_mutex);
-
-  if (g_localPublishCount+1 >= g_totalExpectedMsgCount)
-    g_localPublishEndTime = common::Time::GetWallTime();
-  g_localPublishCount++;
-}
-
-/////////////////////////////////////////////////
-// Test for local publication. This test will create a large image and
-// publish it to a local subscriber. Serialization should be bypassed,
-// resulting fast publication.
-TEST_F(TransportStressTest, LocalPublish)
-{
-  Load("worlds/empty.world");
-
-  // Number of messages to publish
-  g_localPublishMessageCount = 1000000;
-
-  /// Expected number of messages to receive
-  g_totalExpectedMsgCount = g_localPublishMessageCount;
-
-  // Reset the received message counter
-  g_localPublishCount = 0;
-
-  transport::NodePtr testNode = transport::NodePtr(new transport::Node());
-  testNode->Init("default");
-
-  transport::PublisherPtr pub = testNode->Advertise<msgs::Image>(
-      "~/test/local_publish__", g_localPublishMessageCount);
-
-  transport::SubscriberPtr sub = testNode->Subscribe("~/test/local_publish__",
-      &LocalPublishCB);
-
-  unsigned int width = 2048;
-  unsigned int height = 2048;
-  unsigned char *fakeData = new unsigned char[width * height];
-
-  // Create a large image message with fake data
-  msgs::Image fakeMsg;
-  fakeMsg.set_width(width);
-  fakeMsg.set_height(height);
-  fakeMsg.set_pixel_format(0);
-  fakeMsg.set_step(1);
-  fakeMsg.set_data(fakeData, width*height);
-
-  // Get the start time
-  common::Time startTime = common::Time::GetWallTime();
-
-  // Publish the messages many times
-  for (unsigned int i = 0; i < g_localPublishMessageCount; ++i)
-  {
-    pub->Publish(fakeMsg);
-  }
-  gzmsg << "Publish Complete" << std::endl;
-
-  // Wait for all the messages
-  int waitCount = 0;
-  while (g_localPublishCount < g_totalExpectedMsgCount && waitCount < 50)
-  {
-    common::Time::MSleep(1000);
-    waitCount++;
-  }
-
-  // Time it took to publish the messages.
-  common::Time diff = g_localPublishEndTime - startTime;
-
-  EXPECT_LT(waitCount, 50);
-
-  // Make sure we received all the messages.
-  EXPECT_EQ(g_totalExpectedMsgCount, g_localPublishCount);
-
-  // The total duration should always be very short.
-  EXPECT_LT(diff.sec, g_localPublishMessageCount * 0.0008);
-
-  // Out time time for human testing purposes
-  gzmsg << "Time to publish " << g_localPublishCount  << " messages = "
-    << diff << "\n";
-
-  delete [] fakeData;
-}
-
-/////////////////////////////////////////////////
-// Create a lot of nodes, each with a publisher and subscriber. Then send
-// out a few large messages.
-TEST_F(TransportStressTest, ManyNodes)
-{
-  Load("worlds/empty.world");
-
-  // Storage for all the nodes, subscribers, and publishers
-  std::list<transport::NodePtr> nodes;
-  std::list<transport::SubscriberPtr> subs;
-  std::list<transport::PublisherPtr> pubs;
-
-  // The number of nodes to create
-  unsigned int nodeCount = 2000;
-
-  // The number of messages to send
-  g_localPublishMessageCount = 10;
-
-  // The expected number of messages to receive
-  g_totalExpectedMsgCount = nodeCount * nodeCount * g_localPublishMessageCount;
-
-  // Reset the received message counter
-  g_localPublishCount = 0;
-
-  // Create all the nodes.
-  for (unsigned int i = 0; i < nodeCount; ++i)
-  {
-    nodes.push_back(transport::NodePtr(new transport::Node()));
-    nodes.back()->Init();
-
-    pubs.push_back(nodes.back()->Advertise<msgs::Image>(
-          "~/test/local_publish2__", nodeCount * g_localPublishMessageCount));
-
-    subs.push_back(nodes.back()->Subscribe("~/test/local_publish2__",
-          &LocalPublishCB));
-  }
-
-  // Use a 2048x2048 image as the message
-  unsigned int width = 2048;
-  unsigned int height = 2048;
-  unsigned char *fakeData = new unsigned char[width * height];
-
-  // Create a large image message with fake data
-  msgs::Image fakeMsg;
-  fakeMsg.set_width(width);
-  fakeMsg.set_height(height);
-  fakeMsg.set_pixel_format(0);
-  fakeMsg.set_step(1);
-  fakeMsg.set_data(fakeData, width*height);
-
-  // Get the start time
-  common::Time startTime = common::Time::GetWallTime();
-
-  // Publish the messages many times
-  for (unsigned int i = 0; i < g_localPublishMessageCount; ++i)
-  {
-    for (std::list<transport::PublisherPtr>::iterator iter = pubs.begin();
-        iter != pubs.end(); ++iter)
-    {
-      (*iter)->Publish(fakeMsg);
-    }
-  }
-  common::Time publishTime = common::Time::GetWallTime();
-  gzmsg << "Publish complete" << std::endl;
-
-  // Wait for all the messages
-  int waitCount = 0;
-  while (g_localPublishCount < g_totalExpectedMsgCount && waitCount < 50)
-  {
-    common::Time::MSleep(1000);
-    waitCount++;
-  }
-
-  // Time it took to publish the messages.
-  common::Time pubDiff = publishTime - startTime;
-
-  // Time it took to received the messages.
-  common::Time receiveDiff = g_localPublishEndTime - startTime;
-
-  EXPECT_LT(waitCount, 50);
-
-  // Make sure we received all the messages.
-  EXPECT_EQ(g_totalExpectedMsgCount, g_localPublishCount);
-
-  // The total publish duration should always be very short.
-  // The calculation here is the number of messages published multiplied by
-  // the expected time to publish a single image message.
-  EXPECT_LT(static_cast<unsigned int>(pubDiff.nsec),
-      (g_localPublishMessageCount * nodes.size()) * 1500);
-
-  // The total receive duration will be longer.
-  EXPECT_LT(receiveDiff.sec, g_localPublishCount * 1e-6);
-
-  // Out time time for human testing purposes
-  gzmsg << "Time to publish " << g_localPublishMessageCount * nodes.size()
-    << " = " << pubDiff << std::endl;
-
-  gzmsg << "Time to receive " << g_localPublishCount << " = "
-    << receiveDiff << std::endl;
-
-  delete [] fakeData;
-}
-
-/////////////////////////////////////////////////
-// Main function
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/test/regression/worlds/SDF_1_4.world b/test/regression/worlds/SDF_1_4.world
deleted file mode 100644
index 02ed242..0000000
--- a/test/regression/worlds/SDF_1_4.world
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.4">
-  <world name="default">
-    <include>
-      <uri>model://ground_plane</uri>
-    </include>
-    <include>
-      <uri>model://sun</uri>
-    </include>
-    <model name="joint14_model">
-      <pose>0 0 0.5 0 0 0</pose>
-      <link name="body1">
-      <pose>0 0 0.5 0 0 0</pose>
-        <collision name="geom">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </visual>
-      </link>
-      <link name="body2">
-      <pose>0 0.5 2 0 0 0</pose>
-        <collision name="geom">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </collision>
-        <visual name="visual">
-          <geometry>
-            <box>
-              <size>1 1 1</size>
-            </box>
-          </geometry>
-        </visual>
-      </link>
-      <joint type="revolute" name="joint14_revolute_joint">
-        <pose>0 0 1 0 0 0</pose>
-        <parent>
-          <link_name>body2</link_name>
-        </parent>
-        <child>
-          <link_name>body1</link_name>
-        </child>
-        <axis>
-          <xyz>0 0 1</xyz>
-        </axis>
-      </joint>
-    </model>
-  </world>
-</sdf>
diff --git a/test/regression/worlds/damp_test.world b/test/regression/worlds/damp_test.world
deleted file mode 100644
index fafcb22..0000000
--- a/test/regression/worlds/damp_test.world
+++ /dev/null
@@ -1,635 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-    <world name="default">
-        <gui>
-            <camera name="user_camera">
-                <pose>-60 0 5 0 0 0</pose>
-            </camera>
-        </gui>
-        <scene>
-            <ambient>0.5 0.5 0.5 1</ambient>
-            <background>0.5 0.5 0.5 1</background>
-            <shadows>false</shadows>
-        </scene>
-        <include>
-            <uri>model://sun</uri>
-        </include>
-        <physics type="ode">
-            <gravity>0.0 0.0 -9.81</gravity>
-            <ode>
-                <solver>
-                    <type>quick</type>
-                    <dt>0.001</dt>
-                    <iters>100</iters>
-                    <sor>1.0</sor>
-                </solver>
-                <constraints>
-                    <cfm>0</cfm>
-                    <erp>1.0</erp>
-                    <contact_max_correcting_vel>0.0</contact_max_correcting_vel>
-                    <contact_surface_layer>0.0</contact_surface_layer>
-                </constraints>
-            </ode>
-        </physics>
-        <model name="model_1_mass_1_damping_10000">
-            <pose>0.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10000.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_2_mass_01_damping_10">
-            <pose>1.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>0.1</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_3_mass_1_damping_10">
-            <pose>2.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_4_mass_1_ixx_1_damping_10">
-            <pose>3.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>1.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_5_mass_1_damping_1">
-            <pose>4.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>1.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_6_mass_1_damping_10">
-            <pose>5.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>10.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_7_mass_1_damping_100">
-            <pose>6.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>100.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_8_mass_1_damping_1000">
-            <pose>7.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>1000.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_9_mass_1_damping_0">
-            <pose>8.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>1.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>0.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-        <model name="model_10_mass_10_damping_0">
-            <pose>9.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-            <link name="link_1">
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <inertial>
-                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-                    <inertia>
-                        <ixx>0.0</ixx>
-                        <ixy>0.0</ixy>
-                        <ixz>0.0</ixz>
-                        <iyy>0.0</iyy>
-                        <iyz>0.0</iyz>
-                        <izz>0.0</izz>
-                    </inertia>
-                    <mass>10.0</mass>
-                </inertial>
-                <velocity_decay>
-                    <linear>0.0</linear>
-                    <angular>0.0</angular>
-                </velocity_decay>
-                <visual name="visual_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.05</radius>
-                            <length>10.0</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-                <gravity>true</gravity>
-                <self_collide>true</self_collide>
-                <kinematic>false</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-                <axis>
-                    <xyz>1.0 0.0 0.0</xyz>
-                    <dynamics>
-                        <damping>0.0</damping>
-                        <friction>0.0</friction>
-                    </dynamics>
-                </axis>
-            </joint>
-            <static>false</static>
-        </model>
-    </world>
-</sdf>
diff --git a/test/regression/worlds/empty_test.world b/test/regression/worlds/empty_test.world
deleted file mode 100644
index dc1a3b7..0000000
--- a/test/regression/worlds/empty_test.world
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-  </world>
-</sdf>
diff --git a/test/regression/worlds/invalid_size_heightmap.world b/test/regression/worlds/invalid_size_heightmap.world
deleted file mode 100644
index 17fe6f1..0000000
--- a/test/regression/worlds/invalid_size_heightmap.world
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?> 
-<sdf version="1.3">
-  <world name="default">
-    <model name="heightmap">
-      <static>true</static>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <heightmap>
-              <uri>file://media/materials/textures/invalid_size.png</uri>
-              <size>129 129 10</size>
-            </heightmap>
-          </geometry>
-        </collision>
-      </link>
-    </model>
-  </world>
-</sdf>
diff --git a/test/regression/worlds/not_square_heightmap.world b/test/regression/worlds/not_square_heightmap.world
deleted file mode 100644
index 6539a3b..0000000
--- a/test/regression/worlds/not_square_heightmap.world
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?> 
-<sdf version="1.3">
-  <world name="default">
-    <model name="heightmap">
-      <static>true</static>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <heightmap>
-              <uri>file://media/materials/textures/not_square.png</uri>
-              <size>129 129 10</size>
-            </heightmap>
-          </geometry>
-        </collision>
-      </link>
-    </model>
-  </world>
-</sdf>
diff --git a/test/regression/worlds/simple_pendulums.world b/test/regression/worlds/simple_pendulums.world
deleted file mode 100644
index d3b3c16..0000000
--- a/test/regression/worlds/simple_pendulums.world
+++ /dev/null
@@ -1,252 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-  <world name="default">
-    <scene>
-      <ambient>0.5 0.5 0.5 1</ambient>
-      <background>0.5 0.5 0.5 1</background>
-      <shadows>false</shadows>
-    </scene>
-    <include><uri>model://sun</uri></include>
-    <physics type="ode">
-      <gravity>0.0 0.0 -9.81</gravity>
-      <ode>
-        <solver>
-          <type>quick</type>
-          <dt>0.001</dt>
-          <iters>1000</iters>
-          <sor>1.0</sor>
-        </solver>
-        <constraints>
-          <cfm>0</cfm>
-          <erp>1.0</erp>
-          <contact_max_correcting_vel>0.0</contact_max_correcting_vel>
-          <contact_surface_layer>0.0</contact_surface_layer>
-        </constraints>
-      </ode>
-    </physics>
-    <model name="model_1">
-      <pose>0.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-      <link name="link_1">
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>1e-1</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>1e-1</iyy>
-            <iyz>0.0</iyz>
-            <izz>1e-1</izz>
-          </inertia>
-          <mass>5.0</mass>
-        </inertial>
-        <velocity_decay>
-          <linear>0.0</linear>
-          <angular>0.0</angular>
-        </velocity_decay>
-        <visual name="visual_cylinder">
-          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-          <geometry>
-            <cylinder>
-              <radius>0.05</radius>
-              <length>10.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/Green</script>
-          </material>
-        </visual>
-        <collision name="collision_cylinder">
-          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <cylinder>
-              <radius>0.05</radius>
-              <length>10.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <joint name="joint_0" type="revolute">
-        <parent>world</parent>
-        <child>link_1</child>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <axis>
-          <xyz>1.0 0.0 0.0</xyz>
-        </axis>
-      </joint>
-      <link name="link_2">
-        <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>1e-1</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>1e-1</iyy>
-            <iyz>0.0</iyz>
-            <izz>1e-1</izz>
-          </inertia>
-          <mass>5.0</mass>
-        </inertial>
-        <velocity_decay>
-          <linear>0.0</linear>
-          <angular>0.0</angular>
-        </velocity_decay>
-        <visual name="visual_sphere">
-          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-          <material>
-            <script>Gazebo/Red</script>
-          </material>
-        </visual>
-        <collision name="collision_sphere">
-          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <sphere>
-              <radius>0.1</radius>
-            </sphere>
-          </geometry>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <joint name="joint_1" type="revolute">
-        <parent>link_1</parent>
-        <child>link_2</child>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <axis>
-          <limit>
-            <lower>0</lower>
-            <upper>0</upper>
-            <effort>0</effort>
-            <velocity>0</velocity>
-          </limit>
-          <xyz>0 0 1</xyz>
-        </axis>
-      </joint>
-      <static>false</static>
-    </model>
-    <model name="model_2">
-      <pose>1.0 0.0 10.1 1.57079633 0.0 0.0</pose>
-      <link name="link_1">
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>1e-1</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>1e-1</iyy>
-            <iyz>0.0</iyz>
-            <izz>1e-1</izz>
-          </inertia>
-          <mass>10.0</mass>
-        </inertial>
-        <velocity_decay>
-          <linear>0.0</linear>
-          <angular>0.0</angular>
-        </velocity_decay>
-        <visual name="visual_cylinder">
-          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>10.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/Green</script>
-          </material>
-        </visual>
-        <collision name="collision_cylinder">
-          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>10.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <joint name="joint_0" type="revolute">
-        <parent>world</parent>
-        <child>link_1</child>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <axis>
-          <xyz>1.0 0.0 0.0</xyz>
-        </axis>
-      </joint>
-      <static>false</static>
-    </model>
-    <model name="model_3">
-      <pose>0.0 -10.5 10.1 0.0 1.57079633 0.0</pose>
-      <link name="link_1">
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <inertial>
-          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
-          <inertia>
-            <ixx>1e-1</ixx>
-            <ixy>0.0</ixy>
-            <ixz>0.0</ixz>
-            <iyy>1e-1</iyy>
-            <iyz>0.0</iyz>
-            <izz>1e-1</izz>
-          </inertia>
-          <mass>10.0</mass>
-        </inertial>
-        <velocity_decay>
-          <linear>0.0</linear>
-          <angular>0.0</angular>
-        </velocity_decay>
-        <visual name="visual_cylinder">
-          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>10.0</length>
-            </cylinder>
-          </geometry>
-          <material>
-            <script>Gazebo/Green</script>
-          </material>
-        </visual>
-        <collision name="collision_cylinder">
-          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <cylinder>
-              <radius>0.1</radius>
-              <length>10.0</length>
-            </cylinder>
-          </geometry>
-        </collision>
-        <gravity>true</gravity>
-        <self_collide>true</self_collide>
-        <kinematic>false</kinematic>
-      </link>
-      <joint name="joint_0" type="revolute">
-        <parent>world</parent>
-        <child>link_1</child>
-        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
-        <axis>
-          <xyz>0.0 1.0 0.0</xyz>
-        </axis>
-      </joint>
-      <static>false</static>
-    </model>
-  </world>
-</sdf>
diff --git a/test/regression/worlds/white_alpha_heightmap.world b/test/regression/worlds/white_alpha_heightmap.world
deleted file mode 100644
index 48d12e8..0000000
--- a/test/regression/worlds/white_alpha_heightmap.world
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?> 
-<sdf version="1.3">
-  <world name="default">
-    <model name="heightmap">
-      <static>true</static>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <heightmap>
-              <uri>file://media/materials/textures/white_alpha.png</uri>
-              <size>129 129 10</size>
-            </heightmap>
-          </geometry>
-        </collision>
-      </link>
-    </model>
-  </world>
-</sdf>
diff --git a/test/regression/worlds/white_no_alpha_heightmap.world b/test/regression/worlds/white_no_alpha_heightmap.world
deleted file mode 100644
index f29f21b..0000000
--- a/test/regression/worlds/white_no_alpha_heightmap.world
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?> 
-<sdf version="1.3">
-  <world name="default">
-    <model name="heightmap">
-      <static>true</static>
-      <link name="link">
-        <collision name="collision">
-          <geometry>
-            <heightmap>
-              <uri>file://media/materials/textures/white_no_alpha.png</uri>
-              <size>129 129 10</size>
-            </heightmap>
-          </geometry>
-        </collision>
-      </link>
-    </model>
-  </world>
-</sdf>
diff --git a/test/sdf/pr2_stripped.world b/test/sdf/pr2_stripped.world
deleted file mode 100644
index 8459e31..0000000
--- a/test/sdf/pr2_stripped.world
+++ /dev/null
@@ -1,2832 +0,0 @@
-<gazebo version='1.0'>
-  <world name='default'>
-    <scene>
-      <ambient rgba='0.5 0.5 0.5 0.5'/>
-      <background rgba='0.5 0.5 0.5 1'>
-        <sky material='Gazebo/CloudySky'/>
-      </background>
-      <shadows enabled='1'/>
-    </scene>
-    <physics type='ode'>
-      <gravity xyz='0 0 -9.8'/>
-      <ode>
-        <solver type='quick' dt='0.001' iters='10' sor='1.3'/>
-        <constraints cfm='1e-10' erp='0.20000000000000001' contact_max_correcting_vel='100' contact_surface_layer='0.001'/>
-      </ode>
-    </physics>
-    <model name='gplane' static='1'>
-      <origin pose='0 0 0 0 -0 0'/>
-      <link name='plane' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <collision name='plane' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <plane normal='0 0 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='50' mu2='50' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0' kp='1000000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <plane normal='0 0 1'/>
-          </geometry>
-        </visual>
-      </link>
-    </model>
-    <light name='point_white' type='directional'>
-      <origin pose='0 0 8 0 -0 0'/>
-      <diffuse rgba='0.1 0.1 0.1 1'/>
-      <specular rgba='0.1 0.1 0.1 1'/>
-      <attenuation range='10' linear='0.10000000000000001' constant='0.20000000000000001' quadratic='0'/>
-    </light>
-    <disable_plugin name='gazebo_ros_api' filename='libgazebo_ros.so'>
-      <alwaysOn>1</alwaysOn>
-      <updateRate>1000.0</updateRate>
-    </disable_plugin>
-    <model name='pr2' static='0'>
-      <origin pose='0 0 0 0 -0 0'/>
-      <link name='base_footprint' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <inertial mass='1'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-        <collision name='base_footprint_geom' laser_retro='0'>
-          <origin pose='0 0 0.071 0 -0 0'/>
-          <geometry>
-            <box size='0.001 0.001 0.001'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <box size='0.01 0.01 0.01'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='base_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0 0 0.051 0 -0 0'/>
-        <inertial mass='116'>
-          <origin pose='-0.061 0 0.1465 0 -0 0'/>
-          <inertia ixx='5.6522300000000003' ixy='-0.0097199299999999999' ixz='1.29399' iyy='5.6694699999999996' iyz='-0.0073795800000000002' izz='3.6831999999999998'/>
-        </inertial>
-        <collision name='base_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/base_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/base.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-        <disable_sensor name='base_contact_sensor' type='contact' always_on='0' update_rate='100'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <contact>
-            <collision name='base_link_geom'/>
-          </contact>
-          <disable_plugin name='base_gazebo_ros_bumper_controller' filename='libgazebo_ros_bumper.so'>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>100.0</updateRate>
-            <bumperTopicName>base_bumper</bumperTopicName>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='base_bellow_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.29 0 0.851 0 -0 0'/>
-        <inertial mass='1'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-        <collision name='base_bellow_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <box size='0.05 0.37 0.3'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <box size='0.05 0.37 0.3'/>
-          </geometry>
-          <material script='PR2/Black'/>
-        </visual>
-      </link>
-      <link name='base_laser_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.275 0 0.303 0 -0 0'/>
-        <inertial mass='0.001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.0001' ixy='0' ixz='0' iyy='9.9999999999999995e-07' iyz='0' izz='0.0001'/>
-        </inertial>
-        <disable_sensor name='base_laser' type='ray' always_on='0' update_rate='20'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <ray>
-            <scan display='1'>
-              <horizontal samples='640' resolution='1' min_angle='-2.2688999999959423' max_angle='2.2688999999959423'/>
-            </scan>
-            <range min='0.080000000000000002' max='10' resolution='0.01'/>
-          </ray>
-          <disable_plugin name='gazebo_ros_base_laser_controller' filename='libgazebo_ros_laser.so'>
-            <gaussianNoise>0.005</gaussianNoise>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>20</updateRate>
-            <topicName>base_scan</topicName>
-            <frameName>base_laser_link</frameName>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='bl_caster_rotation_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.2246 0.2246 0.0792 0 -0 0'/>
-        <inertial mass='3.4730799999999999'>
-          <origin pose='0 0 0.07 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='bl_caster_rotation_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/caster_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/caster.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/caster_texture'/>
-        </visual>
-      </link>
-      <link name='bl_caster_l_wheel_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.2246 0.2736 0.0792 0 -0 0'/>
-        <inertial mass='0.44035999999999997'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='bl_caster_l_wheel_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.03541 -0 0'/>
-          <geometry>
-            <cylinder radius='0.074791999999999997' length='0.034000000000000002'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='100' mu2='100' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/wheel.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='bl_caster_r_wheel_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.2246 0.1756 0.0792 0 -0 0'/>
-        <inertial mass='0.44035999999999997'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='bl_caster_r_wheel_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.03541 -0 0'/>
-          <geometry>
-            <cylinder radius='0.074791999999999997' length='0.034000000000000002'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='100' mu2='100' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/wheel.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='br_caster_rotation_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.2246 -0.2246 0.0792 0 -0 0'/>
-        <inertial mass='3.4730799999999999'>
-          <origin pose='0 0 0.07 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='br_caster_rotation_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/caster_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/caster.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/caster_texture'/>
-        </visual>
-      </link>
-      <link name='br_caster_l_wheel_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.2246 -0.1756 0.0792 0 -0 0'/>
-        <inertial mass='0.44035999999999997'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='br_caster_l_wheel_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.03541 -0 0'/>
-          <geometry>
-            <cylinder radius='0.074791999999999997' length='0.034000000000000002'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='100' mu2='100' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/wheel.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='br_caster_r_wheel_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.2246 -0.2736 0.0792 0 -0 0'/>
-        <inertial mass='0.44035999999999997'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='br_caster_r_wheel_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.03541 -0 0'/>
-          <geometry>
-            <cylinder radius='0.074791999999999997' length='0.034000000000000002'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='100' mu2='100' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/wheel.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='fl_caster_rotation_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.2246 0.2246 0.0792 0 -0 0'/>
-        <inertial mass='3.4730799999999999'>
-          <origin pose='0 0 0.07 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='fl_caster_rotation_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/caster_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/caster.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/caster_texture'/>
-        </visual>
-      </link>
-      <link name='fl_caster_l_wheel_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.2246 0.2736 0.0792 0 -0 0'/>
-        <inertial mass='0.44035999999999997'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='fl_caster_l_wheel_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.03541 -0 0'/>
-          <geometry>
-            <cylinder radius='0.074791999999999997' length='0.034000000000000002'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='100' mu2='100' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/wheel.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='fl_caster_r_wheel_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.2246 0.1756 0.0792 0 -0 0'/>
-        <inertial mass='0.44035999999999997'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='fl_caster_r_wheel_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.03541 -0 0'/>
-          <geometry>
-            <cylinder radius='0.074791999999999997' length='0.034000000000000002'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='100' mu2='100' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/wheel.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='fr_caster_rotation_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.2246 -0.2246 0.0792 0 -0 0'/>
-        <inertial mass='3.4730799999999999'>
-          <origin pose='0 0 0.07 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='fr_caster_rotation_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/caster_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/caster.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/caster_texture'/>
-        </visual>
-      </link>
-      <link name='fr_caster_l_wheel_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.2246 -0.1756 0.0792 0 -0 0'/>
-        <inertial mass='0.44035999999999997'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='fr_caster_l_wheel_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.03541 -0 0'/>
-          <geometry>
-            <cylinder radius='0.074791999999999997' length='0.034000000000000002'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='100' mu2='100' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/wheel.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='fr_caster_r_wheel_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.2246 -0.2736 0.0792 0 -0 0'/>
-        <inertial mass='0.44035999999999997'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.012411800000000001' ixy='-0.000711734' ixz='0.00050272999999999995' iyy='0.015218199999999999' iyz='-4.2734700000000003e-06' izz='0.011764'/>
-        </inertial>
-        <collision name='fr_caster_r_wheel_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.03541 -0 0'/>
-          <geometry>
-            <cylinder radius='0.074791999999999997' length='0.034000000000000002'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='100' mu2='100' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/base_v0/wheel.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='torso_lift_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.05 0 0.790675 0 -0 0'/>
-        <inertial mass='36.247999999999998'>
-          <origin pose='-0.1 0 -0.0885 0 -0 0'/>
-          <inertia ixx='2.7716500000000002' ixy='0.00428452' ixz='-0.16041900000000001' iyy='2.5100199999999999' iyz='0.0296645' izz='0.52643200000000001'/>
-        </inertial>
-        <collision name='torso_lift_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/torso_v0/torso_lift_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/torso_v0/torso_lift.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-        <disable_sensor name='torso_lift_contact_sensor' type='contact' always_on='0' update_rate='100'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <contact>
-            <collision name='torso_lift_link_geom'/>
-          </contact>
-          <disable_plugin name='torso_lift_gazebo_ros_bumper_controller' filename='libgazebo_ros_bumper.so'>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>100.0</updateRate>
-            <bumperTopicName>torso_lift_bumper</bumperTopicName>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='head_pan_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.06707 0 1.17213 0 -0 0'/>
-        <inertial mass='6.3390000000000004'>
-          <origin pose='0.010907 0.031693 0.090507 0 -0 0'/>
-          <inertia ixx='0.032497600000000001' ixy='0.00063604099999999995' ixz='0.00258515' iyy='0.046545599999999999' iyz='-0.0024534299999999999' izz='0.057652700000000001'/>
-        </inertial>
-        <collision name='head_pan_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/head_v0/head_pan_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/head_v0/head_pan.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='head_tilt_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.00093 0 1.17213 0 -0 0'/>
-        <inertial mass='4.4790000000000001'>
-          <origin pose='0.001716 -0.019556 0.055002 0 -0 0'/>
-          <inertia ixx='0.0242232' ixy='0.00062063500000000002' ixz='-9.6909699999999998e-05' iyy='0.054723099999999997' iyz='0.0027970199999999999' izz='0.067306400000000002'/>
-        </inertial>
-        <collision name='head_tilt_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/head_v0/head_tilt_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/head_v0/head_tilt.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='head_plate_frame' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 0 1.23663 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <collision name='head_plate_frame_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <box size='0.01 0.01 0.01'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <box size='0.01 0.01 0.01'/>
-          </geometry>
-          <material script='Gazebo/Grey'/>
-        </visual>
-      </link>
-      <link name='projector_wg6802418_frame' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 0.109 1.27163 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-      </link>
-      <link name='projector_wg6802418_child_frame' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 0.109 1.27163 3.14159 -1.10619 3.14159'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-      </link>
-      <link name='sensor_mount_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 0 1.23663 0 -0 0'/>
-        <inertial mass='0.050000000000000003'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.01'/>
-        </inertial>
-      </link>
-      <link name='double_stereo_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 0 1.23962 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.01'/>
-        </inertial>
-      </link>
-      <link name='narrow_stereo_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 0.06 1.27012 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-      </link>
-      <link name='narrow_stereo_gazebo_l_stereo_camera_frame' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 0.06 1.27012 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <disable_sensor name='narrow_stereo_gazebo_l_stereo_camera_sensor' type='camera' always_on='0' update_rate='25'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <camera>
-            <horizontal_fov angle='0.78539816339744828'/>
-            <image width='320' height='240' format='L8'/>
-            <clip near='0.10000000000000001' far='100'/>
-          </camera>
-          <disable_plugin name='narrow_stereo_gazebo_l_stereo_camera_controller' filename='libgazebo_ros_camera.so'>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>25.0</updateRate>
-            <cameraName>narrow_stereo/left</cameraName>
-            <imageTopicName>image_raw</imageTopicName>
-            <cameraInfoTopicName>camera_info</cameraInfoTopicName>
-            <frameName>narrow_stereo_optical_frame</frameName>
-            <hackBaseline>0</hackBaseline>
-            <CxPrime>320.5</CxPrime>
-            <Cx>320.5</Cx>
-            <Cy>240.5</Cy>
-            <focal_length>772.55</focal_length>
-            <distortion_k1>0.0</distortion_k1>
-            <distortion_k2>0.0</distortion_k2>
-            <distortion_k3>0.0</distortion_k3>
-            <distortion_t1>0.0</distortion_t1>
-            <distortion_t2>0.0</distortion_t2>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='narrow_stereo_gazebo_r_stereo_camera_frame' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 -0.03 1.27012 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <disable_sensor name='narrow_stereo_gazebo_r_stereo_camera_sensor' type='camera' always_on='0' update_rate='25'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <camera>
-            <horizontal_fov angle='0.78539816339744828'/>
-            <image width='320' height='240' format='L8'/>
-            <clip near='0.10000000000000001' far='100'/>
-          </camera>
-          <disable_plugin name='narrow_stereo_gazebo_r_stereo_camera_controller' filename='libgazebo_ros_camera.so'>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>25.0</updateRate>
-            <cameraName>narrow_stereo/right</cameraName>
-            <imageTopicName>image_raw</imageTopicName>
-            <cameraInfoTopicName>camera_info</cameraInfoTopicName>
-            <frameName>narrow_stereo_optical_frame</frameName>
-            <hackBaseline>0.09</hackBaseline>
-            <CxPrime>320.5</CxPrime>
-            <Cx>320.5</Cx>
-            <Cy>240.5</Cy>
-            <focal_length>772.55</focal_length>
-            <distortion_k1>0.0</distortion_k1>
-            <distortion_k2>0.0</distortion_k2>
-            <distortion_k3>0.0</distortion_k3>
-            <distortion_t1>0.0</distortion_t1>
-            <distortion_t2>0.0</distortion_t2>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='wide_stereo_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 0.03 1.27012 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-      </link>
-      <link name='wide_stereo_gazebo_l_stereo_camera_frame' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 0.03 1.27012 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <disable_sensor name='wide_stereo_gazebo_l_stereo_camera_sensor' type='camera' always_on='0' update_rate='25'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <camera>
-            <horizontal_fov angle='1.5707963267948966'/>
-            <image width='320' height='240' format='BAYER_BGGR8'/>
-            <clip near='0.10000000000000001' far='100'/>
-          </camera>
-          <disable_plugin name='wide_stereo_gazebo_l_stereo_camera_controller' filename='libgazebo_ros_camera.so'>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>25.0</updateRate>
-            <cameraName>wide_stereo/left</cameraName>
-            <imageTopicName>image_raw</imageTopicName>
-            <cameraInfoTopicName>camera_info</cameraInfoTopicName>
-            <frameName>wide_stereo_optical_frame</frameName>
-            <hackBaseline>0</hackBaseline>
-            <CxPrime>320.5</CxPrime>
-            <Cx>320.5</Cx>
-            <Cy>240.5</Cy>
-            <focal_length>320</focal_length>
-            <distortion_k1>0.0</distortion_k1>
-            <distortion_k2>0.0</distortion_k2>
-            <distortion_k3>0.0</distortion_k3>
-            <distortion_t1>0.0</distortion_t1>
-            <distortion_t2>0.0</distortion_t2>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='wide_stereo_gazebo_r_stereo_camera_frame' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.02413 -0.06 1.27012 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <disable_sensor name='wide_stereo_gazebo_r_stereo_camera_sensor' type='camera' always_on='0' update_rate='25'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <camera>
-            <horizontal_fov angle='1.5707963267948966'/>
-            <image width='320' height='240' format='BAYER_BGGR8'/>
-            <clip near='0.10000000000000001' far='100'/>
-          </camera>
-          <disable_plugin name='wide_stereo_gazebo_r_stereo_camera_controller' filename='libgazebo_ros_camera.so'>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>25.0</updateRate>
-            <cameraName>wide_stereo/right</cameraName>
-            <imageTopicName>image_raw</imageTopicName>
-            <cameraInfoTopicName>camera_info</cameraInfoTopicName>
-            <frameName>wide_stereo_optical_frame</frameName>
-            <hackBaseline>0.09</hackBaseline>
-            <CxPrime>320.5</CxPrime>
-            <Cx>320.5</Cx>
-            <Cy>240.5</Cy>
-            <focal_length>320</focal_length>
-            <distortion_k1>0.0</distortion_k1>
-            <distortion_k2>0.0</distortion_k2>
-            <distortion_k3>0.0</distortion_k3>
-            <distortion_t1>0.0</distortion_t1>
-            <distortion_t2>0.0</distortion_t2>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='high_def_frame' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.070587 -0.11 1.29123 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <disable_sensor name='high_def_sensor' type='camera' always_on='0' update_rate='20'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <camera>
-            <horizontal_fov angle='0.78539816339744828'/>
-            <image width='320' height='240' format='R8G8B8'/>
-            <clip near='0.10000000000000001' far='100'/>
-          </camera>
-          <disable_plugin name='high_def_controller' filename='libgazebo_ros_prosilica.so'>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>20.0</updateRate>
-            <cameraName>prosilica</cameraName>
-            <imageTopicName>image_raw</imageTopicName>
-            <cameraInfoTopicName>camera_info</cameraInfoTopicName>
-            <pollServiceName>request_image</pollServiceName>
-            <frameName>high_def_optical_frame</frameName>
-            <CxPrime>1224.5</CxPrime>
-            <Cx>1224.5</Cx>
-            <Cy>1025.5</Cy>
-            <focal_length>2955</focal_length>
-            <distortion_k1>0.0</distortion_k1>
-            <distortion_k2>0.0</distortion_k2>
-            <distortion_k3>0.0</distortion_k3>
-            <distortion_t1>0.0</distortion_t1>
-            <distortion_t2>0.0</distortion_t2>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='high_def_optical_frame' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.070587 -0.11 1.29123 -2.03541 5.55112e-17 -2.03541'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-      </link>
-      <link name='imu_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.07977 -0.1497 0.954675 -2.21237 -1.18502e-11 -2.21237'/>
-        <inertial mass='0.001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.0001' ixy='0' ixz='0' iyy='9.9999999999999995e-07' iyz='0' izz='0.0001'/>
-        </inertial>
-      </link>
-      <link name='l_shoulder_pan_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='-0.05 0.188 0.790675 0 -0 0'/>
-        <inertial mass='25.799299999999999'>
-          <origin pose='-0.001201 0.024513 -0.098231 0 -0 0'/>
-          <inertia ixx='0.86617900000000003' ixy='-0.060865099999999998' ixz='-0.121181' iyy='0.87421700000000002' iyz='-0.058866099999999998' izz='0.273538'/>
-        </inertial>
-        <collision name='l_shoulder_pan_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/shoulder_pan.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/shoulder_pan.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_shoulder_lift_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.05 0.188 0.790675 0 -0 0'/>
-        <inertial mass='2.7498800000000001'>
-          <origin pose='0.02195 -0.02664 -0.03127 0 -0 0'/>
-          <inertia ixx='0.0210558' ixy='0.0049670399999999998' ixz='-0.00194809' iyy='0.021272200000000002' iyz='0.00110425' izz='0.019757500000000001'/>
-        </inertial>
-        <collision name='l_shoulder_lift_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/shoulder_lift.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/shoulder_lift.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_upper_arm_roll_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.05 0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-        <collision name='l_upper_arm_roll_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/upper_arm_roll_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/upper_arm_roll.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/RollLinks'/>
-        </visual>
-      </link>
-      <link name='l_upper_arm_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.05 0.188 0.790675 0 -0 0'/>
-        <inertial mass='6.01769'>
-          <origin pose='0.21405 0.01658 -0.00057 0 -0 0'/>
-          <inertia ixx='0.015306' ixy='-0.00339325' ixz='0.00060765500000000002' iyy='0.074736899999999995' iyz='-0.00019953700000000001' izz='0.076015899999999997'/>
-        </inertial>
-        <collision name='l_upper_arm_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/upper_arm.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/upper_arm.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_elbow_flex_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.45 0.188 0.790675 0 -0 0'/>
-        <inertial mass='1.90327'>
-          <origin pose='0.01014 0.00032 -0.01211 0 -0 0'/>
-          <inertia ixx='0.0034654199999999999' ixy='4.0668299999999998e-05' ixz='0.00043171600000000001' iyy='0.0044160600000000003' iyz='-3.9689099999999999e-05' izz='0.0035915700000000001'/>
-        </inertial>
-        <collision name='l_elbow_flex_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/elbow_flex.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/elbow_flex.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_forearm_roll_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.45 0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-        <collision name='l_forearm_roll_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/forearm_roll_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/forearm_roll.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/RollLinks'/>
-        </visual>
-      </link>
-      <link name='l_forearm_cam_frame' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.585 0.188 0.834675 -2.03541 -0.834073 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <disable_sensor name='l_forearm_cam_sensor' type='camera' always_on='0' update_rate='25'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <camera>
-            <horizontal_fov angle='1.5707963267948966'/>
-            <image width='320' height='240' format='R8G8B8'/>
-            <clip near='0.10000000000000001' far='100'/>
-          </camera>
-          <disable_plugin name='l_forearm_cam_controller' filename='libgazebo_ros_camera.so'>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>25.0</updateRate>
-            <cameraName>l_forearm_cam</cameraName>
-            <imageTopicName>image_raw</imageTopicName>
-            <cameraInfoTopicName>camera_info</cameraInfoTopicName>
-            <frameName>l_forearm_cam_optical_frame</frameName>
-            <hackBaseline>0</hackBaseline>
-            <CxPrime>320.5</CxPrime>
-            <Cx>320.5</Cx>
-            <Cy>240.5</Cy>
-            <focal_length>320</focal_length>
-            <distortion_k1>0.0</distortion_k1>
-            <distortion_k2>0.0</distortion_k2>
-            <distortion_k3>0.0</distortion_k3>
-            <distortion_t1>0.0</distortion_t1>
-            <distortion_t2>0.0</distortion_t2>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='l_forearm_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.45 0.188 0.790675 0 -0 0'/>
-        <inertial mass='2.5796800000000002'>
-          <origin pose='0.18791 -0.00017 -0.00912 0 -0 0'/>
-          <inertia ixx='0.0036485699999999999' ixy='5.2158799999999999e-05' ixz='0.00071534799999999998' iyy='0.015077399999999999' iyz='-1.31077e-05' izz='0.0165931'/>
-        </inertial>
-        <collision name='l_forearm_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/forearm.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/forearm.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_wrist_flex_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.771 0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.61402000000000001'>
-          <origin pose='-0.00157 0 -0.00075 0 -0 0'/>
-          <inertia ixx='0.00065165700000000004' ixy='2.8864000000000002e-07' ixz='3.0347700000000002e-06' iyy='0.00019824400000000001' iyz='-2.2644999999999999e-07' izz='0.00064450499999999997'/>
-        </inertial>
-        <collision name='l_wrist_flex_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/wrist_flex.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/wrist_flex.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_wrist_roll_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.771 0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-        <collision name='l_wrist_roll_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/wrist_roll_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/wrist_roll.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/RollLinks'/>
-        </visual>
-      </link>
-      <link name='l_gripper_palm_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.771 0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.58006999999999997'>
-          <origin pose='0.06623 0.00053 -0.00119 0 -0 0'/>
-          <inertia ixx='0.00035223900000000001' ixy='-1.5804800000000002e-05' ixz='-9.175e-07' iyy='0.00067741299999999997' iyz='-5.9554e-07' izz='0.00086563299999999998'/>
-        </inertial>
-        <collision name='l_gripper_palm_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/gripper_palm.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/gripper_palm.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_gripper_l_finger_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.84791 0.198 0.790675 0 -0 0'/>
-        <inertial mass='0.17126'>
-          <origin pose='0.03598 0.0173 -0.00164 0 -0 0'/>
-          <inertia ixx='7.7562e-05' ixy='1.4909500000000001e-06' ixz='-9.8338500000000007e-06' iyy='0.000197083' iyz='-3.0612500000000001e-06' izz='0.00018105399999999999'/>
-        </inertial>
-        <collision name='l_gripper_l_finger_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='500' mu2='500' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_gripper_l_finger_tip_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.93928 0.20295 0.790675 0 -0 0'/>
-        <inertial mass='0.04419'>
-          <origin pose='0.00423 0.00284 0 0 -0 0'/>
-          <inertia ixx='8.3704700000000002e-06' ixy='5.8363200000000001e-06' ixz='0' iyy='9.8706699999999998e-06' iyz='0' izz='1.54177e-05'/>
-        </inertial>
-        <collision name='l_gripper_l_finger_tip_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger_tip.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='500' mu2='500' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger_tip.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-        <disable_sensor name='l_gripper_l_finger_tip_contact_sensor' type='contact' always_on='0' update_rate='100'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <contact>
-            <collision name='l_gripper_l_finger_tip_link_geom'/>
-          </contact>
-          <disable_plugin name='l_gripper_l_finger_tip_gazebo_ros_bumper_controller' filename='libgazebo_ros_bumper.so'>
-            <alwaysOn>1</alwaysOn>
-            <frameName>l_gripper_l_finger_tip_link</frameName>
-            <updateRate>100.0</updateRate>
-            <bumperTopicName>l_gripper_l_finger_tip_bumper</bumperTopicName>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='l_gripper_motor_accelerometer_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.771 0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <collision name='l_gripper_motor_accelerometer_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <box size='0.001 0.001 0.001'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <box size='0.001 0.001 0.001'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_gripper_motor_slider_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.93928 0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-      </link>
-      <link name='l_gripper_motor_screw_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.93928 0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.0001' ixy='0' ixz='0' iyy='0.0001' iyz='0' izz='0.0001'/>
-        </inertial>
-      </link>
-      <link name='l_gripper_r_finger_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.84791 0.178 0.790675 0 -0 0'/>
-        <inertial mass='0.17388999999999999'>
-          <origin pose='0.03576 -0.01736 -0.00095 0 -0 0'/>
-          <inertia ixx='7.7384099999999997e-05' ixy='-2.0930900000000001e-06' ixz='-8.3622799999999998e-06' iyy='0.000198474' iyz='2.4611e-06' izz='0.00018107'/>
-        </inertial>
-        <collision name='l_gripper_r_finger_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.21237 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='500' mu2='500' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 2.21237 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='l_gripper_r_finger_tip_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.93928 0.17305 0.790675 0 -0 0'/>
-        <inertial mass='0.04419'>
-          <origin pose='0.00423 -0.00284 0 0 -0 0'/>
-          <inertia ixx='8.3704700000000002e-06' ixy='-5.8363200000000001e-06' ixz='0' iyy='9.8706699999999998e-06' iyz='0' izz='1.54177e-05'/>
-        </inertial>
-        <collision name='l_gripper_r_finger_tip_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.21237 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger_tip.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='500' mu2='500' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 2.21237 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger_tip.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-        <disable_sensor name='l_gripper_r_finger_tip_contact_sensor' type='contact' always_on='0' update_rate='100'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <contact>
-            <collision name='l_gripper_r_finger_tip_link_geom'/>
-          </contact>
-          <disable_plugin name='l_gripper_r_finger_tip_gazebo_ros_bumper_controller' filename='libgazebo_ros_bumper.so'>
-            <alwaysOn>1</alwaysOn>
-            <frameName>l_gripper_r_finger_tip_link</frameName>
-            <updateRate>100.0</updateRate>
-            <bumperTopicName>l_gripper_r_finger_tip_bumper</bumperTopicName>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='l_torso_lift_side_plate_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.0035 0.209285 0.9673 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='-0.0625 0 0.05 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-      </link>
-      <link name='laser_tilt_mount_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.04893 0 1.01768 0 -0 0'/>
-        <inertial mass='0.59099999999999997'>
-          <origin pose='-0.001136 0.00167 -0.00713 0 -0 0'/>
-          <inertia ixx='0.00119527' ixy='2.3087000000000001e-05' ixz='3.7466999999999999e-05' iyy='0.0010839599999999999' iyz='3.4906000000000001e-05' izz='0.00079501400000000003'/>
-        </inertial>
-        <collision name='laser_tilt_mount_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/tilting_laser_v0/tilting_hokuyo_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/tilting_laser_v0/tilting_hokuyo.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='laser_tilt_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.04893 0 1.04768 0 -0 0'/>
-        <inertial mass='0.001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.0001' ixy='0' ixz='0' iyy='9.9999999999999995e-07' iyz='0' izz='0.0001'/>
-        </inertial>
-        <disable_sensor name='laser_tilt' type='ray' always_on='0' update_rate='40'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <ray>
-            <scan display='1'>
-              <horizontal samples='640' resolution='1' min_angle='-1.3962634000002327' max_angle='1.3962634000002327'/>
-            </scan>
-            <range min='0.080000000000000002' max='10' resolution='0.01'/>
-          </ray>
-          <disable_plugin name='gazebo_ros_laser_tilt_controller' filename='libgazebo_ros_laser.so'>
-            <gaussianNoise>0.005</gaussianNoise>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>40</updateRate>
-            <topicName>tilt_scan</topicName>
-            <frameName>laser_tilt_link</frameName>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='r_shoulder_pan_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='-0.05 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='25.799299999999999'>
-          <origin pose='-0.001201 0.024513 -0.098231 0 -0 0'/>
-          <inertia ixx='0.86617900000000003' ixy='-0.060865099999999998' ixz='-0.121181' iyy='0.87421700000000002' iyz='-0.058866099999999998' izz='0.273538'/>
-        </inertial>
-        <collision name='r_shoulder_pan_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/shoulder_pan.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/shoulder_pan.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_shoulder_lift_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.05 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='2.7498800000000001'>
-          <origin pose='0.02195 -0.02664 -0.03127 0 -0 0'/>
-          <inertia ixx='0.0210558' ixy='0.0049670399999999998' ixz='-0.00194809' iyy='0.021272200000000002' iyz='0.00110425' izz='0.019757500000000001'/>
-        </inertial>
-        <collision name='r_shoulder_lift_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/shoulder_lift.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/shoulder_lift.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_upper_arm_roll_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.05 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-        <collision name='r_upper_arm_roll_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/upper_arm_roll_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/shoulder_v0/upper_arm_roll.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/RollLinks'/>
-        </visual>
-      </link>
-      <link name='r_upper_arm_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.05 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='6.01769'>
-          <origin pose='0.21398 -0.01621 -0.0002 0 -0 0'/>
-          <inertia ixx='0.015377500000000001' ixy='0.0037571100000000001' ixz='-0.00070852899999999995' iyy='0.074736700000000003' iyz='-0.00017936499999999999' izz='0.076087600000000005'/>
-        </inertial>
-        <collision name='r_upper_arm_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/upper_arm.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/upper_arm.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_elbow_flex_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.45 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='1.90327'>
-          <origin pose='0.01014 0.00032 -0.01211 0 -0 0'/>
-          <inertia ixx='0.0034654199999999999' ixy='4.0668299999999998e-05' ixz='0.00043171600000000001' iyy='0.0044160600000000003' iyz='-3.9689099999999999e-05' izz='0.0035915700000000001'/>
-        </inertial>
-        <collision name='r_elbow_flex_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/elbow_flex.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/elbow_flex.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_forearm_roll_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.45 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-        <collision name='r_forearm_roll_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/forearm_roll_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/upper_arm_v0/forearm_roll.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/RollLinks'/>
-        </visual>
-      </link>
-      <link name='r_forearm_cam_frame' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.585 -0.188 0.834675 2.03541 -0.834073 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <disable_sensor name='r_forearm_cam_sensor' type='camera' always_on='0' update_rate='25'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <camera>
-            <horizontal_fov angle='1.5707963267948966'/>
-            <image width='320' height='240' format='R8G8B8'/>
-            <clip near='0.10000000000000001' far='100'/>
-          </camera>
-          <disable_plugin name='r_forearm_cam_controller' filename='libgazebo_ros_camera.so'>
-            <alwaysOn>1</alwaysOn>
-            <updateRate>25.0</updateRate>
-            <cameraName>r_forearm_cam</cameraName>
-            <imageTopicName>image_raw</imageTopicName>
-            <cameraInfoTopicName>camera_info</cameraInfoTopicName>
-            <frameName>r_forearm_cam_optical_frame</frameName>
-            <hackBaseline>0</hackBaseline>
-            <CxPrime>320.5</CxPrime>
-            <Cx>320.5</Cx>
-            <Cy>240.5</Cy>
-            <focal_length>320</focal_length>
-            <distortion_k1>0.0</distortion_k1>
-            <distortion_k2>0.0</distortion_k2>
-            <distortion_k3>0.0</distortion_k3>
-            <distortion_t1>0.0</distortion_t1>
-            <distortion_t2>0.0</distortion_t2>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='r_forearm_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.45 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='2.5796800000000002'>
-          <origin pose='0.18791 -0.00017 -0.00912 0 -0 0'/>
-          <inertia ixx='0.0036485699999999999' ixy='5.2158799999999999e-05' ixz='0.00071534799999999998' iyy='0.015077399999999999' iyz='-1.31077e-05' izz='0.0165931'/>
-        </inertial>
-        <collision name='r_forearm_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/forearm.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/forearm.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_wrist_flex_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.771 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.61402000000000001'>
-          <origin pose='-0.00157 0 -0.00075 0 -0 0'/>
-          <inertia ixx='0.00065165700000000004' ixy='2.8864000000000002e-07' ixz='3.0347700000000002e-06' iyy='0.00019824400000000001' iyz='-2.2644999999999999e-07' izz='0.00064450499999999997'/>
-        </inertial>
-        <collision name='r_wrist_flex_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/wrist_flex.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/wrist_flex.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_wrist_roll_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.771 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.01' ixy='0' ixz='0' iyy='0.01' iyz='0' izz='0.01'/>
-        </inertial>
-        <collision name='r_wrist_roll_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/wrist_roll_L.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/forearm_v0/wrist_roll.stl' scale='1 1 1'/>
-          </geometry>
-          <material script='PR2/RollLinks'/>
-        </visual>
-      </link>
-      <link name='r_gripper_palm_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.771 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.58006999999999997'>
-          <origin pose='0.06623 0.00053 -0.00119 0 -0 0'/>
-          <inertia ixx='0.00035223900000000001' ixy='-1.5804800000000002e-05' ixz='-9.175e-07' iyy='0.00067741299999999997' iyz='-5.9554e-07' izz='0.00086563299999999998'/>
-        </inertial>
-        <collision name='r_gripper_palm_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/gripper_palm.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/gripper_palm.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_gripper_l_finger_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.84791 -0.178 0.790675 0 -0 0'/>
-        <inertial mass='0.17126'>
-          <origin pose='0.03598 0.0173 -0.00164 0 -0 0'/>
-          <inertia ixx='7.7562e-05' ixy='1.4909500000000001e-06' ixz='-9.8338500000000007e-06' iyy='0.000197083' iyz='-3.0612500000000001e-06' izz='0.00018105399999999999'/>
-        </inertial>
-        <collision name='r_gripper_l_finger_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='500' mu2='500' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_gripper_l_finger_tip_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.93928 -0.17305 0.790675 0 -0 0'/>
-        <inertial mass='0.04419'>
-          <origin pose='0.00423 0.00284 0 0 -0 0'/>
-          <inertia ixx='8.3704700000000002e-06' ixy='5.8363200000000001e-06' ixz='0' iyy='9.8706699999999998e-06' iyz='0' izz='1.54177e-05'/>
-        </inertial>
-        <collision name='r_gripper_l_finger_tip_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger_tip.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='500' mu2='500' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger_tip.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-        <disable_sensor name='r_gripper_l_finger_tip_contact_sensor' type='contact' always_on='0' update_rate='100'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <contact>
-            <collision name='r_gripper_l_finger_tip_link_geom'/>
-          </contact>
-          <disable_plugin name='r_gripper_l_finger_tip_gazebo_ros_bumper_controller' filename='libgazebo_ros_bumper.so'>
-            <alwaysOn>1</alwaysOn>
-            <frameName>r_gripper_l_finger_tip_link</frameName>
-            <updateRate>100.0</updateRate>
-            <bumperTopicName>r_gripper_l_finger_tip_bumper</bumperTopicName>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='r_gripper_motor_accelerometer_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.771 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.001'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-        <collision name='r_gripper_motor_accelerometer_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <box size='0.001 0.001 0.001'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='0' mu2='0' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000000000' kd='100000000000' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <geometry>
-            <box size='0.001 0.001 0.001'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_gripper_motor_slider_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.93928 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-      </link>
-      <link name='r_gripper_motor_screw_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.93928 -0.188 0.790675 0 -0 0'/>
-        <inertial mass='0.01'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.0001' ixy='0' ixz='0' iyy='0.0001' iyz='0' izz='0.0001'/>
-        </inertial>
-      </link>
-      <link name='r_gripper_r_finger_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.84791 -0.198 0.790675 0 -0 0'/>
-        <inertial mass='0.17388999999999999'>
-          <origin pose='0.03576 -0.01736 -0.00095 0 -0 0'/>
-          <inertia ixx='7.7384099999999997e-05' ixy='-2.0930900000000001e-06' ixz='-8.3622799999999998e-06' iyy='0.000198474' iyz='2.4611e-06' izz='0.00018107'/>
-        </inertial>
-        <collision name='r_gripper_r_finger_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.21237 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='500' mu2='500' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='1000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 2.21237 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-      </link>
-      <link name='r_gripper_r_finger_tip_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.93928 -0.20295 0.790675 0 -0 0'/>
-        <inertial mass='0.04419'>
-          <origin pose='0.00423 -0.00284 0 0 -0 0'/>
-          <inertia ixx='8.3704700000000002e-06' ixy='-5.8363200000000001e-06' ixz='0' iyy='9.8706699999999998e-06' iyz='0' izz='1.54177e-05'/>
-        </inertial>
-        <collision name='r_gripper_r_finger_tip_link_geom' laser_retro='0'>
-          <origin pose='0 0 0 2.21237 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger_tip.stl' scale='1 1 1'/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu='500' mu2='500' fdir1='0 0 0' slip1='0' slip2='0'/>
-            </friction>
-            <bounce restitution_coefficient='0' threshold='0'/>
-            <contact>
-              <ode soft_cfm='0' soft_erp='0.20000000000000001' kp='10000000' kd='1' max_vel='-1' min_depth='0'/>
-            </contact>
-          </surface>
-        </collision>
-        <visual name='old_gazebo_xml_visual' cast_shadows='1' laser_retro='0' transparency='0'>
-          <origin pose='0 0 0 2.21237 -0 0'/>
-          <geometry>
-            <mesh filename='pr2/gripper_v0/l_finger_tip.dae' scale='1 1 1'/>
-          </geometry>
-        </visual>
-        <disable_sensor name='r_gripper_r_finger_tip_contact_sensor' type='contact' always_on='0' update_rate='100'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <contact>
-            <collision name='r_gripper_r_finger_tip_link_geom'/>
-          </contact>
-          <disable_plugin name='r_gripper_r_finger_tip_gazebo_ros_bumper_controller' filename='libgazebo_ros_bumper.so'>
-            <alwaysOn>1</alwaysOn>
-            <frameName>r_gripper_r_finger_tip_link</frameName>
-            <updateRate>100.0</updateRate>
-            <bumperTopicName>r_gripper_r_finger_tip_bumper</bumperTopicName>
-          </disable_plugin>
-        </disable_sensor>
-      </link>
-      <link name='r_torso_lift_side_plate_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='0.0035 -0.209285 0.9673 0 -0 0'/>
-        <inertial mass='0.10000000000000001'>
-          <origin pose='-0.0625 0 0.05 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-      </link>
-      <link name='torso_lift_motor_screw_link' gravity='1' self_collide='0' kinematic='0'>
-        <origin pose='-0.15 0 0.751 0 -0 0'/>
-        <inertial mass='1'>
-          <origin pose='0 0 0 0 -0 0'/>
-          <inertia ixx='0.001' ixy='0' ixz='0' iyy='0.001' iyz='0' izz='0.001'/>
-        </inertial>
-      </link>
-      <link name='r_gripper_l_parallel_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.82991 -0.157 0.790675 0 -0 0'/>
-        <inertial mass='0.17126'>
-          <origin pose='0.03598 0.0173 -0.00164 0 -0 0'/>
-          <inertia ixx='7.7562e-05' ixy='1.4909500000000001e-06' ixz='-9.8338500000000007e-06' iyy='0.000197083' iyz='-3.0612500000000001e-06' izz='0.00018105399999999999'/>
-        </inertial>
-      </link>
-      <link name='r_gripper_r_parallel_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.82991 -0.219 0.790675 0 -0 0'/>
-        <inertial mass='0.17388999999999999'>
-          <origin pose='0.03576 -0.01736 -0.00095 0 -0 0'/>
-          <inertia ixx='7.7384099999999997e-05' ixy='-2.0930900000000001e-06' ixz='-8.3622799999999998e-06' iyy='0.000198474' iyz='2.4611e-06' izz='0.00018107'/>
-        </inertial>
-      </link>
-      <link name='l_gripper_l_parallel_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.82991 0.219 0.790675 0 -0 0'/>
-        <inertial mass='0.17126'>
-          <origin pose='0.03598 0.0173 -0.00164 0 -0 0'/>
-          <inertia ixx='7.7562e-05' ixy='1.4909500000000001e-06' ixz='-9.8338500000000007e-06' iyy='0.000197083' iyz='-3.0612500000000001e-06' izz='0.00018105399999999999'/>
-        </inertial>
-      </link>
-      <link name='l_gripper_r_parallel_link' gravity='0' self_collide='0' kinematic='0'>
-        <origin pose='0.82991 0.157 0.790675 0 -0 0'/>
-        <inertial mass='0.17388999999999999'>
-          <origin pose='0.03576 -0.01736 -0.00095 0 -0 0'/>
-          <inertia ixx='7.7384099999999997e-05' ixy='-2.0930900000000001e-06' ixz='-8.3622799999999998e-06' iyy='0.000198474' iyz='2.4611e-06' izz='0.00018107'/>
-        </inertial>
-      </link>
-      <joint name='base_footprint_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='base_footprint'/>
-        <child link='base_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='base_bellow_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='base_link'/>
-        <child link='base_bellow_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='base_laser_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='base_link'/>
-        <child link='base_laser_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='bl_caster_rotation_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='base_link'/>
-        <child link='bl_caster_rotation_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='bl_caster_l_wheel_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='bl_caster_rotation_link'/>
-        <child link='bl_caster_l_wheel_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='bl_caster_r_wheel_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='bl_caster_rotation_link'/>
-        <child link='bl_caster_r_wheel_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='br_caster_rotation_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='base_link'/>
-        <child link='br_caster_rotation_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='br_caster_l_wheel_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='br_caster_rotation_link'/>
-        <child link='br_caster_l_wheel_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='br_caster_r_wheel_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='br_caster_rotation_link'/>
-        <child link='br_caster_r_wheel_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='fl_caster_rotation_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='base_link'/>
-        <child link='fl_caster_rotation_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='fl_caster_l_wheel_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='fl_caster_rotation_link'/>
-        <child link='fl_caster_l_wheel_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='fl_caster_r_wheel_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='fl_caster_rotation_link'/>
-        <child link='fl_caster_r_wheel_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='fr_caster_rotation_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='base_link'/>
-        <child link='fr_caster_rotation_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='fr_caster_l_wheel_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='fr_caster_rotation_link'/>
-        <child link='fr_caster_l_wheel_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='fr_caster_r_wheel_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='fr_caster_rotation_link'/>
-        <child link='fr_caster_r_wheel_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='torso_lift_joint' type='prismatic'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='base_link'/>
-        <child link='torso_lift_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='20000' friction='0'/>
-          <limit lower='0' upper='0.33000000000000002' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='head_pan_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='torso_lift_link'/>
-        <child link='head_pan_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='1' friction='0'/>
-          <limit lower='-3.0069928616759904' upper='3.0069928616759904' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='head_tilt_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='head_pan_link'/>
-        <child link='head_tilt_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='1' friction='0'/>
-          <limit lower='-0.47123715270921696' upper='1.3962599109369596' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='head_plate_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='head_tilt_link'/>
-        <child link='head_plate_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='projector_wg6802418_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='head_plate_frame'/>
-        <child link='projector_wg6802418_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='projector_wg6802418_child_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='projector_wg6802418_frame'/>
-        <child link='projector_wg6802418_child_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='sensor_mount_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='head_plate_frame'/>
-        <child link='sensor_mount_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='double_stereo_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='sensor_mount_link'/>
-        <child link='double_stereo_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='narrow_stereo_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='double_stereo_link'/>
-        <child link='narrow_stereo_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='narrow_stereo_gazebo_l_stereo_camera_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='narrow_stereo_link'/>
-        <child link='narrow_stereo_gazebo_l_stereo_camera_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='narrow_stereo_gazebo_r_stereo_camera_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='narrow_stereo_gazebo_l_stereo_camera_frame'/>
-        <child link='narrow_stereo_gazebo_r_stereo_camera_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='wide_stereo_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='double_stereo_link'/>
-        <child link='wide_stereo_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='wide_stereo_gazebo_l_stereo_camera_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='wide_stereo_link'/>
-        <child link='wide_stereo_gazebo_l_stereo_camera_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='wide_stereo_gazebo_r_stereo_camera_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='wide_stereo_gazebo_l_stereo_camera_frame'/>
-        <child link='wide_stereo_gazebo_r_stereo_camera_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='high_def_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='sensor_mount_link'/>
-        <child link='high_def_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='high_def_optical_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='high_def_frame'/>
-        <child link='high_def_optical_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='imu_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='torso_lift_link'/>
-        <child link='imu_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_shoulder_pan_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='torso_lift_link'/>
-        <child link='l_shoulder_pan_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='10' friction='0'/>
-          <limit lower='-0.71460237294880236' upper='2.2854039357314546' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_shoulder_lift_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_shoulder_pan_link'/>
-        <child link='l_shoulder_lift_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='10' friction='0'/>
-          <limit lower='-0.52360052092755083' upper='1.3963000535097554' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_upper_arm_roll_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_shoulder_lift_link'/>
-        <child link='l_upper_arm_roll_link'/>
-        <axis xyz='1 0 0'>
-          <dynamics damping='0.10000000000000001' friction='0'/>
-          <limit lower='-0.79999958791963277' upper='3.9000080267514092' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_upper_arm_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_upper_arm_roll_link'/>
-        <child link='l_upper_arm_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_elbow_flex_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_upper_arm_link'/>
-        <child link='l_elbow_flex_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='1' friction='0'/>
-          <limit lower='-2.3213053584449783' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_forearm_roll_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_elbow_flex_link'/>
-        <child link='l_forearm_roll_link'/>
-        <axis xyz='1 0 0'>
-          <dynamics damping='0.10000000000000001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_forearm_cam_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_forearm_roll_link'/>
-        <child link='l_forearm_cam_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_forearm_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_forearm_roll_link'/>
-        <child link='l_forearm_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_wrist_flex_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_forearm_link'/>
-        <child link='l_wrist_flex_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0.10000000000000001' friction='0'/>
-          <limit lower='-2.1800035022035171' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_wrist_roll_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_wrist_flex_link'/>
-        <child link='l_wrist_roll_link'/>
-        <axis xyz='1 0 0'>
-          <dynamics damping='0.10000000000000001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_palm_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_wrist_roll_link'/>
-        <child link='l_gripper_palm_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_l_finger_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_palm_link'/>
-        <child link='l_gripper_l_finger_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0.02' friction='0'/>
-          <limit lower='0' upper='0.54800022387043157' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_l_finger_tip_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_l_finger_link'/>
-        <child link='l_gripper_l_finger_tip_link'/>
-        <axis xyz='0 0 -1'>
-          <dynamics damping='0.001' friction='0'/>
-          <limit lower='0' upper='0.54800022387043157' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_motor_accelerometer_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_palm_link'/>
-        <child link='l_gripper_motor_accelerometer_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_motor_slider_joint' type='prismatic'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_palm_link'/>
-        <child link='l_gripper_motor_slider_link'/>
-        <axis xyz='1 0 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-0.10000000000000001' upper='0.10000000000000001' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_motor_screw_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_motor_slider_link'/>
-        <child link='l_gripper_motor_screw_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0.0001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_r_finger_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_palm_link'/>
-        <child link='l_gripper_r_finger_link'/>
-        <axis xyz='0 0 -1'>
-          <dynamics damping='0.02' friction='0'/>
-          <limit lower='0' upper='0.54800022387043157' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_r_finger_tip_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_r_finger_link'/>
-        <child link='l_gripper_r_finger_tip_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0.001' friction='0'/>
-          <limit lower='0' upper='0.54800022387043157' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_torso_lift_side_plate_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='torso_lift_link'/>
-        <child link='l_torso_lift_side_plate_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='laser_tilt_mount_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='torso_lift_link'/>
-        <child link='laser_tilt_mount_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0.0080000000000000002' friction='0'/>
-          <limit lower='-0.7853999087267004' upper='1.4835298641951802' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='laser_tilt_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='laser_tilt_mount_link'/>
-        <child link='laser_tilt_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_shoulder_pan_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='torso_lift_link'/>
-        <child link='r_shoulder_pan_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='10' friction='0'/>
-          <limit lower='-2.2854039357314546' upper='0.71460237294880236' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_shoulder_lift_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_shoulder_pan_link'/>
-        <child link='r_shoulder_lift_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='10' friction='0'/>
-          <limit lower='-0.52360052092755083' upper='1.3963000535097554' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_upper_arm_roll_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_shoulder_lift_link'/>
-        <child link='r_upper_arm_roll_link'/>
-        <axis xyz='1 0 0'>
-          <dynamics damping='0.10000000000000001' friction='0'/>
-          <limit lower='-3.9000080267514092' upper='0.79999958791963277' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_upper_arm_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_upper_arm_roll_link'/>
-        <child link='r_upper_arm_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_elbow_flex_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_upper_arm_link'/>
-        <child link='r_elbow_flex_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='1' friction='0'/>
-          <limit lower='-2.3213053584449783' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_forearm_roll_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_elbow_flex_link'/>
-        <child link='r_forearm_roll_link'/>
-        <axis xyz='1 0 0'>
-          <dynamics damping='0.10000000000000001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_forearm_cam_frame_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_forearm_roll_link'/>
-        <child link='r_forearm_cam_frame'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_forearm_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_forearm_roll_link'/>
-        <child link='r_forearm_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_wrist_flex_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_forearm_link'/>
-        <child link='r_wrist_flex_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0.10000000000000001' friction='0'/>
-          <limit lower='-2.1800035022035171' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_wrist_roll_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_wrist_flex_link'/>
-        <child link='r_wrist_roll_link'/>
-        <axis xyz='1 0 0'>
-          <dynamics damping='0.10000000000000001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_palm_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_wrist_roll_link'/>
-        <child link='r_gripper_palm_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_l_finger_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_palm_link'/>
-        <child link='r_gripper_l_finger_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0.02' friction='0'/>
-          <limit lower='0' upper='0.54800022387043157' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_l_finger_tip_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_l_finger_link'/>
-        <child link='r_gripper_l_finger_tip_link'/>
-        <axis xyz='0 0 -1'>
-          <dynamics damping='0.001' friction='0'/>
-          <limit lower='0' upper='0.54800022387043157' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_motor_accelerometer_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_palm_link'/>
-        <child link='r_gripper_motor_accelerometer_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_motor_slider_joint' type='prismatic'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_palm_link'/>
-        <child link='r_gripper_motor_slider_link'/>
-        <axis xyz='1 0 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-0.10000000000000001' upper='0.10000000000000001' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_motor_screw_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_motor_slider_link'/>
-        <child link='r_gripper_motor_screw_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0.0001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_r_finger_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_palm_link'/>
-        <child link='r_gripper_r_finger_link'/>
-        <axis xyz='0 0 -1'>
-          <dynamics damping='0.02' friction='0'/>
-          <limit lower='0' upper='0.54800022387043157' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_r_finger_tip_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_r_finger_link'/>
-        <child link='r_gripper_r_finger_tip_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0.001' friction='0'/>
-          <limit lower='0' upper='0.54800022387043157' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_torso_lift_side_plate_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='torso_lift_link'/>
-        <child link='r_torso_lift_side_plate_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='0' upper='0' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='torso_lift_motor_screw_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='base_link'/>
-        <child link='torso_lift_motor_screw_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0.0001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='torso_lift_screw_torso_lift_joint' type='screw'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='torso_lift_link'/>
-        <child link='torso_lift_motor_screw_link'/>
-        <thread_pitch>3141.5999999999999</thread_pitch>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_r_screw_screw_joint' type='screw'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_motor_screw_link'/>
-        <child link='r_gripper_r_finger_tip_link'/>
-        <thread_pitch>-3141.5999999999999</thread_pitch>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_l_screw_screw_joint' type='screw'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_motor_screw_link'/>
-        <child link='r_gripper_l_finger_tip_link'/>
-        <thread_pitch>3141.5999999999999</thread_pitch>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_r_parallel_root_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_r_parallel_link'/>
-        <child link='r_gripper_palm_link'/>
-        <axis xyz='0 0 -1'>
-          <dynamics damping='0.20000000000000001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_l_parallel_root_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_l_parallel_link'/>
-        <child link='r_gripper_palm_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0.20000000000000001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_r_parallel_tip_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_r_parallel_link'/>
-        <child link='r_gripper_r_finger_tip_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_l_parallel_tip_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_l_parallel_link'/>
-        <child link='r_gripper_l_finger_tip_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='r_gripper_joint' type='prismatic'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='r_gripper_l_finger_tip_link'/>
-        <child link='r_gripper_r_finger_tip_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_r_screw_screw_joint' type='screw'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_motor_screw_link'/>
-        <child link='l_gripper_r_finger_tip_link'/>
-        <thread_pitch>-3141.5999999999999</thread_pitch>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_l_screw_screw_joint' type='screw'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_motor_screw_link'/>
-        <child link='l_gripper_l_finger_tip_link'/>
-        <thread_pitch>3141.5999999999999</thread_pitch>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_r_parallel_root_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_r_parallel_link'/>
-        <child link='l_gripper_palm_link'/>
-        <axis xyz='0 0 -1'>
-          <dynamics damping='0.20000000000000001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_l_parallel_root_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_l_parallel_link'/>
-        <child link='l_gripper_palm_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0.20000000000000001' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_r_parallel_tip_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_r_parallel_link'/>
-        <child link='l_gripper_r_finger_tip_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_l_parallel_tip_joint' type='revolute'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_l_parallel_link'/>
-        <child link='l_gripper_l_finger_tip_link'/>
-        <axis xyz='0 0 1'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <joint name='l_gripper_joint' type='prismatic'>
-        <origin pose='0 0 0 0 -0 0'/>
-        <parent link='l_gripper_l_finger_tip_link'/>
-        <child link='l_gripper_r_finger_tip_link'/>
-        <axis xyz='0 1 0'>
-          <dynamics damping='0' friction='0'/>
-          <limit lower='-10000000000000000' upper='10000000000000000' effort='0' velocity='0'/>
-        </axis>
-      </joint>
-      <disable_plugin name='gazebo_ros_controller_manager' filename='libgazebo_ros_controller_manager.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>1000.0</updateRate>
-      </disable_plugin>
-      <disable_plugin name='gazebo_ros_power_monitor_controller' filename='libgazebo_ros_power_monitor.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>1.0</updateRate>
-        <timeout>5</timeout>
-        <powerStateTopic>power_state</powerStateTopic>
-        <powerStateRate>10.0</powerStateRate>
-        <fullChargeCapacity>87.78</fullChargeCapacity>
-        <dischargeRate>-474</dischargeRate>
-        <chargeRate>525</chargeRate>
-        <dischargeVoltage>15.52</dischargeVoltage>
-        <chargeVoltage>16.41</chargeVoltage>
-      </disable_plugin>
-      <disable_plugin name='p3d_base_controller' filename='libgazebo_ros_p3d.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>100.0</updateRate>
-        <bodyName>base_link</bodyName>
-        <topicName>base_pose_ground_truth</topicName>
-        <gaussianNoise>0.01</gaussianNoise>
-        <frameName>map</frameName>
-        <xyzOffsets>25.7 25.7 0</xyzOffsets>
-        <rpyOffsets>0 0 0</rpyOffsets>
-      </disable_plugin>
-      <disable_plugin name='imu_controller' filename='libgazebo_ros_imu.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>100.0</updateRate>
-        <bodyName>imu_link</bodyName>
-        <topicName>torso_lift_imu/data</topicName>
-        <gaussianNoise>2.89e-08</gaussianNoise>
-        <xyzOffsets>0 0 0</xyzOffsets>
-        <rpyOffsets>0 0 0</rpyOffsets>
-      </disable_plugin>
-      <disable_plugin name='p3d_r_gripper_l_finger_controller' filename='libgazebo_ros_p3d.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>100.0</updateRate>
-        <bodyName>r_gripper_l_finger_link</bodyName>
-        <topicName>r_gripper_l_finger_pose_ground_truth</topicName>
-        <gaussianNoise>0.0</gaussianNoise>
-        <frameName>base_link</frameName>
-      </disable_plugin>
-      <disable_plugin name='f3d_r_gripper_l_finger_controller' filename='libgazebo_ros_f3d.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>100.0</updateRate>
-        <bodyName>r_gripper_l_finger_link</bodyName>
-        <topicName>r_gripper_l_finger_force_ground_truth</topicName>
-        <frameName>r_gripper_l_finger_link</frameName>
-      </disable_plugin>
-      <disable_plugin name='p3d_r_gripper_palm_controller' filename='libgazebo_ros_p3d.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>100.0</updateRate>
-        <bodyName>r_gripper_palm_link</bodyName>
-        <topicName>r_gripper_palm_pose_ground_truth</topicName>
-        <xyzOffsets>0 0 0</xyzOffsets>
-        <rpyOffsets>0 0 0</rpyOffsets>
-        <gaussianNoise>0.0</gaussianNoise>
-        <frameName>map</frameName>
-      </disable_plugin>
-      <disable_plugin name='p3d_l_gripper_l_finger_controller' filename='libgazebo_ros_p3d.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>100.0</updateRate>
-        <bodyName>l_gripper_l_finger_link</bodyName>
-        <topicName>l_gripper_l_finger_pose_ground_truth</topicName>
-        <gaussianNoise>0.0</gaussianNoise>
-        <frameName>base_link</frameName>
-      </disable_plugin>
-      <disable_plugin name='f3d_l_gripper_l_finger_controller' filename='libgazebo_ros_f3d.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>100.0</updateRate>
-        <bodyName>l_gripper_l_finger_link</bodyName>
-        <topicName>l_gripper_l_finger_force_ground_truth</topicName>
-        <frameName>l_gripper_l_finger_link</frameName>
-      </disable_plugin>
-      <disable_plugin name='p3d_l_gripper_palm_controller' filename='libgazebo_ros_p3d.so'>
-        <alwaysOn>1</alwaysOn>
-        <updateRate>100.0</updateRate>
-        <bodyName>l_gripper_palm_link</bodyName>
-        <topicName>l_gripper_palm_pose_ground_truth</topicName>
-        <xyzOffsets>0 0 0</xyzOffsets>
-        <rpyOffsets>0 0 0</rpyOffsets>
-        <gaussianNoise>0.0</gaussianNoise>
-        <frameName>map</frameName>
-      </disable_plugin>
-    </model>
-  </world>
-</gazebo>
diff --git a/test/sdf_plugins/camera.world b/test/sdf_plugins/camera.world
deleted file mode 100644
index dcbe6ea..0000000
--- a/test/sdf_plugins/camera.world
+++ /dev/null
@@ -1,106 +0,0 @@
-<gazebo version="1.0">
-  <world name="world_1">
-    <scene>
-      <ambient rgba="0.5 0.5 0.5 1.0"/>
-      <background rgba="0.5 0.5 0.5 1.0">
-        <sky material="Gazebo/CloudySky"/>
-      </background>
-      <shadows enabled="true" rgba="0.0 0.0 0.5 0.5" type="texture_gpu"/>
-      <fog rgba="0.0 0.0 0.5 0.5" type="linear" start="2.0" end="10.0" density="0.5"/>
-    </scene>
-
-    <physics type="ode">
-      <gravity xyz="0.0 0.0 -9.81"/>
-      <ode>
-        <solver type="quick" dt="0.001" iters="20" sor="1.3"/>
-        <constraints cfm="0" erp="0.2" contact_max_correcting_vel="100.0" contact_surface_layer="0.0"/>
-      </ode>
-      <max_contacts>250</max_contacts>
-    </physics>
-
-    <model name="model_1" static="false">
-
-      <origin pose="0.0 0.0 1.0 0.0 0.0 0.0"/>
-
-      <link name="link_1" self_collide="true" gravity="false" kinematic="false">
-        <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-        <inertial mass="10.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <damping linear="0.0" angular="0.0" />
-          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
-                   iyy="1.0" iyz="0.0"
-                   izz="1.0"/>
-        </inertial>
-
-        <visual cast_shadows="true" name="visual_sphere" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <sphere radius="0.5"/>
-          </geometry>
-          <material script="Gazebo/Green" normal_map="normal_map.png">
-            <color rgba="0.03 0.5 0.5 1.0"/>
-          </material>
-        </visual>
-
-        <collision name="collision_sphere" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <sphere radius="0.5"/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu="0.5" mu2="0.2" fdir1="1.0 0 0" slip1="0" slip2="0"/>
-            </friction>
-            <bounce restitution_coefficient="0" threshold="1000000.0"/>
-            <contact>
-              <ode soft_cfm="0" soft_erp="0.2" kp="1e15" kd="1e13" max_vel="100.0" min_depth="0.0001"/>
-            </contact>
-          </surface>
-        </collision>
-
-        <sensor name="sensor_camera" type="camera" always_on="true" update_rate="2.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <camera>
-            <horizontal_fov angle="1.57"/>
-            <image width="2560" height="1600" format="BAYER_BGGR8"/>
-            <clip near="0.01" far="100.0"/>
-            <save enabled="false" path="/tmp"/>
-          </camera>
-        </sensor>
-
-      </link>
-
-    </model>
-
-    <light type="point" name="light_1" cast_shadows="true">
-      <origin pose="0.0 0.0 10.0 0.0 0.0 0.0"/>
-      <diffuse rgba="0.5 0.5 0.5 0.5"/>
-      <attenuation range="1000.0" constant="0.01" quadratic="0.0001"/>
-      <direction xyz="0 0 -1"/>
-      <spot inner_angle="1.57" outer_angle="1.57" falloff="1.0" />
-    </light>
-
-    <plugin name="plugin_1" filename="libgazebo_ros_camera.so">
-      <data name="sensor" value="model_1::sensor_camera" />
-      <data name="alwaysOn" value="true" />
-      <data name="updateRate" value="25.0" />
-      <data name="imageTopicName" value="narrow_stereo/left/image_raw" />
-      <data name="cameraInfoTopicName" value="narrow_stereo/left/camera_info" />
-      <data name="frameName" value="narrow_stereo_optical_frame" />
-      <data name="hackBaseline" value="0" />
-      <data name="CxPrime" value="320.5" />
-      <data name="Cx" value="320.5" />
-      <data name="Cy" value="240.5" />
-      <!-- image_width / (2*tan(hfov_radian /2)) -->
-      <!-- 320 for wide and 772.55 for narrow stereo camera -->
-      <data name="focal_length" value="772.55" />
-      <data name="distortion_k1" value="0.0" />
-      <data name="distortion_k2" value="0.0" />
-      <data name="distortion_k3" value="0.0" />
-      <data name="distortion_t1" value="0.0" />
-      <data name="distortion_t2" value="0.0" />
-    </plugin>
-
-  </world>
-</gazebo>
diff --git a/test/sdf_plugins/contact.world b/test/sdf_plugins/contact.world
deleted file mode 100644
index 3e3fd13..0000000
--- a/test/sdf_plugins/contact.world
+++ /dev/null
@@ -1,79 +0,0 @@
-<gazebo version="1.0">
-  <world name="world_1">
-    <scene>
-      <ambient rgba="0.5 0.5 0.5 1.0"/>
-      <background rgba="0.5 0.5 0.5 1.0">
-        <sky material="Gazebo/CloudySky"/>
-      </background>
-      <shadows enabled="true" rgba="0.0 0.0 0.5 0.5" type="texture_gpu"/>
-      <fog rgba="0.0 0.0 0.5 0.5" type="linear" start="2.0" end="10.0" density="0.5"/>
-    </scene>
-
-    <physics type="ode">
-      <gravity xyz="0.0 0.0 -9.81"/>
-      <ode>
-        <max_contacts>250</max_contacts>
-        <solver type="quick" dt="0.001" iters="20" sor="1.3"/>
-        <constraints cfm="0" erp="0.2" contact_max_correcting_vel="100.0" contact_surface_layer="0.0"/>
-      </ode>
-    </physics>
-
-    <model name="model_1" static="false">
-
-      <origin pose="0.0 0.0 1.0 0.0 0.0 0.0"/>
-
-      <link name="link_1" self_collide="true" gravity="false" kinematic="false">
-        <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-        <inertial mass="10.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <damping linear="0.0" angular="0.0" />
-          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
-                   iyy="1.0" iyz="0.0"
-                   izz="1.0"/>
-        </inertial>
-
-        <visual cast_shadows="true" name="visual_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <box size="1.0 1.0 2.0"/>
-          </geometry>
-          <material script="Gazebo/Green" normal_map="normal_map.png">
-            <color rgba="0.03 0.5 0.5 1.0"/>
-          </material>
-        </visual>
-
-        <collision name="collision_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <box size="1.0 1.0 2.0"/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu="0.5" mu2="0.2" fdir1="1.0 0 0" slip1="0" slip2="0"/>
-            </friction>
-            <bounce restitution_coefficient="0" threshold="1000000.0"/>
-            <contact>
-              <ode soft_cfm="0" soft_erp="0.2" kp="1e15" kd="1e13" max_vel="100.0" min_depth="0.0001"/>
-            </contact>
-          </surface>
-        </collision>
-
-        <sensor name="sensor_contact" always_on="true" update_rate="2.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <collision name="collision_box"/>
-        </sensor>
-
-      </link>
-    </model>
-
-    <plugin name="plugin_1" filename="libgazebo_ros_bumper.so">
-      <data name="sensor" value="model_1::sensor_contact" />
-      <data name="alwaysOn" value="true" />
-      <data name="updateRate" value="100.0" />
-      <data name="frameName" value="r_gripper_palm_link" />
-      <data name="bumperTopicName" value="r_gripper_palm_bumper" />
-    </plugin>
-
-  </world>
-</gazebo>
diff --git a/test/sdf_plugins/lighting_control.world b/test/sdf_plugins/lighting_control.world
deleted file mode 100644
index f84b2eb..0000000
--- a/test/sdf_plugins/lighting_control.world
+++ /dev/null
@@ -1,184 +0,0 @@
-<?xml version="1.0"?>
-<gazebo version="1.0">
-  <world name="world_1">
-    <scene>
-      <ambient rgba="0.5 0.5 0.5 1.0"/>
-      <background rgba="0.5 0.5 0.5 1.0">
-        <sky material="Gazebo/CloudySky"/>
-      </background>
-      <shadows enabled="true"/>
-      <fog rgba="0.0 0.0 0.5 0.5" type="linear" start="2.0" end="10.0" density="0.5"/>
-    </scene>
-
-    <physics type="ode">
-      <gravity xyz="0.0 0.0 0.0"/>
-      <ode>
-        <max_contacts>250</max_contacts>
-        <solver type="quick" dt="0.01" iters="10" sor="1.3"/>
-        <constraints cfm="0" erp="0.2" contact_max_correcting_vel="100.0" contact_surface_layer="0.0"/>
-      </ode>
-    </physics>
-
-
-    <model name="model_1" static="false">
-
-      <origin pose="0.0 0.0 1.0 0.0 0.0 0.0"/>
-
-      <link name="link_1" self_collide="true" gravity="false" kinematic="false">
-        <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-        <inertial mass="10.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <damping linear="0.0" angular="0.0" />
-          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
-                   iyy="1.0" iyz="0.0"
-                   izz="1.0"/>
-        </inertial>
-
-        <visual cast_shadows="true" name="visual_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <box size="1.0 1.0 2.0"/>
-          </geometry>
-          <material script="Gazebo/Green" normal_map="normal_map.png">
-            <color rgba="0.03 0.5 0.5 1.0"/>
-          </material>
-        </visual>
-
-        <collision name="collision_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <box size="1.0 1.0 2.0"/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu="0.5" mu2="0.2" fdir1="1.0 0 0" slip1="0" slip2="0"/>
-            </friction>
-            <bounce restitution_coefficient="0" threshold="1000000.0"/>
-            <contact>
-              <ode soft_cfm="0" kp="1e15" kd="1e13" max_vel="100.0" min_depth="0.0001"/>
-            </contact>
-          </surface>
-          
-        </collision>
-      </link>
-
-    </model>
-
-    <model name="model_2" static="false">
-
-      <origin pose="0.0 -2.0 1.0 0.0 0.0 0.0"/>
-
-      <link name="link_1" self_collide="true" gravity="false" kinematic="false">
-        <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-        <inertial mass="10.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <damping linear="0.0" angular="0.0" />
-          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
-                   iyy="1.0" iyz="0.0"
-                   izz="1.0"/>
-        </inertial>
-
-        <visual cast_shadows="true" name="visual_cylinder" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <cylinder radius="1.0" length="2.0"/>
-          </geometry>
-          <material script="Gazebo/Green" normal_map="normal_map.png">
-            <color rgba="0.03 0.5 0.5 1.0"/>
-          </material>
-        </visual>
-
-        <collision name="collision_cylinder" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <cylinder radius="1.0" length="2.0"/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu="0.5" mu2="0.2" fdir1="1.0 0 0" slip1="0" slip2="0"/>
-            </friction>
-            <bounce restitution_coefficient="0" threshold="1000000.0"/>
-            <contact>
-              <ode soft_cfm="0" soft_erp="0.2" kp="1e15" kd="1e13" max_vel="100.0" min_depth="0.0001"/>
-            </contact>
-          </surface>
-        </collision>
-      </link>
-    </model>
-
-    <model name="model_3" static="false">
-
-      <origin pose="0.0 2.0 1.0 0.0 0.0 0.0"/>
-
-      <link name="link_1" self_collide="true" gravity="false" kinematic="false">
-        <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-        <inertial mass="10.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <damping linear="0.0" angular="0.0" />
-          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
-                   iyy="1.0" iyz="0.0"
-                   izz="1.0"/>
-        </inertial>
-
-        <visual cast_shadows="true" name="visual_sphere" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <sphere radius="0.5"/>
-          </geometry>
-          <material script="Gazebo/Green" normal_map="normal_map.png">
-            <color rgba="0.03 0.5 0.5 1.0"/>
-          </material>
-        </visual>
-
-        <collision name="collision_sphere" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <sphere radius="0.5"/>
-          </geometry>
-          <material script="Gazebo/Green" normal_map="normal_map.png">
-            <color rgba="0.03 0.5 0.5 1.0"/>
-          </material>
-          <surface>
-            <friction>
-              <ode mu="0.5" mu2="0.2" fdir1="1.0 0 0" slip1="0" slip2="0"/>
-            </friction>
-            <bounce restitution_coefficient="0" threshold="1000000.0"/>
-            <contact>
-              <ode soft_cfm="0" soft_erp="0.2" kp="1e15" kd="1e13" max_vel="100.0" min_depth="0.0001"/>
-            </contact>
-          </surface>
-        </collision>
-
-      </link>
-
-    </model>
-
-    <light type="point" name="light_1" cast_shadows="true">
-      <origin pose="0.0 0.0 10.0 0.0 0.0 0.0"/>
-      <diffuse rgba="0.5 0.5 0.5 0.5"/>
-      <attenuation range="1000.0" constant="0.01" quadratic="0.0001"/>
-      <direction xyz="0 0 -1"/>
-      <spot inner_angle="1.57" outer_angle="1.57" falloff="1.0" />
-    </light>
-
-    <light type="spot" name="light_2" cast_shadows="true">
-      <origin pose="10.0 0.0 10.0 0.0 0.0 0.0"/>
-      <diffuse rgba="0.5 0.5 0.5 0.5"/>
-      <attenuation range="1000.0" constant="0.01" quadratic="0.0001"/>
-      <direction xyz="0 0 -1"/>
-      <spot inner_angle="1.57" outer_angle="1.57" falloff="1.0" />
-    </light>
-
-    <light type="directional" name="light_3" cast_shadows="true">
-      <origin pose="-10.0 0.0 10.0 0.0 0.0 0.0"/>
-      <diffuse rgba="0.5 0.5 0.5 0.5"/>
-      <attenuation range="1000.0" constant="0.01" quadratic="0.0001"/>
-      <direction xyz="0 0 -1"/>
-      <spot inner_angle="1.57" outer_angle="1.57" falloff="1.0" />
-    </light>
-
-  </world>
-</gazebo>
diff --git a/test/sdf_plugins/ray.world b/test/sdf_plugins/ray.world
deleted file mode 100644
index 0a62796..0000000
--- a/test/sdf_plugins/ray.world
+++ /dev/null
@@ -1,206 +0,0 @@
-<gazebo version="1.0">
-  <world name="world_1">
-    <scene>
-      <ambient rgba="0.5 0.5 0.5 1.0"/>
-      <background rgba="0.5 0.5 0.5 1.0">
-        <sky material="Gazebo/CloudySky"/>
-      </background>
-      <shadows enabled="true" rgba="0.0 0.0 0.5 0.5" type="texture_gpu"/>
-      <fog rgba="0.0 0.0 0.5 0.5" type="linear" start="2.0" end="10.0" density="0.5"/>
-    </scene>
-
-    <physics type="ode">
-      <max_contacts>250</max_contacts>
-      <ode>
-        <solver type="quick" dt="0.001" iters="20" sor="1.3"/>
-        <constraints cfm="0" erp="0.2" contact_max_correcting_vel="100.0" contact_surface_layer="0.0"/>
-      </ode>
-      <gravity xyz="0.0000 0 0"/>
-    </physics>
-
-    <model name="model_1" static="false">
-
-      <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-
-      <link name="link_1" self_collide="true" gravity="false" kinematic="false">
-
-        <origin pose="-1.0 0.0 0.0 0.0 0.0 0.0"/>
-
-        <inertial mass="10.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <damping linear="0.0" angular="0.0" />
-          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
-                   iyy="1.0" iyz="0.0"
-                   izz="1.0"/>
-        </inertial>
-
-        <visual cast_shadows="true" name="visual_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <box size="0.05 0.05 0.05"/>
-          </geometry>
-          <material script="Gazebo/Red" normal_map="normal_map.png">
-            <ambient rgba="0.03 0.5 0.5 1.0"/>
-          </material>
-        </visual>
-
-        <collision name="collision_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <box size="0.05 0.05 0.05"/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu="0.5" mu2="0.2" fdir1="1.0 0 0" slip1="0" slip2="0"/>
-            </friction>
-            <bounce restitution_coefficient="0" threshold="1000000.0"/>
-            <contact>
-              <ode soft_cfm="0" soft_erp="0.2" kp="1e15" kd="1e13" max_vel="100.0" min_depth="0.0001"/>
-            </contact>
-          </surface>
-        </collision>
-
-        <sensor name="sensor_ray" type="ray" always_on="true" update_rate="2.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <ray>
-            <scan display="true">
-              <horizontal samples="11" resolution="1.0" min_angle="-0.5236" max_angle="0.5236" />
-              <vertical samples="3" resolution="1.0" min_angle="-0.5236" max_angle="0.5236" />
-            </scan>
-            <range min="0.05" max="30.0"/>
-          </ray>
-        </sensor>
-
-      </link>
-
-      <plugin name="plugin_1" filename="libray_test.so"/>
-
-    </model>
-
-    <model name="model_2" static="false">
-
-      <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-
-      <link name="link_1" self_collide="true" gravity="false" kinematic="false">
-
-        <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-
-        <inertial mass="10.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <damping linear="0.0" angular="0.0" />
-          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
-                   iyy="1.0" iyz="0.0"
-                   izz="1.0"/>
-        </inertial>
-
-        <visual cast_shadows="true" name="visual_mesh_stl" laser_retro="100.0">
-          <origin pose="0.0 0.1 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <mesh filename="pr2/gripper_v0/l_finger_tip.stl" scale="1 1 1"/>
-          </geometry>
-          <material script="Gazebo/Red" normal_map="normal_map.png">
-            <ambient rgba="0.03 0.5 0.5 1.0"/>
-          </material>
-        </visual>
-
-        <collision name="collision_mesh_stl" laser_retro="100.0">
-          <origin pose="0.0 0.1 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <mesh filename="pr2/gripper_v0/l_finger_tip.stl" scale="1 1 1"/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu="0.5" mu2="0.2" fdir1="1.0 0 0" slip1="0" slip2="0"/>
-            </friction>
-            <bounce restitution_coefficient="0" threshold="1000000.0"/>
-            <contact>
-              <ode soft_cfm="0" soft_erp="0.2" kp="1e15" kd="1e13" max_vel="100.0" min_depth="0.0001"/>
-            </contact>
-          </surface>
-        </collision>
-
-        <visual cast_shadows="true" name="visual_mesh_dae" laser_retro="100.0">
-          <origin pose="0.0 -0.1 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <mesh filename="pr2/gripper_v0/l_finger_tip.dae" scale="1 1 1"/>
-          </geometry>
-        </visual>
-
-        <collision name="collision_mesh_dae" laser_retro="100.0">
-          <origin pose="0.0 -0.1 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <mesh filename="pr2/gripper_v0/l_finger_tip.dae" scale="1 1 1"/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu="0.5" mu2="0.2" fdir1="1.0 0 0" slip1="0" slip2="0"/>
-            </friction>
-            <bounce restitution_coefficient="0" threshold="1000000.0"/>
-            <contact>
-              <ode soft_cfm="0" soft_erp="0.2" kp="1e15" kd="1e13" max_vel="100.0" min_depth="0.0001"/>
-            </contact>
-          </surface>
-        </collision>
-
-      </link>
-
-    </model>
-
-    <model name="model_3" static="false">
-
-      <origin pose="0.2 0.0 0.0 0.0 0.0 0.0"/>
-
-      <link name="link_1" self_collide="true" gravity="true" kinematic="false">
-        <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-        <inertial mass="10.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <damping linear="0.0" angular="0.0" />
-          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
-                   iyy="1.0" iyz="0.0"
-                   izz="1.0"/>
-        </inertial>
-
-        <visual cast_shadows="true" name="visual_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <geometry>
-            <box size="0.1 30.0 30.0"/>
-          </geometry>
-          <material script="Gazebo/Green" normal_map="normal_map.png">
-            <ambient rgba="0.03 0.5 0.5 1.0"/>
-          </material>
-        </visual>
-
-        <collision name="collision_box" laser_retro="100.0">
-          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
-          <max_contacts>250</max_contacts>
-          <geometry>
-            <box size="0.1 30.0 30.0"/>
-          </geometry>
-          <surface>
-            <friction>
-              <ode mu="0.5" mu2="0.2" fdir1="1.0 0 0" slip1="0" slip2="0"/>
-            </friction>
-            <bounce restitution_coefficient="0" threshold="1000000.0"/>
-            <contact>
-              <ode soft_cfm="0" soft_erp="0.2" kp="1e15" kd="1e13" max_vel="100.0" min_depth="0.0001"/>
-            </contact>
-          </surface>
-        </collision>
-
-      </link>
-
-    </model>
-
-    <light type="point" name="light_1" cast_shadows="true">
-      <origin pose="0.0 0.0 10.0 0.0 0.0 0.0"/>
-      <diffuse rgba="0.5 0.5 0.5 0.5"/>
-      <attenuation range="1000.0" constant="0.01" quadratic="0.0001"/>
-      <direction xyz="0 0 -1"/>
-      <spot inner_angle="1.57" outer_angle="1.57" falloff="1.0" />
-    </light>
-
-  </world>
-</gazebo>
diff --git a/test/test_config.h.in b/test/test_config.h.in
index 288639f..bed236c 100644
--- a/test/test_config.h.in
+++ b/test/test_config.h.in
@@ -1,4 +1,6 @@
+#define TEST_INTEGRATION_PATH "${PROJECT_SOURCE_DIR}/test/integration"
 #define TEST_REGRESSION_PATH "${PROJECT_SOURCE_DIR}/test/regression"
 #define TEST_UNIT_PATH "${PROJECT_SOURCE_DIR}/test/unit"
 #define TEST_PATH "${PROJECT_SOURCE_DIR}/test"
 #define PROJECT_SOURCE_PATH "${PROJECT_SOURCE_DIR}"
+#define PROJECT_BINARY_PATH "${PROJECT_BINARY_DIR}"
diff --git a/test/testfiles/hello_world.cc b/test/testfiles/hello_world.cc
new file mode 100644
index 0000000..69aacc4
--- /dev/null
+++ b/test/testfiles/hello_world.cc
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <gazebo/gazebo.hh>
+#include <gazebo/math/Vector3.hh>
+#include <gazebo/common/Color.hh>
+
+namespace gazebo
+{
+  class WorldPluginTutorial : public WorldPlugin
+  {
+    public: WorldPluginTutorial() : WorldPlugin()
+            {
+              common::Color c(0, 0, 0);
+              math::Vector3 v;
+              printf("Hello World!\n");
+            }
+
+    public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
+            {
+            }
+  };
+  GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial)
+}
diff --git a/test/util.hh b/test/util.hh
new file mode 100644
index 0000000..1f00349
--- /dev/null
+++ b/test/util.hh
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_TEST_UTIL_HH_
+#define _GAZEBO_TEST_UTIL_HH_
+
+#include <gtest/gtest.h>
+#include <string>
+
+#include <boost/filesystem.hpp>
+#include "gazebo/common/Console.hh"
+
+using namespace gazebo;
+
+namespace gazebo
+{
+  namespace testing
+  {
+    /// \brief A utility class that stores test logs in ~/.gazebo/test_logs.
+    /// This functionality is needed to keep all the log information reported
+    /// by gazebo during continuous integration. Without this, debugging
+    /// failing tests is significantly more difficult.
+    class AutoLogFixture : public ::testing::Test
+    {
+      /// \brief Setup the test fixture. This gets called by gtest.
+      protected: virtual void SetUp()
+      {
+        ASSERT_TRUE(getenv("HOME") != NULL);
+
+        // We need to create the log directory if needed.
+        boost::filesystem::path logPath(getenv("HOME"));
+        logPath = logPath / ".gazebo" / "test_logs";
+        if (!boost::filesystem::exists(logPath))
+          boost::filesystem::create_directories(logPath);
+
+        const ::testing::TestInfo *const testInfo =
+          ::testing::UnitTest::GetInstance()->current_test_info();
+
+        std::string testName = testInfo->name();
+        std::string testCaseName = testInfo->test_case_name();
+        this->logFilename = testCaseName + "_" + testName + ".log";
+        this->logDirectory = logPath.string();
+
+        // Initialize Console
+        gzLogInit((boost::filesystem::path("test_logs") /
+             this->logFilename).string());
+        gazebo::common::Console::SetQuiet(false);
+      }
+
+      /// \brief Get a string with the full log file path.
+      /// \return The full log file path as a string.
+      protected: std::string GetFullLogPath() const
+      {
+        return this->logDirectory + "/" + this->logFilename;
+      }
+
+      /// \brief Get a string with all the log content loaded from the disk.
+      /// \return A string will all the log content.
+      protected: std::string GetLogContent() const
+      {
+        // Open the log file, and read back the string
+        std::ifstream ifs(this->GetFullLogPath().c_str(), std::ios::in);
+        std::string loggedString;
+
+        while (!ifs.eof())
+        {
+          std::string line;
+          std::getline(ifs, line);
+          loggedString += line;
+        }
+
+        return loggedString;
+      }
+
+      /// \brief String with the full path of the logfile
+      private: std::string logFilename;
+
+      /// \brief String with the full path to log directory
+      private: std::string logDirectory;
+    };
+  }
+}
+#endif
diff --git a/test/worlds/SDF_1_4.world b/test/worlds/SDF_1_4.world
new file mode 100644
index 0000000..c8c719e
--- /dev/null
+++ b/test/worlds/SDF_1_4.world
@@ -0,0 +1,56 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="joint14_model">
+      <pose>0 0 0.5 0 0 0</pose>
+      <link name="body1">
+      <pose>0 0 0.5 0 0 0</pose>
+        <collision name="geom">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+      </link>
+      <link name="body2">
+      <pose>0 0.5 2 0 0 0</pose>
+        <collision name="geom">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+      </link>
+      <joint type="revolute" name="joint14_revolute_joint">
+        <pose>0 0 1 0 0 0</pose>
+        <parent>body2</parent>
+        <child>body1</child>
+        <axis>
+          <xyz>0 0 1</xyz>
+        </axis>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/ball_joint_test.world b/test/worlds/ball_joint_test.world
new file mode 100644
index 0000000..efa21f2
--- /dev/null
+++ b/test/worlds/ball_joint_test.world
@@ -0,0 +1,191 @@
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0 0 0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>1000</iters>
+          <precon_iters>0</precon_iters>
+          <sor>1.000000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <contact_max_correcting_vel>100.000000</contact_max_correcting_vel>
+          <contact_surface_layer>0.01000</contact_surface_layer>
+        </constraints>
+      </ode>
+      <bullet>
+        <solver>
+          <type>sequential_impulse</type>
+          <iters>1000</iters>
+          <sor>1.000000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <split_impulse>true</split_impulse>
+          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
+          <contact_surface_layer>0.00000</contact_surface_layer>
+        </constraints>
+      </bullet>
+      <real_time_update_rate>0.000000</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="model_1">
+      <link name="link_00">
+        <gravity>true</gravity>
+        <pose>0 0 2 0 0 0</pose>
+        <inertial>
+          <mass>0.1</mass>
+          <pose>0 0 -0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+        </inertial>
+        <collision name="col">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="vis">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+        <visual name="vis2">
+          <pose>0 0.125 -0.5 0 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.05</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+      </link>
+      <link name="link_01">
+        <gravity>true</gravity>
+        <pose>0 0 1.0 0 0 0</pose>
+        <inertial>
+          <mass>0.1</mass>
+          <pose>0 0 -0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+        </inertial>
+        <collision name="col">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.005</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1.0</mu>
+                <mu2>1.0</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Red</name></script>
+          </material>
+        </visual>
+        <visual name="vis2">
+          <pose>0 0.125 -0.5 0 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.05</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+      </link>
+      <joint name="joint_00" type="ball">
+        <parent>world</parent>
+        <child>link_00</child>
+        <thread_pitch>-0.1</thread_pitch>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.7</lower>
+            <upper>1.7</upper>
+            <stiffness>1e6</stiffness>
+            <dissipation>1.0</dissipation>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="joint_01" type="ball">
+        <child>link_01</child>
+        <parent>link_00</parent>
+        <thread_pitch>0.1</thread_pitch>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.7</lower>
+            <upper>1.7</upper>
+            <stiffness>1e6</stiffness>
+            <dissipation>1.0</dissipation>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/sdf_plugins/box_no_gravity.world b/test/worlds/box_no_gravity.world
similarity index 100%
rename from test/sdf_plugins/box_no_gravity.world
rename to test/worlds/box_no_gravity.world
diff --git a/test/sdf_plugins/box_plane_gravity.world b/test/worlds/box_plane_gravity.world
similarity index 100%
rename from test/sdf_plugins/box_plane_gravity.world
rename to test/worlds/box_plane_gravity.world
diff --git a/test/worlds/box_plane_low_friction_test.world b/test/worlds/box_plane_low_friction_test.world
new file mode 100644
index 0000000..7814bc7
--- /dev/null
+++ b/test/worlds/box_plane_low_friction_test.world
@@ -0,0 +1,75 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <model name="box">
+      <pose>0.0 0.0 0.5 0.0 0.0 0.0</pose>
+      <link name="link">
+        <inertial>
+          <mass>0.05</mass>
+        </inertial>
+
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+        </visual>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>.1</mu>
+                <mu2>.1</mu2>
+              </ode>
+            </friction>
+          </surface>
+
+        </collision>
+      </link>
+    </model>
+
+    <model name="ground_plane">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>100 100</size>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0</mu>
+                <mu2>0</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <cast_shadows>false</cast_shadows>
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>100 100</size>
+            </plane>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Grey</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+
+  </world>
+</sdf>
diff --git a/test/sdf/box.world b/test/worlds/box_test.world
similarity index 100%
rename from test/sdf/box.world
rename to test/worlds/box_test.world
diff --git a/test/sdf/camera.world b/test/worlds/camera.world
similarity index 100%
rename from test/sdf/camera.world
rename to test/worlds/camera.world
diff --git a/test/worlds/camera_rotation_test.world b/test/worlds/camera_rotation_test.world
new file mode 100644
index 0000000..5b607ca
--- /dev/null
+++ b/test/worlds/camera_rotation_test.world
@@ -0,0 +1,261 @@
+<?xml version="1.0" ?>
+<sdf version="1.3">
+  <world name="default">
+    <scene>
+      <background>0 0 0 0</background>
+      <ambient>1 1 1 1</ambient>
+    </scene>
+
+    <!-- unrotated objects for ground truth -->
+    <model name="cam_x_rot_test_unrotated_objects_1">
+      <pose>1 10 1 0 0 0</pose>
+      <static>1</static>
+      <link name="cam_x_rot_test_1_link_1">
+        <pose>0 0 0 0 0 0</pose>
+        <visual name="cam_x_rot_test_1_vis">
+          <geometry>
+            <box>
+              <size>0.3 0.2 0.4</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <name>Gazebo/Red</name>
+              <uri>__default__</uri>
+            </script>
+          </material>
+        </visual>
+      </link>
+      <link name="cam_x_rot_test_1_link_2">
+        <pose>0 1 0 0 0 0</pose>
+        <visual name="cam_x_rot_test_1_vis">
+          <geometry>
+            <box>
+              <size>0.3 0.2 0.4</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <name>Gazebo/Green</name>
+              <uri>__default__</uri>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <!-- unrotated cameras for red block ground truth -->
+    <model name="cam_x_rot_test_unrotated_cameras_1">
+      <static>1</static>
+      <pose>0 10 1 0 0 0</pose>
+      <link name="cam_x_rot_test_2_link">
+        <visual name="cam_x_rot_test_1_vis">
+          <pose>0 0 0 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.01 0.2 0.4</size>
+            </box>
+          </geometry>
+        </visual>
+        <sensor name="multicamera_sensor_unrotated" type="multicamera">
+          <always_on>1</always_on>
+          <update_rate>15</update_rate>
+          <pose>0 0 0 0 0 0</pose>
+          <camera name="left">
+            <!-- should be in front of green block -->
+            <pose>0 1.0 0 0 0 0</pose>
+            <horizontal_fov>1.3962634</horizontal_fov>
+            <image>
+              <width>1024</width>
+              <height>544</height>
+              <format>R8G8B8</format>
+            </image>
+            <clip>
+              <near>0.02</near>
+              <far>100</far>
+            </clip>
+          </camera>
+          <camera name="right">
+            <!-- should be in front of red block -->
+            <pose>0 0 0 0 0 0</pose>
+            <horizontal_fov>1.3962634</horizontal_fov>
+            <image>
+              <width>1024</width>
+              <height>544</height>
+              <format>R8G8B8</format>
+            </image>
+            <clip>
+              <near>0.02</near>
+              <far>100</far>
+            </clip>
+          </camera>
+        </sensor>
+      </link>
+    </model>
+    <!-- Unrotated but translated cameras for ground truth.
+         Both cameras should see the green block.
+         Use this camera for green block ground truth in testing.
+    -->
+    <model name="cam_x_rot_test_translated_camera_1">
+      <static>1</static>
+      <pose>0 11 1 0 0 0</pose>
+      <link name="cam_x_rot_test_2_link">
+        <visual name="cam_x_rot_test_1_vis">
+          <pose>0 0 0 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.01 0.2 0.4</size>
+            </box>
+          </geometry>
+        </visual>
+        <sensor name="multicamera_sensor_translated" type="camera">
+          <update_rate>15</update_rate>
+          <pose>0 0 0 0 0 0</pose>
+          <camera name="single_camera">
+            <pose>0 0 0 0 0 0</pose>
+            <horizontal_fov>1.3962634</horizontal_fov>
+            <image>
+              <width>1024</width>
+              <height>544</height>
+              <format>R8G8B8</format>
+            </image>
+            <clip>
+              <near>0.02</near>
+              <far>100</far>
+            </clip>
+          </camera>
+        </sensor>
+      </link>
+    </model>
+
+    <!-- set of rotated objects for testing camera sensor -->
+    <model name="cam_x_rot_test_rotated_objects_1">
+      <pose>0 0 1 1.2 1.3 1.4</pose>
+      <static>1</static>
+      <link name="cam_x_rot_test_1_link_1">
+        <pose>1 0 0 0 0 0</pose>
+        <visual name="cam_x_rot_test_1_vis">
+          <geometry>
+            <box>
+              <size>0.3 0.2 0.4</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <name>Gazebo/Red</name>
+              <uri>__default__</uri>
+            </script>
+          </material>
+        </visual>
+      </link>
+      <link name="cam_x_rot_test_1_link_2">
+        <pose>1 1 0 0 0 0</pose>
+        <visual name="cam_x_rot_test_1_vis">
+          <geometry>
+            <box>
+              <size>0.3 0.2 0.4</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <name>Gazebo/Green</name>
+              <uri>__default__</uri>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <!-- test rotation inside sensor tags -->
+    <model name="cam_x_rot_test_rotated_cameras_1">
+      <static>1</static>
+      <pose>0 0 1 1.2 1.3 1.4</pose>
+      <link name="cam_x_rot_test_2_link">
+        <visual name="cam_x_rot_test_1_vis">
+          <pose>0 0 0 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.01 0.2 0.4</size>
+            </box>
+          </geometry>
+        </visual>
+        <sensor name="multicamera_sensor_rotated1" type="multicamera">
+          <update_rate>15</update_rate>
+          <pose>0 0 0 0 0 0</pose>
+          <camera name="left">
+            <pose>0 1.0 0 0 0 0</pose>
+            <horizontal_fov>1.3962634</horizontal_fov>
+            <image>
+              <width>1024</width>
+              <height>544</height>
+              <format>R8G8B8</format>
+            </image>
+            <clip>
+              <near>0.02</near>
+              <far>100</far>
+            </clip>
+          </camera>
+          <camera name="right">
+            <pose>0 0 0 0 0 0</pose>
+            <horizontal_fov>1.3962634</horizontal_fov>
+            <image>
+              <width>1024</width>
+              <height>544</height>
+              <format>R8G8B8</format>
+            </image>
+            <clip>
+              <near>0.02</near>
+              <far>100</far>
+            </clip>
+          </camera>
+        </sensor>
+      </link>
+    </model>
+    <!-- test rotation inside camera tags -->
+    <model name="cam_x_rot_test_rotated_cameras_2">
+      <static>1</static>
+      <pose>0 0 1 0 0 0</pose>
+      <link name="cam_x_rot_test_2_link">
+        <visual name="cam_x_rot_test_1_vis">
+          <pose>0 0 0 1.2 1.3 1.4</pose>
+          <geometry>
+            <box>
+              <size>0.01 0.2 0.4</size>
+            </box>
+          </geometry>
+        </visual>
+        <sensor name="multicamera_sensor_rotated2" type="multicamera">
+          <update_rate>15</update_rate>
+          <camera name="left">
+            <!-- offset left cameras to put it in front of the green block -->
+            <!-- the position offset is obtained by
+                 math::Quaternion a(1.2, 1.3, 1.4);
+                 a.RotateVector(math::Vector3(0, 1, 0)); -->
+            <pose>-0.204442 0.946596 0.249319 1.2 1.3 1.4</pose>
+            <horizontal_fov>1.3962634</horizontal_fov>
+            <image>
+              <width>1024</width>
+              <height>544</height>
+              <format>R8G8B8</format>
+            </image>
+            <clip>
+              <near>0.02</near>
+              <far>100</far>
+            </clip>
+          </camera>
+          <camera name="right">
+            <pose>0 0 0 1.2 1.3 1.4</pose>
+            <horizontal_fov>1.3962634</horizontal_fov>
+            <image>
+              <width>1024</width>
+              <height>544</height>
+              <format>R8G8B8</format>
+            </image>
+            <clip>
+              <near>0.02</near>
+              <far>100</far>
+            </clip>
+          </camera>
+        </sensor>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/cfm_damping_test.world b/test/worlds/cfm_damping_test.world
deleted file mode 100644
index 78364f5..0000000
--- a/test/worlds/cfm_damping_test.world
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version="1.0" ?>
-<sdf version="1.3">
-    <world name="default">
-        <physics type="ode">
-            <gravity>0 0 0</gravity>
-            <update_rate>1000</update_rate>
-            <ode>
-                <solver>
-                    <type>quick</type>
-                    <dt>0.001</dt>
-                    <iters>40</iters>
-                    <sor>1.0</sor>
-                </solver>
-                <constraints>
-                    <cfm>0.0</cfm>
-                    <erp>0.2</erp>
-                    <contact_max_correcting_vel>100.0</contact_max_correcting_vel>
-                    <contact_surface_layer>0.0</contact_surface_layer>
-                </constraints>
-            </ode>
-        </physics>
-        <!-- A global light source -->
-        <include>
-            <uri>model://sun</uri>
-        </include>
-        <model name="model_1">
-            <pose>0 0 0 0 0 0</pose>
-            <link name="link_1">
-                <pose>0 0 0 0 0 0</pose>
-                <inertial>
-                    <pose>0 0 0 0 0 0</pose>
-                    <inertia>
-                        <ixx>1.000000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>1.000000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>1.000000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_cylinder">
-                    <pose>0 0 -0.5 0 0 0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.100000</radius>
-                            <length>1.000000</length>
-                        </cylinder>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Green</script>
-                    </material>
-                </visual>
-                <collision name="collision_cylinder">
-                    <pose>0 0 -0.5 0 0 0</pose>
-                    <geometry>
-                        <cylinder>
-                            <radius>0.100000</radius>
-                            <length>1.000000</length>
-                        </cylinder>
-                    </geometry>
-                </collision>
-            </link>
-            <link name="link_2">
-                <pose>0 0 -1 0 0 0</pose>
-                <inertial>
-                    <pose>0 0 -0.5 0 0 0</pose>
-                    <inertia>
-                        <ixx>1.000000</ixx>
-                        <ixy>0.000000</ixy>
-                        <ixz>0.000000</ixz>
-                        <iyy>1.000000</iyy>
-                        <iyz>0.000000</iyz>
-                        <izz>1.000000</izz>
-                    </inertia>
-                    <mass>10.000000</mass>
-                </inertial>
-                <visual name="visual_box">
-                    <pose>0 0 -0.5 0 0 0</pose>
-                    <geometry>
-                        <box>
-                            <size>0.100000 0.100000 1.000000</size>
-                        </box>
-                    </geometry>
-                    <material>
-                        <script>Gazebo/Red</script>
-                    </material>
-                </visual>
-                <collision name="collision_box">
-                    <pose>0 0 -0.5 0 0 0</pose>
-                    <max_contacts>250</max_contacts>
-                    <geometry>
-                        <box>
-                            <size>0.100000 0.100000 1.000000</size>
-                        </box>
-                    </geometry>
-                </collision>
-                <gravity>1</gravity>
-                <self_collide>0</self_collide>
-                <kinematic>0</kinematic>
-            </link>
-            <joint name="joint_0" type="revolute">
-                <parent>world</parent>
-                <child>link_1</child>
-                <pose>0 0 0 0 0 0</pose>
-                <axis>
-                    <limit>
-                        <!-- effectively fixed -->
-                        <lower>0.000000</lower>
-                        <upper>0.000000</upper>
-                    </limit>
-                    <dynamics>
-                        <damping>1.000000</damping>
-                    </dynamics>
-                    <xyz>1.000000 0.000000 0.000000</xyz>
-                </axis>
-                <physics>
-                    <ode>
-                        <cfm_damping>1</cfm_damping>
-                    </ode>
-                </physics>
-            </joint>
-            <joint name="joint_1" type="universal">
-                <parent>link_1</parent>
-                <child>link_2</child>
-                <pose>0 0 0 0 0 0</pose>
-                <axis>
-                    <limit>
-                        <lower>-0.7</lower>
-                        <upper>0.7</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>1000.000000</damping>
-                    </dynamics>
-                    <xyz>1.000000 0.000000 0.000000</xyz>
-                </axis>
-                <axis2>
-                    <limit>
-                        <lower>-0.7</lower>
-                        <upper>0.7</upper>
-                        <effort>1000.000000</effort>
-                        <velocity>1000.000000</velocity>
-                    </limit>
-                    <dynamics>
-                        <damping>2000.000000</damping>
-                    </dynamics>
-                    <xyz>0.000000 1.000000 0.000000</xyz>
-                </axis2>
-                <physics>
-                    <ode>
-                        <cfm_damping>1</cfm_damping>
-                    </ode>
-                </physics>
-            </joint>
-            <static>0</static>
-        </model>
-    </world>
-</sdf>
diff --git a/test/worlds/cfm_test.world b/test/worlds/cfm_test.world
new file mode 100644
index 0000000..a826c30
--- /dev/null
+++ b/test/worlds/cfm_test.world
@@ -0,0 +1,164 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>1 0 0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>40</iters>
+          <sor>1.0</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>100.0</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>1000</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="model_1">
+      <pose>0 0 0 0 0 0</pose>
+      <link name="link_1">
+        <pose>0 0 0 0 0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 0 0</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+        </collision>
+      </link>
+      <link name="link_2">
+        <pose>0 0 -1 0 0 0</pose>
+        <inertial>
+          <pose>0 0 -0.5 0 0 0</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_box">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.100000 0.100000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Red</script>
+          </material>
+        </visual>
+        <collision name="collision_box">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <box>
+              <size>0.100000 0.100000 1.000000</size>
+            </box>
+          </geometry>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <limit>
+            <!-- effectively fixed -->
+            <lower>0.000000</lower>
+            <upper>0.000000</upper>
+          </limit>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+        </axis>
+        <physics>
+          <ode>
+            <!-- cfm_damping is being deprecated by implicit_damping -->
+            <cfm_damping>1</cfm_damping>
+            <implicit_spring_damper>1</implicit_spring_damper>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="joint_1" type="universal">
+        <parent>link_1</parent>
+        <child>link_2</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <limit>
+            <lower>-0.7</lower>
+            <upper>0.7</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>1000.000000</damping>
+          </dynamics>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+        </axis>
+        <axis2>
+          <limit>
+            <lower>-0.7</lower>
+            <upper>0.7</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>2000.000000</damping>
+          </dynamics>
+          <xyz>0.000000 1.000000 0.000000</xyz>
+        </axis2>
+        <physics>
+          <ode>
+            <!-- cfm_damping is being deprecated by implicit_damping -->
+            <cfm_damping>1</cfm_damping>
+            <implicit_spring_damper>1</implicit_spring_damper>
+          </ode>
+        </physics>
+      </joint>
+      <static>0</static>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/collide_without_contact.world b/test/worlds/collide_without_contact.world
new file mode 100644
index 0000000..1a2ad76
--- /dev/null
+++ b/test/worlds/collide_without_contact.world
@@ -0,0 +1,103 @@
+<sdf version='1.4'>
+  <world name='default'>
+    <!-- include sun and ground plane -->
+    <include><uri>model://sun</uri></include>
+    <include><uri>model://ground_plane</uri></include>
+
+    <model name="sensor_box">
+      <static>true</static>
+      <link name="link">
+        <pose>0 0 0.251  0 0 0</pose>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>4 4 0.5</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>4 4 0.5</size>
+            </box>
+          </geometry>
+          <material><script>
+            <uri>file://media/materials/scripts/gazebo.material</uri>
+            <name>Gazebo/Grey</name>
+          </script></material>
+        </visual>
+        <sensor name="box_contact" type="contact">
+          <always_on>true</always_on>
+          <update_rate>1000</update_rate>
+          <contact>
+            <collision>collision</collision>
+          </contact>
+        </sensor>
+      </link>
+    </model>
+    <model name='contact_box'>
+      <pose>0.0 -1.0 1.5  0 0 0</pose>
+      <allow_auto_disable>false</allow_auto_disable>
+      <link name='link'>
+        <collision name='collision'>
+          <geometry>
+            <box>
+              <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <collide_without_contact>false</collide_without_contact>
+            </contact>
+          </surface>
+        </collision>
+        <visual name='visual'>
+          <geometry>
+            <box>
+              <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+          <material><script>
+            <uri>file://media/materials/scripts/gazebo.material</uri>
+            <name>Gazebo/Grey</name>
+          </script></material>
+        </visual>
+      </link>
+    </model>
+    <model name='collide_box'>
+      <pose>0.0 1.0 1.5  0 0 0</pose>
+      <allow_auto_disable>false</allow_auto_disable>
+      <link name='link'>
+        <collision name='collision'>
+          <geometry>
+            <box>
+              <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <collide_without_contact>true</collide_without_contact>
+            </contact>
+          </surface>
+        </collision>
+        <visual name='visual'>
+          <geometry>
+            <box>
+              <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+          <material><script>
+            <uri>file://media/materials/scripts/gazebo.material</uri>
+            <name>Gazebo/Grey</name>
+          </script></material>
+        </visual>
+      </link>
+    </model>
+    <gui fullscreen='0'>
+      <camera name='user_camera'>
+        <pose>6.5 0.0 1.5  0.0 0.0 -3.14159</pose>
+        <view_controller>orbit</view_controller>
+      </camera>
+    </gui>
+  </world>
+</sdf>
diff --git a/test/regression/worlds/collision_test.world b/test/worlds/collision_test.world
similarity index 100%
rename from test/regression/worlds/collision_test.world
rename to test/worlds/collision_test.world
diff --git a/test/worlds/concave_mesh_test.world b/test/worlds/concave_mesh_test.world
new file mode 100644
index 0000000..67c74ed
--- /dev/null
+++ b/test/worlds/concave_mesh_test.world
@@ -0,0 +1,44 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <include>
+      <pose>1 0 0 0 0 0</pose>
+      <static>true</static>
+      <uri>model://cordless_drill</uri>
+    </include>
+
+    <model name="hokuyo">
+      <static>true</static>
+      <link name="link">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+
+        <sensor name="laser" type="ray">
+          <pose>0.01 0 0.20 0 -0 0</pose>
+          <ray>
+            <scan>
+              <horizontal>
+                <samples>20</samples>
+                <resolution>1</resolution>
+                <min_angle>-0.16889</min_angle>
+                <max_angle>0.168899</max_angle>
+              </horizontal>
+            </scan>
+            <range>
+              <min>0.08</min>
+              <max>10</max>
+              <resolution>0.01</resolution>
+            </range>
+          </ray>
+
+          <plugin name="laser" filename="libRayPlugin.so" />
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+    </model>
+
+  </world>
+</sdf>
diff --git a/test/worlds/concave_submesh_collision_test.world b/test/worlds/concave_submesh_collision_test.world
new file mode 100644
index 0000000..55a87b7
--- /dev/null
+++ b/test/worlds/concave_submesh_collision_test.world
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+
+    <model name="polaris_ranger_ev">
+      <static>true</static>
+      <link name="chassis">
+        <visual name="visual">
+          <geometry>
+            <mesh>
+              <uri>model://polaris_ranger_ev/meshes/polaris.dae</uri>
+              <submesh>
+                <name>Rear_Wheel_Right</name>
+                <center>true</center>
+              </submesh>
+            </mesh>
+          </geometry>
+        </visual>
+  
+        <collision name="collision">
+          <geometry>
+            <mesh>
+              <uri>model://polaris_ranger_ev/meshes/polaris.dae</uri>
+              <submesh>
+                <name>Rear_Wheel_Right</name>
+                <center>true</center>
+              </submesh>
+            </mesh>
+          </geometry>
+        </collision>
+  
+      </link>
+    </model>
+
+    <model name="hokuyo">
+      <static>true</static>
+      <pose>-2 0 0 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+
+        <sensor name="laser" type="ray">
+          <pose>0.01 0 0.20 0 -0 0</pose>
+          <ray>
+            <scan>
+              <horizontal>
+                <samples>20</samples>
+                <resolution>1</resolution>
+                <min_angle>-0.8</min_angle>
+                <max_angle>0.8</max_angle>
+              </horizontal>
+            </scan>
+            <range>
+              <min>0.08</min>
+              <max>10</max>
+              <resolution>0.01</resolution>
+            </range>
+          </ray>
+
+          <plugin name="laser" filename="libRayPlugin.so" />
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+    </model>
+
+  </world>
+</sdf>
diff --git a/test/worlds/concave_submesh_no_collision_test.world b/test/worlds/concave_submesh_no_collision_test.world
new file mode 100644
index 0000000..f4e1391
--- /dev/null
+++ b/test/worlds/concave_submesh_no_collision_test.world
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+
+    <model name="polaris_ranger_ev">
+      <static>true</static>
+      <link name="chassis">
+        <visual name="visual">
+          <geometry>
+            <mesh>
+              <uri>model://polaris_ranger_ev/meshes/polaris.dae</uri>
+              <submesh>
+                <name>Ranger</name>
+                <center>false</center>
+              </submesh>
+            </mesh>
+          </geometry>
+        </visual>
+  
+        <collision name="collision">
+          <geometry>
+            <mesh>
+              <uri>model://polaris_ranger_ev/meshes/polaris.dae</uri>
+              <submesh>
+                <name>Ranger</name>
+                <center>false</center>
+              </submesh>
+            </mesh>
+          </geometry>
+        </collision>
+  
+      </link>
+    </model>
+
+    <model name="hokuyo">
+      <static>true</static>
+      <pose>-2 0 0 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+
+        <sensor name="laser" type="ray">
+          <pose>0.01 0 0.20 0 -0 0</pose>
+          <ray>
+            <scan>
+              <horizontal>
+                <samples>20</samples>
+                <resolution>1</resolution>
+                <min_angle>-0.8</min_angle>
+                <max_angle>0.8</max_angle>
+              </horizontal>
+            </scan>
+            <range>
+              <min>0.08</min>
+              <max>10</max>
+              <resolution>0.01</resolution>
+            </range>
+          </ray>
+
+          <plugin name="laser" filename="libRayPlugin.so" />
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+    </model>
+
+  </world>
+</sdf>
diff --git a/test/sdf/contact.world b/test/worlds/contact.world
similarity index 100%
rename from test/sdf/contact.world
rename to test/worlds/contact.world
diff --git a/test/worlds/contact_stability.world b/test/worlds/contact_stability.world
new file mode 100644
index 0000000..f3e6533
--- /dev/null
+++ b/test/worlds/contact_stability.world
@@ -0,0 +1,240 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <include><uri>model://sun</uri></include>
+    <include><uri>model://ground_plane</uri></include>
+    <model name="sphere_min_depth_1cm">
+      <pose>-3 0.66 2.0  0 0 0</pose>
+      <allow_auto_disable>false</allow_auto_disable>
+      <link name="link">
+        <collision name="col">
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.01</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <transparency>0.5</transparency>
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_min_depth_default">
+      <pose>-1.95 1.24 2.0  0 0 0</pose>
+      <allow_auto_disable>false</allow_auto_disable>
+      <link name="link">
+        <collision name="col">
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <transparency>0.5</transparency>
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+        </visual>
+      </link>
+    </model>
+    <model name="box_min_depth_1cm">
+      <pose>2 0 0.5  0 0 0</pose>
+      <allow_auto_disable>false</allow_auto_disable>
+      <link name="link">
+        <collision name="col">
+          <geometry>
+            <box><size>1 1 1</size></box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <max_vel>0.00</max_vel>
+                <min_depth>0.01</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <transparency>0.5</transparency>
+          <geometry>
+            <box><size>1 1 1</size></box>
+          </geometry>
+        </visual>
+      </link>
+    </model>
+    <model name="box_min_depth_default">
+      <pose>2 1.5 0.5  0 0 0</pose>
+      <allow_auto_disable>false</allow_auto_disable>
+      <link name="link">
+        <collision name="col">
+          <geometry>
+            <box><size>1 1 1</size></box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <transparency>0.5</transparency>
+          <geometry>
+            <box><size>1 1 1</size></box>
+          </geometry>
+        </visual>
+      </link>
+    </model>
+    <model name="kinematic_coupling">
+      <pose>-3 0 1.0  0 0 0</pose>
+      <static>true</static>
+      <link name="link1">
+        <pose>1.05 0 0  0 0 0</pose>
+        <collision name="sphere">
+          <geometry>
+            <sphere><radius>1.0</radius></sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.01</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <geometry>
+            <sphere><radius>1.0</radius></sphere>
+          </geometry>
+        </visual>
+      </link>
+      <link name="link2">
+        <pose>-1.05 0 0  0 0 0</pose>
+        <collision name="sphere">
+          <geometry>
+            <sphere><radius>1.0</radius></sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.01</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <geometry>
+            <sphere><radius>1.0</radius></sphere>
+          </geometry>
+        </visual>
+      </link>
+      <link name="link3">
+        <pose>0 1.9 0  0 0 0</pose>
+        <collision name="sphere">
+          <geometry>
+            <sphere><radius>1.0</radius></sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.01</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <geometry>
+            <sphere><radius>1.0</radius></sphere>
+          </geometry>
+        </visual>
+      </link>
+      <link name="link4">
+        <pose>2.1 1.9 0  0 0 0</pose>
+        <collision name="sphere">
+          <geometry>
+            <sphere><radius>1.0</radius></sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.01</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <geometry>
+            <sphere><radius>1.0</radius></sphere>
+          </geometry>
+        </visual>
+      </link>
+    </model>
+    <gui fullscreen='0'>
+      <camera name='user_camera'>
+        <pose>-1.143380 -0.837949 7.142050  0.000000 1.263640 1.992190</pose>
+        <view_controller>orbit</view_controller>
+      </camera>
+    </gui>
+  </world>
+</sdf>
diff --git a/test/sdf/cylinder.world b/test/worlds/cylinder.world
similarity index 100%
rename from test/sdf/cylinder.world
rename to test/worlds/cylinder.world
diff --git a/test/worlds/damp_test.world b/test/worlds/damp_test.world
new file mode 100644
index 0000000..e0b2f6c
--- /dev/null
+++ b/test/worlds/damp_test.world
@@ -0,0 +1,635 @@
+<?xml version="1.0" ?>
+<sdf version="1.3">
+    <world name="default">
+        <gui>
+            <camera name="user_camera">
+                <pose>-60 0 5 0 0 0</pose>
+            </camera>
+        </gui>
+        <scene>
+            <ambient>0.5 0.5 0.5 1</ambient>
+            <background>0.5 0.5 0.5 1</background>
+            <shadows>false</shadows>
+        </scene>
+        <include>
+            <uri>model://sun</uri>
+        </include>
+        <physics type="ode">
+            <gravity>0.0 0.0 -9.81</gravity>
+            <ode>
+                <solver>
+                    <type>quick</type>
+                    <dt>0.001</dt>
+                    <iters>100</iters>
+                    <sor>1.0</sor>
+                </solver>
+                <constraints>
+                    <cfm>0</cfm>
+                    <erp>1.0</erp>
+                    <contact_max_correcting_vel>0.0</contact_max_correcting_vel>
+                    <contact_surface_layer>0.0</contact_surface_layer>
+                </constraints>
+            </ode>
+        </physics>
+        <model name="model_1_mass_1_damping_10000">
+            <pose>0.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>0.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.0</izz>
+                    </inertia>
+                    <mass>1.0</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>10000.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+        <model name="model_2_mass_01_damping_10">
+            <pose>1.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>0.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.0</izz>
+                    </inertia>
+                    <mass>0.1</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>10.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+        <model name="model_3_mass_1_damping_10">
+            <pose>2.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>0.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.0</izz>
+                    </inertia>
+                    <mass>1.0</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>10.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+        <model name="model_4_mass_1_ixx_1_damping_10">
+            <pose>3.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>1.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.5</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.5</izz>
+                    </inertia>
+                    <mass>1.0</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>10.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+        <model name="model_5_mass_1_damping_1">
+            <pose>4.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>0.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.0</izz>
+                    </inertia>
+                    <mass>1.0</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>1.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+        <model name="model_6_mass_1_damping_10">
+            <pose>5.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>0.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.0</izz>
+                    </inertia>
+                    <mass>1.0</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>10.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+        <model name="model_7_mass_1_damping_100">
+            <pose>6.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>0.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.0</izz>
+                    </inertia>
+                    <mass>1.0</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>100.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+        <model name="model_8_mass_1_damping_1000">
+            <pose>7.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>0.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.0</izz>
+                    </inertia>
+                    <mass>1.0</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>1000.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+        <model name="model_9_mass_1_damping_0">
+            <pose>8.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>0.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.0</izz>
+                    </inertia>
+                    <mass>1.0</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>0.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+        <model name="model_10_mass_10_damping_0">
+            <pose>9.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>0.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>0.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>0.0</izz>
+                    </inertia>
+                    <mass>10.0</mass>
+                </inertial>
+                <velocity_decay>
+                    <linear>0.0</linear>
+                    <angular>0.0</angular>
+                </velocity_decay>
+                <visual name="visual_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.05</radius>
+                            <length>10.0</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+                <gravity>true</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                <axis>
+                    <xyz>1.0 0.0 0.0</xyz>
+                    <dynamics>
+                        <damping>0.0</damping>
+                        <friction>0.0</friction>
+                    </dynamics>
+                </axis>
+            </joint>
+            <static>false</static>
+        </model>
+    </world>
+</sdf>
diff --git a/test/worlds/dem_gps.world b/test/worlds/dem_gps.world
new file mode 100644
index 0000000..555c015
--- /dev/null
+++ b/test/worlds/dem_gps.world
@@ -0,0 +1,118 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <model name="box1">
+      <pose>-64 64 0.1 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry> <box> <size>1 1 1</size> </box> </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry> <box> <size>1 1 1</size> </box> </geometry>
+        </visual>
+        <sensor name="gps" type="gps">
+          <pose>0 0 0  0 0 0</pose>
+          <update_rate>10.0</update_rate>
+          <always_on>true</always_on>
+          <gps>
+            <position_sensing>
+              <horizontal>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>0</stddev>
+                  <bias_mean>0</bias_mean>
+                  <bias_stddev>0</bias_stddev>
+                  <precision>0.5</precision>
+                </noise>
+              </horizontal>
+              <vertical>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>0</stddev>
+                  <bias_mean>0</bias_mean>
+                  <bias_stddev>0</bias_stddev>
+                  <precision>1.0</precision>
+                </noise>
+              </vertical>
+            </position_sensing>
+            <velocity_sensing>
+              <horizontal>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>0</stddev>
+                  <bias_mean>0</bias_mean>
+                  <bias_stddev>0</bias_stddev>
+                  <precision>0.1</precision>
+                </noise>
+              </horizontal>
+              <vertical>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>0</stddev>
+                  <bias_mean>0</bias_mean>
+                  <bias_stddev>0</bias_stddev>
+                  <precision>0.2</precision>
+                </noise>
+              </vertical>
+            </velocity_sensing>
+          </gps>
+        </sensor>
+      </link>
+    </model>
+
+    <model name="heightmap">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <heightmap>
+              <uri>file://media/dem/volcano.tif</uri>
+              <size>129 129 0.1</size>
+              <pos>0 0 0</pos>
+            </heightmap>
+          </geometry>
+        </collision>
+
+        <visual name="visual_abcedf">
+          <geometry>
+            <heightmap>
+              <texture>
+                <diffuse>file://media/materials/textures/dirt_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <texture>
+                <diffuse>file://media/materials/textures/grass_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <texture>
+                <diffuse>file://media/materials/textures/fungus_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <blend>
+                <min_height>2</min_height>
+                <fade_dist>5</fade_dist>
+              </blend>
+              <blend>
+                <min_height>4</min_height>
+                <fade_dist>5</fade_dist>
+              </blend>
+              <uri>file://media/dem/volcano.tif</uri>
+              <size>129 129 0.1</size>
+              <pos>0 0 0</pos>
+            </heightmap>
+          </geometry>
+        </visual>
+
+      </link>
+    </model>
+
+  </world>
+</sdf>
diff --git a/test/regression/worlds/drop_test.world b/test/worlds/drop_test.world
similarity index 100%
rename from test/regression/worlds/drop_test.world
rename to test/worlds/drop_test.world
diff --git a/test/worlds/empty_dark_plane.world b/test/worlds/empty_dark_plane.world
new file mode 100644
index 0000000..fcdb0d4
--- /dev/null
+++ b/test/worlds/empty_dark_plane.world
@@ -0,0 +1,47 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <model name="ground_plane">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>100 100</size>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>100</mu>
+                <mu2>50</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <cast_shadows>false</cast_shadows>
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>100 100</size>
+            </plane>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Black</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
+
diff --git a/test/worlds/empty_different_name.world b/test/worlds/empty_different_name.world
new file mode 100644
index 0000000..f683849
--- /dev/null
+++ b/test/worlds/empty_different_name.world
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="not_the_default_world_name">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/test/worlds/empty_test.world b/test/worlds/empty_test.world
new file mode 100644
index 0000000..2b885f2
--- /dev/null
+++ b/test/worlds/empty_test.world
@@ -0,0 +1,5 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+  </world>
+</sdf>
diff --git a/test/sdf/everything.world b/test/worlds/everything.world
similarity index 100%
rename from test/sdf/everything.world
rename to test/worlds/everything.world
diff --git a/test/worlds/force_torque_model_removal_test.world b/test/worlds/force_torque_model_removal_test.world
new file mode 100644
index 0000000..b8c157a
--- /dev/null
+++ b/test/worlds/force_torque_model_removal_test.world
@@ -0,0 +1,130 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <!-- to demonstrate force torque, we'll construct a model with
+    two bodies stacked vertically, with a x-revolute joint connecting
+    them.  The joint has 90 degree limit.  We'll test force
+    torque readings and characterize them. -->
+    <model name="model_1">
+      <link name="link_1">
+        <inertial>
+          <pose>0 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.100000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.100000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.100000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_sphere">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.100000</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>0 0 0.5 0 0 0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.100000</radius>
+            </sphere>
+          </geometry>
+        </collision>
+      </link>
+
+      <link name="link_2">
+        <pose>0 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.100000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.100000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.100000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_box">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.2 0.4</size>
+            </box>
+          </geometry>
+        </visual>
+        <collision name="collision_box">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.2 0.4</size>
+            </box>
+          </geometry>
+        </collision>
+      </link>
+
+      <joint name="joint_01" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <!-- joint at origin of link_1 inertial frame -->
+        <!-- moement arm from link_1 inertial frame to joint_01 is 0m -->
+        <pose>0 0 0.5 0 0 0</pose>
+        <axis>
+          <limit>
+            <lower>-1.57079</lower>
+            <upper>1.57079</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+        </axis>
+        <sensor name="force_torque" type="force_torque">
+          <always_on>true</always_on>
+          <visualize>true</visualize>
+          <update_rate>30</update_rate>
+           <plugin filename="libForceTorqueModelRemovalTestPlugin.so" name="joint_01_ft_plugin" />
+        </sensor>
+      </joint>
+
+      <joint name="joint_12" type="revolute">
+        <parent>link_1</parent>
+        <child>link_2</child>
+        <!-- joint_1 at origin of link_2 link frame -->
+        <!-- moement arm from link_2 inertial frame to joint_01 is 2m -->
+        <!-- moement arm from link_2 inertial frame to joint_12 is 0.5m -->
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>0.000000 0.000000 1.000000</xyz>
+        </axis>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/force_torque_test.world b/test/worlds/force_torque_test.world
new file mode 100644
index 0000000..9dc16de
--- /dev/null
+++ b/test/worlds/force_torque_test.world
@@ -0,0 +1,173 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0.000000 0.000000 -9.810000</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>1000</iters>
+          <precon_iters>0</precon_iters>
+          <sor>1.000000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <contact_max_correcting_vel>100.000000</contact_max_correcting_vel>
+          <contact_surface_layer>0.01000</contact_surface_layer>
+        </constraints>
+      </ode>
+      <bullet>
+        <solver>
+          <type>sequential_impulse</type>
+          <iters>1000</iters>
+          <sor>1.000000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <split_impulse>true</split_impulse>
+          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
+          <contact_surface_layer>0.00000</contact_surface_layer>
+        </constraints>
+      </bullet>
+      <real_time_update_rate>0.000000</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <!-- to demonstrate force torque, we'll construct a model with
+    two bodies stacked vertically, with a x-revolute joint connecting
+    them.  The joint has 90 degree limit.  We'll test force
+    torque readings and characterize them. -->
+    <model name="model_1">
+      <link name="link_1">
+        <inertial>
+          <pose>0 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.100000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.100000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.100000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_sphere">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.100000</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>0 0 0.5 0 0 0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.100000</radius>
+            </sphere>
+          </geometry>
+        </collision>
+      </link>
+
+      <link name="link_2">
+        <pose>0 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.100000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.100000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.100000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_box">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.2 0.4</size>
+            </box>
+          </geometry>
+        </visual>
+        <collision name="collision_box">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.2 0.4</size>
+            </box>
+          </geometry>
+        </collision>
+      </link>
+
+      <joint name="joint_01" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <!-- joint at origin of link_1 inertial frame -->
+        <!-- moement arm from link_1 inertial frame to joint_01 is 0m -->
+        <pose>0 0 0.5 0 0 0</pose>
+        <axis>
+          <limit>
+            <lower>-1.57079</lower>
+            <upper>1.57079</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+        </axis>
+        <sensor name="force_torque" type="force_torque">
+          <always_on>true</always_on>
+          <visualize>true</visualize>
+          <update_rate>30</update_rate>
+        </sensor>
+        <physics>
+          <provide_feedback>true</provide_feedback>
+        </physics>
+      </joint>
+
+      <joint name="joint_12" type="revolute">
+        <parent>link_1</parent>
+        <child>link_2</child>
+        <!-- joint_1 at origin of link_2 link frame -->
+        <!-- moement arm from link_2 inertial frame to joint_01 is 2m -->
+        <!-- moement arm from link_2 inertial frame to joint_12 is 0.5m -->
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <limit>
+            <lower>-0.000001</lower>
+            <upper>0.000001</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>0.000000 0.000000 1.000000</xyz>
+        </axis>
+        <sensor name="force_torque" type="force_torque">
+          <always_on>true</always_on>
+          <visualize>true</visualize>
+          <update_rate>30</update_rate>
+        </sensor>
+        <physics>
+          <provide_feedback>true</provide_feedback>
+        </physics>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/force_torque_test2.world b/test/worlds/force_torque_test2.world
new file mode 100644
index 0000000..1ad4de3
--- /dev/null
+++ b/test/worlds/force_torque_test2.world
@@ -0,0 +1,214 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0.000000 0.000000 -9.810000</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>250</iters>
+          <precon_iters>0</precon_iters>
+          <sor>1.400000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <contact_max_correcting_vel>0.000000</contact_max_correcting_vel>
+          <contact_surface_layer>0.00000</contact_surface_layer>
+        </constraints>
+      </ode>
+      <bullet>
+        <solver>
+          <type>sequential_impulse</type>
+          <iters>250</iters>
+          <sor>1.400000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <split_impulse>true</split_impulse>
+          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
+          <contact_surface_layer>0.01000</contact_surface_layer>
+        </constraints>
+      </bullet>
+      <simbody>
+        <accuracy>0.001</accuracy>
+        <max_transient_velocity>0.01</max_transient_velocity>
+        <contact>
+          <stiffness>1e8</stiffness>
+          <dissipation>10</dissipation>
+          <static_friction>0.15</static_friction>
+          <dynamic_friction>0.1</dynamic_friction>
+          <viscous_friction>0.0</viscous_friction>
+        </contact>
+      </simbody>
+      <real_time_update_rate>0.000000</real_time_update_rate>
+      <max_step_size>0.001000</max_step_size>
+    </physics>
+
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <!-- test contributed by jesper -->
+    <model name="boxes">
+      <pose>0 0 0 0 0 1.57</pose>
+      <link name="link1">
+        <collision name="collision">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.01</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <bullet>
+                <friction>1</friction>
+                <friction2>1</friction2>
+              </bullet>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+        <inertial>
+          <mass>100.0</mass>
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>1.0</ixx>
+            <iyy>1.0</iyy>
+            <izz>1.0</izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+      </link>
+      <link name="link2">
+        <pose>1.0 0 1.0 0 0 0</pose>
+        <collision name="collision">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+        <inertial>
+          <mass>5.0</mass>
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.05</ixx>
+            <iyy>0.05</iyy>
+            <izz>0.05</izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+      </link>
+      <link name="link3">
+        <pose>2.0 0 2.0 0 0 0</pose>
+        <collision name="collision">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+        <inertial>
+          <mass>1.0</mass>
+          <pose>0.5 0.5 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.001</ixx>
+            <iyy>0.001</iyy>
+            <izz>0.0</izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+      </link>
+      <joint name="joint1" type="revolute">
+        <physics>
+          <provide_feedback>true</provide_feedback>
+          <ode>
+            <cfm_damping>true</cfm_damping>
+          </ode>
+        </physics>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <dynamics>
+            <damping>100.000000</damping>
+          </dynamics>
+        </axis>
+        <parent>link1</parent>
+        <child>link2</child>
+
+        <sensor name="force_torque" type="force_torque">
+          <always_on>true</always_on>
+          <visualize>true</visualize>
+          <update_rate>30</update_rate>
+        </sensor>
+
+      </joint>
+      <joint name="joint2" type="revolute">
+        <physics>
+          <provide_feedback>true</provide_feedback>
+          <ode>
+            <cfm_damping>true</cfm_damping>
+          </ode>
+        </physics>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <dynamics>
+            <damping>30.000000</damping>
+          </dynamics>
+        </axis>
+        <parent>link2</parent>
+        <child>link3</child>
+        <sensor name="force_torque" type="force_torque">
+          <always_on>true</always_on>
+          <visualize>true</visualize>
+          <update_rate>30</update_rate>
+        </sensor>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/gearbox.world b/test/worlds/gearbox.world
new file mode 100644
index 0000000..d626652
--- /dev/null
+++ b/test/worlds/gearbox.world
@@ -0,0 +1,211 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <physics type="ode">
+      <gravity>0.000000 0.000000 0.00000</gravity>
+      <max_step_size>0.000100</max_step_size>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>100</iters>
+          <precon_iters>0</precon_iters>
+          <sor>1.300000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>1.000000</erp>
+          <contact_max_correcting_vel>0.000000</contact_max_correcting_vel>
+          <contact_surface_layer>0.000000</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0.000000</real_time_update_rate>
+    </physics>
+    <model name="model_1">
+      <pose>0.000000 0.000000 2.100000 -1.57079 -0.000000 0.000000</pose>
+      <link name="link_1">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>100.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>1</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="link_2">
+        <pose>0.500000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.2 0.2 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>100.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <box>
+              <size>0.2 0.2 0.2</size>
+            </box>
+          </geometry>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>1</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="link_3">
+        <pose>1.000000 1.000000 1.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>100.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>1</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <joint name="joint_02" type="revolute">
+        <parent>world</parent>
+        <child>link_2</child>
+        <axis>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <limit>
+            <upper>0</upper>
+            <lower>0</lower>
+          </limit>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="joint_12" type="revolute">
+        <parent>link_2</parent>
+        <child>link_1</child>
+        <axis>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="joint_23" type="revolute">
+        <parent>link_2</parent>
+        <child>link_3</child>
+        <axis>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="joint_13" type="gearbox">
+        <!--
+              theta_1 = joint angle in the direction specified by <axis> from <gearbox_refrence_body> to <parent>
+              theta_2 = joint angle in the direction specified by <axis2> from <gearbox_refrence_body> to <child>
+              this gearbox constraint enforces that
+              theta_2 = - <gearbox_ratio> * theta_1
+            -->
+        <parent>link_1</parent>
+        <child>link_3</child>
+        <gearbox_ratio>-1.5</gearbox_ratio>
+        <gearbox_reference_body>link_2</gearbox_reference_body>
+        <axis>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <axis2>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis2>
+      </joint>
+      <static>0</static>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/gps_test.world b/test/worlds/gps_test.world
new file mode 100644
index 0000000..ac5b6b6
--- /dev/null
+++ b/test/worlds/gps_test.world
@@ -0,0 +1,186 @@
+<sdf version="1.4">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <!-- A ground plane ->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!- -->
+
+    <spherical_coordinates>
+      <surface_model>EARTH_WGS84</surface_model>
+      <latitude_deg>37.4</latitude_deg>
+      <longitude_deg>-122.1</longitude_deg>
+      <elevation>0.0</elevation>
+      <heading_deg>0</heading_deg>
+    </spherical_coordinates>
+
+    <model name="pendulum_x">
+      <pose>0 0 5.0  0 0 0</pose>
+      <joint name="pin" type="revolute">
+        <pose>-10 0 0  0 0 0</pose>
+        <parent>world</parent>
+        <child>link_x</child>
+        <axis>
+          <xyz>0 1 0</xyz>
+        </axis>
+      </joint>
+      <link name="link_x">
+        <pose>10.0 0 0  0 0 0</pose>
+        <collision name="collision_box">
+          <geometry>
+            <box>
+              <size>0.5 0.5 0.5</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual_box">
+          <geometry>
+            <box>
+              <size>0.5 0.5 0.5</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Grey</name>
+            </script>
+          </material>
+        </visual>
+        <sensor name="gps" type="gps">
+          <pose>0 0 0  0 0 0</pose>
+          <update_rate>10.0</update_rate>
+          <always_on>true</always_on>
+          <gps>
+            <position_sensing>
+              <horizontal>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>1</stddev>
+                  <bias_mean>3</bias_mean>
+                  <bias_stddev>1</bias_stddev>
+                  <precision>0.5</precision>
+                </noise>
+              </horizontal>
+              <vertical>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>1</stddev>
+                  <bias_mean>3</bias_mean>
+                  <bias_stddev>1</bias_stddev>
+                  <precision>1.0</precision>
+                </noise>
+              </vertical>
+            </position_sensing>
+            <velocity_sensing>
+              <horizontal>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>0.1</stddev>
+                  <bias_mean>0.1</bias_mean>
+                  <bias_stddev>0.1</bias_stddev>
+                  <precision>0.1</precision>
+                </noise>
+              </horizontal>
+              <vertical>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>0.2</stddev>
+                  <bias_mean>0.2</bias_mean>
+                  <bias_stddev>0.2</bias_stddev>
+                  <precision>0.2</precision>
+                </noise>
+              </vertical>
+            </velocity_sensing>
+          </gps>
+        </sensor>
+      </link>
+    </model>
+
+    <model name="pendulum_y">
+      <pose>0 0 3.0  0 0 0</pose>
+      <joint name="pin" type="revolute">
+        <pose>0 -8 0  0 0 0</pose>
+        <parent>world</parent>
+        <child>link_y</child>
+        <axis>
+          <xyz>1 0 0</xyz>
+        </axis>
+      </joint>
+      <link name="link_y">
+        <pose>0 8.0 0  0 0 0</pose>
+        <collision name="collision_box">
+          <geometry>
+            <box>
+              <size>0.5 0.5 0.5</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual_box">
+          <geometry>
+            <box>
+              <size>0.5 0.5 0.5</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Grey</name>
+            </script>
+          </material>
+        </visual>
+        <sensor name="gps" type="gps">
+          <pose>0 0 0  0 0 0</pose>
+          <update_rate>10.0</update_rate>
+          <always_on>true</always_on>
+          <gps>
+            <position_sensing>
+              <horizontal>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>1</stddev>
+                  <bias_mean>3</bias_mean>
+                  <bias_stddev>1</bias_stddev>
+                  <precision>0.5</precision>
+                </noise>
+              </horizontal>
+              <vertical>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>1</stddev>
+                  <bias_mean>3</bias_mean>
+                  <bias_stddev>1</bias_stddev>
+                  <precision>1.0</precision>
+                </noise>
+              </vertical>
+            </position_sensing>
+            <velocity_sensing>
+              <horizontal>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>0.1</stddev>
+                  <bias_mean>0.1</bias_mean>
+                  <bias_stddev>0.1</bias_stddev>
+                  <precision>0.1</precision>
+                </noise>
+              </horizontal>
+              <vertical>
+                <noise type="gaussian_quantized">
+                  <mean>0</mean>
+                  <stddev>0.2</stddev>
+                  <bias_mean>0.2</bias_mean>
+                  <bias_stddev>0.2</bias_stddev>
+                  <precision>0.2</precision>
+                </noise>
+              </vertical>
+            </velocity_sensing> 
+          </gps>
+        </sensor>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/gpu_laser.world b/test/worlds/gpu_laser.world
new file mode 100644
index 0000000..978ee0b
--- /dev/null
+++ b/test/worlds/gpu_laser.world
@@ -0,0 +1,625 @@
+<sdf version="1.4">
+    <world name="default">
+        <scene>
+            <ambient>0.5 0.5 0.5 1.0</ambient>
+            <background>0.5 0.5 0.5 1.0</background>
+        </scene>
+        <physics type="ode">
+            <gravity>0.0 0.0 0.0</gravity>
+            <ode>
+                <solver>
+                    <type>quick</type>
+                    <iters>20</iters>
+                    <sor>1.3</sor>
+                </solver>
+                <constraints>
+                    <cfm>0</cfm>
+                    <erp>0.2</erp>
+                    <contact_max_correcting_vel>100.0</contact_max_correcting_vel>
+                    <contact_surface_layer>0.0</contact_surface_layer>
+                </constraints>
+            </ode>
+            <max_contacts>250</max_contacts>
+            <max_step_size>0.001</max_step_size>
+        </physics>
+        <model name="model_1">
+            <pose>0.0 0.0 2.0 0.0 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>0.0 0.0 0.0 0.0 0.0 0.707</pose>
+                <inertial>
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>1.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>1.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>1.0</izz>
+                    </inertia>
+                    <mass>10.0</mass>
+                </inertial>
+                <visual name="visual_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <box>
+                            <size>0.05 0.05 0.05</size>
+                        </box>
+                    </geometry>
+                    <material normal_map="normal_map.png">
+                        <ambient>0.03 0.5 0.5 1.0</ambient>
+                        <script>Gazebo/Red</script>
+                    </material>
+                    <cast_shadows>true</cast_shadows>
+                    <laser_retro>100.0</laser_retro>
+                </visual>
+                <collision name="collision_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <box>
+                            <size>0.05 0.05 0.05</size>
+                        </box>
+                    </geometry>
+                    <surface>
+                        <friction>
+                            <ode>
+                                <mu>0.5</mu>
+                                <mu2>0.2</mu2>
+                                <fdir1>1.0 0 0</fdir1>
+                                <slip1>0</slip1>
+                                <slip2>0</slip2>
+                            </ode>
+                        </friction>
+                        <bounce>
+                            <restitution_coefficient>0</restitution_coefficient>
+                            <threshold>1000000.0</threshold>
+                        </bounce>
+                        <contact>
+                            <ode>
+                                <soft_cfm>0</soft_cfm>
+                                <soft_erp>0.2</soft_erp>
+                                <kp>1e15</kp>
+                                <kd>1e13</kd>
+                                <max_vel>100.0</max_vel>
+                                <min_depth>0.0001</min_depth>
+                            </ode>
+                        </contact>
+                    </surface>
+                    <laser_retro>100.0</laser_retro>
+                </collision>
+                <sensor name="laser_sensor" type="gpu_ray">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <ray>
+                        <scan>
+                            <horizontal>
+                                <samples>640</samples>
+                                <resolution>1</resolution>
+                                <min_angle>-1.396263</min_angle>
+                                <max_angle>1.396263</max_angle>
+                            </horizontal>
+                            <vertical>
+                                <samples>1</samples>
+                                <resolution>1</resolution>
+                                <min_angle>0.0</min_angle>
+                                <max_angle>0.0</max_angle>
+                            </vertical>
+                        </scan>
+                        <range>
+                            <min>0.080000000000000002</min>
+                            <max>10.0</max>
+                            <resolution>0.01</resolution>
+                        </range>
+                    </ray>
+                    <!--
+                    <plugin name="plugin_1" filename="libgazebo_ros_gpu_laser.so">
+                        <alwaysOn>1</alwaysOn>
+                        <updateRate>20.0</updateRate>
+                        <gaussianNoise>0.0</gaussianNoise>
+                        <imageTopicName>image</imageTopicName>
+                        <topicName>laser_scan</topicName>
+                        <frameName>/map</frameName>
+                        <pointCloudCutoff>0.001</pointCloudCutoff>
+                    </plugin>
+                    -->
+                    <always_on>true</always_on>
+                    <visualize>true</visualize>
+                    <update_rate>20.0</update_rate>
+                    <topic>gpu_scan</topic>
+                </sensor>
+                <gravity>false</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+        </model>
+        <model name="model_2">
+            <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+            <link name="link_1">
+                <pose>3.0 0.0 2.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>1.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>1.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>1.0</izz>
+                    </inertia>
+                    <mass>10.0</mass>
+                </inertial>
+                <visual name="visual_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <box>
+                            <size>1 2 2</size>
+                        </box>
+                    </geometry>
+                    <material>
+                        <ambient>0.5 0.03 0.03 1.0</ambient>
+                        <script>Gazebo/Red</script>
+                    </material>
+                    <cast_shadows>true</cast_shadows>
+                    <laser_retro>100.0</laser_retro>
+                </visual>
+                <collision name="collision_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <box>
+                            <size>1 2 2</size>
+                        </box>
+                    </geometry>
+                    <surface>
+                        <friction>
+                            <ode>
+                                <mu>0.5</mu>
+                                <mu2>0.2</mu2>
+                                <fdir1>1.0 0 0</fdir1>
+                                <slip1>0</slip1>
+                                <slip2>0</slip2>
+                            </ode>
+                        </friction>
+                        <bounce>
+                            <restitution_coefficient>0</restitution_coefficient>
+                            <threshold>1000000.0</threshold>
+                        </bounce>
+                        <contact>
+                            <ode>
+                                <soft_cfm>0</soft_cfm>
+                                <soft_erp>0.2</soft_erp>
+                                <kp>1e15</kp>
+                                <kd>1e13</kd>
+                                <max_vel>100.0</max_vel>
+                                <min_depth>0.0001</min_depth>
+                            </ode>
+                        </contact>
+                    </surface>
+                    <laser_retro>100.0</laser_retro>
+                </collision>
+                <gravity>false</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <link name="link_2">
+                <pose>3.0 -0.5 3.8 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>1.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>1.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>1.0</izz>
+                    </inertia>
+                    <mass>10.0</mass>
+                </inertial>
+                <visual name="visual_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <box>
+                            <size>3 0.5 0.5</size>
+                        </box>
+                    </geometry>
+                    <material>
+                        <ambient>0.03 0.5 0.03 1.0</ambient>
+                        <script>Gazebo/Green</script>
+                    </material>
+                    <cast_shadows>true</cast_shadows>
+                    <laser_retro>50.0</laser_retro>
+                </visual>
+                <collision name="collision_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <box>
+                            <size>3 0.5 0.5</size>
+                        </box>
+                    </geometry>
+                    <surface>
+                        <friction>
+                            <ode>
+                                <mu>0.5</mu>
+                                <mu2>0.2</mu2>
+                                <fdir1>1.0 0 0</fdir1>
+                                <slip1>0</slip1>
+                                <slip2>0</slip2>
+                            </ode>
+                        </friction>
+                        <bounce>
+                            <restitution_coefficient>0</restitution_coefficient>
+                            <threshold>1000000.0</threshold>
+                        </bounce>
+                        <contact>
+                            <ode>
+                                <soft_cfm>0</soft_cfm>
+                                <soft_erp>0.2</soft_erp>
+                                <kp>1e15</kp>
+                                <kd>1e13</kd>
+                                <max_vel>100.0</max_vel>
+                                <min_depth>0.0001</min_depth>
+                            </ode>
+                        </contact>
+                    </surface>
+                    <laser_retro>50.0</laser_retro>
+                </collision>
+                <gravity>false</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <link name="link_3">
+                <pose>0.0 3.0 2.0 0.0 0.0 0.7</pose>
+                <inertial>
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>1.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>1.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>1.0</izz>
+                    </inertia>
+                    <mass>10.0</mass>
+                </inertial>
+                <visual name="visual_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <box>
+                            <size>2 2 2</size>
+                        </box>
+                    </geometry>
+                    <material>
+                        <ambient>0.5 0.5 0.03 1.0</ambient>
+                        <script>Gazebo/Yellow</script>
+                    </material>
+                    <cast_shadows>true</cast_shadows>
+                    <laser_retro>1.0</laser_retro>
+                </visual>
+                <collision name="collision_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <box>
+                            <size>2 2 2</size>
+                        </box>
+                    </geometry>
+                    <surface>
+                        <friction>
+                            <ode>
+                                <mu>0.5</mu>
+                                <mu2>0.2</mu2>
+                                <fdir1>1.0 0 0</fdir1>
+                                <slip1>0</slip1>
+                                <slip2>0</slip2>
+                            </ode>
+                        </friction>
+                        <bounce>
+                            <restitution_coefficient>0</restitution_coefficient>
+                            <threshold>1000000.0</threshold>
+                        </bounce>
+                        <contact>
+                            <ode>
+                                <soft_cfm>0</soft_cfm>
+                                <soft_erp>0.2</soft_erp>
+                                <kp>1e15</kp>
+                                <kd>1e13</kd>
+                                <max_vel>100.0</max_vel>
+                                <min_depth>0.0001</min_depth>
+                            </ode>
+                        </contact>
+                    </surface>
+                    <laser_retro>100.0</laser_retro>
+                </collision>
+                <gravity>false</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <link name="link_4">
+                <pose>2.0 -2.0 2.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>1.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>1.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>1.0</izz>
+                    </inertia>
+                    <mass>10.0</mass>
+                </inertial>
+                <visual name="visual_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>1</radius>
+                            <length>2</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <ambient>0.5 0.03 0.5 1.0</ambient>
+                        <script>Gazebo/Purple</script>
+                    </material>
+                    <cast_shadows>true</cast_shadows>
+                    <laser_retro>70.0</laser_retro>
+                </visual>
+                <collision name="collision_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <cylinder>
+                            <radius>1</radius>
+                            <length>2</length>
+                        </cylinder>
+                    </geometry>
+                    <surface>
+                        <friction>
+                            <ode>
+                                <mu>0.5</mu>
+                                <mu2>0.2</mu2>
+                                <fdir1>1.0 0 0</fdir1>
+                                <slip1>0</slip1>
+                                <slip2>0</slip2>
+                            </ode>
+                        </friction>
+                        <bounce>
+                            <restitution_coefficient>0</restitution_coefficient>
+                            <threshold>1000000.0</threshold>
+                        </bounce>
+                        <contact>
+                            <ode>
+                                <soft_cfm>0</soft_cfm>
+                                <soft_erp>0.2</soft_erp>
+                                <kp>1e15</kp>
+                                <kd>1e13</kd>
+                                <max_vel>100.0</max_vel>
+                                <min_depth>0.0001</min_depth>
+                            </ode>
+                        </contact>
+                    </surface>
+                    <laser_retro>100.0</laser_retro>
+                </collision>
+                <gravity>false</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <link name="link_5">
+                <pose>2.0 2.0 2.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>1.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>1.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>1.0</izz>
+                    </inertia>
+                    <mass>10.0</mass>
+                </inertial>
+                <visual name="visual_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <sphere>
+                            <radius>1</radius>
+                        </sphere>
+                    </geometry>
+                    <material>
+                        <ambient>0.03 0.5 0.5 1.0</ambient>
+                        <script>Gazebo/Turquoise</script>
+                    </material>
+                    <cast_shadows>true</cast_shadows>
+                    <laser_retro>35.0</laser_retro>
+                </visual>
+                <collision name="collision_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <sphere>
+                            <radius>1</radius>
+                        </sphere>
+                    </geometry>
+                    <surface>
+                        <friction>
+                            <ode>
+                                <mu>0.5</mu>
+                                <mu2>0.2</mu2>
+                                <fdir1>1.0 0 0</fdir1>
+                                <slip1>0</slip1>
+                                <slip2>0</slip2>
+                            </ode>
+                        </friction>
+                        <bounce>
+                            <restitution_coefficient>0</restitution_coefficient>
+                            <threshold>1000000.0</threshold>
+                        </bounce>
+                        <contact>
+                            <ode>
+                                <soft_cfm>0</soft_cfm>
+                                <soft_erp>0.2</soft_erp>
+                                <kp>1e15</kp>
+                                <kd>1e13</kd>
+                                <max_vel>100.0</max_vel>
+                                <min_depth>0.0001</min_depth>
+                            </ode>
+                        </contact>
+                    </surface>
+                    <laser_retro>100.0</laser_retro>
+                </collision>
+                <gravity>false</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <link name="link_6">
+                <pose>-2.0 -2.0 2.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>1.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>1.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>1.0</izz>
+                    </inertia>
+                    <mass>10.0</mass>
+                </inertial>
+                <visual name="visual_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <sphere>
+                            <radius>1</radius>
+                        </sphere>
+                    </geometry>
+                    <material>
+                        <ambient>0.03 0.03 0.5 1.0</ambient>
+                        <script>Gazebo/Blue</script>
+                    </material>
+                    <cast_shadows>true</cast_shadows>
+                    <laser_retro>35.0</laser_retro>
+                </visual>
+                <collision name="collision_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <sphere>
+                            <radius>1</radius>
+                        </sphere>
+                    </geometry>
+                    <surface>
+                        <friction>
+                            <ode>
+                                <mu>0.5</mu>
+                                <mu2>0.2</mu2>
+                                <fdir1>1.0 0 0</fdir1>
+                                <slip1>0</slip1>
+                                <slip2>0</slip2>
+                            </ode>
+                        </friction>
+                        <bounce>
+                            <restitution_coefficient>0</restitution_coefficient>
+                            <threshold>1000000.0</threshold>
+                        </bounce>
+                        <contact>
+                            <ode>
+                                <soft_cfm>0</soft_cfm>
+                                <soft_erp>0.2</soft_erp>
+                                <kp>1e15</kp>
+                                <kd>1e13</kd>
+                                <max_vel>100.0</max_vel>
+                                <min_depth>0.0001</min_depth>
+                            </ode>
+                        </contact>
+                    </surface>
+                    <laser_retro>100.0</laser_retro>
+                </collision>
+                <gravity>false</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+            <link name="link_7">
+                <pose>-1.5 0.0 2.0 0.0 0.0 0.0</pose>
+                <inertial>
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <inertia>
+                        <ixx>1.0</ixx>
+                        <ixy>0.0</ixy>
+                        <ixz>0.0</ixz>
+                        <iyy>1.0</iyy>
+                        <iyz>0.0</iyz>
+                        <izz>1.0</izz>
+                    </inertia>
+                    <mass>10.0</mass>
+                </inertial>
+                <visual name="visual_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <geometry>
+                        <box>
+                            <size>1 2 2</size>
+                        </box>
+                    </geometry>
+                    <material>
+                        <ambient>0.5 0.03 0.03 1.0</ambient>
+                        <script>Gazebo/Red</script>
+                    </material>
+                    <cast_shadows>true</cast_shadows>
+                    <laser_retro>150.0</laser_retro>
+                </visual>
+                <collision name="collision_box">
+                    <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <box>
+                            <size>1 2 2</size>
+                        </box>
+                    </geometry>
+                    <surface>
+                        <friction>
+                            <ode>
+                                <mu>0.5</mu>
+                                <mu2>0.2</mu2>
+                                <fdir1>1.0 0 0</fdir1>
+                                <slip1>0</slip1>
+                                <slip2>0</slip2>
+                            </ode>
+                        </friction>
+                        <bounce>
+                            <restitution_coefficient>0</restitution_coefficient>
+                            <threshold>1000000.0</threshold>
+                        </bounce>
+                        <contact>
+                            <ode>
+                                <soft_cfm>0</soft_cfm>
+                                <soft_erp>0.2</soft_erp>
+                                <kp>1e15</kp>
+                                <kd>1e13</kd>
+                                <max_vel>100.0</max_vel>
+                                <min_depth>0.0001</min_depth>
+                            </ode>
+                        </contact>
+                    </surface>
+                    <laser_retro>100.0</laser_retro>
+                </collision>
+                <gravity>false</gravity>
+                <self_collide>true</self_collide>
+                <kinematic>false</kinematic>
+            </link>
+        </model>
+        <light type="point" name="light_1">
+            <pose>0.0 0.0 10.0 0.0 0.0 0.0</pose>
+            <diffuse>0.5 0.5 0.5 0.5</diffuse>
+            <attenuation>
+                <range>1000.0</range>
+                <constant>0.01</constant>
+                <quadratic>0.0001</quadratic>
+            </attenuation>
+            <direction>0 0 -1</direction>
+            <spot>
+                <inner_angle>1.57</inner_angle>
+                <outer_angle>1.57</outer_angle>
+                <falloff>1.0</falloff>
+            </spot>
+            <cast_shadows>true</cast_shadows>
+        </light>
+    </world>
+</sdf>
diff --git a/test/worlds/gpu_laser2.world b/test/worlds/gpu_laser2.world
new file mode 100644
index 0000000..1b0a1f5
--- /dev/null
+++ b/test/worlds/gpu_laser2.world
@@ -0,0 +1,73 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="model_1">
+      <static>true</static>
+      <pose>0 0 0.035 0. 0 0</pose>
+      <link name="link_1">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+        <visual name="visual">
+          <geometry>
+            <mesh>
+              <uri>model://hokuyo/meshes/hokuyo.dae</uri>
+            </mesh>
+          </geometry>
+        </visual>
+        <collision name="collision-base">
+          <pose>0 0 -0.0145 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.05 0.041</size>
+            </box>
+          </geometry>
+        </collision>
+        <collision name="collision-top">
+          <pose>0 0 0.0205 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.021</radius>
+              <length>0.029</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <sensor name="laser_sensor" type="gpu_ray">
+          <pose>0.1 0 0.0175 0 -0 0</pose>
+          <ray>
+            <scan>
+              <horizontal>
+                <samples>640</samples>
+                <resolution>1</resolution>
+                <min_angle>-1.396263</min_angle>
+                <max_angle>1.396263</max_angle>
+              </horizontal>
+              <vertical>
+                <samples>1</samples>
+                <resolution>1</resolution>
+                <min_angle>0</min_angle>
+                <max_angle>0</max_angle>
+              </vertical>
+            </scan>
+            <range>
+              <min>0.08</min>
+              <max>10.0</max>
+              <resolution>0.01</resolution>
+            </range>
+          </ray>
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/gpu_laser_heightmap.world b/test/worlds/gpu_laser_heightmap.world
new file mode 100644
index 0000000..6567688
--- /dev/null
+++ b/test/worlds/gpu_laser_heightmap.world
@@ -0,0 +1,125 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+
+    <model name="gpu_laser">
+      <static>true</static>
+      <pose>0 0 0.035 0 0 0</pose>
+      <link name="link_1">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+        <visual name="visual">
+          <geometry>
+            <mesh>
+              <uri>model://hokuyo/meshes/hokuyo.dae</uri>
+            </mesh>
+          </geometry>
+        </visual>
+        <collision name="collision-base">
+          <pose>0 0 -0.0145 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.05 0.041</size>
+            </box>
+          </geometry>
+        </collision>
+        <collision name="collision-top">
+          <pose>0 0 0.0205 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.021</radius>
+              <length>0.029</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <sensor name="gpu_laser_sensor" type="gpu_ray">
+          <pose>0.1 0 0.0175 0 -0 0</pose>
+          <ray>
+            <scan>
+              <horizontal>
+                <samples>640</samples>
+                <resolution>1</resolution>
+                <min_angle>-1.396263</min_angle>
+                <max_angle>1.396263</max_angle>
+              </horizontal>
+              <vertical>
+                <samples>1</samples>
+                <resolution>0.5</resolution>
+                <min_angle>-0.7554</min_angle>
+                <max_angle>0.7554</max_angle>
+              </vertical>
+            </scan>
+            <range>
+              <min>0.08</min>
+              <max>10.0</max>
+              <resolution>0.01</resolution>
+            </range>
+          </ray>
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+    </model>
+
+    <model name="heightmap">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <heightmap>
+              <uri>file://media/materials/textures/heightmap_bowl.png</uri>
+              <size>129 129 10</size>
+              <pos>0 0 -6</pos>
+            </heightmap>
+          </geometry>
+        </collision>
+
+        <visual name="visual_abcedf">
+          <geometry>
+            <heightmap>
+              <use_terrain_paging>false</use_terrain_paging>
+              <texture>
+                <diffuse>file://media/materials/textures/dirt_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <texture>
+                <diffuse>file://media/materials/textures/grass_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <texture>
+                <diffuse>file://media/materials/textures/fungus_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <blend>
+                <min_height>2</min_height>
+                <fade_dist>5</fade_dist>
+              </blend>
+              <blend>
+                <min_height>4</min_height>
+                <fade_dist>5</fade_dist>
+              </blend>
+              <uri>file://media/materials/textures/heightmap_bowl.png</uri>
+              <size>129 129 10</size>
+              <pos>0 0 -6</pos>
+            </heightmap>
+          </geometry>
+        </visual>
+
+      </link>
+    </model>
+
+  </world>
+</sdf>
diff --git a/test/worlds/heightmap_test.world b/test/worlds/heightmap_test.world
index b4d84b9..bc11e9a 100644
--- a/test/worlds/heightmap_test.world
+++ b/test/worlds/heightmap_test.world
@@ -1,5 +1,5 @@
 <?xml version="1.0" ?>
-<sdf version="1.3">
+<sdf version="1.4">
   <world name="default">
     <include><uri>model://camera</uri></include>
 
diff --git a/test/worlds/implicit_damping_test.world b/test/worlds/implicit_damping_test.world
new file mode 100644
index 0000000..0e10247
--- /dev/null
+++ b/test/worlds/implicit_damping_test.world
@@ -0,0 +1,164 @@
+<?xml version="1.0" ?>
+<sdf version="1.3">
+    <world name="default">
+        <physics type="ode">
+            <gravity>0 0 0</gravity>
+            <update_rate>1000</update_rate>
+            <ode>
+                <solver>
+                    <type>quick</type>
+                    <dt>0.001</dt>
+                    <iters>40</iters>
+                    <sor>1.0</sor>
+                </solver>
+                <constraints>
+                    <cfm>0.0</cfm>
+                    <erp>0.2</erp>
+                    <contact_max_correcting_vel>100.0</contact_max_correcting_vel>
+                    <contact_surface_layer>0.0</contact_surface_layer>
+                </constraints>
+            </ode>
+        </physics>
+        <!-- A global light source -->
+        <include>
+            <uri>model://sun</uri>
+        </include>
+        <model name="model_1">
+            <pose>0 0 0 0 0 0</pose>
+            <link name="link_1">
+                <pose>0 0 0 0 0 0</pose>
+                <inertial>
+                    <pose>0 0 0 0 0 0</pose>
+                    <inertia>
+                        <ixx>1.000000</ixx>
+                        <ixy>0.000000</ixy>
+                        <ixz>0.000000</ixz>
+                        <iyy>1.000000</iyy>
+                        <iyz>0.000000</iyz>
+                        <izz>1.000000</izz>
+                    </inertia>
+                    <mass>10.000000</mass>
+                </inertial>
+                <visual name="visual_cylinder">
+                    <pose>0 0 -0.5 0 0 0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.100000</radius>
+                            <length>1.000000</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0 0 -0.5 0 0 0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.100000</radius>
+                            <length>1.000000</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+            </link>
+            <link name="link_2">
+                <pose>0 0 -1 0 0 0</pose>
+                <inertial>
+                    <pose>0 0 -0.5 0 0 0</pose>
+                    <inertia>
+                        <ixx>1.000000</ixx>
+                        <ixy>0.000000</ixy>
+                        <ixz>0.000000</ixz>
+                        <iyy>1.000000</iyy>
+                        <iyz>0.000000</iyz>
+                        <izz>1.000000</izz>
+                    </inertia>
+                    <mass>10.000000</mass>
+                </inertial>
+                <visual name="visual_box">
+                    <pose>0 0 -0.5 0 0 0</pose>
+                    <geometry>
+                        <box>
+                            <size>0.100000 0.100000 1.000000</size>
+                        </box>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Red</script>
+                    </material>
+                </visual>
+                <collision name="collision_box">
+                    <pose>0 0 -0.5 0 0 0</pose>
+                    <max_contacts>250</max_contacts>
+                    <geometry>
+                        <box>
+                            <size>0.100000 0.100000 1.000000</size>
+                        </box>
+                    </geometry>
+                </collision>
+                <gravity>1</gravity>
+                <self_collide>0</self_collide>
+                <kinematic>0</kinematic>
+            </link>
+            <joint name="joint_0" type="revolute">
+                <parent>world</parent>
+                <child>link_1</child>
+                <pose>0 0 0 0 0 0</pose>
+                <axis>
+                    <limit>
+                        <!-- effectively fixed -->
+                        <lower>0.000000</lower>
+                        <upper>0.000000</upper>
+                    </limit>
+                    <dynamics>
+                        <damping>1.000000</damping>
+                    </dynamics>
+                    <xyz>1.000000 0.000000 0.000000</xyz>
+                </axis>
+                <physics>
+                    <ode>
+                        <!-- cfm_damping is being deprecated by implicit_spring_damper -->
+                        <cfm_damping>1</cfm_damping>
+                        <implicit_spring_damper>1</implicit_spring_damper>
+                    </ode>
+                </physics>
+            </joint>
+            <joint name="joint_1" type="universal">
+                <parent>link_1</parent>
+                <child>link_2</child>
+                <pose>0 0 0 0 0 0</pose>
+                <axis>
+                    <limit>
+                        <lower>-0.7</lower>
+                        <upper>0.7</upper>
+                        <effort>1000.000000</effort>
+                        <velocity>1000.000000</velocity>
+                    </limit>
+                    <dynamics>
+                        <damping>1000.000000</damping>
+                    </dynamics>
+                    <xyz>1.000000 0.000000 0.000000</xyz>
+                </axis>
+                <axis2>
+                    <limit>
+                        <lower>-0.7</lower>
+                        <upper>0.7</upper>
+                        <effort>1000.000000</effort>
+                        <velocity>1000.000000</velocity>
+                    </limit>
+                    <dynamics>
+                        <damping>2000.000000</damping>
+                    </dynamics>
+                    <xyz>0.000000 1.000000 0.000000</xyz>
+                </axis2>
+                <physics>
+                    <ode>
+                        <!-- cfm_damping is being deprecated by implicit_spring_damper -->
+                        <cfm_damping>1</cfm_damping>
+                        <implicit_spring_damper>1</implicit_spring_damper>
+                    </ode>
+                </physics>
+            </joint>
+            <static>0</static>
+        </model>
+    </world>
+</sdf>
diff --git a/test/worlds/inertia_ratio.rworld b/test/worlds/inertia_ratio.rworld
new file mode 100644
index 0000000..2718171
--- /dev/null
+++ b/test/worlds/inertia_ratio.rworld
@@ -0,0 +1,104 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>1 0 -9.81</gravity>
+      <max_step_size>0.00101</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="double_pendulum">
+      <%
+        # Parameters
+        # Aluminum 2700 kg/m^3
+        density = 2700.0
+        dz = 0.5
+        dx = dz/10
+        dy = dz/10
+        mass = density * dx * dy * dz 
+        # upper_link is smaller
+        length_ratio = 2e-1
+        dx2 = dx*length_ratio
+        dy2 = dy*length_ratio
+        dz2 = dz*length_ratio
+        mass2 = density * dx2 * dy2 * dz2 
+        theta_1 = Math::PI / 4
+        theta_2 = 0.3
+      %>
+      <pose>0 0 <%= dz*1.8 %>  <%= theta_1 %> 0 0</pose>
+      <link name="upper_link">
+        <pose>0 0 <%= -dz2/2 %>  0 0 0</pose>
+        <inertial>
+          <mass><%= mass2 %></mass>
+          <inertia>
+            <ixx><%= 1.0 / 12 * mass2 * (dy2*dy2 + dz2*dz2) %></ixx>
+            <iyy><%= 1.0 / 12 * mass2 * (dz2*dz2 + dx2*dx2) %></iyy>
+            <izz><%= 1.0 / 12 * mass2 * (dx2*dx2 + dy2*dy2) %></izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size><%= dx2 %> <%= dy2 %> <%= dz2 %></size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size><%= dx2 %> <%= dy2 %> <%= dz2 %></size>
+            </box>
+          </geometry>
+        </visual>
+      </link>
+      <joint name="upper_joint" type="revolute">
+        <pose>0 0 <%= dz2/2 %>  0 0 0</pose>
+        <parent>world</parent>
+        <child>upper_link</child>
+        <axis>
+          <xyz>1 0 0</xyz>
+        </axis>
+      </joint>
+      <link name="lower_link">
+        <pose>0 <%= dz2*Math.sin(0)+dz*Math.sin(theta_1)/2 %> <%= -dz2*Math.cos(0)-dz*Math.cos(theta_1)/2 %>  <%= theta_1 %> 0 0</pose>
+        <inertial>
+          <mass><%= mass %></mass>
+          <inertia>
+            <ixx><%= 1.0 / 12 * mass * (dy*dy + dz*dz) %></ixx>
+            <iyy><%= 1.0 / 12 * mass * (dz*dz + dx*dx) %></iyy>
+            <izz><%= 1.0 / 12 * mass * (dx*dx + dy*dy) %></izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size><%= dx %> <%= dy %> <%= dz %></size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size><%= dx %> <%= dy %> <%= dz %></size>
+            </box>
+          </geometry>
+        </visual>
+      </link>
+      <joint name="lower_joint" type="revolute">
+        <pose>0 0 <%= dz/2 %>  0 0 0</pose>
+        <parent>upper_link</parent>
+        <child>lower_link</child>
+        <axis>
+          <xyz>1 0 0</xyz>
+        </axis>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/inertia_ratio.world b/test/worlds/inertia_ratio.world
new file mode 100644
index 0000000..3ad2a33
--- /dev/null
+++ b/test/worlds/inertia_ratio.world
@@ -0,0 +1,88 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>1 0 -9.81</gravity>
+      <max_step_size>0.00101</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="double_pendulum">
+      
+      <pose>0 0 0.9  0.7853981633974483 0 0</pose>
+      <link name="upper_link">
+        <pose>0 0 -0.05  0 0 0</pose>
+        <inertial>
+          <mass>0.02700000000000001</mass>
+          <inertia>
+            <ixx>2.272500000000001e-05</ixx>
+            <iyy>2.272500000000001e-05</iyy>
+            <izz>4.5000000000000035e-07</izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.010000000000000002 0.010000000000000002 0.1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.010000000000000002 0.010000000000000002 0.1</size>
+            </box>
+          </geometry>
+        </visual>
+      </link>
+      <joint name="upper_joint" type="revolute">
+        <pose>0 0 0.05  0 0 0</pose>
+        <parent>world</parent>
+        <child>upper_link</child>
+        <axis>
+          <xyz>1 0 0</xyz>
+        </axis>
+      </joint>
+      <link name="lower_link">
+        <pose>0 0.17677669529663687 -0.2767766952966369  0.7853981633974483 0 0</pose>
+        <inertial>
+          <mass>3.375</mass>
+          <inertia>
+            <ixx>0.071015625</ixx>
+            <iyy>0.071015625</iyy>
+            <izz>0.0014062500000000004</izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.05 0.05 0.5</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.05 0.05 0.5</size>
+            </box>
+          </geometry>
+        </visual>
+      </link>
+      <joint name="lower_joint" type="revolute">
+        <pose>0 0 0.25  0 0 0</pose>
+        <parent>upper_link</parent>
+        <child>lower_link</child>
+        <axis>
+          <xyz>1 0 0</xyz>
+        </axis>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/sdf/inertial.world b/test/worlds/inertial.world
similarity index 100%
rename from test/sdf/inertial.world
rename to test/worlds/inertial.world
diff --git a/test/worlds/Inertial_TEST.world b/test/worlds/inertial_test.world
similarity index 100%
rename from test/worlds/Inertial_TEST.world
rename to test/worlds/inertial_test.world
diff --git a/test/worlds/invalid_size_heightmap.world b/test/worlds/invalid_size_heightmap.world
new file mode 100644
index 0000000..3293fba
--- /dev/null
+++ b/test/worlds/invalid_size_heightmap.world
@@ -0,0 +1,18 @@
+<?xml version="1.0"?> 
+<sdf version="1.4">
+  <world name="default">
+    <model name="heightmap">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <heightmap>
+              <uri>file://media/materials/textures/invalid_size.png</uri>
+              <size>129 129 10</size>
+            </heightmap>
+          </geometry>
+        </collision>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/joint_test.world b/test/worlds/joint_test.world
index 004aa65..36610ea 100644
--- a/test/worlds/joint_test.world
+++ b/test/worlds/joint_test.world
@@ -8,7 +8,7 @@
                 <solver>
                     <type>quick</type>
                     <dt>0.001</dt>
-                    <iters>40</iters>
+                    <iters>1000</iters>
                     <sor>1.0</sor>
                 </solver>
                 <constraints>
@@ -30,14 +30,14 @@
                 <inertial>
                     <pose>0 0 0 0 0 0</pose>
                     <inertia>
-                        <ixx>1.000000</ixx>
+                        <ixx>200.000000</ixx>
                         <ixy>0.000000</ixy>
                         <ixz>0.000000</ixz>
-                        <iyy>1.000000</iyy>
+                        <iyy>300.000000</iyy>
                         <iyz>0.000000</iyz>
-                        <izz>1.000000</izz>
+                        <izz>400.000000</izz>
                     </inertia>
-                    <mass>10.000000</mass>
+                    <mass>1.000000</mass>
                 </inertial>
                 <visual name="visual_cylinder">
                     <pose>0 0 -0.5 0 0 0</pose>
@@ -61,6 +61,84 @@
                     </geometry>
                 </collision>
             </link>
+            <joint name="joint_01" type="revolute">
+              <parent>world</parent>
+              <child>link_1</child>
+              <pose>0 0 0 0 0 0</pose>
+              <axis>
+                <limit>
+                  <effort>1000.000000</effort>
+                  <velocity>1000.000000</velocity>
+                </limit>
+                <dynamics>
+                  <damping>0.000000</damping>
+                  <friction>0.000000</friction>
+                </dynamics>
+                <xyz>1.000000 0.000000 0.000000</xyz>
+              </axis>
+              <physics>
+                <provide_feedback>true</provide_feedback>
+              </physics>
+            </joint>
+            <static>0</static>
+        </model>
+        <model name="model_2">
+            <pose>2 0 0 0 0 0</pose>
+            <link name="link_1">
+                <pose>0 0 0 0 0 0</pose>
+                <inertial>
+                    <pose>0 0 0 0 0 0</pose>
+                    <inertia>
+                        <ixx>200.000000</ixx>
+                        <ixy>0.000000</ixy>
+                        <ixz>0.000000</ixz>
+                        <iyy>300.000000</iyy>
+                        <iyz>0.000000</iyz>
+                        <izz>400.000000</izz>
+                    </inertia>
+                    <mass>1.000000</mass>
+                </inertial>
+                <visual name="visual_cylinder">
+                    <pose>0 0 -0.5 0 0 0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.100000</radius>
+                            <length>1.000000</length>
+                        </cylinder>
+                    </geometry>
+                    <material>
+                        <script>Gazebo/Green</script>
+                    </material>
+                </visual>
+                <collision name="collision_cylinder">
+                    <pose>0 0 -0.5 0 0 0</pose>
+                    <geometry>
+                        <cylinder>
+                            <radius>0.100000</radius>
+                            <length>1.000000</length>
+                        </cylinder>
+                    </geometry>
+                </collision>
+            </link>
+            <joint name="joint_01" type="revolute">
+              <parent>world</parent>
+              <child>link_1</child>
+              <pose>0 0 0 0 0 0</pose>
+              <axis>
+                <limit>
+                  <effort>1000.000000</effort>
+                  <velocity>1000.000000</velocity>
+                </limit>
+                <dynamics>
+                  <damping>0.000000</damping>
+                  <friction>0.000000</friction>
+                </dynamics>
+                <xyz>0.000000 0.000000 1.000000</xyz>
+              </axis>
+              <physics>
+                <provide_feedback>true</provide_feedback>
+              </physics>
+            </joint>
             <static>0</static>
         </model>
     </world>
diff --git a/test/worlds/laser_vertical.world b/test/worlds/laser_vertical.world
new file mode 100644
index 0000000..46254de
--- /dev/null
+++ b/test/worlds/laser_vertical.world
@@ -0,0 +1,124 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="model_1">
+      <static>true</static>
+      <pose>0 0 0.5 0. 0 0</pose>
+      <link name="link_1">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+        <visual name="visual">
+          <geometry>
+            <mesh>
+              <uri>model://hokuyo/meshes/hokuyo.dae</uri>
+            </mesh>
+          </geometry>
+        </visual>
+        <collision name="collision-base">
+          <pose>0 0 -0.0145 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.05 0.041</size>
+            </box>
+          </geometry>
+        </collision>
+        <collision name="collision-top">
+          <pose>0 0 0.0205 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.021</radius>
+              <length>0.029</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <sensor name="laser_sensor" type="ray">
+          <pose>0.1 0 0.0175 0 -0 0</pose>
+          <ray>
+            <scan>
+              <horizontal>
+                <samples>320</samples>
+                <resolution>1</resolution>
+                <min_angle>-1.0</min_angle>
+                <max_angle>1.0</max_angle>
+              </horizontal>
+              <vertical>
+                <samples>3</samples>
+                <resolution>1</resolution>
+                <min_angle>-0.1</min_angle>
+                <max_angle>0.1</max_angle>
+              </vertical>
+            </scan>
+            <range>
+              <min>0.08</min>
+              <max>10.0</max>
+              <resolution>0.01</resolution>
+            </range>
+          </ray>
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+    </model>
+
+
+    <!-- a static object -->
+    <model name="cylinder_model">
+      <static>true</static>
+      <pose>6 -1.5 0 0 0 0</pose>
+      <link name="cylinder_link">
+        <visual name="cylinder_visual">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.5</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </visual>
+        <collision name="cylinder_collision">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.5</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+      </link>
+    </model>
+
+    <!-- a non-static object -->
+    <model name="box_model">
+      <static>false</static>
+      <pose>3 0.8 0 0 0 0</pose>
+      <link name="box_link">
+        <visual name="box_visual">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+            <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+        </visual>
+        <collision name="box_collision">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+            <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+        </collision>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/lift_drag_plugin.world b/test/worlds/lift_drag_plugin.world
new file mode 100644
index 0000000..834bded
--- /dev/null
+++ b/test/worlds/lift_drag_plugin.world
@@ -0,0 +1,272 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0.0 0.0 0.0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>1500</iters>
+          <sor>1.0</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>0.1</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <model name="ground_plane">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>1000 1000</size>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <cast_shadows>false</cast_shadows>
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>1000 1000</size>
+            </plane>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Grey</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+
+    <model name="lift_drag_demo_model">
+      <pose>0 0 0 0 0 0</pose>
+      <static>false</static>
+
+      <link name="body">
+        <pose>3.0 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.470</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.2</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.2</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+
+      <link name="wing_1">
+        <pose>3 0 1.5 0.1 0 0</pose>
+        <inertial>
+          <pose>0.0 5.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.470</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 5.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.0 10.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 5.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.0 10.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="wing_2">
+        <pose>3 0 1.5 -0.1 0 0</pose>
+        <inertial>
+          <pose>0.0 -5.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.470</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 -5.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.0 10.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 -5.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>1.0 10.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+
+      <joint name="body_joint" type="prismatic">
+        <parent>world</parent>
+        <child>body</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>0.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <provide_feedback>true</provide_feedback>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+      <joint name="wing_1_joint" type="revolute">
+        <parent>body</parent>
+        <child>wing_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>0 0.0 1</xyz>
+          <limit>
+            <upper>0</upper>
+            <lower>0</lower>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <provide_feedback>true</provide_feedback>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="wing_2_joint" type="revolute">
+        <parent>body</parent>
+        <child>wing_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>0 0.0 1</xyz>
+          <limit>
+            <upper>0</upper>
+            <lower>0</lower>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <provide_feedback>true</provide_feedback>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+
+      <plugin name="gazebo_wing_1" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>4.000</cla>
+        <cda>20.0</cda>
+        <cma>0.00</cma>
+        <alpha_stall>10.0</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 5.0 0</cp>
+        <area>10</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::wing_1</link_name>
+      </plugin>
+      <plugin name="gazebo_wing_2" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>4.000</cla>
+        <cda>20.0</cda>
+        <cma>0.00</cma>
+        <alpha_stall>10.0</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 -5.0 0</cp>
+        <area>10</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::wing_2</link_name>
+      </plugin>
+
+
+    </model>
+  </world>
+</sdf>
diff --git a/test/sdf/light.world b/test/worlds/light.world
similarity index 100%
rename from test/sdf/light.world
rename to test/worlds/light.world
diff --git a/test/worlds/max_vel_test.world b/test/worlds/max_vel_test.world
new file mode 100644
index 0000000..f45098f
--- /dev/null
+++ b/test/worlds/max_vel_test.world
@@ -0,0 +1,136 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <scene>
+      <ambient>0.5 0.5 0.5 1</ambient>
+      <background>0.5 0.5 0.5 1</background>
+      <shadows>false</shadows>
+    </scene>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <physics type="ode">
+      <gravity>0.0 0.0 -10.0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>100</iters>
+          <sor>1.0</sor>
+        </solver>
+        <constraints>
+          <cfm>0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>0</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <!-- model slides when cg is 0.3 0 0 -->
+    <model name="model_1">
+      <pose>0.5 -0.5 0.5 0.0 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.45 0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>1.0</izz>
+          </inertia>
+          <mass>10000.0</mass>
+        </inertial>
+        <visual name="visual_box">
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+          <laser_retro>100.0</laser_retro>
+        </visual>
+        <collision name="collision_box">
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>100.0</mu>
+                <mu2>100.0</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <kp>1000000000000.0</kp>
+                <kd>10000000000.0</kd>
+                <max_vel>0</max_vel>
+                <min_depth>0.0</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>100.0</laser_retro>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <static>false</static>
+    </model>
+    <!-- by shifting cg down, the block will not slide.
+         coupling of box rotation and the moment arm about contact points
+    <model name="model_2" static="false">
+
+      <origin pose="0.5 1.5 0.5 0 0.0 0.0"/>
+
+      <link name="link_1" self_collide="true" gravity="true" kinematic="false">
+
+        <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
+
+        <inertial mass="10000.0">
+          <origin pose="0.45 0.0 -0.5 0.0 0.0 0.0"/>
+          <inertia ixx="1.0" ixy="0.0" ixz="0.0"
+                   iyy="1.0" iyz="0.0"
+                   izz="1.0"/>
+        </inertial>
+
+        <visual name="visual_box" laser_retro="100.0">
+          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
+          <geometry>
+            <box size="1 1 1"/>
+          </geometry>
+          <material script="Gazebo/Green"/>
+        </visual>
+
+        <collision name="collision_box" laser_retro="100.0">
+          <origin pose="0.0 0.0 0.0 0.0 0.0 0.0"/>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <box size="1 1 1"/>
+          </geometry>
+          <surface>
+            <contact>
+              <ode kp="1000000000000.0" kd="100000000.0" max_vel="0"/>
+            </contact>
+          </surface>
+        </collision>
+
+      </link>
+
+    </model>
+    -->
+  </world>
+</sdf>
diff --git a/test/sdf/mesh.world b/test/worlds/mesh.world
similarity index 100%
rename from test/sdf/mesh.world
rename to test/worlds/mesh.world
diff --git a/test/worlds/multicamera_test.world b/test/worlds/multicamera_test.world
index 5198edf..2353dda 100644
--- a/test/worlds/multicamera_test.world
+++ b/test/worlds/multicamera_test.world
@@ -1,5 +1,5 @@
 <?xml version="1.0" ?>
-<sdf version="1.3">
+<sdf version="1.4">
   <world name="default">
     <include><uri>model://ground_plane</uri></include>
     <include><uri>model://sun</uri></include>
@@ -24,7 +24,7 @@
         </visual>
 
         <sensor name="cam1" type="multicamera">
-          <update_rate>15</update_rate>
+          <update_rate>10</update_rate>
           <camera name="left">
             <horizontal_fov>1.3962634</horizontal_fov>
             <image>
@@ -61,13 +61,13 @@
         </visual>
 
         <sensor name="cam2" type="multicamera">
-          <update_rate>15</update_rate>
+          <update_rate>20</update_rate>
           <camera name="left">
             <horizontal_fov>1.3962634</horizontal_fov>
             <image>
               <width>1024</width>
               <height>544</height>
-              <format>R8G8B8</format>
+              <format>L8</format>
             </image>
             <clip>
               <near>0.02</near>
@@ -80,7 +80,7 @@
             <image>
               <width>1024</width>
               <height>544</height>
-              <format>R8G8B8</format>
+              <format>L8</format>
             </image>
             <clip>
               <near>0.02</near>
@@ -111,7 +111,7 @@
         </visual>
 
         <sensor name="cam3" type="multicamera">
-          <update_rate>15</update_rate>
+          <update_rate>30</update_rate>
           <camera name="top_left">
             <pose>0 -0.1 0.1 0 0 0</pose>
             <horizontal_fov>1.3962634</horizontal_fov>
@@ -177,7 +177,7 @@
         </visual>
 
         <sensor name="cam4" type="multicamera">
-          <update_rate>15</update_rate>
+          <update_rate>40</update_rate>
           <camera name="top_left">
             <pose>0 -0.1 0.1 0 0 0</pose>
             <horizontal_fov>1.3962634</horizontal_fov>
@@ -257,7 +257,7 @@
         </visual>
 
         <sensor name="cam5" type="multicamera">
-          <update_rate>15</update_rate>
+          <update_rate>50</update_rate>
           <camera name="top_left">
             <pose>0 -0.1 0.1 0 0 0</pose>
             <horizontal_fov>1.3962634</horizontal_fov>
@@ -351,7 +351,7 @@
         </visual>
 
         <sensor name="cam6" type="multicamera">
-          <update_rate>15</update_rate>
+          <update_rate>60</update_rate>
           <camera name="top_left">
             <pose>0 -0.1 0.1 0 0 0</pose>
             <horizontal_fov>1.3962634</horizontal_fov>
diff --git a/test/worlds/not_square_heightmap.world b/test/worlds/not_square_heightmap.world
new file mode 100644
index 0000000..a6b4fca
--- /dev/null
+++ b/test/worlds/not_square_heightmap.world
@@ -0,0 +1,18 @@
+<?xml version="1.0"?> 
+<sdf version="1.4">
+  <world name="default">
+    <model name="heightmap">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <heightmap>
+              <uri>file://media/materials/textures/not_square.png</uri>
+              <size>129 129 10</size>
+            </heightmap>
+          </geometry>
+        </collision>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/test/sdf/plane.world b/test/worlds/plane.world
similarity index 100%
rename from test/sdf/plane.world
rename to test/worlds/plane.world
diff --git a/test/sdf/plugin.world b/test/worlds/plugin.world
similarity index 100%
rename from test/sdf/plugin.world
rename to test/worlds/plugin.world
diff --git a/test/sdf/pr2_20111026.world b/test/worlds/pr2_20111026.world
similarity index 100%
rename from test/sdf/pr2_20111026.world
rename to test/worlds/pr2_20111026.world
diff --git a/test/sdf_deprecated/pr2_test.world b/test/worlds/pr2_deprecated.world
similarity index 100%
rename from test/sdf_deprecated/pr2_test.world
rename to test/worlds/pr2_deprecated.world
diff --git a/test/sdf/ray.world b/test/worlds/ray.world
similarity index 100%
rename from test/sdf/ray.world
rename to test/worlds/ray.world
diff --git a/test/worlds/ray_test.world b/test/worlds/ray_test.world
new file mode 100644
index 0000000..ee3d7c1
--- /dev/null
+++ b/test/worlds/ray_test.world
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <!-- a static object -->
+    <model name="cylinder_model">
+      <static>true</static>
+      <link name="cylinder_link">
+        <visual name="cylinder_visual">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.5</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </visual>
+        <collision name="cylinder_collision">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.5</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+      </link>
+    </model>
+
+    <!-- a non-static object -->
+    <model name="box_model">
+      <static>false</static>
+      <pose>0 0.8 0 0 0 0</pose>
+      <link name="box_link">
+        <visual name="box_visual">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+            <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+        </visual>
+        <collision name="box_collision">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+            <size>1.0 1.0 1.0</size>
+            </box>
+          </geometry>
+        </collision>
+      </link>
+    </model>
+
+    <!-- a ray sensor -->
+    <include>
+      <uri>model://hokuyo</uri>
+      <pose>-1.0 0 0.5 0 0 0</pose>
+    </include>
+  </world>
+</sdf>
diff --git a/test/sdf/revolute_joint.world b/test/worlds/revolute_joint.world
similarity index 100%
rename from test/sdf/revolute_joint.world
rename to test/worlds/revolute_joint.world
diff --git a/test/worlds/revolute_joint_test.world b/test/worlds/revolute_joint_test.world
new file mode 100644
index 0000000..e0640bf
--- /dev/null
+++ b/test/worlds/revolute_joint_test.world
@@ -0,0 +1,51 @@
+<sdf version="1.4">
+  <world name="default">
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_0deg</name>
+      <pose>0 2.1 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_180deg</name>
+      <pose>0 -2.1 0 0 0 3.1416</pose>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_90deg</name>
+      <pose>-2.1 0 0 0 0 1.5708</pose>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_270deg</name>
+      <pose>2.1 0 0 0 0 -1.5708</pose>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_315deg</name>
+      <pose>1.48 1.48 0 0 0 -0.7854</pose>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_225deg</name>
+      <pose>1.48 -1.48 0 0 0 -2.3562</pose>
+      <pose>0 -2.1 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_135deg</name>
+      <pose>-1.48 -1.48 0 0 0 2.3562</pose>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_45deg</name>
+      <pose>-1.48 1.48 0 0 0 0.7854</pose>
+    </include>
+  </world>
+</sdf>
diff --git a/test/worlds/screw_joint_test.world b/test/worlds/screw_joint_test.world
new file mode 100644
index 0000000..3df5303
--- /dev/null
+++ b/test/worlds/screw_joint_test.world
@@ -0,0 +1,193 @@
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0 0 0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>1000</iters>
+          <precon_iters>0</precon_iters>
+          <sor>1.000000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <contact_max_correcting_vel>100.000000</contact_max_correcting_vel>
+          <contact_surface_layer>0.01000</contact_surface_layer>
+        </constraints>
+      </ode>
+      <bullet>
+        <solver>
+          <type>sequential_impulse</type>
+          <iters>1000</iters>
+          <sor>1.000000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <split_impulse>true</split_impulse>
+          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
+          <contact_surface_layer>0.00000</contact_surface_layer>
+        </constraints>
+      </bullet>
+      <real_time_update_rate>1000.000000</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="model_1">
+      <link name="link_00">
+        <gravity>true</gravity>
+        <pose>0 0 2 0 0 0</pose>
+        <inertial>
+          <mass>0.1</mass>
+          <pose>0 0 -0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+        </inertial>
+        <collision name="col">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="vis">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+        <visual name="vis2">
+          <pose>0 0.125 -0.5 0 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.05</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+      </link>
+      <link name="link_01">
+        <gravity>true</gravity>
+        <pose>0 0 1.0 0 0 0</pose>
+        <inertial>
+          <mass>0.1</mass>
+          <pose>0 0 -0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+        </inertial>
+        <collision name="col">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.005</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1.0</mu>
+                <mu2>1.0</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Red</name></script>
+          </material>
+        </visual>
+        <visual name="vis2">
+          <pose>0 0.125 -0.5 0 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.05</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+      </link>
+      <joint name="joint_00" type="screw">
+        <parent>world</parent>
+        <child>link_00</child>
+        <!-- copy thread pitch from pr2 -->
+        <thread_pitch>-3141.6</thread_pitch>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.7</lower>
+            <upper>1.7</upper>
+            <stiffness>1e6</stiffness>
+            <dissipation>1.0</dissipation>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="joint_01" type="screw">
+        <child>link_01</child>
+        <parent>link_00</parent>
+        <!-- copy thread pitch from pr2 -->
+        <thread_pitch>3141.6</thread_pitch>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.7</lower>
+            <upper>1.7</upper>
+            <stiffness>1e6</stiffness>
+            <dissipation>1.0</dissipation>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/simple_arm_test.world b/test/worlds/simple_arm_test.world
new file mode 100644
index 0000000..ede4bd7
--- /dev/null
+++ b/test/worlds/simple_arm_test.world
@@ -0,0 +1,548 @@
+<?xml version='1.0'?>
+<sdf version='1.5'>
+  <world name='default'>
+    <light name='sun' type='directional'>
+      <cast_shadows>1</cast_shadows>
+      <pose>0 0 10 0 -0 0</pose>
+      <diffuse>0.8 0.8 0.8 1</diffuse>
+      <specular>0.2 0.2 0.2 1</specular>
+      <attenuation>
+        <range>1000</range>
+        <constant>0.9</constant>
+        <linear>0.01</linear>
+        <quadratic>0.001</quadratic>
+      </attenuation>
+      <direction>-0.5 0.1 -0.9</direction>
+    </light>
+    <model name='ground_plane'>
+      <static>1</static>
+      <link name='link'>
+        <collision name='collision'>
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>100 100</size>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>100</mu>
+                <mu2>50</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+          </surface>
+          <max_contacts>10</max_contacts>
+        </collision>
+        <visual name='visual'>
+          <cast_shadows>0</cast_shadows>
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>100 100</size>
+            </plane>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Grey</name>
+            </script>
+          </material>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+        <gravity>1</gravity>
+      </link>
+    </model>
+    <model name='simple_arm'>
+      <link name='arm_base'>
+        <inertial>
+          <pose>0 0 0.00099 0 -0 0</pose>
+          <inertia>
+            <ixx>1.11</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>100.11</iyy>
+            <iyz>0</iyz>
+            <izz>1.01</izz>
+          </inertia>
+          <mass>101</mass>
+        </inertial>
+        <collision name='arm_base_geom'>
+          <pose>0 0 0.05 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 0.1</size>
+            </box>
+          </geometry>
+          <max_contacts>10</max_contacts>
+          <surface>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+            <friction>
+              <ode/>
+            </friction>
+          </surface>
+        </collision>
+        <visual name='arm_base_geom_visual'>
+          <pose>0 0 0.05 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 0.1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Blue</name>
+            </script>
+          </material>
+        </visual>
+        <collision name='arm_base_geom_arm_trunk'>
+          <pose>0 0 0.6 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>1</length>
+            </cylinder>
+          </geometry>
+          <max_contacts>10</max_contacts>
+          <surface>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+            <friction>
+              <ode/>
+            </friction>
+          </surface>
+        </collision>
+        <visual name='arm_base_geom_arm_trunk_visual'>
+          <pose>0 0 0.6 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>1</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Red</name>
+            </script>
+          </material>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+        <gravity>1</gravity>
+      </link>
+      <link name='arm_shoulder_pan'>
+        <pose>0 0 1.1 0 -0 0</pose>
+        <inertial>
+          <pose>0.045455 0 0 0 -0 0</pose>
+          <inertia>
+            <ixx>0.011</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.0225</iyy>
+            <iyz>0</iyz>
+            <izz>0.0135</izz>
+          </inertia>
+          <mass>1.1</mass>
+        </inertial>
+        <collision name='arm_shoulder_pan_geom'>
+          <pose>0 0 0.05 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <max_contacts>10</max_contacts>
+          <surface>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+            <friction>
+              <ode/>
+            </friction>
+          </surface>
+        </collision>
+        <visual name='arm_shoulder_pan_geom_visual'>
+          <pose>0 0 0.05 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Yellow</name>
+            </script>
+          </material>
+        </visual>
+        <collision name='arm_shoulder_pan_geom_arm_shoulder'>
+          <pose>0.55 0 0.05 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>1 0.05 0.1</size>
+            </box>
+          </geometry>
+          <max_contacts>10</max_contacts>
+          <surface>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+            <friction>
+              <ode/>
+            </friction>
+          </surface>
+        </collision>
+        <visual name='arm_shoulder_pan_geom_arm_shoulder_visual'>
+          <pose>0.55 0 0.05 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>1 0.05 0.1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Yellow</name>
+            </script>
+          </material>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+        <gravity>1</gravity>
+      </link>
+      <link name='arm_elbow_pan'>
+        <pose>1.05 0 1.1 0 -0 0</pose>
+        <inertial>
+          <pose>0.0875 0 0.083333 0 -0 0</pose>
+          <inertia>
+            <ixx>0.031</ixx>
+            <ixy>0</ixy>
+            <ixz>0.005</ixz>
+            <iyy>0.07275</iyy>
+            <iyz>0</iyz>
+            <izz>0.04475</izz>
+          </inertia>
+          <mass>1.2</mass>
+        </inertial>
+        <collision name='arm_elbow_pan_geom'>
+          <pose>0 0 0.1 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>0.2</length>
+            </cylinder>
+          </geometry>
+          <max_contacts>10</max_contacts>
+          <surface>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+            <friction>
+              <ode/>
+            </friction>
+          </surface>
+        </collision>
+        <visual name='arm_elbow_pan_geom_visual'>
+          <pose>0 0 0.1 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>0.2</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Red</name>
+            </script>
+          </material>
+        </visual>
+        <collision name='arm_elbow_pan_geom_arm_elbow'>
+          <pose>0.3 0 0.15 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>0.5 0.03 0.1</size>
+            </box>
+          </geometry>
+          <max_contacts>10</max_contacts>
+          <surface>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+            <friction>
+              <ode/>
+            </friction>
+          </surface>
+        </collision>
+        <visual name='arm_elbow_pan_geom_arm_elbow_visual'>
+          <pose>0.3 0 0.15 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>0.5 0.03 0.1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Yellow</name>
+            </script>
+          </material>
+        </visual>
+        <collision name='arm_elbow_pan_geom_arm_wrist'>
+          <pose>0.55 0 0.15 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>0.3</length>
+            </cylinder>
+          </geometry>
+          <max_contacts>10</max_contacts>
+          <surface>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+            <friction>
+              <ode/>
+            </friction>
+          </surface>
+        </collision>
+        <visual name='arm_elbow_pan_geom_arm_wrist_visual'>
+          <pose>0.55 0 0.15 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>0.3</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Red</name>
+            </script>
+          </material>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+        <gravity>1</gravity>
+      </link>
+      <link name='arm_wrist_lift'>
+        <pose>1.6 0 1.05 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.001</izz>
+          </inertia>
+          <mass>0.1</mass>
+        </inertial>
+        <collision name='arm_wrist_lift_geom'>
+          <pose>0 0 0.5 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.03</radius>
+              <length>1</length>
+            </cylinder>
+          </geometry>
+          <max_contacts>10</max_contacts>
+          <surface>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+            <friction>
+              <ode/>
+            </friction>
+          </surface>
+        </collision>
+        <visual name='arm_wrist_lift_geom_visual'>
+          <pose>0 0 0.5 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.03</radius>
+              <length>1</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Yellow</name>
+            </script>
+          </material>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+        <gravity>1</gravity>
+      </link>
+      <link name='arm_wrist_roll'>
+        <pose>1.6 0 1 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.001</izz>
+          </inertia>
+          <mass>0.1</mass>
+        </inertial>
+        <collision name='arm_wrist_roll_geom'>
+          <pose>0 0 0.025 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>0.05</length>
+            </cylinder>
+          </geometry>
+          <max_contacts>10</max_contacts>
+          <surface>
+            <contact>
+              <ode/>
+            </contact>
+            <bounce/>
+            <friction>
+              <ode/>
+            </friction>
+          </surface>
+        </collision>
+        <visual name='arm_wrist_roll_geom_visual'>
+          <pose>0 0 0.025 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>0.05</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Red</name>
+            </script>
+          </material>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+        <gravity>1</gravity>
+      </link>
+      <joint name='arm_shoulder_pan_joint' type='revolute'>
+        <parent>arm_base</parent>
+        <child>arm_shoulder_pan</child>
+        <axis>
+          <dynamics>
+            <damping>1</damping>
+            <friction>0</friction>
+          </dynamics>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>1</use_parent_model_frame>
+          <limit>
+            <lower>-1e+16</lower>
+            <upper>1e+16</upper>
+          </limit>
+        </axis>
+      </joint>
+      <joint name='arm_elbow_pan_joint' type='revolute'>
+        <parent>arm_shoulder_pan</parent>
+        <child>arm_elbow_pan</child>
+        <axis>
+          <dynamics>
+            <damping>1</damping>
+            <friction>0</friction>
+          </dynamics>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>1</use_parent_model_frame>
+          <limit>
+            <lower>-1e+16</lower>
+            <upper>1e+16</upper>
+          </limit>
+        </axis>
+      </joint>
+      <joint name='arm_wrist_lift_joint' type='prismatic'>
+        <parent>arm_elbow_pan</parent>
+        <child>arm_wrist_lift</child>
+        <axis>
+          <dynamics>
+            <damping>1</damping>
+            <friction>0</friction>
+          </dynamics>
+          <limit>
+            <lower>-0.8</lower>
+            <upper>0.1</upper>
+          </limit>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>1</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name='arm_wrist_roll_joint' type='revolute'>
+        <parent>arm_wrist_lift</parent>
+        <child>arm_wrist_roll</child>
+        <axis>
+          <dynamics>
+            <damping>1</damping>
+            <friction>0</friction>
+          </dynamics>
+          <limit>
+            <lower>-2.99999</lower>
+            <upper>2.99999</upper>
+          </limit>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>1</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>0</static>
+    </model>
+    <physics type='ode'>
+      <max_step_size>0.001</max_step_size>
+      <real_time_factor>1</real_time_factor>
+      <real_time_update_rate>1000</real_time_update_rate>
+      <gravity>0 0 -9.8</gravity>
+    </physics>
+  </world>
+</sdf>
diff --git a/test/worlds/simple_pendulums.world b/test/worlds/simple_pendulums.world
new file mode 100644
index 0000000..d014e1c
--- /dev/null
+++ b/test/worlds/simple_pendulums.world
@@ -0,0 +1,262 @@
+<?xml version="1.0" ?>
+<sdf version="1.3">
+  <!-- model_1: pendulum rod body and a sphere point mass attached by fixed
+                joint at the end of the rod.
+       model_2: pendulum rod body with same mass properties as model_1.
+       model_3: same as model_2 but perpendicular to it.
+  -->
+  <world name="default">
+    <gui>
+      <camera name="user_camera">
+        <pose>-25 -15 12.053900 0.000000 0.2 0.352194</pose>
+      </camera>
+    </gui>
+    <scene>
+      <ambient>0.5 0.5 0.5 1</ambient>
+      <background>0.5 0.5 0.5 1</background>
+      <shadows>false</shadows>
+    </scene>
+    <include><uri>model://sun</uri></include>
+    <physics type="ode">
+      <gravity>0.0 0.0 -9.81</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <dt>0.001</dt>
+          <iters>1000</iters>
+          <sor>1.0</sor>
+        </solver>
+        <constraints>
+          <cfm>0</cfm>
+          <erp>1.0</erp>
+          <contact_max_correcting_vel>0.0</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+    </physics>
+    <model name="model_1">
+      <pose>0.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1e-1</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1e-1</iyy>
+            <iyz>0.0</iyz>
+            <izz>1e-1</izz>
+          </inertia>
+          <mass>5.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+        </axis>
+      </joint>
+      <link name="link_2">
+        <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1e-1</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1e-1</iyy>
+            <iyz>0.0</iyz>
+            <izz>1e-1</izz>
+          </inertia>
+          <mass>5.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_sphere">
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/Red</script>
+          </material>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_1" type="revolute">
+        <parent>link_1</parent>
+        <child>link_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+            <effort>0</effort>
+            <velocity>0</velocity>
+          </limit>
+          <xyz>0 0 1</xyz>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_2">
+      <pose>1.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1e-1</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1e-1</iyy>
+            <iyz>0.0</iyz>
+            <izz>1e-1</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_3">
+      <pose>0.0 -10.5 10.1 0.0 1.57079633 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1e-1</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1e-1</iyy>
+            <iyz>0.0</iyz>
+            <izz>1e-1</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>0.0 1.0 0.0</xyz>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/single_revolute_test.world b/test/worlds/single_revolute_test.world
new file mode 100644
index 0000000..f4f3462
--- /dev/null
+++ b/test/worlds/single_revolute_test.world
@@ -0,0 +1,72 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <model name="model">
+      <pose>0.0 0.0 10.1 0 0.0 0.0</pose>
+      <link name="link_1">
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1e-1</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1e-1</iyy>
+            <iyz>0.0</iyz>
+            <izz>1e-1</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+
+        <visual name="visual_sphere">
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/Red</script>
+          </material>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+      </link>
+
+      <joint name="joint" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+        </axis>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/sdf/sphere.world b/test/worlds/sphere.world
similarity index 100%
rename from test/sdf/sphere.world
rename to test/worlds/sphere.world
diff --git a/test/worlds/spring_damper_test.world b/test/worlds/spring_damper_test.world
new file mode 100644
index 0000000..2692765
--- /dev/null
+++ b/test/worlds/spring_damper_test.world
@@ -0,0 +1,706 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <scene>
+      <ambient>0.5 0.5 0.5 1</ambient>
+      <background>0.5 0.5 0.5 1</background>
+      <shadows>false</shadows>
+    </scene>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <physics type="ode">
+      <gravity>0.0 0.0 -10.0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>100</iters>
+          <sor>1.3</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>1.0</erp>
+          <contact_max_correcting_vel>10000.0</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <simbody>
+        <accuracy>0.01</accuracy>
+        <max_transient_velocity>0.01</max_transient_velocity>
+        <contact>
+          <stiffness>111.111</stiffness>
+          <dissipation>0</dissipation>
+        </contact>
+      </simbody>
+      <real_time_update_rate>0</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <!-- a test of spring, see reference from ODE discussion
+      http://www.ode.org/old_list_archives/2006-March/018014.html
+      where stiffness and damping are related to joint limit cfm and erp
+      public static void Calc(float springConstant, float dampingCofficient, float
+      sprungMass, out float erp, out float cfm)
+      {
+                  float r = 2.0f * dampingCofficient * (float)Math.Sqrt(sprungMass
+                            * springConstant);
+                  float hk = Scene.OdeTimeStep * springConstant;
+
+                  erp = hk / (hk + r);
+                  cfm = 1.0f / (hk + r);
+      }
+      in the end,
+
+        erp = dt * kp / ( dt * kp + kd )
+        cfm = 1 / ( dt * kp + kd )
+
+      or
+
+        kp = erp / (cfm * h)
+        kd = (1 - erp) / cfm
+    -->
+    <model name="model_0">
+      <pose>0.0 0.0 1.1 0 0.0 0.0</pose>
+      <link name="link_1">
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_sphere">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Grey</name></script>
+          </material>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="prismatic">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+            <stiffness>1.0e6</stiffness>
+            <dissipation>0</dissipation>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_1_prismatic">
+      <pose>0.0 0.3 1.1 0 0.0 0.0</pose>
+      <link name="link_1">
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <length>0.1</length>
+              <radius>0.1</radius>
+            </cylinder>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/White</name></script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <length>0.1</length>
+              <radius>0.1</radius>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="prismatic">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0.0</lower>
+            <upper>0.0</upper>
+            <stiffness>333.3333</stiffness>
+            <dissipation>0</dissipation>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>3.0</cfm>
+              <erp>1.0</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_1_revolute">
+      <pose>-1.0 0.3 1.1 0 0.0 0.0</pose>
+      <link name="link_1">
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>1.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0001</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0001</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0001</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_sphere">
+          <pose>1.0 0.0 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/White</name></script>
+          </material>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>1.0 0.0 0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0.0</lower>
+            <upper>0.0</upper>
+            <stiffness>333.3333</stiffness>
+            <dissipation>0</dissipation>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>3.0</cfm>
+              <erp>1.0</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_2_prismatic">
+      <pose>0.0 0.6 1.1 0 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <length>0.1</length>
+              <radius>0.1</radius>
+            </cylinder>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/FlatBlack</name></script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <length>0.1</length>
+              <radius>0.1</radius>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="prismatic">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+            <stiffness>166.66667</stiffness>
+            <dissipation>0</dissipation>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>6.0</cfm>
+              <erp>1.0</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_2_revolute">
+      <pose>-1.0 0.6 1.1 0 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>1.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_sphere">
+          <pose>1.0 0.0 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/FlatBlack</name></script>
+          </material>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>1.0 0.0 0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+            <stiffness>166.66667</stiffness>
+            <dissipation>0</dissipation>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>6.0</cfm>
+              <erp>1.0</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_3_prismatic">
+      <pose>0.0 0.9 1.1 0 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <length>0.1</length>
+              <radius>0.1</radius>
+            </cylinder>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Red</name></script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <length>0.1</length>
+              <radius>0.1</radius>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="prismatic">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+            <stiffness>111.1111</stiffness>
+            <dissipation>0</dissipation>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>9.0</cfm>
+              <erp>1.0</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_3_revolute">
+      <pose>-1.0 0.9 1.1 0 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>1.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_sphere">
+          <pose>1.0 0.0 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Red</name></script>
+          </material>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>1.0 0.0 0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+            <stiffness>111.1111</stiffness>
+            <dissipation>0</dissipation>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>9.0</cfm>
+              <erp>1.0</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_4_prismatic_plugin">
+      <pose>0.0 1.2 1.1 0 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <length>0.1</length>
+              <radius>0.1</radius>
+            </cylinder>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <length>0.1</length>
+              <radius>0.1</radius>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="prismatic">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1.0</lower>
+            <upper>1.0</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+        </axis>
+      </joint>
+      <link name="link_2">
+        <pose>0.0 0.0 0.5 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_sphere">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>0.0 0.0 -0.5 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_1" type="prismatic">
+        <parent>world</parent>
+        <child>link_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1.0</lower>
+            <upper>1.0</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+        </axis>
+      </joint>
+      <plugin name="spring_test" filename="libSpringTestPlugin.so">
+        <joint_explicit>joint_0</joint_explicit>
+        <kp_explicit>111.1111</kp_explicit>
+        <kd_explicit>0</kd_explicit>
+        <joint_implicit>joint_1</joint_implicit>
+        <kp_implicit>111.1111</kp_implicit>
+        <kd_implicit>0</kd_implicit>
+      </plugin>
+      <static>false</static>
+    </model>
+    <model name="model_5_soft_contact">
+      <pose>0.0 1.2 0.0 0 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.05 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <visual name="visual_sphere">
+          <pose>0.0 0.0 0.1 0.0 0.0 0.0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Blue</name></script>
+          </material>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>0.0 0.0 0.1 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.2</mu>
+                <mu2>0.2</mu2>
+                <fdir1>1.0 0 0</fdir1>
+                <slip1>0</slip1>
+                <slip2>0</slip2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <kp>111.1111</kp>
+                <kd>0.0</kd>
+                <max_vel>10000.0</max_vel>
+                <min_depth>0.0</min_depth>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <static>false</static>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/transparency.world b/test/worlds/transparency.world
new file mode 100644
index 0000000..df43e44
--- /dev/null
+++ b/test/worlds/transparency.world
@@ -0,0 +1,85 @@
+<sdf version='1.4'>
+  <world name='default'>
+    <!-- include sun and ground plane -->
+    <include><uri>model://sun</uri></include>
+    <include><uri>model://ground_plane</uri></include>
+
+    <model name="test_model">
+      <static>true</static>
+      <link name="link">
+        <visual name="visual_00">
+          <pose>0 0 0.5  0 0 0</pose>
+          <transparency>0.0</transparency>
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+          <material><script>
+            <uri>file://media/materials/scripts/gazebo.material</uri>
+            <name>Gazebo/Grey</name>
+          </script></material>
+        </visual>
+        <visual name="visual_02">
+          <pose>2 0 0.5  0 0 0</pose>
+          <transparency>0.2</transparency>
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+          <material><script>
+            <uri>file://media/materials/scripts/gazebo.material</uri>
+            <name>Gazebo/Grey</name>
+          </script></material>
+        </visual>
+        <visual name="visual_04">
+          <pose>4 0 0.5  0 0 0</pose>
+          <transparency>0.4</transparency>
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+          <material><script>
+            <uri>file://media/materials/scripts/gazebo.material</uri>
+            <name>Gazebo/Grey</name>
+          </script></material>
+        </visual>
+        <visual name="visual_06">
+          <pose>6 0 0.5  0 0 0</pose>
+          <transparency>0.8</transparency>
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+          <material><script>
+            <uri>file://media/materials/scripts/gazebo.material</uri>
+            <name>Gazebo/Grey</name>
+          </script></material>
+        </visual>
+        <visual name="visual_08">
+          <pose>8 0 0.5  0 0 0</pose>
+          <transparency>0.8</transparency>
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+          <material><script>
+            <uri>file://media/materials/scripts/gazebo.material</uri>
+            <name>Gazebo/Grey</name>
+          </script></material>
+        </visual>
+        <visual name="visual_10">
+          <pose>10 0 0.5  0 0 0</pose>
+          <transparency>1.0</transparency>
+          <geometry>
+            <sphere><radius>0.5</radius></sphere>
+          </geometry>
+          <material><script>
+            <uri>file://media/materials/scripts/gazebo.material</uri>
+            <name>Gazebo/Grey</name>
+          </script></material>
+        </visual>
+      </link>
+    </model>
+    <gui fullscreen='0'>
+      <camera name='user_camera'>
+        <pose>5.0 -10.0 1.5  0.0 0.0 1.57079</pose>
+        <view_controller>orbit</view_controller>
+      </camera>
+    </gui>
+  </world>
+</sdf>
diff --git a/test/worlds/universal_joint_test.world b/test/worlds/universal_joint_test.world
new file mode 100644
index 0000000..428e54d
--- /dev/null
+++ b/test/worlds/universal_joint_test.world
@@ -0,0 +1,208 @@
+<sdf version="1.4">
+  <world name="default">
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <physics type="ode">
+      <gravity>0.000000 0.000000 0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>1000</iters>
+          <precon_iters>0</precon_iters>
+          <sor>1.000000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <contact_max_correcting_vel>100.000000</contact_max_correcting_vel>
+          <contact_surface_layer>0.01000</contact_surface_layer>
+        </constraints>
+      </ode>
+      <bullet>
+        <solver>
+          <type>sequential_impulse</type>
+          <iters>1000</iters>
+          <sor>1.000000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <split_impulse>true</split_impulse>
+          <split_impulse_penetration_threshold>-0.01</split_impulse_penetration_threshold>
+          <contact_surface_layer>0.00000</contact_surface_layer>
+        </constraints>
+      </bullet>
+      <real_time_update_rate>0.000000</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <model name="model_1">
+      <link name="link_00">
+        <gravity>true</gravity>
+        <pose>0 0 2 0 0 0</pose>
+        <inertial>
+          <mass>0.1</mass>
+          <pose>0 0 -0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+        </inertial>
+        <collision name="col">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="vis">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+        <visual name="vis2">
+          <pose>0 0.125 -0.5 0 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.05</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+      </link>
+      <link name="link_01">
+        <gravity>true</gravity>
+        <pose>0 0 1.0 0 0 0</pose>
+        <inertial>
+          <mass>0.1</mass>
+          <pose>0 0 -0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+        </inertial>
+        <collision name="col">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.005</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1.0</mu>
+                <mu2>1.0</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="vis">
+          <pose>0 0 -0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.10 0.20 1.0</size>
+            </box>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Red</name></script>
+          </material>
+        </visual>
+        <visual name="vis2">
+          <pose>0 0.125 -0.5 0 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.05</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script><uri>file://media/materials/scripts/gazebo.material</uri><name>Gazebo/Green</name></script>
+          </material>
+        </visual>
+      </link>
+      
+      <joint name="joint_00" type="universal">
+        <parent>world</parent>
+        <child>link_00</child>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.7</lower>
+            <upper>1.7</upper>
+            <stiffness>1e6</stiffness>
+          </limit>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <axis2>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>-1.7</lower>
+            <upper>1.7</upper>
+            <stiffness>1e6</stiffness>
+          </limit>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis2>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="joint_01" type="universal">
+        <child>link_01</child>
+        <parent>link_00</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.7</lower>
+            <upper>1.7</upper>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+        </axis>
+        <axis2>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>-1.57</lower>
+            <upper>1.57</upper>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+        </axis2>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/white_alpha_heightmap.world b/test/worlds/white_alpha_heightmap.world
new file mode 100644
index 0000000..d7262d2
--- /dev/null
+++ b/test/worlds/white_alpha_heightmap.world
@@ -0,0 +1,18 @@
+<?xml version="1.0"?> 
+<sdf version="1.4">
+  <world name="default">
+    <model name="heightmap">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <heightmap>
+              <uri>file://media/materials/textures/white_alpha.png</uri>
+              <size>129 129 10</size>
+            </heightmap>
+          </geometry>
+        </collision>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/white_no_alpha_heightmap.world b/test/worlds/white_no_alpha_heightmap.world
new file mode 100644
index 0000000..0601b3e
--- /dev/null
+++ b/test/worlds/white_no_alpha_heightmap.world
@@ -0,0 +1,18 @@
+<?xml version="1.0"?> 
+<sdf version="1.4">
+  <world name="default">
+    <model name="heightmap">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <heightmap>
+              <uri>file://media/materials/textures/white_no_alpha.png</uri>
+              <size>129 129 10</size>
+            </heightmap>
+          </geometry>
+        </collision>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/test/worlds/zero_max_contacts.world b/test/worlds/zero_max_contacts.world
new file mode 100644
index 0000000..c37b864
--- /dev/null
+++ b/test/worlds/zero_max_contacts.world
@@ -0,0 +1,41 @@
+<?xml version="1.0" ?>
+<sdf version="1.3">
+  <world name="default">
+    <physics type="ode">
+      <max_contacts>0</max_contacts>
+    </physics>
+
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+
+    <model name="box">
+      <pose>0 0 1.0 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index 5542515..05a02ce 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -1,20 +1,30 @@
-link_directories(${urdfdom_LIBRARY_DIRS} ${urdfdom_headers_LIBRARY_DIRS} ${console_bridge_LIBRARY_DIRS})
-
 include ( ${QT_USE_FILE} )
 add_definitions(${QT_DEFINITIONS})
 
-
 include_directories( 
-  ${PROJECT_BINARY_DIR}/gazebo 
-  ${PROJECT_SOURCE_DIR}/gazebo 
-  ${tinyxml_include_dirs}
+  ${tinyxml_INCLUDE_DIRS}
   ${PROTOBUF_INCLUDE_DIR}
+  ${SDF_INCLUDE_DIRS}
+)
+
+link_directories( 
+  ${SDF_LIBRARY_DIRS}
+  ${tinyxml_LIBRARY_DIRS}
+)
+
+if (HAVE_BULLET)
+  link_directories(${BULLET_LIBRARY_DIRS})
+endif()
+
+set (test_sources 
+  gz_log_TEST.cc 
+  gz_TEST.cc
 )
 
-add_subdirectory(test)
+gz_build_tests(${test_sources})
 
 add_executable(gzsdf gzsdf.cc)
-target_link_libraries(gzsdf ${tinyxml_libraries} gazebo_sdf_interface)
+target_link_libraries(gzsdf ${tinyxml_LIBRARIES} gazebo_common)
 gz_install_executable(gzsdf)
 
 add_executable(gztopic gztopic.cc)
@@ -22,19 +32,36 @@ target_link_libraries(gztopic gazebo_msgs gazebo_common gazebo_transport pthread
 gz_install_executable(gztopic)
 
 add_executable(gzlog gzlog.cc)
-target_link_libraries(gzlog gazebo_common gazebo_physics gazebo_transport gazebo_sensors gazebo_msgs gazebo_sdf_interface pthread)
+target_link_libraries(gzlog gazebo_common gazebo_physics gazebo_transport gazebo_sensors gazebo_msgs pthread)
 gz_install_executable(gzlog)
 
 add_executable(gzstats gzstats.cc)
 target_link_libraries(gzstats gazebo_msgs gazebo_common gazebo_transport pthread)
 gz_install_executable(gzstats)
 
-#add_executable(sdf2pov sdf2pov.cc)
-#target_link_libraries(sdf2pov gazebo_common gazebo_sdf_interface)
-#gz_install_executable(sdf2pov)
-
 add_executable(gzfactory gzfactory.cc)
-target_link_libraries(gzfactory gazebo_common gazebo_transport ${Boost_LIBRARIES} pthread)
+target_link_libraries(gzfactory gazebo_common gazebo_transport pthread)
 gz_install_executable(gzfactory)
 
-install (FILES gzmodel_create.sh DESTINATION ${BIN_INSTALL_DIR})
+if (${GAZEBO_VERSION} VERSION_GREATER 3.0)
+  message (WARNING
+    "Installing deprecated manpages. This should be removed after Gazebo 3.0")
+  manpage(gzfactory 1)
+  manpage(gzlog 1)
+  manpage(gzsdf 1)
+  manpage(gzstats 1)
+  manpage(gztopic 1)
+endif()
+
+add_executable(gz gz.cc gz_topic.cc gz_log.cc)
+target_link_libraries(gz
+ gazebo_msgs gazebo_common gazebo_transport gazebo_gui gazebo_physics
+ gazebo_sensors ${QT_LIBRARIES} ${Boost_LIBRARIES} pthread)
+gz_install_executable(gz)
+
+roffman(gz 1)
+
+install (PROGRAMS gzmodel_create gzmodel_create DESTINATION ${BIN_INSTALL_DIR})
+
+install (PROGRAMS gzprop DESTINATION ${BIN_INSTALL_DIR})
+manpage(gzprop 1)
diff --git a/tools/api_checker.bash b/tools/api_checker.bash
new file mode 100755
index 0000000..b770ec2
--- /dev/null
+++ b/tools/api_checker.bash
@@ -0,0 +1,170 @@
+#!/bin/bash
+
+# This script will run an API/ABI compliance check on your working copy of
+# Gazebo.  Along the way, it will install a system version of Gazebo (by
+# default, the latest available).  You'll be prompted as needed for sudo access
+# and to confirm the installation steps.
+#
+# We assume that your system is already configured to use the OSRF apt 
+# repository (build.osrfoundation.org).  If you haven't done that step yet, read
+# about it here:
+#   http://gazebosim.org/wiki/2.0/install#Ubuntu_Debians
+
+USAGE=$'api_checker.bash [-n] <gazebo_source_dir>
+  -n : Do not install latest Gazebo via apt-get (assumes that you have already installed the version that you want to compare against)'
+
+# Stop on error
+set -e
+
+# Parse args
+install_gazebo=1
+if [[ $# -lt 1 ]]; then
+  echo "$USAGE"
+  exit 1
+elif [[ $# -gt 1 ]]; then
+  if [[ $1 == "-n" ]]; then
+    install_gazebo=0
+    srcdir=$2
+    # Do we have gazebo or gazebo-current installed?
+    gazebo_name="gazebo-current"
+    if ! dpkg -l $gazebo_name > /dev/null || [[ `dpkg -L $gazebo_name | wc | awk {'print $1'}` -lt 2 ]]; then
+      gazebo_name="gazebo"
+      if ! dpkg -l $gazebo_name > /dev/null || [[ `dpkg -L $gazebo_name | wc | awk {'print $1'}` -lt 2 ]]; then
+        echo "Couldn't find an existing installation of gazebo or gazebo-current, and you passed -n, telling me not to install gazebo-current."
+        exit 1
+      fi
+    fi
+    echo "Found installation of $gazebo_name."
+  else
+    echo "$USAGE"
+    exit 1
+  fi
+else
+  srcdir=$1
+  gazebo_name="gazebo-current"
+fi
+
+# Convert to absolute path, in case the developer gave something like '..'
+GAZEBO_SOURCE_DIR=$(readlink -f $srcdir)
+GAZEBO_BRANCH=$(cd $GAZEBO_SOURCE_DIR && hg branch)
+
+# Install Gazebo and some tools we'll need
+sudo apt-get update
+if [[ $install_gazebo -eq 1 ]]; then
+  sudo apt-get install $gazebo_name
+fi
+sudo apt-get install exuberant-ctags git 
+# Also install things that are needed to build Gazebo.  We want to ensure 
+# that we end up with the same set of system packages, especially the optional
+# ones, that are used in building the Gazebo .deb.  For now, I'm copying in the
+# Build-Depends from precise/debian/control.  That's not ideal, but will
+# probably work.
+sudo apt-get install cmake \
+     debhelper \
+     doxygen \
+     doxygen-latex \
+     libfreeimage-dev \
+     libprotoc-dev \
+     libprotobuf-dev \
+     protobuf-compiler \
+     freeglut3-dev \
+     libcurl4-openssl-dev \
+     libtinyxml-dev \
+     libtar-dev \
+     libtbb-dev \
+     libogre-dev \
+     libxml2-dev \
+     pkg-config \
+     libqt4-dev \
+     libboost-thread-dev \
+     libboost-signals-dev \
+     libboost-system-dev \
+     libboost-filesystem-dev \
+     libboost-program-options-dev \
+     libboost-regex-dev \
+     libboost-iostreams-dev \
+     robot-player-dev \
+     libcegui-mk2-dev \
+     libavformat-dev \
+     libavcodec-dev \
+     libswscale-dev \
+     sdformat
+
+# Install abi-compliance-checker.git
+TMPDIR=$(mktemp -d)
+mkdir $TMPDIR/source $TMPDIR/build $TMPDIR/install $TMPDIR/config
+cd $TMPDIR/source
+git clone git://github.com/lvc/abi-compliance-checker.git  
+cd abi-compliance-checker
+perl Makefile.pl -install --prefix=$TMPDIR/install
+
+# Figure out which libraries we're going to compare and what version of Gazebo
+# we're working with.
+GAZEBO_LIBS=$(dpkg -L $gazebo_name | grep lib.*.so)
+GAZEBO_LIBS_LOCAL=$(dpkg -L $gazebo_name | grep lib.*.so | sed -e "s:^/usr:$TMPDIR/install:g")
+BIN_VERSION=$(dpkg -l $gazebo_name | tail -n 1 | awk '{ print  $3 }')
+MAJOR_MINOR=$(echo $BIN_VERSION | cut -d . -f 1,2)
+
+echo "We're going to compare your working copy in $srcdir with the system-installed version, which is $MAJOR_MINOR."
+
+# Build and install Gazebo.  I'm doing this as a separate build to avoid
+# unexpected interactions with the developer's own build space.  An
+# optimization would be to allow reuse of an existing build space.
+cd $TMPDIR/build
+cmake -DENABLE_TESTS_COMPILATION:BOOL=False -DCMAKE_INSTALL_PREFIX=$TMPDIR/install $GAZEBO_SOURCE_DIR
+# Assume that we can use all cores
+MAKE_JOBS=$(grep -c ^processor /proc/cpuinfo)
+make -j${MAKE_JOBS}
+make install
+
+# Generate the spec for our reference version of Gazebo.
+cat > $TMPDIR/config/pkg.xml << CURRENT_DELIM
+ <version>
+     .deb pkg version: $BIN_VERSION
+ </version>
+
+ <headers>
+   /usr/include/gazebo-$MAJOR_MINOR/gazebo
+ </headers>
+
+ <skip_headers>
+   /usr/include/gazebo-$MAJOR_MINOR/gazebo/GIMPACT
+   /usr/include/gazebo-$MAJOR_MINOR/gazebo/opcode
+   /usr/include/gazebo-$MAJOR_MINOR/gazebo/test
+ </skip_headers>
+
+ <libs>
+  $GAZEBO_LIBS
+ </libs>
+CURRENT_DELIM
+
+# Generate the spec for our development version of Gazebo.
+cat > $TMPDIR/config/devel.xml << DEVEL_DELIM
+ <version>
+     branch: $GAZEBO_BRANCH
+ </version>
+ 
+  <headers>
+   $TMPDIR/install/include/gazebo-$MAJOR_MINOR/gazebo
+ </headers>
+ 
+ <skip_headers>
+   $TMPDIR/install/include/gazebo-$MAJOR_MINOR/gazebo/GIMPACT
+   $TMPDIR/install/include/gazebo-$MAJOR_MINOR/gazebo/opcode
+   $TMPDIR/install/include/gazebo-$MAJOR_MINOR/gazebo/test
+ </skip_headers>
+ 
+ <libs>
+  $GAZEBO_LIBS_LOCAL
+ </libs>
+DEVEL_DELIM
+
+# Run the check
+cd $TMPDIR/config
+$TMPDIR/install/bin/abi-compliance-checker -lib gazebo -old pkg.xml -new devel.xml || true
+
+echo "Your compatibility reports are in: "
+echo "  $TMPDIR/config/compat_reports."
+echo "When you're done, you might want to remove the working directory:"
+echo "  $TMPDIR"
+
diff --git a/tools/bitbucket_pullrequests b/tools/bitbucket_pullrequests
new file mode 100755
index 0000000..49bb9ec
--- /dev/null
+++ b/tools/bitbucket_pullrequests
@@ -0,0 +1,223 @@
+#!/usr/bin/env ruby
+#/ Usage: <progname> [options]...
+#/ Get info on pull requests from gazebo's bitbucket repository
+# based on http://www.alphadevx.com/a/88-Writing-a-REST-Client-in-Ruby
+
+# to install dependencies on Ubuntu (tested with Precise, Quantal, and Raring):
+#sudo apt-get install rubygems ruby-rest-client ruby-json
+require 'rubygems'
+require 'rest_client'
+require 'json'
+require 'optparse'
+require 'date'
+
+$stderr.sync = true
+
+class BitbucketPullRequests
+  # Pull request summary
+  class Summary
+    attr_reader :id
+    attr_reader :source
+    attr_reader :destination
+    attr_reader :branch
+    attr_reader :createdOn
+
+    def initialize(jsonHash)
+      @id          = jsonHash["id"]
+      @source      = " "*12
+      @destination = " "*12
+      @branch      = ""
+      source       = jsonHash["source"]["commit"]
+      destination  = jsonHash["destination"]["commit"]
+      branch       = jsonHash["source"]["branch"]
+      @source      = source["hash"]      if !source.nil?
+      @destination = destination["hash"] if !destination.nil?
+      @branch      = branch["name"]      if !branch.nil?
+      @createdOn   = jsonHash["created_on"]
+    end
+
+    def to_s
+      @id.to_s.rjust(5, ' ') + "    " +
+        DateTime.parse(@createdOn).strftime("%Y-%m-%d") + "    " +
+        @source + "    " +
+        @destination + "    " +
+        @branch + "\n"
+    end
+
+    def date_and_string
+      [@createdOn, self.to_s]
+    end
+  end
+
+  # constructor
+  def initialize(options)
+    @url_pullrequests = 'https://bitbucket.org/api/2.0/repositories/osrf/gazebo/pullrequests'
+    @options = options
+  end
+
+  # helpers for RestClient.get calls
+  def getUrl(url)
+    puts url if @options["show-url"]
+    RestClient.get(url)
+  end
+  def getJson(url)
+    json = JSON.parse(getUrl(url).body)
+    if @options["verbose"]
+      puts JSON.pretty_generate(json)
+    end
+    json
+  end
+
+  # summary of open pull requests
+  def listPullRequests()
+    jsonHash = getJson(@url_pullrequests + "/?state=OPEN")
+
+    output = ""
+
+    # Hash of pull requests.
+    pullrequests = {}
+    jsonHash["values"].each { |pr|
+      date, str = Summary.new(pr).date_and_string
+      pullrequests[date] = str
+    }
+
+    while jsonHash.has_key? "next"
+      jsonHash = getJson(jsonHash["next"])
+      jsonHash["values"].each { |pr|
+        date, str = Summary.new(pr).date_and_string
+        pullrequests[date] = str
+      }
+    end
+
+    # Generate output sorted by creation time
+    pullrequests.keys.sort.each { |k| output += pullrequests[k] }
+
+    return output
+  end
+
+  # summary of one pull request
+  def getPullRequestSummary(id)
+    jsonHash = getJson(@url_pullrequests + "/" + id.to_s)
+    return Summary.new(jsonHash)
+  end
+
+  # diff of pull request
+  def getPullRequestDiff(id)
+    response = getUrl(@url_pullrequests + "/" + id.to_s + "/diff")
+    puts response if @options["verbose"]
+    return response
+  end
+
+  # list of files changed by pull request
+  def getPullRequestFiles(id)
+    files = []
+    diff = getPullRequestDiff(id)
+    diff.lines.map(&:chomp).each do |line|
+      if line.start_with? '+++ b/'
+        line["+++ b/"] = ""
+        files << line
+      end
+    end
+    return files
+  end
+
+  # get ids for open pull requests
+  def getOpenPullRequests()
+    jsonHash = getJson(@url_pullrequests + "/?state=OPEN")
+    ids = []
+    jsonHash["values"].each { |pr| ids << pr["id"].to_i }
+    while jsonHash.has_key? "next"
+      jsonHash = getJson(jsonHash["next"])
+      jsonHash["values"].each { |pr| ids << pr["id"].to_i }
+    end
+    return ids
+  end
+
+  # check changed files in pull request by id
+  def checkPullRequest(id, fork=true)
+    summary = getPullRequestSummary(id)
+    puts "checking pull request #{id}, branch #{summary.branch}"
+    files = getPullRequestFiles(id)
+    files_list = ""
+    files.each { |f| files_list += " " + f }
+    hg_root = `hg root`.chomp
+    `hg log -r #{summary.destination} 2>&1`
+    if $? != 0
+      puts "Unknown revision #{summary.destination}, try: hg pull"
+      return
+    end
+    `hg log -r #{summary.source} 2>&1`
+    if $? != 0
+      puts "Unknown revision #{summary.source}, try: hg pull " +
+           "(it could also be a fork)"
+      return
+    end
+    ancestor=`hg log -r "ancestor(#{summary.source},#{summary.destination})" | head -1 | sed -e 's at .*:@@'`.chomp
+    if ancestor != summary.destination
+      puts "Need to merge branch #{summary.branch} with #{summary.destination}"
+    end
+    if fork
+      # this will allow real-time console output
+      exec "echo #{files_list} | sh #{hg_root}/tools/code_check.sh --quick #{summary.source}"
+    else
+      puts `echo #{files_list} | sh "#{hg_root}"/tools/code_check.sh --quick #{summary.source}`
+    end
+  end
+end
+
+# default options
+options  = {}
+options["list"]     = false
+options["summary"]  = nil
+options["check"]    = false
+options["check_id"] = nil
+options["diff"]     = nil
+options["files"]    = nil
+options["show-url"] = false
+options["verbose"]  = false
+
+opt_parser = OptionParser.new do |o|
+  o.on("-l", "--list",
+       "List open pull requests with fields:\n" + " "*37 +
+       "[id] [source] [dest] [branch]") { |o| options["list"] = o }
+  o.on("-c", "--check [id]", Integer,
+       "")  { |o| options["check_id"] = o; options["check"] = true }
+  o.on("-d", "--diff [id]", Integer,
+       "Show diff from pull request") { |o| options["diff"] = o }
+  o.on("-f", "--files [id]", Integer,
+       "Show changed files in a pull request") { |o| options["files"] = o }
+  o.on("-s", "--summary [id]", Integer,
+       "Summarize a pull request with fields:\n" + " "*37 +
+       "[id] [source] [dest] [branch]")  { |o| options["summary"] = o }
+  o.on("-u", "--show-url",
+       "Show urls accessed") { |o| options["show-url"] = o }
+  o.on("-v", "--verbose",
+       "Verbose output") { |o| options["verbose"] = o }
+  o.on("-h", "--help", "Display this help message") do
+    puts opt_parser
+    exit
+  end
+end
+opt_parser.parse!
+
+client = BitbucketPullRequests.new(options)
+if options["list"]
+  puts client.listPullRequests()
+elsif !options["summary"].nil?
+  puts client.getPullRequestSummary(options["summary"])
+elsif !options["diff"].nil?
+  puts client.getPullRequestDiff(options["diff"])
+elsif !options["files"].nil?
+  puts client.getPullRequestFiles(options["files"])
+elsif options["check"]
+  if options["check_id"].nil?
+    # check all open pull requests
+    client.getOpenPullRequests().each { |id|
+      client.checkPullRequest(id, false)
+    }
+  else
+    client.checkPullRequest(options["check_id"])
+  end
+else
+  puts opt_parser
+end
diff --git a/tools/case_sensitive_filesystem b/tools/case_sensitive_filesystem
new file mode 100755
index 0000000..fd36241
--- /dev/null
+++ b/tools/case_sensitive_filesystem
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# Create a temporary file
+tmpFile=`mktemp /tmp/CaseSensitiveXXXXXXXX`
+if [ -f `echo $tmpFile | tr '[A-Z]' '[a-z]'` ]
+then
+  #echo Not Case Sensitive
+  rm $tmpFile
+  exit 1
+fi
+#echo Case Sensitive
+rm $tmpFile
diff --git a/tools/check_test_ran.py b/tools/check_test_ran.py
index 2e2b8a8..a6d87e6 100755
--- a/tools/check_test_ran.py
+++ b/tools/check_test_ran.py
@@ -44,6 +44,7 @@ NAME="check_test_ran.py"
 
 import os
 import sys
+import subprocess
 
 def usage():
     print("""Usage:
@@ -52,6 +53,29 @@ def usage():
     print(sys.argv)
     sys.exit(getattr(os, 'EX_USAGE', 1))
 
+def run_grep(filename, arg):
+    process = subprocess.Popen(['grep', arg, filename], stdout=subprocess.PIPE)
+    stdout, stderr = process.communicate()
+    return stdout, stderr
+
+def run_xsltproc(stylesheet, document):
+    try:
+        process = subprocess.Popen(['xsltproc', stylesheet, document], stdout=subprocess.PIPE)
+        stdout, stderr = process.communicate()
+        # Overwrite same document
+        open(document, 'w').write(stdout)
+    except OSError as err:
+        test_name = os.path.basename(document)
+        f = open(document, 'w')
+        d = {'test': test_name, 'test_file': document, 'test_no_xml': test_name.replace('.xml', '')}
+        f.write("""<?xml version="1.0" encoding="UTF-8"?>
+<testsuite tests="1" failures="1" time="1" errors="0" name="%(test)s">
+  <testcase name="test_ran" status="run" time="1" classname="%(test_no_xml)s">
+    <failure message="Unable to find xsltproc. Can not parse output test for QTest suite." type=""/>
+  </testcase>
+</testsuite>"""%d)
+        sys.exit(getattr(os, 'EX_USAGE', 1))
+
 def check_main():
     if len(sys.argv) < 2:
         usage()
@@ -74,8 +98,14 @@ def check_main():
     <failure message="Unable to find test results for %(test)s, test did not run.\nExpected results in %(test_file)s" type=""/>
   </testcase>
 </testsuite>"""%d)
+        sys.exit(getattr(os, 'EX_USAGE', 1))
+
+    # Checking if test is a QTest file
+    stdout, stderr = run_grep(test_file, "QtVersion")
+    if (stdout):
+        print("Detect QTest xml file. Converting to JUNIT ...")
+        stylesheet = os.path.dirname(os.path.abspath(__file__)) + "/qtest_to_junit.xslt"
+        run_xsltproc(stylesheet, test_file)
 
 if __name__ == '__main__':
     check_main()
-
-
diff --git a/tools/code_check.sh b/tools/code_check.sh
index 4e2cbb7..1ffbe0c 100644
--- a/tools/code_check.sh
+++ b/tools/code_check.sh
@@ -7,47 +7,156 @@ if test "$1" = "-xmldir" -a -n "$2"; then
   xmldir=$2
   mkdir -p $xmldir
   rm -rf $xmldir/*.xml
-  # Assuming that Jenkins called, the `build` directory is a sibling to the src dir
+  # Assuming that Jenkins called, the `build` directory is sibling to src dir
   builddir=../build
 else
-  # This is a heuristic guess; not every developer puts the `build` dir in the src dir
+  # This is a heuristic guess; not everyone puts the `build` dir in the src dir
   builddir=./build
 fi
 
-echo "*:gazebo/common/Plugin.hh:113" > /tmp/gazebo_cpp_check.suppress
-echo "*:gazebo/common/Plugin.hh:114" >> /tmp/gazebo_cpp_check.suppress
-echo "*:gazebo/sdf/interface/parser.cc:544" >> /tmp/gazebo_cpp_check.suppress
-echo "*:gazebo/common/STLLoader.cc:94" >> /tmp/gazebo_cpp_check.suppress
-echo "*:gazebo/common/STLLoader.cc:105" >> /tmp/gazebo_cpp_check.suppress
-echo "*:gazebo/common/STLLoader.cc:126" >> /tmp/gazebo_cpp_check.suppress
-echo "*:gazebo/common/STLLoader.cc:149" >> /tmp/gazebo_cpp_check.suppress
-echo "*:examples/plugins/custom_messages/custom_messages.cc:22" >> /tmp/gazebo_cpp_check.suppress
+# Identify cppcheck version
+CPPCHECK_VERSION=`cppcheck --version | sed -e 's at Cppcheck @@'`
+CPPCHECK_LT_157=`echo "$CPPCHECK_VERSION 1.57" | \
+                 awk '{if ($1 < $2) print 1; else print 0}'`
 
+QUICK_CHECK=0
+if test "$1" = "--quick"
+then
+  QUICK_CHECK=1
+  QUICK_SOURCE=$2
+  hg_root=`hg root`
+  if [ "$?" -ne "0" ] ; then
+    echo This is not an hg repository
+    exit
+  fi
+  cd $hg_root
+  hg log -r $QUICK_SOURCE > /dev/null
+  if [ "$?" -ne "0" ] ; then
+    echo $QUICK_SOURCE is not a valid changeset hash
+    exit
+  fi
+  CHECK_FILES=""
+  while read line; do
+    for f in $line; do
+      CHECK_FILES="$CHECK_FILES `echo $f | grep '\.[ch][ch]*$' | grep -v '^deps'`"
+    done
+  done
+  CPPCHECK_FILES="$CHECK_FILES"
+  CPPLINT_FILES="$CHECK_FILES"
+  QUICK_TMP=`mktemp -t asdfXXXXXXXXXX`
+else
+  CHECK_DIRS="./plugins ./gazebo ./tools ./examples ./test/integration"\
+" ./test/regression ./interfaces ./test/performance"\
+" ./test/examples ./test/plugins"\
+" ./test/cmake ./test/pkgconfig ./test/ServerFixture.*"
+  if [ $CPPCHECK_LT_157 -eq 1 ]; then
+    # cppcheck is older than 1.57, so don't check header files (issue #907)
+    CPPCHECK_FILES=`find $CHECK_DIRS -name "*.cc"`
+  else
+    CPPCHECK_FILES=`find $CHECK_DIRS -name "*.cc" -o -name "*.hh"`
+  fi
+  CPPLINT_FILES=`\
+    find $CHECK_DIRS -name "*.cc" -o -name "*.hh" -o -name "*.c" -o -name "*.h"`
+fi
+
+SUPPRESS=/tmp/gazebo_cpp_check.suppress
+echo "*:gazebo/common/STLLoader.cc:94" > $SUPPRESS
+echo "*:gazebo/common/STLLoader.cc:105" >> $SUPPRESS
+echo "*:gazebo/common/STLLoader.cc:126" >> $SUPPRESS
+echo "*:gazebo/common/STLLoader.cc:149" >> $SUPPRESS
+echo "*:examples/plugins/custom_messages/custom_messages.cc:22" >> $SUPPRESS
+# Not defined FREEIMAGE_COLORORDER
+echo "*:gazebo/common/Image.cc:1" >> $SUPPRESS
+
+# The follow suppression is useful when checking for missing includes.
+# It's disable for now because checking for missing includes is very
+# time consuming. See CPPCHECK_CMD3.
+echo "missingIncludeSystem" >> $SUPPRESS
 
 #cppcheck
+CPPCHECK_BASE="cppcheck -DGAZEBO_VISIBLE=1 -q --suppressions-list=$SUPPRESS"
+if [ $CPPCHECK_LT_157 -eq 0 ]; then
+  # use --language argument if 1.57 or greater (issue #907)
+  CPPCHECK_BASE="$CPPCHECK_BASE --language=c++"
+fi
+CPPCHECK_INCLUDES="-I gazebo/rendering/skyx/include -I . -I $builddir"\
+" -I $builddir/gazebo/msgs -I deps -I deps/opende/include -I test"
+CPPCHECK_RULES="--rule-file=./tools/cppcheck_rules/issue_581.rule"\
+" --rule-file=./tools/cppcheck_rules/issue_906.rule"
+CPPCHECK_CMD1A="-j 4 --enable=style,performance,portability,information"
+CPPCHECK_CMD1B="$CPPCHECK_RULES $CPPCHECK_FILES"
+CPPCHECK_CMD1="$CPPCHECK_CMD1A $CPPCHECK_CMD1B"
+# This command used to be part of the script but was removed since our API
+# provides many functions that Gazebo does not use internally
+CPPCHECK_CMD2="--enable=unusedFunction $CPPCHECK_FILES"
+
+# Checking for missing includes is very time consuming. This is disabled
+# for now
+# CPPCHECK_CMD3="-j 4 --enable=missingInclude $CPPCHECK_FILES"\
+# " $CPPCHECK_INCLUDES"
+CPPCHECK_CMD3=""
+
 if [ $xmlout -eq 1 ]; then
-  # Run most of the checks in parallel
-  (cppcheck --xml --enable=style,performance,portability,information --rule-file=./tools/cppcheck_rules/issue_581.rule -j 4 -q --suppressions-list=/tmp/gazebo_cpp_check.suppress `find ./plugins ./gazebo ./tools ./examples ./test/regression ./interfaces -name "*.cc"`) 2> $xmldir/cppcheck.xml 
+  # Performance, style, portability, and information
+  ($CPPCHECK_BASE --xml $CPPCHECK_CMD1) 2> $xmldir/cppcheck.xml
 
-  # Unused function checking must happen in one job
-  (cppcheck --xml --enable=unusedFunction -q --suppressions-list=/tmp/gazebo_cpp_check.suppress `find ./plugins ./gazebo ./tools ./examples ./test/regression ./interfaces -name "*.cc"`) 2> $xmldir/cppcheck-unused-functions.xml 
+  # Check the configuration
+  ($CPPCHECK_BASE --xml $CPPCHECK_CMD3) 2> $xmldir/cppcheck-configuration.xml
+elif [ $QUICK_CHECK -eq 1 ]; then
+  for f in $CHECK_FILES; do
+    prefix=`basename $f | sed -e 's@\..*$@@'`
+    ext=`echo $f | sed -e 's@^.*\.@@'`
+    tmp2="$QUICK_TMP"."$ext"
+    tmp2base=`basename "$QUICK_TMP"`
+    hg cat -r $QUICK_SOURCE $hg_root/$f > $tmp2
 
-  # Finally, check the configuration
-  (cppcheck --xml --enable=missingInclude -q -j 4 --suppressions-list=/tmp/gazebo_cpp_check.suppress `find ./plugins ./gazebo ./tools ./examples ./test/regression ./interfaces -name "*.cc"` -I gazebo -I gazebo/rendering/skyx/include -I . -I $builddir -I $builddir/gazebo -I $builddir/gazebo/msgs -I deps -I deps/opende/include -I test --check-config) 2> $xmldir/cppcheck-configuration.xml
-else
-  # Run most of the checks in parallel
-  cppcheck --enable=style,performance,portability,information --rule-file=./tools/cppcheck_rules/issue_581.rule -j 4 -q --suppressions-list=/tmp/gazebo_cpp_check.suppress `find ./plugins ./gazebo ./tools ./examples ./test/regression ./interfaces -name "*.cc"` 
+    # Fix suppressions for tmp files
+    sed -i -e "s@$f@$tmp2@" $SUPPRESS
 
-  # Unused function checking must happen in one job
-  cppcheck --enable=unusedFunction -q --suppressions-list=/tmp/gazebo_cpp_check.suppress `find ./plugins ./gazebo ./tools ./examples ./test/regression ./interfaces -name "*.cc"` 
+    # Skip cppcheck for header files if cppcheck is old
+    DO_CPPCHECK=0
+    if [ $ext = 'cc' ]; then
+      DO_CPPCHECK=1
+    elif [ $CPPCHECK_LT_157 -eq 0 ]; then
+      DO_CPPCHECK=1
+    fi 
 
-  # Finally, check the configuration
-  cppcheck --enable=missingInclude -q -j 4 --suppressions-list=/tmp/gazebo_cpp_check.suppress `find ./plugins ./gazebo ./tools ./examples ./test/regression ./interfaces -name "*.cc"` -I gazebo -I gazebo/rendering/skyx/include -I . -I $builddir -I $builddir/gazebo -I $builddir/gazebo/msgs -I deps -I deps/opende/include -I test --check-config
+    if [ $DO_CPPCHECK -eq 1 ]; then
+      $CPPCHECK_BASE $CPPCHECK_CMD1A $CPPCHECK_RULES $tmp2 2>&1 \
+        | sed -e "s@$tmp2@$f at g" \
+        | grep -v 'use --check-config for details' \
+        | grep -v 'Include file: .*not found'
+    fi
+
+    # Undo changes to suppression file
+    sed -i -e "s@$tmp2@$f@" $SUPPRESS
+
+    python $hg_root/tools/cpplint.py $tmp2 2>&1 \
+      | sed -e "s@$tmp2@$f at g" -e "s@$tmp2base@$prefix at g" \
+      | grep -v 'Total errors found: 0'
+
+    rm $tmp2
+  done
+  rm $QUICK_TMP
+else
+  # Performance, style, portability, and information
+  $CPPCHECK_BASE $CPPCHECK_CMD1 2>&1
+
+  # Check the configuration
+  $CPPCHECK_BASE $CPPCHECK_CMD3 2>&1
 fi
 
 # cpplint
 if [ $xmlout -eq 1 ]; then
-  (find ./gazebo ./tools ./plugins ./examples ./test/regression ./interfaces -print0 -name "*.cc" -o -name "*.hh" -o -name "*.c" -o -name "*.h" | xargs -0 python tools/cpplint.py 2>&1) | python tools/cpplint_to_cppcheckxml.py 2> $xmldir/cpplint.xml
+  (echo $CPPLINT_FILES | xargs python tools/cpplint.py 2>&1) \
+    | python tools/cpplint_to_cppcheckxml.py 2> $xmldir/cpplint.xml
+elif [ $QUICK_CHECK -eq 0 ]; then
+  echo $CPPLINT_FILES | xargs python tools/cpplint.py 2>&1
+fi
+
+# msg_check.py
+if [ $xmlout -eq 1 ]; then
+  ./tools/msg_check.py xml 2> $xmldir/msg_check.xml
 else
-  find ./gazebo ./tools ./plugins ./examples ./test/regression ./interfaces -print0 -name "*.cc" -o -name "*.hh" -o -name "*.c" -o -name "*.h" | xargs -0 python tools/cpplint.py 2>&1
+  ./tools/msg_check.py 2>&1
 fi
diff --git a/tools/cppcheck_rules/issue_906.rule b/tools/cppcheck_rules/issue_906.rule
new file mode 100644
index 0000000..33119dc
--- /dev/null
+++ b/tools/cppcheck_rules/issue_906.rule
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<rule version="1">
+  <pattern>[^:] isinf</pattern>
+  <message>
+    <id>isinfWithoutNamespace</id>
+    <severity>warning</severity>
+    <summary>
+      Calling isinf without namespace prefix causes problems on osx.
+      Use std::isinf instead.
+    </summary>
+  </message>
+</rule>
diff --git a/tools/gazebo.bash-completion b/tools/gazebo.bash-completion
new file mode 100644
index 0000000..6ce1fc6
--- /dev/null
+++ b/tools/gazebo.bash-completion
@@ -0,0 +1,57 @@
+# gazebo bash completion
+
+shopt -s extglob
+
+function _gz
+{
+  local prev cur cmd opts
+  local gz="$1"
+  COMPREPLY=()
+  cur="$2"
+  prev="$3"
+
+  # searching for the command
+  for ((i=1; $i<=$COMP_CWORD; i++)); do
+	  if [[ ${COMP_WORDS[i]} != -* ]]; then
+		  cmd="${COMP_WORDS[i]}"
+      break
+    fi
+  done
+
+  if [[ "$cur" == -* ]] || [[ "$prev" != "gz" ]]; then
+
+    if [[ "$cmd" == "topic" ]]; then
+      case ${prev} in
+        -e|--echo|-i|--info|-v|--view|-z|--hz|-b|--bw)
+          opts=`gz topic -l 2>/dev/null`
+          COMPREPLY=($(compgen -W "$opts" -- ${cur}))
+          return
+          ;;
+      esac;
+    elif [[ "$cmd" == "camera" ]]; then
+      case ${prev} in
+        -c|--camera-name)
+          opts=`gz camera -l 2>/dev/null`
+          COMPREPLY=($(compgen -W "$opts" -- ${cur}))
+          return
+          ;;
+      esac;
+    fi
+
+    if [[ "$cmd" == "help" ]]; then
+      opts=`gz debug`
+    elif [[ "$cur" == -* ]]; then
+      opts=`gz debug -o "$cmd"`
+    else
+      COMPREPLY=($(compgen -f  -- "${COMP_WORDS[${COMP_CWORD}]}" ))
+      complete -o filenames -o nospace -F "_gz" "gz"
+      return
+    fi
+
+  else
+    opts=`gz debug`
+  fi
+
+  COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
+}
+complete  -F "_gz" "gz"
diff --git a/tools/gz.1.roff b/tools/gz.1.roff
new file mode 100644
index 0000000..9d80192
--- /dev/null
+++ b/tools/gz.1.roff
@@ -0,0 +1,505 @@
+.TH "GZ" "1" "March 2014" "" ""
+.
+.SH "NAME"
+\fBgz\fR \- Gazebo command line tool for control and analysis.
+.
+.SH "SYNPOSIS"
+\fBgz\fR \fIcommand\fR [option]\.\.\. [argument]\.\.\.
+.
+.UNINDENT
+.SH COMMANDS
+.UNINDENT
+.SS camera
+.sp
+.nf
+.ft C
+gz camera [options]
+.ft P
+.fi
+.sp
+
+Change properties of a camera. If a name for the world,
+option -w, is not specified, the first world found on
+the Gazebo master will be used.
+A camera name is required.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-w, \-\-world\-name\fR=\fIarg\fR
+.
+World name.
+.TP
+.B \-c, \-\-camera\-name\fR=\fIarg\fR
+.
+Camera name. Use gz camera \-l to get a list of camera names.
+.TP
+.B \-l, \-\-list
+.
+List all cameras
+.TP
+.B \-f, \-\-follow\fR=\fIarg\fR
+.
+Model to follow.
+.UNINDENT
+.SS debug
+.sp
+.nf
+.ft C
+gz debug [options]
+.ft P
+.fi
+.sp
+
+Used primarily for bash completion, this tool
+return the completion list for a given command.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-o, \-\-option\fR=\fIarg\fR
+.
+Show the command options.
+.UNINDENT
+.SS help
+.sp
+.nf
+.ft C
+gz help [options]
+.ft P
+.fi
+.sp
+
+Output information about a gz command.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.UNINDENT
+.SS joint
+.sp
+.nf
+.ft C
+gz joint [options]
+.ft P
+.fi
+.sp
+
+Change properties of a joint. If a name for the world,
+option -w, is not specified, the first world found on
+the Gazebo master will be used.
+A model name and joint name are required.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-w, \-\-world\-name\fR=\fIarg\fR
+.
+World name.
+.TP
+.B \-m, \-\-model\-name\fR=\fIarg\fR
+.
+Model name.
+.TP
+.B \-j, \-\-joint\-name\fR=\fIarg\fR
+.
+Joint name.
+.TP
+.B \-d, \-\-delete
+.
+Delete a model.
+.TP
+.B \-f, \-\-force\fR=\fIarg\fR
+.
+Force to apply to a joint.
+.TP
+.B \-\-pos\-t\fR=\fIarg\fR
+.
+Target angle.
+.TP
+.B \-\-pos\-p\fR=\fIarg\fR
+.
+Position proportional gain.
+.TP
+.B \-\-pos\-i\fR=\fIarg\fR
+.
+Position integral gain.
+.TP
+.B \-\-pos\-d\fR=\fIarg\fR
+.
+Position differential gain.
+.TP
+.B \-\-vel\-t\fR=\fIarg\fR
+.
+Target speed.
+.TP
+.B \-\-vel\-p\fR=\fIarg\fR
+.
+Velocity proportional gain.
+.TP
+.B \-\-vel\-i\fR=\fIarg\fR
+.
+Velocity integral gain.
+.TP
+.B \-\-vel\-d\fR=\fIarg\fR
+.
+Velocity differential gain.
+.UNINDENT
+.SS log
+.sp
+.nf
+.ft C
+gz log [options]
+.ft P
+.fi
+.sp
+
+Introspect and manipulate Gazebo log files. The log
+command can also start and stop data log recording from
+an active Gazebo server.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-i, \-\-info
+.
+Output information about a log file. Log filename should be specified using the --file option
+.TP
+.B \-e, \-\-echo
+.
+Output the contents of a log file to screen.
+.TP
+.B \-s, \-\-step
+.
+Step through the contents of a log file.
+.TP
+.B \-d, \-\-record\fR=\fIarg\fR
+.
+Start/stop recording a log file from an active Gazebo server.O=stop record, 1=start recording.
+.TP
+.B \-w, \-\-world\-name\fR=\fIarg\fR
+.
+World name, used when starting or stopping recording.
+.TP
+.B \-r, \-\-raw
+.
+Output the data from echo and step without XML formatting.Used in conjuction with --echo or --step.
+.TP
+.B \-\-stamp\fR=\fIarg\fR
+.
+Add a timestamp to each line of output. Valid values are (sim,real,wall)
+.TP
+.B \-z, \-\-hz\fR=\fIarg\fR
+.
+Filter output to the specified Hz rate.Only valid for echo and step commands.
+.TP
+.B \-f, \-\-file\fR=\fIarg\fR
+.
+Path to a log file.
+.TP
+.B \-\-filter\fR=\fIarg\fR
+.
+Filter output. Valid only for the echo and step commands
+.UNINDENT
+.SS model
+.sp
+.nf
+.ft C
+gz model [options]
+.ft P
+.fi
+.sp
+
+Change properties of a model, delete a model, or
+spawn a new model. If a name for the world, option -w, is
+not pecified, the first world found on the Gazebo master
+will be used.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-m, \-\-model\-name\fR=\fIarg\fR
+.
+Model name.
+.TP
+.B \-w, \-\-world\-name\fR=\fIarg\fR
+.
+World name.
+.TP
+.B \-d, \-\-delete
+.
+Delete a model.
+.TP
+.B \-f, \-\-spawn\-file\fR=\fIarg\fR
+.
+Spawn model from SDF file.
+.TP
+.B \-s, \-\-spawn\-string
+.
+Spawn model from SDF string, pass by a pipe.
+.TP
+.B \-x, \-\-pose\-x arg x value
+.TP
+.B \-y, \-\-pose\-y arg y value
+.TP
+.B \-z, \-\-pose\-z arg z value
+.TP
+.B \-R, \-\-pose\-R arg roll in radians.
+.TP
+.B \-P, \-\-pose\-P arg pitch in radians.
+.TP
+.B \-Y, \-\-pose\-Y arg yaw in radians.
+.UNINDENT
+.SS physics
+.sp
+.nf
+.ft C
+gz physics [options]
+.ft P
+.fi
+.sp
+
+Change properties of the physics engine on a specific
+world. If a name for the world, option -w, is not specified,
+the first world found on the Gazebo master will be used.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-w, \-\-world\-name\fR=\fIarg\fR
+.
+World name.
+.TP
+.B \-g, \-\-gravity\fR=\fIarg\fR
+.
+Gravity vector. Comma separated 3\-tuple without whitespace, eg: -g 0,0,-9.8
+.TP
+.B \-s, \-\-step\-size\fR=\fIarg\fR
+.
+Maximum step size (seconds).
+.TP
+.B \-i, \-\-iters\fR=\fIarg\fR
+.
+Number of iterations.
+.TP
+.B \-u, \-\-update\-rate\fR=\fIarg\fR
+.
+Target real\-time update rate.
+.UNINDENT
+.SS sdf
+.sp
+.nf
+.ft C
+gz sdf [options]
+.ft P
+.fi
+.sp
+
+Introspect, convert, and output SDF files.
+Use the -v option to specify the version of
+SDF for use with other options.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-d, \-\-describe
+.
+Print SDF format for given version(\-v).
+.TP
+.B \-c, \-\-convert\fR=\fIarg\fR
+.
+In place conversion of arg to the latest SDF version.
+.TP
+.B \-o, \-\-doc
+.
+Print HTML SDF. Use \-v to specify version.
+.TP
+.B \-k, \-\-check\fR=\fIarg\fR
+.
+Validate arg.
+.TP
+.B \-v, \-\-version\fR=\fIarg\fR
+.
+Version of SDF to use with other options.
+.TP
+.B \-p, \-\-print\fR=\fIarg\fR
+.
+Print arg, useful for debugging and as a conversion tool.
+.UNINDENT
+.SS stats
+.sp
+.nf
+.ft C
+gz stats [options]
+.ft P
+.fi
+.sp
+
+Print gzserver statics to standard out. If a name for the world,
+option -w, is not specified, the first world found on
+the Gazebo master will be used.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-w, \-\-world\-name\fR=\fIarg\fR
+.
+World name.
+.TP
+.B \-d, \-\-duration\fR=\fIarg\fR
+.
+Duration (seconds) to run.
+.TP
+.B \-p, \-\-plot
+.
+Output comma\-separated values, useful for processing and plotting.
+.UNINDENT
+.SS topic
+.sp
+.nf
+.ft C
+gz topic [options]
+.ft P
+.fi
+.sp
+
+Print topic information to standard out. If a name for the world,
+option -w, is not specified, the first world found on
+the Gazebo master will be used.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-w, \-\-world\-name\fR=\fIarg\fR
+.
+World name.
+.TP
+.B \-l, \-\-list
+.
+List all topics.
+.TP
+.B \-i, \-\-info\fR=\fIarg\fR
+.
+Get information about a topic.
+.TP
+.B \-e, \-\-echo\fR=\fIarg\fR
+.
+Output topic data to screen.
+.TP
+.B \-v, \-\-view\fR=\fIarg\fR
+.
+View topic data using a QT widget.
+.TP
+.B \-z, \-\-hz\fR=\fIarg\fR
+.
+Get publish frequency.
+.TP
+.B \-b, \-\-bw\fR=\fIarg\fR
+.
+Get topic bandwidth.
+.TP
+.B \-u, \-\-unformatted
+.
+Output data from echo without formatting.
+.TP
+.B \-d, \-\-duration\fR=\fIarg\fR
+.
+Duration (seconds) to run. Applicable with echo, hz, and bw
+.UNINDENT
+.SS world
+.sp
+.nf
+.ft C
+gz world [options]
+.ft P
+.fi
+.sp
+
+Change properties of a Gazebo world on a running
+server. If a name for the world, option -w, is not specified
+the first world found on the Gazebo master will be used.
+
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+.
+Print this help message
+.TP
+.B \-w, \-\-world\-name\fR=\fIarg\fR
+.
+World name.
+.TP
+.B \-p, \-\-pause\fR=\fIarg\fR
+.
+Pause/unpause simulation. 0=unpause, 1=pause.
+.TP
+.B \-s, \-\-step
+.
+Step simulation one iteration.
+.TP
+.B \-m, \-\-multi\-step\fR=\fIarg\fR
+.
+Step simulation mulitple iteration.
+.TP
+.B \-r, \-\-reset\-all
+.
+Reset time and model poses
+.TP
+.B \-t, \-\-reset\-time
+.
+Reset time
+.TP
+.B \-o, \-\-reset\-models
+.
+Reset models
diff --git a/tools/gz.cc b/tools/gz.cc
new file mode 100644
index 0000000..c51023f
--- /dev/null
+++ b/tools/gz.cc
@@ -0,0 +1,1216 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#include <signal.h>
+#include <boost/filesystem.hpp>
+#include <boost/algorithm/string.hpp>
+
+#include <gazebo/common/common.hh>
+#include <gazebo/transport/transport.hh>
+#include <sdf/sdf.hh>
+#include "gz_topic.hh"
+#include "gz_log.hh"
+#include "gz.hh"
+
+using namespace gazebo;
+
+boost::mutex Command::sigMutex;
+boost::condition_variable Command::sigCondition;
+
+std::map<std::string, Command *> g_commandMap;
+
+/////////////////////////////////////////////////
+Command::Command(const std::string &_name, const std::string &_brief)
+  : name(_name), brief(_brief), visibleOptions("Options"), argc(0), argv(NULL)
+{
+  this->visibleOptions.add_options()
+    ("help,h", "Print this help message");
+}
+
+/////////////////////////////////////////////////
+Command::~Command()
+{
+  delete [] this->argv;
+  this->argv = NULL;
+}
+
+/////////////////////////////////////////////////
+void Command::Signal()
+{
+  boost::mutex::scoped_lock lock(sigMutex);
+  sigCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+void Command::ListOptions()
+{
+  std::vector<std::string> pieces;
+
+  std::vector<boost::shared_ptr<po::option_description> >::const_iterator iter;
+  for (iter = this->visibleOptions.options().begin();
+      iter != this->visibleOptions.options().end(); ++iter)
+  {
+    pieces.clear();
+    std::string formatName = (*iter)->format_name();
+    boost::split(pieces, formatName, boost::is_any_of(" "));
+
+    if (pieces.empty())
+    {
+      std::cerr << "Unable to process list options.\n";
+      return;
+    }
+
+    // Output the short name option, or long name if there is no shortname
+    std::cout << pieces[0] << std::endl;
+
+    // Output the long name option if it exists.
+    if (pieces.size() > 3)
+      std::cout << pieces[2] << std::endl;
+  }
+}
+
+/////////////////////////////////////////////////
+void Command::Help()
+{
+  std::cerr << " gz " << this->name << " [options]\n\n";
+  this->HelpDetailed();
+  std::cerr << this->visibleOptions << "\n";
+}
+
+/////////////////////////////////////////////////
+std::string Command::GetBrief() const
+{
+  return this->brief;
+}
+
+/////////////////////////////////////////////////
+bool Command::TransportInit()
+{
+  // Some command require transport, and some do not. Only initialize
+  // transport if required.
+  if (!this->TransportRequired())
+    return true;
+
+  // Setup transport (communication)
+  if (!transport::init("", 0, 1))
+    return false;
+
+  // Run transport (communication)
+  transport::run();
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool Command::TransportRequired()
+{
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool Command::TransportFini()
+{
+  transport::fini();
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool Command::Run(int _argc, char **_argv)
+{
+  // save a copy of argc and argv for consumption by child commands
+  this->argc = _argc;
+  this->argv = new char*[_argc];
+  for (int i = 0; i < _argc; ++i)
+  {
+    int argvLen = strlen(_argv[i]) + 1;
+    this->argv[i] = new char[argvLen];
+    snprintf(this->argv[i], argvLen, "%s", _argv[i]);
+  }
+
+  // The SDF find file callback.
+  sdf::setFindCallback(boost::bind(&gazebo::common::find_file, _1));
+
+  // Hidden options
+  po::options_description hiddenOptions("hidden options");
+  hiddenOptions.add_options()
+    ("command", po::value<std::string>(), "Command")
+    ("pass", po::value<std::vector<std::string> >(), "pass through");
+
+  po::options_description allOptions("all options");
+  allOptions.add(hiddenOptions).add(this->visibleOptions);
+
+  // The command and file options are positional
+  po::positional_options_description positional;
+  positional.add("command", 1).add("pass", -1);
+
+  try
+  {
+    po::store(
+        po::command_line_parser(_argc, _argv).options(allOptions).positional(
+          positional).run(), this->vm);
+    po::notify(this->vm);
+  }
+  catch(boost::exception &_e)
+  {
+    std::cerr << "Invalid arguments\n";
+    return false;
+  }
+
+  if (this->vm.count("help"))
+  {
+    this->Help();
+    return true;
+  }
+
+  if (!this->TransportInit())
+  {
+    std::cerr << "An instance of Gazebo is not running.\n";
+    return false;
+  }
+
+  bool result = this->RunImpl();
+
+  this->TransportFini();
+
+  return result;
+}
+
+/////////////////////////////////////////////////
+WorldCommand::WorldCommand()
+  : Command("world", "Modify world properties")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("world-name,w", po::value<std::string>(), "World name.")
+    ("pause,p", po::value<bool>(), "Pause/unpause simulation. "
+     "0=unpause, 1=pause.")
+    ("step,s", "Step simulation one iteration.")
+    ("multi-step,m", po::value<uint32_t>(),
+     "Step simulation mulitple iteration.")
+    ("reset-all,r", "Reset time and model poses")
+    ("reset-time,t", "Reset time")
+    ("reset-models,o", "Reset models");
+}
+
+/////////////////////////////////////////////////
+void WorldCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tChange properties of a Gazebo world on a running\n "
+    "\tserver. If a name for the world, option -w, is not specified\n"
+    "\tthe first world found on the Gazebo master will be used.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool WorldCommand::RunImpl()
+{
+  std::string worldName;
+
+  if (this->vm.count("world-name"))
+    worldName = this->vm["world-name"].as<std::string>();
+
+  transport::NodePtr node(new transport::Node());
+  node->Init(worldName);
+
+  transport::PublisherPtr pub =
+    node->Advertise<msgs::WorldControl>("~/world_control");
+  pub->WaitForConnection();
+
+  msgs::WorldControl msg;
+  bool good = false;
+
+  if (this->vm.count("pause"))
+  {
+    msg.set_pause(this->vm["pause"].as<bool>());
+    good = true;
+  }
+
+  if (this->vm.count("step"))
+  {
+    msg.set_step(true);
+    good = true;
+  }
+
+  if (this->vm.count("multi-step"))
+  {
+    msg.set_multi_step(this->vm["multi-step"].as<uint32_t>());
+    good = true;
+  }
+
+  if (this->vm.count("reset-all"))
+  {
+    msg.mutable_reset()->set_all(true);
+    good = true;
+  }
+
+  if (this->vm.count("reset-time"))
+  {
+    msg.mutable_reset()->set_time_only(true);
+    good = true;
+  }
+
+  if (this->vm.count("reset-models"))
+  {
+    msg.mutable_reset()->set_model_only(true);
+    good = true;
+  }
+
+  if (good)
+    pub->Publish(msg, true);
+  else
+    this->Help();
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+PhysicsCommand::PhysicsCommand()
+  : Command("physics", "Modify properties of the physics engine")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("world-name,w", po::value<std::string>(), "World name.")
+    ("gravity,g", po::value<std::string>(),
+     "Gravity vector. Comma separated 3-tuple without whitespace, "
+     "eg: -g 0,0,-9.8")
+    ("step-size,s", po::value<double>(), "Maximum step size (seconds).")
+    ("iters,i", po::value<double>(), "Number of iterations.")
+    ("update-rate,u", po::value<double>(), "Target real-time update rate.");
+}
+
+/////////////////////////////////////////////////
+void PhysicsCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tChange properties of the physics engine on a specific\n"
+    "\tworld. If a name for the world, option -w, is not specified,\n"
+    "\tthe first world found on the Gazebo master will be used.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool PhysicsCommand::RunImpl()
+{
+  std::string worldName;
+
+  if (this->vm.count("world-name"))
+    worldName = this->vm["world-name"].as<std::string>();
+
+  transport::NodePtr node(new transport::Node());
+  node->Init(worldName);
+
+  transport::PublisherPtr pub =
+    node->Advertise<msgs::Physics>("~/physics");
+  pub->WaitForConnection();
+
+  msgs::Physics msg;
+
+  bool good = false;
+
+  if (this->vm.count("step-size"))
+  {
+    msg.set_max_step_size(this->vm["step-size"].as<double>());
+    good = true;
+  }
+
+  if (this->vm.count("iters"))
+  {
+    msg.set_iters(this->vm["iters"].as<double>());
+    good = true;
+  }
+
+  if (this->vm.count("update-rate"))
+  {
+    msg.set_real_time_update_rate(this->vm["update-rate"].as<double>());
+    good = true;
+  }
+
+  if (this->vm.count("gravity"))
+  {
+    std::vector<std::string> values;
+    boost::split(values, this->vm["gravity"].as<std::string>(),
+        boost::is_any_of(","));
+
+    msg.mutable_gravity()->set_x(boost::lexical_cast<double>(values[0]));
+    msg.mutable_gravity()->set_y(boost::lexical_cast<double>(values[1]));
+    msg.mutable_gravity()->set_z(boost::lexical_cast<double>(values[2]));
+    good = true;
+  }
+
+  if (good)
+    pub->Publish(msg, true);
+  else
+    this->Help();
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+ModelCommand::ModelCommand()
+  : Command("model", "Modify properties of a model")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("model-name,m", po::value<std::string>(), "Model name.")
+    ("world-name,w", po::value<std::string>(), "World name.")
+    ("delete,d", "Delete a model.")
+    ("spawn-file,f", po::value<std::string>(), "Spawn model from SDF file.")
+    ("spawn-string,s", "Spawn model from SDF string, pass by a pipe.")
+    ("pose-x,x", po::value<double>(), "x value")
+    ("pose-y,y", po::value<double>(), "y value")
+    ("pose-z,z", po::value<double>(), "z value")
+    ("pose-R,R", po::value<double>(), "roll in radians.")
+    ("pose-P,P", po::value<double>(), "pitch in radians.")
+    ("pose-Y,Y", po::value<double>(), "yaw in radians.");
+}
+
+/////////////////////////////////////////////////
+void ModelCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tChange properties of a model, delete a model, or\n"
+    "\tspawn a new model. If a name for the world, option -w, is\n"
+    "\tnot pecified, the first world found on the Gazebo master\n"
+    "\twill be used.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool ModelCommand::RunImpl()
+{
+  std::string modelName, worldName;
+
+  if (this->vm.count("world-name"))
+    worldName = this->vm["world-name"].as<std::string>();
+
+  if (this->vm.count("model-name"))
+    modelName = this->vm["model-name"].as<std::string>();
+  else
+  {
+    std::cerr << "A model name is required using the "
+      << "(-m <model_name> command line argument)\n";
+    std::cerr << "For more information: gz help model.\n";
+    return false;
+  }
+
+  math::Pose pose;
+  math::Vector3 rpy;
+
+  if (this->vm.count("pose-x"))
+    pose.pos.x = this->vm["pose-x"].as<double>();
+  if (this->vm.count("pose-y"))
+    pose.pos.y = this->vm["pose-y"].as<double>();
+  if (this->vm.count("pose-z"))
+    pose.pos.z = this->vm["pose-z"].as<double>();
+  if (this->vm.count("pose-R"))
+    rpy.x = this->vm["pose-R"].as<double>();
+  if (this->vm.count("pose-P"))
+    rpy.y = this->vm["pose-P"].as<double>();
+  if (this->vm.count("pose-Y"))
+    rpy.z = this->vm["pose-Y"].as<double>();
+  pose.rot.SetFromEuler(rpy);
+
+  transport::NodePtr node(new transport::Node());
+  node->Init(worldName);
+
+  if (this->vm.count("delete"))
+  {
+    msgs::Request *msg = msgs::CreateRequest("entity_delete", modelName);
+    transport::PublisherPtr pub = node->Advertise<msgs::Request>("~/request");
+    pub->WaitForConnection();
+    pub->Publish(*msg, true);
+    delete msg;
+  }
+  else if (this->vm.count("spawn-file"))
+  {
+    std::string filename = this->vm["spawn-file"].as<std::string>();
+
+    std::ifstream ifs(filename.c_str());
+    if (!ifs)
+    {
+      std::cerr << "Error: Unable to open file[" << filename << "]\n";
+      return false;
+    }
+
+    boost::shared_ptr<sdf::SDF> sdf(new sdf::SDF());
+    if (!sdf::init(sdf))
+    {
+      std::cerr << "Error: SDF parsing the xml failed" << std::endl;
+      return false;
+    }
+
+    if (!sdf::readFile(filename, sdf))
+    {
+      std::cerr << "Error: SDF parsing the xml failed\n";
+      return false;
+    }
+
+    return this->ProcessSpawn(sdf, modelName, pose, node);
+  }
+  else if (this->vm.count("spawn-string"))
+  {
+    std::string input;
+    std::string sdfString;
+
+    // Read input from the command line.
+    while (std::getline(std::cin, input))
+    {
+      sdfString += input;
+    }
+
+    boost::shared_ptr<sdf::SDF> sdf(new sdf::SDF());
+    if (!sdf::init(sdf))
+    {
+      std::cerr << "Error: SDF parsing the xml failed" << std::endl;
+      return false;
+    }
+
+    if (!sdf::readString(sdfString, sdf))
+    {
+      std::cerr << "Error: SDF parsing the xml failed\n";
+      return false;
+    }
+
+    return this->ProcessSpawn(sdf, modelName, pose, node);
+  }
+  else
+  {
+    transport::PublisherPtr pub =
+      node->Advertise<msgs::Model>("~/model/modify");
+    pub->WaitForConnection();
+
+    msgs::Model msg;
+    msg.set_name(modelName);
+    msgs::Set(msg.mutable_pose(), pose);
+    pub->Publish(msg, true);
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+bool ModelCommand::ProcessSpawn(boost::shared_ptr<sdf::SDF> _sdf,
+    const std::string &_name, const math::Pose &_pose, transport::NodePtr _node)
+{
+  sdf::ElementPtr modelElem = _sdf->root->GetElement("model");
+
+  if (!modelElem)
+  {
+    gzerr << "Unable to find <model> element.\n";
+    return false;
+  }
+
+  // Set the model name
+  if (!_name.empty())
+    modelElem->GetAttribute("name")->SetFromString(_name);
+
+  transport::PublisherPtr pub = _node->Advertise<msgs::Factory>("~/factory");
+  pub->WaitForConnection();
+
+  msgs::Factory msg;
+  msg.set_sdf(_sdf->ToString());
+  msgs::Set(msg.mutable_pose(), _pose);
+  pub->Publish(msg, true);
+
+  return true;
+}
+
+
+/////////////////////////////////////////////////
+JointCommand::JointCommand()
+  : Command("joint", "Modify properties of a joint")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("world-name,w", po::value<std::string>(), "World name.")
+    ("model-name,m", po::value<std::string>(), "Model name.")
+    ("joint-name,j", po::value<std::string>(), "Joint name.")
+    ("delete,d", "Delete a model.")
+    ("force,f", po::value<double>(), "Force to apply to a joint.")
+    ("pos-t", po::value<double>(), "Target angle.")
+    ("pos-p", po::value<double>(), "Position proportional gain.")
+    ("pos-i", po::value<double>(), "Position integral gain.")
+    ("pos-d", po::value<double>(), "Position differential gain.")
+    ("vel-t", po::value<double>(), "Target speed.")
+    ("vel-p", po::value<double>(), "Velocity proportional gain.")
+    ("vel-i", po::value<double>(), "Velocity integral gain.")
+    ("vel-d", po::value<double>(), "Velocity differential gain.");
+}
+
+/////////////////////////////////////////////////
+void JointCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tChange properties of a joint. If a name for the world, \n"
+    "\toption -w, is not specified, the first world found on \n"
+    "\tthe Gazebo master will be used.\n"
+    "\tA model name and joint name are required.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool JointCommand::RunImpl()
+{
+  std::string modelName, worldName, jointName;
+
+  if (this->vm.count("world-name"))
+    worldName = this->vm["world-name"].as<std::string>();
+
+  if (this->vm.count("model-name"))
+    modelName = this->vm["model-name"].as<std::string>();
+  else
+  {
+    std::cerr << "A model name is required using the "
+      << "(-m <model_name> command line argument)\n";
+    std::cerr << "For more information: gz help joint.\n";
+    return false;
+  }
+
+  if (this->vm.count("joint-name"))
+    jointName = this->vm["joint-name"].as<std::string>();
+  else
+  {
+    std::cerr << "A joint name is required using the "
+      << "(-j <joint_name> command line argument)\n";
+    std::cerr << "For more information: gz help joint.\n";
+    return false;
+  }
+
+  msgs::JointCmd msg;
+  msg.set_name(modelName + "::" + jointName);
+
+  if (this->vm.count("force"))
+    msg.set_force(this->vm["force"].as<double>());
+
+  if (this->vm.count("pos-t"))
+  {
+    msg.mutable_position()->set_target(this->vm["pos-t"].as<double>());
+
+    if (this->vm.count("pos-p"))
+      msg.mutable_position()->set_p_gain(this->vm["pos-p"].as<double>());
+
+    if (this->vm.count("pos-i"))
+      msg.mutable_position()->set_i_gain(this->vm["pos-i"].as<double>());
+
+    if (this->vm.count("pos-d"))
+      msg.mutable_position()->set_d_gain(this->vm["pos-d"].as<double>());
+  }
+
+  if (this->vm.count("vel-t"))
+  {
+    msg.mutable_velocity()->set_target(this->vm["vel-t"].as<double>());
+
+    if (this->vm.count("vel-p"))
+      msg.mutable_velocity()->set_p_gain(this->vm["vel-p"].as<double>());
+
+    if (this->vm.count("vel-i"))
+      msg.mutable_velocity()->set_i_gain(this->vm["vel-i"].as<double>());
+
+    if (this->vm.count("vel-d"))
+      msg.mutable_velocity()->set_d_gain(this->vm["vel-d"].as<double>());
+  }
+
+  transport::NodePtr node(new transport::Node());
+  node->Init(worldName);
+
+  transport::PublisherPtr pub =
+    node->Advertise<msgs::JointCmd>(
+        std::string("~/") + modelName + "/joint_cmd");
+
+  pub->WaitForConnection();
+
+  pub->Publish(msg, true);
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+CameraCommand::CameraCommand()
+  : Command("camera", "Control a camera")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("world-name,w", po::value<std::string>(), "World name.")
+    ("camera-name,c", po::value<std::string>(),
+     "Camera name. Use gz camera -l to get a list of camera names.")
+    ("list,l", "List all cameras")
+    ("follow,f", po::value<std::string>(), "Model to follow.");
+}
+
+/////////////////////////////////////////////////
+void CameraCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tChange properties of a camera. If a name for the world, \n"
+    "\toption -w, is not specified, the first world found on \n"
+    "\tthe Gazebo master will be used.\n"
+    "\tA camera name is required.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool CameraCommand::RunImpl()
+{
+  std::string cameraName, worldName;
+
+  if (this->vm.count("world-name"))
+    worldName = this->vm["world-name"].as<std::string>();
+
+  if (this->vm.count("list"))
+  {
+    transport::ConnectionPtr connection = transport::connectToMaster();
+
+    if (connection)
+    {
+      msgs::Packet packet;
+      msgs::Request *request;
+      msgs::GzString_V topics;
+      std::string data;
+
+      request = msgs::CreateRequest("get_topics");
+      request->set_id(0);
+      connection->EnqueueMsg(msgs::Package("request", *request), true);
+      connection->Read(data);
+
+      packet.ParseFromString(data);
+      topics.ParseFromString(packet.serialized_data());
+
+      for (int i = 0; i < topics.data_size(); ++i)
+      {
+        request = msgs::CreateRequest("topic_info", topics.data(i));
+        connection->EnqueueMsg(msgs::Package("request", *request), true);
+
+        int j = 0;
+        do
+        {
+          connection->Read(data);
+          packet.ParseFromString(data);
+        } while (packet.type() != "topic_info_response" && ++j < 10);
+
+        msgs::TopicInfo topicInfo;
+
+        if (j <10)
+          topicInfo.ParseFromString(packet.serialized_data());
+        else
+        {
+          std::cerr << "Unable to get info for topic["
+                    << topics.data(i) << "]\n";
+        }
+
+        if (topicInfo.msg_type() == "gazebo.msgs.CameraCmd")
+        {
+          std::vector<std::string> parts;
+          boost::split(parts, topics.data(i), boost::is_any_of("/"));
+          std::cout << parts[parts.size()-2] << std::endl;
+        }
+      }
+    }
+    else
+    {
+      std::cerr << "Unable to connect to a running instance of gazebo.\n";
+    }
+
+    return true;
+  }
+
+
+  if (this->vm.count("camera-name"))
+    cameraName = this->vm["camera-name"].as<std::string>();
+  else
+  {
+    std::cerr << "A camera name is required using the "
+      << "(-c <camera_name> command line argument)\n";
+    std::cerr << "For more information: gz help camera\n";
+    return false;
+  }
+
+  msgs::CameraCmd msg;
+  if (this->vm.count("follow"))
+    msg.set_follow_model(this->vm["follow"].as<std::string>());
+
+  transport::NodePtr node(new transport::Node());
+  node->Init(worldName);
+
+  transport::PublisherPtr pub =
+    node->Advertise<msgs::CameraCmd>(
+        std::string("~/") + cameraName + "/cmd");
+
+  pub->WaitForConnection();
+
+  pub->Publish(msg, true);
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+StatsCommand::StatsCommand()
+  : Command("stats", "Print statistics about a running gzserver instance.")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("world-name,w", po::value<std::string>(), "World name.")
+    ("duration,d", po::value<double>(), "Duration (seconds) to run.")
+    ("plot,p", "Output comma-separated values, useful for processing and "
+     "plotting.");
+}
+
+/////////////////////////////////////////////////
+void StatsCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tPrint gzserver statics to standard out. If a name for the world, \n"
+    "\toption -w, is not specified, the first world found on \n"
+    "\tthe Gazebo master will be used.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool StatsCommand::RunImpl()
+{
+  std::string worldName;
+
+  if (this->vm.count("world-name"))
+    worldName = this->vm["world-name"].as<std::string>();
+
+  transport::NodePtr node(new transport::Node());
+  node->Init(worldName);
+
+  transport::SubscriberPtr sub =
+    node->Subscribe("~/world_stats", &StatsCommand::CB, this);
+
+  boost::mutex::scoped_lock lock(this->sigMutex);
+  if (this->vm.count("duration"))
+    this->sigCondition.timed_wait(lock,
+        boost::posix_time::seconds(this->vm["duration"].as<double>()));
+  else
+    this->sigCondition.wait(lock);
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+void StatsCommand::CB(ConstWorldStatisticsPtr &_msg)
+{
+  GZ_ASSERT(_msg, "Invalid message received");
+
+  double percent = 0;
+  char paused;
+  common::Time simTime  = msgs::Convert(_msg->sim_time());
+  common::Time realTime = msgs::Convert(_msg->real_time());
+
+  this->simTimes.push_back(msgs::Convert(_msg->sim_time()));
+  if (this->simTimes.size() > 20)
+    this->simTimes.pop_front();
+
+  this->realTimes.push_back(msgs::Convert(_msg->real_time()));
+  if (this->realTimes.size() > 20)
+    this->realTimes.pop_front();
+
+  common::Time simAvg, realAvg;
+  std::list<common::Time>::iterator simIter, realIter;
+  simIter = ++(this->simTimes.begin());
+  realIter = ++(this->realTimes.begin());
+  while (simIter != this->simTimes.end() && realIter != this->realTimes.end())
+  {
+    simAvg += ((*simIter) - this->simTimes.front());
+    realAvg += ((*realIter) - this->realTimes.front());
+    ++simIter;
+    ++realIter;
+  }
+
+  // Prevent divide by zero
+  if (realAvg <= 0)
+    return;
+
+  simAvg = simAvg / realAvg;
+
+  if (simAvg > 0)
+    percent = simAvg.Double();
+  else
+    percent = 0;
+
+
+  if (_msg->paused())
+    paused = 'T';
+  else
+    paused = 'F';
+
+  if (this->vm.count("plot"))
+  {
+    static bool first = true;
+    if (first)
+    {
+      std::cout << "# real-time factor (percent), simtime (sec), "
+        << "realtime (sec), paused (T or F)\n";
+      first = false;
+    }
+    printf("%4.2f, %16.6f, %16.6f, %c\n",
+        percent, simTime.Double(), realTime.Double(), paused);
+    fflush(stdout);
+  }
+  else
+    printf("Factor[%4.2f] SimTime[%4.2f] RealTime[%4.2f] Paused[%c]\n",
+        percent, simTime.Double(), realTime.Double(), paused);
+}
+
+/////////////////////////////////////////////////
+SDFCommand::SDFCommand()
+  : Command("sdf",
+      "Converts between SDF versions, and provides info about SDF files")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("describe,d", "Print SDF format for given version(-v).")
+    ("convert,c", po::value<std::string>(),
+     "In place conversion of arg to the latest SDF version.")
+    ("doc,o", "Print HTML SDF. Use -v to specify version.")
+    ("check,k", po::value<std::string>(), "Validate arg.")
+    ("version,v", po::value<std::string>(),
+     "Version of SDF to use with other options.")
+    ("print,p", po::value<std::string>(),
+     "Print arg, useful for debugging and as a conversion tool.");
+}
+
+/////////////////////////////////////////////////
+void SDFCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tIntrospect, convert, and output SDF files.\n"
+    "\tUse the -v option to specify the version of\n"
+    "\tSDF for use with other options.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool SDFCommand::TransportRequired()
+{
+  return false;
+}
+
+/////////////////////////////////////////////////
+bool SDFCommand::RunImpl()
+{
+  sdf::SDF::version = SDF_VERSION;
+
+  try
+  {
+    // Initialize the informational logger. This will log warnings and errors.
+    gzLogInit("gzsdf.log");
+  }
+  catch(gazebo::common::Exception &_e)
+  {
+    _e.Print();
+    std::cerr << "Error initializing log file" << std::endl;
+  }
+
+  boost::shared_ptr<sdf::SDF> sdf(new sdf::SDF());
+
+  if (this->vm.count("version"))
+  {
+    try
+    {
+      sdf::SDF::version = boost::lexical_cast<std::string>(
+          this->vm["version"].as<std::string>());
+    }
+    catch(...)
+    {
+      gzerr << "Invalid version number["
+        <<this->vm["version"].as<std::string>() << "]\n";
+      return false;
+    }
+  }
+
+  if (!sdf::init(sdf))
+  {
+    std::cerr << "ERROR: SDF parsing the xml failed" << std::endl;
+    return -1;
+  }
+
+  if (this->vm.count("check"))
+  {
+    boost::filesystem::path path = this->vm["check"].as<std::string>();
+
+    if (!boost::filesystem::exists(path))
+      std::cerr << "Error: File doesn't exist[" << path.string() << "]\n";
+
+    if (!sdf::readFile(path.string(), sdf))
+    {
+      std::cerr << "Error: SDF parsing the xml failed\n";
+      return -1;
+    }
+
+    std::cout << "Check complete\n";
+  }
+  else if (this->vm.count("describe"))
+  {
+    sdf->PrintDescription();
+  }
+  else if (this->vm.count("doc"))
+  {
+    sdf->PrintDoc();
+  }
+  else if (this->vm.count("convert"))
+  {
+    boost::filesystem::path path = this->vm["convert"].as<std::string>();
+
+    if (!boost::filesystem::exists(path))
+      std::cerr << "Error: File doesn't exist[" << path.string() << "]\n";
+
+    TiXmlDocument xmlDoc;
+    if (xmlDoc.LoadFile(path.string()))
+    {
+      if (sdf::Converter::Convert(&xmlDoc, sdf::SDF::version, true))
+      {
+        // Create an XML printer to control formatting
+        TiXmlPrinter printer;
+        printer.SetIndent("  ");
+        xmlDoc.Accept(&printer);
+
+        // Output the XML
+        std::ofstream stream(path.string().c_str(), std::ios_base::out);
+        stream << printer.Str();
+        stream.close();
+
+        std::cout << "Success\n";
+      }
+    }
+    else
+    {
+      std::cerr << "Unable to load file[" << path.string() << "]\n";
+      return false;
+    }
+  }
+  else if (this->vm.count("print"))
+  {
+    boost::filesystem::path path = this->vm["print"].as<std::string>();
+
+    if (!boost::filesystem::exists(path))
+      std::cerr << "Error: File doesn't exist[" << path.string() << "]\n";
+
+    if (!sdf::readFile(path.string(), sdf))
+    {
+      std::cerr << "Error: SDF parsing the xml failed\n";
+      return false;
+    }
+    sdf->PrintValues();
+  }
+  else
+  {
+    this->Help();
+  }
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+HelpCommand::HelpCommand()
+  : Command("help",
+      "Outputs information about a command")
+{
+  // Options that are visible to the user through help.
+  // this->visibleOptions.add_options()
+  //  ("option,o", po::value<std::string>(), "Show the command options.");
+}
+
+/////////////////////////////////////////////////
+void HelpCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tOutput information about a gz command.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool HelpCommand::TransportRequired()
+{
+  return false;
+}
+
+/////////////////////////////////////////////////
+bool HelpCommand::RunImpl()
+{
+  std::string option;
+  if (vm.count("pass") && !vm["pass"].as<std::vector<std::string> >().empty())
+    option = vm["pass"].as<std::vector<std::string> >()[0];
+
+  this->Help(option);
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+void HelpCommand::Help(const std::string &_command)
+{
+  std::cerr << "This tool modifies various aspects of a "
+    << "running Gazebo simulation.\n\n";
+
+  if (_command.empty() || g_commandMap.find(_command) == g_commandMap.end())
+  {
+    std::cerr << "  Usage:  gz <command>\n\n"
+      << "List of commands:\n\n";
+
+    std::cerr << "  " << std::left << std::setw(10) << std::setfill(' ')
+      << "help";
+    std::cerr << "Print this help text.\n";
+
+    for (std::map<std::string, Command*>::iterator iter = g_commandMap.begin();
+        iter != g_commandMap.end(); ++iter)
+    {
+      std::cerr << "  " << std::left << std::setw(10) << std::setfill(' ')
+        << iter->first;
+      std::cerr << iter->second->GetBrief() << "\n";
+    }
+
+    std::cerr << "\n\n";
+    std::cerr << "Use \"gz help <command>\" to print help for a "
+      "command.\n";
+  }
+  else if (g_commandMap.find(_command) != g_commandMap.end())
+    g_commandMap[_command]->Help();
+}
+
+/////////////////////////////////////////////////
+DebugCommand::DebugCommand()
+  : Command("debug",
+      "Returns completion list for a command. Used for bash completion.")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("option,o", po::value<std::string>(), "Show the command options.");
+}
+
+/////////////////////////////////////////////////
+void DebugCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tUsed primarily for bash completion, this tool\n"
+    "\treturn the completion list for a given command.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool DebugCommand::TransportRequired()
+{
+  return false;
+}
+
+/////////////////////////////////////////////////
+bool DebugCommand::RunImpl()
+{
+  if (this->vm.count("option") <= 0)
+  {
+    for (std::map<std::string, Command*>::iterator iter = g_commandMap.begin();
+        iter != g_commandMap.end(); ++iter)
+    {
+      std::cout << iter->first << "\n";
+    }
+  }
+  else
+  {
+    std::map<std::string, Command *>::iterator iter =
+      g_commandMap.find(this->vm["option"].as<std::string>());
+    if (iter != g_commandMap.end())
+      iter->second->ListOptions();
+  }
+
+  return true;
+}
+
+//////////////////////////////////////////////////
+void SignalHandler(int /*dummy*/)
+{
+  Command::Signal();
+  return;
+}
+
+/////////////////////////////////////////////////
+int main(int argc, char **argv)
+{
+  gazebo::common::Console::SetQuiet(true);
+
+  // Hidden options
+  po::options_description hiddenOptions("hidden options");
+  hiddenOptions.add_options()
+    ("command", po::value<std::string>(), "Command")
+    ("pass", po::value<std::vector<std::string> >(), "pass through");
+
+  // Both the hidden and visible options
+  po::options_description allOptions("all options");
+  allOptions.add(hiddenOptions);
+
+  // The command and file options are positional
+  po::positional_options_description positional;
+  positional.add("command", 1).add("pass", -1);
+
+  po::variables_map vm;
+
+  try
+  {
+    po::store(
+        po::command_line_parser(argc, argv).options(allOptions).positional(
+          positional).allow_unregistered().run(), vm);
+
+    po::notify(vm);
+  }
+  catch(boost::exception &_e)
+  {
+    std::cerr << "Invalid arguments\n";
+    return -1;
+  }
+
+  if (signal(SIGINT, SignalHandler) == SIG_ERR)
+  {
+    std::cerr << "signal(2) failed while setting up for SIGINT" << std::endl;
+    return -1;
+  }
+
+  g_commandMap["camera"] = new CameraCommand();
+  g_commandMap["help"] = new HelpCommand();
+  g_commandMap["joint"] = new JointCommand();
+  g_commandMap["model"] = new ModelCommand();
+  g_commandMap["world"] = new WorldCommand();
+  g_commandMap["physics"] = new PhysicsCommand();
+  g_commandMap["stats"] = new StatsCommand();
+  g_commandMap["topic"] = new TopicCommand();
+  g_commandMap["log"] = new LogCommand();
+  g_commandMap["sdf"] = new SDFCommand();
+  g_commandMap["debug"] = new DebugCommand();
+
+  // Get the command name
+  std::string command =
+    vm.count("command") ? vm["command"].as<std::string>() : "";
+
+  std::map<std::string, Command *>::iterator iter =
+    g_commandMap.find(command);
+
+  int result = 0;
+
+  if (iter != g_commandMap.end())
+  {
+    g_commandMap[command]->Run(argc, argv);
+  }
+  else
+  {
+    g_commandMap["help"]->Run(argc, argv);
+    result = -1;
+  }
+
+  for (iter = g_commandMap.begin(); iter != g_commandMap.end(); ++iter)
+    delete iter->second;
+
+  return result;
+}
diff --git a/tools/gz.hh b/tools/gz.hh
new file mode 100644
index 0000000..d5db3cf
--- /dev/null
+++ b/tools/gz.hh
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GAZEBO_GZ_HH_
+#define _GAZEBO_GZ_HH_
+
+#include <string>
+#include <list>
+#include <boost/thread.hpp>
+#include <boost/program_options.hpp>
+
+#include "gazebo/transport/transport.hh"
+#include "gazebo/common/common.hh"
+#include "gazebo/msgs/msgs.hh"
+
+namespace gazebo
+{
+  namespace po = boost::program_options;
+
+  /// \brief Base class for all commands
+  class Command
+  {
+    /// \brief Constructor
+    /// \param[in] _name Name of the command.
+    /// \param[in] _brief One line command description.
+    public: Command(const std::string &_name, const std::string &_brief);
+
+    /// \brief Destructor
+    public: virtual ~Command();
+
+    /// \brief Print help information.
+    public: void Help();
+
+    /// \brief Print detailed help.
+    public: virtual void HelpDetailed() = 0;
+
+    /// \brief Get the one description.
+    /// \return The brief description of the command.
+    public: std::string GetBrief() const;
+
+    /// \brief Execute the command.
+    /// \param[in] _argc Number of command line arguments.
+    /// \param[in] _argv The line arguments.
+    public: bool Run(int _argc, char **_argv);
+
+    /// \brief Process signal interrupt.
+    public: static void Signal();
+
+    /// \brief List all the command options.
+    public: void ListOptions();
+
+    /// \brief Return true if transport is need for the command.
+    /// \return True if transport should be initialized.
+    protected: virtual bool TransportRequired();
+
+    /// \brief Implementation of Run
+    /// \return True on success
+    protected: virtual bool RunImpl() = 0;
+
+    /// \brief Initialize transport.
+    /// \return True on success
+    protected: bool TransportInit();
+
+    /// \brief Finalized transport.
+    /// \return True on success
+    protected: bool TransportFini();
+
+    /// \brief Name of the command.
+    protected: std::string name;
+
+    /// \brief One line description of the command.
+    protected: std::string brief;
+
+    /// \brief Options that are visible to the user
+    protected: po::options_description visibleOptions;
+
+    /// \brief Variable map
+    protected: po::variables_map vm;
+
+    /// \brief Signal mutex.
+    protected: static boost::mutex sigMutex;
+
+    /// \breif Signal condition.
+    protected: static boost::condition_variable sigCondition;
+
+    /// \brief Save argc for use by child commands.
+    protected: int argc;
+
+    /// \brief Save argv for use by child commands.
+    protected: char **argv;
+  };
+
+  /// \brief World command
+  class WorldCommand : public Command
+  {
+    /// \brief Constructor
+    public: WorldCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+  };
+
+  /// \brief Physics command
+  class PhysicsCommand : public Command
+  {
+    /// \brief Constructor
+    public: PhysicsCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+  };
+
+  /// \brief Model command
+  class ModelCommand : public Command
+  {
+    /// \brief Constructor
+    public: ModelCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+
+    /// \brief Spawn helper function.
+    /// \param[in] _sdf SDF model to spawn.
+    /// \param[in] _name Name for the model.
+    /// \param[in] _pose Pose of the model.
+    /// \param[in] _node Node for communication.
+    /// \return True if the spawn message was sent.
+    private: bool ProcessSpawn(boost::shared_ptr<sdf::SDF> _sdf,
+                 const std::string &_name, const math::Pose &_pose,
+                 transport::NodePtr _node);
+  };
+
+  /// \brief Joint command
+  class JointCommand : public Command
+  {
+    /// \brief Constructor
+    public: JointCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+  };
+
+  /// \brief Camera command
+  class CameraCommand : public Command
+  {
+    /// \brief Constructor
+    public: CameraCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+  };
+
+  /// \brief Stats command
+  class StatsCommand : public Command
+  {
+    /// \brief Constructor
+    public: StatsCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+
+    /// \brief World statistics callback.
+    /// \param[in] _msg World statistics message.
+    private: void CB(ConstWorldStatisticsPtr &_msg);
+
+    /// \brief Sim time buffer
+    private: std::list<common::Time> simTimes;
+
+    /// \brief Real time buffer
+    private: std::list<common::Time> realTimes;
+  };
+
+  /// \brief SDF command
+  class SDFCommand : public Command
+  {
+    /// \brief Constructor
+    public: SDFCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+
+    // Documentation inherited
+    protected: virtual bool TransportRequired();
+  };
+
+  /// \brief Help command
+  class HelpCommand : public Command
+  {
+    /// \brief Constructor
+    public: HelpCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+
+    // Documentation inherited
+    protected: virtual bool TransportRequired();
+
+    /// \brief Displays help message for specified command.
+    /// \param[in] _command Command to display help message.
+    private: void Help(const std::string &_command);
+  };
+
+  /// \brief Debug command
+  class DebugCommand : public Command
+  {
+    /// \brief Constructor
+    public: DebugCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+
+    // Documentation inherited
+    protected: virtual bool TransportRequired();
+  };
+}
+#endif
diff --git a/tools/gz_TEST.cc b/tools/gz_TEST.cc
new file mode 100644
index 0000000..649f9a6
--- /dev/null
+++ b/tools/gz_TEST.cc
@@ -0,0 +1,670 @@
+/*
+ * Copyright 2013-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/filesystem.hpp>
+
+#include <gazebo/common/CommonIface.hh>
+#include <gazebo/msgs/msgs.hh>
+#include <gazebo/transport/transport.hh>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string>
+
+#include "test/util.hh"
+#include "test_config.h"
+
+class gzTest : public gazebo::testing::AutoLogFixture { };
+
+std::string g_msgDebugOut;
+boost::mutex g_mutex;
+pid_t g_pid = -1;
+boost::condition_variable g_msgCondition;
+
+/////////////////////////////////////////////////
+bool custom_exec(std::string _cmd)
+{
+  return system(_cmd.c_str()) >= 0;
+}
+
+/////////////////////////////////////////////////
+std::string custom_exec_str(std::string _cmd)
+{
+  _cmd += " 2>&1";
+  FILE *pipe = popen(_cmd.c_str(), "r");
+
+  if (!pipe)
+    return "ERROR";
+
+  char buffer[128];
+  std::string result = "";
+
+  while (!feof(pipe))
+  {
+    if (fgets(buffer, 128, pipe) != NULL)
+      result += buffer;
+  }
+
+  pclose(pipe);
+  return result;
+}
+
+/////////////////////////////////////////////////
+void waitForMsg(const std::string &_cmd)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut.clear();
+
+  bool good = false;
+  int iters = 0;
+  while (!good and iters < 20)
+  {
+    custom_exec(_cmd);
+
+    good = g_msgCondition.timed_wait(lock,
+        boost::posix_time::milliseconds(1000));
+    ++iters;
+  }
+
+  EXPECT_LT(iters, 20);
+  EXPECT_TRUE(!g_msgDebugOut.empty());
+}
+
+/////////////////////////////////////////////////
+void init()
+{
+  g_pid = fork();
+
+  if (!g_pid)
+  {
+    boost::filesystem::path worldFilePath = TEST_PATH;
+    worldFilePath = worldFilePath / "worlds" / "simple_arm_test.world";
+    if (execlp("gzserver", worldFilePath.string().c_str(),
+        "--iters", "60000", NULL) < 0)
+    {
+      gzerr << "Failed to start the gazebo server.\n";
+    }
+    return;
+  }
+
+  EXPECT_TRUE(gazebo::transport::init());
+}
+
+/////////////////////////////////////////////////
+void fini()
+{
+  gazebo::transport::fini();
+  if (kill(g_pid, SIGINT) < 0)
+    gzerr << "Failed to kill the gazebo server.\n";
+
+  int status;
+  int p1 = 0;
+  for (unsigned int i = 0; i < 5 && p1 != g_pid; ++i)
+    p1 = waitpid(g_pid, &status, WNOHANG);
+  if (p1 != g_pid)
+  {
+    kill(g_pid, SIGKILL);
+    waitpid(g_pid, &status, 0);
+  }
+
+  g_pid = -1;
+}
+
+/////////////////////////////////////////////////
+void JointCmdCB(ConstJointCmdPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut = _msg->DebugString();
+  g_msgCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+void ModelModifyCB(ConstModelPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut = _msg->DebugString();
+  g_msgCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+void RequestCB(ConstRequestPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut = _msg->DebugString();
+  g_msgCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+void FactoryCB(ConstFactoryPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut = _msg->DebugString();
+  g_msgCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+void WorldControlCB(ConstWorldControlPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut = _msg->DebugString();
+  g_msgCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+void PhysicsCB(ConstPhysicsPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut = _msg->DebugString();
+  g_msgCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+void CameraCB(ConstCameraCmdPtr &_msg)
+{
+  boost::mutex::scoped_lock lock(g_mutex);
+  g_msgDebugOut = _msg->DebugString();
+  g_msgCondition.notify_all();
+}
+
+/////////////////////////////////////////////////
+/// Check to make sure that 'gz' exists
+TEST_F(gzTest, Alive)
+{
+  std::string rawOutput = custom_exec_str("gz");
+  std::string helpOutput = custom_exec_str("gz help");
+
+  EXPECT_FALSE(rawOutput.empty());
+  EXPECT_FALSE(helpOutput.empty());
+  EXPECT_EQ(rawOutput, helpOutput);
+}
+
+/////////////////////////////////////////////////
+TEST_F(gzTest, Joint)
+{
+  init();
+
+  std::string expectedStr;
+
+  std::string helpOutput = custom_exec_str("gz help joint");
+  EXPECT_NE(helpOutput.find("gz joint"), std::string::npos);
+
+  gazebo::transport::NodePtr node(new gazebo::transport::Node());
+  node->Init();
+  gazebo::transport::SubscriberPtr sub =
+    node->Subscribe("~/simple_arm/joint_cmd", &JointCmdCB);
+
+  // Run the transport loop: starts a new thread
+  gazebo::transport::run();
+
+  // Test joint force
+  {
+    waitForMsg("gz joint -w default -m simple_arm "
+        "-j arm_shoulder_pan_joint -f 10");
+
+    gazebo::msgs::JointCmd msg;
+    msg.set_name("simple_arm::arm_shoulder_pan_joint");
+    msg.set_force(10);
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test joint position PID
+  {
+    waitForMsg("gz joint -w default -m simple_arm "
+        "-j arm_shoulder_pan_joint --pos-t 1.5707 --pos-p 1.2 "
+        "--pos-i 0.01 --pos-d 0.2");
+
+    gazebo::msgs::JointCmd msg;
+    msg.set_name("simple_arm::arm_shoulder_pan_joint");
+    msg.mutable_position()->set_target(1.5707);
+    msg.mutable_position()->set_p_gain(1.2);
+    msg.mutable_position()->set_i_gain(0.01);
+    msg.mutable_position()->set_d_gain(0.2);
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test joint velocity PID
+  {
+    waitForMsg("gz joint -w default -m simple_arm "
+        "-j arm_shoulder_pan_joint --vel-t 1.5707 --vel-p 1.2 "
+        "--vel-i 0.01 --vel-d 0.2");
+
+    gazebo::msgs::JointCmd msg;
+    msg.set_name("simple_arm::arm_shoulder_pan_joint");
+    msg.mutable_velocity()->set_target(1.5707);
+    msg.mutable_velocity()->set_p_gain(1.2);
+    msg.mutable_velocity()->set_i_gain(0.01);
+    msg.mutable_velocity()->set_d_gain(0.2);
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  fini();
+}
+
+/////////////////////////////////////////////////
+TEST_F(gzTest, Model)
+{
+  init();
+
+  std::string helpOutput = custom_exec_str("gz help model");
+  EXPECT_NE(helpOutput.find("gz model"), std::string::npos);
+
+  gazebo::transport::NodePtr node(new gazebo::transport::Node());
+  node->Init();
+  gazebo::transport::SubscriberPtr subModify =
+    node->Subscribe("~/model/modify", &ModelModifyCB);
+
+  gazebo::transport::SubscriberPtr subRequest =
+    node->Subscribe("~/request", &RequestCB);
+
+  gazebo::transport::SubscriberPtr subFactory =
+    node->Subscribe("~/factory", &FactoryCB);
+
+  // Run the transport loop: starts a new thread
+  gazebo::transport::run();
+
+  // Test model move
+  {
+    waitForMsg("gz model -w default -m simple_arm "
+        "-x 1.1 -y 2.3 -z 4.5 -R 0.1 -P 1.2 -Y 3.4");
+
+    gazebo::msgs::Model msg;
+    msg.set_name("simple_arm");
+    gazebo::msgs::Set(msg.mutable_pose(),
+        gazebo::math::Pose(1.1, 2.3, 4.5, 0.1, 1.2, 3.4));
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test model spawn from file
+  {
+    std::string filename = std::string(TEST_PATH) + "/models/box.sdf";
+
+    waitForMsg("gz model -w default -m my_box -f " + filename);
+
+    std::ifstream ifs(filename.c_str());
+    EXPECT_TRUE(ifs);
+
+    boost::shared_ptr<sdf::SDF> sdf(new sdf::SDF());
+    EXPECT_TRUE(sdf::init(sdf));
+
+    EXPECT_TRUE(sdf::readFile(filename, sdf));
+    sdf::ElementPtr modelElem = sdf->root->GetElement("model");
+    modelElem->GetAttribute("name")->SetFromString("my_box");
+
+    gazebo::msgs::Factory msg;
+    msg.set_sdf(sdf->ToString());
+    gazebo::msgs::Set(msg.mutable_pose(), gazebo::math::Pose(0, 0, 0, 0, 0, 0));
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test model spawn from string
+  {
+    std::string filename = std::string(TEST_PATH) + "/models/box.sdf";
+
+    std::string cmd = "cat ";
+    cmd += filename + " | gz model -w default -m my_box -s";
+    waitForMsg(cmd);
+
+    std::ifstream ifs(filename.c_str());
+    EXPECT_TRUE(ifs);
+
+    boost::shared_ptr<sdf::SDF> sdf(new sdf::SDF());
+    EXPECT_TRUE(sdf::init(sdf));
+
+    EXPECT_TRUE(sdf::readFile(filename, sdf));
+    sdf::ElementPtr modelElem = sdf->root->GetElement("model");
+    modelElem->GetAttribute("name")->SetFromString("my_box");
+
+    gazebo::msgs::Factory msg;
+    msg.set_sdf(sdf->ToString());
+    gazebo::msgs::Set(msg.mutable_pose(), gazebo::math::Pose(0, 0, 0, 0, 0, 0));
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test model delete
+  {
+    waitForMsg("gz model -w default -m simple_arm -d");
+
+    EXPECT_NE(g_msgDebugOut.find("entity_delete"), std::string::npos);
+    EXPECT_NE(g_msgDebugOut.find("simple_arm"), std::string::npos);
+  }
+
+  fini();
+}
+
+/////////////////////////////////////////////////
+TEST_F(gzTest, World)
+{
+  init();
+
+  std::string helpOutput = custom_exec_str("gz help world");
+  EXPECT_NE(helpOutput.find("gz world"), std::string::npos);
+
+  gazebo::transport::NodePtr node(new gazebo::transport::Node());
+  node->Init();
+  gazebo::transport::SubscriberPtr sub =
+    node->Subscribe("~/world_control", &WorldControlCB);
+
+  // Run the transport loop: starts a new thread
+  gazebo::transport::run();
+
+  // Test world pause
+  {
+    waitForMsg("gz world -w default -p 1");
+
+    gazebo::msgs::WorldControl msg;
+    msg.set_pause(true);
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test world step
+  {
+    waitForMsg("gz world -w default -s");
+
+    gazebo::msgs::WorldControl msg;
+    msg.set_step(true);
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test world multi-step
+  {
+    waitForMsg("gz world -w default -m 10");
+
+    gazebo::msgs::WorldControl msg;
+    msg.set_multi_step(10);
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test world reset all
+  {
+    waitForMsg("gz world -w default -r");
+
+    gazebo::msgs::WorldControl msg;
+    msg.mutable_reset()->set_all(true);
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test world reset time
+  {
+    waitForMsg("gz world -w default -t");
+
+    gazebo::msgs::WorldControl msg;
+    msg.mutable_reset()->set_time_only(true);
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test world reset models
+  {
+    waitForMsg("gz world -w default -o");
+
+    gazebo::msgs::WorldControl msg;
+    msg.mutable_reset()->set_model_only(true);
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  fini();
+}
+
+/////////////////////////////////////////////////
+TEST_F(gzTest, Physics)
+{
+  init();
+
+  std::string helpOutput = custom_exec_str("gz help physics");
+  EXPECT_NE(helpOutput.find("gz physics"), std::string::npos);
+
+  gazebo::transport::NodePtr node(new gazebo::transport::Node());
+  node->Init();
+  gazebo::transport::SubscriberPtr sub =
+    node->Subscribe("~/physics", &PhysicsCB);
+
+  // Run the transport loop: starts a new thread
+  gazebo::transport::run();
+
+  // Test gravity
+  {
+    waitForMsg("gz physics -w default -g 1,2,3 ");
+
+    gazebo::msgs::Physics msg;
+    msg.mutable_gravity()->set_x(1);
+    msg.mutable_gravity()->set_y(2);
+    msg.mutable_gravity()->set_z(3);
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test step size
+  {
+    waitForMsg("gz physics -w default -s 0.0123 ");
+
+    gazebo::msgs::Physics msg;
+    msg.set_max_step_size(0.0123);
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test iters
+  {
+    waitForMsg("gz physics -w default -i 561 ");
+
+    gazebo::msgs::Physics msg;
+    msg.set_iters(561);
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  // Test update-rate
+  {
+    waitForMsg("gz physics -w default -u 1234 ");
+
+    gazebo::msgs::Physics msg;
+    msg.set_real_time_update_rate(1234);
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  fini();
+}
+
+/////////////////////////////////////////////////
+TEST_F(gzTest, Camera)
+{
+  init();
+
+  std::string helpOutput = custom_exec_str("gz help camera");
+  EXPECT_NE(helpOutput.find("gz camera"), std::string::npos);
+
+  gazebo::transport::NodePtr node(new gazebo::transport::Node());
+  node->Init();
+  gazebo::transport::SubscriberPtr sub =
+    node->Subscribe("~/user/cmd", &CameraCB);
+
+  // Run the transport loop: starts a new thread
+  gazebo::transport::run();
+
+  // Test follow
+  {
+    waitForMsg("gz camera -w default -c user -f box");
+
+    gazebo::msgs::CameraCmd msg;
+    msg.set_follow_model("box");
+
+    EXPECT_EQ(g_msgDebugOut, msg.DebugString());
+  }
+
+  fini();
+}
+
+/////////////////////////////////////////////////
+TEST_F(gzTest, Stats)
+{
+  init();
+
+  std::string helpOutput = custom_exec_str("gz help stats");
+  EXPECT_NE(helpOutput.find("gz stats"), std::string::npos);
+
+  // Basic output
+  std::string output = custom_exec_str("gz stats -d 1");
+  EXPECT_NE(output.find("Factor["), std::string::npos);
+
+  // Plot option
+  output = custom_exec_str("gz stats -d 1 -p");
+  EXPECT_NE(output.find("# real-time factor (percent),"), std::string::npos);
+
+  fini();
+}
+
+/////////////////////////////////////////////////
+TEST_F(gzTest, Topic)
+{
+  init();
+
+  std::string helpOutput = custom_exec_str("gz help topic");
+  EXPECT_NE(helpOutput.find("gz topic"), std::string::npos);
+
+  // List
+  std::string output = custom_exec_str("gz topic -l");
+  EXPECT_NE(output.find("/gazebo/default/world_stats"), std::string::npos);
+
+  // Info
+  output = custom_exec_str("gz topic -i /gazebo/default/world_stats");
+  EXPECT_NE(output.find("gazebo.msgs.WorldStatistics"), std::string::npos);
+
+  // Echo
+  output = custom_exec_str("gz topic -e /gazebo/default/world_stats -d 1");
+  EXPECT_NE(output.find("real_time {"), std::string::npos);
+
+  // Echo unformatted
+  output = custom_exec_str("gz topic -e /gazebo/default/world_stats -u -d 1");
+  EXPECT_NE(output.find("real_time {"), std::string::npos);
+
+  // Hz
+  output = custom_exec_str("gz topic -z /gazebo/default/world_stats -d 1");
+  EXPECT_NE(output.find("Hz:"), std::string::npos);
+
+  // Bw
+  output = custom_exec_str("gz topic -b /gazebo/default/world_stats -d 10");
+  EXPECT_NE(output.find("Total["), std::string::npos);
+
+  fini();
+}
+
+/////////////////////////////////////////////////
+TEST_F(gzTest, SDF)
+{
+  boost::filesystem::path path;
+
+  init();
+  std::string helpOutput = custom_exec_str("gz help sdf");
+  EXPECT_NE(helpOutput.find("gz sdf"), std::string::npos);
+
+  // Regenerate each sum using:
+  // gz sdf -d -v <major.minor> | sha1sum'
+  std::map<std::string, std::string> descSums;
+  descSums["1.0"] = "5235eb8464a96505c2a31fe96327d704e45c9cc4";
+  descSums["1.2"] = "27973b2542d7a0f7582a615b245d81797718c89a";
+  descSums["1.3"] = "30ffce1c662c17185d23f30ef3af5c110d367e10";
+  descSums["1.4"] = "a917916d211b711c6cba42ffd6811f9a659fce75";
+  descSums["1.5"] = "2904518b31e9d2319e6a5b8737b29826218b5b54";
+
+  // Test each descSum
+  for (std::map<std::string, std::string>::iterator iter = descSums.begin();
+       iter != descSums.end(); ++iter)
+  {
+    std::string cmd = std::string("gz sdf -d -v ") + iter->first;
+    std::string output = custom_exec_str(cmd);
+    std::string shasum = gazebo::common::get_sha1<std::string>(output);
+    EXPECT_EQ(shasum, iter->second);
+  }
+
+  // Regenerate each sum using:
+  // gz sdf -o -v <major.minor> | sha1sum'
+  std::map<std::string, std::string> docSums;
+  docSums["1.0"] = "4cf955ada785adf72503744604ffadcdf13ec0d2";
+  docSums["1.2"] = "f84c1cf1b1ba04ab4859e96f6aea881134fb5a9b";
+  docSums["1.3"] = "f3dd699687c8922710e4492aadedd1c038d678c1";
+  docSums["1.4"] = "8d136b204ea6428bd99ee2dc4fd5cf385a3e4c3d";
+  docSums["1.5"] = "6fc5f41d43e8c0a32cfb9a194488eb6ba0bc6281";
+
+  // Test each docSum
+  for (std::map<std::string, std::string>::iterator iter = docSums.begin();
+       iter != docSums.end(); ++iter)
+  {
+    std::string cmd = std::string("gz sdf -o -v ") + iter->first;
+    std::string output = custom_exec_str(cmd);
+    std::string shasum = gazebo::common::get_sha1<std::string>(output);
+    EXPECT_EQ(shasum, iter->second);
+  }
+
+
+  path = TEST_PATH;
+  path /= "worlds/empty_different_name.world";
+
+  {
+    // Check empty.world
+    std::string output =
+      custom_exec_str(std::string("gz sdf -k ") + path.string());
+    EXPECT_EQ(output, "Check complete\n");
+  }
+
+  {
+    // Print empty.world
+    // Regenerate using:
+    // gz sdf -p test/worlds/empty_different_name.world
+    // | sed ':a;N;$!ba;s/\n/\\n/g' | sed 's/"/\\"/g'
+    std::string output =
+      custom_exec_str(std::string("gz sdf -p ") + path.string());
+    std::string shasum = gazebo::common::get_sha1<std::string>(output);
+    EXPECT_EQ(shasum, "19898716e05fecb7bd1d78e43fe1294ccf403bbf");
+  }
+
+  path = PROJECT_BINARY_PATH;
+  path = path / "test" / "sdf_convert_test.world";
+  std::ofstream file(path.string().c_str(), std::ios::out);
+  file << "<?xml version='1.0' ?>"
+    "<sdf version='1.3'>"
+    "<world name='default'>"
+    "<include><uri>model://camera</uri></include>"
+    "</world>"
+    "</sdf>";
+  file.close();
+
+  {
+    // Convert 1.3 SDF
+    std::string output =
+      custom_exec_str(std::string("gz sdf -c ") + path.string());
+    EXPECT_EQ(output, "Success\n");
+  }
+
+  fini();
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/tools/gz_build_test.bash b/tools/gz_build_test.bash
new file mode 100755
index 0000000..5b2e443
--- /dev/null
+++ b/tools/gz_build_test.bash
@@ -0,0 +1,85 @@
+#!/bin/bash
+
+# Get the list of branches to check. Use default if no branch specified.
+if [ "$#" -ne "0" ]
+then
+  branches="$@"
+else
+  branches="default"
+fi
+
+# Create a logfile based on the current time
+timestamp=`eval date +%d_%m_%Y_%R:%S`
+logfile="/tmp/gazebo_test-$timestamp.txt"
+logfileVerbose="/tmp/gazebo_test-$timestamp-verbose.txt"
+logfileRaw=/tmp/gazebo_build/raw.log
+
+# Create working directory
+cd 
+rm -rf /tmp/gazebo_build
+mkdir /tmp/gazebo_build
+
+# Clone
+hg clone https://bitbucket.org/osrf/gazebo /tmp/gazebo_build/source
+
+start_time=`eval date +%s`
+
+PATH=/tmp/gazebo_build/install/bin:$PATH
+LD_LIBRARY_PATH=/tmp/gazebo_build/install/lib:$LD_LIBRARY_PATH
+
+# Process each branch from the command line
+for branch in $branches
+do
+  # Get the correct branch
+  cd /tmp/gazebo_build/source
+  hg up $branch
+
+  # Build
+  rm -rf build
+  mkdir build
+  cd build
+  cmake -DCMAKE_INSTALL_PREFIX=/tmp/gazebo_build/install ../
+  make -j4 install
+  . /tmp/gazebo_build/install/share/gazebo/setup.sh
+
+  echo "Branch: $branch" >> $logfile
+  echo "==================================================" >> $logfile
+  echo "Test Results" >> $logfile
+  # Run make test many times, only capture failures
+  for i in {1..10}
+  do
+    cd /tmp/gazebo_build/source/build
+
+    # make test with verbose output
+    make test ARGS="-VV" &> $logfileRaw
+    grep '^ *[0-9]*/[0-9]* .*\*\*\*' $logfileRaw >> $logfile
+
+    # for each failed test
+    for f in `grep '^ *[0-9]*/[0-9]* .*\*\*\*' $logfileRaw | \
+      sed -e 's@^ *\([0-9]*\)/.*@\1@'`
+    do
+      # output some brief info
+      echo Try $i of 10, failed test $f >> $logfileVerbose
+      # then send the raw output of both the test and its companion test_ran
+      # to the logfile for perusal
+      grep '^ *'`echo "(($f-1)/2)*2+1" | bc`':' $logfileRaw >> $logfileVerbose
+      grep '^ *'`echo "(($f-1)/2)*2+2" | bc`':' $logfileRaw >> $logfileVerbose
+    done
+  done
+
+  echo "Code Check Results" >> $logfile
+  # Run code checker
+  cd /tmp/gazebo_build/source
+  sh tools/code_check.sh >> $logfile
+done
+
+end_time=`eval date +%s`
+duration=`expr $end_time - $start_time`
+hour=`expr $duration / 3600`
+min=`expr $(( $duration - $hour * 3600 )) / 60`
+sec=`expr $duration - $hour \* 3600 - $min \* 60`
+echo "Duration: $hour hr $min min $sec sec" >> $logfile
+
+# Cleanup
+cd
+rm -rf /tmp/gazebo_build
diff --git a/tools/gz_cloc.py b/tools/gz_cloc.py
deleted file mode 100644
index e2601ab..0000000
--- a/tools/gz_cloc.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/python
-
-import subprocess
-import datetime
-
-# Warning: This script will update the current repository!!
-
-# How to use
-# 1. This run this script in the root director of Gazebo.
-# 2. The output will be written to /tmp/gz_loc.csv
-# 3. Load into a Google spreadsheet.
-# 4. Generate a graph, and select Time Line as the graph type.
-
-start_year = 2007
-
-f = open('/tmp/gz_loc.csv', 'w')
-
-now = datetime.datetime.now()
-
-f.write("date,blank,comment,code\n")
-
-for y in range(start_year, now.year+1):
-  if y == now.year:
-    end_month = now.month + 1
-  else:
-    end_month = 13
-
-  for m in range(1,end_month):
-    date = str(y) + "-" + str(m) 
-    cmd = "hg up -d \"" + date + "\""
-    print cmd
-    os.system(cmd)
-
-    cmd = "cloc --force-lang=\"C++\",cc --force-lang=\"C++\",c --force-lang=\"C++\",hh --force-lang=\"C++\",h --force-lang=\"C++\",hpp --exclude-lang=\"XML\",\"HTML\",\"XSD\",\"Python\",\"make\",\"Bourne Shell\",\"Javascript\",\"CSS\",\"m4\",\"Ruby\",\"DOS Batch\" --exclude_dir=deps,Media,media,cmake,doc,build --csv --quiet --progress-rate=0 * | tail -n 1"
-    proc = subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True)
-    (out, err) = proc.communicate()
-    out_parts = out.split(',')
-    f.write("%d/01/%d, %s, %s, %s" % (m, y, out_parts[2], out_parts[3], out_parts[4]))
-
-f.close()
diff --git a/tools/gz_cloc.rb b/tools/gz_cloc.rb
new file mode 100755
index 0000000..45b892f
--- /dev/null
+++ b/tools/gz_cloc.rb
@@ -0,0 +1,56 @@
+#!/usr/bin/env ruby
+
+# Warning: This script will update the current repository!!
+#
+# How to use
+# 1. Run this script in the root directory of Gazebo.
+# 2. The output will be written to /tmp/gz_loc.csv
+# 3. Load into a Google spreadsheet.
+# 4. Generate a graph, and select Time Line as the graph type.
+
+printf("Warning: This will modify the current repository.\n")
+printf("Do you want to continue (Y/n): ")
+char = gets
+
+if char != "Y\n"
+  abort
+end
+
+startYear = 2007
+
+f = File.open('/tmp/gz_loc.csv', 'w')
+
+time = Time.new
+
+f.printf("date,blank,comment,code\n")
+
+# Loop through all the years.
+for y in (startYear..time.year)
+
+  # Get the end month
+  endMonth = y == time.year ? time.month : 12
+
+  # Loop through all the months.
+  for m in (1..endMonth)
+    date = y.to_s + "-" + m.to_s
+
+    # Update the repo
+    `hg up -C -d "#{date}"`
+
+    # Count lines of code
+    result = `cloc --force-lang=\"C++\",cc --force-lang=\"C++\",c --force-lang=\"C++\",hh --force-lang=\"C++\",h --force-lang=\"C++\",hpp --exclude_dir=deps,Media,media,cmake,doc,build --csv --quiet --progress-rate=0 *`
+
+    lines = result.split("\n")
+
+    # Grab just C++ results
+    lines.each do |line|
+      if line.include?("C++")
+        parts = line.split(",")
+        printf("%d/01/%d, %s, %s, %s\n", m, y, parts[2], parts[3], parts[4])
+        f.printf("%d/01/%d, %s, %s, %s\n", m, y, parts[2], parts[3], parts[4])
+      end
+    end
+  end
+end
+
+f.close()
diff --git a/tools/gz_log.cc b/tools/gz_log.cc
new file mode 100644
index 0000000..7fbea33
--- /dev/null
+++ b/tools/gz_log.cc
@@ -0,0 +1,939 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <boost/algorithm/string/regex.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/posix_time/posix_time_io.hpp>
+
+#include <gazebo/util/util.hh>
+#include "gz_log.hh"
+
+sdf::ElementPtr g_stateSdf;
+
+using namespace gazebo;
+
+/////////////////////////////////////////////////
+FilterBase::FilterBase(bool _xmlOutput, const std::string &_stamp)
+: xmlOutput(_xmlOutput), stamp(_stamp)
+{
+}
+
+/////////////////////////////////////////////////
+std::ostringstream &FilterBase::Out(std::ostringstream &_stream,
+    const gazebo::physics::State &_state)
+{
+  if (!this->xmlOutput && !this->stamp.empty())
+  {
+    if (this->stamp == "sim")
+      _stream << _state.GetSimTime().Double() << " ";
+    else if (this->stamp == "real")
+      _stream << _state.GetRealTime().Double() << " ";
+    else if (this->stamp == "wall")
+      _stream << _state.GetWallTime().Double() << " ";
+  }
+
+  return _stream;
+}
+
+/////////////////////////////////////////////////
+std::string FilterBase::FilterPose(const gazebo::math::Pose &_pose,
+    const std::string &_xmlName,
+    std::string _filter,
+    const gazebo::physics::State &_state)
+{
+  std::ostringstream result;
+  std::string xmlPrefix, xmlSuffix;
+
+  // Remove brackets, if they exist
+  boost::erase_all(_filter, "[");
+  boost::erase_all(_filter, "]");
+
+  // Output XML tags if required.
+  if (this->xmlOutput)
+  {
+    xmlPrefix = std::string("<") + _xmlName + ">";
+    xmlSuffix = std::string("</") + _xmlName + ">";
+  }
+
+  // Get the euler angles.
+  gazebo::math::Vector3 rpy = _pose.rot.GetAsEuler();
+
+  // If the filter is empty, then output the whole pose.
+  if (!_filter.empty())
+  {
+    // Get the list of pose elements from the filter
+    std::list<std::string> elements;
+    boost::split(elements, _filter, boost::is_any_of(","));
+    if (elements.empty() && !_filter.empty())
+      elements.push_back(_filter);
+
+    // Iterate over the list of pose elements.
+    for (std::list<std::string>::iterator elemIter =
+        elements.begin(); elemIter != elements.end();
+        ++elemIter)
+    {
+      switch ((*elemIter)[0])
+      {
+        case 'X':
+        case 'x':
+          this->Out(result, _state) << std::fixed
+            << _pose.pos.x << " ";
+          break;
+        case 'Y':
+        case 'y':
+          this->Out(result, _state) << std::fixed
+            << _pose.pos.y << " ";
+          break;
+        case 'Z':
+        case 'z':
+          this->Out(result, _state) << std::fixed
+            << _pose.pos.z << " ";
+          break;
+        case 'R':
+        case 'r':
+          this->Out(result, _state) << std::fixed << rpy.x << " ";
+          break;
+        case 'P':
+        case 'p':
+          this->Out(result, _state) << std::fixed << rpy.y << " ";
+          break;
+        case 'A':
+        case 'a':
+          this->Out(result, _state) << std::fixed << rpy.z << " ";
+          break;
+        default:
+          std::cerr << "Invalid pose value[" << *elemIter << "]\n";
+          break;
+      }
+    }
+    result << std::endl;
+  }
+  else
+  {
+    // No filter, so output the whole pose.
+    if (!xmlPrefix.empty())
+    {
+      result << std::fixed << xmlPrefix << _pose
+        << xmlSuffix << std::endl;
+    }
+    else
+      this->Out(result, _state) << _pose << std::endl;
+  }
+
+  return result.str();
+}
+
+
+/////////////////////////////////////////////////
+JointFilter::JointFilter(bool _xmlOutput, const std::string &_stamp)
+: FilterBase(_xmlOutput, _stamp)
+{
+}
+
+/////////////////////////////////////////////////
+void JointFilter::Init(const std::string &_filter)
+{
+  this->parts.clear();
+
+  if (!_filter.empty())
+  {
+    boost::split(this->parts, _filter, boost::is_any_of("."));
+
+    if (this->parts.empty())
+      this->parts.push_back(_filter);
+  }
+}
+
+/////////////////////////////////////////////////
+std::string JointFilter::FilterParts(gazebo::physics::JointState &_state,
+              std::list<std::string>::iterator _partIter)
+{
+  std::ostringstream result;
+  std::string part = *_partIter;
+
+  // Remove brackets, if they exist
+  boost::erase_all(part, "[");
+  boost::erase_all(part, "]");
+
+  // If the filter is empty, then output all the angles.
+  if (!part.empty())
+  {
+    // Get the list of axis elements from the filter
+    std::list<std::string> elements;
+    boost::split(elements, part, boost::is_any_of(","));
+    if (elements.empty() && !part.empty())
+      elements.push_back(part);
+
+    // Iterate over the list of axis elements.
+    for (std::list<std::string>::iterator elemIter =
+        elements.begin(); elemIter != elements.end();
+        ++elemIter)
+    {
+      try
+      {
+        unsigned int axis =
+          boost::lexical_cast<unsigned int>(*elemIter);
+
+        if (axis >= _state.GetAngleCount())
+          continue;
+
+        gazebo::math::Angle angle = _state.GetAngle(axis);
+
+        if (this->xmlOutput)
+        {
+          result << "<angle axis='" << *elemIter << "'>"
+            << std::fixed << angle << "</angle>\n";
+        }
+        else
+          this->Out(result, _state) << std::fixed << angle << " ";
+      }
+      catch(...)
+      {
+        std::cerr << "Inavlid axis value[" << *elemIter << "]\n";
+      }
+    }
+  }
+
+  return result.str();
+}
+
+/////////////////////////////////////////////////
+std::string JointFilter::Filter(gazebo::physics::ModelState &_state)
+{
+  std::ostringstream result;
+
+  gazebo::physics::JointState_M states;
+  std::list<std::string>::iterator partIter;
+
+  /// Get an iterator to the list of the command line parts.
+  partIter = this->parts.begin();
+
+  // The first element in the filter must be a link name or a star.
+  std::string regexStr = *partIter;
+  boost::replace_all(regexStr, "*", ".*");
+  boost::regex regex(regexStr);
+  states = _state.GetJointStates(regex);
+
+  ++partIter;
+
+  // Filter all the link states that were found.
+  for (gazebo::physics::JointState_M::iterator iter =
+      states.begin(); iter != states.end(); ++iter)
+  {
+    // Filter the elements of the joint (angle).
+    // If no filter parts were specified,
+    // then output the whole joint state.
+    if (partIter != this->parts.end())
+    {
+      if (this->xmlOutput)
+        result << "<joint name='" << iter->first << "'>\n";
+
+      result << this->FilterParts(iter->second, partIter);
+
+      if (this->xmlOutput)
+        result << "</joint>\n";
+    }
+    else
+    {
+      if (!this->xmlOutput && iter->second.GetAngleCount() == 1)
+        result << std::fixed << iter->second.GetAngle(0);
+      else
+        result << std::fixed << iter->second;
+    }
+  }
+
+  return result.str();
+}
+
+/////////////////////////////////////////////////
+LinkFilter::LinkFilter(bool _xmlOutput, const std::string &_stamp)
+: FilterBase(_xmlOutput, _stamp)
+{
+}
+
+/////////////////////////////////////////////////
+void LinkFilter::Init(const std::string &_filter)
+{
+  this->parts.clear();
+
+  if (!_filter.empty())
+  {
+    boost::split(this->parts, _filter, boost::is_any_of("."));
+
+    if (this->parts.empty())
+      this->parts.push_back(_filter);
+  }
+}
+
+/////////////////////////////////////////////////
+std::string LinkFilter::FilterParts(gazebo::physics::LinkState &_state,
+              std::list<std::string>::iterator _partIter)
+{
+  std::ostringstream result;
+
+  std::string part = *_partIter;
+  std::string elemParts;
+
+  ++_partIter;
+  if (_partIter != this->parts.end())
+    elemParts = *_partIter;
+
+  if (part == "pose")
+    result << this->FilterPose(_state.GetPose(), part, elemParts,
+        _state);
+  else if (part == "acceleration")
+    result << this->FilterPose(_state.GetAcceleration(), part,
+        elemParts, _state);
+  else if (part == "velocity")
+    result << this->FilterPose(_state.GetVelocity(), part, elemParts,
+        _state);
+  else if (part == "wrench")
+    result << this->FilterPose(_state.GetWrench(), part, elemParts,
+        _state);
+
+  return result.str();
+}
+
+/////////////////////////////////////////////////
+std::string LinkFilter::Filter(gazebo::physics::ModelState &_state)
+{
+  std::ostringstream result;
+
+  gazebo::physics::LinkState_M states;
+  std::list<std::string>::iterator partIter;
+
+  /// Get an iterator to the list of the command line parts.
+  partIter = this->parts.begin();
+
+  // The first element in the filter must be a link name or a star.
+  if (*partIter != "*")
+  {
+    std::string regexStr = *partIter;
+    boost::replace_all(regexStr, "*", ".*");
+    boost::regex regex(regexStr);
+    states = _state.GetLinkStates(regex);
+  }
+  else
+    states = _state.GetLinkStates();
+
+  ++partIter;
+
+  // Filter all the link states that were found.
+  for (gazebo::physics::LinkState_M::iterator iter =
+      states.begin(); iter != states.end(); ++iter)
+  {
+    // Filter the elements of the link (pose, velocity,
+    // acceleration, wrench). If no filter parts were specified,
+    // then output the whole link state.
+    if (partIter != this->parts.end())
+    {
+      if (this->xmlOutput)
+        result << "<link name='" << iter->second.GetName() << "'>\n";
+
+      result << this->FilterParts(iter->second, partIter);
+
+      if (this->xmlOutput)
+        result << "</link>\n";
+    }
+    else
+      result << std::fixed << iter->second << std::endl;
+  }
+
+  return result.str();
+}
+
+/////////////////////////////////////////////////
+ModelFilter::ModelFilter(bool _xmlOutput, const std::string &_stamp)
+: FilterBase(_xmlOutput, _stamp)
+{
+  this->linkFilter = NULL;
+  this->jointFilter = NULL;
+}
+
+/////////////////////////////////////////////////
+ModelFilter::~ModelFilter()
+{
+  delete this->linkFilter;
+  delete this->jointFilter;
+}
+
+/////////////////////////////////////////////////
+void ModelFilter::Init(const std::string &_filter)
+{
+  this->linkFilter = NULL;
+  this->jointFilter = NULL;
+  this->parts.clear();
+
+  if (_filter.empty())
+    return;
+
+  std::list<std::string> mainParts;
+  boost::split(mainParts, _filter, boost::is_any_of("/"));
+
+  // Create the model filter
+  if (!mainParts.empty())
+  {
+    boost::split(this->parts, mainParts.front(),
+        boost::is_any_of("."));
+    if (this->parts.empty() && !mainParts.front().empty())
+      this->parts.push_back(mainParts.front());
+  }
+
+  if (mainParts.empty())
+    return;
+
+  mainParts.pop_front();
+
+  // Create the link filter
+  if (!mainParts.empty() && !mainParts.front().empty())
+  {
+    this->linkFilter = new LinkFilter(this->xmlOutput, this->stamp);
+    this->linkFilter->Init(mainParts.front());
+  }
+
+  if (mainParts.empty())
+    return;
+
+  mainParts.pop_front();
+
+  // Create the joint filter
+  if (!mainParts.empty())
+  {
+    this->jointFilter = new JointFilter(this->xmlOutput,
+        this->stamp);
+    this->jointFilter->Init(mainParts.front());
+  }
+}
+
+/////////////////////////////////////////////////
+std::string ModelFilter::FilterParts(gazebo::physics::ModelState &_state,
+              std::list<std::string>::iterator _partIter)
+{
+  std::ostringstream result;
+
+  // Currently a model can only have a pose.
+  if (*_partIter == "pose")
+  {
+    // Get the model state pose
+    gazebo::math::Pose pose = _state.GetPose();
+    ++_partIter;
+
+    // Get the elements to filter pose by.
+    std::string elemParts;
+    if (_partIter != this->parts.end())
+      elemParts = *_partIter;
+
+    // Output the filtered pose.
+    result << this->FilterPose(pose, "pose", elemParts, _state);
+  }
+  else
+    std::cerr << "Invalid model state component["
+      << *_partIter << "]\n";
+
+  return result.str();
+}
+
+/////////////////////////////////////////////////
+std::string ModelFilter::Filter(gazebo::physics::WorldState &_state)
+{
+  std::ostringstream result;
+
+  gazebo::physics::ModelState_M states;
+  std::list<std::string>::iterator partIter = this->parts.begin();
+
+  // The first element in the filter must be a model name or a star.
+  if (partIter != this->parts.end() && !this->parts.empty() &&
+      !(*partIter).empty() && (*partIter) != "*")
+  {
+    std::string regexStr = *partIter;
+    boost::replace_all(regexStr, "*", ".*");
+    boost::regex regex(regexStr);
+    states = _state.GetModelStates(regex);
+  }
+  else
+    states = _state.GetModelStates();
+
+  ++partIter;
+
+  // Filter all the model states that were found.
+  for (gazebo::physics::ModelState_M::iterator iter =
+      states.begin(); iter != states.end(); ++iter)
+  {
+    // If no link filter, and no model parts, then output the
+    // whole model state.
+    if (!this->linkFilter && !this->jointFilter &&
+        partIter == this->parts.end())
+      result << std::fixed << iter->second;
+    else
+    {
+      if (this->xmlOutput)
+        result << "<model name='" << iter->second.GetName() << "'>\n";
+
+      // Filter the pose of the model.
+      if (partIter != this->parts.end())
+        result << this->FilterParts(iter->second, partIter);
+
+      // Apply link filtering, if a link filter exists.
+      if (this->linkFilter)
+        result << this->linkFilter->Filter(iter->second);
+
+      // Apply link filtering, if a link filter exists.
+      if (this->jointFilter)
+        result << this->jointFilter->Filter(iter->second);
+
+      if (this->xmlOutput)
+        result << "</model>\n";
+    }
+  }
+
+  return result.str();
+}
+
+/////////////////////////////////////////////////
+StateFilter::StateFilter(bool _xmlOutput, const std::string &_stamp,
+              double _hz)
+: FilterBase(_xmlOutput, _stamp), filter(_xmlOutput, _stamp),
+  hz(_hz)
+{}
+
+/////////////////////////////////////////////////
+void StateFilter::Init(const std::string &_filter)
+{
+  this->filter.Init(_filter);
+}
+
+/////////////////////////////////////////////////
+std::string StateFilter::Filter(const std::string &_stateString)
+{
+  gazebo::physics::WorldState state;
+
+  // Read and parse the state information
+  g_stateSdf->ClearElements();
+  sdf::readString(_stateString, g_stateSdf);
+  state.Load(g_stateSdf);
+
+  std::ostringstream result;
+
+  if (this->hz > 0.0 && this->prevTime != gazebo::common::Time::Zero)
+  {
+    if ((state.GetSimTime() - this->prevTime).Double() <
+        1.0 / this->hz)
+    {
+      return result.str();
+    }
+  }
+
+  if (this->xmlOutput)
+  {
+    result << "<sdf version='" << SDF_VERSION << "'>\n"
+      << "<state world_name='" << state.GetName() << "'>\n"
+      << "<sim_time>" << state.GetSimTime() << "</sim_time>\n"
+      << "<real_time>" << state.GetRealTime() << "</real_time>\n"
+      << "<wall_time>" << state.GetWallTime() << "</wall_time>\n";
+  }
+
+  result << this->filter.Filter(state);
+
+  if (this->xmlOutput)
+    result << "</sdf></state>\n";
+
+  this->prevTime = state.GetSimTime();
+  return result.str();
+}
+
+/////////////////////////////////////////////////
+LogCommand::LogCommand()
+  : Command("log", "Introspects and manipulates Gazebo log files.")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("info,i", "Output information about a log file. "
+     "Log filename should be specified using the --file option")
+    ("echo,e", "Output the contents of a log file to screen.")
+    ("step,s", "Step through the contents of a log file.")
+    ("record,d", po::value<bool>(),
+     "Start/stop recording a log file from an active Gazebo server."
+     "O=stop record, 1=start recording.")
+    ("world-name,w", po::value<std::string>(), "World name, used when "
+     "starting or stopping recording.")
+    ("raw,r", "Output the data from echo and step without XML formatting."
+     "Used in conjuction with --echo or --step.")
+    ("stamp", po::value<std::string>(), "Add a timestamp to each line of "
+     "output. Valid values are (sim,real,wall)")
+    ("hz,z", po::value<double>(), "Filter output to the specified Hz rate."
+     "Only valid for echo and step commands.")
+    ("file,f", po::value<std::string>(), "Path to a log file.")
+    ("filter", po::value<std::string>(),
+     "Filter output. Valid only for the echo and step commands");
+}
+
+/////////////////////////////////////////////////
+void LogCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tIntrospect and manipulate Gazebo log files. The log   \n"
+    "\tcommand can also start and stop data log recording from \n"
+    "\tan active Gazebo server.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool LogCommand::TransportRequired()
+{
+  return this->vm.count("record");
+}
+
+/////////////////////////////////////////////////
+bool LogCommand::RunImpl()
+{
+  std::string filename, filter, stamp, worldName;
+  double hz = 0;
+  bool raw = false;
+
+  if (this->vm.count("world-name"))
+    worldName = this->vm["world-name"].as<std::string>();
+
+  if (this->TransportRequired())
+  {
+    this->node.reset(new transport::Node());
+    this->node->Init(worldName);
+  }
+
+  // Get filter
+  filter = this->vm.count("filter") ? this->vm["filter"].as<std::string>() : "";
+
+  // Get stamp
+  stamp = this->vm.count("stamp") ? this->vm["stamp"].as<std::string>() : "";
+
+  // Get hz
+  hz = this->vm.count("hz") ? this->vm["hz"].as<double>() : 0;
+
+  raw = this->vm.count("raw");
+
+  if (!this->vm.count("record"))
+  {
+    // Load the log file
+    if (this->vm.count("file"))
+      filename = vm["file"].as<std::string>();
+    else
+    {
+      std::cerr << "No log file specified\n";
+      std::cerr << "For more info: gz help log\n";
+
+      return false;
+    }
+
+    // Load log file from string
+    if (!this->LoadLogFromFile(filename))
+    {
+      return false;
+    }
+  }
+
+  // Create a state sdf element.
+  g_stateSdf.reset(new sdf::Element);
+  sdf::initFile("state.sdf", g_stateSdf);
+
+  if (this->vm.count("echo"))
+    this->Echo(filter, raw, stamp, hz);
+  else if (this->vm.count("step"))
+    this->Step(filter, raw, stamp, hz);
+  else if (this->vm.count("record"))
+    this->Record(this->vm["record"].as<bool>());
+  else if (this->vm.count("info"))
+    this->Info(filename);
+  else
+    this->Help();
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+void LogCommand::Info(const std::string &_filename)
+{
+  gazebo::util::LogPlay *play = gazebo::util::LogPlay::Instance();
+
+  // Get the SDF world description from the log file
+  std::string sdfString;
+  gazebo::util::LogPlay::Instance()->Step(sdfString);
+
+  // Parse the first SDF world description
+  sdf::ElementPtr sdf(new sdf::Element);
+  sdf::initFile("root.sdf", sdf);
+  sdf::readString(sdfString, sdf);
+
+  gazebo::physics::WorldState state;
+
+  // unsigned int modelCount = 0;
+
+  gazebo::common::Time endTime(0, 0);
+  gazebo::common::Time startTime(0, 0);
+
+  if (sdf)
+  {
+    // Check for a world element
+    if (sdf->HasElement("world"))
+    {
+      // Get a pointer to the world element
+      sdf::ElementPtr worldElem = sdf->GetElement("world");
+
+      // Check for a model
+      if (worldElem->HasElement("model"))
+      {
+        // Get a pointer to the first model element.
+        sdf::ElementPtr modelElem = worldElem->GetElement("model");
+
+        // Count all the model elements.
+        while (modelElem)
+        {
+          // modelCount++;
+          modelElem = modelElem->GetNextElement("model");
+        }
+      }
+
+      // Get the state for the world at the start.
+      if (worldElem->HasElement("state"))
+      {
+        state.Load(worldElem->GetElement("state"));
+
+        // Store the start time.
+        startTime = state.GetWallTime();
+      }
+    }
+
+      // Get the last chunk for the endTime
+    if (play->GetChunkCount() > 1)
+    {
+      std::string stateString;
+      play->GetChunk(play->GetChunkCount()-1, stateString);
+
+      g_stateSdf->ClearElements();
+      sdf::readString(stateString, g_stateSdf);
+
+      state.Load(g_stateSdf);
+      endTime = state.GetWallTime();
+    }
+    else
+      endTime = startTime;
+  }
+
+  // Tell cout how to output boost dates
+  boost::posix_time::time_facet *facet =
+    new boost::posix_time::time_facet("%b %d %y %H:%M:%S");
+  std::cout.imbue(std::locale(std::locale::classic(), facet));
+
+  // Compute the duration
+  gazebo::common::Time deltaTime = endTime - startTime;
+  // int hours = deltaTime.sec / 3600;
+  // int minutes = (deltaTime.sec - hours * 3600) / 60;
+  // int seconds = (deltaTime.sec - hours * 3600 - minutes * 60);
+
+  // Output info
+  std::cout
+    << "Log Version:    " << play->GetLogVersion() << "\n"
+    << "Gazebo Version: " << play->GetGazeboVersion() << "\n"
+    << "Random Seed:    " << play->GetRandSeed() << "\n"
+    // << "Start:          " << boost::posix_time::from_time_t(startTime.sec)
+    // << "." << startTime.nsec << "\n"
+    // << "End:            " << boost::posix_time::from_time_t(endTime.sec)
+    // << "." << endTime.nsec << "\n"
+    // << "Duration:       " << std::setfill('0') << std::setw(2)
+    // << hours << ":"
+    //                       << std::setfill('0')
+    //                       << std::setw(2) << minutes << ":"
+    //                       << std::setfill('0') << std::setw(2)
+    //                       << seconds << "."
+    //                       << deltaTime.nsec << "\n"
+    // << "Steps:          " << play->GetChunkCount() << "\n"
+    << "Size:           " << this->GetFileSizeStr(_filename) << "\n"
+    << "Encoding:       " << play->GetEncoding() << "\n"
+    // << "Model Count:    " << modelCount << "\n"
+    << "\n";
+}
+
+/////////////////////////////////////////////////
+void LogCommand::Echo(const std::string &_filter, bool _raw,
+    const std::string &_stamp, double _hz)
+{
+  gazebo::util::LogPlay *play = gazebo::util::LogPlay::Instance();
+  std::string stateString;
+
+  // Output the header
+  if (!_raw)
+    std::cout << play->GetHeader() << std::endl;
+
+  StateFilter filter(!_raw, _stamp, _hz);
+  filter.Init(_filter);
+
+  unsigned int i = 0;
+  while (play->Step(stateString))
+  {
+    if (i > 0)
+      stateString = filter.Filter(stateString);
+    else if (i == 0 && _raw)
+      stateString.clear();
+
+    if (!stateString.empty())
+    {
+      if (!_raw)
+        std::cout << "<chunk encoding='txt'><![CDATA[\n";
+
+      std::cout << stateString;
+
+      if (!_raw)
+        std::cout << "]]></chunk>\n";
+    }
+
+    ++i;
+  }
+
+  if (!_raw)
+    std::cout << "</gazebo_log>\n";
+}
+
+/////////////////////////////////////////////////
+void LogCommand::Step(const std::string &_filter, bool _raw,
+    const std::string &_stamp, double _hz)
+{
+  std::string stateString;
+  gazebo::util::LogPlay *play = gazebo::util::LogPlay::Instance();
+
+  if (!_raw)
+    std::cout << play->GetHeader() << std::endl;
+
+  char c = '\0';
+
+  StateFilter filter(!_raw, _stamp, _hz);
+  filter.Init(_filter);
+
+  unsigned int i = 0;
+  while (play->Step(stateString) && c != 'q')
+  {
+    if (i > 0)
+      stateString = filter.Filter(stateString);
+    else if (i == 0 && _raw)
+      stateString.clear();
+
+    // Only wait for user input if there is some state to output.
+    if (!stateString.empty())
+    {
+      if (!_raw)
+        std::cout << "<chunk encoding='txt'><![CDATA[\n";
+      std::cout << stateString;
+
+      if (!_raw)
+        std::cout << "]]></chunk>\n";
+
+      std::cout << "\n--- Press space to continue, 'q' to quit ---\n";
+
+      c = '\0';
+
+      // Wait for a space or 'q' key press
+      while (c != ' ' && c != 'q')
+        c = this->GetChar();
+    }
+    ++i;
+  }
+
+  if (!_raw)
+    std::cout << "</gazebo_log>\n";
+}
+
+/////////////////////////////////////////////////
+void LogCommand::Record(bool _start)
+{
+  gazebo::transport::PublisherPtr pub =
+    this->node->Advertise<gazebo::msgs::LogControl>("~/log/control");
+
+  if (!pub->WaitForConnection(gazebo::common::Time(10, 0)))
+  {
+    std::cerr << "Unable to create a connection to topic ~/log/control.\n";
+    return;
+  }
+
+  gazebo::msgs::LogControl msg;
+  _start ? msg.set_start(true) : msg.set_stop(true);
+  pub->Publish<gazebo::msgs::LogControl>(msg, true);
+}
+
+/////////////////////////////////////////////////
+std::string LogCommand::GetFileSizeStr(const std::string &_filename)
+{
+  std::ostringstream size;
+
+  // Open the file
+  std::ifstream ifs(_filename.c_str());
+  if (!ifs)
+  {
+    std::cerr << "Unable to open file[" << _filename << "]\n";
+    return std::string();
+  }
+
+  // Move to the end of the file
+  ifs.seekg(0, std::ios::end);
+
+  // Get the position of the file pointer, which is the number of bytes in
+  // the file.
+  int byteSize = ifs.tellg();
+
+  // Generate a human friendly string
+  if (byteSize < 1000)
+    size << byteSize << " B";
+  else if (byteSize < 1000000)
+    size << byteSize / 1000.0f << " KB";
+  else
+    size << byteSize / 1.0e6 << " MB";
+
+  return size.str();
+}
+
+/////////////////////////////////////////////////
+int LogCommand::GetChar()
+{
+  struct termios oldt, newt;
+  int ch;
+  tcgetattr(STDIN_FILENO, &oldt);
+  newt = oldt;
+  newt.c_lflag &= ~(ICANON | ECHO);
+  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
+  ch = getchar();
+  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
+
+  return ch;
+}
+
+/////////////////////////////////////////////////
+bool LogCommand::LoadLogFromFile(const std::string &_filename)
+{
+  if (_filename.empty())
+  {
+    std::cerr << "Log filename is empty.\n";
+    return false;
+  }
+
+  try
+  {
+    gazebo::util::LogPlay::Instance()->Open(_filename);
+  }
+  catch(gazebo::common::Exception &_e)
+  {
+    std::cerr << "Unable to open log file[" << _filename << "]\n";
+    return false;
+  }
+
+  return true;
+}
diff --git a/tools/gz_log.hh b/tools/gz_log.hh
new file mode 100644
index 0000000..4937ec4
--- /dev/null
+++ b/tools/gz_log.hh
@@ -0,0 +1,243 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GZ_LOG_HH_
+#define _GZ_LOG_HH_
+
+#include <string>
+#include <list>
+
+#include <gazebo/physics/WorldState.hh>
+#include "gz.hh"
+
+namespace gazebo
+{
+  /// \brief Base class for all filters.
+  class FilterBase
+  {
+    /// \brief Constructor
+    /// \param[in] _xmlOutput True if the output should be in XML format.
+    /// \param[in[ _stamp Type of stamp to apply.
+    public: FilterBase(bool _xmlOutput, const std::string &_stamp);
+
+    /// \brief Output a line of data.
+    /// \param[in] _stream The output stream.
+    /// \param[in] _state Current state.
+    /// \return Reference to the output stream.
+    public: std::ostringstream &Out(std::ostringstream &_stream,
+                const gazebo::physics::State &_state);
+
+    /// \brief Filter a pose.
+    /// \param[in] _pose The pose to filter.
+    /// \param[in] _xmlName Name of the xml tag.
+    /// \param[in] _filter The filter string [x,y,z,r,p,a].
+    /// \param[in] _state Current state.
+    /// \return Filtered pose string.
+    public: std::string FilterPose(const gazebo::math::Pose &_pose,
+                const std::string &_xmlName,
+                std::string _filter,
+                const gazebo::physics::State &_state);
+
+    /// \brief True if XML output is requested.
+    protected: bool xmlOutput;
+
+    /// \brief Time stamp type
+    protected: std::string stamp;
+  };
+
+  /// \brief Filter for joint state.
+  class JointFilter : public FilterBase
+  {
+    /// \brief Constructor.
+    /// \param[in] _xmlOutput True if the output should be in XML format.
+    /// \param[in] _stamp Type of stamp to apply.
+    public: JointFilter(bool _xmlOutput, const std::string &_stamp);
+
+    /// \brief Initialize the filter.
+    /// \param[in] _filter The command line filter string.
+    public: void Init(const std::string &_filter);
+
+    /// \brief Filter joint parts (angle)
+    /// \param[in] _state Link state to filter.
+    /// \param[in] _partIter Iterator to the filtered string parts.
+    /// \return Filtered joint string.
+    public: std::string FilterParts(gazebo::physics::JointState &_state,
+                std::list<std::string>::iterator _partIter);
+
+    /// \brief Filter the joints in a Model state, and output the result
+    /// as a string.
+    /// \param[in] _state The model state to filter.
+    /// \return Filtered string.
+    public: std::string Filter(gazebo::physics::ModelState &_state);
+
+    /// \brief The list of filter strings.
+    public: std::list<std::string> parts;
+  };
+
+  /// \brief Filter for link state.
+  class LinkFilter : public FilterBase
+  {
+    /// \brief Constructor.
+    /// \param[in] _xmlOutput True if the output should be in XML format.
+    /// \param[in] _stamp Type of stamp to apply.
+    public: LinkFilter(bool _xmlOutput, const std::string &_stamp);
+
+    /// \brief Initialize the filter.
+    /// \param[in] _filter The command line filter string.
+    public: void Init(const std::string &_filter);
+
+    /// \brief Filter link parts (pose, velocity, acceleration, wrench)
+    /// \param[in] _state Link state to filter.
+    /// \param[in] _partIter Iterator to the filtered string parts.
+    /// \return Filtered string
+    public: std::string FilterParts(gazebo::physics::LinkState &_state,
+                std::list<std::string>::iterator _partIter);
+
+    /// \brief Filter the links in a Model state, and output the result
+    /// as a string.
+    /// \param[in] _state The model state to filter.
+    /// \return Filtered string.
+    public: std::string Filter(gazebo::physics::ModelState &_state);
+
+    /// \brief The list of filter strings.
+    public: std::list<std::string> parts;
+  };
+
+  /// \brief Filter for model state.
+  class ModelFilter : public FilterBase
+  {
+    /// \brief Constructor.
+    /// \param[in] _xmlOutput True if the output should be in XML format.
+    /// \param[in] _stamp Type of stamp to apply.
+    public: ModelFilter(bool _xmlOutput, const std::string &_stamp);
+
+    /// \brief Destructor.
+    public: virtual ~ModelFilter();
+
+    /// \brief Initialize the filter.
+    /// \param[in] _filter The command line filter string.
+    public: void Init(const std::string &_filter);
+
+    /// \brief Filter model parts (pose)
+    /// \param[in] _state Model state to filter.
+    /// \param[in] _partIter Iterator to the filtered string parts.
+    /// \return Filtered string
+    public: std::string FilterParts(gazebo::physics::ModelState &_state,
+                std::list<std::string>::iterator _partIter);
+
+    /// \brief Filter the models in a World state, and output the result
+    /// as a string.
+    /// \param[in] _state The World state to filter.
+    /// \return Filtered string.
+    public: std::string Filter(gazebo::physics::WorldState &_state);
+
+    /// \brief The list of model parts to filter.
+    public: std::list<std::string> parts;
+
+    /// \brief Pointer to the link filter.
+    public: LinkFilter *linkFilter;
+
+    /// \brief Pointer to the joint filter.
+    public: JointFilter *jointFilter;
+  };
+
+  /// \brief Filter interface for an entire state.
+  class StateFilter : public FilterBase
+  {
+    /// \brief Constructor
+    /// \param[in] _xmlOutput True to format output as XML
+    /// \param[in] _stamp Type of stamp to apply.
+    public: StateFilter(bool _xmlOutput, const std::string &_stamp,
+                double _hz = 0);
+
+    /// \brief Initialize the filter with a set of parameters.
+    /// \param[_in] _filter The filter parameters
+    public: void Init(const std::string &_filter);
+
+    /// \brief Perform filtering
+    /// \param[in] _stateString The string to filter.
+    /// \return Filtered string
+    public: std::string Filter(const std::string &_stateString);
+
+    /// \brief Filter for a model.
+    private: ModelFilter filter;
+
+    /// \brief Rate at which to output states.
+    private: double hz;
+
+    /// \brief Previous time a state was output.
+    private: gazebo::common::Time prevTime;
+  };
+
+  /// \brief Log command
+  class LogCommand : public Command
+  {
+    /// \brief Constructor
+    public: LogCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+
+    // Documentation inherited
+    protected: virtual bool TransportRequired();
+
+    /// \brief Output information about a log file.
+    /// \param[in] _filename Name of the file to parse.
+    private: void Info(const std::string &_filename);
+
+    /// \brief Dump the contents of a log file to screen
+    /// \param[in] _filter Filter string
+    /// \param[in] _raw True to output data without xml formatting.
+    /// \param[in] _stamp Type of stamp to apply.
+    /// \param[in] _hz Hertz rate.
+    private: void Echo(const std::string &_filter,
+                 bool _raw, const std::string &_stamp, double _hz);
+
+    /// \brief Step through a log file.
+    /// \param[in] _filter Filter string
+    /// \param[in] _raw True to output data without xml formatting.
+    /// \param[in] _stamp Type of stamp to apply.
+    /// \param[in] _hz Hertz rate.
+    private: void Step(const std::string &_filter, bool _raw,
+                 const std::string &_stamp, double _hz);
+
+    /// \brief Start or stop logging
+    /// \param[in] _start True to start logging
+    private: void Record(bool _start);
+
+    /// \brief Get a character from the terminal.
+    /// This bypasses the need to wait for the 'enter' key.
+    /// \return The characater read from the terminal.
+    private: int GetChar();
+
+    /// \brief Get the size of file.
+    /// \param[in] _filename Name of the file to get the size of.
+    /// \return The size of the file in human readable format.
+    private: std::string GetFileSizeStr(const std::string &_filename);
+
+    /// \brief Load a log file from a filename.
+    /// \param[in] _filename Filename to open
+    /// \return True on success.
+    private: bool LoadLogFromFile(const std::string &_filename);
+
+    /// \brief Node pointer.
+    private: gazebo::transport::NodePtr node;
+  };
+}
+#endif
diff --git a/tools/gz_log_TEST.cc b/tools/gz_log_TEST.cc
new file mode 100644
index 0000000..b7a74e2
--- /dev/null
+++ b/tools/gz_log_TEST.cc
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gtest/gtest.h>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <gazebo/common/CommonIface.hh>
+#include <gazebo/common/Time.hh>
+#include <sdf/sdf_config.h>
+
+#include <stdio.h>
+#include <string>
+
+// This header file isn't needed if shasums are used
+// #include "test/data/pr2_state_log_expected.h"
+#include "test_config.h"
+#include "gazebo/gazebo_config.h"
+
+std::string custom_exec(std::string _cmd)
+{
+  _cmd += " 2>/dev/null";
+  FILE* pipe = popen(_cmd.c_str(), "r");
+
+  if (!pipe)
+    return "ERROR";
+
+  char buffer[128];
+  std::string result = "";
+
+  while (!feof(pipe))
+  {
+    if (fgets(buffer, 128, pipe) != NULL)
+      result += buffer;
+  }
+
+  pclose(pipe);
+  return result;
+}
+
+/////////////////////////////////////////////////
+/// Check to make sure that 'gz log -i' returns correct information
+TEST(gz_log, Info)
+{
+  std::string info = custom_exec(std::string("gz log -i -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  boost::trim_right(info);
+
+  std::string validInfo =
+    "Log Version:    1.0\n"
+    "Gazebo Version: 1.4.6\n"
+    "Random Seed:    32606\n"
+    // "Start:          Feb 08 13 05:35:55.667456998\n"
+    // "End:            Feb 08 13 05:35:58.947304437\n"
+    // "Duration:       00:00:03.279847439\n"
+    // "Steps:          3\n"
+    "Size:           12.377 KB\n"
+    "Encoding:       bz2";
+    // "Model Count:    2";
+
+  EXPECT_EQ(validInfo, info);
+}
+
+/////////////////////////////////////////////////
+/// Check to make sure that 'gz log -e' returns correct information
+TEST(gz_log, Echo)
+{
+  std::string echo = custom_exec(std::string("gz log -e -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/empty_state.log");
+  boost::trim_right(echo);
+
+  std::string validEcho =
+    "<?xml version='1.0'?>\n<gazebo_log>\n<header>\n<log_version>1.0"
+    "</log_version>\n<gazebo_version>1.4.6</gazebo_version>\n"
+    "<rand_seed>24794</rand_seed>\n</header>\n\n<chunk encoding='txt'>"
+    "<![CDATA[\n<sdf version ='1.3'>\n<world name='default'>\n  "
+    "<light name='sun' type='directional'>\n    <cast_shadows>1"
+    "</cast_shadows>\n    <pose>0.000000 0.000000 10.000000 0.000000 0.000000 "
+    "0.000000</pose>\n    <diffuse>0.800000 0.800000 0.800000 1.000000"
+    "</diffuse>\n    <specular>0.100000 0.100000 0.100000 1.000000"
+    "</specular>\n    <attenuation>\n      <range>1000.000000</range>\n      "
+    "<constant>0.900000</constant>\n      <linear>0.010000</linear>\n      "
+    "<quadratic>0.001000</quadratic>\n    </attenuation>\n    "
+    "<direction>-0.500000 0.500000 -1.000000</direction>\n  </light>\n  "
+    "<model name='ground_plane'>\n    <static>1</static>\n    "
+    "<link name='link'>\n      <collision name='collision'>\n        "
+    "<geometry>\n          <plane>\n            <normal>0.000000 0.000000 "
+    "1.000000</normal>\n            <size>100.000000 100.000000"
+    "</size>\n          </plane>\n        </geometry>\n        "
+    "<surface>\n          <friction>\n            <ode>\n              "
+    "<mu>100.000000</mu>\n              <mu2>50.000000</mu2>\n            "
+    "</ode>\n          </friction>\n          <bounce/>\n          "
+    "<contact>\n            <ode/>\n          </contact>\n        "
+    "</surface>\n      </collision>\n      <visual name='visual'>\n        "
+    "<cast_shadows>0</cast_shadows>\n        <geometry>\n          "
+    "<plane>\n            <normal>0.000000 0.000000 1.000000"
+    "</normal>\n            <size>100.000000 100.000000</size>\n          "
+    "</plane>\n        </geometry>\n        <material>\n          "
+    "<script>\n            <uri>file://media/materials/scripts/gazebo.material"
+    "</uri>\n            <name>Gazebo/Grey</name>\n          "
+    "</script>\n        </material>\n      </visual>\n      "
+    "<velocity_decay>\n        <linear>0.000000</linear>\n        "
+    "<angular>0.000000</angular>\n      </velocity_decay>\n      "
+    "<self_collide>0</self_collide>\n      <kinematic>0"
+    "</kinematic>\n      <gravity>1</gravity>\n    </link>\n  "
+    "</model>\n  <physics type='ode'>\n    <update_rate>1000.000000"
+    "</update_rate>\n    <gravity>0.000000 0.000000 -9.800000"
+    "</gravity>\n  </physics>\n  <scene>\n    <ambient>0.200000 0.200000 "
+    "0.200000 1.000000</ambient>\n    <background>0.700000 0.700000 "
+    "0.700000 1.000000</background>\n    <shadows>1</shadows>\n  "
+    "</scene>\n  <state world_name='default'>\n    <sim_time>0 0"
+    "</sim_time>\n    <real_time>0 0</real_time>\n    <wall_time>"
+    "1360300141 918692496</wall_time>\n  </state>\n</world>\n</sdf>]]>"
+    "</chunk>\n</gazebo_log>";
+
+  EXPECT_EQ(validEcho, echo);
+}
+
+/////////////////////////////////////////////////
+/// Check to make sure that 'gz log -e --filter' returns correct information
+TEST(gz_log, EchoFilter)
+{
+  std::string echo, shasum;
+
+  // Test model filter
+  echo = custom_exec(
+      std::string("gz log -e --filter pr2 -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  shasum = gazebo::common::get_sha1<std::string>(echo);
+  // EXPECT_EQ(pr2StateLog, echo);
+  if (std::string("1.4").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "0bf1f293b164bbe820267f970c4b419acdca4b01");
+  else if (std::string("1.5").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "e9fe77982392cc3361d72559edee536cc6fc3bdd");
+  else
+    FAIL() << "Please add support for sdf version: " << SDF_VERSION;
+
+  echo = custom_exec(
+      std::string("gz log -e --filter pr2.pose -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  shasum = gazebo::common::get_sha1<std::string>(echo);
+  // EXPECT_EQ(pr2PoseStateLog, echo);
+  if (std::string("1.4").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "33db2cbd0841466a67abd7d2bbc69cf2cfae19b6");
+  else if (std::string("1.5").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "1f240ed84d3b8ec3db0cffb8bea2e69f655cb7d1");
+  else
+    FAIL() << "Please add support for sdf version: " << SDF_VERSION;
+
+  echo = custom_exec(
+      std::string("gz log -e --filter pr2.pose.x -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  shasum = gazebo::common::get_sha1<std::string>(echo);
+  // EXPECT_EQ(pr2PoseXStateLog, echo);
+  if (std::string("1.4").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "07113f16d44e2484f769fd1947ff5dca93f55cf4");
+  else if (std::string("1.5").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "294cc6bf9d450cc1db43fc3fa12b841fb8bc76b4");
+  else
+    FAIL() << "Please add support for sdf version: " << SDF_VERSION;
+
+  echo = custom_exec(
+      std::string("gz log -e --filter pr2.pose.[x,y] -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  shasum = gazebo::common::get_sha1<std::string>(echo);
+  // EXPECT_EQ(pr2PoseXYStateLog, echo);
+  if (std::string("1.4").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "7f34f3fac505707727a74ac8659bb8736932ab07");
+  else if (std::string("1.5").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "5e9dc6ed989b2ec25b89694437ec81b41993d2a8");
+  else
+    FAIL() << "Please add support for sdf version: " << SDF_VERSION;
+
+  // Test link filter
+  echo = custom_exec(
+      std::string("gz log -e --filter pr2/r_upper*.pose -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  shasum = gazebo::common::get_sha1<std::string>(echo);
+  // EXPECT_EQ(pr2LinkStateLog, echo);
+  if (std::string("1.4").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "d52ba4333511b7e4339db3eb71814c73473fba36");
+  else if (std::string("1.5").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "f28ff9d4a3462bcd3ef6d193884783cfaf0cc605");
+  else
+    FAIL() << "Please add support for sdf version: " << SDF_VERSION;
+
+  // Test joint filter
+  echo = custom_exec(
+      std::string("gz log -e --filter pr2//r_upper_arm_roll_joint -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  shasum = gazebo::common::get_sha1<std::string>(echo);
+  // EXPECT_EQ(pr2JointStateLog, echo);
+  if (std::string("1.4").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "2f689dadc66171a76f7f3400bc218485a923c324");
+  else if (std::string("1.5").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "ee10f7121f7f9165b24fde7ff163d201ee974266");
+  else
+    FAIL() << "Please add support for sdf version: " << SDF_VERSION;
+}
+
+/////////////////////////////////////////////////
+/// Check to Hz filtering
+TEST(gz_log, HzFilter)
+{
+  std::string echo, validEcho;
+
+  // Test Hz filter
+  echo = custom_exec(
+      std::string("gz log -e -r -z 1.0 --filter pr2.pose.z -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  boost::trim_right(echo);
+  validEcho = "-0.000008";
+  EXPECT_EQ(validEcho, echo);
+
+  // Test zero Hz filter
+  echo = custom_exec(
+      std::string("gz log -e -r -z 0 --filter pr2.pose.z -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  boost::trim_right(echo);
+  validEcho = "-0.000008 \n-0.000015";
+  EXPECT_EQ(validEcho, echo);
+
+  // Test negative Hz filter
+  echo = custom_exec(
+      std::string("gz log -e -r -z -1.0 --filter pr2.pose.z -f ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  boost::trim_right(echo);
+  validEcho = "-0.000008 \n-0.000015";
+  EXPECT_EQ(validEcho, echo);
+}
+
+/////////////////////////////////////////////////
+/// Check to raw filtering with time stamps
+TEST(gzlog, RawFilterStamp)
+{
+  std::string echo, validEcho;
+
+  // Sim time
+  echo = custom_exec(
+      std::string("gzlog echo -r -s sim --filter pr2.pose.x ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  boost::trim_right(echo);
+  validEcho = "0.021344 0.000000 \n0.0289582 0.000000";
+  EXPECT_EQ(validEcho, echo);
+
+  // Real time
+  echo = custom_exec(
+      std::string("gzlog echo -r -s real --filter pr2.pose.x ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  boost::trim_right(echo);
+  validEcho = "0.001 0.000000 \n0.002 0.000000";
+  EXPECT_EQ(validEcho, echo);
+
+  // Wall time
+  echo = custom_exec(
+      std::string("gzlog echo -r -s wall --filter pr2.pose.x ") +
+      PROJECT_SOURCE_PATH + "/test/data/pr2_state.log");
+  boost::trim_right(echo);
+  validEcho = std::string("1360301758.939690 0.000000 \n")
+            + std::string("1360301758.947304 0.000000");
+  EXPECT_EQ(validEcho, echo);
+}
+
+/////////////////////////////////////////////////
+/// Check to make sure that 'gz log -s' returns correct information
+TEST(gz_log, Step)
+{
+  std::string stepCmd, shasum;
+  stepCmd = std::string("gz log -s -f ") + PROJECT_SOURCE_PATH +
+    std::string("/test/data/pr2_state.log");
+
+  // Call gz log step and press q immediately
+  std::string stepq0 = custom_exec(std::string("echo 'q' | ") + stepCmd);
+  shasum = gazebo::common::get_sha1<std::string>(stepq0);
+  EXPECT_EQ(shasum, "6d3af4f4d1214fe3a4860ab42777eb4d0f89c6b2");
+
+  // Call gz log step and press space once, then q
+  std::string stepq1 = custom_exec(std::string("echo ' q' | ") + stepCmd);
+  shasum = gazebo::common::get_sha1<std::string>(stepq1);
+  if (std::string("1.4").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "43eacb140e00ef0525d54667bc558d63dac3d21f");
+  else
+    EXPECT_EQ(shasum, "58622f6f536b412ab8f4c691a16dc6dfa923d506");
+
+  // Call gz log step and press space twice, then q
+  std::string stepq2 = custom_exec(std::string("echo '  q' | ") + stepCmd);
+  shasum = gazebo::common::get_sha1<std::string>(stepq2);
+  if (std::string("1.4").compare(SDF_VERSION) == 0)
+    EXPECT_EQ(shasum, "37e133d15d3f74cbc686bfceb26b8db46e2f6bf5");
+  else
+    EXPECT_EQ(shasum, "f997ff7268c30e1fb771b1611f6cdcc2d5254f03");
+}
+
+/////////////////////////////////////////////////
+TEST(gz_log, HangCheck)
+{
+  gazebo::common::Time start = gazebo::common::Time::GetWallTime();
+  custom_exec("gz log -r 0");
+  gazebo::common::Time end = gazebo::common::Time::GetWallTime();
+
+  EXPECT_LT(end - start, gazebo::common::Time(60, 0));
+}
+
+/////////////////////////////////////////////////
+/// Main
+int main(int argc, char **argv)
+{
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/tools/gz_roff.py b/tools/gz_roff.py
new file mode 100755
index 0000000..bc0ad91
--- /dev/null
+++ b/tools/gz_roff.py
@@ -0,0 +1,78 @@
+#!/usr/bin/python
+
+import os
+import sys
+import subprocess
+import re
+import datetime
+
+f = sys.stdout
+
+def outputCommand(_command):
+  process = subprocess.Popen(['gz', _command, '-h'], stderr=subprocess.PIPE)
+  stdout, stderr = process.communicate()
+  help_txt = stderr
+  
+  lines = help_txt.splitlines()
+
+  i = 0
+  
+  f.write(".UNINDENT\n")
+  f.write(".SS %s\n" % _command)
+  f.write(".sp\n.nf\n.ft C\n")
+  f.write("%s\n" % lines[i].strip())
+  f.write(".ft P\n.fi\n.sp\n")
+  
+  i = i + 1
+  
+  while lines[i] != "Options:":
+    f.write("%s\n" % lines[i].strip())
+    i = i + 1
+  
+  i = i + 1
+  
+  f.write(".sp\nOptions:\n")
+  f.write(".INDENT 0.0\n")
+  
+  while i < len(lines):
+    line = lines[i]
+    line = re.sub('\s+', ' ', line).strip()
+    line = line.replace(" [",",")
+    line = line.replace(" ]","")
+    line = re.sub('\s([A-Z].*)', r'\n.\n\1', line)
+
+    line = line.replace(" arg\n","\\fR=\\fIarg\\fR\n")
+    line = line.replace("-","\\-")
+  
+    while i+1 < len(lines) and len(lines[i+1]) > 0 and lines[i+1][0] == " " and re.match(r'^   ', lines[i+1]):
+      i = i + 1
+      line += " " + lines[i].strip()
+ 
+    if len(line) > 0:
+      f.write(".TP\n")
+      f.write('.B %s\n' % line)
+  
+    i = i + 1
+
+
+f.write('.TH "GZ" "1" "March 2014" "" ""\n')
+f.write('.\n')
+f.write('.SH "NAME"\n')
+f.write('\\fBgz\\fR \- Gazebo command line tool for control and analysis.\n')
+f.write('.\n')
+f.write('.SH "SYNPOSIS"\n')
+f.write('\\fBgz\\fR \\fIcommand\\fR [option]\.\.\. [argument]\.\.\.\n')
+f.write('.\n')
+f.write('.UNINDENT\n')
+f.write('.SH COMMANDS\n')
+
+process = subprocess.Popen(['gz', 'debug'], stdout=subprocess.PIPE)
+stdout, stderr = process.communicate()
+helpTxt = stdout
+  
+commands = helpTxt.splitlines()
+
+for cmd in commands:
+  outputCommand(cmd)
+
+f.close()
diff --git a/tools/gz_topic.cc b/tools/gz_topic.cc
new file mode 100644
index 0000000..29d7210
--- /dev/null
+++ b/tools/gz_topic.cc
@@ -0,0 +1,376 @@
+/*
+ * Copyright 2012-2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+#include <gazebo/gui/qt.h>
+#include <gazebo/gui/TopicSelector.hh>
+#include <gazebo/gui/viewers/TopicView.hh>
+#include <gazebo/gui/viewers/ViewFactory.hh>
+#include <gazebo/gazebo.hh>
+
+#include "gz_topic.hh"
+
+using namespace gazebo;
+
+/////////////////////////////////////////////////
+TopicCommand::TopicCommand()
+  : Command("topic", "Lists information about topics on a Gazebo master")
+{
+  // Options that are visible to the user through help.
+  this->visibleOptions.add_options()
+    ("world-name,w", po::value<std::string>(), "World name.")
+    ("list,l", "List all topics.")
+    ("info,i", po::value<std::string>(), "Get information about a topic.")
+    ("echo,e", po::value<std::string>(), "Output topic data to screen.")
+    ("view,v", po::value<std::string>()->implicit_value(""),
+     "View topic data using a QT widget.")
+    ("hz,z", po::value<std::string>(), "Get publish frequency.")
+    ("bw,b", po::value<std::string>(), "Get topic bandwidth.")
+    ("unformatted,u", "Output data from echo without formatting.")
+    ("duration,d", po::value<double>(), "Duration (seconds) to run. "
+     "Applicable with echo, hz, and bw");
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::HelpDetailed()
+{
+  std::cerr <<
+    "\tPrint topic information to standard out. If a name for the world, \n"
+    "\toption -w, is not specified, the first world found on \n"
+    "\tthe Gazebo master will be used.\n"
+    << std::endl;
+}
+
+/////////////////////////////////////////////////
+bool TopicCommand::RunImpl()
+{
+  std::string worldName;
+
+  if (this->vm.count("world-name"))
+    worldName = this->vm["world-name"].as<std::string>();
+
+  this->node.reset(new transport::Node());
+  this->node->Init(worldName);
+
+  if (this->vm.count("list"))
+    this->List();
+  else if (this->vm.count("info"))
+    this->Info(this->vm["info"].as<std::string>());
+  else if (this->vm.count("echo"))
+    this->Echo(this->vm["echo"].as<std::string>());
+  else if (this->vm.count("hz"))
+    this->Hz(this->vm["hz"].as<std::string>());
+  else if (this->vm.count("bw"))
+    this->Bw(this->vm["bw"].as<std::string>());
+  else if (this->vm.count("view"))
+    this->View(this->vm["view"].as<std::string>());
+  else
+    this->Help();
+
+  return true;
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::List()
+{
+  std::string data;
+  msgs::Packet packet;
+  msgs::Request request;
+  msgs::GzString_V topics;
+
+  transport::ConnectionPtr connection = transport::connectToMaster();
+
+  if (connection)
+  {
+    request.set_id(0);
+    request.set_request("get_topics");
+    connection->EnqueueMsg(msgs::Package("request", request), true);
+    connection->Read(data);
+
+    packet.ParseFromString(data);
+    topics.ParseFromString(packet.serialized_data());
+
+    for (int i = 0; i < topics.data_size(); ++i)
+    {
+      std::cout << topics.data(i) << std::endl;
+    }
+  }
+
+  connection.reset();
+}
+
+/////////////////////////////////////////////////
+msgs::TopicInfo TopicCommand::GetInfo(const std::string &_topic)
+{
+  msgs::TopicInfo topicInfo;
+  std::string data;
+  msgs::Request *request = msgs::CreateRequest("topic_info", _topic);
+  msgs::Packet packet;
+
+  transport::ConnectionPtr connection = transport::connectToMaster();
+
+  connection->EnqueueMsg(msgs::Package("request", *request), true);
+
+  int i = 0;
+  do
+  {
+    connection->Read(data);
+    packet.ParseFromString(data);
+  } while (packet.type() != "topic_info_response" && ++i < 10);
+
+  if (i <10)
+    topicInfo.ParseFromString(packet.serialized_data());
+  else
+    std::cerr << "Unable to get topic info.\n";
+
+  delete request;
+  return topicInfo;
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::Info(const std::string &_topic)
+{
+  msgs::TopicInfo info = this->GetInfo(_topic);
+  std::cout << "Type: " << info.msg_type() << "\n\n";
+
+  std::cout << "Publishers:\n";
+  for (int i = 0; i < info.publisher_size(); i++)
+  {
+    std::cout << "\t" << info.publisher(i).host() << ":"
+              << info.publisher(i).port() << "\n";
+  }
+
+  std::cout << "\nSubscribers:\n";
+  for (int i = 0; i < info.subscriber_size(); i++)
+  {
+    std::cout << "\t" << info.subscriber(i).host() << ":"
+              << info.subscriber(i).port() << "\n";
+  }
+  std::cout << "\n";
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::EchoCB(const std::string &_data)
+{
+  this->echoMsg->ParseFromString(_data);
+  if (this->vm.count("unformatted") > 0)
+    std::cout << this->echoMsg->ShortDebugString() << "\n";
+  else
+    std::cout << this->echoMsg->DebugString() << "\n";
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::Echo(const std::string &_topic)
+{
+  // Get the message type on the topic.
+  std::string msgTypeName = gazebo::transport::getTopicMsgType(
+      this->node->DecodeTopicName(_topic));
+
+  if (msgTypeName.empty())
+  {
+    gzerr << "Unable to get message type for topic[" << _topic << "]\n";
+    return;
+  }
+
+  this->echoMsg = msgs::MsgFactory::NewMsg(msgTypeName);
+
+  if (!this->echoMsg)
+  {
+    gzerr << "Unable to create message of type[" << msgTypeName << "]\n";
+    transport::fini();
+    return;
+  }
+
+  transport::SubscriberPtr sub = this->node->Subscribe(_topic,
+      &TopicCommand::EchoCB, this);
+
+  boost::mutex::scoped_lock lock(this->sigMutex);
+  if (this->vm.count("duration"))
+    this->sigCondition.timed_wait(lock,
+        boost::posix_time::seconds(this->vm["duration"].as<double>()));
+  else
+    this->sigCondition.wait(lock);
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::HzCB(const std::string &/*_data*/)
+{
+  common::Time curTime = common::Time::GetWallTime();
+
+  if (this->prevMsgTime != common::Time(0, 0))
+    printf("Hz: %6.2f\n", 1.0 / (curTime - this->prevMsgTime).Double());
+
+  this->prevMsgTime = curTime;
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::Hz(const std::string &_topic)
+{
+  transport::SubscriberPtr sub = this->node->Subscribe(_topic,
+      &TopicCommand::HzCB, this);
+
+  boost::mutex::scoped_lock lock(this->sigMutex);
+  if (this->vm.count("duration"))
+    this->sigCondition.timed_wait(lock,
+        boost::posix_time::seconds(this->vm["duration"].as<double>()));
+  else
+    this->sigCondition.wait(lock);
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::BwCB(const std::string &_data)
+{
+  common::Time curTime = common::Time::GetWallTime();
+
+  this->bwBytes.push_back(_data.size());
+  this->bwTime.push_back(common::Time::GetWallTime());
+
+  // One second time window
+  if (curTime - this->prevMsgTime > common::Time(1, 0))
+  {
+    // Make sure we have received at least 10 bytes of data.
+    if (this->bwBytes.size() >= 10)
+    {
+      std::sort(this->bwBytes.begin(), this->bwBytes.end());
+
+      float sumSize = 0;
+      unsigned int count = this->bwBytes.size();
+      common::Time dt = this->bwTime[count - 1] - this->bwTime[0];
+
+      for (unsigned int i = 0; i < count; ++i)
+      {
+        sumSize += this->bwBytes[i];
+      }
+
+      float meanBytes = sumSize / count;
+      float totalBps = sumSize / dt.Double();
+
+      // Create the output streams
+      std::ostringstream bandwidth, mean, min, max;
+      bandwidth << std::fixed << std::setprecision(2);
+      mean << std::fixed << std::setprecision(2);
+      min << std::fixed << std::setprecision(2);
+      max << std::fixed << std::setprecision(2);
+
+      // Format the bandwidth output
+      if (totalBps < 1000)
+        bandwidth << totalBps << " B/s";
+      else if (totalBps < 1000000)
+        bandwidth << totalBps / 1024.0f << " KB/s";
+      else
+        bandwidth << totalBps/1.049e6 << " MB/s";
+
+      // Format message size  output
+      if (meanBytes < 1000)
+      {
+        mean << meanBytes << " B";
+        min << this->bwBytes[0] << " B";
+        max << this->bwBytes[count-1] << " B";
+      }
+      else if (meanBytes < 1000000)
+      {
+        mean << meanBytes / 1024.0f << " KB";
+        min << this->bwBytes[0] / 1024.0f << " KB";
+        max << this->bwBytes[count-1] / 1024.0f << " KB";
+      }
+      else
+      {
+        mean << meanBytes / 1.049e6 << " MB";
+        min << this->bwBytes[0] / 1.049e6 << " MB";
+        max << this->bwBytes[count-1] / 1.049e6 << " MB";
+      }
+
+      std::cout << "Total[" << bandwidth.str() << "] "
+        << "Mean[" << mean.str() << "] "
+        << "Min[" << min.str() << "] "
+        << "Max[" << max.str() << "] "
+        << "Messages[" << count << "]\n";
+
+      this->bwBytes.clear();
+      this->bwTime.clear();
+    }
+
+    this->prevMsgTime = curTime;
+  }
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::Bw(const std::string &_topic)
+{
+  this->prevMsgTime = common::Time::GetWallTime();
+  transport::SubscriberPtr sub = node->Subscribe(_topic,
+      &TopicCommand::BwCB, this);
+
+  boost::mutex::scoped_lock lock(this->sigMutex);
+  if (this->vm.count("duration"))
+    this->sigCondition.timed_wait(lock,
+        boost::posix_time::seconds(this->vm["duration"].as<double>()));
+  else
+    this->sigCondition.wait(lock);
+}
+
+/////////////////////////////////////////////////
+void TopicCommand::View(const std::string &_topic)
+{
+  if (!gazebo::setupClient())
+  {
+    printf("load error\n");
+    return;
+  }
+
+  QApplication *app = new QApplication(this->argc, this->argv);
+
+  QFile file(":/style.qss");
+  file.open(QFile::ReadOnly);
+  QString styleSheet = QLatin1String(file.readAll());
+
+  app->setStyleSheet(styleSheet);
+
+  std::string topic;
+  std::string msgType;
+
+  if (_topic.empty())
+  {
+    gui::TopicSelector *selector = new gui::TopicSelector();
+    selector->exec();
+
+    topic = selector->GetTopic();
+    msgType = selector->GetMsgType();
+    delete selector;
+  }
+  else
+  {
+    topic = _topic;
+    msgType = transport::getTopicMsgType(topic);
+  }
+
+  if (!topic.empty() && !msgType.empty())
+  {
+    gui::ViewFactory::RegisterAll();
+    gui::TopicView *view = gui::ViewFactory::NewView(msgType, topic);
+    if (view)
+      view->show();
+    else
+      gzerr << "Unable to create viewer for message type[" << msgType << "]\n";
+  }
+
+  app->exec();
+
+  delete app;
+  app = NULL;
+
+  gazebo::shutdown();
+}
diff --git a/tools/gz_topic.hh b/tools/gz_topic.hh
new file mode 100644
index 0000000..05d08c5
--- /dev/null
+++ b/tools/gz_topic.hh
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2014 Open Source Robotics Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+#ifndef _GZ_TOPIC_HH_
+#define _GZ_TOPIC_HH_
+
+#include <string>
+#include <vector>
+
+#include "gz.hh"
+
+namespace gazebo
+{
+  /// \brief Topic command
+  class TopicCommand : public Command
+  {
+    /// \brief Constructor
+    public: TopicCommand();
+
+    // Documentation inherited
+    public: virtual void HelpDetailed();
+
+    // Documentation inherited
+    protected: virtual bool RunImpl();
+
+    /// \brief Output the topic list.
+    private: void List();
+
+    /// \brief Output information about a topic.
+    /// \param[in] _topic Topic to print info about.
+    private: void Info(const std::string &_topic);
+
+    /// \brief Output messages from a topic.
+    /// \param[in] _topic Topic to print messages from.
+    private: void Echo(const std::string &_topic);
+
+    /// \brief Get a TopicInfo message from a topic.
+    /// \param[in] _topic Topic to get info about.
+    /// \return The TopicInfo message about the _topic.
+    private: msgs::TopicInfo GetInfo(const std::string &_topic);
+
+    /// \brief Callback used by Echo() to receive topic messages.
+    /// \param[in] _data Data message from a topic.
+    private: void EchoCB(const std::string &_data);
+
+    /// \brief Callback used by Hz() to receive topic messages.
+    /// \param[in] _data Data message from a topic (unused).
+    private: void HzCB(const std::string &_data);
+
+    /// \brief Output Hz rate for a topic.
+    /// \param[in] _topic Topic name.
+    private: void Hz(const std::string &_topic);
+
+    /// \brief Subscription callback used by Bw().
+    /// \param[in] _data Message data.
+    private: void BwCB(const std::string &_data);
+
+    /// \brief Output bandwidth data for a topic.
+    /// \param[in] _topic Topic name.
+    private: void Bw(const std::string &_topic);
+
+    /// \brief View topic information using QT.
+    /// \param[in] _topic Name of the topic to view. Empty will bring up
+    /// a topic selector.
+    private: void View(const std::string &_topic);
+
+    /// \brief Message used to hold data received from EchoCB().
+    private: boost::shared_ptr<google::protobuf::Message> echoMsg;
+
+    /// \brief Node pointer.
+    private: transport::NodePtr node;
+
+    /// \brief Prev time a message was received.
+    private: common::Time prevMsgTime;
+
+    /// \brief Buffer of message sizes, used by Bw().
+    private: std::vector<int> bwBytes;
+
+    /// \brief Buffer of message publish times, used by Bw().
+    private: std::vector<common::Time> bwTime;
+  };
+}
+#endif
diff --git a/tools/gzfactory.1.ronn b/tools/gzfactory.1.ronn
new file mode 100644
index 0000000..4024f81
--- /dev/null
+++ b/tools/gzfactory.1.ronn
@@ -0,0 +1,52 @@
+gzfactory -- DEPRECATED(see 'gz help model')
+=============================================
+
+## SYNOPSIS
+
+`gzfactory` <spawn|delete> [options]
+
+## DESCRIPTION
+
+Spawn or delete models into or from a running Gazebo simulation.
+
+## COMMAND ELEMENTS
+
+* **spawn**:
+Spawn new model. Must specify a SDF model file.
+* **delete**:
+Delete existing model. Must specify model name.
+
+## OPTIONS
+
+* -h, --help :
+ Produce this help message.
+* -f, --sdf arg :
+ SDF model file.
+* -w, --world-name arg :
+ Name of Gazebo world.
+* -m, --model-name arg :
+ Model name.
+* -x, --pose-x arg :
+ Set model x position.
+* -y, --pose-y arg :
+ Set model y position.
+* -z, --pose-z arg :
+ Set model z positione.
+* -R, --pose-R arg :
+ Set model roll orientation in radians.
+* -P, --pose-P arg :
+ Set model pitch orientation in radians.
+* -Y, --pose-Y arg :
+ Set model yaw orientation in radians.
+
+## SEE ALSO
+Example and more information about gazebo gzfactory and other command line tools can be found at:http://gazebosim.org/user_guide/started__commandlinetools.html
+
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-2014 Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
diff --git a/tools/gzfactory.cc b/tools/gzfactory.cc
index bc7a7d4..b32f8d3 100644
--- a/tools/gzfactory.cc
+++ b/tools/gzfactory.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,27 +17,39 @@
 #include <boost/program_options.hpp>
 #include <fstream>
 #include <string>
-#include "transport/transport.hh"
+#include <gazebo/transport/transport.hh>
+#include <gazebo/common/CommonIface.hh>
 
 using namespace gazebo;
 namespace po = boost::program_options;
 
 /////////////////////////////////////////////////
-void help()
+void help(po::options_description &_options)
 {
-  std::cerr << "This tool for spawning or deleting models into or from a "
-            << "running Gazebo simulation.\n\n"
-            << "  gzfactory <spawn|delete> [options]\n"
-            << "    spawn   : Spawn new model. Must specify a SDF model file.\n"
-            << "    delete  : Delete existing model. Must specify model name.\n"
-            << "\n\n";
+  std::cerr << "gzfactory -- DEPRECATED(see 'gz help model')\n\n";
+
+  std::cerr << "`gzfactory` <spawn|delete> [options]\n\n";
+
+  std::cerr << "Spawn or delete models into or from a "
+    << "running Gazebo simulation.\n\n";
+
+  std::cerr << "Commands:\n"
+    << "    spawn   Spawn new model. Must specify a SDF model file.\n"
+    << "    delete  Delete existing model. Must specify model name.\n\n";
+
+  std::cerr << _options << "\n\n";
+
+  std::cerr << "See also:\n"
+    << "Example and more information about gazebo gzfactory and "
+    << "other command line tools can be found at:"
+    << "http://gazebosim.org/user_guide/started__commandlinetools.html\n";
 }
 
 /////////////////////////////////////////////////
 void Spawn(po::variables_map &_vm)
 {
   std::string filename, modelName;
-  std::string worldName = "default";
+  std::string worldName;
 
   if (!_vm.count("sdf"))
   {
@@ -83,11 +95,11 @@ void Spawn(po::variables_map &_vm)
 
   // Get/Set the model name
   if (modelName.empty())
-    modelName = modelElem->GetValueString("name");
+    modelName = modelElem->Get<std::string>("name");
   else
     modelElem->GetAttribute("name")->SetFromString(modelName);
 
-  math::Pose pose = modelElem->GetValuePose("pose");
+  math::Pose pose = modelElem->Get<math::Pose>("pose");
   math::Vector3 rpy = pose.rot.GetAsEuler();
   if (_vm.count("pose-x"))
     pose.pos.x = _vm["pose-x"].as<double>();
@@ -103,14 +115,16 @@ void Spawn(po::variables_map &_vm)
     rpy.z = _vm["pose-Y"].as<double>();
   pose.rot.SetFromEuler(rpy);
 
-  std::cout << "Spawning " << modelName << " into "
-            << worldName  << " world.\n";
+  if (!transport::init())
+    return;
 
-  transport::init();
   transport::run();
 
   transport::NodePtr node(new transport::Node());
-  node->Init();
+  node->Init(worldName);
+
+  std::cout << "Spawning " << modelName << " into "
+            << node->GetTopicNamespace()  << " world.\n";
 
   transport::PublisherPtr pub = node->Advertise<msgs::Factory>("~/factory");
   pub->WaitForConnection();
@@ -142,7 +156,9 @@ void Delete(po::variables_map &vm)
 
   msgs::Request *msg = msgs::CreateRequest("entity_delete", modelName);
 
-  transport::init();
+  if (!transport::init())
+    return;
+
   transport::run();
 
   transport::NodePtr node(new transport::Node());
@@ -159,24 +175,24 @@ void Delete(po::variables_map &vm)
 /////////////////////////////////////////////////
 int main(int argc, char **argv)
 {
-  po::options_description v_desc("Allowed options");
+  po::options_description v_desc("Options");
   v_desc.add_options()
-    ("help,h", "produce this help message")
+    ("help,h", "Produce this help message.")
     ("sdf,f", po::value<std::string>(), "SDF model file.")
     ("world-name,w", po::value<std::string>(), "Name of Gazebo world.")
     ("model-name,m", po::value<std::string>(), "Model name.")
-    ("pose-x,x", po::value<double>(), "set model x position.")
-    ("pose-y,y", po::value<double>(), "set model y position.")
-    ("pose-z,z", po::value<double>(), "set model z positione.")
-    ("pose-R,R", po::value<double>(), "set model roll orientation in radians.")
-    ("pose-P,P", po::value<double>(), "set model pitch orientation in radians.")
-    ("pose-Y,Y", po::value<double>(), "set model yaw orientation in radians.");
+    ("pose-x,x", po::value<double>(), "Set model x position.")
+    ("pose-y,y", po::value<double>(), "Set model y position.")
+    ("pose-z,z", po::value<double>(), "Set model z positione.")
+    ("pose-R,R", po::value<double>(), "Set model roll orientation in radians.")
+    ("pose-P,P", po::value<double>(), "Set model pitch orientation in radians.")
+    ("pose-Y,Y", po::value<double>(), "Set model yaw orientation in radians.");
 
   po::options_description h_desc("Hidden options");
   h_desc.add_options()
     ("command", po::value<std::string>(), "<spawn|delete>");
 
-  po::options_description desc("Allowed options");
+  po::options_description desc("Options");
   desc.add(v_desc).add(h_desc);
 
   po::positional_options_description p_desc;
@@ -197,11 +213,12 @@ int main(int argc, char **argv)
 
   if (vm.count("help") || argc < 2)
   {
-    help();
-    std::cout << v_desc << "\n";
+    help(v_desc);
     return -1;
   }
 
+  sdf::setFindCallback(boost::bind(&gazebo::common::find_file, _1));
+
   if (vm.count("command"))
   {
     std::string cmd = vm["command"].as<std::string>();
diff --git a/tools/gzlog.1.ronn b/tools/gzlog.1.ronn
new file mode 100644
index 0000000..ac54a11
--- /dev/null
+++ b/tools/gzlog.1.ronn
@@ -0,0 +1,49 @@
+gzlog -- DEPRECATED(see 'gz help log')
+=============================================
+
+## SYNOPSIS
+
+`gzlog` [command] <options> [log file]
+
+## DESCRIPTION
+
+Introspect Gazebo log files through different commands.
+
+## COMMAND ELEMENTS
+
+* **help**:
+Output this help message.
+* **info**:
+Display statistical information about a log file.
+* **echo**:
+Output the contents of a log file to screen.
+* **step**:
+Step through the contents of a log file.
+
+## OPTIONS
+
+* -h, --help :
+ Output this help message.
+* -r, --raw :
+ Output the data from echo and step without XML formatting.
+* -s, --stamp arg :
+ Add a timestamp to each line of output. Valid values are (sim,real,wall)
+* -z, --hz arg :
+ Filter output to the specified Hz rate.Only valid for echo and step commands.
+* -f, --file arg :
+ Path to a log file.
+* --filter arg :
+ Filter output. Valid only for the echo and step commands
+
+## SEE ALSO
+Example and more information can be found at: http://gazebosim.org/wiki/Tools#Data_Log_Tool
+
+
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-2014 Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
diff --git a/tools/gzlog.cc b/tools/gzlog.cc
index 06f453e..6b50ca4 100644
--- a/tools/gzlog.cc
+++ b/tools/gzlog.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,34 +24,660 @@
 #include <boost/algorithm/string/regex.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/date_time/posix_time/posix_time_io.hpp>
+#include <sdf/sdf.hh>
 
 #include <gazebo/gazebo.hh>
-
-#include <gazebo/sdf/sdf.hh>
-
-#include <gazebo/physics/WorldState.hh>
+#include <gazebo/physics/physics.hh>
+#include <gazebo/msgs/msgs.hh>
 #include <gazebo/common/Time.hh>
+#include <gazebo/util/util.hh>
 #include <gazebo/gazebo_config.h>
 
 namespace po = boost::program_options;
 
 sdf::ElementPtr g_stateSdf;
 
+/// \brief Base class for all filters.
+class FilterBase
+{
+  /// \brief Constructor
+  /// \param[in] _xmlOutput True if the output should be in XML format.
+  /// \param[in[ _stamp Type of stamp to apply.
+  public: FilterBase(bool _xmlOutput, const std::string &_stamp)
+          : xmlOutput(_xmlOutput), stamp(_stamp)
+  {
+  }
+
+  /// \brief Output a line of data.
+  /// \param[in] _stream The output stream.
+  /// \param[in] _state Current state.
+  public: std::ostringstream &Out(std::ostringstream &_stream,
+              const gazebo::physics::State &_state)
+          {
+            if (!this->xmlOutput && !this->stamp.empty())
+            {
+              if (this->stamp == "sim")
+                _stream << _state.GetSimTime().Double() << " ";
+              else if (this->stamp == "real")
+                _stream << _state.GetRealTime().Double() << " ";
+              else if (this->stamp == "wall")
+              {
+                _stream << std::setiosflags(std::ios::fixed) <<
+                  _state.GetWallTime().Double() <<
+                  std::resetiosflags(std::ios::fixed) << " ";
+              }
+            }
+
+            return _stream;
+          }
+
+  /// \brief Filter a pose.
+  /// \param[in] _pose The pose to filter.
+  /// \param[in] _xmlName Name of the xml tag.
+  /// \param[in] _filter The filter string [x,y,z,r,p,a].
+  /// \param[in] _state Current state.
+  public: std::string FilterPose(const gazebo::math::Pose &_pose,
+              const std::string &_xmlName,
+              std::string _filter,
+              const gazebo::physics::State &_state)
+          {
+            std::ostringstream result;
+            std::string xmlPrefix, xmlSuffix;
+
+            // Remove brackets, if they exist
+            boost::erase_all(_filter, "[");
+            boost::erase_all(_filter, "]");
+
+            // Output XML tags if required.
+            if (this->xmlOutput)
+            {
+              xmlPrefix = std::string("<") + _xmlName + ">";
+              xmlSuffix = std::string("</") + _xmlName + ">";
+            }
+
+            // Get the euler angles.
+            gazebo::math::Vector3 rpy = _pose.rot.GetAsEuler();
+
+            // If the filter is empty, then output the whole pose.
+            if (!_filter.empty())
+            {
+              // Get the list of pose elements from the filter
+              std::list<std::string> elements;
+              boost::split(elements, _filter, boost::is_any_of(","));
+              if (elements.empty() && !_filter.empty())
+                elements.push_back(_filter);
+
+              // Iterate over the list of pose elements.
+              for (std::list<std::string>::iterator elemIter =
+                  elements.begin(); elemIter != elements.end();
+                  ++elemIter)
+              {
+                switch ((*elemIter)[0])
+                {
+                  case 'X':
+                  case 'x':
+                    this->Out(result, _state) << std::fixed
+                      << _pose.pos.x << " ";
+                    break;
+                  case 'Y':
+                  case 'y':
+                    this->Out(result, _state) << std::fixed
+                      << _pose.pos.y << " ";
+                    break;
+                  case 'Z':
+                  case 'z':
+                    this->Out(result, _state) << std::fixed
+                      << _pose.pos.z << " ";
+                    break;
+                  case 'R':
+                  case 'r':
+                    this->Out(result, _state) << std::fixed << rpy.x << " ";
+                    break;
+                  case 'P':
+                  case 'p':
+                    this->Out(result, _state) << std::fixed << rpy.y << " ";
+                    break;
+                  case 'A':
+                  case 'a':
+                    this->Out(result, _state) << std::fixed << rpy.z << " ";
+                    break;
+                  default:
+                    gzerr << "Invalid pose value[" << *elemIter << "]\n";
+                    break;
+                }
+              }
+              result << std::endl;
+            }
+            else
+            {
+              // No filter, so output the whole pose.
+              if (!xmlPrefix.empty())
+              {
+                result << std::fixed << xmlPrefix << _pose
+                  << xmlSuffix << std::endl;
+              }
+              else
+                this->Out(result, _state) << _pose << std::endl;
+            }
+
+            return result.str();
+          }
+
+  /// \brief True if XML output is requested.
+  protected: bool xmlOutput;
+
+  /// \brief Time stamp type
+  protected: std::string stamp;
+};
+
+/// \brief Filter for joint state.
+class JointFilter : public FilterBase
+{
+  /// \brief Constructor.
+  /// \param[in] _xmlOutput True if the output should be in XML format.
+  public: JointFilter(bool _xmlOutput, const std::string &_stamp)
+          : FilterBase(_xmlOutput, _stamp)
+          {
+          }
+
+  /// \brief Initialize the filter.
+  /// \param[in] _filter The command line filter string.
+  public: void Init(const std::string &_filter)
+          {
+            this->parts.clear();
+
+            if (!_filter.empty())
+            {
+              boost::split(this->parts, _filter, boost::is_any_of("."));
+
+              if (!this->parts.size())
+                this->parts.push_back(_filter);
+            }
+          }
+
+  /// \brief Filter joint parts (angle)
+  /// \param[in] _state Link state to filter.
+  /// \param[in] _partIter Iterator to the filtered string parts.
+  public: std::string FilterParts(gazebo::physics::JointState &_state,
+              std::list<std::string>::iterator _partIter)
+          {
+            std::ostringstream result;
+            std::string part = *_partIter;
+
+            // Remove brackets, if they exist
+            boost::erase_all(part, "[");
+            boost::erase_all(part, "]");
+
+            // If the filter is empty, then output all the angles.
+            if (!part.empty())
+            {
+              // Get the list of axis elements from the filter
+              std::list<std::string> elements;
+              boost::split(elements, part, boost::is_any_of(","));
+              if (elements.empty() && !part.empty())
+                elements.push_back(part);
+
+              // Iterate over the list of axis elements.
+              for (std::list<std::string>::iterator elemIter =
+                  elements.begin(); elemIter != elements.end();
+                  ++elemIter)
+              {
+                try
+                {
+                  unsigned int axis =
+                    boost::lexical_cast<unsigned int>(*elemIter);
+
+                  if (axis >= _state.GetAngleCount())
+                    continue;
+
+                  gazebo::math::Angle angle = _state.GetAngle(axis);
+
+                  if (this->xmlOutput)
+                  {
+                    result << "<angle axis='" << *elemIter << "'>"
+                      << std::fixed << angle << "</angle>\n";
+                  }
+                  else
+                    this->Out(result, _state) << std::fixed << angle << " ";
+                }
+                catch(...)
+                {
+                  gzerr << "Inavlid axis value[" << *elemIter << "]\n";
+                }
+              }
+            }
+
+            return result.str();
+          }
+
+  /// \brief Filter the joints in a Model state, and output the result
+  /// as a string.
+  /// \param[in] _state The model state to filter.
+  /// \return Filtered string.
+  public: std::string Filter(gazebo::physics::ModelState &_state)
+          {
+            std::ostringstream result;
+
+            gazebo::physics::JointState_M states;
+            std::list<std::string>::iterator partIter;
+
+            /// Get an iterator to the list of the command line parts.
+            partIter = this->parts.begin();
+
+            // The first element in the filter must be a link name or a star.
+            std::string regexStr = *partIter;
+            boost::replace_all(regexStr, "*", ".*");
+            boost::regex regex(regexStr);
+            states = _state.GetJointStates(regex);
+
+            ++partIter;
+
+            // Filter all the link states that were found.
+            for (gazebo::physics::JointState_M::iterator iter =
+                states.begin(); iter != states.end(); ++iter)
+            {
+              // Filter the elements of the joint (angle).
+              // If no filter parts were specified,
+              // then output the whole joint state.
+              if (partIter != this->parts.end())
+              {
+                if (this->xmlOutput)
+                  result << "<joint name='" << iter->first << "'>\n";
+
+                result << this->FilterParts(iter->second, partIter);
+
+                if (this->xmlOutput)
+                  result << "</joint>\n";
+              }
+              else
+              {
+                if (!this->xmlOutput && iter->second.GetAngleCount() == 1)
+                  result << std::fixed << iter->second.GetAngle(0);
+                else
+                  result << std::fixed << iter->second;
+              }
+            }
+
+            return result.str();
+          }
+
+  /// \brief The list of filter strings.
+  public: std::list<std::string> parts;
+};
+
+/// \brief Filter for link state.
+class LinkFilter : public FilterBase
+{
+  /// \brief Constructor.
+  /// \param[in] _xmlOutput True if the output should be in XML format.
+  public: LinkFilter(bool _xmlOutput, const std::string &_stamp)
+          : FilterBase(_xmlOutput, _stamp)
+          {
+          }
+
+  /// \brief Initialize the filter.
+  /// \param[in] _filter The command line filter string.
+  public: void Init(const std::string &_filter)
+          {
+            this->parts.clear();
+
+            if (!_filter.empty())
+            {
+              boost::split(this->parts, _filter, boost::is_any_of("."));
+
+              if (!this->parts.size())
+                this->parts.push_back(_filter);
+            }
+          }
+
+  /// \brief Filter link parts (pose, velocity, acceleration, wrench)
+  /// \param[in] _state Link state to filter.
+  /// \param[in] _partIter Iterator to the filtered string parts.
+  public: std::string FilterParts(gazebo::physics::LinkState &_state,
+              std::list<std::string>::iterator _partIter)
+          {
+            std::ostringstream result;
+
+            std::string part = *_partIter;
+            std::string elemParts;
+
+            ++_partIter;
+            if (_partIter != this->parts.end())
+              elemParts = *_partIter;
+
+            if (part == "pose")
+              result << this->FilterPose(_state.GetPose(), part, elemParts,
+                  _state);
+            else if (part == "acceleration")
+              result << this->FilterPose(_state.GetAcceleration(), part,
+                  elemParts, _state);
+            else if (part == "velocity")
+              result << this->FilterPose(_state.GetVelocity(), part, elemParts,
+                  _state);
+            else if (part == "wrench")
+              result << this->FilterPose(_state.GetWrench(), part, elemParts,
+                  _state);
+
+            return result.str();
+          }
+
+  /// \brief Filter the links in a Model state, and output the result
+  /// as a string.
+  /// \param[in] _state The model state to filter.
+  /// \return Filtered string.
+  public: std::string Filter(gazebo::physics::ModelState &_state)
+          {
+            std::ostringstream result;
+
+            gazebo::physics::LinkState_M states;
+            std::list<std::string>::iterator partIter;
+
+            /// Get an iterator to the list of the command line parts.
+            partIter = this->parts.begin();
+
+            // The first element in the filter must be a link name or a star.
+            if (*partIter != "*")
+            {
+              std::string regexStr = *partIter;
+              boost::replace_all(regexStr, "*", ".*");
+              boost::regex regex(regexStr);
+              states = _state.GetLinkStates(regex);
+            }
+            else
+              states = _state.GetLinkStates();
+
+            ++partIter;
+
+            // Filter all the link states that were found.
+            for (gazebo::physics::LinkState_M::iterator iter =
+                states.begin(); iter != states.end(); ++iter)
+            {
+              // Filter the elements of the link (pose, velocity,
+              // acceleration, wrench). If no filter parts were specified,
+              // then output the while link state.
+              if (partIter != this->parts.end())
+              {
+                if (this->xmlOutput)
+                  result << "<link name='" << iter->second.GetName() << "'>\n";
+
+                result << this->FilterParts(iter->second, partIter);
+
+                if (this->xmlOutput)
+                  result << "</link>\n";
+              }
+              else
+                result << std::fixed << iter->second << std::endl;
+            }
+
+            return result.str();
+          }
+
+  /// \brief The list of filter strings.
+  public: std::list<std::string> parts;
+};
+
+/// \brief Filter for model state.
+class ModelFilter : public FilterBase
+{
+  /// \brief Constructor.
+  /// \param[in] _xmlOutput True if the output should be in XML format.
+  public: ModelFilter(bool _xmlOutput, const std::string &_stamp)
+          : FilterBase(_xmlOutput, _stamp)
+          {
+            this->linkFilter = NULL;
+            this->jointFilter = NULL;
+          }
+
+  /// \brief Destructor.
+  public: virtual ~ModelFilter()
+          {
+            delete this->linkFilter;
+            delete this->jointFilter;
+          }
+
+  /// \brief Initialize the filter.
+  /// \param[in] _filter The command line filter string.
+  public: void Init(const std::string &_filter)
+          {
+            this->linkFilter = NULL;
+            this->jointFilter = NULL;
+            this->parts.clear();
+
+            if (_filter.empty())
+              return;
+
+            std::list<std::string> mainParts;
+            boost::split(mainParts, _filter, boost::is_any_of("/"));
+
+            // Create the model filter
+            if (!mainParts.empty())
+            {
+              boost::split(this->parts, mainParts.front(),
+                  boost::is_any_of("."));
+              if (this->parts.size() == 0 && !mainParts.front().empty())
+                this->parts.push_back(mainParts.front());
+            }
+
+            if (mainParts.empty())
+              return;
+
+            mainParts.pop_front();
+
+            // Create the link filter
+            if (!mainParts.empty() && !mainParts.front().empty())
+            {
+              this->linkFilter = new LinkFilter(this->xmlOutput, this->stamp);
+              this->linkFilter->Init(mainParts.front());
+            }
+
+            if (mainParts.empty())
+              return;
+
+            mainParts.pop_front();
+
+            // Create the joint filter
+            if (!mainParts.empty())
+            {
+              this->jointFilter = new JointFilter(this->xmlOutput,
+                  this->stamp);
+              this->jointFilter->Init(mainParts.front());
+            }
+          }
+
+  /// \brief Filter model parts (pose)
+  /// \param[in] _state Model state to filter.
+  /// \param[in] _partIter Iterator to the filtered string parts.
+  public: std::string FilterParts(gazebo::physics::ModelState &_state,
+              std::list<std::string>::iterator _partIter)
+          {
+            std::ostringstream result;
+
+            // Currently a model can only have a pose.
+            if (*_partIter == "pose")
+            {
+              // Get the model state pose
+              gazebo::math::Pose pose = _state.GetPose();
+              ++_partIter;
+
+              // Get the elements to filter pose by.
+              std::string elemParts;
+              if (_partIter != this->parts.end())
+                elemParts = *_partIter;
+
+              // Output the filtered pose.
+              result << this->FilterPose(pose, "pose", elemParts, _state);
+            }
+            else
+              gzerr << "Invalid model state component["
+                << *_partIter << "]\n";
+
+            return result.str();
+          }
+
+  /// \brief Filter the models in a World state, and output the result
+  /// as a string.
+  /// \param[in] _state The World state to filter.
+  /// \return Filtered string.
+  public: std::string Filter(gazebo::physics::WorldState &_state)
+          {
+            std::ostringstream result;
+
+            gazebo::physics::ModelState_M states;
+            std::list<std::string>::iterator partIter = this->parts.begin();
+
+            // The first element in the filter must be a model name or a star.
+            if (partIter != this->parts.end() && !this->parts.empty() &&
+                !(*partIter).empty() && (*partIter) != "*")
+            {
+              std::string regexStr = *partIter;
+              boost::replace_all(regexStr, "*", ".*");
+              boost::regex regex(regexStr);
+              states = _state.GetModelStates(regex);
+            }
+            else
+              states = _state.GetModelStates();
+
+            ++partIter;
+
+            // Filter all the model states that were found.
+            for (gazebo::physics::ModelState_M::iterator iter =
+                states.begin(); iter != states.end(); ++iter)
+            {
+              // If no link filter, and no model parts, then output the
+              // whole model state.
+              if (!this->linkFilter && !this->jointFilter &&
+                  partIter == this->parts.end())
+                result << std::fixed << iter->second;
+              else
+              {
+                if (this->xmlOutput)
+                  result << "<model name='" << iter->second.GetName() << "'>\n";
+
+                // Filter the pose of the model.
+                if (partIter != this->parts.end())
+                  result << this->FilterParts(iter->second, partIter);
+
+                // Apply link filtering, if a link filter exists.
+                if (this->linkFilter)
+                  result << this->linkFilter->Filter(iter->second);
+
+                // Apply link filtering, if a link filter exists.
+                if (this->jointFilter)
+                  result << this->jointFilter->Filter(iter->second);
+
+                if (this->xmlOutput)
+                  result << "</model>\n";
+              }
+            }
+
+            return result.str();
+          }
+
+  /// \brief The list of model parts to filter.
+  public: std::list<std::string> parts;
+
+  /// \brief Pointer to the link filter.
+  public: LinkFilter *linkFilter;
+
+  /// \brief Pointer to the joint filter.
+  public: JointFilter *jointFilter;
+};
+
+/// \brief Filter interface for an entire state.
+class StateFilter : public FilterBase
+{
+  /// \brief Constructor
+  /// \param[in] _xmlOutput True to format output as XML
+  public: StateFilter(bool _xmlOutput, const std::string &_stamp,
+              double _hz = 0)
+          : FilterBase(_xmlOutput, _stamp), filter(_xmlOutput, _stamp),
+          hz(_hz)
+          {}
+
+  /// \brief Initialize the filter with a set of parameters.
+  /// \param[_in] _filter The filter parameters
+  public: void Init(const std::string &_filter)
+          {
+            this->filter.Init(_filter);
+          }
+
+  /// \brief Perform filtering
+  /// \param[in] _stateString The string to filter.
+  public: std::string Filter(const std::string &_stateString)
+          {
+            gazebo::physics::WorldState state;
+
+            // Read and parse the state information
+            g_stateSdf->ClearElements();
+            sdf::readString(_stateString, g_stateSdf);
+            state.Load(g_stateSdf);
+
+            std::ostringstream result;
+
+            if (this->hz > 0.0 && this->prevTime != gazebo::common::Time::Zero)
+            {
+              if ((state.GetSimTime() - this->prevTime).Double() <
+                  1.0 / this->hz)
+              {
+                return result.str();
+              }
+            }
+
+            if (this->xmlOutput)
+            {
+              result << "<sdf version='" << SDF_VERSION << "'>\n"
+                << "<state world_name='" << state.GetName() << "'>\n"
+                << "<sim_time>" << state.GetSimTime() << "</sim_time>\n"
+                << "<real_time>" << state.GetRealTime() << "</real_time>\n"
+                << "<wall_time>" << state.GetWallTime() << "</wall_time>\n";
+            }
+
+            result << this->filter.Filter(state);
+
+            if (this->xmlOutput)
+              result << "</sdf></state>\n";
+
+            this->prevTime = state.GetSimTime();
+            return result.str();
+          }
+
+  /// \brief Filter for a model.
+  private: ModelFilter filter;
+
+  /// \brief Rate at which to output states.
+  private: double hz;
+
+  /// \brief Previous time a state was output.
+  private: gazebo::common::Time prevTime;
+};
+
+
 /////////////////////////////////////////////////
 /// \brief Print general help
-void help()
+void help(po::options_description &_options)
 {
-  std::cerr << "Help:\n";
-  std::cerr << "This tool introspects Gazebo log files.\n\n";
-  std::cerr << "Usage: gzlog [command] <options> [log file]\n\n";
+  std::cerr << "gzlog -- DEPRECATED(see 'gz help log')\n\n";
+
+  std::cerr << "`gzlog` [command] <options> [log file]\n\n";
+
+  std::cerr << "Introspect Gazebo log files through different commands.\n\n";
 
   std::cerr << "Commands:\n"
             << "  help\t Output this help message.\n"
             << "  info\t Display statistical information about a log file.\n"
             << "  echo\t Output the contents of a log file to screen.\n"
             << "  step\t Step through the contents of a log file.\n";
-
+            // << "  start\t Start recording a log file on an active Gazebo "
+            // << "server.\n"
+            // << "  stop\t Stop recording a log file on an active Gazebo "
+            // << "server.\n";
   std::cerr << "\n";
+
+  std::cerr << _options << "\n";
+
+  std::cerr << "See also:\n"
+    << "Example and more information can be found at: "
+    << "http://gazebosim.org/wiki/Tools#Data_Log_Tool\n\n";
 }
 
 /////////////////////////////////////////////////
@@ -84,7 +710,7 @@ bool load_log_from_file(const std::string &_filename)
 
   try
   {
-    gazebo::common::LogPlay::Instance()->Open(_filename);
+    gazebo::util::LogPlay::Instance()->Open(_filename);
   }
   catch(gazebo::common::Exception &_e)
   {
@@ -133,11 +759,11 @@ std::string get_file_size_str(const std::string &_filename)
 /// \bried Output information about a log file.
 void info(const std::string &_filename)
 {
-  gazebo::common::LogPlay *play = gazebo::common::LogPlay::Instance();
+  gazebo::util::LogPlay *play = gazebo::util::LogPlay::Instance();
 
   // Get the SDF world description from the log file
   std::string sdfString;
-  gazebo::common::LogPlay::Instance()->Step(sdfString);
+  gazebo::util::LogPlay::Instance()->Step(sdfString);
 
   // Parse the first SDF world description
   sdf::ElementPtr sdf(new sdf::Element);
@@ -146,7 +772,7 @@ void info(const std::string &_filename)
 
   gazebo::physics::WorldState state;
 
-  unsigned int modelCount = 0;
+  // unsigned int modelCount = 0;
 
   gazebo::common::Time endTime(0, 0);
   gazebo::common::Time startTime(0, 0);
@@ -168,7 +794,7 @@ void info(const std::string &_filename)
         // Count all the model elements.
         while (modelElem)
         {
-          modelCount++;
+          // modelCount++;
           modelElem = modelElem->GetNextElement("model");
         }
       }
@@ -206,189 +832,152 @@ void info(const std::string &_filename)
 
   // Compute the duration
   gazebo::common::Time deltaTime = endTime - startTime;
-  int hours = deltaTime.sec / 3600;
-  int minutes = (deltaTime.sec - hours * 3600) / 60;
-  int seconds = (deltaTime.sec - hours * 3600 - minutes * 60);
+  // int hours = deltaTime.sec / 3600;
+  // int minutes = (deltaTime.sec - hours * 3600) / 60;
+  // int seconds = (deltaTime.sec - hours * 3600 - minutes * 60);
 
   // Output info
   std::cout
     << "Log Version:    " << play->GetLogVersion() << "\n"
     << "Gazebo Version: " << play->GetGazeboVersion() << "\n"
     << "Random Seed:    " << play->GetRandSeed() << "\n"
-    << "Start:          " << boost::posix_time::from_time_t(startTime.sec)
-    << "." << startTime.nsec << "\n"
-    << "End:            " << boost::posix_time::from_time_t(endTime.sec)
-    << "." << endTime.nsec << "\n"
-    << "Duration:       " << std::setfill('0') << std::setw(2) << hours << ":"
-                          << std::setfill('0') << std::setw(2) << minutes << ":"
-                          << std::setfill('0') << std::setw(2) << seconds << "."
-                          << deltaTime.nsec << "\n"
-    << "Steps:          " << play->GetChunkCount() << "\n"
+    // << "Start:          " << boost::posix_time::from_time_t(startTime.sec)
+    // << "." << startTime.nsec << "\n"
+    // << "End:            " << boost::posix_time::from_time_t(endTime.sec)
+    // << "." << endTime.nsec << "\n"
+    // << "Duration:       " << std::setfill('0') << std::setw(2)
+    // << hours << ":"
+    //                       << std::setfill('0')
+    //                       << std::setw(2) << minutes << ":"
+    //                       << std::setfill('0') << std::setw(2)
+    //                       << seconds << "."
+    //                       << deltaTime.nsec << "\n"
+    // << "Steps:          " << play->GetChunkCount() << "\n"
     << "Size:           " << get_file_size_str(_filename) << "\n"
     << "Encoding:       " << play->GetEncoding() << "\n"
-    << "Model Count:    " << modelCount << "\n"
+    // << "Model Count:    " << modelCount << "\n"
     << "\n";
 }
 
 /////////////////////////////////////////////////
-/// \brief Filter a state string.
-/// \param[in] _stateString State string data.
-/// \param[in] _filter Filter argument.
-std::string filter_state(const std::string &_stateString,
-                         std::string _filter)
+/// \brief Dump the contents of a log file to screen
+/// \param[in] _filter Filter string
+void echo(const std::string &_filter, bool _raw, const std::string &_stamp,
+    double _hz)
 {
-  std::ostringstream result;
-  gazebo::physics::WorldState state;
-  std::vector<std::string> names;
+  gazebo::util::LogPlay *play = gazebo::util::LogPlay::Instance();
+  std::string stateString;
 
-  // Read and parse the state information
-  g_stateSdf->ClearElements();
-  sdf::readString(_stateString, g_stateSdf);
-  state.Load(g_stateSdf);
+  // Output the header
+  if (!_raw)
+    std::cout << play->GetHeader() << std::endl;
 
-  // Split the filter on "::"
-  boost::split_regex(names, _filter, boost::regex("::"));
-  std::vector<std::string>::iterator iter = names.begin();
+  StateFilter filter(!_raw, _stamp, _hz);
+  filter.Init(_filter);
 
-  // Continue if the filter is valid. Otherwise output the raw state data.
-  if (iter != names.end() && !(*iter).empty())
+  unsigned int i = 0;
+  while (play->Step(stateString))
   {
-    // The first element in the filter must be a model name.
-    gazebo::physics::ModelState modelState = state.GetModelState(*(iter++));
+    if (i > 0)
+      stateString = filter.Filter(stateString);
+    else if (i == 0 && _raw)
+      stateString.clear();
 
-    // Continue if there is more to the filter and the current filter
-    // item valid. Otheriwise, use all of the model state data.
-    if (iter != names.end() && !(*iter).empty())
+    if (!stateString.empty())
     {
-      // Check to see if the next element in the filter is a link.
-      if (modelState.HasLinkState(*iter))
-      {
-        gazebo::physics::LinkState linkState;
+      if (!_raw)
+        std::cout << "<chunk encoding='txt'><![CDATA[\n";
 
-        // Get the link.
-        linkState = modelState.GetLinkState(*(iter++));
+      std::cout << stateString;
 
-        // Continue if the next element in the filter is valid. Otherwise
-        // use all of the link's data.
-        if (iter != names.end() && !(*iter).empty())
-        {
-          // Each data value in a link starts with a unique character, so we
-          // allow the user to use just the first character in the filter.
-          switch ((*iter)[0])
-          {
-            default:
-            case 'p':
-              result << linkState.GetPose();
-              break;
-            case 'v':
-              result << linkState.GetVelocity();
-              break;
-            case 'a':
-              result << linkState.GetAcceleration();
-              break;
-            case 'w':
-              result << linkState.GetAcceleration();
-              break;
-          }
-        }
-        else
-          result << linkState;
-      }
-      // Otherwise check to see if the next element in the filter is a joint.
-      else if (modelState.HasJointState(*iter))
-      {
-        gazebo::physics::JointState jointState;
-
-        // Get the joint.
-        jointState = modelState.GetJointState(*(iter++));
-
-        // Continue if there is more to the filter, and the filter element
-        // is valid. Otherwise use all of the joint's data.
-        if (iter != names.end() && !(*iter).empty())
-        {
-          // Try to get the index of the axis for output
-          try
-          {
-            int index = boost::lexical_cast<int>(*iter);
-            result << jointState.GetAngle(index);
-          }
-          catch(boost::bad_lexical_cast &_e)
-          {
-            gzerr << "Invalid joint angle index[" << *iter << "]\n";
-          }
-        }
-        else
-          result << jointState;
-      }
-      // Otherwise don't use any data.
-      else
-      {
-        // Don't output an error here. A link or joint will not get logged
-        // if there was no change in it's state values.
-      }
+      if (!_raw)
+        std::cout << "]]></chunk>\n";
     }
-    else
-      result << modelState;
+
+    ++i;
   }
-  else
-    result << g_stateSdf;
 
-  return result.str();
+  if (!_raw)
+    std::cout << "</gazebo_log>\n";
 }
 
 /////////////////////////////////////////////////
-/// \brief Dump the contents of a log file to screen
+/// \brief Step through a log file.
 /// \param[in] _filter Filter string
-void echo(const std::string &_filter)
+void step(const std::string &_filter, bool _raw, const std::string &_stamp,
+    double _hz)
 {
   std::string stateString;
+  gazebo::util::LogPlay *play = gazebo::util::LogPlay::Instance();
 
-  for (unsigned int i = 0;
-       i < gazebo::common::LogPlay::Instance()->GetChunkCount(); ++i)
-  {
-    // Get and output the state string
-    gazebo::common::LogPlay::Instance()->Step(stateString);
+  if (!_raw)
+    std::cout << play->GetHeader() << std::endl;
 
-    if (!_filter.empty() && i > 0)
-      stateString = filter_state(stateString, _filter);
-    else if (!_filter.empty())
+  char c = '\0';
+
+  StateFilter filter(!_raw, _stamp, _hz);
+  filter.Init(_filter);
+
+  unsigned int i = 0;
+  while (play->Step(stateString) && c != 'q')
+  {
+    if (i > 0)
+      stateString = filter.Filter(stateString);
+    else if (i == 0 && _raw)
       stateString.clear();
 
+    // Only wait for user input if there is some state to output.
     if (!stateString.empty())
-      std::cout << stateString << "\n";
+    {
+      if (!_raw)
+        std::cout << "<chunk encoding='txt'><![CDATA[\n";
+      std::cout << stateString;
+
+      if (!_raw)
+        std::cout << "]]></chunk>\n";
+
+      std::cout << "\n--- Press space to continue, 'q' to quit ---\n";
+
+      c = '\0';
+
+      // Wait for a space or 'q' key press
+      while (c != ' ' && c != 'q')
+        c = get_ch();
+    }
+    ++i;
   }
+
+  if (!_raw)
+    std::cout << "</gazebo_log>\n";
 }
 
 /////////////////////////////////////////////////
-/// \brief Step through a log file.
-/// \param[in] _filter Filter string
-void step(const std::string &_filter)
+/// \brief Start or stop logging
+/// \param[in] _start True to start logging
+void record(bool _start)
 {
-  std::string stateString;
-  gazebo::common::LogPlay *play = gazebo::common::LogPlay::Instance();
+  if (!gazebo::transport::init())
+    return;
 
-  char c = '\0';
+  gazebo::transport::run();
 
-  for (unsigned int i = 0; i < play->GetChunkCount() && c != 'q'; ++i)
-  {
-    // Get and output the state string
-    play->Step(stateString);
-
-    if (!_filter.empty() && i > 0)
-      stateString = filter_state(stateString, _filter);
-    else if (!_filter.empty())
-      stateString.clear();
+  gazebo::transport::NodePtr node(new gazebo::transport::Node());
+  node->Init();
 
-    std::cout << stateString << "\n";
+  gazebo::transport::PublisherPtr pub =
+    node->Advertise<gazebo::msgs::LogControl>("~/log/control");
 
-    std::cout << "\n--- Press space to continue, 'q' to quit ---\n";
+  if (!pub->WaitForConnection(gazebo::common::Time(10, 0)))
+  {
+    gzerr << "Unable to create a connection to topic ~/log/control.\n";
+    return;
+  }
 
-    c = '\0';
+  gazebo::msgs::LogControl msg;
+  _start ? msg.set_start(true) : msg.set_stop(true);
+  pub->Publish<gazebo::msgs::LogControl>(msg, true);
 
-    // Wait for a space or 'q' key press
-    while (c != ' ' && c != 'q')
-      c = get_ch();
-  }
+  gazebo::transport::fini();
 }
 
 /////////////////////////////////////////////////
@@ -403,6 +992,11 @@ int main(int argc, char **argv)
   po::options_description visibleOptions("Options");
   visibleOptions.add_options()
     ("help,h", "Output this help message.")
+    ("raw,r", "Output the data from echo and step without XML formatting.")
+    ("stamp,s", po::value<std::string>(), "Add a timestamp to each line of "
+     "output. Valid values are (sim,real,wall)")
+    ("hz,z", po::value<double>(), "Filter output to the specified Hz rate."
+     "Only valid for echo and step commands.")
     ("file,f", po::value<std::string>(), "Path to a log file.")
     ("filter", po::value<std::string>(),
      "Filter output. Valid only for the echo and step commands");
@@ -446,32 +1040,45 @@ int main(int argc, char **argv)
   // Output help when appropriate
   if (command.empty() || command == "help" || vm.count("help"))
   {
-    help();
-    std::cerr << visibleOptions << "\n";
-
+    help(visibleOptions);
     return 0;
   }
 
-  // Load the log file
-  if (vm.count("file"))
-    filename = vm["file"].as<std::string>();
-  else
+  if (command != "start" && command != "stop")
   {
-    gzerr << "No log file specified\n";
-    return -1;
+    // Load the log file
+    if (vm.count("file"))
+      filename = vm["file"].as<std::string>();
+    else
+    {
+      gzerr << "No log file specified\n";
+      return -1;
+    }
+
+    // Load log file from string
+    if (!load_log_from_file(filename))
+      return -1;
   }
 
-  // Load log file from string
-  if (!load_log_from_file(filename))
-    return -1;
+  std::string stamp;
+  if (vm.count("stamp"))
+    stamp = vm["stamp"].as<std::string>();
+
+  double hz = 0;
+  if (vm.count("hz"))
+    hz = vm["hz"].as<double>();
 
   // Process the command
   if (command == "info")
     info(filename);
   else if (command == "echo")
-    echo(filter);
+    echo(filter, vm.count("raw"), stamp, hz);
   else if (command == "step")
-    step(filter);
+    step(filter, vm.count("raw"), stamp, hz);
+  else if (command == "start")
+    record(true);
+  else if (command == "stop")
+    record(false);
 
   return 0;
 }
diff --git a/tools/gzmodel_create b/tools/gzmodel_create
new file mode 100644
index 0000000..049ab2d
--- /dev/null
+++ b/tools/gzmodel_create
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+manifest="<?xml version='1.0'?>
+<model>
+  <name>my_model</name>
+  <version>1.0</version>
+  <sdf>model.sdf</sdf>
+
+  <author>
+    <name>my_name</name>
+    <email>me at my.email</email>
+  </author>
+  
+  <description>
+  A description of my model
+  </description>
+</model>";
+
+if [ $1 ]
+then
+  mkdir $1
+  echo "$manifest" > $1/model.config;
+else
+  echo "Enter a directory to create for the model."
+  echo "Usage:"
+  echo "  gzmodel_create [directory]"
+fi
diff --git a/tools/gzmodel_create.sh b/tools/gzmodel_create.sh
deleted file mode 100755
index 308c3d1..0000000
--- a/tools/gzmodel_create.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/sh
-
-manifest="<?xml version='1.0'?>
-<model>
-  <name>my_model</name>
-  <version>1.0</version>
-  <sdf>model.sdf</sdf>
-
-  <author>
-    <name>my_name</name>
-    <email>me at my.email</email>
-  </author>
-  
-  <description>
-  A description of my model
-  </description>
-</model>";
-
-if [ $1 ]
-then
-  mkdir $1
-  echo "$manifest" > $1/manifest.xml;
-else
-  echo "Enter a directory to create for the model."
-  echo "Usage:"
-  echo "  gzmodel_create [directory]"
-fi
diff --git a/tools/gzprop b/tools/gzprop
new file mode 100755
index 0000000..98a5e71
--- /dev/null
+++ b/tools/gzprop
@@ -0,0 +1,65 @@
+#!/usr/bin/env ruby
+
+require 'tmpdir'
+
+#################################################
+# Display help information
+def help
+  puts "gzprop -- Create a model tarball for upload to thepropshop.org\n"
+  puts "\n"
+  puts "'gzprop' <model_file>\n"
+  puts "\n"
+  puts "Package an existing model directory into a tarball suitable"
+  puts "for upload to thepropshop.org. A working instanstance of"
+  puts "Gazebo >3.0 is required.\n"
+  puts "\n"
+end
+
+#################################################
+# Main
+
+# Make sure there are command line arguments.
+if ARGV.empty?
+  help()
+  abort("")
+end
+
+# Get the model file name
+modelFile = File.absolute_path(ARGV[0])
+
+modelParts = modelFile.split('/')
+modelDir = modelParts[0, modelParts.size()-1].join('/')
+
+# Make sure there is a model.sdf file in the model directory
+if !File.exists?(modelFile)
+  abort("Missing model file [#{modelFile}]")
+end
+
+# Get the name of the model (last part of the directory name)
+modelName = modelParts[-2]
+
+## Make a temporary directory
+Dir.mktmpdir { |dir|
+
+  metaDir = File.join(dir, modelName, "meta")
+
+  # Copy the model information into a temp directory
+  `cp -r "#{modelDir}" #{dir}`
+ 
+  # Create the meta directory
+  if RUBY_VERSION < "1.9"
+    Dir.mkdir(metaDir)
+  else
+    Dir.mkdir(metaDir)
+  end
+
+  # Create a set of images
+  `gzserver -s libModelPropShop.so worlds/blank.world --propshop-save "#{metaDir}" --propshop-model "#{modelFile}"`
+  
+  # Create a tarball for the model
+  `tar czvf #{modelName}.tar.gz -C #{dir} "#{modelName}"`
+}
+
+# Completion message
+puts "Propshop model created.\n"
+puts "Upload [#{modelName}.tar.gz] to thepropshop.org"
diff --git a/tools/gzprop.1.ronn b/tools/gzprop.1.ronn
new file mode 100644
index 0000000..47d5acf
--- /dev/null
+++ b/tools/gzprop.1.ronn
@@ -0,0 +1,27 @@
+gzprop -- Package a model for thepropshop.org
+=============================================
+
+## SYNOPSIS
+
+`gzprop` <model_directory>
+
+## DESCRIPTION
+
+Package an existing model directory into a tarball suitable for upload to thepropshop.org. A working instance of Gazebo >= 3.0 is required.
+
+## OPTIONS
+
+* -h, --help :
+ Output this help message.
+
+## SEE ALSO
+  ThePropShop website: http://thepropshop.org
+
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-2014 Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
diff --git a/tools/gzsdf.1.ronn b/tools/gzsdf.1.ronn
new file mode 100644
index 0000000..66b0aa0
--- /dev/null
+++ b/tools/gzsdf.1.ronn
@@ -0,0 +1,37 @@
+gzsdf -- DEPRECATED(see 'gz help sdf')
+=============================================
+
+## SYNOPSIS
+
+`gzsdf` <command>
+
+## DESCRIPTION
+
+This tool provides information about SDF files.
+
+## COMMAND ELEMENTS
+
+* **describe <SDF version>**:
+Print the SDF format.
+* **convert <file>**:
+In place conversion to the latest format.
+* **doc <SDF version>**:
+Print HTML SDF.
+* **check <file> <SDF version>**:
+Check the SDF format for the given file.
+* **print <SDF version>**:
+Prints SDF, useful for debugging and as a conversion tool.
+
+## SEE ALSO
+Example and more information about gazebo gzsdf and other commandline tools can be found at: http://gazebosim.org/user_guide/started__commandlinetools.html
+
+For more information about the SDF format please read: http://gazebosim.org/sdf.html
+
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-2014 Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
diff --git a/tools/gzsdf.cc b/tools/gzsdf.cc
index d6093ee..1f6718a 100644
--- a/tools/gzsdf.cc
+++ b/tools/gzsdf.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,7 +16,12 @@
 */
 
 #include <sys/stat.h>
-#include "sdf/sdf.hh"
+
+#include <sdf/sdf.hh>
+
+#include "gazebo/common/CommonIface.hh"
+#include "gazebo/common/Exception.hh"
+#include "gazebo/common/Console.hh"
 
 std::vector<std::string> params;
 
@@ -25,17 +30,25 @@ using namespace sdf;
 /////////////////////////////////////////////////
 void help()
 {
-  std::cout << "This tool provides information about SDF files.\n\n";
-  std::cout << "gzsdf <command>\n\n";
-  std::cout << "Commands:\n";
-  std::cout << "    describe [SDF version]     Print the SDF format.\n";
-  std::cout << "    convert [file]             "
-            << "In place conversion to the latest format.\n";
-  std::cout << "    doc [SDF version]          Print HTML SDF.\n";
-  std::cout << "    check [file] [SDF version] Check the SDF format for the";
-  std::cout << " given file.\n";
-  std::cout << "    print [SDF verison]         Prints SDF, useful for ";
-  std::cout << " debugging and as a conversion tool.\n\n";
+  std::cerr << "gzsdf -- DEPRECATED(see 'gz help sdf')\n\n";
+  std::cerr << "`gzsdf` <command>\n\n";
+  std::cerr << "This tool provides information about SDF files.\n\n";
+  std::cerr << "Commands:\n";
+  std::cerr << "    describe <SDF version>     Print the SDF format.\n";
+  std::cerr << "    convert <file>             "
+    << "In place conversion to the latest format.\n";
+  std::cerr << "    doc <SDF version>          Print HTML SDF.\n";
+  std::cerr << "    check <file> <SDF version> Check the SDF format for the";
+  std::cerr << " given file.\n";
+  std::cerr << "    print <SDF version>         Prints SDF, useful for ";
+  std::cerr << " debugging and as a conversion tool.\n\n";
+
+  std::cerr << "See also:\n"
+    << "Example and more information about gazebo gzsdf and other command"
+    << "line tools can be found at: "
+    << "http://gazebosim.org/user_guide/started__commandlinetools.html\n\n"
+    << "For more information about the SDF format please read: "
+    << "http://gazebosim.org/sdf.html\n";
 }
 
 /////////////////////////////////////////////////
@@ -50,6 +63,17 @@ int main(int argc, char** argv)
 {
   bool success = false;
 
+  try
+  {
+    // Initialize the informational logger. This will log warnings and errors.
+    gzLogInit("gzsdf.log");
+  }
+  catch(gazebo::common::Exception &_e)
+  {
+    _e.Print();
+    std::cerr << "Error initializing log file" << std::endl;
+  }
+
   // Get parameters from command line
   for (int i = 1; i < argc; i++)
   {
@@ -58,12 +82,16 @@ int main(int argc, char** argv)
     params.push_back(p);
   }
 
-  if (params.empty() || params[0] == "help" || params[0] == "h")
+  if (params.empty() || params[0] == "help" || params[0] == "-h")
   {
     help();
     return 0;
   }
 
+  // We must set the findFile callback here so that gzsdf check/print
+  // can find resource files when parsing the sdf in readFile().
+  sdf::setFindCallback(boost::bind(&gazebo::common::find_file, _1));
+
   if ((params[0] == "check" || params[0] == "print" || params[0] == "convert"))
   {
     if (params.size() == 3)
@@ -128,7 +156,16 @@ int main(int argc, char** argv)
       if (sdf::Converter::Convert(&xmlDoc, SDF::version, true))
       {
         success = true;
-        xmlDoc.SaveFile(params[1]);
+
+        // Create an XML printer to control formatting
+        TiXmlPrinter printer;
+        printer.SetIndent("  ");
+        xmlDoc.Accept(&printer);
+
+        // Output the XML
+        std::ofstream stream(params[1].c_str(), std::ios_base::out);
+        stream << printer.Str();
+        stream.close();
       }
     }
     else
diff --git a/tools/gzstats.1.ronn b/tools/gzstats.1.ronn
new file mode 100644
index 0000000..206102a
--- /dev/null
+++ b/tools/gzstats.1.ronn
@@ -0,0 +1,31 @@
+gzstats -- DEPRECATED(see 'gz help sdf')
+=============================================
+
+## SYNOPSIS
+
+`gzstats` [options]
+
+## DESCRIPTION
+
+This tool displays statistics about a running Gazebo world.
+
+## OPTIONS
+
+* -h, --help :
+ Print help message.
+* -p, --plot :
+ Output comma-separated values, useful for processing and plotting.
+* -w, --world-name arg :
+ The Gazebo world to monitor.
+
+## SEE ALSO
+Examples and more information can be found at: http://gazebosim.org/wiki/Tools#World_Statistics
+
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-2014 Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
diff --git a/tools/gzstats.cc b/tools/gzstats.cc
index 8b3e153..f7993db 100644
--- a/tools/gzstats.cc
+++ b/tools/gzstats.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,14 +19,14 @@
 #include <google/protobuf/message.h>
 #include <boost/thread.hpp>
 
-#include "transport/Transport.hh"
-#include "transport/TransportTypes.hh"
-#include "transport/Node.hh"
+#include "gazebo/transport/TransportIface.hh"
+#include "gazebo/transport/TransportTypes.hh"
+#include "gazebo/transport/Node.hh"
 
-#include "common/Animation.hh"
-#include "common/KeyFrame.hh"
+#include "gazebo/common/Animation.hh"
+#include "gazebo/common/KeyFrame.hh"
 
-#include "gazebo_config.h"
+#include "gazebo/gazebo_config.h"
 
 namespace po = boost::program_options;
 using namespace gazebo;
@@ -112,20 +112,18 @@ void SignalHandler(int /*dummy*/)
 /////////////////////////////////////////////////
 int main(int argc, char **argv)
 {
-  std::string worldName = "default";
-
   if (signal(SIGINT, SignalHandler) == SIG_ERR)
   {
     std::cerr << "signal(2) failed while setting up for SIGINT" << std::endl;
     return -1;
   }
 
-  po::options_description desc("Allowed options");
+  po::options_description desc("Options");
   desc.add_options()
-    ("help,h", "print help message")
-    ("plot,p", "output comma-separated values, useful for processing and "
-               "plotting")
-    ("world-name,w", po::value<std::string>(), "the Gazebo world to monitor");
+    ("help,h", "Print help message.")
+    ("plot,p", "Output comma-separated values, useful for processing and "
+               "plotting.")
+    ("world-name,w", po::value<std::string>(), "The Gazebo world to monitor.");
   po::variables_map vm;
 
   try
@@ -143,12 +141,23 @@ int main(int argc, char **argv)
 
   if (vm.count("help"))
   {
-    std::cerr << "This tool displays statistics about a running Gazebo world.\n"
-              << "Usage: gzstats [options]\n"
-              << desc << std::endl;
+    std::cerr << "gzstats -- DEPRECATED(see 'gz help sdf')\n\n";
+
+    std::cerr << "`gzstats` [options]\n\n";
+
+    std::cerr << "This tool displays statistics about a running "
+      "Gazebo world.\n\n";
+
+    std::cerr << desc << "\n";
+
+    std::cerr << "See also:\n"
+      << "Examples and more information can be found at: "
+      << "http://gazebosim.org/wiki/Tools#World_Statistics\n";
+
     return 1;
   }
 
+  std::string worldName;
   if (vm.count("world-name"))
   {
     worldName = vm["world-name"].as<std::string>();
@@ -159,19 +168,20 @@ int main(int argc, char **argv)
     g_plot = true;
   }
 
-  transport::init();
-
-  transport::NodePtr node(new transport::Node());
+  if (transport::init())
+  {
+    transport::NodePtr node(new transport::Node());
 
-  node->Init(worldName);
+    node->Init(worldName);
 
-  std::string topic = "~/world_stats";
+    std::string topic = "~/world_stats";
 
-  transport::SubscriberPtr sub = node->Subscribe(topic, cb);
-  transport::run();
+    transport::SubscriberPtr sub = node->Subscribe(topic, cb);
+    transport::run();
 
-  boost::mutex::scoped_lock lock(mutex);
-  condition.wait(lock);
+    boost::mutex::scoped_lock lock(mutex);
+    condition.wait(lock);
+  }
 
   transport::fini();
 
diff --git a/tools/gztopic.1.ronn b/tools/gztopic.1.ronn
new file mode 100644
index 0000000..23125c7
--- /dev/null
+++ b/tools/gztopic.1.ronn
@@ -0,0 +1,46 @@
+gztopic -- DEPRECATED(see 'gz help topic')
+=============================================
+
+## SYNOPSIS
+
+`gztopic` [options] <command>
+
+## DESCRIPTION
+
+List information about published topics on a Gazebo master.
+
+## COMMAND ELEMENTS
+
+* **list**:
+List all topics.
+* **info <topic>**:
+Get information about a topic.
+* **echo <topic>**:
+Output topic data to screen.
+* **view <topic>**:
+View topic data using a QT widget.
+* **hz <topic>**:
+Get publish frequency.
+* **bw <topic>**:
+Get topic bandwidth.
+* **help**:
+This help text.
+
+## OPTIONS
+
+* -h, --help :
+ Output this help message.
+* -u, --unformatted :
+ Output the data from echo and list without formatting.
+
+## SEE ALSO
+Examples and more information can be found at:http://gazebosim.org/wiki/Tools#Topic_Info
+
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-2014 Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
diff --git a/tools/gztopic.cc b/tools/gztopic.cc
index dd94953..d2003e2 100644
--- a/tools/gztopic.cc
+++ b/tools/gztopic.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
 #include <gazebo/gazebo.hh>
 
 #include <gazebo/common/Time.hh>
-#include <gazebo/transport/Transport.hh>
+#include <gazebo/transport/TransportIface.hh>
 #include <gazebo/transport/TransportTypes.hh>
 #include <gazebo/transport/Node.hh>
 
@@ -32,8 +32,11 @@
 
 #include <boost/algorithm/string.hpp>
 #include <boost/lexical_cast.hpp>
+#include <boost/program_options.hpp>
 #include <boost/thread/mutex.hpp>
 
+namespace po = boost::program_options;
+
 using namespace gazebo;
 
 // transport::ConnectionPtr connection(new transport::Connection());
@@ -48,31 +51,98 @@ std::vector<common::Time> bwTime;
 boost::mutex mutex;
 
 boost::shared_ptr<google::protobuf::Message> g_echoMsg;
+bool g_useShortDebugString = false;
 
 /////////////////////////////////////////////////
-void help()
+void help(po::options_description &_options)
 {
-  std::cerr << "This tool lists information about published topics on a "
-            << "Gazebo master.\n"
-            << "    list         : List all topics\n"
-            << "    info <topic> : Get information about a topic\n"
-            << "    echo <topic> : Output topic data to screen\n"
-            << "    view <topic> : View topic data using a QT widget\n"
-            << "    hz <topic>   : Get publish frequency\n"
-            << "    bw <topic>   : Get topic bandwidth\n"
-            << "    help         : This help text\n";
+  std::cerr << "gztopic -- DEPRECATED(see 'gz help topic')\n\n";
+
+  std::cerr << "`gztopic` [options] <command>\n\n";
+
+  std::cerr << "List information about published topics on a "
+    "Gazebo master.\n\n";
+
+  std::cerr << "Commands:\n"
+            << "    list          List all topics.\n"
+            << "    info <topic>  Get information about a topic.\n"
+            << "    echo <topic>  Output topic data to screen.\n"
+            << "    view <topic>  View topic data using a QT widget.\n"
+            << "    hz <topic>    Get publish frequency.\n"
+            << "    bw <topic>    Get topic bandwidth.\n"
+            << "    help          This help text.\n\n";
+
+  std::cerr << _options << "\n";
+
+  std::cerr << "See also:\n"
+    << "Examples and more information can be found at:"
+    << "http://gazebosim.org/wiki/Tools#Topic_Info\n";
 }
 
 /////////////////////////////////////////////////
 bool parse(int argc, char **argv)
 {
-  if (argc == 1 || std::string(argv[1]) == "help")
+  // Hidden options
+  po::options_description hiddenOptions("hidden options");
+  hiddenOptions.add_options()
+    ("command", po::value<std::string>(), "Command")
+    ("topic", po::value<std::string>(), "Topic");
+
+  // Options that are visible to the user through help.
+  po::options_description visibleOptions("Options");
+  visibleOptions.add_options()
+    ("help,h", "Output this help message.")
+    ("unformatted,u", "Output the data from echo and list without formatting.");
+
+  // Both the hidden and visible options
+  po::options_description allOptions("all options");
+  allOptions.add(hiddenOptions).add(visibleOptions);
+
+  // The command and file options are positional
+  po::positional_options_description positional;
+  positional.add("command", 1).add("topic", -1);
+
+  po::variables_map vm;
+
+  try
+  {
+    po::store(
+        po::command_line_parser(argc, argv).options(allOptions).positional(
+          positional).run(), vm);
+
+    po::notify(vm);
+  }
+  catch(boost::exception &_e)
   {
-    help();
+    std::cerr << "Invalid arguments\n\n";
     return false;
   }
 
-  // Get parameters from command line
+  {
+    std::string command;
+    command = vm.count("command") ? vm["command"].as<std::string>() : "";
+
+    if (command.empty() || command == "help" || vm.count("help"))
+    {
+      help(visibleOptions);
+      return false;
+    }
+
+    // Get parameters from command line
+    if (!command.empty())
+      params.push_back(command);
+
+    if (vm.count("unformatted"))
+      g_useShortDebugString = true;
+  }
+
+  {
+    std::string topic;
+    topic = vm.count("topic") ? vm["topic"].as<std::string>() : "";
+    if (!topic.empty())
+      params.push_back(topic);
+  }
+
   for (int i = 1; i < argc; i++)
   {
     std::string p = argv[i];
@@ -80,23 +150,6 @@ bool parse(int argc, char **argv)
     params.push_back(p);
   }
 
-  // Get parameters from stdin
-  if (!isatty(fileno(stdin)))
-  {
-    char str[1024];
-    while (!feof(stdin))
-    {
-      if (fgets(str, 1024, stdin)== NULL)
-        break;
-
-      if (feof(stdin))
-        break;
-      std::string p = str;
-      boost::trim(p);
-      params.push_back(p);
-    }
-  }
-
   return true;
 }
 
@@ -112,20 +165,30 @@ transport::ConnectionPtr connect_to_master()
 
   // Connect to the master
   transport::ConnectionPtr connection(new transport::Connection());
-  connection->Connect(host, port);
-
-  // Read the verification message
-  connection->Read(data);
-  connection->Read(namespacesData);
-  connection->Read(publishersData);
 
-  packet.ParseFromString(data);
-  if (packet.type() == "init")
+  if (connection->Connect(host, port))
   {
-    msgs::GzString msg;
-    msg.ParseFromString(packet.serialized_data());
-    if (msg.data() != std::string("gazebo ") + GAZEBO_VERSION_FULL)
-      std::cerr << "Conflicting gazebo versions\n";
+    try
+    {
+      // Read the verification message
+      connection->Read(data);
+      connection->Read(namespacesData);
+      connection->Read(publishersData);
+    }
+    catch(...)
+    {
+      gzerr << "Unable to read from master\n";
+      return transport::ConnectionPtr();
+    }
+
+    packet.ParseFromString(data);
+    if (packet.type() == "init")
+    {
+      msgs::GzString msg;
+      msg.ParseFromString(packet.serialized_data());
+      if (msg.data() != std::string("gazebo ") + GAZEBO_VERSION_FULL)
+        std::cerr << "Conflicting gazebo versions\n";
+    }
   }
 
   return connection;
@@ -141,26 +204,39 @@ void list()
 
   transport::ConnectionPtr connection = connect_to_master();
 
-  request.set_id(0);
-  request.set_request("get_publishers");
-  connection->EnqueueMsg(msgs::Package("request", request), true);
-  connection->Read(data);
+  if (connection)
+  {
+    request.set_id(0);
+    request.set_request("get_publishers");
+    connection->EnqueueMsg(msgs::Package("request", request), true);
 
-  packet.ParseFromString(data);
-  pubs.ParseFromString(packet.serialized_data());
+    try
+    {
+      connection->Read(data);
+    }
+    catch(...)
+    {
+      gzerr << "An active gzserver is probably not present.\n";
+      connection.reset();
+      return;
+    }
 
-  // This list is used to filter topic output.
-  std::list<std::string> listed;
+    packet.ParseFromString(data);
+    pubs.ParseFromString(packet.serialized_data());
 
-  for (int i = 0; i < pubs.publisher_size(); i++)
-  {
-    const msgs::Publish &p = pubs.publisher(i);
-    if (std::find(listed.begin(), listed.end(), p.topic()) == listed.end())
+    // This list is used to filter topic output.
+    std::list<std::string> listed;
+
+    for (int i = 0; i < pubs.publisher_size(); i++)
     {
-      std::cout << p.topic() << std::endl;
+      const msgs::Publish &p = pubs.publisher(i);
+      if (std::find(listed.begin(), listed.end(), p.topic()) == listed.end())
+      {
+        std::cout << p.topic() << std::endl;
 
-      // Record the topics that have been listed to prevent duplicates.
-      listed.push_back(p.topic());
+        // Record the topics that have been listed to prevent duplicates.
+        listed.push_back(p.topic());
+      }
     }
   }
 
@@ -171,7 +247,10 @@ void list()
 void echoCB(const std::string &_data)
 {
   g_echoMsg->ParseFromString(_data);
-  std::cout << g_echoMsg->DebugString() << "\n";
+  if (g_useShortDebugString)
+    std::cout << g_echoMsg->ShortDebugString() << std::endl;
+  else
+    std::cout << g_echoMsg->DebugString() << std::endl;
 }
 
 /////////////////////////////////////////////////
@@ -189,7 +268,10 @@ void hzCB(const std::string &/*_data*/)
   common::Time cur_time = common::Time::GetWallTime();
 
   if (hz_prev_time != common::Time(0, 0))
-    printf("Hz: %6.2f\n", 1.0 / (cur_time - hz_prev_time).Double());
+  {
+    std::cout << "Hz: " << std::setw(6) << std::fixed << std::setprecision(2)
+              << 1.0 / (cur_time - hz_prev_time).Double() << std::endl;
+  }
 
   hz_prev_time = cur_time;
 }
@@ -255,7 +337,8 @@ void echo()
 
   std::string topic = params[1];
 
-  transport::init();
+  if (!transport::init())
+    return;
 
   transport::NodePtr node(new transport::Node());
   node->Init();
@@ -300,7 +383,8 @@ void bw()
     return;
   }
 
-  transport::init();
+  if (!transport::init())
+    return;
 
   transport::NodePtr node(new transport::Node());
   node->Init();
@@ -392,7 +476,8 @@ void hz()
     return;
   }
 
-  transport::init();
+  if (!transport::init())
+    return;
 
   transport::NodePtr node(new transport::Node());
   node->Init();
@@ -413,14 +498,12 @@ void hz()
 /////////////////////////////////////////////////
 void view(int _argc, char **_argv)
 {
-  if (!gazebo::load())
+  if (!gazebo::setupClient())
   {
     printf("load error\n");
     return;
   }
 
-  gazebo::run();
-
   QApplication *app = new QApplication(_argc, _argv);
 
   QFile file(":/style.qss");
@@ -457,15 +540,9 @@ void view(int _argc, char **_argv)
       gzerr << "Unable to create viewer for message type[" << msgType << "]\n";
   }
 
-  if (!gazebo::init())
-  {
-    gzerr << "Unable to initialize Gazebo\n";
-    return;
-  }
-
   app->exec();
 
-  gazebo::fini();
+  gazebo::shutdown();
 }
 
 /////////////////////////////////////////////////
@@ -474,6 +551,8 @@ int main(int argc, char **argv)
   if (!parse(argc, argv))
     return 0;
 
+  gazebo::common::Console::SetQuiet(true);
+
   if (params[0] == "list")
     list();
   else if (params[0] == "info")
diff --git a/tools/make_ronn.py b/tools/make_ronn.py
new file mode 100755
index 0000000..450054b
--- /dev/null
+++ b/tools/make_ronn.py
@@ -0,0 +1,76 @@
+#!/usr/bin/python
+
+import os
+import sys
+import subprocess
+import re
+import datetime
+
+process = subprocess.Popen([sys.argv[1], '-h'], stderr=subprocess.PIPE)
+stdout, stderr = process.communicate()
+help_txt = stderr
+
+lines = help_txt.splitlines()
+
+if len(sys.argv) > 2:
+  f = open(sys.argv[2], 'w')
+else:
+  f = sys.stdout
+
+i = 0
+for i in range(len(lines)):
+  if i == 0:
+    f.write("%s\n" % lines[i])
+    f.write("=============================================\n\n")
+  elif i == 2:
+    f.write("## SYNOPSIS\n\n")
+    f.write('%s\n\n' % lines[i])
+  elif i == 4:
+    f.write("## DESCRIPTION\n\n")
+    f.write("%s\n\n" % lines[i])
+  elif lines[i] == "See also:":
+    f.write("## SEE ALSO\n")
+    i = i + 1
+
+    # It's assumed that "See also:" is the last set of help text
+    while i < len(lines):
+      f.write("%s\n" % lines[i])
+      i = i + 1
+  else:
+    if lines[i] == "Allowed options:" or lines[i] == "Options:":
+      i = i + 1
+      f.write("## OPTIONS\n\n")
+      while i < len(lines) and len(lines[i]) > 0 and lines[i][0] == " ":
+        line = lines[i].replace(" [ ", ", ")
+        line = line.replace(' ]', '')
+        line = line.strip()
+        line = re.sub('\s+', ' ', line)
+        line = re.sub('\s([A-Z].*)', r' :\n \1', line)
+        i = i + 1
+        while i < len(lines) and len(lines[i]) > 0 and lines[i][0] == " " and re.match(r'^   ', lines[i]):
+          line += " " + lines[i].strip()
+          i = i + 1
+        f.write("* %s\n"%line)
+      f.write("\n")
+
+    if lines[i] == "Commands:":
+      i = i + 1
+      f.write("## COMMAND ELEMENTS\n\n")
+      while i < len(lines) and len(lines[i]) > 0 and lines[i][0] == " ":
+        line = lines[i].strip()
+        line = re.sub('\s+', ' ', line)
+        line = re.sub('\s([A-Z].*\.$)', r'**:\n\1', line)
+        f.write("* **%s\n" % line)
+        i = i + 1
+      f.write("\n")
+
+f.write("""
+## AUTHOR
+  Open Source Robotics Foundation
+
+## COPYRIGHT 
+  Copyright (C) 2012-%s Open Source Robotics Foundation
+       
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+""" % (datetime.datetime.now().year))
diff --git a/tools/msg_check.py b/tools/msg_check.py
new file mode 100755
index 0000000..eb56e31
--- /dev/null
+++ b/tools/msg_check.py
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+
+import os
+import sys
+import re
+
+# Get current working directory
+cwd = os.getcwd()
+
+# If running from in the tools directory, then add a "/.."
+if cwd.endswith("/tools"):
+  cwd = cwd + "/.."
+
+# XML always need a results tag, even when there is no errors
+if len(sys.argv) > 1 and sys.argv[1] == "xml":
+  sys.stderr.write('''<?xml version="1.0" encoding="UTF-8"?>\n''')
+  sys.stderr.write('''<results>\n''')
+ 
+# Iterate over all the .proto files
+for filename in os.listdir(cwd + "/gazebo/msgs"):
+  if filename.endswith('.proto'):
+    with open(cwd + "/gazebo/msgs/" + filename, 'r') as f:
+      for line in f.readlines():
+        # Get the "/// \interface (*)" 
+        iface_match = re.search('^///\s\\\\interface\s+.*$', line)
+        if iface_match:
+          iface = line[iface_match.start()+15:iface_match.end()].strip()
+
+        # Get the "message (*)" 
+        msg_match = re.search('^message\s+.*$', line)
+        if msg_match:
+          msg = line[msg_match.start()+8:msg_match.end()].strip()
+
+      # Make sure the two match
+      if iface != msg:
+        msg = "Mismatch between \interface and message: %s" % filename
+        if len(sys.argv) > 1 and sys.argv[1] == "xml":
+          sys.stderr.write('''<error file="%s" line="0" id="0" severity="error" msg="%s">\n''' % (filename, msg))
+        else:
+          sys.stderr.write(msg + "\n")
+
+if len(sys.argv) > 1 and sys.argv[1] == "xml":
+  sys.stderr.write('''</results>\n''')
diff --git a/tools/qtest_to_junit.xslt b/tools/qtest_to_junit.xslt
new file mode 100644
index 0000000..76c81c4
--- /dev/null
+++ b/tools/qtest_to_junit.xslt
@@ -0,0 +1,95 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<xsl:output method="xml" indent="yes" />
+<xsl:decimal-format decimal-separator="." grouping-separator="," />
+
+<!-- misc variables -->
+<xsl:variable name="classname" select="/TestCase/@name" />
+<xsl:variable name="total-tests" select="count(/TestCase/TestFunction)" />
+<xsl:variable name="total-failures" select="count(/TestCase/TestFunction/Incident[@type='fail'])" />
+<xsl:variable name="total-time" select="sum(/TestCase/TestFunction/BenchmarkResult/@value)" />
+
+<!-- main template call -->
+<xsl:template match="/">
+    <xsl:apply-templates select="TestCase"/>
+</xsl:template>
+
+<xsl:template match="TestCase">
+	<testsuite name="{$classname}" tests="{$total-tests}" failures="{$total-failures}" errors="0" time="{$total-time}">
+        <xsl:apply-templates select="Environment"/>
+        <xsl:apply-templates select="TestFunction" />
+		<xsl:call-template name="display-system-out" />
+		<xsl:call-template name="display-system-err" />
+    </testsuite>
+</xsl:template>
+
+<xsl:template match="Environment">
+    <properties>
+        <xsl:for-each select="*">
+            <property name="{name()}" value="{text()}" />
+        </xsl:for-each>
+    </properties>
+</xsl:template>
+
+<xsl:template match="TestFunction">
+    <!-- check if BenchMarkResult is defined. 0 by default -->
+    <xsl:variable name="time">
+      <xsl:choose>
+        <xsl:when test="BenchmarkResult/@value">
+          <xsl:value-of select='BenchmarkResult/@value'/>
+        </xsl:when>
+      <xsl:otherwise>
+         <xsl:text>0</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+    </xsl:variable>
+    <testcase classname="{$classname}" name="{@name}" time="{$time}">
+        <!-- handle fail -->
+        <xsl:if test="Incident/@type = 'fail'">
+			<!-- will be used to generate "nice" error message -->
+			<xsl:variable name="file" select="Incident/@file" />
+			<xsl:variable name="line" select="Incident/@line" />
+			<xsl:variable name="description">
+				<xsl:value-of select="Incident/Description" />
+			</xsl:variable>
+
+			<!-- display a reasonable error message -->
+            <xsl:element name="failure">
+                <xsl:attribute name="type">Standard</xsl:attribute>
+                <xsl:attribute name="message">
+					<xsl:value-of select="concat($file,':',$line,' :: ',$description)" />
+                </xsl:attribute>
+            </xsl:element>
+
+        </xsl:if>
+        
+		<!-- handle skip -->
+        <xsl:if test="Incident/@type = 'skip'">
+           
+        </xsl:if>
+    </testcase>
+</xsl:template>
+
+<xsl:template name="display-system-out">
+	<system-out>
+		<xsl:for-each select="/TestCase/TestFunction/Incident[@type='fail'] | /TestCase/TestFunction/Message[@type='skip']">
+			<xsl:choose>
+				<xsl:when test="@type='fail'">
+					<xsl:value-of select="Description"/>
+				</xsl:when>
+				<xsl:when test="@type='skip'">
+					<xsl:value-of select="Description"/>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:for-each>
+	</system-out>
+</xsl:template>
+
+<xsl:template name="display-system-err">
+	<!-- do nothing for now -->
+	<system-err />
+</xsl:template>
+
+
+</xsl:stylesheet>
+
diff --git a/tools/sdf2pov.cc b/tools/sdf2pov.cc
index 4b93ecb..63e0b82 100644
--- a/tools/sdf2pov.cc
+++ b/tools/sdf2pov.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Open Source Robotics Foundation
+ * Copyright (C) 2012-2014 Open Source Robotics Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,12 +14,12 @@
  * limitations under the License.
  *
 */
-#include "sdf/sdf.hh"
-#include "math/Pose.hh"
-#include "common/Console.hh"
-#include "common/MeshManager.hh"
-#include "common/Mesh.hh"
-#include "common/Material.hh"
+#include <sdf/sdf.hh>
+#include "gazebo/math/Pose.hh"
+#include "gazebo/common/Console.hh"
+#include "gazebo/common/MeshManager.hh"
+#include "gazebo/common/Mesh.hh"
+#include "gazebo/common/Material.hh"
 
 std::vector<std::string> params;
 
diff --git a/tools/test/CMakeLists.txt b/tools/test/CMakeLists.txt
deleted file mode 100644
index c601ae1..0000000
--- a/tools/test/CMakeLists.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-include (${gazebo_cmake_dir}/GazeboUtils.cmake)
-
-include_directories (
-  ${PROJECT_SOURCE_DIR}/gazebo 
-  ${PROJECT_BINARY_DIR}/gazebo
-  ${PROTOBUF_INCLUDE_DIR}
-)
-
-link_directories(${PROJECT_BINARY_DIR}/test)
-
-set (gtest_sources 
-  gz_log.cc 
-)
-
-gz_build_tests(${gtest_sources})
diff --git a/tools/test/gz_log.cc b/tools/test/gz_log.cc
deleted file mode 100644
index 072a10b..0000000
--- a/tools/test/gz_log.cc
+++ /dev/null
@@ -1,1024 +0,0 @@
-/*
- * Copyright 2012 Open Source Robotics Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
-*/
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-#include <boost/lexical_cast.hpp>
-#include <boost/algorithm/string/trim.hpp>
-
-#include "test_config.h"
-
-static std::string pr2StateLog =
-"  <model name='pr2'>\n"
-"    <pose>0 0 -8e-06 0 0 0</pose>\n"
-"    <link name='base_footprint'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000124 4.5e-05 -0.007966 0.000178 -0.000477 "
-"-6.8e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='bl_caster_rotation_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000166 6.7e-05 -0.008024 0.000173 -0.000487 "
-"-7e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='bl_caster_l_wheel_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000199 7.9e-05 -0.008031 0.000174 8e-06 "
-"-7e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='bl_caster_r_wheel_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000198 8.1e-05 -0.008046 0.000182 -9e-06 "
-"-7e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='br_caster_rotation_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000135 6.7e-05 -0.008105 0.00016 -0.000508 "
-"-7e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='br_caster_l_wheel_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000171 7.8e-05 -0.008099 0.000177 8e-06 "
-"-4e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='br_caster_r_wheel_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000169 7.6e-05 -0.008117 0.000168 8e-06 "
-"-7e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fl_caster_rotation_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000164 3.4e-05 -0.007804 0.000177 -0.000499 "
-"-7e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fl_caster_l_wheel_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.0002 4.7e-05 -0.007798 0.000171 8e-06 "
-"-7e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fl_caster_r_wheel_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000199 4.7e-05 -0.007812 0.000185 9e-06 "
-"-8e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fr_caster_rotation_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000135 3.3e-05 -0.00788 0.000163 -0.000504 "
-"-4e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fr_caster_l_wheel_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000172 4.7e-05 -0.00788 0.000147 7e-06 "
-"-8e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fr_caster_r_wheel_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.00017 4.8e-05 -0.007893 0.000165 8e-06 "
-"-6e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='torso_lift_link'>\n"
-"      <pose>0 0 1e-06 0 0 0</pose>\n"
-"      <velocity>-0.000125 -3.9e-05 -0.006598 0.000257 -0.000557 "
-"-5e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='head_pan_link'>\n"
-"      <pose>0 0 1e-06 0 0 0</pose>\n"
-"      <velocity>-0.000408 -0.000142 -0.006521 0.000269 -0.000537 "
-"-2.7e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='head_tilt_link'>\n"
-"      <pose>0 0 1e-06 0 1e-06 0</pose>\n"
-"      <velocity>-0.000355 -0.000141 -0.006499 0.000235 0.000285 "
-"-6e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_shoulder_pan_link'>\n"
-"      <pose>0 0 1e-06 0 0 0</pose>\n"
-"      <velocity>-0.000105 -4.3e-05 -0.006514 0.000204 -0.000547 "
-"2.1e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_shoulder_lift_link'>\n"
-"      <pose>0 0 1e-06 0 -1.3e-05 0</pose>\n"
-"      <velocity>0.000232 -5.5e-05 -0.006142 0.000164 -0.012994 "
-"-1.1e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_upper_arm_roll_link'>\n"
-"      <pose>0 0 1e-06 1e-05 -1.3e-05 0</pose>\n"
-"      <velocity>-0.000166 -4.7e-05 -0.003496 0.010584 -0.01302 "
-"2.1e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_elbow_flex_link'>\n"
-"      <pose>0 0 6e-06 1e-05 -1e-05 0</pose>\n"
-"      <velocity>-4.1e-05 7.3e-05 -0.001117 0.010487 -0.010393 "
-"0.000104</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_forearm_roll_link'>\n"
-"      <pose>0 0 6e-06 0 -1e-05 0</pose>\n"
-"      <velocity>-5.6e-05 -3.5e-05 0.000636 0.000103 -0.010853 "
-"0.000103</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_wrist_flex_link'>\n"
-"      <pose>0 0 1e-05 0 -1.6e-05 0</pose>\n"
-"      <velocity>-0.000188 -2.1e-05 0.002071 0.000102 -0.016789 "
-"9.5e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_wrist_roll_link'>\n"
-"      <pose>0 0 1e-05 0 4e-06 0</pose>\n"
-"      <velocity>-0.000207 -1.2e-05 0.00189 -6e-06 0.003301 "
-"0.000134</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_l_finger_link'>\n"
-"      <pose>0 0 9e-06 0 4e-06 0</pose>\n"
-"      <velocity>-0.000211 -4e-06 0.001672 0.000112 0.003367 "
-"0.000391</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_l_finger_tip_link'>\n"
-"      <pose>0 0 9e-06 -1e-06 3e-06 1e-06</pose>\n"
-"      <velocity>-0.000205 4e-06 0.001475 -0.000525 0.002883 "
-"0.000777</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_motor_slider_link'>\n"
-"      <pose>0 0 9e-06 0 4e-06 0</pose>\n"
-"      <velocity>-0.000217 2e-06 0.001502 -2.7e-05 0.003252 "
-"0.000126</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_motor_screw_link'>\n"
-"      <pose>0 0 9e-06 0 1e-06 0</pose>\n"
-"      <velocity>-0.000198 3e-06 0.00153 -1.9e-05 0.000446 "
-"0.000102</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_r_finger_link'>\n"
-"      <pose>0 0 9e-06 0 5e-06 0</pose>\n"
-"      <velocity>-0.000195 -5e-06 0.001689 0.000528 0.004075 "
-"0.000231</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_r_finger_tip_link'>\n"
-"      <pose>0 0 9e-06 -0 3e-06 1e-06</pose>\n"
-"      <velocity>-0.000196 -7e-06 0.001461 -0.000277 0.002914 "
-"0.000838</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='laser_tilt_mount_link'>\n"
-"      <pose>0 0 1e-06 0 -3e-06 0</pose>\n"
-"      <velocity>-0.000251 -9.7e-05 -0.00647 0.000167 -0.003028 "
-"-2.6e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_shoulder_pan_link'>\n"
-"      <pose>0 0 1e-06 0 0 0</pose>\n"
-"      <velocity>-0.000131 -4.2e-05 -0.006546 0.000175 -0.000491 "
-"0.000113</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_shoulder_lift_link'>\n"
-"      <pose>0 0 1e-06 0 -1.3e-05 0</pose>\n"
-"      <velocity>0.000247 -4e-05 -0.006179 0.000157 -0.013296 "
-"0.000132</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_upper_arm_roll_link'>\n"
-"      <pose>0 0 1e-06 -1e-05 -1.3e-05 0</pose>\n"
-"      <velocity>-0.000172 -2.8e-05 -0.003538 -0.010076 -0.013338 "
-"9.7e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_elbow_flex_link'>\n"
-"      <pose>0 0 7e-06 -1e-05 -9e-06 -0</pose>\n"
-"      <velocity>-1e-05 -0.000128 -0.001074 -0.01015 -0.009811 "
-"6.8e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_forearm_roll_link'>\n"
-"      <pose>0 0 6e-06 0 -1e-05 0</pose>\n"
-"      <velocity>-7.7e-05 1e-05 0.000654 3.7e-05 -0.010973 "
-"0.000103</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_wrist_flex_link'>\n"
-"      <pose>0 0 1e-05 0 1.1e-05 0</pose>\n"
-"      <velocity>-0.000161 2.1e-05 0.002104 3.6e-05 0.010048 "
-"-1.4e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_wrist_roll_link'>\n"
-"      <pose>0 0 1e-05 0 4e-06 0</pose>\n"
-"      <velocity>-0.000155 2.4e-05 0.001899 -7e-06 0.00391 "
-"1.9e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_l_finger_link'>\n"
-"      <pose>0 0 9e-06 -1e-06 5e-06 0</pose>\n"
-"      <velocity>-0.000157 2.3e-05 0.001601 -0.000388 0.004576 "
-"-1.2e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_l_finger_tip_link'>\n"
-"      <pose>0 0 9e-06 0 5e-06 0</pose>\n"
-"      <velocity>-0.000144 3.2e-05 0.001325 0.00028 0.004739 "
-"4.4e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_motor_slider_link'>\n"
-"      <pose>0 0 9e-06 0 5e-06 0</pose>\n"
-"      <velocity>-0.000146 2.1e-05 0.001405 -2.7e-05 0.004035 "
-"2e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_motor_screw_link'>\n"
-"      <pose>0 0 9e-06 0 1e-06 0</pose>\n"
-"      <velocity>-0.000141 2.2e-05 0.00134 -3e-06 0.000509 "
-"5.5e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_r_finger_link'>\n"
-"      <pose>0 0 9e-06 1e-06 6e-06 0</pose>\n"
-"      <velocity>-0.000144 2.4e-05 0.001637 0.001538 0.005243 "
-"7.6e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_r_finger_tip_link'>\n"
-"      <pose>0 0 9e-06 0 6e-06 0</pose>\n"
-"      <velocity>-0.000142 2.5e-05 0.001314 0.000541 0.005139 "
-"-3e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='torso_lift_motor_screw_link'>\n"
-"      <pose>0 0 -1e-06 -1e-06 0 7.9e-05</pose>\n"
-"      <velocity>-0.000153 -6.4e-05 -0.008583 -0.000379 -0.00048 "
-"0.079281</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_l_parallel_link'>\n"
-"      <pose>0 0 9e-06 -1e-06 5e-06 0</pose>\n"
-"      <velocity>-0.000164 2.8e-05 0.001671 -0.000599 0.004494 "
-"-0.000162</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_r_parallel_link'>\n"
-"      <pose>0 0 9e-06 0 5e-06 0</pose>\n"
-"      <velocity>-0.000143 2e-05 0.00167 0.00048 0.004431 "
-"-3.3e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_l_parallel_link'>\n"
-"      <pose>0 0 9e-06 0 4e-06 1e-06</pose>\n"
-"      <velocity>-0.000211 -7e-06 0.001734 -0.000121 0.003723 "
-"0.0005</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_r_parallel_link'>\n"
-"      <pose>0 0 9e-06 1e-06 5e-06 0</pose>\n"
-"      <velocity>-0.000186 -3e-06 0.001741 0.0007 0.004127 "
-"-0.000169</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <joint name='torso_lift_joint'>\n"
-"      <angle axis='0'>1.41007e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='l_shoulder_lift_joint'>\n"
-"      <angle axis='0'>-1.24472e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='l_upper_arm_roll_joint'>\n"
-"      <angle axis='0'>1.04205e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='l_elbow_flex_joint'>\n"
-"      <angle axis='0'>2.63091e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='l_forearm_roll_joint'>\n"
-"      <angle axis='0'>-1.03937e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='l_wrist_flex_joint'>\n"
-"      <angle axis='0'>-5.93599e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='l_wrist_roll_joint'>\n"
-"      <angle axis='0'>-2.00905e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='l_gripper_motor_screw_joint'>\n"
-"      <angle axis='0'>-2.80641e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='l_gripper_r_finger_tip_joint'>\n"
-"      <angle axis='0'>1.53825e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='laser_tilt_mount_joint'>\n"
-"      <angle axis='0'>-2.47273e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_shoulder_lift_joint'>\n"
-"      <angle axis='0'>-1.28046e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='r_upper_arm_roll_joint'>\n"
-"      <angle axis='0'>-1.0234e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='r_elbow_flex_joint'>\n"
-"      <angle axis='0'>3.52763e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_forearm_roll_joint'>\n"
-"      <angle axis='0'>1.0253e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='r_wrist_flex_joint'>\n"
-"      <angle axis='0'>2.10212e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='r_wrist_roll_joint'>\n"
-"      <angle axis='0'>-6.13793e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_gripper_motor_screw_joint'>\n"
-"      <angle axis='0'>-3.52607e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_gripper_r_finger_joint'>\n"
-"      <angle axis='0'>-2.04123e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_gripper_r_finger_tip_joint'>\n"
-"      <angle axis='0'>-1.00512e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='torso_lift_motor_screw_joint'>\n"
-"      <angle axis='0'>7.9351e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='torso_lift_screw_torso_lift_joint'>\n"
-"      <angle axis='0'>-1.98549e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='l_gripper_r_parallel_root_joint'>\n"
-"      <angle axis='0'>-1.12785e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='l_gripper_r_parallel_tip_joint'>\n"
-"      <angle axis='0'>1.85524e-06</angle>\n"
-"    </joint>\n"
-"  </model>\n"
-"\n"
-"  <model name='pr2'>\n"
-"    <pose>0 0 -1.5e-05 0 -1e-06 0</pose>\n"
-"    <link name='base_footprint'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000116 4.6e-05 -0.007403 0.000204 -0.000505 "
-"-5.5e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='bl_caster_rotation_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000153 6.9e-05 -0.007439 0.000138 -0.000505 "
-"-6e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='bl_caster_l_wheel_link'>\n"
-"      <pose>0 0 0 0 1e-06 0</pose>\n"
-"      <velocity>0.000197 8.3e-05 -0.007405 0.000194 9e-06 "
-"-2e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='bl_caster_r_wheel_link'>\n"
-"      <pose>0 0 0 0 1e-06 0</pose>\n"
-"      <velocity>0.000195 8.1e-05 -0.007462 0.000167 -8e-06 "
-"-1e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='br_caster_rotation_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000126 6.7e-05 -0.007533 0.000261 -0.000482 "
-"-1e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='br_caster_l_wheel_link'>\n"
-"      <pose>0 0 0 0 1e-06 0</pose>\n"
-"      <velocity>0.000165 8.8e-05 -0.007513 0.000227 1.1e-05 "
-"-1.3e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='br_caster_r_wheel_link'>\n"
-"      <pose>0 0 0 0 1e-06 0</pose>\n"
-"      <velocity>0.000166 8.6e-05 -0.007535 0.000192 9e-06 "
-"-8e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fl_caster_rotation_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000156 4.5e-05 -0.007216 0.000239 -0.000482 "
-"-9e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fl_caster_l_wheel_link'>\n"
-"      <pose>0 0 0 0 1e-06 0</pose>\n"
-"      <velocity>0.000196 6e-05 -0.00722 0.000163 8e-06 -7e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fl_caster_r_wheel_link'>\n"
-"      <pose>0 0 0 0 1e-06 0</pose>\n"
-"      <velocity>0.000195 5.5e-05 -0.007239 0.000141 7e-06 "
-"-6e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fr_caster_rotation_link'>\n"
-"      <pose>0 0 0 0 0 0</pose>\n"
-"      <velocity>0.000127 4.7e-05 -0.007314 0.000149 -0.000489 "
-"-9e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fr_caster_l_wheel_link'>\n"
-"      <pose>0 0 0 0 1e-06 0</pose>\n"
-"      <velocity>0.000165 5.7e-05 -0.00729 0.000235 1.1e-05 "
-"-6e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='fr_caster_r_wheel_link'>\n"
-"      <pose>0 0 0 0 1e-06 0</pose>\n"
-"      <velocity>0.000165 5.7e-05 -0.007331 0.000186 9e-06 "
-"-1e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='torso_lift_link'>\n"
-"      <pose>0 0 2e-06 0 0 0</pose>\n"
-"      <velocity>-0.000126 -4.4e-05 -0.00724 0.000118 -0.000415 "
-"-7.5e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='head_pan_link'>\n"
-"      <pose>0 0 2e-06 0 0 0</pose>\n"
-"      <velocity>-0.000412 -0.000157 -0.00723 3.7e-05 -0.00051 "
-"4.8e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='head_tilt_link'>\n"
-"      <pose>0 0 2e-06 0 2e-06 0</pose>\n"
-"      <velocity>-0.000316 -0.000148 -0.007178 5.4e-05 0.000261 "
-"-1.7e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_shoulder_pan_link'>\n"
-"      <pose>0 0 2e-06 0 0 0</pose>\n"
-"      <velocity>-0.000112 -4.9e-05 -0.007149 0.000173 -0.000543 "
-"1.5e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_shoulder_lift_link'>\n"
-"      <pose>0 0 2e-06 0 -2.5e-05 0</pose>\n"
-"      <velocity>0.000195 -5.7e-05 -0.006877 0.000177 -0.01348 "
-"8e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_upper_arm_roll_link'>\n"
-"      <pose>0 0 2e-06 2.3e-05 -2.6e-05 0</pose>\n"
-"      <velocity>-0.000182 -9.5e-05 -0.004053 0.012333 -0.013693 "
-"0.00018</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_elbow_flex_link'>\n"
-"      <pose>0 0 1.2e-05 2.3e-05 -2.3e-05 0</pose>\n"
-"      <velocity>1.5e-05 9e-05 -0.001495 0.012455 -0.013886 "
-"0.00023</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_forearm_roll_link'>\n"
-"      <pose>0 0 1.2e-05 0 -2.4e-05 0</pose>\n"
-"      <velocity>-4.1e-05 -3.6e-05 0.000995 0.000195 -0.013748 "
-"4.9e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_wrist_flex_link'>\n"
-"      <pose>0 0 2e-05 0 2.3e-05 0</pose>\n"
-"      <velocity>-8.6e-05 -3.3e-05 0.003007 0.000194 0.038352 "
-"1.3e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_wrist_roll_link'>\n"
-"      <pose>0 0 2e-05 0 1.8e-05 0</pose>\n"
-"      <velocity>-0.000126 -2.8e-05 0.002169 2e-06 0.014212 "
-"9.8e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_l_finger_link'>\n"
-"      <pose>0 0 1.8e-05 -1e-06 1.9e-05 0</pose>\n"
-"      <velocity>-0.000137 -2.2e-05 0.001392 -0.000618 0.014293 "
-"-0.000139</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_l_finger_tip_link'>\n"
-"      <pose>0 0 1.6e-05 0 1.8e-05 0</pose>\n"
-"      <velocity>-0.000109 -1.3e-05 0.000532 0.000646 0.014604 "
-"-0.000656</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_motor_slider_link'>\n"
-"      <pose>0 0 1.6e-05 0 1.8e-05 0</pose>\n"
-"      <velocity>-9.2e-05 -6e-06 0.000625 4.5e-05 0.014263 "
-"0.00011</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_r_finger_link'>\n"
-"      <pose>0 0 1.8e-05 -1e-06 1.8e-05 -0</pose>\n"
-"      <velocity>-0.000132 -2.4e-05 0.001376 -0.000792 0.01321 "
-"-0.000136</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_r_finger_tip_link'>\n"
-"      <pose>0 0 1.6e-05 0 1.9e-05 0</pose>\n"
-"      <velocity>-0.000111 -6e-06 0.00056 0.000694 0.015 "
-"-0.000728</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='laser_tilt_mount_link'>\n"
-"      <pose>0 0 2e-06 0 -5e-06 0</pose>\n"
-"      <velocity>-0.000297 -0.000116 -0.007252 0.000219 -0.002617 "
-"-7.9e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_shoulder_pan_link'>\n"
-"      <pose>0 0 2e-06 0 0 0</pose>\n"
-"      <velocity>-0.000142 -4.5e-05 -0.007275 0.000228 -0.00059 "
-"9.7e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_shoulder_lift_link'>\n"
-"      <pose>0 0 2e-06 0 -2.6e-05 0</pose>\n"
-"      <velocity>0.000168 -5.5e-05 -0.006943 1e-05 -0.013582 "
-"2.8e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_upper_arm_roll_link'>\n"
-"      <pose>0 0 2e-06 -2.2e-05 -2.6e-05 0</pose>\n"
-"      <velocity>-0.000213 1.2e-05 -0.004147 -0.01202 "
-"-0.01348 -2e-06</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_elbow_flex_link'>\n"
-"      <pose>0 0 1.2e-05 -2.3e-05 -2.1e-05 0</pose>\n"
-"      <velocity>-8.9e-05 -0.000137 -0.001615 -0.012091 "
-"-0.012612 1.5e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_forearm_roll_link'>\n"
-"      <pose>0 0 1.2e-05 0 -2.3e-05 0</pose>\n"
-"      <velocity>-6.9e-05 1.5e-05 0.000538 -3.3e-05 -0.01299 "
-"7.8e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_wrist_flex_link'>\n"
-"      <pose>0 0 1.9e-05 0 -3.7e-05 0</pose>\n"
-"      <velocity>-0.000213 2.9e-05 0.002283 -3.4e-05 -0.048363 "
-"0.000245</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_wrist_roll_link'>\n"
-"      <pose>0 0 1.9e-05 0 1e-06 0</pose>\n"
-"      <velocity>-0.000241 3.3e-05 0.002408 -3.3e-05 -0.004285 "
-"0.000125</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_l_finger_link'>\n"
-"      <pose>0 0 1.9e-05 0 2e-06 1e-06</pose>\n"
-"      <velocity>-0.00024 4.2e-05 0.002724 0.000605 -0.00393 "
-"0.000412</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_l_finger_tip_link'>\n"
-"      <pose>0 0 1.9e-05 0 3e-06 0</pose>\n"
-"      <velocity>-0.000248 2.9e-05 0.00298 -7.1e-05 -0.003186 "
-"6.7e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_motor_slider_link'>\n"
-"      <pose>0 0 1.9e-05 0 1e-06 0</pose>\n"
-"      <velocity>-0.000244 5.5e-05 0.002912 -5e-06 -0.003571 "
-"0.000126</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_motor_screw_link'>\n"
-"      <pose>0 0 1.9e-05 0 2e-06 0</pose>\n"
-"      <velocity>-0.000238 4.6e-05 0.002944 -4.3e-05 0.000804 "
-"0.000132</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_r_finger_link'>\n"
-"      <pose>0 0 1.9e-05 0 2e-06 0</pose>\n"
-"      <velocity>-0.000247 3.7e-05 0.002672 -0.000894 -0.004483 "
-"-0.000188</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_r_finger_tip_link'>\n"
-"      <pose>0 0 1.9e-05 -2e-06 2e-06 -0</pose>\n"
-"      <velocity>-0.000249 3e-05 0.002969 -0.001725 -0.004043 "
-"0.000137</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='torso_lift_motor_screw_link'>\n"
-"      <pose>0 0 -1e-06 0 0 0.000183</pose>\n"
-"      <velocity>-0.000151 -1.3e-05 -0.007513 0.000745 -0.000663 "
-"0.103921</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_l_parallel_link'>\n"
-"      <pose>0 0 1.9e-05 0 1e-06 0</pose>\n"
-"      <velocity>-0.000238 3.1e-05 0.002651 0.000555 -0.004326 "
-"2.8e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='r_gripper_r_parallel_link'>\n"
-"      <pose>0 0 1.9e-05 -1e-06 1e-06 0</pose>\n"
-"      <velocity>-0.000242 4e-05 0.002661 -0.001241 -0.004413 "
-"-7.8e-05</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_l_parallel_link'>\n"
-"      <pose>0 0 1.8e-05 -1e-06 1.8e-05 -0</pose>\n"
-"      <velocity>-0.000146 -2.1e-05 0.001652 -0.000197 0.013567 "
-"-0.000258</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <link name='l_gripper_r_parallel_link'>\n"
-"      <pose>0 0 1.8e-05 -1e-06 1.9e-05 0</pose>\n"
-"      <velocity>-0.000135 -2.9e-05 0.001649 -0.000872 0.013488 "
-"0.000434</velocity>\n"
-"      <acceleration>0 0 0 0 0 0</acceleration>\n"
-"      <wrench>0 0 0 0 0 0</wrench>\n"
-"    </link>\n"
-"    <joint name='bl_caster_l_wheel_joint'>\n"
-"      <angle axis='0'>1.01079e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='br_caster_l_wheel_joint'>\n"
-"      <angle axis='0'>1.00809e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='br_caster_r_wheel_joint'>\n"
-"      <angle axis='0'>1.00718e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='fr_caster_l_wheel_joint'>\n"
-"      <angle axis='0'>1.01174e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='fr_caster_r_wheel_joint'>\n"
-"      <angle axis='0'>1.0102e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='torso_lift_joint'>\n"
-"      <angle axis='0'>1.61697e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='head_tilt_joint'>\n"
-"      <angle axis='0'>1.59176e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='l_shoulder_lift_joint'>\n"
-"      <angle axis='0'>-2.5384e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='l_upper_arm_roll_joint'>\n"
-"      <angle axis='0'>2.25789e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='l_elbow_flex_joint'>\n"
-"      <angle axis='0'>2.4368e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='l_forearm_roll_joint'>\n"
-"      <angle axis='0'>-2.26431e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='l_wrist_flex_joint'>\n"
-"      <angle axis='0'>4.61642e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='l_wrist_roll_joint'>\n"
-"      <angle axis='0'>4.04443e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='l_gripper_motor_screw_joint'>\n"
-"      <angle axis='0'>-1.66172e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='l_gripper_r_finger_joint'>\n"
-"      <angle axis='0'>1.55625e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='laser_tilt_mount_joint'>\n"
-"      <angle axis='0'>-4.67204e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_shoulder_lift_joint'>\n"
-"      <angle axis='0'>-2.57981e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='r_upper_arm_roll_joint'>\n"
-"      <angle axis='0'>-2.22655e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='r_elbow_flex_joint'>\n"
-"      <angle axis='0'>4.39678e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_forearm_roll_joint'>\n"
-"      <angle axis='0'>2.22922e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='r_wrist_flex_joint'>\n"
-"      <angle axis='0'>-1.43521e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='r_wrist_roll_joint'>\n"
-"      <angle axis='0'>-2.56647e-05</angle>\n"
-"    </joint>\n"
-"    <joint name='r_gripper_l_finger_joint'>\n"
-"      <angle axis='0'>2.47396e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_gripper_l_finger_tip_joint'>\n"
-"      <angle axis='0'>1.96603e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_gripper_r_finger_joint'>\n"
-"      <angle axis='0'>5.37142e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_gripper_r_finger_tip_joint'>\n"
-"      <angle axis='0'>3.84165e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='torso_lift_motor_screw_joint'>\n"
-"      <angle axis='0'>0.000183324</angle>\n"
-"    </joint>\n"
-"    <joint name='torso_lift_screw_torso_lift_joint'>\n"
-"      <angle axis='0'>-2.25856e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_gripper_r_parallel_tip_joint'>\n"
-"      <angle axis='0'>1.13052e-06</angle>\n"
-"    </joint>\n"
-"    <joint name='r_gripper_l_parallel_tip_joint'>\n"
-"      <angle axis='0'>1.09768e-06</angle>\n"
-"    </joint>\n"
-"  </model>";
-
-
-std::string custom_exec(std::string _cmd)
-{
-  _cmd += " 2>/dev/null";
-  FILE* pipe = popen(_cmd.c_str(), "r");
-
-  if (!pipe)
-    return "ERROR";
-
-  char buffer[128];
-  std::string result = "";
-
-  while (!feof(pipe))
-  {
-    if (fgets(buffer, 128, pipe) != NULL)
-      result += buffer;
-  }
-
-  pclose(pipe);
-  return result;
-}
-
-/////////////////////////////////////////////////
-/// Check to make sure that 'gzlog info' returns correct information
-TEST(gz_log, Info)
-{
-  std::string info = custom_exec(std::string("gzlog info ") +
-      PROJECT_SOURCE_PATH + "/tools/test/data/pr2_state.log");
-  boost::trim_right(info);
-
-  std::string validInfo =
-    "Log Version:    1.0\n"
-    "Gazebo Version: 1.4.6\n"
-    "Random Seed:    32606\n"
-    "Start:          Feb 08 13 05:35:55.667456998\n"
-    "End:            Feb 08 13 05:35:58.947304437\n"
-    "Duration:       00:00:03.279847439\n"
-    "Steps:          3\n"
-    "Size:           12.377 KB\n"
-    "Encoding:       bz2\n"
-    "Model Count:    2";
-
-  EXPECT_EQ(validInfo, info);
-}
-
-/////////////////////////////////////////////////
-/// Check to make sure that 'gzlog echo' returns correct information
-TEST(gz_log, Echo)
-{
-  std::string echo = custom_exec(std::string("gzlog echo ") +
-      PROJECT_SOURCE_PATH + "/tools/test/data/empty_state.log");
-  boost::trim_right(echo);
-
-  std::string validEcho =
-    "<sdf version ='1.3'>\n"
-    "<world name='default'>\n"
-    "  <light name='sun' type='directional'>\n"
-    "    <cast_shadows>1</cast_shadows>\n"
-    "    <pose>0.000000 0.000000 10.000000 0.000000 0.000000 0.000000</pose>\n"
-    "    <diffuse>0.800000 0.800000 0.800000 1.000000</diffuse>\n"
-    "    <specular>0.100000 0.100000 0.100000 1.000000</specular>\n"
-    "    <attenuation>\n"
-    "      <range>1000.000000</range>\n"
-    "      <constant>0.900000</constant>\n"
-    "      <linear>0.010000</linear>\n"
-    "      <quadratic>0.001000</quadratic>\n"
-    "    </attenuation>\n"
-    "    <direction>-0.500000 0.500000 -1.000000</direction>\n"
-    "  </light>\n"
-    "  <model name='ground_plane'>\n"
-    "    <static>1</static>\n"
-    "    <link name='link'>\n"
-    "      <collision name='collision'>\n"
-    "        <geometry>\n"
-    "          <plane>\n"
-    "            <normal>0.000000 0.000000 1.000000</normal>\n"
-    "            <size>100.000000 100.000000</size>\n"
-    "          </plane>\n"
-    "        </geometry>\n"
-    "        <surface>\n"
-    "          <friction>\n"
-    "            <ode>\n"
-    "              <mu>100.000000</mu>\n"
-    "              <mu2>50.000000</mu2>\n"
-    "            </ode>\n"
-    "          </friction>\n"
-    "          <bounce/>\n"
-    "          <contact>\n"
-    "            <ode/>\n"
-    "          </contact>\n"
-    "        </surface>\n"
-    "      </collision>\n"
-    "      <visual name='visual'>\n"
-    "        <cast_shadows>0</cast_shadows>\n"
-    "        <geometry>\n"
-    "          <plane>\n"
-    "            <normal>0.000000 0.000000 1.000000</normal>\n"
-    "            <size>100.000000 100.000000</size>\n"
-    "          </plane>\n"
-    "        </geometry>\n"
-    "        <material>\n"
-    "          <script>\n"
-    "            <uri>file://media/materials/scripts/gazebo.material</uri>\n"
-    "            <name>Gazebo/Grey</name>\n"
-    "          </script>\n"
-    "        </material>\n"
-    "      </visual>\n"
-    "      <velocity_decay>\n"
-    "        <linear>0.000000</linear>\n"
-    "        <angular>0.000000</angular>\n"
-    "      </velocity_decay>\n"
-    "      <self_collide>0</self_collide>\n"
-    "      <kinematic>0</kinematic>\n"
-    "      <gravity>1</gravity>\n"
-    "    </link>\n"
-    "  </model>\n"
-    "  <physics type='ode'>\n"
-    "    <update_rate>1000.000000</update_rate>\n"
-    "    <gravity>0.000000 0.000000 -9.800000</gravity>\n"
-    "  </physics>\n"
-    "  <scene>\n"
-    "    <ambient>0.200000 0.200000 0.200000 1.000000</ambient>\n"
-    "    <background>0.700000 0.700000 0.700000 1.000000</background>\n"
-    "    <shadows>1</shadows>\n"
-    "  </scene>\n"
-    "  <state world_name='default'>\n"
-    "    <sim_time>0 0</sim_time>\n"
-    "    <real_time>0 0</real_time>\n"
-    "    <wall_time>1360300141 918692496</wall_time>\n"
-    "  </state>\n"
-    "</world>\n"
-    "</sdf>";
-
-  EXPECT_EQ(validEcho, echo);
-}
-
-/////////////////////////////////////////////////
-/// Check to make sure that 'gzlog echo --filter' returns correct information
-TEST(gz_log, EchoFilter)
-{
-  // Test model filter
-  std::string echo = custom_exec(
-      std::string("gzlog echo --filter pr2 ") +
-      PROJECT_SOURCE_PATH + "/tools/test/data/pr2_state.log");
-  boost::trim_right(echo);
-
-  EXPECT_EQ(pr2StateLog, echo);
-
-  // Test joint filter with angle
-  echo = custom_exec(
-      std::string("gzlog echo --filter pr2::r_upper_arm_roll_joint::0 ") +
-      PROJECT_SOURCE_PATH + "/tools/test/data/pr2_state.log");
-  boost::trim_right(echo);
-
-  std::string validEcho =
-    "-1.0234e-05\n"
-    "-2.22655e-05";
-
-  EXPECT_EQ(validEcho, echo);
-}
-
-/////////////////////////////////////////////////
-/// Main
-int main(int argc, char **argv)
-{
-  ::testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/tools/website/backup.rb b/tools/website/backup.rb
new file mode 100755
index 0000000..5d4047f
--- /dev/null
+++ b/tools/website/backup.rb
@@ -0,0 +1,85 @@
+#!/usr/bin/env ruby
+
+# Copyright (C) 2012-2014 Open Source Robotics Foundation
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Description:
+# This script removes old snapshots of the gazebosim.org server, and creates
+# a new snapshot if the most recent snapshot is older than 1 day. Snapshots
+# are removed if they are older than one week.
+#
+# A cronjob runs on gazebosim.org that assumes this file is located in /home/ubuntu/bin/
+
+require 'rubygems'
+require 'net/http'
+require 'net/ssh'
+require 'aws-sdk'
+
+if ARGV.size < 2
+  puts "backup.rb <access_key> <secret_key>"
+  abort("")
+end
+
+# Two weeks in seconds
+two_weeks = 2*7*24*60*60
+
+# One day in seconds
+one_day = 24*60*60
+
+# Timestamp of the last snapshot
+last_snapshot = 0
+
+AWS.config(
+  :access_key_id => ARGV[0],
+  :secret_access_key => ARGV[1])
+
+ec2 = AWS::EC2.new
+
+# Find old gazebo sim snapshots
+ec2.snapshots.filter("tag:Name","gazebosim.org").each {|snapshot|
+
+  # Only consider snapshot with Name == gazebosim.org
+  if snapshot.tags["Name"] == "gazebosim.org"
+
+    # Only delete a snap shot if it's older than two weeks.
+    if Time.now.to_i - snapshot.tags["Time"].to_i > two_weeks
+      puts "Deleting snapshot with id #{snapshot.id}"
+      snapshot.delete
+    else
+      # Store the timestamp of the most recent snapshot
+      last_snapshot = [last_snapshot, snapshot.tags["Time"].to_i].max
+    end
+  end
+}
+
+# Create a new snapshot if the most recent snapshot is older than one day.
+if Time.now.to_i - last_snapshot >= one_day
+  # Find the gazebosim volume
+  ec2.volumes.each {|volume|
+    # Only consider volumes that are in use
+    if volume.status == :in_use
+      volume.attachments.each {|attachment| 
+
+        # Check for the gazebosim.org name
+        if attachment.status == :attached &&
+          attachment.instance.tags["Name"] == "gazebosim.org"
+  
+          # Create a snapshot
+          puts "Creating snapshot of gazebosim volume id #{volume.id}"
+          snapshot = volume.create_snapshot("gazebosim_#{Time.now.to_i}")
+          snapshot.tags.Name = "gazebosim.org"
+          snapshot.add_tag("Time", :value => "#{Time.now.to_i}")
+        end
+      }
+    end
+  }
+end
diff --git a/tools/website/gazebo_install.run b/tools/website/gazebo_install.run
new file mode 100755
index 0000000..b98ca01
--- /dev/null
+++ b/tools/website/gazebo_install.run
@@ -0,0 +1,66 @@
+#!/bin/bash
+
+# Copyright (C) 2012-2014 Open Source Robotics Foundation
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Description:
+# This script installs gazebo onto an Ubuntu system.
+
+codename=`lsb_release -sc`
+
+# Make sure we are running a valid Ubuntu distribution
+case $codename in
+  "precise" | "quantal" | "raring" | "saucy")
+  ;;
+  *)
+    echo "This script will only work on Ubuntu precise, quantal, raring, or saucy."
+    exit 0
+esac
+
+# Add the OSRF repository
+sudo sh -c "echo \"deb http://packages.osrfoundation.org/gazebo/ubuntu ${codename} main\" > /etc/apt/sources.list.d/gazebo_install-latest.list"
+
+# Download the OSRF keys
+has_key=`apt-key list | grep "OSRF deb-builder"`
+
+echo "Downloading keys"
+if [ -z "$has_key" ]; then
+  wget --quiet http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
+fi
+
+# Update apt
+echo "Retrieving packages"
+sudo apt-get update -qq
+echo "OK"
+
+# Install gazebo
+echo "Installing Gazebo"
+sudo apt-get install gazebo-current
+
+###
+# Cleanup
+###
+
+# Remove the apt-repository
+sudo rm /etc/apt/sources.list.d/gazebo_install-latest.list
+
+# Remove the key, if it was added.
+if [ -z "$has_key" ]; then
+  key=`apt-key list | grep -EB1 OSRF | grep pub | cut -d " " -f 4 | cut -d "/" -f 2`
+  sudo apt-key del $key 1>/dev/null
+fi
+
+# Update apt
+sudo apt-get update 1>/dev/null
+
+echo "Complete."
+echo "Type gazebo to start the simulator."
diff --git a/worlds/CMakeLists.txt b/worlds/CMakeLists.txt
new file mode 100644
index 0000000..c247263
--- /dev/null
+++ b/worlds/CMakeLists.txt
@@ -0,0 +1,53 @@
+set (files
+  blank.world
+  camera.world
+  cart_demo.world
+  contact.world
+  depth_camera.world
+  empty_1_0.world
+  empty_bullet.world
+  empty_sky.world
+  empty.world
+  everything.world
+  force_torque_demo.world
+  friction_demo.world
+  gripper.world
+  heightmap_dem.world
+  heightmap.world
+  joint_damping_demo.world
+  joints.world
+  lights.world
+  mud_bitmask.world
+  mud.world
+  multilink_shape.world
+  openal.world
+  pioneer2dx.world
+  plane_demo.world
+  plugin.world
+  pr2.world
+  presentation.world
+  pressure_sensor.world
+  projector.world
+  quad_rotor_demo.world
+  quad_rotor_demo_2.world
+  ray_cpu.world
+  ray_noise_plugin.world
+  road.world
+  robocup09_spl_field.world
+  robocup14_spl_field.world
+  robocup_3Dsim.world
+  rubble.world
+  shapes.world
+  simple_arm.world
+  simple_gripper.world
+  single_rotor_demo.world
+  sonar_demo.world
+  sphere_atlas_demo.world
+  stacks.world
+  trigger.world
+  twin_rotor_demo.world
+  willowgarage.world
+  wireless_sensors.world
+)
+
+install(FILES ${files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/gazebo-${GAZEBO_VERSION}/worlds/)
diff --git a/worlds/blank.world b/worlds/blank.world
new file mode 100644
index 0000000..fa36358
--- /dev/null
+++ b/worlds/blank.world
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <scene>
+      <ambient>0.2 0.2 0.2 1</ambient>
+      <background>1 1 1 1</background>
+      <shadows>false</shadows>
+      <grid>false</grid>
+    </scene>
+  </world>
+</sdf>
diff --git a/worlds/camera.world b/worlds/camera.world
new file mode 100644
index 0000000..ee28b79
--- /dev/null
+++ b/worlds/camera.world
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://camera</uri>
+    </include>
+    <include>
+      <uri>model://camera</uri>
+      <pose>2 0 0 0 0 0</pose>
+      <name>camera 2</name>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/cart_demo.world b/worlds/cart_demo.world
new file mode 100644
index 0000000..531daaa
--- /dev/null
+++ b/worlds/cart_demo.world
@@ -0,0 +1,661 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0 0 -10.0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>10</iters>
+          <sor>1.3</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>100.0</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- 25.3kg total mass -->
+    <model name="test_model">
+      <pose>0 0 0.7 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0 0 -0.55 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 0.1</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>100</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <pose>0 0 -0.55 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 0.1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+        <collision name="collision2">
+          <pose>0 0 0 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.5 0.5 0.5</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>100</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual2">
+          <pose>0 0 0 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.5 0.5 0.5</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <link name="bar_1">
+        <pose>0.45 0 -0.5 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>0.001</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.001</iyy>
+            <iyz>0</iyz>
+            <izz>0.001</izz>
+          </inertia>
+          <mass>0.1</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 1.0 0.02</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>100</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 1.0 0.02</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint name="bar_12_joint" type="revolute">
+        <parent>bar_2</parent>
+        <child>bar_1</child>
+        <pose>0 0.5 0 0 0 0</pose>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="bar_13_joint" type="revolute">
+        <parent>bar_3</parent>
+        <child>bar_1</child>
+        <pose>0 -0.5 0 0 0 0</pose>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <link name="bar_2">
+        <pose>0.5 0.5 -0.5 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>0.001</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.001</iyy>
+            <iyz>0</iyz>
+            <izz>0.001</izz>
+          </inertia>
+          <mass>0.1</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>-0.025 0 0 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.02 0.02</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>100</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <pose>-0.025 0 0 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.02 0.02</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint name="bar_2_joint" type="revolute">
+        <parent>link</parent>
+        <child>bar_2</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <link name="bar_3">
+        <pose>0.5 -0.5 -0.5 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>0.001</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.001</iyy>
+            <iyz>0</iyz>
+            <izz>0.001</izz>
+          </inertia>
+          <mass>0.1</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>-0.025 0 0 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.02 0.02</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>100</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <pose>-0.025 0 0 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.02 0.02</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint name="bar_3_joint" type="revolute">
+        <parent>link</parent>
+        <child>bar_3</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <link name="wheel_1">
+        <pose>0.5 0.55 -0.5 1.57079633 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.2</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <fdir1>1 0 0</fdir1>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>100</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.2</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint name="wheel_1_joint" type="revolute">
+        <parent>bar_2</parent>
+        <child>wheel_1</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <link name="wheel_2">
+        <pose>0.5 -0.55 -0.5 1.57079633 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.2</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <fdir1>1 0 0</fdir1>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>100</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.2</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint name="wheel_2_joint" type="revolute">
+        <parent>bar_3</parent>
+        <child>wheel_2</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <link name="wheel_3">
+        <pose>-0.5 0.55 -0.5 1.57079633 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.2</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <fdir1>1 0 0</fdir1>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>100</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.2</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint name="wheel_3_joint" type="revolute">
+        <parent>link</parent>
+        <child>wheel_3</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <dynamics>
+            <damping>0.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <xyz>0 1 0</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <link name="wheel_4">
+        <pose>-0.5 -0.55 -0.5 1.57079633 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>0.01</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.01</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.2</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <fdir1>1 0 0</fdir1>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>100</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.2</radius>
+              <length>0.1</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint name="wheel_4_joint" type="revolute">
+        <parent>link</parent>
+        <child>wheel_4</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <dynamics>
+            <damping>0.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <xyz>0 1 0</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <link name="sphere_link">
+        <pose>0 0 0.5 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>0.1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.1</iyy>
+            <iyz>0</iyz>
+            <izz>0.1</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.25</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <fdir1>1 0 0</fdir1>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>10</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.25</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint name="joint_sphere" type="revolute">
+        <parent>link</parent>
+        <child>sphere_link</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <link name="cylinder_link">
+        <pose>0 0 0.25 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>0.1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.1</iyy>
+            <iyz>0</iyz>
+            <izz>0.1</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.25</radius>
+              <length>0.5</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+            <contact>
+              <ode>
+                <max_vel>10</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.25</radius>
+              <length>0.5</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint name="joint_cylinder" type="revolute">
+        <parent>sphere_link</parent>
+        <child>cylinder_link</child>
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <plugin name="cart_test_plugin" filename="libCartDemoPlugin.so">
+        <steer>bar_2_joint</steer>
+        <steer_pid>10 0.1 0.5</steer_pid>
+        <steer_ilim>-10 10</steer_ilim>
+        <steer_pos>0.0</steer_pos>
+        <!-- steer -->
+        <steer_vel>0</steer_vel>
+        <!-- not used -->
+        <steer_eff>100.0</steer_eff>
+        <!-- max pos pid effort -->
+        <right>wheel_3_joint</right>
+        <right_pid>0.1 0.0 0.001</right_pid>
+        <right_ilim>-.1 .1</right_ilim>
+        <right_pos>0</right_pos>
+        <!-- final position pid -->
+        <right_vel>0</right_vel>
+        <!-- final velocity pid -->
+        <right_eff>0.1</right_eff>
+        <!-- drive torque -->
+        <left>wheel_4_joint</left>
+        <left_pid>0.1 0.0 0.001</left_pid>
+        <left_ilim>-.1 .1</left_ilim>
+        <left_pos>0</left_pos>
+        <!-- final position pid -->
+        <left_vel>0</left_vel>
+        <!-- final velocity pid -->
+        <left_eff>0.1</left_eff>
+        <!-- drive torque -->
+      </plugin>
+    </model>
+    <light type="directional" name="sun">
+      <pose>0 0 10 0 0 0</pose>
+      <diffuse>.8 .8 .8 1</diffuse>
+      <specular>.1 .1 .1 1</specular>
+      <attenuation>
+        <range>10</range>
+        <linear>0.01</linear>
+        <constant>0.8</constant>
+        <quadratic>0.0</quadratic>
+      </attenuation>
+      <direction>0 .5 -.5</direction>
+      <cast_shadows>true</cast_shadows>
+    </light>
+  </world>
+</sdf>
diff --git a/worlds/contact.world b/worlds/contact.world
new file mode 100644
index 0000000..0f3d1ee
--- /dev/null
+++ b/worlds/contact.world
@@ -0,0 +1,36 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="box">
+      <link name="link">
+        <pose>0 0 0.5 0 0 0</pose>
+        <collision name="box_collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+        <sensor name="my_contact" type="contact">
+          <contact>
+            <collision>box_collision</collision>
+          </contact>
+          <plugin name="my_plugin" filename="libContactPlugin.so" />
+        </sensor>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/deprecated_worlds/actor.world b/worlds/deprecated_worlds/actor.world
new file mode 100644
index 0000000..a56a730
--- /dev/null
+++ b/worlds/deprecated_worlds/actor.world
@@ -0,0 +1,25 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <light type="directional" name="sun">
+      <pose>0 0 100 0 0 0</pose>
+      <diffuse>0.5 0.5 0.5 1</diffuse>
+      <specular>0.2 0.2 0.2 1</specular>
+      <attenuation>
+        <range>100</range>
+        <linear>0.01</linear>
+        <constant>0.8</constant>
+        <quadratic>0.0</quadratic>
+      </attenuation>
+      <direction>0.0 0.2 -8.0</direction>
+      <cast_shadows>true</cast_shadows>
+    </light>
+    <actor name="actor">
+      <static>true</static>
+      <skin filename="walk.dae" scale="1.0" />
+    </actor>
+  </world>
+</sdf>
diff --git a/worlds/deprecated_worlds/actor_circle.world b/worlds/deprecated_worlds/actor_circle.world
new file mode 100644
index 0000000..829b7a4
--- /dev/null
+++ b/worlds/deprecated_worlds/actor_circle.world
@@ -0,0 +1,83 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <model name="plane1_model" static="1">
+      <link name="body" gravity="1" self_collide="0" kinematic="0">
+        <collision name="geom" laser_retro="0.000000">
+          <geometry>
+            <plane>
+              <normal>0.000000 0.000000 1.000000</normal>
+              <size>100.000000 100.000000</size>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode mu="100.000000" mu2="50.000000" fdir1="0.000000 0.000000 0.000000" slip1="0.000000" slip2="0.000000" />
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual" cast_shadows="0" laser_retro="0.000000" transparency="0.000000">
+          <geometry>
+            <plane>
+              <normal>0.000000 0.000000 1.000000</normal>
+              <size>100.000000 100.000000</size>
+            </plane>
+          </geometry>
+          <material script="Gazebo/Grey" />
+        </visual>
+        <damping />
+      </link>
+    </model>
+    <light name="sun" type="directional" cast_shadows="1">
+      <pose>0.000000 0.000000 100.000000 0.000000 -0.000000 0.000000</pose>
+      <diffuse>0.500000 0.500000 0.500000 1.000000</diffuse>
+      <specular>0.200000 0.200000 0.200000 1.000000</specular>
+      <attenuation range="100.000000" linear="0.010000" constant="0.800000" quadratic="0.000000" />
+      <direction xyz="0.000000 0.200000 -8.000000" />
+    </light>
+    <actor name="actor1" static="1">
+      <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+      <skin filename="sub_16.dae" scale="1.000000" />
+      <animation name="walking" filename="walk.dae" scale="1.000000" interpolate_x="1" />
+      <script loop="1" delay_start="0.000000" auto_start="1">
+        <trajectory id="0" type="walking">
+          <waypoint time="0.000000" pose="0.000000 1.000000 0.000000 0.000000 -0.000000 0.000000" />
+          <waypoint time="0.500000" pose="0.195090 0.980785 0.000000 0.000000 0.000000 -0.196350" />
+          <waypoint time="1.000000" pose="0.382683 0.923880 0.000000 0.000000 0.000000 -0.392699" />
+          <waypoint time="1.500000" pose="0.555570 0.831470 0.000000 0.000000 0.000000 -0.589049" />
+          <waypoint time="2.000000" pose="0.707107 0.707107 0.000000 0.000000 -0.000000 -0.785398" />
+          <waypoint time="2.500000" pose="0.831470 0.555570 0.000000 0.000000 0.000000 -0.981748" />
+          <waypoint time="3.000000" pose="0.923880 0.382683 0.000000 0.000000 0.000000 -1.178100" />
+          <waypoint time="3.500000" pose="0.980785 0.195090 0.000000 0.000000 0.000000 -1.374450" />
+          <waypoint time="4.000000" pose="1.000000 0.000000 0.000000 0.000000 0.000000 -1.570800" />
+          <waypoint time="4.500000" pose="0.980785 -0.195090 0.000000 0.000000 0.000000 -1.767150" />
+          <waypoint time="5.000000" pose="0.923880 -0.382683 0.000000 0.000000 0.000000 -1.963500" />
+          <waypoint time="5.500000" pose="0.831470 -0.555570 0.000000 0.000000 0.000000 -2.159840" />
+          <waypoint time="6.000000" pose="0.707107 -0.707107 0.000000 0.000000 0.000000 -2.356190" />
+          <waypoint time="6.500000" pose="0.555570 -0.831470 0.000000 0.000000 0.000000 -2.552540" />
+          <waypoint time="7.500000" pose="0.382683 -0.923880 0.000000 0.000000 0.000000 -2.748890" />
+          <waypoint time="8.500000" pose="0.195090 -0.980785 0.000000 0.000000 0.000000 -2.945240" />
+          <waypoint time="9.500000" pose="0.000000 -1.000000 0.000000 0.000000 0.000000 -3.141590" />
+          <waypoint time="10.500000" pose="-0.195090 -0.980785 0.000000 0.000000 0.000000 2.945245" />
+          <waypoint time="11.500000" pose="-0.382683 -0.923880 0.000000 0.000000 0.000000 2.748895" />
+          <waypoint time="12.000000" pose="-0.555570 -0.831470 0.000000 0.000000 0.000000 2.552545" />
+          <waypoint time="12.500000" pose="-0.707107 -0.707107 0.000000 0.000000 0.000000 2.356195" />
+          <waypoint time="13.000000" pose="-0.831470 -0.555570 0.000000 0.000000 0.000000 2.159845" />
+          <waypoint time="13.500000" pose="-0.923880 -0.382683 0.000000 0.000000 0.000000 1.963495" />
+          <waypoint time="14.000000" pose="-0.980785 -0.195090 0.000000 0.000000 0.000000 1.767145" />
+          <waypoint time="14.500000" pose="-1.000000 0.000000 0.000000 0.000000 0.000000 1.570795" />
+          <waypoint time="15.000000" pose="-0.980785 0.195090 0.000000 0.000000 0.000000 1.374445" />
+          <waypoint time="15.500000" pose="-0.923880 0.382683 0.000000 0.000000 0.000000 1.178095" />
+          <waypoint time="16.000000" pose="-0.831470 0.555570 0.000000 0.000000 0.000000 0.981745" />
+          <waypoint time="16.500000" pose="-0.707107 0.707107 0.000000 0.000000 0.000000 0.785395" />
+          <waypoint time="17.000000" pose="-0.555570 0.831470 0.000000 0.000000 0.000000 0.589045" />
+          <waypoint time="17.500000" pose="-0.382683 0.923880 0.000000 0.000000 0.000000 0.392695" />
+          <waypoint time="18.000000" pose="-0.195090 0.980785 0.000000 0.000000 0.000000 0.196345" />
+        </trajectory>
+      </script>
+      <link name="__default__" gravity="1" self_collide="0" kinematic="0" />
+    </actor>
+    <physics type="ode" update_rate="0.000000" />
+    <scene />
+  </world>
+</sdf>
diff --git a/worlds/deprecated_worlds/actor_demo.world b/worlds/deprecated_worlds/actor_demo.world
new file mode 100644
index 0000000..2c146c0
--- /dev/null
+++ b/worlds/deprecated_worlds/actor_demo.world
@@ -0,0 +1,74 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="cube">
+      <pose>-0.4 0 0.275 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <mass>1</mass>
+          <geometry>
+            <box>
+              <size>0.45 0.5 0.45</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.45 0.5 0.45</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <actor name="actor1" static="true">
+      <origin pose="0 0 0 0 0 0" />
+      <skin filename="walk.dae" scale="1.0" />
+      <!-- resource files -->
+      <animation name="sit_down" filename="sit_down.dae" scale="1.0" />
+      <animation name="sitting" filename="sitting.dae" scale="1.0" />
+      <animation name="stand_up" filename="stand_up.dae" scale="1.0" />
+      <animation name="stand" filename="stand.dae" scale="1.0" />
+      <animation name="walking" filename="walk.dae" scale="1.0" interpolate_x="true" />
+      <animation name="running" filename="run.dae" scale="1.0" interpolate_x="true" />
+      <animation name="moonwalking" filename="moonwalk.dae" scale="1.0" interpolate_x="true" />
+      <script loop="true" delay_start="0.0" auto_start="true">
+        <!--stand at origin for 10 seconds -->
+        <trajectory id="0" type="stand">
+          <waypoint time="0.0" pose="0 0 0 0 0 0" />
+          <waypoint time="10.0" pose="0 0 0 0 0 0" />
+        </trajectory>
+        <!--sit down-->
+        <trajectory id="1" type="sit_down" />
+        <!--sit-->
+        <trajectory id="2" type="sitting" />
+        <!--stand up-->
+        <trajectory id="3" type="stand_up" />
+        <!--walk 5 meters forward in 10 seconds-->
+        <trajectory id="4" type="walking">
+          <waypoint time="0.0" pose="0 0 0 0 0 0" />
+          <waypoint time="10.0" pose="5 0 0 0 0 0" />
+        </trajectory>
+        <!--run 5 meters forward in 5 seconds-->
+        <trajectory id="5" type="running">
+          <waypoint time="0.0" pose="5 0 0 0 0 0" />
+          <waypoint time="5.0" pose="10 0 0 0 0 0" />
+        </trajectory>
+        <!--moonwalk bak to origin in 20 seconds-->
+        <trajectory id="6" type="moonwalking">
+          <waypoint time="0.0" pose="10 0 0 0 0 3.14159" />
+          <waypoint time="20.0" pose="0 0 0 0 0 3.14159" />
+        </trajectory>
+      </script>
+    </actor>
+  </world>
+</sdf>
diff --git a/worlds/deprecated_worlds/double_pendulums.world b/worlds/deprecated_worlds/double_pendulums.world
new file mode 100644
index 0000000..da9a650
--- /dev/null
+++ b/worlds/deprecated_worlds/double_pendulums.world
@@ -0,0 +1,677 @@
+<sdf version="1.5">
+  <world name="default">
+    <scene>
+      <ambient>0.500000 0.500000 0.500000 1.000000</ambient>
+      <background>0.500000 0.500000 0.500000 1.000000</background>
+      <shadows>0</shadows>
+    </scene>
+    <light name="sun" type="directional">
+      <pose>0.000000 0.000000 100.000000 0.000000 -0.000000 0.000000</pose>
+      <diffuse>1.000000 1.000000 1.000000 1.000000</diffuse>
+      <specular>0.100000 0.100000 0.100000 1.000000</specular>
+      <attenuation>
+        <range>1000.000000</range>
+        <linear>0.010000</linear>
+        <constant>0.900000</constant>
+        <quadratic>0.000000</quadratic>
+      </attenuation>
+      <direction>-1.000000 0.000000 -1.000000</direction>
+      <cast_shadows>1</cast_shadows>
+    </light>
+    <physics type="ode">
+      <gravity>0.000000 0.000000 -9.810000</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>100</iters>
+          <precon_iters>0</precon_iters>
+          <sor>1.300000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>1.000000</erp>
+          <contact_max_correcting_vel>0.000000</contact_max_correcting_vel>
+          <contact_surface_layer>0.000000</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0.000000</real_time_update_rate>
+      <max_step_size>0.001000</max_step_size>
+    </physics>
+    <model name="model_1">
+      <pose>0.000000 0.000000 2.100000 -1.415927 -0.000000 0.000000</pose>
+      <link name="link_1">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>100.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.500000</mu>
+                <mu2>0.200000</mu2>
+                <fdir1>1.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>1000000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000000.000000</kp>
+                <kd>10000000000000.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.000100</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>100.000000</laser_retro>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>1</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="link_2">
+        <pose>0.000000 0.000000 -1.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_box">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.100000 0.100000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Red</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>100.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <collision name="collision_box">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <box>
+              <size>0.100000 0.100000 1.000000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.500000</mu>
+                <mu2>0.200000</mu2>
+                <fdir1>1.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>1000000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000000.000000</kp>
+                <kd>10000000000000.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.000100</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>100.000000</laser_retro>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <axis>
+          <limit>
+            <lower>-100.000000</lower>
+            <upper>100.000000</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm>0.200000</cfm>
+            <bounce>0.000000</bounce>
+            <max_force>1000.000000</max_force>
+            <velocity>0.000000</velocity>
+            <fudge_factor>0.000000</fudge_factor>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <suspension>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </suspension>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="joint_1" type="revolute">
+        <parent>link_1</parent>
+        <child>link_2</child>
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <axis>
+          <limit>
+            <lower>-100.000000</lower>
+            <upper>100.000000</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm>0.200000</cfm>
+            <bounce>0.000000</bounce>
+            <max_force>1000.000000</max_force>
+            <velocity>0.000000</velocity>
+            <fudge_factor>0.000000</fudge_factor>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <suspension>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </suspension>
+          </ode>
+        </physics>
+      </joint>
+      <static>0</static>
+    </model>
+    <model name="model_2">
+      <pose>1.000000 0.000000 2.100000 -1.415927 -0.000000 0.000000</pose>
+      <link name="link_1">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>100.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.500000</mu>
+                <mu2>0.200000</mu2>
+                <fdir1>1.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>1000000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000000.000000</kp>
+                <kd>10000000000000.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.000100</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>100.000000</laser_retro>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>1</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="link_2">
+        <pose>0.000000 0.000000 -1.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_box">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.100000 0.100000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Red</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>100.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <collision name="collision_box">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <box>
+              <size>0.100000 0.100000 1.000000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.500000</mu>
+                <mu2>0.200000</mu2>
+                <fdir1>1.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>1000000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000000.000000</kp>
+                <kd>10000000000000.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.000100</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>100.000000</laser_retro>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <axis>
+          <limit>
+            <lower>-100.000000</lower>
+            <upper>100.000000</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm>0.200000</cfm>
+            <bounce>0.000000</bounce>
+            <max_force>1000.000000</max_force>
+            <velocity>0.000000</velocity>
+            <fudge_factor>0.000000</fudge_factor>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <suspension>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </suspension>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="joint_1" type="revolute">
+        <parent>link_1</parent>
+        <child>link_2</child>
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <axis>
+          <limit>
+            <lower>-100.000000</lower>
+            <upper>100.000000</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm>0.200000</cfm>
+            <bounce>0.000000</bounce>
+            <max_force>1000.000000</max_force>
+            <velocity>0.000000</velocity>
+            <fudge_factor>0.000000</fudge_factor>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <suspension>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </suspension>
+          </ode>
+        </physics>
+      </joint>
+      <static>0</static>
+    </model>
+    <model name="model_3">
+      <pose>0.000000 -2.500000 2.100000 0.000000 -1.415927 0.000000</pose>
+      <link name="link_1">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>100.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.100000</radius>
+              <length>1.000000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.500000</mu>
+                <mu2>0.200000</mu2>
+                <fdir1>1.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>1000000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000000.000000</kp>
+                <kd>10000000000000.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.000100</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>100.000000</laser_retro>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>1</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="link_2">
+        <pose>0.000000 0.000000 -1.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>1.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>1.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>1.000000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_box">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.100000 0.100000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Red</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>100.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <collision name="collision_box">
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <box>
+              <size>0.100000 0.100000 1.000000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.500000</mu>
+                <mu2>0.200000</mu2>
+                <fdir1>1.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>1000000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000000.000000</kp>
+                <kd>10000000000000.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.000100</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>100.000000</laser_retro>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <axis>
+          <limit>
+            <lower>-100.000000</lower>
+            <upper>100.000000</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm>0.200000</cfm>
+            <bounce>0.000000</bounce>
+            <max_force>1000.000000</max_force>
+            <velocity>0.000000</velocity>
+            <fudge_factor>0.000000</fudge_factor>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <suspension>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </suspension>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="joint_1" type="revolute">
+        <parent>link_1</parent>
+        <child>link_2</child>
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <axis>
+          <limit>
+            <lower>-100.000000</lower>
+            <upper>100.000000</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm>0.200000</cfm>
+            <bounce>0.000000</bounce>
+            <max_force>1000.000000</max_force>
+            <velocity>0.000000</velocity>
+            <fudge_factor>0.000000</fudge_factor>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <suspension>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </suspension>
+          </ode>
+        </physics>
+      </joint>
+      <static>0</static>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/deprecated_worlds/force_torque_demo2.world b/worlds/deprecated_worlds/force_torque_demo2.world
new file mode 100644
index 0000000..890263e
--- /dev/null
+++ b/worlds/deprecated_worlds/force_torque_demo2.world
@@ -0,0 +1,226 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <scene>
+      <ambient>0.500000 0.500000 0.500000 1.000000</ambient>
+      <background>0.500000 0.500000 0.500000 1.000000</background>
+      <shadows>0</shadows>
+    </scene>
+    <physics type="ode">
+      <gravity>0.000000 0.000000 -9.810000</gravity>
+      <simbody>
+        <accuracy>0.001</accuracy>
+        <max_transient_velocity>0.01</max_transient_velocity>
+        <contact>
+          <stiffness>1e8</stiffness>
+          <dissipation>10</dissipation>
+          <static_friction>0.15</static_friction>
+          <dynamic_friction>0.1</dynamic_friction>
+          <viscous_friction>0.0</viscous_friction>
+        </contact>
+      </simbody>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>1000</iters>
+          <precon_iters>0</precon_iters>
+          <sor>1.400000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <contact_max_correcting_vel>0.000000</contact_max_correcting_vel>
+          <contact_surface_layer>0.00000</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0.000000</real_time_update_rate>
+      <max_step_size>0.001000</max_step_size>
+    </physics>
+    <!-- test contributed by jesper -->
+    <model name="boxes">
+      <pose>0 0 0 0 0 1.57</pose>
+      <link name="link1">
+        <collision name="collision">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <min_depth>0.01</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+        <inertial>
+          <mass>100.0</mass>
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>10.0</ixx>
+            <iyy>10.0</iyy>
+            <izz>10.0</izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+      </link>
+      <link name="link2">
+        <pose>1.0 0 1.0 0 0 0</pose>
+        <collision name="collision">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+        <inertial>
+          <mass>5.0</mass>
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>1.0</ixx>
+            <iyy>1.0</iyy>
+            <izz>1.0</izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+      </link>
+      <link name="link3">
+        <pose>2.0 0 2.0 0 0 0</pose>
+        <collision name="collision">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.5 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+        <inertial>
+          <mass>1.0</mass>
+          <pose>0.5 0.5 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.1</ixx>
+            <iyy>0.1</iyy>
+            <izz>0.1</izz>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyz>0.0</iyz>
+          </inertia>
+        </inertial>
+      </link>
+      <!-- simbody debug: pin base link to world
+      <joint name="joint0" type="revolute">
+        <physics>
+          <ode>
+            <provide_feedback>true</provide_feedback>
+            <cfm_damping>true</cfm_damping>
+            <implicit_damping>true</implicit_damping>
+          </ode>
+        </physics>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <limit>
+            <lower>-1e-6</lower>
+            <upper>1e-6</upper>
+          </limit>
+          <dynamics>
+            <damping>100.000000</damping>
+          </dynamics>
+        </axis>
+        <parent>world</parent>
+        <child>link1</child>
+      </joint>
+     -->
+      <joint name="joint1" type="revolute">
+        <physics>
+          <ode>
+            <provide_feedback>true</provide_feedback>
+            <!-- cfm_damping is being deprecated by implicit_damping -->
+            <cfm_damping>true</cfm_damping>
+            <implicit_damping>true</implicit_damping>
+          </ode>
+        </physics>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <!-- simbody debug: limit joint angle -->
+          <limit>
+            <lower>-1e6</lower>
+            <upper>1e6</upper>
+          </limit>
+          <dynamics>
+            <damping>30.000000</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <parent>link1</parent>
+        <child>link2</child>
+      </joint>
+      <joint name="joint2" type="revolute">
+        <physics>
+          <ode>
+            <provide_feedback>true</provide_feedback>
+            <!-- cfm_damping is being deprecated by implicit_damping -->
+            <cfm_damping>true</cfm_damping>
+            <implicit_damping>true</implicit_damping>
+          </ode>
+        </physics>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <!-- simbody debug: limit joint angle -->
+          <limit>
+            <lower>-1e6</lower>
+            <upper>1e6</upper>
+          </limit>
+          <dynamics>
+            <damping>30.000000</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <parent>link2</parent>
+        <child>link3</child>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/deprecated_worlds/model_nesting.world b/worlds/deprecated_worlds/model_nesting.world
new file mode 100644
index 0000000..4c33f61
--- /dev/null
+++ b/worlds/deprecated_worlds/model_nesting.world
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- Ground -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- Pioneer2dx model with a hokuyo laser and camera-->
+    <model name="pioneer2dx">
+      <include filename="pioneer2dx.model" />
+      <include filename="hokuyo.model" model_pose="0.2 0 0.3 0 0 0" />
+      <include filename="camera.model" model_pose="0.2 0 0.5 0 0 0" />
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/deprecated_worlds/ragdoll.world b/worlds/deprecated_worlds/ragdoll.world
new file mode 100644
index 0000000..b0a23ae
--- /dev/null
+++ b/worlds/deprecated_worlds/ragdoll.world
@@ -0,0 +1,1927 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <physics type="simbody">
+      <gravity>0 0 -9.8</gravity>
+      <ode>
+        <solver />
+      </ode>
+      <simbody>
+        <dt>0.001</dt>
+      </simbody>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="ground_plane">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>100 100</size>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>100</mu>
+                <mu2>50</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <cast_shadows>false</cast_shadows>
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>100 100</size>
+            </plane>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Grey</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="ragdoll">
+      <pose>0.000000 0.000000 1.4 0.000000 -0.000000 0.000000</pose>
+      <link name="hip">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.100000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.100000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.100000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <collision name="hip_geom">
+          <pose>0.000000 0.000000 0.125000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.100000 0.500000 0.250000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="hip_geom_visual">
+          <pose>0.000000 0.000000 0.125000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.100000 0.500000 0.250000</size>
+            </box>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_thigh_pan">
+        <pose>0.000000 0.220000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="l_thigh_pan_geom">
+          <pose>0.000000 0.000000 -0.030000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.060000</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_thigh_pan_geom_visual">
+          <pose>0.000000 0.000000 -0.030000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.060000</radius>
+            </sphere>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_thigh_lift">
+        <pose>0.000000 0.220000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.050000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.050000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.050000</izz>
+          </inertia>
+          <mass>5.000000</mass>
+        </inertial>
+        <collision name="l_thigh_lift_geom">
+          <pose>0.000000 0.000000 -0.350000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.060000</radius>
+              <length>0.700000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_thigh_lift_geom_visual">
+          <pose>0.000000 0.000000 -0.350000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.060000</radius>
+              <length>0.700000</length>
+            </cylinder>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_calf">
+        <pose>0.000000 0.220000 -0.700000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.020000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.020000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.020000</izz>
+          </inertia>
+          <mass>2.000000</mass>
+        </inertial>
+        <collision name="l_calf_geom">
+          <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.050000</radius>
+              <length>0.600000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_calf_geom_visual">
+          <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.050000</radius>
+              <length>0.600000</length>
+            </cylinder>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_ankle">
+        <pose>0.000000 0.220000 -1.325000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="l_ankle_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.050000</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_ankle_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.050000</radius>
+            </sphere>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_foot">
+        <pose>0.000000 0.220000 -1.350000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.100000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="l_foot_geom">
+          <pose>0.100000 0.000000 -0.025000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.200000 0.030000 0.050000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_foot_geom_visual">
+          <pose>0.100000 0.000000 -0.025000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.200000 0.030000 0.050000</size>
+            </box>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_thigh_pan">
+        <pose>0.000000 -0.220000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="r_thigh_pan_geom">
+          <pose>0.000000 0.000000 -0.030000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.060000</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_thigh_pan_geom_visual">
+          <pose>0.000000 0.000000 -0.030000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.060000</radius>
+            </sphere>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_thigh_lift">
+        <pose>0.000000 -0.220000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.050000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.050000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.050000</izz>
+          </inertia>
+          <mass>5.000000</mass>
+        </inertial>
+        <collision name="r_thigh_lift_geom">
+          <pose>0.000000 0.000000 -0.350000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.060000</radius>
+              <length>0.700000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_thigh_lift_geom_visual">
+          <pose>0.000000 0.000000 -0.350000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.060000</radius>
+              <length>0.700000</length>
+            </cylinder>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_calf">
+        <pose>0.000000 -0.220000 -0.700000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.020000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.020000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.020000</izz>
+          </inertia>
+          <mass>2.000000</mass>
+        </inertial>
+        <collision name="r_calf_geom">
+          <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.050000</radius>
+              <length>0.600000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_calf_geom_visual">
+          <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.050000</radius>
+              <length>0.600000</length>
+            </cylinder>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_ankle">
+        <pose>0.000000 -0.220000 -1.325000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="r_ankle_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.050000</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_ankle_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.050000</radius>
+            </sphere>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_foot">
+        <pose>0.000000 -0.220000 -1.350000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.100000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="r_foot_geom">
+          <pose>0.100000 0.000000 -0.025000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.200000 0.030000 0.050000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_foot_geom_visual">
+          <pose>0.100000 0.000000 -0.025000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.200000 0.030000 0.050000</size>
+            </box>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="torso">
+        <pose>0.000000 0.000000 0.250000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.300000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.300000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.300000</izz>
+          </inertia>
+          <mass>30.000000</mass>
+        </inertial>
+        <collision name="torso_geom">
+          <pose>0.000000 0.000000 0.350000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.100000 0.600000 0.700000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="torso_geom_visual">
+          <pose>0.000000 0.000000 0.350000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.100000 0.600000 0.700000</size>
+            </box>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_shoulder">
+        <pose>0.000000 0.327500 0.922500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="l_shoulder_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.055000</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_shoulder_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.055000</radius>
+            </sphere>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_upper_arm">
+        <pose>0.000000 0.327500 0.922500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.020000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.020000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.020000</izz>
+          </inertia>
+          <mass>2.000000</mass>
+        </inertial>
+        <collision name="l_upper_arm_geom">
+          <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.055000</radius>
+              <length>0.600000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_upper_arm_geom_visual">
+          <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.055000</radius>
+              <length>0.600000</length>
+            </cylinder>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_forearm">
+        <pose>0.000000 0.327500 0.322500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="l_forearm_geom">
+          <pose>0.000000 0.000000 -0.225000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.050000</radius>
+              <length>0.450000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_forearm_geom_visual">
+          <pose>0.000000 0.000000 -0.225000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.050000</radius>
+              <length>0.450000</length>
+            </cylinder>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_wrist">
+        <pose>0.000000 0.327500 -0.142500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="l_wrist_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.030000</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_wrist_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.030000</radius>
+            </sphere>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="l_hand">
+        <pose>0.000000 0.327500 -0.157500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="l_hand_geom">
+          <pose>0.000000 0.000000 -0.100000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.030000 0.100000 0.200000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="l_hand_geom_visual">
+          <pose>0.000000 0.000000 -0.100000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.030000 0.100000 0.200000</size>
+            </box>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="neck">
+        <pose>0.000000 0.000000 0.950000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="neck_geom">
+          <pose>0.000000 0.000000 0.100000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.075000</radius>
+              <length>0.200000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="neck_geom_visual">
+          <pose>0.000000 0.000000 0.100000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.075000</radius>
+              <length>0.200000</length>
+            </cylinder>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="head">
+        <pose>0.000000 0.000000 1.225000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.100000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.100000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.100000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <collision name="head_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.150000</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="head_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.150000</radius>
+            </sphere>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_shoulder">
+        <pose>0.000000 -0.327500 0.922500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="r_shoulder_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.055000</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_shoulder_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.055000</radius>
+            </sphere>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_upper_arm">
+        <pose>0.000000 -0.327500 0.922500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.020000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.020000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.020000</izz>
+          </inertia>
+          <mass>2.000000</mass>
+        </inertial>
+        <collision name="r_upper_arm_geom">
+          <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.055000</radius>
+              <length>0.600000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_upper_arm_geom_visual">
+          <pose>0.000000 0.000000 -0.300000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.055000</radius>
+              <length>0.600000</length>
+            </cylinder>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_forearm">
+        <pose>0.000000 -0.327500 0.322500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="r_forearm_geom">
+          <pose>0.000000 0.000000 -0.225000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.050000</radius>
+              <length>0.450000</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_forearm_geom_visual">
+          <pose>0.000000 0.000000 -0.225000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.050000</radius>
+              <length>0.450000</length>
+            </cylinder>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_wrist">
+        <pose>0.000000 -0.327500 -0.142500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="r_wrist_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.030000</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_wrist_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <sphere>
+              <radius>0.030000</radius>
+            </sphere>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <link name="r_hand">
+        <pose>0.000000 -0.327500 -0.157500 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>0.010000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.010000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.010000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="r_hand_geom">
+          <pose>0.000000 0.000000 -0.100000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.030000 0.100000 0.200000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>-1.000000</mu>
+                <mu2>-1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>0.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="r_hand_geom_visual">
+          <pose>0.000000 0.000000 -0.100000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>0.030000 0.100000 0.200000</size>
+            </box>
+          </geometry>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>0</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <joint name="l_thigh_pan_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>hip</parent>
+        <child>l_thigh_pan</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 0.000000 1.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="l_thigh_lift_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>l_thigh_pan</parent>
+        <child>l_thigh_lift</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="l_calf_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>l_thigh_lift</parent>
+        <child>l_calf</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="l_ankle_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>l_calf</parent>
+        <child>l_ankle</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="l_foot_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>l_ankle</parent>
+        <child>l_foot</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_thigh_pan_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>hip</parent>
+        <child>r_thigh_pan</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 0.000000 1.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_thigh_lift_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>r_thigh_pan</parent>
+        <child>r_thigh_lift</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_calf_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>r_thigh_lift</parent>
+        <child>r_calf</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_ankle_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>r_calf</parent>
+        <child>r_ankle</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_foot_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>r_ankle</parent>
+        <child>r_foot</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="torso_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>hip</parent>
+        <child>torso</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="l_shoulder_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>torso</parent>
+        <child>l_shoulder</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="l_upper_arm_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>l_shoulder</parent>
+        <child>l_upper_arm</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="l_forearm_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>l_upper_arm</parent>
+        <child>l_forearm</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="l_wrist_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>l_forearm</parent>
+        <child>l_wrist</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="l_hand_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>l_wrist</parent>
+        <child>l_hand</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="neck_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>torso</parent>
+        <child>neck</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 0.000000 1.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="head_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>neck</parent>
+        <child>head</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_shoulder_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>torso</parent>
+        <child>r_shoulder</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_upper_arm_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>r_shoulder</parent>
+        <child>r_upper_arm</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_forearm_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>r_upper_arm</parent>
+        <child>r_forearm</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_wrist_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>r_forearm</parent>
+        <child>r_wrist</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <joint name="r_hand_joint" type="revolute">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <parent>r_wrist</parent>
+        <child>r_hand</child>
+        <axis>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <limit lower="-1.570800" upper="1.570800" effort="0.000000" velocity="0.000000" />
+          <xyz>0.000000 1.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>0</static>
+      <!--
+      <joint name="joint1" type="revolute">
+        <parent>world</parent>
+        <child>r_hand</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <limit>
+            <lower>1000</lower>
+            <upper>-1000</upper>
+            <effort>0</effort>
+            <velocity>1000</velocity>
+          </limit>
+        </axis>
+      </joint>
+-->
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/deprecated_worlds/two_actors.world b/worlds/deprecated_worlds/two_actors.world
new file mode 100644
index 0000000..8c2e58a
--- /dev/null
+++ b/worlds/deprecated_worlds/two_actors.world
@@ -0,0 +1,45 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <light type="directional" name="sun">
+      <pose>0 0 100 0 0 0</pose>
+      <diffuse>0.5 0.5 0.5 1</diffuse>
+      <specular>0.2 0.2 0.2 1</specular>
+      <attenuation>
+        <range>100</range>
+        <linear>0.01</linear>
+        <constant>0.8</constant>
+        <quadratic>0.0</quadratic>
+      </attenuation>
+      <direction>0.0 0.2 -8.0</direction>
+      <cast_shadows>true</cast_shadows>
+    </light>
+    <actor name="actor1" static="true">
+      <pose>0 0 0 0 0 0</pose>
+      <skin>
+        <filename>talk_a.dae</filename>
+        <scale>1.0</scale>
+      </skin>
+      <script>
+        <loop>true</loop>
+        <delay_start>0.0</delay_start>
+        <auto_start>true</auto_start>
+      </script>
+    </actor>
+    <actor name="actor2" static="true">
+      <pose>0 0 0 0 0 0</pose>
+      <skin>
+        <filename>talk_b.dae</filename>
+        <scale>1.0</scale>
+      </skin>
+      <script>
+        <loop>true</loop>
+        <delay_start>0.0</delay_start>
+        <auto_start>true</auto_start>
+      </script>
+    </actor>
+  </world>
+</sdf>
diff --git a/worlds/deprecated_worlds/weshare2012.world b/worlds/deprecated_worlds/weshare2012.world
new file mode 100644
index 0000000..7ff335b
--- /dev/null
+++ b/worlds/deprecated_worlds/weshare2012.world
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include filename="weshare2012_pioneer.model" />
+    <include filename="weshare2012_apartment.model" />
+  </world>
+</sdf>
diff --git a/worlds/depth_camera.world b/worlds/depth_camera.world
new file mode 100644
index 0000000..cdb868c
--- /dev/null
+++ b/worlds/depth_camera.world
@@ -0,0 +1,89 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="sphere">
+      <pose>2 0 0 0 0 0</pose>
+      <link name="body">
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="geom">
+          <geometry>
+            <sphere>
+              <radius>1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="camera_model">
+      <pose>0 0 0 0 0 0</pose>
+      <link name="my_link">
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <sensor name="camera" type="depth">
+          <camera>
+            <horizontal_fov>1.04719755</horizontal_fov>
+            <image>
+              <width>640</width>
+              <height>480</height>
+              <format>R8G8B8</format>
+            </image>
+            <clip>
+              <near>0.1</near>
+              <far>20</far>
+            </clip>
+            <save enabled="true">
+              <path>/tmp/camera</path>
+            </save>
+          </camera>
+          <plugin filename="libDepthCameraPlugin.so" name="depth_camera_plugin" />
+          <always_on>true</always_on>
+          <update_rate>10</update_rate>
+        </sensor>
+      </link>
+      <static>true</static>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/empty.world b/worlds/empty.world
new file mode 100644
index 0000000..5321672
--- /dev/null
+++ b/worlds/empty.world
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/empty_1_0.world b/worlds/empty_1_0.world
new file mode 100644
index 0000000..c636097
--- /dev/null
+++ b/worlds/empty_1_0.world
@@ -0,0 +1,24 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <scene>
+      <ambient>0 0 0 1</ambient>
+      <fog>
+        <color>1 2 3 4</color>
+        <type>linear</type>
+        <start>.1</start>
+        <end>100.1</end>
+        <density>0.5</density>
+      </fog>
+      <background>.5 .5 .5 1</background>
+    </scene>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/empty_bullet.world b/worlds/empty_bullet.world
new file mode 100644
index 0000000..a9ea52a
--- /dev/null
+++ b/worlds/empty_bullet.world
@@ -0,0 +1,22 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <scene>
+      <ambient>.1 .1 .1 1</ambient>
+      <shadows>false</shadows>
+    </scene>
+    <physics type="bullet">
+      <gravity>0 0 -9.8</gravity>
+      <bullet />
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/empty_sky.world b/worlds/empty_sky.world
new file mode 100644
index 0000000..0b554eb
--- /dev/null
+++ b/worlds/empty_sky.world
@@ -0,0 +1,20 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <scene>
+      <sky>
+        <clouds>
+          <speed>12</speed>
+        </clouds>
+      </sky>
+    </scene>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/everything.world b/worlds/everything.world
new file mode 100644
index 0000000..c0fc2a9
--- /dev/null
+++ b/worlds/everything.world
@@ -0,0 +1,113 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://pr2</uri>
+      <pose>0 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://house_1</uri>
+      <pose>10 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://house_2</uri>
+      <pose>20 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://house_3</uri>
+      <pose>30 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://jersey_barrier</uri>
+      <pose>40 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://bookshelf</uri>
+      <pose>50 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://turtlebot</uri>
+      <pose>60 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://table</uri>
+      <pose>70 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://willowgarage</uri>
+      <pose>100 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://youbot</uri>
+      <pose>-10 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://utility_cart</uri>
+      <pose>-20 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://stop_sign</uri>
+      <pose>-30 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://starting_pen</uri>
+      <pose>-40 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://speed_limit_sign</uri>
+      <pose>-50 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://powerplant</uri>
+      <pose>-80 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://polaris_ranger_ev</uri>
+      <pose>0 10 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://pioneer2dx</uri>
+      <pose>0 20 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://monkey_wrench</uri>
+      <pose>0 30 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://mailbox</uri>
+      <pose>0 40 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://lamp_post</uri>
+      <pose>0 50 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://hammer</uri>
+      <pose>0 60 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://grey_wall</uri>
+      <pose>0 70 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://gas_station</uri>
+      <pose>0 80 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://fast_food</uri>
+      <pose>0 90 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://dumpster</uri>
+      <pose>0 100 0 0 0 0</pose>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/force_torque_demo.world b/worlds/force_torque_demo.world
new file mode 100644
index 0000000..310ee2c
--- /dev/null
+++ b/worlds/force_torque_demo.world
@@ -0,0 +1,132 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- to demonstrate force torque, we'll construct a model with
+    two bodies stacked vertically, with a x-revolute joint connecting
+    them.  The joint has 90 degree limit.  We'll test force
+    torque readings and characterize them. -->
+    <model name="model_1">
+      <link name="link_1">
+        <inertial>
+          <pose>0 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.100000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.100000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.100000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_sphere">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.100000</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <collision name="collision_sphere">
+          <pose>0 0 0.5 0 0 0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <sphere>
+              <radius>0.100000</radius>
+            </sphere>
+          </geometry>
+        </collision>
+      </link>
+      <link name="link_2">
+        <pose>0 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0 0 0.5 0 0 0</pose>
+          <inertia>
+            <ixx>0.100000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>0.100000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>0.100000</izz>
+          </inertia>
+          <mass>10.000000</mass>
+        </inertial>
+        <visual name="visual_box">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.2 0.4</size>
+            </box>
+          </geometry>
+        </visual>
+        <collision name="collision_box">
+          <pose>0 0 0.5 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.2 0.4</size>
+            </box>
+          </geometry>
+        </collision>
+      </link>
+      <joint name="joint_01" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <!-- joint at origin of link_1 inertial frame -->
+        <!-- moement arm from link_1 inertial frame to joint_01 is 0m -->
+        <pose>0 0 0.5 0 0 0</pose>
+        <axis>
+          <limit>
+            <lower>-1.57079</lower>
+            <upper>1.57079</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>1.000000 0.000000 0.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <sensor name="force_torque" type="force_torque">
+          <always_on>true</always_on>
+          <visualize>true</visualize>
+          <update_rate>30</update_rate>
+        </sensor>
+      </joint>
+      <joint name="joint_12" type="revolute">
+        <parent>link_1</parent>
+        <child>link_2</child>
+        <!-- joint_1 at origin of link_2 link frame -->
+        <!-- moement arm from link_2 inertial frame to joint_01 is 2m -->
+        <!-- moement arm from link_2 inertial frame to joint_12 is 0.5m -->
+        <pose>0 0 0 0 0 0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+            <effort>1000.000000</effort>
+            <velocity>1000.000000</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.000000</damping>
+            <friction>0.000000</friction>
+          </dynamics>
+          <xyz>0.000000 0.000000 1.000000</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <sensor name="force_torque" type="force_torque">
+          <always_on>true</always_on>
+          <visualize>true</visualize>
+          <update_rate>30</update_rate>
+        </sensor>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/friction_demo.world b/worlds/friction_demo.world
new file mode 100644
index 0000000..10c0e22
--- /dev/null
+++ b/worlds/friction_demo.world
@@ -0,0 +1,499 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <scene>
+      <ambient>1.000000 1.000000 1.000000 1.000000</ambient>
+      <background>0.700000 0.700000 0.700000 1.000000</background>
+      <shadows>1</shadows>
+    </scene>
+    <physics type="ode">
+      <gravity>0.000000 -1.000000 -1.000000</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>50</iters>
+          <precon_iters>0</precon_iters>
+          <sor>1.300000</sor>
+        </solver>
+        <constraints>
+          <cfm>0.000000</cfm>
+          <erp>0.200000</erp>
+          <contact_max_correcting_vel>100.000000</contact_max_correcting_vel>
+          <contact_surface_layer>0.001000</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0.000000</real_time_update_rate>
+      <max_step_size>0.001000</max_step_size>
+    </physics>
+    <model name="gplane">
+      <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+      <link name="plane">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <collision name="plane">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <plane>
+              <normal>0.000000 0.000000 1.000000</normal>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>50.000000</mu>
+                <mu2>50.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>1000000000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <static>1</static>
+    </model>
+    <model name="box_01_model">
+      <allow_auto_disable>0</allow_auto_disable>
+      <pose>2.000000 8.000000 0.500000 0.000000 -0.000000 0.000000</pose>
+      <link name="box_01_body">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>10.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>10.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>10.000000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="box_01_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.998000</mu>
+                <mu2>0.998000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>100000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="box_01_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Rocky</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <static>0</static>
+    </model>
+    <model name="box_02_model">
+      <allow_auto_disable>0</allow_auto_disable>
+      <pose>4.000000 8.000000 0.500000 0.000000 -0.000000 0.000000</pose>
+      <link name="box_02_body">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>10.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>10.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>10.000000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="box_02_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.998500</mu>
+                <mu2>0.998500</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>100000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="box_02_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Rocky</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <static>0</static>
+    </model>
+    <model name="box_03_model">
+      <allow_auto_disable>0</allow_auto_disable>
+      <pose>6.000000 8.000000 0.500000 0.000000 -0.000000 0.000000</pose>
+      <link name="box_03_body">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>10.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>10.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>10.000000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="box_03_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.999000</mu>
+                <mu2>0.999000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>100000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="box_03_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Rocky</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <static>0</static>
+    </model>
+    <model name="box_04_model">
+      <allow_auto_disable>0</allow_auto_disable>
+      <pose>8.000000 8.000000 0.500000 0.000000 -0.000000 0.000000</pose>
+      <link name="box_04_body">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>10.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>10.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>10.000000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="box_04_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.999500</mu>
+                <mu2>0.999500</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>100000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="box_04_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Rocky</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <static>0</static>
+    </model>
+    <model name="box_05_model">
+      <allow_auto_disable>0</allow_auto_disable>
+      <pose>10.000000 8.000000 0.500000 0.000000 -0.000000 0.000000</pose>
+      <link name="box_05_body">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>10.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>10.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>10.000000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="box_05_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1.000000</mu>
+                <mu2>1.000000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>100000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="box_05_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Rocky</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <static>0</static>
+    </model>
+    <model name="box_06_model">
+      <allow_auto_disable>0</allow_auto_disable>
+      <pose>12.000000 8.000000 0.500000 0.000000 -0.000000 0.000000</pose>
+      <link name="box_06_body">
+        <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+        <inertial>
+          <pose>0.000000 0.000000 -0.500000 0.000000 -0.000000 0.000000</pose>
+          <inertia>
+            <ixx>10.000000</ixx>
+            <ixy>0.000000</ixy>
+            <ixz>0.000000</ixz>
+            <iyy>10.000000</iyy>
+            <iyz>0.000000</iyz>
+            <izz>10.000000</izz>
+          </inertia>
+          <mass>1.000000</mass>
+        </inertial>
+        <collision name="box_06_geom">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1.010000</mu>
+                <mu2>1.010000</mu2>
+                <fdir1>0.000000 0.000000 0.000000</fdir1>
+                <slip1>0.000000</slip1>
+                <slip2>0.000000</slip2>
+              </ode>
+            </friction>
+            <bounce>
+              <restitution_coefficient>0.000000</restitution_coefficient>
+              <threshold>100000.000000</threshold>
+            </bounce>
+            <contact>
+              <ode>
+                <soft_cfm>0.000000</soft_cfm>
+                <soft_erp>0.200000</soft_erp>
+                <kp>100000.000000</kp>
+                <kd>1.000000</kd>
+                <max_vel>100.000000</max_vel>
+                <min_depth>0.001000</min_depth>
+              </ode>
+            </contact>
+          </surface>
+          <laser_retro>0.000000</laser_retro>
+        </collision>
+        <visual name="box_06_geom_visual">
+          <pose>0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000</pose>
+          <geometry>
+            <box>
+              <size>1.000000 1.000000 1.000000</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/Rocky</script>
+          </material>
+          <cast_shadows>1</cast_shadows>
+          <laser_retro>0.000000</laser_retro>
+          <transparency>0.000000</transparency>
+        </visual>
+        <gravity>1</gravity>
+        <self_collide>0</self_collide>
+        <kinematic>0</kinematic>
+      </link>
+      <static>0</static>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/gripper.world b/worlds/gripper.world
new file mode 100644
index 0000000..b751e11
--- /dev/null
+++ b/worlds/gripper.world
@@ -0,0 +1,36 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://simple_gripper</uri>
+    </include>
+    <model name="box">
+      <pose>0.3 0 0.1 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>.2 .2 .2</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>.2 .2 .2</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/heightmap.world b/worlds/heightmap.world
new file mode 100644
index 0000000..3cddc00
--- /dev/null
+++ b/worlds/heightmap.world
@@ -0,0 +1,144 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="box1">
+      <pose>-63.0 -63. 10 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>1 0 0 1</ambient>
+            <diffuse>1 0 0 1</diffuse>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="box2">
+      <pose>-63.0 63.0 10 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0 1 0 1</ambient>
+            <diffuse>0 1 0 1</diffuse>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="box3">
+      <pose>63 63.0 10 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0 0 1 1</ambient>
+            <diffuse>0 0 1 1</diffuse>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="box4">
+      <pose>63 -63.0 10 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </visual>
+      </link>
+    </model>
+    <model name="heightmap">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <heightmap>
+              <uri>file://media/materials/textures/heightmap_bowl.png</uri>
+              <size>129 129 10</size>
+              <pos>0 0 0</pos>
+            </heightmap>
+          </geometry>
+        </collision>
+        <visual name="visual_abcedf">
+          <geometry>
+            <heightmap>
+              <use_terrain_paging>false</use_terrain_paging>
+              <texture>
+                <diffuse>file://media/materials/textures/dirt_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <texture>
+                <diffuse>file://media/materials/textures/grass_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <texture>
+                <diffuse>file://media/materials/textures/fungus_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <blend>
+                <min_height>2</min_height>
+                <fade_dist>5</fade_dist>
+              </blend>
+              <blend>
+                <min_height>4</min_height>
+                <fade_dist>5</fade_dist>
+              </blend>
+              <uri>file://media/materials/textures/heightmap_bowl.png</uri>
+              <size>129 129 10</size>
+              <pos>0 0 0</pos>
+            </heightmap>
+          </geometry>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/heightmap_dem.world b/worlds/heightmap_dem.world
new file mode 100644
index 0000000..7edd4d3
--- /dev/null
+++ b/worlds/heightmap_dem.world
@@ -0,0 +1,56 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="heightmap">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <heightmap>
+              <uri>file://media/dem/volcano.tif</uri>
+              <size>129 129 80</size>
+              <pos>0 0 0</pos>
+            </heightmap>
+          </geometry>
+        </collision>
+        <visual name="visual_abcedf">
+          <geometry>
+            <heightmap>
+              <use_terrain_paging>false</use_terrain_paging>
+              <texture>
+                <diffuse>file://media/materials/textures/dirt_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <texture>
+                <diffuse>file://media/materials/textures/grass_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <texture>
+                <diffuse>file://media/materials/textures/fungus_diffusespecular.png</diffuse>
+                <normal>file://media/materials/textures/flat_normal.png</normal>
+                <size>1</size>
+              </texture>
+              <blend>
+                <min_height>2</min_height>
+                <fade_dist>5</fade_dist>
+              </blend>
+              <blend>
+                <min_height>4</min_height>
+                <fade_dist>5</fade_dist>
+              </blend>
+              <uri>file://media/dem/volcano.tif</uri>
+              <size>129 129 80</size>
+              <pos>0 0 0</pos>
+            </heightmap>
+          </geometry>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/joint_damping_demo.world b/worlds/joint_damping_demo.world
new file mode 100644
index 0000000..0eda4ab
--- /dev/null
+++ b/worlds/joint_damping_demo.world
@@ -0,0 +1,645 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <gui>
+      <camera name="user_camera">
+        <pose>-60 0 5 0 0 0</pose>
+      </camera>
+    </gui>
+    <scene>
+      <ambient>0.5 0.5 0.5 1</ambient>
+      <background>0.5 0.5 0.5 1</background>
+      <shadows>false</shadows>
+    </scene>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <physics type="ode">
+      <gravity>0.0 0.0 -9.81</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>100</iters>
+          <sor>1.0</sor>
+        </solver>
+        <constraints>
+          <cfm>0</cfm>
+          <erp>1.0</erp>
+          <contact_max_correcting_vel>0.0</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <model name="model_1_mass_1_damping_10000">
+      <pose>0.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>10000.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_2_mass_01_damping_10">
+      <pose>1.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>0.1</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>10.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_3_mass_1_damping_10">
+      <pose>2.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>10.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_4_mass_1_ixx_1_damping_10">
+      <pose>3.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>10.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_5_mass_1_damping_1">
+      <pose>4.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_6_mass_1_damping_10">
+      <pose>5.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>10.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_7_mass_1_damping_100">
+      <pose>6.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>100.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_8_mass_1_damping_1000">
+      <pose>7.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1000.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_9_mass_1_damping_0">
+      <pose>8.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>0.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+    <model name="model_10_mass_10_damping_0">
+      <pose>9.0 0.0 10.1 1.57079633 0.0 0.0</pose>
+      <link name="link_1">
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <inertial>
+          <pose>0.0 0.0 -10.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <velocity_decay>
+          <linear>0.0</linear>
+          <angular>0.0</angular>
+        </velocity_decay>
+        <visual name="visual_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/Green</script>
+          </material>
+        </visual>
+        <collision name="collision_cylinder">
+          <pose>0.0 0.0 -5.0 0.0 0.0 0.0</pose>
+          <max_contacts>250</max_contacts>
+          <geometry>
+            <cylinder>
+              <radius>0.05</radius>
+              <length>10.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <gravity>true</gravity>
+        <self_collide>true</self_collide>
+        <kinematic>false</kinematic>
+      </link>
+      <joint name="joint_0" type="revolute">
+        <parent>world</parent>
+        <child>link_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>0.0</damping>
+            <friction>0.0</friction>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+      <static>false</static>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/joints.world b/worlds/joints.world
new file mode 100644
index 0000000..a312e43
--- /dev/null
+++ b/worlds/joints.world
@@ -0,0 +1,84 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="revolute_model">
+      <pose>0 0 0.5 0 0 0</pose>
+      <link name="body1">
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="geom">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <link name="body2">
+        <pose>0 0.5 2.0 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="geom">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <joint type="revolute" name="revolute_joint">
+        <pose>0 0 1 0 0 0</pose>
+        <parent>body2</parent>
+        <child>body1</child>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+      </joint>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/lift_drag_demo.world b/worlds/lift_drag_demo.world
new file mode 100644
index 0000000..9beb481
--- /dev/null
+++ b/worlds/lift_drag_demo.world
@@ -0,0 +1,505 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0.0 0.0 -10.0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>50</iters>
+          <sor>0.8</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>0.1</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+
+    <model name="lift_drag_demo_model">
+      <pose>0 0 0 0 0 0</pose>
+      <static>false</static>
+      <link name="body">
+        <pose>0 0 0.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>1.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.1</mu>
+                <mu2>0.1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="rod_1">
+        <pose>0 0 1.25 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_1">
+        <pose>0 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_2">
+        <pose>0 0 1.5 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_1_joint" type="revolute">
+        <parent>body</parent>
+        <child>rod_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 -1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_1_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_2_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 -1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <!--
+      <joint name="gear_joint" type="gearbox">
+          <parent>blade_1</parent>
+          <child>blade_2</child>
+          <gearbox_ratio>-1.0</gearbox_ratio>
+          <gearbox_reference_body>rod_1</gearbox_reference_body>
+          <axis>
+            <xyz>0.000000 1.000000 0.000000</xyz>
+          </axis>
+          <axis2>
+            <xyz>0.000000 -1.000000 0.000000</xyz>
+          </axis2>
+      </joint>
+      -->
+
+
+      <link name="rod_2">
+        <pose>0 0 1.25 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_2_joint" type="revolute">
+        <parent>body</parent>
+        <child>rod_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <link name="blade_3">
+        <pose>0 0 1.7 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_4">
+        <pose>0 0 1.7 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="blade_3_joint" type="revolute">
+        <parent>rod_2</parent>
+        <child>blade_3</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_4_joint" type="revolute">
+        <parent>rod_2</parent>
+        <child>blade_4</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 -1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <!-- -->
+      <joint name="gear_joint" type="gearbox">
+          <parent>rod_1</parent>
+          <child>rod_2</child>
+          <gearbox_ratio>-1.0</gearbox_ratio>
+          <gearbox_reference_body>body</gearbox_reference_body>
+          <axis>
+            <xyz>0.000000 0.000000 -1.000000</xyz>
+          </axis>
+          <axis2>
+            <xyz>0.000000 0.000000 1.000000</xyz>
+          </axis2>
+      </joint>
+
+      <plugin name="gazebo_blade_1" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.05 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_1</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_2" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.05 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_2</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_3" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.05 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_3</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_4" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.05 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_4</link_name>
+      </plugin>
+      <!-- drag for body
+      <plugin name="gazebo_body_1" filename="libLiftDragPlugin.so">
+        <a0>0.0</a0>
+        <cla>0.000</cla>
+        <cda>1.000</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0 0</cp>
+        <area>1.0</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_4</link_name>
+      </plugin>
+      <plugin name="gazebo_body_2" filename="libLiftDragPlugin.so">
+        <a0>0.0</a0>
+        <cla>0.000</cla>
+        <cda>1.000</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0 0</cp>
+        <area>1.0</area>
+        <air_density>1.2041</air_density>
+        <forward>0 1 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_4</link_name>
+      </plugin>
+      -->
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/lights.world b/worlds/lights.world
new file mode 100644
index 0000000..f4ebb0a
--- /dev/null
+++ b/worlds/lights.world
@@ -0,0 +1,75 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <light type="point" name="point">
+      <pose>0 2 2 0 0 0</pose>
+      <diffuse>1 0 0 1</diffuse>
+      <specular>.1 .1 .1 1</specular>
+      <attenuation>
+        <range>20</range>
+        <linear>0.2</linear>
+        <constant>0.8</constant>
+        <quadratic>0.01</quadratic>
+      </attenuation>
+      <cast_shadows>false</cast_shadows>
+    </light>
+    <light type="point" name="point1">
+      <pose>0 1 2 0 0 0</pose>
+      <diffuse>0 1 0 1</diffuse>
+      <specular>.1 .1 .1 1</specular>
+      <attenuation>
+        <range>20</range>
+        <linear>0.2</linear>
+        <constant>0.8</constant>
+        <quadratic>0.01</quadratic>
+      </attenuation>
+      <cast_shadows>false</cast_shadows>
+    </light>
+    <light type="point" name="point2">
+      <pose>0 0 2 0 0 0</pose>
+      <diffuse>0 0 1 1</diffuse>
+      <specular>.1 .1 .1 1</specular>
+      <attenuation>
+        <range>20</range>
+        <linear>0.2</linear>
+        <constant>0.8</constant>
+        <quadratic>0.01</quadratic>
+      </attenuation>
+      <cast_shadows>false</cast_shadows>
+    </light>
+    <light type="spot" name="spot">
+      <pose>0 -1 2 0 0 0</pose>
+      <diffuse>0 1 0 1</diffuse>
+      <specular>.2 .2 .2 1</specular>
+      <attenuation>
+        <range>10</range>
+        <linear>0.01</linear>
+        <constant>0.2</constant>
+        <quadratic>0.0</quadratic>
+      </attenuation>
+      <direction>0 0 -1</direction>
+      <spot>
+        <inner_angle>0.1</inner_angle>
+        <outer_angle>0.5</outer_angle>
+        <falloff>1.2</falloff>
+      </spot>
+      <cast_shadows>false</cast_shadows>
+    </light>
+    <light type="directional" name="directional">
+      <pose>0 -2 2 0 0 0</pose>
+      <diffuse>0.2 0.2 .2 1</diffuse>
+      <specular>.1 .1 .1 1</specular>
+      <attenuation>
+        <range>100</range>
+        <linear>0.01</linear>
+        <constant>0.2</constant>
+        <quadratic>0.0</quadratic>
+      </attenuation>
+      <direction>0 0 -1</direction>
+      <cast_shadows>true</cast_shadows>
+    </light>
+  </world>
+</sdf>
diff --git a/worlds/mud.world b/worlds/mud.world
new file mode 100644
index 0000000..7224c2b
--- /dev/null
+++ b/worlds/mud.world
@@ -0,0 +1,111 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_thick_mud</name>
+      <pose>-2.0 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_thin_mud</name>
+      <pose>0 0 0 0 0 0</pose>
+    </include>
+    <include>
+      <uri>model://double_pendulum_with_base</uri>
+      <name>pendulum_no_mud</name>
+      <pose>2.0 0 0 0 0 0</pose>
+    </include>
+    <model name="mud_pit_thin">
+      <pose>0 -1.0 0.7 0 0 0</pose>
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>5 1 0.2</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <collide_without_contact>true</collide_without_contact>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>5 1 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+        <sensor name="mud_contact" type="contact">
+          <always_on>true</always_on>
+          <update_rate>1000</update_rate>
+          <contact>
+            <collision>collision</collision>
+          </contact>
+        </sensor>
+      </link>
+      <plugin name="gazebo_mud" filename="libMudPlugin.so">
+        <contact_sensor_name>link/mud_contact</contact_sensor_name>
+        <stiffness>0.0</stiffness>
+        <damping>1.0</damping>
+        <link_name>pendulum_thin_mud::lower_link</link_name>
+        <link_name>pendulum_thick_mud::lower_link</link_name>
+      </plugin>
+    </model>
+    <model name="mud_pit_thick">
+      <pose>0.0 -1.0 1.0 0 0 0</pose>
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>5 1 0.2</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <collide_without_contact>true</collide_without_contact>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>5 1 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+        <sensor name="mud_contact" type="contact">
+          <always_on>true</always_on>
+          <update_rate>1000</update_rate>
+          <contact>
+            <collision>collision</collision>
+          </contact>
+        </sensor>
+      </link>
+      <plugin name="gazebo_mud" filename="libMudPlugin.so">
+        <contact_sensor_name>link/mud_contact</contact_sensor_name>
+        <stiffness>0.0</stiffness>
+        <damping>10.0</damping>
+        <link_name>pendulum_thick_mud::lower_link</link_name>
+      </plugin>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/mud_bitmask.world b/worlds/mud_bitmask.world
new file mode 100644
index 0000000..4ecb828
--- /dev/null
+++ b/worlds/mud_bitmask.world
@@ -0,0 +1,59 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://pr2</uri>
+      <name>pr2_mud</name>
+      <pose>0.0 0 0 0 0 0</pose>
+    </include>
+    <model name="mud_pit">
+      <pose>0 0.0 0.5 0 0 0</pose>
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>5 1 1</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <collide_without_contact>true</collide_without_contact>
+              <collide_without_contact_bitmask>2</collide_without_contact_bitmask>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>5 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+        <sensor name="mud_contact" type="contact">
+          <always_on>true</always_on>
+          <update_rate>1000</update_rate>
+          <contact>
+            <collision>collision</collision>
+          </contact>
+        </sensor>
+      </link>
+      <plugin name="gazebo_mud" filename="libMudPlugin.so">
+        <contact_sensor_name>link/mud_contact</contact_sensor_name>
+        <stiffness>0.0</stiffness>
+        <damping>1.0</damping>
+        <link_name>pr2_mud::r_gripper_l_finger_link</link_name>
+      </plugin>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/multilink_shape.world b/worlds/multilink_shape.world
new file mode 100644
index 0000000..2c23e37
--- /dev/null
+++ b/worlds/multilink_shape.world
@@ -0,0 +1,60 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0 0 0</gravity>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="multilink">
+      <pose>0 0 0.5 0 0 0</pose>
+      <link name="box_link">
+        <pose>1 0 0 0 0 0</pose>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Grey</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+      <link name="sphere_link">
+        <pose>-1.5 0 0 0 0 1.57</pose>
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Red</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/openal.world b/worlds/openal.world
new file mode 100644
index 0000000..ab81c35
--- /dev/null
+++ b/worlds/openal.world
@@ -0,0 +1,68 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <audio>
+      <device>default</device>
+    </audio>
+    <model name="box">
+      <pose>0 0 10.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+        <audio_source>
+          <uri>file://media/audio/cheer.mp3</uri>
+          <pitch>2.0</pitch>
+          <gain>1.0</gain>
+          <loop>false</loop>
+          <contact>
+            <collision>collision</collision>
+          </contact>
+        </audio_source>
+      </link>
+    </model>
+    <model name="sphere">
+      <pose>0 1.5 0.5 0 0 0</pose>
+      <link name="link">
+        <audio_sink />
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/pioneer2dx.world b/worlds/pioneer2dx.world
new file mode 100644
index 0000000..1d02337
--- /dev/null
+++ b/worlds/pioneer2dx.world
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- Ground -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- Pioneer2dx model -->
+    <include>
+      <uri>model://pioneer2dx</uri>
+      <pose>0 0 0 0 0 0</pose>
+    </include>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/plane_demo.world b/worlds/plane_demo.world
new file mode 100644
index 0000000..5806947
--- /dev/null
+++ b/worlds/plane_demo.world
@@ -0,0 +1,887 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <gui>
+      <camera name="user_camera">
+        <pose>10 0 3 0 0 3.141592</pose>
+      </camera>
+    </gui>
+    <physics type="ode">
+      <gravity>0.0 0.0 -10.00</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>100</iters>
+          <sor>0.8</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>0.1</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+<!--
+    <include>
+      <uri>model://drc_terrain</uri>
+    </include>
+-->
+
+    <model name="ground_plane">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>10000 10000</size>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <cast_shadows>false</cast_shadows>
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>10000 10000</size>
+            </plane>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/WoodFloor</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+
+    <model name="lift_drag_demo_model">
+      <pose>0 0 0 0 0 0</pose>
+      <static>false</static>
+      <link name="body">
+        <pose>5.0 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>-1.5 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>5.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>10.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>10.8</izz>
+          </inertia>
+          <mass>200.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>10 1 1</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.3</mu>
+                <mu2>0.3</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>10 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+        <sensor name="camera" type="camera">
+          <pose>15 0 1.0 0 0.1 3.1416</pose>
+          <camera>
+            <horizontal_fov>1.347</horizontal_fov>
+            <image>
+              <width>320</width>
+              <height>240</height>
+            </image>
+            <clip>
+              <near>0.1</near>
+              <far>1000</far>
+            </clip>
+          </camera>
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+      <link name="wheel_1">
+        <pose>9.0 0 0.25 1.57079 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.25</radius>
+              <length>0.03</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.3</mu>
+                <mu2>0.3</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.25</radius>
+              <length>0.03</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="wheel_2">
+        <pose>1.0 -2.0 0.25 1.57079 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.25</radius>
+              <length>0.03</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.3</mu>
+                <mu2>0.3</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.25</radius>
+              <length>0.03</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="wheel_3">
+        <pose>1.0 2.0 0.25 1.57079 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.25</radius>
+              <length>0.03</length>
+            </cylinder>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.3</mu>
+                <mu2>0.3</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.25</radius>
+              <length>0.03</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="rod_1">
+        <pose>-0.25 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.25 0.02 0.02</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.25 0.02 0.02</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_1">
+        <pose>-0.25 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.01 1.0 0.2</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.01 1.0 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_2">
+        <pose>-0.25 0 1.5 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.01 1.0 0.2</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.01 1.0 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="wheel_1_joint" type="revolute">
+        <parent>body</parent>
+        <child>wheel_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="wheel_2_joint" type="revolute">
+        <parent>body</parent>
+        <child>wheel_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="wheel_3_joint" type="revolute">
+        <parent>body</parent>
+        <child>wheel_3</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="rod_1_joint" type="revolute">
+        <parent>body</parent>
+        <child>rod_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>-1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_1_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_2_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>-1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+
+
+
+      <link name="wing_1">
+        <pose>3 0 1.5 0.3 0 0</pose>
+        <inertial>
+          <pose>0.0 5.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.470</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 5.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.0 10.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 5.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.0 10.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="wing_2">
+        <pose>3 0 1.5 -0.3 0 0</pose>
+        <inertial>
+          <pose>0.0 -5.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.470</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 -5.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.0 10.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 -5.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>1.0 10.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="wing_1_joint" type="revolute">
+        <parent>body</parent>
+        <child>wing_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="wing_2_joint" type="revolute">
+        <parent>body</parent>
+        <child>wing_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 -1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+
+      <link name="wing_3">
+        <pose>9 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 2.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0470</izz>
+          </inertia>
+          <mass>2.0</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 2.0 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.0 3.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 2.0 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.0 3.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="wing_4">
+        <pose>9 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 -2.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0470</izz>
+          </inertia>
+          <mass>2.0</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 -2.0 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.0 3.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 -2.0 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>1.0 3.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="wing_3_joint" type="revolute">
+        <parent>body</parent>
+        <child>wing_3</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="wing_4_joint" type="revolute">
+        <parent>body</parent>
+        <child>wing_4</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 -1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+      <joint name="wing_5_joint" type="revolute">
+        <parent>body</parent>
+        <child>wing_5</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+      <link name="wing_5">
+        <pose>9 0 2.0 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0 1 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0470</izz>
+          </inertia>
+          <mass>2.0</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0 1 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>1.5 0.01 2.0</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0 1 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>1.5 0.01 2.0</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+
+      <plugin name="gazebo_blade_1" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>10.000</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <alpha_stall>10.0</alpha_stall>
+        <cla_stall>0.0</cla_stall>
+        <cda_stall>0.01</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>0 0 -1</forward>
+        <upward>-1 0 0</upward>
+        <link_name>lift_drag_demo_model::blade_1</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_2" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>10.000</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <alpha_stall>10.0</alpha_stall>
+        <cla_stall>0.0</cla_stall>
+        <cda_stall>0.01</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <!-- link flipped about z-axis 180 degrees -->
+        <forward>0 0 1</forward>
+        <upward>1 0 0</upward>
+        <link_name>lift_drag_demo_model::blade_2</link_name>
+      </plugin>
+      <plugin name="gazebo_wing_1" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>4.000</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <alpha_stall>10.0</alpha_stall>
+        <cla_stall>0.0</cla_stall>
+        <cda_stall>0.01</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 5.0 0</cp>
+        <area>10</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::wing_1</link_name>
+      </plugin>
+      <plugin name="gazebo_wing_2" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>4.000</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <alpha_stall>10.0</alpha_stall>
+        <cla_stall>0.0</cla_stall>
+        <cda_stall>0.01</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 -5.0 0</cp>
+        <area>10</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::wing_2</link_name>
+      </plugin>
+      <plugin name="gazebo_wing_3" filename="libLiftDragPlugin.so">
+        <a0>0.02</a0>
+        <cla>4.000</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <alpha_stall>10.0</alpha_stall>
+        <cla_stall>0.0</cla_stall>
+        <cda_stall>0.01</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 1.5 0</cp>
+        <area>3</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::wing_3</link_name>
+      </plugin>
+      <plugin name="gazebo_wing_4" filename="libLiftDragPlugin.so">
+        <a0>0.02</a0>
+        <cla>4.000</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <alpha_stall>10.0</alpha_stall>
+        <cla_stall>0.0</cla_stall>
+        <cda_stall>0.01</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 -1.5 0</cp>
+        <area>3</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::wing_4</link_name>
+      </plugin>
+      <plugin name="gazebo_wing_5" filename="libLiftDragPlugin.so">
+        <!-- force turn -->
+        <a0>0.0</a0>
+        <cla>8.000</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <alpha_stall>10.0</alpha_stall>
+        <cla_stall>0.0</cla_stall>
+        <cda_stall>0.01</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0 1.0</cp>
+        <area>3</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 -1 0</upward>
+        <link_name>lift_drag_demo_model::wing_5</link_name>
+      </plugin>
+
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/plugin.world b/worlds/plugin.world
new file mode 100644
index 0000000..f05ad8e
--- /dev/null
+++ b/worlds/plugin.world
@@ -0,0 +1,54 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <plugin name="world_edit" filename="libworld_edit.so" />
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="box_model">
+      <pose>0 0 0.5 0 0 0</pose>
+      <link name="body">
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="geom">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0</mu>
+                <mu2>0</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+      <plugin name="my_plugin" filename="libmodel_push.so" />
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/pr2.world b/worlds/pr2.world
new file mode 100644
index 0000000..bd2dfde
--- /dev/null
+++ b/worlds/pr2.world
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://pr2</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/presentation.world b/worlds/presentation.world
new file mode 100644
index 0000000..7ae9e0c
--- /dev/null
+++ b/worlds/presentation.world
@@ -0,0 +1,602 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <scene>
+      <ambient>0.1 0.1 0.1 1</ambient>
+      <background>1 1 1 1</background>
+      <shadows>false</shadows>
+      <grid>false</grid>
+    </scene>
+    <!--<gui fullscreen="true">
+      <camera name="user_camera">
+        <view_controller type="orbit"/>
+        <pose pose="0 0 5 0 -1.5707 0"/>
+      </camera>
+    </gui>
+    -->
+    <physics type="ode">
+      <gravity>0 0 -9.8</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>10</iters>
+          <sor>1.3</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>100.0</contact_max_correcting_vel>
+          <contact_surface_layer>0.001</contact_surface_layer>
+        </constraints>
+      </ode>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <!-- Ground Plane -->
+    <model name="plane1_model">
+      <link name="body">
+        <collision name="geom_1">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+            </plane>
+          </geometry>
+        </collision>
+        <visual name="visual_1">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+            </plane>
+          </geometry>
+          <material>
+            <script>Gazebo/Grey</script>
+          </material>
+          <cast_shadows>false</cast_shadows>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide1">
+      <pose>0 0 0 0 0 0</pose>
+      <link name="link">
+        <pose>0 0 0.1 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>3 4 0.2</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>3 4 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide1</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide2">
+      <pose>1 0 0.201 0 0 0</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide2</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide3">
+      <pose>0.95 -0.05 0.201 0 0 -1.5707</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide3</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide4">
+      <pose>0.95 -0.07 0.201 0 0 -1.5707</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide4</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide5">
+      <pose>0.95 -0.09 0.201 0 0 -1.5707</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide5</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide6">
+      <pose>0.95 -0.11 0.201 0 0 -1.5707</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide6</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide7">
+      <pose>0.91 -0.11 0.2011 0 0 -1.5707</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide7</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide8">
+      <pose>10 10 0 0 0 0</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>3 4 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>3 4 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide8</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide9">
+      <pose>10.2 9.78 0.005 0 0 0</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide9</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide10">
+      <pose>10.20 9.74 0.005 0 0 0</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide10</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide11">
+      <pose>9.93 9.07 0.005 0 0 0</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide11</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide12">
+      <pose>9.69 8.21 0.005 0 0 0</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide12</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide13">
+      <pose>9.43 8.93 0.005 0 0 0</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>.03 .04 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide13</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide14">
+      <pose>7 14 0.005 0 0 1.5707</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>3 4 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>3 4 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide14</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="slide15">
+      <pose>3 10 0.005 0 0 3.1415</pose>
+      <link name="link">
+        <pose>0 0 0.0005 0 0 0</pose>
+        <inertial>
+          <inertia>
+            <ixx>1</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>1</iyy>
+            <iyz>0</iyz>
+            <izz>1</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="c">
+          <geometry>
+            <box>
+              <size>3 4 0.001</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="v">
+          <geometry>
+            <box>
+              <size>3 4 0.001</size>
+            </box>
+          </geometry>
+          <material>
+            <script>nate/slide15</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+    <!--
+    <light type="point" name="point_light" cast_shadows="false">
+      <pose pose="-5 -2 5 0 0 0"/>
+      <diffuse rgba=".4 .4 .4 1"/>
+      <specular rgba=".2 .2 .2 1"/>
+      <attenuation range="20" constant="0.9" linear="0.01" quadratic="0.001"/>
+    </light>
+    -->
+    <light type="directional" name="my_light">
+      <pose>0 0 10 0 0 0</pose>
+      <diffuse>.9 .9 .9 1</diffuse>
+      <specular>.1 .1 .1 1</specular>
+      <attenuation>
+        <range>20</range>
+      </attenuation>
+      <direction>0 0 -1</direction>
+      <cast_shadows>false</cast_shadows>
+    </light>
+  </world>
+</sdf>
diff --git a/worlds/pressure_sensor.world b/worlds/pressure_sensor.world
new file mode 100644
index 0000000..6a27ec9
--- /dev/null
+++ b/worlds/pressure_sensor.world
@@ -0,0 +1,160 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="pressure_sensor_test">
+      <link name="base">
+        <pose>0 0 0.012 0 0 0</pose>
+        <collision name="base_collision">
+          <geometry>
+            <box>
+              <size>1 1 0.2</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="base_visual">
+          <geometry>
+            <box>
+              <size>1 1 0.2</size>
+            </box>
+          </geometry>
+          <transparency>0.5</transparency>
+        </visual>
+        <collision name="pressure_pad_1">
+          <pose>0.45 0.45 -0.1 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.1 0.02</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <kp>100000</kp>
+                <kd>1</kd>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <collision name="pressure_pad_2">
+          <pose>0.45 -0.45 -0.1 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.1 0.02</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <kp>100000</kp>
+                <kd>1</kd>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <collision name="pressure_pad_3">
+          <pose>-0.45 0.45 -0.1 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.05 0.02</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <kp>100000</kp>
+                <kd>1</kd>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <collision name="pressure_pad_4">
+          <pose>-0.45 -0.45 -0.1 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.05 0.02</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <kp>100000</kp>
+                <kd>1</kd>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="pressure_pad_1">
+          <pose>0.45 0.45 -0.1 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.1 0.02</size>
+            </box>
+          </geometry>
+        </visual>
+        <visual name="pressure_pad_2">
+          <pose>0.45 -0.45 -0.1 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1 0.1 0.02</size>
+            </box>
+          </geometry>
+        </visual>
+        <visual name="pressure_pad_3">
+          <pose>-0.45 0.45 -0.1 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.05 0.02</size>
+            </box>
+          </geometry>
+        </visual>
+        <visual name="pressure_pad_4">
+          <pose>-0.45 -0.45 -0.1 0 0 0</pose>
+          <geometry>
+            <box>
+              <size>0.05 0.05 0.02</size>
+            </box>
+          </geometry>
+        </visual>
+        <sensor name="my_contact" type="contact">
+          <contact>
+            <collision>pressure_pad_1</collision>
+            <collision>pressure_pad_2</collision>
+            <collision>pressure_pad_3</collision>
+            <collision>pressure_pad_4</collision>
+          </contact>
+          <plugin name="my_plugin" filename="libPressurePlugin.so" />
+        </sensor>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/projector.world b/worlds/projector.world
new file mode 100644
index 0000000..bda1009
--- /dev/null
+++ b/worlds/projector.world
@@ -0,0 +1,64 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="projector_model">
+      <pose>0 0 1 0.0 0.0 0</pose>
+      <link name="projector_link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/Grey</script>
+          </material>
+        </visual>
+        <projector name="texture_projector">
+          <pose>0 0 0 0 -1.5707 0</pose>
+          <texture>stereo_projection_pattern_high_res_red.png</texture>
+          <fov>0.959931088597</fov>
+          <near_clip>0.1</near_clip>
+          <far_clip>10</far_clip>
+        </projector>
+      </link>
+      <static>true</static>
+    </model>
+    <model name="texture_test_model">
+      <pose>3 0 1 0.0 0.0 0</pose>
+      <link name="texture_test_link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/Grey</script>
+          </material>
+        </visual>
+      </link>
+      <static>true</static>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/quad_rotor_demo.world b/worlds/quad_rotor_demo.world
new file mode 100644
index 0000000..7fe86b6
--- /dev/null
+++ b/worlds/quad_rotor_demo.world
@@ -0,0 +1,1038 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0.0 0.0 -10.0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>50</iters>
+          <sor>0.8</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>0.1</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <model name="ground_plane">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>1000 1000</size>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <cast_shadows>false</cast_shadows>
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>1000 1000</size>
+            </plane>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Grey</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+
+    <model name="lift_drag_demo_model">
+      <pose>0 0 0 0 0 0</pose>
+      <static>false</static>
+      <link name="body_1">
+        <pose>1.75 0 0.1 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>10.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>10.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>3.6 0.2 0.2</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.1</mu>
+                <mu2>0.1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>3.6 0.2 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+        <sensor name='imu_sensor' type='imu'>
+          <always_on>1</always_on>
+          <update_rate>1000</update_rate>
+          <imu>
+            <noise>
+              <type>gaussian</type>
+              <rate>
+                <mean>0</mean>
+                <stddev>0.0002</stddev>
+                <bias_mean>7.5e-06</bias_mean>
+                <bias_stddev>8e-07</bias_stddev>
+              </rate>
+              <accel>
+                <mean>0</mean>
+                <stddev>0.017</stddev>
+                <bias_mean>0.1</bias_mean>
+                <bias_stddev>0.001</bias_stddev>
+              </accel>
+            </noise>
+          </imu>
+          <pose>0 0 0 0 0 0</pose>
+        </sensor>
+      </link>
+      <link name="rod_1">
+        <pose>0 0 0.24 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_1">
+        <pose>0 0 0.28 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_2">
+        <pose>0 0 0.28 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_1_joint" type="revolute">
+        <parent>body_1</parent>
+        <child>rod_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 -1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_1_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_2_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>-1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+      <link name="rod_2">
+        <pose>3.5 0 0.24 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_3">
+        <pose>3.5 0 0.28 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_4">
+        <pose>3.5 0 0.28 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_2_joint" type="revolute">
+        <parent>body_1</parent>
+        <child>rod_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_3_joint" type="revolute">
+        <parent>rod_2</parent>
+        <child>blade_3</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_4_joint" type="revolute">
+        <parent>rod_2</parent>
+        <child>blade_4</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>-1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <!-- -->
+      <joint name="gear_joint_1" type="gearbox">
+          <parent>rod_1</parent>
+          <child>rod_2</child>
+          <gearbox_ratio>-1.0</gearbox_ratio>
+          <gearbox_reference_body>body_1</gearbox_reference_body>
+          <axis>
+            <xyz>0.000000 0.000000 -1.000000</xyz>
+          </axis>
+          <axis2>
+            <xyz>0.000000 0.000000 1.000000</xyz>
+          </axis2>
+      </joint>
+
+      <plugin name="gazebo_blade_1" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_1</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_2" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_2</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_3" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_3</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_4" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_4</link_name>
+      </plugin>
+
+
+
+      <link name="body_2">
+        <pose>1.75 0 0.1 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>10.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>10.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.2 3.6 0.2</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.1</mu>
+                <mu2>0.1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.2 3.6 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="rod_3">
+        <pose>1.75 -1.75 0.24 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_5">
+        <pose>1.75 -1.75 0.28 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_6">
+        <pose>1.75 -1.75 0.28 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_3_joint" type="revolute">
+        <parent>body_2</parent>
+        <child>rod_3</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 -1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_5_joint" type="revolute">
+        <parent>rod_3</parent>
+        <child>blade_5</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_6_joint" type="revolute">
+        <parent>rod_3</parent>
+        <child>blade_6</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>-1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+      <link name="rod_4">
+        <pose>1.75 1.75 0.24 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_7">
+        <pose>1.75 1.75 0.28 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_8">
+        <pose>1.75 1.75 0.28 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="body_joint" type="revolute">
+        <parent>body_1</parent>
+        <child>body_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="rod_4_joint" type="revolute">
+        <parent>body_2</parent>
+        <child>rod_4</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_7_joint" type="revolute">
+        <parent>rod_4</parent>
+        <child>blade_7</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_8_joint" type="revolute">
+        <parent>rod_4</parent>
+        <child>blade_8</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>-1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <!-- -->
+      <joint name="gear_joint_2" type="gearbox">
+          <parent>rod_3</parent>
+          <child>rod_4</child>
+          <gearbox_ratio>-1.0</gearbox_ratio>
+          <gearbox_reference_body>body_2</gearbox_reference_body>
+          <axis>
+            <xyz>0.000000 0.000000 -1.000000</xyz>
+          </axis>
+          <axis2>
+            <xyz>0.000000 0.000000 1.000000</xyz>
+          </axis2>
+      </joint>
+
+      <plugin name="gazebo_blade_5" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_5</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_6" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_6</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_7" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_7</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_8" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_8</link_name>
+      </plugin>
+
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/quad_rotor_demo_2.world b/worlds/quad_rotor_demo_2.world
new file mode 100644
index 0000000..b15f403
--- /dev/null
+++ b/worlds/quad_rotor_demo_2.world
@@ -0,0 +1,1038 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0.0 0.0 -10.0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>50</iters>
+          <sor>0.8</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>0.1</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+
+    <model name="ground_plane">
+      <static>true</static>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>1000 1000</size>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>1</mu>
+                <mu2>1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <cast_shadows>false</cast_shadows>
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+              <size>1000 1000</size>
+            </plane>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Grey</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+
+    <model name="lift_drag_demo_model">
+      <pose>0 0 0 0 0 0</pose>
+      <static>false</static>
+      <link name="body_1">
+        <pose>1.75 0 0.1 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>10.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>10.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>3.6 0.2 0.2</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.1</mu>
+                <mu2>0.1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>3.6 0.2 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+        <sensor name='imu_sensor' type='imu'>
+          <always_on>1</always_on>
+          <update_rate>1000</update_rate>
+          <imu>
+            <noise>
+              <type>gaussian</type>
+              <rate>
+                <mean>0</mean>
+                <stddev>0.0002</stddev>
+                <bias_mean>7.5e-06</bias_mean>
+                <bias_stddev>8e-07</bias_stddev>
+              </rate>
+              <accel>
+                <mean>0</mean>
+                <stddev>0.017</stddev>
+                <bias_mean>0.1</bias_mean>
+                <bias_stddev>0.001</bias_stddev>
+              </accel>
+            </noise>
+          </imu>
+          <pose>0 0 0 0 0 0</pose>
+        </sensor>
+      </link>
+      <link name="rod_1">
+        <pose>0 0 0.24 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_1">
+        <pose>0 0 0.28 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_2">
+        <pose>0 0 0.28 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_1_joint" type="revolute">
+        <parent>body_1</parent>
+        <child>rod_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 -1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_1_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_2_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>-1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+      <link name="rod_2">
+        <pose>3.5 0 0.24 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_3">
+        <pose>3.5 0 0.28 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_4">
+        <pose>3.5 0 0.28 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_2_joint" type="revolute">
+        <parent>body_1</parent>
+        <child>rod_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_3_joint" type="revolute">
+        <parent>rod_2</parent>
+        <child>blade_3</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_4_joint" type="revolute">
+        <parent>rod_2</parent>
+        <child>blade_4</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <!-- -->
+      <joint name="gear_joint_1" type="gearbox">
+          <parent>rod_1</parent>
+          <child>rod_2</child>
+          <gearbox_ratio>1.0</gearbox_ratio>
+          <gearbox_reference_body>body_1</gearbox_reference_body>
+          <axis>
+            <xyz>0.000000 0.000000 1.000000</xyz>
+          </axis>
+          <axis2>
+            <xyz>0.000000 0.000000 1.000000</xyz>
+          </axis2>
+      </joint>
+
+      <plugin name="gazebo_blade_1" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_1</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_2" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_2</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_3" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_3</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_4" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_4</link_name>
+      </plugin>
+
+
+
+      <link name="body_2">
+        <pose>1.75 0 0.1 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>10.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>10.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.2 3.6 0.2</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.1</mu>
+                <mu2>0.1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.2 3.6 0.2</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="rod_3">
+        <pose>1.75 -1.75 0.24 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_5">
+        <pose>1.75 -1.75 0.28 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_6">
+        <pose>1.75 -1.75 0.28 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_3_joint" type="revolute">
+        <parent>body_2</parent>
+        <child>rod_3</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_5_joint" type="revolute">
+        <parent>rod_3</parent>
+        <child>blade_5</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_6_joint" type="revolute">
+        <parent>rod_3</parent>
+        <child>blade_6</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>-1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+
+      <link name="rod_4">
+        <pose>1.75 1.75 0.24 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.08</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_7">
+        <pose>1.75 1.75 0.28 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_8">
+        <pose>1.75 1.75 0.28 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.25 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="body_joint" type="revolute">
+        <parent>body_1</parent>
+        <child>body_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="rod_4_joint" type="revolute">
+        <parent>body_2</parent>
+        <child>rod_4</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_7_joint" type="revolute">
+        <parent>rod_4</parent>
+        <child>blade_7</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_8_joint" type="revolute">
+        <parent>rod_4</parent>
+        <child>blade_8</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>-1.0 0.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <limit>
+              <cfm>0.004</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <!-- -->
+      <joint name="gear_joint_2" type="gearbox">
+          <parent>rod_3</parent>
+          <child>rod_4</child>
+          <gearbox_ratio>-1.0</gearbox_ratio>
+          <gearbox_reference_body>body_2</gearbox_reference_body>
+          <axis>
+            <xyz>0.000000 0.000000 1.000000</xyz>
+          </axis>
+          <axis2>
+            <xyz>0.000000 0.000000 1.000000</xyz>
+          </axis2>
+      </joint>
+
+      <plugin name="gazebo_blade_5" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_5</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_6" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_6</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_7" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_7</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_8" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.01</cda>
+        <cma>0.00</cma>
+        <alpha_stall>0.2</alpha_stall>
+        <cla_stall>-0.2</cla_stall>
+        <cda_stall>1.0</cda_stall>
+        <cma_stall>0.0</cma_stall>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_8</link_name>
+      </plugin>
+
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/ray_cpu.world b/worlds/ray_cpu.world
new file mode 100644
index 0000000..627e0d2
--- /dev/null
+++ b/worlds/ray_cpu.world
@@ -0,0 +1,63 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <model name="velodyne">
+      <pose>0 0 0.1 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.2 0.2 0.2</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.2 0.2 0.2</size>
+            </box>
+          </geometry>
+        </visual>
+        <sensor name="laser" type="ray">
+          <pose>0.01 0 0.0175 0 -0 0</pose>
+          <ray>
+            <scan>
+              <horizontal>
+                <samples>640</samples>
+                <resolution>1</resolution>
+                <min_angle>-2.26889</min_angle>
+                <max_angle>2.268899</max_angle>
+              </horizontal>
+              <vertical>
+                <samples>32</samples>
+                <resolution>1</resolution>
+                <min_angle>-0.535</min_angle>
+                <max_angle>0.186132</max_angle>
+              </vertical>
+            </scan>
+            <range>
+              <min>0.1</min>
+              <max>10</max>
+              <resolution>0.01</resolution>
+            </range>
+          </ray>
+          <plugin name="laser" filename="libRayPlugin.so" />
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/ray_noise_plugin.world b/worlds/ray_noise_plugin.world
new file mode 100644
index 0000000..e82f58f
--- /dev/null
+++ b/worlds/ray_noise_plugin.world
@@ -0,0 +1,60 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <model name="noisy_ray">
+      <pose>0 0 0.1 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.2 0.2 0.2</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.2 0.2 0.2</size>
+            </box>
+          </geometry>
+        </visual>
+        <sensor name="laser" type="ray">
+          <pose>0.1 0 0.0175 0 -0 0</pose>
+          <ray>
+            <scan>
+              <horizontal>
+                <samples>640</samples>
+                <resolution>1</resolution>
+                <min_angle>-1.26889</min_angle>
+                <max_angle>1.268899</max_angle>
+              </horizontal>
+            </scan>
+            <range>
+              <min>0.1</min>
+              <max>10</max>
+              <resolution>0.01</resolution>
+            </range>
+            <noise>
+              <type>custom</type>
+            </noise>
+          </ray>
+          <plugin name="laser" filename="libRaySensorNoisePlugin.so" />
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/road.world b/worlds/road.world
new file mode 100644
index 0000000..50a3729
--- /dev/null
+++ b/worlds/road.world
@@ -0,0 +1,38 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <scene>
+      <grid>false</grid>
+    </scene>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- Invisible ground plane -->
+    <model name="ground">
+      <link name="body">
+        <collision name="geom">
+          <geometry>
+            <plane>
+              <normal>0 0 1</normal>
+            </plane>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>100</mu>
+                <mu2>50</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+      </link>
+      <static>true</static>
+    </model>
+    <road name="my_road">
+      <width>7.34</width>
+      <point>0 0 0</point>
+      <point>100 0 0</point>
+    </road>
+  </world>
+</sdf>
diff --git a/worlds/robocup09_spl_field.world b/worlds/robocup09_spl_field.world
new file mode 100644
index 0000000..0c9660d
--- /dev/null
+++ b/worlds/robocup09_spl_field.world
@@ -0,0 +1,22 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- RoboCup SPL 2009 field -->
+    <include>
+      <uri>model://robocup09_spl_field</uri>
+    </include>
+    <!-- RoboCup SPL ball -->
+    <include>
+      <pose>0 0 0 0 0 0</pose>
+      <uri>model://robocup_spl_ball</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/robocup14_spl_field.world b/worlds/robocup14_spl_field.world
new file mode 100644
index 0000000..83ef6ee
--- /dev/null
+++ b/worlds/robocup14_spl_field.world
@@ -0,0 +1,32 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- RoboCup SPL 2014 field -->
+    <include>
+      <uri>model://robocup14_spl_field</uri>
+    </include>
+    <!-- RoboCup SPL 2014 left goal -->
+    <include>
+      <pose>-4.5 0 0 0 0 3.1416</pose>
+      <uri>model://robocup14_spl_goal</uri>
+    </include>
+    <!-- RoboCup SPL 2014 right goal -->
+    <include>
+      <pose>4.5 0 0 0 0 0</pose>
+      <uri>model://robocup14_spl_goal</uri>
+    </include>
+    <!-- RoboCup SPL ball -->
+    <include>
+      <pose>0 0 0 0 0 0</pose>
+      <uri>model://robocup_spl_ball</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/robocup_3Dsim.world b/worlds/robocup_3Dsim.world
new file mode 100644
index 0000000..c158d5c
--- /dev/null
+++ b/worlds/robocup_3Dsim.world
@@ -0,0 +1,36 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- Remove the grid -->
+    <scene>
+      <grid>false</grid>
+    </scene>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- RoboCup 3D simulator field -->
+    <include>
+      <uri>model://robocup_3Dsim_field</uri>
+    </include>
+    <!-- RoboCup 3D simulator left goal -->
+    <include>
+      <pose>-15.0 0 0 0 0 3.1416</pose>
+      <uri>model://robocup_3Dsim_goal</uri>
+    </include>
+    <!-- RoboCup 3D simulator right goal -->
+    <include>
+      <pose>15.0 0 0 0 0 0</pose>
+      <uri>model://robocup_3Dsim_goal</uri>
+    </include>
+    <!-- RoboCup 3D simulator ball -->
+    <include>
+      <pose>0 0 0 0 0 0</pose>
+      <uri>model://robocup_3Dsim_ball</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/rubble.world b/worlds/rubble.world
new file mode 100644
index 0000000..ead700c
--- /dev/null
+++ b/worlds/rubble.world
@@ -0,0 +1,74 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <plugin filename="libRubblePlugin.so" name="rubble">
+      <bottom_right>-.5 -1 0.0</bottom_right>
+      <top_left>0.5 1.0 0.4</top_left>
+      <min_size>0.05 0.05 0.05</min_size>
+      <max_size>0.2 0.2 0.2</max_size>
+      <min_mass>0.1</min_mass>
+      <max_mass>1.0</max_mass>
+      <count>100</count>
+    </plugin>
+    <model name="right_wall">
+      <static>true</static>
+      <pose>0 -1.1 0.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>5 0.2 1.0</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>5 0.2 1.0</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Wood</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="left_wall">
+      <static>true</static>
+      <pose>0 1.1 0.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>5 0.2 1.0</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>5 0.2 1.0</size>
+            </box>
+          </geometry>
+          <material>
+            <script>
+              <uri>file://media/materials/scripts/gazebo.material</uri>
+              <name>Gazebo/Wood</name>
+            </script>
+          </material>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/shapes.world b/worlds/shapes.world
new file mode 100644
index 0000000..e8fc08b
--- /dev/null
+++ b/worlds/shapes.world
@@ -0,0 +1,79 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="box">
+      <pose>0 0 0.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere">
+      <pose>0 1.5 0.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="cylinder">
+      <pose>0 -1.5 0.5 0 1.5707 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.5</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.5</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/simple_arm.world b/worlds/simple_arm.world
new file mode 100644
index 0000000..bce511f
--- /dev/null
+++ b/worlds/simple_arm.world
@@ -0,0 +1,17 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+
+    <include>
+      <uri>model://simple_arm</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/simple_gripper.world b/worlds/simple_gripper.world
new file mode 100644
index 0000000..b0c2cec
--- /dev/null
+++ b/worlds/simple_gripper.world
@@ -0,0 +1,47 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+
+    <include>
+      <uri>model://simple_arm</uri>
+    </include>
+    <model name="cylinder">
+      <pose>1.0 1.0 0 0 0 0</pose>
+      <link name="base">
+        <visual name="cylinder_visual">
+          <geometry>
+            <cylinder>
+              <radius>0.15</radius>
+              <length>0.25</length>
+            </cylinder>
+          </geometry>
+        </visual>
+        <collision name="cylinder_collision">
+          <geometry>
+            <cylinder>
+              <radius>0.15</radius>
+              <length>0.25</length>
+            </cylinder>
+          </geometry>
+        </collision>
+      </link>
+    </model>
+    <include>
+      <pose>0.35 0.35 0.5 0 0 0.7071</pose>
+      <uri>model://camera</uri>
+    </include>
+
+    <include>
+      <pose>0.45 0.45 0.3 0 0 0.7071</pose>
+      <uri>model://hokuyo</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/single_rotor_demo.world b/worlds/single_rotor_demo.world
new file mode 100644
index 0000000..af1b572
--- /dev/null
+++ b/worlds/single_rotor_demo.world
@@ -0,0 +1,291 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0.0 0.0 -10.0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>50</iters>
+          <sor>0.8</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>0.1</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+
+    <model name="lift_drag_demo_model">
+      <pose>0 0 0 0 0 0</pose>
+      <static>false</static>
+      <link name="body">
+        <pose>0.0 0 0.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>1.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.1</mu>
+                <mu2>0.1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="rod_1">
+        <pose>0 0 1.25 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_1">
+        <pose>0 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_2">
+        <pose>0 0 1.5 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_1_joint" type="revolute">
+        <parent>body</parent>
+        <child>rod_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 -1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_1_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_2_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 -1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <!--
+      <joint name="gear_joint" type="gearbox">
+          <parent>blade_1</parent>
+          <child>blade_2</child>
+          <gearbox_ratio>-1.0</gearbox_ratio>
+          <gearbox_reference_body>rod_1</gearbox_reference_body>
+          <axis>
+            <xyz>0.000000 1.000000 0.000000</xyz>
+          </axis>
+          <axis2>
+            <xyz>0.000000 -1.000000 0.000000</xyz>
+          </axis2>
+      </joint>
+      -->
+
+      <plugin name="gazebo_blade_1" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_1</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_2" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_2</link_name>
+      </plugin>
+      <!-- drag for body
+      <plugin name="gazebo_body_1" filename="libLiftDragPlugin.so">
+        <a0>0.0</a0>
+        <cla>0.000</cla>
+        <cda>1.000</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0 0</cp>
+        <area>1.0</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_4</link_name>
+      </plugin>
+      -->
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/sonar_demo.world b/worlds/sonar_demo.world
new file mode 100644
index 0000000..b66c9d5
--- /dev/null
+++ b/worlds/sonar_demo.world
@@ -0,0 +1,52 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <model name="box">
+      <pose>0 2 0.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sonar_model">
+      <pose>0 0 -0.8 0 0 0</pose>
+      <static>false</static>
+      <link name="link">
+        <pose>0 0 1.5 0 0 0</pose>
+        <gravity>false</gravity>
+        <sensor name="sonar" type="sonar">
+          <pose>0 0 0 0 -1.5707 1.5707</pose>
+          <sonar>
+            <min>0</min>
+            <max>2.00</max>
+            <radius>0.3</radius>
+          </sonar>
+          <always_on>1</always_on>
+          <update_rate>30</update_rate>
+          <visualize>true</visualize>
+        </sensor>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/sphere_atlas_demo.world b/worlds/sphere_atlas_demo.world
new file mode 100644
index 0000000..c893dd9
--- /dev/null
+++ b/worlds/sphere_atlas_demo.world
@@ -0,0 +1,2503 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <gui fullscreen="0">
+      <camera name="user_camera">
+        <pose>-25 -15 12.0539 7.08002e-18 0.2 0.352194</pose>
+      </camera>
+    </gui>
+    <scene>
+      <ambient>0.5 0.5 0.5 1</ambient>
+      <background>0.5 0.5 0.5 1</background>
+      <shadows>0</shadows>
+    </scene>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <physics type="ode">
+      <gravity>0 0 -9.81</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>50</iters>
+          <sor>1.4</sor>
+        </solver>
+        <constraints>
+          <cfm>0</cfm>
+          <erp>1</erp>
+          <contact_max_correcting_vel>0</contact_max_correcting_vel>
+          <contact_surface_layer>0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <max_step_size>0.001</max_step_size>
+      <real_time_factor>1</real_time_factor>
+      <real_time_update_rate>1000</real_time_update_rate>
+    </physics>
+    <!-- A copy of atlas robot with all visual and
+         collision geoms replaced by spheres.
+    -->
+    <model name="sphere_atlas">
+      <link name="pelvis">
+        <pose>0 0 0 0 -0 0</pose>
+        <inertial>
+          <pose>0.0113715 0 0.0268706 0 -0 0</pose>
+          <mass>17.982</mass>
+          <inertia>
+            <ixx>0.125569</ixx>
+            <ixy>0.0008</ixy>
+            <ixz>-0.000499757</ixz>
+            <iyy>0.0972062</iyy>
+            <iyz>-0.0005</iyz>
+            <izz>0.117937</izz>
+          </inertia>
+        </inertial>
+        <collision name="pelvis_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="pelvis_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <visual name="pelvis_visual_imu_link">
+          <pose>0.0599153 0 -0.01415 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>0.01 0.01 0.01</size>
+            </box>
+          </geometry>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+        <sensor name="imu_sensor" type="imu">
+          <always_on>1</always_on>
+          <update_rate>1000</update_rate>
+          <imu>
+            <noise>
+              <type>gaussian</type>
+              <rate>
+                <mean>0</mean>
+                <stddev>0.0002</stddev>
+                <bias_mean>7.5e-06</bias_mean>
+                <bias_stddev>8e-07</bias_stddev>
+              </rate>
+              <accel>
+                <mean>0</mean>
+                <stddev>0.017</stddev>
+                <bias_mean>0.1</bias_mean>
+                <bias_stddev>0.001</bias_stddev>
+              </accel>
+            </noise>
+          </imu>
+          <pose>0.0599153 0 -0.01415 0 -0 0</pose>
+        </sensor>
+      </link>
+      <link name="ltorso">
+        <pose>-0.0125 0 0 0 -0 0</pose>
+        <inertial>
+          <pose>-0.0112984 -3.15366e-06 0.0746835 0 -0 0</pose>
+          <mass>2.409</mass>
+          <inertia>
+            <ixx>0.0039092</ixx>
+            <ixy>-5.04491e-08</ixy>
+            <ixz>-0.000342157</ixz>
+            <iyy>0.00341694</iyy>
+            <iyz>4.87119e-07</iyz>
+            <izz>0.00174492</izz>
+          </inertia>
+        </inertial>
+        <collision name="ltorso_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="ltorso_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="back_bkz" type="revolute">
+        <child>ltorso</child>
+        <parent>pelvis</parent>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <limit>
+            <lower>-0.663225</lower>
+            <upper>0.663225</upper>
+            <effort>124.016</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="mtorso">
+        <pose>-0.0125 0 0.16197 0 -0 0</pose>
+        <inertial>
+          <pose>-0.00816266 -0.0131245 0.0305974 0 -0 0</pose>
+          <mass>0.69</mass>
+          <inertia>
+            <ixx>0.000454181</ixx>
+            <ixy>-6.10764e-05</ixy>
+            <ixz>3.94009e-05</ixz>
+            <iyy>0.000483282</iyy>
+            <iyz>5.27463e-05</iyz>
+            <izz>0.000444215</izz>
+          </inertia>
+        </inertial>
+        <collision name="mtorso_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="mtorso_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="back_bky" type="revolute">
+        <child>mtorso</child>
+        <parent>ltorso</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>-0.610691</lower>
+            <upper>0.438427</upper>
+            <effort>206.843</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="utorso">
+        <pose>-0.0125 0 0.21197 0 -0 0</pose>
+        <inertial>
+          <pose>-0.0911174 0 0.300409 0 -0 0</pose>
+          <mass>52.207</mass>
+          <inertia>
+            <ixx>1.47126</ixx>
+            <ixy>0.00362</ixy>
+            <ixz>0.329434</ixz>
+            <iyy>1.53128</iyy>
+            <iyz>0.001</iyz>
+            <izz>1.32197</izz>
+          </inertia>
+        </inertial>
+        <collision name="utorso_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <collision name="utorso_collision_utorso_1">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="utorso_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <visual name="utorso_visual_utorso_1">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <visual name="utorso_visual_l_situational_awareness_camera_link">
+          <pose>0.216409 0.121799 0.406759 -1.5708 5.55112e-17 1.309</pose>
+          <geometry>
+            <box>
+              <size>0.01 0.01 0.01</size>
+            </box>
+          </geometry>
+        </visual>
+        <visual name="utorso_visual_r_situational_awareness_camera_link">
+          <pose>0.216409 -0.121799 0.406759 1.5708 5.55112e-17 -1.309</pose>
+          <geometry>
+            <box>
+              <size>0.01 0.01 0.01</size>
+            </box>
+          </geometry>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="back_bkx" type="revolute">
+        <child>utorso</child>
+        <parent>mtorso</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-0.698132</lower>
+            <upper>0.698132</upper>
+            <effort>200</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_clav">
+        <pose>0.05191 0.13866 0.31915 0 -0 0</pose>
+        <inertial>
+          <pose>0 0.048 0.084 0 -0 0</pose>
+          <mass>3.45</mass>
+          <inertia>
+            <ixx>0.011</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.009</iyy>
+            <iyz>-0.004</iyz>
+            <izz>0.004</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_clav_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_clav_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_arm_shy" type="revolute">
+        <child>l_clav</child>
+        <parent>utorso</parent>
+        <axis>
+          <xyz>0 0.5 0.866025</xyz>
+          <limit>
+            <lower>-1.5708</lower>
+            <upper>0.785398</upper>
+            <effort>212</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_scap">
+        <pose>0.05191 0.27901 0.51524 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <mass>3.012</mass>
+          <inertia>
+            <ixx>0.00319</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00583</iyy>
+            <iyz>0</iyz>
+            <izz>0.00583</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_scap_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_scap_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_arm_shx" type="revolute">
+        <child>l_scap</child>
+        <parent>l_clav</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.5708</lower>
+            <upper>1.5708</upper>
+            <effort>170</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_uarm">
+        <pose>0.05191 0.46601 0.53124 0 -0 0</pose>
+        <inertial>
+          <pose>0 -0.065 0 0 -0 0</pose>
+          <mass>3.388</mass>
+          <inertia>
+            <ixx>0.00656</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00358</iyy>
+            <iyz>0</iyz>
+            <izz>0.00656</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_uarm_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_uarm_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_arm_ely" type="revolute">
+        <child>l_uarm</child>
+        <parent>l_scap</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>0</lower>
+            <upper>3.14159</upper>
+            <effort>114</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_larm">
+        <pose>0.05191 0.58501 0.54045 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <mass>2.509</mass>
+          <inertia>
+            <ixx>0.00265</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00446</iyy>
+            <iyz>0</iyz>
+            <izz>0.00446</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_larm_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_larm_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_arm_elx" type="revolute">
+        <child>l_larm</child>
+        <parent>l_uarm</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>0</lower>
+            <upper>2.35619</upper>
+            <effort>114</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_farm">
+        <pose>0.05191 0.77201 0.53124 0 -0 0</pose>
+        <inertial>
+          <pose>0 -0.065 0 0 -0 0</pose>
+          <mass>3.388</mass>
+          <inertia>
+            <ixx>0.00656</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00358</iyy>
+            <iyz>0</iyz>
+            <izz>0.00656</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_farm_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_farm_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_arm_wry" type="revolute">
+        <child>l_farm</child>
+        <parent>l_larm</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>0</lower>
+            <upper>3.14159</upper>
+            <effort>114</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_hand">
+        <pose>0.05191 0.89101 0.54045 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <mass>2.509</mass>
+          <inertia>
+            <ixx>0.00265</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00446</iyy>
+            <iyz>0</iyz>
+            <izz>0.00446</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_hand_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_hand_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_arm_wrx" type="revolute">
+        <child>l_hand</child>
+        <parent>l_farm</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.1781</lower>
+            <upper>1.1781</upper>
+            <effort>60</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <provide_feedback>1</provide_feedback>
+          <ode>
+            <provide_feedback>1</provide_feedback>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <link name="head">
+        <pose>0.20422 0 0.74993 0 -0 0</pose>
+        <inertial>
+          <pose>-0.0754942 3.38765e-05 0.0277411 0 -0 0</pose>
+          <mass>1.41991</mass>
+          <inertia>
+            <ixx>0.00361284</ixx>
+            <ixy>-1.51324e-06</ixy>
+            <ixz>-0.000892818</ixz>
+            <iyy>0.00208745</iyy>
+            <iyz>-6.83342e-07</iyz>
+            <izz>0.00179047</izz>
+          </inertia>
+        </inertial>
+        <collision name="head_collision">
+          <pose>-0.0503 0 -0.00195 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>0.1311 0.12 0.0591</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <collision name="head_collision_head_other">
+          <pose>-0.093 0 0.0868 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>0.0468 0.12 0.1184</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="head_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <visual name="head_visual_head_imu_link">
+          <pose>-0.0475 0.035 0 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>0.01 0.01 0.01</size>
+            </box>
+          </geometry>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <sensor name="head_imu_sensor" type="imu">
+          <always_on>1</always_on>
+          <update_rate>1000</update_rate>
+          <imu>
+            <noise>
+              <type>gaussian</type>
+              <rate>
+                <mean>0</mean>
+                <stddev>0.0002</stddev>
+                <bias_mean>7.5e-06</bias_mean>
+                <bias_stddev>8e-07</bias_stddev>
+              </rate>
+              <accel>
+                <mean>0</mean>
+                <stddev>0.017</stddev>
+                <bias_mean>0.1</bias_mean>
+                <bias_stddev>0.001</bias_stddev>
+              </accel>
+            </noise>
+          </imu>
+          <pose>-0.0475 0.035 0 0 -0 0</pose>
+        </sensor>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="neck_ry" type="revolute">
+        <child>head</child>
+        <parent>utorso</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>-0.602139</lower>
+            <upper>1.14494</upper>
+            <effort>5</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="hokuyo_link">
+        <pose>0.15962 0 0.83793 0 -0 0</pose>
+        <inertial>
+          <pose>0.0124384 0.0004084 -0.0041783 0 -0 0</pose>
+          <mass>0.057664</mass>
+          <inertia>
+            <ixx>0.000401606</ixx>
+            <ixy>4.9927e-08</ixy>
+            <ixz>1.0997e-05</ixz>
+            <iyy>0.00208115</iyy>
+            <iyz>-9.8165e-09</iyz>
+            <izz>0.00178402</izz>
+          </inertia>
+        </inertial>
+        <collision name="hokuyo_link_collision">
+          <pose>0.01885 0 -0.02119 0 -0 0</pose>
+          <geometry>
+            <box>
+              <size>0.08 0.06 0.04238</size>
+            </box>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <collision name="hokuyo_link_collision_hokuyo_link_other">
+          <pose>0.03 0 0.0235 0 -0 0</pose>
+          <geometry>
+            <cylinder>
+              <length>0.047</length>
+              <radius>0.024425</radius>
+            </cylinder>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="hokuyo_link_visual">
+          <pose>0.045 -0.0261018 -0.0834237 -0.314 0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="hokuyo_joint" type="revolute">
+        <child>hokuyo_link</child>
+        <parent>head</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1e+16</lower>
+            <upper>1e+16</upper>
+          </limit>
+          <dynamics>
+            <damping>0.01</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_clav">
+        <pose>0.05191 -0.13866 0.31915 0 -0 0</pose>
+        <inertial>
+          <pose>0 -0.048 0.084 0 -0 0</pose>
+          <mass>3.45</mass>
+          <inertia>
+            <ixx>0.011</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.009</iyy>
+            <iyz>0.004</iyz>
+            <izz>0.004</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_clav_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_clav_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_arm_shy" type="revolute">
+        <child>r_clav</child>
+        <parent>utorso</parent>
+        <axis>
+          <xyz>0 0.5 -0.866025</xyz>
+          <limit>
+            <lower>-1.5708</lower>
+            <upper>0.785398</upper>
+            <effort>212</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_scap">
+        <pose>0.05191 -0.27901 0.51524 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <mass>3.012</mass>
+          <inertia>
+            <ixx>0.00319</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00583</iyy>
+            <iyz>0</iyz>
+            <izz>0.00583</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_scap_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_scap_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_arm_shx" type="revolute">
+        <child>r_scap</child>
+        <parent>r_clav</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.5708</lower>
+            <upper>1.5708</upper>
+            <effort>170</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_uarm">
+        <pose>0.05191 -0.46601 0.53124 0 -0 0</pose>
+        <inertial>
+          <pose>0 0.065 0 0 -0 0</pose>
+          <mass>3.388</mass>
+          <inertia>
+            <ixx>0.00656</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00358</iyy>
+            <iyz>0</iyz>
+            <izz>0.00656</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_uarm_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_uarm_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_arm_ely" type="revolute">
+        <child>r_uarm</child>
+        <parent>r_scap</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>0</lower>
+            <upper>3.14159</upper>
+            <effort>114</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_larm">
+        <pose>0.05191 -0.58501 0.54045 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <mass>2.509</mass>
+          <inertia>
+            <ixx>0.00265</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00446</iyy>
+            <iyz>0</iyz>
+            <izz>0.00446</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_larm_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_larm_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_arm_elx" type="revolute">
+        <child>r_larm</child>
+        <parent>r_uarm</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-2.35619</lower>
+            <upper>0</upper>
+            <effort>114</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_farm">
+        <pose>0.05191 -0.77201 0.53124 0 -0 0</pose>
+        <inertial>
+          <pose>0 0.065 0 0 -0 0</pose>
+          <mass>3.388</mass>
+          <inertia>
+            <ixx>0.00656</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00358</iyy>
+            <iyz>0</iyz>
+            <izz>0.00656</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_farm_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_farm_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_arm_wry" type="revolute">
+        <child>r_farm</child>
+        <parent>r_larm</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>0</lower>
+            <upper>3.14159</upper>
+            <effort>114</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_hand">
+        <pose>0.05191 -0.89101 0.54045 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <mass>2.509</mass>
+          <inertia>
+            <ixx>0.00265</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.00446</iyy>
+            <iyz>0</iyz>
+            <izz>0.00446</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_hand_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_hand_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_arm_wrx" type="revolute">
+        <child>r_hand</child>
+        <parent>r_farm</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-1.1781</lower>
+            <upper>1.1781</upper>
+            <effort>60</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <provide_feedback>1</provide_feedback>
+          <ode>
+            <provide_feedback>1</provide_feedback>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_uglut">
+        <pose>0 0.089 0 0 -0 0</pose>
+        <inertial>
+          <pose>0.00529262 -0.00344732 0.00313046 0 -0 0</pose>
+          <mass>0.648</mass>
+          <inertia>
+            <ixx>0.00074276</ixx>
+            <ixy>-3.79607e-08</ixy>
+            <ixz>-2.79549e-05</ixz>
+            <iyy>0.000688179</iyy>
+            <iyz>-3.2735e-08</iyz>
+            <izz>0.00041242</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_uglut_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_uglut_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_leg_hpz" type="revolute">
+        <child>l_uglut</child>
+        <parent>pelvis</parent>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <limit>
+            <lower>-0.174533</lower>
+            <upper>1.22173</upper>
+            <effort>110</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_lglut">
+        <pose>0 0.089 0 0 -0 0</pose>
+        <inertial>
+          <pose>0.0133341 0.0170484 -0.0312052 0 -0 0</pose>
+          <mass>0.866</mass>
+          <inertia>
+            <ixx>0.000691326</ixx>
+            <ixy>-2.24344e-05</ixy>
+            <ixz>2.50508e-06</ixz>
+            <iyy>0.00126856</iyy>
+            <iyz>0.000137862</iyz>
+            <izz>0.00106487</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_lglut_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_lglut_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_leg_hpx" type="revolute">
+        <child>l_lglut</child>
+        <parent>l_uglut</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-0.523599</lower>
+            <upper>0.523599</upper>
+            <effort>180</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_uleg">
+        <pose>0.05 0.089 -0.05 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 -0.21 0 -0 0</pose>
+          <mass>9.209</mass>
+          <inertia>
+            <ixx>0.09</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.09</iyy>
+            <iyz>0</iyz>
+            <izz>0.02</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_uleg_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_uleg_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_leg_hpy" type="revolute">
+        <child>l_uleg</child>
+        <parent>l_lglut</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>-1.72072</lower>
+            <upper>0.524821</upper>
+            <effort>260</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_lleg">
+        <pose>0 0.089 -0.424 0 -0 0</pose>
+        <inertial>
+          <pose>0.001 0 -0.187 0 -0 0</pose>
+          <mass>5.479</mass>
+          <inertia>
+            <ixx>0.077</ixx>
+            <ixy>0</ixy>
+            <ixz>-0.003</ixz>
+            <iyy>0.076</iyy>
+            <iyz>0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_lleg_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_lleg_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_leg_kny" type="revolute">
+        <child>l_lleg</child>
+        <parent>l_uleg</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>0</lower>
+            <upper>2.38569</upper>
+            <effort>220</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_talus">
+        <pose>0 0.089 -0.846 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <mass>0.125</mass>
+          <inertia>
+            <ixx>1.01674e-05</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>8.42775e-06</iyy>
+            <iyz>0</iyz>
+            <izz>1.30101e-05</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_talus_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_talus_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="l_leg_aky" type="revolute">
+        <child>l_talus</child>
+        <parent>l_lleg</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>-1</lower>
+            <upper>0.7</upper>
+            <effort>700</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="l_foot">
+        <pose>0 0.089 -0.846 0 -0 0</pose>
+        <inertial>
+          <pose>0.027 0 -0.067 0 -0 0</pose>
+          <mass>2.05</mass>
+          <inertia>
+            <ixx>0.002</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.007</iyy>
+            <iyz>0</iyz>
+            <izz>0.008</izz>
+          </inertia>
+        </inertial>
+        <collision name="l_foot_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <kp>1e+06</kp>
+                <kd>100</kd>
+                <max_vel>1</max_vel>
+                <min_depth>0</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1.5</mu>
+                <mu2>1.5</mu2>
+                <fdir1>1 0 0</fdir1>
+              </ode>
+            </friction>
+          </surface>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode />
+            </friction>
+          </surface>
+        </collision>
+        <visual name="l_foot_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+        <sensor name="l_foot_contact_sensor" type="contact">
+          <update_rate>1000</update_rate>
+          <always_on>1</always_on>
+          <contact>
+            <collision>l_foot_collision</collision>
+            <topic>/l_foot_contact</topic>
+          </contact>
+        </sensor>
+      </link>
+      <joint name="l_leg_akx" type="revolute">
+        <child>l_foot</child>
+        <parent>l_talus</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-0.8</lower>
+            <upper>0.8</upper>
+            <effort>90</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <provide_feedback>1</provide_feedback>
+          <ode>
+            <provide_feedback>1</provide_feedback>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_uglut">
+        <pose>0 -0.089 0 0 -0 0</pose>
+        <inertial>
+          <pose>0.00529262 0.00344732 0.00313046 0 -0 0</pose>
+          <mass>0.648</mass>
+          <inertia>
+            <ixx>0.00074276</ixx>
+            <ixy>3.79607e-08</ixy>
+            <ixz>-2.79549e-05</ixz>
+            <iyy>0.000688179</iyy>
+            <iyz>3.2735e-08</iyz>
+            <izz>0.00041242</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_uglut_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_uglut_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_leg_hpz" type="revolute">
+        <child>r_uglut</child>
+        <parent>pelvis</parent>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <limit>
+            <lower>-1.22173</lower>
+            <upper>0.174533</upper>
+            <effort>110</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_lglut">
+        <pose>0 -0.089 0 0 -0 0</pose>
+        <inertial>
+          <pose>0.0133341 -0.0170484 -0.0312052 0 -0 0</pose>
+          <mass>0.866</mass>
+          <inertia>
+            <ixx>0.000691326</ixx>
+            <ixy>2.24344e-05</ixy>
+            <ixz>2.50508e-06</ixz>
+            <iyy>0.00126856</iyy>
+            <iyz>-0.000137862</iyz>
+            <izz>0.00106487</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_lglut_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_lglut_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_leg_hpx" type="revolute">
+        <child>r_lglut</child>
+        <parent>r_uglut</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-0.523599</lower>
+            <upper>0.523599</upper>
+            <effort>180</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_uleg">
+        <pose>0.05 -0.089 -0.05 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 -0.21 0 -0 0</pose>
+          <mass>9.209</mass>
+          <inertia>
+            <ixx>0.09</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.09</iyy>
+            <iyz>0</iyz>
+            <izz>0.02</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_uleg_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_uleg_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_leg_hpy" type="revolute">
+        <child>r_uleg</child>
+        <parent>r_lglut</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>-1.72072</lower>
+            <upper>0.524821</upper>
+            <effort>260</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_lleg">
+        <pose>0 -0.089 -0.424 0 -0 0</pose>
+        <inertial>
+          <pose>0.001 0 -0.187 0 -0 0</pose>
+          <mass>5.479</mass>
+          <inertia>
+            <ixx>0.077</ixx>
+            <ixy>-0</ixy>
+            <ixz>-0.003</ixz>
+            <iyy>0.076</iyy>
+            <iyz>-0</iyz>
+            <izz>0.01</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_lleg_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_lleg_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_leg_kny" type="revolute">
+        <child>r_lleg</child>
+        <parent>r_uleg</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>0</lower>
+            <upper>2.38569</upper>
+            <effort>220</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_talus">
+        <pose>0 -0.089 -0.846 0 -0 0</pose>
+        <inertial>
+          <pose>0 0 0 0 -0 0</pose>
+          <mass>0.125</mass>
+          <inertia>
+            <ixx>1.01674e-05</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>8.42775e-06</iyy>
+            <iyz>0</iyz>
+            <izz>1.30101e-05</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_talus_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode>
+                <mu>0.9</mu>
+                <mu2>0.9</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_talus_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+      </link>
+      <joint name="r_leg_aky" type="revolute">
+        <child>r_talus</child>
+        <parent>r_lleg</parent>
+        <axis>
+          <xyz>0 1 0</xyz>
+          <limit>
+            <lower>-1</lower>
+            <upper>0.7</upper>
+            <effort>700</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <link name="r_foot">
+        <pose>0 -0.089 -0.846 0 -0 0</pose>
+        <inertial>
+          <pose>0.027 0 -0.067 0 -0 0</pose>
+          <mass>2.05</mass>
+          <inertia>
+            <ixx>0.002</ixx>
+            <ixy>0</ixy>
+            <ixz>0</ixz>
+            <iyy>0.007</iyy>
+            <iyz>0</iyz>
+            <izz>0.008</izz>
+          </inertia>
+        </inertial>
+        <collision name="r_foot_collision">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <kp>1e+06</kp>
+                <kd>100</kd>
+                <max_vel>1</max_vel>
+                <min_depth>0</min_depth>
+              </ode>
+            </contact>
+            <friction>
+              <ode>
+                <mu>1.5</mu>
+                <mu2>1.5</mu2>
+                <fdir1>1 0 0</fdir1>
+              </ode>
+            </friction>
+          </surface>
+          <surface>
+            <contact>
+              <ode />
+            </contact>
+            <friction>
+              <ode />
+            </friction>
+          </surface>
+        </collision>
+        <visual name="r_foot_visual">
+          <pose>0 0 0 0 -0 0</pose>
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </visual>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <gravity>1</gravity>
+        <velocity_decay>
+          <linear>0</linear>
+          <angular>0</angular>
+        </velocity_decay>
+        <self_collide>0</self_collide>
+        <sensor name="r_foot_contact_sensor" type="contact">
+          <update_rate>1000</update_rate>
+          <always_on>1</always_on>
+          <contact>
+            <collision>r_foot_collision</collision>
+            <topic>/r_foot_contact</topic>
+          </contact>
+        </sensor>
+      </link>
+      <joint name="r_leg_akx" type="revolute">
+        <child>r_foot</child>
+        <parent>r_talus</parent>
+        <axis>
+          <xyz>1 0 0</xyz>
+          <limit>
+            <lower>-0.8</lower>
+            <upper>0.8</upper>
+            <effort>90</effort>
+            <velocity>12</velocity>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <provide_feedback>1</provide_feedback>
+          <ode>
+            <provide_feedback>1</provide_feedback>
+            <cfm_damping>1</cfm_damping>
+            <limit>
+              <cfm>0</cfm>
+              <erp>0.2</erp>
+            </limit>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="r_foot_world_pin" type="revolute">
+        <child>r_foot</child>
+        <parent>world</parent>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="l_foot_world_pin" type="revolute">
+        <child>l_foot</child>
+        <parent>world</parent>
+        <axis>
+          <xyz>0 0 1</xyz>
+          <limit>
+            <lower>0</lower>
+            <upper>0</upper>
+          </limit>
+          <dynamics>
+            <damping>0.1</damping>
+          </dynamics>
+          <use_parent_model_frame>true</use_parent_model_frame>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <pose>0 0 1.1 0 -0 0</pose>
+      <!-- test pid controller joints -->
+      <plugin name="sphere_atlas_pid" filename="libSphereAtlasDemoPlugin.so" />
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/stacks.world b/worlds/stacks.world
new file mode 100644
index 0000000..8222bce
--- /dev/null
+++ b/worlds/stacks.world
@@ -0,0 +1,501 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <model name="box_1">
+      <pose>0 0 .5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="box_2">
+      <pose>0 0 1.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="box_3">
+      <pose>0 0 2.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="box_4">
+      <pose>0 0 3.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="box_5">
+      <pose>0 0 4.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>1 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_1">
+      <pose>0 1.5 0.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <soft_erp>1.0</soft_erp>
+                <max_vel>0</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_2">
+      <pose>0 1.5 1.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <soft_erp>1.0</soft_erp>
+                <max_vel>0</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_3">
+      <pose>0 1.5 2.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <soft_erp>1.0</soft_erp>
+                <max_vel>0</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_4">
+      <pose>0 1.5 3.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <soft_erp>1.0</soft_erp>
+                <max_vel>0</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_5">
+      <pose>0 1.5 4.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <surface>
+            <contact>
+              <ode>
+                <soft_erp>1.0</soft_erp>
+                <max_vel>0</max_vel>
+              </ode>
+            </contact>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_1a">
+      <pose>1.5 1.5 0.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_2a">
+      <pose>1.5 1.5 1.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_3a">
+      <pose>1.5 1.5 2.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_4a">
+      <pose>1.5 1.5 3.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="sphere_5a">
+      <pose>1.5 1.5 4.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.5</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="cylinder_1">
+      <pose>0 -1.5 0.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="cylinder_2">
+      <pose>0 -1.5 1.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="cylinder_3">
+      <pose>0 -1.5 2.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="cylinder_4">
+      <pose>0 -1.5 3.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="cylinder_5">
+      <pose>0 -1.5 4.5 0 0 0</pose>
+      <link name="link">
+        <collision name="collision">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <cylinder>
+              <radius>0.1</radius>
+              <length>1.0</length>
+            </cylinder>
+          </geometry>
+          <material>
+            <script>Gazebo/WoodPallet</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/trigger.world b/worlds/trigger.world
new file mode 100644
index 0000000..9f3d833
--- /dev/null
+++ b/worlds/trigger.world
@@ -0,0 +1,92 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- A ground plane -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <plugin filename="libTriggerPlugin.so" name="trigger">
+      <point>0 0 0</point>
+      <radius>5</radius>
+    </plugin>
+    <model name="sphere">
+      <pose>0 0 10.0 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <mass>1</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/Grey</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="box">
+      <pose>1 0 50.0 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <mass>1</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.1</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/Grey</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+    <model name="cylinder">
+      <pose>5 0 50.0 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <mass>1</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <sphere>
+              <radius>0.2</radius>
+            </sphere>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <sphere>
+              <radius>0.2</radius>
+            </sphere>
+          </geometry>
+          <material>
+            <script>Gazebo/Grey</script>
+          </material>
+        </visual>
+      </link>
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/twin_rotor_demo.world b/worlds/twin_rotor_demo.world
new file mode 100644
index 0000000..e390608
--- /dev/null
+++ b/worlds/twin_rotor_demo.world
@@ -0,0 +1,505 @@
+<?xml version="1.0" ?>
+<sdf version="1.4">
+  <world name="default">
+    <physics type="ode">
+      <gravity>0.0 0.0 -10.0</gravity>
+      <ode>
+        <solver>
+          <type>quick</type>
+          <iters>50</iters>
+          <sor>0.8</sor>
+        </solver>
+        <constraints>
+          <cfm>0.0</cfm>
+          <erp>0.2</erp>
+          <contact_max_correcting_vel>0.1</contact_max_correcting_vel>
+          <contact_surface_layer>0.0</contact_surface_layer>
+        </constraints>
+      </ode>
+      <real_time_update_rate>0</real_time_update_rate>
+      <max_step_size>0.001</max_step_size>
+    </physics>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+
+    <model name="lift_drag_demo_model">
+      <pose>0 0 0 0 0 0</pose>
+      <static>false</static>
+      <link name="body">
+        <pose>1.0 0 0.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>1.8</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>1.8</iyy>
+            <iyz>0.0</iyz>
+            <izz>1.8</izz>
+          </inertia>
+          <mass>10.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>3 1 1</size>
+            </box>
+          </geometry>
+          <surface>
+            <friction>
+              <ode>
+                <mu>0.1</mu>
+                <mu2>0.1</mu2>
+              </ode>
+            </friction>
+          </surface>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>3 1 1</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="rod_1">
+        <pose>0 0 1.25 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_1">
+        <pose>0 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_2">
+        <pose>0 0 1.5 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_1_joint" type="revolute">
+        <parent>body</parent>
+        <child>rod_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 -1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_1_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_1</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_2_joint" type="revolute">
+        <parent>rod_1</parent>
+        <child>blade_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 -1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <!--
+      <joint name="gear_joint" type="gearbox">
+          <parent>blade_1</parent>
+          <child>blade_2</child>
+          <gearbox_ratio>-1.0</gearbox_ratio>
+          <gearbox_reference_body>rod_1</gearbox_reference_body>
+          <axis>
+            <xyz>0.000000 1.000000 0.000000</xyz>
+          </axis>
+          <axis2>
+            <xyz>0.000000 -1.000000 0.000000</xyz>
+          </axis2>
+      </joint>
+      -->
+
+
+      <link name="rod_2">
+        <pose>2 0 1.25 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.0 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.012</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.012</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0012</izz>
+          </inertia>
+          <mass>1.0</mass>
+        </inertial>
+        <collision name="collision">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <geometry>
+            <box>
+              <size>0.02 0.02 0.5</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.3 0.3 0.3 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="rod_2_joint" type="revolute">
+        <parent>body</parent>
+        <child>rod_2</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-1e16</lower>
+            <upper>1e16</upper>
+          </limit>
+          <xyz>0.0 0.0 1.0</xyz>
+          <dynamics>
+            <damping>0.0001</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <link name="blade_3">
+        <pose>2 0 1.5 0 0 0</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.5 0.2 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <link name="blade_4">
+        <pose>2 0 1.5 0 0 3.141593</pose>
+        <inertial>
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <inertia>
+            <ixx>0.0000465</ixx>
+            <ixy>0.0</ixy>
+            <ixz>0.0</ixz>
+            <iyy>0.0000006</iyy>
+            <iyz>0.0</iyz>
+            <izz>0.0000470</izz>
+          </inertia>
+          <mass>0.01</mass>
+        </inertial>
+        <collision name="collision">
+          <pose>0.0 0.5 0 0.0 0.0 0.0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+        </collision>
+        <visual name="visual">
+          <pose>0.0 0.5 0 0.0 0.0 0</pose>
+          <geometry>
+            <box>
+              <size>0.2 1.0 0.01</size>
+            </box>
+          </geometry>
+          <material>
+            <ambient>0.2 0.5 0.2 1.0</ambient>
+            <diffuse>.421 0.225 0.0 1.0</diffuse>
+          </material>
+        </visual>
+      </link>
+      <joint name="blade_3_joint" type="revolute">
+        <parent>rod_2</parent>
+        <child>blade_3</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <joint name="blade_4_joint" type="revolute">
+        <parent>rod_2</parent>
+        <child>blade_4</child>
+        <pose>0.0 0.0 0.0 0.0 0.0 0.0</pose>
+        <axis>
+          <limit>
+            <lower>-0.0</lower>
+            <upper>0.0</upper>
+          </limit>
+          <xyz>0.0 -1.0 0.0</xyz>
+          <dynamics>
+            <damping>1.000000</damping>
+          </dynamics>
+        </axis>
+        <physics>
+          <ode>
+            <cfm_damping>1</cfm_damping>
+          </ode>
+        </physics>
+      </joint>
+      <!-- -->
+      <joint name="gear_joint" type="gearbox">
+          <parent>rod_1</parent>
+          <child>rod_2</child>
+          <gearbox_ratio>-1.0</gearbox_ratio>
+          <gearbox_reference_body>body</gearbox_reference_body>
+          <axis>
+            <xyz>0.000000 0.000000 -1.000000</xyz>
+          </axis>
+          <axis2>
+            <xyz>0.000000 0.000000 1.000000</xyz>
+          </axis2>
+      </joint>
+
+      <plugin name="gazebo_blade_1" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_1</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_2" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_2</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_3" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_3</link_name>
+      </plugin>
+      <plugin name="gazebo_blade_4" filename="libLiftDragPlugin.so">
+        <a0>0.1</a0>
+        <cla>0.100</cla>
+        <cda>0.001</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0.5 0</cp>
+        <area>0.2</area>
+        <air_density>1.2041</air_density>
+        <forward>-1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_4</link_name>
+      </plugin>
+      <!-- drag for body
+      <plugin name="gazebo_body_1" filename="libLiftDragPlugin.so">
+        <a0>0.0</a0>
+        <cla>0.000</cla>
+        <cda>1.000</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0 0</cp>
+        <area>1.0</area>
+        <air_density>1.2041</air_density>
+        <forward>1 0 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_4</link_name>
+      </plugin>
+      <plugin name="gazebo_body_2" filename="libLiftDragPlugin.so">
+        <a0>0.0</a0>
+        <cla>0.000</cla>
+        <cda>1.000</cda>
+        <cma>0.00</cma>
+        <cp>0.0 0 0</cp>
+        <area>1.0</area>
+        <air_density>1.2041</air_density>
+        <forward>0 1 0</forward>
+        <upward>0 0 1</upward>
+        <link_name>lift_drag_demo_model::blade_4</link_name>
+      </plugin>
+      -->
+    </model>
+  </world>
+</sdf>
diff --git a/worlds/willowgarage.world b/worlds/willowgarage.world
new file mode 100644
index 0000000..0db48ed
--- /dev/null
+++ b/worlds/willowgarage.world
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <include>
+      <uri>model://sun</uri>
+    </include>
+    <include>
+      <uri>model://willowgarage</uri>
+    </include>
+  </world>
+</sdf>
diff --git a/worlds/wireless_sensors.world b/worlds/wireless_sensors.world
new file mode 100644
index 0000000..5374095
--- /dev/null
+++ b/worlds/wireless_sensors.world
@@ -0,0 +1,88 @@
+<?xml version="1.0" ?>
+<sdf version="1.5">
+  <world name="default">
+    <!-- Ground -->
+    <include>
+      <uri>model://ground_plane</uri>
+    </include>
+    <!-- Wireless transmitter sensor model -->
+    <model name="wirelessTransmitter">
+      <static>true</static>
+      <pose>0 0 0.025 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+        <visual name="base">
+          <geometry>
+            <box>
+              <size>.05 .05 .05</size>
+            </box>
+          </geometry>
+        </visual>
+        <visual name="antenna">
+          <pose>0 0 .04 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>.005</radius>
+              <length>.07</length>
+            </cylinder>
+          </geometry>
+        </visual>
+        <sensor name="wirelessTransmitter" type="wireless_transmitter">
+          <always_on>1</always_on>
+          <update_rate>1</update_rate>
+          <visualize>true</visualize>
+          <transceiver>
+            <essid>osrf</essid>
+            <frequency>2442.0</frequency>
+            <power>14.5</power>
+            <gain>2.6</gain>
+          </transceiver>
+        </sensor>
+      </link>
+    </model>
+    <!-- Wireless receiver sensor model -->
+    <model name="wirelessReceiver">
+      <static>true</static>
+      <pose>0 -3 0.025 0 0 0</pose>
+      <link name="link">
+        <inertial>
+          <mass>0.1</mass>
+        </inertial>
+        <visual name="base">
+          <geometry>
+            <box>
+              <size>.05 .05 .05</size>
+            </box>
+          </geometry>
+        </visual>
+        <visual name="antenna">
+          <pose>0 0 .04 0 0 0</pose>
+          <geometry>
+            <cylinder>
+              <radius>.005</radius>
+              <length>.07</length>
+            </cylinder>
+          </geometry>
+        </visual>
+        <sensor name="wirelessReceiver" type="wireless_receiver">
+          <always_on>1</always_on>
+          <update_rate>1</update_rate>
+          <visualize>true</visualize>
+          <transceiver>
+            <min_frequency>2412.0</min_frequency>
+            <max_frequency>2484.0</max_frequency>
+            <power>14.5</power>
+            <gain>2.5</gain>
+            <sensitivity>-90.0</sensitivity>
+          </transceiver>
+        </sensor>
+      </link>
+    </model>
+    <!-- A global light source -->
+    <include>
+      <uri>model://sun</uri>
+    </include>
+  </world>
+</sdf>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/gazebo.git



More information about the debian-science-commits mailing list